nasauber.de

Blog: Einträge 19.01.2022–09.02.2023

Handling changes to cached static content

Caching static content

I run lighttpd as my HTTP server. It's setup to tell all clients to cache everything inside /static/ for a month, by using mod_expire:

$HTTP["url"] =~ "^/static/" {
    expire.url = ( "" => "access plus 1 months" )
}

I put all static content which rarely changes inside /static/, e.g. CSS and JavaScript files. A client requests such a file only once and caches it, until it expires. Next time, it's not fetched from the server, but simply loaded from the cache. This lowers traffic and CPU cycles, saving bandwidth and power consumption for both server and client.

Principally, this is a good idea and something everybody running a HTTP server should do, in some way.

The problem

The problem is that if something is changed, a client already having cached the file in question won't notice the change: As said, it won't request the file from the server but load it from it's cache. This could lead to a messed up layout or even an unfunctional page if relevant portions of e.g. the CSS style have been changed, in the worst case for a full month.

According to what I found, there's no way to directly work around it. If a browser did cache such a file with a defined time to live, it won't request it again during that time. There's no server-side way to tell a client it should reload such a file. No way to invalidate the cache or the expire date, no way to bypass this mechanism.

The client can possibly force-reload the page (e.g. by pressing CTRL+F5 or such, depending on the browser used), including all already cached files. But some people may not know this, and in some situations this might even not be possible at all: E.g. I'm using the Kiwi Browser on my phone, which does not seem to even have such a force-reload function.

The solution

If a file's name changes, it doesn't matter if the content is the same or almost the same. For the client, it's another file. So I simply introduced a revision number. E.g. instead of /static/css/style.css, it's now /static/css/style-1.css, after the next change, it would be /static/css/style-2.css and so on. Each client will request a file renamed like this after the change (of course again cache it) and display the changes correctly.

But all the HTML has to be changed then! Here, Jekyll, the lovely static web page generator, comes into play.

I simply created a YAML data file, which acts as a map for all the static content I want to handle like this. E.g. one could call it _data/static.yml, with entries like this:

shared-css: "/static/css/shared-1.css"
style-css : "/static/css/style-1.css"

And then, we simply don't reference such files directly anymore, but let Jekyll do the work: E.g. instead of

<link rel="stylesheet" href="/static/css/style.css">

one would write

<link rel="stylesheet" href="{{ site.data.static['style-css'] }}">

This works as well for CSS or JavaScript files, as soon as a "front matter" is added. E.g. one would reference such a file inside a CSS file like that:

---
layout: none
---

...
@import url("{{ site.data.static['shared-css'] }}");
...

The parsed result delivered to _site/ is simply the CSS file like before (as we did not apply any layout), but with the stuff referenced by {{ ... }} replaced with the real thing.

This way, if some "static" file changes, one only has to bump the revision counter and update the _data/static.yml file. Which are two additional steps, but this does not happen too often. And the rest happens automagically :-) Still, the static stuff is cached as it should be, but when changes are done, everybody gets the new version.


Gas sparen

Diesen Sommer haben wir die noch (gar nicht so) alte Brennkammer unseres Kachelofens durch eine wasserführende ausgetauscht, die nicht nur den Kachelofen, sondern auch unseren Pufferspeicher aufheizt (namentlich eine Leda Diamant H100 W). Netterweise wird, bedingt durch die günstige Konstruktion unserer Heizung, über den Pufferspeicher nicht nur unser Brauchwasser erhitzt; auch die Flächenheizung wird über den Speicher versorgt. Somit heizt jetzt die Brennkammer nicht mehr nur Wohn- und Esszimmer, sondern anteilig auch das ganze Haus.

Befeuert wird der Heizeinsatz ausschließlich mit Windbruch- und Käferholz aus dem schwiegerelterlichen Wald, der wenige Kilometer entfernt liegt. Von daher sehe ich das – Feinstaub hin oder her – als durchaus umweltfreundlich und vor allem (annähernd) CO2-neutral an.

Besonders interessant ist allerdings das Einsparpotenzial beim Gasverbrauch. Wir haben (wie viele andere auch) eine Gastherme. Dank des vcontrold-Projekts 1 zeichne ich, seitdem die Heizung installiert wurde, u. a. die Betriebsstunden des Brenners mit einem Raspberry Pi 1 auf 2.

Der Dezember ist noch lang nicht vorbei, aber wenn man die Brennerstunden linear extrapoliert, kommt man auf folgendes Ergebnis:

Brenner-Betriebsstunden unserer Gastherme 2021 und 2022

Nun kann man nicht direkt die Brennerstunden mit der Gaseinsparung gleichsetzen (der Brenner läuft ja nicht immer auf 100 %), aber eine erhebliche Einsparung gab und gibt es definitiv: Im Schnitt haben wir (mit den Werten der Extrapolation für Dezember) die Stunden, in denen unsere Gastherme lief, um beachtliche 84 % reduziert. Gut, einschüren muss man schon. Mit nichts läuft die Anlage nicht, man braucht schon ein bisschen Brennholz (bisher ca. 4 Ster) Aber das war klar.

Am Ende des Winters poste ich hier jedenfalls nochmal die tatsächlichen Zahlen! Aber es sieht ganz danach aus, als ob sich diese doch nicht unerhebliche Investition gelohnt hat!


  1. … dem ich vor einiger Zeit mal mit der Umstellung des veralteten Buildsystems auf CMake und dem Aufräumen des Quellcodes mit zu einem Neustart verholfen habe
  2. … mit einem selbstgebauten Optolink-Adapter, der „richtige“ Schaltplan und die Fotos aus dem Wiki-Eintrag darüber sind von mir

Alternativen zu Gentoo

Gentoo Linux

Am 26.01.2005 habe ich mich im Forum von Gentoo Linux angemeldet. Spätestens seit diesem Zeitpunkt bin ich ausschließlicher Linux-User (abgesehen von Fällen, wo man nicht um Windows herumkommt, etwa in der Arbeit oder zum Bauen der Windows-Version des Muckturnier-Programms).

Für alle, die es nicht kennen: Gentoo Linux hat eine gewisse Sonderstellung unter den Distributionen. Hier baut man (bis auf wenige Ausnahmen) alle Software, die man benutzt, selbst aus den Quelltexten. Man fängt nicht ganz bei Null an, aber mit wenig. Man baut sich sein ganzes System selbst, und hat volle Kontrolle – zu dem Preis, dass man sich vergleichsweise gut auskennen muss.

Das hatte damals einen sehr großen Reiz. Abgesehen vom unabstreitbaren „Geek-Faktor“ kann man alle Software auf die CPU und Maschine optimieren, auf der sie läuft; inwiefern das heutzutage noch sinnvoll oder nötig ist, oder einen fühlbaren Unterschied macht, sei dahingestellt. Was aber zweifelsohne auch heute spitze ist: Bedingt durch das USE-Flag-System kann man Software ganz nach den persönlichen Bedürfnissen bauen, und so auch Abhängigkeiten aussparen oder spezielle Funktionalität einbinden. Das kann keine Binärdistribution.

Gentoo ist echt cool. Ich habe es auch nach wie vor auf meinem Desktop-Rechner (was will ich auch sonst mit den 6 Kernen und 12 Threads meines Ryzen 5 3600 und den 32 GB RAM?!). Ich habe die Distribution über die Jahre wirklich lieben gelernt (manchmal war es wohl eher auch Hassliebe ;-), und die Community ist sehr freundlich und kompetent. Der Nerd-Anteil ist hoch, und der n00b-Anteil klein. Also gibt es wenig dumme Fragen, und wenig dumme Antworten.

Gentoo muss man wollen

Ich habe als IT-Beauftragter meiner Familie natürlich nicht nur auf meinem Desktop Gentoo installiert, sondern überall. Es war bis vor Kurzem auch auf dem Rechner meiner Frau, meiner Eltern, dem Wohnzimmer-Computer, meinem Raspberry Pi, meinem Notebook, dem alten Notebook meiner Frau und auf meinem ganz alten Netbook (ich habe tatsächlich einen noch funktionierenden Asus EEE PC 1000H) – und auf meinem kleinen Server, einem APU2-Board. Und die alle aktuell zu halten war immer recht zeitaufwändig (schließlich baut man ja alles aus den Quellen und installiert nicht einfach Binärpakete).

In den letzten Jahren ist es mühsam geworden. In Zeiten, wo HTML-Rendering-Engines komplexer als Betriebssysteme sind, und aus zehntausenden Quelltext-Dateien mit Millionen von Zeilen bestehen, sprechen wir z. B. bei einem Update, das die QtWebEngine und/oder NodeJS beinhaltet, nicht mehr von Stunden, die es dauert – wir sprechen von Tagen. Tage, in denen so ein Rechner mitunter nur eingeschränkt oder gar nicht nutzbar ist.

Lange ging es ganz gut, indem man distcc nutzte. Aber der Kompilieraufwand wurde größer und größer und ging mitunter so weit, dass manche Pakete auf alten Rechnern schlicht gar nicht mehr zu bauen waren – wegen zu wenig RAM und/oder zu wenig Platz auf der Festplatte.

An einem gewissen Punkt hat es mir einfach keinen Spaß mehr gemacht, tagelang in fünf oder sechs screen-Sessions emerge beim Arbeiten zuzuschauen. Den gcc auf einem Raspberry Pi 1 zu bauen nervt einfach nur noch.

Was kann man nehmen?

Das war die große Frage. Ernsthaft und dauerhaft hatte ich nur Gentoo benutzt. Keine der anderen großen Distributionen. Aber bedingt dadurch, dass ich seit einiger Zeit – mehr oder weniger notgedrungen – auf meinen Servern bei Hetzner „Feindkontakt“ mit Ubuntu habe, war mir eines klar: Kein Systemd. Nein. Warum Systemd eine Ausgeburt der Hölle ist, kann jeder im Internet nachlesen. Welcher Teufel die meisten großen Distributionen geritten hat, ihr Init-System auf Systemd umzustellen, ist mir nach wie vor schleierhaft. Von meiner Seite nur so viel: Was hat sich ein Init-System um DNS-Auflösung zu kümmern? Was sollen irgendwelche Timer, die mit Cronjobs konkurrieren? Was sollen irgendwelche binären(!) Logs, die mit Syslog konkurrieren?! Diese ganze Systemd-Sache ist einfach nur fürchterlich.

Was dazu führt, dass die Auswahl klein wird. Aber es gab (und gibt) Hoffnung: Nach einiger Recherche konnte ich drei potenzielle Aspiranten ausmachen, die da wären:

Getestet habe ich zunächst einmal in einer virtuellen Maschine in QEMU.

Void Linux

Void Linux nutzt als Init-System runit. Es ließ sich sehr problemlos installieren, wenngleich man doch einiges dafür wissen muss (einen Installer gibt es, wie bei Gentoo, nicht). Aber wenn man von Gentoo kommt, dann ist man ja Kummer gewöhnt ;-) Alles in allem war der Eindruck nicht schlecht, aber für den Einsatz auf einem Endbenutzer-Bürorechner wie dem von meinen Eltern oder dem von meiner Frau war mir Void Linux dann doch ein bisschen zu „exotisch“.

Im Auge behalten sollte man die Distribution aber auf jeden Fall. Allein schon deswegen, weil sie kein Fork ist, und der Ansatz neu und frei von Altlasten daherkommt.

Devuan

Bei Devuan kann man aus mehreren Init-Systemen wählen: Dem traditionellen sysvinit, runit und Gentoos OpenRC. Als Gentoo-User nimmt man natürlich OpenRC.

Die Installation geht von selbst. Live-Medium booten, ein paar Auswahlen im Installer treffen. Kurz darauf hat man ein komplettes Desktop-System.

Das ist allerdings auch genau der Punkt, der mich immer gestört hat an all den Distributionen, die ich vor Gentoo ausprobiert habe: Man hat ein komplettes System. Und einen ganzen Haufen Kram, den man nicht braucht. Und als allererstes muss man sein System ausmisten nach der Installation.

Aber es läuft. Sieht etwas anders aus als Gentoo (es kommen sysvinit-Init-Scripts zum Einsatz, keine OpenRC-spezifischen), aber es geht. Das meiste Know-How, Wikis, Foren-Einträge etc. kann man direkt von Debian übernehmen. Wie gesagt: Läuft.

Artix Linux

Bei Artix Linux läuft die Installation im Prinzip wie bei Void Linux oder auch Gentoo, mit Konsolen-Tools und ohne Installer. Als Gentoo-User fühlt man sich hier gleich ziemlich zu Hause. Und wenn man OpenRC nutzt (auch hier gibt es verschiedene Init-Systeme zur Auswahl, u. A. auch OpenRC), dann sieht Artix genauso wie Gentoo aus (bei jedem Paket mit einem Init-Script wird ein zusätzliches mit dem eigentlichen Init-Script installiert, das zum Init-System passt).

Das Konzept der Installation ist das selbe wie bei Gentoo: Man startet mit einem Minimalsystem, und installiert, was man braucht. Natürlich kann man nicht optimieren (was sich aufgrund der heutzutage sehr leistungsfähigen Rechner aber auch irgendwo relativiert), und man kann aufgrund der Binärpakete auch keine Abhängigkeiten „einsparen“. Aber man hat volle Kontrolle. Artix ist wie Gentoo eine „Rolling Release“-Distribution, es gibt also keine Versionen, sondern die Pakete werden fortlaufend aktualisiert. Das hat zur Folge, dass bei jedem Update vergleichsweise viele Pakete aktualisiert werden müssen (bei Gentoo kann man ja Pakete einfach neu bauen, bei Binärpaketen muss man bei allen Abhängigkeiten ran). Aber die sind schnell installiert.

Alles in allem ist Artix Linux spitze. Im Grunde fühlt es sich so an wie Gentoo mit Binärpaketen. Selber Software bauen ist kein Problem, und auch eigene Pakete bauen ist erfreulich einfach. Und: Updates dauern Minuten. Nicht Stunden, und auch nicht Tage. Sondern Minuten. Die Paketauswahl ist zwar deutlich geringer als bei Gentoo, aber man findet, was man braucht (und kann ja auch notfalls selbst bauen). Nicht nur daran merkt man, dass Artix eine noch recht junge Distribution ist: Auch fehlt z. B. ein zentraler Bugtracker. Aber was nicht ist, kann ja noch werden.

Die Mischung macht’s

Der Stand der Dinge ist Stand jetzt folgender:

Unterm Strich sollte man sich also einfach die passende Distribution für den passenden Einsatzzweck suchen. Gentoo ist nach wie vor super, aber mit Artix Linux und Devuan haben wir, wo es passt, gangbare Alternativen – ohne bei dem Systemd-Wahnsinn mitmachen zu müssen. Bleibt zu hoffen, dass diese Distribution (weiterhin) den Erfolg haben werden, den sie verdienen.


Fintec – Saunaöfen aus Münchberg

Wir haben eine holzbefeuerte Blockbohlensauna

Anfang letztes Jahr haben wir eine holzbefeuerte Blockbohlensauna gebaut. Gut, das mag jetzt keinen interessieren, und deswegen habe ich das auch bisher hier nicht veröffentlicht; aber bedingt durch die Google-Mafia fühle ich mich jetzt doch dazu bewogen. Die Kurzfassung der Vorgeschichte:

Es gibt nicht viele Hersteller von Saunaöfen, die mit Holz befeuert werden. Bei der Planung der Sauna sind wir nach einiger Recherche auf die Firma Fintec gestoßen. Und deren Firmensitz ist tatsächlich in Münchberg! Quasi vor der Haustür. Letztlich haben wir auch wirklich unseren Ofen da gekauft, und selbst mit dem Hänger abgeholt. Es ist das Modell Lora geworden.

Herr Schmidt von der Firma Fintec hat uns bei der Planung der Sauna und der Auswahl des Ofens hervorragend beraten. Und sehr geduldig viele, viele E-Mails von mir beantwortet. Nachdem wir die Sauna nun schon wirklich oft benutzt haben (und mittlerweile auch wissen, wie man anschüren muss, wann man nachlegen muss, wie man überhaupt mit dem Ofen umgehen muss), habe ich mir gedacht, ich tue der heimischen Wirtschaft mal was Gutes und schreibe eine Google-Bewertung. Meine erste Google-Bewertung.

Google-Bewertung

Hier meine Fünf-Sterne-Bewertung für die Firma Fintec, mit einem schicken Bild unseres heißgeliebten Saunaofens in action:

Sehr freundlicher und kompetenter Kontakt! Wir wurden beim Bau unserer Blockbohlensauna sehr gut beraten, und der Holzofen (Lora) funktioniert hervorragend. Bei der Abnahme durch den Bezirkskaminkehrermeister gab es erwartungsgemäß keine Probleme. Äußerst empfehlenwert! Sicher nicht die günstigsten Öfen, aber das Geld wert.

Der Fintec-Holz-Saunaofen „Lora“

Google mag mich nicht

Die Bewertung konnte ich mir auch gleich auf Google Maps anschauen. Auf meinem Computer, und auf meinem Handy. Meine Frau aber nicht. Weil Google hat die Bewertung nicht veröffentlicht.

Ich dachte schon, ich habe etwas falsch gemacht. Privacy-Settings angeschaut, alles geprüft. Alles passt. Die Bewertung nochmal gelöscht, und nochmal geschrieben (vielleicht einen Haken vergessen oder so?) – selbes Ergebnis.

Herrn Schmidt habe ich dann geschrieben, dass ich Ihn gerne positiv bewertet hätte, aber Google scheinbar meine Rezension nicht mag. Der hat dann bei Google Business angefragt, wie das zu Stande kommt, und bekam folgende Antwort:

Hallo Herr Schmidt,

vielen Dank, dass Sie sich mit Ihrer Anfrage an unser Google Business Profile-Support-Team gewandt haben. Wir können gut nachvollziehen, wie wichtig Rezensionen für Sie und Ihr Unternehmen sind. Leider darf ich keine Auskunft darüber geben, wieso eine Rezension entfernt wurde. Weiterhin wird dies von Algorithmen durchgeführt, auf die ich keinen Einfluss habe. Ich bitte hierbei um Ihr Verständnis und bedauere mögliche Unannehmlichkeiten, die Ihnen dies bereitet. Falls Sie weitere Unterstützung bei diesem Problem benötigen, antworten Sie einfach auf diese E-Mail. Wir helfen Ihnen dann gern weiter. Bei Fragen zu anderen Themen können Sie sich jederzeit über die Google Unternehmensprofil-Hilfe mit uns in Verbindung setzen.

Google hat also meine Rezension „entfernt“. Alles klar, sieht ja auch wirklich aus wie eine gekaufte Bewertung aus einer chinesischen Clickfarm. Da kann man mal sehen, dass hier seitens der Monopolisten vollkommene Willkür herrscht.

Mir persönlich ist vollkommen schleierhaft, wieso Google hier so vorgeht. Und selbst nach einer Anfrage des Unternehmens, das das betrifft, nichts ändert. Vermutlich liegt es daran, dass ich kein guter Google-Kunde bin. Ich benutze keine Gmail-Adresse (ich betreibe sogar meinen eigenen Mailserver :-O), habe alles, was Personalisation, Tracking und dergleichen betrifft, in meinem Google-Konto deaktiviert, und alle Google-Apps auf meinem Handy, bei denen das möglich war, durch freie Alternativen von F-Droid ersetzt. Böse, böse.

Aber das sollte bitte nicht zu Lasten eines Unternehmens gehen, was gute Arbeit macht. Es kann ja wohl nicht wahr sein, dass eine ehrlich gemeinte positive Bewertung für eine Anschaffung jenseits der 1000 € von Google „entfernt“ wird, ohne zumindest die Gründe dafür zu nennen. Ich meine, wir reden hier nicht von einer Amazon-Bewertung für irgendwelchen China-Elektronik-Schrott für 10 €!

Ich habe dann auch noch versucht, meine Rezension ein bisschen ausführlicher und kritischer zu formulieren:

Sehr freundlicher und kompetenter Kontakt!

Wir wurden bei der Planung und dem Bau unser Blockbohlensauna gut beraten (war kein Bausatz, sondern ein kompletter Eigenbau), und der Holzofen Lora funktioniert 1A. Bei der Abnahme durch den Bezirkskaminkehrermeister gab es keine Probleme.

Vermutlich corona-bedingt hat die Lieferung zwar etwas auf sich warten lassen, aber der Service war gut: Zwei fehlende Teile wurden prompt nachgeliefert. Die Halterungen für den Rauchschlot, die sich als zu lang herausstellten, wurden anstandslos gegen kürzere umgetauscht.

Alles in allem empfehlenswert! Sicher nicht die günstigsten Öfen, aber das Geld wert. Zumal wir in unserem Fall mit dem Kauf auch noch die heimische Wirtschaft unterstützen konnten :-)

… aber allzu kritisch dann eben doch nicht, weil wir eben wirklich zufrieden sind. Selbes Ergebnis, Rezension nicht veröffentlicht.

Fazit

Was lernen wir daraus? Monopolisten wie Google handeln vollkommen willkürlich und scheren sich einen Dreck darum, was sie damit anrichten. Da kann eine Firma wie Fintec froh sein, die vernünftige Arbeit macht, und ihr Geschäftsmodell nicht nur darauf auslegt, dass die Internet-Mafia ihnen wohlgesonnen ist.

Mal wieder zeigt sich: Traut keinen Internet-Bewertungen (ich als Zahnarzt auf dem Dorf kann gottlob kein Lied davon singen, aber hätte ich meine Praxis in einer Großstadt, sähe das vermutlich anders aus). Macht euch selbst ein Bild! Fragt andere! Ganz oldschool „IRL“! Weil wie objektiv die Technik-Giganten vorgehen, kann man ja an diesem Beispiel sehen.

Und wenn ihr eine Sauna baut (wo, wenn nicht in Nordostoberfranken sollte man sich eine Sauna bauen): Schaut euch die Öfen von Fintec an und unterstützt die nordostoberfränkische Wirtschaft ;-)