Archiv 23.10.2005 - 12.11.2005

Linux-Vserver on Debian Sarge - da sagt der Titel schon alles. Bookmark für später - könnte für meinen Server interessant werden.

Mac-on-Linux - komischerweise nie geblogmarkt, daher jetzt. Mac Betriebssysteme in einer virtuellen Umgebung unter Linux auf Macs laufen lassen - ideal für Linux-betriebene Mac-Minis auf denen man doch noch das eine oder andre OS X Programm haben will ...

Mac-on-Mac ist das inverse Gegenstück zu Mac-on-Linux - ein Port der virtuellen Maschine nach OS X, mit der man dann Linux oder andere Mac-Systeme unter OS X in einer virtuellen Umgebung laufen lassen kann. Status ist noch sehr roh ...

Traumtänzer at Work

Wer mal richtig ablachen will: RatcliffeBlog—Mitch's Open Notebook: Measuring podcasts: The right first step - über die kläglichen Versuche von Audible am Podcasten zu verdienen. Egal was man von Podcasts hält (ich halt nix davon, deren Accessibility ist einfach nur grottenschlecht), die Vorstellungen von Audible (die DRM-verseuchte Audiobooks verkaufen) sind einfach nur lachhaft.

Boykottiert Sony-BMG!

Denn deren Rootkit-Mist greift jetzt auch auf Macs über:

Sony BMG hat mit dem XCP-Kopierschutz von First 4 Internet das Windows-Universum gegen sich aufgewiegelt. Nun taucht auch ein Kopierschutzverfahren auf, das im Mac-Kosmos ähnliche Aufgaben wie die XCP-Software erfüllen soll. Für Mac-Systeme waren bislang so gut wie keine Trojaner und Rootkits bekannt.

Na klasse. So gut wie keine Rootkits und Trojaner - bis jetzt uns die Musikindustrie so einen Mist aufs Auge drückt. Was rauchen die bei Sony-BMG eigentlich? Eins ist klar: eine CD von denen kommt mir nicht mehr in den Player. Verbraucher als Verbrecher abstempeln und rumheulen wie dreckig es ihnen geht, und dann mit CDs eine Attacke auf meinen Rechner veranstalten? Vergesst es.

zorniges Gesicht

Phishing: Auch die iTAN bietet keinen Schutz - was ja eigentlich jedem vorher klar war, aber natürlich die Banken nicht gehindert hat, diesen Unfug als die beste Erfindung seit geschnittenem Weißbrot zu vermarkten ...

Realitätsverlust bei SAP-Vorständlern

SAP-Vorstand wettert gegen Open Source:

Ansonsten sei es wichtig, nicht zu sehr mit dem Code hochwertiger Softwareprogramme herumzuspielen.

Moment mal. "hochwertige Softwareprogramme". Der arbeitet doch bei SAP? Wo haben die denn irgendwelche hochwertigen Softwareprogramme? Ich mein, wenn man "hochwertig" mal nicht als "hoffnungslos überteuerter Schrott" betrachtet, wie er das wohl tut?

Teufelsgrinsen

wikiCalc - eine Mixtur aus Tabellenkalkulation und Wiki. Strange. Von Mr. Visicalc himself. Trotz Perl derzeit nur Windows-tauglich. Nunja, Spreadsheets passen für mich zu Perl und Windows - alles schmuddeliger Kram

mal wieder ne Woche München

Und daher hier nur sporadische Updates, wenn ich mal Lust und Zeit hab. Was anbetracht des interessanten Projektes und des doch recht ansehnlichen Wetters warscheinlich eher selten der Fall sein wird

SPD verkauft den Kündigungsschutz

Damit sie weiter in Berlin in der Regierung mitspielen darf, Verkauft die SPD den Kündigungsschutz:

Die Fachpolitiker von Union und SPD haben sich darauf verständigt, in einer großen Koalition den Kündigungsschutz weiter zu lockern. Wie die "Bild am Sonntag" berichtet, soll die Probezeit bei Neueinstellungen künftig auf bis zu zwei Jahre verlängert werden dürfen. "An der Substanz des Kündigungsschutzes wird damit nicht gerüttelt", sagte SPD-Arbeitsmarktexperte Klaus Brandner der Zeitung.

Ok, das ganze ist von der Bild am Sonntag, also kann man auf den Wahrheitsgehalt nicht viel geben, aber wenn dem wirklich so ist, ist das schon eine ziemlich bodenlose Frechheit. Eine Probezeit von zwei Jahren ist defakto eine Aufhebung des Kündigungsschutzes, egal was diese SPD-Pfeife da von sich gibt - Neueinstellungen haben dann keinerlei Sicherheiten mehr, die kleines Unstimmigkeit und der Vertrag ist beendet. Das ist schlichtweg absurd.

Zumal die Arbeitgeber mit befristeten Arbeitsverträgen heute schon eine vergleichbare Möglichkeit haben, nur das der Arbeitnehmer dann wenigstens für die Dauer des befristeten Verhältnisses eine Sicherheit hat - bei der oben skizzierten Idee gibt es gar keine Sicherheit mehr.

Und mal ganz ehrlich: ein Chef, der zwei Jahre braucht um festzustellen ob ein neuer Mitarbeiter für den Job taugt (und genau dafür ist die Probezeit gedacht, nicht als verlogener Ausweg für die Aufhebung des Kündigungsschutzes), muss entweder ein verlogenes Stück Scheisse sein, oder dumm wie ein Stück Brot in der Pfütze ...

Die Lügereien der SPD in den letzten Jahren (mit Hartz IV und dem ganzen Mist von Schily) und in den Koalitionsverhandlungen zur Zeit ist jedenfalls ein klares Zeichen dafür, das die SPD nicht mehr den eigenen Namen verdient. Mit sozial hat das nichts mehr zu tun. Das ist Verkauf des Sozialstaates rein aus Machtgier und -besessenheit.

sql relay ist ein SQL connection pool der verschiedenste Datenbanken bedienen kann und die Verbindungen von Clients zur Datenbank über einen zentralen Pool abwickelt. Ideal in Multi-Host-Umgebungen und wenn die Connecton-Last zu hoch ist (z.B. erzeugt Django pro Request eine Connection).

Auf in den Polizeitstaat Deutschland!

Schwarz-rote Koalition will Datenschutz auf den Prüfstand stellen:

Unter dem Titel "Deutschland – ein sicheres und freies Land" wird die Bekämpfung des Terrorismus in dem heise online vorliegenden Papier weiterhin als "eine sehr wesentliche Aufgabe aller deutschen Sicherheitsbehörden" bezeichnet. Zudem wird ein "Anspruch" der Bürger postuliert, "vor Kriminalität geschützt zu werden". Dem haben sich nach Ansicht der Innenexperten von Schwarz-Rot andere verfassungsrechtlich garantierte Freiheitsrechte unterzuordnen. Es gelte zu überprüfen, heißt es in dem achtseitigen Vertragsdokument, "inwieweit rechtliche Regelungen etwa des Datenschutzes einer effektiven Bekämpfung des Terrorismus und der Kriminalität entgegenstehen" und die an sich "bewährte Sicherheitsarchitektur" weiterentwickelt werden müsse.

Ohne Worte.

Mehrwertsteuer vs. Vermögenssteuer

Offener Brief: Reiche wollen mehr Steuern zahlen:

Krämer sagte, es könne nicht sein, dass ernsthaft über eine Erhöhung der Mehrwertsteuer nachgedacht werde, ohne auch die Vermögenden stärker zu belasten. Eine Erhöhung der Mehrwertsteuer träfe die Normalverdiener, Rentner und Arbeitslosen wesentlich stärker.

Komisch das Leute mit Geld das kapieren können, unsere Bundesprolethiker aber nicht ...

Die Feigheit der SPD

Sie zeigt sich in der Position zur (doch-nicht?) -Generalsekretärin Nahles:

Nahles war zuvor parteiintern scharf angegriffen worden. Der Sprecher des konservativen Seeheimer Kreises, Johannes Kahrs, sagte im ARD-Morgenmagazin: "Ich halte es für absurd, dass jemand als Königsmörderin belohnt wird, der mit seiner Sturheit die Partei in die Krise geführt hat."

Ich halte es ja für absurd, das so ein rechter Müllhaufen wie der Seeheimer Kreis überhaupt in der SPD eine Stimme bekommt. Soll er doch zur Union rübermachen ...

Die "Königsmörder" waren im übrigen nicht Frau Nahles, sondern der Parteivorstand - von denen auch noch 8 nicht zu dem Treffen gekommen waren. Aber die zu kritisieren traut sich der kleine Feigling natürlich nicht, denn die könnten ihn ja in seinen Pfründen beschneiden und ihn auf das zurechtstutzen was er ist: nichts.

Aber leider hat warscheinlich der SPD Vorstand nicht Mumm genug und wird vor den konservativen Kräften kneifen und damit dann dabei helfen, das die SPD auch mit neuer Besetzung genauso langweilig, uninteressant, vorhersagbar und unbedeutend sein wird, wie sie es jetzt schon ist. Eben nur eine rot angestrichene Union. Wer braucht sowas? Wo wir doch Stoiber und Seehofer haben?

Rumsfeld verweigert Uno Zugang zu Häftlingen

Im Land der Freien und Mutigen:

Die Vereinten Nationen haben den USA inakzeptable Auflagen für eine geplante Inspektion des Gefangenenlagers Guantanamo vorgeworfen. Selbst China stelle für Besuche in seinen Gefängnissen keine solchen Bedingungen, sagte der UN-Sonderberichterstatter für Folter, Manfred Nowak, in New York.

Mit der aktuellen Administration wohl eher ein Land der Feigen und Verlogenen?

coverage ist ein Tool zur Erstellung von Coverage-Übersichten - also welche Teile eines Programms ausgeführt wurden und welche nicht. Sinnvoll als Ergänzung für unittests, damit man sicher ist, das die unittests auch alle Bereiche des Codes abdecken.

Sony BMGs Kopierschutz mit Rootkit-Funktionen

Bei Heise ist ein Bericht über die Probleme mit Sony BMGs Kopierschutz:

Damit bildet diese Software Rootkit-Funktionen nach – Rootkits verstecken ihre (illegalen) Aktivitäten ebenfalls vor dem Computernutzer. Der Kopierschutz installiert unter anderem auch Filtertreiber für CD-ROM-Laufwerke sowie für die IDE-Treiber, durch die er Zugriffe auf Medien kontrolliert.

Letzten Endes wieder ein Einbruch in die Datenintegrität der Benutzer. Und nimmt man die bescheuerten Kopierschutz-Gesetze in Deutschland dazu, dann darf man theoretisch nicht mal was dagegen unternehmen. Und so wird das Recht des Einzelnen auf sein Eigentum (hier gehts schliesslich nicht nur allein um die alberne CD von Sony, es wird der ganze Rechner beeinträchtigt!) weiter auf dem Altar der Arroganz der Musikindustrie geopfert.

Übrigens enthält dieser Kopierschutz auch Überwachungsfunktionen für andere Medien als das eigene, geschützte - und verstößt damit meines Erachtens massiv gegen Datenschutzbestimmungen, denn egal was Sony schützen will, was sonst auf dem Rechner los ist geht die garnichts an.

Ein Grund mehr keine CDs von Sony BMG mehr zu kaufen.

Stoiber hat ausgestaubt

Stoiber geht nicht nach Berlin - die Zerfallserscheinungen der grossen Koalition schon vor dem Zustandekommen sind wirklich überaus putzig. Auf beiden Seiten fallen die Leute auseinander wie die Pappschachteln.

Der Unterhaltungswert dieser Berliner Doku-Soap ist jedenfalls beachtlich.

Teufelsgrinsen

Ein Test-Framework für Django

DjangoTesting ist Teil meines DjangoStuff-Projekts und der Beginn eines Testframeworks für Django, das dem Testframework von Ruby on Rails nachempfunden ist. Derzeit sind nur Modelltests implementiert, Request/Response-Tests sind geplant.

Das Testframework basiert ausschließlich auf unittest und django, sodass Sie keine zusätzlichen Module benötigen (außer meinem DjangoStuff-Projekt natürlich). Es bietet python-basierte Fixture-Notationen (Fixtures sind einfach nur Python-Klassen mit Attributen in einer DATA-Unterklasse) und ein grundlegendes Befehlszeilen-Tool, um diese Tests und Fixtures zu nutzen.

Tests und Fixtures werden in Anwendungen und Projekten gespeichert, sodass Sie anwendungsspezifische Tests haben können (besonders nützlich bei generischen Anwendungen) und projektübergreifende Tests, die mehrere Anwendungen integrieren.

Ich denke, ein gutes Testframework wäre wirklich wichtig für Django-Anwendungen, insbesondere für Anwendungen, die zwischen Projekten geteilt werden sollen. Aber ich denke auch, dass ein gutes Testframework auch etwas "Banging" braucht - also habe ich es als kleines Subprojekt für mich selbst gestartet. Aber wenn es zu etwas Nützlichem heranwächst, werde ich mich für die Aufnahme in den Django-Trunk entscheiden.

Bildung und Wohlstand - aber nicht für jeden

Geht halt nur zusammen - Bildung nur für die, die es sich leisten können. Die anderen sollen doch besser dumm bleiben: Chancenungleichheit ist weiter gewachsen. Und unsere Landesregierungen (auf deren Mist die Bildungspolitik wächst) werden schon dafür sorgen, daß das so bleibt. Mit Sicherheit jedenfalls in den Unionsregierten Ländern, zu denen NRW ja leider jetzt auch gehört.

Für jemanden wie mich, der aus einer Arbeiterfamilie kommt, ist diese Entwicklung mehr als erschreckend. Zu meiner Zeit waren Kinder aus Arbeiterfamilien zwar auch nicht die Mehrheit in den Klassen am Gymnasium, aber es waren immerhin welche dort. Aber mit den heutigen Entwicklungen - Schuldgeld, Lehrmittelgelder, später Studiengebühren - machen die Politiker ganz deutlich was sie von Arbeitern halten: garnichts.

Wir sind Deutschland? Am Arsch. Geld ist Deutschland.

Müntes Abgang?

Ich kann mir ja ein kleines, fieses Grinsen nicht verkneifen, darüber daß Müntes Wunschkandidat für den Generalsekräter gegen Andrea Nahles verloren hat. War wohl nix mit Münte als neuem Wehner, von hinten die Fäden ziehen und alles tanzt nach seiner Pfeife - ausgepfiffen hat sichs.

Selenium ist ein Testautomator für Webanwendungen. Es läuft direkt im Browser und benutzt IFrames und JavaScript um sich in die zu testende Seite zu hängen.

Stoiber kneift?

Noch son oller Schisser

Teufelsgrinsen

Case/When/Otherwise für Django

Wenn du böse Pläne für eine Switch-Anweisung in Django hast (hia rjwittams!), könntest du einen Blick auf mein TagLib werfen. Dort gibt es eine case/when/otherwise-Anweisung. Sie ist ganz einfach zu verwenden:

{% case variable %}
{% when "value1" %}
{% endwhen %}
{% when "value2" %}
{% endwhen %}
{% otherwise %}
{% endotherwise %}
{% endcase %}

Der Grund für die Tag-Struktur ist, dass der Django-Template-Parser in der parsefor-Funktion nur nach parameterlosen Block-Schließtags sucht und du daher keine einfache Lösung wie diese verwenden kannst:

{% if condition %}
{% elif condition %}
{% else %}
{% endif %}

Du müsstest viel von dem Template-Parser in eine parsefor-Funktion kopieren, die nach einem Token mit einem Tag und Parametern sucht, um den aktuellen Block zu schließen.

Ich habe mich daher für den Ansatz mit den bereichsbezogenen Tags entschieden, bei dem das "case"-Tag nur eine Kontextvariable "case" setzt und sie mit einem Wörterbuch mit "value" und "fired" füllt - wobei letztere ein Auslöser ist, der von jedem "when"-Tag ausgelöst werden kann, um zu verhindern, dass andere "when"-Tags oder das "otherwise"-Tag sich selbst auslösen. Ein bisschen hässlich, aber funktionierend.

Hochgestapelt

Hochgestapelt

gestapelte Paletten

Gestapelte Paletten auf dem Gelände von Dobermann am Kanal in Münster.

Spaziergang am Kanal

Am Kanal vorbeispaziert und ein paar Eindrücke eingefangen:

Zugbrücke

Zugbrücke

Eisenbahnbrücke über den Kanal

Eine Eisenbahnbrücke über den Dortmund-Ems-Kanal.

Ad-hoc-Organisation in CM-Systemen

Adhoc organization ist der Name, den ich den grundlegenden Designentscheidungen für mein neues Content-Management-System (Blog-System, persönliches Wiki, digitale Bilderschuhschachtel - was auch immer) gegeben habe. Es kommt gut voran, auch wenn ich es bisher nur als Beispielanwendung genutzt habe, um meine kleinen Tools aus dem DjangoStuff-Pseudo-Projekt zu nutzen. Und es ist immer noch eine der besten Möglichkeiten zu sehen, wie Tagging oder Suche oder der neue Kalendertag oder andere Dinge genutzt werden.

Aber es kommt so gut voran, dass ich denke, ich werde in der Lage sein, einige Websites in naher Zukunft umzustellen. Die grundlegenden Designentscheidungen sind in dem verlinkten Dokument in meinem Trac-Wiki etwas dokumentiert. Das Hauptziel für mich ist es, etwas zu bekommen, das ich genauso einfach für die Bildpräsentation wie für die Textpräsentation nutzen kann und das mir ermöglicht, beide Teile wirklich zu integrieren. So dass Artikel wirklich aus einer Vielzahl von Medien und Text bestehen können.

Es macht Spaß, an einem Projekt zu arbeiten, bei dem man das Modell von Zeit zu Zeit abreißen und einen Teil davon neu aufbauen kann oder große Refactoring-Entscheidungen trifft, die einen für eine Weile mit einem kaputten Haufen Python-Bullshit zurücklassen.

Werbebanner in 2005

Gucken sich Sitebetreiber eigentlich mal ihre eigenen Seiten an? Wenn ich bei der Netzeitung auf einer Seite 30 Sekunden brauche um die Seite zu schliessen, nur weil da ein beschissenes Werbebanner alle Ressourcen blockiert, dann find ich das nicht mehr witzig. Das man beim Fernsehprogramm bei Yahoo vor lauter Flash-Werbung kaum noch scrollen kann, fand ich schon blöd. Aber eine Zeitung die von sich behauptet das Netz verstanden zu haben sollte doch vielleicht mal die eigenen Seiten angucken und etwas Qualitätssicherung bei den geschalteten Werbeteilen machen ...

Aperture und Performance

Aus creativepro.com - Stripping Raw Naked - einem Interview mit dem Macher von Aperture:

JS: It depends on what you do with Aperture. I mostly run it on my 15-inch PowerBook. That's not to say that I don't enjoy the refreshing wind-blowing-through-my-hair feeling when I sit down in front of a G5 running Aperture. But a PowerBook is fine for what a lot of photographers do in the field with their laptops: browse images quickly and step through the thumbnails. Maybe tag the images they like, maybe zoom in closely on one. The photo edit stage. For that, a PowerBook does take a speed hit, but it's totally usable.

This is where our scheme of loading a proxy image comes in -- the 1024 proxy is often all I need to see at this stage. Depending on how many megabytes each image is, Aperture on a G5 can load the full Raw image in less than a second. On my PowerBook, that same image may take three to four seconds to load fully.

For heavier duty image processing, faster GPUs and multiple processors are of huge benefit. Aperture does make extensive use of dual processors, but you do not need a Quad [a new model from Apple that has two dual-core processors].

Das klingt dann schon eher brauchbar - wenn ein 15" PowerBook tatsächlich als bedienbar anzusehen ist.

Bock: meet Gärtner

Verschiebung des Bereichs Gentechnik ins Wirtschaftsministerium befürchtet - Innerhalb der Union wird diskutiert, die Zuständigkeit für die Agro-Gentechnik vom Verbraucher- ins Wirtschaftsministerium zu verschieben. - Umweltschutz-NEWS.de

Und das mit Scatman Ede als Wirtschaftswunder. Nunja, ob sich sein Unterscherge gegen ihn gestellt hätte wäre eh zweifelhaft. Aber sicherlich eine ganz tolle Idee, wenn genau diejenigen über Gentechnikeinsatz bestimmen, die schön von der Industrie geschmiert werden ...

cucumber2 ist ein sehr interessanter Object-Relational-Mapper für Python und PostgreSQL, der unter anderem auch die Tabellenvererbung in PostgreSQL unterstützt.

Django Project - ein sehr nettes Webframework, welches ich bei mir hier einsetze.

PostgreSQL 8.1

PostgreSQL 8.1 mit Two-Phase-Commits und Benutzerrollen:

Transaktionen können nun auf mehreren Rechnern mit PREPARE TRANSACTION vorbereitet und später gemeinsam ausgeführt werden. Fällt eine Maschine nach dem PREPARE aus, lässt sich die Transaktion nach dem Neustart per COMMIT korrekt abschließen.

Yes!

Unheimliche Allianz

Wenn sich Industrie, Gewerkschaftler und die CDU zusammenrotten, um den Atomausstieg zu verhindern.

XML unter Patentschutz?

Patentblödsinn in Extrastärke: XML unter Patentschutz?. Aber Patente sind ja so ein toller Innovationsmotor, da ist es doch ganz richtig wenn eine Firma mit einem Patent, das sie selber nie in irgendeiner Form umgesetzt hat, mal eben sich in einem Bereich breit macht, der schon seit vielen Jahren in praktischer Anwendung ist.

Akismet - zentralistischer Anti-Spam-Filter

Photomatt (der von Wordpress) hat mit Akismet einen zentralen Anti-Spam-Dienst aufgebaut, den man per Plugin mit Wordpress benutzen kann. Zusätzlich gibts auch eine API, mit der man andere Dienste anbinden kann. Grundsätzlich eine gute Idee - auch wenn ich generell eine Abneigung gegen zentrale Dienste habe, ausser ich selber betreibe diese zentralen Dienste.

Was mir aber wirklich sauer aufstößt, ist dieser kleine Ausschnitt aus der FAQ:

Well without giving too much of the secret sauce away, we can safely say that it would be pretty difficult to poison Akismet.

Also zentraler Dienst - ok. Mag ich zwar nicht, aber macht durchaus für andere Sinn, die nicht selber sowas betreiben können oder wollen. Aber "secret sauce" - ich soll also meine Kommentare mit den persönlichen Daten meiner Kommentatoren an ein fremdes System schieben, bei dem ich nicht mal die Software sehen kann, die dahinter läuft? Sorry, nein Danke.

"Fitting on" some framework

Wie können Sie feststellen, ob ein Framework zu Ihrer Denkweise passt? Es ist nicht so, dass Sie einfach in den Spiegel schauen könnten, um zu sehen, ob es Ihnen gefällt. Sie benötigen andere Wege, um das zu entscheiden. Eine Möglichkeit, dies zu entscheiden, ist die Produktivität - wie schnell Sie Ihr Projekt zum Laufen bringen.

Aber erzählt Ihnen das wirklich die ganze Geschichte? Was, wenn das Projekt etwas völlig anderes gewesen wäre? Haben Sie einfach den Sweet Spot des Frameworks getroffen? Hatten Sie einfach nur Glück?

Eine Möglichkeit, zu entscheiden, ob ein bestimmtes Framework, eine Sprache oder ein Werkzeug zu meiner Arbeitsweise passt, besteht darin, die grundlegenden Abstraktionen zu betrachten, die mir dieses Werkzeug bietet. Und zu prüfen, wie ich sie verwenden kann und wie natürlich sie zu meinem Denken passen - stoße ich auf Probleme, weiß ich nicht sofort, welche Abstraktion ich verwenden soll, welches Werkzeug ich ziehen soll? Oder fallen die Dinge einfach an ihren Platz?

Ich habe relativ früh entdeckt, dass ich in der Programmierung etwas ungewöhnlich bin, weil ich nicht meine eigenen Abstraktionen baue und versuche, sie in das zu übersetzen, was die Sprache oder das Framework mir gibt, sondern dass ich beginne, direkt in den Abstraktionen und Syntaxen zu denken, die mir gegeben werden - aber nur wenn sie zu meiner Art passen.

Das ist für mich also das ultimative Maß dafür, ob ein Framework wirklich in mein Denken passt: von Zeit zu Zeit zu prüfen, ob ich Übersetzungen versuche oder ob die Dinge einfach fließen. "In den Flow zu kommen" ist für mich heutzutage das Wichtigste.

Wie schneidet Django also ab? quite nicely. Es gibt mir wirklich, was ich in den meisten Fällen brauche, es gibt nur sehr wenige Bereiche, in denen "der Flow" unterbrochen wird, in denen ich um Probleme herumdenken muss, anfangen muss, Übersetzungen zu machen. Ein Bereich ist das spezielle Verhalten von Eingabefeldern - dies wird derzeit in Django mit parametrisierten Instanzen von vordefinierten Feldklassen durchgeführt. Es gibt keine wirklich schöne Möglichkeit, Subklassen zu erstellen, man endet damit, Code aus anderen Teilen der Django-Quelldatei zu kopieren - definitiv "den Flow" brechend.

Aber die meisten anderen Teile fallen einfach an ihren Platz: Middleware für die globale Verwaltung des Request-Response-Bereichs. Template-Loader für - nun ja - Template-Loading (ja, es ist keine große Sache - aber in der Lage zu sein, Ihren eigenen Template-Loader zu schreiben, ist wirklich hilfreich). Die urlpatterns - hey, das ist wirklich eine coole Idee, weil Sie aufgrund der absolut lockeren Kopplung nicht einmal versuchen, Ihre URLs nach Ihrer Code-Struktur zu modellieren, sondern dazu neigen, sie zu entwerfen. Und so sollte es sein.

Models sind leistungsfähig genug, um die modellbezogene Funktionalität wirklich dorthin zu verlagern (obwohl das Class MODULE-Zeug es noch schöner machen wird, besonders das etwas hässliche module_globals-Ding). Es wäre cool, wenn Model-Klassen Mixin-Klassen unterstützen würden, so dass abstrakte Apps Dinge bereitstellen könnten, die einfach von den Benutzern referenziert werden, um Funktionalität hinzuzufügen. Aber Sie können viele dieser Probleme mit generierten Klassen lösen - dank Python-Introspektion (obwohl Sie ein wenig über die Django-Modellmagie wissen müssen).

Die meisten komplexen Dinge tendieren dazu, in Template-Tags und generische Ansichten zu gehen - mein CMS-Projekt hat derzeit nur 3 Ansichtsfunktionen seiner eigenen, der Rest ist in generische Ansichten abstrahiert (für die Suche und das Tagging). Template-Tags könnten etwas einfacher zu schreiben sein, insbesondere der Parser ist zu primitiv - eine Bibliothek von Hilfsfunktionen zum einfachen Zerlegen der Tag-Zeichenkette wäre gut (hey, vielleicht schreibe ich eine, die Grundlagen sind bereits in meinem SVN-Repository).

Template-Filter sind ein bisschen ein hässliches Entlein - sie sehen den Anforderungszusammenhang nicht, so dass sie nicht viel mehr tun können, als das eingehende Objekt und einige konstante Parameter zu übernehmen. Ich denke, sie sollten den Kontext übergeben bekommen, so dass sie, wenn nötig, ein bisschen schlauer sein könnten (wie z.B. das Auflösen eines Parameters gegen den Kontext durch Filter ermöglichen).

Generische Ansichten sind auch ganz schön - auch wenn ich die vordefinierten nicht so oft verwende. Der Hauptgrund dafür ist, dass ich oft damit ende, die generischen Ansichten in einigen Code zu wickeln, der ihr Verhalten modifiziert - und dann ist es oft einfacher, einfach meine eigenen zu erstellen. Aber sie sind großartig für den ersten Einstieg in Bereiche, hängen Sie sie einfach in Ihr Projekt ein und die Funktionalität ist verfügbar. Sie können sie immer durch Ihre eigenen Ansichtsfunktionen austauschen, wenn Sie feststellen, dass Sie sie benötigen.

Und der Admin, das eine Ding, das Django aus der Masse herausstechen lässt? In meinen ersten Spielprojekten habe ich ihn geliebt, in späteren habe ich ihn nicht verwendet (die Galerie braucht ihn nicht), aber mit dem CMS-Projekt habe ich das erste Projekt gemacht, das ihn wirklich stark nutzt. Und ich muss sagen, ich mag ihn. Er sollte etwas flexibler werden (der new_admin-Zweig könnte dabei helfen, da er mehr Dinge in Templates verschiebt, so dass sie überschrieben werden können), aber insgesamt ist er wirklich cool und nützlich.

Zwei Dinge sind jedoch definitiv für den Admin erforderlich: vollständige Transaktionsunterstützung, die an die Anforderung-Antwort gebunden ist (Ticket #9 im Django Trac), weil das Ändern von Dingen und das Ende mit inkonsistenten Tabellen kein Spaß ist. Wie z.B. eine Ausnahme zu erhalten, weil etwas in repr gebrochen ist, so dass der Log-Eintrag nicht geschrieben wird, aber das Objekt wird geschrieben. Natürlich bemerken Sie es nicht, gehen zurück, senden erneut und enden mit zwei Objekten und immer noch keiner Log-Nachricht ...

Das andere, was benötigt wird: grundlegende Haken für objektbasierte Authentifizierung. Kein vollständiges ACL oder so etwas, nur einige wirklich einfache Haken vom Admin zum Modell, die der Benutzer definieren kann, um dem Admin mitzuteilen, ob ein bestimmtes Objekt bearbeitbar sein sollte oder nur schreibgeschützt angezeigt werden sollte. Das Hauptproblem mit der aktuellen Lösung ist, dass sie nur vollständige Tabellen behandelt - Sie können dem Admin nicht einmal mitteilen, dass ein bestimmter Benutzer nur an der aktuellen Site arbeiten kann und keine Objekte anderer Sites ändern kann (mein CMS-Projekt macht starken Gebrauch von der Multi-Site-Fähigkeit in Django - ein Admin-Server sollte mehrere Sites in einer Admin-Oberfläche verwalten).

Aber alles in allem ist das Erstellen von Web-Apps mit Django wirklich Spaß. Es ist nicht nur produktiv für mich, es fühlt sich natürlich an, Dinge auf die Django-Art zu tun. Also ja, Django passt zu meinem Denkstil. Scheint genau ins Schwarze getroffen zu haben.

Der JavaScript Interactive Interpreter ist ein nettes Spielzeug: man kann JavaScript-Ausdrücke eingeben und die Ergebnisse direkt sehen. Also im Prinzip eine JavaScript-Shell - nur läuft die natürlich dann im Browserfenster.

Markdown für Django

Django enthält bereits einen Markdown-Filter (in contrib.markup), dennoch habe ich meine eigene Markdown für Django Mini-Anwendung erstellt. Die Hauptvorteile sind die Verknüpfung mit Django-Modellen (durch Verwendung generischer Modellabfragen und get absolute url), eine generische Dokumentationsansicht, die das Umschalten der Sprache handelt, und eine schöne Makro-Einrichtung für Markdown. Makros sind eine nützliche Möglichkeit, Markdown zu erweitern, indem Django-Vorlagenschnipsel geschrieben werden, die immer dann aufgerufen werden, wenn der Benutzer das Makro in seiner Markdown-Quelle aufruft.

Es war früher Teil des CMS-Projekts, aber ich denke, es ist nützlich in sich und so viel besser in das Stuff-Pseudo-Projekt einzubauen.

Scatha and Glaurung sind zwei Schachprogramme in OpenMCL geschrieben, mit dem Cocoa-Support von OpenMCL. Nette Beispiele dafür, wie man mit OpenMCL native OS X Anwendungen bauen kann - und interessant zu spielen sind sie auch, vor allem die hexagonal-Schach-Version.

Twisted Buch ist raus

Wer sein Hirn nicht so ohne weiteres in die verdrehte Welt von Twisted quetschen kann, dem hilft vielleicht Twisted Network Programming Essentials - ein neues Buch zu der wohl mächtigsten Internet-Protokoll-Plattfor für Python.

akaDAV - Lightweight WebDAV server and python module ist ein WebDAV Modul für Twisted. Damit kann man sich seinen eigenen WebDAV Server basteln. Könnte nütlich für mich sein, weil ich dann das Teil unter Userrechten laufen lassen kann, statt unter den Rechten des Webservers ...

Googles Web Accelerator and Damager

Google at it again - Ian sagt eigentlich schon alles, was es dazu zu sagen gibt. Google behauptet, sie wollten nicht "evil" sein. Aber dafür sind sie grenzenlos dämlich, wie sich am wiederholten Start des Web-Damagers zeigt.

Was macht der Web-Accelerator, und warum ist er so ein dämliches Stück Software? Nunja, er verfolgt einfach nur Links. Und zwar im Vorab, bevor der Benutzer es macht - sozusagen spekulatives Webcrawlen, nur eben privat für den Benutzer. Das klingt ja erstmal garnicht so schlimm, ausser das Server mit Traffic bombardiert werden, den sie möglicherweise so nie hätten - denn jeder Link wird schön weitergewandert, auch wenn der User da garnicht hin geht. Und das multipliziert mit den Benutzern die das Teil einsetzen ...

Aber der Traffic ist nicht das eigentliche Problem - das eigentliche Problem kommt erst, wenn man sich überlegt in welchem Context das Teil läuft. Und zwar hängt es ja auf dem privaten Rechner des Benutzers, zwischen Browser und Netz. Einfach ein eigener kleiner Proxy. Der für seine Arbeit sich Cookies und ähnliches merkt und an die Seiten dann Requests schickt, die so aussehen als kämen sie vom Browser des Benutzers. Mit dessen Security-Headern. Und Cookies.

Abgesehen davon, das ich es nicht sonderlich prall fände wenn meine Header mit Passwörtern oder Sessioncookies woanders als im Browser und im Zielserver auftauchen - diese Vorgehensweise ermöglicht es dem Webaccelerator sich auch Bereiche anzugucken, die ein zentraler Crawler nicht sehen würde. Nämlich zum Beispiel Seitenbereiche, die hinter Logins liegen. Content-Management-Systeme, bei denen nach Login zusätzliche Links auftauchen. Wikis, deren Edit-Links dann kommen, wenn jemand eine Session startet. Webmailsysteme, bei denen jede Mail als ein Link abgebildet ist.

All diese Systeme haben eines gemeinsam: für verändernde Aktionen ist nicht immer ein Formular-Absenden notwendig. Oft reicht es, einen Link zu klicken. Die aktuelle Version einer Seite im Wiki zu löschen, um schnell Wikispam zu beseitigen - ein einfacher Link, nur für den angemeldeten Benutzer sichtbar. Die Mail im Webmail-Postfach, die bei Aufruf automatisch auf gelesen gesetzt wird. Der Veröffentlichen-Link im CMS, mit dem eine Seite scharfgeschaltet wird.

Natürlich versuchen verantwortungsvolle Programmierer von Webanwendungen die destruktiven Aktionen hinter Formulare (und damit POST Requests) zu packen, damit nicht ein einfacher Link irgendwas zerstört. Aber das passiert in der Regel nur in den öffentlich zugänglichen Bereichen, bei denen sonst die Webrobots der diversen Suchmaschinen und Spam-Automaten sonst Chaos verursachen würden.

Aber gerade in den durch Login abgeschotteten Bereichen rechnet man normalerweise eben nicht mit Automatenklicks - und baut daher Komfortfeatures ein, weil man ja sicher sein kann, das ein Link bewusst und in Absicht geklickt wird.

Tja, bis dann der Web Accelerator von Google kam. Von der Firma, die von sich behauptet das Web kapiert zu haben. Schönen Dank auch, ihr Arschlöcher.

PS: und entgegen der ersten Version schickt die neue Version keinen Header mehr mit, an dem man die Prefetch-Requests erkennen könnte um sie in solchen kritischen Bereichen zu blocken.

python webdav server ist noch ein WebDAV Server für Python - seit 2000 nicht mehr aktualisiert, aber wenns funktioniert, könnte es reichen. Vielleicht verständlicher als Twisted-Code.

Spam-Blockliste lief Amok

Und jetzt ratet mal welche das war? Genau - SORBS. Meine Lieblings-Ansammlung technischer Inkompetenz und sozialer Blödheit. Könnte nicht mal jemand eine UDP gegen die Pfeifen einleiten?

Launch Box ist ein QuickSilver Clone für Gnome. Scheint noch etwas roh zu sein und die Installation könnte wegen der harten Abhängigkeiten etwas haarig sein.

Linux and RAW Digital Photography liefert einiges an Informationen über RAW-Formate und Linux.

Lphoto ist eine Fotodatenbank für Linux, aufgebaut ähnlich wie iPhoto für den Mac.

Generischer Suchdienst für Django

Wenn Ihre Django-Anwendung Suchfunktionen benötigt, können Sie Ihre eigene Lösung entwickeln. Oder Sie können meine generische Suchansicht verwenden. Diese bietet einen Parser für Abfragen und eine Suchmaschinerie, die für moderate Datenbankgrößen geeignet ist. Sie bietet eine erweiterbare, google-ähnliche Syntax.

Das Hauptproblem ist, dass Django keine OR-Abfragekombinationen unterstützt und dass es keine "icontainsnot"-Abfragen unterstützt. Die Suchmaschine führt daher mehrere Selektionen durch, um eine Abfrage zu erhalten. Sie beginnt mit dem längsten Suchbegriff und geht von diesem Ergebnisdatensatz aus in der Größe nach unten, wobei sie ihn von einem Schritt zum nächsten einschränkt. Da sie jedoch den letzten Ergebnisdatensatz im Speicher behalten muss (mindestens die Liste der IDs), kann dies Probleme für Ihren Server verursachen, wenn Ihre Datenbank zu viele Zeilen enthält (insbesondere wenn die Benutzer dumme Abfragen durchführen, die große Ergebnisdatensätze erzeugen).

Vielleicht wird dies in Zukunft einige Optimierungen lernen, um es besser mit größeren Datenbanken funktionieren zu lassen, aber es ist ganz gut als Suchmaschine für Ihren Blog oder Standard-Content-Management-Systeme.