Stranger Than Usual

Give me the microplastics! They belong in the ocean!

Worst Premade Ever

Trainpunks: Kickstarter ab Februar 2027

Freunde von mir (insbesondere ein Spielleiter einer meiner Rollenspielrunden) arbeiten gerade an einem Rollenspielsystem namens „Trainpunks“. Ich habe auch schon einmal einen Oneshot davon probegespielt.

Das Setting ist ein gewaltiges U-Bahn-Netz mit U-Bahnen unergründlicher Herkunft und übernatürlicher Schaffner. Die Spielercharaktere sind Menschen (dem Titel nach zufolge Punks), die dort unten irgendwie überleben müssen. Denn es gibt nicht nur Menschen, sondern auch verstörende Cthulhueske Wesen, die äußerst gefährlich sind.

Aus einem Schild an einer Wand, von dem nur „TRAIN███ON“ zu sehen ist, wächst ein lidloses Auge umgeben von pinkem Gewebe hervor. Das Auge ist umringt von ebenfalls pinken Armen, die Wand um das Auge herum ist merkwürdig verzerrt. Vor der Wand sind zwei Personen zu sehen. Eine Person halt eine Spraydose in der Hand und hetzt eine hundeartige Gestalt die sich aus Farben auf dem Boden erhebt, auf das Auge. Die zweite Person hat eine Kleine Gießkanne in der Hand, unter ihr wachsen Pflanzenranken.

Die Spielercharaktere können hier verschiedene Rollen einnehmen, wie zum Beispiel „Graffiti Artists“ (die ihre Schöpfungen zum Leben erwecken können, Bilder über längere Distanzen auf andere Wänder übertragen und ähnliches), „Guerilla Gardeners“ (die Pflanzen wachsen lassen und kontrollieren können), „fare dodger“ (hat kein Ticket für die U-Bahn und wird dafür von den Schaffnern gejagt, hat dafür aber andere Vorteile), „busker“, „squatter“, „bootlegger“ und „traceur“.

Mir hat der Oneshot damals gut gefallen, und ich werde demnächst das System playtesten. Für alle, die dieses Setting anspricht: Im Februar 2027 wird eine Kickstarterkampagne, der man aber jetzt schon folgen kann, um das Projekt zu unterstützen. Mein Spielleiter und der Entwickler des Spiels hat unter dem Namen „Foxes in Boxes“ auch schon andere kleinere Rollenspielsysteme veröffentlicht.

Das Artwork oben stammt von der anderen Person in dem Bunde und ist Teil eines Flyers, den die beiden für die NordCon 2026 entworfen haben. Eine volle Version des Flyers ist auf tumblr zu finden.

Also: verfolgt das Kickstarter-Projekt, je mehr Leute, desto besser. Ich hatte viel Spaß mit dem Trainpunks-Oneshot und möchte, dass dieses Projekt erfolgreich wird.

PS: Dieser Blogpost ist keine bezahlte Werbung. Ich unterstütze das Projekt weil

  • mir das Konzept gefällt
  • es von Freunden von mir gemacht wurde
  • es ein Indie-Projekt ist.

Digital Independence Day Juni 2026: wieder nix

Im Mai habe ich zum Digital Independence Day nichts gemacht. Dafür konnte ich dass dann nachholen, als ich am Towel Day zusammen mit einigen Freunden ein paar Sachen gemacht habe. Auf meiner Seite hat das auch gut funktioniert, ich kann jetzt auch aufwändigere Windows-Spiele unter Linux spielen und bin damit von Windows weg. Und ich habe mich von der Google Search Console verabschiedet.

Heute hatten wir uns wieder verabredet, aber alle haben kurzfristig aus Erschöpfungsgründen abgesagt. Also wird es heute zum DID wieder nichts, aber zumindest in einem Fall gibt es schon einen Plan, bei dem ich helfen kann, vielleicht diesen Monat. Und darum geht es ja auch. Nicht zwanghaft irgendwas machen, sondern Schritt für Schritt, in einer nachhaltigen Geschwindigkeit Dinge umstellen.

Wenn es dann soweit ist, schreibe ich noch einmal dazu.

Tippfehler: Hinweise erwünscht

Die meisten Blogposts hier plane ich nicht gründlich, und mache auch kein gründliches Korrekturlesen. Wenn ich aber Tippfehler bemerke, korrigiere ich sie. Wenn ich unter meinen git-commits für dieses Blog nach „typo“ suche, finde ich schon gut 100 commits.

Nun weiß ich aber, dass mir selbst Rechtschreibfehler, Satzbaufehler, Typographiefehler oder allgemein Tippfehler in fremden Texten schneller auffallen als in Texten, die ich selber geschrieben habe. Ich glaube, das geht anderen auch so. Nun sind viele Leute zu höflich, um Tippfehler zu melden. Ich persönlich werde aber gerne darauf hingewiesen, weil ich die Fehler dann korrigieren kann. Hier also für alle: Ihr könnt mir solche Fehler gerne melden, ich korrigiere die dann (wenn ich auch der Meinung bin, dass es Fehler sind).

Wenn ihr einfach zu faul seid, für einen Fremden den Korrekturleser zu machen, dann ist das vollkommen in Ordnung. Wenn euch der Fehler aber nervt und ihr unsicher seid, ob ihr ihn melden sollt: Meldet ihn, ich weiß das zu schätzen.

PS: das gilt auch für andere Fehler, zum Beispiel ungültiges HTML oder so.

PPS: Diese Aufforderung gilt speziell für mich. Andere Leute mögen ihre Blogs anders behandeln und Tippfehler aus welchen Gründen auch immer nicht korrigieren. Das ist auch in Ordnung.

Kann die AI-Blase bitte endlich platzen?

Es ist jetzt etwas über ein Jahr her, seit ich eine Zusammenstellung meiner Gedanken über LLM und Bildgeneratoren gepostet habe. Seitdem hat sich viel getan. Modelle haben sich verbessert, RAM-Preise wurden in die Höhe getrieben weil OpenAI angekündigt hat, alles aufzukaufen, nur um es dann doch nicht zu run. Redner, die bei Absolventen über „AI“ predigen werden ausgebuht. Die Preise für Modell-Abos steigen. Firmen verpulvern ihr ganzes LLM-Budget in den ersten paar Monaten des Jahres. Wieder einmal wurde bewiesen, dass trotz des Hypes „AI“-Agenten eine schlechte Idee sind. In den letzten Wochen insbesondere sind mir wieder einige spezielle interessante Dinge untergekommen:

LLM-Einsatz bei mir auf der Arbeit

Aber warum dränge ich jetzt darauf, dass die AI-Blase jetzt bald mal platzen sollte? Nun, das hat persönliche Gründe. Mein Arbeitgeber hat sich bisher zurückgehalten, was LLMs zum Programmieren angeht. Insbesondere auch, weil der Code von Kunden nur bei Systemen landen sollte, auf denen der Kunde ihn erlaubt. Und weil Agenten, denen man Zugriff auf sein System gibt, auch geheime Daten _wie zum Beispiel kryptographische Schlüssel auslesen können.

Heute jedoch gab es eine große Ankündigung: Wir sollen jetzt groß Experimente mit LLM-Codegenerierung machen (eine „AI code factory“ oder so ähnlich aufbauen). Hier ging es nur um die Codeerzeugung, Planung, Konzeption, Gespräche mit dem Kunden soll immer noch von Menschen gemacht werden. Mein Chef hat u.a. die Sorge, dass wenn wir nichts mit „AI“ machen, es die Konkurrenz macht, und wir dann mit kaputten „AI“-Prozessen beim Kunden arbeiten müssen. Teilweise seihen sogar schon McKenzie-Consultants gesichtet worden. Bevor die beim Kunden Unheil anrichten, sollen wir es lieber selber tun.

Insbesondere hat er uns dazu aufgefordert, Experimente zu machen. Natürlich nicht mit Kundencode. Sind ja Experimente. Sondern mit unseren Privatprojekten. Die Firma wird uns aber nicht die Kosten für den LLM-Codeassistenten erstatten. Sind ja unsere Privatprojekte. Natürlich müssen wir das nicht machen. Aber wir hätten es schon längst machen sollen. Oder so.

Noch einmal kurz als Stichpunkte:

  • wir sollen Experimente mit LLM-Codegeneratoren an unseren Privatprojekten machen
  • wir müssen es natürlich nicht machen, aber wenn wir es nicht machen, dann enttäuschen wir die Firma
  • wir kriegen nicht einmal die Kosten dafür ersetzt

Ich werde kein LLM in die Nähe meiner Privatprojekte lassen. Ich entwickle die zur Erholung. Da kommt keine umweltzerstörende Technologie dran, die mir auch noch den Teil davon wegnimmt, den ich am liebsten habe. Und das mit dem „das musst du nicht machen, aber eigentlich doch“ habe ich schon einmal gehabt. Bei meiner Einstellung wurde extra betont, dass ich zwar auf meinem Handy Software für die Arbeit installieren darf (dann muss ich da aber auch Spyware installieren), aber nicht muss. Zwei Monate später stellt unser Kunde die 2-Faktor-Authentifizierung so um, dass ich eine Android-App brauche, die ich mir auf meinem Phone aber mangels PlayStore nicht installieren konnte. Ich muss diese App aber installieren, sonst kann ich mich beim Kunden nicht mehr einloggen. Die Firma will mir kein Phone dafür bereitstellen. Das war während meiner Probezeit, also habe ich am Ende in den sauren Apfel gebissen und mir ein gebrauchtes Phone gekauft. Obwohl es mein Recht gewesen wäre, dass die Firma mir es stellt.

Nein, ich werde keinem weltzerstörenden „AI“-Unternehmen Geld in den Rachen werfen. Ich werde mich nicht von dieser Technologie abhängig machen. Ich mache mir aber Sorgen über meine Zukunft in der Firma, wenn ich diese Ansicht zu offen vertrete. Deswegen brauche ich den Kollaps der AI-Blase jetzt bitte schnell, am Besten bis zum Ende des Monats.

Rollenspielszenen: Journal-Eintrag

Rollenspielszene. Wir sind eine Gruppe von Freigeistern die im Wald leben. Jüngstes Mitglied ist Siobhan, Nichte von Niamh, der schon länger bei uns lebt. Siobhan hat sich vorrübergehend aus ihrer politischen Arbeit zurückgezogen, weil es in der nächsten Stadt Leute gibt, die sie besser nicht sehen sollten.

Es ist später Vormittag. Siobhan wacht auf und bevor sie Niamhs Behausung verlässt, schreibt sie in ihr Journal:

Heute werde ich nicht das System stürzen, und das ist ok.

Klick- und tabbare barrierefreihe Tabellenzeilen in HTML

Ich bin kein großer Barrierefreiheitexperte, auch nicht, wenn es um Websites geht. Eines weiß ich aber: Einfach irgendwelche Elemente mit Javascript anklickbar zu machen, die üblicherweise nicht anklickbar sind, ist nicht barrierefrei, weil Screenreader oder andere Hilfstechnologie sie nicht als anklickbar erkennt. Das ist eine Barriere für z.B. sehbehinderte Personen, für die die Klickbarkeit einfach unsichtbar ist.

Vor diesem Problem stand ich gestern, als ich ein paar Tabellenzeilen (<tr>, „table row“ in HTML) nicht nur anklickbar, sondern auch mit der Tastatur auswählbar machen musste. Die Idee war: User sucht etwas, User kriegt eine Tabelle mit Ergebnissen, User klickt auf eine Zeile, irgendetwas passiert. In meinem Fall war es ein Button, der eine Änderung auslöste, es könnte aber auch genausogut ein Link sein, der irgendwohin führt.

Was tun? Man kann den <button> oder das <a> nicht um das <tr> wrappen, weil das in HTML nicht erlaubt ist. Man kann in jede einzelne Zelle einen Link oder Button stecken, aber das ist unschön und die Tabellenzellenpaddings sind dann auch nicht klickbar. Man könnte in eine Zelle einen Link stecken und dann zusätzlich mit Javascript die Zeile anklickbar machen. Das ist aber unschön und funktioniert nicht ohne Javascript (letzteres wäre in meinem Fall kein größeres Problem gewesen.

Ich habe ein bisschen recherchiert und einen Blogpost mit einer Lösung gefunden. Ich gehe hier nicht in die Details, lest euch dazu den Post durch, aber die Idee ist: Man packt nur in eine Zelle den Link und sorgt dann mit geschicktem CSS dazu, dass für typische Browsernutzer der Link auf die ganze Zeile ausgedehnt wird. Für Hilfstechnologie ist aber der ursprügliche Button oder der Link immer noch da (sollte aber einen passenden Text haben). Ich weiß nicht, ob das komplett barrierefrei ist, ist aber auf jeden Fall deutlich besser als die Variante, in der man die Zeile nur klickbar macht. Bonus: Man kann auch mit Tab durch die Zeilen wechseln und dann mit Enter eine auswählen (die Anleitung ist für einen <button>, mit leichten Änderungen funktioniert es aber auch für ein <a>).

Ich war also ganz zufrieden mit dem Ergebnis, bis mir ein Kollege sagte: Hey, das funktioniert bei mir überhaupt nicht und macht die ganze Seite unbrauchbar. Was ist passiert?

Wir sind kurz zusammen durchgegangen: In Firefox funktioniert es. In Chrome auch. In Safari nicht. Woran lag das? Nun, um den Klickbereich auf die ganze Zeile auszuweiten, habe ich einen Trick verwendet: Ich habe dem Button in CSS mit einem ::after selector ein Dummy-Kindelement hinzugefügt. Dieses habe ich dann mit position: absolute und inset: 0 positioniert und skaliert. Und zwar genau über das nächste Vorfahrelement, das ebenfalls explizit positioniert war (position: relative. In diesem Fall war es die Tabellenzeile <tr>.

Safari hat aber einen Bug, durch den ein position: relative an einer Tabellenzeile ignoriert wird. Dabei wollte ich die Tabellenzeile ja nicht einmal bewegen, ich brauchte sie nur als Referenzpunkt. Mangels weiterer positionierter Elemente hat sich dann das button::after auf die gesamte Seitengröße ausgedehnt. Man konnte also nichts mehr klicken. Egal, wo man klickte, es wurde immer derselbe Button gedrückt.

Glücklicherweise habe ich einen anderen Blogpost mit einem Workaround gefunden. Das ist ein bisschen hacky, funktioniert aber auf allen drei getesteten Browsern.

Rollenspielszenen: Das Glitzerding in der Wand

Rollenspielszene. Nini, Sprinkle und Cory sind vor der Scawnbande geflohen und zwar direkt in das Höhlensystem in der Rinde des Weltbaums, in der sie den gesuchten Schatz vermuten. Das Höhlensystem ist ein Irrgarten, durchsetzt von magischen Fallen, und Gedächtniszaubern, die das Verirren sehr leicht machen.

An einer Stelle tut sich ein Abgrund auf. Als Zi Ri kann Nini fliegen und erkundet deshalb den Boden des Abgrunds sowie den Gang, der gegenüber weiter geht. Im Gang gegenüber findet zie etwas Glitzerndes das in der Wand aus Borke eingelassen ist. Es glitzert! Nini ist klar, dass das der Weg ist, den die Gruppe nehmen muss.

Die anderen schaffen es mit einem heraufbeschworenen Seil, die andere Seite zu erreichen. Sie schauen sich das aus ihrer Sicht recht unbemerkenswerte Glitzerding an und wollen da weiter. Nini will aber das Glitzerding haben! Zie krallt sich an dem Glitzerding fest, während Sprinkle sie wortwörtlich von ihm wegzerren muss.

Neeeein! Mein Glitzerding!

Flutter Web: Schlechte Idee

In meinem vorherigen Projekt auf der Arbeit war das Frontend eine Flutter-Web-App. Der Grund dafür war, dass der Kunde für alle Frontends Flutter verwendet, also auch für unsere App. Das war übrigens derselbe Kunde, der überall C# verwendet (ugh).

Flutter fing an als ein Framework für Mobile-Apps. Und zwar eins, in dem man Apps nur ein Mal schreiben musste, um sie dann sowohl fürAndroid als auch für iOS verwenden zu können. Den Wunsch danach kann ich verstehen. Um das zu erreichen, verwendet Flutter auch nicht die nativen Bibliotheken der beiden Betriebssysteme, sondern re-implementiert die komplette UI-Bibliothek (passt sich aber vom Aussehen her an das jeweilige System an). Man kann hier geteilter Meinung zu Flutter sein (ich finde es grundsätzlich nicht so schlimm, aber vermutlich hätte man denselben Effekt auch mit einer PWA haben können), aber immerhin erfüllt es seine Aufgabe recht brauchbar.

Aber dann ist jemand auf die Idee gekommen, Flutter auch zur Entwicklung von Web-Anwendungen einzusetzen. Und hier beginnen für mich die Schmerzen. Flutter Web verfolgt nämlich denselben Ansatz wie auf Android und iOS: Alles wird neu gemacht, es werden keine nativen Elemente verwendet. Und im Web bedeutet das: Kein HTML (bzw. das HTML nur als Rahmen), alle UI-Inhalte werden in ein <canvas>-Element gezeichnet.

Mit anderen Worten: Man wirft alle native Browser-Funktionalität weg (mehr noch als bei anderen One-Page-Apps) und muss jede Kleinigkeit mit in den ausgelieferten Code packen. Und das ist nicht wenig. Eine einfache „Hello World“-App ist schon gut 9 MiB groß, wenn sie optimiert wurde. Im Developer-Modus sind es eher 100 MiB. Und damit sind einige Sachen noch nicht enthalten. Zum Beispiel:

  • SVG-Rendering: Dafür muss man eine gesonderte Abhängigkeit einziehen
  • relative Stylegrößen wie em in CSS
  • Hyperlinks. Ja, Hyperlinks. Das Rückrat des Webs. Geht nicht ohne halbwegs komplizierten Code.

Andere Funktionen, die sonst nativ mit dem Browser kommen, wurden auch re-implementiert (irgendwie muss man ja auf die neun Megabyte kommen):

  • Navigation
  • UI-Rendering (wie schon erwähnt im Canvas)
  • responsiveness
  • Layout
  • Barrierefreiheit (auf dem Canvas ein großes Problem, man muss eine Menge manuellen Aufwand betreiben, um nur grundlegende Barrierefreiheitsfunktionen zu bekommen)
  • Form handling
  • Textauswahl (zum Kopieren)
  • Scrolling (!)
  • je nach Betriebssystemeinstellungen ist sogar das Rendern von Schriftarten ein Problem

Alles in Allem erinnert das an die Flash-Apps der späten 2000er. Wo Leute aus irgendeinem Grund die ganze Website in Flash geschrieben haben, anstatt in HTML. Groß, langsam, Kernfunktionen des Browser werden ignoriert. Und alles, damit man eine App nur ein Mal schreiben muss. Wisst ihr was? Genau dafür gibt es Progressive Web Apps (PWAs). Aber nein, hier muss das Rad unbedingt neu erfunden werden, es erzeugt gewaltige Mengen an JS-Code um ein schlechteres Ergebnis zu bekommn.

Ich bin froh, dass ich damit nicht mehr arbeiten muss (das Projekt selber war allerdings ganz interessant, da wäre ich auch geblieben). Ich kann nur empfehlen: Nutzt Flutter nicht für Web-Apps. Und grundsätzlich: Wenn ihr eine App wollte, die auf verschiedensten (insbesondere Android und iOS) Systemen läuft, überlegt euch, ob eine PWA vielleicht eine Option wäre.

Bye, Windows

Im Jahr 2007 habe ich das erste Mal dauerhaft eine Linuxinstallation auf meinem Computer gehabt. Ich hatte schon vorher mit Linux experimentiert, bin aber immer gescheitert, üblicherweise an der Bootloaded Dual-Boot-Konfiguration mit Windows. Damals war das ein SuSE Linux. Nach einem Jahr hatte ich die Schnauze voll von SuSE und bin auf Gentoo umgestiegen. Ich habe in der ersten Woche mit Gentoo mehr gelernt als in einem Jahr mit SuSE, und habe einen Freund dermaßen zugetextet, dass er meinte, ich solle doch ein Blog anfangen. Also habe ich ein Blog angefangen.

Ich nutze Linux also seit gut 19 Jahren. Und obwohl ich auf meinen Laptops seitdem immer nur Linux hatte (meinen ersten Laptop habe ich erst nach meinem Abitur, vor Beginn meines Informatikstudiums bekommen), habe ich trotzdem immer noch eine Kiste gehabt, auf der im Dualboot Windows und Linux liefen.

Warum Windows? Ich komme mit Linux viel besser klar, und kam auch 2018 schon mit Linux viel besser klar. Für alles, was ich mit einem Computer machen wollte, gab es unter Linux ein Programm, mit dem ich genausogut oder besser klar kam. Browser? Der gleiche Browser (obwohl ich ein paar Probleme mit Flash und Java-Applets hatte, aber die gehören ja mittlerweile der Vergangenheit an). Abspielen von Audiodateien? Kein Problem. DVDs anschauen? libdvdcss. Programmieren? Fast alles davon läuft besser unter Linux. Es lief also alles. Außer Computerspielen.

Ich spiele immer wieder gerne. Und Spiele sind nicht wie Browser, oder Audioplayer, oder Videoplayer. Wenn dir ein Spiel gefällt, gibt es üblicherweise keine Open-Source-Alternative. Abgesehen davon war der Grafikkartensupport unter Linux immer scheußlich. Nun, letzteres hat sich geändert, nicht zuletzt, weil zunächst Cryptocurrency-Bros und „AI“-Rechenzentrum plötzlich genau diese Art von Rechenleistung brauchten. Die Kompatibilität der Spiele blieb ein Problem. Gut, es gab Wine, aber das lief nur so mäßig gut.

Darum also Windows. Und warum möchte ich jetzt so dringen davon weg? Nun, mein Spielerechner von 2019 läuft noch mit Windows 10. Und für ein Update zu Windows 11 fehlt ihm ein Trusted Platform Module-Chip der Version 2. Ansonsten würde die Hardware das ohne Probleme schaffen. Außerdem gibt es einige andere Unannehmlichkeiten mit Windows 11: Man braucht einen Microsoft-Account, um sich auf dem Rechner lokal einzuloggen, Microsoft stopft es voll mit „AI“-Tools, die ich nicht will (Stichwort MS Recall)… die Liste lässt sich fortsetzen.

Jetzt möchte ich meinen Spielerechner aber eigentlich behalten. Die Hardware ist noch völlig ausreichend für alle Spiele, die ich spiele. Neue Hardware ist teuer, insbesondere weil ein paar gehypete Konzerne allen RAM auf dem Markt gekauft haben (oder zumindest versprochen haben, sie würden das tun). Steam hat die „Steam Machine“ angekündigt, ein Standrechner auf Linuxbasis, mit dem man alle möglichen Steam-Spiele spielen kann. Aber das wird ja auch teuer…

Nur: Wenn Steam es schafft, Windows-Spiele auf der eigenen Linux-basierten Plattform zum laufen zu bringen, dann ja sicher auch auch meinem eigenen Linux-System. Ich bin ja kein großer Steam-Fan, aber dass Steam seit 2012 Linux unterstützt kann ich ihnen wirklich nur hoch anrechnen. Nicht nur haben sie einen Linux-Client, nein, sie haben auch viele eigene Spiele (z.B. Portal) nach Linu portiert und Spieleentwickler dazu ermutigt, das auch zu tun. Und sie haben Wine genommen und es zu Proton weiterentwickelt, so dass es eine Kompatibilitätsschicht zwischen Windows-Spielen und Linux-Betriebssystemen gibt.

Also habe ich mich am Montag daran gesetzt. Ich hatte das alte Linux von 2019 sträflich vernachlässigt und nicht geupdated, also habe ich es mir einfach gemacht und die Linux-Partition mit einem neuen Ubuntu 2026.04 überbügelt. Und Steam installiert. Erste Tests liefen erfolgreich. Aber ein etwas aufwändigeres Spiel (Sea of Thieves) konnte ich erst gestern ausprobieren, weil das 130 GiB zum Download sind und ich den Download tagsüber nicht laufen lassen kann, weil ich von zu Hause arbeite (deutsches Internet halt).

Ich musste zunächst ein bisshen herumfummeln (die Proton-Version auf die letzte stabile Version fixieren anstelle die Unstable-Version zu nehmen) aber danach lief Sea of Thieves ohne Probleme. Und Proton funktioniert ja nicht nur mit über Steam installierten Spielen. Ich kann also meine alten Spiele, oder Spiele, die ich über andere Anbieter bezogen habe, auch spielen. Vielleicht probiere ich auch den Heroic Games Launcher aus, ein Open Source-Projekt, dass das noch etwas einfacher machen soll (ist bastle zwar gerne, aber bei manchen Sachen möchte ich, dass sie einfach funktionieren).

Also Das ist es. Nach 19 Jahren Linux kann ich endlich Windows verlassen. Good riddance!