Tuesday, July 31, 2007

$foo-Ausgabe "Herbst 2007"

Wie gestern abend angekündigt, ist jetzt auch die neue Ausgabe auf der Homepage von $foo eingetragen. Abonnenten können dort die PDF-Datei herunterladen...

Monday, July 30, 2007

3. Ausgabe vom $foo-Magazin

Heute ist die 3. Ausgabe vom $foo-Magazin eingetroffen. Alle Abonnenten dürfen sich in den nächsten Tagen auf Post freuen!

Verbesserungsvorschläge, Themenwünsche etc. sind immer willkommen.

Die Homepage wird morgen aktualisiert, so dass dann auch diese Ausgabe bestellt werden kann und die Codebeispiele heruntergeladen werden können. Ich werde dann hier im Blog kurz Bescheid geben.

Neue Forensoftware

Auf Perl-Community.de läuft nun endlich die neue Forensoftware. Es hakt zwar noch an einigen Stellen, aber das wird hoffentlich recht bald abgestellt. Martin Fabiani hat in den letzten Tagen noch an einigen Bugfixes gearbeitet, so dass es jetzt doch schon recht nett ist. Besonders markant zum alten Ikonboard ist die Geschwindigkeit. Herrlich wenn das Forum so schnell ist!

Friday, July 27, 2007

Perl-Umfrage

Kirrily Robert hat eine Online-Umfrage zum Thema Perl gestartet. Das Formular ist in nichteinmal 5 Minuten ausgefüllt (nachdem man seine Mail-Adresse validiert hat). Eine Bitte an alle Perl-Programmierer: mitmachen!

Es ist egal, ob man schon zig CPAN-Module geschrieben hat oder erst seit einem Tag Perl programmiert!

Die Ergebnisse sollen schon spätestens Anfang Oktober vorliegen.

Thursday, July 26, 2007

Antwort von Prof. Prechelt

Einer der Hauptverantwortlichen des Plat_Forms-Contests ist Prof. Prechelt von der FU Berlin. Ich hatte ihm heute morgen wegen der Aussage angemailt, dass alle Perl-Lösungen beim SQL-Handling schon bei leicht manipulierten HTTP-Requests fehlerhaft sind.

Ich habe auch prompt eine Antwort bekommen: Es wurde nur ziemlich einfache Szenarien durchgespielt - wo Zahlen in die Datenbank sollten, wurden Strings übergeben und es wurde nicht der "erfolgreiche Angriff" bewertet, sondern lediglich das "Symptom (Fehlermeldung)".

Weiterhin schrieb Herr Prechelt, dass sie davon ausgehen, dass die Ergebnisse soweit sicher seien (außer bei einer Gruppe). So dargestellt, sehen die Ergebnisse schon wieder besser aus. Nur schade, dass bei der Meldung bei heise.de, im Artikel in der iX 8/2007 und auf der Webseite des Plat_Forms-Contests so stark gekürzt und vereinfacht wurde. So könnte der Leser meinen, nur mit PHP kann man sichere Webanwendungen schreiben und mit Perl ist eher alles unsicher... Schade!!

Plat_Forms - Die Quellcodes sind da!

Ich habe hier ja schon mehrfach über den Plat_Forms-Contest berichtet. Jetzt sind auch endlich die Quellcodes online. Mal sehen wann ich Zeit habe, zumindest die Perl-Lösungen ein wenig zu analysieren.

Was mich am meisten verwundert ist der Ausschnitt
Perl was the only platform for which all three solutions' SQL handling did not resist even a simple form of manipulated HTTP requests (see Figure 7.1).

Auf den ersten Blick sieht es so aus, als würden die drei Perl-Teams DBIx::Class verwenden (oder zumindest Framework-eigene Subklassen von DBIx::Class), das DBI mit Bind parameters verwendet und somit SQL-Injections nahezu ausschließen sollte. Ich habe mal Prof. Prechelt eine Mail geschrieben ob er die "Angriffe" veröffentlich kann. Ich hoffe, ich bekomme bald Antwort...

Thursday, July 19, 2007

iX-Artikel über Pugs...

Wie schon in einem früheren Post erwähnt, gibt es in der iX 8/2007 einen Artikel über Pugs. Dieser kann auch online bewundert werden...

Monday, July 16, 2007

Zeitplan YAPC::Europe

So, endlich ist er online - der Zeitplan der YAPC::Europe. Es gibt Talks, die sich echt gut anhören. Teilweise weiß ich gar nicht wohin ich gehen soll...

Wednesday, July 11, 2007

Vom Design zum Schema...

Ich verwende zum Modellieren von Datenbanken das Tool DBDesigner von FabForce. Ich habe schon vor längerer Zeit ein Modul geschrieben, das die daraus resultierende XML-Datei parst und in SQL-Statements umwandelt. Das ist ganz praktisch wenn man keine direkte Verbindung vom DBDesigner zur Datenbank herstellen kann.

Seit ein paar Monaten arbeite ich mit DBIx::Class als Abstraktionsschicht zwischen Anwendung und Datenbank. Bisher habe ich die Klassen für die Verwendung von DBIx::Class per Hand geschrieben beziehungsweise mit DBIx::Class::Schema::Loader gearbeitet.

Jetzt habe ich mir eine neue Möglichkeit geschaffen, um vom Design zum Schema zu kommen: FabForce::DBDesigner4::DBIC. Das generiert aus der XML-Datei vom DBDesigner die entsprechenden Klassen für DBIx::Class.

Da sind sicherlich noch ein Verbesserungen möglich und nötig, aber es nimmt mir schon viel Arbeit ab.

Tuesday, July 10, 2007

heise-Meldung über YAPC::Europe

Auf heise.de gibt es eine Ankündigung der YAPC::Europe, die vom 28. - 30. August 2007 in Wien stattfindet. Lange Zeit hat man auf heise.de vergeblich auf Nachrichten rund um das Thema "Perl" gewartet, umso besser dass heise.de Sponsor der YAPC::EU ist und diese Meldung aufgetaucht ist.

Ich hoffe, es setzt sich der momentane Trend fort, dass Perl wieder häufiger in Zeitschriften auftaucht: In der iX gibt es hin und wieder mal einen Artikel über Perl (Catalyst (1/2007), Bericht über den dt. Perl-Workshop (4/2007) und in der Ausgabe 8/2007 über Pugs), im T3N-Magazin wird demnächst (Ausgabe noch nicht bekannt) ein Artikel über Perl und Ajax erscheinen, im Linux-Magazin gibt es ja schon seit Langem den Perl-Snapshot. Naja, und ich bringe ja noch $foo heraus ;-)

Im Forum bei heise.de gab es natürlich gleich wieder eine Diskussion, ob Perl überhaupt noch zeitgemäß ist. Ich für meinen Teil kann das nur mit einem sehr deutlichen "Ja" beantworten. Sicherlich gibt es das Eine oder Andere was man bei anderen Programmiersprachen besser finden kann, aber es gibt immer noch viele Bereiche in denen Perl einfach unschlagbar ist. Und mit CPAN stehen dem Entwickler so viele Module wie in keiner anderen Sprache zur Verfügung.

Sunday, July 08, 2007

Perl 5.9.5 released

Bis zu Perl 5.10 kann es nicht mehr lange dauern. Gestern wurde Perl 5.9.5 auf CPAN hochgeladen. Diese Version gilt als Beta von Perl 5.10, d.h. es werden keine Features mehr hinzugefügt; es werden nur noch kleinere Änderungen und Bugfixes akzeptiert.

Friday, July 06, 2007

Perl 6 microgrants

Es gibt Neuigkeiten bei den Perl6-Microgrants - drei weitere dieser Mini-Förderungen wurden jetzt bewilligt:
  • Flavio Glock kommt zur YAPC::EU und stellt kp6 und "Perl 6 in Perl 6" vor.
  • Steve Pritchard erstellt die RPM Pakete für Parrot und Pugs für Fedora. Wahrscheinlich finden diese auch ihren Weg in die offizielle Fedora Distribution.
  • Juerd Waalboer bekommt Geld, um neue Hardware für feather.perl6.nl zu kaufen. feather.perl6.nl ist der Hauptserver für die Pugs-Entwicklung.

Vorsicht! $_ und while

Schon allein wegen der Lesbarkeit sollte man nicht immer Spezialvariablen verwenden, aber manchmal sind sie einfach zu praktisch. Eine dieser praktischen Variablen ist $_. Die Variable kann unter anderem als Laufvariable in einer Schleife dienen, so zum Beispiel in einer for-Schleife:

for( @array ){
print $_;
}

Hier könnte man das $_ sogar weglassen weil print automatisch $_ nimmt, wenn nichts anderes angegeben ist.

Auch beim Einlesen von Dateien mit einer while-Schleife kann man $_ verwenden:

open my $fh, '<', $file or die $!; while( <$fh> ){
print;
}
close $fh;

Doch hier ist Vorsicht angesagt: Im Gegensatz zu for und foreach wird in der while-Schleife das $_ nicht lokalisiert. Das kann zu unangenehmen Nebeneffekten führen:

my $_ = 'test';
open my $fh, '<', $file or die $!; while( <$fh> ){
# mach irgendwas
}
close $fh;
print $_;

Hier kommt nicht wie gewünscht 'test' heraus, sondern "nichts" (genauer: ein undef). Während

my $_ = 'test';
for( @array ){
# mach irgendwas
}
print $_;

funktioniert.

Entweder muss man $_ selbst lokalisieren:

while( local $_ = <$fh> ){
}

oder man verwendet eine andere lexikalische Variable:

while( my $line = <$fh> ){
}

Thursday, July 05, 2007

Häufig gebrauchte Variable beim Parsen

Perl ist einfach genial wenn es um die Bearbeitung von Texten und parsen von Dateien geht. Da kommt keine andere Sprache heran. Ein Parser in Java zu schreiben kann sehr umständlich sein - und langsam.

In Perl gibt es viele Möglichkeiten, wie man das Parsen vereinfachen kann. Zum Beispiel wenn es zwischen "Datensätzen" in der Datei einen festen Trenner gibt.

Da kann man einfach $/ auf diesen Trenner setzen und schon erleichtert das einem die Arbeit. Diese Datei soll mal als Beispiel dienen:
Kunde: 123
yadda yadda yadda
yadda yadda yadda
Artikel: rostfreie schrauben

Kunde: 456
yadda yadda yadda
yadda yadda yadda
Artikel: rostfreie schrauben

Kunde: 123
yadda yadda yadda
yadda yadda yadda
Artikel: holzbrett

Man sieht, dass zwischen den Datensätzen immer eine Leerzeile steht. Perl-Einsteiger würden die Datei so parsen:
#!/usr/bin/perl

use strict;
use warnings;

my $file = '/path/to/file.txt';
my %hash;

my ($kunde,$artikel);

open my $fh, '<', $file or die $!;
while( my $line = <$fh> ){
if( $line =~ /^$/ ){
push @{ $hash{$kunde} }, $artikel;
$kunde = '';
$artikel = '';
}
else{
if( $line =~ /Kunde:\s*(\d+)/ ){
$kunde = $1;
}
elsif( $line =~ /Artikel:\s*([^\n]+)/ ){
$artikel = $1;
}
}
}
close $fh;
if( $kunde and $artikel ){
push @{ $hash{$kunde} }, $artikel;
}

for my $key ( keys %hash ){
print $key, " - " , join(" : ", @{ $hash{$key} }),"\n";
}

Aber wenn man $/ auf "\n\n" (zwei Zeilenumbrüche hintereinander - also Leerzeile) setzt, dann erhält man in der while-Schleife immer einen kompletten Datensatz.

Zum Test kann man mal
#!/usr/bin/perl

use strict;
use warnings;

{
local $/ = "\n\n";
my $entry = ;
print $entry;
}


__DATA__
Kunde: 123
yadda yadda yadda
yadda yadda yadda
Artikel: rostfreie schrauben

Kunde: 456
yadda yadda yadda
yadda yadda yadda
Artikel: rostfreie schrauben

Kunde: 123
yadda yadda yadda
yadda yadda yadda
Artikel: holzbrett

ausführen. Dann bekommt man:
C:\>parse2.pl
Kunde: 123
yadda yadda yadda
yadda yadda yadda
Artikel: rostfreie schrauben

So wird das parsen der Datei doch wesentlich einfach und übersichtlicher:
#!/usr/bin/perl

use strict;
use warnings;

my $file = '/path/to/file.txt';
my %hash;

{
local $/ = "\n\n";
my $re = qr/Kunde:\s*(\d+).*Artikel:\s*([^\n]+)/s;
open my $fh, '<', $file or die $!;
while( my $entry = <$fh> ){
my ($kunde,$artikel) = $entry =~ $re;
next unless $kunde;
push @{ $hash{$kunde} }, $artikel;
}
close $fh;
}

for my $key ( keys %hash ){
print $key, " - " , join(" : ", @{ $hash{$key} }),"\n";
}


Man muss sich nicht darum kümmern was passiert wenn am Ende der eingelesenen Datei kein Zeilenumbruch mehr steht und und und...

Was man aber beachten sollte:

Die Variable $/ sollte in einem eigenen Block (hier: das Einlesen) mit local geändert werden. Sonst wird die Variable global geändert. Das kann unerwünschte Nebeneffekte in Modulen oder im eigenen Skript haben (wenn man $/ nicht wieder auf den Defaultwert setzt).

Monday, July 02, 2007

Weg mit globalen Variablen, her mit Konfigurationsdateien.

In vielen Skripten (auch in meinen älteren Skripten) sieht man am Anfang gaaaaanz viele globale Variablen. Ich finde globale Variablen nicht so schön - aus mehreren Gründen:

  • Die Konfiguration passiert innerhalb des Skripts
  • Das Skript wird unübersichtlich
  • Sie verleiten zu sehr zu einer globalen Verwendung (keine Parameterübergabe)
  • Man "verbraucht" sinnvolle Variablennamen

Ich verwende mehr und mehr Konfigurationsdateien. Perl liefert viele Module zum Auslesen von Konfigurationsdateien - ich verwende am liebsten YAML- und INI-Dateien. INI-Dateien haben den Vorteil, dass sie auch viele "Nicht-Programmierer" verstehen, was ein großer Vorteil ist wenn die Applikation weitergegeben wird. YAML hat dagegen den Vorteil, dass damit komplexe Datenstrukturen dargestellt werden können. Viele werden wohl sagen "da kann man auch XML nehmen". Ich finde XML zu aufgeblasen, viel Informationsoverhead...

Hier mal Beispiele für die Verwendung von YAML- bzw. INI-Dateien für die Konfiguration:

test.yml

---
user: beispieluser
max_files: 19



Skript

#!/usr/bin/perl

use strict;
use warnings;
use YAML::Tiny;

my $file = 'test.yml';

my %config = %{ YAML::Tiny->read( $file )->[0] };

print qq~
Database user: $config{user}
Maximum files: $config{max_files}
~;


test.ini

[config]
user=beispieluser
max_files=19


Skript

#!/usr/bin/perl

use strict;
use warnings;
use Config::IniFiles;

my $file = 'test.ini';

tie my %hash, 'Config::IniFiles', (-file => $file );
my %config = %{ $hash{config} };

print qq~
Database user: $config{user}
Maximum files: $config{max_files}
~;

Ein Wiki über das CPAN-Testing

Eine wirklich hilfreiche Angelegenheit für Autoren von CPAN-Modulen sind die CPAN-Tester. Durch diese Helfer werden die Module auf vielen verschiedenen Plattformen getestet. So kann sichergestellt werden, dass Module überall dort installiert werden können wo sie laufen sollen. Die Ergebnisse können auch über CPAN abgerufen werden, wie zum Beispiel die Tests für Test::CheckManifest.

Die CPAN-Tester sind für jede helfende Hand dankbar, doch für viele war der Einstieg zu schwer. Jetzt haben Barbie und ein paar andere ein Wiki aufgesetzt, in dem viele Informationen zum CPAN-Testing zu finden sind.