<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0">

    <channel>

        <title>ByteBlog</title>
        <link>http://www.bytewurf.de/byteblog</link>
        <description>Das Byte das Blogged</description>

        <generator>basesyndication</generator>
        <!-- TODO
        <lastBuildDate>Mon, 30 Sep 2002 11:00:00 GMT</lastBuildDate>
        <copyright>Copyright 1997-2002 Dave Winer</copyright>
        <docs>http://backend.userland.com/rss</docs>
        <category domain="Syndic8">1765</category>
        <managingEditor>dave@userland.com</managingEditor>
        <webMaster>dave@userland.com</webMaster>
        -->

        <!-- TODO: Should there be an individual image associatable with each
        Weblog object?  I think so... -->
        <image>
            <title>ByteBlog</title>
            <url>http://www.bytewurf.de/logo.png</url>
            <link>http://www.bytewurf.de/byteblog</link>
        </image>

        
            <item>
                <title>Lebewohl alter Server</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2009/07/20/lebewohl-alter-server</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2009/07/20/lebewohl-alter-server</link>
                <description>
&lt;p&gt;Hoffentlich auf dem richtigen Server. Und bitte liebe Kinder macht das nicht auf dem Rechner zu Hause.&lt;/p&gt;
&lt;p&gt;Gleich wird der alte Server dann endgültig abgeschaltet. Der neue Server läuft jetzt schon sein Mittwoch nacht ohne Probleme und wird hoffentlich genauso pflegeleicht seinen Dienst tun, wie der alte.&lt;/p&gt;
&lt;p&gt;Schnief.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Installation</category>
                
                
                    <category>Server</category>
                

                <pubDate>Mon, 20 Jul 2009 18:42:16 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Perl im Schnelldurchlauf</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2009/05/09/perl-im-schnelldurchlauf</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2009/05/09/perl-im-schnelldurchlauf</link>
                <description>
&lt;p&gt;So richtig kurz war er dann doch nicht, aber anscheinend waren die anderen ByteWerfler doch motiviert genug um einige kritische Fragen zu stellen, die mir bei der Erstellung der Folien gar nicht eingefallen waren.&lt;/p&gt;
&lt;p&gt;Die Folien sind unter&amp;nbsp;&lt;a title="Kurzeinführung in Perl" class="internal-link" href="/Intern/vortrage/perl/perl-grobeinfuehrung.xul"&gt;Kurzeinführung in Perl&lt;/a&gt; zu finden. Wem das zu wenig ist, kann auch den nicht gehaltenen Vortrag &lt;a title="Einführung in Perl" class="internal-link" href="/Intern/vortrage/perl/perl-vortrag.odp"&gt;Einführung in Perl&lt;/a&gt; anschauen.&lt;/p&gt;
&lt;p&gt;Die erwarteten Fragen kamen natürlich zu den vielen in Perl nutzbaren Abkürzungen, wie etwa die omnipräsente Variable &lt;strong&gt;$_&lt;/strong&gt;, oder die teilweise verwirrenden Klammerregeln.&lt;/p&gt;
&lt;p&gt;Eine andere Frage betraf die Dereferenzierung von Zeigern auf Arrays und Hashes. Hier war mir nicht klar, ob es sich bei dem Ergebnis um eine Kopie oder ein Alias auf die originale Datenstruktur handelt. Ich habe es mit folgendem Programm dann noch getestet und damit ist klar. Es ist eine Kopie.&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/perl
use Test::More qw(no_plan);
my $orig = [];
my @copy = @{$orig};
push @copy, "Hallo";
is @{$orig}, 0, "Es gibt kein Element im Original";&lt;/pre&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Bytewurf</category>
                
                
                    <category>Sprachen</category>
                
                
                    <category>Perl</category>
                

                <pubDate>Sat, 09 May 2009 11:08:24 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Jaunty berühren und verzweifeln</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2009/04/21/jaunty-beruhren-und-verzweifeln</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2009/04/21/jaunty-beruhren-und-verzweifeln</link>
                <description>
&lt;p&gt;Mit dem Notebook rasch angefangen. Das Update ging problemlos vonstatten. Schnell den Rechner neugestartet, damit die versprochenen 30% kürzere Bootzeiten sich auch lohnen. Da aber ersteinmal das Kernelmodul für Virtualbox kompiliert werden musste, war das eher eine 100% längere Bootzeit. Aber hoffentlich einmalig.&lt;/p&gt;
&lt;p&gt;Dann war aber doch irgendwann der X-Server bereit ein wenig buntere Sachen auf den Bildschirm zu zaubern und Firefox konnte gestartet werden. Nun einfach mit dem Touchpad die Seite runterscrollen...&lt;/p&gt;
&lt;p&gt;...da musste man doch nur...hab's gleich hehe...&lt;/p&gt;
&lt;p&gt;Nunja, die Macianer haben jetzt auch Ubuntu infiziert. Die Standardeinstellung des Touchpads ist anscheinend jetzt sehr dem Mac angeglichen. Das heisst es wird mit zwei Fingern gleichzeitig gescrollt. (Kann man sich ganz gut dran gewöhnen).&lt;/p&gt;
&lt;p&gt;Dann noch schnell etwas in die Zwischenablage und mit dem mittleren Mausknopf (nun gut, emulierten mittleren Mausknopf) ...@X!-fg%...hab's gleich...&lt;/p&gt;
&lt;p&gt;Ok, die zwei Finger die ich sonst für den emulierten Mausdruck genutzt habe, die Scrollen ja jetzt,&amp;nbsp; daher ist entweder die Stufe der Erkennung deutlich erschwert worden, oder es funktioniert tatsächlich nur noch wenn die zwei Finger übereinander gleichzeitig einen Tastendruck auf das Touchpad ausüben.&lt;/p&gt;
&lt;p&gt;Als Dreingabe des Probierens gab es dann noch eine emulation der rechten Maustaste mit drei gleichzeitigen Wurstfingern auf dem Pad.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Installation</category>
                
                
                    <category>Software</category>
                

                <pubDate>Tue, 21 Apr 2009 19:48:21 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Log-Dateien lesbar machen</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2009/01/26/log-dateien-lesbar-machen</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2009/01/26/log-dateien-lesbar-machen</link>
                <description>
&lt;p&gt;Schnell ein Perl-Skript geschrieben, dass die Anfänge der Log-Einträge findet und vor diese ein Neues Zeilen Zeichen einfügt.&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/perl
use strict;
use warnings;

my $days = qr{Mon|Tue|Wed|Thu|Fri|Sat|Sun};
my $months = qr{Jan|Feb|Mar|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec};
my $date_regex = qr{(?:$days)(?:$months) \d{2} \d{2}:\d{2}:\d{2} \d{4}};

while (my $line = &amp;lt;&amp;gt;) {
   while ($line =~ m/($date_regex.*?(?=$date_regex))/g) {
      print "\n$1";
   }
}&lt;/pre&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Perl</category>
                
                
                    <category>Logging</category>
                
                
                    <category>Datenrettung</category>
                

                <pubDate>Mon, 26 Jan 2009 11:45:44 +0100</pubDate>

                
            </item>
        
        
            <item>
                <title>Adressen aus Mails extrahieren</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2009/01/13/adressen-aus-mails-extrahieren</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2009/01/13/adressen-aus-mails-extrahieren</link>
                <description>
&lt;p&gt;Oder man hat ein Perl-Skript wie etwa das folgende:&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/perl
use strict;
use warnings;
use Mail::Header;

my $head = Mail::Header-&amp;gt;new([&amp;lt;&amp;gt;], Modify =&amp;gt; 0);
my $bcc = join("", split(/\n/, $head-&amp;gt;get('BCC')));
my %addresses = ();
while ($bcc =~ m/("[^"]*" &amp;lt;[^&amp;gt;]+&amp;gt;|&amp;lt;[^&amp;gt;]+&amp;gt;|[^,]+),\s*/g) {
&amp;nbsp;&amp;nbsp;&amp;nbsp; my $address = $1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; if ($address =~ m/(.*) &amp;lt;([^&amp;gt;]*)&amp;gt;/) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $addresses{$2}=$1;
&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $addresses{$1}="";
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}

my @sorted_addresses = map { [$_-&amp;gt;[1], $addresses{$_-&amp;gt;[1]}] } 
&amp;nbsp;&amp;nbsp;&amp;nbsp; sort { $a-&amp;gt;[0] cmp $b-&amp;gt;[0] } 
&amp;nbsp;&amp;nbsp;&amp;nbsp; map { [lc($_), $_] } keys %addresses;
for my $address (@sorted_addresses) {
&amp;nbsp; print "$address-&amp;gt;[0], $address-&amp;gt;[1]\n";
};&lt;/pre&gt;
&lt;p&gt;Noch einfacher ist aber eventuell ein Python-Skript. Auch wenn es ein &lt;em&gt;deprecated&lt;/em&gt; Modul benutzt:&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/python
import rfc822
f=open('mail_mit_adressen.txt')
m=rfc822.Message(f)
for address in rfc822.AddressList(m['bcc']):
   print "\"%s\",%s" % address&lt;/pre&gt;
&lt;p&gt;Beide Ansätze gehen davon aus, dass man noch eine Mail mit allen Addressaten des gelöschten Adressbuches auffindet.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Python</category>
                
                
                    <category>Perl</category>
                
                
                    <category>Datenrettung</category>
                

                <pubDate>Tue, 13 Jan 2009 22:25:00 +0100</pubDate>

                
            </item>
        
        
            <item>
                <title>Ärger mit den Ahnen</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/12/31/arger-mit-den-ahnen</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/12/31/arger-mit-den-ahnen</link>
                <description>
&lt;p&gt;In diesem Fall war es die Software "Familienchronik" von Data Becker aus biblischer Urzeit. Die Daten waren alle erfasst, aber dann war plötzlich die komplette Familie im Weihnachtsurlaub, oder sonst wo, nur leider nicht mehr im Programm auffindbar. Das berichten auch andere &lt;a href="http://www.google.de/search?q=data+becker+familienchronik+leer"&gt;Familiendatenzusammenträger&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Daten schienen noch vorhanden zu sein, denn die &lt;strong&gt;*.anc&lt;/strong&gt; Datei enthielt noch etwa 200 Kb an Daten. Und offenbarte mit einem Text-Editor auch noch die eingegebenen Daten. Dem Format der Datei kam ich durch andere mitgelieferte Beispieldateien auf die Spur. Dort fand sich im Header der Eintrag "&lt;strong&gt;jet db&lt;/strong&gt;", das deutete auf eine MS Access Datenbank hin. Das wurde bestätigt, als ich in der Systemsteuerung die &lt;strong&gt;anc&lt;/strong&gt; Datei als Datenquelle eingerichten konnte.&lt;/p&gt;
&lt;p&gt;Damit konnte ich dann einfach mit &lt;a href="http://www.openoffice.org"&gt;OpenOffice.org&lt;/a&gt; per ODBC auf die Daten zugreifen. Die Urväter lebten also noch. Jetzt mussten sie nur noch in ein neues modernes Heim gebracht werden.&lt;/p&gt;
&lt;p&gt;Eine Suche nach genealogy und linux erbrachte, dass &lt;a href="http://www.gramps-project.org/wiki/index.php?title=Main_Page"&gt;gramps&lt;/a&gt; ein geeignetes Programm wäre. Dieses läuft nicht nur unter Linux, sondern kann auch den Quasi-Standard gedcom importieren und exportieren. Hier ist man also nicht an einen Hersteller gebunden.&lt;/p&gt;
&lt;p&gt;Leider reichten meine Openoffice.org Kenntnisse nicht aus, um die sichtbaren Daten in ein Format zu konvertieren, dass gramps importieren wollte. Dafür habe ich dann einen &lt;a href="http://www.bullzip.com/download.php"&gt;MS Access nach MySQL Konverter&lt;/a&gt; genutzt. In der MySQL Datenbank konnte ich dann die Kinder, Familien und Personen so umsortieren, dass ich eine einfache CSV-Datei erstellen konnte. Diese importierte gramps dann fast klaglos.&lt;/p&gt;
&lt;p&gt;Ein kleiner Fehler bei der Erkennung des Geschlechts zwang mich dazu, gramps mit einer englischen &lt;em&gt;locale&lt;/em&gt; zu starten und so einen Übersetzungs- und Programmfehler zu umgehen.&lt;/p&gt;
&lt;pre&gt;export LANG=en_EN.utf-8
gramps&lt;/pre&gt;
&lt;p&gt;Jetzt muss ich nur noch den Bediener der alten Software überzeugen, seine Daten mit dem neuen Programm und am besten unter Linux weiter zu pflegen.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Windows</category>
                
                
                    <category>Datenbank</category>
                

                <pubDate>Wed, 31 Dec 2008 13:48:06 +0100</pubDate>

                
            </item>
        
        
            <item>
                <title>Mit angezogener Handbremse</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/10/08/mit-angezogener-handbremse</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/10/08/mit-angezogener-handbremse</link>
                <description>
&lt;p&gt;Die durchschnittliche Last (&lt;em&gt;loadavg&lt;/em&gt;) auf dem Server ging in relativ regelmäßigen zweistündlichen Abständen auf über zehn. Da die Lastprobleme mit dem Lastverteiler&amp;nbsp; umzogen hatten wir den nebenher laufenden Tomcat relativ früh als Verursacher der Probleme ausgeschlossen.&lt;/p&gt;
&lt;p&gt;Ein Irrtum.&lt;/p&gt;
&lt;p&gt;Wegen eines anderen Problemes haben wir während einer solchen hochlast Phase den Tomcat mittels&lt;/p&gt;
&lt;pre&gt;kill -quit $TOMCAT_PID&lt;/pre&gt;
&lt;p&gt;mehrere Threaddumps schreiben lassen. Bei der Analyse dieser Dumps fiel uns dann auf, dass ein übervorsichtiger Programmierer eine Garbage Collection bei jedem Aufruf seines Servlets veranlasste.&lt;/p&gt;
&lt;p&gt;Glücklicherweise kann mittels Parameter der JavaVM das Beachten dieser Aufforderung ausgetrieben werden. Seit wir die Option &lt;strong&gt;-XX:+DisableExplicitGC&lt;/strong&gt; für die Tomcat JavaVM nutzen, sind alle Lastprobleme verschwunden. Ebenso zeigte sich, dass die Anzahl der möglichen Anfragen an das Servlet von etwa vier Anfragen pro Sekunde auf etwa 200 Anfragen pro Sekunde hochschnellten.&lt;/p&gt;
&lt;p&gt;Und netterweise sind in dem Servlet auch die Aufrufe von &lt;strong&gt;System.gc()&lt;/strong&gt; verschwunden.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Debugging</category>
                
                
                    <category>Java</category>
                
                
                    <category>Servlet</category>
                

                <pubDate>Wed, 08 Oct 2008 18:50:00 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Super Fehlermeldungen</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/09/23/super-fehlermeldungen</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/09/23/super-fehlermeldungen</link>
                <description>
&lt;p&gt;In meinem letzten Fall hat es mich insgesamt mehrere Tage gekostet. Ganz konkret ging es um den Imap Server von Cyrus. Um dem erhöhten Mailaufkommen beizukommen wollen wir unseren derzeitigen Mailserver (auch von Cyrus) durch eine Cluster-Installation ersetzen. Der letzte Test bestand dann darin, dass der MTA eine Mail über einen Lmtp-Proxy an den eigentlichen Speicherort der Mail weiterreicht.&lt;/p&gt;
&lt;p&gt;Das hat er in meiner Testinstallation auch wunderbar gemacht.&lt;/p&gt;
&lt;p&gt;In der Produktionsinstallation weigerte er sich mit einer Meldung, dass es keine "&lt;em&gt;worthy mechs&lt;/em&gt;" gäbe. Also keine Mechanismen zur Authentisierung/Authorisierung, mit denen der Proxy mit dem Backend sprechen wollte.&lt;/p&gt;
&lt;p&gt;Goggle bietet hier schnell viele Treffer an, die alle in die Richtung TLS Verschlüsselung gehen. Nur die funktionierte bei meiner Installation.&lt;/p&gt;
&lt;p&gt;Des Rätsels Lösung lag darin, dass für den Namen des Backends kein Passwort in der Konfiguration des Frontends hinterlegt war.&lt;/p&gt;
&lt;p&gt;Tolle Fehlermeldung.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Debugging</category>
                
                
                    <category>Applikationen</category>
                
                
                    <category>Installation</category>
                
                
                    <category>Logging</category>
                
                
                    <category>Server</category>
                

                <pubDate>Tue, 23 Sep 2008 19:07:04 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Auch auf der Internetallee glänzt es schon</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/09/03/auch-auf-der-internetallee-glanzt-es-schon</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/09/03/auch-auf-der-internetallee-glanzt-es-schon</link>
                <description>
&lt;p&gt;Der Gewinner des ersten Besuchs aus der leuchtenden Chrome-Welt ist die Seite von &lt;a href="http://www.nektra.de/"&gt;nektra&lt;/a&gt;. Dort war heute schon um 12:51 Uhr ein Browser mit dem untenstehenden gekürzten Log-Eintrag zu sehen:&lt;/p&gt;
&lt;p&gt;[03/Sep/2008:12:51:17 +0200] ... "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13"&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Software</category>
                

                <pubDate>Wed, 03 Sep 2008 21:25:19 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Alleinherrscher</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/08/28/alleinherrscher</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/08/28/alleinherrscher</link>
                <description>
&lt;p&gt;CD einlegen, Rechner davon booten und installieren, fertig. Dachte ich.&lt;/p&gt;
&lt;p&gt;Die ersten male waren aber eher CD einlegen, Rechner davon booten und nach einer kurzen Einblendung "gleich geht's weiter" wurde mir schwarz vor Augen. Oder zumindest der Bildschirm.&lt;/p&gt;
&lt;p&gt;Reboot tut immer gut, aber in diesem Fall blieb das Ergebnis immer dasselbe. Schwarz. Ist zwar auch schön, aber bunter wäre netter. Also auf ins Internet und nach Windows installation und schwarzer Bildschirm gesucht. Viele Tipps, noch mehr Ratlosigkeit. Die meisten Hinweise deuteten aber darauf hin, dass die Windows XP CD kein anderes Betriebssystem neben sich mag und der einfachste Weg ein&lt;/p&gt;
&lt;pre&gt;dd if=/dev/zero of=/dev/sda bs=512 count=1&lt;/pre&gt;
&lt;p&gt;wäre. Damit ist dann zwar die Partitionstabelle weg, aber der Installer glücklich. Gut, dass in der Linux Installation noch nichts konfiguriert war.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Windows</category>
                
                
                    <category>Installation</category>
                

                <pubDate>Thu, 28 Aug 2008 19:17:29 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Wie sage ich es meiner Funktion</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/07/31/wie-sage-ich-es-meiner-funktion</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/07/31/wie-sage-ich-es-meiner-funktion</link>
                <description>
&lt;p&gt;Das ist ja im Prinzip ganz einfach. Eine Funktion in Perl erhält als Übergabeparameter eine einfache Liste mit Namen &lt;strong&gt;@_&lt;/strong&gt;. Aber damit fängt es dann erst an.&lt;/p&gt;
&lt;p&gt;Nehmen wir mal an, wir haben eine einfache Funktion mit zwei Parametern:&lt;/p&gt;
&lt;pre&gt;sub twoParamFunction {
&amp;nbsp;&amp;nbsp;&amp;nbsp; my ($one, $two) = @_;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "$one and $two\n";
}&lt;/pre&gt;
&lt;p&gt;Hier wird die Liste &lt;strong&gt;@_&lt;/strong&gt; einer Liste mit gerade frisch deklarierten Variablen zugewiesen. Es werden also alle zusätzlichen Parameter verworfen. Diese Art der Parameterübergabe ist vermutlich eine der gebräuchlichsten und einfachsten.&lt;/p&gt;
&lt;p&gt;Aber natürlich war das nicht die Art der Übergabe, die mein Kollege im Sinn hatte. Also gut, wir können auch benannte Parameter mit Standard-Werten benutzen:&lt;/p&gt;
&lt;pre&gt;sub hashAsParam {
&amp;nbsp;&amp;nbsp; my %hash_param = ( 'one' =&amp;gt; 'Eins', 'two' =&amp;gt; 'Zwei', @_ );
&amp;nbsp;&amp;nbsp; print "$hash_param{one} und $hash_param{two}\n";
}&lt;/pre&gt;
&lt;p&gt;Hier wird die Liste in eine Hashstruktur eingeblendet und so können die benannte Parameter &lt;strong&gt;one&lt;/strong&gt; und &lt;strong&gt;two&lt;/strong&gt; sowohl übergeben, als auch weggelassen werden - dann erhalten sie eben ihre Standardwerte.&lt;/p&gt;
&lt;p&gt;Aber ach, &lt;em&gt;das war es auch nicht&lt;/em&gt;. Nun gut, wir können beide Methoden mischen:&lt;/p&gt;
&lt;pre&gt;sub mixedParams {
&amp;nbsp;&amp;nbsp; my ($one, $two, %optional) = @_;
&amp;nbsp;&amp;nbsp; print "$one and $two\n";
&amp;nbsp;&amp;nbsp; print join("; ", keys %optional) . "\n";
}&lt;/pre&gt;
&lt;p&gt;Hier werden aus der Parameterlliste die ersten beiden Elemente &lt;strong&gt;$one&lt;/strong&gt; und &lt;strong&gt;$two&lt;/strong&gt; zugewiesen, und der Rest wird wie in &lt;strong&gt;hashAsParam&lt;/strong&gt; einer Hashstruktur aufgehen. Wenn hierbei auch noch Standardwerte vorgegeben werden sollen, kann das in einer extra Zeile geschehen.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Hmhm, das war es auch nicht&lt;/em&gt;. Ok, wir können natürlich auch noch die Liste einzeln abarbeiten:&lt;/p&gt;
&lt;pre&gt;sub oneStep {
&amp;nbsp;&amp;nbsp;&amp;nbsp; my $one = shift;
&amp;nbsp;&amp;nbsp;&amp;nbsp; my $two = shift;
&amp;nbsp;&amp;nbsp;&amp;nbsp; print "$one and $two\n";
}&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Ja, genau das wars&lt;/em&gt;! Aber wo wir jetzt schon so viele Varianten hatten, können wir eine noch zusätzlich anbieten:&lt;/p&gt;
&lt;pre&gt;sub selectAFew {
&amp;nbsp;&amp;nbsp; my ($one, $four) = @_[0,3];
&amp;nbsp;&amp;nbsp; print "$one a $four\n";
}&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Äh&lt;/em&gt;? Aber ab hier sollte eigentlich spätestens klar sein, dass man perldata und man perlsyn mal wieder besucht werden sollten. Um den ganzen die Krone aufzusetzen, kam mein Kollege eine halbe Stunde später wieder an. Diesmal wollte er aber die Möglichkeiten der Rückgaben aus Perl-Funktionen wissen...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Sprachen</category>
                
                
                    <category>Perl</category>
                

                <pubDate>Thu, 31 Jul 2008 18:24:01 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Voice over IP</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/07/05/voice-over-ip</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/07/05/voice-over-ip</link>
                <description>
&lt;h2&gt;Präambel&lt;br /&gt;&lt;/h2&gt;
&lt;p&gt;Eigentlich brauche ich ja gar kein VoIP, weil ich eh ins deutsche Festnetz mit Flatrate telefoniere und die Sprachqualität ja beim Festnetztelefon sowieso viel besser ist. Aber wegen Videotelefonie interessierte es mich doch. Also schnell ein USB Headset (Logitech) besorgt und einen freien SIP Account (bei Ekiga [1]). Webcam habe ich zwar (noch) nicht, aber mir reichts ja auch, wenn ich was hübschen ansehen kann...&lt;/p&gt;
&lt;p&gt;Dann fiel mir auf, dass ich noch einen uralten Account bei sipgate[2] hatte. Also die Zugangsdaten rausgesucht und ein paar Programme ausprobiert. Übrigens taucht das beliebte proprietäre Programm mit dem "S" am Anfang
deswegen nicht hier auf, weil es ... nun ja, proprietär ist. Und
eben nicht mit SIP Kontakten Kontakt aufnehmen kann. :-(&lt;/p&gt;
&lt;h2&gt;Der Vergleich&lt;/h2&gt;
&lt;p&gt;Beim Ausprobieren der Programme hat sich nach und nach herauskristallisiert, welche Features für die (Video-) IP Telefonie eigentlich interessant sind. Getestet habe ich ausschließlich die Telefonie mit einem Festnetzanschluss und mit einem anderen Softphone, aber jeweils ohne Webcam. Das kommt vielleicht noch später.&lt;/p&gt;
&lt;h3&gt;Routing und NAT&lt;br /&gt;&lt;/h3&gt;
&lt;p&gt;Ekiga habe ich zuerst ausprobiert. Es ist mit einem Konfigurationsassistenten gestartet, der sehr übersichtlich war, und mich schnell darauf hingewiesen hat, dass mein Router symmetrisches NAT betreibt und mich auf eine Webseite geleitet, die mir erklärt hat, dass ich zu dem 1% der Nutzer gehöre, bei denen SIP nicht so ohne weiteres funktioniert... :-( Die technischen Details waren aber ausführlich genug, um das Problem zu beheben. Ich musste halt die Firmware des Routers updaten, um Cone-NAT zu bekommen, danach kam ich mit stunnel durch den Router hindurch. Die Stunnel Konfiguration Ekiga auch vorbildlich durchgeführt. Die Möglichkeit, einen stunnel zu nutzen, bieten übrigens alle Programme und die Provider auch alle einen eigene stunnel Gegenstelle. Prinzipiell ist es zwar wurscht, welcher stunnel benutzt wird, aber Gerüchteweise gibt es Provider, die darauf bestehen, den eigenen zu nutzen und sonst die Authentifizierung verweigern. Ich konnte das nicht nachvollziehen und es erscheint auch etwas seltsam, aber wer weiß...&lt;/p&gt;
&lt;p&gt;Die Konfiguration war bei den anderen Programmen auch einfach, wie sie sich allerdings vor meinem Router-Update verhalten hätten, vermag ich nicht zu beurteilen.&lt;/p&gt;
&lt;h3&gt;Provider Bindung&lt;/h3&gt;
&lt;p&gt;Die meisten der Programme haben einen bevorzugten Provider, den sie mehr oder weniger aufdringlich empfehlen. Bis auf Gizmo war es aber bei allen kein Problem, einen Zugang zu dem Provider meiner Wahl zu konfigurieren.&lt;/p&gt;
&lt;h3&gt;SIP Kontenverwaltung&lt;/h3&gt;
&lt;p&gt;Da ich nun Accounts bei zwei verschiedenen Providern habe, fand ich es natürlich interessant, diese Konten beide gleichzeitig konfigurieren zu können. Das ist anscheinend keine Selbstverständlichkeit - aber auch eine Funktion, die nicht für jeden Nutzer relevant ist.&lt;/p&gt;
&lt;h3&gt;Videotelefonie&lt;/h3&gt;
&lt;p&gt;Da ich noch kein Webcam mein Eigen nenne, habe ich mir nur die Konfigurationsmöglichkeiten angeschaut. Bei Ekiga war das schöne, dass ich als Videoquelle ein statisches Bild angebeben konnte und so mit einer Video fähigen Gegenstelle auch mit Bild kommunizieren kann. Bei den anderen Programmen habe ich diese Funktion nicht entdeckt, manche Programme unterstützen auch gar keine Videotelefonie.&lt;/p&gt;
&lt;h3&gt;Multi Protokoll IM&lt;/h3&gt;
&lt;p&gt;OpenWengo ist als umfangreichstes aller Programme mit einem Multiprotokoll IM Client ausgestattet. Dadurch mausert sich das Programm von der reinen IP Telefonie zur ausgewachsenen Chat-Schaltzentrale. Es unterstützt jede Menge Protokolle wie AIM, ICQ, Jabber, MSN etc. Ein nettes Feature, wobei ich eigentlich keinen Nachteil darin sehe, für diese Zwecke ein separates Programm nebenher zu benutzen.&lt;/p&gt;
&lt;table class="grid listing"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;&lt;br /&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Ekiga&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Twinkle&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Gizmo&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;OpenWengo&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Xmeeting&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.0.11&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;1.2&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;3.1.0.97&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;2.1.2&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;0.3.4a&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;URL&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="external-link" href="http://www.ekiga.org"&gt;http://www.ekiga.org&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="external-link" href="http://www.twinklephone.com"&gt;http://www.twinklephone.com&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="external-link" href="http://www.gizmo5.com"&gt;http://www.gizmo5.com&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="external-link" href="http://www.openwengo.org"&gt;http://www.openwengo.org&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;&lt;a class="external-link" href="http://xmeeting.sourceforge.net"&gt;http://xmeeting.sourceforge.net&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS (Widget Toolkit)&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux, Windows (GTK)&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Linux (QT)&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Linux, OS X, Windows&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Linux, OS X, Windows&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;OS X&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bevorzugte Provider&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ekiga[1], Diamond[3]&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;---&lt;/td&gt;
&lt;td&gt;Gizmo[4]&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Wengo[5]&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;--&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Provider unabhängig?&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;nein&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SIP Kontenverwaltung&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;nein&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Videotelefonie&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chat&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;ja&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multiprotokoll IM&lt;br /&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;nein&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;ja&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;?&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bemerkung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Einfache, aber intuitive Oberfläche&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Umfangreiche Konfigurationsmöglichkeiten, aber sehr aufgeräumt&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Ohne Gizmo Account konnte ich die SW nicht starten, daher habe ich nichts ausprobiert.&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Bestes Design aller Applikationen; Wirkt sehr ausgereift, ist aber auf einem Mac direkt beim Start gecrasht&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Noch nicht ausprobiert&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lizenz&lt;/strong&gt;&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;GPL&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;GPL&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Closed Source&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Open Source&lt;br /&gt;&lt;/td&gt;
&lt;td&gt;Open Source&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Tabelle ist noch nicht vollständig, ich freue mich aber über Kommentare, um sie zu komplettieren. Ich habe auch lediglich die Software gestartet, die Kontenverwaltung ausprobiert und ein Audiotelefonat von meinem Festnetz aus gestartet. Wenn dabei Probleme aufgetaucht sind, habe ich sie beschrieben. Die restlichen Angaben beziehen sich auf Herstellerangaben oder das Vorhandensein von irgendwelchen Menüs...&lt;/p&gt;
&lt;h2&gt;Webcams unter Linux&lt;/h2&gt;
&lt;p&gt;Hardwareunterstützung ist bei Webcams für Linux auch wieder ein Thema für sich, vor allem wenn es um hohe Auflösungen (1024x768und mehr) geht. Bei Standard VGA (640x480) scheint man aber eine ordentliche Auswahl zu haben. Dazu hier eine Reihe von Links:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a class="external-link" href="http://linux-uvc.berlios.de/"&gt;Linux UVC Driver &amp;amp; Tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.linuxtv.org/v4lwiki/index.php/Webcams"&gt;Webcams im V4L Wiki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.qbik.ch/usb/devices/search_res.php?pattern=video&amp;amp;submit=Search%21"&gt;Webcams in der Linux USB Device Datenbank&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h2&gt;Provider Links&lt;br /&gt;&lt;/h2&gt;
&lt;ol&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.ekiga.net"&gt;Ekiga&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.sipgate.de"&gt;sipgate&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.diamondcard.us"&gt;Diamond&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://gizmo5.com"&gt;Gizmo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.wengo.com/"&gt;Wengo&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;h2&gt;Weiterführende Links&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.linux.com/articles/48393"&gt;Four Linux Softphones Reviewed&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://www.voip-sol.com/top-softphones-for-mac-os-x/"&gt;Top Softphones for Mac&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a class="external-link" href="http://en.wikipedia.org/wiki/Comparison_of_VoIP_software"&gt;http://en.wikipedia.org/wiki/Comparison_of_VoIP_software&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
</description>
                <author>Sven Arnold</author>

                
                    <category>Videotelefonie</category>
                
                
                    <category>Applikationen</category>
                
                
                    <category>Softphones</category>
                
                
                    <category>VoIP</category>
                
                
                    <category>Software</category>
                

                <pubDate>Sat, 05 Jul 2008 16:00:00 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Perl ausprobieren</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/06/29/perl-ausprobieren</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/06/29/perl-ausprobieren</link>
                <description>
&lt;p&gt;Für einfache Ausdrucke und Versuche ist es natürlich am einfachsten einen Perl-Einzeiler zu benutzen. Also&lt;/p&gt;
&lt;pre&gt;perl -e 'print "Hallo Welt\n"'&lt;/pre&gt;
&lt;p&gt;Für Ausdrucke, die aber auf Variablen zur Laufzeit angewiesen ist, kann es recht müßig sein die History der Shell zu nutzen, oder eine Datei zu öffnen und dort&amp;nbsp; zu experimentieren.&lt;/p&gt;
&lt;p&gt;Debugger to the rescue&lt;/p&gt;
&lt;p&gt;Da bietet sich dann an den Debugger zu benutzen. Aber ich will ja eigentlich keine Datei entwanzen. Das Programm für den Debugger muss aber auch gar nicht gross sein. Eine einfache &lt;strong&gt;0&lt;/strong&gt; tut es da auch. Mit &lt;strong&gt;perl -d -e 0&lt;/strong&gt; gelangt man mit dem folgenden Ausdruck in seine persönliche Perl Spielwiese:&lt;/p&gt;
&lt;pre&gt;user@rechner:~$ perl -d -e 0
Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(-e:1):&amp;nbsp;&amp;nbsp;&amp;nbsp; 0
&amp;nbsp; DB&amp;lt;1&amp;gt; $a="hallo"

&amp;nbsp; DB&amp;lt;2&amp;gt; print "$a welt\n"
hallo welt&lt;/pre&gt;
&lt;p&gt;Wie man sieht, kann man im Debugger Variablen setzen und auf diese im nächsten Ausdruck zugreifen.&lt;/p&gt;
&lt;p&gt;Mit dem üblichen Debugger Befehl &lt;strong&gt;x&lt;/strong&gt; - Untersuche (eXamine) diesen Ausdruck/diese Variable - können wunderbar auch geschachtelte Datenstruckturen anschaulich dargestellt werden.&lt;/p&gt;
&lt;pre&gt;  DB&amp;lt;3&amp;gt; @a=qw(hallo welt)

  DB&amp;lt;4&amp;gt; x @a
0  'hallo'
1  'welt'
  DB&amp;lt;5&amp;gt; x \@a
0  ARRAY(0x8404d64)
   0  'hallo'
   1  'welt'
  DB&amp;lt;6&amp;gt; 
&lt;/pre&gt;
&lt;p&gt;Macht man einen Fehler, so gibt der Debugger eine Fehlermeldung aus und man hat wieder einen neuen Versuch.&lt;/p&gt;
&lt;pre&gt;  DB&amp;lt;6&amp;gt; $a[a)
syntax error at (eval 11)[/usr/share/perl/5.8/perl5db.pl:628] line 2, near "a)"
Missing right curly or square bracket at (eval 11)[/usr/share/perl/5.8/perl5db.pl:628] line 4, at end of line

&lt;/pre&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Debugging</category>
                
                
                    <category>Sprachen</category>
                
                
                    <category>Perl</category>
                

                <pubDate>Sun, 29 Jun 2008 18:50:43 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Immer eins nach dem anderen</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/06/05/immer-eins-nach-dem-anderen</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/06/05/immer-eins-nach-dem-anderen</link>
                <description>
&lt;p&gt;Auf der Tomcat Mailingliste kam heute eine Mail, in der jemand fragte, warum sein Singleton im Tomcat nicht einamlig in der JVM vorhanden war. Die Lösung war wohl, dass er zwei verschiedene Classloader benutzte und daher zwei verschiedene Instanzen.&lt;/p&gt;
&lt;p&gt;Ein anderes Problem seines Codes war aber ganz anderer Natur. Der Code sah etwa so aus:&lt;/p&gt;
&lt;pre&gt;public class Singleton {
&amp;nbsp;&amp;nbsp;&amp;nbsp; private static Singleton instance = new Singleton();
&amp;nbsp;&amp;nbsp;&amp;nbsp; private static int counter = 0;

&amp;nbsp;&amp;nbsp;&amp;nbsp; private Singleton() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println("Counter: " + (++counter));
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public static getInstance() { 
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return instance; 
&amp;nbsp;&amp;nbsp;&amp;nbsp; }

&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getCounter() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return counter;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/pre&gt;
&lt;p&gt;
Auf den ersten Blick sieht das in Ordnung aus. Der Konstruktor gibt brav ein &lt;code&gt;"Counter: 1"&lt;/code&gt; aus und man ahnt nichts böses. Bis dann ein kleiner Testfall mit &lt;a href="http://www.junit.org"&gt;jUnit&lt;/a&gt; aufkreuzt:&lt;/p&gt;
&lt;pre&gt;public class SingletonTest extends TestCase {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void testSingletonCounter() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Singleton instance = Singleton.getInstance();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assertEquals(instance.getCounter(), 1, "Es kann nur einen geben");
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
}&lt;/pre&gt;
&lt;p&gt;Hier wird dann plötzlich klar, dass intern der &lt;code&gt;counter&lt;/code&gt; trotz anderweitiger Ausgabe wieder auf &lt;code&gt;0&lt;/code&gt; gesetzt wurde. Das liegt daran, dass die Initialisierung der statischen Klassenvariablen der Reihe nach geschieht. Im Konstruktor ist &lt;code&gt;counter&lt;/code&gt; also erstmal nicht definiert - implizit also null - und wird dann auf eins inkrementiert. Nach dem Konstruktor wird dann die vermeintlich noch nicht initialsierte Variable auf &lt;code&gt;0&lt;/code&gt; gesetzt.&lt;/p&gt;
&lt;p&gt;Das kann ganz schön ins Auge gehen.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Servlet</category>
                
                
                    <category>Java</category>
                
                
                    <category>Sprachen</category>
                

                <pubDate>Thu, 05 Jun 2008 19:07:54 +0200</pubDate>

                
            </item>
        
        
            <item>
                <title>Schick und Schmerzhaft</title>
                <guid>http://www.bytewurf.de/byteblog/archive/2008/04/12/schick-und-schmerzhaft</guid>
                <link>http://www.bytewurf.de/byteblog/archive/2008/04/12/schick-und-schmerzhaft</link>
                <description>
&lt;p&gt;Denn dann gibt es einen auf die Finger. Sven hatte mir von seinen Kollegen erzählt, dass die immer einen gewischt bekommen, sobald sie sich an die Tastatur ihres iMac setzen.&lt;/p&gt;
&lt;p&gt;Heute habe ich das in der Stadt auch ausprobiert und - zack - der Funken sprang über. Tolles Design.&lt;/p&gt;
</description>
                <author>Felix Schumacher</author>

                
                    <category>Funktion</category>
                
                
                    <category>Design</category>
                

                <pubDate>Sat, 12 Apr 2008 14:55:07 +0200</pubDate>

                
            </item>
        

    </channel>
</rss>



