Wednesday, September 08, 2010

Mein Log::Log4perl-Vortrag auf der FrOSCon 2010

Etwas verspätet, aber jetzt habe ich es endlich mal geschafft, den Blogartikel über meinen Log::Log4perl-Vortrag zu schreiben.

Ich hatte schon beim CfP für den Perl-Developer-Room die Idee, einen Vortrag über Log::Log4perl zu halten. Dabei war die erste Idee, wie sonst auch die Folien mit OpenOffice zu machen. Knapp zwei Wochen vor der FrOSCon hat Thomas Fahle dann einen Blogpost über Gtk2::Notify und Log::Dispatch::Gtk2::Notify veröffentlicht. Der hat mich auf die Idee "Warum einen Logging-Vortrag nicht mit Logging realisieren" gebracht. Ich konnte ja nicht ahnen, dass das jede Menge Arbeit bedeutet.

Meine Idee war es, die Folieninhalte in einer YAML-Konfiguration festzulegen und dann die Inhalte in Notifications darzustellen. Das ganze sollte in einer Ubuntu-VM passieren. Also dort ein Testskript für Notifications geschrieben:

 #!/usr/bin/perl
use warnings;
use strict;

use Gtk2::Notify -init, 'testapp';

for my $x ( 0 .. 3 ) {
my $notification = Gtk2::Notify->new( 'Hallo', 'Test' . $x );
$notification->set_hint_int32( 'x', $x * 100 );
$notification->set_hint_int32( 'y', $y * 50 );
$notification->set_timeout( 12_000 );
$notification->show;

sleep int rand 10;

$notification->close;
}


Notifications werden angezeigt, aber das Ausblenden und das Bestimmen der Position funktioniert nicht, außerdem war die Breite der Notifications fest. Der Daemon für die Notifications war Notify-OSD. Dann habe ich ein Tool gefunden, mit dem ich wenigstens die Breite der Notifications beeinflussen konnte. Aber die anderen Probleme blieben. Damit war es nicht wirklich tauglich für den Vortrag.

Von einem Kollegen habe ich dann den Tipp mit notification-daemon aus dem Galago-Projekt bekommen: Ausblenden funktioniert, Position bestimmen funktioniert. Aber wieder feste Breite. In den Sourcen habe ich gesehen, dass die Themes das hardcodiert haben. Also anpassen und selbst kompilieren.

Dafür waren zig Sachen notwendig, die teilweise nicht in den Repositories waren und auch selbst kompiliert werden mussten. Das hat alles seine Zeit gebraucht. Nachdem ich ein extra Theme erzeugt hatte und das im notification-daemon aktiviert hatte, waren die Vorbereitungen abgeschlossen.

Der Code für das Theme und das kompilierte Paket sind in dem Paket zu dem Vortrag zu finden.

Die Vortragsfolien habe ich - wie schon gesagt - in einer YAML-Datei abgelegt.

 ---
slides:
-
summary: Perl@FrOSCon 2010
body: Logging für Perl-Programme
-
summary: Logging - allgemein
body: Ein Protokoll, was während des Programmlaufs so alles passiert.


Ein Skript liest diese Datei aus und blendet mit Log::Log4perl die Notifications ein. Das schon existierende Log::Dispatch::Gtk2::Notify konnte ich allerdings nicht benutzen, weil es die Notifications nicht so lange offen hält bis die nächste Notification angezeigt werden soll. Es macht sich in einem Vortrag natürlich schlecht, wenn mitten im Satz die Notification mit den Informationen verschwinden. Also noch ein neues Modul geschrieben...

 package Log::Log4perl::Appender::Notification;

our @ISA = qw(Log::Log4perl::Appender);

use warnings;
use strict;
use Log::Log4perl::Config::Watch;
use Gtk2::Notify -init, 'Perl@FrOSCon';

my $notification;

sub new {
my($class, @options) = @_;

my $self = {
name => "unknown name",
@options,
};

bless $self, $class;

return $self;
}

sub log {
my($self, %params) = @_;

return if $params{message} !~ /^SUMMARY/;

$notification->close if ref $notification and $notification->isa( 'Gtk2::Notify' );

my ($summary,$body) = $params{message} =~ m{
SUMMARY: \s+ (.*?) \s+
BODY: \s (.*)
}xms;

my $icon = '/usr/share/app-install/icons/podbrowser.png';
if ( $summary eq 'Frage' ) {
$icon = '/usr/share/icons/gnome/32x32/status/dialog-question.png';
}
elsif ( $summary eq 'Antwort' ) {
$icon = '/usr/share/icons/gnome/32x32/status/dialog-warning.png';
}

$notification = Gtk2::Notify->new( $summary, $body, $icon );
$notification->set_timeout( 1_000_000 );
$notification->set_hint_int32( 'x', 0 );
$notification->set_hint_int32( 'y', 20 );

$notification->show;
}

1;


Wie kann ich durch die Folien "navigieren", wie kann ich auf Fragen reagieren? Also musste das Skript, das die "Folien" anzeigt, noch mehr können. Mit IO::Prompt habe ich dann immer eine Tastatureingabe abgefangen und dann darauf reagiert.

   # ask for any input to show the next slide.
prompt -1, -echo=>'';

if ( $_ eq 'd' ) {
$counter--; # we want a former slide
}
elsif ( $_ eq 'q' ) {
my $summary = 'Frage';
chomp( my $body = );
splice @slides, ++$counter, 0, { summary => $summary, body => $body };
}
elsif ( $_ eq 'a' ) {
my $summary = 'Antwort';
chomp ( my $body = );
splice @slides, ++$counter, 0, { summary => $summary, body => $body };
}
else {
$counter++;
}

Insgesamt ziemlich viel Aufwand für einen einzelnen Vortrag, aber ich werde den Vortrag auch nochmal auf dem Frankfurter Perl-Community Workshop halten. Bis dahin muss ich wieder eine Erweiterung machen, weil ich nicht nur in Notifications geloggt habe, sondern auch Twitter-Meldungen erstellt habe. Und Twitter erlaubt jetzt nur noch OAuth für die Authentifizierung.

No comments: