Skip to content

Leistungsschutzrechtprotestplugin

Nachdem Ende letzter Woche das Leistungsschutzrecht für Presseverleger im Bundestag verabschiedet wurde, spülte meine Timeline das Wordpress-Plugin vom D64 Zentrum für Digitalen Fortschritt wieder in meine Aufmerksamkeit. Das Plugin lädt eine Blacklist aus dem Netz, in der die Domains von Verlagen gesammelt werden, die das LSR unterstützen. Mittels dieser Liste lenkt es Links zu den Verlagsseiten, die in Blogartikeln enthalten sind, auf eine Hinweisseite zum LSR um:

Coole Idee. Ein kurzer Blick auf GitHub sagte mir, dass es nicht schwer sein würde, das Plugin für Serendipity zu adaptieren. Gesagt, getan.

"Leistungsschutzrechtprotestplugin" vollständig lesen

RheinMainJS - Zweites Treffen

Logo RheinMainJSIst schon wieder zehn Tage her, aber der Vollständigkeit halber schreibe ich noch ein paar Zeilen zum zweiten Treffen der JavaScript-User Group RheinMainJS. Wir trafen uns in angenehmer Umgebung bei Seibert Media (im fünften Stock des Wiesbadener Luisenforums) - ohne Ortskenntnis nicht ganz einfach zu finden, weil das Luisenforum hauptsächlich ein Einkaufszentrum beherbergt.

Foto von Axel Jung

Knapp 25 Teilnehmer verfolgten mit Interesse die beiden Vorträge des Abends. Zunächst ließ uns Konstantin Filtschew an seinen - nicht immer positiven - Erfahrungen mit Appcelerator Titanium teilhaben und kam zu dem Ergebnis, dass bei komplexeren Anwendungen native Entwicklung unbestreitbare Vorteile hat. Im Anschluss stellte Christian Bäuerlein das Projekt Instantnavi vor, eine browserbasierte Turn-by-turn-Navigation auf JavaScript-Basis.

Es folgte, wie sollte es anders sein, der gemütliche Teil des Abends mit Diskussionen, Socializing und kühlen Getränken. Mir hat das Treffen sehr viel Spaß gemacht, vor allem weil wieder so viele JS-Entwickler teilgenommen und ihre Erfahrungen eingebracht haben. In Zukunft wollen wir unsere Treffen in etwa alle acht Wochen veranstalten, der nächste Termin wäre demnach Anfang Februar 2013 (ist noch nicht fix!). Aktuelle Informationen findet ihr auf unserer Google+-Seite.

Oder ihr werft einen Blick auf unsere neue RheinMainJS-Webseite, die ich auf Basis von node.js, Express und Foundation 3 kurz vor dem Treffen noch schnell erstellt habe. Die Domain dafür stellt freundlicherweise Sebastian Fastner zur Verfügung, gehostet ist die Seite bei Uberspace. Der Quellcode der Seite liegt übrigens auf GitHub, Contributions via Pull Request (Beispiel) sind sehr willkommen :-)

PS: Sollten wir eins der nächsten Treffen wieder bei Seibert Media ausrichten, seht euch unbedingt diese Wegbeschreibung an!

PHPUnit für die Entwicklung von Serendipity-Plugins

Geben wir es ruhig zu, der PHP-Code von Serendipity ist nicht mehr State of the Art, sondern zum großen Teil noch auf dem Stand von PHP 4. Dass dieser Code immer noch sehr zuverlässig funktioniert, und ob und wie mit dem aktuellen Stand umzugehen ist, soll hier nicht das Thema sein. Ich möchte hier auf die Entwicklung von Serendipity-Plugins eingehen, die nicht umsonst in einem eigenen Repository leben. Deren Qualität lässt sich mithilfe von Unit Tests sicherstellen.

PHPUnit für Plugins

Auch wenn die Grundfunktionalität von Serendipity durch Unit Tests abgedeckt ist: Die Plugin-Entwicklung ist bisher nicht so einfach zu testen. In meinen letzten Projekten waren Unit Tests mit PHPUnit ein zunehmend zentraler Bestandteil der Entwicklung. Entweder damit ich nachträglich sicherstellen konnte, dass Klassen und Methoden bei Veränderungen und Refactoring noch taten, was sie tun sollten; oder weil ich testgetrieben entwickelte, das heißt zuerst die Unit Tests und dann erst den zu testenden Code schrieb. Dieses Vorgehen möchte ich nicht mehr missen, und es hat mich gestört, dass es bei der Entwicklung von Serendipity-Plugins nicht ohne Weiteres möglich war.

Screenshot einer Konsole mit erfolgreich durchlaufenen Unit Tests

Daher habe ich mich hingesetzt und PHPUnit so in meine lokale Serendipity-Installation, die ich zum Entwickeln verwende, integriert, dass ich einzelne (Event-)Plugins separat testen kann. Die spezifischen Herausforderungen ließen sich recht schnell überwinden:

  • In Serendipity werden Plugins stark getrennt vom Core über Event-Hooks ausgeführt. Diese Hooks müssen natürlich einzeln getestet werden können.
  • Viele Variablen sind als global deklariert oder werden per Referenz "herumgereicht". Das erfordert einige Workarounds, die heute dank Dependency Injection und ähnlichen Entwurfsmustern zum Glück überflüssig sind.
  • Data Fixtures: Um Serendipity für die Tests "hochzufahren", wird eine Datenbankverbindung benötigt. Mir ist es bisher nicht gelungen, eine der unter Database Testing aufgeführten Methoden umzusetzen. Besser gesagt: Ich war einfach zu faul und habe die nötigen Daten in einer SQLite-Datenbank hinterlegt.
"PHPUnit für die Entwicklung von Serendipity-Plugins" vollständig lesen

RheinMain.JS - so war das erste Treffen

RheinMain.JS

Gestern Abend hat es stattgefunden: Das erste RheinMain.JS-Treffen in Wiesbaden. Ich schreibe hier schnell mal eine kurze Zusammenfassung auf.

Wir, d.h. ca. 16 Javascript-Interessierte, trafen uns bei Die Firma in Wiesbaden (noch einmal ein großes Danke!), die uns auch mit Beamer und Getränken versorgte. Nach kurzem Hallo-Sagen stiegen wir gleich voll ein mit Christoph Martens Vortrag über lycheeJS, die von ihm entwickelte Cross-Platform Javascript Game Library. Teilweise sehr advanced stuff, aber äußerst interessant zu sehen, was alles geht, wenn man sich in die Tiefen der Systeme hinabwagt. Wer sich für Spieleentwicklung interessiert, sollte sich die Lib auf jeden Fall genauer ansehen.

Im Anschluss sprach Sebastian Werner über Web Tooling und das von ihm initiierte Framework Jasy. Wer komplexere Webapplikationen mit vielen Abhängigkeiten erstellt, dürfte an Jasy Gefallen finden und sollte sich neben den Vortrags-Slides auch das Wiki ansehen, um ein Gefühl für die Möglichkeiten des Tools zu bekommen.

Ausklingen ließen wir das Treffen schließlich um die Ecke im Finale, wo bei Speis und Trank noch ausführlich Themen aus (nicht nur) der Javascript-Welt erörtert wurden. Alles in allem ein rundes erstes Treffen, dem hoffentlich noch viele weitere folgen werden. Mir hat's jedenfalls sehr viel Spaß gemacht!

Ich hatte ja am Anfang des Treffens noch einige offene Fragen zu Organisationskram für die User Group aufgelistet:

  • Vorträge: Bitte einfach bei Reto oder mir melden, falls ihr einen interessantes Thema in petto habt.
  • Orga: Falls ihr Lust habt, kommende Treffen mitzuorganisieren, sagt ebenfalls gern Bescheid :-)
  • Bleibt es beim Namen RheinMain.JS? Ich hatte den Eindruck, er kam recht gut an, und wir hätten dank Sebastian sogar schon den passenden Twitter-Account!
  • Bleiben wir in Wiesbaden? Vorerst wohl schon, die meisten Teilnehmer gestern kamen aus WI oder MZ.
  • Webseite und Logo? Sollten wir uns mittelfristig zulegen, eilt aber nicht. Christoph hat für die Webseite schon seine eventuelle Unterstützung angeboten, danke! Logo: Kann jemand von euch zeichnen? ;-)
  • "Externe" Kommunikation? Die Anmeldung via Google+ hat ganz ok funktioniert, also bleiben wir erstmal dabei und kündigen weiterhin dort an. Webseite, Twitter -> s.o.
  • "Interne" Kommunikation? Auf Google+ wird gerade über Themenvorschläge diskutiert. Momentan geht das auch noch recht gut, eventuell sollten wir uns hier mittelfristig aber doch eine andere Plattform (Mailingliste, Forum, ...) überlegen?

-> Discuss!

Geotag-Plugin für Serendipity überarbeitet

Das Geotag-Plugin für Serendipity zeichnet Blogartikel auf Landkarten unterhalb des Beitrags oder in der Seitenleiste ein. Beim Verfassen kann ein Blogger einen Artikel mit den Geo-Koordinaten seines Aufenthaltsortes versehen (so genanntes Geotaggen). Diese Position wird anschließend auf einer kleinen Karte angezeigt. Nützlich ist diese Funktion ist beispielsweise für Reiseblogs.

Weniger Fehler, mehr Funktionen

Leider hatte das Plugin zuletzt einige Bugs, die zum Teil aus Schnittstellenänderungen von Google Maps resultierten. Grischa hat sich das Plugin vorgenommen und vorgestern eine neue Version eingecheckt, die die meisten Bugs behebt und sogar tolle neue Features mitbringt.

Allerdings berichtete Grischa von Problemen mit der Kartendarstellung in der Seitenleiste. In den Kommentaren zu seinem Artikel kam außerdem der Wunsch auf, neben Google Maps auch Karten von Openstreetmap einzubinden. Zum einen unterliegen letztere einer Creative Commons-Lizenz, zum anderen hat Google vor kurzem Zugriffsbeschränkungen für seine Kartenschnittstelle eingeführt. Leichtfertig kommentierte ich, dass ich mir das ja mal ansehen könnte. Als passionierter Openstreetmapper und Geocacher liegt mir das Thema eben am Herzen ;-)

Gesagt, getan. Der Aufwand war allerdings größer, als ich erwartet hatte. Zum einen lief das Plugin noch mit dem Google Map Javascript API in Version 2, die aber schon sein 1,5 Jahren als deprecated eingestuft ist und in absehbarer Zeit abgeschaltet werden wird; also habe ich den Code auf Version 3 umgestellt. Zum anderen habe ich Openstreetmap mithilfe der OpenLayers-Bibliothek eingebunden, die nicht gerade simpel zu benutzen ist. Sie ist andererseits zwar sehr mächtig, aber ich habe für das Plugin nur einen kleinen Teil ihrer Fähigkeiten benötigt. Doch nun ist es geschafft: Meine aktualisierte Version 1.26 habe ich gerade hochgeladen, sie dürfte in Kürze für alle verfügbar sein.

"Geotag-Plugin für Serendipity überarbeitet" vollständig lesen