Saturday, June 21, 2014

Audiodateien mit Perl abspielen (Windows only)

Wie man mit Perl und SDL MP3-Dateien abspielt, hatte ich in der Vergangenheit bereits in einem Blogeintrag beschrieben: MP3s mit Perl abspielen

Das sympathische an der Lösung mit SDL ist, dass sie plattformunabhängig funktioniert.

Wer nur auf Windows arbeitet kann aber auch andere Wege nutzen. So gibt es für Windows das Media Control Interface - kurz: MCI. Mir sind dazu bislang zwei Module auf CPAN untergekommen. Beide sind zugegebenermaßen über die klassische CPAN-Suche nicht immer so einfach zu finden, daher hier mal die Links dazu:
Von den kleinen Versionsnummern sollte man sich nicht schrecken lassen. Die Module funktionieren - soweit ich das bislang getestet habe - so wie sie sollen.

Die Dokumentation von Win32::MCI::Basic fällt derzeit sehr spartanisch aus. Eigentlich steht ja alles drin, was man braucht. Die beiden Befehle und ein Verweis auf die Microsoft-Dokumentation zum Thema. Leider gibt es (noch) kein Code-Beispiel.

Hier wäre dann eins:

#!/usr/bin/perl
use strict;
use warnings;
use Win32::MCI::Basic;
use File::Spec;

=comment

Let Perl play a sound file using Windows MCI.

Sources (all downloaded 2014-06-21):

http://search.cpan.org/dist/Win32-MCI-Basic-0.02/Basic.pm
https://metacpan.org/pod/Win32::MultiMedia::Mci
http://www.perlmonks.org/bare/?node_id=295558
http://msdn.microsoft.com/en-us/library/windows/desktop/dd757151%28v=vs.85%29.aspx
http://social.msdn.microsoft.com/Forums/es-ES/92803129-24c3-42d0-b32a-17d05606a151/win32-mci-api-for-playing-media?forum=vblanguage

=cut

# define your Audio file here. Tested with WMA and MP3
my $file_wma = File::Spec->catfile( $ENV{WINDIR}, '\Media\Alarm01.wav' );

run_or_die("open \"$file_wma\" alias myaudio");
run_or_die("play myaudio wait");
run_or_die("close myaudio");

print "done\n";

sub run_or_die {
    my $command = shift or die('Missing MCI command');

    my ($APICallReturnValue, $lpszReturnString) = mciSendString($command);
    printf("API Call Return Value: %s, that other string: %s\n", $APICallReturnValue, $lpszReturnString);
   
    die mciGetErrorString($APICallReturnValue) unless $APICallReturnValue == 0;
   
    return;
} # /run_or_die


Statt WAV-Dateien kann man auch MP3s reinwerfen und sie werden abgespielt. Läuft etwas schief, dann wird der Return-Code auf etwas anderes als 0 gesetzt.Der Return-Code kann dann mit dem Befehl mciGetErrorString in die dazugehörige Fehlermeldung umgewandelt werden.

Was es mit dem $lpszReturnString auf sich hat, habe ich leider noch nicht verstanden. Wer es weiß, darf gerne einen Kommentar hinterlassen.

Monday, May 19, 2014

Konfigurationsdateien für Perl-Programme ablegen

Und wieder einmal stehe ich vor der Frage: wohin mit der Konfigurationsdatei für mein Perl-Programm?

Ganz konkret geht es um minicpan - einem kleinen Programm zur Erstellung eines lokalen CPAN-Mirrors. Der ist ganz praktisch, wenn man unterwegs ist, mal kein Internet hat oder einfach keinen Bock darauf hat, schon wieder auf das Herunterladen der Module zu warten.

Wie minicpan auf Windows eingerichtet wird, wird auf diesen beiden Webseiten ganz gut erklärt:

Das Prinzip ist einfach. Es gibt schon alles, was für einen lokalen CPAN-Server benötigt wird: ein Modul CPAN::Mini und ein Programm namens minicpan. Wird das Modul CPAN::Mini installiert, dann steht auch minicpan zur Verfügung.

minicpan arbeitet mit einer Konfigurationsdatei. In dieser Konfigurationsdatei wird u.A. eingetragen, von welchen CPAN-Server die Module geladen werden sollen und wo die Module auf der lokalen Festplatte abgelegt werden:

# Hier werden die Module auf der Festplatte abgelegt:
local: D:/www/MINICPAN/

# remote = der Server, von dem die Module gezogen werden
# Kann z.B. einer aus dieser Liste sein: http://www.cpan.org/SITES.html
remote: http://mirror.optusnet.com.au/CPAN/


Die Konfigurationsdatei wird auf Windows über eine Umgebungsvariable CPAN_MINI_CONFIG bekannt gemacht. Der Wert der Umgebungsvariable ist der Pfad zur Konfigurationsdatei. Ist das geschehen, reicht ein Kommando aus, um einen lokalen CPAN-Spiegel zu erzeugen:

minicpan -f

Anschließend muss das Repository noch im Helferlein cpan eingetragen werden, damit die Module auch aus der lokalen Kopie installiert werden. In cpan kann man dazu die folgenden zwei Befehle ausführen:

conf urllist file:///D:/www/MINICPAN/
conf commit

Zurück zur ursprünglichen Frage: wohin mit der Konfigurationsdatei? Klar kann die irgendwo liegen. Aber gehört sie da auch hin? Leider habe ich keine Referenz gefunden, in der konkret drin stand, wo die Dateien hin müssen. Aber es gibt eine Seite von Microsoft, in der die diversen Orte für Konfigurationsdateien beschrieben werden (Hinweise auf eine bessere Seite sind gerne willkommen): Accessing app data with the Windows Runtime (Windows Runtime apps)

Da steht sozusagen, dass Konfigurationsdateien, die nur für das lokale Gerät und den lokalen Benutzer gedacht sind, in %localappdata% rein sollten:

Local app data

Local app data should be used for any information that needs to be preserved between app sessions and is not suitable type or size wise, for roaming app data. Data that is not applicable on other devices should be stored here as well. There are no general size restriction on local data stored. Location is available via the localFolder property. Use the local app data store for data that it does not make sense to roam and for large data sets.

Das wiederum ist ganz praktisch, denn das Modul File::HomeDir nennt genau den Pfad zu %localappdata% als Ort für my_data, also Daten einer Applikation für den aktuellen Benutzer:

my_data

The my_data method takes no arguments and returns the directory where local applications should stored their internal data for the current user.

File::HomeDir ist generell ein ganz interessantes Modul. Es erlaubt plattformunabhängig die richtigen Verzeichnisse für Benutzerdaten zu finden. Hier ein kleines Beispiel für den  Nutzer root:


Quellcode:

#!perl

use strict;
use warnings;
use File::HomeDir;
use Tkx;

my $mw = Tkx::widget->new(".");
my $row = 0;
my @mnames = <my_home my_desktop my_documents my_music my_pictures my_videos my_data>;
foreach my $method_name ( @mnames ) {
    my $namel = $mw->new_ttk__label(-text => $method_name, -justify => 'left');
    $namel->g_grid(-row => $row, -column => 0, -sticky => 'we');
   
    my $vall = $mw->new_ttk__label(
        -text => File::HomeDir->$method_name,
        -justify => 'left',
    );
    $vall->g_grid(-row => $row, -column => 1, -sticky => 'we');
   
    $row++;
}

Tkx::MainLoop;


Sollte man nun also auf die Idee kommen, Windows-Nutzern eine kleine Applikation zur Konfiguration des lokalen CPAN-Mirros zu schreiben - idealerweise mit einer Möglichkeit die Module zu definieren, die überhaupt gespiegelt werden sollen, einer Möglichkeit eigene Module per CPAN::Mini::Inject einzubauen - dann weiß man jetzt auch, wo die Konfigurationsdatei dafür liegen muss.

Thursday, October 10, 2013

OPAR 2.0

Es ist vollbracht! Die letzten drei Tage war ich mit der Umstellung von OPAR auf Mojolicious beschäftigt. Auch auf einen neuen Server ist das jetzt umgezogen. Jetzt müssen nur noch die DNS-Server aktualisiert werden.

Vorher war alles mit CGI::Application umgesetzt.

Der Großteil des Codes musste nicht angefasst werden, sondern nur die Controller. Und dort waren die Arbeiten einfacher als gedacht. Größtenteils war es einfach ein "Suchen und Ersetzen". Die Tests nach der Umstellung haben noch ein paar Fehler zu Tage gebracht, die jetzt auch gefixt sind.

Im Zuge des Umbaus konnte auch einiges an Code gelöscht werden. Ein selbstgeschriebenes Session-Modul und andere Module sind aus OPAR rausgeflogen und auf die CPAN-Version umgestellt worden.

Jetzt läuft das ganze auch nicht mehr mit Apache sondern mit nginx als Frontend-Webserver und die Anwendung ansich mit Starman. Dank perlbrew ist jetzt Perl 5.18.1 statt Perl 5.10.1 (auf dem alten Server) im Einsatz.

Ein paar offene Punkte gibt es noch, aber ich bin mit dem Verlauf sehr zufrieden!

Noch eine wichtige Änderung in Sachen Sicherheit: Die Benutzerpasswörter werden nicht mehr mit einem einfachen crypt gehasht, sondern mittels Crypt::SaltedHash, wobei SHA-256 als Algorithmus eingesetzt wird. Autoren müssen das Passwort neu setzen...

Friday, September 27, 2013

Deutscher Perl-Workshop 2014 - Call for Papers

Du programmierst in Perl oder lehrst den Einsatz von Perl? Du hast neue Ideen, ein tolles Projekt oder eine spannende Geschichte zum Einsatz von Perl? Dann bist Du auf dem Deutschen Perl-Workshop 2014 genau richtig!

Wir bieten: mit dem Deutschen Perl-Workshop die größte deutschsprachige Veranstaltung zum Thema Perl genau die richtige Plattform für Deine Idee, Dein Projekt oder Deinen Erfahrungsbericht. 2014 findet der Deutsche Perl-Workshop vom 26.03. bis zum 28.03. im "Kulturzentrum FAUST Warenannahme" in Hannover statt. Zum Workshop 2013 fanden sich rund 130 Teilnehmer ein.

Wir suchen: Deine Idee. Dein Projekt. Deine Geschichte. Wir suchen anspruchsvolle Vorträge für unser Programm. Das können Lightning Talks (5min), Kurzvorträge (20min) oder Langvorträge (40min) sein. Solltest Du Anregungen für Vortragsthemen suchen, schaue bitte in den FAQ nach.

Vortragsvorschläge bitte über die Webseite einreichen. Ende der Einreichungsfrist ist der 22.12.2013! Dein Abstract sollte in rund 2000 Zeichen (das sind ca. 30 Zeilen a 72 Spalten) das Thema beschreiben, was besonders an Deinem Ansatz ist und weshalb Perl als Sprache in diesem Fall besonders nützlich ist. Bis zum 10. Januar bekommst Du eine Benachrichtigung ob Dein Vortrag angenommen wurde oder nicht.

Wer wir sind: In diesem Jahr wird der Workshop von den Hannover Perlmongers organisiert. Die Perlmongergruppe gehört zu den aktivsten in Deutschland und trifft sich alle zwei Wochen.  Mehr Infos zu unseren regelmäßigen Treffen gibt es auf Twitter unter https://twitter.com/Hannover_pm und unter http://hannover.pm.

Unser Workshop lebt von den Vorträgen und den Teilnehmern. Wir freuen uns auf Dich - als Teilnehmer und als Vortragender.

Thursday, September 19, 2013

Frankfurter Perl-Community Workshop 2013

Neben den großen Veranstaltungen wie dem Deutschen Perl-Workshop oder der YAPC::Europe gibt es auch in jedem Jahr einen kleinen Perl-Workshop in Frankfurt. In diesem Jahr findet er am 26./27. Oktober statt.

Seit einigen Jahren treffen sich 15-20 Perl-Interessierte im Herbst in Frankfurt um über ihre Projekte oder allgemeine Perl-Themen zu reden. Im Gegensatz zu den großen Veranstaltungen gibt es hier keinen festen Vortragsplan. Jeder kann - auch ganz kurzfristig - einen Vortrag halten.

Auch über die Dauer eines Vortrags wird ganz dynamisch entschieden. So gab es vor ein paar Jahren mal einen Kurzvortrag, der vorher mit "der dauert sowieso nur 20 Minuten" angekündigt wurde und schließlich über 2 Stunden dauerte weil das Thema sehr interessant war und zu einigen Diskussionen führte.

Als fester Kern der Veranstaltung kommen in der Regel ca. 8 Frankfurter Perlmongers, der Rest kommt aus der ganzen Republik. Wer also Zeit und Lust hat, kann sich einfach im Wiki anmelden.

Wer schon im Vorfeld weiß, dass er/sie einen Vortrag halten will, bitte auch kurz im Wiki eintragen.

Jetzt das wichtigste: was kostet es und wo findet der Workshop statt? Für die Teilnehmer fallen keine besonderen für den Workshop an. Die Raumkosten und die Kosten für (Standard-)Getränke werden von Frankfurt.pm übernommen. Nur Mittagessen und ggf. Reise-/Übernachtungskosten muss jeder selbst tragen. Der Workshop findet im "Haus der Jugend" statt.

Wednesday, August 28, 2013

Jugend hackt!

Ich glaub es hackt! - und zwar in der nächsten Woche in Berlin. Am 7. und 8. September findet im Jugendhaus Königstadt die Veranstaltung "Jugend hackt" statt. Das Ganze wird von der Open Knowledge Foundation Deutschland organisiert. Und es gibt noch freie Plätze, offenbar gibt es noch freie Plätze.

Wer also zwischen 12 und 18 Jahre alt ist, Lust auf Coden und das Verarbeiten von Daten hat, sollte sich beeilen!

Ich selbst unterstütze das Event mit ein wenig Geld, einigen Perl-Magazinen und ich werde bei der Preisverleihung mal vorbeischauen. Ich bin schon sehr gespannt, was die junge Generation so alles dahinzaubert...

Monday, August 12, 2013

Spiele in Perl - Tetris und Freunde

Petris

Vor einiger Zeit habe ich auf der Suche nach Spielen in Perl/Tk auf backpan eine ältere Tetris-Implementierung gefunden: Petris. Sie stammt von Mark Summerfield und entstand so um 1998/1999.
Spaßeshalber habe ich einmal versucht die Skripten zum Laufen zu bringen. Nach der Installation von Tk::MesgBox, einem Modul, das man mittlerweile wie Petris nicht mehr auf CPAN findet, funktionierte es sogar.
Es reizte mich, dass der alte Quellcode noch voll funktionstüchtig war. Es gibt jetzt auch ein Video davon: Petris - a Perl/Tk implementation inspired by Tetris

tktetris aus Perl/Tk Tools

Nachdem ich ein bisschen mit dem Code herumgespielt habe und die verschiedenen .pl-Skripten in Module aufgelöst habe, habe ich noch eine weitere Implementierung gefunden: tktetris. Diese ist Bestandteil der Perl/Tk Tools und sieht so aus:

Wer also Lust hat mal eben schnell Tetris zu spielen und sich dabei nicht von Perl lösen möchte, der kann sich dieser beiden Varianten bedienen.

Andere Spiele in Perl

Es erschien mir etwas mühselig Spiele in Perl/Tk ausfindig zu machen. Es gibt sie jedoch. In Forum der Perlunity gab es ein Memory-Spiel (Screenshot hier), und Dank Greg Bacon gibt es Solitraire in Perl/Tk. Auf youtube finden sich auch noch weitere Videos von grafisch hübschen Spielen, z.B. einem Pacman-Klon oder nochmal Tetris (mit Sound).

Thursday, July 18, 2013

Perl-Datenstrukturen in grafischer Oberfläche anzeigen

Perl/Tk hat es, und jetzt gibt es auch eine Variante mit dem GUI-Toolkit Prima: ein Widget zum Ausgeben von Datenstrukturen. (nb: gefunden in Perl Weekly)

Mit Data::Dumper::GUI stellt Toby Inkster ein Perl-Modul zur Verfügung das es einem erlaubt eine Perl-Datenstruktur in einer grafischen Oberfläche zu inspizieren.

Beispiel:

#!perl

use strict;
use warnings;
use Data::Dumper::GUI;

my @variables = (
    ['CP',
        [
            ['DP1', ['kein', 'Student']],
            '1',
            ['IP',
                [
                    't1',
                    ['VP',
                        [
                            ['V', ['blamierte'],],
                            'sich1',
                        ],
                    ],
                ],
            ],
        ],
    ], # /CP
);

print Dumper(@variables);
exit(0);

Das Ergebnis sieht wie folgt aus:



Für Perl/Tk gibt es so etwas in Form von Tk::DataTree. Ein Beispiel mit Bild gibt es auf perltk.de zu sehen.

Vielleicht hat ja noch jemand eine weitere Variante im Petto? In Wx oder Gtk2?

Friday, June 14, 2013

OTRS und die Paketverifizierung

Seit kurzem gibt es im OTRS Paketmanager eine Paketverifikation (OTRS >= 3.1.16 bzw. 3.2.7), die zu einigem Unmut geführt hat. Nicht, dass es eine Paketverifikation gibt ist hier das Problem, sondern die Vorgehensweise der Nicht-Kommunikation und Diskreditierung von Drittanbietern (Disclaimer: Ich gehöre zu diesen Drittanbietern). Außerdem bin ich der Hauptentwickler und Betreiber von OPAR, dem OTRS Package Archive, doch dazu später mehr.

Bei der Paketverifikation wird für das Paket eine MD5-Summe erzeugt und zusammen mit dem Paketnamen an einen Webservice der OTRS AG übermittelt. Stimmen die Werte mit denen überein, die bei der OTRS AG hinterlegt sind ist alles in Ordnung. Andernfalls bekommt der Benutzer eine Warnung angezeigt, die auch ganz klar die Empfehlung ausspricht, das Paket nicht zu installieren.

Wie wird denn jetzt ein Paket verifiziert? Man muss seinen kompletten Code an die OTRS AG schicken und die prüfen dann manuell, ob das Paket Auswirkungen auf die Stabilität und die Sicherheit hat.

Hier tauchen schon die ersten Probleme auf:

  •  Welche Kriterien werden angewandt? Auf meine Mails habe ich bisher entweder keine oder nur sehr allgemein formulierte Antworten bekommen.
  •  Wenn die Pakete sehr spezifische Einstellungen oder Code enthält, der "geschäftskritisch" für meinen Kunden ist, dann darf ich den nicht einfach so weitergeben, also kann ich das nie verifizieren lassen.
  •  Es vergeht viel Zeit von der Einreichung des Codes bis zur Verifizierung durch die OTRS AG. Für ein Paket, das ich verifizieren lassen wollte, liegt mir auch nach über einer Woche noch keine Aufwandsabschätzung und Angebot vor.
  •  Wenn ich Code für das Kernprodukt beisteuere muss ich ein "Contributor Agreement" unterschreiben, in dem steht, dass ich alle Rechte an allen Einsendungen die ich für irgendein Projekt der OTRS AG mache an die OTRS AG abtrete. Die Paketverifikation ist ein Projekt der OTRS AG. Ist das Einreichen von Paketen zur Verifikation schon eine "Contribution"?

Die Probleme gehen weiter:

  • Die Verifikation wird nur ausgeführt, wenn ein zusätzliches Modul für https installiert ist
  • Wenn ein Paket den Paketmanager oder das UserAgent-Modul überschreibt ist die Verifikation dahin und der User merkt nichts bzw. die Sicherheit ist nur vorgetäuscht.
  • Die rein manuelle Verifikation ist sehr fehleranfällig. Wer garantiert ein sehr gutes Perl-Wissen desjenigen, der das Paket verifiziert?
  • Was passiert wenn zwei Anbieter den gleichen Paketnamen verwenden? Wenn z.B. Anbieter A ein Paket X verifizieren lässt und Anbieter B sein Paket ebenfalls X nennt und verifizieren lässt?


Die c.a.p.e IT hat mittlerweile das Paket ConfigureCallHome veröffentlicht, mit dem man die Verifikation optional deaktivieren kann. Sie haben auch in einer Pressemitteilung ihren Unmut über die Paketverifikation kundgetan.

Und die OTRS AG hat dazu eine Stellungnahme formuliert. Auf diese möchte ich hier noch eingehen:

"Im Sinne des Open Source-Gedankens begrüßt die OTRS AG weiterhin jedes zur Verifizierung eingereichte Software-Paket..."
Natürlich begrüßen sie jedes eingereichte Software-Paket. Immerhin verdienen sie damit Geld, die Pakete zu verifizieren. Ich begrüße auch jede Gelegenheit, relativ leicht Geld zu verdienen. Was das aber mit "Im Sinne des Open Source-Gedankens" zu tun hat, ist mir schleierhaft. Im Sinne des Open Source begrüße ich jede veröffentlichte OTRS-Erweiterung. Für Open Source braucht es keine Verifizierung, sonst wäre ja Perl und das CPAN - dessen sich die OTRS AG übrigens für die Programmierung von OTRS ja bedient - kein Open Source.

"...und stellt auf Anfrage jedem Interessierten den Katalog der Verifizierungskriterien zur Verfügung."
Davon habe ich bisher noch nichts gemerkt. Ich habe den bisher noch nicht bekommen - obwohl ich lieb bei verify@otrs.com nachgefragt habe.

"Die OTRS AG steht in ständigem und regem Austausch mit der Community."

Ständiger und reger Austausch? Über dieses Thema wurde nicht öffentlich gesprochen - weder auf der Mailingliste noch im Forum. Vielleicht ist es mir durch die Lappen gerutscht, aber vermutlich nicht allen, die ihren Unmut geäußert haben und die Forensuche hat auch nichts ergeben. Zusätzlich hat sich die OTRS AG jetzt erst auf die Pressemitteilung von c.a.p.e IT geäußert und nicht in dem oben verlinkten Thread.

Wenn es einen anständigen Dialog gegeben hätte, hätte man gleich was ordentliches machen und viel Unmut vermeiden können. Das hätte zwar mehr Zeit gekostet, aber der Nutzen wäre viel größer.

"als auch die Tatsache, dass im von der Community betriebenen OTRS Package Archive (OPAR) jeder unter Verwendung eines Pseudonyms ohne jegliche Sicherheitsprüfung Pakete veröffentlichen kann, spricht für ein geringes Sicherheitsbewusstsein, für das die OTRS AG keine Verantwortung übernehmen kann und auch nicht will."
Jetzt setze ich mir den Hut des Hauptentwicklers von OPAR auf: Ja, jeder kann unter Verwendung eines Pseudonyms Pakete veröffentlichen. OPAR ist als CPAN-Pendant für OTRS gedacht. Denn je mehr Entwickler ihre Leistungen der Allgemeinheit bereitstellen, um so besser kann das einzelne OTRS werden. Warum muss für jedes OTRS so etwas wie MultiSMTP neu entwickelt werden? Jeder soll doch von den Erfahrungen und Entwicklungen der anderen profitieren.

Ohne jegliche Sicherheitsprüfung? Jein. Ich habe Perl::Critic::OTRS geschrieben (das anscheinend auch bei der OTRS AG bzw. einigen Entwicklern dort genutzt wird), bei dem auch auf Systemaufrufe geprüft wird. Also nicht ganz ohne einen kleinen Blick auf die Sicherheit zu werfen. Ich würde gerne noch mehr machen, aber der Tag hat nur 24 Stunden.

Aber @OTRS_AG: Wie wäre es, wenn ihr alle Module auf OPAR kostenlos verifizieren würdet (auch ohne Contributor Agreement etc)? Das wäre eine super Sache für die Community!

Der Admin in einem kleinen Unternehmen der eine kleine Erweiterung geschrieben hat, möchter sicherlich kein Geld ausgeben um diese Erweiterung verifizieren zu lassen...

Was ich mir wünschen würde:

  • Ein echter Dialog mit der Community und den Drittanbietern
  • Eine Offenlegung der Kriterien der Verifizierung
  • Die Möglichkeit, dass man selbst Pakete verifizieren kann
  • Die OTRS AG als echter Teil der Community
  • und noch vieles mehr...

Tuesday, May 28, 2013

Neue Version von Perl/Tk - Tk-804.031

Eine neue Version von Perl/Tk ist da!

Am 25.05.2013 wurde Tk v804.031 veröffentlicht. Interessant für alle die gerne mit GUIs in Perl/Tk arbeiten.
Mein letzter Blick auf Tk in CPAN ist schon etwas her. Die Dokumentation sieht mittlerweile ganz schön aus.

Neben einer umfangreichen Einführung in Tk sind die verschiedenen Widgets und Tk-Funktionen übersichtlich aufgeführt: http://search.cpan.org/~srezic/Tk-804.031/Tk.pod

Wer Probleme bei der Installation hat - z.B. unter Windows mit ActiveState Perl via cpan-Shell, der wird in der entsprechenden Readme fündig: http://cpansearch.perl.org/src/SREZIC/Tk-804.031/README-ActiveState.txt
Vielleicht gibt es ja schon bald ein fertiges PPM-Paket.

(der Daumen stammt aus der Open Icon Library)


Monday, April 01, 2013

Buttons mit Bild in Perl/Tk und Tkx

Heute stand ich vor der Aufgabe in Tkx einen Button mit Bild umzusetzen. Wie das in Tk geht, wusste ich noch. Bei Tkx betrat ich Neuland. Wie es gemacht werden kann, wird in diesem kurzen Artikel aufgezeigt.

Button mit Bild in Perl/Tk

 "Wie das in Tk geht, wusste ich noch." 

#!perl

use strict;
use warnings;
use Tk;
use Tk::PNG;

my $png_image_file = 'media-playback-start-7.png';

my $mw = Tk::MainWindow->new();

my $pic = $mw->Photo(-file => $png_image_file);
my $btn = $mw->Button(

    -text => "Button mit PNG-Datei als Bild",
    -compound => 'top',
    -image => $pic,
);
$btn->pack(-padx => 10, -pady => 10,);

$mw->MainLoop();
exit(0);


Da das Bild eine PNG-Datei war, muss ein entsprechender Loader für Tk eingebunden werden:

use Tk::PNG;

Anschließend wird per Tk::Photo ein Bild-Objekt erzeugt: 

my $pic = $mw->Photo(-file => $png_image_file);

Damit sowohl der Text als auch das Bild angezeigt werden, wird die compound-Option des Buttons angegeben. Der Wert 'top' gibt an, dass sich das Bild oberhalb des Textes befinden soll:

my $btn = $mw->Button(
    -text => "Button mit PNG-Datei als Bild",

    -compound => 'top',
    -image => $pic,
);


Das Ergebnis sieht wie folgt aus:





Button mit Bild in Tkx

Die größte Herausforderung für mich bestand darin, herauszufinden, wie man den Loader für PNG-Dateien in Tkx angibt. Ohne diesen Loader erhält man folgende Fehlermeldung:

couldn't recognize data in image file "<some_png_file_name.png>" at <path_to_script.pl> line <line_number>.

Die Meldung von Perl/Tk gestaltet sich ähnlich: " couldn't recognize data in image file"

Ist die Hürde jedoch überwunden, kann man mit nachfolgendem Code wunderschöne Bilder-Buttons erstellen:

#!perl

use strict;
use warnings;
use Tkx;
Tkx::package_require('img::png');

my $png_image_file = 'media-playback-start-7.png';

my $mw = Tkx::widget->new(".");

Tkx::image_create_photo( 'pic', -file => $png_image_file);
my $btn = $mw->new_ttk__button(

    -text => "Button mit PNG-Datei als Bild",
    -compound => 'top',
    -image => 'pic',
);
$btn->g_pack(-padx => 10, -pady => 10,);

Tkx::MainLoop();
exit(0);


Das Button mit Bild in Perl/Tkx sieht auf Windows 8 so aus:


Quellen

Das Bild stammt aus der Open Icon Library: http://openiconlibrary.sourceforge.net

Saturday, March 23, 2013

Jenkins + nginx

Nur als Notiz für mich selbst:

Nach der Umstellung von Apache auf nginx als Reverse Proxy konnte ich im Jenkins keine Pakete mehr manuell bauen. In den Logs war dann folgendes zu finden:

Mar 23, 2013 5:21:08 PM hudson.security.csrf.CrumbFilter doFilter
WARNING: No valid crumb was included in request for /job/GPW/build. Returning 403.

Bei AJAX-Requests wird ein Header ".crumb" mitgeschickt - zum Schutz vor CSRF. nginx filtert aber invalide Header raus. Ein Workaround wäre, bei nginx das Filtern auszuschalten. Will ich aber nicht. Deswegen einfach in der /etc/init.d/jenkins einfach den Aufruf etwas anpassen:

[...]$JAVA $JAVA_ARGS -Dhudson.security.csrf.requestfield=X-Jenkins-crumb -jar $JENKINS_WAR $JENKINS_ARGS[...]

Damit wird der Header X-Jenkins-crumb verwendet. Und alles funktioniert wieder...

Tuesday, March 05, 2013

Frankfurt.pm // German Perl-Tour Teil 2

Heute gab es den zweiten Teil meiner "German Perl Tour 2013". Zur Erinnerung: Ich habe vor, in diesem Jahr in 8 deutschen Städten an Perlmonger-Treffen teilzunehmen. Nachdem ich im Februar bei den Hannover Perlmongers war, stand heute ein Heimspiel auf dem Plan: Frankfurt.pm

Max und ich haben uns schon etwas früher getroffen, um ein paar Arbeiten für den Deutschen Perl-Workshop in der nächsten Woche zu erledigen: Rechnungen müssen bezahlt werden, iZettle muss aktiviert werden, Listen wer bezahlt hat und wer nicht müssen ausgetauscht werden und noch ein paar Kleinigkeiten mehr. Da fällt mir ein: Wir sind immer noch auf der Suche nach einem Austragungsort für den Perl-Workshop 2014. Welche Perlmonger Gruppe möchte diese Aufgabe übernehmen? Ein paar Aufgaben habe ich mal bei Perl-Community.de gesammelt.

So nach und nach sind noch weitere Perlmonger in die MoschMosch Nudelbar in den Baseler Arkaden gekommen. Auch einen Neuzugang hatten wir heute zu verzeichnen. Herzlich Willkommen, Udo. Wir würden uns freuen, wenn Du jetzt häufiger bei uns auftauchen würdest.

Anfangs haben Thomas, Max und ich noch unsere "Jahresplanung" gemacht. Bei welchen Events wollen wir dabei sein und was wollen wir dort anstreben... So wollen wir versuchen, auf der diesjährigen FrOSCon (24./25. August 2013 in St. Augustin) einen Stand zu bekommen und auch wieder einen Perl Dev-Room zu füllen. Sollten wir den Raum bekommen, wollen wir dort Workshops z.B. zu Mojolicious und/oder Dancer anbieten. Außerdem wollen wir versuchen, zwei oder drei Perl-Vorträge ins Hauptprogramm zu bekommen. Aber noch gibt es keinen "Call for Papers" und "Call for Projects". Wir werden unsere Vorschläge einreichen wenn es soweit ist und hoffen, dass uns die FrOSCon-Orgas wohlgesonnen sind ;-)

Weitere Events sind in der nächsten Woche die Chemnitzer LinuxTage, bei denen Thomas und ich als Teilnehmer dabei sind. Ich werde dann von dort berichten.

Eine weitere Veranstaltung, an der wir teilnehmen wollen ist die OpenRheinRuhr, die nach einem Jahr Pause in diesem Jahr wieder stattfindet.

Gerade bei den FrOSCon-Überlegungen ist Thomas zu der Idee gekommen, dass es ein zentrales Repository mit Schulungsunterlagen und Vorträgen für solche Events geben sollte. Warum sollten wir nicht von den Erlanger Vorbereitungen für den Dancer-Workshop auf den Chemnitzer LinuxTagen oder von rhaens Vorbereitungen des Mojolicious/Moo-Workshops profitieren? Wir würden auch anderen unsere Vorbereitungen zur Verfügung stellen. Ich  werde mich auf dem Perl-Workshop mal mit den anderen darüber unterhalten...

Ich habe auch kurz vom Orgatreffen für das "Große Usergruppentreffen" im Juni berichtet. Dort wollen wir Frankfurt Perlmongers auch vertreten sein.

Auch Nicht-Perl-Themen haben einen Platz bei uns. So war das Milliardenloch der Deutschen Bahn in Stuttgart und das Urteil zu den Regionalbahnhöfen sowie die tollen Anzeigen bei Verspätungen ein Thema. Wobei ich ja immer noch ganz gerne mit der Bahn fahre, so dass ich - wie jetzt auch - Blogartikel oder Artikel fürs Perl-Magazin schreiben kann.

DE-Mail war ein weiteres Thema, und hier haben wir uns gefragt, warum man denn so ein Postfach haben sollte. Dass Behörden und (Versicherungs-)Wirtschaft davon profitieren ist klar, aber für den Verbraucher gibt es in meinen Augen nur "Pseudovorteile".

Weitere Themen des Treffens:

 * Ingres-Game von Google
 * XML-Erzeugung auf Basis eines XML-Schemas, z.B. mit XML::Compile
 * Rechtsschutzversicherungen
 * Berlin vs. Kanada ;-)
 * (Humanoide) Roboter, Drohnen, Einsatz der Roboter
 * Rex, OTRS und CMDB
 * SAP-Einführung, SAP von Perl aus ansprechen
 * COBOL
 * Moe, Groovy, JVM
 * und vieles mehr

Für mich war es ein Frankfurt.pm-Treffen nach längerer Pause. Es hat wieder Spaß gemacht und heute ein neues Gesicht begrüßen zu dürfen war schön. Es dürfen ruhig noch mehr werden ;-)

Friday, March 01, 2013

Perl@Chemnitzer LinuxTage 2013

Wer auf dem Deutschen Perl-Workshop noch nicht genug von Perl bekommt, der kann direkt weiterfahren nach Chemnitz.

Auf den Chemnitzer LinuxTage (16./17. März) gibt es einen Perl-Stand, einen Perl-Vortrag von lichtkind und einen Dancer-Workshop.

Dank an die Erlanger Perlmongers, die den Stand betreuen und den Workshop halten (weitere Hilfe am Stand ist natürlich gern gesehen).

Ich selbst werde am 16. März auch vor Ort sein, mich mit Freunden von c.a.p.e IT und der OTRS-Community treffen und auch ein wenig am Perl-Stand verweilen.

Wednesday, February 27, 2013

Snippets Teil 1 - 100 Distributionen mit den meisten "++" auf MetaCPAN

Mojolicious ist ein Modul, das gewisse Diskussionen auslöst. Zum Einen hat es den Vortreil, dass es alle notwendigen Module mitliefert und somit keine Abhängigkeiten (außer Perl > 5.10) hat, zum Anderen nutzt es nicht CPAN.

Klingt paradox, aber genau so ist es. Viele sagen, dass Mojolicious Anti-CPAN ist und damit die Anti-CPAN-Haltung einiger Unternehmen unterstützen würde. Im Perl-Weekly Newsletter #64 sind ein paar Blogposts zu dem Thema verlinkt.

Ich kann die Argumente nachvollziehen, aber ich persönlich finde es auch eine Stärke von Mojolicious. Man kann das Modul sehr einfach auch auf Shared Webhosting Paketen installieren - man muss nicht erst noch die ganzen Abhängigkeiten installieren.

Außerdem hat Sebastian Riedel ganze Arbeit geleistet. Die Module, die die Basisarbeiten machen, sind ausgereift und haben einige nette Features. Eines der Module, die ich im Moment am häufigsten verwende ist Mojo::UserAgent (und hat damit LWP::UserAgent abgelöst). Gerade wenn ich irgendwelche JSON-APIs von Webseiten abfragen möchte, ist es schnell und einfach. Und ich kann aus der Antwort schon direkt den geparsten JSON-Part holen und mit einem Auszug daraus arbeiten.

Hier ein Beispiel wie man die Distributionen auf MetaCPAN bekommt, die die meisten "++" bekommen haben:



#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;

my $res = $ua->post(
    'http://api.metacpan.org/v0/favorite/_search' => json => {
          "query" => { 
            "match_all" => {}
           },
          "facets" => { 
            "leaderboard" => {
              "terms" => {
                "field" => "distribution",
                "size"  => 100
          } } },
          "size" => 0
    }
);

my $terms = $res->res->json( '/facets/leaderboard/terms' );
say $_->{term} for @{$terms};

Saturday, February 23, 2013

Hilfe beim Auffinden von Typos

Für mich ist es recht wichtig, dass Kommentare und Dokumentation keine Rechtschreibfehler haben. Leider lässt sich das nicht immer verhindern. Um in OTRS möglichst viele Fehler auszumerzen habe ich mir ein kleines Hilfsskript geschrieben.

Ich habe vorher noch Text::Aspell installiert, damit es das Wörterbuch etc. von aspell verwendet.


#!/usr/bin/perl

use strict;
use warnings;

use feature 'say';

use PPI;
use Search::Tools::SpellCheck;
use File::Basename;
use File::Find::Rule;
use List::Util qw(first);

my $dir = $ARGV[0];

if ( !$dir || !-d $dir ) {
    say "$0 ";
    exit;
}

my @files = File::Find::Rule->file->in( $dir );

my $spellchecker = Search::Tools::SpellCheck->new(
    max_suggest => 4,
    lang        => 'en_US',
);

FILE:
for my $file ( @files ) {

    # skip hidden files
    my $filename = basename( $file );
    next FILE if $filename =~ m{ \A \. }xms;

    # skip some files
    next FILE if first{ $filename eq $_ }( qw/INSTALL INSTALL.SuSE INSTALL.RedHat README CHANGES/ );
   
    # skip some files based on path
    next FILE if $file =~ m{/scripts/}xms;
    next FILE if $file =~ m{/Language/}xms;

    # skip some file types (based on suffix)
    next FILE if $file =~ m{ \.(?:gif|png|js) \z }xms;

    # check for typos in comments
    my $comments = extract_comments( $file );
    if ( $comments ) {
        $comments =~ s/note:/note/;

        eval {
            my $suggestions_for_comments = $spellchecker->suggest( $comments ) || [];
            print_suggestions( $file, $suggestions_for_comments );
        };
    }

    # skip if the file if it's not a perl file
    next FILE if $file =~ m{ \.(?:pm|pl) \z }xms;

    # check for typos in pod
    my $pod = extract_pod( $file, {} );
    if ( $pod ) {
        $pod =~ s/note:/note/;

        eval {
            my $suggestions_for_pod = $spellchecker->suggest( $pod ) || [];
            print_suggestions( $file, $suggestions_for_pod );
        };
    }
}

sub print_suggestions {
    my ($file, $suggestions) = @_;

    return if !@{ $suggestions };

    say $file, ':';
    for my $suggestion ( @{ $suggestions } ) {
        next if ref $suggestion ne 'HASH';
        next if first{ $suggestion->{word} eq $_ }(qw/agpl txt otrs ag www html/);
        next if $suggestion->{word} =~ m{ \A (?:\d+|\d+-\d+(?:-\d+)?) \z }xms;
       
        say $suggestion->{word}, ' -> ', join ' __ ', @{$suggestion->{suggestions}} 
            if $suggestion->{suggestions} &&; @{ $suggestion->{suggestions} };
    }
}

sub extract_comments {
    my ($file) = @_;

    return if !$file || !-f $file;

    my $content = '';

    if ( open my $fh, '<', $file ) {

        while ( my $line = <$fh> ) {
            my  ($comment) = $line =~ m{ [#](.*) }xms;
            next if !$comment;

            $content .= ' ' . $comment;
        }
    }

    return $content;
}

sub extract_pod {
    my ($file, $config) = @_;

    return if !$file || ! -f $file;

    my $content;

    if ( open my $fh, '<', $file ) {

        if ( $config->{encoding} ) {
            binmode $fh, ':encoding(' . $config->{encoding} . ')';
        }

        local $/;
        $content = <$fh>;
    }

    my $pod = extract_pod_from_code( $content );

    return $pod;
}

sub extract_pod_from_code {
    my ($code) = @_;

    return if !$code;

    my $parser    = PPI::Document->new( \$code );

    return if !$parser;

    my $pod_nodes = $parser->find(
        sub {
             $_[1]->isa( 'PPI::Token::Pod' );
        },
    );

    my $merged = PPI::Token::Pod->merge( @{$pod_nodes || []} );

    return '' if !$merged;
    return $merged->content;
}



Einige Dateien musste ich rausnehmen, weil Search::Tools::SpellCheck ziemlich schnell Fehler wirft. Das ist auch der Grund, warum ich dann "eval" benutzt habe...

Wer noch Ideen hat, wie man das ganze verbessern kann, dann immer her damit. Das Prozedere hat noch einige Schwächen, weil auch Sachen wie "AG", "AGPL", "HTML" etc. agemeckert wird. Dadurch bekommt man ziemlich viele "False Positives" und man muss bei einem Projekt wie OTRS einige zehntausend Zeilen durchschauen um die wirklichen Fehler zu finden.

Es werden auch einige Fehler nicht gefunden...

Thursday, February 14, 2013

Hannover.pm // German Perl-Tour Teil 1

Ich habe mir für 2013 vorgenommen, an Perlmonger-Treffen in mindestens 8 deutschen Städten teilnehmen. Ich finde es immer wieder spannend, andere Gruppen zu treffen und zu sehen was in anderen Städten so
los ist.

Auf Grund Arbeit und Familie war mein erstes Perlmonger-Treffen 2013 nicht in Frankfurt, sondern in dieser Woche in Hannover. Ich war hier vor Ort, weil ich hier eine Perl-Schulung gehalten habe. Das Treffen von Hannover.pm fand dann am 13.02. im PSV Hannover statt. Laut Doodle waren "nur" 6 Personen angemeldet, aber im Endeffekt waren wir zu acht.

Was mir sehr gut gefallen hat war, dass die Gruppe immer/meistens einen extra Nebenraum mit großen Fernseher hat. Man ist in einer Gaststätte (hat damit Verpflegung), hat aber Ruhe um sich zu unterhalten und mit dem großen Fernseher kann man auch mal spontan etwas zeigen.

Delticom, einer der Sponsoren des Deutschen Perl-Workshops, war mit drei Mann ganz stark vertreten. Reifen habe ich online zwar noch nicht gekauft, aber gut zu wissen, dass reifendirekt.de mit Perl umgesetzt wurde.

Ansonsten war noch Wolfgang von heise da und wo die drei anderen gearbeitet haben, habe ich leider wieder vergessen.

burnersk hat eine kurze Tech-Demo gegeben: Er hat eine kleine Anwendung mit Dancer und DBIx::Class geschrieben. Für mich war das interessant, weil ich eher zu den Mojolicious-Anhängern gehöre und noch nicht so viel mit Dancer zu tun hatte.

Es sah ganz nett aus, da Dancer mir -- soweit ich weiß -- keinen Vorteil bringt, bleibe ich bei Mojolicious. Aber der Vortrag hat mich auch wieder daran erinnert, dass ich mit Corion mal einen kleinen Dancer/Mojolicious-Shootout machen wollte.

Jedenfalls will burnersk mit der Anwendung seine "Haushaltsausgaben" tracken und sich dann Einsparvorschläge machen lassen.

Nach dem Essen habe ich kurz ein paar Sachen von mir vorgestellt: Zum einen OPAR, einem Repository für freie OTRS-Erweiterungen. Eigentlich habe ich das nur kurz vorgestellt, weil einer der Anwesenden erzäht hat, dass "sein Unternehmen" OTRS einsetzt. Wir haben uns auch kurz darüber unterhalten, dass es nicht so einfach ist, Patches im OTRS-Kern unterzubringen.

AUf der OTRS-Mailingliste habe ich jetzt gelesen, dass das OTRS-Repository auf Github.com wandern soll. Dann wird es hoffentlich einfacher, Patches einzureichen und dass diese auch in den Kern eingepflegt werden.

Nach OPAR habe ich dann perlybook.org vorgestellt. Mit dieser Seite kann man die Dokumentationen von CPAN-Modulen als ebook (.mobi oder .epub) bekommen.

burnersk hat seinen E-Book-Reader rausgeholt und mal kurz gezeigt, wie die Dokumentation dann auf so einem Reader aussieht. Es macht mir natürlich Freude zu sehen, dass perlybook.org tatsächlich verwendet wird (und nicht nur von mir).

Auch die Perl-Tutorials von perltuts.com gibt es hier als EBooks. Vielleicht auch mal hier der Aufruf an alle, Ideen zu liefern was man noch so einbinden könnte. Wir können relativ einfach alle POD-Quellen einbinden,
Aktuell arbeite ich in meiner Freizeit an einer GithubT-Integration. Viel Dokumentation findet man einfach auf Github. Auch die Texte für den Perl-Adventkalender liegen dort.

Wo wir schon bei Github waren, habe ich auch gleich auf ein Modul hingewiesen, das momentan nur auf Github und nicht auf CPAN zu finden ist: Excel-Reader-XLSX von John McNamara (der auch Spreadsheet::WriteExcel macht). Es gibt zwar einen XLSX-Parser auf CPAN, aber der verbraucht extrem viel Speicher. Bei einem Kunden hat das mal den gesamten Server lahmgelegt. John McNamara sagt zwar, dass das Modul noch im Beta-Status ist, aber es funktioniert einwandfrei.

Ansonsten haben wir uns viel über Ausbildung, (schlechte) Berufsschulen und die aktuelle Situation von Unternehmen die Perl-Programmierer suchen. Es ist für diese immer noch sehr schwer wirklich Perl-Leute zu finden.

Weitere Themen, die mir jetzt so spontan einfallen:

 * Stackoverflow
 * Perlprogrammierende Inder
 * Hotels/Hostels in Hannover
 * airbnb

Mir hat das Treffen viel Spaß gemacht und ich freue mich, einige im nächsten Monat auf dem Deutschen Perl-Workshop wiederzutreffen. Danke @HannoverPM

Monday, February 11, 2013

Helau! - Frühjahrsausgabe des Perl-Magazins ist da...

In wenigen Tagen beginnt die Fastenzeit, aber auf das Perl-Magazin muss man nicht verzichten. Die Frühjahrsausgabe 2013 des Perl-Magazins (http://perl-magazin.de) ist da...


Inhalt dieser Ausgabe:

 * Ist Dein Code Perl-5.18-sicher?

   Am Hashing ändert sich in Perl 5.18 einiges. Für den normalen Programmierer kaum sichtbar, kann es in wenigen Fällen doch zu Problemen kommen - wenn man sich auf die Reihenfolge von Schlüsseln verlässt.

 * HowTo - Algorithm::CheckDigits

   Thomas Fahle stellt das Modul Algorithm::CheckDigits vor, dass die Überprüfung von Prüfziffern z.B. von ISBN oder Kreditkarten umgesetzt werden kann.

 * SEX: Stream EXchange mit F*EX

   Mit F*EX können beliebig große Dateien an beliebige Empfänger verschickt werden. Ullrich Horlacher stellt mit SEX eine Erweiterung vor, mit der ein Datenstrom an einen Empfänger geleitet werden kann.

 * Mojolicious Tutorial - Teil 2

   In diesem Teil des Mojolicious-Tutorials wird das erste Formular umgesetzt. Dabei wird auch gezeigt, wie man auf die unterschiedlichen Parameter (Route, GET und POST) zugreifen kann. Außerdem werden die Unterschiede verschiedener Umgebungen aufgezeigt. Schließlich werden noch die ersten Plugins für Mojolicious vorgestellt.

 * Synchrone Operationen sind überholt

   SawyerX gibt eine Einführung in asynchrone Programmierung. Dazu verwendet er das Modul AnyEvent.

 * Rezension - Leidenschaft und Perl

   Auch in dieser Ausgabe stellt Herbert Breunung zwei Bücher vor: Der leidenschaftliche Programmierer ist kein Perl-Buch, könnte aber trotzdem interessant sein. Perl ist ein Buch aus dem mitp-Verlag -- genau wie das erstgenannte Buch -- das eine Einführung in Perl gibt.

 * Rezension - SQL Performance Explained

   Das Buch "SQL Performance Explained" wird vorgestellt.

 * TPF News

   Jede Menge Neuigkeiten aus der Perl Foundation.

 * CPAN-News

   Neben zwei ausführlicheren Vorstellungen werden wieder vier weitere neue Module auf dem CPAN vorgestellt.

Tuesday, January 29, 2013

Die Veranstaltungszeit beginnt

Hallo Perl-Freunde,

das Jahr ist gerade 4 Wochen alt, da beginnt schon die Veranstaltungssaison:

* FOSDEM mit Perl Dev-Room (2. & 3. Februar)
* 15. Deutscher Perl-Workshop (13.-15. März)
* Chemnitzer LinuxTage (16. & 17. März)
* 1. Schweizer Perl-Workshop (22. März)
* LinuxInfo Tag Augsburg(23. März)


FOSDEM
------

Die FOSDEM ist eine der größten Veranstaltungen rund um Free und Open Source Software. Nachdem es in den ersten Planungen keinen Perl-Raum gegeben hat und kurzfristig eine andere Entwicklergemeinde absagen musste, wurden kurzfristig Vorträge für einen Perl-Raum gesucht. Der Plan ist jetzt online:

https://fosdem.org/2013/schedule/track/perl/



15. Deutscher Perl-Workshop
---------------------------

Die älteste Perl-Konferenz findet zum 15. Mal statt -- diesmal vom 13. bis 15. März in Berlin. An drei Tagen gibt es jede Menge Vorträge und viel Gelegenheit, sich mit anderen Perl-Leuten zu unterhalten.


http://act.yapc.eu/gpw2013/

Mittlerweile ist der Ticketkauf freigeschaltet, also nichts wie hin ;-)



Chemnitzer LinuxTage
--------------------

Direkt im Anschluss an den Deutschen Perl-Workshop kann man weiter nach Chemnitz fahren und den Chemnitzer LinuxTagen beiwohnen. Hier wird es einen Perl-Stand geben und einige Erlanger Perlmongers bereiten einen Dancer-Workshop vor.

http://chemnitzer.linux-tage.de/2013/



1. Schweizer Perl-Workshop
--------------------------

Eine neue Perl-Veranstaltung erblickt das Licht der Welt: am 22. März findet in Bern der erste Schweizer Perl-Workshop statt. Unterstützt unsere eidgenössischen Perl-Freunde und schaut auf dem Workshop vorbei.

http://act.perl-workshop.ch/spw2013/



LinuxInfo Tag Augsburg
----------------------

Von Bern aus geht es direkt nach Augsburg ;-) Am 23. März findet an der Hochschule Augsburg der Linux Infotag statt. Ulrich Habel wird dort einen Workshop zu Moo und Mojolicious halten. Die Teilnahme am Linux Infotag ist kostenlos.

http://www.luga.de/Aktionen/LIT-2013/

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

Friday, December 23, 2011

Mein Perl-Jahr 2011

Wie in den vergangenen Jahren, möchte ich auch in diesem Jahr wieder einen kleinen Rückblick auf mein Perl-Jahr geben. Eins schon vorneweg: Es ist viel passiert und ganz toll verlaufen, aber von vorne...

Januar:
  • Die Smart-Websolutions GbR wurde aufgelöst und ich mache alleine unter Perl-Services.de weiter. Das bringt auch besser zum Ausdruck, was ich mache: Alles rund um Perl ;-)
  • Ich starte planet.perl-magazin.de, ein Aggregator für deutschsprachige Perl-Blogs. Wer noch solche Blogs kennt, meldet sie mir bitte.
  • Ein großes Projekt steht an: OTRS-Einführung und -Anpassungen für ein Bankennahes Unternehmen.
  • Meine Zeit bei der OTRS AG endet.

Februar:

März:
  • Ich habe wieder Zeit für einen Vortrag auf der CeBIT bekommen. Ich nutze das, um das Repository für OTRS-Erweiterungen (OPAR) vorzustellen.
  • Für einen eigenen Perl-Stand bei den Chemnitzer LinuxTage war es zu spät, aber wir waren mit am Stand der OTRS-Community. Außerdem habe ich einen Vortrag über Perl::Critic gehalten.

April:
  • Ich bin wieder bei etecture aktiv. Es ist schön, wenn man immer wieder vertraute Gesichter sieht.

Mai:
  • Die 18. Ausgabe von $foo erscheint

Juni:
  • Ich fahre zum 2. OTRS-Usertreffen in Dormagen und halte einen Vortrag über OPAR

August:
  • Die 19. Ausgabe von $foo erscheint
  • Es wird ein Spendentopf für Perl 5 eingerichtet. Ich finde das eine super Sache und gebe den Gewinn vom Perl-Magazin der Perl Foundation. Vielen Dank an die Leser!
  • Ich bin bei der YAPC::EU 2011 in Riga - mal wieder ein haufen netter Leuter und interessanter Vorträge. Wir haben uns um die Ausrichtung der nächsten YAPC beworben - und gewonnen. Die Frankfurt Perlmongers freuen sich schon auf möglichst viele Besucher im nächsten Jahr!
  • Direkt aus Riga geht es weiter nach St. Augustin zur FrOSCon - Dort gibt es wieder einen Perl-Stand und einen Developer Room. Für das nächste Jahr planen wir, das etwas anders aufzuziehen.

September:

Oktober:

November:
  • Die 20. Ausgabe von $foo erscheint
  • Ich bin zum ersten Mal auf der OpenRheinRuhr. Ich bin nicht nur einfach ein Sponsor, nein, wir haben die $foobar gesponsort. Wir haben dort auch wieder einen Perl-Stand.
  • Die Frankfurt Perlmongers gründen einen Verein. Wir machen schon relativ viel in Sachen Perl (Ausrichten von Perl-Veranstaltungen, Teilnahme an anderen Veranstaltungen, Perl-Stände an Veranstaltungen, etc.) und nächstes Jahr richten wir die YAPC::Europe aus. Eine gute Gelegenheit, einen Verein zu gründen, um alles auf eine solidere Basis zu stellen.
  • Der dritte Mitarbeiter bei Perl-Services.de fängt an.

Dezember:
  • Noch 7 Projekte bis zum Jahresende... Viel zu tun!

Ich hatte extrem viel zu tun über das Jahr, nicht nur ältere Projekte übernehmen und pflegen, sondern auch einige komplett neue Projekte in Perl realisiert. Einige der Kunden sind auch OpenSource-freundlich und werden sehr wahrscheinlich einiges auf CPAN bzw. OPAR einstellen.

So darf es weitergehen!

Ausblick auf 2012:
Natürlich habe ich schon wieder einiges für das nächste Jahr geplant. Deswegen hier ein Ausblick in Kurzfassung: Teilnahme an mehreren Veranstaltungen wie Dt. Perl-Workshop in Erlangen, FrOSCon in St. Augustin und viele mehr... Start eines englischsprachigen Perl-Magazins, Weiterführung "$foo", Start eines OTRS-Magazins, Organisation YAPC::Europe 2012 in Frankfurt. Viele Perl-Projekte, Durchführen eines OTRS-Workshops direkt nach dem Perl-Workshop in Erlangen,...