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
java

Wenn der Redirect im Halse stecken bleibt

Gestern haben wir unseren nexus-Server auf den neuesten Stand gebracht und kurz danach funktionierten unsere ant-Skripte zum Herunterladen von Artefakten aus dem nexus nicht mehr. Das Problem war schnell gefunden, die nexus Entwickler haben den Status-Code für einen Redirect von 301 (moved permanently) auf 307 (temporary redirect) geändert. Das ist wohl moderner und kann den Client vom Caching abhalten. Leider haben die ant Entwickler das in ihren alten Versionen, die wir einsetzen, noch nicht gewusst und kommen damit nicht klar.

Da der nexus aber in einem Servlet Container läuft, kann man einen Filter einrichten, der alle Redirects mit Status-Code 307 (temporary redirect) auf den alten Wert 302 (moved temporarily) ändert.

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.