Das böse „F“-Wort

Als Mitarbeiter des Rechenzentrums etwas über Filesharing zu schreiben ist wohl so als ob der Papst ein Lehrvideo zur Benutzung von Kondomen auf YouTube einstellt, aber ich bin ja schon lange für ein drittes vatikanisches Konzil. 🙂 P2P-Filesharing verströmt bekanntlich seit Langem den Duft des Illegalen, seine legalen Anwendungsbereiche dürfen dabei aber nicht übersehen werden und sind inzwischen sogar Gegenstand wissenschaftlicher Untersuchungen.

Hier soll es nun um ein Filesharing-Tool gehen, dessen Dienste ich speziell in LAN-Umgebungen nicht mehr missen möchte. Der konkrete Anlass war die Versammlung eines halben Dutzends bier- und chipsbewaffneter Endzwanziger nebst mehr oder minder moderner Unterhaltungselektronik in meinem Keller, kurz und neudeutsch: Eine LAN-Party. Aufgrund des höchst unterschiedlichen Alters des mitgeführten Equipments – die Spanne reichte von cebitfrisch bis prähistorisch – erwies es sich als erstaunlich schwierig, die neuesten Warcraftkarten oder die letzten Partybilder untereinander auszutauschen. Windows-Dateifreigaben mussten erstmal eingerichtet werden, waren dann über verschiedene Versionen (98, 2000, XP, Vista) aber auch nicht erreichbar, Linux wollte auch nicht so recht mitspielen und wenn dann noch diverse Personal Firewalls etwas zu sagen haben, kann man die Sache komplett vergessen. Also wurden schließlich USB-Sticks oder externe Festplatten herumgereicht, alles sehr nervig und unflexibel.

Ich machte mich bei nächster Gelegenheit auf die Suche nach einem Tool, welches dieses Dilemna eleganter lösen sollte. Und ich fand Lanshark, ein Programm des Schweizers Jonas Wagner. Die Programmversion 0.0.2 stimmte mich zwar etwas bedenklich, aber die verwendete Programmiersprache Python gab Anlass zur Hoffnung, dass ich das Programm selbst für meine Zwecke anpassen konnte. Das war im Endeffekt aber gar nicht nötig, da Lanshark bereits in der vorliegenden Version genau das Werkzeug war, nach dem ich gesucht hatte. Das Programm ist unter der GPL freigegeben, die Installation ist kinderleicht, Lanshark sucht im lokalen Netz selbständig nach Austauschpartnern, die Oberfläche ist übersichtlich und es gibt ein paar weitere nette Features (UTF8-Support oder eine Resumefunktion zum Beispiel). Daher beschränke ich meine Beteiligung am Projekt momentan auf die Pflege des Pakets für Debian/Ubuntu. Lanshark ist darüber hinaus für Windows, Gentoo und als tar-Ball für andere Linuxderivate verfügbar.

Abgesehen davon, dass es für LAN-Partys sehr nützlich ist, verwende ich Lanshark auch manchmal bei der Arbeit, z.B. um Dateien schnell und unkompliziert auf mehrere virtuelle Maschinen zu verteilen (wenn AFS nicht zur Verfügung steht). Also: Testen und immer schön artig (und legal) bleiben!

Python 3000 erschienen

Selten wurde das neue Release einer Programmiersprache so kontrovers diskutiert wie bei Python 3000 (auch „Py3K“ genannt). Und das hat seinen Grund, schließlich ist die neue Version in einigen häufig genutzten Bestandteilen inkompatibel zu den Vorgängern. Die Wandlung der „print“-Anweisung hin zur Funktion ist wohl das berühmteste Beispiel, aber darüber hinaus gibt es weitere wichtige Änderungen, u.a.:

  • viele Methoden und Funktionen liefern statt Listen nun Iteratoren oder „Views“ zurück (z.B. map, filter, dict.keys)
  • syntaktische Änderungen, z.B. beim Exception Handling („as“ statt Komma)
  • Unicode ist nun der Standard zur Zeichenkodierung (siehe das „Unicode-Howto“)
  • Divisionen liefern nun Fließkommazahlen, keine abgeschnittenen Integers
  • „old-style-classes“, also Klassen, die nicht von einer Basisklasse abgeleitet wurden, sind nicht mehr erlaubt
  • einige Funktionen und Methoden wurden umbenannt („raw_input“ wurde zu „input“) oder komplett entfernt („has_key“, „file“)
  • neue nützliche Helfer wie die „with“-Anweisung oder das „multiprocessing“-Paket sind hinzugekommen

Eine komplette Liste der Änderungen findet man unter: http://docs.python.org/dev/3.0/whatsnew/3.0.html. Zusätzlich sollte man beachten, dass die kürzlich erschienene Version 2.6 bereits einige Backports von Python 3000 beinhaltete, sofern diese kompatibel mit Python 2.x waren. Die (entsprechend langen) Release Notes zu Python 2.6 findet man unter: http://docs.python.org/dev/whatsnew/2.6.html

Wer seine bestehenden Skripte auf Kompatibilität zu Python 3000 prüfen möchte, kann dies unter Python 2.6 mit dem Kommandozeilenparameter „-3“ tun. Wer seine Skripte automatisch in Python 3000 portieren möchte, kann hierfür das Tool „2to3“ verwenden. Häufig ist manuelles Nacharbeiten aber dennoch erforderlich.

Fehler in Gnome bei Aufruf eines Webservers

Mir ist im Rahmen der Arbeit mit dem Modul “webserver” von Python aufgefallen, dass Gnome bzw. GTK einen kleinen Fehler aufweist. Beim Aufruf einer URL erscheint nämlich ggf. die Nachricht “Error: Failed to send command: 500 command not parseable” auf stderr. Der folgende Aufruf behebt das Problem (für Firefox als Webbrowser, eine Zeile):

gconftool –set /desktop/gnome/url-handlers/http/command
–type=string ‘firefox -remote openurl('/%s,new-tab')’

Ob der Fehler überhaupt existiert, kann mit folgendem Befehl geprüft werden:

gconftool –get /desktop/gnome/url-handlers/http/command

Wenn bei der Ausgabe die “openurl” Option in Anführungsstrichen steht, existiert der Fehler.

Die Kontrolle nochmal mit Python und dem subprocess-Modul:

>>> import subprocess
>>> p1 = subprocess.Popen([“gconftool”,”–get”,
”/desktop/gnome/url-handlers/http/command”],stdout=subprocess.PIPE)
>>> p1.communicate()[0]
‘firefox -remote “openurl('/%s,new-tab')”n’

Das Geheimnis der Semaphoren

Nein, hier geht es nicht etwa um die Hüter des schringseldingselnden Donnerwutzes aus Harry Potter, sondern um Datenstrukturen zur Prozesssynchronisation, die mich auf unseren Linuxservern schonmal des öfteren ärgern. Wenn beispielsweise Apacheprozesse mit einem “Segmentation fault” abrauchen oder mit der Meldung “no space left on device” die Arbeit verweigern, obwohl die Platte mehr als genug Platz bietet, sind nicht selten die Semaphoren daran schuld (wer nicht weiß, was Semaphoren sind: http://de.wikipedia.org/wiki/Semaphor_%28Informatik%29).

Nun gibt es zwei Wege, sich zu behelfen, wenn einem die Semaphoren ausgehen: Die Anzahl der Semaphoren erhöhen oder die bestehenden abschießen.

Die Anzahl der Semaphoren erfährt man im (virtuellen) proc-Dateisystem unter “/proc/sys/kernel/sem”. Die 4 Zahlen repräsentieren die Kernelparameter SEMMSL, SEMMNS, SEMOPM, SEMMNI (Google kennt die Bedeutung ;) ).

Die folgende Einstellung hat uns wesentlich mehr Ruhe vor diesen Plagegeistern verschafft:

sysctl -w kernel.sem=”1000 96000 128 500″

Zum Abschießen hat sich bei uns ein kleines Shellskript bewährt, das vor allem darauf achtet, keine Semaphoren des Users “root” zu erwischen, was unangenehme Folgen haben könnte (ohnehin übernehme ich für die Tipps keine Garantie in Bezug auf unerwünschte Nebenwirkungen!):

#!/bin/bash
sem=`sudo ipcs -s | grep -v root | grep 0×00 | cut -d’ ‘ -f2`
for i in $sem; do sudo ipcrm sem $i; done

Ein weiterer Beitrag zum Thema: http://www.cryptronic.de/wiki/Blogs/20070211_vserver_und_semaphores