hyperion-x11 kann boblight-X11 ersetzen und schwarze Balken in Videos ignorieren
Hinter meinem Computerbildschirm kleben die LEDs eines Lightpacks und seit einer Weile sorgt hyperion mit boblight-X11 dafür, dass sich die Farben der LEDs dem Bildschirminhalt anpassen.
Als ich damals hyperion installierte fand ich einen Hinweis auf hyperion-x11, aber keinerlei Infos dazu wie das zu benutzen ist oder wo sich das versteckt. Jetzt suchte ich nach einer Möglichkeit, die schwarzen Balken eines Videos zu ignorieren und stolperte wieder darüber. Mit boblight-X11 bleiben die LEDs beim Balken ja schwarz, aber es wäre vielleicht schöner wenn sie sich nach dem Videobild darunter richten würden. Ich las, dass hyperion das lösen würde, und es gibt eine Konfigurationseinstellung dazu:
"blackborderdetector" : { "enable" : true, "threshold" : 0.01 },
Das gehört in die ~/.hyperion.config.json. Aber mit boblight-X11 als Bildschirmgrabber bewirkt das nichts. Aber diesmal fand ich hyperion-x11: Es wurde bei der letzten Kompilierung von hyperion miterstellt und lag in hyperion/bin/ des Kompilierungsordners. Und tatsächlich: Ohne Kommandozeilenargument statt boblight-X11 gestartet belieferte das sofort die LEDs mit Daten, nach ein paar Sekunden wurden die schwarzen Balken des Videos erkannt und daraufhin ignoriert.
Gesammelte Update-Wehwechen nach der Serendipity-Woche
Alles in allem lief der Blog nach dem Upgrade auf die Alpha gut, aber es gab doch noch ein paar Probleme.
Nicht alle hier genutzten Plugins waren kompatibel mit PHP 7.2. Zuerst bemerkte ich das Sitemaps-Plugin, damit installiert konnte ich keine Artikel abspeichern. Ich patchte das, aber es ist ein notdürftiger Patch und das Plugin braucht einen Maintainer, der es mal durchtestet und aufräumt. Dafür steht jetzt auch ein Issue auf Github.
Das zweite problematische Plugin war mein Bayes-Plugin, das beim Lernen eines Kommentars als Spam oder valid einen Fehler wegen einer Konstante warf, die ein String sein müsste. Der Patch ist hier und damit schon in Spartacus.
Problematischer waren ein paar Installationsspezifische Besonderheiten. Mein Blog benutzt je ein eigenes Theme, einen modernisierten Fork von codeschmiede. Nach dem Upgrade war die Kommentardarstellung falsch, das Datum fehlte und die Seitenleiste sah ebenfalls kaputt aus. Aber nicht direkt, erst nachdem ich wegen eines anderen Fehlers templates_c/ leerte. Tatsächlich war da mein Theme etwas kaputt, was ich dann auch im Testblog nachvollziehen konnte, aber vorher im Blog wohl wegen gecacheter Smarty-Dateien nicht bemerkte.
Drei Commits adressierten weitere Fehler im Kern. Erstmal mussten die Funktionen des internen Caches neu strukturiert werden, weil ich vorher die Cachedauer nicht gesetzt hatte. Jetzt sitzen die Funktionen auch an einer besseren Stelle im Kern und sind so leichter anderswo nutzbar. Dann fand ich einen weiteren Konstanten-Fehler. Und schließlich bemerkte Matthias, dass Seiten die eine 404-Fehlerseite anzeigen sollten stattdessen einen internen Fehler produzierten, was angesichts des Ausbleibens des Fehlers mit 2k11 scheinbar auch mit meinem Theme zusammenhängt. Der simple Patch war leider schwer gefunden.
Es bleibt noch ein Fehler: Gerade kann ich keine Preview dieses Artikel erstellen. Die Fehlermeldung besagt
Ihr Browser hat keinen gültigen HTTP-Referrer übermittelt. Dies kann entweder daher kommen, dass Ihr Browser/Proxy nicht korrekt konfiguriert ist, oder dass Sie Opfer einer "Cross Site Request Forgery (XSRF)" waren, mit der man Sie zu ungewollten Änderungen zwingen wollte. Die angeforderte Aktion konnte daher nicht durchgeführt werden.
Sowas sah ich auch vorher schonmal, aber dann half immer ein erneuten Klicken auf den Vorschau-Button, diesmal nicht. Das könnte an PHP 7.2 hängen oder auch an meiner Überarbeitung des Autologin-Tokens, wobei seltsam ist dass es in meinem Testblog nicht einmal auftrat. Da muss ich nochmal ran.
Der letzte Tag der Entwicklungswoche: Hier läuft jetzt Serendipity-2.2.1-alpha2 und PHP 7.2
Die Installation war der letzte Schritt. Ich hatte ja gestern schon angekündigt, damit die Woche abschließen zu wollen. Was nicht völlige Inaktivität bedeuten soll, aber andere Projekte (Pipes!) kriegen erstmal wieder Priorität.
Das Upgrade auf die aktuelle Version funktionierte, was aber auch kein Wunder ist wenn der Upgrader fast keine Aufgabe durchführen muss. Allerdings begrüßte mich der Blog danach mit einer Fehlermeldung: Er konnte voku/simple-cache nicht laden. Ich hatte vergessen die aktualisierten composer-Dateien hochzuladen, dass das nötig ist war mir gar nicht klar. Schnell nachgeholt scheint erstmal alles zu laufen, wenn nicht wird sich das jetzt zeigen. Aber ich bin zuversichtlich, dass der Code jetzt mindestens reif für eine Beta ist.
Mir hat die Woche Spaß gemacht. Serendipity ist eben ein altes PHP-Projekt, mit allen Vor- und Nachteilen. Zu den Nachteilen gehören die vielen Workarounds für teils jahrealte PHP-Absonderlichkeiten und die Codestruktur und Qualität mancher Ecken im Kern, die dann eben den Standards von PHP-Projekten vor 15 Jahren entsprechen.
Aber die Vorteile zählen eben auch: Es ist ein stabiles und simpel gehaltenes Framework, das extrem aufs Bloggen ausgelegt ist, in dem sich manche Features erstaunlich komfortabel umsetzen lassen. Mit jeder neuen PHP-Version seit PHP 7 bekommen wir eine ganze Menge Verbesserungen der Sprache und in ihrem Ökosystem umsonst, die einzubauen und generell den Code zu verbessern ist lohnenswerte Arbeit. Auch haben sich meiner Meinung nach in den letzten Jahren viele Verbesserungen im Kern angesammelt, welche die Weiterentwicklung desselben, aber auch die Pluginentwicklung besser machen. Zusammengenommen ist die Arbeit an Serendipity derzeit besonders erfreulich. Ich kann jeden nur einladen, sich mal an einer neuen Funktionalität, einem Bugfix oder einem Plugin zu probieren.
Serendipity-Entwicklungswoche, Tag 6: Kleine Verbesserung der Mediendatenbank und des Podcast-Plugins
Heute reichte es nur für eine kleine gestern überlegte Verbesserung der Mediendatenbank und ich muss mich beim Aufschreiben beeilen, um nicht in den letzten Tag der Entwicklungswoche zu rutschen.
IDs für Nicht-Bilder
Mindestens der aktuelle Code der Mediendatenbank könnte auch Links in Einträgen zu per Mediendatenbank eingefügten Dateien umbiegen, wenn diese umbenannt oder verschoben werden. Dateien meint hier Dateien im Gegensatz zu Bildern, denn bei Bildern geht das ja schon lange. Doch bisher wurden die Dateien ignoriert weil sie beim Einfügen keine ID mit in den Eintrag geschrieben bekommen haben. Das habe ich nun geändert und getestet, dass das Umbenennen tatsächlich den Link umschreibt.
IDs für das Podcast-Plugin
Die IDs für Audiodateien im Eintrag zu haben ist eine Voraussetzung für das Podcast-Plugin, das jetzt die ID auslesen und damit auf die Datei auf dem Server zugreifen kann. Ich habe den Code dafür nur angelegt und damit schonmal den Wrapper für den Player angepasst, das war vorher auf Übersichtsseiten wie der Hauptseite des Blogs noch kaputt. Der nächste Schritt wäre mittels der ID die Originaldatei auszulesen und so Informationen wie die Länge der Aufzeichnung ins Markup des Players aufnehmen zu können.
Unschön an dem ganzen ist, dass ich nach der Entwicklungswoche dann immer noch ein konkret anstehendes Serendipity-Projekt haben werde. Andererseits ist das Podcast-Plugin ganz spannend und ich glaube, dass es mit vertretbarem Aufwand in einen guten Zustand kommen kann. Morgen werde ich mich aber statt dem Plugin meinem Blog widmen, diese Installation auf die Alpha aktualisieren und schauen, ob es dort noch Probleme gibt.
Serendipity-Entwicklungswoche, Tag 5: Nochmal ein nochmal, diesmal XML_RPC und Podcasts
Wie gestern habe ich an diesem Tag der Entwicklungswoche mit den bundled-libs angefangen, ungleich gestern habe ich mit einem Entwurf für ein neues Plugin aufgehört.
XML_RPC und PHP 7.2 war doch noch kaputt
Warum auch immer ich vorher keine Fehlermeldung bekam, das XML_RPC-Modul hatte noch andere Inkompatibilitäten als nur den veralteten Konstruktor von vorgestern. An drei Stellen wurde noch das genauso veraltete each
benutzt. Leider ist die letzte Version upstream von 2011 und die Library mit einer anderen auszuwechseln wäre wesentlich mehr Arbeit als es das beim Cache war. Also habe ich einen Patch gebaut. Eine besser gepflegte Version wie phpxmlrpc einzubauen wäre schöner und ich hoffe, jemand anders macht das irgendwann. Mir reicht erstmal die Zeit dafür nicht.
Podcasts
Warum "nochmal Podcasts" wenn ich über Podcasts noch gar nicht sprach? Es ist ein lange geäußerter Wunsch von Dirk und anderen, der schon mehrmals an der Komplexität des Themas scheiterte. Wobei das Fehlen von podcastenden Entwicklern sicher auch nicht hilft, ich zum Beispiel habe nur wenig Ahnung was genau gebraucht wird.
Im Geiste der Woche habe ich diesmal trotzdem angefangen, so gut es eben geht. Herausgekommen ist das hier:
Man kann sich das auch anhören, ich habe vor dem Schreiben des Plugins einen Mini-Podcast über meine Ideen für dieses Plugin aufgenommen.
Was man im Screenshot nicht sieht ist das enclosure im RSS-Feed, aber das ist da. Ebenfalls nicht zu sehen ist etwas weniger erfreulicheres: Das Plugin hat ein konzeptionelles Problem. Weil die Mediendatenbank Audio-Dateien ohne ID in Artikel einfügt fehlt diese ID dem Plugin. Deswegen kann es bisher nur mit der URL arbeiten, es kann noch nicht die Audiodatei auf dem Server direkt anschauen. Aber wir können ja jetzt besprechen ob das wirklich nötig ist, dann würde ich morgen versuchen das im Kern umzubauen.
Wer das Plugin testen will kann sich den Quellcode auf Github anschauen und herunterladen. Es ist definitiv noch nicht fertig, aber wenn es fertig werden soll braucht es Feedback von Podcastern.
Serendipity-Entwicklungswoche, Tag 4: Über die Bundled-Libs zu Smarty und nochmal zum Cache
Heute war mein Einsatz ähnlich kurz wie gestern, aber gefühlt was es bisher einer der produktivsten Tage der Entwicklungswoche. Ich kam nämlich zum letzten Punkt meiner Agenda und konnte dort völlig überraschenderweise ein tolles neues Feature einbauen.
Smarty Pflichtupgrade
Aber erstmal zu Smarty. Im Forum hatte chris_goe eine seltsame Datei gemeldet, eine Verknüpfung, die upstream in das damalige Smarty-Release gerutscht war. Seitdem gab es sowieso neue und sogar Sicherheitsupdates beinhaltende neue Versionen. Also löschte ich das gesamte Smart-Verzeichnis und ersetzt es mit einem neuen Release, diesmal auch darauf achtend den Demo-Ordner zu entfernen. Der Commit ist leider unlesbar riesig, weil an irgendeiner Stelle automatisiert die Codeformatierung verändert wurde (ob bei uns im Code oder auf Seite von Smarty werde ich zwecks Ärgervermeidung nicht recherchieren). Immerhin funktioniert s9y mit der neuen Version weiterhin und scheinbar problemlos.
Ein besserer Cache
Smarty zu aktualisieren war Pflicht, nochmal den Cache anzugehen war eine Freude. Eigentlich wollte ich nur Cache/Lite ebenfalls aktualisieren, stolperte dabei aber über voku/simple-cache. Das ist ein mehrere Systeme unterstützender Cache-Layer: Tolle Optionen sind memcached und Redis. Und als Fallback dient OpCache, bei dem ähnlich wie mit Cache/Lite eine Datei erstellt wird. Gut, dazu gibt es nochmal ein Fallback, ein für uns unnützes nicht-persistentes Speichern im Array, aber OpCache sollte überall an sein.
Erst dachte ich "cool, aber wir haben ja schon Cache/Lite und das Projekt sieht etwas zu klein aus". Dann sah ich das:
Wir brauchen sowieso möglichst bald eine neue Cache-Lösung. Warum nicht jetzt? Also durfte voku/simple-cache per composer in die bundled-libs und ich stellte direkt den Code des internen Cache um (der übrigens bei den wenigen Plugins der Standardinstallation auf uberspace mit MySQL wenig bringt, dort ist die Datenbank schnell genug).
Eine aktiv gepflegte Cache-Library zur Hand zu haben ist nicht der einzige Nutzen. Sondern wir kriegen kostenlos die Funktion, Sachen in Memcached und Redis und damit im Arbeitsspeicher zu cachen. Das ist viel schneller als Speichern auf der Platte, egal ob in einer Datei oder Datenbank. Und besonderes interessant für mich: Es ist besonders attraktiv auf Scaleway-Servern und ähnlich langsamen Systemen mit viel verfügbarem Arbeitsspeicher.
Wieviel das bringt muss ich noch testen.
Damit habe ich alle im Vorhinein geplanten Themen der Woche durch. Robert hat sich einen Blick auf die XMLRPC-Schnittstelle für die Editoren gewünscht, davon habe ich aber keine Ahnung und würde vielleicht etwas anderes vorziehen.
Gibt es denn sonst noch Wünsche für die letzten drei Tage?
Serendipity-Entwicklungswoche, Tag 3: Cache und XMLRPC
Heute wird es etwas kürzer als gestern, jedoch konnte ich die Entwicklungswoche fortführen.
XMLRPC und PHP 7.2
Bernd hatte schon eine Weile den deprecated Konstruktor von XMLRPC gemeldet.
Ich bin mir nicht 100% sicher warum ich die Fehlermeldung nicht gesehen habe. Meine Vermutung: Die Library wird nur eingebunden, wenn ein Pingback gesendet oder empfangen wird, also sieht man die Meldung nur als Fehlermeldung wenn man einen Pingback verschickt. Und das passiert nur wenn der Trackback scheiterte, was nur selten vorkommt.
Wie auch immer, ich habe den Konstruktor jetzt einfach wie von modernen PHP-Versionen gefordert auf __construct
umgestellt.
Cache
Danke für die Kommentare zum Artikel gestern. Der Cache des Entryproperties-Plugins ist nun standardmäßig aus und folgt damit der üblichen, von euch definierten Praxis. Dafür wird der interne Cache bei der Installation nun aktiviert.
Das VGWORT-Plugin ist auf meinem Server nun in der aktuellen Version, und trotzdem wird anders als im Testblog die Zeichenanzahl in der Eintragsliste nicht angezeigt. Stellt sich raus, dass ich dafür einen neuen Event backend_view_entry eingeführt hatte der schlicht noch nicht in der hier laufenden Serendipity-Version 2.1.4 drin ist. Am Ende der Woche werde ich diesen Blog aktualisieren.
Serendipity-Entwicklungswoche, Tag 2: Fertige Mediendatenbank, Trackbacks und etwas VGWORT
Nach der Vorarbeit gestern war deutlich, dass Serendipitys Alpha im Grunde gut funktioniert. Also widmete ich meine Zeit am zweiten Tag der Entwicklungswoche größtenteils der Fertigstellung meiner Überarbeitung.
Die überarbeitete Mediendatenbank
Was meine ich mit "Überarbeitung der Mediendatenbank" überhaupt, da hat sich doch gar nichts geändert? Wenn dieser Eindruck entsteht ist die Überarbeitung gelungen. Ich habe tatsächlich nur Interna geändert, den Code neugeschrieben und organisiert, insbesondere wenn Bilder umbenannt oder in andere Ordner geschoben werden.
Anlass war das Plugin für responsive Bilder. Dafür musste ich in den Code der Mediendatenbank (=ML, für Media Library) hinabsteigen und die Thumbnailerstellung anpassen. Denn das Plugin braucht ja jetzt mehrere Thumbnails, nicht mehr nur eines, um von denen immer das für die Fenstergröße passende auszuwählen. Diese Thumbnails müssen dann auch mit verschoben und umbenannt werden, wenn gleiches mit dem Originalbild passiert. Ohne Serendipity und die Arbeit meiner Vor- und Mitentwickler schlechtreden zu wollen: ich war ein bisschen entsetzt was ich dabei im Code sah.
Beispielsweise war das Herzstück bei Umbenennungen vorher, hier zu sehen, die Funktion serendipity_moveMediaDirectory
. Wohlgemerkt auch dann, wenn eine einzelne Datei und kein Ordner verschoben wird. Was gemeint war steuerte der Parameter $type
, der entweder 'dir'
, 'file'
oder 'filedir'
erwartete. Ist klar. Die Funktion war dann auch noch 403 Zeilen lang und daher absolut nicht einfach zu beherrschen.
Um also die responsiven Bilder unterstützen zu können musste ich das neu organisieren, mindestens entstand der Wunsch diese Stelle im Kern zu verbessern. Ich splittete die Funktionalität in mehrere Teilfunktionen: serendipity_renameDir
, serendipity_renameFile
, serendipity_updateImageInDatabase
, serendipity_updateImageInEntries
, ..., ich denk die Idee wird klar. Diese Funktionen sind jeweils wesentlich kürzer als der alte Blob und sie können in anderen Codestellen aufgerufen werden, wenn eben genau ihre Funktionalität gebraucht wird. Ich würde das gerne anschaulicher zeigen, aber die functions_images.inc.php ist leider zu lang für githistory.xyz.
Ich wurde aber nicht fertig: Erst fehlte die Zugangskontrolle über die ACLs, die ich nie nutze, nicht kannte und deren Fehlen auch nicht bemerkte. Garvin besserte hier nach. Dann vergaß ich schlicht, dass ja nicht nur der Pfad zum Bild umgebogen werden muss, sondern auch der Link. Das reparierte ich vor einer Weile. Was aber bis heute noch fehlte: Wenn ein eingefügtes Bild nicht zu sich, sondern sonstwohin linkt, soll der manuelle Link bei Umbenennung des Bildes ja erhalten bleiben. Genau diese Funktion baute ich heute ein.
Solch ein tiefgreifendes Refactoring ohne bestehende Unit-Tests ist riskant und erfordert sehr viel Aufmerksamkeit. Mittlerweile scheint der neue Code sehr stabil zu funktionieren. Er ermöglicht die neue Funktionalität, macht wohl nichts kaputt, und er wird wesentlich einfacher zu erweitern sein. Aber genau hier ist die Instabilität im Master, der Grund warum wir nicht einfach eine neue Beta oder stabile Serendipity-Version veröffentlichen konnten. Ab heute ginge das hoffentlich.
Trackbacks funktionieren(?)
In meinem Blog beobachte ich das schon etwas länger, aber jetzt las ich es indirekt auch von Thomas und einem Kommentator bei ihm: Irgendwas stimmt nicht mit den Trackbacks. Verschickt Serendipity für einen Artikel mehrere Trackbacks an einen anderen Blog – oder auch an andere Artikel im eigenen Blog – dann kommt nur einer davon durch.
Ich vermutete den Fehler im Kern, testete das in meinem Entwicklungsblog – und alles funktionierte. Ich hatte einen neuen Artikel geschrieben, der zu zwei älteren Artikeln verlinkt, und unter beide wurde ein Trackback gesetzt. Das ist also höchstwahrscheinlich kein Fehler im Kern, sondern ich vermute das Problem beim Server oder einem Plugin. So oder so, auch wenn es sich lohnen würde hier weiter zu forschen, wenn das in einer jungfräulichen Installation funktioniert blockiert es das Release nicht.
VGWORT-Plugin geht erstmal wieder
Im Testblog wurde nach der Pluginstallation sofort eine Fehlermeldung geworfen. Mit einer kleinen Änderung konnte ich die vermeiden und der Zeichenzähler funktionierte danach. Ich bin gespannt, ob das morgen nach dem Pluginupdate auch hier im Blog geht, gehe jetzt aber erstmal von aus.
Eine Frage in die Runde: Benutzt jeder von euch das Plugin Erweiterte Eigenschaften von Artikeln (entryproperties), mit dem dort enthaltenen Cache?
Beim Entwickeln wurde nach dem Umbenennen von Bildern dieser Cache nicht invalidiert, ich dachte erst der Code der ML sei kaputt, aber das lag rein am Cache dieses Plugins. Ich überlege ob man ihn deaktivieren sollte und stattdessen den im Kern integrierten Cache aktiviert. Der ist sowieso mächtiger, und es sollte einfacher sein ihn wenn nötig zu invalidieren. Meinungen?
Serendipity-Entwicklungswoche, Tag 1: Installation, PHP 7.2 und Responsive Images
Das passierte bisher am ersten Tag der Entwicklungswoche:
Installation
Die Installation lief problemlos. Ich habe mein Dev-Installation auf uberspace komplett gelöscht, nochmal kontrolliert dass PHP 7.2 aktiv ist, und dann den aktuellen Git-Master heruntergeladen und neu installiert. Nach interner Versionierung ist das die Serendipity 2.2.1-alpha2.
Weil SQLite eigentlich immer funktioniert habe ich die Installation nur mit MySQL getestet. Es fielen mir keine Besonderheiten auf, ich landete direkt im Blog. Der von hannob gemeldete Installationsfehler ist also wirklich repariert.
PHP 7.2
Im Backend und auch sonst sind mir keinerlei Probleme bezüglich PHP 7.2 angezeigt worden. Ich habe Artikel geschrieben und bearbeitet, die Medienlibrary genutzt, Plugins installiert und das Autologin-Cookie aktiviert. Ich bezweifel nicht, dass es mit PHP 7.2 noch Probleme geben kann, aber die Kernfunktionalität scheint zu stehen. Vielleicht stolpere ich noch über Fehler, ansonsten freue ich mich über konkrete Hinweise. Vielleicht verschluckt uberspace auch ein paar Fehlermeldungen, die anderswo angezeigt werden?
Responsive Images
Ansonsten habe ich mich mit dem Plugin für die responsiven Bilder beschäftigt, dessen Idee aus dem devcamp in Essen stammt. Bei der Installation war mir aufgefallen, dass das Plugin nicht automatisch aktiviert wurde. Es fehlte in der Liste der Standardplugins, dort habe ich es jetzt hinzugefügt. Es wäre zu schade drum, wenn neue Nutzer diese Funktion nicht zu sehen bekommen, und es schien mir bereits sehr gut zu funktionieren.
Es war für dieses Plugin aber noch ein Bug gemeldet: Bernd hatte entdeckt, dass die srcsets
in Feeds nicht umgeschrieben werden. Im Kern ist das ja ganz bewusst so gehalten, dass die URL zu Bildern relative URLs sind, also /pfad/zum/Bild ohne vorangestelltes http://domain. Das vereinfacht Blogumzüge auf eine neue Domain. Aber wenn ein Feedreader einen solchen Link sieht kann er den ja nur schwer auflösen. Auch wenn es die besseren versuchen werden, denken vielleicht auch die nicht an das relativ neue srcset-Attribut. Die nötige Logik zum Umschreiben der ungewöhnlichen Kommaliste passte nicht ganz in das Schema des bisher genutzten regulären Ausdrucks für href
und src
, daher habe ich den Code zu preg_replace_callback
umgewandelt und in das Plugin eingebaut.
Stolperfalle war $eventData['feed_body']
. Das muss nämlich statt $eventData['body']
manipuliert werden, da der genutzte Event frontend_display:rss-2.0:per_entry
so spät in serendipity_printEntries_rss
aufgerufen wird. Der Code dort arbeitet nämlich erst auf body
, weist das aber gegen Ende feed_body
zu, und die nachher den Feed ausgebende rss.php schaut nur noch auf feed_body
. Das zu verstehen kostete fast so viel Zeit die Konzipierung des gesamten preg_replace_callback
Abschnitts, samt regulärem Ausdruck und Callback-Funktion.
Das aktuelle Paradox-Humblebundle ist gut, auch wenn ich es nicht kaufe
Das hervorragende Caffeine-Bundle hatte ich als Besonderheit wahrgenommen, als ein nur ausnahmsweise mal wieder für Linux-Spieler interessantes Humblebundle. Um das dann später nicht zu unterschlagen will ich daher das aktuelle Paradox-Bundle erwähnen, obwohl ich es nicht kaufen werde. Es sind gute Spiele dabei, insbesondere
- Age of Wonders II und III, die in die Richtung von Heroes of Might and Magic gehen,
- Magicka 2, für Fans von Koop-Spielen,
- Crusader Kings 2, in das man viele Stunden versinken kann, und es kommt in der zweiten Preisstufe sogar mit dem wirklich netten DLC "The Old Gods",
- Europa Universalis IV, das wohl Crusader Kings II ähnelt, aber auf einer etwas anderen Ebene spielt.
Für mich lohnt es sich nicht. Crusader Kings samt der Erweiterung war schon im 2018er-Bundle, genauso Magicka 2. Wobei ich von Magicka nur den ersten Teil einmal kurz angespielt habe. In Age of Wonders III bestritt ich bereits die Kampagne. Europe Universalis III schließlich verstaubt bisher ungetestet in meiner Steam-Bibliothek, da brauche ich mir den Nachfolger nicht zulegen.
Aber wer diese Spiele noch nicht hat, für den sind mindestens die ersten beiden Preisstufen ein gutes Angebot.
Nächste Woche ist bei mir Serendipity-Entwicklungswoche
Über lange Zeit konstant an einem Projekt zu arbeiten ist schwer. Es gibt ja auch immer anderes zu tun: Andere Softwareprojekte, Spiele, Dinge außerhalb des PCs. Irgendwann gerät das konstante Projekt dann in den Hintergrund. Im Grunde ist das okay. Bei Serendipity aber habe ich etwas angefangen und nicht zuende gebracht: Die Überarbeitung der Interna der Medienlibrary. Die ist fast fertig, aber eben noch nicht ganz. Wenn so etwas dann im Hinterkopf herumspukt empfinde ich das als Stress.
Bei s9y kommt die PHP-Entwicklung dazu. Da ständig neue Versionen herauskommen und die Kompatibilität gebrochen wird können wir uns nicht zurücklehnen und einfach eine lange Weile nichts machen. Sondern bis zum Supportende muss eine neue s9y-Version draußen sein, sonst kann man es auch gleich bleiben lassen. Das ist bei PHP 7.1 der Dezember 2019. Das ist machbar, aber schwieriger wenn Instabilitäten im Git-Master lauern und wenn die Issues sich nicht von selbst lösen. So wie das der Überarbeitung der Medienlibrary.
Daher will ich dieses Wochenende und die nächste Arbeitswoche kontinuierlich etwas Zeit in Serendipity stecken. Ich verspreche mir davon, einen guten Überblick über den Zustand der Alpha im Master zu gewinnen und sie so weit zu bringen, dass zumindest von meiner Seite aus eine Beta veröffentlicht werden kann. Und da mehrere Tage etwas Zeit zu opfern soll dafür sorgen, dass nichts aufgeschoben wird und dann in meinem Hinterkopf bleibt. Was ich im Blick habe:
- Durchtesten, dass die Installation sowohl mit SQLite als auch mit MySQL funktioniert.
- Wenn ein per ML hochgeladenes Bild auf eine andere URL zeigt, bleibt diese beim Umbenennen des Bildes nicht erhalten
- Kompatibilität mit PHP 7.2 sollte komplett sein, aber da will ich nochmal draufschauen.
- Update der bundled-libs.
- Mein Plugin für die VG WORT hat mal Zusatzinformationen in der Eintragsliste angezeigt, jetzt nicht mehr.
- Wenn ich mehrere Einträge in meinem Blog verlinke kommt nur der erste Trackback an.
- Das srcset der responsiven Bilder wird in Feeds nicht von relativen zu absoluten URLs umgeschrieben.
Wenn die Zeit es zulässt will ich dann jeden Tag auch etwas über die Entwicklung schreiben. Selbst wenn das nur ein kurzes "Die Installation lief bei mir einwandfrei" ist. Einfach, damit das Wissen über den Stand nicht untergeht.
Jeder kann helfen: Installiere den aktuellen Git-Master von s9y in einer Testumgebung und melde mir oder repariere direkt Fehler. Zusammen macht das alles viel mehr Spaß.
Tyranny - Noch ein gutes RPG, diesmal in böse
Tyranny aus dem Caffeine-Humblebundle ist Pillars of Eternity wirklich ähnlich. Wie PoE ist es ein Rollenspiel, das den klassischen Vertretern des Genres wie Baldur's Gate 2 nacheifert. Tyranny aber hat zwei Besonderheiten: Ersten ist man in der Ausgangsposition Rechtsprecher eines bösen Overlords, zweitens gibt es viele Entscheidungen, die auch tatsächlich den Spielverlauf ändern. Die betreffen vor allem die Parteien, von denen es einen ganzen Haufen gibt. Mit den zwei großen bösen Armeen kann in der Handlung gegen die jeweils andere agiert werden. Natürlich gibt es auch die Möglichkeit gegen beide zu rebellieren – aber klassisch den Guten zu spielen erschien mir zumindest für den ersten Spieldurchlauf witzlos. So viele Entscheidungen in einem etwas anderen Szenario zu haben ist klasse, denn dadurch wird das Rollenspiel tatsächlich zu einem Rollenspiel, in dem die gewählte Rolle getestet und durchgezogen werden kann.
Es gibt wieder Fähigkeiten, die in Gesprächen und der Umgebung eingesetzt werden. Im Grunde sind es nur drei: Lore, Athletik und Subterfuge. Weil die Balance verkackt wurde ist das aber leider anspruchslos. Nur ganz am Anfang gab es eine Situation, in der mein Charakter nicht genug Punkte in Athletik hatte, danach passte es das ganze Spiel hindurch in wirklich jeder Situation, immer. Immerhin sind in Gesprächen die so bewachten Optionen gar nicht immer die beste Wahl. Und es gibt auch noch den eigenen gewählten Charakterhintergrund, die Entscheidungen im Intro und Spielverlauf sowie die Meinung der Fraktionen und einzelner wichtiger Charaktere. All das hat in Gesprächen viele Auswirkungen und ermöglicht ebenfalls bestimmte Antworten. Und immer reagieren die Begleiter auf Entscheidungen mit Veränderungen in ihrer Loyalität mir gegenüber, und auch wenn eine Entscheidung den Zorn meines Arbeitgebers erweckt teilt das Spiel mir das mit. Immerhin ist es ja meine Aufgabe, das Gesetz eines rechtschaffen bösen Herrschers durchzusetzen. All das vorherzusehen und für mich akzeptable Lösungen zu finden wird durchaus komplex.
Die Gruppe fasst vier Recken, es gibt aber sechs Begleiter im Spiel. Da die ihren eigenen Charakter haben und fleißig das Geschehen kommentieren ist auch da viel Wiederspielwert. Denn in meinem Spiel wollte ich zwischen den Begleitern nicht hin- und herwechseln, zu gut funktionierte meine Gruppe mit den drei ersten Begleitern: dem Disfavored-Ritter Barik als Tank, Verve aus dem Scarlet Chorus als Schadensausteilerin, der Gelehrte Lantry war mein Magier und Heiler. Mein eigener Charakter war auf Wurfwaffen und Feuermagie spezialisiert. In D&D wäre das noch eine Dual-Klasse gewesen, hier geht diese Kombination problemlos regulär. Die fehlende Spezialisierung sollte Nachteile haben, aber die gab es nicht. Die Kämpfe nach dem ersten Akt waren eher auf der einfachen Seite, und dass die Fähigkeitsprüfungen kein Problem waren erwähnte ich ja schon.
Mir hat das Spiel insgesamt sehr gut gefallen. Ja, es gibt Schwächen: Der letzte Akt ist zu kurz, statt Portraitphotos in Gesprächen Charaktermodelle zu zeigen sieht richtig schlecht aus, die Begleiter haben keine eigenen Quests, mehr Gespräche hätten vertont und die Kämpfe taktischer sein sollen, die Story das Klischee "Du bist der Auserwählte" vermeiden können. Aber trotz all dem macht das Rollenspiel dank seinen Entscheidungen und dem ungewöhnlichem Szenario sehr viel Spaß. Tyranny saugt den Spieler in seine ganz eigene Welt, die des Overlord Kyros, samt magischen Edikten und einer Invasion, die ich gewinnen will und in der meine Entscheidungen schon vor dem Outro riesige Konsequenzen hatten. Und auch wenn mich das Auserwählt-Sein als Klischee stört, ist das mit der wachsenden eigenen Macht verbundene Fortschrittsgefühl in kaum einem RPG so fesselnd umgesetzt worden.
Wie schade, dass die Entwickler nicht noch ein paar Monate mehr in das Spiel investiert haben. Mit etwas mehr Feinschliff, mehr Inhalten rund um die Begleiter, sinnstiftenden Inhalten für das Edikt-System und der eigenen Behausung in dem nahezu fehlenden dritten Akt hätte Tyranny eines der ganz großen Vertreter seiner Genres sein können. Aber auch in diesem Aspekt ähnelt es eben Pillars of Eternity: Tyranny ist ziemlich toll, aber es könnte so viel besser sein. Mit all dem verschenkten Potential erreicht es dann leider nicht mehr die Klasse eines Baldur's Gate 2 oder Fallout 2.