Friday, July 10, 2009

dritter Blog-Artikel für O'Reilly

Gerade hat Ariane Hesse meinen dritten Beitrag über Perl im O'Reilly-Blog veröffentlicht: http://community.oreilly.de/blog/2009/07/10/perl-die-top-100/

Thursday, July 09, 2009

Source-Code in Bilder umwandeln

Ich habe immer wieder das "Problem", dass ich Quellcode an verschiedenen Stellen anzeigen bzw. einbinden will. Da wäre es doch eine bequeme Sache, wenn man den Quellcode mit Syntaxhighlighting als Bild hätte.

Als Perl-Programmierer will man ja vieles selbst machen und so habe ich mir jetzt ein kleines Skript geschrieben, das genau das macht: Source-Code in Bildern darstellen.

Damit ich mir um das Parsen des Quellcodes keine Gedanken machen muss, habe ich mich für Syntax::Highlight::Engine::Kate entschieden. Gabor Szabo hat da dankenswerterweise etwas nach Perl portiert, das für viele Sprachen den Quellcode parst. Das ist zwar nicht perfekt, reicht aber meistens vollkommen aus.

Für die Bildgenerierung verwende ich GD von Lincoln Stein.

Die Funktion highlightText aus Syntax::Highlight::Engine::Kate kann ich leider nicht nehmen, aber die Funktion als Basis genommen und nur ein klein wenig abgeändert, schon ist das Skript fertig. Ist noch (stark) Verbesserungswürdig, aber ein Anfang ist da:

Friday, June 05, 2009

Mit Attribute::Handlers den Kontext eines Funktionsaufrufs erzwingen

Bei Perl-Community.de kam in dieser Woche die Frage auf, wie man als Programmierer bestimmen kann, dass eine Subroutine in einem bestimmten Kontext aufgerufen werden kann. Ich weiß zwar nicht, ob diese Frage wirklich so häufig aufkommt, aber mir ist als erstes das Stichwort "Attribute" in den Sinn gekommen. In der Ausgabe 5 von $foo habe ich schonmal was über "Attribute" geschrieben.

Hier jetzt mal meine Lösung für das Kontext-Problem:

package CheckContext;

use strict;
use warnings;

use Attribute::Handlers;

sub VOID : ATTR(CODE) {
my ($pkg,$sym,$code) = @_;

my $name = *{$sym}{NAME};
no warnings 'redefine';

*{ $sym } = sub {
my $context = wantarray;
if( defined $context ) {
die "sub have to be called in void context";
}

$code->( @_ );
}
}

sub SCALAR : ATTR(CODE) {
my ($pkg,$sym,$code) = @_;

my $name = *{$sym}{NAME};
no warnings 'redefine';

*{ $sym } = sub {
my $context = wantarray;
unless( defined $context and not $context ) {
die "sub have to be called in scalar context";
}

$code->( @_ );
}
}

sub LIST : ATTR(CODE) {
my ($pkg,$sym,$code) = @_;

my $name = *{$sym}{NAME};
no warnings 'redefine';

*{ $sym } = sub {
my $context = wantarray;
unless( defined $context and $context ) {
die "sub have to be called in list context";
}

$code->( @_ );
}
}

1;


Dieses Modul stellt die notwendigen Attribute zur Verfügung. Mit wantarray bekommt man raus, in welchem Kontext die Subroutine aufgerufen wurde.

In der folgenden Klasse, werden die Attribute verwendet:
package CheckTest;

use strict;
use warnings;
use base 'CheckContext';

sub test : VOID {
print 'hallo';
}

sub zwo : SCALAR {
return 'hallo';
}

sub drei : LIST {
return (1,2,3);
}

1;


Im Skript können die Funktionen dann verwendet werden...

CheckTest::test(); # 'hallo'
my $test = CheckTest::test(); # sub have to be called in void context at CheckContext.pm line 17.
my @test = CheckTest::test(); # sub have to be called in void context at CheckContext.pm line 17.


my $zwo = CheckTest::zwo();
my @zwo = CheckTest::zwo(); # sub have to be called in scalar context at CheckContext.pm line 33.
CheckTest::zwo(); # sub have to be called in scalar context at CheckContext.pm line 33.

Thursday, June 04, 2009

zweiter Blog-Artikel für O'Reilly

Gestern hat O'Reilly meinen zweiten Blog-Artikel in der kleinen Perl-Serie veröffentlicht: "Modern Perl"

Schade, dass sich so ein Blogeintrag immer nur für eine kurze Übersicht eignet, denn es gäbe so viel zu den einzelnen Themen zu sagen. Aber vielleicht regt es den Einen oder die Andere an, sich mit einzelnen Sachen näher zu beschäftigen.

Ich werde auf der diesjährigen FrOSCon vielleicht in einem extra Perl-Raum etwas über DBIx::Class erzählen...

Achso: Und Danke an O'Reilly für die Glückwünsche!

Wednesday, May 20, 2009

Perl-Artikel im Blog bei O'Reilly

In den nächsten Wochen wird es ein paar Blog-Beiträge von mir im Blog von O'Reilly geben. Eben gerade ist die Anmoderation von Ariane Hesse online gegangen...

Das was Frau Hesse dort beschreibt, kann ich nur allzu gut nachvollziehen. Solche Fehler unterlaufen uns auch immer mal wieder im Perl-Magazin. Aber wir sind ja auch nur Menschen ;-)

"Perl programming": Einfluss auf den TIOBE-Index nehmen.

Viele werden den TIOBE-Index kennen, mit dem die Beliebtheit von Programmiersprachen gemessen werden soll. Perl schneidet da relativ schlecht ab. Das hängt auch mit der Art zusammen, wie TIOBE den Index erstellt: relativ einfach mit Google und der Suche nach " programming", also z.B. "perl programming".

Dass vielen diese Problematik bewusst ist, zeigt auch Richard Dice (Präsident der Perl-Foundation) in einem Interview im Perl-Magazin.

In einem Blog habe ich jetzt eine gute Idee gefunden, wie man daran arbeiten kann: Man muss sich die vielen Seiten auf CPAN zu nutze machen und über all "CPAN - The Perl programming archive" einfügen.

Das werde ich wohl irgendwo in der Dokumentation unterbringen, wenn ich meine Module mal wieder update.

Monday, May 11, 2009

Meine CPAN-Module - Teil 2

Auf CPAN finden sich sehr viele Module. Darunter sind sehr viele nützliche Module, aber auch einige, die nur so "zum Spaß" da sind. Diese sind meist im "Acme::*"-Namensraum angesiedelt. Mit zu bekanntesten, dürften Acme::Bleach und Acme::Buffy gehören. Beides sind Module, die den Quellcode verändern. Beim ersten Modul hat man dann lauter "Whitespace" - ein wahrhaft sauberes Programm ;-)

Manche Acme::*-Module sind aber auch zum Testen da. So wie mein Acme::DarmstadtPM::TieHash. Ein anderes Mitglied von Darmstadt.pm hat auf der Mailingliste ein Ruby-Snippet gepostet (habe ich damals auch bei Perl-Community.de gepostet) und gemeint, dass Perl so etwas nicht kann. So etwas interessiert mich dann und ich versuche, eine (Perl-)Lösung dafür zu finden.

Zum Glück gibt es "tie"s in Perl.

Daraus ist dann oben genanntes Modul entstanden, mit dem man einen Hash an eine Subroutine binden kann und wenn man auf einen Schlüssel des Hashs zugreift, dann wird das Ergebnis der Subroutine zurückgeliefert.

Als "Proof of Concept" ist es ganz ok ;-)

 1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Test::More tests => 2;
6
7 use constant ADT => 'Acme::DarmstadtPM::TieHash';
8
9 use_ok(ADT);
10
11 tie my %hash,ADT,sub{$_[0] + $_[-1]};
12
13 is($hash{[1,5]},6,'Check [1,5]');
14
15 untie %hash;
oder auch
  1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Acme::DarmstadtPM::TieHash;
6
7 tie my %hash, 'Acme::DarmstadtPM::TieHash', sub{ "\U@_\n" };
8
9 print $hash{hallo};
10
11 untie %hash;

Friday, May 08, 2009

Meine CPAN-Module - Teil 1

Durch Yuval Kogman inspiriert, werde ich hier in der nächsten Zeit immer mal wieder über meine CPAN-Module schreiben. Dabei werde ich nicht nur die Funktionen beschreiben - dafür gibt es ja die Doku ;-) - sondern auch warum ich das geschrieben habe.

Da gibt's auch Module, die vielleicht nicht optimal sind...

Denn Anfang mache ich heute mit den ersten Modulen, die ich geschrieben habe: Bio::FASTASequence und Bio::FASTASequence::File. Beide Module sind ganz am Anfang meiner "Perl-Karriere" entstanden, als ich bei einer Firma im Industriepark Höchst meine Ausbildung in der Bio-Informatik gemacht habe.

Da tauchte immer wieder die Aufgabe auf, Dateien mit FASTA-Sequenzen zu parsen. Am Anfang alles im Skript selbst (als Perl-Autodidakt kennt man Module noch nicht gleich), dann habe ich in meiner Freizeit die erste Version des Moduls geschrieben.

Warum kein BioPerl? Weil ich es da noch nicht kannte - und später war mein Modul zu sehr an das ganze System angepasst.

Das Modul dient also dazu, Informationen über FASTA-Sequenzen herauszufinden. Diese Informationen wurden weiterverarbeitet.

Wer sich den Code anschaut, wird sofort erkennen, dass das jemand geschrieben hat, der noch nicht allzu lange mit Perl programmiert hat. Da ich aber nicht mehr in der Bio-Informatik unterwegs bin, werde ich da auch nicht mehr allzu viel dran ändern.

Jetzt aber mal etwas zur Funktion des Moduls - an Hand eines kleinen Beispiels:

#!/usr/bin/perl

use strict;
use warnings;
use Bio::FASTASequence;

my $sequence = qq~>sp|P01815|Beschreibung.
QVTLRESGPALVKPTQTLTLTCTFSGFSLSSTGMCVGWIRQPPGKGLEWLARIDWDDDKY
YNTSLETRLTISKDTSRNQVVLTMDPVDTATYYCARITVIPAPAGYMDVWGRGTPVTVSS~;

my $object = Bio::FASTASequence->new($sequence);
my @cysteins =

print 'The sequence of ' . $object->getAccessionNr .
' is ' . $object->getSequence ,"\n",
'This sequence contains ', scalar( @{ $object->allIndexesOf('C') } ),
' Cysteins at the positions ';

print $_+1, ', ' for @{$object->allIndexesOf('C') };

Bio::FASTASequence ermöglicht das Parsen einer einzelnen Sequenz. Möchte man ganze Dateien einlesen, kann man Bio::FASTASequence::File verwenden.

Das Modul eignet sich ganz gut, wenn man nur mal Dateien im FASTA-Format schnell parsen will, ohne sich in die Tiefen von BioPerl zu graben. Für größere Sachen empfehle ich aber BioPerl (das ich dann später in anderen Projekten auch selbst verwendet habe).

Monday, May 04, 2009

eigene Perl::Critic Policies

Im Zuge des EPO-Iron Mans werde ich auch vereinzelt Artikel aus früheren Ausgaben von "$foo - Perl-Magazin" posten.

Ich mache hier die Regeln

eigene Policies für Perl::Critic

Jedes Unternehmen hat eigene Programmierrichtlinien und jeder Programmierer hat einen eigenen Stil. Soll der Code auf den eigenen Stil hin überprüft werden, sind die bestehenden Policies von Perl::Critic häufig ungeeignet. Da müssen also eigene Policies geschrieben werden.

Dafür ist es notwendig, dass man sich einigermaßen mit PPI (siehe auch $foo Ausgabe 3) auskennt und einige Regeln von Perl::Critic beachtet. In diesem Artikel soll das Schreiben eigener Policies am Beispiel "öffnende Klammer einer Schleife muss in der Zeile des Schleifenkopfes stehen" gezeigt werden.

Es soll in Zukunft also so etwas erzwungen werden wie

  for my $var ( ... ) {

und nicht

  for my $var ( ... )
{

Big Perl is watching your Code

Wie schon erwähnt, steht hinter Perl::Critic das Modul PPI. PPI zerlegt den Perl-Code in Tokens, erstellt daraus "Nodes" und baut daraus eine Baumstruktur. Perl::Critic ruft bei jedem "Node" die entsprechende Perl::Critic::Policy-Subklasse auf und wenn ein Code vorhanden ist, der nicht den Regeln entspricht, wird ein Perl::Critic::Violation-Objekt zurückgeliefert.

Das Gerüst muss stehen

Die Policies sind Subklassen von Perl::Critic::Policy, und die Klassen müssen dementsprechend auch in diesem Namensraum liegen. Perl::Critic arbeitet mit Module::Pluggable, um die Policies automatisch zu finden.

Die ersten Zeilen einer Policy (nach dem Package-Namen) sollten so aussehen:
  use strict;
use warnings;
use Perl::Critic::Util;
use Perl::Critic::Violation;

use base qw/Perl::Critic::Policy/;

our $VERSION = '0.01';
Die Policy muss einem Nutzer auch sagen, was falsch ist. Dafür gibt es zwei Variablen in jeder Policy: Zum Einen $desc und zum Anderen $expl. $desc ist ein String, der aussagen sollte, was falsch gelaufen ist. Das kann in wenigen Worten geschehen. $expl ist entweder ein String mit einer genauen Beschreibung, was falsch gemacht wurde, oder eine Arrayreferenz mit den Seitenzahlen aus "Perl Best Practices", auf denen das gewünschte Verhalten erklärt ist.

Da in diesem Beispiel kein Programmierstil von "Perl Best Practices" behandelt wird, sind das ganz eigene Sachen, die dort ausgegeben werden.
  my $desc = q~{ nicht in der Zeile des Schleifenkopfes.~;
my $expl = q~Die öffnende Klammer muss in der Zeile des
Zeilenkopfes stehen, also

for my $var ( ... ){
...
}

anstatt

for my $var ( ... )
{
...
}
~;

Die new-Methode sollte nur überschrieben werden, wenn der Nutzer Argumente an die Policy übergeben können soll. Das ist hier aber nicht notwendig.

Mein Profil

Jede Policy hat ein paar Standardsachen, die ein gewisses Profil für die Policy darstellen. Dazu gehören neben der Kurzbeschreibung in $desc und der genauen Beschreibung in $expl auch ein paar Subroutinen, die angeben, für welche PPI-Nodes die Policy angewendet werden soll, zu welchen Themes die Policy gehört und natürlich für welchen Severity-Level die Policy angewendet werden soll.

Die Angabe des PPI-Knotens ist wichtig, damit die Policy auch nur für ganz bestimmte Code-Fragmente angewendet wird. Außerdem bedeutet es einen Geschwindigkeitsvorteil, wenn nicht alle Policies für alle Knoten angewendet werden.

Der Knoten wird durch die Subroutine applies_to bestimmt. Die for-Schleife ist ein PPI::Statement::Compound, also muss dies in der Subroutine eingetragen werden.
  sub applies_to{ return 'PPI::Statement::Compound' }
Über die Angabe des Themes können Anwender bestimmte Policies ein- oder ausschalten. Dies ist ganz praktisch, wenn man für mehrere Kunden arbeitet und alle etwas unterschiedliche Regelungen haben.

Dieses Beispiel soll in den Themes "core" und "foo" enthalten sein. Die Subroutine, die das bestimmt, heißt default_themes.
  sub default_themes{ return qw/core foo/ }
Der Severity-Level bestimmt, wie wichtig die Regel ist. Ist es eine Regel, die in jedem Programm eingehalten werden muss, dann ist das die höchste Prioritätsstufe, ist es jedoch nur eine "Schönheitsregel", dann kann eine niedrige Prioritätsstufe ausgewählt werden. Da die hier gezeigte Regel auf jeden Fall eingehalten werden soll, bekommt sie die höchste Priorität
  sub default_severity{ return $SEVERITY_HIGHEST }
Die Variable $SEVERITY_HIGHEST wird vom Modul Perl::Critic::Utils exportiert.

Jetzt geht's los!

Bevor das große Coden losgeht, am besten nochmal genau darüber Gedanken machen, was die Policy machen soll. In diesem Fall müssen wir bedenken, dass kein Fehler ausgegeben werden soll, wenn der Schleifenkopf nachgestellt ist, also so etwas wie
  print $_ for @array;
Als ganz nützlich hat sich herausgestellt, vorher verschiedene Varianten von Code, die der Nutzer schreiben könnte, mit PPI zu testen und sich die Baumstruktur anzuschauen.

In den Beispielcodes auf der Webseite ist ein Beispielprogramm mit verschiedenen Schleifenvarianten enthalten. In Listing 2 ist die PDOM-Struktur einer for-Schleife, wie sie gültig ist, zu sehen.

  PPI::Statement::Compound
PPI::Token::Word 'for'
PPI::Token::Whitespace ' '
PPI::Token::Word 'my'
PPI::Token::Whitespace ' '
PPI::Token::Symbol '$var'
PPI::Token::Whitespace ' '
PPI::Structure::ForLoop ( ... )
PPI::Statement
PPI::Token::Symbol '@array'
PPI::Structure::Block { ... }

Ein kleiner Teil ist bei einer ungültigen Schleife unterschiedlich. Zwischen der ForLoop und dem Block taucht noch ein Newline auf:

  PPI::Structure::ForLoop     (... )
PPI::Statement
PPI::Token::Symbol '@array'
PPI::Token::Whitespace '\n'
PPI::Structure::Block { ... }
Die einfachste Variante, eine solche Policy zu entwickeln ist, sich alle möglichen Varianten der zu untersuchenden Struktur aufzuschreiben und mit dem Dumper von PPI anzuschauen. Dann können die Unterschiede besser herausgearbeitet werden. Für diesen Artikel gibt es bei den Codes auf der Webseite das Skript show_pdoms.pl, das genau dieses zeigt.

Bei dem hier gezeigten Beispiel fällt auf, dass bei einer Regelverletzung immer ein \n zwischen der ForLoop und dem Block erscheint.

In Listing 3 ist die Methode zu sehen, die für die eigentliche Regelüberprüfung
zuständig ist.

1 sub violates{
2 my ($self,$elem,$doc) = @_;
3
4 my $base = $elem->schild(0);
5 return unless $base eq 'for';
6
7 my ($list,$newline,$block);
8
9 my @children = $elem->children;
10
11 for my $i ( 0 .. $#children ){
12 my $child = $children[$i];
13
14 if( $child->isa( 'PPI::Structure::Block' ) ){
15 $block = $i;
16 }
17 elsif( $child->isa( 'PPI::Structure::ForLoop' ) ){
18 $list = $i;
19 }
20 elsif( $child->isa( 'PPI::Token::Whitespace' ) and
21 $child eq "\n" and
22 not $newline){
23 $newline = $i;
24 }
25 }
26
27 if( $newline and $newline > $list and $newline < $block){ 28 my $sev = $self->get_severity;
29 return Perl::Critic::Violation->new( $desc,$expl,$elem,$sev );
30 }
31
32 return;
33 }


Die Methode, die die Überprüfung enthält, heißt violates und bekommt von Perl::Critic automatisch drei Parameter übergeben: das Perl::Critic-Objekt, das entsprechende PPI-Element, auf das die Regel angewendet wird und das komplette PPI-Dokument (die Datei oder das Snippet, auf das Perl::Critic angewendet wird).

Die Policy soll nur auf for-Schleifen angewendet werden. Deshalb muss als erstes überprüft werden, ob es sich tatsächlich um eine solche Schleife handelt. Dazu wird überprüft, ob das erste child-Element ein 'for' ist.

Danach werden die Positionen von Block, ForLoop und Newline festgestellt. Nur in dem Fall, in dem ein Newline zwischen Block und ForLoop ist, wird ein Fehler ausgegeben.

Und schon ist die erste eigene Regel implementiert. Bei einer for-Schleifen, die gegen die Regel verstößt, wird in Zukunft ein Fehler ausgegeben, wie er in Listing 4 zu sehen ist.
oeffnende Klammer muss in Zeile mit Schleifenkopf sein at line 20, column 5. Es
soll in Zukunft also so etwas erzwungen werden wie

for my $var ( ... ) {

und nicht

for my $var ( ... )
{
.

Thursday, April 30, 2009

10. Ausgabe vom Perl-Magazin ist da!

Die 10. Ausgabe von $foo (http://perl-magazin.de) ist da! Die Abonnenten werden ihr Heft in den nächsten Tagen bekommen. Wir gehen jetzt ins dritte Jahr von $foo und das sind unsere Themen in dieser Ausgabe:

* Richard Dice - Update über "The Perl Foundation"

Renée Bäcker hat mit Richard Dice, dem Präsidenten der Perl Foundation, über das Jahr 2008 gesprochen. Außerdem gibt Dice einen Ausblick auf das Jahr 2009.

* Internationalisierung oder Lokalisierung?

In diesem Kapitel geht Theo Ohnsorge auf Internationalisierung und Lokalisierung im Allgemeinen ein, stellt aber auch vor, wie man mit dem Web-Framework "Catalyst" seine Webanwendungen mehrsprachig machen kann.

* Merkwürdigkeiten in Perl

In diesem Teil wird gezeigt, welche Fallstricke es bei der Verwendung der sogenannten "indirekten Notation" gibt. Das liefert bisweilen Ergebnisse, die so nicht unbedingt vom Programmierer gewollt waren.

* Linux GUI's automatisch testen

GUIs zu testen ist äußerst schwierig. Marc Koderer zeigt in diesem Kapitel, wie man unter Linux GUIs testen kann.

* 111% DBIx::Class

Im zweiten Teil dieser Serie geht es darum, wie man den Suchpfad für bestimmte Klassen ändern kann. Weiterhin geht es um so genannte "Virtuelle Views". Dabei kann man das Ergebnis einer Abfrage als "Tabelle" nehmen. Im letzten Abschnitt geht es um Profiling und wie man damit Statistiken über die Laufzeit von SQL-Befehlen erstellen kann.

* Test::Class Best Practices

Wenn man mit großen Test-Suites arbeitet, wird die Verwendung von Prozeduralen Tests für Objektorientierten Code mit der Zeit schwerfällig. Das ist der Punkt an dem Test::Class glänzt. Leider kämpfen viele Programmierer damit, dieses Modul kennenzulernen oder nutzen nicht die kompletten Möglichkeiten. Curtis 'Ovid' Poe zeigt, wie man sich mit Test::Class das Leben einfach machen kann.

* XS - Perl mit C erweitern

Dieser letzte Teil des XS-Tutorials wird einige spezielle Aspekte der XS-Programmierung beleuchten. Als erstes wäre da das Thema Portabilität, das spätestens dann interessant wird, wenn wir darüber nachdenken, unser XS-Modul ins CPAN zu stellen. Dann muss der Code nicht nur mit unserer Perl-Version funktionieren, sondern mit hunderten anderer Versionen.

* Perl 6 Tutorial

Der siebte Teil des Perl 6 Tutorials hat vor allem den Umgang mit Text, also Strings, zum Inhalt. Das klingt stark nach Regex, beinhaltet aber noch einiges mehr, wie quoting, Interpolation und Formate. Beginnen wir jedoch mit den einfachsten Grundlagen.

* Win32 Tipps & Tricks

In diesem Artikel werden verschiedene Tipps & Tricks für die Perl-Programmierung unter Windows gezeigt. Windows hat seine Eigenheiten, die man auch mit Perl nutzen kann.

Wednesday, April 01, 2009

Excel-Dateien erstellen

Perl kann so einfach sein ;-) Wie bekommt man eine .txt-Datei in eine .xls umgewandelt? In der .txt stehen Dateinamen (einer pro Zeile) und in der Excel-Datei soll für jeden Anfangsbuchstaben eine Tabelle erstellt werden und die jeweiligen Dateinamen eingetragen werden. Diese Fragestellung tauchte in einem Forum auf und das ist eine gute Gelegenheit mal wieder mein Modul Spreadsheet::SimpleExcel zu verwenden:

#!/usr/bin/perl

use strict;
use warnings;
use Spreadsheet::SimpleExcel;

my %hash;
open my $fh, '<', 'dateien.txt' or die $!;
while( my $line = <$fh> ){
chomp $line;
my $initial = substr $line, 0, 1;
push @{ $hash{lc $initial} }, [$line];
}
close $fh;

my $xls = Spreadsheet::SimpleExcel->new;

for my $key ( sort keys %hash ){
$xls->add_worksheet( $key, { -data => $hash{$key} } );
}

$xls->output_to_file( 'test.xls' );
Einfach, oder? Spreadsheet::SimpleExcel unterstützt zwar nicht alles von Spreadsheet::WriteExcel, für meine Belange war das aber bisher mehr als ausreichend.

Saturday, February 28, 2009

11. Deutscher Perl-Workshop - persönlicher Rückblick

Langer Anlauf, kurzer Sprint und schon ist alles vorbei. So könnte man den 11. Deutschen Perl-Workshop aus meiner Sicht beschreiben...

Im Juni 2008 haben wir (Frankfurt.pm) angefangen, die ersten Dinge für den Workshop zu sondieren: Wo könnten wir den Workshop abhalten? Tagungshaus? Uni? Hotel? Welche Restaurants kommen für den Social Event in Frage? Wen können wir wegen Sponsoring fragen?

In den nächsten Wochen und Monaten hat sich eins nach dem anderen ergeben; der Veranstaltungsort wurde ausgewählt, der CfP wurde verschickt und Sponsoren gesucht. Ab November bin ich dann auf die Suche nach einer Buchhandlung gegangen, die den Büchertisch auf dem Workshop machen kann. Schließlich bin ich fündig geworden: die Buchhandlung Hector hat zugesagt, den Büchertisch zu machen.

Dann musste über die Vortragsvorschläge abgestimmt werden und ein Zeitplan erstellt werden. Das hat WsOrga, die "große" Orga, die die "lokale Orga" unterstützt, übernommen. Genauso wie den Tagungsband zu erstellen.

Natürlich musste dann auch überall angekündigt werden, dass man sich zum Workshop anmelden kann.

Der letzte Monat vor dem Workshop war dann etwas stressiger: Welche Unterlagen brauchen wir? Wie viele Leute kommen? Kommen alle zum Social Event? Haben wir die ganze Technik, die wir benötigen? Wie sieht es mit Schildern etc. aus? Die Teilnehmerzahlen mussten an Catering und Restaurant weitergegeben werden. Die Namensschilder mussten noch erstellt werden und vieles mehr.

Die USB-Karten, die uns von gesponsort wurden, mussten mit MiniCPAN, StrawberryPerl, Padre, Kephra, Tagungsband und Sponsoreninformationen bespielt werden. Mein Drucker stand quasi nicht mehr still, weil alle möglichen Listen und Dokumente gedruckt werden mussten. Die Post hat Pakete von der WsOrga mit Büromaterial und den Taschen geliefert. Das "Carepaket" von O'Reilly kam pünktlich zum Workshop.

Mittwoch morgen wacht man dann auf mit der Ungewissheit, ob alles klappt. Ich war dann schon sehr früh am "Haus der Jugend" und habe mit einigen anderen die restlichen Sachen aufgebaut und Schilder aufgehängt. Dann kamen die ersten Teilnehmer...

Als die Tutorials liefen, war der erste große Ansturm vorbei. Dann gab's Mittagspause und danach die ersten Vorträge. Abends war der Social Event, an dem ich leider nicht teilnehmen konnte. Der erste Tag war geschafft und es gab eigentlich nichts, was nicht geklappt hätte.

Die anderen beiden Tage waren dann für mich sehr ruhig. Ich habe einen Vortrag und einen Lightning-Talk gehalten und einen Teil war ich Session Chair. Insgesamt habe ich zwar nur ganz wenige Vorträge gehört, aber trotzdem war es ein schöner Workshop für mich. Soweit hat alles geklappt und die Teilnehmer waren auch sehr zufrieden.

An dieser Stelle möchte ich mich bei allen Danken, die zum Erfolg des Workshops beigetragen haben:

* Frankfurt.pm - die lokale Orga
* WsOrga - die "große" Orga
* Teilnehmer
* Vortragende
* Sponsoren
* alle anderen, die mit dem Workshop zu tun hatten

Ach ja, hier gibt's die Links zu einigen der Vorträgen: http://conferences.yapceurope.org/gpw2009/wiki?node=Slides

Friday, February 27, 2009

Vortrag auf dem 11. Deutschen Perl-Workshop

Ich habe gestern einen Vortrag über Module für nützliche Informationen gehalten. Gerade habe ich die Folien online gestellt.

Links zu anderen Vortragsfolien sind im Wiki des Perl-Workshops zu finden (das wird sich nach und nach noch füllen).

Tuesday, February 24, 2009

Auch das noch...

Ich sitze seit zwei Tagen an jeder Menge Sachen für den 11. Deutschen Perl-Workshop, der morgen beginnt. Und gerade hat mich Sören angerufen und gesagt, dass morgen die VGF streiken will. Deshalb ging gerade die folgende Mail über WsInfo raus:

Hallo liebe Teilnehmer des 11. Deutschen Perl-Workshops,

das hatten wir in der Geschichte des Perl-Workshops wahrscheinlich auch
noch nicht, aber da sind wir machtlos:

Die Lokführer und Busfahrer der VGF streiken morgen (Aschermittwoch).

Das heißt: KEINE U-Bahnen, KEINE Straßenbahnen und teilweise fallen auch
Busse aus.

Nach jetzigem Kenntnisstand wird allerdings die wichtige Buslinie 46
fahren. Diese fährt vom Hauptbahnhof nach Sachsenhausen.

Oder ihr fahrt mit der S-Bahn zur Konstablerwache und lauft.

Mehr zu dem Streik: http://www.vgf-ffm.de/vgf/6052.jsp

Google-Map, damit ihr euch einen Eindruck davon verschaffen könnt, wie
ihr laufen müsstet:

http://tinyurl.com/KarteDPW11

Ich hoffe, wir sehen uns morgen trotzdem pünktlich

Viele Grüße,
Renée

Thursday, February 19, 2009

Perl 6 Training/Workshop nach dem Deutschen Perl-Workshop

Am Wochenende nach dem 11. Deutschen Perl-Workshop möchte Gabor Szabo eine Perl 6 Training/Workshop-Kombination machen.

Gabor setzt dabei seine Perl 6 Trainingsmaterialien ein und Ziel ist, mit dem aktuellen Stand von Perl 6 herumzuspielen. Wer interesse hat, soll sich doch bitte im Wiki des Perl-Workshops 2009 eintragen. Zu den Kosten: Teilnahmegebühr an sich wird es nicht geben. Aber die Kosten für einen Raum - wenn einer gemietet werden muss - werden auf alle Teilnehmer aufgeteilt.

Mehr dazu auch im Blog von Gabor.

Ich selbst werde wohl eher nicht teilnehmen: Die Organisation des Deutschen Perl-Workshops hat genug Zeit gekostet und am Wochenende brauche ich einfach mal etwas Zeit zum Regenerieren...

Sunday, February 15, 2009

9. Ausgabe von $foo

Mmhhh... ist zwar leicht verspätet, aber irgendwie habe ich es total verpeilt, die 9. Ausgabe von $foo hier vorzustellen. Naja, besser spät als nie ;-)

Neben den News aus der Perl Foundation, Terminen und anderen Neuigkeiten, gibt es diesmal diese Themen:

* 110% DBIx::Class

DBIx::Class bietet viel mehr als nur die Standardsachen, die in den meisten Projekten eingesetzt werden. Dieser Artikel startet eine kleine Serie von Artikeln, in denen nützliche Features von DBIx::Class vorgestellt werden.

* Website Intrusion Detection mit PerlIDS

Webanwendungen sind immer häufiger Ziele von manuellen oder automatisierten Angriffen wie Cross-Site-Scripting, SQL-Injections und dergleichen. Der Artikel von Hinnerk Altenburg zeigt eine Möglichkeit, wie man solche Angriffe frühzeitig erkennen kann

* autodie

Das Pragma von Paul Fenwick wird in diesem Artikel vorgestellt. Darin wird gezeigt, wie man Fehlerbehandlung einfach machen kann

* Backendmodule

Dieser Artikel zeigt die Anwendung von drei Backendmodulen und was man mit diesen Informationen anfangen kann.

* Typeglobs

Der dritte und abschließende Teil des Typeglob-Tutorials von Ferry Bolhar zeigt den Umgang mit Handles und wie man Wrapper bauen kann.

* XS-Tutorial Teil 2

Marcus Holland-Moritz zeigt im zweiten Teil des XS-Tutorials, wie man mit Typemaps arbeitet und wie man XS-Module debuggen kann. Außerdem zeigt er einen (Geschwindigkeits-)Vergleich zwischen einer Perl- und einer XS-Version eines Algorithmus.

* Perl 6 Tutorial - Teil 6

Im sechsten Teil des Perl 6 Tutorials geht es um Objekte und Rollen. Dabei zeigt Herbert Breunung unter anderem einen Vergleich zwischen der Perl 5- und der Perl 6-Objektorientierung und wie Vererbung funktioniert.

* Foswiki

Mit Foswiki gibt es einen Fork vom beliebten Wikisystem TWiki. Martin Seibert geht in diesem Artikel darauf ein, warum sich die Entwicklung getrennt hat und wie es mit Foswiki weitergeht.

* F*EX

F*EX ist ein Datei-Austauschprogramm, das Nachteile von herkömmlichen Programmen und Protokollen ausbessert. Ulli Horlacher stellt F*EX in $foo vor und zeigt was man damit machen kann.

* Videomixer mit Perl

Max Maischein zeigt in diesem Artikel wie man mit Perl und anderen Programmen einen Videomixer und verschiedene Filter implementieren kann.

Wednesday, February 11, 2009

Kleine Änderung -> große Wirkung

Tja, so was passiert halt, wenn man "mal eben" etwas ändert: Kaum hat man ein paar kleine Änderungen am Quellcode durchgeführt, funktioniert es nicht mehr. Aber es ist nicht so schlimm, dass das Programm abbricht... Es liefert "nur" nicht die Ergebnisse, die es liefern sollte.

Was habe ich gemacht? Ich habe für ein Projekt ein Modul geschrieben, in dem auch Reguläre Ausdrücke verwendet werden. Ich hatte es als

$var =~ /.../;

geschrieben. In dem Projekt soll aber immer die Schreibweise

$var =~ m{ }xms;

genommen werden.

Dumm nur, wenn man einfach alles abändert, ohne sich den Regulären Ausdruck anzuschauen, denn der sa so aus:

/^\Q$check/

und wenn man daraus jetzt

m{ ^\Q$check }xms

macht, dann wird das letzte Leerzeichen gequotet. Normalerweise werden - dank dem 'x'-Modifier - die Leerzeichen nicht für den Regulären Ausdruck berücksichtigt. Da das letzte Leerzeichen dank dem \Q vorher gequotet wird, wird es im Regulären Ausdruck berücksichtigt.

Naja, ich bin dann doch relativ schnell auf den Fehler gekommen und jetzt habe ich überall noch das \E hinzugefügt.

m{ ^\Q$check\E }xms

In dem Zuge habe ich auch noch das ^ durch \A ersetzt...

Aber das zeigt mal wieder, dass kleine Änderungen durchaus große Wirkung haben können.

Monday, February 02, 2009

Leerzeichen in Pfaden *grrr*

Ich habe mich gerade an einer OTRS-Installation auf meinem Windows-Laptop versucht. Allerdings habe ich nicht den Windows-Installer genommen, sondern direkt die Quellen. Natürlich habe ich einen Pfad mit Leerzeichen genommen und schon ging nix mehr...

Schnell stieß ich auf folgenden Code:

my $Dir = $Self->{ConfigObject}->Get('TemplateDir') . '/HTML/';
if ( -e $Dir ) {
my @Files = glob("$Dir/Layout*.pm");
}

Dazu muss man wissen, dass glob den String an den Leerzeichen "aufteilt", also wird z.B. aus "C:\Program Files" das hier:

glob('C:\Program','Files/Layout*.pm');

glob liefert bei einem String ohne Wildcard einfach diesen String zurück...

Jetzt gibt es zwei mögliche Lösungen:

Erstens die alte 8.3-Schreibweise verwenden, da es dabei keine Leerzeichen gibt. Der Pfad würde dann so aussehen: "C:\PROGRA~1". Die "guten" alten DOS-Zeiten lassen grüßen.

Zweitens: Die Installation einfach in ein Verzeichnis ohne Leerzeichen schieben.

Ich habe mich für zweitens entschieden, weil das jetzt schneller ging, der Windows-Installer nimmt die erste Möglichkeit.

Wednesday, January 14, 2009

Perl-Training: Test-Automatisierung

Ich habe gerade eine Mail von Gabor Szabo bekommen, dass er Anfang März ein Perl-Training über "Test-Automatisierung mit Perl" hält. Da er um Verbreitung der Mail gebeten hat, poste ich die Mail hier im Blog:

Hi,

I am happy to announce that finally I have a place and the
date for the 3-day long training on how to use Perl for Test Automation.

It will take place between 2-4/March 2009, right after GPW thought
not really related but I'll have then the opportunity to also attend
GPW and participate in the Padre talk of Steffen Muller and maybe
to have a hackathon on the weekend after GPW.

Details of the course can be found on my web site:

http://szabgab.com/blog/2009/01/1231876438.html

When I gave this training in Oslo, the class was full within
I think 2 weeks. While I think it will take longer this time
I hope I can finish the registration quickly.
The class is limited to 12 students.

If you are interested in further details,
please contact me by e-mail off list.

As this is a corporate course, if you know anyone around
you whom you think might benefit from the training,
please forward this message to him/her.

regards
Gabor

Tuesday, January 06, 2009

Anmeldung zum 11. Deutschen Perl-Workshop möglich

Jetzt geht es langsam in die heiße Phase mit der Organisation des 11. Deutschen Perl-Workshops. Nur noch wenige Wochen und dann werden wir sehen, ob sich die letzten Monate gelohnt haben.

Ein Schritt, damit es zum Erfolg wird ist, dass viele Teilnehmer kommen. Seit heute kann man sich für den Perl-Workshop anmelden.

Insgesamt wird es 34 Vorträge an drei Tagen geben.

Die Preise sind stabil geblieben:

  • 50 € für Studenten und Vortragende
  • 75 € für Privatpersonen
  • 250 € für Firmenteilnehmer

Ich denke, es lohnt sich vorbeizukommen.

Am dem Freitag (27.02.) soll der Perl-Workshop für das nächste Jahr "vergeben" werden. Wenn jemand also Interesse daran hat, den Perl-Workshop 2010 auszurichten, der kann sich gerne bei den Orgas melden.

Wenn man zu viert oder zu fünft ist, dann ist das für jeden eine überschaubare Aufgabe. Wenn man alleine oder zu zweit ist, dann wird es zwar etwas stressiger, aber auch das ist zu schaffen. Außerdem gibt es ja noch Unterstützung von den bisherigen Organisatoren und ein Teil der Arbeit (z.B. Webseite und Tagungsband) wird ja weiterhin von den WsOrga übernommen.

Sunday, January 04, 2009

Webseite für "Perl-Code parsen mit PPI"

Patrick Donelan hat eine Webseite erstellt, mit der man einen eingegebenen Perl-Code als PPI-Struktur dargestellt bekommt.

PPI ist ein Modul von Adam Kennedy, mit dem Perl-Code geparst werden kann. Das wird zum Beispiel für Perl::Critic verwendet und man kann damit ein Syntaxhighlighting für Editoren bauen.

Die Webseite finde ich richtig gut, da man jetzt nicht überall PPI installieren muss, nur um das kurz zu demonstrieren.

In meinem Vortrag auf dem letzten Deutschen Perl-Workshop in Erlangen habe ich auch gezeigt, wie man mit PPI eigene Regeln für Perl::Critic baut: http://renee-baecker.de/talks/Perl_Critic_finish.pdf

Saturday, December 27, 2008

Mein Perl-Jahr 2008...

Für 2007 habe ich etwas gemacht, das ich auch für 2008 machen will: Ein Jahresrückblick.
Hier möchte ich kurz darstellen, was das Jahr 2008 in Sachen "Perl" so gebracht hat...

* 1. Februar: 1. Geburtstag von $foo

* 13.-15. Februar: Der 10. Deutsche Perl-Workshop findet in Erlangen statt. Aus Zeitmangel höre ich bei WsOrga auf. Ironischerweise beschließt Frankfurt.pm, den Perl-Workshop 2009 zu organisieren. Also bin ich doch wieder bei der Organisation dabei.

* April/Mai: brian d foy kommt nach Deutschland und ich bin einige Tage mit ihm in Deutschland unterwegs: Stuttgart.pm , Ruhr.pm, Frankfurt.pm und Kloster Eberbach.

* Juli: Ich bin jetzt hin und wieder bei e-tecture, um über verschiedene Perl-Sachen zu sprechen. Ich fühle mich dort wohl!

* Juli: Es gibt manchmal echt Zufälle... Da schreibe ich "mal schnell" ein Modul namens Sub::Called (danke an betterworld für die Bugreports) und am gleichen Tag überlegt sich ein anderer Programmierer auch ein Modul names Sub::Called zu schreiben. Da war ich wohl einfach ein paar Minuten schneller.

* Juli: Dank guter ICE-Verbindung war ich kurzfristig bei einem Treffen der Kölner Perlmongers, bei dem auch Nick Clark und Andrea waren

* August: Der Mietvertrag mit dem "Haus der Jugend" ist unterschrieben und somit steht fest wo der 11. Deutsche Perl-Workshop stattfinden wird.

* 13.-15. August 2008: YAPC::Europe 2008 in Kopenhagen. Super organisiert, sehr gute Vorträge, Larry Wall und Damian Conway mal wieder getroffen, aber leider zu wenig Zeit um mit "alten" Freunden zu reden.

* Oktober: Meine ersten Schritte mit wxWidgets und dem Perl-Binding wxPerl. Da ich mit einigen Perl/Tk-Sachen nicht so ganz glücklich bin, habe ich mich nach einem anderen GUI-Framework umgesehen. Mittlerweile sind daraus auch schon Module geworden.

* November 2008: Aufgrund der Finanzkrise, wird eines meiner Projekte gestrichen. Kurz nachdem ich aufgehört habe, wurde ich gefragt, ob ich in der gleichen Firma an der gleichen Codebasis nur an einem anderen Teil des Tools weiterarbeiten will. Da ich aber schon bei OTRS zugesagt habe, lehne ich ab.

* 15. Dezember 2008: Perl 5.8.9 wird veröffentlicht. Das ist die letzte "große" Version in der Perl 5.8.x-Reihe. Ab jetzt gibt es nur noch Security-Fixes. Aber Perl 5.10 ist sowieso besser und Anwender sollten umsteigen.

* 26. Dezember 2008: Ein kleines "Weihnachtsgeschenk" am letzten Weihnachtstag: Ich wurde als Grant Manager der Perl Foundation gewählt. Damit werde ich in Zukunft - mit ein paar anderen zusammen - Grants betreuen.

* Juni - Dezember: Die Organisation des 11. Deutschen Perl-Workshops nimmt einiges in Anspruch: Sponsoren müssen gesucht werden, ein Büchertisch soll auch vorhanden sein, Social-Event wird im "Zimt und Koriander" gebucht.

* das ganze Jahr über: Ich habe mich relativ viel mit alten Bugs in Perl beschäftigt. Dank den Perl 5 Porters komme ich immer besser mit den "Innereien" von Perl zurecht. Da ich bis zu diesem Jahr noch nicht allzuviel in den Quellen des Compilers gestöbert habe, war das relativ viel Arbeit.

Thursday, December 04, 2008

Einladung zum Entwicklergolf

Ich habe folgende Nachricht von Martin Seibert bekommen:

Im Weblog von //SEIBERT/MEDIA findet bis Ende Dezember ein Entwicklergolfturnier statt. Wir laden alle Programmierer herzlich ein, ihr Können und ihre Effizienz unter Beweis zu stellen.

Die Aufgabe: Programmiert in einer beliebigen Sprache einen ansehnlichen Weihnachtsbaum, der in ASCII ausgegeben wird. Es gilt: In der Kürze liegt die Würze und der schlankste Code gewinnt.
Unter den Teilnehmern verlosen wir einen nagelneuen iPod Shuffle.

Alles zum Turnier und Code-Beispiele unserer eigenen Entwickler findet Ihr im Blog-Artikel "Entwicklergolf bei //SEIBERT/MEDIA: Alle Programmierer sind eingeladen". Wir würden uns sehr über Eure Vorschläge freuen!

Zum Blog-Eintrag

Mit CGI.pm einen Parameter auf "undef" setzen.

Damit ich nicht immer wieder testen muss, wie man mit CGI.pm einen Parameter auf undef setzt, poste ich es schnell mal hier...

Weder $cgi->param( 'name', undef ) noch $cgi->param( -name => 'name', -value => undef ) funktioniert. Aber das hier:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;
use Data::Dumper;

my $cgi = CGI->new;

my %params = $cgi->Vars;

print Dumper \%params;

if( is_invalid( $params{name} ) ){
warn "ungueltig";
$cgi->param( -name => 'sid', -values => [] );
}

my %test = $cgi->Vars;
print Dumper \%test;

Monday, December 01, 2008

Adventskalender

Die Weihnachtszeit hat angefangen. Und was ist typisch für die Weihnachtszeit?

Weihnachtsmarkt, Glühwein, Nikolaus, Engel,... Und schon als Kind habe ich mich darauf gefreut - der Adventskalender. Jeden Tag ein Türchen öffnen und etwas Schönes dahinter finden - sehr aufregend.

Und auch Perl-Programmierer dürfen sich richtig freuen, denn es gibt zwei Adventskalender, die sehr interessant sind:

Erste wxPerl-Ergebnisse: App::Wx::PodEditor

Ich hatte ja letzt mal darüber geschrieben, dass ich mich an einen Einstieg in wxPerl wage. Jetzt habe ich die ersten Ergebnisse auf CPAN gestellt:


Ich habe schon mehrfach gehört, dass Dokumentation schreiben sehr lästig ist (ich mach es auch nicht besonders gern ;-) ) und dann muss man auch noch die ganzen Anweisungen lernen. Deshalb habe ich mit dem PodEditor angefangen. Wx::Perl::PodEditor ist ein RichText-Feld, in dem man den Text schreiben und dann ziemlich einfach formatieren kann. So muss man nicht wissen, wie in Pod die Anweisung für "Überschrift 1" heißt.

Das ganze ist natürlich noch in der Anfangsphase, aber vielleicht hat ja der eine oder andere Lust, sich das mal anzuschauen und mitzuhelfen.

Wednesday, November 26, 2008

8. Ausgabe von $foo ist da!

Nach langem Warten ist jetzt endlich $foo Nr. 8 (http://perl-magazin.de) aus der Druckerei gekommen. Die Abonnenten sollten also in den nächsten Tagen ihre Hefte mit der Post bekommen.

Die PDF-Version im Abonnentenbereich ist auch schon freigeschaltet.

Die Inhalte dieser Ausgabe:

# Perl::AI
# Kein SQL dank SQL::Abstract
# CPAN in der Hostentasche
# Logging mit Log::Log4perl
# Spezialklassen in Perl
# Typglobs
# XS - Perl mit C erweitern
# Perl 6 Tutorial - Teil 5
# Googles Summer of Code - und Perl war dabei
# Die unendlichen Tiefen von $_
# Aarau.pm
# CPAN-News

Themenvorschläge, allgemeines Feedback und neue Autoren sind jederzeit willkommen.

Thursday, November 20, 2008

Es werden noch Vorträge für den 11. Deutschen Perl-Workshop gesucht

Ich habe gestern folgende Mail bekommen:

Hallo Interessenten am Deutschen Perl-Workshop 2009!

Danke für eure Vortragsvorschläge. Wir sind noch dabei, weitere Vorschläge zu acquirieren, bisher haben wir knapp 30, wir wünschen uns allerdings noch ein paar mehr. Die Deadlines verschieben sich daher noch etwas und eine finale Auswahl müssen wir auch noch festlegen. Bitte habt noch etwas Geduld.

Sagt gerne auch weiter, dass wir noch suchen.

Danke.

Steffen Schwigon,
wsorga
Also immer her mit Vorschlägen!

Tuesday, November 11, 2008

Release Candidat 1 für Perl 5.8.9

Nicholas Clark, Pumpking für Perl 5.8, hat einen ersten Realease Kandaten für Perl 5.8.9 veröffentlicht. Es wäre schön, wenn möglichst viele den RC1 testen und die Ergebnisse an die Perl 5 Porters mailen würden

Thursday, November 06, 2008

Perl vs. PEAR

Dies wir nur ein ganz kurzer Blogeintrag...

Ich wollte heute bei einem Hoster ein Perl-Modul installiert bekommen. In die Mail schrieb ich als Betreff "Installation eines Perl-Moduls". Bei dem Hoster ist so etwas in der Regel sehr schnell erledigt. Auch heute hatte ich nach nur wenigen Minuten eine Antwort: "Modul wurde installiert".

Ging ja wieder richtig schnell. Dann wollte ich das Module einbinden, aber was war das?? "Can't locate Modulname.pm in @INC". Die Pfade in @INC schienen in Ordnung zu sein. Also wieder Mail an den Hoster mit Fehlermeldung.

Dann bekam ich die Antwort: "Das ganze wurde als PEAR Modul installiert. Jetzt wurde auch das Perl-Modul installiert".

Mmhhh. Was hat Perl mit PEAR zu tun?? Ich sollte noch viel mehr "Werbung" für Perl machen, damit wieder jeder Bescheid weiß wenn ich mal wieder ein Perl-Modul brauche...

Tuesday, October 07, 2008

Schwieriger Start mit wxPerl (PPM)

Ich bin gerade dabei, mich in wxPerl einzuarbeiten. Ich habe zwei, drei Sachen in der Hinterhand, die mit einer GUI versehen werden sollen. Perl/Tk sieht teilweise etwas veraltet aus und so ist es gekommen, dass ich mit wxPerl beschäftige.

wxPerl ist das Perl-Binding zu wxWidgets, einer Cross-Plattform GUI-Library. Da mein Standard-Editor - kephra - mit wxPerl arbeitet, habe ich auch einiges an Beispielcode.

Ich habe mir vor längerer Zeit mal wxPerl installiert. Jetzt habe ich festgestellt, dass es seitdem doch einige wichtige Änderungen gegeben hat. Da ich unter Windows arbeite und mit ActivePerl entwickle, dachte ich "kein Problem, machst Du ganz schnell mit PPM ein Upgrade". Naja, extra das wxPerl-Repository eingefügt und los gings... Installation klappt. Test auf der Kommandozeile... Fehler! Irgendwelche DLLs nicht gefunden. Pfad zu den DLLs zu der PATH-Umgebungsvariablen hinzugefügt.

Scheinbar funktioniert alles. Kontrolle der Version... Ähm, das ist aber nicht die neueste aus dem Repository. Komisch. Naja, dann lassen wir die PPM-GUI weg und machen das auf der Kommandozeile. Also dort

C:\>ppm install http://www.wxperl.co.uk/repository/Wx.ppd

eingetippt.

Wurde installiert. Kontrolle... Gleicher Fehler wie vorhin. Komisch, diese DLLs gibt es gar nicht. Und warum wurde das mit gcc kompiliert? ActivePerl ist mit Visual C++ kompiliert worden.

Im Internet gesucht und einen Hinweis darauf gefunden, dass das neueste Alien::wxWidgets installiert werden muss. Warum nur löst PPM diese Abhängigkeit nicht richtig auf? Naja, ein

C:\>ppm install http://www.wxperl.co.uk/repository/Alien-wxWidgets.ppd

hat dann geholfen. Jetzt kann ich richtig loslegen!

Tuesday, September 30, 2008

MySQL treibt mich zum Wahnsinn

Hier habe ich ja so schön geschrieben, dass der Wechsel von Datenbanksystemen mit DBI so schön einfach ist. In den letzten Tagen habe ich dann aber ein Problem gehabt, das mir rätselhaft erscheint und die Lösung des Problems ist nicht so toll.

Aber worum geht es? Ich benötige Informationen aus einer Datenbank - eine MySQL-Datenbank. So weit kein Problem. Mit dem mysql Client funktioniert alles einwandfrei. Dann möchte ich die Informationen in einem Skript verwenden. Ich habe also so wie immer

my $dbh = DBI->connect( "DBI:mysql:$db:$host", $user, $password ) or die $DBI::errstr;

geschrieben.

Bei der Ausführung des Skripts taucht dann aber ein Fehler auf:

DBD driver has not implemented the AutoCommit attribute

Komisch. Mit einer anderen Datenbank klappt alles und es ist ein und das selbe Skript. Also kann ich unterschiedliche DBI- oder DBD::mysql-Versionen ausschließen.

Mit AutoCommit habe ich hier direkt nichts zu tun. Also heißt es auf Spurensuche gehen. Was ist unterschiedlich bei den zwei Datenbanken...

* Unterschiedliche Hosts - ok, das ist eher nicht das Problem
* Datenbank, bei der es funktioniert hat der User alle Rechte, bei der es nicht funktioniert nur Leserechte
* Datenbank-Version, mit der es klappt ist eine 4.x, die andere eine 3.22.x

Nach drei Tagen Suche habe ich dann den entscheidenden Hinweis gefunden: Die Parameter bei connect müssen anders sein:

my $dbh = DBI->connect( "$db:$host", $user, $password, 'mysql' ) or die $DBI::errstr;

Da soll mal einer drauf kommen, dass man bei so veralteten MySQL-Versionen die Parameter umstellen muss.

Schade, dass ich keinen Einfluss auf die Versionen von MySQL habe, sonst hätte ich zu einem Upgrade geraten...

Thursday, September 18, 2008

11. Deutscher Perl-Workshop -> Call for Papers

Vom 25.02.2009 bis 27.02.2009 findet der 11. Deutsche Perl-Workshop im "Haus der Jugend" in Frankfurt statt. So ein Workshop steht und fällt mit den Vorträgen. Dabei sind alle Themen, die in irgendeiner Weise mit Perl oder dem Perl-Umfeld zu tun haben, als Vorträge für den Workshop interessant.

Du hast im Moment nur eine vage Idee für ein Thema? Kein Problem: uns interessieren im Prinzip alle Themen, die in irgendeiner Weise mit Perl zu tun haben. Frag' im Zweifelsfall einfach früh genug bei uns (wsorga@perl-workshop.de) nach. Wir helfen gerne dabei, ein vages Thema zu konkretisieren.

Es gibt verschiedene Längen von Vorträgen. Das geht von 5-Minuten-Lightning-Talks bis zu 40-Minuten-Langvorträgen. Auch 3 stündige Tutorials soll es geben.

Wenn Du einen Vorschlag für einen Vortrag hast, reiche ihn bitte bis spätestens Montag, den 27.10.2008 als Abstract über die Webseite des Perl-Workshops ein.

Thursday, August 14, 2008

YAPC::EU 2008 - Tag 1

Gestern war der erste Tag der YAPC::EU 2008. Nach der Begrüßung durch jonasbn wurde der Veranstaltungsort der YAPC::EU 2009 bekanntgegeben: Lissabon. Das ist dann auch auf jeden Fall eine Reise Wert.

José Castro hat seinen "Standard-Vortrag" gehalten. Allerdings ändert er die Geschichten in dem Vortrag immer passend zur Konferenzstadt und aktuellen Sachen. Dadurch wird es nie langweilig.

Vor der Kaffeepause gab es eine Keynote von Larry Wall. Für mich persönlich war es zu technisch und es war für mich einer der schlechteren Vorträge von Larry Wall. Von ihm mag ich eher die Nicht-technischen Vorträge.

Copenhagen.pm hat die YAPC wirklich sehr gut organisiert. Super Räume und gutes Essen. In der Kaffeepause gab es neben Kaffee und Kaffeestückchen auch andere Getränke und Obst.

Ich habe die Pause etwas verlängert, weil es keinen Vortrag gab, der mich interessiert hat. Ich habe dann lieber mal das WLAN getestet und meine Mails abgerufen.

Danach habe ich mir den Vortrag über "geheime" Perl-Operatoren von BooK angehört. Die meisten der Operatoren kannte ich, aber ein paar neue Operatoren gab es dann doch noch.

Weitere Vorträge, die ich gestern gehört habe: "Perl Logging Practices" von Mike Fragassi, "From XML Schema to Application" von Mark Overmeer.

Ein weiterer Super-Vortrag war "‎Nothing Can Possibly Go Wrong... Again" von Adam Kennedy.

Zum Tagesabschluss gab es noch 12 Lightning-Talks.

Abends ging es wieder in den Pub "The Globe", wo es eine "Vertical meter of beer"-Party gab: Adam Kennedy hat ein Modul geschrieben, von dem er behauptete, dass es nicht geladen werden kann und er hat einen Meter Bier für denjenige versprochen, der es als erster schafft, das Modul zu laden.

Jos Bousmans hat es geschafft und Adam hat seine "Schulden" eingelöst. Da Jos so viel Bier gar nicht alleine trinken kann, hat er es für die Allgemeinheit freigegeben... Als das gesponsorte Bier alle war, hat jeder wieder selbst bezahlt...