Monthly Archives: December 2009

Coffee Connection: Netzwerkverbindungen mit Java im Debian Sid

Ein länglicher Titel für ein ärgerliches Problem mit kurzer Lösung:

Seit einigen Tagen mag sich Eclipse unter Debian Sid auf meinem Arbeitsnotebook nicht mehr mit dem Internet verbinden. Die Fehlermeldungen sind, je nach Modul, verschieden, laufen letztendlich aber immer auf etwas in der Form “Network noch reachable” hinaus. Erst dann fällt auch auf, wie oft ich doch bei der Entwicklung auf das Internet zugreife: Subversion und Maven funktionieren nicht mehr, Updates und das Einspielen von Plugins ist unmöglich und irgendwann – ein wichtiger Hinweis auf die Fehlerursache – stellte sich heraus, dass gar keine Java-Anwendung mehr Zugang zum Netzwerk hat.

Nachdem ich zunächst nach Fehlern bei Eclipse gesucht habe, war die Lösung nun recht nahe: Ein Blick in die Fehlerberichte für das Paket sun-java6-jdk zeigt den Bug #560044, der genau mein Problem beschreibt. Offenbar hält SUNs Java sich nicht an die Konventionen für den Umgang mit IPv4- und IPv6-Verbindungen, so dass IPv4 gar nicht mehr funktioniert.

Der Fehlerbericht enthält am Ende auch einen Workaround, der bei mir funktioniert: In der Datei /etc/sysctl.d/bindv6only.conf die Variable net.ipv6.bindv6only von 1 auf 0 setzen, und schon dürfen IPv6-Sockets auch IPv4-Pakete empfangen. [Update: Mit dem Aufruf invoke-rc.d procps restart muss die Konfiguration dann noch neu geladen werden.] Problem solved.

Nun muss dieser Bug nur noch unter dem Google-Query “Debian Eclipse network connection error” erscheinen, dann wäre er auch keinen Blogeintrag mehr wert. 8-)

Understanding the Perl/UTF-8 Madness

Ich habe gerade eine halbe Stunde damit verbracht, mal wieder diesem grandiosen xkcd-Comic gerecht zu werden. Los ging das mit einem Link, den ich bei qbi im Blog gefunden habe: Surviving the Perl/UTF-8 Madness. Der Name des Autors kam mir bekannt vor, ich glaube Tux hat ab und zu mal Links von dessen privatem Blog fallen lassen. Ich war also gespannt, was da kommt und wurde dann leider enttäuscht.

Worum geht’s? Es geht um Perl und wie Perl mit Encodings umgeht. Seit Perl 5.8 gibt es da ein sinnvolles Vorgehen, das sich aber anscheinend noch nicht rumgesprochen hat. Nachlesen kann man das sehr gut zusammengefasst im Tutorial perlunitut. Ich fasse das hier nochmal auf deutsch zusammen, weil es da anscheinend immer noch Missverständnisse gibt.

Wichtig zu wissen: Perl unterscheidet text/character strings von byte/binary strings (und das wirkt sich auf bestimmte Befehle wie print, uc, length usw. aus). Es wird häufig behauptet, die text strings wären UTF-8. Das mag so sein, ist aber völlig irrelevant und geht am eigentlichen Problem vorbei. Wie Perl diese text strings intern darstellt, kann einem total egal sein. Wichtiger ist, wie man damit umgeht und das fasst auch perlunitut korrekt zusammen:

  1. Receive and decode
  2. Process
  3. Encode and output

D.h. alles, was von außen kommt, egal ob von Nutzereingaben, aus Dateien oder Datenbanken, ist zunächst mal ein binary string. Wenn das Zeichenketten sind, mit denen ich Zeichenkettenoperationen durchführen will, muss ich die als erstes von byte strings in character strings umwandeln. Dazu kann ich binmode setzen, einen encoding Parameter bei open nutzen oder die decode-Funktionen aus dem Module Encoding bemühen, das ist faktisch alles das selbe, Tim Toady halt.

Der zweite Schritt ist klar: process, irgendwie auf den character strings rumackern. Beim dritten Schritt, dem output aus Perl raus dann der umgekehrte Weg: ich wandle meine character strings zurück in byte strings mit dem entsprechenden Encoding meiner Zielplattform, sei es nun STDOUT, ein file oder eine Netzwerkverbindung, egal und ebenfalls egal, ob das iso8859* oder UTF-8 oder sonstwas ist. Wenn man diese drei Schritte im Kopf behält und Worte wie utf-8 flag aus seinem Hirn streicht, kommt man mit Perl und Zeichensätzen klar.

Bisschen aufpassen muss man bei Fremdmodulen, da muss man im Zweifelsfall mal genauer hinsehen, wie die das handhaben. Was man vermeiden sollte: einfach davon ausgehen, dass Perl intern UTF-8 zur Repräsentation von character strings verwendet. Damit wird man über kurz oder lang auf die Nase fallen.

Neben perlunitut gibt es noch weitere gute Quellen zum Nachlesen:

Wenn man tiefer eintauchen will, kann man auch noch perlunicode oder perluniintro lesen, aber das ist dann schon harter Stoff. ;-)