Stranger Than Usual

But nobody came.

— Undertale

Atomarchiv mit RFC 5005

Ich bin jetzt zu etwas gekommen, dass ich schon lange machen wollte, aber immer wieder verschoben habe: Das Atom-Feed dieses Blogs auf mehrere Dateien zu verteilen. Aber warum wollte ich das machen?

Nun, mein Blog hat mittlerweile über 1100 Einträge. Die sind alle vollständig in dem Feed drin. Damit ist das Feed über 3 MiB groß. Komprimiert sind das zwar nur noch knapp 900 kiB (gz mit Zopfli) bzw. knapp 700 (Brotli), aber das ist immer noch eine Menge. Drei Gründe, warum das ein Problem ist:

  1. werden diese Dateien jedes Mal komplett heruntergeladen, wenn es eine Änderung gibt und ein feed-Reader das Feed lesen will
  2. es wird nicht weniger, mit jedem weiteren Post wird die Datei größer
  3. ist die Zopfli-Kompression des Feeds der mit Abstand am längsten dauernde Teil der Seitengenerierung, und muss jedes Mal gemacht werden, wenn ich einen neuen Post hinzufüge oder auch nur die kleinste Änderung vornehme.

Glücklicherweise gibt es RFC 5005, der definiert, wie man Atom-Feeds aufteilen kann. Ich habe mich für ein Feed-Archiv entschieden, weil es dann einfacher sein sollte, weiterhin alle Einträge zu finden und vor allem auch, die alten Feed-Teile unberührt zu lassen (und somit nicht ständig neu komprimieren zu müssen).

Wie ich RFC 5005 implementiert habe

Nach dem RFC muss ich meinen Feed grob in zwei Teile teilen. Zum einen in einen Feed der aktuellen (current) Artikel. Dann in keinen bis beliebig viele Archivdateien. Die Archivdateien werden als im Wesentlichen unveränderlich betrachtet. Sie dürfen sich ändern, aber Feedreader dürfen davon ausgehen, dass sie es nicht tun. Insbesondere sollen keine Einträge hinzukommen.

Sollte sich ein alter Eintrag doch noch wesentlich ändern, muss er (unter derselben ID) noch einmal im Feed der aktuellen Artikel auftauchen. Dabei darf es Überschneidungen zwischen den Feeds geben.

In meinem Fall habe ich als Archivdateien alle abgeschlossenen Jahre des Blogs gewählt. In Beispielen habe ich eine monatliche Aufteilung gesehen, aber so viel schreibe ich dann doch nicht. Das neueste Archiv-Feed ist also momentan 2025. Alle feeds, die im laufenden Jahr erstellt wurden, kommen erst einmal in den aktuellen Feed. Dann alle Artikel, die im laufenden Jahr wesentlich verändert wurden. Dazu kommen in meinem Fall noch alle Artikel, die im Zeitraum eines halben Jahres vor dem aktuellsten Artikel erstellt oder aktualisiert wurden. Das habe ich gemacht, damit nicht am ersten Januar mein ganzes Feed plötzlich leer ist. Nach und nach verschwinden die archivierten Artikel dann aber aus dem aktuellen Feed. Die Artikel des laufenden Jahres kommen allerdings erst nach Ablauf des Jahres in das Archiv.

Der aktuelle Feed verweist auf das jüngste Archiv-Feed, von da an ist es eine verkettete Liste bis zum ältesten Archive-Feed. Alle Archiv-Feeds haben zudem noch einen Link zum aktuellen Feed.

Ich bin mir nicht zu 100% sicher, dass ich den Standard korrekt verstanden und korrekt implementiert habe, aber ich bin sicher genug.

Testphase

Ein Erfolg zeigt sich jetzt schon: die Dateigrößen meines Feeds sind aufgeteilt viel handhabbarer: Alle Dateien sind deutlich kleiner als die Einzeldatei vorher, und im Regelfall muss nur der aktuelle Feed neu geschrieben und komprimiert werden, was die Verzögerung mein Veröffentlichen eines Blogposts um mehrere Sekunden senkt. Sekunden, die vorher sehr nervig gewesen sind.

Ich gehe damit jetzt erst einmal in die Testphase. Glücklicherweise hängt bei mir davon kein Geschäft ab, aber ich bin mir unsicher, wie gut die Unterstützung von RFC 5005 bei Feed-Readern ist.

Warum bin ich skeptisch? Drei Hauptgründe:

  • In Thunderbird zum Beispiel sehe ich nur einen Teil meiner Blogposts. Ich werde aber noch ein paar andere Feedreader ausprobieren
  • bei einer Suche nach „RFC 5005“ fand ich im Netz nicht viel. Die Spezifikation, ein paar Dokumente, dann aber diese Zusammenfassung einer Hobbyradiosendung, wo unter anderem erwähnt wird:

[…] but a solution to let your Atom feed have the cake and eat it too existed already 13 years ago, if only any of our feed readers would adhere to it: RFC 5005, Feed Paging and Archiving

  • ansonsten habe ich eine Menge Tickets auf Github gefunden, wo Leute wollen, dass RFC 5005 implementiert wird. Die meisten davon betreffen Projekte, die den Feed schreiben, aber ein paar betreffen auch Feedreader.

Also mal schauen. Die Adresse des Feeds für dieses Blog hat sich nicht geändert, aber es sind jetzt weniger Blogposts darin. Der rest ist von dem Hauptfeed aus verlinkt. Hoffen wir mal, dass das keine größeren Probleme bereitet.

Winkekatze24

Winkekatzen, original „Maneki-neko“ sind ja mittlerweile auch schon in unserem Kulturkreis bekannt. Klassischerweise aus Keramik und mit einem unbeweglichen Arm, so gibt es sie auch schon seit geraumer Zeit in Plastik mit einem elektrisch winkenden Arm.

Im Chaos-Umfeld werden die Winkekatzen insbesondere mit dem VOC, dem Video Operation Center, das auf Chaosveranstaltungen wie dem Chaos Communication Congress für Videoaufnahmen und Streams zuständig ist, in Verbindung gebracht. Das liegt daran, dass auf den Rednerpulten immer eine solche elektrisch betriebene Winkekatze steht. Damit kann man immer sehen, ob bei einer Kamera gerade das Bild eingefroren ist, selbst wenn sich sonst nichts auf der Bühne bewegt. Die Winkekatze hat es sogar ins Logo des VOC geschafft, unter dem Namen „Voctocat“ (CC BY-SA 4.0 by blinry ):

Eine stilisierte Silhouette einer Winkekatze auf einem schwarzen Hintergrund. Die linke Tatze ist gehoben, mit der rechten Tatze hält die Katze einen „Play“-Button.

Auf dem 39C3 bin ich dann einem Freund begegnet, den ich vom Rollenspielen kenne. Dessen Assembly hat ein Projekt mit Winkekatzen, die alle mit dem Internet verbunden sind und auf Kommando alle gleichzeitig winken und mit den Augen leuchten. Dazu werden handelsübliche Winkekatzen mit beweglichen Armen genommen, mit einem Mikrocontroller versehen, an den Augen operiert (LEDs) und ans Internet angeschlossen.

Jede Katze kriegt einen eigenen Namen. Im Internet kann man dann auf www.winkekatze24.de entweder alle Katzen gleichzeitig zum Winken bringen, oder nur eine spezielle, denn alle angemeldeten Winkekatzen sind dort aufgelistet. Als Backend für Statusupdates und Winkbefehle wird in beide Richtungen MQTT verwendet. Natürlich kann man auch ohne Probleme einen eigenen Server aufsetzen, aber der Spaß ist ja, dass alle Katzen gleichzeitig winken. Wenn ich sehe, dass meine Katze winkt, weiß ich, dass die Katze bei meinem Rollenspielfreund auch winkt, eine Katze in einem hackspace in Birkenhead und einige mehr.

So eine Katze wollte ich auch haben. Und bisher ist es so mäßig gelaufen. Aber ich gebe nicht auf.

Meine eigene Winkekatze

Das Bauset für eine wolche Katze ist eigentlich ganz simpel. Ein Board, ein Mikrocontroller mit integriertem Wlan-Modul, zwei Neopixel-LEDs, ein Transistor und ein paar Widerstände. Sollte selbst für einen Grobmotoriker wie mich machbar sein. Ich habe mir also auf dem 39C3 ein Set besorgt. Die Belichtung dort war aber eher schlecht, also habe ich nach ein paar angelöteten Teilen aufgegeben um die Katze zu Hause weiter zu verarbeiten. Es gibt ja auch genug andere Dinge, die man auf dem Congress tun kann. Ich war die erste volle Januarwoche noch in Hamburg (ohne Lötausrüstung), also musste ich abwarten. Zurück in meiner Wohnung habe ich dann angefangen:

Auf einer Korkoberfläche liegen verschiedene Teile: Kabel, zwei LEDs, ein PCB (auf dem schon ein paar Teile aufgelötet sind), ein Microcontroller und zwei Hälften einer Plastikwinkekatze.

Ich habe eine Weile gelötet und war irgendwann bereit, die Software aufzuspielen, um das Ganze zu testen. Nur: Der Microcontroller (ein Arduino-Derivat) hat zwar einen eigenen USB-Port, aber es ist ein Micro-USB. Kein Problem. Mal schnell das Micro-USB-Kabel gesucht und… Hmm… nicht da. Micro-USB-Netzteil? Ja. USB-A zu: USB-B? Ja. USB-C? Ja. Mini-USB? Ja. Komische proprietäre Anschlüsse? Ja. Micro-USB? Nein.

Ich war mir sicher, dass ich ein solches Kabel hatte. Aber ich habe es nicht gefunden (später hat sich herausgestellt, dass ich es bei meiner Mutter habe lieben lassen). Also ein neues Kabel. Mit über einer Woche Verzögerung konnte ich also weitermachen.

Firmware-woes

Die Software selber war das nächste Problem: Das auf der Website zu dem Zeitpunkt verlinkte Repo auf Github hatte nur eine Uralt-Version. Nun muss man wissen, dass es zwei Varianten gibt, den Arm der Katze zu betreiben: Mit einem Servomotor, an dem direkt der Arm montiert ist, und mit einem Magnetpendel, das durch eine Spule angetrieben wird. Die alte Variante ist die mit dem Servomotor. Die neue ist die mit dem Magnetpendel, und die hat einige Vorteile. Zum einen ist das der Weg, wie die meisten dieser Katzen in der Grundausstattung sowieso arbeiten. Dann ist das Magnetpendel leiser, und zuletzt ist die Bewegung flüssiger.

Der Nachteil ist, dass mein ein paar mehr Teile braucht (u.a. einen Transistor) und die Software anders aussieht (ggf. noch mit einem Hack, um den Arm überhaupt zu starten). Das war in dem alten Repo nicht drin. Dann gab es noch eine Version auf Gitlab. Die war aber nur minimal neuer. Wir hatten auch die ganzen Repos nach Codeberg umgezogen, und dort war jetzt die alte Github-Version. Bei der Bastelanleitung, die ich zu der Katze bekommen habe, war dann auch der richtige Code dabei, den ich allerdings in keinem Repo finden konnte. Wie sich herausgestellt hat, hat jede und jeder, die oder der am Projekt beteiligt war, eine eigene Codeversion gepflegt.

Mit der Version konnte ich dann aber auch noch nicht ohne Weiteres arbeiten. Denn der Code war für eine andere Pinbelegung geschrieben. Keine große Änderung im Code, aber ich musste mich durch das Datenblatt wühlen und die Pins auf die entsprechenden Pin-IDs im Code mappen.

Dann konnte ich den Code installieren und es lief… nur halb. Immerhin: Der Magnet funktionierte korrekt, die Katze hat ordentlich gewunken. Die LED-Augen wiederum gingen nicht.

Augenprobleme

Ich hatte die Augen falsch verlötet und dabei eine der LEDs gehimmelt. Mist. Die andere LED ging noch, und ich hatte ja noch eine ganze Rolle Neopixel-kompatibler LEDs, also könnte ich ja damit weitermachen, oder?

Nein. Was ich auch tat, wie sehr ich auch alle Verbindungen und Schaltkreise überprüfte, die LEDs leuchteten entweder nicht in der korrekten Farbe, nicht hell genug, nur weiß… es war zum Mäusemelken. Ich habe es mit verschiedenen LEDs ausprobiert, nichts funktionierte. Ich habe den Code überprüft. Ich habe die Spezifikation der LEDs überprüft. Ich habe mir Rat bei den Leuten geholt, die diese Katzen entwickelt haben. Keine Lösung.

Am Ende habe ich dann im Februar, als ich in Hamburg war, die Katze dem Freund aus der Rollenspielrunde gegeben, damit er sich die anschauen konnte. Der hat sich die angeschaut und hatte nach eigenen Angaben eine wirklich verzweifelnde Debug-Session, bevor er zum Schluss kam, dass meine Ersatz-LEDs wohl mit dem Controller einfach nicht richtig funktionieren. Er hat die LEDs ersetzt und mir die Katze zugeschickt.

Die ist dann Anfang März wieder bei mir angekommen, und diese Woche bin ich dann dazu gekommen, die Katze zusammenzubauen. Ich musste noch die zweite LED anlöten, und dann gingen die LEDs auch.

Armlähmung

Nun musste ich die Katze nur noch wieder zusammensetzen. Es war ein bisschen Fummelei, die Kabel so zu führen, dass der Arm nicht behindert wird, aber das ging auch. Wieder zusammenschrauben konnte ich die Katze auch nicht, weil ich keinen Schraubendreher hatte, der lang und dünn genug war, um in die Löcher reinzupassen.

Das Bord und der Controller passen auch nicht in die Katze (das geht nur bei größeren Modellen, also habe ich einen kleinen Karton genommen, ein Loch in die Mitte gemacht und die Katze draufgestellt. Das geht.

Das Einzige, was nicht geht, ist der Arm. Obwohl er schon einmal funktioniert hat, und auch bei dem Freund in Hamburg funktioniert hat, ist er hier bewegungslos. Es ist auch kein Softwareproblem. Die Spule kriegt einfach keinen Strom. Die Kabel selber sind in Ordning. Der Pin ist korrekt. Die Lötstellen auch.

Das Proble: Ein winziger, wortwörtlich haardünner Kupferlackdraht, der zur Spule führt, ist durchtrennt. Muss beim Transport passiert sein. Und das kriege ich ums Verrecken nicht repariert. Zumal dieses Mini-Ding ja auch lackiert ist, den Lack müsste ich also vorher irgendwie abkriegen.

Aber vielleicht finde ich eine Ersatzkatze. Die Dinger sind ja billig. Und tatsächlich: Ein Kitschladen hier im Ort hatte welche, in verschiedenen Größen. Ich habe eine in vergleichbarer größe zu meiner jetzigen geholt und… kriege sie nicht aufgeschraubt, weil ich keinen Schraubendreher habe, der lang und dünn genug ist. Bis ich an einen komme, kann gerne noch einmal eine Woche vergehen. Die Ersatzkatze steckt bis dahin in ihrem Ersatzkatzenkasten, der aber nicht mit Ersatzkatzenkastenmatratzen ausgekleidet ist.

Die aktuelle Katze kann immerhin mit den Augen leuchten:

Eine weiße Winkekatze steht auf einem weißen Podest. Ihre Augen (und damit der ganze Kopf) leuchten grün.

Schlusswort

Ich wollte eigentich schon viel früher darüber schreiben, aber ursprünglich wollte ich warten, bis die Katze fertig und einsatzbereit ist. Ich habe in der Zeit, in der ich mit der Katze nicht weiterkam, auch ein paar andere Sachen an dem Projekt gemacht, zum Beispiel die Website überarbeitet (WIP), ein Favicon zur Website hinzugefügt, eine kleine Rust-Bibliothek für die Katze geschrieben (WIP) und eine virtuelle Katze gebaut (WIP). Dazu schreibe ich dann später mehr. Besonders das Favicon war ein Drama, gemessen daran wie klein die Änderung eigentlich war.

Trotz des ganzen Ärgers, den ich damit hatte (ich komme halt mehr mit Software klar als mit Hardware) ist es eine lustige Idee, die natürlich dadurch besser wird, wenn mehr Leute sich so eine Katze basteln, aufstellen und mit den anderen Katzen verbinden. Lasst euch also nicht von meinen Unglücken abschrecken.

Zum Abschluss aber noch ein paar Links (teilweise wiederholt)

Unicode-Herzen und Seelen in Undertale ❤️

Spoiler-Warnung: Weiter unten sind Undertale-Spoiler. Hier oben noch nicht, der folgende Screenshot kommt ziemlich am Anfang des Spiels.

Im Spiel Undertale wir die Seele des Spielercharakters als kleines rotes Herz dargestellt:

Flowey the Flower, eine sonnenblumenähnliche Blume mit Gesicht sagt zum Spieler: “See that heart? That is your SOUL, the very culmination of your being!“. Darunter ist eine große Box, in der ein kleines, rotes Herz ist.

Nun wollte ich mal schauen, wie ich so etwas in Unicode nachstellen kann. Natürlich gibt es einen Herz-Codepoint in Unicode. Es gibt sogar einen ganzen Haufen von Codepoints und Grapheme-Clusters zu Herzen. Genug, dass es eine eigene Seite über Unicode-Herzen auf der englischen Wikipedia gibt.

Das einfachste Herz ist ❤︎, U+2764 HEAVY BLACK HEART. Allerdings nicht notwendigerweise schwarz. Es ist halt in der Schriftfarbe des umgebenden Textes. Es gibt das Herz aber auch mit einem variant selector: ❤️, U+2764 HEAVY BLACK HEART, U+FE0F VARIATION SELECTOR-16, dann wird es üblicherweise als rotes Herz angezeigt.

Es gibt aber noch einen ganzen Haufen anderer Herzen. Von farbigen Herzen über Spielkartenherz und mehr:

❦❧☙♡♥♥︎♥️❤❤︎❤️❥❣🎔❣️🏩💌💒💓💔💕💖💗💘💙💚💛💜💝💞💟🖤😍😘😻🤍🤎🥰🧡🩵🩶🩷🫀❤️‍🩹❤️‍🔥🫶︎

Die meisten davon haben sogar eigene Codepoints. Selbst die Katze mit Herzen als Augen. Wer hätte gedacht, dass es so viele Herzemojis gibt? Und dann gibt es natürlich noch die zwei küssenden Personen und zwei Personen mit Herz, in allen möglichen Hautfarbenkombinationen:

💏💏🏻💏🏼💏🏽💏🏾💏🏿🧑🏻‍❤️‍💋‍🧑🏽🧑🏻‍❤️‍💋‍🧑🏾🧑🏻‍❤️‍💋‍🧑🏿🧑🏼‍❤️‍💋‍🧑🏻🧑🏼‍❤️‍💋‍🧑🏽🧑🏼‍❤️‍💋‍🧑🏾🧑🏼‍❤️‍💋‍🧑🏿🧑🏽‍❤️‍💋‍🧑🏻🧑🏽‍❤️‍💋‍🧑🏼🧑🏽‍❤️‍💋‍🧑🏾🧑🏽‍❤️‍💋‍🧑🏿🧑🏾‍❤️‍💋‍🧑🏻🧑🏾‍❤️‍💋‍🧑🏼🧑🏾‍❤️‍💋‍🧑🏽🧑🏾‍❤️‍💋‍🧑🏿🧑🏿‍❤️‍💋‍🧑🏻🧑🏿‍❤️‍💋‍🧑🏼🧑🏿‍❤️‍💋‍🧑🏽👨‍❤️‍💋‍👨👨🏻‍❤️‍💋‍👨🏻👨🏻‍❤️‍💋‍👨🏼👨🏻‍❤️‍💋‍👨🏽👨🏻‍❤️‍💋‍👨🏾👨🏻‍❤️‍💋‍👨🏿👨🏼‍❤️‍💋‍👨🏻👨🏼‍❤️‍💋‍👨🏼👨🏼‍❤️‍💋‍👨🏽👨🏼‍❤️‍💋‍👨🏾👨🏼‍❤️‍💋‍👨🏿👨🏽‍❤️‍💋‍👨🏻👨🏽‍❤️‍💋‍👨🏼👨🏽‍❤️‍💋‍👨🏽👨🏽‍❤️‍💋‍👨🏾👨🏽‍❤️‍💋‍👨🏿👨🏾‍❤️‍💋‍👨🏻👨🏾‍❤️‍💋‍👨🏼👨🏾‍❤️‍💋‍👨🏽👨🏾‍❤️‍💋‍👨🏾👨🏾‍❤️‍💋‍👨🏿👨🏿‍❤️‍💋‍👨🏻👨🏿‍❤️‍💋‍👨🏼👨🏿‍❤️‍💋‍👨🏽👨🏿‍❤️‍💋‍👨🏾👨🏿‍❤️‍💋‍👨🏿👩‍❤️‍💋‍👩👩🏻‍❤️‍💋‍👩🏻👩🏻‍❤️‍💋‍👩🏼👩🏻‍❤️‍💋‍👩🏽👩🏻‍❤️‍💋‍👩🏾👩🏻‍❤️‍💋‍👩🏿👩🏼‍❤️‍💋‍👩🏻👩🏼‍❤️‍💋‍👩🏼👩🏼‍❤️‍💋‍👩🏽👩🏼‍❤️‍💋‍👩🏾👩🏼‍❤️‍💋‍👩🏿👩🏽‍❤️‍💋‍👩🏻👩🏽‍❤️‍💋‍👩🏼👩🏽‍❤️‍💋‍👩🏽👩🏽‍❤️‍💋‍👩🏾👩🏽‍❤️‍💋‍👩🏿👩🏾‍❤️‍💋‍👩🏻👩🏾‍❤️‍💋‍👩🏼👩🏾‍❤️‍💋‍👩🏽👩🏾‍❤️‍💋‍👩🏾👩🏾‍❤️‍💋‍👩🏿👩🏿‍❤️‍💋‍👩🏻👩🏿‍❤️‍💋‍👩🏼👩🏿‍❤️‍💋‍👩🏽👩🏿‍❤️‍💋‍👩🏾👩🏿‍❤️‍💋‍👩🏿👩‍❤️‍💋‍👨👩🏻‍❤️‍💋‍👨🏻👩🏻‍❤️‍💋‍👨🏼👩🏻‍❤️‍💋‍👨🏽👩🏻‍❤️‍💋‍👨🏾👩🏻‍❤️‍💋‍👨🏿👩🏼‍❤️‍💋‍👨🏻👩🏼‍❤️‍💋‍👨🏼👩🏼‍❤️‍💋‍👨🏽👩🏼‍❤️‍💋‍👨🏾👩🏼‍❤️‍💋‍👨🏿👩🏽‍❤️‍💋‍👨🏻👩🏽‍❤️‍💋‍👨🏼👩🏽‍❤️‍💋‍👨🏽👩🏽‍❤️‍💋‍👨🏾👩🏽‍❤️‍💋‍👨🏿👩🏾‍❤️‍💋‍👨🏻👩🏾‍❤️‍💋‍👨🏼👩🏾‍❤️‍💋‍👨🏽👩🏾‍❤️‍💋‍👨🏾👩🏾‍❤️‍💋‍👨🏿👩🏿‍❤️‍💋‍👨🏻👩🏿‍❤️‍💋‍👨🏼👩🏿‍❤️‍💋‍👨🏽👩🏿‍❤️‍💋‍👨🏾👩🏿‍❤️‍💋‍👨🏿💑💑🏻💑🏼💑🏽💑🏾💑🏿🧑🏻‍❤️‍🧑🏼🧑🏻‍❤️‍🧑🏽🧑🏻‍❤️‍🧑🏾🧑🏻‍❤️‍🧑🏿🧑🏼‍❤️‍🧑🏻🧑🏼‍❤️‍🧑🏽🧑🏼‍❤️‍🧑🏾🧑🏼‍❤️‍🧑🏿🧑🏽‍❤️‍🧑🏻🧑🏽‍❤️‍🧑🏼🧑🏽‍❤️‍🧑🏾🧑🏽‍❤️‍🧑🏿🧑🏾‍❤️‍🧑🏻🧑🏾‍❤️‍🧑🏼🧑🏾‍❤️‍🧑🏽🧑🏾‍❤️‍🧑🏿🧑🏿‍❤️‍🧑🏻🧑🏿‍❤️‍🧑🏼🧑🏿‍❤️‍🧑🏽🧑🏿‍❤️‍🧑🏾👨‍❤️‍👨👨🏻‍❤️‍👨🏻👨🏻‍❤️‍👨🏼👨🏻‍❤️‍👨🏽👨🏻‍❤️‍👨🏾👨🏻‍❤️‍👨🏿👨🏼‍❤️‍👨🏻👨🏼‍❤️‍👨🏼👨🏼‍❤️‍👨🏽👨🏼‍❤️‍👨🏾👨🏼‍❤️‍👨🏿👨🏽‍❤️‍👨🏻👨🏽‍❤️‍👨🏼👨🏽‍❤️‍👨🏽👨🏽‍❤️‍👨🏾👨🏽‍❤️‍👨🏿👨🏾‍❤️‍👨🏻👨🏾‍❤️‍👨🏼👨🏾‍❤️‍👨🏽👨🏾‍❤️‍👨🏾👨🏾‍❤️‍👨🏿👨🏿‍❤️‍👨🏻👨🏿‍❤️‍👨🏼👨🏿‍❤️‍👨🏽👨🏿‍❤️‍👨🏾👨🏿‍❤️‍👨🏿👩‍❤️‍👩👩🏻‍❤️‍👩🏻👩🏻‍❤️‍👩🏼👩🏻‍❤️‍👩🏽👩🏻‍❤️‍👩🏾👩🏻‍❤️‍👩🏿👩🏼‍❤️‍👩🏻👩🏼‍❤️‍👩🏼👩🏼‍❤️‍👩🏽👩🏼‍❤️‍👩🏾👩🏼‍❤️‍👩🏿👩🏽‍❤️‍👩🏻👩🏽‍❤️‍👩🏼👩🏽‍❤️‍👩🏽👩🏽‍❤️‍👩🏾👩🏽‍❤️‍👩🏿👩🏾‍❤️‍👩🏻👩🏾‍❤️‍👩🏼👩🏾‍❤️‍👩🏽👩🏾‍❤️‍👩🏾👩🏾‍❤️‍👩🏿👩🏿‍❤️‍👩🏻👩🏿‍❤️‍👩🏼👩🏿‍❤️‍👩🏽👩🏿‍❤️‍👩🏾👩🏿‍❤️‍👩🏿👩‍❤️‍👨👩🏻‍❤️‍👨🏻👩🏻‍❤️‍👨🏼👩🏻‍❤️‍👨🏽👩🏻‍❤️‍👨🏾👩🏻‍❤️‍👨🏿👩🏼‍❤️‍👨🏻👩🏼‍❤️‍👨🏼👩🏼‍❤️‍👨🏽👩🏼‍❤️‍👨🏾👩🏼‍❤️‍👨🏿👩🏽‍❤️‍👨🏻👩🏽‍❤️‍👨🏼👩🏽‍❤️‍👨🏽👩🏽‍❤️‍👨🏾👩🏽‍❤️‍👨🏿👩🏾‍❤️‍👨🏻👩🏾‍❤️‍👨🏼👩🏾‍❤️‍👨🏽👩🏾‍❤️‍👨🏾👩🏾‍❤️‍👨🏿👩🏿‍❤️‍👨🏻👩🏿‍❤️‍👨🏼👩🏿‍❤️‍👨🏽👩🏿‍❤️‍👨🏾👩🏿‍❤️‍👨🏿

Spoiler: Seelen in Undertale

Aber eigentlich bin ich ja wegen Undertale hier. Menschliche Seelen in Undertale sind farbig. Für alle Menschenseelen, die in Undertale vorkommen, gibt es eine Unicode-Darstellung: ❤️🩵🧡💙💜💚💛. Asgore, der König der Monster, sammelt sieben Menschenseelen, um die Monster aus ihrem unterirdischen Gefängnis zu befreien (lange Geschichte. Eigentlich ist er ein ganz netter Kerl, wenn er nicht gerade Kinder umbringt).

Aber Monster haben auch Seelen. Nur sind die bei weitem nicht so stark wie Menschenseelen. Und im Gegensatz zu Menschenseelen überleben sie den Körper nicht, oder, im Fall von Boss-Monstern, nur sehr kurz. Monsterseelen werden weiß dargestellt, und stehen, im Verhältnis zu den Menschenseelen, auf dem Kopf. In Unicode gibt es auch ein weißes Herz 🤍, aber es steht falsch herum. Ich habe recherchiert, aber es gibt kein umgekehrtes Herzsymbol. Zumindest konnte ich keins finden.

Und da die allermeisten Monster in Undertale ziemlich nett sind (wenn auch verzweifelt, weil sie eingesperrt sind), finde ich, dass es auch ein umgekehrtes weißes Herz geben müsste, für die Monster.

Aufmerksamkeit für Long Covid

Den Begriff „Long Covid“ hat wohl jeder hier im Land schon einmal gehört. Für mich war es eigentlich immer nur ein vager Begriff für Langzeitfolgen einer Covid-19-Erkrankung. Und so geht es wohl vielen Leuten in Deutschland. Dabei ist ME/CFS, die amscheinend verbreiteteste Form von Long Covid, wirklich eine extreme Krankheit, die normales Leben praktisch unmöglich macht.

Wie gefährlich es ist, dass diese Krankheit selbst unter Ärzten kaum bekannt ist, ist in diesem Blogpost beschrieben. Das ganze Blog ist eine Sammlung von Posts, um über Long Covid aufzuklären. Auch MaithinkX hat eine Folge zu Long Covid. Ich habe keine Ahnung ob und wann die depubliziert wird, bei Interesse solltet ihr sie euch aber bald anschauen.

Ich selbst habe keine Ahnung und möchte deswegen nur darauf hinweisen, dass ihr euch darüber informieren solltet. Nicht, um euch Angst zu machen, aber um darüber zu wissen und Solidarität für die Erkrankten aufzubauen.

Keine Daten ⇒ kein Datenschutzproblem

Einer der wichtigsten Grundsätze des Datenschutzes ist die Datensparsamkeit. Kurz gesagt bedeutet dass, das man nur die Daten erfasst, die man unbedingt braucht, und diese löscht, sobald man sie nicht mehr braucht. Aber warum eigentlich?

Signal Messenger

Man kann das zum Beispiel daran sehen, welche Daten der sichere Messenger Signal herausgibt, wenn er einer gerichtlichen Anordnung bekommt. In einem Rechtsstaat kann man manchmal gezwungen werden, bestimmte Daten herauszugeben. In Unrechtsstaaten kann man häufig gezwungen werden, Daten herauszugeben. In diesem Fall geht es um eine Anordnung in den USA (die würde ich noch als Rechtsstaat betrachten, aber daran wird ja gerade auch gearbeitet). Laut dieser Anordnung sollte Signal alle Informationen über 37 Telefonnummern herausreichen. Zu 30 davon gab es bei Signal Accounts. Zu 24 davon hatte Signal keine weiteren Informationen, zu den restlichen 6 nur das Erstellungsdatum des Accounts.

Das ist, warum man Datensparsamkeit braucht. Um ehrlich zu sein, ich finde man könnte die Telefonnummer auch noch weglassen, aber ignorieren wir das mal kurz. Die Direktnachrichten End-zu-End zu verschlüsseln ist ein guter Anfang, aber um wirklich Datenschutz zu gewährleisten, müssen auch die Metadaten geschützt sein. Und Daten, die es nicht gibt, können nicht geleaked werden, ob von Gerichten oder von Kriminellen.

Als Bonus hat Signal sich noch erkämpft, dass sie diese Behördenanfrage veröffentlichen durften, was nicht so ohne weiteres Möglich war.

Posteo

Ein anderes gutes Beispiel ist der deutsche Mailprovider Posteo. Der erlaubt auch, Konten möglichst anonym anzulegen und trennt sogardie Zahlungsdaten vom Account. Man lädt sich ab und zu ein Guthaben auf den Account und später kann dann kaum noch nachverfolgt werden, welches Geld welchem Account zugute kam.

Posteo veröffentlicht regelmäßig einen Transparenzbericht. Darin steht, wie viele Anfragen von Behörden sie bekommen haben und welche Daten sie herausgegeben haben. Posteo speichert auch keine IP-Adressen, obwohl sie, wenn ich mich recht erinnere, mal dazu verdonnert wurden, IP-Adressen in Einzelfällen zu speichern (kann aber die Quelle dazu nicht mehr finden).

Posteo achte auch sehr darauf, dass alle Behördenanfragen rechtlich korrekt sind, auf einem sicheren Weg (End-zu-End-verschlüsselt) gestellt werden und führt im Transparenzbericht auch eine Anzahl von Beschwerden auf die sie bei Datenschutzbehörden machen, wenn diese Regeln nicht eingehalten werden.

Datenreichtum

Datensparsamkeit ist also die beste und einfachste Möglichkeit zu verhindern, dass Daten in die falschen Hände geraten. Aber „Datensparsamkeit“ klingt so… nach Armut. Deswegen hat Angela Merkel schon 2016 „Datenreichtum gefordert. Damals war halt „Big Data“ der Hype in der IT-Industrie, um später von „Blockchain“ und danach von „AI“ abgelöst zu werden (wobei Big Data sicherlich für das Trainieren von den Maschinenlernmodellen genutzt wurde).

Nun haben das Kritiker dann satirisch übernommen. Jedes Mal, wenn es irgendwo ein größeres Datenleck bekannt wurde, in dem tausende, wenn nicht Millionen von Menschen betroffen waren, wurde das „Datenreichtum genannt“. Ich finde, wir sollten das beibehalten. Denn solche Datenlecks passieren leider immer noch mit erschreckender Regelmäßigkeit. Aber wenn die Daten nicht vorhanden sind, können sie auch nicht aus einem Datenleck herausfließen. Deswegen bitte Datensparsamkeit.

Rollenspielszenen: Wiedersehensfreude

Rollenspielszene: Seit dem letzten Abenteuer sind fünf Jahre vergangen. Es ist ein sonniger Frühlingsmorgen. Die meisten Bewohner von Geylis sind schon auf den Beinen, aber Nini ist ein Morgenmuffel. Verschlafen rollt zie sich aus dem Bett, schwebt aus dem Haus zum Marktplatz, wo zir eine Cani „dasselbe wie immer?“ zuruft und zir einen Becher Kathia reicht. Nini schlürft das stimulierende Getränk langsam, als zie plötzlich ein Gesicht sieht, dass zie seit Monaten nicht gesehen hat: Es ist Sprinkle, ein Orren, der sich in den letzten Jahren hauptsächlich in der Wildnis und in einem nahegelegenen Orrendorf aufgehalten hat.

Alle Müdigkeit ist vergessen. Nini lässt den Becher fallen, fliegt auf auf Sprinkle zu, umarmt ihn mit dem ganzen Körper und ruft „Sprinkle! Nini hat dich vermisst!“

Anleitung: SVG-Dateien optimieren

Ich habe ja aus irgendeinem Grund enorm viel Spaß daran, SVG-Dateien in ihrer Größe zu optimieren. Zum Beispiel Napstablook, das curl-Logo oder neulich Graphen mit Blogstatistiken. Das geht oft weit über das hinaus, was ökonomisch sinnvoll wäre, aber ich werde ja sowieso nicht für dieses Blog bezahlt, also kann ich mir das auch leisten.

Nur habe ich glaube ich nie genauer beschrieben, wie ich das eigentlich mache. Nur ein paar Andeutungen hier und da, und ein Verweis auf svgo. Also dachte ich mir, ich könnte mal eine Anleitung dazu schreiben. Ich habe mir also ein einfaches Beispiel gesucht, und zwar die Blogstatistik von Schafe sind bessere Rasenmäher (CC BY-NC-SA 4.0 Robert Lützner):

Ein einfacher Graph, an dessen x-Achse Jahreszahlen von 2022 bis 2026 stehen.

Ich gehe hier Schritt für Schritt vor. Wenn nicht anders erwähnt, sind die Umwandlungen verlustfrei, zumindest was die Anzeige der Grafik angeht. Die vollständigen Dateien nach jedem Schritt habe ich in ein Repo auf codeberg gepackt. Los geht's!

Schritt 0: Originaldatei

Größe: 1561 Byte

Naja, nicht ganz Original. Die Datei war eingebettet in das HTML der Ursprungsseite. Ich habe sie herausgetrennt, das ID-Attribut entfernt (ist hier nicht wichtig) und ein namespace-Attribut (xmlns="http://www.w3.org/2000/svg") hinzugefügt, damit die Datei von z.B. Firefox richtig erkannt wird, wenn es keine anderen Hinweise auf den Typ gibt.

Die Datei ist maschinell erstellt und hat deswegen wenige oder keine unnötigen Leerzeichen.

Schritt 1: svgo

Größe: 1003 Byte

Ein Standardtool zur Optimierung von SVG-Dateien ist svgo. Das läuft schnell durch und in den meisten Fällen ist es auch die ökonomischste Variante, es dabei zu belassen. Aber nicht hier. Ich habe die Datei mit svgo --multipass --pretty optimiert. --multipass, damit Optimierungsmaßnahmen, die beim ersten Durchlauf übersehen wurden, auch gemacht werden. --pretty, um es beim Bearbeiten leichter zu haben. Das fügt zwar eine Menge Leerzeichen ein, die alle Platz brauchen, aber es lohnt sich trotzdem schon. Die Datei ist um ein gutes Drittel kleiner.

Wie geht das? Nun, die Originaldatei enthält ein <polyline>-Element für den Graphen selber und mehrere line-Elemente für die Markierung der Jahreszahlen. Das ist nicht falsch, aber beide Elemente können mit dem generischen <path>-Element deutlich effizienter dargestellt werden. Und deutlich schwerer lesbar. So wird zum Beispiel aus diesem Element:

<line x1="7" x2="7" y1="150" y2="210" style="stroke:#000;stroke-width:1"></line>

dieses hier (und ohne explizites End-Tag ist es auch noch einmal ein bisschen kürzer).

<path style="stroke:#000;stroke-width:1" d="M7 150v60"/>

Schritt 2: Gruppieren

Größe: 905 Byte

Der Output von svgo ist gut, aber wir können noch ein bisschen mehr optimieren. Und zwar indem wir die Elemente ein bisschen umsortieren und gruppieren.

Nun ist die Reihenfolge der Elemente in SVG-Dateien eigentlich nicht egal. Was zuerst kommt, wird zuerst gemalt, was danach kommt übermalt eventuell das, was vorher kommt. In diesem konkreten Fall aber brauchen wir uns darum keine Sorgen machen, da die einzigen Überschneidungen schwarz auf schwarz sind und man so nicht sieht, wenn sich etwas überschneidet.

Wir können also aus diesem Block hier:

<path style="stroke:#000;stroke-width:1" d="M7 150v60"/>
<text font-size="20" transform="rotate(-90 116 89)">2022</text>
<path style="stroke:#000;stroke-width:1" d="M187 150v60"/>
<text font-size="20" transform="rotate(-90 206 -1)">2023</text>
<path style="stroke:#000;stroke-width:1" d="M367 150v60"/>
<text font-size="20" transform="rotate(-90 296 -91)">2024</text>
<path style="stroke:#000;stroke-width:1" d="M547 150v60"/>
<text font-size="20" transform="rotate(-90 386 -181)">2025</text>
<path style="stroke:#000;stroke-width:1" d="M727 150v60"/>
<text font-size="20" transform="rotate(-90 476 -271)">2026</text>

den code hier machen:

<g style="stroke:#000;stroke-width:1">
    <path d="M7 150v60"/>
    <path d="M187 150v60"/>
    <path d="M367 150v60"/>
    <path d="M547 150v60"/>
    <path d="M727 150v60"/>
</g>
<g font-size="20">
    <text transform="rotate(-90 116 89)">2022</text>
    <text transform="rotate(-90 206 -1)">2023</text>
    <text transform="rotate(-90 296 -91)">2024</text>
    <text transform="rotate(-90 386 -181)">2025</text>
    <text transform="rotate(-90 476 -271)">2026</text>
</g>

Hier sind drei Dinge passiert. Erstens habe ich die Elemente umsortiert, wie schon angekündigt. Dann habe ich Elemente mit gleichen Attributen in <g>-Elemente, also Gruppierungselemente gesteckt. Drittens habe ich dann die Attribute in das <g>-Element verschoben. Gruppenattribute gelten nämlich für alle Elemente der Gruppe. Dadurch spart man Wiederholungen und somit Platz.

In diesem Fall hebt der gesparte Platz sogar die Codeeinrückung wieder auf. Die kommt zwar am Ende sowieso weg, fügt aber in diesem Zwischenschritt noch ein bisschen an Dateigröße hinzu.

Schritt 3: Style-Attribut

Größe: 882 Byte

Viele Eigenschaften von SVG-Elementen kann man sowohl mit dedizierten Attributen als auch mit dem style-Attribut abbilden. Rein vom Geschmack her bevorzuge ich die dedizierten Attribute, und in vielen Fällen sind sind die auch kürzer als ein Style-Attribut.

So kann man zum Beispiel statt

style="fill:none;stroke:#000;stroke-width:2"

folgendes machen:

fill="none" stroke="#000" stroke-width="2"

Zugegeben, das sind nur zwei Byte. Häufig kann man aber auch manche Attribute vollständig weglassen, weil sie der Standardeinstellung entsprechen, z.B.

style="stroke:#000;stroke-width:1"

vs.

stroke="#000"

Dieser Schritt bringt nicht immer etwas, aber oft genug, und besonders, wenn man mit Exports von Programmen wie inkscape arbeitet, die gerne einen ganzen Haufen unnützer Styles an ein Element hängen. svgo übrigens kann das auch, wenn man es mit einer Konfigurationsdatei konfiguriert, aber dazu später mehr.

Schritt 4: Zusammenfassen von Pfaden

Größe: 777 Byte

Das path-Element hat den Vorteil, dass es beliebig lange, auch unterbrochene Pfadteile aufnehmen kann. svgo ist gut darin, das zu erkennen und Pfade zusammenzufügen, die ansonsten gleiche Eigenschaften haben.

Warum hat svgo das dann hier noch nicht gemacht? Weil die Pfade, die man zusammenhängen könnte durch andere Elemente (die Jahreszahlen) getrennt waren und svgo nicht erkennen kann, dass das kein Problem ist (wie gesagt: Reihenfolge ist in SVG-Datein grundsätlich erst einmal relevant).

Wir haben aber in Schritt 2 umsortiert, also kann svgo die Pfade jetzt ohne Probleme zusammenfügen. Auch die Gruppe können wir uns dann sparen. Damit wird aus dem hier:

<g stroke="#000">
    <path d="M7 150v60"/>
    <path d="M187 150v60"/>
    <path d="M367 150v60"/>
    <path d="M547 150v60"/>
    <path d="M727 150v60"/>
</g>

dieses deutlich kürzere Stück code:

<path stroke="#000" d="M7 150v60M187 150v60M367 150v60M547 150v60M727 150v60"/>

Aber hey, da ist doch noch ein Pfad, der eigentliche Graph! Warum werden die beiden nicht zusammengefügt? Der erste Pfad hat eine andere Linienstärke als der zweite, deswegen müssen sie getrennt bleiben.

Schritt 5: Whitespace entfernen

Größe: 706 Byte

Zum Schluss lassen wir noch einmal svgo über das Ganze laufen. Dieses Mal nur mit --multipass, ohne --pretty. Damit werden auch die überschüssigen Leerzeichen entfernt.

Wir haben es also in diesem Beispiel geschafft, eine Datei von 1561 byte auf 706 Byte zu reduzieren, das sind fast 55% weniger. In anderen Fällen, wie den Outputs von gnuplot, habe ich es sogar um Faktor 6 reduziert. Das hier war ein einfaches Beispiel. Es gibt noch ein paar andere Wege, die Größen zu optimieren.

Weitere Optimierungsmöglichkeiten

Da wäre zunächst die Präzision der Kommazahlen, z.B. in Pfaden. Hier nicht relevant, weil wir nur Ganzzahlen haben. Auch ist diese Technik nicht verlustfrei. Man muss also nach Augenmaß vorgehen. In vielen Fällen konnte ich aber mit einer Präzision von zwei Nachkommastellen keinen Unterschied zum Original erkennen, auch stark hereingezoomed nicht. svgo kann das mit der Option --precision, z.B. --precision 2 für maximal zwei Nachkommastellen.

Überhaupt bietet svgo noch einige Plugins an, um Dateien weiter zu optimieren. Manche davon sollte man aber mit Vorsicht genießen, weil sie nicht in jedem Fall ein korrektes Ergebnis liefern. Die Liste der Plugins kann man mit --show-plugins anzeigen. Die Plugins zu konfigurieren ist ein bisschen umständlich. Man muss eine JS-Datei anlegen, in der dann die aktiven Plugins aufgelistet werden. Die Datei kann z.B. so aussehen:

module.exports = {
  plugins: [
    {
      name: 'convertTransform',
      params: {
      },
    },
  ],
};

Hier wird das convertTransform-Plugin aktiviert. Das rechnet Transformationen auf Pfaden so um, dass die Tansformation verschwindet und die Pfade selbst Koordinaten haben, die sie nach der Transformation gehabt hätten. Wegen Rundungsfehlern ist auch das nicht ganz verlustfrei.

Eine wichtige Information bezüglich der Konfigurationsdateien: Wenn man eine nutzt, dann sind nur die aufgelisteten Plugins aktiv. Also auch nicht die, die sonst standardmäßig aktiv sind (es sei denn, sie sind in der Datei aufgelistet). Also entweder alle lugins hinzufügen oder die Konfigurationsdatei nur selektiv (mit der --config-Option) verwenden.

Wichtig: Wenn die Konfigurationsdatei svgo.config.js heißt, wird sie automatisch angewandt (so lange sie im aktuellen Verzeichnis oder in einem darüberliegenden Verzeichnis liegt). Wenn man dann nicht alle Standardplugins in dieser Datei hat, kriegt man unter Umständen schlechte Ergebnisse mit svgo.

Ansonsten kann ich svgo nur sehr empfehlen, aber es schadet auch nicht, ab und zu mal zu schauen, was man noch von Hand optimieren kann. Zumindest nicht, wenn man so verrückt ist wie ich.

Blogstatistiken: Anzahl Posts pro Jahr / Monat

Ich bin gestern über einen Blogpost gestolpert, in dem der Blogger aus seinem Hugo-Blog eine Statistik über die Anzahl der Blogposts erstellt. Die hat er dann als Graph in den Seitenheader gesteckt.

Das hat mich inspiriert, selber mal eine Statistik über die Blogs pro Monat bzw. pro Jahr zu erstellen. Nichts, was ich in den Header stecken würde, aber etwas für einen Blogpost. Mein letzter Versuch mit Blogstatistiken, damals über Tag-Kombinationen war ja ziemlich langweilig, aber eine Anzahl der Blogposts über die Zeit ist ja interessanter. Ich habe also mein Blogstatistik-Programm ein wenig erweitert, ein Gnuplot-Script erstellt und schwupps habe ich ein paar schöne Graphen.

Um ehrlich zu sein: Ich habe mehr Zeit verwendet, den Graphen schön zu machen und die Größe der SVG-Dateien manuell um eine Größenordnung zu verringern als mich das eigentliche Sammeln der Statistik gekostet hat. Aber nun zum ersten Graphen: Anzahl der Blogposts über die Jahre hinweg:

Die Anzahl der Blogposts pro Jahr nimmt von 2009 ab (mit einem kleinen Spike in 2014), und bleibt von 2016 bis 2019 unter 10. Danach steigt sie wieder.

In der Anfangszeit (mein erstes, nicht selbst-gehostetes Blog) war ich sehr aktiv, was dann abgenommen hat. 2014 gab es einen Spike, wegen meines Kochprojektes. Als ich dann angefangen habe, in Hamburg zu arbeiten ist die Anzahl der Blogpost stark zurückgegangen, bis zu einem Minimum von nur 4 Posts in 2019. Dann, 2020, habe ich wieder mehr gepostet und vor allem auch meine Blogsoftware erneuert. Vielleicht hat mich das ja auch dazu motiviert, wieder mehr zu schreiben.

2025 war dann wieder ein sehr produktives Jahr. Das Jahr mit den drittmeisten Blogposts in diesem Blog überhaupt. Und die dürften auch im Schnitt deutlich länger sein als die Posts aus 2009 und 2010, die Jahre mit den meisten Posts.

Eine Monatsaufstellung habe ich auch:

Im Prinzip das gleiche Bild wie in der Jahresaufstellung, nur feiner aufgeschlüsselt nach Monaten.

Mit Abstand der Monat mit den meisten Posts war der allererste Monat des Blogs, Februar 2008. Ich habe auch das jeweils laufende Jahr bzw. den laufenden Monat mit reingenommen, obwohl da noch etwas dazu kommt. Mit dem aktuellen Stand hat 2026 aber gute Chancen, wieder auf einem der ersten Plätze zu landen.

Wenn ich mich das nächste Mal um Statistiken kümmere, dann schaue ich mir vielleicht einmal die Länge der Blogposts über die Zeit an (mittlere Länge und Varianz). Könnte vielleicht ganz interessant sein.

⍼ Angzarr Azimut ⍼

Das Rätsel des Angzarr ist gelöst. Es stammt wohl aus einem deutschen Symbolkatalog aus den späten 1940ern / frühen 1950ern. Es steht für Azimut, eine der Koordinaten am Himmel.

Dieselbe Person, die auch damals schon recherchiert hat, hat dazu einen kleinen Blogpost veröffentlicht, auch mit Scans des Symbolkatalogs.

Im Übrigen finde ich, dass sich „Angzarr Azimut“ wie ein Zauberspruch anhört. Oder wie der Name eines Zauberers. Vielleicht kann ich das ja in eine Rollenspielrunde einbauen :)