Stranger Than Usual

REALLY NOT FEELIN UP TO IT RIGHT NOW. SORRY.

— Napstablook (Undertale)

Bahncardtortur im Abo

Ich habe mich ja schon letztes Jahr über die Tortur, eine Bahncard zu bekommen, geärgert. Die Bahncard ist ein Abo, also kriege ich sie dieses Jahr wieder. Ich musste sie schon per Rechnung bezahlen. Lastschrift wollten sie ja nicht. Aus reinem Hohn schwärmen sie mir jetzt vor, wie viel einfacher es mit Lastschrift wäre (no shit), und dass ich nur dieses SEPA-Mandat-Formular ausdrücken müsse, ausfüllen, und per Post an sie schicken. Einen Brief? Aus Papier? Und dann wird die Lastschrift-Option wieder abgelehnt? Nein danke.

Aber die Bahncard habe ich bezahlt, nur… wie komme ich an sie heran? Ich hatte ganz vergessen, dass das ja auch noch so eine Hürde war, wenn man kein Smartphone besitzt. Dabei ist es ganz einfach:

  • Melden Sie sich mit Ihrem Browser unter www.bahn.de/bcservices in Ihrem Kundenkonto mit Ihrer E-Mail-Adresse und Ihrem Passwort an
  • In Ihrem Kundenkonto im Bereich „BahnCard“ können Sie unter „Optionen“ und dann im Menüpunkt „Ersatzdokument anzeigen“ das Ersatzdokument abrufen
  • Danach erscheint die Übersichtsseite „Ihre BahnCard verwalten“. Hier klicken Sie auf den Button „Ersatzdokument anzeigen“
  • Das Ersatzdokument wird Ihnen nun als PDF angezeigt
  • Wahlweise können Sie das PDF nun ausdrucken oder digital mitführen und bei einer Kontrolle im Zug vorzeigen

Diese Anleitung steht in einer PDF-Datei. Eine Datei mit neun Seiten, acht davon Werbung, dass man auch die Bahn-App nehmen könne, die letzte hat die Anleitung, wie man sich die Bahncard als PDF herunterlädt. Das alleine ist schon nicht barrierefrei. Aber es ausgerechnet den Leuten ohne Smartphone (die mit einer höheren Wahrscheinlichkeit nicht besonders computeraffin sind) einen so versteckten Weg zu bieten, das Ersatzticket herunterzuladen, ist eine Frechheit.

Die Anleitung ist die gleiche wie letztes Jahr, und damals habe ich mich auch schon darüber geärgert. Dieses Mal habe ich die Anleitung auch verlinkt und zitiert, in der Hoffnung, dass ich sie nächstes Jahr besser wiederfinde.

Hitze, Wasser, Abkühlung

Die Hitzewelle geht um. Ich habe ja nie verstanden, warum Leute bei Hitze eisgekühlte Getränke haben wollen. Gut, manche Getränke schmecken kalt vielleicht besser. Aber die meisten Getränke sind meiner Meinung nach bei etwa 20 °C besser zu genießen. Und vor allem: Getränke bei Zimmertemperatur kann ich wegkippen wie sonstwas. Ein Liter ist da schnell weg. Kalte Getränke hingegen kann ich nur in Maßen trinken, weil es unangenehm ist, so schnell so viel Kaltes zu trinken. Ich bin nicht der Einzige, dem es so geht.

Ähnlich ist es beim Duschen. Eine erfrischende Dusche an einem heißen Tag kann gut helfen, die Körpertemperatur herunterzuregeln. Wenn man aber eiskalt duscht, stellt sich der Körper auf kalte Temperaturen ein und versucht, Wärme zu sparen, es wird also kurz nach der Dusche noch heißer. Eine lauwarme bis leicht kühle Dusche ist wirksamer.

Und wo wir gerade dabei sind, populäre Irrtümer aufzuklären: Leere Pizzakartons dürfen ins Altpapier. Mit ein paar Fettflecken kommt die Altpapierverwertung ohne Probleme klar. Essensreste sollten natürlich nicht mehr im Karton sein.

War das ein bisschen zusammenhanglos? Ja. Es ist aber auch zu heiß um viel zu denken. Ich trinke jetzt ein Glas Wasser auf Zimmertemperatur.

Ssänk ju for…

Die deutsche Bahn hat anscheinend einen neuen Spruch. Ganz früher war es

Ssänk ju for träwelling wiss deutsche Bahn.

Bis vor kurzem war es immer

Ssänk ju for tschusing deutsche Bahn todäi.

Und heute höre ich an jedem Bahnhof

Ssänk ju for bi-ing aua gest todäi.

Mal sehen, ob das eine dauerhafte Änderung ist.

PS: Ich musste meine Bahnreise kurzfristig verschieben, was ein Glück war, denn so konnte ich den bundesweiten Bahnausfall gestern vermeiden.

HTTP/3 stats

Ich habe ja Ende April für dieses Blog HTTP/3 aktiviert. Ich hatte damals schon ein paar Performancetests gemacht, aber ich wollt die noch einmal ein bisschen ordentlicher machen. Das habe ich jetzt gemacht.

Vorweg: der mit Ubuntu ausgelieferte curl-Build hat die HTTP/3-Option nicht aktiviert. Ich hatte gehofft, dass das mit Ubuntu 26.04 anders werden würde, doch dem war nicht so. Also habe ich die Tests von einem Raspberry Pi 3 aus laufen lassen. Dieser Pi ist per Wifi an mein Netzwerk angeschlossen.

Messreihe 1: Mit offen gehaltener Verbindung

Ich benutzer wieder hyperfine um die Messungen zu machen, denn die Messwerte schwanken oft sehr stark. Ich lade mit curl eine JPEG-Datei aus dem Kochprojekt von diesem Blog. Die Hyperfine-Option -w 1 bedeutet, dass erst einmal ein „Warmup“ durchgeführt wird, bevor die Zeit gemessen wird. Das hilft, damit der Server die Datei schon geladen hat, außerdem hält sich curl selber Verbindungen offen. Also starten wir mal:

$ hyperfine -w 1 "curl --http1.1 https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null"
Benchmark 1: curl --http1.1 https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null
  Time (mean ± σ):     337.0 ms ±  14.5 ms    [User: 123.0 ms, System: 20.3 ms]
  Range (min … max):   318.6 ms … 359.5 ms    10 runs

Explizit auf HTTP/1.1 gesetzt, im Mittel 337 ms. Als nächstes HTTP/2:

$ hyperfine -w 1 "curl --http2-prior-knowledge https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null"
Benchmark 1: curl --http2-prior-knowledge https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null
  Time (mean ± σ):     354.2 ms ±  22.3 ms    [User: 124.4 ms, System: 19.9 ms]
  Range (min … max):   331.4 ms … 404.2 ms    10 runs

Hmm… 354 ms und höhere Varianz. Sollte das nicht eigentlich schneller gehen? Naja, probieren wir mal HTTP/3:

$ hyperfine -w 1 "curl --http3-only https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null"
Benchmark 1: curl --http3-only https://blog.strangerthanusual.de/file/kochprojekt_9_07.jpg > /dev/null
  Time (mean ± σ):     383.4 ms ±  20.7 ms    [User: 142.1 ms, System: 23.0 ms]
  Range (min … max):   364.1 ms … 425.6 ms    10 runs

Noch langsamer. Aber warum?

Warum sind diese Werte mit Vorsicht zu genießen?

Ich habe hier nur einen Testfall gehabt: Eine Datei geladen, sequenziell, mit derselben Verbindung. Hier gibt es mehrere Probleme:

  1. HTTP/3 hat weniger Round-Trips beim Verbindungsaufbau. Wir nutzen hier aber nur eine Verbindung, die wir vorher initialisieren.
  2. HTTP/3 und HTTP/2 können über dieselbe Verbindung parallel Anfragen stellen. Das machen wir hier aber nicht, sondern stellen alle Nachfragen nacheinander
  3. Die Vorteile von HTTP/3 sind am größten bei schlechtem Netz. Ich habe aber recht stabiles Netz hier, trotz Wifi.

Punkt 2 hier zu testen ist mir gerade zu doof. Aber vielleicht kann man ja jedes Mal eine neue Verbindung nehmen? Wie sieht es dann aus?

Messreihe 2: Ohne Verbindungscache

Disclaimer: Es kann sehr gut sein, dass ich falsch verstanden habe, wie curl Verbindungscaches behandelt, aber --no-keepalive hat keinen nennenswerten Unterschied gemacht. Also vielleicht probiere ich doch einmal das Parallelladen.

Messreihe 3: Mehrere Dateien anfragen

Wenn man eine Website aufruft, werden ja üblicherweise mehrere Dateien geladen. HTML, CSS, Bilder, Javascript, … ich habe das mal unvollständig simuliert:

$ hyperfine -w 1 "curl --parallel --no-keepalive --http1.1 'https://blog.strangerthanusual.de/blogposts/92' 'https://blog.strangerthanusual.de/assets/style.css?cache=3440db11c282e87069ad25da8143b4a4a7729799639d35efe4781159757275fc' 'https://blog.strangerthanusual.de/file/kochprojekt_9_01.jpg' 'https://blog.strangerthanusual.de/file/kochprojekt_9_02.jpg' 'https://blog.strangerthanusual.de/assets/favicon.svg?cache=ad19a16b8769e48ca81229ccdf62e9f59c51e1e4d1130bfa6c59d05cda9a0dd9' > /dev/null"
Benchmark 1: curl --parallel --no-keepalive --http1.1 'https://blog.strangerthanusual.de/blogposts/92' 'https://blog.strangerthanusual.de/assets/style.css?cache=3440db11c282e87069ad25da8143b4a4a7729799639d35efe4781159757275fc' 'https://blog.strangerthanusual.de/file/kochprojekt_9_01.jpg' 'https://blog.strangerthanusual.de/file/kochprojekt_9_02.jpg' 'https://blog.strangerthanusual.de/assets/favicon.svg?cache=ad19a16b8769e48ca81229ccdf62e9f59c51e1e4d1130bfa6c59d05cda9a0dd9' > /dev/null
  Time (mean ± σ):     660.9 ms ±  11.6 ms    [User: 431.8 ms, System: 44.0 ms]
  Range (min … max):   649.8 ms … 681.8 ms    10 runs

660 ms also. Für HTTP/2 sind es hingegen nur 385 ms und für HTTP/3 sind es 437 ms. Wie man erwarten konnte schneidet HTTP/1.1 hier deutlich schlechter ab als HTTP/2 und 3, aber HTTP/3 ist auch deutlich schlechter als 2. Warum? Ich weiß es nicht, ich kann nur Mutmaßungen anstellen.

Mögliche Gründe, warum HTTP/3 hier langsamer ist

  1. die HTTP/3-Implementierung in curl (client) ist nicht so gut optimiert wie die für HTTP/2
  2. die HTTP/3-Implementierung in nginx (server) ist nicht so gut optimiert wie die für HTTP/2
  3. ich habe irgendwo beim Konfigurieren von nginx oder bei den Parametern von curl etwas falsch gemacht. Zweiteres ist unwahrscheinlich, weil Browser mir das gleiche Bild liefern
  4. Für diesen Use-Case ist HTTP/2 einfach besser und HTTP/3 glänzt an anderen Stellen

Die Liste ist nicht erschöpfend, ich gibt sicher noch weitere Möglichkeiten. Wie gesagt, ich weiß es nicht. Ich werde die Sache einfach weiterhin beobachten.

Save a Roundtrip

Was ich neulich auch gefunden haben savearoundtrip.com. Dort wird beschrieben, dass es auch noch eine DNS-Konfguration machen kann um dem Client noch schneller mitzuteilen, dass der Server HTTP/3 unterstützt. Werde ich für meinen Server vielleicht irgendwann mal scharf schalten, aber vorerst noch nicht. Für meine kleinen Experimente oben hat das eh keinen Unteschied gemacht, weil ich hier curl dazu gezwungen habe, bestimmte HTTP-Versionen zu nehmen.

Rollenspielszenen: Verdorben und fermentiert

Rollenspielszene. Wir sind von Flussauge aus weiter zur Elfenhauptstadt Tha'ela gereist und sind jetzt endlich wieder zu Hause. Da wir in den Feenwelten waren, werden wir jetzt geprüft, ob uns nicht irgendwelche Feenflüche oder Feenpakte anhängen. Dazu dient auch eine Zone der Wahrheit, die aber zeitlich begrenzt ist.

Eine der Fragen war, ob wir mit Anhängern verdorbener Gottheiten zu tun gehabt haben. Therith meinte, sie sei eher ein Anhänger verdorbener Getränke. Prattle schaltet sich ein:

Verdorben und fermentiert sind zwei verschiedene Dinge, sieh, der Unterschied ist…

Mavas:

Wir sind nicht hier um über Braukunst zu reden!

Bahnhoroskop

Horoskope funktionieren, wie alle Formen von Wahrsagung, am besten, wenn man sie nach dem Ereignis stellt, das sie voraussagen sollten. Für Verspätungen der deutschen Bahn gilt das gleiche.

Deswegen hat jetzt jemand ein Bahnhoroskop entworfen: Man gibt ein, um welche Uhrzeit ein Zug hätte ankommen sollen und wieviel Verspätung er gehabt hat, und bekommt ein Horoskop, dass anhand der echten Sternen- Mond- und Planetenpositionen am Himmel ausgibt, warum der Zug Verspätung hatte. Beispiel:

Grund für die Verzögerung ist der Spannungsaspekt von Mond und Merkur. Während Mondknoten in Konjunktion zum Neptun steht, bleibt die Abfahrt ausgesetzt. Erst unter dem Trigon der Sonne zum Jupiter klärt sich die Lage, wodurch die Fahrt fortgesetzt werden kann.

Kommentar des Autors:

Die Deutsche Bahn hat laut offiziellem Katalog 65 Gründe für Zugverspätungen („Reparatur an einem Signal” etc.). Mir waren die alle zu konkret. Deshalb gibt es jetzt das „Bahnhoroskop”.

Mit ein bisschen Glück gibt es bald auch einen Bot, der die Horoskope für echte Zugverspätungen automatisch berechnet.

SVG-Favicon auf Firefox for Android

Ich hatte mich Anfang des Jahres noch darüber geärgert, dass Firefox for Android keine SVG-Favicons unterstützt.

Als ich gestern an meinem neuen Kochbuch gearbeitet habe, habe ich dann festgestellt, dass das SVG-Favicon auch unter Android geht! Und tatsächlich auch caniuse.com listet jetzt, dass Firefox for Android SVG-Favicons unterstützt. Mozilla muss das irgendwann dieses Jahr in ein Update hineingeschlichen haben. Ich habe noch nicht herausgefunden, wann, aber Anfang des Jahres ging es noch nicht und jetzt geht es endlich.

Jetzt gibt es also keinen echten Grund mehr, warum ich neben SVG-Favicons noch andere Formate anbieten soll. Naja, bis auf dass auf 16×16 oder 32×32 gerenderte SVGs oft schlecht erkennbar sind. Aber da helfen auch andere Formate nichts, weil meiner Erfahrung nach Browser trotzdem immer die SVG-Variante anzeigen, wenn es eine gibt.

Kochbuch

TL;DR: Ich habe endlich angefangen, meine Rezeptsammlung in eine Website zu fassen. Die Seite ist noch im Aufbau und die Anzahl der Rezepte bisher klein. Hier ist die Rezeptsammlung.

Schon als ich vor Jahren Das Kochbuch für Geeks von Mela Eckenfels & Petra Hildebrandt gelesen habe, hatte ich vor, meine Rezepte einmal digital zu ordnen. Dort schreiben die Autorinnen in Kapitel 1.7:

Das Problem lösen wir, so wie Geeks alle Probleme lösen – mit einer Datenbank.

Nun, in meinem Familienumkreis gibt es keine solche Datenbank. Meine Mutter hat mehrere Ordner mit Rezepten, mal handschriftlich, mal Kopien oder Ausschnitte aus irgendwelchen Zeitschriften. Meine Schwester hat ihre Rezepte ordentlich handschriftlich abgeschrieben. Beides ist nicht mein Ding.

Also habe ich bisher alle Rezepte digital (außer denen, die in Kochbüchern stehen) in der einen oder anderen Form. Das Dumme: Ich habe jetzt ein paar Rezepte in diesem Blog als Teil meines Kochprojekts, andere Rezepte in Emails, die mir jemand mal geschickt hat, als Weblinks zu Seiten wie Chefkoch, die mit Adblocker immer unbenutzbarer wird und in einem Ordner mit einem Haufen Dateien verschiedener Formate. Bildateien mit Scans oder Fotos von Rezepten. PDF-Dateien mit Scans von Rezepten oder den Rezepten in Textform. MS-Word-Dokumente, Libreoffice-Dokumente, unstruktierte Textdateien und ein paar Markdown-Dateien.

Eigentlich wäre es ja schön, die Rezepte wie in dem Kochbuch empfohlen in eine ordentliche Datenbank zu legen. Aber gute Standardformate für Rezepte konnte ich zumindest damals nicht finden. Die bestehenden Rezeptprogramme konnten mich auch nicht überzeugen. Und selber ein Format zu entwickeln oder ein Datenbankschema zu entwerfen… naja.

Also habe ich das Thema schleifen lassen. Bis es mir zu dumm wurde. Machen wir es einfach: Ein Rezept ist eine Markdown-Datei mit Metadaten. Wenn ich Zutaten durchsuchbar haben möchte, gebe ich die halt separat in den Metadaten an. Und dann einen static site generator nehmen, um daraus eine Seite zu generieren. Und siehe da: Nach ein paar Stunden Arbeit habe ich schon eine brauchbare Seite. Ich habe wieder Hugo als Generator genommen. Seit dem letzten Mal, dass ich eine Seite mit Hugo aufgesetzt habe hat sich da ein bisschen was getan, aber das war nur ein kleines Hindernis.

Die Seite ist noch nicht fertig und hat momentan gerade mal zwei Rezepte, aber sie ist schon benutzbar. Das ist ein guter Anfang.

simple.css

Ich hatte heute Morgen ja schon simple.css von Kev Quirk erwähnt. Das bietet wirklich eine gute Grundlage, wenn man einfach nur eine Seite mit einem brauchbaren Layout haben möchte. Man muss sich größtenteils nicht mit Klassen abgeben, semantische Elemente wie <nav>, <header>, <main>, <article> und <section> sorgen schon alleine für ein gutes Layout.

simple.css ist recht klein (etwa 15 KiB), und ich habe es noch kleiner gekriegt, indem ich Styling für interaktive Elemente wie Eingabefelder entfernt habe. Mit über 6 kiB am Ende ist es immer noch größer als das CSS dieses Blogs, aber dafür musste ich fast keine Arbeit investieren und habe sehr viele Style-Randfälle abgedeckt, inklusive darkmode. Wenn ich Details ändern will, kann (und werde) ich das noch tun, aber für den Start ist es wirklich gut.

Chef Blook

Natürlich brauchte ich auch ein Favicon. Also musste mein Napstablook-SVG mal wieder ran. Ich habe Napstablook eine Kochmütze verpasst:

Napstablook (ein deprimierter Geist) mit einer Kochmütze.

Fazit

  • Die Rezeptsammlung nicht verkomplizieren. Eine einfache Website mit einem Rezept pro Seite ist gut.
  • Ich kann so nicht nur selber überall auf meine Rezepte zugreifen, ich kann sie auch einfach weiterreichen.
  • Die Seite ist noch im Aufbau, an einigen Stellen muss ich noch am Layout und an der Übersichtlichkeit schrauben.
  • Vor allem aber muss ich die Seite mit Rezepten füllen. Das werde ich nach und nach machen, es wird also eher im Zeitraum von Monaten als von Tagen passieren. Ich habe nur wenige der Rezepte schon als Markdown.

Nicht Riesenbärenklau?

Ich stolpere immer mal wieder über Kev Quirk, IT-Sicherheitsexperten und Blogger. Gestern bin ich wieder auf ihn gestoßen, weil er simple.css veröffentlich hat, eine CSS-Datei, die ein einfaches, responsives Layout bereitstellt. Ich bastle gerade an etwas und wollte nicht wieder alles CSS von vorne schreiben, da bietet simple.css eine schöne Grundlage. Es ist auch recht klein (15 kiB nicht-minifiziert). Man braucht auch keine Klassen für sein HTML, wenn man semantisches HTML schreibt, sieht es schon von alleine gut aus. Doch dazu in einem anderen Post mehr.

Jedenfalls hatte Kev Quirk vor Kurzem in einem Post gefragt, ob eine Pflanze, die auf seinem Grundstück wächst, Riesenbärenklau sei und er etwas unternehmen müsse. Riesenbärenklau ist hier im Ruhrgebiet leider überall anzutreffen, besonders in der Nähe der Ruhr. Deswegen kenne ich dessen Aussehen sehr gut, und die Pflanze auf dem Foto sah zwar ähnlich aus, aber nicht wie Riesenbärenklau. Also eine andere Art von Bärenklau?

Naja, wenn jemand von meinen Lesern hier mehr Ahnung hat: Schaut doch auf Kevs Blog vorbei und schreibt ihm euer Urteil, ich glaube, er würde sich freuen.

Rollenspielszenen: Der Remorshka-Raum

Rollenspielszene. Die Abenteurergruppe hat sich durch einen gefährlichen Irrgarten mit fiesen Gedächtniszaubern gekämpft und steht jetzt in einem Raum, von dem ein kleiner Durchgang zu einem weiteren Raum führt.

Der weitere Raum enthält ein Remorshka, eine Art Mischung aus riesiger Krabbe und Tiger (Tigerkörper, Krabbenkopf und ~scheren) mit einem flammenden Schweif. Ein extrem gefährliches Biest, das aber wie eingefroren in der Mitte des Raumes steht, nicht einmal das Feuer am Schweif flackert. Am gegenüberliegenden Ende des Raums ist eine durchsichtige Tür, hinter der man einen Schatz glitzern sehen kann. Zwei Scawn berichten, dass das Remorshka aktiv wird, sobald sich jemand an der Tür zu schaffen macht. Die untere Hälfte eines von einer Krabbenscherw durchtrennten Scawns deuten darauf hin, dass die anderen Scawn die Wahrheit sagen.

Cory hat schon einen Blick in den Raum mit dem Remorshka geworfen. Er hat den Schatz glitzern sehen und weiß: Nini, besessen von Glitzerdingern darf den Schatz nicht sehen, weil zie sonst selbstvergessen die Tür öffnen würde. Cory erzählt Nini also, wie gefährlich die Krabbe und wie schauderhaft der durchtrennte Scawn aussieht, und zie keinen Blick in den Raum werfen solle. Nini, als Heiler, hat schon schlimme Dinge gesehen und ist nicht überzeugt. Also springt Sprinkles in die Bresche und will bei der Überzeugungsarbeit helfen:

Sprinkles: „Die Krabbe ist super gruselig!“
Nini: „Du hast doch noch garnicht in den Raum geschaut!“