Stranger Than Usual

Advertising is the graffiti of the rich.

Slopc: Humor oder Horror?

Es gibt ja in letzter Zeit immer wieder Diskussionen über Codegenerierung durch LLMs und „Vibe Coding“, also das LLM nicht nur kleine Teile des Codes, sondern gleich mehr oder weniger das ganze Projekt generieren zu lassen (man sollte meinen, dass zumindest letzteres das offensichtlich eine schlechte Idee ist. Ist es auch, nur ist es für manche Menschen anscheinend nicht so offensichtlich).

Um diesen Prozess jetzt zu vereinfachen, hat jemand das slopc-crate für Rust geschrieben. Einfach das #[slop]-Makro vor eine Funktion setzen, und das Makro erzeugt mithilfe eines LLMs alle todo!-Makros durch LLM-generierten code, indem es den Doc-Kommentar der Funktion als Teil eines Prompt nutzt.

Die Inspiration dafür beschreibt der Autor so:

[…] felt like discovering your car has heated seat after 2 years on a lease. But then the intrusive thoughts came in: What if those heated seats were LLM driven, on fire, and the car is now driving itself into oncoming traffic ?

The voices in my head drove me to draft up some cursed proc-macro that would make my coworkers (me and my 2 cats) loose all the respect and faith they have for my technical skills.

HTTP 3

HTTP 3. Eigentlich ist die Schreibweise „HTTP/3“, aber mich irritiert das immer. Wie soll man das denn aussprechen? „HTTP geteilt durch drei“? Oder „HTTP oder drei“? Warum ist da ein Schrägstrich?

Ist ja auch egal. Zu HTTP 3 gibt es unterschiedliche Meinungen. Auf der einen Seite gibt es Leute, die meinen, HTTP 3 sei zu komplex (und damit ein Sicherheitsrisiko), würde nur dann etwas bringen, wenn man ganz bestimmte Anforderungen hat oder sei sowieso doof, weil Google zu sehr seine Finger im Spiel hatte. Auf der anderen Seite gibt es Leute, die sagen, man müsse es unbedingt nutzen, weil es alles so viel schneller macht und ja sowieso das Neueste und Beste ist, und wer sich dagegen ausspricht sei ein zurückgebliebener Maschinenstürmer (wen überhaupt die Möglichkeit in Betracht gezogen wird, dass sich jemand dagegen aussprechen könnte). Dazwischen gibt es eine ganze Menge nuancierter Meinungen.

Ich selbst spiele schon seit einer Weile mit dem Gedanken, es für mein Blog einfach mal auszuprobieren. Es scheiterte immer wieder daran, dass die nginx-Version auf meinem Server das Feature nicht aktiviert hatte und ich definitiv keine nginx-Version installieren wollte, die nicht aus dem Paketmanager stammt (wegen des Wartungsaufwands). So ähnlich ging es mir ja auch mit Brotli, wobei ich Brotli wirklich dringend nutzen wollte, während HTTP 3 nur ein „probieren wir es mal“ ist.

Zwischenspiel: HTTP 2 und nginx

Ich nutze nginx als HTTP-Server. Um sicherzustellen, dass meine nginx-Konfiguration gültig ist, habe ich /usr/sbin/nginx -t ausgeführt. Ergebnis, ohne dass ich irgendwas geändert hätte:

the "listen ... http2" directive is deprecated, use the "http2" directive instead in [REDACTED]

Ok, kurz nachgeschaut und diese Zeilen hier

listen 443 ssl http2;
listen [::]:443 ssl http2;

Durch diese ersetzt:

listen 443 ssl;
listen [::]:443 ssl;
http2 on;

Selbst wenn das mit dem HTTP 3 also nichts werden sollte habe ich immerhin meine nginx-Config auf den aktuellen Stand gebracht.

HTTP 3 mit nginx

Ich habe nach der offiziellen nginx-Dokumentation zu HTTP 3 gearbeitet. Der wichtigste Teil ist, hinter diesen Zeilen, die für HTTP 1 und 2 zuständig sind:

listen 443 ssl;
listen [::]:443 ssl;

Diese beiden Zeilen einzufügen:

listen 443 quic reuseport;
listen [::]:443 quic reuseport;

WICHTIG: Hier habe ich ein bisschen kämpfen müssen. Ohne reuseport funktionierte es bei mir überhaupt nicht. Es wird allerdings überall davor gewarnt, reuseport mehr als ein Mal zu verwenden. Ich habe in meiner nginx-config aber mehrere virtuelle Server. Kann ich dann nicht alle mit HTTP 3 betreiben? Doch, natürlich kann ich das. Aber es muss genau einer davon reuseport definiert haben (pro port + IP-Version).

Dann kann man noch ein paar weitere Optionen setzen, zum Beispiel diese hier:

quic_retry on; 
ssl_early_data on; 
quic_gso on; 
add_header Alt-Svc 'h3=":443"; ma=86400';

Die ersten drei sind optional und sollten die Performance verbessern oder so. Speziell die dritte funktioniert nur unter Linux. Die vierte Option, der Alt-Svc header hingegen ist recht wichtig. Denn ohne den erkennen User-Agents (z.B. Browser) nicht, dass es neben der HTTP 1 bzw. 2-Verbindung auch noch eine HTTP 3-Option gibt. HTTP 3 läuft über ein komplett anderes Transport-Layer-Protokoll (UDP statt TCP). Während bei HTTP 1 also ein Update zu HTTP 2 über das Protokoll selber sehr einfach möglich ist ohne auch nur die TCP-Verbindung neu zu verhandeln, geht das bei HTTP 3 nicht. Ohne diesen Header wird also vermutlich kaum ein Browser probieren, HTTP 3 zu verwenden. ma=86400 bedeutet, dass sich der User-Agent das für 86400 Sekunden (also 24 Stunden) merken soll. Vielleicht drehe ich das später mal höher, wenn HTTP 3 bei mir über längere Zeit stabil läuft.

Testen mit curl

Bevor ich diesen Alt-Svc-Header aber gesetzt habe, wollte ich wissen, ob HTTP 3 auch stabil läuft (was gut war, denn zunächst lief es wegen der reuseport-Sachen nicht stabil). Dazu wollte ich curl verwenden. Bei meinem Ubuntu 25.10 ist curl aber leider noch ohne HTTP 3-Unterstützung gebaut. Das kann man mit curl --version herausfinden. Wenn da unter features nirgendwo HTTP 3 gelistet ist, kann dieses curl kein HTTP 3.

Ironischerweise hat ausgerechnet mein Server selber eine curl-Version mit HTTP 3-Unterstützung. Ironischerweise, weil der Server mit Debian läuft und Debian eigentlich notorisch dafür ist, alte („stable“) Versionen zu benutzen. Die curl-Version ist übrigens die gleiche wie auf Ubuntu, aber halt mit HTTP 3-Support gebaut.

So konnte ich dann mit diesen beiden Befehlen (jeweils für IPv4 bzw. IPv6) testen, ob es geht:

curl -4 --http3-only -v https://blog.strangerthanusual.de/
curl -6 --http3-only -v https://blog.strangerthanusual.de/

Bei Erfolg bekam ich eine ganz normale HTTP-Antwort. Ohne reuseport kam nur

Failed to connect to blog.strangerthanusual.de port 443 after 30055 ms: Could not connect to server

Wie geht es weiter?

Ich lasse das jetzt erst einmal eine Weile so laufen und schaue mir an, wie gut es läuft. Ich werde das allerdings nicht rigoros monitoren oder methodisch korrekt untersuchen. Wenn es gut läuft, werde ich vielleicht noch einen HTTP Resource Record in meine DNS-Config packen, so dass User-Agents schon bei der Adressaufösung mitbekommen, dass hier HTTP 3 angeboten wird.

Nicht verschweigen möchte ich, dass ich bei meinen Recherchen auf Berichte zu einem Bug gestoßen bin, der in Kombination mit reuseport und soft-reload der nginx-Konfiguration Probleme bereitet. Also sollte ich hier ein bisschen vorsichtig sein.

Aber immerhin. Firefox nutzt gerade schon mit Freude die HTTP 3-Verbindung. Wie viel mir das jetzt tatsächlich bringt sei mal dahingestellt.

Käsekuchenkarte

Ich hatte gestern Abend eine Rollenspielrunde. Perfekte Gelegenheit um etwas zu backen. Da einer der Spieler Veganer ist und ich einige Wochen vorher auf Mastodon auf ein veganes Käsekuchenrezept gestoßen bin, habe ich einen Käsekuchen gebacken. Um die Vorfreude anzufeuern habe ich ein Foto gemacht und in die Signal-Gruppe geposted.

Ein Käsekuchen in einer Springform, von oben fotografiert.

Dieses war der erste Streich, doch der zweite folgt sogleich!

Schritt 2: Ein Bildausschnitt

Dann bin ich auf eine Idee gekommen. Inspiriert dazu hat mich „Alternative Moons“. Um die Idee umzusetzen brauchte ich aber erst einmal einen Bildausschnitt mit nur dem Käsekuchen:

Ein ellipsenförmiger Ausschnitt des Käsekuchens von oben. Der Rahmen ist nicht mehr zu sehen, nur noch der Käsekuchen

Schritt 3: Vollmond

Im nächsten Schritt habe ich das Kuchenbild in Graustufen umgewandelt. Es sieht ein bisschen wie der Mond aus, oder?

Derselbe Bildausschnitt wie vorhin, aber in Graustufen

Schritt 4: Farbe

Ein Mond ist schön und gut, aber mein Ziel ist eine Weltkarte. Vielleicht für eine Fantasywelt oder so. Ich habe ein bisschen mit der „select by color“-Funktion von Gimp herumgespielt und das Wasser vom Land getrennt. Beim Land habe ich dann die Grauwerte invertiert, damit es auf beiden Seiten dunkle Flächen gibt. Den Ozean habe ich dann blau, die Landfläche bräunlich eingefärbt.

Derselbe Bildausschnitt wie vorhin, aber ein großer Teil der Fläche ist jetzt in Blautönen, der Rest in Brauntönen. Es sieht aus wie eine Weltkarte mit Ozean, einem Kontinent und ein paar Inseln.

Schritt 5: Mehr Farbe

So ganz einfarbig ist der Kontinent langweilig. Ich habe noch ein bisschen mit der Auswahlfunktion von Gimp herumgespielt und eine Teilauswahl des Landes genommen, die ich stattdessen grün eingefärbt habe. Die braunen Flächen halten sich jetzt in Grenzen, setzen aber Akzente.

Dieselbe „Weltkarte“ wie vorhin, aber die Landflächen sind jetzt größtenteils in Grüntönen. Hier und da gibt es aber auch bräunliche Flächen.

Ich habe die Bilder in voller Größe auf Pixelfed.de geposted.

Rollenspielszenen: Summen

Rollenspielszene: Nini das Ziri und Sprinkle der Orren sind angeheuert worden, um bei der Suche nach einem versteckten Schatz zu suchen. Dummerweise haben ein Haufen Scawn ebenfalls Wind von dem Schatz bekommen und den Rassimelarchäologen Cory entführt, der ihnen bei der Schatzsuche helfen soll.

Mitten in der Nacht schleicht sich Nini an das Lager der Scawn an, um Cory zu befreien. Nini kann dank eines Zaubers im Dunkeln sehen, die Scawn nicht. Nini ist noch kleiner als die Scawn. Nini hat sich mit Dreck eingerieben, um schlechter sichtbar zu sein. Nini ist nicht mehr als ein Schatten in der Dunkelheit. Nini ist cool! Nini beginnt, eine Actionmusik zu summen, um ziener Coolheit Ausdruck zu verleihen.

Die Scawn, die Cory bewachen, wundern sich über die Actionmusik und entdecken Nini. Innerhalb kürzester Zeit ist das halbe Lager auf den Beinen.

Soßenerfolg

2014 habe ich in meinem damaligen Kochprojekt Spargel mit holländischer Soße gemacht. Damals hatte ich Hilfe. Seitdem habe ich mehr oder weniger jedes Jahr versucht, die holländische Soße alleine hinzukriegen. Aber sie war nie richtig cremig, immer zu flüssig.

Schwierig daran, das Rezept richtig zu lernen war, dass ich eigentlich nur etwa ein Mal im Jahr überhaupt versuche, diese Soße zu machen. Bis ich es dann wieder versuche, habe ich längst vergessen, was ich anders machen sollte als beim vorherigen Mal. Aber dieses Jahr habe ich es endlich geschafft:

Ein Teller, auf dem drei Stangen Spargel und eine kleine Kartoffel liegen, mit einer Soße bedeckt.

Ein wichtiger Unterschied zu meinem damals aufgeschriebenen Rezept: Ich habe den Weißwein und das Eigelb zuerst schon schaumig geschlagen, und erst dann im Wasserbad unter Rühren erhitzt. Der Rest ist identisch.

Spargel schälen kann ich hingegen immer noch nicht wirklich gut.

Alternative Arithmetik

Im dystopischen Roman 1984 von George Orwell ist eine der Strategien, wie die Partei die Macht behält, die Kontrolle der Realität der Menschen. Selbst etwas falsches zu denken ist ein Verbrechen. Es wird sogar an einer Sprache, „Neusprech“ gearbeitet, in der es unmöglich sein soll, unerwünschte Gedanken auch nur auszudrücken.

Eines der Beispiele, dass im Buch genannt wird, ist 2 + 2 = 4. Und wenn die Partei sagt, dass 2 + 2 = 5 ist, dann ist das so, und die Menschen sollen es mit voller Überzeugung glauben. Trotzdem sollen sie, wenn es für ihre Aufgaben nötig ist, weiterhin an 2 + 2 = 4 glauben. Das wird in Neusprech als „Doppeldenk“ bezeichnet: Die Fähigkeit, zwei widersprüchliche Informationen im Kopf zu halten und beide für wahr zu erachten.

Dieses Beispiel sollte wohl darstellen, wir absolut grundlegende Wahrheiten komplett verdreht werden können. Und ich habe es immer für eine dystopische Übertreibung gehalten. Bis Robert Fucking Kennedy Junior neulich in einer Senatsanhörung allen ernstes behauptet hat, dass es mehrere Arten gibt, Prozentrechnung zu betreiben und in einer davon sei eine Reduzierung von 600 Dollar auf 10 Dollar 600%.

Allein die Tatsache, dass Politifact sich dazu genötigt sah, zu dieser Aussage einen Faktencheck zu machen (Ergebnis: natürlich „Pants on Fire“) sagt eigentlich schon alles. Nämlich das wir jetzt Faktenchecks brauchen, um offensichtliche, objektive Falschaussagen über FUCKING ARITHMETIK bloßzustellen. Wir sind natürlich noch nicht auf 1984-Niveau, schließlich darf man diese Faktenchecks noch machen. Aber eigentlich sollte so eine Aussage den Gesundheitsminister sofort für irgendein Amt disqualifizieren.

Vor zehn Jahren hatte ich nichts bis kaum etwas über Donald Trump gehört. Wenn mir damals jemand gesagt hätte, dass zehn Jahre später der US-Präsident ein Klimawandelleugner wäre, hätte ich mich nicht gewundert. Wenn mir jemand gesagt hätte, dass der US-Gesundheitsminister ein Impfleugner sein wird, hätte ich mich auch nicht gewundert. Wenn mir aber jemand gesagt hätte, dass der US-Gesundheitsminister auf einer Senatsanhörung diese abgedrehte 600%-Rechnung des US-Präsidenten offiziell verteidigt, hätte ich diese Person für verrückt erklärt.

Jetzt erkläre ich mich selber für verrückt. Ich verstehe schon seit Jahren die Welt nicht mehr, und es wird nicht besser. Das alles ist doch nicht normal! Wir dürfen uns nicht daran gewöhnen, dass das normal wird, sonst wird es normal.

PS: Meine Vermutung ist, dass Kennedy mit der kaputten Prozentrechnung nur verhindern wollte, dass er die Frage von Senatorin Warren beantworten musste, warum ein Medikament, dass in Trumps ach so tollem, um 600% reduzierten Onlineshop 200 $ kostet, als Generikum bei Costco für 16 $ erhältlich ist.

Rollenspielszenen: Feuerballreichweite

Rollenspielszene. Die Infiltration der Hobgoblinfeste mit Hilfe eines Illusionszaubers ist fehlgeschlagen. Glücklicherweise haben wir mehrere Ablenkunsmanöver vorbereitet. Soris, in Stinktiergestalt, stiftet Chaos in der Küche. Prattle teleportiert sich mit ein paar Tricks hinter die Goblinfestung und macht sich unsichtbar. Mavas lenkt (wenig erfolgreich) auf einem Ross ein paar Goblins und Worge ab. Lin'quel zaubert Haste auf sich selbst, rennt zur Festung hoch und weicht dabei verschiedensten Geschossen aus, während Therith ihm von hinten mit dem Bogen den Rücken deckt.

Prattle entdeckt mit einem Spähzauber (ein Papierdrache) die gesuchten Amulette in einer Schatulle, und schleicht sich im allgemeinen Chaos in die Festung, deren Tor Lin'quel mit einem Feuerball aufgesprengt hat. Die Goblins bemerken erst, dass ein Unsichtbarer durch ihre Festung läuft, als dieser sich die Schatulle schnappt. Noch mehr Chaos, während die Goblins Mehlsäcke heranschleppen um die Fußspuren von Unsichtbaren zu entdecken und die Hobgoblins sie davon abhalten müssen, diese nicht in der Nähe der brennenden Torüberreste zu entleeren.

Lin'quel tritt den Rückzug an. Ein Hobgoblinzauberwirker, der bisher nur hilflos ein paar ungezielte Zauber verschossen hat, wirft einen Feuerball nach ihm. Lin'quel wird zwar nicht direkt getroffen, nimmt aber genug Schaden, um die Kontrolle über seinen Haste-Zauber zu verlieren und ist für ein paar Augeblicke betäubt.

Mavas, der mittlerweile seine Verfolger erledigt hat, sieht Lin'quel zu Boden gehen und prescht im Gallop zu seiner Rettung. Der Hobgoblinmagier wirft einen zweiten Feuerball nach Lin'quel. Dieser, mittlerweile schwer verletzt, sieht Mavas ankommen. Sein Rückzug ist gesichert, also kann er sich noch ein bisschen rächen:

Wenn ich in Feuerballreichweite bin, ist der auch in Feuerballreichweite.

Er macht eine arkane Geste, während sich die Blutstropfen aus seinen Wunden sammeln und sich in einen zweifach verstärkten Feuerball verwandeln. Der Hobgoblinmagier und die Toranlage hinter ihm gehen in einer Explosion unter.

Speisekarten hinzufügen

Nach den Bombenerfolgen Support für Drogenhändlerringe und LISTE DER IMMOBILIENSUCHE FALLEN LASSEN jetzt der neue Hit:

Speisekarten hinzufügen

Zu finden in der Android-Entwickler-Doku. Im englischen Original: „Add menus“. Ich vermute mal, dass auch das irgendwann behoben wird.

Interessanterweise habe ich dieses Mal keine offizielle Anmerkung gefunden, dass der Artikel maschinell übersetzt wurde. Ich vermute trotzdem, dass das der Fall war.

Gefunden habe ich das mal wieder über Mastodon.

Vorratsdatenspeicherung III

Ein altes Sprichwort sagt: „Wenn du merkst, dass du ein totes Pferd reitest, besorge dir eine bessere Peitsche“. Oder so ähnlich.

Die Bundesregierung hat jetzt einen Gesetzesentwurf zur Vorratsdatenspeicherung beschlossen. Weil die letzten beiden Vorratsdatenspeicherungen ja so gut gelaufen sind. Waren halt nur verfassungswidrig. Aber hey, aller guten Dinge sind drei!

Dieses ist die Argumentation nicht Terrorismus, sondern… ah, der Kampf gegen Internetkriminalität. Und dann werden einfach mal anlasslos drei Monate lang alle IP-Adressen und Ports gespeichert.

Aber hey, vielleicht kann man diese Daten dann ja an eine „KI“ füttern und die erzählt einem dann, wie man das Problem mit dem Klimawandel löst oder so. Keine Ahnung. KI ist ja im Prinzip Magie, wenn man seine Wünsche nur eindrücklich genug formuliert, werden sie schon wahr werden.

Dasselbe gilt wohl auch für Gesetze: Wenn ich nur oft genug das gleiche verfassungswidriges Gesetz beschließe, ist es vielleicht beim dritten Versuch nicht mehr verfassungswidrig.

deleteduser.com

Daten löschen ist schwierig. In relationalen Datenbanken eine Zeile zu löschen ist zum Beispiel nicht immer möglich, ohne einen ganzen Haufen von Zeilen in anderen Tabellen zu löschen, die sich auf die eigentlich zu löschende Zeile beziehen. Diese anderen Zeilen will man aber vielleicht nicht löschen, weil sie noch gebraucht werden.

Beispiel: In einem Onlineshop, an dem ich mal mitentwickelt habe, haben sich Bestellungen auf ein Benutzerkonto bezogen. Wenn jetzt jemand das Konto löschen wollte, konnten wir nicht einfach die Bestellungen mitlöschen, weil die aus rechtlichen Gründen ein paar Jahre bestehen bleiben mussten. Der eigentliche Fehler war also, die Buchhaltungsteil der Bestellungen so eng an den Account zu koppeln.

Aber den Fehler zu kennen half nicht, es war ein altes System und wir mussten mit dem arbeiten, was wir hatten. Also wurden alle Daten des Benutzeraccounts mit Dummy-Daten überschrieben und der Account auf „inaktiv“ gestellt. Für alle Datenbankabfragen war es dann so, als würde der Account nicht existieren. Es gab damit noch ein paar Schwierigkeiten, die sind hier aber nicht relevant.

Jedenfalls scheinen wir mit diesem Problem nicht allein zu sein: Anscheinend machen es viele Konzerne und Websites ähnlich. Nur, dass sie zum Beispiel die Emailadresse mit irgendwas@deleteduser.com überschreiben und ansonsten nicht viele Anstalten machen den Account zu deaktivieren. So kam es, dass jemand, der sich die Domain deleteduser.com (und ein paar ähnliche Domains) registriert hat, plötzlich haufenweise Emails mit teilweise sensiblen Daten bekommt. Und sich teilweise mit diesen Emailadressen noch ein neues Passwort geben lassen kann um dann zu sehen, dass nicht nur der Account nur halbherzig deaktiviert wurde, auch wurden sensible Daten (wie z.B. Kreditkartennummern) nicht gelöscht.

Das eigentliche Problem ist nichts Neues. Schon vor 26 Jahren hat sich jemand die domain donotreply.com reserviert und massenhaft Emails von Menschen bekommen, die auf „do not reply“-Adressen geantwortet haben. Die besten dieser Antworten hat er online gestellt. Leider gibt es die Seite nicht mehr, aber auch archive.org gibt es eine archivierte Version.

Was lernt man daraus?

  • Wenn ihr wirklich irgendwo Dummy-Emailadressen nutzen müsst, nutzt eine Domain, die euch gehört.
  • Wenn ihr persönliche Daten (oder anderweitig sensible Daten) löschen müsst, es aber technisch nicht könnt, sorgt dafür dass ihr sie wenigstens durch Mülldaten ersetzt. Das ist sowohl ethisch als auch rechtlich verpflichtend.
  • Menschen achten oft nicht darauf, dass sie eine Email nicht beantworten sollen (diese Menschen sind übrigens nicht dumm, sie nutzen nur eine Funktion ihres Email-Clients, die sie sonst auch verwenden).