Artikel - 27.7.2005 - 14.8.2005

trac - Softwareprojektmanagement leicht gemacht

trac ist ein Webinterface für Subversion -Repositories. Allerdings ist es nicht nur die passende Weboberfläche - dazu kommt ein Wiki, ein Bugtracking-System, eine Meilensteinverwaltung und sehr komfortabel zu erstellende Reports auf Basis des Bugtrackings. Und das ganze in einer sehr leicht installierbaren Packung - bei Debian genügt ein apt-get install trac und dann mit trac-admin initenv eine Trac-Instanz erzeugen. Das ganze sieht auch noch recht ansprechend aus und die Funktionen sind sehr gut integriert - Links aus den Tickets ins Wiki oder Links von Changeset-Bescheibungen in das Wiki oder das Bugtracking sind einfach zu machen und helfen natürlich gewaltig bei der Verwaltung der Softwareänderungen. Dazu kommt eine nette Timeline die Änderungen am System dann zeitlich dokumentiert und verlinkt - unter anderem auch auf einen sehr komfortablen Changeset-Browser.

Ich hab für TooFpy jetzt das ganze handgestrickte Zeugs weggeworfen und auf trac umgestellt. Allein schon die Möglichkeit meine bisher im Sourcetree verwaltete ToDo-Liste jetzt über Tickets den geplanten Releases zuzuordnen bringt eine Menge Überblick über das Projekt.

Yep, wer ein Softwareprojekt verwalten muss sollte sich definitiv trac mal angucken, denn wer nicht unbedingt Kontrollfetischist ist wird sicherlich mit der eher offenen Struktur von trac glücklicher als mit manchem overengineered Teil.

RBL Betreiber mal wieder

Nachdem ich schon im April drüber geschrieben habe, ists jetzt auch endlich im Heise Ticker: RFC-ignorant: Alle .de-Domains unter Spamverdacht. Die Ignoranten von RFC-Ignorant werden sicherlich ihre Meinung nicht ändern, aber vielleicht nimmt jetzt der eine oder andere Provider diese hirnrissige Sperrliste aus der Mailkonfiguration raus.

Privacy-Update unter OS X

In IRC, identd und Privacy hatte ich mich drüber mokiert das die Proxies mit SOCKS-Support eher dünn gesäht sind - mitlerweile ist das deutlich besser geworden. Denn X-Chat Aqua ist mitlerweile in einem Zustand der als sehr brauchbar bezeichnet werden kann - nach vielen Jahren Snak-Benutzung bin ich jetzt tatsächlich umgestiegen.

X-Chat Aqua unterstützt SOCKS und erlaubt es damit direkt tor zu benutzen. Allerdings ist das nicht SOCKS4A - von daher werden Nameserver-Auflösungen immer noch sichtbar. Idealerweise trägt man einfach die IP-Adresse des Servers ein, dann braucht keine Namensauflösung zu passieren.

Bei Jabber siehts mitlerweile mit PSI auch sehr gut aus - PSI ist unter OS X sehr brauchbar und die Darstellungsprobleme älterer Versionen sind auch behoben. Und PSI arbeitet ebenfalls mit tor zusammen.

Browsen über tor ging schon vorher problemlos, aber mit den aktuellen Mac OS X Builds von tor ist das ganze auch noch nett einfach zu installieren. Als Tipp: ich habe mir eine eigene Netzwerkkonfiguration angelegt, mit der ich die Proxy-Einstellungen leicht wechseln kann. Damit kann ich dann einfach im Apfelmenü Privoxy+Tor ein- und ausschalten wie ich es brauche. Funktioniert natürlich nur mit Browsern die ihre Proxy-Einstellungen aus den Systemeinstellungen holen.

ssh-Nutzung über tor ist mit dem ProxyCommand-Kram einfach machbar. Eine Anleitung ist in der Torify HowTo. Viele der dort genannten Tipps funktionieren auch unter OS X, da ja ein normales Unix drunter liegt.

Zu dem Bayern-Getöse

fällt mir nix weiter ein als ein herzhaftes: Weiter so, Herr Stobier! - ist doch wahr, einen besseren Wahlhelfter kann sich die Linkspartei doch garnicht wünschen als den tobenden Giftzwerg aus dem Hinterwald. Ok, seine Entgleisungen entberen nicht einer gewissen Peinlichkeit - schon ärgerlich wenn in Bayern ja angeblich die Leute so schrecklich schlau sind, aber der Landesvater mal wieder nicht kapiert was Demokratie bedeutet. Nunja, egal was rauskommt, Herr Stoiber, eines ist sicher: von Bayern werden wir nicht regiert werden. Und so wie sie gerade Frau Merkel demontieren, da ist plötzlich für die SPD wieder alles drin. Vielen Dank an Sie und Ihren Kollegen Schöhnbohm, die mit ihren hahnebüchenen Aussagen vermutlich mehr Ost-Wähler mobilisiert haben als Gysi und Lafontaine zusammen ...

Mac OS X Intel hacked to run on standard PCs

Ist ja schon bitter wenn OS X Intel schon gehackt ist, bevor es eigentlich verfügbar ist:

MacBidouille reports that the Apple Developer kit version of Mac OS X x86, released to developers in early June, has been "hacked" to work with a PC notebook. The report includes a video showing Mac OS X x86 booting natively on a Pentium M 735-based notebook.

Und das trotz TPM und ähnlichen Spielereien. Vielleicht sollte Apple doch wieder auf PowerPC zurückswitchen, das ist zwar nicht sicherer, aber wenigstens gibts keine Alternativhardware zum Spottpreis wie bei den Intels

RIP last.fm

In das Netzbuch: last.fm verhärmt sich selbst beschreibt Ralf wie last.fm sich aus der Realität verabschiedet. Auch ich werd mich wohl von meiner früheren Empfehlung jetzt verabschieden - propreitäre Streamingclients gibts schon genug, da brauchts keinen weiteren - vor allem nicht, wenn der nicht mal vernünftig funktioniert. Schade - war ne nette Sache um auf neue und interessante Musik gestoßen zu werden. Aber so nicht.

SCO-Patent-Fallout?

Jedenfalls wird drüber spekuliert, das die Klage einer EFax-Firma gegen Konkurrenten wegen Einsatz von Asterisk mit SCO und dem ganzen Mist drumherum zu tun haben könnte:

Bei Groklaw wird nun spekuliert, inwieweit es sich bei dem Vorstoß um einen allgemeinen patentrechtlichen Angriff auf freie Software handeln könnte. Anlass dazu gibt eine enge Verknüpfung zwischen der SCO Group und j2. So gehört zu den Unterstützern der Softwarefirma, die sich seit langem in einem heftigen Streit um das geistige Eigentum in Linux-Komponenten insbesondere mit IBM befindet, die Investmentfirma Krevlin Advisors. Sie ist auch Großanteilshalter bei j2.

Aber auch wenn an den Gerüchten nix dran ist wird das ganze sicherlich wieder mal idiotisch und lästig - und wieder ein Beweis dafür, das Softwarepatente und Businessmethodenpatente hirnverbrannter Quatsch sind. Auf jeden Fall könnte Asterisk(im Prinzip eine in Software realisierte Telefonanlage) demnächst ein weiteres Kampfgebiet werden - allein schon weil es sicherlich dem einen oder anderen Hersteller von kleineren Telefonanlagen als Bedrohung erscheinen mag. Und gerade der Markt der Telefonanlagen ist ja eh durchzogen von sehr seltsamen Verkaufsstrategien und noch seltsameren Vertragssituationen (nicht umsonst werden immer mal wieder Telefonanlagenwartungsverträge wegen Verstoss gegen die guten Sitten als ungültig erklärt).

Coooool!

BlackDog ist ein PowerPC-Rechner mit 64 MB Speicher und 512 MB Flash-Disc in einem Mini-Gehäuse das man in jeden PC mit Windows oder Linux in den USB-Port stöpseln kann. Dort übernimmt dann der PowerPC-Prozessor die Tastatur, die Maus und den Bildschirm und startet sein Debian Linux, dessen Desktop man dann auf dem PC sieht.

Das Teil läuft nur aus der USB Stromversorgung und hat noch zusätzlich eine biometrische Zugangssicherung per Fingerabdruck. Wow. Schöne kleine Hackerkiste für unterwegs, man muss nur einen Wirtsrechner vorfinden.

Und es ist komplett in der Architektur offen und hackbar - es gibt sogar einen Hack-Wettbewerb um interessante Anwendungen dazu zu entwickeln. Wobei mir schon klar wäre was ich draufpacken würde - all die notwendigen Netzwerktools. Ich glaube ich muss mal in der Firma den Chef motivieren das wir dringend mal gucken müssen was man mit so einem Teil machen kann. So einen heftigen haben wollen Reflex hatte ich schon lange nicht mehr.

Informationen zur Canon EOS 5D aufgetaucht

Also die Gerüchte zur Canon EOS 5D klingen ja schon recht interessant - eine Vollformatsensorkamera für 3500 könnte mich jedenfalls reizen. Die bisherigen Kontrahenten im Vollformatsektor waren ja utopisch teuer (jaja, ist die 5D eigentlich auch, aber die Utopie ist etwas näher gerückt )

Oracle Cluster File System 2 für Linux

Das Oracle Cluster File System könnte schon eine nette Alternative zu GFS und Coda sein - jedenfalls wenn das hier wirklich passiert:

Der für den Linux-Kernel 2.6 verantwortliche Linux-Entwickler Andrew Morton will das Oracle Cluster File System in der Version 2 möglichst bald in den offiziellen Linux-Kernel aufnehmen. Schon Linux 2.6.14 könnte das OCFS 2 enthalten und wäre dann die erste Cluster-Komponente im offiziellen Linux-Kernel.

Den bisherige Clusterfilesysteme kranken gerade unter der fehlenden Integration - meist kann man sie eben nicht in jeder Kernelversion benutzen. Für mich interessant ist natürlich noch wie selbstständig die Knoten wirklich sind und ob es auch beim Oracle Cluster Filesystem einen single point of failure gibt, wie in es z.B. der Lockingdaemon bei OpenGFS ist. Bisher waren wir in der Firma nicht sehr erfolgreich in der Evaluierung von Clusterfilessystemen, eigentlich waren alle irgendwie dämlich ...

The Hidden Boot Code of the Xbox

In The Hidden Boot Code of the Xbox schreiben die X-Box-Linux-Programmierer wie der Sicherheitscode der X-Box aufgebaut ist und wie Microsoft in 512 Byte Code gleich 3 Fehler eingebaut hat. Lots of kindergarten security mistakes. - wie Bruce Schneier es nennt.

Schön ist auch das Fazit des Artikels:

So with the first version of the MCPX, Microsoft was too naive and apparently did not understand basic security concepts. After they had learnt their lesson, they designed a pretty good system with the second version of the MCPX - but the implementation still contained at least three security holes (Visor, MIST, TEA). They were too fast releasing a new version of the MCPX, spending a lot of money in trashing tons of already manufactured MCPX chips and manufacturing updated ones, apparently without any further code audit which should have revealed the security holes.

512 bytes is a very small amount of code (it fits on a single sheet of paper!), compared to the megabytes of code contained in software like Windows, Internet Explorer or Internet Information Server. Three bugs within these 512 bytes compromised the security completely - a bunch of hackers found them within days after first looking at the code. Why hasn't Microsoft Corp. been able to do the same? Why?

Genau. Wieso kriegt Microsoft sowas nicht hin? Wieso fällt gerade Microsoft immer wieder bei Security dermaßen auf die Schnauze? Und kommt mir jetzt nicht mit der albernen Ausrede das die Bugs bei Microsoft nur deshalb so schnell gefunden werden weil das so viele User benutzen - das sind hier banalste Grundlagenkenntnisse die erforderlich wären. Das ist einfach nur schlampig.

Und nun, Herr McBride?

Shit hits Fan für SCO:

A: There was a release of SCO LinuxWare release 7.1.2 that included the Linux kernel personality and SCO Linux-release 7.1.3 included the Linux kernel personality. At first when it first shipped it did include the Linux kernel packages which were subsequently removed.

Find ich schon irgendwie passend, wenn SCO erwischt wird das es selber den Linux-Kernel - der ja immerhin unter GPL steht - in ihren Produkten zumindestens zeitweilig benutzt und mit ihnen ausgeliefert haben. Könnte mit ein Grund sein, warum sie jetzt versuchen die GPL als unamerikanisch und nicht verfassungskonform zu denunzieren

Yep. Macht Sinn.

Nicht Intelligent Design, sondern das Google-Bombing des Ausdrucks natürlich.

EU-Kommission mal wieder im Alleingang

Diesmal mit direkter Attacke auf den gesunden Menschenverstand und das Bio-System: EU-Kommission genehmigt Genmais-Import:

Umstrittener Genmais darf künftig als Futtermittel in die EU-Staaten eingeführt werden. Die EU-Kommission traf damit eine Entscheidung im Alleingang.

Ich wiederhols nochmal: ich bin eigentlich Pro-EU eingestellt und sehe langfristig nur in einer funktionierenden Europäischen Union einen wirklich gangbaren Weg für unsere Region. Aber nicht mit so einer EU-Kommission, in der einfach mal eben willkürliche Entscheidungen getroffen werden die jedem gesunden Menschenverstand zuwiderlaufen. Und das alles nur zum finanziellen Wohl eines nicht-europäischen Unternehmens, dessen einziges Ziel es ist den europäischen Markt zu knacken und genauso zu dominieren wie andere Märkte auch schon.

Man reiche Darl McBride die Frog Pills

denn jetzt dreht er völlig ab:

Im Einzelnen zählt McBride zehn Punkte auf, die für SCO und gegen Linux sprechen. So sei der OpenServer wesentlich preiswerter als Linux-Systeme, die mit versteckten Jahreslizenzen arbeiten, habe einen überlegenen Kernel und biete wesentlich höhere Sicherheit als Linux-Systeme, bei denen Sicherheitslücken wochenlang offen bleiben würden. Mehrfach betont McBride, dass seine Firma Eigentümer von Unix ist und aus diesem Grunde höheres Vertrauen bei der Kundschaft besitze. Außerdem sorge SCO als Eigentümer dafür, dass es keine Absplitterungen inkompatibler Systemvarianten gebe.

Selten einen so kompakten Block von Bullshit gesehen

Mathematische Unkenntniss

Es ist ja schon fast modern zu erzählen wie schlecht man in Mathe war (ich nicht, ich war sehr gut in Mathe - und ja, mir hat Mathe sehr viel Spaß gemacht), aber wenn man dann von James Gosling die Fragen zu Sinus/Cosinus und den Sinn der Periodendefinition mit 2*Pi liest, dann packt man sich schon an den Kopf. Slava Prestov sieht darin immerhin die Erklärung warum die meisten Programmierer saublöde Fragen zu simpelsten mathematischen Problemen stellen, wenn selbst die Grössen der Branche einfache Trigonometrie nicht kapieren ...

man lernt doch nie aus

Ich hab ja bisher gedacht ich würde die meisten Tricks von ssh drauf haben. Aber ich bin dann doch mal über einen gestolpert, der banal und simpel ist, mir aber noch nicht bekannt war: die Option ProxyCommand. Mit dieser Option kann man für einen angegebenen Host einen Tunnel definieren der aufgebaut wird, bevor die eigentliche Verbindung gemacht wird. Mit dem Programm nc (Netcat) auf dem Rechner eins vor dem Zielsystem kann man sich damit wunderbar durch eine Kette von Firewalls tunneln, vor allem wenn man mit Auth-Forwarding arbeitet. Einfach in der .ssh/config einen Bereich ähnlich diesem einbauen:


 Host safe
 Protocol 2
 User me
 HostName 192.168.0.42
 ProxyCommand ssh door nc -q 0 safe 22

Hier wird jetzt einfach bei ssh safe intern mittels ssh door eine Verbindung zum Rechner door aufgebaut und dann dort eine Netcat-Verbindung zum ssh-Daemon auf dem eigentlichen Zielrechner safe erstellt. Das ganze kann man auch über mehrere ssh Hops wunderbar nutzen um dann direkt zwischen zwei Systemen durch eine Kette von Firewalls Files zu transportieren. ssh ist schon genial, wenns das nicht gäbe müsste man es glatt erfinden

(in meinem Fall brauchte ich das für darcs - das kann nämlich nur über ssh Repositories pushen)

auf dem Weg in die Medien-Monokultur

Denn Springer übernimmt ProSiebenSat.1 - und dürfte damit ihre neoliberale Meinungskampagne demnächst multimedial starten und ihren Müll dann auf allen Kanälen senden. Eine Demokratie benötigt eine unabhängige, starke Presse - aber eine, die nicht eine eigene politische Agenda verfolgt. Von daher können wir wohl einem weiteren Stückchen Demokratie gute Nacht sagen, wenn ein Konzern wie Springer demnächst die Medienkluft überbrückt.

Umwelt-Ausverkauf in D-Dorf

War ja zu erwarten, die Landesregierung stellt umweltpolitische Ziele vor - und was bringt das:

Auch bei der neuen NRW-Landesregierung werde der Umweltschutz "hohen Stellenwert" haben - verspricht Umweltminister Eckhard Uhlenberg. Doch den Einfluss der Naturschutzverbände will er verringern.

Und dann noch so diverse andere Nettigkeiten, im Prinzip eine Demontage dessen was die NRW-Umweltpolitik gegen die ziemlich schlaffe Haltung des Bundes bisher immer ausgezeichnet hat (und wohl ein Verdienst von Frau Höhn war - nicht das jemand glaubt die SPD in NRW wäre sonderlich umweltbewusst gewesen).

Passwörter als Hashes speichern - sicher?

Nicht mehr ganz neu (Sommer letzten Jahres war es neu, aber da hab ich es irgendwie verpasst, das zugrundeliegende Paper ist sogar schon 2 Jahre alt), aber immer noch interessant: Project RainbowCrack ist ein Projekt das die Erstellung von Tools zum schnelleren Knacken von Hashes zum Ziel hat. Hashes können normalerweise nur durch brute force aufgelöst werden - unterstützt durch algorithmische Schwächen (wie kürzlich bei MD5 und SHA1 gefunden). Es gibt aber einen Ansatz die aufwändigeren Berechnungen die beim brute-force-Vorgang anfallen (also im Prinzip algorithmische Teilschritte) schon im Vorhinen zu erstellen - zum Beispiel wenn man eh nur vor hat z.B. Passwörter mit maximaler Zeichenzahl zu knacken.

Das ganze kommt natürlich nicht umsonst: man tauscht Rechenzeit gegen Speicherplatz ein. Tabellen zum Knacken von bis zu 14 stelligen Windows Passwörtern belegen lockere 64 GiB an Speicher. Die praktische Relevanz des Ansatzes und der Tools wird aus diesem Zitat vielleicht offensichtlich:

Some ready to work lanmanager and md5 tables are demonstrated in Rainbow Table section. One interesting stuff among them is the lm #6 table, with which we can break any windows password up to 14 characters in a few minutes.

Zu Project RainbowCrack gibts auch noch eine Weboberfläche zu einem verteilten Rechencluster über die man MD5-Hashes an einen MD5-Cracker schicken kann und der dann - sofern es ein maximal 8 Zeichen langer String ist - den Klartext rausspuckt. Und das Teil baut nebenbei immer mehr Rainbow Tables auf, wodurch das Knacken nach und nach schneller wird.

Nur so als Warnung für diejenigen, die meinen das ein einfacher MD5 Hash (oder letztendlich nahezu jeder Hash) auf das Passwort ausreichend wäre. Unix-Systeme benutzen üblicherweise salted hashes - das Passwort wird um einen offenen Text erweitert und damit zusammen dann der Hash gebildet. Das verlängert im Prinzip das Passwort, auch wenn natürlich die Verlängerung nicht geheim ist - für die Rechenzeit oder die Tabellengrösse ist das wurscht, die Passwörter sind einfach länger und damit schwerer zu knacken. Ist aber auch nur eine Frage von Platz, bis die nicht sicher sind.

Besser sind Passphrases statt Passwörter - eben einfach normal lange Sätze. Zum Einen kann man sich diese häufig besser merken (viele Menschen können sich keine Telefonnummer merken, aber Zeilen aus Gedichten zitieren) und zum Anderen sind sie einfach länger (und vor allem flexibel lang), so das Rainbow Tables als Angriffsmethode ausscheiden. Die algorithmischen Schwächen von MD5 und SHA1 bleiben natürlich erhalten.

Shoot-to-Kill Direktiven - und die Welt wird ein Egoshooter

Bruce Schneier über Shoot-to-Kill und dabei speziell ein Vorschlag der International Association of Chiefs of Police . Übersetzt aus dem Vorschlag:

... eine solche Person zeigt "verschiedene ungewöhnliche Verhaltensweisen" wie einen schweren Mantel oder eine dicke Jacke bei warmem Wetter tragen, einen Koffer, eine Umhängetasche oder einen Rucksack mit Ausbeulungen oder erkennbaren Drähten tragen. Die Person zeigt Nervosität, vermeidet Augenkontakt oder schwitzt stark. Möglicherweise sind chemische Rückstände an der Kleidung oder an den Händen. Die Person murmelt möglicherweise Gebete oder schaukelt vor und zurück.

Wohlgemerkt, was mit solchen Personen zu geschehen hat, ist den Chiefs of Police klar: in den Kopf schiessen. Finaler Tötungsschuss. Und natürlich brauchts dafür keinen weiteren Anlass:

... die Bedrohung des Polizisten braucht nicht unmittelbar zu sein, wie bei normaler Vorgehensweise gelehrt wird. Polizisten brauchen nicht zu warten bis eine als Attentäter verdächtigte Person eine Bewegung macht, wie es bei normaler Vorgehensweise für den Einsatz von Schusswaffen notwendig wäre. Ein Polizist braucht nur eine begründete Vermutung für den Verdacht zu haben das der Verdächtige eine Bombe zünden könnte.

Bruce Schneier fragt zu Recht ob wir uns wirklich sicher fühlen dürften wenn eine solche Richtlinie umgesetzt würde. Jeder Taschendieb zeigt genug Merkmale um demnächst dann einfach mal eben abgeknallt zu werden, würde eine so menschenverachtende Richtlinie tatsächlich umgesetzt.

Wir wissen ja wie schnell menschenverachtende Ideen hier dann plötzlich auch auf die Tagesordnung kommen ...

Django, Apache and FCGI

In Django, lighttpd and FCGI, second take I described a method how to run Django with FCGI behind a lighttpd installation. I did run the Django FCGIs as standalone servers so that you can run them under different users than the webserver. This document will give you the needed information to do the same with Apache 1.3.

Update: I maintain my descriptions now in my trac system. See the Apache+FCGI description for Django.

Update: I changed from using unix sockets to using tcp sockets in the description. The reason is that unix sockets need write access from both processes - webserver and FCGI server - and that's a bit hard to setup right, sometimes. tcp sockets are only a tad bit slower but much easier to set up.

First the main question some might ask: why Apache 1.3? The answer is simple: many people still have Apache 1.3 running as their main server and can't easily upgrade to Apache 2.0 - for example if they run large codebases in mod perl or mod python they will run into troubles with migrating because Apache 2.0 will require mod perl2 or mod python2 and both are not fully compatible with older versions. And even though lighttpd is a fantastic webserver, if you already run Apache 1.3 there might just not be the need for another webserver.

So what do you need - besides the python and django stuff - for Apache 1.3 with FastCGI? Just the mod rewrite module and mod fastcgi module installed, that's all. Both should come with your systems distribution. You will still need all the python stuff I listed in the lighttpd article.

mod_fastcgi is a bit quirky in it's installation, I had to play a bit around with it. There are a few pitfalls I can think of:

  • the specification of the socket can't be an absolute path but must be a relative path with respect to the FastCgiIpcDir
  • the specification of the FCGI itself (even though it's purely virtual) must be in a fully qualified form with respect to the document root you want to use. If you use a relative path, it will be relative to the document root of the default virtual host - and that's most surely not the document root you will use if you want to set up a virtual host with the FCGI.
  • the FCGI itself can't be defined within a virtual host - it must be defined in the main server config. That's where the relative addressing problem comes into play.
  • the socket file must be both readable and writeable by the FCGI user and the Apache user. Usually you do this by changing the socket file to group writeable and changing the group of that socket file to a group where both the user and the apache are members of.

Now here is the config snippet you have to add to your httpd.conf. I use the same directories as with the lighttpd sample, you most surely will have to adapt that to your situation.


 FastCgiExternalServer /home/gb/work/myproject/publichtml/admin.fcgi -host 127.0.0.1:8000
FastCgiExternalServer /home/gb/work/myproject/publichtml/main.fcgi -host 127.0.0.1:8001

 <VirtualHost *> ServerAdmin gb@bofh.ms
 Servername www.example.com
 ErrorLog /home/gb/work/myproject/logs/django-error.log
 CustomLog /home/gb/work/myproject/logs/django-access.log combined
 DocumentRoot /home/gb/work/myproject/public_html
 RewriteEngine On
 RewriteRule ^(/admin/.)$ /admin.fcgi$1 [L]
 RewriteRule ^(/main/.)$ /main.fcgi$1 [L]
 </VirtualHost> ```

You have to allow the webserver write access to the logs directory, so you might want to use a different location for them - possibly in `/var/log/apache/ `or whereever your apache puts it's logs. The FastCgiExternalServer directives must be outside of the virtual host definitions, but must point to files within the virtual hosts document root. But those files needn't (and probably shouldn't) exist in the filesystem, they are purely virtual. The given setup reflects the setup I did for the lighttpd scenario.

Now restart your apache, start your django-fcgi.py and you should be able to access your django application. Keep in mind to copy the admin_media files over to the document root, otherwise your admin will look very ugly.

django-fcgi.py --settings=myproject.settings.main --host=127.0.0.1 --port=8000 --daemon django-fcgi.py --settings=myproject.settings.admin --host=127.0.0.1 --port=8001 --daemon


Have fun.

EU-Hirnriss zu Urheberrechtsverletzungen

Was für ein Unfug. Kommt der Vorschlag durch, wird Open-Source-Einsatz riskant:

Ein neuer Gesetzesentwurf der Europäischen Kommission soll beim Verdacht auf Urheberrechtsverletzung bei Software auch Klagen gegen die Anwender erlauben. Neben dem Verursacher würden damit Unternehmen, die sich anhand ihrer Lizenzen in Sicherheit wiegen, ins Schussfeld geraten. Das berichtete das britische Branchenmagazin 'ZDNet UK'.

Gerade unter dem aktuellen Eindruck des SCO-Verfahrens müsste eigentlich jedem klar sein das so eine Idee vollkommener Hinriss ist - denn genau das war es ja was SCO machen wollte, alle Linux-Benutzer zu erpressen. Es gibt wirklich kaum eine Idee die dumm genug ist das sie nicht einem Politiker ins Hirn kommen könnte ...

Geocaching im Münsterland

Da ich jetzt einen Garmin Geko 201 habe, muss ich mir natürlich mal die Infos zu Geocaching angucken. Jemand einen guten Link zu Geocaching-Aktivisten in Münster und Umgebung? Wär was für unseren anstehenden Urlaub, Jutta schimpft immer das Sie das Münsterland nicht gut genug kennt, da wäre das Abklappern von Geocaches doch die ideale Methode die Gegend zu erkunden.

Als erster Startpunkt werd ich mir mal die Eintragungen bei geocaching.de für Ruhrpott und Emsland angucken - wir sind zwar weder Ruhrpott noch Emsland, aber nah genug dran um bei beiden mit drauf zu sein.

Ausserdem hab ich jetzt einen guten Grund gegenüber Jutta warum ich mir das Teil gekauft habe

Und wenn ich mir Anleitungen wie zu Vaders Stein angucke, dann wird das sogar genau für Jutta passen - Rätselspiele mag sie nämlich sehr. Hey, könnte glatt ein neues Hobby werden ...

Mal wieder neues bei Django

Neues gibts da ja dauernd, aber diesmal wieder ein sehr interessantes Feature: das inspectdb Kommando liefert nämlich aus einer PostgreSQL Datenbank die ganzen Tabellen und Felder im Format eines Python Datenmodells. Zusätzlich werden - sofern in der Datenbank abgelegt - auch Fremdschlüssel gefunden. Sehr praktisch wenn man eine Oberfläche für eine bestehende Datenbank bauen muss, man spart sich viel Tipparbeit.

Soziale Netzwerkerei

Tja, ich bin jetzt auch in einem dieser tollen sozialen (in diesem Fall dann eher business-sozialen) Netzwerke registriert, und zwar in der O'Reilly Connection. Will ja nicht als verhärmt und vergreist gelten

Wers schafft mich dort zu finden darf ne Connection zu mir definieren. Und sich über mein blödes Foto lustig machen ...

Aber Patente sind ja sooo toll ...

... dumm nur, wenn dann die eigene Zentralbank Ziel einer Patentklage ist: Europäische Zentralbank wegen Patentverletzung verklagt. Wird das vielleicht mal beim EU-Rat die Leute aufwecken? Ach watt, vergesst es, die wachen in diesem Leben nicht mehr auf, dann müssten sie ja ihre eigene Korruption erkennen ...

Coroutinen für Python

Philip J. Eby hat einen Patch zur Implementation von PEP 342 geliefert. Damit stehen die Chancen das Python in Zukunft Coroutinen haben wird sehr gut.

Und das wiederum bedeutet das Python eine - wenn auch primitive - Form von Continuations bekommt. Jetzt fehlt nur noch das sowas wie statesaver mit in Python integriert wird - für Multishot Continuations (ok, erstmal nur copyable Coroutines, aber das wäre immerhin der Anfang).

Das alles natürlich nur um dann endlich in Webframeworks mit Continuations arbeiten zu können. Ok, geht mit CherryFlow jetzt schon, aber es wäre schon wenn das ganze in das Mainstream-Python wandern würde.

Hell freezes over - a second time

Erst Intel-Prozessoren und jetzt mehr als eine Maustaste. Und sogar sowas ähnliches wie ein Scrollrad. Schockierend.

The Illusive setdefaultencoding

Ian Bicking hat in seinem Artikel über setdefaultencoding einen Verweis auf einen netten Trick drin: einfach mit reload(sys) das sys-Modul neu laden, damit setdefaultencoding verfügbar ist.

setdefaultencoding dient dazu einzustellen, welches Standardencoding bytestrings benutzen. Normalerweise ist das ASCII, kann aber auch auf iso-8859-1 oder utf-8 umgestellt werden - wenn man setdefaultencoding überhaupt hat. Das wird nämlich dummerweise beim Start der Python Laufzeitumgebung gelöscht - weil die Python-Macher da mal wieder die User bevormunden wollen.

reload(sys) ist natürlich etwas das nicht unbedingt für Vertrauen sorgt - sys ist ja ein nicht ganz unwichtiges Modul. Aber in meinen Experimenten hat es bisher gut geklappt und es hilft definitiv bei der ganzen Unicode-Problematik wenn man seinen programmen ein anderes Encoding als Standard verpassen kann.

Schöner wärs natürlich wenn in der Standarddistribution setdefaultencoding nicht mehr gelöscht würde. Klar, kann man auch erreichen durch einen Patch von site.py, aber das ist auch nicht besser als sys neu zu laden ...

(Un)trusted platform Apple?

Da es gerade modern ist zu erklären das man switched, wenn Apple TPA - oder wie auch immer das Zeugs dann in Zukunft heissen mag - einsetzt: erstmal abwarten. Angucken was Apple macht und wie - Gerüchte gibts vorher immer.

Wenn dann tatsächlich TPA drin ist: Linux kann auch ein brauchbares System sein, auch wenn die Oberflächen ziemlich krank sind (wobei aktuelle XFCE-Versionen garnicht mal so übel aussehen) und wenn in Apple-Hardware eh kein PPC mehr drin steckt und man Linux draufpackt: da kann man auch sein Notebook bei IBM kaufen. Die haben nette Geräte die auch ganz hervorragend unter Linux funktionieren.

Und last but not least: nur weil neue Apple-Hardware anders ist verändert sich die schon gekaufte Hardware nicht - und die hält Apple-typisch meist ein paar Jahre länger. Und unter Linux wird mancher Mac sogar schneller als unter OS X

Wohin Abmahnwahn und vorauseilender Gehorsam führen können

hat gerade die FFII gemerkt: Nutzwerk ließ FFII.org abschalten(etwas mehr Infos wie üblich bei Heise).

Nun war zwar die entsprechende IP-Adresse durchweg erreichbar, doch der als technischer Ansprechpartner für die Domain FFII.org eingetragen DNS-Provider kam der Forderung Nutzwerks nach und schaltete die Domain FFII.org am vergangenen Freitag Nachmittag ab. Die Namensauflösung von FFII.org sowie entsprechender Subdomains funktionierte vorübergehend nicht. Nach einer Intervention des FFII hat der DNS-Provider die Domain am Abend des gleichen Tages aber wieder frei geschaltet und will Nutzwerk um eine Präzisierung des Ansinnens bitten, so FFII-Vorstand Hartmut Pilch gegenüber Golem.de.

Ein echtes Dilemma: Dienstleister wollen sich selber schützen und leider wird durch das Teledienstgesetz eben diesen Dienstleistern das Leben schwer gemacht: auf Inhalte hingewiesen die einen Rechtsverstoß darstellen muss man diese Inhalte unverzüglich entfernen. Nur wie will man beurteilen ob Inhalte jetzt einen Rechtsverstoß darstellen? Ganz besonders wenn es um solche Sachen wie bei Nutzwerk gehen - wo kritische Berichterstattung von der Firma als Rechtsverstoß definiert wird?

Letzten Endes wird so den Firmen ein Zensurmittel in die Hand gegeben, ohne den Dienstleistern (und natürlich den Seitenbetreibern selber!) vernünftige Möglichkeiten zur Abwehr zu geben. Wie soll sich ein kleinerer Provider zum Beispiel vor Abmahnungen mit absurden Streitwerten - wie sie z.B. von der Musikindustrie mit Vorliebe eingesetzt werden - schützen? Rechtsschutzversicherungen helfen da nicht.

Kein Wunder das mancher Provider in dem Fall im vorauseilenden Gehorsam die richtige Strategie sieht - er verliert so maximal den Kunden den er abgeschaltet hat, eventuell ein bischen negative Presse, aber den Kampf gegen eine Firma mit überzogenen Vorstellungen aufnehmen, dabei kann er nicht viel gewinnen.

Wer dann so wie ich im Vorstand eines privat betriebenen Providers sitzt, der kommt bei solchen Entwicklungen schon ins Grübeln, was eigentlich die Zielsetzung dieser Gesetzesänderungen im Zuge des Teledienstgesetzes wirklich war ...

Auswirkungen von Gen-Raps und Co.

Beim Isotopp einen Pointer auf Informationen zum britischen Evaluierungsprojekt zu gentechnisch verändertem Saatgut gefunden. Erschreckend, welche Auswirkungen das zum Beispiel auf verwandte Wildkräuter hat und was das auf Dauer für uns bedeuten wird. Aber es ist ja alles sooo sicher und sooo wichtig für uns - dabei gehts eben wirklich nur um die Einnahmen für die Gentechnik-Firmen, nicht aber um das was die Verbraucher wirklich wollen.

Aber natürlich wird weiterhin jeder Kritiker von gentechnisch verändertem Saatgut als Spinner von der Wirtschaft und deren Schergen (wie z.B. Clement und manch anderer Politiker) abgetan.

Daves neuer OPML Editor mit Blog

Ich spiele gerade mit dem OPML-Editor von Dave Winer rum, mit dem er jetzt sein Blog macht. Sieht ganz witzig aus und kann einiges. Mein OPML-Blog hat einige der Erkenntnisse die ich damit gemacht habe gesammelt. Ich werde jetzt sicherlich nicht einfach mal eben so umsteigen - das wäre Quark, das ist nicht unbedingt meine Zielsoftware. Aber es macht Spaß mal wieder mit etwas ganz anderem zu spielen.

Leider hat der OPML Editor einige der Krankheiten von Radio Userland und Frontier geerbt, speziell Umlautehandhabung ist nicht so wirklich rund (ich hätte gerne endlich mal durchgängige UTF-8 Unterstützung) und das Laufzeitverhalten ist zwar besser als bei Radio, aber es zieht immer noch sporadisch zu viel CPU.

Das Konzept von gerenderten Outlines hat aber durchaus Charme. Nur leider sind noch viele Teile des Renderings nicht wirklich für normale User zugänglich - man kann zwar das uralte Table-Layout editieren und was anderes draus machen, aber die OPMLs werden mit dem internen OPML Renderer umgesetzt und die HTML-Fragmente sind nicht so einfach zu ändern - und damit zum Beispiel die Änderung der Sprache recht mühsam, genauso wie die vollständige Ausmerzung von Layouttabellen.

Mehr wird sicherlich nach und nach auf dem OPML Blog landen, hier werd ich maximal ein paar Fazits schreiben.

HEW Cyclassics 2005

Ein wirklich nettes Rennen - immer wieder erstaunlich wie selbst fast eine Viertelstunde Vorsprung nicht ausreicht um bei dem Rennen auch einen Sieg nach Hause zu fahren. Auch immer wieder erstaunlich wie die Kommentatoren jedes Mal erzählen das das Hauptfeld zu spät anfährt - so langsam sollten die das doch kennen.

Die Quickstep-Aktion jedenfalls war klasse - so sauber den Fassa Bortolo Leuten nach deren Sprintaufbau den Sieg und die Treppchenpositionen wegzunehmen ist wirklich super. Auch wenn ich natürlich lieber Zabel vorne gesehen hätte

Merkelnix krampft auch

Nur damit niemand glaubt nur die SPD hätte hirnlose Parolen in die Welt zu schreien: "Arbeit wieder in Deutschland möglich machen" ist der Grund warum sie die Mehrwertsteuer erhöhen wollen:

Unions-Kanzlerkandidatin Angela Merkel hat die von CDU und CSU geplante Erhöhung der Mehrwertsteuer verteidigt. Die Union wolle damit das Ziel erreichen, die Arbeitskosten zu senken, sagte sie in einem Interview des "Bericht aus Berlin". Es gehe darum, "Arbeit wieder in Deutschland möglich zu machen und damit die soziale Sicherung zu ermöglichen", sagte die CDU-Chefin weiter.

Sorry, aber wie saublöd ist das denn? Soziale Sicherung durch eine Anhebung der Mehrwertsteuer, die am heftigsten die trifft, die ihren Konsum nicht weiter reduzieren können weil er eh nur noch aus Grundnahrungsmitteln und anderen fürs Überleben notwendigen Ausgaben besteht?

Softwarepatente - Kommentar bei der NY Times

Die NY Times fragt warum Bill Gates 3,000 neue Patente will und findet eine massive Belagerung des Patentbüros mit Bergen von Softwarepatenten, die oft einfach nur Trivialpatente sind (wie das zitierte Patent zum Zufügen/Entfernen von Leerzeichen in Dokumenten). Der Kommentator stellt in dem Kommentar eine Forderung auf (nachdem er überlegt ob man Microsoft nicht einfach alle Patente entziehen sollte die sie schon haben):

Perhaps that is going too far. Certainly, we should go through the lot and reinstate the occasional invention embodied in hardware. But patent protection for software? No. Not for Microsoft, nor for anyone else.

Und das aus dem Land das die Softwarepatente schon lange hat und das immer wieder von den Softwarepatentproponenten in der EU als Grund für eine notwendige weltweite Harmonisierung gebracht wird.

Nein, Softwarepatente sind auch dort nicht gern gesehen und nicht wirklich sinnvoll. Auch Dan Bricklin - dem einen oder anderen noch als Visicalc-Vater bekannt - findet das:

Mr. Bricklin, who has started several software companies and defensively acquired a few software patents along the way, says he, too, would cheer the abolition of software patents, which he sees as the bane of small software companies. "The number of patents you can run into with a small product is immense," he said. As for Microsoft's aggressive accumulation in recent years, he asked, "Isn't Microsoft the poster child of success without software patents?"

Und warum macht Microsoft das jetzt? Der dafür zuständige Manager gibt einen Grund, wie er nur einem BWLer einfallen kann, so blöd ist der:

"We realized we were underpatenting," Mr. Smith explained. The company had seen studies showing that other information technology companies filed about two patents for every $1 million spent on research and development. If Microsoft was spending $6 billion to $7.5 billion annually on its R&D, it would need to file at least 3,000 applications to keep up with the Joneses.

Ok, alleine schon die Idee der Patentanmeldung alleine von Zahlen aus der Branche zu orientieren ist hirnrissig, aber wie blöd muss man sein um einen Bezug zwischen der Patentanzahl und dem Umsatz im Bereich Forschung und Entwicklung zu ziehen?

Die NY Times zieht da auch die Parallele zur Pharmaindustrie, die - zumindestens laut eigenen Aussagen - bei einem Forschungseinsatz von 20 Millionen froh ist dann ein Patent auf ein Medikament zu bekommen (wobei das schon kritisch genug ist, wie man gerade bei der AIDS-Bekämpfung in Afrika sehen konnte).

Und der Fallout wird bei der NY Times auch gut zusammengefasst:

Last year at a public briefing, Kevin R. Johnson, Microsoft's group vice president for worldwide sales, spoke pointedly of "intellectual property risk" that corporate customers should take into account when comparing software vendors. On the one side, Microsoft has an overflowing war chest and bulging patent portfolio, ready to fight - or cross-license with - any plaintiff who accuses it of patent infringement. On the other are the open-source developers, without war chest, without patents of their own to use as bargaining chips and without the financial means to indemnify their customers.

Die Frage, was Jefferson (der Gründer des US Patentsystems) dazu sagen würde, was heute alles Patente bekommen soll, ist da durchaus berechtigt. In seinem Sinne - der ja eigentlich eher auf den Schutz der wirklichen erfinderischen Genialität vor der Ausnutzung durch Konzerne galt - ist das ganze definitiv nicht.

Wahlkampf, Wahlkrampf ...

Münte on the Roll: Linkspartei "politisch und juristisch abstrus". Ich hab allerdings den Eindruck das er der SPD mehr damit helfen würde ihr ein Programm zu verpassen das die normalen Bürger wieder anspricht, anstatt einfach nur die Angst vor Links zu schüren und Verleumdungen (sorry, aber die Kombination aus PDS und WASG in der offenen Liste ist vielleicht merkwürdig, aber juristisch wohl einwandfrei - etwas anderes zu behaupten also schlicht Verleumdung) zu verbreiten.

Wenn die SPD im Wahlkampf nicht mehr schafft als nur ins Horn der Unionsparteien gegen die angebliche Gefahr von Links zu stossen, wird die SPD sich schlicht ins politische Aus begeben - mit so einem Murks gewinnt man keine Wahl. Wenn die SPD nur noch eine Union mit roter Krawatte ist, kann sie mir gestohlen bleiben ...

Writing a Simple Filesystem Browser with Django

Dieser Artikel ist mal wieder in Englisch, da er auch für die Leute auf #django interessant sein könnte. This posting will show how to build a very simple filesystem browser with Django. This filesystem browser behaves mostly like a static webserver that allows directory traversal. The only speciality is that you can use the Django admin to define filesystems that are mounted into the namespace of the Django server. This is just to demonstrate how a Django application can make use of different data sources besides the database, it's not really meant to serve static content (although with added authentication it could come in quite handy for restricted static content!).

Even though the application makes very simple security checks on passed in filenames, you shouldn't run this on a public server - I didn't do any security tests and there might be buttloads of bad things in there that might expose your private data to the world. You have been warned. We start as usual by creating the filesystems application with the django-admin.py startapp filesystems command. Just do it like you did with your polls application in the first tutorial. Just as an orientation, this is how the myproject directory does look like on my development machine:


.
|-- apps
| |-- filesystems
| | |-- models
| | |-- urls
| | `-- views
| `-- polls
| |-- models
| |-- urls
| `-- views
|-- public_html
| `-- admin_media
| |-- css
| |-- img
| | `-- admin
| `-- js
| `-- admin
|-- settings
| `-- urls
`-- templates
 `-- filesystems

After creating the infrastructure, we start by building the model. The model for the filesystems is very simple - just a name for the filesystem and a path where the files are actually stored. So here it is, the model:


 from django.core import meta

class Filesystem(meta.Model):

fields = ( meta.CharField('name', 'Name', maxlength=64), meta.CharField('path', 'Path', maxlength=200), )

def repr(self): return self.name

def get_absolute_url(self): return '/files/%s/' % self.name

def isdir(self, path): import os p = os.path.realpath(os.path.join(self.path, path)) if not p.startswith(self.path): raise ValueError(path) return os.path.isdir(p)

def files(self, path=''): import os import mimetypes p = os.path.realpath(os.path.join(self.path, path)) if not p.startswith(self.path): raise ValueError(path) l = os.listdir(p) if path: l.insert(0, '..') return [(f, os.path.isdir(os.path.join(p, f)), mimetypes.guess_type(f)[0] or 'application/octetstream') for f in l]

def file(self, path): import os import mimetypes p = os.path.realpath(os.path.join(self.path, path)) if p.startswith(self.path): (t, e) = mimetypes.guess_type(p) return (p, t or 'application/octetstream') else: raise ValueError(path)

admin = meta.Admin( fields = ( (None, {'fields': ('name', 'path')}), ), list_display = ('name', 'path'), search_fields = ('name', 'path'), ordering = ['name'], )


As you can see, the model and the admin is rather boring. What is interesting, though, are the additional methods isdir , files and file . isdir just checks wether a given path below the filesystem is a directory or not. files returns the files of the given path below the filesystems base path and file returns the real pathname and the mimetype of a given file below the filesystems base path. All three methods check for validity of the passed in path - if the resulting path isn't below the filesystems base path, a ValueError is thrown. This is to make sure that nobody uses .. in the path name to break out of the defined filesystem area. So the model includes special methods you can use to access the filesystems content itself, without caring for how to do that in your views. It's job of the model to know about such stuff.

The next part of your little filesystem browser will be the URL configuration. It's rather simple, it consists of the line in settings/urls/main.py and the myproject.apps.filesystems.urls.filesystems module. Fist the line in the main urls module:


 from django.conf.urls.defaults import *

urlpatterns = patterns('',
 (r'^files/', include('myproject.apps.filesystems.urls.filesystems')),
 )

Next the filesystems own urls module:


 from django.conf.urls.defaults import *

urlpatterns = patterns('myproject.apps.filesystems.views.filesystems',
 (r'^$', 'index'),
 (r'^(?P<filesystem_name>.*?)/(?P<path>.*)$', 'directory'),
 )

You can now add the application to the main settings file so you don't forget to do that later on. Just look for the INSTALLED_APPS setting and add the filebrowser:


 INSTALLED_APPS = (
 'myproject.apps.polls',
 'myproject.apps.filesystems'
 )

One part is still missing: the views. This module defines the externally reachable methods we defined in the urlmapper. So we need two methods, index and directory . The second one actually doesn't work only with directories - if it get's passed a file, it just presents the contents of that file with the right mimetype. The view makes use of the methods defined in the model to access actual filesystem contents. Here is the source for the views module:


 from django.core import template_loader
 from django.core.extensions import DjangoContext as Context
 from django.core.exceptions import Http404
 from django.models.filesystems import filesystems
 from django.utils.httpwrappers import HttpResponse

def index(request):
 fslist = filesystems.getlist(orderby=['name'])
 t = templateloader.gettemplate('filesystems/index')
 c = Context(request, {
 'fslist': fslist,
 })
 return HttpResponse(t.render(c))

def directory(request, filesystem_name, path):
 import os
 try:
 fs = filesystems.getobject(name exact=filesystemname)
 if fs.isdir(path):
 files = fs.files(path)
 tpl = templateloader.gettemplate('filesystems/directory')
 c = Context(request, {
 'dlist': [f for (f, d, t) in files if d],
 'flist': [{'name':f, 'type':t} for (f, d, t) in files if not d],
 'path': path,
 'fs': fs,
 })
 return HttpResponse(tpl.render(c))
 else:
 (f, mimetype) = fs.file(path)
 return HttpResponse(open(f).read(), mimetype=mimetype)
 except ValueError: raise Http404
 except filesystems.FilesystemDoesNotExist: raise Http404
 except IOError: raise Http404

See how the elements of the directory pattern are passed in as parameters to the directory method - the filesystem name is used to find the right filesystem and the path is used to access content below that filesystems base path. Mimetypes are discovered using the mimetypes module from the python distribution, btw.

The last part of our little tutorial are the templates. We need two templates - one for the index of the defined filesystems and one for the content of some path below some filesystem. We don't need a template for the files content - file content is delivered raw. So first the main index template:


{% if fslist %}
<h1>defined filesystems</h1> <ul> {% for fs in fslist %}
<li><a href="{{ fs.get_absolute_url }}">{{ fs.name }}</a></li> {% endfor %}
</ul> {% else %}
<p>Sorry, no filesystems have been defined.</p> {% endif %}

The other template is the directory template that shows contents of a path below the filesystems base path:


 {% if dlist or flist %}
 <h1>Files in //{{ fs.name }}/{{ path }}</h1> <ul> {% for d in dlist %}
 <li> <a href="{{ fs.getabsoluteurl }}{{ path }}{{ d }}/" >{{ d }}</a> </li> {% endfor %}
 {% for f in flist %}
 <li> <a href="{{ fs.getabsoluteurl }}{{ path }}{{ f.name }}" >{{ f.name }}</a> ({{ f.type }})</li> {% endfor %}
 </ul> {% endif %}

Both templates need to be stored somewhere in your TEMPLATE PATH. I have set up a path in the TEMPLATE PATH with the name of the application: filesystems . In there I stored the files as index.html and directory.html . Of course you normally would build a base template for the site and extend that in your normal templates. And you would add a 404.html to handle 404 errors. But that's left as an exercise to the reader.After you start up your development server for your admin (don't forget to set DJANGO SETTINGS MODULE accordingly!) you can add a filesystem to your database (you did do django-admin.py install filesystems sometime in between? No? Do it now, before you start your server). Now stop the admin server, change your DJANGO SETTINGS MODULE and start the main settings server. Now you can surf to http://localhost:8000/files/(at least if you did set up your URLs and server like I do) and browse the files in your filesystem. That's it. Wasn't very complicated, right? Django is really simple to use

Ausbildung als Billiglohnschiene

Was hinter der Forderung des DIHK nach Halbierung des Lehrlingsgrundgehaltes und Flexibilisierung der Arbeitszeiten steckt, wird einem klar wenn man sich Zitate des DIHK-Vorsitzenden ansieht:

"Mein Vorschlag ist, eine bundesweite Basisvergütung von 270 Euro einzuführen", sagte er der Zeitung "Die Welt". Er rechtfertigte seinen Vorstoß damit, dass so mehr Lehrstellen finanziert werden könnten. "Eine Ausbildungsvergütung von bis zu 800 Euro ist für viele Betriebe einfach zu hoch."

"Die Arbeitszeiten müssen den Bedürfnissen der Branchen besser angepasst werden." Es ergebe keinen Sinn, dass eine 17-jährige Restaurantfachfrau um 22.00 Uhr gehen müsse, "wenn noch alle Tische besetzt sind"

Da gehts einfach nur darum billige Arbeitskräfte zu haben, aber nicht darum eine fachgerechte Ausbildung zu gewährleisten. Aber die Forderungen sind ja nicht neu.

Und was die deutsche Wirtschaft von Ausbildung hält, sieht man ja auch an der Tatsache das die Ausbildungsplätze im Vergleich zum Vorjahr wieder 10% runter sind - und damit wieder Jugendliche ohne Ausbildungsplätze geblieben sind, trotz aller Versprechungen der Wirtschaft. Ohne Nichtausbildungsabgabe für grössere Unternehmen wird sich das auch nicht ändern. Aber darüber jammern das es keine ausgebildeten Fachkräfte gibt, das kann die Wirtschaft ganz famos ...

Beckstein on the Roll

Keine Ahnung wie das Kraut heisst das er nimmt, aber es hinterlässt schwere Hirnschäden: Beckstein will deutsches Guantanamo. Abgesehen davon das er auch Verdächtigen in den Kopf schiessen will und Ausländer erstmal in Lager packen will, weil ja auf keinen Fall potentielle Terroristen frei rumlaufen dürfen (durchgeknallte Politiker wie er dürfen aber nicht nur frei rumlaufen sondern auch noch frei ihre Meinung äussern), er ist auch verfassungsfeindlich eingestellt:

Beckstein kritisierte auch das Urteil des Bundsverfassungsgericht, dass in einem Urteil zur niedersächsischen Gesetzgebung klare Eingrenzungen bei der vorbeugenden Telefonüberwachung verlangt hatte. Es müsse zwischen Sicherheits- und Freiheitsinteressen neu abgewogen werden, sagte Beckstein: "Dass der Intimbereich von Terroristen geschützt sein soll, ist für mich schwer erträglich."

Tut mir leid, Herr Beckstein, aber Sie sind in der Prüfung durchgefallen. Denn das Verfassungsgericht schützt nicht explizit den Intimbereich von Terroristen - sondern den Intimbereich der Bürger. Und der steht als schützenswertes Gut im Grundgesetz.

Warum wird eigentlich so einer nicht vom Verfassungsschutz beobachtet? Seine Verfassungsfeindlichkeit ist doch wirklich mehrfach dokumentiert ...

Novell will SCO an den Kragen

Und ihre Betrachtungen über die Rechtslage würden - wenn sie denn vor Gericht Bestand haben - SCO wirklich eine empfindliche Schlappe verpassen.

Der ganze SCO-Linux-Film ist ja recht spannend, aber ganz ehrlich: die Längen zwischen den Actionszenen sind doch ein bischen übertriebn

Pluto raus oder ein Neuer rein?

Astronomen haben ausserhalb der Pluto-Umlaufbahn einen Matschklumpen gefunden der mindestens so gross, warscheinlich aber sogar deutlich grösser als Pluto ist - Planet or Not, Pluto Now Has Far-Out Rival:

Astronomers announced yesterday that they had found a lump of rock and ice that was larger than Pluto and the farthest known object in the solar system. The discovery will probably rekindle debate over the definition of "planet" and whether Pluto still merits the designation.

Jetzt gehts drum ob Pluto seinen Planetenstatus verliert, oder der Neue auch Planet wird.

Vom Umgang mit Security

Unter ISS geht gegen Veröffentlichung des Vortrags über Cisco-Schwachstellen vor findet man eine Beschreibung wie sich Cisco und ISS Sicherheit vorstellen: massive Eingriffe in die Äusserungsrechte eines Vortragenden auf der Black-Hat-Konferenz. Ok, der war Ex-Mitarbeiter von ISS und hat wohl Informationen genutzt die er nicht veröffentlichen sollte - aber genau diese hirnrissige Geheimniskrämerei ist es ja, die Sicherheit unterminiert - denn das die Angreifer dieses Wissen früher oder später erlangen ist garantiert - wenn Sicherheitslücken existieren, werden sie früher oder später gefunden. Findet Sie jemand der darüber öffentlich berichtet, kann man sich wenigstens dagegen wehren und Gegenmaßnahmen einleiten. Wird die Veröffentlichung unterdrückt, ist der Leidtragende letztendlich der Endanwender - der keine Möglichkeit bekommt sich überhaupt abzusichern - und sei es im Notfall durch Wechsel zu einem anderen Routerhersteller.

Von daher ist es in der Tat so: weder ISS noch Cisco machen damit ein gutes Bild in der Öffentlichkeit. Im Gegenteil, deren Zensurversuche sind eigentlich nur noch ein Argument bei zukünftigen Produktentscheidungen sich gegen Cisco zu entscheiden - denn man kann deren Sicherheitsaussagen ja ganz offensichtlich nicht trauen.

Leichen im Keller

Jede Software hat sie - irgendwelche Leichen im Keller die anfangen zu stinken wenn man sie findet. Django leider auch. Und zwar die Behandlung von Unicode. Der automatisch generierte Admin in Django schickt immer XHTML und utf-8 raus an den Browser. Die Browser schicken daher auch utf-8 zurück. Jetzt gibt es aber Browser die bei solchen Sachen dann ein etwas anderes Format für die zu schickenden Daten benutzen - das sogenannte Multipart-Format. Dieses wird verwendet weil es die einzige garantierte Methode in HTTP-POST ist, bei der man einen Zeichensatz mitschicken kann.

Dummerweise parsed Django diese Multipart-POSTs mit dem email Modul von Python. Dieses produziert dann fleissig Unicode-Strings aus den als utf-8 markierten Parts. Was ja auch an und für sich korrekt ist - nur sind im Django-Source überall im Sourcecode str() Aufrufe verstreut. Und die krachen dann natürlich, wenn sie unicode vorgeworfen bekommen in dem Zeichen oberhalb von chr(128) drin sind.

Ich hab mir den Source mal angeguckt, der realistischste Ansatz dürfte sein in Django einfach generell dafür zu sorgen das auch Unicode-Ergebnisse dann wieder nach utf-8 gewandelt werden, so das intern nur normale Python-Strings benutzt werden. Das klappt auch soweit, aber es gibt dann noch Probleme mit manchen Datenbanken die bei Speicherung von utf-8 Inhalten das erkennen und dann beim Lesen der Inhalte wieder Unicode produzieren - SQLite ist so eine Datenbank.

Tja, das wird nicht ganz einfach zu beheben sein. Ich hab mich schon mal dran versucht, das ist ein ziemlich ekliges Thema und leider in Django überhaupt nicht berücksichtigt worden - und daher kracht es an allen Ecken und Enden. Mal gucken ob ich da nicht doch noch was brauchbares hinkriege ...

Was mir auch noch aufgefallen ist: Django schickt den Content-type nur über ein meta-Tag mit http-equiv raus. Das ist ein übler Hack, wesentlich besser wäre es wenn der Content-type korrekt als Header gesetzt wäre, dann kann auch nix schief gehen wenn z.B. Apache einen Default-Charset zufügen will. Und die Browser würden auch wesentlich reproduzierbarer reagieren.

Jedenfalls ist das wieder der typische Fall von amerikanischen Programmierern. Die erzählen einem gerne das man einfach nur auf Unicode und utf-8 wechseln soll wenn man von seinen Zeichensatzkodierungsproblemen berichtet, aber ich habe bisher noch keine Software eines amerikanischen Programmierers gesehen die Unicode korrekt gehandhabt hätte ...

Ansonsten gibts in Django noch so die eine oder andere Klinke - besonders nervig, weil nicht dokumentiert, aber leicht zu lösen: die Standard-Zeitzone in Django ist America/Chicago. Dazu muss man dann nur eine Variable TIME_ZONE mit 'Europe/Berlin' als Wert in sein settings-File schreiben und noch einen kleinen Patch anwenden, damit Django mit dem '-' als Zeitzonentrennzeichen klarkommt. Oh Mann, wenn Amerikaner schon mal Software schreiben ...

Irgendwie steigt im Moment gerade meine Motivation mir doch erstmal Ruby on Rails genauer anzugucken, schliesslich sind das Dänen die damit angefangen haben und die sollten zumindestens solche Sachen richtig hinkriegen (wenn nur nicht dieser nette automatische Administrationsteil von Django wäre - der ist es ja genau auf den ich es abgesehen hätte. Warum hat sowas nur keiner für ROR eingebaut, menno ...)

Update: Ich hab am entsprechenden Ticket zum Unicode-Problem einen Patch angehängt (einfach nach ganz unten scrollen) der erstmal das Problem halbwegs in den Griff bekommt - sofern man kein SQLite einsetzt, da SQLite immer Unicode-Strings zurückliefert und die dann auch wieder Stress machen. Aber zumindestens mit PostgreSQL funktionieren jetzt Umlaute in Django. Die Lösung ist nicht wirklich perfekt, aber zumindestens mit nur wenig Codeänderung reinzubringen. Eine richtige Lösung würde wohl grössere Codeumbauten erfordern.

Ein weiterer Patch hängt am Ticket zum Zeitzonenproblem, mit dem Patch kann man dann auch TIME_ZONE = 'Europe/Berlin' benutzen um die Zeitangaben zum Beispiel in der Änderungshistorie in der richtigen Zeitzone zu bekommen.

In solchen Momenten wünscht man sich commit-Rechte zu Django, um solche recht überschaubaren Patches selber reinstellen zu können

Noch ein Update: Adrian war im Chat gestern und heute und die Probleme mit Unicode sind weitestgehend raus. Nur mit SQLite gibts noch Stress, aber da hab ich den Patch schon fertig. Und die Zeitzonengeschichte ist auch behoben im SVN. Und er hat Unittests begonnen. Sehr sinnvoll, wenn man dann mal auf Dauer das ganze Framework sauber durchtesten kann nach einem Patch ...

Linkhaftung nach dem Heise-Urteil

Nach diesem Interview beim WDR gilt: "Jeder, der so einen Link setzt, ist dran":

Man muss eben sehr gut aufpassen. Aufgrund dieser neuen Urteile muss man sich überlegen: Auf wen setze ich einen Link? Früher hat man als Privatperson gesagt: 'Komm, ich hau da hundert Links hintereinander' und war ganz stolz. Heute muss man sich wirklich überlegen, ob der, auf den man einen Link setzt, wirklich vertrauenswürdig ist. Man muss diese Links dann auch in regelmäßigen Abständen gegenchecken und prüfen, was sich auf der gelinkten Seite tut.

Womit - wenn es denn tatsächlich so wäre - faktisch das privat betriebene Infoangebot tot wäre auf kurz oder lang, denn niemand kann seine ganzen Links durchprüfen. Ich hab hier fast 5000 Artikel im Blog, die werd ich garantiert nie alle durchgucken können ob da irgendwo irgendwas ist das irgendwem quer aufstösst.

Und so hat dieses Urteil wieder einen weiteren Nagel in den Sarg des Internet getrieben, nur weil Richter immer wieder diese Scheinrechte von Rechteabzockern höher als die freie Meinungsäusserung und die freie Berichterstattung einstufen

Sysadmins Day

Lisa9 zeigt wie man anständig einem Sysadmin huldigt! Sogar DAU-tauglich mit bebilderter Anleitung

Django, lighttpd and FCGI, second take

In my first take at this stuff I gave a sample on how to run django projects behind lighttpd with simple FCGI scripts integrated with the server. I will elaborate a bit on this stuff, with a way to combine lighttpd and Django that gives much more flexibility in distributing Django applications over machines. This is especially important if you expect high loads on your servers. Of course you should make use of the Django caching middleware, but there are times when even that is not enough and the only solution is to throw more hardware at the problem.

Update: I maintain my descriptions now in my trac system. See the lighty+FCGI description for Django.

Caveat: since Django is very new software, I don't have production experiences with it. So this is more from a theoretical standpoint, incorporating knowledge I gained with running production systems for several larger portals. In the end it doesn't matter much what your software is - it only matters how you can distribute it over your server farm.

To follow this documentation, you will need the following packages and files installed on your system:

  • [Django][2] itself - currently fetched from SVN. Follow the setup instructions or use python setup.py install .
  • [Flup][3] - a package of different ways to run WSGI applications. I use the threaded WSGIServer in this documentation.
  • [lighttpd][4] itself of course. You need to compile at least the fastcgi, the rewrite and the accesslog module, usually they are compiled with the system.
  • [Eunuchs][5] - only needed if you are using Python 2.3, because Flup uses socketpair in the preforked servers and that is only available starting with Python 2.4
  • [django-fcgi.py][6] - my FCGI server script, might some day be part of the Django distribution, but for now just fetch it here. Put this script somewhere in your $PATH, for example /usr/local/bin and make it executable.
  • If the above doesn't work for any reason (maybe your system doesn't support socketpair and so can't use the preforked server), you can fetch [django-fcgi-threaded.py][7] - an alternative that uses the threading server with all it's problems. I use it for example on Mac OS X for development.

Before we start, let's talk a bit about server architecture, python and heavy load. The still preferred Installation of Django is behind Apache2 with mod python2. mod python2 is a quite powerfull extension to Apache that integrates a full Python interpreter (or even many interpreters with distinguished namespaces) into the Apache process. This allows Python to control many aspects of the server. But it has a drawback: if the only use is to pass on requests from users to the application, it's quite an overkill: every Apache process or thread will incorporate a full python interpreter with stack, heap and all loaded modules. Apache processes get a bit fat that way.

Another drawback: Apache is one of the most flexible servers out there, but it's a resource hog when compared to small servers like lighttpd. And - due to the architecture of Apache modules - mod_python will run the full application in the security context of the web server. Two things you don't often like with production environments.

So a natural approach is to use lighter HTTP servers and put your application behind those - using the HTTP server itself only for media serving, and using FastCGI to pass on requests from the user to your application. Sometimes you put that small HTTP server behind an Apache front that only uses mod proxy (either directly or via mod rewrite) to proxy requests to your applications webserver - and believe it or not, this is actually a lot faster than serving the application with Apache directly!

The second pitfall is Python itself. Python has a quite nice threading library. So it would be ideal to build your application as a threaded server - because threads use much less resources than processes. But this will bite you, because of one special feature of Python: the GIL. The dreaded global interpreter lock. This isn't an issue if your application is 100% Python - the GIL only kicks in when internal functions are used, or when C extensions are used. Too bad that allmost all DBAPI libraries use at least some database client code that makes use of a C extension - you start a SQL command and the threading will be disabled until the call returns. No multiple queries running ...

So the better option is to use some forking server, because that way the GIL won't kick in. This allows a forking server to make efficient use of multiple processors in your machine - and so be much faster in the long run, despite the overhead of processes vs. threads.

For this documentation I take a three-layer-approach for distributing the software: the front will be your trusted Apache, just proxying all stuff out to your project specific lighttpd. The lighttpd will have access to your projects document root and wil pass on special requests to your FCGI server. The FCGI server itself will be able to run on a different machine, if that's needed for load distribution. It will use a preforked server because of the threading problem in Python and will be able to make use of multiprocessor machines.

I won't talk much about the first layer, because you can easily set that up yourself. Just proxy stuff out to the machine where your lighttpd is running (in my case usually the Apache runs on different machines than the applications). Look it up in the mod_proxy documentation, usually it's just ProxyPass and ProxyPassReverse.

The second layer is more interesting. lighttpd is a bit weird in the configuration of FCGI stuff - you need FCGI scripts in the filesystem and need to hook those up to your FCGI server process. The FCGI scripts actually don't need to contain any content - they just need to be in the file system.

So we start with your Django project directory. Just put a directory public html in there. That's the place where you put your media files, for example the admin media directory. This directory will be the document root for your project server. Be sure only to put files in there that don't contain private data - private data like configs and modules better stay in places not accessible by the webserver. Next set up a lighttpd config file. You only will use the rewrite and the fastcgi modules. No need to keep an access log, that one will be written by your first layer, your apache server. In my case the project is in /home/gb/work/myproject - you will need to change that to your own situation. Store the following content as /home/gb/work/myproject/lighttpd.conf


 server.modules = ( "mod_rewrite", "mod_fastcgi" )
 server.document-root = "/home/gb/work/myproject/public_html"
 server.indexfiles = ( "index.html", "index.htm" )
 server.port = 8000
 server.bind = "127.0.0.1"
 server.errorlog = "/home/gb/work/myproject/error.log"

fastcgi.server = (
"/main.fcgi" => (
"main" => (
"socket" => "/home/gb/work/myproject/main.socket"
 )
 ),
"/admin.fcgi" => (
"admin" => (
"socket" => "/home/gb/work/myproject/admin.socket"
 )
 )
 )

url.rewrite = (
"^(/admin/.*)$" => "/admin.fcgi$1",
"^(/polls/.*)$" => "/main.fcgi$1"
 )

mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "audio/x-wav",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv"
 )

I bind the lighttpd only to the localhost interface because in my test setting the lighttpd runs on the same host as the Apache server. In multi server settings you will bind to the public interface of your lighttpd servers, of course. The FCGI scripts communicate via sockets in this setting, because in this test setting I only use one server for everything. If your machines would be distributed, you would use the "host" and "port" settings instead of the "socket" setting to connect to FCGI servers on different machines. And you would add multiple entries for the "main" stuff, to distribute the load of the application over several machines. Look it up in the lighttpd documentation what options you will have.

I set up two FCGI servers for this - one for the admin settings and one for the main settings. All applications will be redirected through the main settings FCGI and all admin requests will be routed to the admin server. That's done with the two rewrite rules - you will need to add a rewrite rule for every application you are using.

Since lighttpd needs the FCGI scripts to exist to pass along the PATH_INFO to the FastCGI, you will need to touch the following files: /home/gb/work/myprojectg/public_html/admin.fcgi ``/home/gb/work/myprojectg/public_html/main.fcgi

They don't need to contain any code, they just need to be listed in the directory. Starting with lighttpd 1.3.16 (at the time of this writing only in svn) you will be able to run without the stub files for the .fcgi - you just add "check-local" => "disable" to the two FCGI settings. Then the local files are not needed. So if you want to extend this config file, you just have to keep some very basic rules in mind:

  • every settings file needs it's own .fcgi handler
  • every .fcgi needs to be touched in the filesystem - this might go away in a future version of lighttpd, but for now it is needed
  • load distribution is done on .fcgi level - add multiple servers or sockets to distribute the load over several FCGI servers
  • every application needs a rewrite rule that connects the application with the .fcgi handler

Now we have to start the FCGI servers. That's actually quite simple, just use the provided django-fcgi.py script as follows:


 django-fcgi.py --settings=myproject.work.main
 --socket=/home/gb/work/myproject/main.socket
 --minspare=5 --maxspare=10 --maxchildren=100
 --daemon

django-fcgi.py --settings=myproject.work.admin
 --socket=/home/gb/work/myproject/admin.socket
 --maxspare=2 --daemon

Those two commands will start two FCGI server processes that use the given sockets to communicate. The admin server will only use two processes - this is because often the admin server isn't the server with the many hits, that's the main server. So the main server get's a higher-than-default setting for spare processes and maximum child processes. Of course this is just an example - tune it to your needs.

The last step is to start your lighttpd with your configuration file: lighttpd -f /home/gb/work/myproject/lighttpd.conf

That's it. If you now access either the lighttpd directly at http://localhost:8000/polls/ or through your front apache, you should see your application output. At least if everything went right and I didn't make too much errors.

Noch son Fragebogen

Aus meiner Mailbox von Lisa Sonnabend:

Im Rahmen meiner Abschlussarbeit am Institut für Kommunikationswissenschaft und Medienforschung der Ludwigs-Maximilians-Universität München führe ich eine Befragung unter Webloglesern zum Thema „Glaubwürdigkeit von Weblogs“ durch. Es handelt sich um eine der ersten wissenschaftlichen Untersuchungen zum Phänomen Weblogs in Deutschland.

Es soll geklärt werden, ob Weblogs in gewissen Punkten wie Fairness oder Unvoreingenommenheit bereits als ähnlich vertrauenswürdig und kompetent gesehen werden wie traditionelle Medien – und in welchen Punkten große Unterschiede herrschen. Darüber hinaus wird mit der Befragung untersucht, welche besonderen Qualitäten Weblogs aus Sicht der Rezipienten haben und welchen Stellenwert diese für die Nutzer spielen. Anhand der Ergebnisse soll anschließend eine Prognose über das zukünftige Gewicht von Weblogs in der Medienlandschaft gefällt werden.

Und ich soll den Link ins Blog packen, damit Leute dabei mitmachen. Nagut, mach ich das doch mal, auch wenn ich mich frage was für eine Kompetenz und Vertrauenswürdigkeit die alten Medien eigentlich haben sollen

Hier gehts zum Fragebogen

präventive Telefonüberwachung is nich

Denn das Verfassungsgericht erklärt präventive Telefonüberwachung für nichtig. Betrifft primär Niedersachsen, aber ähnliche Situationen gibt es auch in anderen Bundesländern. Gut wenn mal dem ganzen Überwachungsfetischismus ein Riegel vorgeschoben wird.