Wer Tabellen in Excel oder Calc anhand einer Schlüsselspalte zusammenführen möchte, wird VLOOKUP nicht mehr missen wollen. In deutsch lokalisierten Versionen heißt es SVERWEIS.

Beispiel: SVERWEIS(B2; $K$1:$L$800; 2; 0) fügt anhand des Schlüssels in B2 den Wert aus Spalte Lx ein, wenn B2 und Kx identisch sind.

Bash friert ein bei Ctrl-S

Weil das hier gerade aufkam, kurz zur Erklärung: Wenn eine Terminalsitzung “einfriert”, hat der Benutzer vermutlich vorher die Tastenkombination Ctrl-S gedrückt. Ctrl-S steht für XOFF, das für die Datenflusskontrolle von asynchronen seriellen Verbindungen benutzt wird. Das Gegenstück ist XON (Ctrl-Q). Ich kenne das noch von den alten Modem-Verbindungen. Also: Wenn das Terminal nicht mehr reagiert, mit Ctrl-Q XON auslösen und weiter geht’s!

Die Tastatur meines Dell Latitude D530 erzeugte Zeichen, die nie getippt wurden. Das geschah vor allem in bestimmten Neigungswinkeln des Notebooks, was mich eine Art Kurzschluß, eine ungewünschte Kontaktbrücke aufgrund Verschmutzung oder sowas vermuten ließ. Ich wollte die Tastatur ausbauen und prüfen und zu meiner Überraschung findet sich sogar eine detaillierte Anleitung dazu auf den Seiten des Herstellers. Nachdem Hinge Cover und Keyboard herausgelöst waren, konnte ich es reinigen und seit dem Wiedereinbau ist mein Ghostwriter im Ruhestand.

Bcc pro Queue in OTRS

Die Antworten auf Tickets einer bestimmten Queue im OTRS sollen per Bcc an eine weitere Adresse gesendet werden. Das sieht OTRS bisher nicht vor; die einzige Option ist ein generelles Bcc für alle Queues.
Um hier Abhilfe zu schaffen, habe ich Kernel/Modules/AgentTicketCompose.pm ein wenig erweitert. Etwa bei Zeile 400 findet sich folgende Methode, bei der die mit Bcc beginnende Zeile wie folgt geändert wird.

-Bcc => $GetParam{Bcc},
+Bcc => $Ticket{QueueID} == 83 ? ('bcc@example.com') : $GetParam{Bcc},

Die QueueID (im Beispiel 83) und die Zieladresse müssen selbstverständlich angepaßt werden.

    # send email
    my $ArticleID = $Self->{TicketObject}->ArticleSend(
        ArticleType    => 'email-external',
        SenderType     => 'agent',
        TicketID       => $Self->{TicketID},
        HistoryType    => 'SendAnswer',
        HistoryComment => "\%\%$Recipients",
        From           => $GetParam{From},
        To             => $GetParam{To},
        Cc             => $GetParam{Cc},
        # Dirty hack to Bcc (forward) answers of tickets from queue id=83.
        #Bcc           => $GetParam{Bcc},
        Bcc            => $Ticket{QueueID} == 83 ? ('bcc@example.com') : $GetParam{Bcc},
        Subject        => $GetParam{Subject},
        UserID         => $Self->{UserID},
        Body           => $GetParam{Body},
        InReplyTo      => $GetParam{InReplyTo},
        Charset        => $Self->{LayoutObject}->{UserCharset},
        Type           => 'text/plain',
        Attachment     => \@AttachmentData,
        %ArticleParam,
    );

Mit ein bisschen mehr Aufwand ließe sich das auch auf mehrere Queues ausweiten sowie die Definition der QueueIDs und Bcc-Adressen in die Konfigurationsdatei auslagern. Das überlasse ich dem geneigten Leser als Hausaufgabe.

Zugangsdaten für den Router Siemens ADSL SL2-141-I im Auslieferungszustand (von Alice DSL):
- IP-Adresse: 192.168.1.1
- Benutzername: alice@13184
- Passwort: hnto$mgmt@lice

Konsistenz einer MySQL-Replikation testen

Einen einfachen und schnellen Weg, die Datenkonsistenz einer Replikation in MySQL zu überprüfen, bietet mk-table-checksum aus Maatkit. Das Perl-Skript erstellt Prüfsummen der Tabellen und schreibt diese in eine eigene Tabelle. Durch die Replikation wird diese Tabelle auf den Slave übertragen und dort ebenfalls die Prüfsummen ermittelt. Hinterher lassen sich auf dem Slave die Prüfsummen vergleichen und eventuelle Veränderungen der Datenbestände feststellen. Diese lassen sich dann beispielsweise mit mk-table-sync aus der selben Tool-Sammlung wieder synchronisieren.

Bevor es losgeht, muß auf dem Master eine neue Datenbank (hier test) und die folgende Tabelle erstellt werden.

CREATE TABLE checksum (
    db         char(64)     NOT NULL,
    tbl        char(64)     NOT NULL,
    chunk      int          NOT NULL,
    boundaries char(100)    NOT NULL,
    this_crc   char(40)     NOT NULL,
    this_cnt   int          NOT NULL,
    master_crc char(40)         NULL,
    master_cnt int              NULL,
    ts         timestamp    NOT NULL,
    PRIMARY KEY (db, tbl, chunk)
);

Danach wird das Skript ausgeführt.

mk-table-checksum --replicate=test.checksum h=localhost,u=username,p=password,S=/data/db/mysql.sock

Ist das Programm durchgelaufen, kann man hinterher auf dem Slave prüfen, ob die Prüfsummen von Master und Slave abweichend sind.

SELECT db, tbl, chunk, this_cnt-master_cnt AS cnt_diff,
    this_crc <> master_crc OR ISNULL(master_crc) <> ISNULL(this_crc)
        AS crc_diff
FROM checksum
WHERE master_cnt <> this_cnt OR master_crc <> this_crc
    OR ISNULL(master_crc) <> ISNULL(this_crc);