2020: Ein Rückblick
Puh, 2020 also. Irgendwie hatte ich mir das alles ganz anders vorgestellt, als ich Euch ein erfolgreiches 2020 wünschte. Aber es kam, wie es kam. Ein kurzer Abriss über die letzten zwölf Monate:
Puh, 2020 also. Irgendwie hatte ich mir das alles ganz anders vorgestellt, als ich Euch ein erfolgreiches 2020 wünschte. Aber es kam, wie es kam. Ein kurzer Abriss über die letzten zwölf Monate:
Ich trage seit über vier Jahren eine Apple Watch, trotzdem habe ich das noch nicht geschafft: In einer Woche jeden Tag das Bewegungs-, Trainings- und Stehziel zu erreichen. Heute war es aber endlich soweit! 🥳
Ich bin diese Woche jeden Tag zur Mittagspause Spazieren gegangen. Nicht nur half das meinen Erfolgen auf der Uhr, ich kam auch auf andere Gedanken, fühlte mich entspannter und konnte danach tatsächlich besser weiter arbeiten. Gegen Ende der Woche wurde es dann zu einer kleinen Challenge mit mir selbst: Wie viel mehr würde ich am Tag schaffen? 120%? 150%? 200%?
Okay, die 200% muss ich wohl kommende Woche probieren. Aber immerhin habe ich den inneren Schweinehund erstmal überwunden und war sogar heute im Regen spazieren, um meine Ziele zu erreichen. Also drückt mir die Daumen, dass das auch so bleibt. 🤞🏼
In den letzten Monaten habe ich dank diverser Steam-Angebote die aktuelle Tomb-Raider-Trilogie spielen können. Was für großartige Spiele! Die ersten drei Teile von 1996 bis 1998 habe ich damals rauf und runter gespielt, bevor ich 22 Jahre pausierte und im Mai mit Tomb Raider von Neuem begann.
Am Montagmorgen fuhren Ina und ich nach Kornelimünster um dort die erste Etappe des Eifelsteigs zu starten. Das Wetter meinte es gut mit uns – etwas zu gut vielleicht, denn gegen Mittag sollte es 36 °C heiß werden. Also hofften wir, vor Erreichen der Mittagshitze das Etappenziel Roetgen zu erreichen.
Ich trage ja selten schwarz, aber das hier könnte mein neues Lieblingsshirt werden! ✊🏼
Über Monate war der Service Worker meines Kegelclubs defekt: Zwar wurden Seiten aus dem Cache geholt, wenn man offline war, aber eben nicht die Kegelspiele – und gerade für die war doch dieses tolle Feature gedacht, sitzen wir doch oft auf Kegelbahnen ohne stabiles Internet!
Wie sich herausgestellt hat, war mein Wille, HTTP-konform zu sein, Schuld daran: Ich liefere unter einer URI mehrere Ressourcen aus, je nach Accept
-Header. Die Kegelspiele können also in verschiedenen Varianten (HTML, JSON, XML, Markdown) abgefragt werden:
Accept: text/html
GET https://kegelclub-tüddern.de/kegelspiele/grosse-hausnummer
<!doctype html>
...
Accept: application/json
GET https://kegelclub-tüddern.de/kegelspiele/grosse-hausnummer
{
...
Gedacht war das mal für eine potentielle iOS-App, um direkt eine JSON-Repräsentation zu haben. Ohje … 🤷🏻♂️ Pro-Tipp: Baut keine APIs, bevor Ihr sie nicht auch braucht!
Aber nun gut. HTTP-Konformität, hm? Also ein ganz kleiner Exkurs: Wenn sich die Response einer URI aufgrund eines beliebigen Request-Headers ändern kann, so muss man diese Request-Header mit dem Vary
-Response-Header auflisten. In meinem Fall ist das:
Vary: Accept, Accept-Encoding
Den Header setzt man vor allem wegen Caching:
The Vary HTTP response header determines how to match future request headers to decide whether a cached response can be used rather than requesting a fresh one from the origin server. It is used by the server to indicate which headers it used when selecting a representation of a resource in a content negotiation algorithm.
Wegen Caching! Dieser Vary
-Header war der Grund für den defekten Service Worker, denn Letzterer versuchte nun immer, diese eine Ressource direkt aus dem Netz statt aus dem Cache zu holen!
Die Lösung im Service Worker ist ignoreVary
:
// cache will not be used for requests with Vary header, response is undefined
const response = await caches.match(request);
// cache will ignore Vary header, response is the cached ressource
const response = await caches.match(request, { ignoreVary: true });
Aaaalter … Das hat mich heute Abend gute drei Stunden Ausprobier- und Suchzeit gekostet. Aber hey, wieder was gelernt! 😓