Monday, December 28, 2009

http://perlfragen.de/ - Deutschsprachige PerlFAQ

Unter http://perlfragen.de/ habe ich eine Übersetzung der perlfaq (http://faq.perl.org) bereitgestellt.

Oder besser gesagt, den Anfang davon. Da ich das nur so "nebenbei" mache und Übersetzungen sehr zeitaufwändig sind, bin ich damit noch nicht fertig. Ich arbeite aber regelmäßig daran. Hilfe ist natürlich willkommen ;-) Wer will, kann auf das Git-Repository zugreifen: http://github.com/reneeb/perlfaq_de

Ich werde mich bemühen, im ersten Quartal 2010 komplett mit der Übersetzung fertig zu sein.

Da sich viele Bereiche mehr auf englischsprachige Ressourcen (z.B. Bücher, Links,...) beziehen werde ich nach der Übersetzung anfangen, deutsche Ressource einzuarbeiten. Das wird allerdings nur in die Webseite einfließen und nicht in die Übersetzung, da diese möglichst nah am Original sein soll.

Sunday, December 27, 2009

Mein Perl-Jahr 2009

Wie schon in den beiden vergangen Jahren möchte ich hier kurz vor dem Jahreswechsel einen persönlichen Jahresrückblick in Sachen "Perl" geben:

Das Jahr 2009 fängt für mich mit einigem Stress an: Der 11. Deutsche Perl-Workshop steht vor der Tür und da Frankfurt.pm die Veranstaltung plant, gibt es etliches zu tun.

Vom 23.-25.02.2009 findet der Workshop dann statt. Wir bekommen viel positives Feedback und auch heise berichtet aus Frankfurt.

Ich selbst habe diesmal nur einen einzigen Vortrag gehalten. Vom Workshop habe ich aber nur sehr wenig mitbekommen, weil es sonst genug zu tun gab und ich fast die ganze Zeit am Empfang stand. Aber für viele Gespräche mit Teilnehmern blieb genug Zeit.

Im Februar habe ich auch meine ersten Aufgaben als Grant-Manager bekommen: Die Moose-Dokumentation von Dave Rolsky und einen Grant von Gabor Szabo betreuen.

Anfang Februar beginne ich meine Arbeit bei der OTRS AG, die alles mögliche rund um das Ticket-System OTRS anbietet. Zu Beginn bin ich zwei Monate in Straubing, danach arbeite ich von zu Hause aus.

Wer mich kennt, weiß, dass ich sehr viel auf Perl-Community.de unterwegs bin. Im März stellen wir auf die Software battie um, die von Tina programmiert wurde.

Im Mai kommt dann überraschend eine Anfrage von O'Reilly, ob ich nicht Lust hätte, ein paar Beiträge für deren Blog zu schreiben. Dem stimme ich natürlich zu. Mittlerweile gibt es vier Beträge ("Who is who", "Modern Perl", "TOP 100", "Spielen mit Perl") von mir und in "größeren" Abständen werden wohl noch weitere hinzukommen....

Anfang August verbringe ich über eine Woche in Lissabon: Die diesjährige YAPC::Europe steht an. Hier treffe ich wieder jede Menge alter Bekannte und etliche neue Leute. Es macht immer wieder Spaß, auf Perl-Workshops/-Konferenzen zu fahren. Viele nette Leute, fremde Gegenden, sehr gute Vorträge,...

Im August war ich auch noch auf einer anderen Konferenz: Die FrOSCon findet in St. Augustin statt. Und in diesem Jahr gab es erstmals einen Perl-Entwicklerraum. Der Platz hat sogar teilweise nicht ausgereicht. Nach dem Erfolg werden wir das wohl im nächsten Jahr wiederholen (wenn es nicht gerade mit der YAPC::EU zusammenfällt).

Vielen Dank auch an meine Mitstreiter Thomas Fahle und Rolf Schaufelberger.

Im August wird auch Perl 5.10.1 veröffentlicht. Das enthält etliche Bugfixes und ist stabiler als Perl 5.10.0.

Gernot Havranek fragt an, ob ich für ein Interview für die Perl-Zeitung zur Verfügung stehen würde. Die Perl-Zeitung ist eine Zeitschrift, die sich an Perl-Einsteiger richtet. Das Interview wird in der Januar 2010-Ausgabe erscheinen.

Auch im Oktober war jede Menge los: Perl 5.11.0 und Perl 5.11.1 erscheinen. Perl 5.11.x ist der Entwicklungszweig von Perl, der in der stabilen Version 5.12 enden wird. Bei Perl ist es so, dass alle ungeraden Unterversionen (5.7, 5.9, 5.11) Entwicklerversionen sind und die geraden Unterversionen (5.6, 5.8, 5.10, 5.12) sind stabil.

Während den Entwicklerversionen werden neue Features eingebaut, was bei stabilen Versionen nicht passiert.

Im Oktober stelle ich einen Teil meiner Entwicklungen von SVN auf Github um. Damit wird es für andere einfacher, Module oder andere Sachen von mir zu patchen ;-) oder auf dem aktuellen Stand zu bleiben.

Auch im Oktober gibt es einen Workshop, an dem ich teilnehme. Diesmal wirklich nur als Teilnehmer und nicht als Organisator. Alexander Demmler hat einen interessanten wxPerl-Workshop im Altmühltal organisiert. Danke! Ein Teil meines Erlernten fließt in Kephra ein, einen anderen Teil stelle ich in der nächsten Ausgabe von $foo - Perl-Magazin vor.

Bei der TPF gibt es seit Oktober ein neues Komitee - das Marketing Komitee. Dieses soll die Außendarstellung von Perl verbessern und z.B. die Präsenz von Perl-Projekten und/oder der TPF auf verschiedenen Konferenzen und Messen organisieren. Gabor Szabo und ich haben da schon einiges im Auge, aber wir brauchen noch etliche Helfer.

Als erste Veranstaltungen, bei denen es einen TPF-Stand gibt, sind die FOSDEM 2010 (6./7. Februar in Brüssel) und die CeBIT 2010 (2.-6. März 2010 in Hannover).

Mitte November gab mein altes Laptop den Geist auf - auf dem neuen installiere ich dann gleich mal StrawberryPerl. Damit habe ich mehr Chancen "exotische" Perl-Module installiert zu bekommen, weil es mit Compiler etc. kommt.

Ende November gab es dann den 5. Frankfurt Perl-Community Workshop. Leider konnte ich in diesem Jahr nur an einem Tag dabei sein. Aber auch der hat sich wieder gelohnt.

Und kurz vor Jahresende, habe ich noch weitere Sachen gemacht: Unter Perlfragen.de gibt es jetzt eine deutsche Übersetzung der perlfaq. Das ist zwar noch nicht komplett, weil die Übersetzungsarbeit sehr aufwändig ist, aber das wird sich nach und nach bessern.

Und der Webauftritt von $foo - Perl-Magazin wurde überarbeitet. Sowohl vom Layout als auch Teile der Codebasis wurden verändert. Apropos $foo - Perl-Magazin: Natürlich gab es auch in diesem Jahr wieder vier neue Ausgaben. Ich möchte mich an dieser Stelle bei allen Lesern und Autoren für ein tolles Jahr 2009 bedanken.

In diesem Jahr haben wir auch erstmals Weihnachtspakete (noch bis zum 03.01.2010 aktiv) geschnürt...

Ich wünsche allen Lesern meines Blogs einen guten Rutsch ins neue Jahr - das sicherlich wieder viele spannende Tage (nicht nur in Sachen Perl) bereithalten wird.

- Renée

Wednesday, December 23, 2009

Perl@CeBIT 2010

Vielleicht haben es einige schon gelesen: Die Perl Foundation wird auf der CeBIT 2010 mit einem Stand in der "Open Source Project Lounge" (Halle 2) vertreten sein.

Das Ganze wird von Gábor Szabó organisiert. So langsam reifen auch die Ideen, wie wir Perl dort repräsentieren können.

Hilfe und Ideen sind aber jederzeit willkommen.

Thursday, December 10, 2009

vierter Blog-Beitrag bei O'Reilly

Nach längerer Pause ist mein vierter Blog-Beitrag bei O'Reilly online gegangen. Diesmal habe ich damit beschäftigt, wie man automatisiert spielen kann. Ich liebe es, Dinge zu automatisieren. Da ich - wie vielen wahrscheinlich bekannt ist - fast ausschließlich unter Windows unterwegs bin, benutze ich Win32::GuiTest. Das ich damit nicht nur automatisiert spiele, sondern auch mal bei einer YAPC::EU automatisiert live die Slides meines Lightning-Talks erstellt habe, zeigt dieses Video: http://videos.grango.org/2007/2007-yapceu-lt-renee-guitest.mpg

Die ersten Ideen für den nächsten Beitrag sind schon da, mal sehen wann ich dazu komme, es umzusetzen. Man darf gespannt sein ;-)

Tuesday, December 01, 2009

Weihnachtszeit II: Weihnachtspakete von $foo

Was gibt es schöneres, als bei kaltem, schmuddeligem Wetter auf der Couch zu liegen und etwas gutes zu lesen?

Deswegen haben wir bei $foo drei Pakete geschnürt, die die Winterabende verkürzen sollen: Jeden Jahrgang für jeweils nur 18 EUR.

Das ist doch eine sehr gute Gelegenheit, endlich mal die früheren Ausgaben zu bestellen.

Wir wünschen den Lesern von $foo eine ruhige und besinnliche Weihnachtszeit.

Weihnachtszeit: Adventskalender für Perl

Es ist wieder soweit. Wie jedes Jahr gibt es auch in diesem Jahr Adventskalender für Perl-Programmierer:

Viel Spaß!

Monday, November 30, 2009

Frankfurter Perl-Community Workshop 2009

Am gerade vergangenen Wochenende (28./29.11.2009) gab es den jährlichen Frankfurter Perl-Community Workshop. Da ich die Nacht vom 28. auf 29. auf einem Einsatz verbracht habe, war ich nur Samstags da. Vielleicht berichtet ja einer der anderen Teilnehmer vom Sonntag...

Am Samstag haben wir um kurz nach 10 Uhr angefangen. Wir haben im Club Voltaire erstmal gemütlich aufgebaut und unsere Verpflegungsvorräte aufgebaut ;-) Max hat den Anfang mit den Vorträgen gemacht. Er hat als erstes über sein neuestes Modul "WWW::Mechanize::FireFox" berichtet. Damit kann man über Perl den Firefox fernsteuern und dank "MozRepl" (bzw. "MozRepl::RemoteObject") alles Mögliche aus JavaScript nutzen (mit bekannter Perl-Syntax).

Auch den zweiten Vortrag hat Max gehalten: Über das JavaScript-Framework jQuery, das ich auch sehr gerne einsetze. Anhand einer einfachen CGI-Anwendung hat Max gezeigt, wie man so eine einfache Anwendung "AJAXifizieren" kann.

Den Web 2.0-Bereich hat dann noch Roland ausgebaut, indem er gezeigt hat, wie man Tests für Webseiten auch für Laien organisiert bekommt: Testfälle in OpenOffice Calc organisieren und beschreiben, das mit Perl auslesen und daraus Selenium-Tests generieren. Ein nicht uninteressanter Ansatz, wenn Nicht-Programmierer Webseiten testen sollen.

Im Anschluss hat Erkan kurz von seinen Erfahrungen mit Memcached und das entsprechende Perl-Modul Cache::Memcached berichtet. Damit lassen sich viele Daten cachen und so z.B. die Anzahl der Datenbank-Zugriffe stark reduzieren. Gerade bei größeren Webanwendungen spielt Caching eine große Rolle.

Den längsten Vortrag hat dan Harald über "Natural Language Processing" gehalten. Da wurde vieles an Beispielen mit dem NLTK-Paket gezeigt... Ich fand das einen spannenden Vortrag, weil das ein Gebiet ist, mit dem ich mich noch gar nicht auseinandergesetzt habe.

Bevor ich gehen musste, habe ich dann angeregt, dass sich Frankfurt.pm ja um die Ausrichtung der YAPC::EU 2011 bewerben könnte. Wir werden uns dann im neuen Jahr entscheiden...

Monday, November 23, 2009

12. Deutscher Perl-Workshop

12. Deutscher Perl-Workshop in Schorndorf vom 07.-09. Juni 2010 in der Barbara-Künkelin-Halle

Der Deutsche Perl-Workshop ist die jährliche Konferenz deutschsprachiger Anwender und Entwickler der dynamischen Open-Source-Programmiersprache Perl.

Der Schwerpunkt des von der Deutscher Perl-Workshop GbR und Wirtschaftsförderung Stuttgart (WRS) verstaltelten Workshops ist "Modern Perl". Dabei spielen Module Catalyst, Moose und DBIx::Class eine wichtige Rolle. Catalyst als sehr flexibles Webframework, Moose mit einer neuartigen Objektorientierung für Perl und DBIx::Class als Schicht zwischen Anwendung und Datenbanken.

Call for Papers

Unser Workshop steht und fällt mit den Vorträgen, die 5, 20 oder 40 Minuten lang sein können.
Alle Themen, die mit Perl oder dem Perl-Umfeld zu tun haben, können als Vorträge für den Workshop interessant sein. Vorschläge müssen bis spätestens Montag, den 08.02.2010 als Abstract eingereicht werden. Er sollte in rund 2000 Zeichen das Thema beschreiben.

Die Vortragsvorschläge können über die Webseite (http://conferences.yapceurope.org/gpw2010) eingereicht werden.

Sponsoren

Der Workshop bedeutet neben enormem zeitlichen auch hohen finanziellen Aufwand. Deshalb benötigen wir Unterstützung von Sponsoren, z.B. bei der Ausrichtung der Abendveranstaltung.

Preise

Wie in den Jahren zuvor sind die Preise für die Teilnahme niedrig: Für Studenten liegt der Beitrag bei 50 €, für Privatpersonen bei 75 € und für Firmenteilnehmer bei 250 € für dem gesamten Workshop.

Mehr Informationen

Webseite des Perl-Workshops: http://www.perl-workshop.de
Twitter: http://twitter.com/perlworkshop

Tuesday, November 10, 2009

Umstieg auf Strawberry Perl

Nachdem mein alter Laptop nicht mehr so wollte, wie ich es gerne hätte, musste ein neuer Laptop her. Dadurch komme ich auch in den Genuss von Windows 7. Das "Blöde" bei einem neuem System ist, dass man sich erstmal alles wieder installieren muss.

Das habe ich genutzt, um von ActivePerl auf StrawberryPerl umzusteigen. StrawberryPerl hat zwar durchaus Macken - z.B. gibt es da Probleme im Zusammenspiel mit mod_perl - aber damit kann ich leben. Denn dort wo StrawberryPerl Macken hat, kommen meine Virtuellen Maschinen mit Ubuntu ins Spiel...

Ansonsten ist es äußerst angenehm, dass man nicht mehr in sämtlichen Repositories suchen muss, um die passenden PPM-Pakete zu finden.

StrawberryPerl++

Friday, November 06, 2009

Einfaches Skript, um XML gegen DTD zu prüfen

Weil es in letzter Zeit vermehr nachgefragt wurde: Ein kleines Perl-Programm, mit dem man eine XML-Datei gegen eine (externe) DTD prüfen kann:

#!/usr/bin/perl

use strict;
use warnings;
use XML::LibXML;

my $dtd_file = $ARGV[1];
my $xml_file = $ARGV[0];

my $schema = XML::LibXML::Dtd->new( "", $dtd_file );
my $parser = XML::LibXML->new;
$parser->keep_blanks(0);

my $tree = $parser->parse_file( $xml_file );
eval{
$tree->validate( $schema );
1;
} or die "Can't validate $xml_file: $@";

print "alles ok!"


Dann ruft man es einfach mit perl skript.pl test.xml test.dtd auf.

Perl und XML ist auch Thema in der aktuellen Ausgabe des Perl-Magazins $foo.

Thursday, October 29, 2009

12. Ausgabe von $foo

Ab heute ist die neue Ausgabe des Perl-Magazins "$foo" (http://perl-magazin.de/) erhältlich. Wie immer können Einzelhefte und/oder Abonnements auf der Webseite bestellt werden.

Inhalt dieser Ausgabe:

* Methoden-Signaturen

Java-Programmierer kennen sie von Anfang an und auch immer Perl-Programmierer wollen sie - die Signaturen bei Methoden.

Dieser Artikel zeigt, wie man auch in seinen Perl-Programmen darauf nicht zu verzichten braucht.

* Modern Art des Profilens

In Ausgabe 3 von $foo hat Mike Schilli schon einen kurzen Artikel über das Profilen von Perl-Code geschrieben.

Den für Optimierungen muss man erstmal wissen, wo man optimieren sollte.

Damals wurden die Module Devel::DProf und Devel::SmallProf kurz angerissen. Mittlerweile gibt es aber einen neuen und besseren Profiler. In diesem Artikel wird Devel::NYTProf vorgestellt.

* Elchtest (Moose)

Rolf Schaufelberger zeigt an Hand eines Beispiels aus der Praxis, wie "Rollen" bei Moose eingesetzt werden. So bekommen Objekte mit nur wenig Code ein ganz neues Verhalten.

* Perl und XML

Gerade als "Schnittstellensprache" wird XML sehr häufig eingesetzt. Und für Perl gibt es etliche Module, um mit XML umzugehen. Der Artikel geht auf drei der Module näher ein und zeigt Vor- und Nachteile der jeweiligen Module.

* DPath ist nicht XPath!

Welche Daten liegen tief in einer Datenstruktur? Muss ich wirklich mit einer Menge Schleifen und Abfragen arbeiten, nur um an die gewünschte Information zu kommen? Steffen Schwigon zeigt in seinem Artikel, wie man mit einer XPath-ähnlichen Abfragesprache Informationen aus Datenstrukturen in Perl bekommt.

* Neue Syntax dank Devel::Declare

Perl kennt kein 'class' und kein 'method' als Schlüsselwort. Was, wenn ich das haben möchte? Mit Devel::Declare können neue Schlüsselworte in die Perl-Syntax eingebracht werden und dieser Artikel zeigt, wie das geht.

* WxPerl-Tutorial (Teil 1)

Viele Computernutzer kennen sich nicht mit Konsolen oder Eingabeaufforderung aus. Schreibt man für sie ein Programm, sollte es eine GUI haben. Herbert Breunung stellt in einem mehrteiligen Tutorial das Framework WxPerl vor.

* Perl Scopes Tutorial - Teil 2

Wann ist eine Variable gültig, wann ist sie sichtbar? Gültigkeitsbereiche sind nicht immer ein leichtes Thema.

Im zweiten Teil des Perl Scopes Tutorials von Ferry Bolhár-Nordenkampf geht es um persistente lexikalische Variablen, lexikalische Variablen in verschachtelten Funktionen und vieles mehr.

* Renzension "Automating System Administration with Perl"

Thomas Fahle hat dieses Buch für uns gelesen. Lesen Sie seine Meinung dazu...

* und vieles mehr...

* Neues vom CPAN
* "Merkwürdigkeiten"
* Neues von TPF
* Win32 Tipps und Tricks

Saturday, October 24, 2009

CPAN-Module auf Github

Ich habe gerade angefangen, meine CPAN-Module auf Github zu stellen. Warum ich das mache? Zum einen, weil der Code für jeden zugänglich sein sollte, jeder relativ einfach damit rumexperimentieren sollte und weil ich mich endlich mal etwas ausführlicher mit Git beschäftigen möchte als ich es bisher getan habe.

Außerdem kann ich so mein eigenes SVN Repository entlasten ;-)

Den Anfang habe ich mit dem Modul Sub::Called gemacht...

Tuesday, October 20, 2009

Marketing Kommitee der Perl-Foundation

Curtis 'Ovid' Poe hat heute im Blog der Perl-Foundation das Marketing Kommitee angekündigt/vorgestellt. Dieses Kommitee soll sich um einige Dinge in Sachen Marketing kümmern:
1. Blog der TPF
2. Design der Webseite
3. Marktforschung
4. Pressemitteilungen
5. News-Artiekl
6. Social networking
Vorsitzender ist Dan Magnuszewski.

Allerdings fehlt meiner Meinung nach etwas in dieser Liste:
Konferenzen
Denn auf Konferenzen wie die OSCON oder FOSDEM können sich Perl und auch Perl-Projekte darstellen und so auch anderen Leuten zeigen, dass Perl eine geniale Sprache ist.

Ich finde das eine ziemlich gute Sache, da Perl in diesem Bereich einiges den anderen Programmiersprachen hinterher hinkt. Schon auf der diesjährigen YAPC::Europe gab es einen Marketing BOF, bei dem einiges besprochen wurde.

Ich bin gespannt, was dieses Kommitee so alles auf die Beine stellt. Ich freue mich schon drauf.

Sunday, October 11, 2009

WxPerl-Workshop im Altmühltal

An diesem Wochenende fand im Altmühltal ein kleiner WxPerl-Workshop statt. Dazu haben sich 11 Teilnehmer getroffen, die etwas über WxPerl lernen wollten. Am Samstag ging es um kurz nach 9 Uhr mit dem Workshop los und an Hand von Code-Beispielen und vielen Erläuterungen begann der Einstieg in die Welt der Plattformunabhängigen GUI-Programmierung.

Im Laufe des Tages stellte sich dann heraus, dass nicht alles ganz so plattformunabhänig ist. So wollten die Macs die Buttons partout nicht in der Höhe verändern - trotz wxEXPAND bzw wxGROW. (Das ist eigentlich dazu da, dass Elemente den ganzen Platz einnehmen, der noch "frei" ist)

Ich habe viel über WxPerl kennengelernt. Wofür ich das brauche? Ich schreibe ein paar kleine private Tools und ich möchte mir Kephra und Padre selbst etwas angenehmer machen. Und ich habe schon damit angefangen. Durch eine kleine Diskussion angestachelt, habe ich schnell ein Skript geschrieben, das in Kephra ganz schnell ein "use Wx ':everything'" durch ein "use Wx qw(wx...)" ersetzt. Das spart Arbeitsspeicher.

In dieser Diskussion wurde auch der Begriff "schwäbisch programmieren" geprägt - bei dem man sparsam mit Arbeitsspeicher umgeht ;-)

Durch das oben genannte Skript werden eben nicht mehr alle Konstanten aus Wx importiert, sondern nur noch die benutzten Konstanten. Das ist noch nicht ganz ausgereift, weil es erstmal nur die Konstanten findet, die mit "wx" anfangen, aber das ist schnell erweitert.

Der Code sieht wie folgt aus:

Auch dieses Bild wurde dank des Workshops auf Knopfdruck aus Kephra heraus erzeugt. Ich hatte endlich Zeit, mein kleines Skript zum "Bild aus Code" generieren in ein Modul umzuwandeln (das ich nächste Woche auf CPAN stellen werde) und auch eine entsprechende Erweiterung für Kephra zu programmieren. Es hat noch zwei, drei kleinere "Macken" und eine ansprechende Konfiguration fehlt noch, aber es ist ein Anfang.

Außerdem hatte ich endlich Zeit, mich mehr mit Kephra auseinanderzusetzen, so dass ich bald noch weitere Erweiterungen machen kann, die mir das Leben einfacher machen - z.B. bei meiner Arbeit bei OTRS. Darüber werde ich dann aber zu gegebener Zeit berichten.

Vielen Dank an Alexander Demmler für die Organisation des Workshops.

Es sind schon Ideen für weitere solcher kleinen Workshops aufgekommen. Workshops in dieser Größenordnung sind sehr gut geeignet, um die Teilnehmer ganz gut kennenzulernen und intensiv in das Thema einzusteigen.

Ich empfand die Teilnehmerrunde als sehr angenehm und das Wochenende war sehr lehrreich. Da haben sich auch die über 2 Stunden Stau bei der Anreise gelohnt.

Auch auf anderem Gebiet war das Wochenende lohnend für mich. Alexander Demmler kennt sich gut im Bereich Druck, Druckvorstufen, Druckvorbereitung aus und da ich ja das Perl-Magazin "$foo" herausbringe, wurden ein paar Tipps ausgetauscht.

Thursday, October 08, 2009

Das Kreuz mit XML::Simple

Im Perl-Forum gab es gerade mal wieder einen Post zu XML::Simple. Der Fragesteller wollte wissen, wie man nach einer Änderung der XML-Daten auf die Inhalte zugreifen kann. Ursprünglich sah es so aus:

<root><receive>
<audiorate>##Network.Advanced.Receive.AudioRate##</audiorate>
<videorate>##Network.Advanced.Receive.VideoRate##</videorate>
</receive>
</root>


Da kann man mit

use XML::Simple;
# ...
my $doc = XMLin( $xml );
print $doc->{receive}->{audiorate};


bequem auf Inhalte zugreifen.

Jetzt hat sich aber wie gesagt das XML geändert:

<root>
<receive item="1">
<audiorate item="1">##Network.Advanced.Receive.AudioRate##</audiorate>
<videorate item="1">##Network.Advanced.Receive.VideoRate##</videorate>
</receive>
<receive item="2">
<audiorate item="2">##Network.Advanced.Receive.AudioRate##</audiorate>
<videorate item="2">##Network.Advanced.Receive.VideoRate##</videorate>
</receive>
</root>


Und schon funktioniert der Code nicht mehr. Ein Riesennachteil an XML::Simple ist, dass man bei Änderungen am XML auch den Code ändern muss.

Bei dem geänderten XML kann man dann so auf die Inhalte zugreifen:

for my $rx_val ( @{$doc->{receive}} ) {
print $rx_val->{audiorate}->{content};
}


Generell empfiehlt es sich, sich die Datenstruktur mal genauer anzuschauen.

#!/usr/bin/perl

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml = do { local $/; <data> };
my $doc = XMLin( $xml );

print Dumper $doc;

__DATA__
<root>
<receive item="1">
<audiorate item="1">##Network.Advanced.Receive.AudioRate##</audiorate>
<videorate item="1">##Network.Advanced.Receive.VideoRate##</videorate>
</receive>
<receive item="2">
<audiorate item="2">##Network.Advanced.Receive.AudioRate##</audiorate>
<videorate item="2">##Network.Advanced.Receive.VideoRate##</videorate>
</receive>
</root>


Ich benutze (fast) nur noch XML::LibXML.

Übrigens ist "Perl und XML" ein Thema in der nächsten Ausgabe des Perl-Magazins "$foo", die am 01. November erscheint.

Saturday, October 03, 2009

Perl: Alive and Kicking and Stronger than ever!

Die Perl-Entwicklung ist aktiver als je zuvor: Jesse Vincent hat eine neue Entwickler-Version von Perl 5 veröffentlicht. Damit wird interessierten Perl-Programmierern schon ein Einblick in das gegeben, was die Version Perl 5.12 werden wird.

Es hat sich einiges getan, darunter auch das implizite aktivieren von use strict bei der Verwendung von "use 5.11" - was auch alle anderen neuen Features von Perl 5.11 aktiviert.

Eine Auflistung von Änderungen ist unter http://search.cpan.org/~jesse/perl-5.11.0/pod/perl5110delta.pod zu finden.

Gleichzeitig ändert sich auch der Release-Prozess von Perl 5. In Zukunft wird es an jedem 20. eines Monats ein Perl 5.11.x-Release geben.

chromatic hatte schon vor längerem geschrieben, dass auch Perl 5 regelmäßige Releases haben sollte.

Thursday, October 01, 2009

Perl-Entwickler hoch im Kurs...

Als Perl-Entwickler/in hat man wohl ziemlich gute Chancen auf dem Arbeitsmarkt. In letzter Zeit finde ich wieder vermehrt Job-Angebote im Internet, die ich für das Perl-Communit.de-Forum sammele. Und bei Perl-Nachrichten.de werden auch immer mehr Angebote gepostet...

Und da sind auch Firmen wie XING oder Siemens Healthcare darunter...

Perl: Alive and Kicking and Stronger than ever!
Allen Unternehmen wünsche ich viel Erfolg bei der Suche, denn ich habe ja schon vor über zwei Jahren geschrieben, dass es gar nicht so einfach ist, (gute) Perl-Programmierer zu finden.

Sollten Unternehmen diesen Blog-Post lesen, dann hier noch ein paar Tipps, wo man Stellenangebote veröffentlichen kann:


Überall kostenlos und zumindest bei den beiden letzteren auch ohne Registrierung.

Und natürlich kann man auch Stellenanzeigen im Perl-Magazin "$foo" schalten ;-)

Vielleicht gibt es auch auf dem nächsten Deutschen Perl-Workshop wieder eine Job-Messe.

Tuesday, September 29, 2009

Daten Scheibchenweise...

Hier mal wieder ein Artikel aus einer früheren Ausgabe des Perl-Magazins "$foo":

Daten Scheibchenweise...

Ein nützliches Feature von Perl ist es, sogenannte "Slices" verwenden zu können. Wörtlich übersetzt heißt es "Scheiben". Diese "Scheiben" sind bei Listen/Arrays häufig gewünscht.

Slices im Alltag

Folgende Situation: Eine Person A war beim Arzt und benötigt Medikamente. A geht zur Apotheke X, um diese Sachen zu besorgen. X ist wie ein großes Array (1. Element: Nasenspray, 2. Element: Aspirin,...). A möchte natürlich nicht die ganze Apotheke (nicht das ganze Array) haben, sondern nur einzelne Sachen daraus. A hat jetzt zwei Möglichkeiten:

1. A sagt dem Apotheker ein Medikament, lässt den Apotheker das Medikament holen, nennt danach das nächste Element und so weiter bis A alle Sachen bekommen hat.

2. A gibt dem Apotheker eine Liste mit den Arzneinamen und lässt den Apotheker alle Medikamente holen. Der Apotheker kommt mit einem ganzen Korb voll mit den Arzneipäckchen.

Slices in Perl

So etwas kann ganz einfach in Perl nachgebildet werden, wie die Listings x-y zeigen.

# die Apotheke
my @apotheke = ('Nasenspray', 'Aspirin', 'Hustensaft', 'Allergietabletten');

# A benötigt folgende Medikamente
# hier sind aber die Arzneinamen schon
# durch den Index in der Apotheke ersetzt
my @rezept = (0,2);

# A gibt dem Apotheker und bekommt den Korb voll mit Medikamenten
my @korb = @apotheke[ @rezept ];

print $_,"\n" for @korb;

Beim Heraussuchen der Slices ( @apotheke[ @rezept ]; ) muss das "@" vor apotheke stehen, weil diese Operation eine Liste zurückliefert (im Gegensatz zu dem Zugriff auf einzelne Elemente - $apotheke[$index]).

Wichtig ist auch, dass die Elemente in der gleichen Reihenfolge zurückgeliefert werden, wie die Indexliste ist, in diesem Fall also "Nasenspray" und dann "Hustensaft". Wäre das Rezept anders herum ( my @rezept = (2,0) ), wäre zuerst der Hustensaft im Korb und dann das Nasenspray.

Hashslices

Analog zu den Arrayslices oben gibt es in Perl auch noch die Hashslices, die aber im Prinzip genauso funktionieren. Hier eine etwas andere Situation:

Ein Rechtsanwalt kommt in das Gerichtsarchiv und möchte die Unterlagen zu mehreren Fällen einsehen. Dazu hat er sich in seiner Kanzlei schon eine Liste mit Aktenzeichen angefertigt. Auch hier hat der Anwalt wieder die zwei Möglichkeiten, den Archivar einzeln losschicken oder dem Archivar einfach die Liste geben und der Archivar kommt mit einer ganzen Ladung an Aktenordnern zurück. Die erste Möglichkeit würden den Archivar wahrscheinlich ärgern, die zweite Möglichkeit ist aber optimal.

Das ganze in Perl:

my %archiv = (
az0815 => 'Akte zum Aktenzeichen 0815',
az2373 => 'Akte zum Aktenzeichen 2373',
az2371 => 'Akte zum Aktenzeichen 2371',
);

my @liste = qw(az0815 az2371);

my @akten = @archive{ @liste }

Slices als lvalue

Die Slices kann man nicht nur für das Auslesen von Daten verwenden, sondern auch für Zuweisungen. Soll zum Beispiel ein Hash verwendet werden, der später für eine reine Existenzüberprüfung dient, kann man das so machen:

my @keys = qw(key1 key2 key3);
my %hash;

@hash{ @keys } = (1) x scalar @keys;

Jetzt wird für jeden Schlüssel ein Eintrag im Hash erstellt. Jeder Schlüssel soll den Wert "1" erhalten. Deswegen muss eine Liste mit "1"en zugewiesen werden.

Ein häufiger Fehler, der gemacht wird, ist folgender:

@hash{ @keys } = 1;

Hier wird aber nicht für jeden Schlüssel ein "1" gespeichert, sondern nur für den ersten Schlüssel. Die restlichen Schlüssel erhalten den Wert "undef". Mit dem "(1) x scalar @keys" wird eine Liste erzeugt, die genauso lang ist wie die Liste der Schlüssel.

Analog funktioniert es für Arrayslices.

my @array = (1..10);
@array[2,4,6] = (99,98,97);

Hier werden in dem Array die Elemente mit den Indizes 2,4,6 durch die Zahlen in der zugewiesenen Liste ersetzt. $array[2] ist dann 99, $array[4] ist dann 98 und so weiter.

Wednesday, September 23, 2009

Weitere Hooks: Perl::Tidy und Mercurial

Als Reaktion auf meinen "Perl::Critic-Regeln durchsetzen"-Artikel hat Roland Schmitz ja schon den Hook für Mercurial als Kommentar gepostet. Vor ein paar Minuten hat er mir noch einen Hook geschickt, den er - ebenfalls mit Mercurial - einsetzt, um Perl::Tidy-Regeln einzufordern:


Und in der hgrc des Projekts dann das hier:
[hooks]
pretxncommit.msglen = test `hg tip --template {desc} | wc -c` -ge 10
pretxncommit.perl_critic = ~/bin/critic_check.pl
pretxncommit.perl_tidy = ~/bin/tidy_check.pl

Danke an Roland, dass ich das posten durfte.

Tuesday, September 22, 2009

Noch mehr zu "open"...

In meinem letzten Blog-Post bin ich ja schon auf verschiedene Sachen bezüglich der Perl-Funktion open eingegangen. Das bezog sich aber alles auf mögliche Probleme.

Mit dem heutigen Blog-Post möchte ich noch zwei Themen ganz kurz ansprechen, die open sehr mächtig machen:

I/O-Layer

Seit Perl 5.6.0 gibt es sogenannte I/O-Layer, mit denen man die Daten durch einen "Umwandler" schicken kann. Mit den I/O-Layern kann man z.B. sehr einfach Dateien in ISO-8859-1 sehr leicht in UTF-8 umwandeln:

open my $fh, '<:encoding(iso-8859-1)', $file or die $!;
open my $ofh, '>:encoding(utf-8)', $new_file or die $!;
print $ofh $_ while <$fh>;
close $ofh;
close $fh;

So etwas verwende ich teilweise in der Vorbereitung für neue Ausgaben vom Perl-Magazin.

In einigen alten Quellen wird als utf8-Layer auch einfach ":utf8" verwendet. Das kann aber Probleme machen, da die Daten nicht richtig (de-)kodiert werden, sondern einfach das UTF-8-Flag setzt.

Sollen alle Aufrufe von open mit einem bestimmten I/O-Layer verwendet werden, kann man auch das open-Pragma verwenden:

use open ":encoding(utf-8)";

Mit den Layern kann man aber nicht nur mit "Zeichensätzen" arbeiten, sondern auch die Daten z.B. gleich verschlüsseln wenn sie in die Datei geschrieben werden und beim Auslesen entschlüsseln. Dafür gibt es dann Module wie PerlIO::via::CBC

open mit Pipe

Wofür man "open" noch verwende kann, ist eine einfache Art und Weise, mit einem anderen Programm zu "kommunizieren". Wie man also Daten an andere Programme schicken kann, die diese auf STDIN erwarten. Oder Werte von dem Programm empfangen, die dieses auf STDOUT schreibt. Dazu kann man die Pipe verwenden.

So kann man z.B. einfach Daten an ein Programm schicken:

open my $fh, '| /ein/programm.exe' or die $!;
print $fh "Mein Name\n";
# programm.exe erwartet einen Namen auf STDIN
close $fh;

Siehe auch:

Wednesday, September 16, 2009

Verschiedenes zu "open"...

Der heutige Blog-Post ist Code geschuldet, den ich in letzter Zeit anschauen durfte. Dabei ist mir immer wieder die Verwendung von open aufgefallen. In der freien Wildbahn - und leider auch in einigen Perl-Tutorials im Internet - ist diese Form von open sehr häufig anzutreffen:

open( FH, $datei );

Diese Form hat aber ein paar Probleme:


Globale Filehandles

Globale Filehandles haben ein Problem: Sie sind global! In "Spaghetticode" ist das häufig kein Problem, aber sobald der Einstieg in Subroutinen da ist, wird es oft zum Problem. Gerade Perl-Einsteiger verwenden immer wieder den gleichen Namen für das Filehandle - auch weil in den Tutorials eigentlich durchgängig FH genommen wird.

Um das Problem mit globalen Filehandles zu verdeutlichen, nehmen wir den folgenden Code:


Hier wird eine Datei eingelesen, die verschiedene Dateinamen enthält, die auch wieder eingelesen werden sollen usw. In readFile() wird die Datei wie oben beschrieben geöffnet. Der Filehandle verweist auf die geöffnete Datei. Dann wird die erste Zeile eingelesen und diese Datei wird dann im nächsten Aufruf von readFile() geöffnet. FH ist jetzt ein Filehandle, das auf diese zweite Datei zeigt. Dann wird FH geschlossen und der Code geht zurück zum ersten Aufruf von readFile(). Perl soll jetzt die nächste Zeile auslesen. Mittlerweile ist FH aber geschlossen worden. Dadurch erscheint die Fehlermeldung

readline() on closed filehandle ...

In diesem Code-Beispiel ist der Fehler schnell ersichtlich, aber was ist wenn das Öffnen der Datei über den langen Code verteilt ist? Dann ist die Fehlersuche nicht wirklich ein Spaß.

Was lernen wir daraus? Lexikalische Filehandles nehmen:
open( my $fh, $datei );

Der Code ist immer noch nicht wirklich gut, also weiter...

Mehr zum Thema Lexikalische Filehandles gibt es auch im Wiki von Perl-Community.de.

Lesend? Schreibend?

Das nächste Problem beim ursprünglichen Code ist, dass Perl hier nicht explizit gesagt bekommt, ob die Datei lesend oder schreibend geöffnet werden soll. Perl impliziert hier, dass die Datei lesend geöffnet werden soll.

Dieser Code


gibt also einfach nur die erste Zeile aus test.txt aus. Soweit noch kein wirkliches Problem. Ein Problem wird das, wenn ein Benutzer nach einem Dateinamen gefragt wird und dann z.B. "> test.txt" eingibt, so dass sich das hier ergibt:


Das ausgeführt bringt die Fehlermeldung

Filehandle $fh opened only for output at ...

Was, wenn der Benutzer "> /etc/passwd" oder ähnliches eingibt? Darum sollte man immer explizit angeben, wie die Datei geöffnet wird.

open( my $fh, '<', $datei ); # lesend öffnen
open( my $fh, '>', $datei ); # schreibend öffnen

In Perls die älter als Version 5.6.0 sind, ist diese 3-Argumenten-Form nicht möglich. Dort sollte man das dann so schreiben:

open( my $fh, "< $datei" ); # lesend öffnen
open( my $fh, "> $datei" ); # schreibend öffnen

Die 3-Argumenten-Form hat aber noch einen weiteren Vorteil: Man kann Dateien mit führenden oder angehängten Leerzeichen im Namen öffnen. Die alte Form schneidet einfach alle Leerzeichen vor und hinter dem Dateinamen ab.

Fehlerbehandlung

Es sollte zum guten Ton in jedem Programm gehören, dass man Fehler abfängt. Der ursprüngliche Code hat das Problem, dass Perl einfach weitermacht, egal ob ein Problem auftaucht oder nicht. Was könnten hier Probleme sein? Die Datei könnte nicht existieren oder das Programm darf die Datei wegen fehlender Rechte nicht öffnen.

Ein einfacher Weg der Fehlerbehandlung ist ein einfaches "or die $!". In $! steckt die Fehlerbeschreibung (siehe auch perldoc perlvar).

Oder man kann das open in eine if-Bedingung stecken und dann im else-Teil (wenn ein Fehler auftritt) eine eigene Fehlerbehandlung machen - z.B. Logging der Fehler.

Eine einfache Methode, Fehler automatisch zu behandeln, ist die Verwendung von autodie. Wie das eingesetzt wird, wird in Ausgabe 9 vom Perl-Magazin $foo beschrieben.

Das open würde jetzt zum Schluss so aussehen:

open( my $fh, '<', $datei ) or die $!;

Friday, September 11, 2009

Perl::Critic-Regeln durchsetzen...

Auf der diesjährigen FrOSCon habe ich im Perl-Raum Perl::Critic vorgestellt. Dabei habe ich auch kurz gezeigt, wie man diese Regeln durchsetzen kann. Eine Möglichkeit ist, die Überprüfung gleich beim Einchecken von Code durchzuführen - wenn denn ein Versionsverwaltungstool verwendet wird.

Das ist natürlich dann die ganz strenge Variante, aber es ist eine gute Variante, wenn man sichergehen will. In diesem Blog-Post zeige ich kurz, wie man mit einem SVN-Hook den commit vermeiden kann, wenn der Code nicht den eigenen Regeln entspricht.

Das ganze habe ich für einen SVN-Server unter Windows gemacht, sollte aber analog auch auf anderen Umgebungen funktionieren. Dort muss man statt des Batch-Skripts halt ein Shell-Skript machen.

Das Batch-Skript wird als "pre-commit.bat" im "hooks"-Verzeichnis des SVN-Servers gespeichert und sieht so aus:

Das Batch-Skript ruft also ein Perl-Skript auf. In diesem Perl-Skript wird dann die eigentliche Überprüfung des Codes vorgenommen. Da es ein "pre-commit"-Hook ist, kann man den eigentlichen Commit verhindern.

Das Perl-Skript sieht wie folgt aus:

Und wenn der Code, der eingecheckt werden soll, nicht sauber ist, bekommt man einen Fehler:



Siehe auch:

Sunday, August 23, 2009

Perl@FrOSCon - Nachbetrachtung

Gestern war Perl erstmals mit einem eigenen Raum auf der FrOSCon vertreten. Da das für uns neu war, wussten wir selbst nicht so genau was uns erwarten würde.

Ich war schon relativ früh am Veranstaltungsort, weil ich noch ein paar Sachen - z.B. die Auslage von $foo - Perl-Magazin - aufbauen musste. Nach der Anmeldung und Registrierung als "Raumverantwortlicher" habe ich den Raum begutachtet. Wir waren relativ gut versteckt am Ende des "Projektganges".

Etwas später kam dann der erste meiner Mitstreiter: Thomas Fahle. Um 10.00 Uhr hat dann die Vortragsreihe begonnen. Ich habe mit einem Vortrag über DBIx::Class gehalten. Der war zwar nicht optimal - jedenfalls aus meiner Sicht, aber es war doch ok. Im Raum saßen ungefähr 15 - 20 Leute. Während dem Vortrag ist auch Rolf Schaufelberger eingetroffen, der dritte Vortragende bei "Perl@FrOSCon". Nach mir hat Thomas dann eine Einführung in WWW::Mechanize gegeben.

Danach gab es die Mittagspause. Als wir in der "VIP-Mensa" ankamen, war leider nicht mehr allzuviel da... Wir haben dann noch zusammengesessen und über alles mögliche gesprochen.

Nach der Mittagspause ging es dann mit meinem Vortrag über Perl::Critic weiter. Am Ende des Vortrags haben wir dann noch ein paar Bücher verlost: 3 x "Perl Best Practices", die uns freundlicherweise von O'Reilly zur Verfügung gestellt wurden und 2 x "Mastering Perl", die vom Perl-Magazin gesponsort wurden.

Danach hat Rolf das Zepter übernommen und vor seinen Vorträgen noch auf den nächsten Deutschen Perl-Workshop hingewiesen, der in Schorndorf (bei Stuttgart) stattfinden wird. Der Termin für den Perl-Workshop wird in den nächsten Wochen bekanntgegeben.

Rolf hat zuerst eine Einführung in Moose gegeben und anschließend über den Einsatz von Rollen in der Praxis berichtet.

Danach haben wir noch etwas aufgeräumt und zusammengepackt. Wir waren alle der Meinung, dass es so einen Raum im nächsten Jahr wieder geben sollte.

Vielen Dank auch an die Organisatoren der FrOSCon, die uns den Raum zur Verfügung gestellt haben und natürlich auch vielen Dank an die Zuhörer. Danke auch an Roland, der nach dem diesjährigen Perl-Workshop die Diskussion über Perl-Vorträge auf der FrOSCon gestartet hat...

Da der Raum teilweise "überfüllt" war (und die Zuhörer auf dem Boden sitzen mussten), wandern wir im nächsten Jahr vielleicht ein paar Meter weiter vorne ;-)

Und noch eine kurze Anmerkung:
Es wurde gefragt, ob die Slides der Vorträge vom Deutschen Perl-Workshop gesammelt werden. Die Links zu den diesjährigen Folien sind etwas versteckt im Wiki. Deshalb hier nochmal der Link zu der Wiki-Seite http://conferences.yapceurope.org/gpw2009/wiki?node=Slides

Friday, August 21, 2009

Perl@FrOSCon

An diesem Wochenende (22./23.08.2009) findet die FrOSCon in St. Augustin statt. Nach dem letzten Deutschen Perl-Workshop in Frankfurt gab es eine Diskussion darüber, ob man Perl-Vorträge nicht auch auf anderen Konferenzen halten sollte. Ich habe daraufhin die Organisatoren der FrOSCon angeschrieben, ob wir einen kleinen Raum für Perl-Vorträge bekommen könnten.

Der Vorschlag wurde angenommen und so habe ich ein paar Vorträge organisiert, die "modernes Perl" zeigen sollen:


Die Vorträge finden morgen (22.08.) statt.

Es wäre schön, wenn wir ein paar Teilnehmer in unserem Raum (C125) begrüßen könnten.

Wednesday, July 29, 2009

11. Ausgabe des Perl-Magazins "$foo"

Ab heute ist die neue Ausgabe des Perl-Magazins "$foo" (http://perl-magazin.de) erhältlich. Wie immer können Einzelhefte und/oder Abonnements auf der Webseite bestellt werden.

Ab sofort gibt es "$foo" auch im Buchhandel: Wir haben mit der Lehmanns Fachbuchhandlung in Berlin (Hardenbergstr. 5 - 10623 Berlin) eine Buchhandlung gefunden, die das Perl-Magazin in ihr Sortiment aufgenommen haben.

Aller Interessierten können sich das Perl-Magazin dort anschauen.

Die Inhalte der 11. Ausgabe:

* Vererbung in Perl

Ein wichtiges Thema bei der Objektorientierung ist "Vererbung". Dabei gibt es einiges zu beachten, auch weil es in Perl die Mehrfachvererbung gibt. Dieser Artikel gibt einige Hinweise, was es bei der Vererbung zu beachten gilt und wie die mehr aus der Vererbung holen kann.

* Perl Scopes Tutorial - Teil 1

Dieser Artikel von Ferry Bolhár-Nordenkampf beschäftigt sich mit Scopes. Das sind Bereiche innerhalb eines Programms, die sich durch Sichtbarkeit und Gültigkeitsdauer der in ihnen enthaltenen Objekte unterscheiden.

* Zuverlässige Objekte durch Restricted Hashes

Frank Seitz zeigt in seinem Artikel, wie bei Objekten - die einen Hash als fundamentale Datenstruktur benutzen - die erlaubten Attribute verbindlich festgelegt werden kann. Dadurch fallen Fehler beim Programmablauf auf, die sonst häufig erst sehr spät entdeckt werden - wenn überhaupt.

* Perl 6 Tutorial - Teil 8

Das ist der letzte Teil des Perl 6 Tutorials, das in der 3. Ausgabe von $foo gestartet wurde. Herbert Breunung zeigt in dieser Ausgabe Interna der Sprache und wie sie "befragt" und verändert werden. Er geht dabei auch auf die Frage ein, wozu die Meta-Programmierung benötigt wird.

* Perl 6 - Der Himmel für Programmierer

In regelmäßigen Abständen zeigt Herbert Breunung die Veränderungen und Neuerungen in der Perl 6 Welt. Dabei geht er auf aktuelle Projekte - wie dem November-Wiki - und einen Vergleich der unterschiedlichen Interpreter ein. Weiterhin gibt Breunung einen Ausblick auf die Zukunft.

* 112% DBIx::Class

Das ist der dritte Teil von "110% DBIx::Class". Wie in den beiden vorherigen Teilen wird auch in dieser Ausgabe gezeigt, wie man mehr aus seinem DBIx::Class-Einsatz holen kann und wie bestimmte Fragestellungen gelöst werden können.

* Erfahrungen mit Catalyst

Catalyst dürfte mittlerweile das meistverbreitetste Web-Framework in der Perl-Welt sein. Wolfgang Kinkeldei zeigt in seinem Artikel, welche Erfahrungen er beim Einsatz von Catalyst gemacht hat und zeigt dem Leser wie er mit verschiedenen Fragestellungen - wie z.B. Ajax mit Catalyst, cleverer Umgang mit Formularen,... - umgegangen ist.

* RES T-APIs in Perl-Anwendungen

Der Begriff "REST" taucht im Zusammenhang mit Web 2.0 immer wieder auf. "REST-APIs in Perl-Anwendungen" zeigt, was hinter dem Begriff steckt und wie man eine solche API in eigenen Perl-Anwendungen integrieren kann.

* App::Asciio - ASCII -Art mit Perl

"Ein Bild sagt mehr als 1000 Worte" heißt es so schön. In manchen Dokumentationen findet man auch bildliche Darstellungen, die die Funktionsweise von Modulen erläutern. Solche Darstellungen zu zeichnen ist zeitaufwändig.

Dieser Artikel stellt das Tool AsciiO vor, ein Perl-Programm, mit dem sich ASCII-Art erstellen lässt.

* Time::y2038

Thomas Fahle nimmt in seinem Artikel die Angst vor dem "schwarzen Dienstag" im Jahr 2038. Dabei zeigt er, wie das Perl-Modul Time::y2038 eingesetzt wird.

* und vieles mehr...

* Win32 Tipps & Tricks
* eval und $@
* CPAN-News
* Neues von TPF
* Termine
* Links

Monday, July 27, 2009

Perl-Meisterkurs 2009

Hier mal etwas Werbung für einen guten Bekannten:

Am 5. Oktober 2009 startet Freistil-Consulting einen weiteren Perl-Meisterkurs. Das 10-wöchige Online-Seminar wendet sich insbesondere an Einsteiger in die Programmiersprache.

Im Perl-Meisterkurs lernen Sie jeden wichtigen Aspekt der Perl-Programmierung kennen, begleitet von einem erfahren Perl-Entwickler und -Trainer. Die Lerninhalte sind umfangreich, aber in handhabbare Abschnitte aufgeteilt.

Wenn Sie den Perl-Meisterkurs absolviert haben, werden Sie in der Lage sein,

  • mit Daten und Variablen zu arbeiten,
  • den Ablauf des Programms durch Bedingungen und Schleifen zu steuern,
  • die Datentypen “Array” und “Hash” einsetzen,
  • Referenzen zu verstehen und zu nutzen,
  • Software durch Unterprogramme und Funktionen wiederzuverwenden,
  • Ihre Programme in Pakete und Module zu strukturieren,
  • mit regulären Ausdrücke Textdaten zu verarbeiten und
  • durch Objektorientierte Programmierung Daten und Logik zu vereinigen.

Für den Kurs kommt eine leistungsfähige Web-Schulungsplattform zum Einsatz, auf der Sie sich mit dem Trainer und den anderen Teilnehmern austauschen. Die Geschwindigkeit, in der Sie sich die einzelnen Themen erschließen, bestimmen Sie selbst. So können Sie Ihr Lerntempo immer an die Ihnen zur Verfügung stehende Zeit anpassen.

Die Kursgebühr für 10 Wochen Seminar inkl. Kursunterlagen beträgt regulär 299,00 € [1]. Frühbucher, die sich vor dem 1. September anmelden, zahlen nur 269,00 € [1]!

Ein besonderes Dankeschön erhalten Sie, wenn Sie den Kurs weiterempfehlen: Wenn Sie einen Kollegen oder Bekannten zum Perl-Meisterkurs mitbringen, schenken wir Ihnen beiden 10% der Kursgebühr!

Noch mehr Informationen zum Perl-Meisterkurs finden Sie auf http://www.freistil-consulting.de/onlinetraining/perl-meisterkurs.

[1] Alle Preisangaben inkl. 19% MwSt.

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.