Kategorien
Allgemein

Jede Menge (fehlende) Dollars

Heute habe ich mehrere Stunden damit verbracht eine Anwendung in einem Apache Tomcat zu debuggen, um festzustellen, dass eine Funktion mit einem Wert {MY_VAR} aufgerufen wurde. Erwartet hatte ich, dass dort der Wert der Variable steht, da der Tomcat diese mittels Property Replacements ersetzen sollte.

Ein Kollege schaute nur kurz auf den Wert und sagte: „Da fehlt ein Dollar“.

Korrekt. Wenige Augenblicke später sehen wir bei ihm dasselbe Problem. Wieder ein fehlendes Dollar-Zeichen. Immerhin mussten wir dafür nicht wieder lange debuggen.

Kategorien
Allgemein

Flip-Flops

Für die gezielte Ausgabe eines Stacktraces aus einem Java Threaddumps kommt der Flip-Flop Operator von Perl genau richtig.

Kategorien
Allgemein

Für die Wiederholung zwischendurch

Immer wieder passiert es mir, dass ich vor einem Befehl das sudo vergesse. Heute habe ich mich daran erinnert, dass mein Kollege dann immer !! benutzt.
Hat auch bei mir funktioniert. Also einfach statt den Befehl mit sudo vorne dran neu eintippen einfach sudo !! schreiben.

Kategorien
Allgemein

Neue Kleider für den Server

Auf vielfachen Wunsch eines einzelnen, habe ich mich jetzt an das Update auf Wheezy eingelassen. Es hat scheinbar tatsächlich geklappt.

Kategorien
Allgemein

Lebewohl alter Server

Gerade läuft ein dd if=/dev/urandom of=/dev/hda

Hoffentlich auf dem richtigen Server. Und bitte liebe Kinder macht das nicht auf dem Rechner zu Hause.

Gleich wird der alte Server dann endgültig abgeschaltet. Der neue Server läuft jetzt schon sein Mittwoch nacht ohne Probleme und wird hoffentlich genauso pflegeleicht seinen Dienst tun, wie der alte.

Schnief.

Kategorien
Allgemein

Perl im Schnelldurchlauf

Beim letzten Treffen habe ich einen Einblick in Perl gegeben.

So richtig kurz war er dann doch nicht, aber anscheinend waren die anderen ByteWerfler doch motiviert genug um einige kritische Fragen zu stellen, die mir bei der Erstellung der Folien gar nicht eingefallen waren.

Kategorien
Allgemein

Jaunty berühren und verzweifeln

In zwei Tagen ist es soweit, die neue Ubuntu Version 9.04 steht vor der Tür. Da musste natürlich der Release Candidate schon vorher installiert werden.

Kategorien
Allgemein

Log-Dateien lesbar machen

Da hatte ich eine tolle Log-Datei mit ganz vielen Einträgen. Aber vi wollte die Datei nicht richtig anzeigen. Das Problem war, dass alle Einträge in einer Zeile standen, da ich die newlines am Ende der Einträge vergessen hatte. Was nun

Schnell ein Perl-Skript geschrieben, dass die Anfänge der Log-Einträge findet und vor diese ein Neues Zeilen Zeichen einfügt.

#!/usr/bin/perl
use strict;
use warnings;

my $days = qr{Mon|Tue|Wed|Thu|Fri|Sat|Sun};
my $months = qr{Jan|Feb|Mar|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec};
my $date_regex = qr{(?:$days)(?:$months) d{2} d{2}:d{2}:d{2} d{4}};

while (my $line = <>) {
   while ($line =~ m/($date_regex.*?(?=$date_regex))/g) {
      print "n$1";
   }
}
Kategorien
Allgemein

Adressen aus Mails extrahieren

Es scheint ein Volkssport zu sein, sich die Adressbücher in Thunderbird zu löschen. Das Vergnügen ist aber meist nur kurz, denn die Adressen sind nach dem Löschen und weg und werden dennoch gebraucht. Da ist guter Rat teuer.

Oder man hat ein Perl-Skript wie etwa das folgende:

#!/usr/bin/env perl
use strict;
use warnings;
use Mail::Header;

my $head = Mail::Header->new([<>], Modify => 0);
my $bcc = join("", split(/n/, $head->get('BCC')));
my %addresses = ();
while ($bcc =~ m/("[^"]*" <[^>]+>|<[^>]+>|[^,]+),s*/g) {
    my $address = $1;
    if ($address =~ m/(.*) <([^>]*)>/) {
        $addresses{$2}=$1;
    } else {
        $addresses{$1}="";
    }
}

my @sorted_addresses = map { [$_->[1], $addresses{$_->[1]}] }
    sort { $a->[0] cmp $b->[0] }
    map { [lc($_), $_] } keys %addresses;
for my $address (@sorted_addresses) {
  print "$address->[0], $address->[1]n";
};

Noch einfacher ist aber eventuell ein Python-Skript. Auch wenn es ein deprecated Modul benutzt:

#!/usr/bin/env python
import rfc822
f=open('mail_mit_adressen.txt')
m=rfc822.Message(f)
for address in rfc822.AddressList(m['bcc']):
   print ""%s",%s" % address

Beide Ansätze gehen davon aus, dass man noch eine Mail mit allen Addressaten des gelöschten Adressbuches auffindet.

Kategorien
Allgemein

Ärger mit den Ahnen

Wenn man nicht mehr weiss, wohin mit seiner Zeit, dann kann man sich seinen Vätern und Vorvätern widmen. Es sei denn die Software dazu ist auch schon so alt und fehlerbehaftet, dass es einen daran hindert.

In diesem Fall war es die Software „Familienchronik“ von Data Becker aus biblischer Urzeit. Die Daten waren alle erfasst, aber dann war plötzlich die komplette Familie im Weihnachtsurlaub, oder sonst wo, nur leider nicht mehr im Programm auffindbar. Das berichten auch andere Familiendatenzusammenträger.

Die Daten schienen noch vorhanden zu sein, denn die *.anc Datei enthielt noch etwa 200 Kb an Daten. Und offenbarte mit einem Text-Editor auch noch die eingegebenen Daten. Dem Format der Datei kam ich durch andere mitgelieferte Beispieldateien auf die Spur. Dort fand sich im Header der Eintrag „jet db„, das deutete auf eine MS Access Datenbank hin. Das wurde bestätigt, als ich in der Systemsteuerung die anc Datei als Datenquelle eingerichten konnte.

Damit konnte ich dann einfach mit OpenOffice.org per ODBC auf die Daten zugreifen. Die Urväter lebten also noch. Jetzt mussten sie nur noch in ein neues modernes Heim gebracht werden.

Eine Suche nach genealogy und linux erbrachte, dass gramps ein geeignetes Programm wäre. Dieses läuft nicht nur unter Linux, sondern kann auch den Quasi-Standard gedcom importieren und exportieren. Hier ist man also nicht an einen Hersteller gebunden.

Leider reichten meine Openoffice.org Kenntnisse nicht aus, um die sichtbaren Daten in ein Format zu konvertieren, dass gramps importieren wollte. Dafür habe ich dann einen MS Access nach MySQL Konverter genutzt. In der MySQL Datenbank konnte ich dann die Kinder, Familien und Personen so umsortieren, dass ich eine einfache CSV-Datei erstellen konnte. Diese importierte gramps dann fast klaglos.

Ein kleiner Fehler bei der Erkennung des Geschlechts zwang mich dazu, gramps mit einer englischen locale zu starten und so einen Übersetzungs- und Programmfehler zu umgehen.

export LANG=en_EN.utf-8
gramps

Jetzt muss ich nur noch den Bediener der alten Software überzeugen, seine Daten mit dem neuen Programm und am besten unter Linux weiter zu pflegen.