#!/bin/blog

March 8, 2007

Ab und zu mal updaten

Filed under: Internet, perl — Tags: — martin @ 8:51 am

Hilferuf vom Kunden: Er hatte ein schon etwas älteres Perl-Script von mir erweitert und mußte schmerzlich feststellen, daß das vom Script generierte Excel-File alle Strings nach 256 Zeichen abschnitt. Kurzes Nachlesen in der Doku von Spreadsheet::WriteExcel ergab jedoch, daß die maximale Länge von Strings eigentlich bei 32767 Zeichen liegen sollte.

Nachdem diese Diskrepanz erst einmal aufgedeckt war, war der Fall schnell gelöst: Das aus dem Jahr 2003 oder 2004 (genaues weiß man nicht mehr) stammende Script benutzte die Version 0.42 von Spreadsheet::WriteExcel. Aktuell ist jedoch die Version 2.18. Es hatte also in der jüngeren Vergangenheit eine gewisse Weiterentwicklung gegeben.

Wirklich gute Perl-Module verändern ihr API nie, sondern bauen es nur aus. So auch in diesem Fall: Nach der Aktualisierung lief das Script noch genau so durch wie früher und für mich war lediglich das Problem mit den 256 Zeichen behoben. Auch wenn ich gerade versuche, ein wenig Ruby zu lernen (wegen der wirklich gelungenen Objektorientierung), ist diese Kontinuität genau das, was ich an Perl so liebe.

Aber genug davon, denn ich stelle grade fest, daß ich klinge wie ein alter Sack, der seine in den 70ern geschriebenen Fortran-Programme für das Maß aller Wartbarkeit hält. 😉

December 18, 2005

Exitcode in Perl auswerten

Filed under: Internet, Notizen, perl — Tags: — martin @ 5:01 pm

Damit habe ich jahrelang Probleme gehabt, bis ich der Sache schließlich im Detail nachgehen mußte. Wenn man den Exitcode eines von Perl aufgerufenen externen Programms wissen will, muß man dazu den Rückgabewert um 8 Bits nach rechts shiften:

my $out=`/usr/local/bin/blahfasel`;
my $rc = $?>>8;

Die Information findet sich in man perlfunc bei der system-Funktion.

July 11, 2005

Is Perl still relevant?

Filed under: Internet, perl — Tags: — martin @ 10:07 am

Hey, komm, jetzt schreibe auch ich nochmal was dazu, schon allein, um meinen Anspruch als A-List-Frickelblogger mit Impact zu demonstrieren.

  “Is Perl relevant any longer?”

wird bei Tim O’Reilly gefragt. Dabei stellt sich natürlich als erstes die Gegenfrage, welche Relevanz eine solche Frage haben soll. Selbstverständlich ist Perl relevant, solange damit gearbeitet und programmiert wird.

Im Web-Bereich mag Perl vielleicht an Verbreitung verloren haben, da es lange Zeit ausschließlich mit CGI in Verbindung gebracht wurde und in dieser Umgebung aufgrund des on-the-fly Übersetzungsvorgangs auf Anhieb eher schlecht skaliert. Im Gegensatz dazu lassen sich mit PHP aus dem Stand wesentlich schneller Ergebnisse zusammenschustern, ohne sich lange mit dem eher krampfig aufgestellten mod_perl oder anderen CGI-Beschleunigern auseinandersetzen zu müssen. Darüber, welche Ansprüche an Qualität und Sicherheit manche PHP-Machwerke dann auch im Falle großer und bekannter Projekte erfüllen können, wollen wir bei der Gelegenheit allerdings nicht reden.

So manchem Webdesigner™ würde eine mäßige Einstiegshürde jedenfalls nicht schaden. Soviel dazu.

Zurück zu Tim O’Reilly: Die Zeiten, in denen man zu jedem Mist ein eigenes Perl-Buch auf den Markt werfen konnte, das dann auch noch begierig gekauft wurde, nur weil “Perl” auf dem Deckel geschrieben stand, gehen scheinbar ihrem Ende zu. So schlimm kann die Lage allerdings doch wieder nicht sein, denn mit “Perl Testing: A Developer’s Notebook” und “Perl Best Practices” hat O’Reilly für diesen Monat schon wieder zwei neue Schinken in Arbeit, die die Welt vermutlich nicht braucht.

Die vage Aussicht auf Perl 6 sorgt derweil für Unruhe, vermutlich weil viele Perl-Nutzer noch nie in der Situation waren, sich auf eine neue Version “ihrer” Sprache einstellen zu müssen. Keine Angst, das schafft ihr schon. In der EDV zu arbeiten, bedeutet glücklicherweise noch immer Veränderung, auch wenn es in der Großindustrie so manche Vertreter gibt, die sich nichts mehr wünschen, als alle Verhältnisse für immer zementieren zu können.

Sollte Perl dann in hoffentlich ferner Zukunft wirklich in der Bedeutungslosigkeit verschwinden, machen wir demzufolge halt was ganz anderes. Die Welt dreht sich im Zweifelsfall auch ohne Perl weiter.

December 3, 2004

Jabbern im Alleingang

Filed under: Internet, perl — Tags: — martin @ 10:31 pm

Angeregt durch sendxmpp habe ich mich mal an einem eigenen Perl-Script versucht, das Jabber-Nachrichten versenden kann. Da sendxmpp selbst in Perl geschrieben ist, war das natürlich keine allzugroße Kunst und somit ein kleines Spielscript schnell in ein paar Zeilen runtergeschrieben: jabber-send.pl

Net::XMPP und seine Subklassen sind leider nicht wirklich lustig. Eine Fehlerbehandlung war nur durch Trial-and-Error umsetzbar, und an der Aufgabe, vor dem Senden festzustellen, ob der Empfänger überhaupt online ist (das war Sinn der Übung, sonst hätte ich bei sendxmpp bleiben können) bin ich gescheitert, da ich mangels Protokollkenntnis die Doku nicht verstanden habe. Irgendwie eine unbefriedigende Angelegenheit.

September 2, 2004

Apache-Log anonymisieren

Filed under: Internet, perl — Tags: — martin @ 8:27 pm

Nach längerer Abstinenz habe ich heute mal wieder einen dieser liederlichen Perl-Einzeiler verbrochen. $KUNDE wollte aus Webserver-Logs die IP-Adressen entfernen, aber für die weitere Auswertung sollten die Clients doch noch unterscheidbar sein.
 
perl -ape '$i=167772161;unless($f{$F[0]}){$o++;while((0==($i+$o)%256)or
(0==($i+$o+1)%256)){$o++};$f{$F[0]}=join(".",unpack("C4",pack("N",$i+$o)))}
s/$F[0]\b/$f{$F[0]}/' < /blah/blubb/access_log

 

June 3, 2004

Wer hat welchen Port offen?

Filed under: Internet, perl — Tags: — martin @ 11:45 pm

Hier nochmal ein ganz besonders seltsamer und unausgereifter Scriptschnipsel von meiner Platte, aber vielleicht kann ich ihn irgendwann nochmal gebrauchen. Das Ding schaut mit lsof, welcher Prozeß einen TCP-Port offenhat und sucht den Namen dazu aus der Prozeßliste raus.

 

#!/usr/bin/perl -w
use strict;

my $retval = system ("lsof -h >/dev/null 2>&1");
die "Kann lsof nicht finden. :-(\n" if ($retval);

my %ports;
my @output;
@{$ports{tcp}} = `lsof -P -i TCP | grep -v "^COMMAND" | grep LISTEN`;
@{$ports{udp}} = `lsof -P -i UDP | grep -v "^COMMAND" | grep Idle`;

foreach my $protocol ("tcp", "udp"){
   foreach my $line (@{$ports{$protocol}}){
      my @fields  = split /\s+/, $line;
      my $command = $fields[0];
      (my $port   = $fields[-2]) =~ s/\*://;
      push @output, sprintf ("%-5s %3s -> %-30s\n", $port, $protocol, $command);
   }
}

my $prev = "";
@output = (sort { $a cmp $b } (@output));
@output = grep($_ ne $prev && ($prev = $_), @output);

foreach (@output){
   print;
}

March 13, 2004

Mail mit Attachment versenden

Filed under: Internet, Notizen, perl — Tags: — martin @ 7:58 am

Mime::Lite ist wohl die bequemste Möglichkeit, um aus Perl-Scripts heraus einigermaßen ordentlich MIME-codierte Mails mit Anhang zu versenden.

#!/usr/bin/perl -w
use strict;
use diagnostics;
use MIME::Lite;
use File::Basename;

my $absender    = 'Alice <alice@thisdomain.invalid>';
my $empfaenger  = 'Bob <bob@otherdomain.invalid>';
my $datei       = "/home/alice/info.pdf";
my $smtphost    = "127.0.0.1 25";
my $betreff     = "Demo Dateianhang";

my $anschreiben = <<EOF;
Sehr geehrte Damen und Herren,

anbei die gewünschten Informationen.
EOF

MIME::Lite->send('smtp', $smtphost, Timeout=>5);

my $msg = MIME::Lite->new(
        From            => $absender,
        To              => $empfaenger,
        Subject         => $betreff,
        Type            => 'multipart/mixed'
        );

$msg->attach(
        Type            => 'TEXT',
        Data            => $anschreiben
        );

$msg->attach(
        Type            => 'AUTO',
        Path            => $datei,
        Filename        => basename($datei),
        Disposition     => 'attachment'
        );

$msg->send();

Um eine Mail direkt über den lokalen MTA z.B. per sendmail oder qmail-inject einzuqueuen, würde man MIME::Lite wie folgt konfigurieren:

 
MIME::Lite->send('sendmail', "/usr/lib/sendmail -t -oi "); (Postfix)
MIME::Lite->send('sendmail', "/var/qmail/bin/qmail-inject -f $absender $emfpaenger"); (Qmail)

 
Fehler beim Versand kann man am Rückgabewert der send()-Methode erkennen.

February 7, 2004

SSH-Launcher

Filed under: English entries, Internet, perl, Warez — Tags: — martin @ 4:56 pm

SSH-Launcher is a particularly simple front-end for SSH, written in Perl.

screenshot.png

SSH-Launcher uses no configuration dialog at all. An “INI” style configuration file is used to define the SSH sessions and the terminal application that will be used. It’s trivial, but at least it’s well-documented. 😉

Click here to download: ssh-launcher-20040207.tar.gz

Requires Perl, Perl Tk and the Config::IniFiles Module.

January 8, 2004

chkmd5cap

Filed under: Internet, Notizen, perl — Tags: — martin @ 7:53 pm

#!/usr/bin/perl -w
require 5.000;
use strict;

# Test if this System can handle MD5 Passwords

my $testpw = '$1$oTg0Hgpx$lI1RZ2NHlP2TBv21ntM0h/';     # "foo"

print STDERR "Checking for MD5 password compatibility... ";

if ($testpw eq (crypt('foo', $testpw))){
        print STDERR "Yes.\n";
        exit 0;
}else{
        print STDERR "No.\n";
        exit 1;
}

November 25, 2003

Installierte Perl-Module auflisten

Filed under: Internet, Notizen, perl — Tags: , — martin @ 2:37 pm

Immer wieder werde ich gefragt, wie man sich alle installierten Perl-Module anzeigen lassen kann. Dabei ist der entsprechende Aufruf doch so einfach und selbsterklärend. 😉

perl -MExtUtils::Installed -e'$m=ExtUtils::Installed->new();
for($m->modules()){my$v=$m->version($_)||"-";
printf("%-10s %-50s\n",$v,$_);}'

(Vgl.: CPAN-FAQ)

Older Posts »

Blog at WordPress.com.