Thursday, November 08, 2012

Der Winter kann kommen - die Winterausgabe des Perl-Magazins ist da

Inhalt der  Winter-Ausgabe:

 * Subroutinen Prototypen

   Viele Perl-Programmierer verwenden Subroutinen-Prototypen ohne dass sie verstehen wofür diese Prototypen da sind.

Doch was sagen diese Prototypen aus? In anderen Sprachen werden solche Prototypen/Signaturen dafür verwendet, um herauszufinden welche Subroutine aufgerufen wird (falls mehrere Subroutinen mit dem gleichen Namen existieren) und die weitergegebenen Parameter zu prüfen. 

Dieser Artikel zeigt, wofür man in Perl die Subroutinen-Prototypen verwenden kann und wo Fallen lauern.

 * Compile- vs. Runtime

   #!/usr/bin/perl

$lib = '/path/to/libs';
use lib $lib;
use AnyModule;

So oder so ähnlich findet man es in vielen Programmen und Anfänger wundern sich, warum das nicht funktioniert. Ein Grund, sich etwas näher mit dem Ablauf eines Perl-Programms zu beschäftigen und sich anzuschauen, was wann passiert. Wenn "perl script.pl" aufgerufen wird, werden mehrere Phasen durchlaufen. 

Dieser Artikel zeigt und erläutert die Phasen die durchlaufen werden und welche Fallstricke lauern.

 * Operatoren überladen

    Eigentlich alle Objektorientierten Sprachen kennen den Begriff des Überladens. In den meisten Sprachen - wie z.B. Java - werden Methoden überladen, damit je nach Anzahl oder Art der Parameter die richtige Methode aufgerufen wird. Perl bietet weder Methoden-Signaturen noch das Überladen von Methoden. Deshalb ist der Begriff frei für etwas anderes: Operatoren überladen.

In Perl können alle Built-in Operatoren für eine Klasse mit einer neuen Bedeutung versehen werden, aber wozu das Ganze? 

Genau das zeigt dieser Artikel.

 * WxPerl-Tutorial - Teil 12

   Was tun wenn das gewünschte Widget nicht existiert? Selber bauen! Die letzte Folge des WxPerl-Tutorials deutet an wie es geht, denn alle Techniken wurden bereits beschrieben und Listings zu eigenen Widgets sind ungleich länger und besser im Netz aufgehoben. Dieser Teil beendet zugleich auch dieses Tutorial. Falls ein gesuchtes Thema nicht behandelt wurde, wie etwa 3D-Graphik per Wx::GLCanvas oder Anwendungen die mehrere Prozessorkerne beschäftigen können, sei noch einmal auf das gerade unter http://bitbucket.org/lichtkind/wxperlbook entstehende Wx Perl-Buch verwiesen. Es wird auch einige nützliche Werkzeuge als Beispielprogramme enthalten, gekrönt von einem bequemen Dokumentationsbetrachter namens Dokular, der erst einmal eine bessere Übersicht über Wx Perl bieten soll. 

 * XML::Compile und SOAP

    In der Ausgabe 03/2012 dieses Magazins hat Mark Overmeer die Grundlagen der Handhabung von XML in Perl erklärt. Verwendet hat er hierzu das Modul XML::Compile. Dieses Modul erstellt strikte Konverter von XML-Nachrichten in komplexe Perl-Datenstrukturen und umgekehrt.

Die meisten Perl Module versuchen nach dem DWIM (Do What I Mean) - Prinzip vorzugehen um den Aufwand für den Programmierer so gering wie möglich zu halten: der Code vermutet, wie er sich zu verhalten hat. Wenn die XML Nachricht durch ein "schema" - der formalen Spezifikationssprache von Nachrichtenstrukturen - definiert ist, ist DWI Ming gefährlich: die Prüfung auf Richtigkeit der Struktur ist standardmäßig notwendig. DWI Ming könnte falsch liegen. 

In dieser Ausgabe zeigt Overmeer, wie XML::Compile die Verwendung von SOAP-Schnittstellen vereinfacht und warum SOAP::Lite nicht so wirklich Leichtgewichtig ist.

 * Mojolicious Tutorial - Teil 1

   In der letzten Ausgabe wurde bereits eine Mini-Einführung in Mojolicious gegeben. Ab dieser Ausgabe soll ein ausführlicher Einstieg gezeigt werden. Der Einstieg sollte sehr leicht werden, weil das Framework außer Perl 5.10.x keine Voraussetzungen hat. Alle notwendigen Module werden mitgeliefert. Im Laufe des Tutorials soll eine Webanwendung programmiert und erweitert werden, bei der Läufer ihre täglichen Zeiten und Kilometer eintragen können. 

Im ersten Teil des Tutorials wird auf das Routing eingegangen. Auch die Built-in-Templatesprache von Mojolicious und Stashes sind Thema.

 * Rezension - Arbeitsgrundlage

   Zurück zu den Wurzeln. Dieses Mal geht es um Wissen, dass man für seine professionelle Programmierarbeit unbedingt besitzen sollte. Das neue Beginning Perl will die berechtigte Frage beantworten: "Womit muss man vertraut sein, um reale Aufträge selbständig lösen (... und sich die restlichen Details im Netz selbst heraussuchen) zu können?". Im zweiten Buch von Mathias Geirhos geht es darum, wie das Projekt geplant und durchführt wird, ohne das man selbst oder das Vorhaben darunter leidet. Doch zum Einstieg soll es um winzige Perlskripte gehen, welche bei den kleinen, nebenbei anfallenden, Arbeiten nützlich sind.

 * Sonstiges

   Auch in dieser Ausgabe dürfen die CPAN-News nicht fehlen. Es werden 6 neue Module auf CPAN vorgestellt. Neu ist die Kategorie P5P News, die über die Geschehnisse bei den Perl 5 Porters berichtet. Aber auch die Neuigkeiten aus der Perl Foundation finden in dieserAusgabe einen Platz.

Thursday, October 04, 2012

Frankfurter Perl-Community Workshop

Am 03./04. November findet im Jugendhaus des DGB der diesjährige Frankfurter Perl-Community Workshop statt.

Die Teilnahme ist kostenlos. Ein festes Programm wird es nicht geben, da wir den Zeitplan immer dynamisch erstellen und anpassen. So kann man ein eigentlich "kleines" Thema auch mal zwei Stunden diskutieren oder man kurzfristig noch einen Vortrag einschieben.

Der Workshop ist auch eine gute Gelegenheit, Vorträge für z.B. den nächsten Deutschen Perl-Workshop zu üben ;-)

Wer am Workshop teilnehmen möchte, sollte sich ins Wiki bei Perl-Community.de eintragen.

Tuesday, September 18, 2012

Kundendaten aus vTiger in OTRS nutzen

Kundendaten an mehreren Stellen pflegen ist unklug, da sich dann immer wieder Fehler einschleichen können. Aus diesem Grund ist es gut, wenn mehrere Systeme auf die gleiche Datenbasis zugreifen können.

Hier soll kurz gezeigt werden, wie man Kundendaten aus vTiger in OTRS nutzen kann.

Informationen über Kunden

Um Name und E-Mail bei der Ticketerstellung in OTRS nutzen zu können, muss man einfach nur eine neue Kundendatenquelle hinzufügen. Diese Einstellungen werden in der Datei <otrs_home>/Kernel/Config.pm hinzugefügt:

    $Self->{CustomerUser} = {
        Name   => 'VTiger CRM',
        Module => 'Kernel::System::CustomerUser::DB',
        Params => {
            DSN => 'DBI:mysql:database=vtigercrm520;host=localhost',
            User => 'dbuser',
            Password => '2357KLAFKkjsd',
            Table => 'vtiger_contactdetails',
            CaseSensitive => 0,
        },

        CustomerKey => 'email',
        CustomerID  => 'accountid',
        CustomerUserListFields => [ 'firstname', 'lastname', 'email' ],
        CustomerUserSearchFields => [ 'firstname', 'lastname', 'email'],
        CustomerUserSearchPrefix => '*',
        CustomerUserSearchSuffix => '*', 
        CustomerUserSearchListLimit => 250,
        CustomerUserPostMasterSearchFields => ['email'],
        CustomerUserNameFields             => [ 'title', 'firstname', 'lastname' ],
        CustomerUserEmailUniqCheck         => 1,

        CustomerUserExcludePrimaryCustomerID => 0,
        CustomerCompanySupport => 1,
        ReadOnly => 1,
        Map => [
            [ 'UserTitle',      'Title',      'salutation',      1, 0, 'var', '', 0 ],
            [ 'UserFirstname',  'Firstname',  'firstname', 1, 1, 'var', '', 0 ],
            [ 'UserLastname',   'Lastname',   'lastname',  1, 1, 'var', '', 0 ],
            [ 'UserLogin',      'Username',   'email',      1, 1, 'var', '', 0 ],
            [ 'UserEmail',      'Email',      'email',           1, 1, 'var', '$Env{"CGIHandle"}?Action=AgentTicketCompose&ResponseID=1&TicketID=$Data{"TicketID"}&ArticleID=$Data{"ArticleID"}', 0 ],
            [ 'UserCustomerID', 'CustomerID', 'accountid', 0, 1, 'var', '', 0 ],
            [ 'UserCompanyID',  'CompanyID',  'accountid',  0, 1, 'var', '', 0 ],
            [ 'UserPhone',      'Phone',      'phone',        1, 0, 'var', '', 0 ],
            [ 'UserFax',        'Fax',        'fax',          1, 0, 'var', '', 0 ],
            [ 'UserMobile',     'Mobile',     'mobile',       1, 0, 'var', '', 0 ],
        ],
    };


Ein paar Erläuterungen dazu:

Der "Name" ist frei wählbar, sollta aber möglichst sprechend sein, damit man auch nach ein paar Jahren weiß, was da konfiguriert wird.

Da wir mit der Datenbank von vTiger arbeiten, müssen wir als "Module" Kernel::System::CustomerUser::DB wählen. Grundsätzlich kann man verschiedene Arten von Quellen anbinden. Im Standard-OTRS sind Module für Datenbanken und LDAP dabei.

Mit den "Params" definieren wir, wie die Datenbankverbindung aussieht. Der "DSN" ist die Angabe, die das Perl-Modul DBI für den Verbindungsaufbau benötigt.

       'DBI:mysql:database=vtigercrm520;host=localhost'






Das "mysql" sagt, dass vTiger mit einer MySQL-Datenbank läuft. Wenn Sie mit PostgreSQL arbeiten, müssen Sie das Perl-Modul DBD::Pg installieren und hier im DSN statt "mysql" einfach "pg" eintragen.



Die Angabe "vtigercrm520" ist der Datenbankname und "localhost" der Host, auf dem die Datenbank läuft.


Weiterhin müssen Benutzer und Passwort der vTiger-Datenbank angegeben werden. Es empfiehlt sich, für den Zugriff einen extra Benutzer anzulegen, der nur Leserechte hat. Das CRM soll das führende System bei den Kundendaten sein.

            User          => 'dbuser',
            Password      => '2357KLAFKkjsd',



Der Tabellenname "vtiger_contactdetails" sagt ganz einfach aus, in welcher Tabelle der vTiger-Installation die Kundendaten zu finden sind.

            Table         => 'vtiger_contactdetails',

Danach folgen weitere Einstellungen, die hauptsächlich für die Suche wichtig sind.

Herauszuheben sind "CustomerKey" was aussagt, was die Verbindung zwischen den Tickets und den Kundendaten herstellt. Wenn man sich die Informationen anschaut, die zu den Tickets gespeichert werden, sieht man, dass nicht alle Kundeninformationen am Ticket gespeichert werden, sondern nur eine eindeutige Angabe. Hier eben die E-Mailadresse.

Wir setzen auch "ReadOnly" auf 1, weil keine Kundendaten im OTRS geändert werden sollen. Alles soll über vTiger laufen.

In der "Map" werden Zuordnungen von Spaltennamen in der vTiger-Tabelle zu den Attributen des Objekts und der Anzeige an der Oberfläche vorgenommen. Z.B.:

        [ 'UserFirstname',  'Firstname',  'firstname', 1, 1, 'var', '', 0 ],

sagt aus, dass das Attribut 'UserFirstname' an der Oberfläche mit "Firstname" (bzw. der Übersetzung davon) gekennzeichnet wird und mit Daten der Tabellenspalte "firstname" in vtiger_contactdetails  gefüllt wird.

Zusätzliche Attribute

Jetzt fällt auf, dass einige wichtige Angaben zum Kunden gar nicht in der Zuordnung vorhanden sind. Diese werden natürlich auch nicht an der Oberfläche angezeigt. Warum sind jetzt also nicht "Straße", "Ort" und "Land" dort angegeben? Und warum bekomme ich nur eine Zahl bei der "Kundenfirma" angezeigt?

Das hängt damit zusammen, dass diese Informationen in vTiger über mehrere Tabellen verteilt sind. Das Standard-OTRS-Modul zur Anbindung von Datenbanken kann aber nur mit einer einzelnen Tabelle umgehen.

Um diese Informationen dennoch in OTRS nutzen zu können, kann man folgenden Weg gehen: Man legt eine sogenannte "View" in der Datenbank an. Damit können Daten aus mehreren Tabellen aggregiert werden und nach außen hin sieht es wie eine einzige Tabelle aus.

In MySQL wird dazu einfach folgender Befehl ausgeführt:

CREATE VIEW otrsview
    AS SELECT vcd.*, vca.*, va.accountname
        FROM vtiger_contactdetails vcd
            LEFT OUTER JOIN vtiger_contactaddress vca
                ON contactid = contactaddressid
            LEFT OUTER JOIN vtiger_account va
                ON  vcd.accountid = va.accountid;

Jetzt nur noch in der oben gezeigten Konfiguration die Tabellenangabe von vtiger_contactdetails in otrsview ändern.

In der Map kann man dann noch folgende Einträge hinzufügen:

 [ 'UserStreet', 'Street', 'mailingstreet', 1, 1, 'var', '', 0 ]

Und schon steht die Straßenangabe zur Verfügung.

Kundenlogin ermöglichen
Soll das Kundenportal von OTRS für die Kunden freigeschaltet werden. Dazu müssen sich die Kunden dort anmelden können. Auch hier sollen die Daten aus vTiger genutzt werden.

Die Einstellungen zur Authentifizierung der Kunden müssen auch in der Config.pm von oben vorgenommen werden:

 $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB';
 $Self->{'Customer::AuthModule::DB::Table'} = 'vtiger_portalinfo';
 $Self->{'Customer::AuthModule::DB::CustomerKey'} = 'user_name';
 $Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'user_password';
 $Self->{'Customer::AuthModule::DB::DSN'} = "DBI:mysql:database=vtigercrm520;host=localhost";
 $Self->{'Customer::AuthModule::DB::User'} = "dbuser"; 
 $Self->{'Customer::AuthModule::DB::Password'} = "2357KLAFKkjsd";


Die Angaben von DSN, User und Passwort sind die gleichen wie oben gezeigt. Wichtig sind hier noch die Angaben zur Tabelle ("vtiger_portalinfo") und welche Felder zur Authentifizierung wichtig sind. Der Benutzername steht in vTiger unter "user_name" und das Passwort in "user_password". vTiger speichert die Passwörter leider in Klartext ab. Aus diesem Grund muss der "CryptType" auf "plain" gesetzt werden.

Jetzt können sich die Kunden auch am Kundenportal von OTRS anmelden und dort Tickets erstellen.

vTiger

(Quelle: http://de.wikipedia.org/wiki/Vtiger)
vtiger CRM ist eine freie Open Source Software für das Customer-Relationship-Management. vtiger basiert auf der Skriptsprache PHP und der Datenbank MySQL

OTRS

(Quelle: http://de.wikipedia.org/wiki/OTRS)
Das Open Ticket Request System (OTRS) ist ein Ticketsystem oder Kommunikationsmanagementsystem, welches oft als Helpdesk-System bzw. Issue-Tracking-System eingesetzt wird. OTRS ist freie Software und steht unter der GNU Affero General Public License (AGPL).

Mit Hilfe des webbasierten Ticketsystems OTRS lässt sich jegliche Art von Anfragen (zum Beispiel Störungsmeldungen, Service- und Informationsanfragen) über die Meldewege E-Mail, Telefon und Kunden-Webfrontend strukturiert erfassen, klassifizieren, speichern und weiterverarbeiten.


Perl-Services.de

Perl-Services.de ist ein kleines Unternehmen, das unter anderem auch OTRS-Programmierung anbietet. Wir passen OTRS nach Ihren Wünschen an und helfen Ihnen bei der Einführung und Konfiguration des Ticketsystems.

Wednesday, September 12, 2012

OTRS-Arbeiten...

Seit einigen Tagen kann ich endlich mal wieder ein wenig Zeit für Arbeiten rund um OTRS aufwenden:

Neue OTRS-Pakete bzw. neue Versionen:


 * FixNonRFCCompliantCharsetInMails
 * TicketBarcode für KIX4OTRS (noch nicht veröffentlicht)
 * QuickClose

OPAR:

Ein paar Bugs habe ich gefunden. Endlich werden im RSS-Feed die aktuellsten Uploads angezeigt. Wenn nach "." gesucht wurde, wurde das ab der zweiten Ergebnisseite nicht mitgeführt. Das hing damit zusammen, dass der Suchbegriff in die URL eingebaut wurde und der "." natürlich somit wegfällt.

Ein fehlerhafter Login bringt jetzt eine bessere Fehlermeldung.

Weiterhin gibt es zusätzliche Links auf der Detailseite von Paketen wenn es das Paket für mehrere Framework-Versionen gibt.

Continuous Integration für OTRS-Pakete:

Schon länger habe ich geplant, Jenkins für das Bauen und Testen von OTRS-Paketen zu verwenden. Zum Einen weil mir das viel Arbeit abnimmt und zum Anderen weil ich für eine Auditierung bei einem Kunden solche Prozesse nachweisen muss.

Vor kurzem bin ich dann auf einen Tweet von Roy Kaldung gestoßen, der für OPMZone.org die Pakete mit Jenkins baut.

Leider verwendet er dafür eine OTRS-Installation und das Skript otrs.PackageManager.pl daraus. Für meine Zwecke ist das nicht geeignet, weil auf der Maschine mit Jenkins kein OTRS laufen wird und wenn dann ist es nur eine Version. Ich will aber die Pakete mit verschiedenen Versionen testen.

Ich habe daher angefangen, ein Tool zu schreiben, das OTRS-Pakete erstellt und einige Tests ausführen kann: OTRS-OPM-Maker. Ein CPAN-Release wird in den kommenden Tagen noch folgen.

Umgesetzt ist das mit App::Cmd. Das Modul ist echt klasse für die Erstellung von Konsolenprogrammen.



In den nächsten Tagen werden mit Sicherheit noch weitere Änderungen dazukommen.

Tuesday, June 26, 2012

Europäische Perl-Konferenz 20.-22.08.2012 in Frankfurt/Main

Die 13. Europäische Perl-Konferenz "YAPC::Europe" findet vom 20.-22. August 2012 an der Goethe-Universität Frankfurt/Main statt.
Die Europäische Perl-Konferenz "YAPC::Europe" ist die größte jährliche Konferenz für Anwender und Entwickler der dynamischen Open-Source-Programmiersprache Perl in Europa. In diesem Jahr wird sie von den Frankfurt Perlmongers e.V. ausgerichtet.

Modern Perl

Ein Schwerpunkt der Konferenz ist "Modern Perl". Dabei spielen Module wie Moose, eine neuartige Objektorientierung für Perl, und DBIx::Class als Schicht zwischen Anwendung und Datenbanken eine genauso wichtige Rolle wie die Web-Frameworks Catalyst, Dancer und Mojolicious.

Call for Papers

Die Konferenz 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 die Konferenz interessant sein. Vorschläge müssen bis spätestens Sonntag, den 15. Juli 2012 als Abstract eingereicht werden. Der Abstract sollte in rund 2.000 Zeichen das Thema beschreiben.

Sponsoren

Die Konferenz bedeutet neben enormem zeitlichen auch hohen finanziellen Aufwand. Deshalb benötigen wir Unterstützung von Sponsoren, z.B. bei der Ausrichtung der Abendveranstaltung. Für mehr Informationen darüber, wie Sponsoren den Workshop unterstützen können, steht Renée Bäcker (sponsoring@yapc2012.de) zur Verfügung.

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 110 € und für Firmenteilnehmer bei 450 € für die gesamte Konferenz. Bis zum 8. Juli gibt es für Privatpersonen einen Frühbucherrabatt, so dass das Ticket nur 80 € kostet

Thursday, April 26, 2012

Modul-Dokumentation als E-Book

Heute wurde ein neuer Dienst ins Leben gerufen, mit dem man die Dokumentation von CPAN-Modulen als E-Book bekommen kann: http://perlybook.org. Zur Zeit stehen mit ePub und Mobi zwei Zielformate zur Verfügung, mit denen der Großteil der E-Book-Leser zurechtkommen.

Der Dienst steht noch ganz am Anfang und wird stetig weiterentwickelt. Wir haben den Code auf github gestellt, so dass jeder leicht daran mitarbeiten kann. Natürlich wurde alles mit Perl umgesetzt: Mojolicious als Framework für die Applikation, EPublisher mit Plugins für die Erstellung der E-Books und MetaCPAN::API um an die ganzen Modulinformationen wie das Pod etc. zu kommen.

Falls irgendwelche Fehler auffallen, dann bitte einen Bugreport aufmachen. Wenn irgendwelche Features fehlen, dann bitte einen Feature-Request aufmachen. Ein paar Sachen werden in Kürze noch kommen - eine ROADMAP ist auch auf github zu finden.

Feedback ist jederzeit willkommen: perlybook@perl-services.de

Thursday, March 22, 2012

Chemnitz: LinuxTage und OTRS-Usertreffen

Am vergangenen Wochenende war ich mal wieder in Chemnitz - wie schon im letzten Jahr war ich bei den Chemnitzer LinuxTagen. Diesmal hatten wir einen eigenen Stand, nachdem wir im letzten Jahr man an den Stand der OTRS-Community durften.

Aber bevor es mit den Linuxtagen losging, gab es freitags in den Räumen von cape-IT noch ein OTRS-Usertreffen. Ich bin mit Hannes verspätet dort eingetroffen, aber trotzdem war es noch sehr interessant. Den Vortrag von Rico zu den Neuerungen in KIX4OTRS habe ich verpasst, aber zur "Plauderrunde" waren wir da.

Hannes hat uns gezeigt, womit er sich so beschäftigt. Sehr interessante Ideen ;-) Andre von Otterhub hat auch noch einen guten Review geschrieben.

Samstag früh ging es dann zu den Linuxtagen, der Stand musste ja noch aufgebaut werden. Ich bin mal wieder mit ziemlich viel Gepäck angereist, Flyer, Banner, Sticker, Bücher, Perl-Magazine etc. mussten alle mit nach Chemnitz.


Wir hatten an den beiden Tagen recht gut zu tun, auch wenn es zwischendrin immer wieder Leerlauf gab. Man hat zwar von Einzelnen die typischen Sprüche über Perl wie "das ist doch nicht lesbar", "ach wenn ich schon die ganzen Dollarzeichen sehe" gehört, aber insgesamt waren es gute Gespräche, die wir dort geführt haben. Ich habe auch wieder viele neue Kontakte geknüpft... und neue Ideen gesammelt. Ich muss mir z.B. mal die Archivista-Box anschauen.

Am Sonntag habe ich auch noch einen Vortrag über Jenkins mit Perl gehalten. Ich hoffe, dass die Videoaufnahmen bald im Netz landen. Dann werde ich das hier verlinken.

Mehr oder weniger direkt nach dem Vortrag musste ich dann schon zum Bahnhof, weil die Heimfahrt über 7 Stunden dauerte und ich noch sonntags ankommen wollte.

An dieser Stelle möchte ich mich auch bei Markus bedanken, der den Stand organisiert hat und bei Wolfgang, Steffen und Florian, die am Stand geholfen haben.

Tuesday, January 31, 2012

Frühjahr 2012 - die 21. Ausgabe von $foo ist da!

Gerade wird es so richtig kalt - aber beim Perl-Magazin ist es schon Frühjahr. Die 21. Ausgabe des Magazins ist heute erschienen und die Abonnenten sollten in den nächsten 1-2 Tagen Post bekommen.


Inhalt dieser Ausgabe:

* VMware und Perl

Virtualisierung ist mittlerweile ein großes Thema. Mit VMware und Perl kann man virtuelle Maschinen automatisch ansprechen.
Stefan Oberwahrenbrock zeigt, welche VMware-Produkte es gibt und wie man diese mit Perl ansprechen kann.

* Continuous Integration für Perl-Projekte mit Jenkins

Nichts ist schlimmer, als eine fehlerhafte Software an Kunden auszuliefern. Deshalb sollten Tests und das Zusammenbauen der unterschiedlichen Komponenten regelmäßig auf dem Programm stehen.
Dieser Artikel zeigt, wie Jenkins für Perl-Projekte eingesetzt werden kann.

* Perl in the Cloud - OpenShift Express by Red Hat

Das Thema "Cloud" ist derzeit in aller Munde, jeder will rein und immer mehr Anwendungen wandern in die Cloud.
Thomas Fahle zeigt in diesem Artikel, wie man eigene Anwendungen mit OpenShift von RedHat in die Cloud bringt.

* Rezension - Perl komplett

Herbert Breunung stellt in dieser Ausgabe wieder zwei Bücher vor - Die "Perl Pocket Reference" von Johan Vromans und "Der Perl-Programmierer" von Jürgen Plate.

* Konfigurationsmanagement und Software-Deployment mit Rex

Mit Rex kann das komplette Deployment und die Konfiguration von Servern automatisiert werden. Die Steuerdateien für Rex sind in Perl geschrieben.
Jan Gehring zeigt, wie die sogenannten "Tasks" geschrieben werden und welche Möglichkeiten Rex bietet.

* Ein CPAN für eigene Module

Wie stelle ich Kunden die entwickelten Perl-Module zur Verfügung? Diese Frage stellt sich wahrscheinlich für viele Perl-Programmierer.
Man kennt ja das CPAN, warum also nicht die gleiche Struktur für eigene Projekte nutzen.
Dieser Artikel zeigt, wie man mit Pinto ein CPAN für eigene Module aufbaut.

* WxPerl Tutorial - Teil 9: Mächtige Widgets

Im neunten Teil des WxPerl-Tutorials zeigt Herbert Breunung eine Übersicht über viele Widgets, die man in wxPerl-Programmen nutzen kann. Er geht dabei den Weg von einfachen Widgets über einfache Auswahlwidgets bis zu den Auswahlwidgets für den gehobeneren Anspruch.

Sunday, January 22, 2012

YAPC::Europe 2012: Datum und Ort stehen jetzt fest

Endlich können wir das Datum und den Ort der diesjährigen YAPC::EU bekanntgeben: Die YAPC::Europe 2012 wird vom 20.-22. August 2012 an der Goethe Universität in Frankfurt stattfinden.

Die Webseite werden wir regelmäßig mit neuen Informationen bestücken. Die wichtigsten Informationen wird es auch im Blog geben.

Monday, January 16, 2012

Programm des 14. Deutschen Perl-Workshops

Die Erlanger Perlmongers haben das Programm des 14.Deutschen Perl-Workshops online gestellt. Teilweise gibt es zwei Track, die meiste Zeit ist es aber nur ein einzelner Track.

Ich selbst werde einen längeren Vortrag über Jenkins und Perl halten. Ein Lighting Talk über die YAPC::Europe wird auch dabei sein.

Thursday, January 05, 2012

MP3s mit Perl abspielen

Nett und öfter mal wieder gefragt: MP3-Dateien mit Perl abspielen.
Meistens wird dabei auf Module zurückgegriffen, die einen besondeten Player ansprechen. Win32::MediaPlayer, Bundle::Xmms und Win32::MultiMedia::Mci sind Beispiele dafür.

Ein anderer Ansatz ist, SDL dafür zu verwenden. Das hat beispielsweise gegenüber Win32::MultiMedia::Mci den Vorteil, dass das Programm auch auf Nicht-Windows-Systemen wie Appels OS X oder diversen Linux läuft.

SDL steht für Simple DirectMedia Layer und ist eine plattformunabhängige Multimedabibliothek, die in der Programmiersprache C geschrieben ist.

Das SDL-Perl-Projekt unter http://sdl.perl.org stellt eine Anbindung an die SDL-Bibliothek zur Verfügung. Das Modul kann mittlerweile bequem per CPAN installiert werden. Alien::SDL sorgt dabei für eine angenehm reibungslose Installation der Abhängigkeiten von SDL, imdem es den ganzen Prozess des Kompilieren der Abhängigkeiten erledigt.

SDL auf Mac OS X


Apple bringt zwar ein Perl mit, damit zu arbeiten fand ich bislang aber immer sehr mühselig. Deshalb habe ich mir kurzerhand über perlbrew (http://perlbrew.pl/) ein aktuelles Perl installiert. Damit das alles klappt, sollte man das aktuellste XCode (das man so von Apple kostenlos bekommt) installieren. Auf den Installations-CDs ist normalerweise eins dabei.

Was bleibt ist das nicht von Haus aus in Appels Betriebssystem enthaltene lame. Das wird benötigt, um mittels SDL MP3-Dateien abzuspielen. Da die Installation dieser Voraussetzung nicht Aufgabe von Alien::SDL ist, muss man es von Hand machen. Mir hat der unaufwendige Weg über Homebrew (http://mxcl.github.com/homebrew/) sehr gut gefallen.

Es reicht, den Befehl
> brew install lame

einzugeben, und schon ist lame installiert. Es fehlt dann nurnoch SDL Perl:

cpan> install Alien::SDL
cpan> install SDL


Also nochmal zusammengefasst, was man auf einem Mac alles installieren muss, um MP3s abspielen zu können:

  • XCode (neuste Version, aktualisieren nicht vergessen!)

  • perlbrew

  • ein aktuelles Perl (z.B. 5.14.1)

  • homebrew

  • lame

  • Alien::SDL

  • SDL



Das Programm


Nun zum interessanten Part: wie sieht das Programm aus?


#!perl

use strict;
use warnings;
use SDL;
use SDL::Mixer;
use SDL::Mixer::Music;
use SDLx::App;

# -- Initialisierung
SDL::Mixer::init( SDL_INIT_AUDIO | MIX_INIT_MP3 | MUS_MP3 );
unless( SDL::Mixer::open_audio( 44100, AUDIO_S16SYS, 2, 4096 ) == 0 ) {
Carp::croak "Cannot open audio: ".SDL::get_error();
}

# -- Anwendung erstellen
my $app = SDLx::App->new(
title => 'MP3 abspielen',
w => 400,
h => 200,
exit_on_quit => 1,
depth => 32
);

# -- Diese Datei soll abgespielt werden.
my $sound_file = 'music/Musikdatei.mp3';

# -- Datei in den Speicher laden
my $background_music = SDL::Mixer::Music::load_MUS($sound_file);

unless( $background_music ) {
Carp::croak "Cannot load music file [$sound_file]: " . SDL::get_error();
}

# -- Datei abspielen
my $loops = 0; # 0 = 1mal, -1 = unendlich oft
SDL::Mixer::Music::play_music( $background_music, $loops );

$app->run();

SDL::Mixer::Music::halt_music();
SDL::Mixer::close_audio;
exit(0);


Die Musikdatei, die der Einfachheit halber in der Variable $sound_file fest verdrahtet wurde, muss natürlich existieren. Man kann dort wahlweise MP3-, wav- oder ogg-Dateien eintragen. load_MUS() macht den Rest.

Zuerst wird die Hardware initialisiert, dann die Musikdatei geladen und schlussendlich abgespielt. Es ist möglich, die Anzahl der Wiederholungen festzulegen und natürlich kann man das Musikstück auch anhalten und weiterlaufen lassen - auch mit fading. Wie genau, ist in der Manpage von SDL::Mixer::Music enthalten.

Eventuell hat jemand Lust, das obenstehende Programm zu erweitern, so dass man eine Datei auswählen, starten, anhalten und beenden kann?

Ein paar technische Anmerkungen:
Verwendetes OS: Mac OS X snow leopard 10.6.8
Perl: 5.14.1
SDL::version is 1.2.14
SDL::linked_version is 1.2.14