<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="https://csenf.de/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>csenf.de</title>
    <link>https://csenf.de/</link>
    <atom:link href="https://csenf.de/feed/rss.xml" rel="self" type="application/rss+xml" />
    <description></description>
    <language>de-DE</language>
    <item>
      <title>Rabbithole Währungsconverter</title>
      <link>https://csenf.de/posts/rabbithole-waehrungsconverter/</link>
      <description>&lt;section class=&quot;timeline&quot;&gt;&lt;ul&gt;&lt;li&gt;Ich verreise recht viel und habe mir dazu einen Shortcut eingerichtet, der mir einen Betrag von einer Währung in die andere umrechnet:&lt;ul&gt;&lt;li&gt;Beim Start einer Reise suche ich den aktuellen Umrechnungskurs zur Währung von meinem Zielland heraus und trage ihn in den Shortcut ein.&lt;/li&gt;&lt;li&gt;Auf einem Homescreen zum Reisen lebt der Shortcut und nach Eingabe des Betrages zeigt er mir an, wieviel das in etwa in Euro oder in Schweizer Franken ist.&lt;/li&gt;&lt;li&gt;Danach bietet er mir an, den Betrag als Ausgabe zu protokollieren. Das übernimmt dann ein anderer Shortcut, der das in eine Numbers-Tabelle einträgt.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Es wäre eigentlich ganz cool, wenn der Shortcut nun den Umrechnungskurs selbst ermittelt.&lt;/li&gt;&lt;li&gt;Perplexity gefragt, wie das gehen könnte. Wir verwenden die Pro Version, von der man jeden Tag immer ein paar Happen bekommt.&lt;ul&gt;&lt;li&gt;Es wirft ein paar Vorschläge für online verfügbare APIs aus:&lt;ul&gt;&lt;li&gt;Frankfurter (frankfurter.app) hat nur 30 Währungen&lt;ul&gt;&lt;li&gt;funktioniert ohne Anmeldung einfach so&lt;/li&gt;&lt;li&gt;Die beiden interessanten für mich COP und VND sind nicht dabei.&lt;/li&gt;&lt;li&gt;Habe etwas über die API gelernt&lt;/li&gt;&lt;li&gt;Habe gelernt, einen Shortcut, der json für eine URL abruft anzulegen und einen json Key aus dem dictionary zu extrahieren&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Open Exchange Rates&lt;ul&gt;&lt;li&gt;Funktioniert nur mit Anmeldung. In der Dokumentation stehen bereits alle unterstützten Währungen&lt;/li&gt;&lt;li&gt;Account angelegt&lt;/li&gt;&lt;li&gt;E-Mail notwendig&lt;/li&gt;&lt;li&gt;API Key abgerufen&lt;/li&gt;&lt;li&gt;Die API ist die gleiche wie bei Frankfurter. Man übergibt eine base-Währung und erhält die Umrechnungskurse.&lt;/li&gt;&lt;li&gt;das Extrahieren funktioniert nicht&lt;/li&gt;&lt;li&gt;In der Fehlermeldung steht drin, dass das Setzen der Base Währung nur mit einem bezahl Account möglich ist&lt;/li&gt;&lt;li&gt;Für ein Spass Projekt erst mal keine Alternative&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://fixer.io&quot;&gt;fixer.io&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Das Anlegen eines Accounts ist eine Herausforderung. Neben den wirklich notwendigen Daten wie E-Mail-Adresse, wollen sie eine Adresse eine richtige Adresse haben - für die Rechnung, die sie womöglich mal stellen&lt;/li&gt;&lt;li&gt;Auch hier ist das Setzen der Base-Währung in der freien API nicht dabei.&lt;/li&gt;&lt;li&gt;Die Standard Base Währung ist ebenfalls Euro&lt;/li&gt;&lt;li&gt;In der Dokumentation erfährt man nicht, welche Währungen sie unterstützen. Dafür muss man bereits die API abrufen. Das ist etwas dürftig.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Nun ja. Online-APIs kann man verwenden. Aber für eine andere base-Währung als Euro oder Dollar muss man die Umrechnung in die Zielwährung selbst machen.&lt;/li&gt;&lt;li&gt;Aber das ist kein Problem.&lt;/li&gt;&lt;li&gt;Perplexity sagt ausserdem, dass man das Ergebnis für einen Tag zwischenspeichern sollte in einem Cache um unnötige API Aufrufe zu vermeiden&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Okay, die Abrufe mit fixer API lassen sich also programmieren. Ein paar Suchen nach bereits fertigen Lösungen später, habe ich auch einen &lt;a href=&quot;https://routinehub.co/shortcut/2332/&quot;&gt;Shortcut von robric18&lt;/a&gt; gefunden, der das bereits implementiert hat, dass man Ergebnis zwischen speichert.&lt;ul&gt;&lt;li&gt;Er verwendet eine ganz andere API, die inzwischen keinen kostenlos verwendbaren Endpunkt anbietet.&lt;/li&gt;&lt;li&gt;Als Inspiration ist es aber ganz nützlich&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ich habe das nun in einige separate Shortcuts ausgelagert:&lt;ul&gt;&lt;li&gt;Ein Shortcut 🅰️, um die Währungkurse abzurufen und im iCloud - Shortcuts - Ordner in einer Datei zu speichern. Wenn die Datei bereits existiert, wird die API nicht mehr aufgerufen.&lt;/li&gt;&lt;li&gt;Ein Shortcut 🅱️, um von einer Währung in die andere zu konvertieren, der Shortcut 🅰️ verwendet, um die Zielwährung zu bestimmen.&lt;/li&gt;&lt;li&gt;Das funktioniert nun erstaunlich gut.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Das original - Skript von robric18 habe ich dann gelöscht.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;p&gt;Diese Lösung funktioniert erst mal - aber so richtig zufriedenstellend ist es noch nicht:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Es fehlt insbesondere noch das Löschen des Caches mit den Kursen, um tagesaktuelle Umrechungskurse abzuholen&lt;/li&gt;&lt;li&gt;Die Berechnung des Zielbetrages ist nicht sicher getestet&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Ein paar Tage später&lt;/h2&gt;&lt;section class=&quot;timeline&quot;&gt;&lt;ul&gt;&lt;li&gt;Ich suchte noch einmal das Skript von robic18 für Inspiration. Ich hatte einen Typo und suchte nach robrix18 - dafür gab es natürlich keine Ergebnisse, aber Serendipitätsergebnisse.&lt;/li&gt;&lt;li&gt;Nun taucht in den Suchergebnissen ein anderer Artikel auf: &lt;a href=&quot;https://www.slashgear.com/1698636/currency-converter-iphone-feature-calculator-ios-18-how-use/&quot;&gt;HOW TO USE THE BUILT-IN CURRENCY CONVERTER FEATURE ON YOUR IPHONE&lt;/a&gt;&lt;ul&gt;&lt;li&gt;In der aktuellen Version von iOS hat Apple den Taschenrechner erweitert&lt;/li&gt;&lt;li&gt;Man kann jetzt direkt von einer Währung in die andere umrechnen.&lt;/li&gt;&lt;li&gt;Den Kalkulator kann man ebenfalls in Shortcuts einbinden&lt;/li&gt;&lt;li&gt;Damit würde das Abholen der aktuellen Umrechnungskurse entfallen - insofern wir Apple vertrauen, bei seinen Dienstleistern halbwegs aktuelle Kurse abzurufen.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ich habe nun einen neuen Shortcut angelegt, der nur die Berechnung über die API vom Kalkulator macht&lt;ul&gt;&lt;li&gt;Es funktioniert gut, die Ergebnisse sehen stimmig aus.&lt;/li&gt;&lt;li&gt;Account bei &lt;a href=&quot;http://fixer.io&quot;&gt;fixer.io&lt;/a&gt; gelöscht&lt;/li&gt;&lt;li&gt;Account bei openexchangerate gelöscht.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Damit wäre das Problem der Währungsumrechnung ziemlich einfach gelöst.&lt;/li&gt;&lt;li&gt;Fehlt noch die Bestimmung des Währungscodes von dem Land in dem ich mich gerade befinde - also das Abholen der des aktuellen Standortes und die Konvertierung des Standortes in das internationale Währungskürzel&lt;ul&gt;&lt;li&gt;robic18 verwendet die Wetter API um den aktuellen Ort herauszufinden. Das wäre schon mal erledigt.&lt;/li&gt;&lt;li&gt;Die Seite &lt;a href=&quot;https://www.laenderdaten.de/kuerzel/waehrungscodes.aspx&quot;&gt;laenderdaten.de&lt;/a&gt; liefert eine Liste von den internationalen Währungscodes&lt;ul&gt;&lt;li&gt;Ich könnte das jetzt irgendwie parsen und versuchen das aktuelle Land, in dem ich mich befinde, auf diesen Code zu mappen&lt;/li&gt;&lt;li&gt;Das ist mit Shortcuts nicht so einfach&lt;/li&gt;&lt;li&gt;Es funktioniert nur, wenn die Länder übereinstimmen.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Aber wir haben ja ein lokales LLM installiert.&lt;ul&gt;&lt;li&gt;Was ist, wenn ich den Wetter-Standort an Apple Intelligence übergebe und den Währungscode bestimmen lasse.&lt;/li&gt;&lt;li&gt;Mit einigem Herumprompten funktioniert das erstaunlich gut und ich konnte es auch überreden, mir nur den Code auszugeben.&lt;/li&gt;&lt;li&gt;Ich weiss aber nicht wie zuverlässig das ist.&lt;/li&gt;&lt;li&gt;Aber die Lösung ist erstmal besser als das Parsen einer Webseite&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Kopfschmerzen bereitet mir, wann genau ich automatisiert die aktuelle Währung an meinem Land festlegen kann – und damit auch den Umrechnungskurs.&lt;ul&gt;&lt;li&gt;Ich reise ja nicht dermassen viel, so dass ich bei jedem Aufruf des Währungskonverters das Land bestimmen und die Währung oder den Umrechnungskurs bestimmen müsste.&lt;/li&gt;&lt;li&gt;Das Bestimmen ist auch recht langsam, je nachdem wie die Wetter-API antwortet oder wie die Lokale AI Lust hat.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Vermutlich ist es einfachste, einen Shortcut zu schreiben, der irgendwo das lokale Währungskürzel abspeichert oder wenn die Datei bereits existiert, einfach den Inhalt zurück gibt.&lt;/li&gt;&lt;li&gt;Der Währungskonverter könnte diesen Shortcut abrufen und für die Kalkulator-Formel verwenden.&lt;/li&gt;&lt;li&gt;Wenn ich irgendwohin reise, das nicht im Euro- oder im Schweizer Franken Raum liegt, dann ist es meistens im Flugzeug. Wenn ich nun ankomme, könnte ich auch sagen ich irgendwann den Flugmodus deaktivieren werde.&lt;/li&gt;&lt;li&gt;Ich könnte also beim Deaktivieren des Flugmodus den Währungscache löschen.&lt;/li&gt;&lt;li&gt;Beim nächsten Aufruf des Währungskonverters wird so wieder das Kürzel am Standort bestimmt, von mir bestätigt und gespeichert.&lt;/li&gt;&lt;li&gt;Nach ein paar Versuchen habe ich nun eine passable und gut testbare Lösung.&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;h2&gt;Yess - eine Lösung.&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;Shortcut &lt;strong&gt;Cleanup Local Currency Code&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Löscht die Datei mit dem Währungscode&lt;/li&gt;&lt;li&gt;Wird automatisch beim Deaktivieren des Flugmodus ausgeführt.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Shortcut &lt;strong&gt;Retrieve Local Currency Code&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Wenn die Datei mit dem Währungscode existiert&lt;ul&gt;&lt;li&gt;Liefere den Inhalt&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Sonst&lt;ul&gt;&lt;li&gt;Rufe den aktuellen Standort mit der Wetter-API ab&lt;/li&gt;&lt;li&gt;Verwende Apple Intelligence mit dem lokalen Modell, um den Währungscode zu bestimmen&lt;/li&gt;&lt;li&gt;Frage nach, ob der Währungscode korrekt ist&lt;ul&gt;&lt;li&gt;Falls ja, speichere den Währungscode in der Datei mit dem Währungscode&lt;/li&gt;&lt;li&gt;Liefere den Währungscode&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Shortcut &lt;strong&gt;Convert Currency With Calc&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Empfängt ein JSON-Dictionary mit einigen Eingabeparametern.&lt;/li&gt;&lt;li&gt;Liefert die mit der Kalkulator-App umgerechnete Währung&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Shortcut &lt;strong&gt;Convert Local Currency&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;Ruft &lt;strong&gt;Retrieve Local Currency Code&lt;/strong&gt; auf&lt;/li&gt;&lt;li&gt;Fragt nach dem umzurechnenden Wert in der lokalen Währung&lt;/li&gt;&lt;li&gt;Ruft &lt;strong&gt;Convert Currency With Calc&lt;/strong&gt; mit den Parametern ab&lt;/li&gt;&lt;li&gt;Zeigt den umgerechneten Betrag in der Zielwährung an&lt;/li&gt;&lt;li&gt;Gibt die Option zum Protokollieren einer Ausgabe wie bisher auch&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Natürlich ist die Lösung nicht perfekt aber für meine Bedürfnisse die beste:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Der Speicherort der Cache-Datei ist in zwei Shortcuts hinterlegt.&lt;ul&gt;&lt;li&gt;Das könnte man mit einem dritten Shortcut lösen, der nur den Speicherort liefert.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ob das Bestimmen der Währung des Landes, wo ich mich befinde, tatsächlich funktioniert, kann ich nur durch hinfliegen und Ausprobieren testen. Zumindest gibt es eine manuelle Bestätigung.&lt;ul&gt;&lt;li&gt;Das könnte man auch manuell überschreiben&lt;/li&gt;&lt;li&gt;Man könnte AI eine Umrechnungstabelle übergeben&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ob der Kurs von Apple auch der ist, den meine Bank berechnet sei dahingestellt.&lt;ul&gt;&lt;li&gt;Das ist mir egal&lt;/li&gt;&lt;li&gt;Immerhin ist das besser und schneller als den Kurs manuell herauszufinden.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;</description>
      <pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/rabbithole-waehrungsconverter/</guid>
    </item>
    <item>
      <title>Rabbithole indiekit</title>
      <link>https://csenf.de/posts/rabbithole-indiekit/</link>
      <description>&lt;h2&gt;Tag 1&lt;/h2&gt;&lt;section class=&quot;timeline&quot;&gt;&lt;ul&gt;&lt;li&gt;Ich habe &lt;a href=&quot;https://getindiekit.com/&quot;&gt;Indiekit&lt;/a&gt; gefunden.&lt;/li&gt;&lt;li&gt;Die Docker installation funktionierte gut&lt;ul&gt;&lt;li&gt;bis auf PASSWORDS_SECRET, bei dem man die $ - Zeichen escapen musste, weil docker diesen Zeichenketten als Variable ansieht und mit nichts ersetzt.&lt;/li&gt;&lt;li&gt;das kostete mich ein paar Nerven und ein paar Stunden&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Als storage verwende ich ein gitea - repository&lt;/li&gt;&lt;li&gt;Funktioniert und alles landet als markdown dort in einer eigenen Struktur. Kann man erstmal mit Arbeiten.&lt;/li&gt;&lt;li&gt;Meine eigene Seite ist statisch generiert mit eleventy&lt;/li&gt;&lt;li&gt;Wie verbinde ich eleventy mit indiekit?&lt;ul&gt;&lt;li&gt;Auftritt &lt;a href=&quot;https://rmendes.net/&quot;&gt;Ricardo Mendes&lt;/a&gt; via &lt;a href=&quot;https://vuink.com/post/ezraqrf-d-darg/content/articles/2026-02-14-deploying-your-own-indieweb-site&quot;&gt;https://vuink.com/post/ezraqrf-d-darg/content/articles/2026-02-14-deploying-your-own-indieweb-site&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Der hat auf github &lt;a href=&quot;https://github.com/rmdes&quot;&gt;rmdes&lt;/a&gt; ein &lt;a href=&quot;https://github.com/rmdes/indiekit-deploy&quot;&gt;indiekit-deploy&lt;/a&gt; projekt gebaut&lt;/li&gt;&lt;li&gt;Das ist riesig, mit vielen Plugins und allen möglichen indieweb-funktionen.&lt;/li&gt;&lt;li&gt;Eine gute inspirationsquelle für meine eigene Seite.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Er hat auch ein &lt;a href=&quot;https://github.com/rmdes/indiekit-deploy/blob/main/docker/caddy/Caddyfile&quot;&gt;Caddyfile&lt;/a&gt; , das mich daran erinnert, dass ich eigentlich von traefik auf caddy umsteigen wollte und hier vielleicht ein guter Einstiegspunkt ist&lt;ul&gt;&lt;li&gt;Ich habe eine bestehende traefik installation und möchte diese nach und nach durch das leichtere caddy ersetzen.&lt;/li&gt;&lt;li&gt;Via perplexity habe ich eine Anleitung, wie ich&lt;ul&gt;&lt;li&gt;caddy vor traefik setze&lt;/li&gt;&lt;li&gt;traefik weiterhin die tls zertifikate verwalten lasse und caddy dahinter für einige domains habe.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ich möchte caddy for traefik haben.&lt;/li&gt;&lt;li&gt;Die app aufgesetzt.&lt;/li&gt;&lt;li&gt;caddy läuft nicht, wegen Error: loading initial config: loading new config: loading tls app module: provision tls: provisioning automation policy 0: on-demand TLS cannot be enabled without a permission module to prevent abuse; please refer to documentation for details&lt;ul&gt;&lt;li&gt;Die fehlersuche im ansible mit docker containern ist ziemlich aufwändig, ich starte es, es läuft nicht, dann verbinde ich mich mit den docker host und schaue in den logs, was fehlt.&lt;/li&gt;&lt;li&gt;mein ansible verify-script erweitert, dass es nun die logs für einen container anzeigt, wenn er nicht läuft:&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;#&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Get state of container {{ item }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;community.docker.docker_container_info&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ item }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; result

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Verify that the container {{ item }} is running&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.assert&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; result.container.State.Status == &quot;running&quot;
  &lt;span class=&quot;token key atrule&quot;&gt;ignore_errors&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; assert_result

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fetch container logs for {{ item }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.command&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ docker_cli }} logs {{ item }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; container_logs
  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; assert_result is failed
  &lt;span class=&quot;token key atrule&quot;&gt;changed_when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Display container logs for {{ item }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.debug&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ container_logs.stdout_lines + container_logs.stderr_lines }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; assert_result is failed

&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Fail when the container {{ item }} is not running&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.fail&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;msg&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Container {{ item }} is not running. See logs above.&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;when&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; assert_result is failed&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;ich benötige das caddy modul &lt;a href=&quot;https://caddyserver.com/docs/modules/dns.providers.inwx&quot;&gt;dns.providers.inwx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Caddyfile muss angepasst werden, damit es das modul anzieht.&lt;ul&gt;&lt;li&gt;username und passwort sollen nicht im klartext darin stehen&lt;/li&gt;&lt;li&gt;Es gibt zwei Wege&lt;ul&gt;&lt;li&gt;über umgebungsvariablen &lt;a href=&quot;https://caddy.community/t/using-caddyfiles-basic-auth-with-environment-variables-and-docker/19918&quot;&gt;Using Caddyfile&#39;s basic_auth with environment variables and Docker&lt;/a&gt;&lt;/li&gt;&lt;li&gt;oder über ein caddy-modul &lt;a href=&quot;https://github.com/ben-freke/caddy-file-secrets&quot;&gt;caddy-file-secrets&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;ich entscheide mich für die umgebungsvariablen&lt;/li&gt;&lt;li&gt;in ansible generiere ich jetzt ein secret.env - file aus dem secrets-array für Caddy&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token key atrule&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; create secrets.env from entries in &quot;vault.caddy&quot;
  &lt;span class=&quot;token key atrule&quot;&gt;ansible.builtin.copy&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{% for key, value in vault.caddy.items() %}{{ key }}={{ value }}&#92;n{% endfor %}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;dest&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ service_cfg.directory }}/secrets.env&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;owner&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ docker_user.name }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;group&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ docker_user.group }}&quot;&lt;/span&gt;
    &lt;span class=&quot;token key atrule&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;{{ secret_file_mode }}&quot;&lt;/span&gt;
  &lt;span class=&quot;token key atrule&quot;&gt;no_log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Caddy mag nicht starten, da es das Modul für inwx dns nicht findet.&lt;/li&gt;&lt;li&gt;Jetzt muss ich caddy mit caddyx bauen, das ist mir gerade zu aufwändig.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;p&gt;Ich verlasse das alles und gehe zwei Episoden The Expanse gucken und danach schlafen.&lt;br&gt;Ein funktionierendes indiekit habe ich nicht draussen.&lt;/p&gt;&lt;h2&gt;Tag 2&lt;/h2&gt;&lt;section class=&quot;timeline&quot;&gt;&lt;ul&gt;&lt;li&gt;Am nächsten morgen entscheide ich mich dafür, caddy hinter traefik zu setzen.&lt;/li&gt;&lt;li&gt;Aber dieses Rabbithole von gestern lässt mir keine Ruhe und ich möchte eigentlich mehr aufschreiben, so dass mir nichts verloren geht.&lt;ul&gt;&lt;li&gt;Diesen Beitrag bis hierher geschrieben.&lt;ul&gt;&lt;li&gt;es wäre eigentlich cool, wenn er als timeline-items dargestellt wird.&lt;/li&gt;&lt;li&gt;Mein LLM gebeten:&lt;ol&gt;&lt;li&gt;&lt;code&gt;this is a tailwind css file. add a class to display a list as a timeline&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;put a frame around the timeline items&lt;/code&gt;&lt;br&gt;Das ging nach hinten los und sah sehr komisch aus, wieder zurück.&lt;/li&gt;&lt;li&gt;&lt;code&gt;the structure of the li items cannot be changed, there is no div&lt;/code&gt;&lt;br&gt;Nun wird es mal gut dargestellt.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;den text mit &lt;code&gt;&amp;lt;section class=&amp;quot;timeline&amp;quot;&amp;gt;&lt;/code&gt; eingerahmt&lt;/li&gt;&lt;li&gt;Das wird in obsidian nicht richtig dargestellt&lt;/li&gt;&lt;li&gt;Schnell einen shortcode dafür gebaut&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt; {% section &quot;my-css-class&quot; %}
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Content goes here&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
 {% endsection %}&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;In diesem Beitrag hier muss ich code mit &lt;code&gt;{% raw %}&lt;/code&gt; und &lt;code&gt;{% endraw %}&lt;/code&gt; einrahmen, da die njk - engine das parsen möchte. Das gefällt aber Obsidian nicht.&lt;/li&gt;&lt;li&gt;kurze Suche befördert das hier nach oben:&lt;blockquote&gt;&lt;p&gt;I had to add &lt;code&gt;templateEngineOverride: md&lt;/code&gt; in the YAML front matter for this post, which tells Eleventy to only process Markdown, ignoring any Nunjucks tags&lt;/p&gt;&lt;p&gt;🔖 &lt;a href=&quot;https://markllobrera.com/posts/eleventy-escaping-nunjucks-statements-in-markdown-code-blocks/&quot;&gt;Eleventy: Escaping Nunjucks Statements in Markdown Code Blocks&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;wie kann ich eine section hinzufügen, die in obsidian und in eleventy funktioniert?&lt;ul&gt;&lt;li&gt;Mein LLM schlägt vor, einen html postProcessor zu verwenden, der das hier interpretieren kann:&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt; &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- section: my-css-class --&gt;&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Content goes here&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;p&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
 &lt;span class=&quot;token comment&quot;&gt;&amp;lt;!-- /section --&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;noch einen 11ty-transformer hinzugefügt:&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;eleventyConfig&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addTransform&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;section&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;content&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; outputPath&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;outputPath &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; outputPath&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;endsWith&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.html&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content
            &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;lt;!--&#92;s*section:&#92;s*([&#92;w-]+)&#92;s*--&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;section class=&quot;$1&quot;&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;replace&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token regex&quot;&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-source language-regex&quot;&gt;&amp;lt;!--&#92;s*&#92;/section&#92;s*--&gt;&lt;/span&gt;&lt;span class=&quot;token regex-delimiter&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token regex-flags&quot;&gt;g&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;&amp;lt;/section&gt;&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; content&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Bin ich jetzt fertig?&lt;/li&gt;&lt;li&gt;Natürlich nicht.&lt;/li&gt;&lt;li&gt;Das Design der Timeline in obsidian gefällt mir nicht. Ausserdem muss es doch einen besseren Weg geben, das Markdown für Obsidian und Eleventy zu optimieren.&lt;/li&gt;&lt;li&gt;Kommen wir zu obsidian sections&lt;/li&gt;&lt;li&gt;Ein Nachteil ist, wenn man in Obsidian hineinklickt, selektiert er den ganzen Text, das macht das Ergänzen etwas mühsam.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;p&gt;Ich muss aufhören weiter zu graben, da die Menschen hier langsam aufwachen.&lt;/p&gt;&lt;h2&gt;Tag 3&lt;/h2&gt;&lt;section class=&quot;timeline&quot;&gt;&lt;ul&gt;&lt;li&gt;Weiter mit Caddy&lt;/li&gt;&lt;li&gt;Zunächst dyndns eingerichtet für die Domain, auf der ich mit caddy spielen möchte.&lt;/li&gt;&lt;li&gt;Jetzt ist die Frage, wie ich caddy konfigurieren möchte.&lt;ul&gt;&lt;li&gt;mit docker - ein writeup gibt es hier &lt;a href=&quot;https://gist.github.com/omltcat&quot;&gt;omltcat&lt;/a&gt;/&lt;strong&gt;&lt;a href=&quot;https://gist.github.com/omltcat/241ef622070ca0580f2876a7cfa7de67&quot;&gt;caddy_labels.md&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;oder erstmal als Caddyfiles?&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Für das deployment der Docker-Container auf mein nas habe ich ein ansible-Projekt. Dort liegen alle Applikationen als Rollen drin. Je Applikation gibt es eine docker-compose.yaml, die dann die Container der App verwaltet.&lt;/li&gt;&lt;li&gt;Nun stellt sich die Frage: Konfiguriere ich alles gemeinsam in einer app oder getrennt.&lt;ul&gt;&lt;li&gt;in einer app - heisst gemeinsames docker compose für alles, was man für einen sicheren Server braucht&lt;ol&gt;&lt;li&gt;caddy&lt;/li&gt;&lt;li&gt;authelia (&lt;a href=&quot;http://auth.example.com&quot;&gt;auth.example.com&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;ldap (&lt;a href=&quot;http://ldap.example.com&quot;&gt;ldap.example.com&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;einen public www - fileserver zum Ausprobieren, dass irgendwas ausgeliefert wird.&lt;/li&gt;&lt;li&gt;einen versteckten secure - fileserver zum Testen einer abgesicherten Seite, die nicht jeder aufrufen kann.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;oder getrennt?&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Ich entscheide mich alles getrennt zu machen.&lt;/li&gt;&lt;li&gt;Caddy soll die Zertifikate nicht verwalten, das lasse ich der Einfachheit halber beim traefik:&lt;ul&gt;&lt;li&gt;Traefik ist eingerichtet&lt;/li&gt;&lt;li&gt;Caddy müsste ich erst irgendwie neu kompilieren, das dauert mir zu lange.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Schnell läuft ein fileserver in caddy auf einer www - domain.&lt;/li&gt;&lt;li&gt;Nun noch authelia daneben setzen, eine secure - domain einrichten und schauen, dass authelia geht.&lt;ul&gt;&lt;li&gt;Mich interessiert vor allem dass unter Safari die passkeys als zweiter Faktor funktionieren&lt;/li&gt;&lt;li&gt;Cool wäre es, wenn ich die auch gleich als ersten und einzigen Faktor nehmen könnte, diese Sicherheit ist für mich ausreichend.&lt;/li&gt;&lt;li&gt;Mist. Ich erhalte mit einer neuen Konfiguration auf dem :latest - image einen Fehler bei&lt;pre class=&quot;language-yaml&quot;&gt;&lt;code class=&quot;language-yaml&quot;&gt;&lt;span class=&quot;token key atrule&quot;&gt;enable_passkey_login&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;  
&lt;span class=&quot;token key atrule&quot;&gt;experimental_enable_passkey_upgrade&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean important&quot;&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Nach zwei Stunden sehe ich, dass das :latest docker image nie aktualisiert wurde und noch eine alte 4.38 Version ist. Nachdem ich das neue auf 4.39 gepinnt habe, funktioniert es.&lt;/li&gt;&lt;li&gt;Der nächste Fehler kommt schon um die Ecke.&lt;/li&gt;&lt;li&gt;Es wird Error 400 beim Aufruf der sicheren domain angezeigt.&lt;/li&gt;&lt;li&gt;Wieder nach einigen Iterationen schaue ich ins authelia log und sehe: &lt;code&gt;Target URL &#39;http://secured.example.com/&#39; has an insecure scheme &#39;http&#39;, only the &#39;https&#39; schemes are supported&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Eine wilde Suche via duckduckgo fördert nichts brauchbares zutage. Jedoch das LLM meiner Wahl hat nach kurzer Nachfrage eine Lösung.&lt;ul&gt;&lt;li&gt;zuerst wollte es mein Setup auf https umbauen, was aber nicht geht&lt;/li&gt;&lt;li&gt;Ich hatte es dann gefragt, ob es nicht eine Lösung mit http-headern gibt. Das führte zur gewünschten Lösung:&lt;pre class=&quot;language-caddyfile&quot;&gt;&lt;code class=&quot;language-caddyfile&quot;&gt;# because caddy is on port 80 and traefik is handling https  
header_up X-Forwarded-Proto https&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/section&gt;&lt;h2&gt;Danach&lt;/h2&gt;&lt;p&gt;Schlussendlich entscheide ich mich gegen obsidian-sections, da diese den ganzen Flow des Text bearbeitens kaputt machen. Ich bin zurück bei den html-kommentaren.&lt;/p&gt;&lt;p&gt;Es gibt noch eine nächste Überarbeitung des timeline-Layouts. Auch hier hat mich das LLM nicht im Stich gelassen mit folgenden Prompts und meinem &lt;code&gt;style.css&lt;/code&gt; als input.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;the timeline layout should ignore orderd lists with&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;can you add some boxes with an arrow to the dot around the timeline entries?&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;some how the indentation of the box on the left side is not working, the box overlaps with the dot and the line&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;that looks good. the nested entries do make sense in the context but i do not like that the boxes are displayed nested as well.&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;you got me wrong. i like the nested display but the second and third sub-timlines should be better distinguishable&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Da kam dann dieses Layout heraus, wo ich nur noch die zu kleine Schrift und den Rahmen auf der dritten Ebene geändert habe.&lt;/p&gt;&lt;p&gt;Ohne das LLM hätte ich hier sehr viel Zeit vergeigelt.&lt;/p&gt;&lt;p&gt;Ich habe immer noch keinen indiekit - server, auf dem ich Sachen ausprobieren kann, dafür wieder einiges gelernt.&lt;/p&gt;&lt;p&gt;Mal schauen. Es macht Spass, die Rabbitholes, in die ich mich verirre, aufzuschreiben und nachvollziehbar zu machen. Vielleicht setze ich das noch weiter fort und bekomme irgendwann mal eine indiekit - Installation wie ich sie mir vorstelle. Im Moment bin ich noch beim Caddy und dort wäre es eigentlich cooler und schneller, wenn ich per ansible auf mein lokales Macbook deployen könnte und die Einstellungen direkt ausprobieren kann, anstelle immer auf das nas zu deployen. Oder noch besser mit molecule richtige tests bauen - was wären das dann - integrationstests für mehrere Applikationen? Und dann hätte ich gerne caddy doch via docker konfiguriert - wie bekomme ich dort aber die statischen fileserver hinein, mit denen ich die ganzen nginx - instanzen ablösen möchte?&lt;/p&gt;</description>
      <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/rabbithole-indiekit/</guid>
    </item>
    <item>
      <title>Kommentieren</title>
      <link>https://csenf.de/posts/kommentieren/</link>
      <description>&lt;h2&gt;Im August 2025&lt;/h2&gt;&lt;p&gt;Herr Schulte hat sich vor einiger Zeit ein paar &lt;a href=&quot;https://horstschulte.com/2025/08/zwischen-klick-und-konversation-was-uns-die-kommentare-noch-sagen/&quot;&gt;Gedanken zum Kommentieren gemacht&lt;/a&gt;. Ich habe den Text gerne gelesen. Er hat mich zum Nachdenken gebracht - und damals dazu, diesen Beitrag zu schreiben.&lt;/p&gt;&lt;p&gt;Zunächst: In diesem &lt;s&gt;Blog&lt;/s&gt; Dings hier habe ich absichtlich keine Kommentare eingebaut: Das hat den technischen Grund, dass die Seiten statisch generiert werden und Kommentare ein ziemlich dynamisches Ding sind. Der andere Grund ist, dass ich mich nicht mit Kommentaren herumschlagen möchte. Ich möchte sie weder administrieren, noch freischalten, noch löschen, noch irgendwie verantwortlich gemacht werden für Sachen, die andere auf meiner Seite hinterlassen können.&lt;/p&gt;&lt;p&gt;Jeder kann sich recht einfach irgendwo einen Blog oder eine Webseite oder ein Dings bauen und dort etwas zu meinen Inhalten hinterlassen. Oder mir eine Mail schreiben. Ob ich das dann lese oder nicht - oder darauf reagiere ist meine Sache alleine.&lt;/p&gt;&lt;p&gt;Auf diese Weise kann jeder, der das wünscht, mit mir in Dialog treten.&lt;/p&gt;&lt;p&gt;In der Tat ist die Hürde zu &amp;quot;kommentieren&amp;quot; so recht gross.&lt;/p&gt;&lt;p&gt;Herr Schulte schreibt etwas vom Dialog, der existierte oder den er gerne führen würde.&lt;/p&gt;&lt;p&gt;Ich selbst möchte auf &lt;s&gt;meiner Webseite&lt;/s&gt; &lt;s&gt;meinem Blog&lt;/s&gt; meinem Dings keinen Dialog führen. Mir macht es Spass zu schreiben, den technischen Hintergrund von statischen oder dynamischen Webseiten zu verstehen und einfach im Internet einen Ort zu haben, wo ich anderen sagen kann: Schau, hier, das habe ich gemacht und wenn dich ein Aspekt von mir interessiert, dann kannst du gerne lesen.&lt;/p&gt;&lt;h2&gt;Im Februar 2026&lt;/h2&gt;&lt;p&gt;Nun habe ich diesen interessanten Post von ihm gelesen, mit der Frage:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Wie siehst du das? Fehlt dir die Kommentarkultur auch ein bisschen – oder empfindest du sie eher als Belastung?&lt;/p&gt;&lt;p&gt;🔖 &lt;a href=&quot;https://horstschulte.com/bloggen-ohne-widerspruch/#:~:text=Wie%20siehst%20du%20das&quot;&gt;Bloggen ohne Widerspruch bzw. ohne Kommentarbereich?&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Nun ja. In der Anfangszeit des Internet, um die 2000er Jahre herum hatten wir eine ziemlich erfolgreiche Webseite gestartet, um die LGBT-Community in Thüringen zu vernetzen. &amp;quot;Wir&amp;quot; litten ziemlich unter der Zersplitterung der Angebote über das ganze Land und darunter, dass man nie wusste, was wann wo los war. Welche Gruppen und Angebote es so gab. Neben den City-Guides und einem Kalendarium gab es auch unregelmässig veröffentlichte Artikel über das was so los war oder was noch kommt.&lt;/p&gt;&lt;p&gt;Und unter diesen Artikeln hatten wir Kommentare freigeschaltet. Es lief recht gut, es gab viele nette und wohlwollende Kommentare, die unsere Arbeit schätzten oder konstruktiv kritisierten.&lt;/p&gt;&lt;p&gt;Es dauerte relativ lange, bis wir uns den ersten hässlichen Troll eingefangen hatten.&lt;/p&gt;&lt;p&gt;Die Seite war ein Nischenangebot, das durch die Person mit seinen unflätigen Kommentaren geflutet wurde. Es waren wir, die unsere Freizeit damit verbrachten, das von der Community geschätzte Angebot zu pflegen und zu betreiben, und die wir mit Dreck beworfen wurden - und unsere Zeit dafür opferten, die Kommentare zu beantworten, später einfach zu löschen und noch später technische Mittel programmierten, um die Person von unserer Webseite auszuschliessen.&lt;/p&gt;&lt;p&gt;Es waren die Anfangszeiten des Internet, in denen die Hürden teilzunehmen - technisch oder einfach intellektuell - noch hoch genug waren, um die Störenfriede und Unruhestifter einigermassen herauszuhalten.&lt;/p&gt;&lt;p&gt;Für uns war das damals eine zu hohe Belastung, so dass wir schlussendlich die Kommentare ausschalteten.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Ein andere Aspekt bei den Kommentaren ist - und ich weiss gar nicht mehr, wer mich auf den Gedanken brachte - es könnte &lt;a href=&quot;http://scripting.com/&quot;&gt;Dave Winer&lt;/a&gt; gewesen sein.&lt;/p&gt;&lt;p&gt;Jeder Kommentar, den ich auf einer anderen Webseite hinterlasse, geht automatisch in die Hoheit des Webseitenbetreibers über. Oder des Blog-Besitzers. Ich kann einen schönen 1000 Zeichen Text schreiben und als Kommentar hinterlassen und sehe diesen Text nie wieder. Ich verliere die Kontrolle über etwas, für das ich mir Zeit und Gedanken gemacht habe. Ich war kreativ unterwegs und schenke meine Leistung jemanden anderem.&lt;/p&gt;&lt;p&gt;Das finde ich sehr schade. Gehen wir davon aus, dass alle, die etwas sagen möchte auch gehört werden wollen, dann wären ihre Beiträge doch viel besser auf den eigenen Blogs / Webseiten / Internetpräsenzen aufgehoben, wo der Beitrag auch überarbeitet oder wieder gelöscht werden kann, wenn ihr es später bereut, das geschrieben zu haben.&lt;/p&gt;&lt;p&gt;Andererseits kann ich für einen Kommentar, den ich anonym irgendwo hinterlasse, nicht verantwortlich gemacht werden. Das ist für einen Troll eine super Sache. Für den Blog-Betreiber eher nicht, denn der hat ja die Arbeit.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;Kommentarkultur ist für mich Vernetzungskultur. Steht für die Sachen, die ihr sagen und veröffentlichen wollt, selber gerade und versteckt euch nicht in anonymen Kommentaren.&lt;/p&gt;&lt;p&gt;Es ist schön, wenn wir uns in Kommentarspalten wiederfinden können. Aber es ist besser, wenn wir beginnen, uns mit unseren Webseiten zu vernetzen.&lt;/p&gt;</description>
      <pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/kommentieren/</guid>
    </item>
    <item>
      <title>Eine Webseite mit git deployen</title>
      <link>https://csenf.de/posts/eine-webseite-mit-git-deployen/</link>
      <description>&lt;p&gt;Vor langer Zeit, so um 2014 herum lernte ich Git kennen.&lt;/p&gt;&lt;p&gt;In dieser Zeit hatte ich einige Programmierprojekte, kleine Apps als Webseiten, laufen.&lt;/p&gt;&lt;p&gt;Mein Workflow für diese Apps sah dann so aus:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Dateien lokal bearbeiten&lt;/li&gt;&lt;li&gt;Änderungen per SFTP auf den Server kopieren.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Das Problem hier war dann immer, die zuletzt geänderten Dateien und Ordner zu identifizieren und hochzuladen. Unter Windows half mir das Beyond Compare, unter OSX gab es ähnliche Hilfsprogramme.&lt;/p&gt;&lt;p&gt;Kompliziert wurde es, wenn man mit anderen auf einem Server arbeitete, die Konflikte zu lösen war nicht gerade einfach und erforderte viele Absprachen.&lt;/p&gt;&lt;p&gt;Mit Git wurde das viel einfacher.&lt;/p&gt;&lt;p&gt;Zuerst war das Versionierungsproblem gelöst und damit auch die gemeinsame Zusammenarbeit am Code. Ich konnte eine Kopie des Repositories auf dem Server schieben und diese Kopie via git push aktuell halten. Jeder andere mit Zugriff konnte ebenfalls auf das Repo pushen. Git sorgte für die Anzeige der Konflikte vor dem Aktualisieren und man konnte diese dann einfach oder kompliziert lösen.&lt;/p&gt;&lt;p&gt;Danach löste ich das Problem, eine Version meiner Apps oder Webseiten automatisch zu veröffentlichen.&lt;/p&gt;&lt;p&gt;Die Idee ist eigentlich einfach:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Dateien lokal bearbeiten&lt;/li&gt;&lt;li&gt;Anpassungen in das lokale git-repo committen&lt;/li&gt;&lt;li&gt;Den branch per git push auf das git-repo kopieren&lt;/li&gt;&lt;li&gt;Auf dem Server per post-receive hook die empfangenen Änderungen automatisch in das produktive Verzeichnis auschecken.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Hier eine kleine Anleitung für eine fiktive webseite, wie man es einrichten kann:&lt;/p&gt;&lt;p&gt;Zunächst meldest du dich per ssh auf dem Server an und prüfst, ob git installiert ist:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--version&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Wenn das nicht klappt, schade auch, das wars dann hier.&lt;/p&gt;&lt;p&gt;Wir benötigen einige Verzeichnisse:&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Verzeichnis&lt;/th&gt;&lt;th&gt;Beschreibung&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/webseite&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Produktionsversion deiner Webseite&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/repositories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Basis für alle git-repositories auf deinem Server&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/repositories/webseite.git&lt;/code&gt;&lt;/td&gt;&lt;td&gt;git-repository für deine Webseite&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Die kannst du so anlegen:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; ~/webseite
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; ~/repositories/webseite.git&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Dann initialisierst du das git-repository. Falls du bereits ein eigenes, lokales Git-Repository hast, musst dieses hier mit dem Parameter &lt;code&gt;--bare&lt;/code&gt; anlegen. Dann kannst du später deine lokale Kopie hierher pushen.&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/repositories/webseite.git
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--bare&lt;/span&gt; init&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Auf deiner lokalen Maschine checkst du nun diese repository aus. Das geht mit den ssh-daten von deinem Hoster.&lt;/p&gt;&lt;p&gt;Von lokal pushst du nun den letzten Stand auf das Repository auf dem Server, so dass dort Dateien drin liegen.&lt;/p&gt;&lt;p&gt;Nun verhängen wir erst einmal das Webseite - Verzeichnis mit dem repository und schauen, ob dort die Dateien ankommen. &lt;mark&gt;Achtung, der Punkt hinten ist wichtig, damit clone in das aktuelle leere Verzeichnis kopiert. Ansonsten legt es ein neues Verzeichnis webseite an.&lt;/mark&gt;&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/webseite
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone ~/repositories/webseite &lt;span class=&quot;token builtin class-name&quot;&gt;.&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Mittels &lt;code&gt;ls -la&lt;/code&gt; kannst du schauen, ob der aktuelle Stand vom master - branch angekommen ist.&lt;/p&gt;&lt;p&gt;Nun kannst du einen neuen commit von lokal auf dein server-repository pushen.&lt;/p&gt;&lt;p&gt;Und das Webseiten-Verzeichnis kannst du so aktualisieren:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/webseite
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull origin master&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Damit funktioniert der manuelle Weg. Zeit es zu automatisieren.&lt;/p&gt;&lt;p&gt;In jedem Git-Repository kann man so genannte Hooks hinterlegen, die bei bestimmten Aktionen ausgeführt werden. Auf deinem Server ist das ein Hook, der nach jedem receive einen bestimmten branch in ein anderes Verzeichnis ausscheckt. Der hook selbst kann ein shell-script sein.&lt;/p&gt;&lt;p&gt;So legst den hook an und machst ihn ausführbar:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;touch&lt;/span&gt; ~/repositories/webseite.git/hooks/post-receive
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; +x ~/repositories/webseite.git/hooks/post-receive&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Anschliessend editierst du ihn, zum Beispiel mit nano:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;nano&lt;/span&gt; ~/repositories/webseite.git/.git/hooks/post-receive&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Der einfachste Inhalt ist dann das, was wir manuell gemacht haben.:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/sh&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/webseite &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;unset&lt;/span&gt; GIT_DIR
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; pull origin master&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Es wechselt in das webseiten-Verzeichnis und ruft dort git pull auf den Branch main vom remote origin auf.&lt;/p&gt;&lt;p&gt;Jetzt kannst du wieder lokal eine Änderung vornehmen, diese committen und pushen.&lt;/p&gt;&lt;p&gt;Beim pushen müsstest du nun im Log nun die Ausgabe des hooks sehen.&lt;/p&gt;&lt;p&gt;Du kannst aber auch nachschauen, ob sich etwas verändert hat mit:&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; ~/webseite
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-la&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sicherheitstechnisch ist das natürlich nicht so schlau, denn damit veröffentlichst du auch die ganze Git-Historie mit. Damit Git weiss, wie der Stand von den Dateien im &lt;code&gt;webseite&lt;/code&gt;- Verzeichnis ist, gibt es das &lt;code&gt;.git&lt;/code&gt; - Unterverzeichnis. Dort liegt alles, was du in das Git-Repository gespeichert hast. Falls du also jemals Zugangsdaten, Keys oder anderes aus Versehen gespeichert und committet hast, ist das öffentlich zugänglich.&lt;/p&gt;&lt;p&gt;Im Apache Webserver könntest du den Zugriff auf das &lt;code&gt;.git&lt;/code&gt;- Verzeichnis mit einer &lt;code&gt;.htaccess&lt;/code&gt; - Datei sperren:&lt;/p&gt;&lt;pre class=&quot;language-apacheconf&quot;&gt;&lt;code class=&quot;language-apacheconf&quot;&gt;&lt;span class=&quot;token directive-block tag&quot;&gt;&lt;span class=&quot;token directive-block tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;FilesMatch&lt;/span&gt;&lt;span class=&quot;token directive-block-parameter attr-value&quot;&gt; &lt;span class=&quot;token string&quot;&gt;&quot;^&#92;.git&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;  
    &lt;span class=&quot;token directive-inline property&quot;&gt;Require&lt;/span&gt; all denied  
&lt;span class=&quot;token directive-block tag&quot;&gt;&lt;span class=&quot;token directive-block tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;FilesMatch&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Diese Datei committest du in das root von webseite-Projekt.&lt;/p&gt;</description>
      <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/eine-webseite-mit-git-deployen/</guid>
    </item>
    <item>
      <title>Gelernt - Ansible Molecule und Docker</title>
      <link>https://csenf.de/posts/gelernt-ansible-molecule-und-docker/</link>
      <description>&lt;p&gt;Ich deploye seit einiger Zeit meine Docker Container auf das NAS mit Ansible. Dabei gibt es je Applikation eine eigene Ansible-Role, in der dann die docker-compose Datei liegt und die notwendige Konfiguration.&lt;/p&gt;&lt;p&gt;Synology hatte lange eine veraltete Docker Version eingesetzt, so dass ich auf dem NAS immer docker und docker compose via pip installieren musste.&lt;/p&gt;&lt;p&gt;Inzwischen haben sie aber im DSM eine aktuelle Docker Version integriert, was die Verwendgung von pip docker obsolet machte.&lt;/p&gt;&lt;p&gt;Gleichzeitig konnte ich so auf Version 2 vom Docker community Plugin umsteigen. Damit liefen die molecule Tests aber nicht mehr:&lt;/p&gt;&lt;p&gt;Für molecule hatte ich hier das docker - image &lt;code&gt;geerlingguy/docker-debian10-ansible:latest&lt;/code&gt; eingesetzt. Dort lief das gleiche setup wie vorher mit dem NAS - docker und docker-compose wurde via pip installiert.&lt;/p&gt;&lt;p&gt;&lt;code&gt;community.docker.docker_compose_v2&lt;/code&gt; hingegen hat eine Konfigurationsvariable &lt;code&gt;docker_cli&lt;/code&gt;, die in diesem Setup nicht gesetzt werden kann. Ein anderes Docker-Image für die molecule-Tests musste her.&lt;/p&gt;&lt;p&gt;Unzählige Suchen im Netz lieferten keine lauffähigen Lösungen, ich vertagte das Problem bis jetzt.&lt;/p&gt;&lt;p&gt;Das eigentliche Problem ist, dass ich ein image benötige, das docker in docker (DIND) unterstützt - und da gibt es auch bereits ein fertiges &lt;code&gt;docker:dind&lt;/code&gt;. Das bringt aber keine Laufzeitumgebung für Ansible mit.&lt;/p&gt;&lt;p&gt;Da ich nun wusste, wonach ich suchen musste, fand ich schnell das image &lt;code&gt;ghcr.io/polar-team/diffusion-molecule-container:latest&lt;/code&gt;. So richtig zufriedenstellend war das nicht. Es war mir zu sehr auf die Bedürfnisse vom polar-team zugeschnitten - aber es funktionierte schon mal.&lt;/p&gt;&lt;p&gt;Hier setzte ich nun mit meinem LLM-Assistenten an.&lt;/p&gt;&lt;p&gt;Der Prompt&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I like to create a docker image for ansible testing with molecule. It should derive from the official docker:dind image. provide a Dockerfile.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;erzeugte mir ein einfaches &lt;code&gt;Dockerfile&lt;/code&gt; zum Start.&lt;/p&gt;&lt;p&gt;Die nächsten Aufgaben waren, einen dedizierten Ansible - Nutzer hinzuzufügen und diesem Berechtigungen zu geben, dass er docker auch verwenden kann.&lt;/p&gt;&lt;p&gt;Das Ergebnis ist hier:&lt;/p&gt;&lt;p&gt;Das &lt;code&gt;Dockerfile&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;language-dockerfile&quot;&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; docker:dind&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Install Python and dependencies for Ansible&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; apk add --no-cache &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    python3 &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    py3-pip &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    bash &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    git &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    openssh-client &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    sshpass &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    rsync &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    sudo&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create virtual environment directory&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; python3 -m venv /opt/uv/.venv&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Install Ansible and Molecule in virtual environment&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; /opt/uv/.venv/bin/pip install --no-cache-dir &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    ansible &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    molecule &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    molecule-docker &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    docker&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create necessary directories&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; mkdir -p /tmp/ansible/docker /tmp/ansible/secrets&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Create ansible user and group for molecule tests&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; addgroup -g 1000 ansible &amp;amp;&amp;amp; &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    adduser -D -u 1000 -G ansible -s /bin/bash ansible &amp;amp;&amp;amp; &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    addgroup ansible docker &amp;amp;&amp;amp; &lt;span class=&quot;token operator&quot;&gt;&#92;&lt;/span&gt;
    echo &lt;span class=&quot;token string&quot;&gt;&quot;ansible ALL=(ALL) NOPASSWD:ALL&quot;&lt;/span&gt; &gt;&gt; /etc/sudoers&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Copy custom entrypoint script&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;COPY&lt;/span&gt; entrypoint.sh /usr/local/bin/entrypoint.sh&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;RUN&lt;/span&gt; chmod +x /usr/local/bin/entrypoint.sh&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Set Python interpreter as environment variable&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENV&lt;/span&gt; ANSIBLE_PYTHON_INTERPRETER=/opt/uv/.venv/bin/python&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Use custom entrypoint that handles Docker socket permissions&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;ENTRYPOINT&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;/usr/local/bin/entrypoint.sh&quot;&lt;/span&gt;]&lt;/span&gt;
&lt;span class=&quot;token instruction&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CMD&lt;/span&gt; [&lt;span class=&quot;token string&quot;&gt;&quot;tail&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;-f&quot;&lt;/span&gt;, &lt;span class=&quot;token string&quot;&gt;&quot;/dev/null&quot;&lt;/span&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;entrypoint.sh&lt;/code&gt;&lt;/p&gt;&lt;pre class=&quot;language-shell&quot;&gt;&lt;code class=&quot;language-shell&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Start Docker daemon in background&lt;/span&gt;
dockerd-entrypoint.sh &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Wait for Docker socket to be available&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Waiting for Docker daemon to start...&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-S&lt;/span&gt; /var/run/docker.sock &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$timeout&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-gt&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt;timeout &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-S&lt;/span&gt; /var/run/docker.sock &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Docker socket not available after 30 seconds&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Ensure Docker socket has correct permissions&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;666&lt;/span&gt; /var/run/docker.sock

&lt;span class=&quot;token comment&quot;&gt;# Wait for Docker daemon to be fully ready&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Waiting for Docker daemon to be ready...&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;until&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;docker&lt;/span&gt; info &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; /dev/null &lt;span class=&quot;token operator&quot;&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;2&lt;/span&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token file-descriptor important&quot;&gt;&amp;amp;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$timeout&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;do&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;token assign-left variable&quot;&gt;timeout&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt;timeout &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;done&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$timeout&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-eq&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Docker daemon not ready after 30 seconds&quot;&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Docker daemon is ready&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Execute the command passed to the container&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;exec&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$@&lt;/span&gt;&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Das ganze lebt jetzt auf meinem eigenen git-server und wird in seine docker-registry deployt.&lt;/p&gt;</description>
      <pubDate>Sun, 01 Feb 2026 18:25:24 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/gelernt-ansible-molecule-und-docker/</guid>
    </item>
    <item>
      <title>Datenschutz</title>
      <link>https://csenf.de/posts/datenschutz/</link>
      <description>&lt;p&gt;Gerade wieder hatte mich der &lt;a href=&quot;https://blog.clickomania.ch/2025/12/22/jahresrueckblick-apple/&quot;&gt;Blogpost von Herrn Schüssler&lt;/a&gt; daran erinnert, was ich in unserer jährlichen und sich thematisch mehr oder weniger wiederholenden Compliance-Ausbildung abgefragt werde:&lt;/p&gt;&lt;p&gt;Wozu dient Datenschutz?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;[ ] Dem Schutz von Daten&lt;/li&gt;&lt;li&gt;[ ] Dem Schutz von Geschäftsgeheimnissen&lt;/li&gt;&lt;li&gt;[ ] Dem Schutz von Persönlichkeitsrechten&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Letzteres ist richtig und ich finde es dann immer wieder bedauerlich, dass wir es damals, als wir es gesellschaftlich implementierten, versäumt haben, dem Ding den richtigen Namen zu geben: Schutz von Persönlichkeitsrechten.&lt;/p&gt;&lt;p&gt;Inzwischen ersetze ich beim Lesen von solchen Sätzen wie Herr Schüsslers &amp;quot;Datenschutz&amp;quot; durch &amp;quot;Schutz von Persönlichkeitsrechten&amp;quot; und die ganze Konstruktion macht für mich mehr Sinn.&lt;/p&gt;&lt;p&gt;Original:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Der wesentliche Punkt ist, dass Apple uns ermöglicht, die künstliche Intelligenz datenschutzbewusst zu nutzen.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Modifikation:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Der wesentliche Punkt ist, dass Apple uns ermöglicht, die künstliche Intelligenz Persönlichkeitsrechte schützend zu nutzen.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <pubDate>Mon, 22 Dec 2025 11:48:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/datenschutz/</guid>
    </item>
    <item>
      <title>nicht aufregen — wirres.net</title>
      <link>https://csenf.de/posts/nicht-aufregen-wirres-net/</link>
      <description>&lt;blockquote&gt;&lt;p&gt;Ich set­ze mir Le­se­zei­chen und no­tie­re mir Sa­chen, über die ich schrei­ben könn­te, und schie­be sie dann vor mir her – bis ich sie im Back­log ver­ges­se: back­log­gen statt web­log­gen.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;a href=&quot;https://wirres.net/articles/nicht-aufregen&quot;&gt;nicht aufregen — wirres.net&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Hahaha ich auch. Meine ganzen Notizen sind voll davon. Eigentlich könnte ich diese Notizensammlung auch Backlog nennen. Aber in meinem Backlog sind die Dinge die ich wirklich machen möchte. Für mich passt dieser Begriff nicht so richtig.&lt;/p&gt;&lt;p&gt;Wir haben in der agilen Arbeitsorganisation neben dem Backlog noch einen Funnel. Hier sind die Sachen, die man irgendwann mal angehen könnte und die noch eingehender analysiert werden sollen. Ich verwende das nicht wirklich.&lt;/p&gt;&lt;p&gt;...&lt;/p&gt;&lt;p&gt;Einige Stunden später habe ich hier weitergeschrieben und etwas recherchiert. Ich möchte nicht irgendwelches Halbwissen vorgeben, das ich nicht habe, daher hier meine Erkenntnisse:&lt;/p&gt;&lt;p&gt;Eine Suche bei DuckDuckGo mit „backlog vs funnel“ hatte keine befriedigenden Artikel zeigen können aber in Perplexity hat es annehmbare Antworten dazu:&lt;/p&gt;&lt;p&gt;Mit dem Prompt &lt;code&gt;Was ist ein backlog im vergleich zum Funnel?&lt;/code&gt; liefert es dies hier:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Ein Backlog bezeichnet eine Aufgabenliste mit offenen Aufgaben, die im Laufe eines Projekts abgearbeitet wird. Die Aufgaben sind nach Priorität geordnet und werden dynamisch aktualisiert.&lt;/p&gt;&lt;p&gt;Ein Funnel beschreibt eine mehrstufige Journey, bei der potenzielle Kunden durch verschiedene Phasen geleitet werden, um sie zur Zielhandlung zu bewegen. Hier geht es weniger um Aufgaben, sondern um die Qualifizierung und Auswahl.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Es kann sein, dass diese Funnel-Definition sogar auf unsere Arbeitsweise passt um aber eine Einschätzung geben zu können, bin ich zu weit weg von dem, was dort passiert.&lt;/p&gt;&lt;p&gt;Im Kontext des Bloggens jedoch. Wenn ich also etwas finde, wo ich denke „Hui - interessanter Artikel / Gedanke - da müsste man mal was weiterdenken oder schreiben“ dann landet das alles im Funnel. Danach qualifiziere ich und wähle aus. Irgendwann. Ohne einen Plan und nur wenn ich Lust dazu habe. Später haue ich einen Artikel ins Backlog um diesen weiter zu redigieren, zu verfeinern und zu veröffentlichen.&lt;/p&gt;&lt;p&gt;Wenn ich also reagiere, dann je nach dem sofort, sehr zeitversetzt oder nie.&lt;/p&gt;</description>
      <pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/nicht-aufregen-wirres-net/</guid>
    </item>
    <item>
      <title>Andere Länder andere Filter</title>
      <link>https://csenf.de/posts/andere-laender-andere-filter/</link>
      <description>&lt;p&gt;In Polen ist es nicht möglich, die wertvollen Inhalte von Herrn Weiss auf &lt;a href=&quot;http://konnexus.net&quot;&gt;konnexus.net&lt;/a&gt; abzurufen.&lt;/p&gt;&lt;p&gt;Es gibt eine Umleitung auf den &amp;quot;Orange CyberShield&amp;quot;, der davor warnt, dass diese Webseite von Scammern eingerichtet wurde, um wertvolles Cryptogeld zu stehlen:&lt;/p&gt;&lt;figure&gt;&lt;picture&gt;&lt;source type=&quot;image/webp&quot; srcset=&quot;https://csenf.de/assets/img/cache/gYpE3uM0r2-640.webp 640w, https://csenf.de/assets/img/cache/gYpE3uM0r2-768.webp 768w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1024.webp 1024w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1280.webp 1280w&quot;&gt;&lt;source type=&quot;image/png&quot; srcset=&quot;https://csenf.de/assets/img/cache/gYpE3uM0r2-640.png 640w, https://csenf.de/assets/img/cache/gYpE3uM0r2-768.png 768w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1024.png 1024w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1280.png 1280w&quot;&gt;&lt;img loading=&quot;lazy&quot; decoding=&quot;async&quot; src=&quot;data:image/bmp;base64,Qk32BAAAAAAAADYAAAAoAAAACAAAAAgAAAABABgAAAAAAMAAAAATCwAAEwsAAAAAAAAAAAAA8Oru7ejs5+To5uTp7Ojt7+vw6uju3uHo+fb59fT17+/v7u/u9PPz9/X48fL35evx+u/e9uza7ubS7OTP8ujU9era7ubZ393T8tGN7c2H48Z64MJz5sR46cV/379+zbR367YA5rIA26sA2KYA3acA4KcA1p8Aw5IA78Jz6sBu47tj4bld5rtg6Lxk4LZf0q1T+eTX9+PT8+DN9ODL+eTP++fT9eTQ697I//T4/fP1/PHv/fLu//fy//r2//jz9/Pr&quot; alt=&quot;Screenshot&quot; data-blurhash=&quot;UoL$0ho#e-t85XoLjsay}?aKWWjY~AaefPoJ&quot; width=&quot;1280&quot; height=&quot;1374&quot; srcset=&quot;https://csenf.de/assets/img/cache/gYpE3uM0r2-640.jpeg 640w, https://csenf.de/assets/img/cache/gYpE3uM0r2-768.jpeg 768w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1024.jpeg 1024w, https://csenf.de/assets/img/cache/gYpE3uM0r2-1280.jpeg 1280w&quot; style=&quot;background-image: url(&#39;data:image/bmp;base64,Qk32BAAAAAAAADYAAAAoAAAACAAAAAgAAAABABgAAAAAAMAAAAATCwAAEwsAAAAAAAAAAAAA8Oru7ejs5+To5uTp7Ojt7+vw6uju3uHo+fb59fT17+/v7u/u9PPz9/X48fL35evx+u/e9uza7ubS7OTP8ujU9era7ubZ393T8tGN7c2H48Z64MJz5sR46cV/379+zbR367YA5rIA26sA2KYA3acA4KcA1p8Aw5IA78Jz6sBu47tj4bld5rtg6Lxk4LZf0q1T+eTX9+PT8+DN9ODL+eTP++fT9eTQ697I//T4/fP1/PHv/fLu//fy//r2//jz9/Pr&#39;);
            background-size: cover;&quot;&gt;&lt;/picture&gt;&lt;figcaption&gt;Screenshot von &lt;a href=&quot;http://Konnexus.net&quot;&gt;Konnexus.net&lt;/a&gt; am 06.10.2025 aus Polen&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Übersetzung mit Apples Safari-Übersetzungswerkzeug:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;It wasn&#39;t a cryptocurrency exchange website! &lt;strong&gt;CyberShield Orange&lt;/strong&gt; just stopped you from opening a website created by scammers.&lt;/p&gt;&lt;p&gt;Using socio-technical tricks, criminals spread a mirage of great earnings in front of you to convince you to &amp;quot;invest&amp;quot; an amount small enough for the victim to be persuaded. Usually it&#39;s about a few hundred zlotys. After the deposit, the fraudsters will show the alleged huge profits on your account, and after some time... disappear, along with the money of the scammers.&lt;/p&gt;&lt;p&gt;To avoid risk, an attempt to enter the site &lt;strong&gt;has been blocked by CyberTarcza&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Bad address:&lt;/strong&gt; &lt;s&gt;&lt;code&gt;http://konnexus.net&lt;/code&gt;&lt;/s&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Die beiden als Buttons getarnten Links unter diesem wertvollen Text zeigen zu weiterführenden Informationen:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://alert.cert.orange.pl/a/antiphishing_info/&quot;&gt;How not to become a victim of phishing?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://cert.orange.pl/&quot;&gt;How to avoid online threats?&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Für mich ist das eine interessante Beobachtung, konnte ich bei Herrn Weiss noch keine der beanstandeten Inhalte finden. Vielleicht gibt es ja einen anderen Grund, warum die Seite auf der Block-Liste von Orange Polen gelandet ist?&lt;/p&gt;</description>
      <pubDate>Wed, 29 Oct 2025 06:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/andere-laender-andere-filter/</guid>
    </item>
    <item>
      <title>Fahrrad Auto Bus Bahn</title>
      <link>https://csenf.de/posts/fahrrad-auto-bus-bahn/</link>
      <description>&lt;p&gt;Eine &lt;a href=&quot;https://www.blogissimo.de/blogparade-relevant-fahrrad-auto-bus/&quot;&gt;&lt;strong&gt;Blogparade&lt;/strong&gt;&lt;/a&gt; beschäftigt sich mit dem Thema:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;„Fahrrad, Auto, Bus: Wie bewegst du dich fort?“&lt;/strong&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Das ist eure Aufgabe&lt;br&gt;Schreibe bis zum 2. November 2025 einen Artikel darüber, mit welchem Verkehrsmittel du am liebsten unterwegs bist. Falls du je nach Strecke andere Fortbewegungsmittel nutzt, kannst du das natürlich erwähnen. Du kannst auch gerne die Vor- und Nachteile nennen.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Tatsächlich ist das schon seit langem mein Lieblingsthema.&lt;/p&gt;&lt;p&gt;Fortbewegung.&lt;/p&gt;&lt;p&gt;Schnell.&lt;/p&gt;&lt;p&gt;Geschwindigkeit.&lt;/p&gt;&lt;p&gt;Rausch.&lt;/p&gt;&lt;p&gt;Am liebsten habe ich immer das Tempolimit ausgereizt. Also die unbegrenzte Geschwindigkeit auf deutschen Autobahnen. Geschwindigkeitsrausch - zumindest als Fahrer.&lt;/p&gt;&lt;p&gt;Den ersten Geschwindigkeitsrausch hatte ich als Sozius auf einem Motorrad. Wir rasten mit 180 Sachen die eine schnurgerade Strecke auf der neuen Thüringerwaldautobahn nach Hause. Der Wind zerrte und wütete an mir. Als ich versuchte am Fahrer vorbei nach vorne zu schauen riss es mich fast vom Motorrad. Mit ganzer Kraft klammerte ich mich an den Fahrer und deutete ihm etwas langsamer zu fahren. Danach dachte ich &amp;quot;Oh, ich hatte solche Angst, nie wieder.&amp;quot; - und habe es auch nie wieder gemacht. Kurze Zeit später nahmen mir andere Ereignisse jegliche Lust am der Wahl des Motorrads als Lieblingsfortbewegungsmittel.&lt;/p&gt;&lt;p&gt;Den zweiten hatte ich, als wir - diesmal im Auto und ich als Beifahrer - bei 250 Sachen auf der Sachsenautobahn auf eine leichte Linkskurve zu rasten. Vorne überholten sich gerade zwei LKW. Der schmale Streifen der dritten Spur zwischen dem Lastwagen und der Leitplanke wurde immer schmaler, das langsame, schwere Fahrzeug berührte die gestrichelte weisse Linie, überfuhr sie und schon waren wir vorbei. Danach hatte ich den Fahrer, damals mein Chef gebeten, nicht mehr so schnell zu fahren und er lachte nur und fuhr etwas langsamer. Ich begann 220 Kilometer in der Stunde zu lieben.&lt;/p&gt;&lt;p&gt;Mein Lieblingsfortbewegungsmittel war lange Zeit das Auto. Für die Wege, die ich hatte - zum Einkaufen, zum Gym, zu den Seen in der Umgebung, in die weiter entfernte Umgebung, zu den Eltern, zu Freunden, war das immer die beste Wahl. Zwischen Spass, Bequemlichkeit, Verfügbarkeit und verbrachter Zeit von Tür zu Tür. Selbst in den Ferien, die uns in weiter entfernte Destinationen führten, mieteten wir immer ein Auto ohne in Erwägung zu ziehen, dass es auch Züge, Busse oder Fahrräder gibt. In Geschwindigkeitsrausch kam ich immer - zwar keine 220 km/h aber 180 Sachen laut Tacho waren schon mal drin.&lt;/p&gt;&lt;p&gt;Das ganze änderte sich, als ich aus Deutschland weggezogen bin.&lt;/p&gt;&lt;p&gt;Im ersten Jahr verwendete ich mein eigenes Auto genau vier mal: Einmal, um nach Hause zu fahren, zweimal für Ausflüge und einmal, um es hinter der Grenze, in Deutschland zu verkaufen.&lt;/p&gt;&lt;p&gt;Die Fahrt nach Hause, 120 km in der Schweiz, 600 km in Deutschland war eine Tortour. Mein Auto war dafür nicht gemacht, so lange Strecken bequem zu fahren. Fehlende Assistenten erforderten ständige Aufmerksamkeit und fehlende PS machten es mühsam, bei freier Strecke Kilometer zu schrubben oder anderen, nervenden Fahrern einfach wegzufahren.&lt;/p&gt;&lt;p&gt;Die Ausflüge in die Alpen mit dem Auto waren schön, fast hatte ich es genossen - die Freiheit dorthin zu fahren wohin ich möchte und wann ich möchte und das mitzunehmen, was ich möchte. Bis es nach dem Wochenende Zelten und Fahrradfahren oder dem Wanderausflug wieder nach Hause ging. Alle hatten die gleiche Idee und gleich neben den verschiedenen Staus rasten im Viertelstundentakt die Züge vorbei.&lt;/p&gt;&lt;p&gt;Für alles andere verwendete ich in diesem ersten Jahr das Fahrrad oder öffentliche Verkehrsmittel. Zum Einkaufen gab es Supermärkte in Lauf- oder Fahrradnähe. Das Gym ebenfalls in Laufnähe. Um auf die Arbeit zu kommen, Freunde zu besuchen oder Ausflüge zu machen, erwies sich das verfügbare Netz von Bussen, Strassenbahnen und Zügen als viel bequemer als das Auto zu nehmen. Die verbrachte Zeit von Tür zu Tür war exakt die gleiche oder sogar weniger als mit dem Auto.&lt;/p&gt;&lt;p&gt;Nachdem ich mein Auto verkaufte, sind nun einige Jahre vergangen und ich habe es nicht bereut. Immer noch liebe ich Auto fahren - aber hier macht es keinen Spass und hat seinen Sinn für mich verloren. Immerhin - sollte ich mal kurzfristig ein Auto benötigen, gibt es mit mobility einen Carsharing-Anbieter oder ich miete ein Auto mit Avis oder Europcar oder wer auch immer gerade am günstigsten ist.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrsmittel ist das Fahrrad. Für schöne Tage.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrmittel sind Zug und Bus. Für hässliche Tage, wenn es kalt ist und Hunde und Katzen regnet.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrsmittel ist der Bus. Für die langen Nächte, wenn er mich be- und schlaftrunken nach Hause bringt.&lt;/p&gt;&lt;p&gt;Meine Lieblingsverkehrsmittel sind Zug und Bus. Für Ausflüge. Es gibt nichts schöneres als eine Wanderung über die Alpen von einem Ort zum anderen zu planen und sich unterwegs um zu entscheiden, doch woanders hin zu laufen. Das geht mit dem Auto nicht, denn es möchte gern auf seinem Parkplatz abgeholt werden.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrmittel ist der Zug. Um in die Heimat zu fahren. Auch wenn es mal schwierig ist und die Verbindungen unzuverlässig sein können, ist es doch bequemer, sich im Zug zu beschäftigen, als auf der Autobahn zu rasen.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrsmittel ist das, wo ich die Kosten überschauen und planen kann.&lt;br&gt;Es ist generell nicht günstig, sich schneller fortzubewegen als mit dem Fahrrad und soll das dann noch bequem sein, ist es auch relativ teuer. Aber. Mit öffentlichen Verkehrsmitteln sind die Kosten ziemlich planbar, hier gibt es Festpreis-Abonnements für jeden Geldbeutel. Mit einem eigenen Auto waren die Kosten für mich nie gut planbar. Das Auto möchte Strom oder Treibstoff, möchte gewartet werden und es dann geht es immer mal kaputt. Daneben braucht es es eine Versicherung, man muss noch Steuern, Strassennutzungsgebühren und Stell- und Parkplätze bezahlen. Hatte meine Versicherung einen Schaden übernommen, stieg die Prämie und ich zahlte den Schaden über längere Zeit ab.&lt;/p&gt;&lt;p&gt;Mein Lieblingsverkehrsmittel gibt mir den Geschwindigkeitsrausch. Als wir mit dem Zug nach Paris fuhren - ab Saarbrücken mit dem TGV - lief ich aus Langeweile nach vorne um über die Schulter des Fahrers zu schauen. Wie eine Achterbahn schlängelten sich die Gleise über Hügel, durch Täler und auf Brücken. Der Tacho zeigte 330 Kilometer in der Stunde an - was mir überhaupt nicht zu schnell vorkam.&lt;/p&gt;&lt;p&gt;Ich dachte: &amp;quot;Gerne wieder&amp;quot;.&lt;/p&gt;</description>
      <pubDate>Sun, 26 Oct 2025 19:27:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/fahrrad-auto-bus-bahn/</guid>
    </item>
    <item>
      <title>Zugfahren in Polen</title>
      <link>https://csenf.de/posts/zugfahren-in-polen/</link>
      <description>&lt;p&gt;Als wir auf dem Bahnsteig ankommen, steht der Zug bereits da. Eine lange, silbern glänzende Maschine mit ein paar wenigen Leuten davor auf dem Bahnsteig. Die Anzeigetafel ist noch schwarz und die Türen gehen nicht auf.&lt;/p&gt;&lt;p&gt;Mit der Zeit finden sich immer mehr Leute ein. Erst zehn Minuten vor Abfahrt werden die Türen ohne weitere Ansage geöffnet. Zum Einsteigen muss jeder seine schweren Koffer über die breite Öffnung zwischen Wagen und Bahnsteig heben. Jeder ist ungeduldig, seinen zugewiesenen Platz zu erreichen. Wie in Italien sind alle Plätze dieser Zugklasse reservierungspflichtig.&lt;/p&gt;&lt;p&gt;Auf die Minute fährt der Zug ruhig ab und schlängelt sich durch die sonnigen Vororte von Krakau in Richtung Warschau. Multilinguales, aufgeregtes Geschnatter erfüllt den Wagon. Die Spanisch sprechenden nebenan werden als Mexikaner identifiziert, die sich über irgendwas streiten. Bald wird es ruhiger. Überraschenderweise werden - ebenfalls wie in Italien - kostenlose Getränke gereicht.&lt;/p&gt;&lt;p&gt;Gegenüber sitzt eine Frau zu der sich nach der Abfahrt ein Mann gesellt. Es sieht aus, als ob sie sich hier im Zug gerade kennengelernt haben. Die beiden unterhalten sich angeregt. Nach einiger Zeit verschwinden sie in Richtung Speisewagen. Des Polnischen nicht mächtig, bleiben nur Vermutungen. Als sie nach langer Zeit zurück kommen erfüllt ein strenger Schweissgeruch den Raum, es scheint als ob sie sich gerade körperlich angestrengt haben.&lt;/p&gt;&lt;p&gt;Nach etwa zwei Stunden und ohne weiteren Stop unterwegs, kommen wir erholt an.&lt;/p&gt;</description>
      <pubDate>Tue, 07 Oct 2025 13:00:00 GMT</pubDate>
      <dc:creator>Carsten</dc:creator>
      <guid>https://csenf.de/posts/zugfahren-in-polen/</guid>
    </item>
  </channel>
</rss>