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

XML-RPC und Zope mit Ümläüten

In Vorbereitung auf den WS-Vortrag von Jörg, wollte ich eine einfache Zope Methode per XML-RPC nutzen. Und wieder einmal kam mir das Character-encoding dazwischen.

Das Problem bei dem XML-RPC Aufruf war die fehlende Kodierungsangabe in der XML Deklaration den Zope für die Antwort automatisch generiert. Fehlt aber keine Kodierung wird bei XML Dokumenten von UTF-8 ausgegangen. Wie ich bei den JSP Seiten schon erwähnt hatte.

Da Zope aber anscheinend gar nicht wusste, dass meine String-Antworten Umlaute enthielten und sie auch nicht als Unicode-Strings vorlagen, hat es sie auch nicht als UTF-8 kodierte Strings in die XML-RPC Antwort eingebettet. Glücklicherweise wusste ich sowohl die Kodierung der Strings in meiner Methode und auch, wie ich sie in Unicode-Strings umwandele:

unicode_string = unicode(alter_string, 'iso-8859-1')

Kaum war diese Umwandelung aktiv, funktionierte die Anfrage auch von meinem XML-RPC Client heraus.

Nun kann Jörg also loslegen.

Kategorien
Allgemein

ByteBlog wieder da

Nach dem Crash wollte Quills nicht mehr starten.

Sobald Quills als Produkt installiert wurde, kam auf der Startseite von ByteWurf nur noch eine ewig lange Fehlermeldung, dass ein „traversable adapter“ für weblogs nicht gefunden werden konnte.

Das Zope den Adapter nicht finden konnte, lag daran, dass die Module für quills – wie app und core – gar nicht erst geladen wurden, da setuptools nicht installiert war.

Nun mussten nur noch die Workflow Zustände im Code von „published“ auf den ByteWurf Zustand gebracht werden. Und schon können alle wieder bloggen.

Kategorien
Allgemein

Refcards

Wenn man sich immer mal wieder fragt, wie hiess noch mal der Befehl, oder die welche Tastenkombination war die richtige?

Auf http://refcards.com/ gibt es jede Menge etwa A4 grosser PDF Dateien zu unterschiedlichen Themen, wie perl, javascript oder auch Firefox.

Da lohnt es sich auf jeden Fall mal vorbeizuschauen.

Kategorien
Allgemein

Mit neuen Zope Versionen wird alles besser

Im Grunde war die Migration der Kino-Seiten auf die neue Zope Version 2.10 ein Kinderspiel…

Aber dann kam die Kleinigkeit mit den Berechtigungen. Aber das war ja schnell umschifft. Doch dann kam wieder eine seltsame Fehlermeldung über irgendeinen AquireWrapper oder so.

Nach kurzem suchen habe ich dann des Rätsels Ursprung gefunden. Verwendet man in dtml-in ein sort und sortiert damit SQL Results und haben diese doppelte gleiche Einträge, so verschluckt sich der Sortieralgorithmus. Das Problem ist wohl schon länger bekannt, aber bisher hat sich noch niemand bereit gefunden, die vorgeschlagenen Lösungswege in Zope zu übernehmen.

Nun ja, wir konnten uns helfen, indem wir die SQL Abfrage zum Sortieren genutzt haben und das sort aus dem dtml-in rausgenommen haben.

Kategorien
Allgemein

Dekoratoren in Python

In Java ein alter Hut. In Python ebenso.

In TurboGears bin ich über die folgende Syntax gestolpert:

@exposes('template.html')
def f(): pass

In der Doku steht dann, das @exposes die Methode f() dekoriert. Diese Art der Dekorierung ist mit Python 2.4 neu dazu gekommen und ermöglicht es eine Methode um weitere Funktionalität zu erweitern. Es ist sehr einfach möglich selber solche Dekorierer zu erstellen.

Dazu muss nur eine Funktion mit dem Namen des Dekorators (in unserem Falle exposes) erstellt werden. Diese Funktion erhält ein Argument, die zu dekorierende Funktion. Diese Funktion kann dann nach belieben weiterverarbeitet werden und wird zum Schluss zurückgegeben. Ein einfaches Beispiel wäre also:

>>> def exposes(func):
...	func.decorated=True
...	return func
...
>>> @exposes
... def f(): pass
...
>>> print f.decorated
True

Im Beispiel aus TurboGears erhält der Dekorator allerdings noch einen Parameter. Dekoratoren mit Parametern müssen einen Dekorator zurückliefern, der nur die zu dekorierende Funktion annimmt. Alles klar? Also zum Beispiel:

>>> def exposes(template='default.html'):
...	def newDeco(func):
...		func.template=template
...		return func
...	return newDeco
...
>>> @exposes()
... def f(): pass
...
>>> print f.template
'default.html'

Bei TurboGears passiert bei den Dekoratoren noch eine Menge mehr, so wird die dekorierte Funktion wirklich eingepackt, aber zum Verständnis von Dekoratoren sollte das obige erstmal ausreichen.