Wednesday, February 23, 2011

Neuheit auf der CeBIT: Offene Biblio­thek für OTRS-Erweiterungen

OPAR archiviert erstmals Open Source Erwei­terungen für HelpDesk-System OTRS / Unternehmen profitieren in Kundenmanagement vom öffentlichen Know-how anderer


Ich halte am 05.03.2011 um 10:30 Uhr einen Vortrag über OPAR auf der Univention/Linuxhotel-Bühne (Halle 2, Stand D36). OPAR ist/wird ein Archiv nach dem Vorbild CPAN.

Leider ist es so, dass zur Zeit noch kein zentrales Repository für OTRS-Erweiterungen existiert, aber viele Leute schon so etwas programmiert haben und auch der Öffentlichkeit zur Verfügung stellen würden.

Mit OPAR wird das dann möglich sein.

Noch ist es nicht fertig programmiert, aber bis zum Vortrag auf der CeBIT werden die wichtigsten Teile fertig sein.

Das ganze setzt auch Moose, DBIx::Class und ähnliches ein. Den Code werde ich in den nächsten Wochen auch auf Github stellen, so dass eine Mitarbeit leicht möglich ist. Die Dokumentation ist im Moment zwar noch nicht wirklich vorhanden, aber das möchte ich nach den ganzen Veranstaltungen im März ändern...

Tuesday, February 08, 2011

grep für Code auf CPAN

Wer kennt nicht das geniale Tool "grep"? Wer kennt nicht die geniale Sammlung "CPAN"? Ich musste schon häufiger im Code von CPAN-Modulen suchen. Wer das bequem auf einer Webseite machen will, kann sich mal http://grep.cpan.me/ anschauen.

Ist zwar noch Alpha, aber jetzt schon ist das Tool von David Golden super!

Saturday, February 05, 2011

Nützliche Module: B::Deparse und B::Concise

In OTRS habe ich heute morgen folgendes diff gefunden:
--- UnitTest.pm 2 Feb 2011 09:20:20 -0000 1.46
+++ UnitTest.pm 4 Feb 2011 23:37:31 -0000 1.47
@@ -265,4 +265,7 @@
}
}
+ elsif ( system 'uname -s' eq 'FreeBSD' ) {
+ $ResultSummary{Vendor} = 'FreeBSD ' . system 'uname -r';
+ }
else {
$ResultSummary{Vendor} = 'unknown';
Da sind bei mir gleich alle Alarmglocken angesprungen - das kann nicht funktionieren. Schon allein dass "system" das Ergebnis (sprich: die Ausgabe) des ausgeführten Kommandos nicht zurückliefert.

Um aber dem Autor des Codes zu zeigen, was tatsächlich passiert, kann man B::Deparse und B::Concise nehmen. Für den Test habe ich dann einen Einzeiler genommen, der aber genau den Code oben abbildet.

B::Concise

$ perl -MO=Concise,-exec -e 'print "yes\n" if system "uname -s" eq "Linux"'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v
3 <0> pushmark s
4 <$> const[SPECIAL sv_no] s
5 <@> system[t2] sK
6 <|> and(other->7) vK/1
7 <0> pushmark s
8 <$> const[PV "yes\n"] s
9 <@> print vK
a <@> leave[1 ref] vKP/REFC
-e syntax OK

Das zeigt gleich noch ein anderes Problem: Präzedenz! Das "eq" wird vor dem "system" ausgeführt. Das "eq" liefert "unwahr" (sv_no) und übergibt das an "system". Ein "system sv_no" funktioniert immer - jedenfalls unter Ubuntu...

Aber was wird dann tatsächlich ausgeführt? Das kann man sich mit B::Deparse anschauen:

$ perl -MO=Deparse -e 'print "yes\n" if system "uname -s" eq "Linux"'
print "yes\n" if system !1;
-e syntax OK

Wie man sieht können die beiden Module sehr gut dabei helfen, Probleme zu identifizieren. Über ein paar B::*-Module habe ich übrigens in der Frühjahr 2009 Ausgabe von $foo geschrieben und darüber wie B::Concise bei Präzendenz-Problemen hilf in der Sommer 2008 Ausgabe.

x-Modifier bei Regulären Ausdrücken

Über Perl liest man häufiger, dass es eine "write-only" Sprache sei. Als Beispiel folgt dann meist ein Regulärer Ausdruck.

Auch gestern war es wieder soweit:

definitely a write-only language: can't understand A THING of the code I wrote few weeks ago if($_ =~ /^\d*\s([^\s]*)\s(.)/){ }
Erstens hat das Verständnis von Regulären Ausdruck nicht wirklich viel mit Perl zu tun. Die gibt's in (fast) jeder Sprache. In Java wäre es wohl noch kryptischer:

if ( string.matches( "\\d*\\s([^\\s]*)\\s(.)" ) ) { }
Na, wer bemerkt die doppelten "\\"? Aber darum geht's hier nicht. Zweitens kann man in Perl den x-Modifier verwenden. Damit verlieren Leerzeichen in Regulären Ausdrücken ihre Bedeutung und mit "#" kann man Kommentare in Regulären Ausdrücken anfangen:

if ( $plz_ort =~ /
^
\d{5} # Postleitzahl
\s+ # mindestens 1 Leerzeichen
[A-Za-zäöüß-] # Ortsnamen
$
/x ) { }

Damit kann man seine Regulären Ausdrücke wunderbar dokumentieren und versteht somit auch komplexere Ausdrücke auch noch nach Jahren...

Ich kann es nur empfehlen, diesen Modifier zu verwenden.

Gibt es diesen Modifier auch in anderen Sprachen?

Auf jeden Fall kann man so in Perl auch mit komplexen Regulären Ausdrücken sauber und lesbar programmieren.

Wednesday, February 02, 2011

Perl auf dem LinuxTag in Berlin

Auch in diesem Jahr soll es wieder einen Stand für Perl auf dem Berliner LinuxTag (11.-14. Mai 2011) geben. Dafür brauchen wir noch Leute, die helfen.

Außerdem wäre es schön, wenn es ein paar Vorträge über Perl auf dem LinuxTag geben würde. Die Frist für Vortragsvorschläge läuft aber schon bald ab - am 8. Februar. Wer also Lust hat, einen Vortrag einzureichen, sollte sich http://wiki.linuxtag.org/w/vp:Call_for_Papers anschauen.

Helfer sollten sich unter https://www.socialtext.net/perl5/index.cgi?events_2011_linuxtag_berlin eintragen. Es wäre toll, wenn sich viele Helfer finden. Dann wird es für alle ein schöneres Erlebnis.