PHP-Caching
Zwei verschiedene Möglichkeiten, die Zuordnung von einem Titel zu einer URL zu speichern. Das ergibt jeweils einen sehr simplen Cache für Variablen.
Zum einen APC:
function get_cached_title($url) { return apc_fetch($url); } function cache_title($url, $title) { return apc_store($url, $title); }
Vom Code her ist das sehr einfach. Vorraussetzung ist aber die Installation von APC.
Die bei Serendipity gebotene Alternative ist die Nutzung von Cache_Lite. Diese Funktionalität wird mitgeliefert, installiert werden muss nichts. Dafür ist der Code etwas umfangreicher:
class ... { var $cache = null; var $cache_group = 'serendipity_specificplugin'; function ... {... @include_once 'Cache/Lite.php'; if (!class_exists('Cache_Lite')) { $this->debugMsg('Cache_Lite not available.'); return false; } $options = array( 'cacheDir' => $serendipity['serendipityPath'] . 'templates_c/', 'lifeTime' => 604800, //one week 'hashedDirectoryLevel' => 2, 'automaticCleaningFactor' => 200 ); $this->cache = new Cache_Lite($options); $this->cache->_setFileName($url, $this->cache_group); .... } function get_cached_title($url) { return $this->cache->get($url, $this->cache_group); } function cache_title($url, $title) { return $this->cache->save($title, $url, $this->cache_group); } }
Ein ganzes Beispiel dafür findet man im cachesimple-Plugin.
Antwort zu "Wir brauchen die GPL nicht mehr"
Eric S. Raymonds Argumentation fand ich gar nicht so abwegig. Aber die Entgegnung auf koehntopp.de entlarvt ihre Schwachstellen. Sehr überzeugend.
Super Metroid
Der Metroid-Teil für das Snes ist der erste, bei dem ich nicht sofort in einer Sackgasse lande. Die alte Grafik empfinde ich auch als durchaus passend:
Nicht sofort heißt leider nicht nie. Irgendwie ist das Suchen nach dem weiterführenden Weg bei dieser Spieleserie mein Fluch. Das war schon vor Jahren auf dem Gameboy so.
Alle Jahre wieder
Das ist das Problem mit Zentralisierung: Ein einzelner Fehler trifft sehr viele. Gab es eigentlich seit der Einführung vor zwei zwei Jahren ein Zentralabi in Hessen, das nicht schlampig durchgeführt wurde?
Chart Generator
Die Diagramme im Bootzeit-Artikel haben einiges an Zeit gekostet. Nicht primär Erstellungszeit weil sie so aufwändig wären, sondern Suchzeit, weil ich sie nicht einfach in einem Excel-Pendant erstellen wollte. OpenOffice stellte mich da bei vorangegangenen Versuchen immer wieder vor Bedienungshürden, sodass zumeist dann doch nochmal Gimp gestartet werden musste.
Nein, es sollte ein einfacher Diagrammersteller sein. Die Werte eingeben, ein paar Parameter einstellen, und schon sollte das Diagramm rauskommen. Da gibt es zwar ein paar in diese Richtung gehende JavaScript- und Flashmöglichkeiten, manche sogar kostenlos, aber genau so etwas selbst einzubindendes sollte es eben auch nicht sein. Sowas lokal groß zu testen war mir zu aufwändig, und ohne Test damit am Blog rumspielen?
Die Google Chart API passte perfekt. Nur die Bedienung nicht, die Parameter per Hand zusammenzuschreiben gestaltete sich nicht als praktisch. Als eine zuerst gefundene GUI nicht korrekt funktionierte wollte ich schon aufgeben, stolperte dann aber über den Google Charts API Generator. Ein Glücksfall, denn der ist hervorragend gelungen: Die Erklärungen sind wirklich hilfreich, die Anordnung der Oberfläche ist unterstützend, und vor allem kommt am Ende das gewünschte Ergebnis raus.
Der Generator ist laut Eigenaussage als Ajax-Übung erstanden. Es wurde ein gutes Beispiel dafür, wie man mit dynamischen Eingabefeldern, die nur bei Bedarf eingeblendet werden, eine komplexe Sache beherrschbar machen kann.
Gnome Zeitgeist
Auf Seilo @ Geeky Ogre wurde gerade eine kurze Videopreview von Gnome-Zeitgeist vorgestellt.
Was ist das? Vor allem ist es ein Feature, das in Gnome integriert werden soll. Aktivitäten werden einer Zeitleiste zugeordnet. In dem Video kann man Videodateien, Texte und sogar besuchte Seiten erkennen.
Ergo ist es ein bisschen mehr. Diese zeitliche Einordnung ist eine andere Möglichkeit, die eigenen Dateien zu verwalten. Statt zu fragen: "Wo habe ich das vorhin gespeichert" kann man einfach beim Zeitpunkt "vorhin" nachschauen.
Denkbar sind noch viele weitere Anwendungsfälle, wenn man das Prinzip ausweiten sollte. Zeitliche Zuordnung lässt Schemata erkennen - z.B. "welche Programme werden immer nach dem Login gestartet?". Das würde einige interessante Funktionen ermöglichen.
Speicherverbrauch und Bootzeit unter Ubuntu II: Intrepid
Dirks Kritik an der Fokussierung auf die Bootzeit hat viele Reaktionen ausgelöst. Worüber reden wir da eigentlich, auf welchem Stand ist Ubuntu?
Dabei zu klären ist die Definition der Bootzeit. Für mich und im Folgenden wird sie so definiert: Verstrichene Zeit ab der Auswahl des Systems in Grub bis die Oberfläche fertig geladen, also nutzbar, ist.
Für die Messung wurde der Autologin von GDM aktiviert, bei der Messung von KDE 4 der Autologin von KDM. Als Referenzwert dient meine Hardyinstallation, auf der IceWM von rungetty automatisch und ohne zwischengeschalteten Displaymanager gestartet wird.
Die Werte Intrepids
Gemessen wurde jeweils das Standarddesign. free +/- wurde einmal direkt nach dem Start, einmal nach 30 Sekunden gemessen. Sonstige Programme wurden nicht gestartet, allerdings auch keine standardmäßig dort platzierten Programme aus dem Panel geschmissen.
Grafisch
Tabellarisch
Kategorien | Hardy (IceWM) | Gnome (Compiz)* | Gnome (Effekte) | Gnome (ohne) | KDE 4.2* | Xfce | LXDE | IceWM (Intrepid) | GDM* | Windows XP |
---|---|---|---|---|---|---|---|---|---|---|
free +/-: |
51916 |
189440 |
190792 |
185624 |
188212 |
164520 |
101792 |
82692 |
- |
146000 |
free +/- (30s): |
51864 |
211988 |
211736 |
185624 |
239716 |
182240 |
112660 |
82816 |
- |
165000 |
Bootzeit: |
0:50 |
1:15 |
1:13 |
1:03 |
1:11 |
0:59 |
0:55 |
0:45 |
0:44 |
0:50 |
Anmerkungen: |
*ohne Würfel |
*ohne Effekte |
*Design: Ubuntu |
*Design: Windows 2000 |
Fazit
Aktuelle Relationen
Im Intrepidvergleich ist nicht viel überraschendes zu entdecken. Gnome startete etwa so schnell wie KDE 4. KDE war allerdings in Version 4.2 aus inoffiziellen Quellen installiert und wird bei diesem Vergleich durch den mitzustartenden MySQL-Server behindert. Ein fairer Vergleich zwischen Gnome und KDE 4 unter Ubuntu wird erst mit Jaunty möglich sein, daher wurden die übrigen KDE-Werte nicht gemessen.
Compiz selbst wirkt nicht wirklich verlangsamend. Allerdings ändern das die Plugins ein bisschen, die durchaus Auswirkungen auf den Speicherverbrauch haben.
Xfce ist nicht wesentlich kleiner als Gnome ohne Effekte, aber deutlich größer als ein LXDE. LXDE dagegen verbraucht etwas mehr Ram als IceWM und startet etwas langsamer.
Bei IceWMs Startzeit ist beachtenswert, dass es kaum länger dauert, als wenn GDM nur sich selbst lädt.
Schön zu sehen ist die Beschleunigung im Vergleich zu Hardy. Allerdings kann man das hier nur beim IceWM-Vergleich sehen. Ob Gnome selbst unter Hardy nochmal langsamer startete? Der Speicherverbrauch zumindest von IceWM hat unter Intrepid zugenommen.
Windows XP ist etwas schneller als Gnome verfügbar, aber langsamer als IceWM. Allerdings ist das die Startzeit bis zur fertig geladenen Oberfläche, ohne Virenscanner, Firewall und sonstigen Startprogrammen, die unter Windows eher ein Muss sind als unter Ubuntu. Der Speicherverbrauch von Windows und Ubuntu ist nicht wirklich vergleichbar, die aufgelisteten Werte nur aus dem Taskmanager abgelesen.
Vergleich mit Gutsy
Unter Gutsy habe ich schonmal so einen Vergleich gemacht. Die Werte damals:
Kategorien | IceWM (Dapper) | Gnome (Compiz) | Gnome (Metacity) | Xfce | LXDE | IceWM (Gutsy) |
---|---|---|---|---|---|---|
Bootzeit: |
0:39 |
1:10 |
1:04 |
0:52 |
0:42 |
0:39 |
Die Zeiten von Intrepid und Hardy stellen also eine Verschlechterung dar. Die Hardware hier ist fast identisch, nur der Ram wurde von 1GB auf 2GB aufgestockt, was die schlechtere Startzeit nicht erklärt (aber durchaus Auswirkungen auf den Speicherverbrauch haben kann, weswegen ich diese Werte weggelassen habe).
Auf die Befürchtungen und Wünsche von damals eingehend: Compiz hat sich kaum weiter verlangsamt, aber Gnome startet auch nicht schneller. Metacitys Effekte haben durchaus Auswirkungen auf Speicherverbrauch und Startzeit. LXDE liegt nun etwas näher bei Xfce. Konstant ist der Vorteil von IceWM: Es startet sofort.
Insgesamt bleibt festzuhalten, dass Jaunty hier einiges aufholen kann.
Der/Das Blog
Ein Thema der Kleingeisterei oder ernstzunehmende Ignoranz? "Der Blog" sei falsch heißt es oft, ganz konkret nun hier als Teil einer Kritik am Freitag, dem diese "Falschdarstellung" als Ignoranz angekreidet wird. Ist die Sache wirklich so eindeutig wie dort und in den Kommentaren zu meiner Kritik an der Kritik dargestellt?
Argument für "Das": Es heißt "das Log". Blog stamme von Weblog und sei daher ein Neutrum. Da gibt es allerdings mindestens ein Problem: Web ist kein deutsches Wort. Blog ist also eine Zusammensetzung eines im Deutschen allgemein verstandenem Wort, dem Log als Logbuch, und einem nur inzwischen verständlichen, dem Web. In solchen Fällen ist die Einordnung nicht mehr so eindeutig.
Aber trotzdem: Wenn allgemein anerkannt und vor allem bekannt wäre, dass Blog von Weblog kommt, dann wäre das "das" sicher angebracht. Aber hat sich hier nicht das Wort "Blog" inzwischen selbstständig gemacht, beispielsweise ganz andere Konnotationen entwickelt?
Argument für "Der": Im Kommentar habe ich auf "Block" verwiesen. Natürlich habe ich damit nicht gemeint, dass Blog von Block abstamme. Aber es sind gleichlautende Wörter mit teils überschneidender Bedeutung. Und hierbei relevant: Gleichlautend harte männliche Worte. Motor, Roboter, Block, Fluss, Katalog(!), Mord, Tod ... - bestimmte Wortklänge weisen nunmal auf ein "männliches" Wort hin. Die Endungen -tum, -chen, -am, -ent, -um dagegen würden auf "das" hindeuten, und keine davon ist bei dem Wort "Blog" gegeben. Diese Klangdefinition wird insbesondere durch das oft fehlende Wissen über die Herleitung des Wortes und durch den Ursprung außerhalb der deutschen Sprache relevant.
Der mögliche Einwand ist berechtigt: Das Fehlen der passenden Endung und der Wortklang sind kein eindeutiges Kriterium, und -og nichtmal eindeutig männlich.
Ich sage nicht, dass "das Blog" die falsche Bezeichnung ist. Ich meine jedoch, dass "der Blog" nicht so verkehrt ist. Nicht nur, weil der Duden das ebenso sieht - der Duden hat nicht immer recht bzw. hat keine Definitionsgewalt. Sondern, weil es über den Sprachklang und der üblichen Spracheinordnung durchaus zu begründen ist.
Performancevergleich am Beispiel von nl2p
Die Versionen 0.1 und 0.2 von nl2p sind funktional (fast) gleichwertig, aber in einem elementar wichtigen Punkt unterschiedlich: Der Performance.
In meinem Testblog werden die letzten 20 Einträge dieses Blogs gespiegelt und ein paar zusätzliche Testfälle angezeigt, die Seite 2 war also fast identisch. Ohne das Plugin dauert das Laden der zweiten Seite drei Sekunden. Mit Version 0.2 braucht es circa vier, diese kleine Verzögerung ist eigentlich normal. Aber mit Version 0.1 waren es ganze 16 Sekunden.
Ein kleines Beispiel:
/** * Make sure none of these block_elements are within a <p> * @param string text * @return string * */ function isolate_block_elements($text) { $block_elements = array("<table","<ul","<ol","<pre", "<dir", "<dl", "<h1", "<h2", "<h3", "<h4", "<h5", "<h6", "<menu", "<blockquote"); foreach ($block_elements as $start_tag) { for ($i=0; $i<count($text); $i++) { if ($this->contains($i, $text, $start_tag) === true) { $text[$i] = "</p>" . $text[$i]; } if ($this->contains($i, $text, $this->end_tags($start_tag)) === true) { $text[$i+strlen($this->end_tags($start_tag))] = $text[$i] ."p>"; } } } return $text; }
An sich sollte das halbwegs vernünftig aussehen. Für jedes Blockelement werden alle Arrayelemente überprüft. Aber da fängt es an: $text ist ein Array, das mittels str_split() aus einem String erstellt wurde. Jedes tag ist also zersplittert, $text[0] erhält z.B. das '<', $text[1] das 'u' von <ul> und so weiter. Das muss aber nicht so sein: Da die p-tags in ein Arrayindex reingesetzt werden, kann ein Arrayelement auch einen String und nicht nur einen Buchstaben enthalten. Die Funktion contains() überprüft also so viele Arrayelemente, wie das Blockelement lang ist, jeweils doppelt:
function contains($start, $text, $tag) { $tag_array = str_split($tag); $tag_cursor = 0; $scattered = true; for ($i=$start; $i < $start + strlen($tag); $i++) { if (strpos($text[$i], $tag) !== false) { return true; } if ($text[$i] !== $tag_array[$tag_cursor]) { $scattered = false; } $tag_cursor++; } return $scattered; }
Grausamer, grausamer Code. Jedes Arrayelement wird im Zusammenspiel der beiden Funktionen pro Blockelement mindestens sechsmal angefasst, noch öfter, wenn das Blockelement länger ist. Dass '$start + strlen($tag)' (wie auch das count($text) in der Funktion oben) bei jedem Schleifendurchlauf durchgeführt wird kommt noch dazu und unterstreicht, dass das schlecht gewachsener, wuchernder Code ist, der unbedingt neu strukturiert werden musste.
In Version 0.2 gibt es kein contains(). Stattdessen arbeiten alle Funktionen außer dem Grundparser nicht mit Arrays, sondern direkt auf dem String. Die 'isolate_block_elements()' erfüllt noch die gleiche Aufgabe, aber wesentlich schneller:
function isolate_block_elements($textstring) { $block_elements = array("<table","<ul","<ol","<pre", "<dir", "<dl", "<h1", "<h2", "<h3", "<h4", "<h5", "<h6", "<menu", "<blockquote"); $block_elements_amount = count($block_elements); for($i=0;$i<$block_elements_amount;$i++) { $start_tag = $block_elements[$i]; //first see if block-element really exists $tag_position = strpos($textstring, $start_tag); if ($tag_position === false) { continue; } else { $end_tag = $this->end_tags($start_tag); $textstring = str_replace("$start_tag", "</p>$start_tag", $textstring); $textstring = str_replace("$end_tag", "$end_tag<p>", $textstring); } } return $textstring; }
$text ist hier ein String, kein Array, die Umbenennung in $textstring mag suboptimal sein, markiert das aber. Das contains() wurde mit strpos() ersetzt. Das Einfügen der p-Tags erfolgt nicht mehr manuell mithilfe einer for-Schleife, sondern mittels 'str_replace()'.
Ich gehe davon aus, dass nichtmal die zweite Version optimal ist. Immerhin bin ich kein geübter, geschweige denn gelernter PHP-Programmierer. Aber sie ist wesentlich effizienter als die erste.
Der Vergleich soll ein Beispiel dafür sein, wieviel grausamer Code durch fehlende Distanz entstehen kann. Einen Schritt zurückzutreten und die Grundbedingung überprüfen (warum arbeitet die Funktion auf einem Array?) hilft enorm. Auch ist es ein Plädoyer für Teamarbeit: Hätte ich mit einem meiner Kollegen zusammengearbeitet, wäre durch das gemeinsame Überlegen schon der erste Versuch wahrscheinlich wesentlich besser ausgefallen.
Monitorprobleme
Ich nutze hier einen alten Belinea-Röhrenmonitor. Doch was heißt schon alt, ~fünf Jahre sind so viel nun auch nicht. Wie auch immer: Der geht nur noch an, wenn man den Anschaltknopf lange drückt. Und auch dann nicht immer. Oft geht er erst in einen Zwischenmodus, das Bild bleibt schwarz, die grüne Lampe blinkt.
Manchmal geht er mitten im Betrieb in diesen Zwischenmodus, ein Knopfdruck schaltet ihn dann aus, und dann beginnt immer das gleiche Spiel, das auch beim ersten Einschalten immer startet: Lange drücken, Zwischenmodus, ausmachen, lange drücken, Zwischenmodus, ..., bis er irgendwann an bleibt.
Was mich dabei irritiert: Was ändert die Länge des Knopfdruckes? Warum ist das Bild an sich einwandfrei, obwohl er anscheinend am Sterben ist? Warum geht er überhaupt aus? Und warum ist das Problem schlimmer, wenn er mal ein paar Tage aus war?
nl2p nutzbar: 0.2
Das als Vorabversion schon gezeigte nl2p-Plugin für Serendipity ist fertig. Unter der Haube fast komplett umgebaut (aus Performancegründen, dazu später mehr), aber funktional gleichwertig. Das heißt: Steht unter einem Textabschnitt ein Enter wird er zu einem kleinen, bei zwei Enter oder mehr zu einem großen Absatz. Blockelemente werden allgemein nicht angerührt, sodass man Listen und Tabellen auch direkt als HTML schreiben kann ohne das Plugin deaktivieren zu müssen, blockquotes dagegen werden formatiert.
Da Markdown und Textile in Kombination damit nicht richtig funktionieren, wird nl2p durch das Textformatierungsplugin liquid ergänzt, dessen neue Version leicht verbessert wurde: Escaping per \ und ein gefixter Bug, der in Kombination mit a-Tags auftrat, sollten es nun für den echten Einsatz nutzbar machen. Wer eine Idee für einen besseren Namen hat oder eine funktionierende Alternative kennt gebe bitte Bescheid. Wobei das nicht als Distanzierung verstanden werden soll, es scheint in all seiner Einfachheit bisher wirklich gut zu funktionieren.
Noch kurz ein Wort zu Textile, das als mögliche nl2p-Alternative für einige besser passen dürfte, denn es reagiert ebenfalls unterschiedlich auf einzelne und mehrere Enter und macht auch sonst einen guten Eindruck. Das Plugin kam bei meinen Tests nicht mit HTML-Blockelementen zurecht, formatierte z.B. auch newlines in ul-Listen zu Umbrüchen und pfuschte in pre-Tags rum. Dies ist laut Doku mit Textile-Bordmitteln vermeidbar, aber hier zu oft genutzt um alle Einträge umzustellen und daher ein ausschließendes Kriterium.
Beide Plugins sind im Blog aktiviert, wer Anzeigefehler (z.B. komplett fehlende Einträge oder unpassend kursive) oder sonstige Bugs bemerkt - bitte melden.
Download:
Scrollbar festgepinnt
Bin ich vor kurzem noch darüber gestolpert, wie man die Scrollbar bei Eingabefeldern festpinnt und dass das bei Serendipity nötig wäre, muss das bald niemand mehr manuell machen. Garvin hat die Änderungen eingebunden.
Krisengewinner FDP
Warum ausgerechnet die FDP? Keine Partei dieses Landes hat sich rhetorisch schuldiger gemacht. Natürlich, gehandelt hat diese Partei mangels Macht nicht, aber auch durch Sprache und besetzte Positionen kann man Politik steuern. Das sieht man nun neu bei der Linken - und man sah es in den letzten Jahren an den Einheitsparolen von FDP, CDU und SPD.
Die Öffnung
Auch wenn der Spiegel etwas anderes behauptet: Diese Krise wurde nicht von einer einzelnen Bank ausgelöst. Jeder Erklärungsversuch von meiner Seite muss vereinfachend sein, und doch ist klar: Ein stetig wachsender Finanzsektor mit 25%-Renditezielen kann nicht gesund sein. Ihn zu begrenzen ist die vernünftige Forderung der Stunde, doch auch in den USA wird nur gegen die sichtbarsten Wucherungen vorgegangen (immerhin). Doch wer genau hat ihn wann so geöffnet, dass er so ausufern konnte?
Wie könnte man diesen Markt stärker öffnen, als der größtmöglichen Spekulation, dem Treiben der Hedgefond, Tür und Tor zu öffnen? Getan hat dies in Deutschland die SPD. Und zwar nach den Forderungen der FDP. Die letzte große Öffnung 2004 mit dem Investment-Modernisierungsgesetz ist auch symbolisch zu sehen, als Bejahung dieses ausufernden Finanzsektors, des Shareholder-Values - Konzepten, die damals viel Geld brachten.
Die groben Fehler
Besonders unverständlich ist der Zuspruch für die FDP, wenn man sich das damalige Rentenkonzept ansieht:
Die Basissicherung aus der gesetzlichen Rentenversicherung muß folglich stärker als heute durch private und betriebliche Vorsorge zur Lebensstandardsicherung ergänzt werden. Zur Förderung der individuellen Altersvorsorge schlagen wir die Einführung eines individuellen, vererbbaren Altersvorsorgekontos vor, in dem betriebliche und private Altersvorsorge zusammengefaßt werden.
Man stelle sich vor, das hätte sich durchgesetzt. Die Rente aller wäre auf ein Minimum gesunken, auf den betrieblichen Anteil. Denn die private Rente ist eine Rente "abgesichert" vom Finanzsektor - ein Wort, das mit dem Adjektiv sicher nicht in einem Satz stehen sollte. Über die sozialen Implikationen einer solchen vererbbaren(!) Ego-Absicherung statt Gemeinschaftsumschichtung braucht man gar nicht weiter reden.
Solche Fehler findet man in dem Programm in Hülle und Fülle. Da soll alles mögliche dereguliert, der politische Einfluß im Bankensektor reduziert werden, die Steuern gesenkt (womit würde man die Konjunkturpakete bezahlen, die Banken retten?), G8 ist erstrebenswert und geht noch nicht weit genug. Apropos: Bildung, das ist eines eigenen Satzes würdig, soll noch weiter den Bedürfnissen der Wirtschaft untergeordnet werden, was einer Abschaffung der eigentlichen Bildung entspricht. Ein schlechteres Konzept ist nach den inzwischen erfolgten Ereignissen kaum vorstellbar.
Die fehlende Alternative
So oft die Linke auch als Sammlung kommunistischer Sozialistenschweine dargestellt wird: Sie sind eine Stütze des kapitalistischen Systems. Ein Mindestlohn gräbt das System nicht um, er macht es nur sozialer. Höhere Steuern benötigen die kapitalistischen Einnahmen, um zu wirken. Sie sind nur eine Umverteilung von oben nach unten und federn so die Schwächen des Systems. Also: Wenn selbst die Linke keinen Systemwechsel fordert, dann wird es keinen geben.
Interessanterweise scheint das der FDP in die Hände zu spielen. Denn oberflächlich betrachtet scheint sie für die noch arbeitende Bevölkerung alternativlos: SPD und CDU reagieren nur auf die Krise und haben gar keine Konzepte. Die Maßnahmen der Linken würden den sozial Schwachen helfen, vielleicht zu Lasten des oberen Mittelstandes, was diese meinungsbeherrschende Schicht nicht gerne sehen dürfte. Daher hilft auch der Schwenk nach links der CDU nicht viel, und der SPD glaubt man nach Hartz 4 sowieso keine linke Position mehr. Die Grünen haben unter Schröder den Kurs in die Krise mitgetragen und hatten noch nie ein finanzpolitisches Profil. Bleibt nur die FDP mit ihrer Parole vom allesrichtenden Markt, so falsch und widerlegt dies auch sein mag. Hoffnung war noch nie rational.
Die tieferen Gründe
Das reicht noch nicht. Wenn man verstehen will, warum die FDP trotz der offensichtlichen Bejahung aller Krisengründe Zuspruch erhält, muss man sich den Feierabendverkehr ansehen. Wenn die Masse der Menschen in die öffentlichen Verkehrsmittel und dann nach Hause strebt, dann ist die Krise ganz weit weg. Dann geht es nicht darum die Gesellschaft neu zu ordnen. Die Gesellschaft existiert in ihrer jetzigen Form, und solange die Armut sich nur in Zeltstädte in den USA manifestiert und nicht in Massenarbeitslosigkeit hierzulande, dann bleiben die Arbeitnehmer ein stabilisierender Faktor dieses Systems. So hart das jetzt klingt: Da das System asozial ist, ist diese Stütze entsprechend. Die FDP bekommt Zuspruch, weil sie eben nicht die Folgen der Krise abfedert. Weil sie sogar den Mindestlohn ablehnt, selbst die Steuern, mit denen die Sozialsysteme finanziert werden. Das kommt so lange an, wie die Menschen darin einen Vorteil für sich selbst sehen, so lange sie selbst noch Arbeit haben, und mit der FDP netto ein kleines bisschen mehr Lohn. Die Kosten der Umverteilung von unten nach oben sieht man auf dem Gehaltsscheck nicht.
Existiert ein Ausweg? Wirklich revolutionäre Kräfte könnten nur von den Arbeitslosen oder von der Jugend kommen. Erstere Gruppe stemmt maximal die Linke. Die Studenten sind politisch desinteressiert. Pseudo-proletarische Jugendliche dagegen hören Bushido und laufen MTV-schauend als Hiphopper mit dem System mit. Als asoziale Elemente in dem System, moderne Hässlichkeit verehrend. Dadurch schon in gewisser Weise destruktiv, aber nicht in einem Sinne, aus dem irgendwas positiv erwachsen könnte.
Es wird wohl dauern, bis die sichtbaren gesellschaftlichen Kosten der egoistischen FDP-Hoffnung ihren subjektiven Gewinn übersteigen. Und doch ist dieses Erkennen die einzige Chance. Hoffentlich ist es dann nicht zu spät.
Spiegelhetze nach Winnenden
Dass es ausgerechnet Spiegel Online ist, der mit reißerischer Überschrift und intimen Details alle Grenzen überschreitet, ist bezeichnend für den Verfall dieses Magazins. Wobei: Gegen Computerspiele hatten die schon immer was. Sieht man schon daran die sich nicht zu dumm sind, überhaupt die Diffamation "Killerspiel" zu verwenden, sie mit eingeführt haben. Und muss dem Täter ein Denkmal gesetzt werden, indem jeder Mensch Deutschlands nun sein Gesicht kennt? So züchtet man doch nur Nachahmungstäter, die posthum die gleiche Bekanntheit erlangen wollen.
Bei "Far Cry 2" handelt es sich um einen sogenannten Ego-Shooter, bei dem der Spieler die Aufgabe hat, in einem fiktiven, afrikanisch erscheinenden Land einen skrupellosen Waffenhändler zu eliminieren.
Man sieht die Gemeinsamkeit mit einem Amoklauf? Mit der gleichen Berechtigung kann man berichten, dass er am Abend zuvor Brot gegessen hat. Dass es nicht nur ein sogenannter Ego-Shooter ist, sondern wirklich einer, und das Land nicht nur fiktiv afrikanisch erscheint, sondern fiktiv afrikanisch ist, hätte dem Autor auch auffallen können. Insbesondere wegen des dort herrschenden Schulmangels.
Counter-Strike und weiter Spiele hatte er natürlich installiert. Wie Millionen anderer Jugendlicher auch. Das ist so initial ohne Grund keine Berichterstattung wert. Nein: Es hat so initial nicht mal erwähnt zu werden. Wegen der Debatte, die so grundlos losgetreten wird, die unseriös ist, und die ein seriöses Magazin entsprechend beleuchten müsste, wenn es sie schon anstösst. Die veraltete realitätsferne Grafik der beiden Klassiker hätte man zum Beispiel erwähnen müssen, dazu die Verbreitung.
Die intimen Details über seine Pornobilder gehen ja wohl wirklich niemanden etwas an, daher werde ich sie hier nicht zitieren. In Zusammenhang mit einem Gutachten, das den Frauenhass des Täters untersucht, kann man über sowas berichten. Aber doch nicht einfach so. Ich bin entsetzt. Hätte ich derzeit den Spiegel abonniert, hätte ich ihn nun mal abonniert gehabt.
War wohl nichts mit einer langsamen Abkehr von dem Thema.
nl2p für Serendipity
Nach dem Amoklauf und den Überlegungen dazu wusste ich nicht, wie das hier weitergehen soll. Wie schließt man an so ein Thema an, ohne dass eine unpassende Kombination entsteht? Ich will auf der Meta-Ebene bleiben und die Frage so umgehen.
Serendipity verwendet standardmäßig das nl2br-Plugin. Das ist sinnvoll, denn so entspricht das Textverhalten im Editor dem gewohnten - jedes Enter führt eine Zeile weiter nach unten. Es ist nicht sinnvoll, denn nur mit br unterteilte Texte wirken wider der Barrierefreiheit. Diesen Konflikt zu lösen ohne das einfache Enter zu ignorieren ist derzeit die selbstgewählte Aufgabe.
Übrigens nicht ganz freiwillig: Markdown kam scheinbar nicht zu 100% mit dem nl2br-Plugin zurecht. Dieses mal kurz zu deinstallieren um das Problem zu überprüfen war keine gute Idee, die beitragsspezifischen Einstellungen gingen dabei verloren. Es nun wieder zu installieren würde einigen Texten nicht gut tun.
Die Lösung ist manuell recht simpel: Zwei <p>-Tags werden per CSS unterschiedlich konfiguriert. <p class="whitespace"> schafft unter dem Absatz eine Linie Platz, <p class="break"> springt nur in die nächste Zeile:
p { margin-top: 0em; margin-bottom: 1em; } p.whiteline { margin-bottom: 1em; } p.break { margin-bottom: 0em; }
Mit diesen beiden Hilfsmitteln kann man nun den Text sauber und richtig unterteilen.
Zum Glück habe ich das nur bei wenigen Beiträgen ausprobiert. Denn manuell den Html-Code in den Beitrag zu schreiben ist weder komfortabel noch zukunftssicher, will man später das Ganze abändern oder automatisieren. Genau darum geht es nämlich: Das nl2p-Plugin soll einen Textblock mit einem abschließenden Enter mit dem kleinen p-tag umranden, einen mit mehr Entern endenden Textblock dagegen mit dem großen p-tag.
Eigentlich funktioniert das auch schon. Text ohne weitere Elemente wird fehlerfrei behandelt, Blockelemente wie Listen werden nicht angerührt. Für die Kommentare kann man das also schon jetzt nutzen. Der Rest hängt momentan scheinbar daran, dass in <blockquotes> auf die newlines ebenso reagiert werden soll wie im restlichen Beitrag. Das funktionierte in der Testumgebung, nicht aber im echten Betrieb auf dieser Installation mit ihren komplexeren Anwendungsfällen. Daran muss also noch gearbeitet, das Problem genauer untersucht werden.
Ein Nachteil des nl2p: Formatierungsplugins wie Markdown oder textile funktionieren in der Kombination damit nicht oder nur teilweise. Daher müsste so etwas simples wie das s9ymarkup-Plugin her, das sich um <p>s nicht schert, aber ein URL-Tag hat (insbesondere für die Kommentare notwendig). Ein erster Entwurf davon unter dem Arbeitsnamen liquid ist angehängt: kursiv und fett wie bei Markdown mit * bzw. **, einen Link erstellt man (im Grunde wie bei ubuntuusers) mit [Linkziel (Linktitel) Linkname].
Der Code insbesondere des nl2p-Plugins ist grob kommentiert und weitgehend ohne reguläre Ausdrücke. Wer einen Blick hineinwerfen will, im Idealfall um zu helfen, sei dazu ermutigt. Gerade weitere Vereinfachungen müssten mit etwas Distanz zu finden sein, vermute ich, ansonsten gilt es noch die erwähnten Probleme zu lösen. Schön ist der Code allerdings nicht wirklich, weil die Parserlogik nach der gewählten Methode dann doch etwas komplex geworden ist.
Download: