Mittwoch, 27. Februar 2008

Talk: Thank A Cpan Contributor Today

Josh McAdams zeigt in seinem Frozen Perl Lightning Talk Thank A Cpan Contributor Today sehr schön auf, was man so alles machen muss, damit aus einer kleinen Idee ein brauchbares CPAN-Modul wird.

Slides



Danke an alle CPAN-Autoren.

Freitag, 22. Februar 2008

Perl 5.10: Switching given when

Switching ist eine der neuen Verbesserungen von Perl 5.10.

Nachfolgend ein paar Beispiele, die den Einstieg ins Perl-Switching erleichtern sollen.

Ein einfaches Beispiel


use strict;
use warnings;
use feature qw/say switch/;

my ($sec,$min,$hour,$day,$month,$year) = localtime();

given ($month) {
when(0) { say "Januar" }
when(1) { say "Februar" }
when(2) { say "Maerz" }
when(3) { say "April" }
when(4) { say "Mai" }
when(5) { say "Juni" }
when(6) { say "Juli" }
when(7) { say "August" }
when(8) { say "September" }
when(9) { say "Oktober" }
when(10) { say "November" }
when(11) { say "Dezember" }
default { warn "Wert $_ ausserhalb des Bereichs 0 bis 11" }
}


  • Die Schlüsselwörter given und when entsprechen den Schlüsselwörtern switch bzw. case in anderen Programmiersprachen.

  • Switching muss explizit angefordert werden: use feature qw/switch/;

  • Das Semikolon (;) am Ende eines when-Blocks wird nicht benötigt.

  • Am Ende des when-Blocks wird automatisch break aufgerufen. Der Switch fällt also nicht, wie in anderen Programmiersprachen, einfach durch. Dieses Durchfallen muss explizit mit continue angefordert werden.

  • Wenn kein Treffer durch when-Vergleiche erzielt wird, kommt die default-Anweisung zum Zug.

  • Alle when-Vergleiche werden gegen $_ ausgeführt. $_ wird automatisch innerhalb des given-Blocks als private (lexikalische) Variable gesetzt.

  • Alle Vergleiche werden, soweit möglich, mittels Smart-Matching ausgeführt.



Beispiel: Switching mittels Smart-Matching und Listen

use strict;
use warnings;
use feature qw/say switch/;

my ($sec,$min,$hour,$day,$month,$year) = localtime();

my @Q1 = (0, 1, 2); # 1. Quartal
my @Q2 = (3, 4, 5); # 2. Quartal
my @Q3 = (6, 7, 8); # 3. Quartal
my @Q4 = (9, 10, 11); # 4. Quartal

given ($month) {
# $_ ~~ @Q1
when ( @Q1 ) { say "1. Quartal" }
# $_ ~~ @Q2
when ( @Q2 ) { say "2. Quartal" }
# $_ ~~ @Q3
when ( @Q3 ) { say "3. Quartal" }
# $_ ~~ @Q4
when ( @Q4 ) { say "4. Quartal" }
default { warn "Wert $_ ausserhalb des Bereichs 0 bis 11" }
}

Siehe dazu auch: Switching in Perl 5.10

Vergleiche, bei denen Smart-Matching nicht möglich ist

Hier muss $_ explizit angeben werden.

use strict;
use warnings;
use feature qw/say switch/;

my ($sec,$min,$hour,$day,$month,$year) = localtime();

given ($month) {
when ( $_ < 3 ) { say "1. Quartal" }
when ( $_ < 6 ) { say "2. Quartal" }
when ( $_ < 9 ) { say "3. Quartal" }
when ( $_ < 12 ) { say "4. Quartal" }
default { warn "Wert $_ ausserhalb des Bereichs 0 bis 11" }
}


Switching mittels Smart-Matching und logische Operatoren

Wie bereits oben beschrieben, wird i.d.R. versucht ein Smart-Matching durchzuführen. Dies gilt jedoch nicht bei der Verwendung logischer Operatoren wie &&, and, ||, or bzw. not. Die Dokumentation ist hier auch nicht ganz einfach verständlich. (Siehe dazu auch: brian d foy - Is there a problem with smart matching, when(), and &&?)

Statt vieler Worte ein Beispiel:
Hier soll gepüft werden, ob sich sowohl ein Treffer im @personen als auch im %personen ergibt. Die u.a. Variante 1 (&&) funktioniert leider nicht. Man muss sich hier mit Variante 2 bzw. 3 behelfen.

use strict;
use warnings;
use feature qw/say switch/;

my @personen = qw/Fred Barney Wilma/;

my %personen = ( Fred => 1,
Barney => 1,
Betty => 1,
);

my @testpersonen = qw( Fred Wilma Barney Betty Pebbles );

foreach my $person (@testpersonen) {
given($person) {
# $_ ~~ @personen
when(@personen) { say "$_ im \@personen"; continue }
# $_ ~~ %personen
when(%personen) { say "$_ im \%personen"; continue }

# Logisches und Variante 1
# Funktioniert *nicht*
when(@personen && %personen) {
say "Variante 1: $_ im \@personen und \%personen";
continue; # Fall through
}

# Logisches und Variante 2
when(@personen) {
when(%personen) {
say "Variante 2: $_ im \@personen und \%personen";
continue; # Fall through
}
continue; # Fall through
}

# Logisches und Variante 3
when($_ ~~ @personen && $_ ~~ %personen) {
say "Variante 3: $_ im \@personen und \%personen";
continue; # Fall through
}

default { say "$_ in Default "}
}
}


Ausgabe:

Fred im @personen
Fred im %personen
Variante 2: Fred im @personen und %personen
Variante 3: Fred im @personen und %personen
Fred in Default
Wilma im @personen
Wilma in Default
Barney im @personen
Barney im %personen
Variante 2: Barney im @personen und %personen
Variante 3: Barney im @personen und %personen
Barney in Default
Betty im %personen
Betty in Default
Pebbles in Default


Anmerkung: Am Ende des given- bzw. when-Blocks wird innerhalb einer while oder foreach-Schleife automatisch next aufgerufen


Beispiel: Guessing Game

Zum Abschluss dieses Artikels ein vollständiges Beispiel, das alle coolen Switch-Features sehr schön verdeutlicht:


use strict;
use warnings;
use feature qw(switch say);

my @guessed;

my $num = int(rand 100)+1;

while (my $guess = <STDIN>) {
chomp $guess;
given($guess) {
when (/\D/) { say "Give me an integer" }
when (@guessed) { say "You've tried that" }
when ($num) { say "Just right!"; last }
when ($_ < $num) { say "Too low"; continue }
when ($_ > $num) { say "Too high"; continue }
push(@guessed,$_);
}
}
# Paul Fenwick http://perltraining.com.au/talks/perl510.odp

Quelle: Paul Fenwick: http://perltraining.com.au/talks/perl510.odp

Fazit:

Wenn man Smart-Matching verstanden hat und ein wenig bei logischen Operatoren aufpasst, funktioniert alles wie gewünscht. Cooles Feature.

Vorhergehende Artikel von mir zu den neuen Features und Verbesserungen in Perl 5.10:

Donnerstag, 21. Februar 2008

Talk: Utility Modules That You Should Know About

Die Slides von Josh McAdams Frozen Perl Vortrag Utility Modules That You Should Know About sind online.



Schöner Vortrag, nicht nur für Einsteiger.

File::Copy
Im Vortrag wird u.a. File::Copy empfohlen. Es gibt allerdings die eine oder andere Situation, in der File::Copy nicht empfohlen werden kann. Siehe dazu Abigail -File::Copy: broken, inflexible, dangerous.

base.pm
Weiterhin geht der Vortrag auf base.pm ein, was nicht immer ganz unproblematisch ist. Siehe dazu Probleme mit base.pm. Als Alternative empfiehlt sich parent.pm.

Frozen Perl: Slides zu den Vorträgen sind online

Die Slides der meisten Frozen Perl Vorträge sind online.

via: brian_d_foy: Frozen Perl talks online

Samstag, 16. Februar 2008

R.E.M. veröffentlicht Videos unter Artistic License 2.0

R.E.M veröffentlicht diverse Videos auf einer eigens eingerichteten Website unter der Artistic License 2.0. (Auf der Website einfach auf das ? klicken, dann erscheint die Lizenz.)

Die als Open Source Lizenz anerkannte Artistic License 2.0 wurde von The Perl Foundation entwickelt.

Ich freue mich sehr darüber, das R.E.M. nicht die für Musik übliche Creative Commons Lizenz verwendet, sondern eine von mir bevorzugte Open Source Lizenz verwendet.

Sound ab:




via:

Freitag, 15. Februar 2008

Shipwright, ein neues code packaging tool von Best Pratical

Best Practical hat das neue Code Packaging Tool Shipwright veröffentlicht (14. Februar 2008).

Shipwright löst beispielsweise alle Abhängigkeiten von CPAN-Modulen automatisch auf und installiert die passenden Module.

In Shipwright fließt die Erfahrung aus zahlreichen Installationen des Produktes RT, das auf 124 CPAN-Modulen beruht, ein.

Ein Test von Best Practical mit Tatsuhiko Miyagawa's Plagger Feed Aggregator, das auf 134 CPAN-Modulen beruht, zeigt, das sich die Installation mit einem Kommandozeilentool-Aufruf erledigen lässt.

Das kann man, so glaube ich, jedem Kunden zumuten.

Die Installation erfolgt in ein temporäres Verzeichnis, der Kunde kann die erstellte Binärdistribution in einen Ordner seiner Wahl verschieben.

Cool.

Mehr Details: Shipwright, our new code packaging tool

Mittwoch, 13. Februar 2008

Perl-Blog von Alvar Freude

Alvar Freude hat passend zum 10. Deutschen Perl-Workshop ein neues Perl-Blog, basierend auf der Open Source Variante von Moveable Type, eröffnet.

(via: Moritz Lenz - Neuer Perl-Blog)

Parallel dazu hat Alvar eine Xing-Gruppe Movable Type: Bloggen und mehr erstellt.

Take your ThinkPad out for a walk to create wireless site surveys

Nathan Harrington hat am 12. Februar 2008 auf developerWorks (IBM) den Artikel Take your ThinkPad out for a walk to create wireless site surveys veröffentlicht.

Wer den HDAPS - IBM Active Protection System Linux Driver oder besser das Tp smapi Kernel Modul auf seinem halbwegs neuem ThinkPad (Das Active Protection System gibt es ab Baujahr 2003) installiert hat, kann jetzt während eines Spaziergangs durch die Wohnung oder das Firmengelände den Beschleunigungssensor und Perl dazu nutzen, die WLAN-Stärke zu messen und zentimeter schrittgenau aufzuzeichnen.

Cool.

Siehe dazu auch: Stefan Fischerländer: WLAN-Stärke ausmessen mit Perl und Beschleunigungssensoren


Weitere Perl-Tricks mit HDAPS gibt Nathan in dem Artikel Knock-based commands for your Linux laptop (25. Juli 2006).

Sonntag, 10. Februar 2008

jobs.perl.org: Report 2007

jobs.perl.org ermöglicht Arbeitgebern die kostenlose Schaltung von Perl-Jobangeboten (Feste und Freie Mitarbeiter).

Report 2007 jobs.perl.org

brian d foy hat freundlicherweise die offiziellen Zahlen schön übersichtlich als Tabelle aufbereitet:


------------------------------------------------------------------------------------------
Year | Total | Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
------------------------------------------------------------------------------------------
2001 | 280 | 0 2 8 21 40 34 33 29 34 30 35 14
2002 | 413 | 34 33 35 16 45 26 37 46 33 42 31 35
2003 | 560 | 43 36 56 56 21 39 44 64 53 52 52 44
2004 | 949 | 75 58 78 88 74 88 82 87 65 87 85 82
2005 | 1429 | 93 110 120 135 135 125 115 113 106 132 144 101
2006 | 1857 | 164 138 157 151 166 153 140 176 152 172 179 109
2007 | 1966 | 182 156 181 190 177 168 176 165 145 179 148 99
------------------------------------------------------------------------------------------

Quelle: The Year in Perl, 2007

Da ein Bild bekanntlich mehr sagt als 1.000 Worte, habe ich aus obiger Tabelle eine kleine, simple Übersichtsgraphik erstellt:


Ob die deutliche Steigerung der Job-Angebote auf einer gestiegenen Nachfrage nach Perl-Programmieren beruht und/oder einfach nur auf dem im Lauf der Jahre gestiegenen Bekanntheitsgrad von jobs.perl.org, lässt sich schwer sagen.

Syndication
Zusätzlich können die Jobangebote via JavaScript oder RSS auf Websites eingebunden werden.

Beispiel: Fünf bundesdeutsche Jobangebote via JavaScript einbinden

<script language="JavaScript"
src="http://jobs.perl.org/rss/by_country.js?country=Germany&limit=5">
</script>

Genau so werden die Angebote seit heute in diesem Blog eingebunden.

Siehe auch:

Donnerstag, 7. Februar 2008

Perl is now Y2038 safe

Vielen wird das Jahr-2038-Problem egal sein, da Apophis ohne hin im Jahre 2036 oder 2037 die Erde zerstört. (Ich hasse solche Tage, wirklich.)

Michael Schwern hat einen Patch für das Jahr-2038-Problem veröffentlicht. Der Patch soll auch für frühere Perl-Versionen zurückportiert werden.

Systemtest

Wer sein 32-Bit-Betriebssystem einmal testen möchte, kann folgendes Programm verwenden:


#!/usr/bin/perl
#
# I've seen a few versions of this algorithm
# online, I don't know who to credit. I assume
# this code to by GPL unless proven otherwise.
# Comments provided by William Porquet, February 2004.
# You may need to change the line above to
# reflect the location of your Perl binary
# (e.g. "#!/usr/local/bin/perl").
# Also change this file's name to '2038.pl'.
# Don't forget to make this file +x with "chmod".
# On Linux, you can run this from a command line like this:
# ./2038.pl
use POSIX;
# Use POSIX (Portable Operating System Interface),
# a set of standard operating system interfaces.
$ENV{'TZ'} = "GMT";
# Set the Time Zone to GMT (Greenwich Mean Time) for date calculations.
for ($clock = 2147483641; $clock < 2147483651; $clock++)
{
print ctime($clock);
}
# Count up in seconds of Epoch time just before and after the critical event.
# Print out the corresponding date in Gregorian calendar for each result.
# Are the date and time outputs correct after the critical event second?

Windows XP SP2

C:\>perl 2038.pl

Tue Jan 19 04:14:01 2038
Tue Jan 19 04:14:02 2038
Tue Jan 19 04:14:03 2038
Tue Jan 19 04:14:04 2038
Tue Jan 19 04:14:05 2038
Tue Jan 19 04:14:06 2038
Tue Jan 19 04:14:07 2038

Das Programm stoppt genau nach der kritischen Sekunde im Jahr 2038.

Ubuntu 7.10

./2038.pl

Tue Jan 19 03:14:01 2038
Tue Jan 19 03:14:02 2038
Tue Jan 19 03:14:03 2038
Tue Jan 19 03:14:04 2038
Tue Jan 19 03:14:05 2038
Tue Jan 19 03:14:06 2038
Tue Jan 19 03:14:07 2038
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901
Fri Dec 13 20:45:52 1901

Auf Unix-Systemem wird die Zeit auf den 13. Dezember 1901 gesetzt.


Datumsberechnungen über das Jahr 2038 hinaus

Wer Datumsberechnungen über das Jahr 2038 hinaus sicher durchführen möchte, sollte sich nicht auf time() verlassen, sondern besser ein CPAN-Modul wie Date::Calc oder DateTime verwenden.

Beispiel:

use strict;
use warnings;

use DateTime;

my $dt = DateTime->now();

print $dt->iso8601() , "\n";

$dt->add(years => 200);

print $dt->iso8601() , "\n";

Ausgabe des Beispiels:

2008-02-07T22:19:35
2208-02-07T22:19:35



Siehe auch:

Sonntag, 3. Februar 2008

Video: David Allen on "Knowledge Work Athletics"

David Allen, der Autor von Getting Things Done (Wie ich die Dinge geregelt kriege), hat im Oktober 2007 den Talk "GTD and the Two Keys to Sustaining a Healthy Life and Workstyle" bei Google gehalten. Das Video von diesem Talk ist seit Anfang Jaunuar 2008 bei YouTube zu sehen:



Rund 45 Minuten Einführung in GTD vom Meister persönlich. Sehr schön.

Enjoy!

via: David Allen on "Knowledge Work Athletics"