Notes

22. Juli 2026

Der erste Avenger 5: Doomsday Trailer macht mich nach langer Zeit mal wieder neugierig auf einen Marvel Film. Nach der Sache mit den 10 Ringen war ich raus. Die Szene in dem Bus ist auch das Einzige, an das ich mich überhaupt erinnern kann. Die war zugegebenermaßen nett gemacht. Aber sonst ist von der Handlung nicht viel im Kopf geblieben.

21. Juli 2026

Hmm… Bei ca. 23 °C hört mein Schreibtischstuhl auf zu knarren. Ich schätze, das ist in etwa die Schwelle, ab der sich die unterschiedlichen Materialien so ausgedehnt haben, dass sie optimal zusammenpassen. So weit die Theroie.

Praktisch wären mir 19 Grad natürlich lieber.

19. Juli 2026

Hmm… als Fan von Bleistiften bzw. Schreibtutensilien im Allgemeinen, kommt der Pen N mit einer gewissen Mögigkeit daher.

Es war mir nicht bewusst, wie teuer ein Führerschein heutzutage geworden ist. Zwischen 3500 und 4000 Euro für 'nen Lappen ist ja obszön.

Ich kann mich nicht mehr genau erinnern, was mich damals die Lizenz zur Lenkung eines Velociraptors gekostet hat. Das müssen etwa zwei Tyrannosaurus-Rex-Eier – damals eine harte Währung – gewesen sein. Also habe ich mal ins Internetz geguckt und bin über die Seite Kostenentwicklung des PKW-Führerscheins in Deutschland (1990-2024) gestolpert.

Auch wenn ich meinen seit 30 Jahren oder so nicht genutzt habe, kann ich mich wohl glücklich schätzen, dass ich heute keinen mehr machen muss.

16. Juli 2026

15. Juli 2026

Gestern habe ich dann doch Der Astronaut geschaut. Bisher hatte ich keinen Nerv dazu, weil ich wirklich kein Fan von Ryan Gosling bin. Dennoch hat mir der Film gut gefallen. Wer Der Astronaut also aus dem gleichen Grund noch nicht geschaut hat, sollte es vielleicht doch tun.

14. Juli 2026

Der letzte Flugtee war so gut, dass ich ihn zweimal nachbestellt habe. Aber nun war er vergriffen. Und ich habe mich für den DJ2 anstelle des DJ1 entscheiden müssen.

2026 Flugtee Bio Darjeeling Singell Dj2
2026 Flugtee Bio Darjeeling Singell Dj2

Ich könnte nicht sagen, welcher mir lieber ist. Beide sind echt klasse.

Das Schöne an einem privaten Blog ist: Man muss gar nicht jeden Tag „abliefern“. Zurzeit habe ich mal wieder keine Lust zu schreiben und daher gibt es an solchen Tagen auch nur ein Foto, wenn überhaupt. Später vielleicht.

10. Juli 2026

5717,57 Stunden habe ich seit dem 16. Januar 2023, 8:58 Uhr, in meinem Tracking-Tool aufgezeichnet. Also war es mal an der Zeit, das Tool in ein öffentliches Repo zu verfrachten.

Es hat sich neben Stift und Papier als das verlässlichste Zeiterfassungswerkzeug herausgestellt. Und warum? Weil die Erfassung möglichst schmerzfrei ist. Ich kann über die Weboberfläche oder via Rasycast oder Shell mit einer Zeile ein Tracking aufnehmen. Und wenn ich den Text dann noch mit einer Youtrack-ID beginne, kann ich die erfasste Zeit als Workitem bei Youtrack über die API verbuchen. Die Erfassung der Länge erfolgt über die Differenz zum vorigen Tracking. Das heißt, ich beginne meinen Arbeitstag mit einem Tracking, das den Arbeitsbeginn festlegt, und alle anderen Trackings bauen darauf auf.

8. Juli 2026

Eine Symfony-Message-Queue-Failed-Queue wächst über Tage auf tausende Einträge. Sämtliche Fehlermeldungen lauten SQLSTATE[42000] 1305: SAVEPOINT DOCTRINE_n does not exist oder There is no active transaction. Man sucht also nach einem Savepoint-Bug, nach kaputtem Transaction-Handling, nach einem Doctrine-Problem. Alles falsch: Der eigentliche Fehler ist ein InnoDB-Deadlock, und der steht in keiner einzigen Fehlermeldung.

  1. Doctrine DBAL bildet verschachtelte Transaktionen über Savepoints ab (SAVEPOINT DOCTRINE_2, DOCTRINE_3, ...). Das betrifft auch Systeme, die das Doctrine ORM gar nicht einsetzen: Shopware etwa ersetzt mit seinem eigenen DAL nur die ORM-Schicht, geschrieben wird trotzdem über die Doctrine\DBAL\Connection. Ein Repository-Write innerhalb einer äußeren Transaktion läuft dort im Savepoint.
  2. Erwischt ein Deadlock eines der Statements, rollt MariaDB/MySQL nicht nur das Statement, sondern die komplette Transaktion implizit zurück, und zwar inklusive aller Savepoints. Der Client erfährt davon nur durch den Deadlock-Error des einen Statements; die Verbindung selbst steht danach ohne Transaktion da.
  3. Doctrine weiß davon nichts und räumt regulär auf: ROLLBACK TO SAVEPOINT DOCTRINE_n. Den Savepoint gibt es nicht mehr, der Server antwortet mit 1305. Diese neue Exception ersetzt bzw. überlagert die ursprüngliche DeadlockException. Je nach Verschachtelungstiefe schlägt stattdessen später das äußere COMMIT/ROLLBACK mit There is no active transaction fehl.
  4. Im Log und in der Failed Queue landet damit nur das Aufräum-Symptom, nie die Ursache. Bei tiefer Verschachtelung kappt der Exception-Handler die Previous-Kette auch noch („Over 9 levels deep, aborting normalization“ bei Monolog), der Deadlock ist endgültig unsichtbar.

Die eigentliche Pointe ist die Folgewirkung: Retry-Mechanismen, die auf Doctrine\DBAL\Exception\RetryableException matchen, greifen nicht mehr, denn die Exception, die oben ankommt, ist eine schnöde DriverException, die nicht retrybar aussieht. Der Deadlock, der klassische Fall für „einfach nochmal versuchen“, wird durch sein eigenes Symptom vor der Retry-Logik versteckt. Shopware hat dafür in RetryableTransaction inzwischen einen Workaround, der per Regex auf SAVEPOINT ... does not exist matcht (siehe auch Doctrine-Issue dbal#6651), aber die Variante There is no active transaction rutscht auch daran vorbei.

Fix-Muster: Retry eine Ebene höher ansetzen als die Transaktion, die gesamte Exception-Kette (getPrevious) auf Deadlock-Signaturen prüfen statt nur auf Exception-Typen, und vor dem Retry die Connection hart zurücksetzen. Bei DBAL 4 reicht $connection->close(): Das setzt auch den internen Transaction-Nesting-Level zurück, reconnected wird lazy beim nächsten Query.

Debugging-Heuristik: tausende Savepoint-Fehler oder „no active transaction“ in einem Zeitfenster mit parallelen Schreibprozessen (Importe, Indexer, mehrere Queue-Worker) sind fast nie ein Transaction-Handling-Bug, sondern fast immer ein maskierter Deadlock. Die Ursache habe ich in SHOW ENGINE INNODB STATUS (LATEST DETECTED DEADLOCK) gefunden, nicht im Stacktrace.

Mein Nachmittag.

Wenn die monatliche Rasur der Grünanlage wieder ansteht, um das junge Ökosystem auf der Wiese zu zerstören, hilft mir kein Antihistamin der Welt. Ich würde mir ja die Augen auskratzen, aber vor lauter Niesen komme ich nicht dazu.

7. Juli 2026

That is actually a funny idea.

6. Juli 2026

Shopware-6-Flows, die per SQL-Migration angelegt werden (auch von Core-Migrationen!), sind zunächst funktionslos: Die payload-Spalte ist NULL, und der FlowLoader überspringt solche Flows kommentarlos. Kompiliert wird das Payload erst asynchron vom Flow-Indexer über die Message-Queue.

Auf Systemen ohne laufenden Worker (typisch: lokale Dev-Umgebungen) feuert ein Event, der Flow ist im Admin sichtbar und aktiv, es gibt null Fehlermeldungen, und trotzdem passiert nichts.

Übertragbares Muster: Migration erzeugt Daten, die erst durch asynchrone Indexierung funktional werden; der Silent-Skip macht die Diagnose fies (Debugging-Weg: log_entry-Tabelle bestätigt Event, flow.payload IS NULL verrät die Ursache).

4. Juli 2026

Nun bin ich doch wieder bei Disney+ gelandet, nur um mir passend zum 4. Juli mal wieder Independence Day anzuschauen.
Aber im Laufe des Jahres werden ja auch noch Grogu und der Mandalorianer vorbeischauen.

Mein kleines iPad ist mit einer neuen Version der Flickr-App beseelt worden. Und auch wenn die App auf den ersten Blick recht fesch aussieht, ist das kein Grund zur Freude, wie sich zeigte, als ich auf die Idee kam, das Pad in den Landscape-Modus zu drehen. Auf dem iPhone ist der Landscape-Modus unterbunden, auf dem iPad nicht. Vermutlich, um für Split View, Slide Over und Stage Manager Flexibilität zu bieten.

Beim Landscape-Modus hätte man sich echt mehr Mühe geben müssen. Bei einer App zum Ansehen von Fotos könnte man damit rechnen, dass sie auch mal auf einem iPad benutzt wird. Es ist ja nicht jeder durch Instagram geprägt und steht drauf, sich thumbnailgroße Bildchen anzuschauen. Eine offensichtliche und üble Regression.

Gestern habe ich Infinite geschaut. Witzige Idee. Aber die Story kam dann leider etwas kurz, aber dafür wurde wieder unglaublich viel rumgewahlbergt.

3. Juli 2026

Soll ich nun schockiert oder amüsiert sein, wenn ich sehe, wie weltfremd Teile des Reformpakets nun sind.

Attest vom ersten Krankheitstag an. Klingt auf den ersten Blick nicht sehr arbeitgeberorientiert. OK, ich bin noch nie für nur einen Tag krankgeschrieben worden. Bei regelmäßigen Migräneanfällen kommt es schon mal vor, dass ich nur einen Tag ausfalle. Aber wenn ich dann gequält wegen Migräne das Wartezimmer mit anderen Patienten verstopfe, die vergleichbare Leiden haben, kann ich mir dann zumindest sicher sein, dass ich den Rest der Woche mit beruhigtem Gewissen und einem Attest genesen kann.

Wie bitte kann das für einen noch niedrigeren Krankenstand oder eine Entlastung von Praxen taugen.

Naja, erst mal einen Tee… 

2. Juli 2026

Falls ich mal eine natürlich DSGVO-konform anonymisierte Shopware‑DB in ein DDEV‑Projekt importieren und sicher gehen möchte, dass ausgehende Mails in Mailpit landen und nicht in die freie Welt entlassen werden, habe ich mir zwei Hooks angelegt.

.ddev/config.yaml

hooks:
  post-start:
    - exec-host: .ddev/mail/force-mailpit.sh
  post-import-db:
    - exec-host: .ddev/mail/force-mailpit.sh

Würde das folgende Skript beim Start und nach dem Import-DB-Kommando aufrufen.

.ddev/mail/force-mailpit.sh

set -euo pipefail
ddev mysql db <<'SQL'
UPDATE system_config
SET configuration_value = '{"_value":""}'
WHERE configuration_key = 'core.mailerSettings.emailAgent';
SQL

Man kann überhaupt die witzigsten und praktischsten Sachen mit Hooks machen.

30. Juni 2026

Soo … Endlich habe ich mir mal ein paar Minuten genommen und das Layout von der Last.fm-RecentTracks-WebComponent tauglich gemacht für mobile Endgeräte. Bei langen Titeln oder Künstlernamen sah das immer etwas gruselig aus.

Last Fm Recent Tracks Web Componente
Last Fm Recent Tracks Web Componente

Boah, Leben wie auf einer Großbaustelle. Und ich dachte, direkt an der Hattinger Straße in meiner alten Wohnung wäre es laut gewesen. Aber der Autoverkehr vor der Haustür war nichts im Vergleich zu den fortwährend neuen Baumaßnahmen hier im Bereich am Großen Busch und Neuhofstraße.

Eigentlich bin ich hierhergezogen, weil es ruhiger werden sollte. Aber das Gegenteil ist der Fall. Etwas ist so gut wie jeden Tag hier los. Sei es nun Rasenmähen, Stämme schreddern, Steine für einen Mist sägen oder einfach nur ein undefiniertes Dröhnen aus einer Richtung.

Wer je überlegt, in dieses Viertel zu ziehen, sollte sich das wirklich noch mal überlegen!

Die nächste Hitzwelle kommt bestimmt. Durch die Kombination von Live-Wetterdaten, historischen Messwerten und einem europäischen Bevölkerungsraster veranschaulicht der European Heat Tracker die Auswirkungen von Hitze auf die Menschen in ganz Europa. (via eay)

29. Juni 2026

Na, das finde ich ja lobenswert. Via E-Mail wird man informiert, dass es eine neue KI-Richtlinie bei Tidal gibt. Tidal akzeptiert zwar KI-generierte Musik, was nur gut und recht ist. Es ist eher ein philosophisches Thema, ob das Kunst ist oder sich zu einer Kunstform etablieren wird. Ein jeder mag da verschiedenster Ansicht sein.

Musik, die vollständig oder im Wesentlichen durch generative künstliche Intelligenz erzeugt wird, betrachtet Tidal als KI-generierte Musik und wird gekennzeichnet. Außerdem gibt es kein Geld für KI-Mukke.

Kurzum: Ich werde in Zukunft mit einem Kennzeichen vor AI-Slob gewarnt. Was kann ich mir mehr wünschen.

28. Juni 2026

Ein weiterer Tag hinter geschlossenen Fenstern. Bis gerade eben. Da es sich draußen mittlerweile auf manierliche 27 °C abgekühlt hat, konnte ich nicht widerstehen, ein bisschen frische Luft zu atmen.

Tagsüber habe ich mich noch etwas mit dem Movie Tracker beschäftigt. Zum einen gibt es jetzt mehr als nur Titel, Datum und Bewertung. Und ein RSS-Feed darf natürlich nicht fehlen. Beim Tracken eines Films werden nun alle anderen Daten aus der TMDb-API geladen. Es hoffe, das hält mich etwas bei der Stange, und ich gebe das Tracken nicht wieder aus Faulheit auf, wenn ich nur den Titel, die Bewertung und evtl. einen Kommentar eingeben muss.

Darüber hinaus habe ich versucht, den Schlaf, der mir in den zu warmen Nächten entgangen ist, nachzuholen.

27. Juni 2026

Vielerorts stolpert man zurzeit über diverse Tipps, um der Hitze Herr zu werden. So etwa die Sache mit dem feuchten Handtuch vor dem Ventilator. Ich habe das mal ausprobiert. Und das Resultat ist beeindruckend. Ich konnte durch die Konstruktion die Raumtemperatur um sagenhafte 0,2 °C senken.

26. Juni 2026

Zum 30-jährigen Bestehen von TMO gibt es mit Vestiges (Tidal) heute so eine Art „Best of“ mit raren Sachen. Keine andere Chance, als zuzugreifen.

Morgen, am 27.6. findet die ExtraSchicht statt. Ich habe mir den Spaß bisher dreimal gegönnt. Und es war interessant und witzig. Und bis neulich habe ich noch mit dem Gedanken gespielt, auch dieses Jahr wieder teilzunehmen. Aber im Laufe des Tages, kamen dann per iMessage Absage um Absage. Und ich bin so froh darüber. Wir werden uns das morgen auch ersparen. 25 Grad im Wohnzimmer vs. 38 Grad im Freien, zwingen geradezu zum Stubenhocken.

Gemessen am Hitze-Liveblog der Tagesschau, wäre ich auch nicht zu erstaunt gewesen, wenn die ExtraSchicht abgesagt worden wäre. Wobei das in Anbetracht der Vielzahl der Veranstaltungsorte ein arges Fiasko gewesen wäre.