Skip to content

Generatoren für statische Websites

Ganz früher bestand eine Homepage, bestanden Webseiten allgemein im wesentlichen aus HTML-Dokumenten. Auf dem Weg zum Web 2.0 kamen zunächst CGI-Scripts für bestimmte Anwendungen auf; insbesondere aber mit der Verbreitung von PHP wurden Webseiten deutlich interaktiver. Blogs, Gästebücher, Kontaktformulare wären anders auch kaum vorstellbar. Nicht immer aber ist Interaktivität wirklich erforderlich. Manche eigentlich statische Seite wird nur deshalb dynamisch via PHP - oder auf vergleichbare Weise - erzeugt, weil es so bequem ist, die Erstellung einer Navigation und der Grundstruktur der Seiten zu automatisieren und Änderungen nur an einer Stelle vornehmen zu müssen. Das kann durch Installation eines CMS - oder eines dafür “zweckentfremdeten” Blogs oder Wikis - erfolgen; man kann auch wie ich schlicht die bisherigen HTML-Dokumente durch PHP-Scripts ersetzen, die im wesentlichen nichts anderes tun als vorgefertigte Funktionen für die Generierung des Seitengerüsts und der Navigation aufzurufen und ansonsten praktisch nur aus HTML bestehen. Meistens wäre es aber eigentlich gar nicht erforderlich, die Webseiten für jeden Aufruf neu zu generieren, weil sie sich nicht oder doch nur selten ändern. Ausreichend wäre es vielmehr, die Erstellung der an und für sich statischen Seiten aus Vorlagen - Templates - zu automatisieren und dabei ggf. auch automatisch die nötige Navigation zu erstellen.

Das leisten - in verschiedensten Variationen - static site generators, also Scripts oder Programmpakete, die man mit Schablonen (Templates) und Inhalten füttert und die daraus - ergänzt um eigene Programmschnipsel - die fertige Website erstellen. Vorteilhaft daran ist, dass die Webpräsenz im wesentlichen aus statischen HTML-Seiten bestehen kann, nur dort durch Scripts ergänzt, wo das auch tatsächlich für Interaktivität notwendig ist. Auf dem Webserver wird die Last deutlich verringert, weil nicht für jeden Seitenaufruf ein PHP-Interpreter gestartet werden muss; auch bestehen weniger Angriffsmöglichkeiten, weil kein ausführbarer Code mehr “live” auf dem Webserver laufen muss. Eine gewisse Interaktivität lässt sich auch durch tägliche, halbtägliche oder sogar stündliche Neuerzeugung der Webseiten erreichen; das macht für ein Forum oder auch ein Blog mit Kommentaren sicher wenig Sinn, aber wenn “nur” ein RSS-Feed oder die aktuellsten Tweets eingeblendet werden sollen, reicht das oft aus. Zudem lassen sich bspw. Kommentare auch durch externe Systeme wie Disqus vermittels Javascript einbinden.

Das Angebot an solchen Generatoren ist - wie bei Blogs, Wikis, CMS, Bugtrackern usw. - einigermaßen unüberschaubar geworden, wie man einer beliebigen Liste von Static Site Generators entnehmen kann. Gute Erfahrungen habe ich mit nanoc gemacht, mit dem auch der CCCS seine Website generiert; Jekyll wird bspw. bei GitHub genutzt, um dort Webseiten - direkt aus Git heraus - zu generieren. Der einzige Nachteil bei beiden ist ggf., dass sie in Ruby geschrieben sind und daher eigene Scripts und Erweiterungen sinnvollerweise ebenfalls in dieser Sprache zu halten sind. :-)

Das Grundprinzip ist bei allen Generatoren immer dasselbe: Es wird ein Grundgerüst für die Seiten in Form eines oder mehrerer Templates aufgebaut, gerne in HTML 5 und “responsive”, die dabei Platzhalter oder sogar entsprechend fortgeschrittenere Funktionen enthalten. Das Design erfolgt über CSS, wobei auch CSS-Präprozessoren wie LESS oder SASS zur Anwendung kommen können. Die einzelnen Webseiten schließlich können als HTML-Dokumente, aber besser noch in einfacheren Auszeichnungssprachen wie MarkDown, Textile, Asciidoc usw. angelegt werden. Dann gibt es in der Regel noch eine Konfigurationsdatei, aus der sich ergibt, wie die einzelnen Bausteine - Templates, CSS, Seiteninhalte - “bearbeitet” und zusammengefügt werden sollen. Aus diesen Anweisungen und Bausteinen generiert der Site Generator dann statische HTML-Dokumente (oder auch PHP-Scripts, oder Dokumente, die Javascript enthalten, oder …). In der Regel sind dabei eine Vielzahl von Filtern zur Interpretation von Markdown, LESS und Co. bereits enthalten; die eigenen Seiten und Designs lassen sich daher quasi aus einem Baukasten zusammensetzen, zumal als Basis für das Grundgerüst der Seiten auf Systeme wie Bootstrap oder HTML5 Boilerplate zurückgegriffen werden kann, die eigene Schriftarten, Icons und/oder Javascript direkt mitbringen oder zumindest entsprechende Anregungen enthalten. Mit verhältnismäßig wenig Aufwand lassen sich so die eigenen Inhalte hübsch, technisch modern und auf den verschiedensten Geräten vom Smartphone über das Tablet bis zum Laptop oder großen Desktopbildschirm ansehnlich darstellen.

Wenn man möchte, kann man auch die Quelldokumente in einem Versionsverwaltungssystem wie Git verwalten und bei jeder Änderung daraus automatisch eine neue Version der Webseiten erzeugen. Auf diese Weise ist ein Blogbeitrag, aber auch eine neue Seite der eigenen Homepage schnell in Markdown geschrieben, mit einem Vorspann - mit den notwendigen Informationen wie Titel, Autor, Erstellungsdatum, Typ pp., bspw. in YAML - versehen und im Git-Repository gespeichert; daraus erzeugt dann der Generator automatisch die neue Seite und passt - gleichfalls automatisch - alle davon betroffenen anderen Seiten (Inhaltsverzeichnis/Sitemap, Navigation, RSS-Feed, …) an und erzeugt sie, soweit nötig, neu.

Ich finde das sehr praktisch für alle Anwendungsfälle, die keine “Webapplikation” darstellen, sondern im wesentlichen statische Inhalte enthalten, die sich nicht minütlich oder stündlich, sondern eher täglich, wöchentlich oder auch nur alle Jubeljahre einmal ändern. Durchaus lässt sich aber auch ein Blog so betreiben, wenn man denn die interaktiven Elemente wie Kommentare pp. “outsourced”, bspw. an Anbieter wie Disqus. Mit ausreichend Zeit - ja, genau da liegt der Knackpunkt … :-) - plane ich, zumindest einige der von mir betreuten Webseiten in der Zukunft entsprechend umzustellen.

MarkdownPad

Über Markdown habe ich in diesem Blog schon mehrfach geschrieben. Ich nutze diese simple Auszeichnungssprache nicht nur für meine Blogbeiträge, sondern auch für FAQs, die sowohl als einfacher Text - bspw. für Postings im Usenet - als auch als HTML - bspw. im Web - veröffentlicht werden sollen, als Quelle für daraus generierte Webseiten oder bei Anbietern, die gleichfalls auf diese Auszeichnungssprache setzen, wie bspw. Github.

Bislang habe ich Markdown in meinem Standardeditor Sublime Edit 2 verfasst (oder ggf. in Notetab Pro), schließlich handelt es sich letztlich um einfachen Klartext, und den Text dann veröffentlicht und notfalls einmal nachbearbeitet. Wenn ich einmal wirklich eine Vorschau sehen wollte, habe ich einen der im Web vorhandenen Online-Konverter wie Markdown Live Preview benutzt, bei dem man links in ein Fenster seinen Text einfügen kann und der rechts daneben dann live die Umsetzung in HTML darstellt. Wenn man allerdings mit einer langsamen Internetanbindung irgendwo an der Küste sitzt - oder gar offline arbeiten möchte -, ist das kein optimaler Workflow. :-)

Daher bin ich jetzt - nach kurzer Suche über Google - auf den Markdown-Editor MarkdownPad 2 gestoßen, der einem im Prinzip das, was Markdown Live Preview online kann, offline bietet: links der Text in Markdown, rechts daneben das gerenderte HTML. Außerdem gibt es die bereits sattsam aus Web-Editoren wie in Wikis oder Blogs bekannten Buttons, mit denen man das entsprechende Markup generieren kann - eigentlich nicht nötig, weil das schöne an Markdown ja gerade ist, dass man es ganz natürlich tippen kann, aber mal ganz praktisch, wenn man nach einer Schaffenspause mal wieder ein spezielleres Markup vergessen hat und sich den Ausflug zu einer Syntaxübersicht sparen möchte. Außerdem kann man auf einfache Weise das generierte HTML direkt exportieren, wenn man das möchte.

MarkdownPad ist kostenlos; die 15 Dollar teure “Professional”-Version beherrscht u.a. Tabellen in Markdown Extra und den Export in ein PDF. Ich finde das sehr praktisch und werde dieses Tool zukünftig für meine Markdown-Texte verwenden.

Druckertreiber für HP LaserJet 1015 unter Win7/Win8

Mir leistet seit Jahren ein kleiner, aber durchaus feiner HP LaserJet 1015 als Drucker gute Dienste. Er belegt recht wenig Platz, der Papiervorrat ist ausreichend, und man kann auch mal 100 Seiten am Stück drucken - für die heutigen Zwecke, bei denen ab und an mal ein Brief, eine Checkliste, ein Kalender oder ein Kartenausschnitt, vielleicht auch einmal ein Manuskript oder eine Reihe Handouts gedruckt werden sollen, ist das (auch von der Druckgeschwindigkeit) völlig ausreichend und mir - für Schwarzweißdruck - aus mehrerlei Gründen lieber als ein Tintenstrahldrucker, der in Gestalt eines HP OfficeJet Pro 8600 Anfang letzten Jahres auch hier eingezogen ist. Wenn doch einmal größere Druckmengen erforderlich sind, gibt es in der Regel im Büro eine Möglichkeit dafür, oder - oft sogar billiger - im Copyshop.

Problematisch ist aber die Treiberversorgung für neuere Windowsversionen. Für Windows 7 gab es - so weit ich weiß - gar keinen offiziellen Treiber, und die Treiber für Windows 8 und Windows 8.1 sind nur für den Anschluss via USB direkt am entsprechenden Rechner geeignet. Das hilft mir nicht, weil der Drucker am Linuxrechner hängt und von dort via CUPS als Netzwerkdrucker bereitgestellt wird …

Jedesmal also, wenn hier ein neuer Rechner einzieht, stehe ich neu vor dem Problem, einen Druckertreiber für den LaserJet zu installieren, und jedesmal habe ich vergessen, wie ich beim letzten Mal zu einer Lösung gekommen bin - ich erinnere mich nur daran, dass das Stunden gekostet hat, und das tut es dann auch erneut. Und jedesmal ärgere ich mich, dass ich meine Lösung dann nicht hinterher dokumentiert habe.

Daher nun dieser Blogeintrag, in dem für die Nachwelt (und vor allem für meinen nächsten Rechner!) festgehalten sei:

  • Eine Lösung ist die Installation eines anderen Druckertreibers, bspw. für einen LaserJet 3055 - es muss dann aber der PCL-Treiber sein, und das funktioniert nur unter Windows 7 mit PCL 5, nicht aber unter Windows 8 mit PCL 6; PCL-5-Treiber gibt es da nicht mehr.

  • Eine andere Lösung ist es, schlicht einen älteren Treiber auf der Webseite von HP herunterzuladen. Der “host based”-Treiber für Windows Vista funktioniert hier (zwar mit etwas Verzögerung vor dem ersten Ausdruck, ansonsten aber) beanstandungsfrei.

  • Ich habe das Gefühl, bei meinem vorletzten Rechner hätte ich noch eine andere Lösung - offenkundig auch mit einem älteren Treiber - gefunden, aber wenn das so ist, dann erinnere ich mich daran nicht mehr …

Falls zufällig jemand eine noch bessere oder anderweitig konstruktive Idee hat, bin ich im übrigen natürlich ganz Ohr!

Congstar Prepaid

Ich hatte bereits vor einiger Zeit geschildert, dass ich für den drahtlosen Netzzugang im Urlaub und auf Reisen auf einen Huawei E5331 setze, in dem eine Prepaid-Karte von Congstar mit einer aktivierten Tagesflat werkelt. Ganz richtig war mein Bericht jedenfalls zur Tagesflat aber nicht; deren Limit von 200 MB monatlich gilt nämlich nur für Vertragskarten. Bei Prepaid-Karten gibt es stattdessen für die Tagesflat ein tägliches (!) Limit von 25 MB, das ziemlich schnell aufgebraucht ist, worauf dann die Geschwindigkeit auf die üblichen 64 kb/s gedrosselt wird. Dafür ist es - zumindest neuerdings - möglich, jederzeit für weitere 99 Cent ein neues Paket mit 25 MB ungedrosseltem Datenverkehr (gültig für 24 Zeitstunden ab Abruf) zu buchen und sich auch das bereits verbrauchte Volumen anzeigen zu lassen, indem man nämlich einfach - über die entsprechende Datenverbindung - die Webseite datapass.de aufruft. Die zeigt das noch vorhandene und das verbrauchte Volumen an und bietet die Möglichkeit, mit einem Klick Volumen beliebig oft nachzubuchen. Sehr praktisch, wenn man unterwegs “nur mal eben” etwas erledigen will, kein Monatspaket für fünf, zehn oder mehr Euro buchen möchte und das knappe Inklusiv-Volumen von 25 MB nicht ganz ausreicht.

Hat man allerdings - vorhersehbar - etwas größeres vor, bspw. in einem längeren Urlaub, bei dem man bei schlechtem Wetter auch mal arbeiten und surfen möchte (und mit automatisierten Downloads bspw. von Android-Geräten im WLAN leben muss, wenn man vergisst, eben diesen zu deaktivieren), sollte man rechtzeitig (!) vorher statt der Tagesflat eines der größeren Pakete buchen. Die Kündigung der Tagesflat erfolgt nämlich zum Ablauf des Folgetages - und so lange die Tagesflat noch aktiv ist, kann kein anderes Surf-Paket mit Datenvolumen gebucht werden. Auch die Buchung erfolgt dann nicht instantan, sondern braucht etwas Zeit, bis die Bestätigung vorliegt.

Ist die Buchung allerdings gelungen, stehen - je nach Paket - 200 MB, 500 MB, 1 GB oder 3 GB für den mit Buchung beginnenden 30tägigen Abrechnungszeitraum zur Verfügung, und auch hier können beliebig oft für jeweils 5,- € Datenpakete von 200 MB (in den beiden kleineren Paketen) bzw. 500 MB (in den beiden größeren Paketen) auf dem bereits genannten Weg - oder auch per SMS - nachgebucht werden.

Serendipity 2.0-beta3

Rund drei Monate nach dem Release der Beta-Version von Serendipity 2.0 haben sich etliche kleinere und größere Verbesserungen und Fehlerbehebungen angesammelt, so dass die Zeit reif war für eine dritte Beta-Version, die ich mittlerweile - nach einem Probelauf im Testblog und der obligatorischen Sicherheitskopie - auch hier auf Netz - Rettung - Recht einsetze.

Ich bin sehr zufrieden: alles ist noch runder, funktionaler, praktischer geworden, und die in meinem letzten Beitrag aufgezählten kleineren Haken und Ösen sind wohl auch allesamt verschwunden.

Leider war ich in den letzten zwei Monaten nicht mehr in der Lage, täglich die Diskussionen im Forum und den Issue Tracker weiterzuverfolgen oder mich gar selbst einzubringen - man hat es wohl auch an der erneuten relativen Stille hier im Blog bemerkt -, aber ich habe den Eindruck, dass Serendipity 2.0 auf einem sehr guten Weg ist.

Late adopter - bleich wie Papier

Offenkundig gehöre ich nicht (mehr?) zu den Menschen, die allzeit das neueste technische Gadget als allererster haben müssen - im Gegenteil.

Dauerte es schon bei dem Thema Smartphone ungewöhnlich lange, nämlich bis ins Frühjahr 2010, bis ich mich für ein solches erwärmen könnte (obwohl ich schon anderthalb Jahre vorher neidisch beobachtete, wie praktisch so eine Bedienoberfläche mit Touchscreen ist, während ich neben einem Skelett im Wald hockte … - aber das ist eine andere Geschichte), ist der Funke auch bei dem Thema “E-Book-Reader” bisher nicht so recht übergesprungen. Meine Frau nennt schon lange einen Kindle ihr eigen, von Kollegen habe ich mir bereits vor zwei Jahren die Vor- und Nachteile der verschiedenen Modelle erläutern lassen - dennoch konnte ich mich bislang nicht dafür erwärmen, ein gedrucktes Buch gegen ein elektronisches Gerät einzutauschen, obwohl ich schon mehrfach darüber nachgedacht hatte.

Den Anlass zum erneuten Überdenken bot jetzt die Tatsache, dass die beiden letzten Bücher von Karen Rose, die ich noch nicht gelesen hatte, nur als E-Books erschienen sind. Kurzentschlossen habe ich daher Mitte Juli einen Kindle Paperwhite geordert … und bin, mal wieder, durchaus zufrieden. Gerade die Art Bücher, die ich nach dem Lesen ohnehin wieder über BookMooch oder ähnliche Dienste vertauschen würde, kann ich sehr gut auch nur in elektronischer Form lesen. Außerdem hat so ein Gerät echte Vorteile, wenn man im ÖPNV unterwegs ist oder Pausen von 15-45 Minuten außerhalb des Büros zu füllen hat, so dass die Rückfahrt nicht lohnt.

Offenbar macht das Gerät auch durchaus süchtig, oder es geht einfach nur so schnell, “mal eben” in ein Buch hineinzuschauen; jedenfalls habe ich in dem knappen Monat seither immerhin 19 (gut, zumeist kürzere) Bücher rein elektronisch gelesen. Bemerkenswert.

Mobiles Internet - reloaded

Schon vor gut fünf Jahren hatte ich über meine guten Erfahrungen mit einer UMTS-Mobilfunkkarte von Novatel für meinen Laptop berichtet; und diese Karte tut auch noch in meinem aktuellen Laptop unter Windows 7 gute Dienste, denn dessen eingebautes UTMS-Modul hat mich sehr enttäuscht und ist für mich nicht brauchbar.

Inzwischen hat sich die Welt aber natürlich fortentwickelt; und wiederum wurde ich durch Berichte in Blogs auf UMTS-WLAN-Router (wie ich sie bezeichnen möchte - Geräte, die einerseits als WLAN-Accesspoint arbeiten und sich andererseits über eine UMTS-SIM-Karte mit dem Mobilfunknetz verbinden und so für alle Geräte im WLAN eine Internetverbindung bereitstellen) neugierig. Das ist natürlich noch besser, als nur den Laptop selbst online zu bringen, zumal, wenn die UMTS-Abdeckung am Standort des Laptops schlechter ist als anderswo in der (Ferien-)Wohnung.

Also habe ich mir im Juli vergangenen Jahres vor dem Urlaub einen Huawei E5331 zugelegt, der sich bewährt hat und mit dem ich seitdem sehr zufrieden bin.

Mobilfunk-Datentarife

Ein Mobiltelefon nutze ich - für Telefonie und SMS - seit gut 20 Jahren. Seitdem hat sich vieles geändert, nicht zuletzt an den Tarifen. Lange Zeit war ich Vertragskunde - seit 2000 bei Vodafone - und hatte mir irgendwelche Pakete aufschwatzen lassen, für die ich dann im Monat bis zu 30,- € bezahlt habe (ohne Datenoption, wohlgemerkt!), obwohl ich Wenigtelefonierer bin und das Mobiltelefon v.a. benötige, wenn (und weil) ich erreichbar sein muss und - wenn wirklich nötig - kurze (!) Telefonate zu führen. Vor rund 7 Jahren wurde mir das alles zuviel, und ich bin in einen Prepadi-Tarif gewechselt. Seitdem lade ich im Monat - für Telefonie und SMS - in der Regel weniger als 15,- € auf, und ich vermute, dass der Löwenanteil dieser Kosten auf dienstliche Gespräche entfällt (die ich meinem Arbeitgeber bislang großzügigerweise schenke).

Vor gut 10 Jahren war ich einmal einige Jahre täglicher Fernpendler und habe zudem erstmals einen Laptop genutzt; klar, dass ich irgendwann einmal mein Telefon damit via Kabel oder Bluetooth gekoppelt und dann (per GPRS) Mail und News von unterwegs gecheckt (und teilweise auch gechattet) habe. Auch klar, dass ich - bei zeit- oder volumenbezogener Abrechnung! - einige Zeit lang meine monatlichen Rechnungen dank Kostenexplosion quasi mit einem roten Schleifchen zugeschickt bekam; es fehlte eigentlich nur noch ein Dankesbrief des Vorstands für die Sanierung des Unternehmens. Später bin ich dann sinnvollerweise auf eine entsprechende Karte umgestiegen und habe vor allem einen günstig(er)en Anbieter genutzt. Insbesondere als ich dann vor vier Jahren als “late adopter” mein erstes Smartphone mein Eigen nennen durfte, stellte sich die aber auch die Frage nach einem brauchbaren “Flatrate”-Angebot (bzw. einem Volumentarif mit Freivolumen und nachfolgender Drosselung bei Überschreitung).

"Mobilfunk-Datentarife" vollständig lesen

Kommentare des Blogautors hervorheben

In anderen Blogs fand ich es immer ganz schön, wenn Kommentare des ursprünglichen Autors - des Blogeintrags - optisch hervorgehoben werden. Wer das gleichfalls schick findet, kann das auch mit Serendipity umsetzen.

Voraussetzung ist, dass im verwendeten Theme (oder Template) zum einen entsprechender Smarty-Code vorhanden ist, der auf die Übereinstimmung von “Kommentarautor” und “Blogautor” prüft, und es zum anderen dort entsprechende CSS-Definitionen gibt, die dann zu einer Hervorhebung führen. Ersteres ist im neuen Standardtheme “2k11” der Fall, letzteres nicht.

Wenn die Überprüfung ergibt, dass der Kommentar vom Autor des Beitrags selbst stammt, bekommt der entsprechende <article>-Abschnitt die Klasse serendipity_comment_author_self zugewiesen. Für diese Klasse sind also entsprechende Definitionen vorzunehmen, die dann zu einer optischen Hervorhebung führen. Dazu erstellt - oder ergänzt - man eine entsprechende Datei namens user.css im Verzeichnis des Themes (templates/2k11) entsprechend (deren Nutzung freilich in der Konfiguration des Themes aktiviert sein muss), bspw. so wie hier in diesem Blog:

  1. .serendipity_comment_author_self {
  2.         background: #ff9;
  3.         padding: 0.5em;
  4.         border-radius: 0.75em;
  5. }

Die Überprüfung erfolgt standardmäßig auf Identität der jeweils angegebenen Namen von Kommentar- und Eintragsautor, nicht über die Identität der E-Mail-Adresse. Das lässt sich natürlich ändern, bspw. in der Datei comments_by_author.tpl im Theme-Verzeichnis (templates/2k11). Bei einer Überprüfung auf Identität der E-Mail-Adresse wäre aber zu prüfen, ob nicht etwa ein Spamschutz-Plugin die Ausgabe der E-Mail-Adressen unterdrückt; falls doch, stehen die entsprechenden Daten für Smarty nicht zur Verfügung. Nachdem zumindest in 2k11 ohnehin über das Template selbst die Ausgabe der Mailadressen unterbunden wird, kann man die entsprechende Spamschutz-Konfiguration aber auch getrost deaktivieren.

Im Serendipity-Forum finden sich zu den näheren Einzelheiten u.a. folgende Threads:

Beachten sollte man im übrigen, dass natürlich letztlich jedermann Namen und E-Mail-Adresse des Blogautors für Kommentare verwenden kann …

Dokuwiki als "Multisite"-Installation

DokuWiki ist für mich derzeit und schon länger die generische Antwort auf die Frage nach einem Wiki, nicht nur für Dokumentationszwecke, und auch für die Frage nach einem (simplen) CMS.

Ich installiere DokuWiki dabei (wie die meisten Webapplikationen) nicht als Debian-Paket, sondern direkt vom Erzeuger; zum einen, weil ich gerne eine aktuelle Version habe, zum anderen, weil ich dann (wie bei anderen Webseiten) frei entscheiden kann, wo die Dateien liegen sollen - und das ist in der Regel nicht dort, wo Debian sie ablegen würde, insbesondere, wenn es mehr als einen Nutzer mit Webseiten geben soll - und nicht zuletzt, weil das trivial funktioniert. Das führt dazu, dass ich Updates von Hand durchführen muss, und das kann dann schon etwas nervig werden, wenn es mehrere Hosts und mehrere Wikis betrifft.

Daher überlege ich schon länger, wie ich - zumindest bei Installationen auf demselben Host - den Aufwand (und, natürlich, auch den Platzverbrauch) minimieren kann. Die offenkundige Lösung ist eine “Farm”- oder “Multisite”-Installation, bei der der Code nur einmal vorhanden ist, aber jedes Wiki seine eigenen Konfiguration und natürlich seinen eigenen Speicherplatz für Inhalte hat. DokuWiki unterstützt das prinzipiell, aber die nächste Frage ist ja immer, wie gut das auch tatsächlich funktioniert: stabil, flexibel und vor allem ohne krude Hacks.

Nachdem ich mich diese Woche damit beschäftigt habe, kann ich sagen: es funktioniert gut. Die Flexibilität bleibt erhalten, Hacks braucht man nicht, weil die aktuellen DokuWiki-Versionen eine “Multisite”-Installation unterstützen, und stabil wirkt es bisher auch.

Der offensichtliche Vorteil liegt darin, dass man für beliebig viele Wikis nur einmal den Code für das Wiki selbst - und den für Plugins und Templates - installieren, updaten und pflegen muss. Der offensichtliche Nachteil liegt darin, dass alle Plugins und Templates im “Master”-Wiki installiert werden müssen und in den einzelnen Wikis nicht nachinstalliert werden können, und dass sich alle Wikis in Unterverzeichnissen unter einem “Stammverzeichnis” befinden müssen, deren Namen identisch mit der URL des Wikis sind.

"Dokuwiki als "Multisite"-Installation" vollständig lesen

Blogs und Editoren

Wer ein Blog betreibt, kennt vermutlich die Frage danach, welcher Editor für die Einträge am sinnvollsten verwendet werden sollte.

Meine erste Blogengine, sunlog, bot meiner Erinnerung nach bloß ein Eingabefeld, in das man entweder HTML eingeben oder darauf setzen konnte, dass der ansonsten nicht weiter bearbeitete Text schon irgendwie ausgegeben werden würde.

Nach dem Umstieg auf Serendipity habe ich auch erst einmal den Standard-Editor verwendet, wozu braucht man schließlich WYSIWYG, wenn man HTML beherrscht? Das war auf die Dauer dann aber doch eher anstrengend: um jeden Absatz herum <p>...</p> schreiben, Hervorhebungen korrekt mit <strong>...</strong> einbauen, Links von Hand setzen … Das macht keinen wirklichen Spaß. Und der Einbau von Bildern ist von Hand auch eher eine Strafe als ein Vergnügen.

Also bin ich später auf den WYSIWYG-Editor von Serendipity gewechselt; ich glaube, ich habe sogar nacheinander verschiedene solche benutzt. So richtig zufrieden war ich damit aber auch nicht; das daraus generierte HTML erschien teilweise suboptimal, zwischendurch hatte das Gerät aufgrund irgendeiner (vermutlich von mir irrtümlich getroffenen) Einstellung die Neigung, alle Texte per <font>-Tag mit weißem Hintergrund zu hinterlegen und Spielereien dieser Art mehr. Außerdem war es so mit nicht unerheblichem Aufwand verbunden, Einträge in einem Texteditor vorzubereiten und später per copy & paste ins Blog zu übernehmen, bedurfte es dann doch eines zweiten Schrittes, in dem Formatierungen und Links hinzugefügt wurden, wie auch lx4r in einem vergleichbaren Blogbeitrag berichtet. Wenn ich stattdessen direkt im Editor schrieb, ereilte mich gerne ein Missgeschick wie “langen Blogeintrag geschrieben, abgeschickt, mittlerweile aber ausgeloggt” (worauf Serendipity den Beitrag üblicherweise hungrig verspeist und man ihn neu schreiben darf) oder, noch schlimmer, ich komme an eine Tastenkombination, die eine Browseraktion auslöst und dann den Browser den Text verschlucken lässt. Gut, dagegen hilft Lazarus, aber der wahre Jakob ist das trotzdem nicht, ganz abgesehen davon, dass man eben so nicht sinnvoll offline arbeiten (oder auch nur die Annehmlichkeiten eines guten Texteditors nutzen) kann.

Mit dem Relaunch des Blogs habe ich auch dafür eine Lösung gefunden: ich verwende den simplen Standardeditor von Serenditpity zusammen mit dem Markdown-Plugin. Wieder eine für mich sehr hilfreiche Anwendung von Markdown. Jetzt kann ich flüssig Texte schreiben, sie ggf. per copy & paste ins Blog übernehmen und muss mich nie wieder um seltsame Formatierungen kümmern. Passt. Das ist ein Workflow, der Spaß macht.

(Um zu verhindern, dass ältere Einträge durch das Markdown-Plugin zerhackt werden, kann man dieses Plugin für die älteren Einträge - jeweils einzeln pro Eintrag - deaktivieren. Jedenfalls dann, wenn man das Plugin “erweiterte Eigenschaften für Artikel” [serendipity_event_entryproperties] installiert hat. :-))

Geldsenke Amazon

Amazon habe ich als Buchladen kennengelernt, und früher habe ich dort auch (nur) Bücher gekauft. Dann ab und an auch mal Software, v.a. Spiele. Und DVDs. Und später dann Elektronikzeugs, und mittlerweile fast alles.

Das hat natürlich Folgen.

Wer das ungute Gefühl, dass Amazon für einen wesentlichen Teil des Ausgabenbudgets verantwortlich ist, einmal näher quantifizieren möchte, dem kann mit damazon.py geholfen werden.

(Wem - wie mir - pip install requests beautifulsoup4 nichts sagt, außer der Vermutung, dass es sich um entsprechende Bibliotheken handelt, die zunächst installiert werden müssen, dem hilft - wenn er nicht noch einen weiteren Paketmanager zusätzlich zu apt bzw. aptitude (Debian), cpan (Perl), gem (Ruby) und Co. auf dem System begrüßen möchte - unter Debian Wheezy auch die Eingabe von aptitude install python-requests python-bs4 weiter.)

Via @towo.

Markdown: HTML aus Text erzeugen

Der erste längere (Erläuterungs-)Text, den ich zur Veröffentlichung im Netz verfasst habe, war im September 1998 die Header-FAQ, deren erster Entwurf am 18.09.1998 in der Newsgroup de.admin.net-abuse.mail veröffentlicht wurde und die dann seit dem 15.10.1998 unter dem Titel “E-Mail-Header lesen und verstehen” dort über viele Jahre lang monatlich erschien.

Text- und HTML-Version

Natürlich sollte es zu der monatlich geposteten FAQ auch eine Web-Version geben, die bereits im Oktober entstanden war und deren URL im November 1998 das erste Mal in der FAQ genannt wurde. Und natürlich sollte diese Version auch mit allem Annehmlichkeiten, die HTML für Optik und Funktion bietet, also namentlich Formatierungen und Verlinkungen, ausgestattet sein. Das bedeutete dann umgekehrt aber auch, dass zwei völlig getrennte Versionen desselben Textes zu pflegen waren; insbesondere bei größeren Änderungen und Ergänzung keine wirklich gute Idee. Es musste also eine andere Lösung her: die eine Fassung sollte aus der anderen Fassung generiert werden, oder ggf. beide Fassungen aus demselben Rohtext.

HTML-Dokumente aus Textdokumenten erzeugen

Da mir das Usenet als Publikationsmedium (damals) deutlich näher lag, hatte ich zuerst den Gedanken, die Webseite - also das HTML-Dokument - zumindest im wesentlichen aus dem Textdokument der geposteten FAQ zu erzeugen. Bei entsprechenden Recherchen stieß ich dann auch auf das Tool AscToHTM, das genau diesem Zweck diente und sich auch insbesondere an FAQ-Autoren richtete. Eine Zeit lang habe ich damit auch gearbeitet (und das erzeuge HTML-Dokument dann quasi mit Header und Footer versehen, um es optisch und organisatorisch - Navigation! - in meine damalige Webseitenstruktur einzubinden), aber so wirklich überzeugend war das nicht. Es bedurfte einiger Kompromisse im Layout des geposteten Textes, um die HTML-Generierung überzeugend hinzubekommen, und der Aufwand war doch vergleichsweise groß.

Textdokumente aus HTML-Dokumenten erzeugen

Daher habe ich mich - theoretisch im übrigen völlig richtig - in der Folge davon überzeugen lassen, dass die Vorgehensweise, aus (letztlich) unstrukturiertem Text strukturierten Text (mit Markup) zu erzeugen, bereits gedanklich verfehlt ist und keinen dauerhaften Erfolg haben könne: HTML enthält gegenüber text/plain zusätzlichen Informationsgehalt, Struktur, Markup eben, und aus der Gestaltung des Rohtextes das Markup zu “erraten”, ist keine brauchbare Lösung. Daher bin ich danach dann eben den umgekehrten Weg gegangen und habe beschlossen, dass nunmehr die Webversion der FAQ das “Master-Dokument” (oder die Quelle) sein sollte und ich den geposteten Text daraus erzeuge. Information und optische Gestaltung zu kürzen sollte ja vergleichsweise trivial sein. — Ganz so war es dann erwartungsgemäß doch nicht, denn auch der gepostete “reine” Text sollte ja einigermaßen apart formatiert sein, mit dem was, man an “Formatierungen” in E-Mail und Usenet so gewohnt ist: Zitate eingeleitet mit “|” am Zeilenfang, Hervorhebungen und Betonungen durch *Sternchen* o.ä. und dieser Dinge mehr. Für den Anfang half dazu html2text, damals in C++ geschrieben, mittlerweile durch den verstorbenen Aaron Swartz auch in PYthon reimplementiert, aber ganz zufrieden war ich mit dem Output noch nicht.

Einiges Experimentieren führte dann zu dem folgenden Workflow:

  1. wget http://th-h.de/faq/$1 -O output.html
  2. html2text -nobs -width 70 -rcfile html2text.rc output.html > output.txt
  3. ./wrap.pl < output.txt > wrapped.txt

Und wrap.pl, das (daher der Name) vor allem für den Umbruch auf 70 Zeichen pro Zeile unter Beachtung von (nicht zu umbrechenden Zitaten) zuständig war, sah folgendermaßen aus:

  1. #!/usr/bin/perl
  2.  
  3. use Text::Wrap qw(&wrap $columns);
  4. $columns = 70;
  5.  
  6. while (<>) {
  7.  if (/[-\/]$/) {
  8.   ($zeile, $rest) = /(.+\s)(\S+)$/;
  9.   print "$zeile\n";
  10.   JOINLOOP: while (<>) {
  11.    $rest .= $_;
  12.    last JOINLOOP if (/^$/);
  13.   }
  14.   $rest =~ s/\n/ /g;
  15.   $_ = wrap(, , $rest)."\n";
  16.  };
  17. print $_;
  18.  if (/^[|>:]/) {
  19.   QUOTELOOP: while (<>) {
  20.    chomp;
  21.    if (/^$/) {
  22.     print "\n";
  23.     last QUOTELOOP;
  24.    } elsif (/^[|>:]/) {
  25.     print "\n$_";
  26.    } else {
  27.     print $_;
  28.    }
  29.   };
  30.  };
  31.  print "\n";
  32. };

Das ließ sich jetzt durchaus automatisieren; andererseits gefiel es mir nicht wirklich, dass die Quelle des Textes nun ein HTML-Dokument war und ich erst längere Konversionsprozesse laufen lassen musste, um zu überprüfen, ob auch die (aus meiner Sicht immer noch primäre) Textfassung ordentlich aussah. Und HTML schreiben ist auch deutlich aufwendiger als “Klartext”, selbst wenn man sich durch geeignete Editoren beim Einfügen der passenden Tags (und deren Schließen!) unterstützen lässt.

Die Lösung?

Am Ende habe ich, glaube ich, einfach wieder beide Texte getrennt gepflegt oder, wahrscheinlicher, die FAQ (erst einige Zeit nicht mehr richtig aktualisiert und dann) gar nicht mehr gepostet; sowohl das Spam-Problem (jedenfalls der Wunsch, Spam nachzuverfolgen und zu melden) als auch das Usenet waren dabei, in die Bedeutungslosigkeit abzurutschen.

"Markdown: HTML aus Text erzeugen" vollständig lesen

Serendipity, Spartacus und Dateirechte

Wie ich schon im Eintrag “Serendipity 2.0-beta” dokumentiert habe, hatte ich anfangs mit meiner Serendipity-Installation das Problem, das alle (über Spartacus) heruntergeladenen Plugins falsche Dateirechte hatten, die Verzeichnisse nämlich 0700 und die Dateien allesamt 0600. Das hatte zur Folge, dass der Webserver auf die Dateien und Verzeichnisse nicht zugreifen und u.a. Grafiken nicht anzeigen konnte, und auch sonst die Funktion der Plugins eingeschränkt war. Stattdessen müssten richtigerweise Rechte von 0755 und 0644 (oder zumindest 0705 und 0604) gesetzt werden.

Nachträglich beheben lässt sich das - im Verzeichnis plugins - ganz einfach so:

  1. find . -type d -perm 700 -exec chmod 755 ’{}’ \;
  2. find . -type f -perm 600 -exec chmod 644 ’{}’ \;

Nachdem ich einen Bug reportet hatte, bekam ich sehr schnell den richtigen Hinweis, dass die Spartacus-Konfiguration entsprechende Einstellungsmöglichkeiten aufweist, was ich übersehen hatte. Im Plugin lassen sich daher die richtigen Rechte vorgeben, und dann funktioniert die Installation auch zukünftig direkt problemlos.

Die Ursache für die zu strikten Rechte war für mich dann nicht auf Anhieb zu finden; die umask des Systems stand nämlich erwartungsgemäß und korrekt auf 0022. Allerdings setzte suphp für PHP dann noch einmal eine eigene umask in /etc/suphp/suphp.conf, und dort steht tatsächlich 0077

Wer also vor demselben Problem steht, sollte an der einen oder der anderen Stelle entsprechend den Schraubenzieher ansetzen.

Keywords: serendipity s9y spartacus plugins apache php suphp permissions too strict wrong

Serendipity 2.0-beta

Mitte April 2014, gerade als ich überlegte - und im Usenet diskutierte -, ob ich für den Relaunch meines Blogs weiter auf Serendipity (s9y) setze oder zu Wordpress wechseln soll, erschien die erste Beta des lange entwickelten Serendipity 2.0, auf die mich zuerst Dirk in seinem Blog aufmerksam machte und über die man kurz danach dann auch in Nur ein Blog lesen konnte.

Also habe ich ein Testblog aufgesetzt und mir das mal angeschaut, und nachdem das ganz gut lief und alles sehr schick aussah für den Relaunch meines Blogs direkt auch auf die Beta-Version gesetzt.

Unter anderem YellowLed und onli haben sehr gute Arbeit geleistet: das Standard-Template 2k11 funktioniert gut und ist sehr schick, und auch die renovierte Backend-Oberfläche kann auf den ersten Blick bereits optisch, aber auch technisch-inhaltlich gefallen. Insgesamt ist bereits die Beta einen Blick wert, und so stabil, wie man das von Serendipity gewohnt ist.

Natürlich gibt es auch noch einige kleine Fehler, Haken und Ösen:

  • Die Vorschaubilder der Templates (jetzt: “Themes”) stecken in riesig großen Rahmen, die zu Scrollorgien führen, weil ein Vorschaubild übergroß ist (mittlerweile behoben).
  • Das Einfügen von Bildern als Thumbmail mit Link auf das große Bild funktioniert mit dem eingebauten Button irritierender Weise nur beim ersten Mal; danach wird kein Link mehr generiert (mittlerweile behoben).
  • Ab und an (konkret insbesondere: beim Filtern bzw. Durchsuchen von Einträgen nach ihrem Inhalt) führt ein Druck auf die Enter-Taste nicht zum erwarteten Ergebnis, sondern zum Aufruf einer ganze anderen Seite (mittlerweile behoben).
  • Kategorien können über die Admin-Oberfläche nicht mehr bearbeitet werden, weil dann eine Namenskollision auftritt (bereits behoben).
  • Das serendipityevententrycheck-Plugin versagt schweigend: wenn es eigentlich wegen leerer Titel o.ä. das Speichern verhindern müsste, bestätigt es zumindest bei Entwürfen das erfolgreiche Speichern, verwirft den Eintrag aber (es lebe das Lazarus-Plugin für Firefox!).
  • Der schöne neue Button “Veröffentlichen” im neuen Admin-Dashboard für Entwürfe funktioniert nicht; der Eintrag wird zwar auf “veröffentlicht” gesetzt, erscheint aber nicht im Blog (mittlerweile behoben).
  • Zumindest bei mir hatten alle Plugin-Verzeichnisse und -Dateien zu strikte Zugriffsrechte.
  • Mit HTTPS werden (aufgrund der Protokollangabe in den Links zu CSS- und Javascript-Dateien) Stilinformationen, Icon-Schriften und Javascript nicht korrekt eingebunden.

Das sind jedenfalls die Kleinigkeiten - oder auch Größerigkeiten -, über die ich bisher gestolpert bin, aber: es wird!

Ich habe heute abend dann mal noch Bugreports für alle noch nicht bekannten Probleme eingeworfen (statt des Forums hat Serendipity dankenswerterweise jetzt auch einen Bugtracker in Form von github Issues) und bin sicher, dass wir in einiger Zeit einen Release Candidate und dann eine großartige 2.0-Version von Serendipity haben werden!

Nachtrag vom 19.05.2014 und 22.05.2014:

Das HTTPS-Problem lässt sich dadurch lösen, dass man unter “Konfiguration” (Block “Einstellungen” im Backend) und dort dann im Panel “Pfade” die Option “HTTP-Hostnamen automatisch erkennen” auf “Ja” setzt. Es handelt sich also eher um eine Fehlkonfiguration als einen Fehler. :-)

Und die Einstellungen für die Dateirechte lassen sich im Spartacus-Plugin vorgeben (was ich auch hätte bemerken können). Mit passenden Werten (0644 für Dateien und 0755 für Verzeichnisse) dort funktioniert dann auch alles blendend. - Allerdings sollten leere Eingaben dort einen Fallback auf die umask nach sich ziehen, und die ist korrekt auf 0022 gesetzt. Ganz in Ordnung scheint mir das daher noch nicht zu sein. Allerdings nur die umask des Systems. In der /etc/suphp/suphp.conf ist hingegen standardmäßig, auch unter Debian, eine umask von 0077 gesetzt … was das Problem erklärt. Also kein Fehler in Serendipity, sondern nur etwas, woran man denken sollte.

Nachtrag vom 10.06.2014:

Die meisten gemeldeten Probleme - und noch einige kleinere Baustellen, die mir zwischendurch aufgefallen sind - sind mittlerweile im Entwicklungszweig 2.0 bereits behoben.

tweetbackcheck