<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://plaindrops.de/assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Plain DrOps</title><link>https://plaindrops.de/</link><description>Besides the noble art of getting things done, there is the noble art of leaving things undone. </description><atom:link href="https://plaindrops.de/de/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>de</language><copyright>Contents © 2025 &lt;a href="mailto:andy@plaindrops.de"&gt;Andy Drop&lt;/a&gt; </copyright><lastBuildDate>Tue, 16 Dec 2025 13:28:46 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Meine 10 Jahre mit Emacs</title><link>https://plaindrops.de/de/blog/2025/tenyearsofemacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Heute vor 10 Jahren hatte ich meinen ersten Kontakt mit Emacs, und dieser Tag hat auf jeden Fall die Art und Weise verändert, wie ich mit dem Computer arbeite, wenn nicht sogar mein Leben.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Der Tag ist mir deshalb so genau in Erinnerung, weil es der Tag nach dem allerersten Treffen des "Warpzonista Coding Clubs" war. Die Warpzone war zu der Zeit mein lokaler Hackerspace, und der Schwerpunkt lag dort damals auf Hardwarebasteleien. Ich hatte Lust mehr Leute kennenzulernen, die - wie ich - programmieren, und bei tollstem Sonnenschein, und leichter &lt;a href="https://www.youtube.com/watch?v=d_siG4dY6qs"&gt;Son Cubano&lt;/a&gt; Musik kam mir die Idee den Coding Club zu gründen. Das erste Treffen fand also am 27. Februar 2015 statt. Nach kurzem kennenlernen, kam das Gespräch dann zu dem Thema, das jeder Programmierer eines Tages für sich entscheidet. Die Wahl des persönlichen Editors.
&lt;/p&gt;

&lt;p&gt;
Da ich damals im wesentlichen beruflich programmiert habe, nutzte ich die integrierte Entwicklungsumgebung die Microsoft mit Visual Basic 6 ausliefert. Aber ich wollte gerne unter Linux mit Python programmieren, und war auf der Suche nach einem Editor. Außerdem hatte ich schon mal Vim ausprobiert, und irgendetwas daran lag mir nicht. Im Laufe des Abends habe ich dann &lt;a href="https://wwwtech.de/about"&gt;Christian Kruse&lt;/a&gt; kennengelernt, und wir haben uns darüber unterhalten, wie mein Kopf funktioniert, und dass ich im Prinzip in Hierarchien denke. Bäume sind mein Ding, Wenn ich Probleme behandele, backtracke mich durch verschiedene Lösungsansätze für Probleme, und Projekte teile ich in Aufgaben und Unteraufgaben auf.
&lt;/p&gt;

&lt;p&gt;
Daraufhin meinte er: "Dann wird Orgmode dein Ding sein", und gab mir eine kurze Übersicht auf seinem Laptop. Am nächsten Tag hab ich mir Emacs installiert, und ausprobiert, wie ich selber mit der Bedienung klarkomme. Um es abzukürzen: Orgmode war toll, aber ich kam überhaupt nicht mit der Bedienung klar. Christian hatte mich schon vorgewarnt, und ich wusste, dass ich etwas namens CUA haben möchte, und ein wenig googlen brachte mich in die ersten Config Dateien, die andere Menschen im Internet veröffentlicht hatten.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org6c0f708"&gt;Die ersten Configs&lt;/h2&gt;
&lt;div id="outline-container-org6c0f708" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6c0f708"&gt;
&lt;p&gt;
Ich hab dann ein paar Wochen lang einiges an Zeit investiert, um mir eine brauchbare Config zu erstellen. Ein paar Schnipsel hatte ich mir an verschiedenen Stellen im Netz zusammengeklaubt. CUA war dabei, YASnippet, und ich hatte herausgefunden, das ich mir eigene Keybindings machen kann. Dass ich die je nach Mode getrennt machen kann, wusste ich damals noch nicht, also alles schön global, und so dauerte es auch nicht lang bis zu meiner ersten Config Bankruptcy, einem Ausdruck, den ich damals noch nicht kannte. Die Ursache dafür war im Wesentlichen, dass meine von überall kopierten Config-Schnipsel oft eigene Namespaces mitbrachten, die ich überhaupt nicht als solche erkannte..
&lt;/p&gt;

&lt;p&gt;
Mein zweiter Config Ansatz war schon relativ nah an dem, was ich bis heute verwende. Ich hatte viel im Emacs Manual gelesen, und mitlerweile Keybindings mit den einzelnen Layern verstanden, und auch gemerkt, das es beim kopieren fremder Configs darauf ankommt die an das verwendete Package Tool anzupassen. Meine zweite Config war also viel geplanter.
&lt;/p&gt;

&lt;p&gt;
Ich verwendete eine minimale ini.cfg, die nichts weiter macht als drei andere configs zu laden
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Eine Basis Config, bei denen ich für jedes installierte Paket die von mir bevorzugten Einstellungen mache (außer den Keybindigs)&lt;/li&gt;
&lt;li&gt;Eine Config die alle Keybindings enthält. Wenn ich die alle an einem Ort habe, dachte ich mir, passieren mir nicht so viele versehentliche Doppelbelegungen&lt;/li&gt;
&lt;li&gt;Eine Datei in der alle Anpassungen landen, die durch die benutzung des Config Tools in Emacs entstehen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Damit konnte ich für die nächsten 1-2 Jahre ganz gut arbeiten. Ich habe Emacs immer besser kennengelernt. Habe verstanden, wie CTRL-X und CTRL-C quasi als einstiegspunkte in die komplette Tastaturbelegung dienen, und das es dort Muster gibt, die wohlüberlegt sind, und sinnvoll, und nicht mit meinem Kopf funktionieren. Ein großer Schritt vorwärts war es als ich das Hydra Paket entdeckte.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org4c2d698"&gt;Ledger&lt;/h2&gt;
&lt;div id="outline-container-org4c2d698" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org4c2d698"&gt;
&lt;p&gt;
Eine der ersten Pakete, das einen Einfluss auf mein reales Leben hatte war der Ledger Mode. Ledger ist eine doppelte Buchführung in einer einzigen Textdatei. Und so begann ich recht schnell damit, meine Bankbuchungen in eine Datei zu schreiben. Mit ein wenig Nachdenken, liess sich auch das Briefumschlag-Budget-System meiner Oma implementieren, und das hat mir finanziell echt den Arsh gerettet, indem es mir den kompletten Durchblick über meine Finanzen geliefert hat
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7c8d29e"&gt;Hydra&lt;/h2&gt;
&lt;div id="outline-container-org7c8d29e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7c8d29e"&gt;
&lt;p&gt;
Bis dahin ga es zwei Arten, wie ich eine Funktion aufgerufen habe: Entweder mit einem Keybinding, oder ich habe gegoogelt, wie eine Funktion heißt, und  habe sie dann via M-X mit ihrem Namen aufgerufen. Mit Hydra konnte ich mir plötzlich all die Funktionen, die ich für wichtig für mich hielt in Hydras ablegen, und sinnvoll gruppieren, und dann auch nur in den jeweiligen Modi zur Verfügung stellen. Ich bin bis heute ein großer Hydra-Fan. Nach und nach habe ich alle meine Hydras in einer Datei zusammengefasst. Diese bilden heute das Projekt Medusa und wurden als vierte Datei meiner Config hinzugefügt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgcdc3f3e"&gt;Helm&lt;/h2&gt;
&lt;div id="outline-container-orgcdc3f3e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgcdc3f3e"&gt;
&lt;p&gt;
Der nächste größere Schritt war Helm. Das aussuchen der verschiedenen möglichkeiten war vor allem bei M-x im Minibuffer eine Qual. Mit Helm gab es nun eine komfortable Ansicht. Diese konnte ich in einen eigenen Buffer packen, der entweder im aktuellen Fenster, oder in einem benachbarten Fenster dargestellt wurde.
Obwohl sich das nun alles schon deutlich besser anfühlte, hat mich ein &lt;a href="https://protesilaos.com/codelog/2020-01-07-emacs-display-buffer/"&gt;Video&lt;/a&gt; von Prot dazu gebracht mein bevorzugtes Window Handling noch einmal komplett zu durchdenken. Seither benutze ich statt Helm den VOCEM-Stack. 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9249820"&gt;VOCEM&lt;/h2&gt;
&lt;div id="outline-container-org9249820" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9249820"&gt;
&lt;p&gt;
Vocem ist meine Abkürzung für *V*ertico, *O*rderless, *C*onsult, *E*mbark &amp;amp; *M*arginalia. Diese 5 Pakete gemeinsam zu benutzen hat sich bei vielen Emacs-Nutzern durchgesetzt, auch wenn man jedes davon für sich alleine benutzen kann
&lt;/p&gt;

&lt;dl class="org-dl"&gt;
&lt;dt&gt;Vertico&lt;/dt&gt;&lt;dd&gt;Vertico bietet eine performante und minimalistische vertikale Completion-UI, die auf dem standardmäßigen Completion-System basiert. Der Fokus von Vertico liegt darauf, eine UI bereitzustellen, die unter allen Umständen korrekt funktioniert. Es ist also der eigentliche Ersatz für Helm&lt;/dd&gt;
&lt;dt&gt;Orderless&lt;/dt&gt;&lt;dd&gt;Dieses Paket stellt einen orderlosen Completion-Stil bereit, der das Muster in durch Leerzeichen getrennte Komponenten unterteilt und Kandidaten findet, die alle Komponenten in beliebiger Reihenfolge enthalten. Orderless ist für mein Hirn unabdingbar, da ich oft denke "Der Befehl begann irgendwie mit list" dabei kam "list" nur irgendwo in der Mitte vor.&lt;/dd&gt;

&lt;dt&gt;Consult&lt;/dt&gt;&lt;dd&gt;Consult bietet Such- und Navigationsbefehle auf Basis der Emacs-Completion-Funktion completing-read. Die Completion ermöglicht es, schnell ein Element aus einer Liste von Kandidaten auszuwählen. Es verbindet also Quasi Vertico mit den gängigen Stellen, an denen man eine Completion haben möchte&lt;/dd&gt;

&lt;dt&gt;Embark&lt;/dt&gt;&lt;dd&gt;Embark erleichtert die Auswahl eines Befehls basierend auf dem, was sich in der Nähe des Cursors befindet – sowohl während einer Minibuffer-Completion-Sitzung (in einer Art, die Helm- oder Counsel-Nutzern vertraut ist) als auch in normalen Buffern. Embark ist so etwas wie ein frei konfigurierbares Kontext-Menü, und macht sich daher auch hervorragend auf der rechten Maustaste.&lt;/dd&gt;

&lt;dt&gt;Marginalia&lt;/dt&gt;&lt;dd&gt;Dieses Paket stellt marginalia-mode bereit, das Marginalien zu den Minibuffer-Completionen hinzufügt. Marginalien sind Markierungen oder Anmerkungen, die am Rand einer Buchseite platziert werden – oder in diesem Fall hilfreiche, farbige Anmerkungen am Rand des Minibuffers für deine Completion-Kandidaten. Marginalia liefert zu vielen Dingen, die nur mit einem Wort in einer Liste auftauchen etwas Kontext.&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd19d31e"&gt;Denote&lt;/h2&gt;
&lt;div id="outline-container-orgd19d31e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd19d31e"&gt;
&lt;p&gt;
Denote hatte auf mich einen ebenso großen Einfluss wie Orgmode. Ich hatte schon vor Emacs ewig versucht all die losen Gedanken, Ideen, Quellen, die ich sonst im Kopf mit mir herumtrage, im Rechner zu organisieren. Ähnlich wie es Luhmann hier in der Nähe mit seinem legendären Zettelkasten gemacht hat. Entweder hatten die Ansätze für mich überhaupt nicht funktioniert, oder das Ablagesystem (das immer irgendeine Art externen Index auf das Wissen pflegte) hat nach einiger Zeit den Sync zwischen Wissen und Index verloren. Denote macht alle Metadaten dierekt an der Datei fest, und daher habe ich es selbst beim Teilen über alle meine Geräte noch nicht geschafft mein mentales Exoskelett aus dem Sync zu bringen. Ein größartiges gut durchdachtes Stück Software.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgedf8047"&gt;Dinge die ich gewollt nicht mache&lt;/h2&gt;
&lt;div id="outline-container-orgedf8047" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgedf8047"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Ich habe zum Beispiel kein Paket-Tool im Einsatz, bei dem mir dir gesamte Konfiguration für das Paket an einer Stelle habe. Ich möchte bewusst alle Tastenkombinatinen für alle Pakete an einem Ort haben, und genau so ergeht es mir mit den Hydras. Diese bauen aufeinander auf, und es ist praktisch sie alle ohne sonstige Dinge in einer Datei zu haben.&lt;/li&gt;
&lt;li&gt;Zettelkasten. Ich kenne die Software nicht, habe aber eine stark negative Meinung zur digitalisierung des Luhmannschen Konzepts. Wir schreiben das Jahr 2025, der Hyperlink ist erfunden.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgcb60525"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-orgcb60525" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgcb60525"&gt;
&lt;p&gt;
Dieser Weg den ich in den 10 Jahren gegangen bin ist auf jeden Fall nur einer von tausenden möglichen Wegen. Jeder nutzt Emacs für andere Dinge, und jedes Hirn funktioniert anders. Ich kann auf jeden Fall empfehlen, die eigenen Ansprüche an die Emacs Umgebung in Ruhe zu durchdenken:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;macht euch eine kurze Notiz, wenn sich etwas "falsch" für euch anfühlt. Beseitigt diese Dinge von Zeit zu Zeit.&lt;/li&gt;
&lt;li&gt;Versucht herauszufinden, mit welchen Dingen ihr in Emacs arbeiten wollt: Configs? Romantexte? Buchhaltungsdateien? Addressen? Mails? Webseiten? Zitate? Orte? diese Liste ließe sich beliebig fortsetzen&lt;/li&gt;
&lt;li&gt;Macht für jedes dieser Dinge eine Liste, welche Aktionen ihr gängigerweise auf diesen Dingen machen müsst. Z.B Weblinks: Im Browser aufrufen, im externen Browser aufrufen, speichern, im Blog publizieren, über alle Geräte synchronisieren, etc&lt;/li&gt;
&lt;li&gt;Baut daraus nach und nach euren persönlichen Workflow zusammen&lt;/li&gt;
&lt;li&gt;macht das nicht direkt am Rechner sondern schreibt diese Gedanken auf Papier, und bewahrt diesen Workflow als Schlachtplan für euch auf&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9e19d3f"&gt;Danke&lt;/h2&gt;
&lt;div id="outline-container-org9e19d3f" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9e19d3f"&gt;
&lt;p&gt;
Natürlich möchte ich vor allem &lt;a href="https://wwwtech.de/about"&gt;Christian Kruse&lt;/a&gt; danken, der mich vor 10 Jahren in die richtige Richtung geschubst hat. Aber auch ein paar anderen Menschen (und ich werde bestimmt am Ende ein paar vergessen haben). Als Bonus erfahrt ihr, wie ich diese Menschen in meinem Kopf nenne.
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;a href="https://sachachua.com/blog/"&gt;Sacha Chua&lt;/a&gt;, die "Mutter der Kompanie" für ihre unermüdliche Arbeit, die Emacs Community mit ihren Emacs News und der jährlichen Emacs Conference zusammen zu halten. Ausserdem dokumentiert sie immer wieder welche Probleme in der realen Welt, sie mit welchen Methoden löst, und warum.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://protesilaos.com/"&gt;Protesilaos "Prot" Stavrou&lt;/a&gt;, "Der Philosoph", für Denote und vor allem dafür, das er seine Gedanken rund um den Entwurf seiner Emacs Pakete öffentlich in seinem Blog darlegt. So lässt sich wunderbar nachvollziehen, ob seine Pakete zum persönlichen Arbeitsstil passen&lt;/li&gt;
&lt;li&gt;&lt;a href="https://karl-voit.at/"&gt;Karl Voit&lt;/a&gt;, "Mr. PIM" für seinen großartigen Orgmode Vortrag, und die Idee, das eigene Arbeiten mit den persönlichen Informationen einmal von Grund auf zu durchdenken. Ich bin dabei zu anderen Ergebnissen gekommen als er, aber ich habe dadurch gelernt, wie mein Hirn denkt, und dass es sinnvoll ist dieses "anders" zu nutzen.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fosstodon.org/@daviwil"&gt;David Wilson&lt;/a&gt;,"Der Erklärbär" für seine unzähligen System Crafters Videos, die immer gut sind, wenn man mal etwas sehr genau erklärt haben will&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Viele andere, von denen man hier und da mal Ideen lesen kann, sind mir ebenso ans Herz gewachsen
Auf die nächsten 10 Jahre mit euch allen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2025/tenyearsofemacs/</guid><pubDate>Tue, 16 Dec 2025 08:13:00 GMT</pubDate></item><item><title>EmacsWiki Blog Karneval "Wartung"</title><link>https://plaindrops.de/de/blog/2025/emacscarnival/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Im Oktober, wenn die Tage kürzer und die Luft frischer wird, verlagern viele Menschen ganz natürlich ihren Fokus von der kreativen Energie des Sommers hin zur ruhigeren Arbeit zu Hause. Es ist die Jahreszeit, in der man Regenrinnen reinigt, Ecken des Hauses gründlich putzt, die man lange ignoriert hat, und kleine Reparaturen erledigt, die den Alltag reibungslos am Laufen halten. So wie sich manche dem Haushalten und dem Herbstputz widmen, kümmern sich andere um digitale Pflege – Notizen durchsehen, alte Dateien ausmisten oder die Emacs-Konfiguration so feinjustieren, dass sie angenehm und verlässlich arbeitet. „Wartung“ – in welcher Bedeutung auch immer – ist das Thema des EmacsWiki Blog-Karnevals im Oktober.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org7a096ac"&gt;Was ist eigentlich ein Blog-Karneval?&lt;/h2&gt;
&lt;div id="outline-container-org7a096ac" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7a096ac"&gt;
&lt;p&gt;
&lt;small&gt;(Kopiert aus Christian Tietzes Einführungspost)&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
Dies ist unser erster Emacs-Karneval, daher kennst du das Format vielleicht noch nicht. Ein Blog-Karneval ist eine unterhaltsame Möglichkeit, eine Community durch gemeinsame Schreibimpulse zu verbinden – und sich über all die kreativen Interpretationen des Monatsthemas zu freuen. Ich habe oben ein paar Deutungen vorgeschlagen, aber dir fällt vielleicht etwas völlig anderes ein. Großartig, mach das! Genau das macht den Spaß aus.
&lt;/p&gt;

&lt;p&gt;
Für zukünftige Karnevals sieh dir die [[&lt;a href="https://www.emacswiki.org/emacs/Carnival"&gt;https://www.emacswiki.org/emacs/Carnival&lt;/a&gt;][„Carnival“-Seite
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7f018c3"&gt;Beiträge einreichen&lt;/h2&gt;
&lt;div id="outline-container-org7f018c3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7f018c3"&gt;
&lt;p&gt;
Schick mir deine Beiträge per &lt;a href="https://masto.plaindrops.de/@spacecadet"&gt;DM&lt;/a&gt;/ &lt;a href="mailto:carnival@plaindrops.de"&gt;E-Mail&lt;/a&gt;! Wenn ich irgendwo anders einen Beitrag finde, verlinke ich ihn hier ebenfalls. Ich sammle Einreichungen bis einschließlich 1. November (Mitteleuropäische Zeit), damit jede Zeitzone die Chance hatte, die Frist am 30. Oktober einzuhalten :)
&lt;/p&gt;


&lt;p&gt;
Folgende Beiträge sind bis zum 30.10.2025 eingegangen:
&lt;/p&gt;


&lt;ul class="org-ul"&gt;
&lt;li&gt;&lt;a href="https://www.finaprosadigital.com/2025-10-12-maintenance-(mantenimiento).html"&gt;Maintenance (Mantenimiento)&lt;/a&gt; von Carlos Pajuelo&lt;/li&gt;
&lt;li&gt;&lt;a href="https://macadie.info/2025/10/08/emacs-carnival-maintenance/"&gt;Emacs Carnival: Maintenance&lt;/a&gt; von Eric MacAdie&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mike.hostetlerhome.com/emacs-maintenance"&gt;Emacs Maintenance&lt;/a&gt; von Mike Hostetler&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kyo.iroiro.party/en/posts/emacs-maintains-my-arch/"&gt;Using Emacs Org-mode As My Package Manager&lt;/a&gt; von Kana&lt;/li&gt;
&lt;li&gt;&lt;a href="https://christiantietze.de/posts/2025/10/sharpening-the-saw-with-emacs/"&gt;Sharpening the Saw with Emacs&lt;/a&gt; von Christian Tietze&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curious.port111.com/2025/10/30/its-fall-time-to-clean.html"&gt;It's Fall. Time to clean up my emacs clutter.&lt;/a&gt; von George Jones&lt;/li&gt;
&lt;li&gt;&lt;a href="https://quijotelibre.net/blog/sharpening-axe-preparing-soil-harvest/"&gt;Sharpening the axe (or preparing the soil for the harvest)&lt;/a&gt; von Quijote Libre (auch auf &lt;a href="https://quijotelibre.net/blog/afilar-hacha-preparar-tierra-cosecha/"&gt;spanisch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://commonplace.doubleloop.net/emacs-carnival-praise-the-patchers"&gt;Emacs Carnival: Praise the patchers&lt;/a&gt; von Neil&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Vielen Dank an alle fürs Mitmachen!
&lt;/p&gt;

&lt;p&gt;
Im November ist  &lt;a href="https://donaldh.wtf/about/"&gt;Donald Hunter&lt;/a&gt; Gastgeber: „&lt;a href="https://donaldh.wtf/2025/10/emacs-carnival-2025-11-an-ode-to-org-babel/"&gt;An ode to org-babel&lt;/a&gt;“.
&lt;/p&gt;

&lt;p&gt;
Auch du kannst Gastgeber eines zukünftigen Karnevals werden – keine Scheu :)
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>Carnival</category><category>emacs</category><category>Maintenance</category><guid>https://plaindrops.de/de/blog/2025/emacscarnival/</guid><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate></item><item><title>Sammeln und kategorisieren von Weblinks in Orgmode</title><link>https://plaindrops.de/de/blog/2025/tagwood/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ob sie nun Lesezeichen, Favoriten oder Weblinks heissen. jeder von uns sammelt im Laufe der Zeit eine ganze Menge von ihnen an. Irgendwann kommt der Tag wo das ganze unübersichtlich wird. und aufgeräumt werden muss. Ich hab mir ein Python Tool dafyr geschrieben. 
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org692eb17"&gt;Was bisher geschah&lt;/h2&gt;
&lt;div id="outline-container-org692eb17" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org692eb17"&gt;
&lt;p&gt;
Neu Weblinks entstehen bei mir immer aus meinem Browser heraus. Sei es der Firefox auf Desktop und Laptop oder auf meinem Handy. Ich könnte sie also einfach nur innerhalb von Firefox lassen. Damit kann ich sie zwischen den Browsern synchronisieren, und sie aufrufen. Was will man mehr?
Nun ich habe in diesem Blog z.B eine &lt;a href="https://plaindrops.de/page/links/"&gt;Seite mit Links&lt;/a&gt;, die ich gerne öffentlich teilen möchte. Wäre doch schön, wenn ich das nicht getrennt machen müsste. Und so hab ich mich schon vor Jahren entschlossen keine der eingebauten. oder online verfügbaren Tools zu nutzen, um Weblinks zu verwalten. Stattdessen speichere ich alle meine Weblinks als &lt;a href="https://plaindrops.de/blog/2020/why-I-like-plaintext/"&gt;Plaintext&lt;/a&gt; im Orgmode Format. Jeder Link ist dort eine Überschrift mit dem Titel der Seite die mit der entsprechenden Seite verlinkt ist.
Falls ich Lust habe, schreibe ich mir noch eine kleine Anmerkung dazu, oder füge ein Zitat aus der Seite ein.
Wenn ich auf Laptop oder Desktop arbeite erledigt das ein kleines AddOn (&lt;a href="https://github.com/Stebalien/org-capture-extension"&gt;Org Capture&lt;/a&gt;) welches neue Links an meine &lt;b&gt;Links.org&lt;/b&gt; Datei dranhängt. Dazu benutzt es das org-capture Protokoll das Emacs für Links zur Verfügung stellt.
Auf dem Handy funktioniert dieses AddOn leider nicht, daher teile ich die Webseite dort einfach mit der Orgzly-revived App. mit der sich Orgmode Dateien auf Android bearbeiten lassen. Der Link landet dann ebenfalls in der &lt;b&gt;Links.org&lt;/b&gt; Datei. Ich synchronisiere mein gesamtes &lt;i&gt;org&lt;/i&gt; Verzeichnii zwischen allen meinen Geräten.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgfd9e3f1"&gt;Die Links.org Datei im Detail&lt;/h2&gt;
&lt;div id="outline-container-orgfd9e3f1" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgfd9e3f1"&gt;
&lt;p&gt;
Zunächst einmal beginnt diese Datei mit einem Satz von Metadaten-Zeilen, die mein Webseiten Generator braucht, um aus der Datei direkt die Linkseite zu erstellen, die man hier im Blog sieht. Das sieht dann so aus
&lt;/p&gt;
&lt;pre class="example" id="orgf81467b"&gt;
#+BEGIN_COMMENT
.. title: Links
.. description: All the links I can recommend
.. slug: links
.. date: 2019-01-01 00:00:00 UTC+01:00
.. tags: links, emacs, orgmode, qutebrowser, plaintext, pim
.. previewimage: qrcodebus.png
#+END_COMMENT
#+OPTIONS: tags:nil
&lt;/pre&gt;
&lt;p&gt;
Die letzte Zeile sorgt dafür, dass die Tags, die ich den einzelnen Links gebe nicht nach HTML exportiert werden
&lt;/p&gt;

&lt;p&gt;
In dieser Datei sind alle neuen Links zunächst mal eine Überschrifft der Stufe 2. In der obesten Stufe 1 gibt es genau vier Überschriften:
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org7a38a0a"&gt;1. Quicklinks&lt;/h3&gt;
&lt;div id="outline-container-org7a38a0a" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org7a38a0a"&gt;
&lt;p&gt;
Wie man sieht sind diese Links mit &lt;code&gt;:noexport:&lt;/code&gt; getaggt, und tauchen daher nicht in der öffentlichen Linkliste auf. Es sind Links. die ich selbst häüfig aufrufe. Deher stehen sie in der Datei ganz oben. und sind bereits sichtbar, wenn ich die Datei öffne
&lt;/p&gt;
&lt;pre class="example" id="orgffc8cb7"&gt;
* ------ Quick Links ----- :noexport:
 :PROPERTIES:
 :VISIBILITY: children
 :END:
&lt;/pre&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Social Media&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shopping&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;News&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Finanzen&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Haustechnik&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Konten&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Other&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://chaos.social"&gt;Mastodon&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://idealo.de"&gt;Idealo&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://tagesschau.de"&gt;Tagesschau&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.volksbank-eg.de/services_cloud/portal/"&gt;Volksbank&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://fritz.box/"&gt;FritzBox&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://bibload.onleihe.de/"&gt;BibLoad&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.thingiverse.com/"&gt;Thingiverse&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://feddit.de"&gt;Feddit&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.amazon.de/"&gt;Amazon&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.theguardian.com/europe"&gt;The Guardian&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://banking.barclays.de/Login"&gt;Barclays&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.32"&gt;Wechselrichter&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://sb-warendorf.lmscloud.net/"&gt;Stadtbücherei&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://cults3d.com/de"&gt;Cults&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.ebay.de/"&gt;eBay&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.schwaebisch-hall.de/meinkonto/login-mein-konto.html"&gt;Schw. Hall&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.38/"&gt;Stromzähler&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://codeberg.org/user/login"&gt;Codeberg&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.otto.de/"&gt;Otto&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://kachelmannwetter.com/de/wetter/2814127-warendorf"&gt;Wetter WAF&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.paypal.com/signin"&gt;Paypal&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://192.168.9.25:8123"&gt;Home Assistant&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://configure.zsa.io/my_layouts"&gt;Oryx&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://app.wallabag.it/"&gt;Wallabag&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.kaufland.de/"&gt;Kaufland&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.destatis.de/DE/Home/_inhalt.html"&gt;Stat. Bundesamt&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://127.0.0.1:631/"&gt;CUPS&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://www.dashboard-deutschland.de/"&gt;Dashboard DE&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://127.0.0.1:8081/"&gt;Syncthing&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;&lt;a href="https://chat.openai.com"&gt;ChatGPT&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="https://de.statista.com/"&gt;Statista&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;&lt;a href="http://localhost:8080/"&gt;Jenkins&lt;/a&gt;&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;Wiki&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org98fbc80"&gt;2. Öffentliche Links&lt;/h3&gt;
&lt;div id="outline-container-org98fbc80" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org98fbc80"&gt;
&lt;p&gt;
Dies sind alle Links, die im Blog sichtbar sind. Aus den Hierarchie-Ebenen generiert mein Layout mit ein wenig CSS-Magie dann eine dynamische Liste. Mein Python Tool lässt alles bis zum Ende dieses Abschnitts in Ruhe.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgd009797"&gt;3. Private Links&lt;/h3&gt;
&lt;div id="outline-container-orgd009797" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgd009797"&gt;
&lt;p&gt;
Hier wird es nun interessant. Heute (2025-03-04) befinden sich hier etwa 450 Links. Diese Links sind mit bis zu vier Tags versehen, und wurden bisher einigermassen sortiert und kategoriesiert gehalten. Wobei man schon an das "einigermassen" nur niedrige Massstäbe anlegen darf. Ach wen lüg ich da an - es war ein Dumpster-Fire.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org461d405"&gt;4. Die INBOX&lt;/h3&gt;
&lt;div id="outline-container-org461d405" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org461d405"&gt;
&lt;p&gt;
Im Prinzip das gleiche Durcheinander, wie bei den privaten Links, nur, dass ich hier noch nicht einmal Tags vergeben habe.
&lt;/p&gt;

&lt;p&gt;
Es sind also die Abschnitte 3 und 4 um die sich mein Tool kümmern soll,
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org6a25f28"&gt;Was ist das Ziel des Tools?&lt;/h2&gt;
&lt;div id="outline-container-org6a25f28" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6a25f28"&gt;
&lt;p&gt;
Es soll sich alle Weblinks aus den Abschnitten 3 und 4 schnappen, und sie anhand ihrer Tags in eine logische Baumstruktur bringen.
Die Fallstricke im letzten Satz befinden sich in den Wörtern &lt;b&gt;eine&lt;/b&gt; und &lt;b&gt;logische&lt;/b&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org7792176"&gt;Gibt es denn mehrere Bäume?&lt;/h3&gt;
&lt;div id="outline-container-org7792176" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org7792176"&gt;
&lt;p&gt;
Natürlich alles andere wära ja auch zu einfach. Tags sind ihrer Natur entsprechend alle gleichwertig. Sie enthalten keine Information über eine Hierarchie. Mal angenommen ich habe den folgenden Link mit den Tags a and b:
&lt;/p&gt;
&lt;pre class="example" id="orgba1a775"&gt;
* Link :a:b:
&lt;/pre&gt;

&lt;p&gt;
Dann kann ich daraus schon 2 mögliche Bäume bauen
&lt;/p&gt;
&lt;pre class="example" id="org25e5f6c"&gt;
├── a
│   └── b
│       └── Link
└── b
    └── a
        └── Link
&lt;/pre&gt;

&lt;p&gt;
Sobald ich 3 Tags habe. kann ich das zusätzlich Tag in 3 möglichen Ebenen einfügen - in jeden der beiden Bäume - und erhalte damit schon 6 mögliche Bäume.
die mathemathische Darstellung wäre &lt;code&gt;3!&lt;/code&gt; (sprich: 3 zur Fakultät) Falls jemand noch exponentielles Wachstum aus der Covid Zeit kennt. Das ist gegen fakutatives Wachstum auf Kindergarten Nivau. Nehmen wir 6 Tags sind wir bereits bei 720 möglichen Bäumen und nur 8 Tags reichen für 40320 Bäume.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgaa006e1"&gt;Und was mach ich nun mit den ganzen Bäumen&lt;/h3&gt;
&lt;div id="outline-container-orgaa006e1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgaa006e1"&gt;
&lt;p&gt;
Der gängige Ansatz wäre, sie alle zu nutzen, Dann taucht ein Link mit 4 Tags eben 24 Mal in der Linkliste auf, aber es gibt eben auch 24 Wege ihn zu finden. Grob Überschlagen würde das bei meinen 450 Links etwa 3000 Links in der Ausgabedatei ergeben. Und das ist mir zu viel. Eine Menge der Pfade ergeben dabei nicht wirklich einen Sinn. Mal angenommen ich verlinke den Ort, an dem ich mein Auto zuletzt geparkt habe:
&lt;/p&gt;
&lt;pre class="example" id="org9b536e3"&gt;
* Auto :germany:munic:mainstreet:
&lt;/pre&gt;
&lt;p&gt;
Dann denke ich ja nicht "Hmm ich weiss noch, das ich in der Mainstreet geparkt habe, also zeig mir mal alle Länder in denen es Städte mit einer Mainstreet gibt. damit ich mir daraus die passende aussuchen kann"
&lt;/p&gt;

&lt;p&gt;
Also muss ich diejengen Bäume abholzen die keinen Sinn ergeben. Hier kommt das zweite entscheidende Wort hinzu. Es soll eine &lt;b&gt;logische&lt;/b&gt; Baumstruktur werden. Aber nicht erst seit Trump sollte klar sein. das es die seltsamsten Varianten von Logik gibt. und da ist alternative Logik noch nicht mal berücksichtigt.
Und bei der Suche noch etwas sinnvollen sind Computer nicht wirklich gut. Also behelfe ich mir mit einem anderen Kriterium, der Häufigkeit. Zählen können Computer nämlich recht gut.
&lt;/p&gt;

&lt;p&gt;
Wenn ich in meiner Datei 200 mal das Tag &lt;b&gt;emacs&lt;/b&gt; habe aber nur 100 mal das Tag &lt;b&gt;orgmode&lt;/b&gt;, Dann sieht der Baum so aus
&lt;/p&gt;
&lt;pre class="example" id="org5d076ac"&gt;
└── emacs
    └── orgmode
        └── Link
&lt;/pre&gt;

&lt;p&gt;
Das klappt dann schon ganz gut, Aber hin und wieder gibt es noch ein paar seltsame Hierarchien, besonders wenn es sich um Tags handelt die insgesamt selten genutzt werden. da kommt es dan auf eine Nutzung mehr oder weniger schon an, wenn es um die Sortierung geht
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org47f18b5"&gt;Und nun mogle ich auch noch&lt;/h3&gt;
&lt;div id="outline-container-org47f18b5" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org47f18b5"&gt;
&lt;p&gt;
In den meisten Fällen kommt es bei den seltenen Tags sowieso nicht darauf an. Aber wenn mir das mit großen (häufigen) Tags passiert ist dass schon ärgerlich. Und deshalb mogle ich ein wenig. Um mal be dem Auto Beispiel zu bleiben - das würde ich in Wirklichkeit so schreiben:
&lt;/p&gt;
&lt;pre class="example" id="org0ec4228"&gt;
* Auto :Germany:Munic:mainstreet:
&lt;/pre&gt;
&lt;p&gt;
Siehst du den Unterschied? Die ersten beiden Tags sind nun gross geschrieben. Für mein Tool ist das der Hinweis, dass Land und Ort hierarchisch wichtiger sind als die Straße. Es gibt damit immer noch 2 mögliche Bäume, aber 4 Bäume sind damit sicher verhindert. Ich kann damit nur ein zwingende Hierarchiestufe bestimmen, aber damit die Zweifelsfälle, die Auftreten könnten, ganz brauchbar abfangen. 
&lt;/p&gt;

&lt;p&gt;
Warum ist das gemogelt? Nun Tags tragen laut Lehrbuch nun mal keine hierarchische Information, und mein Pogrammiererherz fühlt sich auch ein wenig schmutzig an.
Nun aber zum technischen Teil, falls das jemand in einer anderen Sprache nachbauen möchte:
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org57e0576"&gt;Der Algorithmus&lt;/h2&gt;
&lt;div id="outline-container-org57e0576" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org57e0576"&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Als allerstes sammle ich alle Links ein. die ich verarbeiten möchte und werfe sie in ein Dictionary. Der Key ist dabei ein Hashwert des eigentlichen Links. Damit elimimiere ich bereits versehentliche doppelte Links.&lt;/li&gt;
&lt;li&gt;Dann werden alle Permutationen der Tags gebildet. Dabei werden alle Permutationen. die laut meiner gemogelter Tag-Hierarchie verboten sind ausgelassen.&lt;/li&gt;
&lt;li&gt;Die Liste aller Links werfe ich nun in die eigentlich Funktion. die den Baum aufbaut. Weil es bei Bäumen einfach unglaublich praktisch ist, ist diese Funktion rekursiv. Das bedeutet sie erledigt die Aufgaben für ihre Ebene der Baumstruktur, und ruft sich dann für die tieferliegende Hierarchieebene einfach sebst auf. Jede Rekursion braucht eine Abbruchbedingung. Hier ist das "Es gibt keine weiteren Links die noch nicht an einem Tag hängen".&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Was passiert in dieser Funktion nun?
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Der eigentlich Tag wird als Knoten in den Baum eingefügt.&lt;/li&gt;
&lt;li&gt;Zunächst einmal werden alle Links in den Baum gehängt, deren Tags exakt an diese Stelle im Baum passen, An Ebene 2 z.B also nur Links mit exakt 2 Tags die genau den Tags aus Ebene 1 und 2 entsprechen müssen&lt;/li&gt;
&lt;li&gt;Wenn das erledigt ist, und noch Links übrig sind geht es ins Voting.
&lt;ul class="org-ul"&gt;
&lt;li&gt;Hier geben alle Links Stimmen dafür ab welchen Tag sie in dieser Ebene des (Teil-)baums noch gebrauchen können.&lt;/li&gt;
&lt;li&gt;Dar Tag mit den meisten Stimmen gewinnt&lt;/li&gt;
&lt;li&gt;Es wird eine Liste aller Links erstellt. die für diesen Tag gevoted haben&lt;/li&gt;
&lt;li&gt;Mit dieser Liste und den Namen des Gewinner-Tags ruft sich die Funktion selbst auf, und baut somit den kompletten Baum unterhalb auf.&lt;/li&gt;
&lt;li&gt;Die Liste wird von den ursprüglichen Links abgezogen, und sollten dann noch Links übrig sein,  geht es in eine weitere Abstimmungsrunde. Andernfalls ist die Ebene fertig und die Funktion wird beendet&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Am Ende wird der ganze Baum als Orgmode Struktur wieder in die Datei geschrieben und fertig ist die Laube.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org13835a4"&gt;Das Ergebnis&lt;/h2&gt;
&lt;div id="outline-container-org13835a4" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org13835a4"&gt;
&lt;p&gt;
In der Ausgabedatei sind die Tags nun hierarchisch und sortiert
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Die häufigsten Tags kommen zuerst&lt;/li&gt;
&lt;li&gt;Bei gleicher Häufigkeit alphabetisch&lt;/li&gt;
&lt;li&gt;Alle Links sind im Baum&lt;/li&gt;
&lt;li&gt;kein Link ist doppelt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Und ich habe damit bereits einen Link-Baum mit dem ich gut arbeiten kann. Natürlich entsteht damit niemals der ideala Baum der mit dem übereinstimmt. wie ich das per Han sortieren würde aber ich bin schon recht nah dran. Vor allem gibt es in dem Algoritmus noch reichlich Potential für Optimierungen.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org003bda5"&gt;Das Voting tweaken&lt;/h3&gt;
&lt;div id="outline-container-org003bda5" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org003bda5"&gt;
&lt;p&gt;
Wer sich für Wahlrecht interresiert wird festgesteiit haben, dass es dutzende, wenn nicht hunderte verschiedene Wahlverfahren gibt. die  alle zu leicht unterschiedlichen Ergebnissen führen,und auf verschiedene Ziele (feste Sitzanzahl, Gewichtung nach Aktienanteil, Minimierung der zu reitenden Tage bis zur Hauptstadt) optimiert sind.
&lt;/p&gt;

&lt;p&gt;
Das gilt auch für das Voting in diesem Algorithmus. Aktuell voted bei mir jeder Link für jeden Tag der ihm irgendwie nutzt mit einer Stimme. Ebenso wären aber auch andere Varianten denkbar:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Wenn ein Link 3 mögliche Bäume für Tag A sieht und 2 mögliche für Tag B, könnte er mit 3 bzw. 2 Stimmen für die jeweiligen Tags stimmen.&lt;/li&gt;
&lt;li&gt;Die Votes könnten danach gewichtet werden ob ein Tag unmittelbar in dieser Ebene nötig ist, oder möglicherweise erst tiefer im Baum.&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Alles in allem bin ich mit dem Ergebniss aber schon sehr zufrieden. Mein Repo mit dem aktuellen Stand des Tools befindet sich &lt;a href="https://codeberg.org/dr.ops/tagwood"&gt;hier&lt;/a&gt;   
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>orgmode</category><category>python</category><guid>https://plaindrops.de/de/blog/2025/tagwood/</guid><pubDate>Tue, 04 Mar 2025 09:00:00 GMT</pubDate></item><item><title>Lisp Code schreiben mit ChatGPT</title><link>https://plaindrops.de/de/blog/2024/CodingLispWithChatGPT/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich bin gerade dabei, den Besuch eines großen Festivals zu organisieren, mehr als 175 Bands spielen an 4 Tagen und etwa einem Dutzend verschiedener Orte, die quer über die Stadt verteilt sind. Das ganze ist eine logistische Herausforderung. Welche Bands möchte ich sehen und spielen die mit ausreichend zeitlichem Abstand um von Location A in Halle B zu kommen?
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Also habe ich mir von der Seite des Veranstalters alle Daten in ein Org Dokument kopiert und mir eine Übersicht generieren lassen. in Org sieht das so aus:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;* Bands  
   :PROPERTIES:
   :COLUMNS: %ITEM %Ort %Datum %Uhrzeit %Link1 %Link2 %Genre
   :END:

#+BEGIN: columnview :id local :skip-empty-rows t
| ITEM             | Ort                     |      Datum | Uhrzeit | Link1 | Link2 | Genre |
|------------------+-------------------------+------------+---------+-------+-------+-------|
| 12 Illusions (D) | Moritzbastei            | 17.05.2024 |   21.00 | [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]] | [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]] | o     |
| A Projection (S) | Volkspalast Kuppelhalle | 19.05.2024 |   17.40 | [[https://www.youtube.com/watch?v=W7CndC-CQrw][Song1]] | [[https://www.youtube.com/watch?v=D1C5KpP3Hic][Song2]] | o     |
#+END:   

** 12 Illusions (D)
   :PROPERTIES:
   :Datum: 17.05.2024
   :Uhrzeit: 21.00
   :Ort: Moritzbastei
   :Adresse: Universitätsstraße 9
   :Strassenbahn: 9 (Roßplatz)
   :Strassenbahn+: 8, 9, 11, 14, 16, 32 (Wilhelm-Leuschner-Platz)
   :Bus: 412 (Roßplatz)
   :Bus+: N8 (Roßplatz)
   :S-Bahn: S1, S2, S3, S4, S5, S5X, S6 (Wilhelm-Leuscher-Platz)
   :Link1: [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]]
   :Genre: o 
   :END:

12 ILLUSIONS is a newly-launched German dark electro pop band.

** A Projection (S)
   :PROPERTIES:
   :Datum: 19.05.2024
   :Uhrzeit: 17.40
   :Ort: Volkspalast Kuppelhalle
   :Adresse: Messehalle 16 / Puschstraße 10
   :Strassenbahn: 16 (An den Tierkliniken)
   :Link1: [[https://www.youtube.com/watch?v=W7CndC-CQrw][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=D1C5KpP3Hic][Song2]]
   :Genre: o 
   :END: 
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Die Tabelle oben ist meine Übersicht, und da dort mittlerweile knapp 200 Zeilen drin sind ist es mühsam, wenn man zu einer dieser Bands in den Teil mit den Details scrollen möchte. Wenn der Veranstalter die nicht schon alphabetisch aufgelistet hätte wäre es kaum machbar.
&lt;/p&gt;

&lt;p&gt;
Die Übersichtstabelle generiert sich, dank Org Magie, immer neu wenn ich C-c C-c auf der Kopfzeile drücke. Die erste Spalte ist also buchstäblich identisch mit der Überschrift der einzelnen Bands, Wenn diese Überschrift einen Link auf sich selbst enthalten würde, dann wären in der ersten Spalte lauter Links auf die Details zu den Bands.
&lt;/p&gt;

&lt;p&gt;
Um diese Links zu erzeugen muss ich mehrere Funktionen aufrufen:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Erzeugen einer Custom ID für die Überschrift&lt;/li&gt;
&lt;li&gt;Kopieren dieser ID ins Clipboard&lt;/li&gt;
&lt;li&gt;Markieren der Überschrift&lt;/li&gt;
&lt;li&gt;Einfügen des Links&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
und das knapp 200 mal
&lt;/p&gt;

&lt;p&gt;
Da wäre es zumindest schön, eine Funktion zu haben, die diese Schritte durchführt, und die ich dann an eine Taste binden kann.
&lt;/p&gt;

&lt;p&gt;
Eine Nachfrage via Social Medie ergab, das zwar ähnliche Dinge schon erstellt wurden, aber alle hatten dann doch etwas leicht anderes zum Ziel. Und dann dachte ich mir,ich schaue mal ob ChatGPT mir das Problem lösen kann.
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgff86223"&gt;Der erste Versuch&lt;/h2&gt;
&lt;div id="outline-container-orgff86223" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgff86223"&gt;
&lt;p&gt;
Ich: Can you write a emacs lisp function, to link an orgmode Heading at point with its own id, creating one if it does not already exist?
&lt;/p&gt;

&lt;p&gt;
ChatGPT: Certainly! Below is a simple Emacs Lisp function that links an Org mode heading at point with its own ID, creating one if it does not already exist:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Link an Org mode heading at point with its own ID, creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"[[#%s][%s]]"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nicht schlecht für den ersten Versuch. Die Funktion bewegt zuerst den Cursor an den Anfang der aktuellen Überschrift, ruft dann den Text der Überschrift und deren vorhandene ID ab, falls eine vorhanden ist. Falls die Überschrift keine ID hat, generiert sie eine mittels des &lt;code&gt;md5&lt;/code&gt;-Hashes des Überschriftentextes. Schließlich fügt sie einen Link zur Überschrift mit ihrer ID ein.
&lt;/p&gt;

&lt;p&gt;
Leider wird der Cursor an den Anfang der Überschrift bewegt, wodurch der neue Link vor der '** Überschrift' eingefügt wird, und sie somit keine Überschrift mehr ist. Aber vielleicht kann ChatGPF das korrigieren.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgbf3ce26"&gt;Can you alter it, so it replaces the original Heading?&lt;/h2&gt;
&lt;div id="outline-container-orgbf3ce26" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgbf3ce26"&gt;
&lt;p&gt;
ChatGPT: Certainly! Here's the modified function that replaces the original heading with the linked version:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Replace an Org mode heading at point with a linked version using its own ID, creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;line-end-position&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"* [[#%s][%s]]"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Version der Funktion löscht die originale Überschrift und fügt die verlinkte Version an ihrer Stelle ein. Aber sie hat immer noch ein Problem, das man in der letzten Zeile sehen kann. Es fügt immer eine Überschrift der Ebene 1 ein (es fügt ein Sternchen voran, immer nur eines). Mach das weg, ChatGPT!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgfc9f312"&gt;Alter it, so that it preserves the Heading-Level&lt;/h2&gt;
&lt;div id="outline-container-orgfc9f312" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgfc9f312"&gt;
&lt;p&gt;
ChatGPT: Sure! Here's the modified function that preserves the heading level while replacing the original heading with the linked version:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defun&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;link-heading-with-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Replace an Org mode heading at point&lt;/span&gt;
&lt;span class="s"&gt;   with a linked version using its own ID,&lt;/span&gt;
&lt;span class="s"&gt;   preserving the heading level&lt;/span&gt;
&lt;span class="s"&gt;   and creating one if it does not already exist."&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-back-to-heading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;heading-level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-outline-level&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;point&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading-end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;line-end-position&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;heading&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;nth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-heading-components&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;                 &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-entry-get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;progn&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"id-"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;md5&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;                  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;org-set-property&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"CUSTOM_ID"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;delete-region&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"%s [[#%s][%s]]"&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;make-string&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading-level&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;?*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;heading&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Version der Funktion ruft zunächst die Überschriftsebene mit &lt;code&gt;org-outline-level&lt;/code&gt; ab. Dann löscht sie die ursprüngliche Überschrift und fügt die verlinkte Version mit derselben Überschriftsebene ein. Ich habe es ausprobiert, und es hat wie beabsichtigt funktioniert.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;* Bands  
   :PROPERTIES:
   :COLUMNS: %ITEM %Ort %Datum %Uhrzeit %Link1 %Link2 %Genre
   :END:

#+BEGIN: columnview :id local :skip-empty-rows t
| ITEM                                                       | Ort          |      Datum | Uhrzeit | Link1 | Link2 | Genre |
|------------------------------------------------------------+--------------+------------+---------+-------+-------+-------|
| [[#id-e9884ccd6b1210ce39f04bc2eb7f108a][12 Illusions (D)]] | Moritzbastei | 17.05.2024 |   21.00 | Song1 | Song2 | o     |
#+END:   

** [[#id-e9884ccd6b1210ce39f04bc2eb7f108a][12 Illusions (D)]]
   :PROPERTIES:
   :Datum: 17.05.2024
   :Uhrzeit: 21.00
   :Ort: Moritzbastei
   :Adresse: Universitätsstraße 9
   :Strassenbahn: 9 (Roßplatz)
   :Strassenbahn+: 8, 9, 11, 14, 16, 32 (Wilhelm-Leuschner-Platz)
   :Bus: 412 (Roßplatz)
   :Bus+: N8 (Roßplatz)
   :S-Bahn: S1, S2, S3, S4, S5, S5X, S6 (Wilhelm-Leuscher-Platz)
   :Link1: [[https://www.youtube.com/watch?v=MOPkUBQbCzA][Song1]]
   :Link2: [[https://www.youtube.com/watch?v=_CUVz7neaRM][Song2]]
   :Genre: o
   :CUSTOM_ID: id-e9884ccd6b1210ce39f04bc2eb7f108a
   :END:

12 ILLUSIONS is a newly-launched German dark electro pop band.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org5461660"&gt;Es funktioniert&lt;/h2&gt;
&lt;div id="outline-container-org5461660" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org5461660"&gt;
&lt;p&gt;
Das Einzige, was noch zu tun ist, ist das Kopieren in die Konfiguration und das Binden an eine Taste.
Ach ja, und ChatGPT kann das auch erledigen.
&lt;/p&gt;

&lt;p&gt;
Ich: Please make a keybinding that binds M-. to this function
&lt;/p&gt;

&lt;p&gt;
ChatGPT: Sure! You can bind the &lt;code&gt;link-heading-with-id&lt;/code&gt; function to a keybinding of your choice, such as &lt;code&gt;M-.&lt;/code&gt; . Here's how you can do it:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;global-set-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"M-."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'link-heading-with-id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>chatgpt</category><category>emacs</category><category>llm</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2024/CodingLispWithChatGPT/</guid><pubDate>Thu, 09 May 2024 08:00:00 GMT</pubDate></item><item><title>Projekt Medusa: Denote</title><link>https://plaindrops.de/de/blog/2024/MedusaDenote/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Wer schon mal &lt;a href="https://plaindrops.de/page/project/dremacs/"&gt;durch meine Projekte&lt;/a&gt; geschaut hat wird feststellen, dass es dort ein Projekt &lt;i&gt;Medusa&lt;/i&gt; gibt, dass ich für mich angelegt habe. In Emacs gibt es immer wieder Funktionen die ich nur sehr selten brauche, und dann komme ich oft nicht direkt auf den notwendigen Befehl. Da ist es dann ganz hilfreich eine Hydra für diese Situation zu haben, und das Projekt unter dem ich all diese Hydras zusammenfasse, heißt bei mir Medusa. Neulich wollte ich für Denote eine Hydra anlegen, und habe festgestellt, dass es da ein paar Probleme gibt.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Generell halte ich es mit den Hydras so: Ich habe zwei Daumentasten über die ich auf meiner Tastatur die Hydras ansteuere. Auf dem linken Daumen liegt eine eher generelle Hydra die für alle Funktionen gedacht ist die nicht nur in einem speziellen Mode gebraucht werden. Hier kann man es sich etwa so vorstellen, dass dort die Funktion liegen die man normalerweise mit dem Präfix CTRL-x erreicht
&lt;/p&gt;

&lt;p&gt;
Auf dem rechten Daumen liegt eine Art Kontextmenü, also die Hydra, die zu dem jeweiligen Mode gehört, in dem ich mich gerade befinde. Das kann man sich etwa so vorstellen, als wären dort alle Funktionen die über CRTL-c als Prefix zu erreichen sind. Dass ich das ganze wie ein Kontextmenü behandle, sieht man auch daran, dass ich diese Hydras gleichzeitig auf der rechten Maustaste liegen habe.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org9b41ea3"&gt;Modelose Kunst&lt;/h2&gt;
&lt;div id="outline-container-org9b41ea3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9b41ea3"&gt;
&lt;p&gt;
Und hier beginnt auch schon das Problem. &lt;a href="https://protesilaos.com/emacs/denote"&gt;Denote&lt;/a&gt; ist eine Anwendung, die viele Befehle zur Verfügung stellt, um lose geschriebene Notizen miteinander zu verknüpfen. Da diese Notizen jedoch in allen möglichen Formaten geschrieben sein können, gilt natürlich immer der jeweilige Major Mode des Formats. Ich schreibe dieses Blog z.B im Org-Mode das heißt der Major Mode ist in dem Moment nicht Denote sondern Org-Mode. Das Package Major Mode Hydra, funktioniert deswegen schon mal nicht
&lt;/p&gt;

&lt;p&gt;
Denote ist aber auch kein Minor Mode, den man beliebig bei allen möglichen Dokumenten ein- oder ausschalten kann. Ein Dokument ist genau dann ein Denote Dokument wenn es sich in einem bestimmten Verzeichnis (&lt;a href="https://protesilaos.com/emacs/denote#h:15719799-a5ff-4e9a-9f10-4ca03ef8f6c5"&gt;Silo&lt;/a&gt;) befindet und einer Namenskonvention folgt. Und da Denote kein Minor Mode ist, hat es auch keine eigene Keymap. Aber Emacs wäre nicht Emacs, wenn man da nicht etwas machen könnte.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orge566754"&gt;Wir bauen uns einen Minor-Mode&lt;/h2&gt;
&lt;div id="outline-container-orge566754" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orge566754"&gt;
&lt;p&gt;
Es wäre gut, wenn Denote ein Minor Mode hätte, der immer dann aktiv wäre, wenn sich das aktive Dokument in einem Denote-Silo befindet. Da ein Silo immer auch ein Verzeichnis ist, hat Emacs ein Werkzeug an Bord: &lt;code&gt;Verzeichnisspezifische Variablen&lt;/code&gt;
&lt;/p&gt;

&lt;p&gt;
Das Handbuch sagt
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
Der übliche Weg, verzeichnisspezifische Variablen zu definieren, besteht darin, eine Datei mit dem Namen .dir-locals.el in einem Verzeichnis zu platzieren. Wenn Emacs eine Datei in diesem Verzeichnis oder einem seiner Unterverzeichnisse öffnet, werden die verzeichnisspezifischen Variablen, die in .dir-locals.el angegeben sind, angewendet, als ob sie als dateispezifische Variablen für diese Datei definiert worden wären. Emacs sucht nach .dir-locals.el, beginnend im Verzeichnis der geöffneten Datei, und bewegt sich dabei aufwärts im Verzeichnisbaum.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Meine Datei &lt;code&gt;.dir-locals.el&lt;/code&gt; liegt im obersten Verzeichnis meines Silos, und sieht so aus
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nf"&gt;denote-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;t&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Diese Zeile sorgt dafür, das bei allen Dateien in diesem Verzeichnis der denote-mode eingeschaltet wird. Das ist ein Minor Mode, den Denote nicht von Hause aus mitbringt, sondern den wir zuvor selbst erzeugen müssen. Das passiert im entsprechenden Teil meiner Emacs Konfiguration.
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-minor-mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Denote is a simple note-taking tool for Emacs."&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;:lighter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;" Note"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;:keymap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;
&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;make-sparse-keymap&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"C-l"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'denote-link-or-create&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"C-n"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;'denote-link-after-creating&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;f6&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"~/wiki"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;:lighter&lt;/code&gt; gibt an, was in die Mode-Line geschrieben wrd, wenn der Minor-Mode aktiv ist, und &lt;code&gt;:keymap&lt;/code&gt; gibt an welche Keymap genutzt werden soll. In diesem Fall wird über &lt;code&gt;make-sparse-keymap&lt;/code&gt; eine leere Keymap erzeugt, und mit den gängigsten Befehlen die ich so brauche gefüllt. Vermutlich könnte ich diese Erstbefüllung auch weglassen, da ich die endgültigen Keybindings sowieso später mache, aber ich habe kein Beispiel gefunden in dem eine leere Keymap angelegt wurde.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org61f7307"&gt;Die eigentliche Hydra&lt;/h2&gt;
&lt;div id="outline-container-org61f7307" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org61f7307"&gt;
&lt;p&gt;
Ich bestücke meine frisch erzeugte Keymap dann noch mit den einzig entscheidenden Tasten. &lt;code&gt;&amp;lt;menu&amp;gt;&lt;/code&gt; ist der KeyCode den meine rechte Daumentaste sendet.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode-map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;menu&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;'medusa/denote/body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;define-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-mode-map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;kbd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;mouse-3&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;#&lt;/span&gt;&lt;span class="ss"&gt;'medusa/denote/body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wenn ich dann in einem Denote Silo die rechte Maustaste click erscheint folgende Hydra
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/MedusaDenote.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Erzeugt wird das Ganze durch folgenden Code.
ich nutze dabei die etwas kürzere und hübschere Syntax die mir das Package &lt;code&gt;Pretty Hydra&lt;/code&gt; zur Verfügung stellt.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;pretty-hydra-define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;medusa/denote&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;:color&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;:quit-key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;escape&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;:title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Denote"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Create"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"n"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_n_ew note"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"t"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"other _t_ype"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-date&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"other _d_ate"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"s"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-subdirectory&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"other _s_ubdir"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"T"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-template&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"with _T_emplate"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"S"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-signature&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"with _S_ignature"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Link"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"l"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-link-or-create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_l_ink"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"L"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-link-or-create-with-command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_L_ink with command"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"h"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-link-to-heading&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"specific _h_eader"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"r"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-add-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"by _r_egexp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"d"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-add-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"by _d_ired"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-backlinks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"_b_acklinks"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Rename"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"RF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-rename-file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Rename File"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"FT"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-change-file-type-and-front-matter&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"only FileType"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"UF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-rename-file-using-front-matter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"use Frontmatter"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Dyn. Block"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DL"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-dblock-insert-links&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"dyn. Links"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-dblock-insert-backlinks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"dyn. Backlinks"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="s"&gt;"Convert links"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CF"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-convert-links-to-file-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"to File Type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;denote-org-extras-convert-links-to-denote-type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"to Denote Type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;"Other"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"?"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"denote"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Help"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;menu&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;major-mode-hydra&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"Major Mode Hydra"&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>denote</category><category>emacs</category><category>hydra</category><category>medusa</category><guid>https://plaindrops.de/de/blog/2024/MedusaDenote/</guid><pubDate>Fri, 03 May 2024 08:00:00 GMT</pubDate></item><item><title>Keymacs, ein Programm um Emacs Keybindings zu erzeugen </title><link>https://plaindrops.de/de/blog/2024/keymacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Offensichtlich gibt es ein Menge Emacs-Puristen in der Welt, die im Laufe der Jahre gelernt haben so komplizerte Tastenfolgen wie C-x r t M-. C-c C-p fliessend zu tippen
Ich gehöre nicht dazu. Und als ich versucht habe heraus zu finden wie ich das für mich anpassen kann, waren die Webforen voll von Kommentaren, dass das keine gute Idee sei.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Im wesentlichen aus folgenden Gründen:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;&lt;b&gt;Portabilität:&lt;/b&gt; Wenn man seine Emacs-Tastenbelegung stark anpasst, könntest man Schwierigkeiten haben, Emacs auf einem anderen System zu verwenden, auf dem seine Anpassungen nicht verfügbar sind. Das könnte problematisch sein, wenn man häufig zwischen verschiedenen Rechnern wechselt oder wenn man Emacs auf einem entfernten Server verwenden muss.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Lernkurve:&lt;/b&gt; Emacs hat bereits eine steile Lernkurve für Anfänger, und wenn man die Tastenbelegung stark anpasst, kann das die Sache für andere noch schwieriger machen, seine Konfiguration zu verstehen. Das könnte ein Problem sein, wenn man mit anderen zusammenarbeitet oder wenn man seine Konfiguration mit jemand anderem teilen muss.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Konflikte:&lt;/b&gt; Wenn man nicht vorsichtig ist, können stark angepasste Tastenbelegungen zu Konflikten zwischen verschiedenen Paketen oder Modi in Emacs führen. Dies kann zu unerwartetem Verhalten führen und es schwieriger machen, Probleme zu diagnostizieren und zu beheben.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;Abhängigkeit von Anpassungen:&lt;/b&gt; Wenn man zu sehr auf seine individuellen Tastenbelegungen angewiesen ist, könnte man feststellen, dass es schwierig ist, Emacs ohne sie zu verwenden. Das könnte ein Problem sein, wenn man einmal auf einem System arbeiten muss, auf dem man seine individuelle Konfiguration nicht nutzen kann.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Ich muss allerdings nie meine &lt;a href="https://plaindrops.de/page/project/Emacs-Config/"&gt;Emacs Konfiguration&lt;/a&gt; mit anden Menschen teilen, oder Emacs woanders benutzen, als auf meinen beiden Rechnern. Daher fallen die Punkte 1 und 4 schon mal weg. Was die Lernkurve angeht, habe ich ja nicht vor mir noch kompliziertere Tastenkombinationen auszudenken. Ich möchte einfach mit dem weiterarbeiten können, das sich seit Jahrzehnten in mein Gedächtnis gebrannt hat. Punkt 2 hat sich damit auch erledigt.
&lt;/p&gt;

&lt;p&gt;
Bleibt noch Punkt 3, und es stimmt: Wenn man nicht vorsichtig ist, können stark angepasste Tastenbelegungen zu Konflikten zwischen verschiedenen Paketen oder Modi in Emacs führen.
&lt;/p&gt;

&lt;p&gt;
Ich bin dem bisher aus dem Weg gegangen, indem ich in hübschen Tabellen (Org-Mode sei Dank) Buch darüber geführt habe, welche Anpassung ich vorgenommen habe, um zu erkennen wo es evtl. zu Konflikten kommen kann. Dieses Vorgehen ist natürlich recht anfällig für Fehler. Die Tabellen müssen immer konsistent sein zu den Keybindings an dutzenden von Stellen in der Config. Da braucht man schon sehr viel Disziplin, und es wird schwierig, mal eben etwas auszuprobieren.
&lt;/p&gt;

&lt;p&gt;
Etwas besser wurde es, als ich begonnen habe, alle Keybindings in einer Datei zusammenzufassen. Diese Datei wird am Ende der init.el geladen, und nigrgendwo anders werden Keybindings gemacht. Damit hat es lange funktioniert. Keine Tabellen mehr. Im Code steckt die Wahrheit. Leider war es nicht so einfach im Code nach potentiellen Konflikten zu suchen. Man kann nicht mal eben die Sortierung im Code von "Keymap Name" auf "verwendete Taste" ändern. Da waren Tabellen schon besser.
&lt;/p&gt;

&lt;p&gt;
Also habe ich mich hingesetzt, und mir ein Tool in Python geschrieben, bei dem ich meine gewünschten Keybindings wieder in Org-Tabellen verwalten kann, und das Tool erzeugt mir daraus automatisch die gewünschten Keybindings. Es heisst
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgafc85e5"&gt;Keymacs&lt;/h2&gt;
&lt;div id="outline-container-orgafc85e5" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgafc85e5"&gt;
&lt;p&gt;
Das Programm ist ganz simpel. Es geht über eine Datei (default: keymap.org im aktuellen Verzeichnis), sucht sich alle Tabellenzeilen zusammen, und geht davon aus, dass es sich dann dabei 
um Beschreibungen von Keybindings handelt. Dabei werden Headerzeilen und Trennzeilen ignoriert, sowie fast aller anderer umgebender Text auch. Man kann in der Datei also auch beschreiben, was man sich bei den einzelnen Bindings gedacht hat.
&lt;/p&gt;

&lt;p&gt;
Es gibt zwei leicht unterschiedliche Tabellen
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgbc21b98"&gt;Die explizite Tabelle&lt;/h3&gt;
&lt;div id="outline-container-orgbc21b98" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgbc21b98"&gt;
&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-node-visit&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-visit-node-close-treemacs&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-toggle&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-indicate-top-scroll-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;d&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-paste-dir-at-point-to-minibuffer&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;l&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy-map&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-project-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;r&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-relative-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-dir&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Ich habe hier mal mit &lt;code&gt;Treemacs&lt;/code&gt; ein Beispiel herausgesucht, and dem sich einige Dinge gut zeigen lassen. &lt;code&gt;Treemacs&lt;/code&gt; hat die Besonderheit, dass ich im Fenster keine Eingaben machen musss. Es gibt also keinen Grund nicht einfach Buchstaben zu benutzen, ohne den kleinen Finger ständig auf der Ctrl Taste zu haben. Zunächst mal die ersten 3 Zeilen
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-node-visit&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-visit-node-close-treemacs&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;c&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-toggle&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-indicate-top-scroll-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Es gibt 3 verschiedene Stellen. an denen ich einfach &lt;code&gt;c&lt;/code&gt; drücken kann, die jedoch nicht im Konflikt miteinander sind, weil sie sich in verschiedenen Keymaps befinden. Um den namen der keymap zu erhalten, hängt das Programm einfach &lt;code&gt;-map&lt;/code&gt; an den Mode.
&lt;/p&gt;

&lt;p&gt;
Aber moment mal, es gibt doch keinen &lt;code&gt;treemacs-toggle&lt;/code&gt; Mode? Stimmt, aber es gibt eine Keymap dazu und ein Prefix, an das diese gebunden ist. Ich zeige das mal and der &lt;code&gt;treemacs-copy-map&lt;/code&gt;:
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;l&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy-map&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;d&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-paste-dir-at-point-to-minibuffer&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;p&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-project-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;r&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-relative-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;a&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-copy&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-copy-absolute-path-at-point&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Diese Map heist originellerweise &lt;code&gt;treemacs-copy-map&lt;/code&gt; obwohl ursprünglich nur eine Funktion darin die aktuelle Datei kopiert (und die habe ich mir kürzer auf &lt;code&gt;c&lt;/code&gt; gelegt. Alle anderen legen mir nur diverse Links ins Clipboard, daher habe ich als Taste auch &lt;code&gt;l&lt;/code&gt; gewählt um in die &lt;code&gt;treemacs-copy-map&lt;/code&gt; zu gelangen, dia nachfolgende Taste wählt dann welch Art Link ich haben möchte (absolut, relativ oder doch zum Project-Root?) &lt;code&gt;l a&lt;/code&gt; gibt mir also den Link als absoluten Pfad.
&lt;/p&gt;

&lt;p&gt;
Und natürlich kann ich auch, wenn ich will, trotzdem &lt;code&gt;Ctrl&lt;/code&gt; Kombinationen verwenden. Zum Beispiel verwenden viele Programme &lt;code&gt;Ctrl-n&lt;/code&gt; um eine Neue Datei, ein neues Object, oder sonst etwas neues zu erzeugen. Warum sollte ich das ignorieren? Also:
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Key&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-file&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;n&lt;/td&gt;
&lt;td class="org-left"&gt;treemacs-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'treemacs-create-dir&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
So kann ich mit &lt;code&gt;Ctrl-n&lt;/code&gt; eine neue Datei anlegen und mit &lt;code&gt;Ctrl-Super-n&lt;/code&gt; auch ein neues Verzeichnis.
&lt;/p&gt;

&lt;p&gt;
Gerade die gängigen &lt;code&gt;Ctrl&lt;/code&gt; Kombinationen sind aber natürlich in vielen verschiedenen Modi sinnvoll, und man muss ein wenig aufpassen, das sich die Keybindings nicht gegenseitig stören, Vor allem wenn minor-modes ins Spiel kommen. Dazu benutzt man dann besser: 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orge743be6"&gt;Die implizite Tabelle&lt;/h3&gt;
&lt;div id="outline-container-orge743be6" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orge743be6"&gt;
&lt;p&gt;
Auf Anhieb sieht die Tabelle gleich aus, es fehlt jedoch die Key Spalte links
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Mode&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Ctrl&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Super&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Meta&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Shift&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Function&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Remark&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Global&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-insert-link-global&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-insert-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;'org-super-links-insert-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt;org-mode&lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;X&lt;/td&gt;
&lt;td class="org-left"&gt;'org-super-links-link&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Doch woher weiss &lt;code&gt;keymacs&lt;/code&gt; nun an welche Taste es binden soll? Ich hatte zu Beginn geschrieben, dass &lt;code&gt;keymacs&lt;/code&gt; Headerzeilen und Trennzeilen ignoriert, sowie &lt;b&gt;fast&lt;/b&gt; allen anderen umgebenden Text auch. Nun hier ist der Grund für das "fast", und duzu müssen wir in den Org-mode schauen
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** N New
 | Mode       | Ctrl | Super | Meta | Shift | Function                 | Remark |
 |------------+------+-------+------+-------+--------------------------+--------|
 | Global     | X    |       |      |       | 'find-file               |        |
 | org-mode   | X    |       |      |       | 'find-file               |        |
 | dired-mode | X    |       |      |       | 'dired-create-empty-file |        |
 | dired-mode | X    | X     |      |       | 'dired-create-directory  |        |
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
&lt;code&gt;Keymacs&lt;/code&gt; liest nämlich von allen Org Header Zeilen das erste Wort (hier 'N') und verwendet es für die darauf folgenden impliziten Tabellen. Ein neuer Header setzt wieder eine andere Taste z.B.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** F9 Treemacs - a tree layout file explorer for Emacs
 | Mode   | Ctrl | Super | Meta | Shift | Function                | Remark |
 |--------+------+-------+------+-------+-------------------------+--------|
 | Global |      |       |      |       | 'treemacs-select-window |        |
 | Global |      |       |      | X     | 'treemacs-find-file     |        |
 | Global | X    |       |      |       | 'treemacs-find-tag      |        |
 |        |      |       |      |       |                         |        |
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Ausser für das erste Wort interessiert sich &lt;code&gt;keymacs&lt;/code&gt; für nichts. Nebenbei sieht man hier auch, das die global-map mit Global gefüllt wird (mit großem G). Bei den Spalten muss die Reihenfolge passen, die Überschriften sind nur für den Leser und werden ignoriert.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orge77bc0e"&gt;Das Programm&lt;/h2&gt;
&lt;div id="outline-container-orge77bc0e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orge77bc0e"&gt;
&lt;p&gt;
Geschrieben habe ich das ganze ursprünglich um mein Problem zu lösen, und später dann auch um den kompletten Enwicklungsprozess mittels Hatch zu testen. Daher gibt es das ganze auch auf (Test-)PyPi zum Download. Da ich diesen ganzen Python Workflow gerne verinnerlichen möchte, werde ich auch weiter an diesem Tool arbeiten, auch wenn es bisher schon alle meine Probleme löst. Aber der Code ist hässlich und hat bisher nur einen "happy Path" ohne Error Handling.
&lt;/p&gt;

&lt;p&gt;
Der Sourcecode liegt &lt;a href="https://codeberg.org/dr.ops/keymacs"&gt;hier&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
Wenn man es nur installieren möchte empfehle ich &lt;code&gt;pipx&lt;/code&gt; zu nutzen. Dann geht das einfach so:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pipx install -i https://test.pypi.org/simple/ keymacs
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Das Programm liest die keymap.org Datei nur, und schreibt dann eine keymap.el die man dann am Ende seiner init.el einbindet
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(load (concat user-emacs-directory "config.el"))
;;(load (concat user-emacs-directory "sanekeys.el"))
(load (concat user-emacs-directory "medusa.el"))
(org-babel-load-file (concat user-emacs-directory "elgato.org"))
(org-babel-load-file (concat user-emacs-directory "skeletons.org"))
(load (concat user-emacs-directory "keymap.el"))

(setq custom-file (concat user-emacs-directory "custom.el"))
;; (load (concat user-emacs-directory "custom.el"))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>keybindings</category><guid>https://plaindrops.de/de/blog/2024/keymacs/</guid><pubDate>Tue, 23 Apr 2024 08:00:00 GMT</pubDate></item><item><title>Mal eben schnell drucken in Emacs</title><link>https://plaindrops.de/de/blog/2024/PrintingInEmacs/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
In Emacs gibt es eine ganze Reihe von Wegen, hübsche Ausdrucke zu erzeugen. Die meisten erzeugen am Ende PDFs. Aber wenn man einfach mal schnell einen Ausdruck des Buffers haben will, um darin mit Bleistift und Textmarker zu arbeiten, dann kann das schon mal ein Problem werden. Ich hab einen Abend lang versucht, das zu lösen, und es schliesslich auch geschafft. Damit ich mich daran erinnere gibt es diesen Blogeintrag.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Im Prinzip gibt es den befehl &lt;code&gt;print-buffer&lt;/code&gt;, der bei mir aus Gewohnheit mit &lt;i&gt;CTRL-p&lt;/i&gt; aufgerufen wird. Ich erwarte dann, dass aus dem Drucker Papier kommt, das unformatiert einfach das enthält, was ich im Buffer auf dem Bildschirm sehe. 
&lt;/p&gt;

&lt;p&gt;
Leider funktionierte das bei mir überhaupt nicht.
Emacs benutzt für diese Art Ausdrucke den Linux Kommandozeilenbefehl &lt;code&gt;lpr&lt;/code&gt;, und schnell war klar, das mit dem auch auf der Kommanduzeile kein Blumentopf zu gewinnen ist. Jeder Versuch irgendetwas damit zu drucken endete mit der Meldung, dass der lpr Daemon nicht laufen würde. Jeder Versuch diesen zu starten schlug fehl. Irgenwann dämmerte es mir, das lpr als Tool zum drucken vielleicht einfach zu alt ist.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org33ca1eb"&gt;Zurück in die Zukunft&lt;/h2&gt;
&lt;div id="outline-container-org33ca1eb" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org33ca1eb"&gt;
&lt;p&gt;
&lt;code&gt;lpr&lt;/code&gt; ist nämlich ein älterer Befehl, der aus den Zeiten stammt, als Drucker häufig direkt an Unix-Systeme angeschlossen waren. Inzwischen begab es sich aber, das das "Common Unix Printing System" (CUPS) entwickelt wurde, das eine moderne Druckverwaltung auf Unix-Systemen bietet. Und ein wenig Websuche ergab, dass es seinen eigenen Kommandozeilenbefehl mitbringt &lt;code&gt;lp&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
Die Syntax der beiden Befehle kann leicht variieren. &lt;code&gt;lpr&lt;/code&gt; akzeptiert normalerweise einfach den Dateinamen, den ich drucken möchte, während &lt;code&gt;lp&lt;/code&gt; eine Reihe von Optionen akzeptiert, die es mir ermöglichen, verschiedene Aspekte des Druckauftrags zu steuern, wie z.B. die Anzahl der Kopien, den Drucker, das Papierformat usw.
&lt;/p&gt;

&lt;p&gt;
In Emacs gibt es dafür netterweise die Möglichkeit den Befehl, den es unter der Decke nutzt zu konfigurieren.
Wir sagen also, das wir statt &lt;code&gt;lpr&lt;/code&gt; lieber &lt;code&gt;lp&lt;/code&gt; vervenden wollen
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lpr-command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"lp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Da &lt;code&gt;lp&lt;/code&gt; und &lt;code&gt;lpr&lt;/code&gt; unterschiedliche Parameter auf der Kommandozeile mitgeben, macht es auch keinen Sinn, für &lt;code&gt;lp&lt;/code&gt; weiterhin die &lt;code&gt;lpr&lt;/code&gt; Standard Switches zu nutzen. Die schalten wir also ab 
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;setq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lpr-add-switches&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
Und Zack funktionierte alles wie erwartet, also habe ich es in meiner &lt;a href="https://plaindrops.de/page/project/Emacs-Config/#org286df2f"&gt;Config&lt;/a&gt; verewigt
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org16dcd28"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-org16dcd28" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org16dcd28"&gt;
&lt;p&gt;
Wenn man nicht gerade ein antikes Linux System nutzt macht &lt;code&gt;lpr&lt;/code&gt; keinen Sinn mehr, und sollte durch &lt;code&gt;lp&lt;/code&gt; ersetzt werden. IMHO wäre das mittlerweile auch ein guter Default.
&lt;/p&gt;

&lt;p&gt;
In der Konfiguration kann man übrigens auch eigene Parameter einstellen, die an &lt;code&gt;lp&lt;/code&gt; übergeben werden, ich denke damit bekomme ich dann auch den doppelseitigen Druck hin.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>printing</category><guid>https://plaindrops.de/de/blog/2024/PrintingInEmacs/</guid><pubDate>Fri, 19 Apr 2024 08:00:00 GMT</pubDate></item><item><title>Mein Tastaturlayout Edwin</title><link>https://plaindrops.de/de/blog/2023/Edwin/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Irgendwann Anfang des Jahres habe ich mir nach langem Zögern eine &lt;a href="https://www.zsa.io/moonlander"&gt;Moonlander MK1 Tastatur&lt;/a&gt; angeschafft. Ich hatte mir einige Vorteile davon versprochen, aber auch leider einen entscheidenden Nachteil gesehen… 
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Die Vorteile sind:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Dadurch, dass die Tastatur in 2 Hälften geteilt ist, kann ich mir die beiden Seiten passend zu meinem Schulterabstand hinstellen, und habe eine entspanntere Sitzhaltung&lt;/li&gt;
&lt;li&gt;Jede Hälfte ist nach außen geneigt, dadurch ist auch jeder Arm nicht mehr so in sich gedreht, wie an einer "normalen" Tastatur&lt;/li&gt;
&lt;li&gt;Die einzelnen Tasten sind in Spalten angeordnet, bei denen der Finger nur auf und ab greifen muss, und sich dabei nicht noch zur Seite bewegt, wenn es nicht nötig ist. Das kommt mir beim Schreiben besonders entgegen, weil mein Hirn anscheinend in Tabellen und Bäumen denkt. Meine Hirnzellen scheinen rechtwinklig zueinander angeordnet zu sein. Mit den versetzten Tasten bin ich beim Versuch, Tastschreiben zu lernen, nicht wirklich klargekommen. Der Versatz zwischen den Tasten kommt ja daher, die Typenhebel bei mechanischen Schreibmaschinen  zu bedienen, und ist eigentlich schon seit der Zeit der Kugelkopf- oder Typenrad-Schreibmaschinen überflüssig.&lt;/li&gt;
&lt;li&gt;Dafür sind die einzelnen Spalten in der Höhe gegeneinander versetzt, um dem Umstand Rechnung zu tragen, dass die einzelnen Finger auch verschieden lang sind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Der leider wichtige Nachteil:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Die Tastatur zwingt einen dazu, mit zehn Fingern zu schreiben, was ich zu diesem Zeitpunkt leider nicht beherrscht hatte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Dieser Umstand wiegt besonders schwer, weil ich die selbe Tastatur für meinen privaten und für meinen Dienstrechner benutze. Aber, da ich dort im Wesentlichen Bugs aus Legacy Software entferne, und an vielen Tagen keine 10 Zeilen neuen Code schreibe, schien mir das Risiko vertretbar.
&lt;/p&gt;

&lt;p&gt;
Ein riesiger Vorteil ist, dass die Tastatur vollständig frei programmierbar ist, in mehreren Ebenen und unterscheidbar in kurzen, langen, doppelten und gehaltenen Tasten.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org42b9eac"&gt;Das Layout&lt;/h2&gt;
&lt;div id="outline-container-org42b9eac" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org42b9eac"&gt;
&lt;p&gt;
Ich hab mir gedacht, wenn ich sowieso ganz neu mit dem Tastschreiben anfange, dann erspare ich mir auch das leidige QWERTZ-Layout, das so auch wieder nur existiert, damit sich die Typenhebel bei mechanischen Schreibmaschinen möglichst wenig verklemmen.
&lt;/p&gt;

&lt;p&gt;
Für heutiges Schreiben am PC gibt es deutlich besser geeignete Layouts, die die Hände besser entspannen. &lt;a href="https://de.wikipedia.org/wiki/Dvorak-Tastaturbelegung"&gt;Dvorak&lt;/a&gt;, &lt;a href="https://colemak.com/"&gt;Colemak&lt;/a&gt;, oder &lt;a href="https://www.neo-layout.org/"&gt;Neo&lt;/a&gt; zum Beispiel. Ich habe mich für Letzteres entschieden, weil es für die deutsche Sprache optimiert ist, und ich es leicht zu merken finde, alle Vokale in Ruhestellung unter den Fingern der linken Hand zu haben.
&lt;/p&gt;

&lt;p&gt;
Und so habe ich mich bei der Belegung auch im Wesentlichen an Neo 2 orientiert. 
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orga2818bf"&gt;Layer 0&lt;/h3&gt;
&lt;div id="outline-container-orga2818bf" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orga2818bf"&gt;
&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Edwin1.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Die Beschriftung der Tasten liest sich so, dass die obere Hälfte angibt, was die Tastatur ausgibt, wenn ich die Taste drücke, die untere Hälfte zeigt, was beim kurzen Halten der Taste (200 ms, konfigurierbar) der Taste passiert. Wenn ich z.B, die Taste für das "c" kurz halte, wird daraus ein Strg-C.
&lt;/p&gt;

&lt;p&gt;
Wie man sieht habe ich nicht besonders viele Änderungen gegenüber dem normalen Neo-Layout vorgenommen. Die Änderungen sind:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Punkt und Komma haben im Original zwei verschiedene Tasten, aber da ich noch unbedingt Platz für Cursortasten unter der rechten Hand haben wollte, musste der Punkt weichen und ist nun ein kurz gehaltenes Komma.&lt;/li&gt;

&lt;li&gt;Die Zahlenreihe oben ist für mich ohnehin schwer erreichbar, und daher für die vielen Zahlen, die ich ständig tippe, unpraktisch. Ich habe sie also dort komplett entfallen lassen, und in einen Zehnerblock in Ebene 3 verschoben. Stattdessen gibt es in der oberen Reihe nun 20 Funktionstasten F1-F20. Die ersten 10 durch normales Tippen. Durch kurzes Halten wird aus F2 dann F12 etc..&lt;/li&gt;

&lt;li&gt;Die Tasten, um in die anderen Ebenen umzuschalten, sind allesamt auf die unteren Daumentasten gewandert. Dort sind sie besonders einfach zu erreichen.&lt;/li&gt;

&lt;li&gt;Für die Shift-Taste, die normalerweise vom schwachen kleinen Finger gehalten wird, habe ich diverse Stellen ausprobiert. Bewährt hat sich am Ende, die Leertaste - wenn sie gehalten wird - als Shift-Taste zu verwenden.&lt;/li&gt;

&lt;li&gt;sämtliche Sonderzeichen sind beim Neo Layout normalerweise im 2. Layer vergraben, aber da ich den Bindestrich im normalen Schreibfluss immer mal wieder brauche, habe ich mir den auf das gehaltene "j" gelegt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgdb96e9d"&gt;Layer 1&lt;/h3&gt;
&lt;div id="outline-container-orgdb96e9d" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgdb96e9d"&gt;
&lt;p&gt;
Hier finden sich normalerweise alle Sonderzeichen gut verteilt auf beide Hände. Aber mein Kopf hat es einfach nicht hinbekommen, sich deren Anordnung zu merken, also habe ich mir für diese Ebene eine komplett neue Anordnung ausgedacht, die sich an meinen persönlichen Schreibgewohnheiten ausrichtet und passenderweise auch noch sehr einfache Eselsbrücken bereitstellt.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Layer2.png" alt="nil"&gt;]]
&lt;/p&gt;

&lt;p&gt;
Die linke Hälfte der Tastatur ist auf Layer 1  quasi unbelegt. Lediglich die Tasten F21-F24 finden sich hier, wo sich in Ebene 0 F1-F4 finden. Ansonsten benutze ich die Tasten für Textblöcke, die ich beruflich häufig verwende, daher habe ich sie hier auch nicht dargestellt. Stattdessen spielt sich alles unter der rechten Hand ab.
&lt;/p&gt;

&lt;p&gt;
Hier finden sich die PgUp und PgDn Tasten, die beim kurzen Halten den Cursor nicht nur eine Seite nach oben oder unten befördern, sondern gleich bis ganz an den Anfang oder das Ende des Textes. Dazu geht meine Hand wegen der Entfernung ein kleines bisschen aus der Ruheposition heraus.
&lt;/p&gt;

&lt;p&gt;
Die blöde obere Reihe ist nur mit sehr selten benutzten Währungs- und Akzentzeichen belegt.
&lt;/p&gt;

&lt;p&gt;
Zeige- und Mittelfinger sind mit Klammern beschäftigt. In der Ruhestellung mit den normalen und eckigen Klammern, die ich als Programmierer häufig brauche. Wenn ich die Finger nach oben strecke, dann mit den spitzen und geschweiften Klammern. Bei allen Klammern ist es so, dass ich durch Drücken die Klammer öffne, und durch kurzes Halten wieder schliesse. Halten muss ich allerdings sehr selten, da ich mir meinen Editor so eingestellt habe, dass ich beim Öffnen einer Klammer immer auch schon die schließende Klammer automagisch eingefügt bekomme.
&lt;/p&gt;

&lt;p&gt;
Zufällig ergaben sich die Eselsbrücken:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;N - normale Klammern&lt;/li&gt;

&lt;li&gt;R - rechteckige Klammern&lt;/li&gt;

&lt;li&gt;H - HTML Klammern&lt;/li&gt;

&lt;li&gt;G - geschweifte Klammern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Außerdem bilden sie ein hübsches Quadrat
&lt;/p&gt;

&lt;p&gt;
Rechts daneben liegt ein weiteres Quadrat, das ich beruflich benötige, weil ich viele Oracle-SQL-Abfragen schreibe.
&lt;/p&gt;

&lt;p&gt;
Es enthält die einfachen Anführungsstriche, um Strings zu begrenzen, das Semikolon, um Statements zu beenden, das Prozentzeichen, für Wildcards und das Gleichheitszeichen für viele Vergleiche.
&lt;/p&gt;

&lt;p&gt;
Wenn ich die beiden stärksten Finger nach unten bewege finden sich dort alle Zeichen, die ich auf der Kommandozeile benötige, um Pfade einzugeben ( ~ / . ) schön einfach zu erreichen.
&lt;/p&gt;

&lt;p&gt;
Die seltener benötigten Zeichen sind hübsch in die verbleibenden Lücken gestreut.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgba88bbe"&gt;Layer 2&lt;/h3&gt;
&lt;div id="outline-container-orgba88bbe" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgba88bbe"&gt;
&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Layer3.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Die Ebene 2 ist dann für den Zehnerblock reserviert. Das ist für mich einfach die intuitivere Art Ziffern zu erfassen, und als eigene Ebene ist es damit noch nicht einmal nötig, die rechte Hand zur Seite zu bewegen. Der linke Daumen wechselt in die Ebene und sofort liegt die 5 unter meinem rechten Mittelfinger und alle wichtigen Rechenzeichen sind rundherum angeordnet. Punktrechnung rechts, Strichrechnung links.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org8290366"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-org8290366" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8290366"&gt;
&lt;p&gt;
Das Layout, wie es heute ist, hat sich mittlerweile sehr bewährt, und was das korrekte Tastschreiben angeht, schreibe ich mittlerweile weitgehend blind in nahezu der alten in 40 Jahren angewöhnten 6-Finger-Geschwindigkeit. In den letzten 2 Wochen habe ich allerdings schon mehrfach bemerkt, wie das Muskelgedächtnis mehr und mehr die Steuerung übernimmt. Häufig bennutzte Buchstabenfolgen tippen meine Finger mittlerweile selbstständig, noch bevor mein Kopf dazu kommt, sie in einzelne Buchstaben zu zerlegen. Da wird sich im nächsten Jahr bestimmt noch viel tun.
&lt;/p&gt;

&lt;p&gt;
Der befürchtete Effekt, dass ich das Standard QWERTZ-Layout verlerne, ist ausgeblieben. Ich muss mich zwar immer erst 1-2 Minuten eingewöhnen, aber dann ist alles wieder da. In QWERTZ kann ich sowieso nicht blind schreiben und möchte es mir dort auch nicht angewöhnen. Ich bin aber immer noch schnell genug, um z.B. diesen Blogeintrag auf QWERTZ zu schreiben, weil er auf meinem alten Laptop unterwegs entstanden ist.
&lt;/p&gt;

&lt;p&gt;
Die Tastaturen fühlen sich so deutlich unterschiedlich an (auch weil ich die Standard-Neigung von knapp 20° mit Hilfe eines &lt;a href="https://www.thingiverse.com/thing:4881967"&gt;Keils von Thingiverse&lt;/a&gt; auf knapp 30° Neigung gebracht habe), dass mein Kopf automatisch umschaltet.
&lt;/p&gt;

&lt;p&gt;
Alles in allem wundere ich mich mittlerweile darüber, wie einfach Tastschreiben ist, wenn nur die Umgebung dafür stimmt, und warum immer noch ein System gelehrt wird, und verbreitet ist, das auf Geräte optimiert ist, die es mittlerweile nur noch auf Flohmärkten zu Ramschpreisen zu finden gibt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>hardware</category><category>keyboard</category><guid>https://plaindrops.de/de/blog/2023/Edwin/</guid><pubDate>Thu, 07 Dec 2023 23:00:00 GMT</pubDate></item><item><title>Austauschen einer defekten PGP Karte durch das Backup</title><link>https://plaindrops.de/de/blog/2022/ChangePGPCard/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich hatte es geschafft, die PGP-Karte zu ruinieren, auf der sich der PGP-Key befindet den ich zum Lesen meiner eMails und zum Entschlüsseln meines Passwort-Stores benötige. Ein Backup besaß ich, in Form eines zweiten Hardware Schlüssels. Nun, leider stellte es sich als nicht so einfach heraus, diesen auszutauschen.
&lt;/p&gt;

&lt;!-- TEASER_END --&gt;

&lt;p&gt;
ich hätte natürlich die Sicherungskopien des Schlüssels, die ich mir beim Erstellen auf der Festplatte abgelegt hatte, einfach wieder auf den alten Key zurückspielen können, aber ich dachte mir: "Was wäre, wenn ich diesen Schlüssel komplett verloren hätte? Probier doch einmal aus, komplett auf den Reserve-Schlüssel zu wechseln".
&lt;/p&gt;

&lt;p&gt;
Während es dutzende Anleitungen gibt, wie man einen Schlüssel von der Festplatte auf seinen Hardwaretoken spielt, wird es hier sehr dünn. Ich musste mehrere Stunden googeln, um da zu einer Lösung zu finden. Daher habe ich die hier einmal zusammengeschrieben, auch weil ich sie in Zukunft vieleicht selber wieder benötigen könnte.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org582e0fe"&gt;Das Problem&lt;/h2&gt;
&lt;div id="outline-container-org582e0fe" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org582e0fe"&gt;
&lt;p&gt;
Ich schaue mir den privaten Schlüssel an meinem Schlüsselbund an:
&lt;/p&gt;

&lt;pre class="example" id="org3a23ff2"&gt;
$ gpg  --list-secret-keys

gpg: verwende Vertrauensmodell pgp
/home/andy//.gnupg/pubring.kbx
-----------------------------
.
.
.

sec&amp;gt;  rsa4096 2021-04-19 [SC]
      3E572D5964195D5FEABC3284405D44C9EE5427D5
      Kartenseriennr. = 0006 15889829
uid        [ ultimativ ] Andy Drop (internal use only) 
ssb&amp;gt;  rsa4096 2021-04-19 [A]
ssb&amp;gt;  rsa4096 2021-04-19 [E]
&lt;/pre&gt;

&lt;p&gt;
Die '&amp;gt;' Zeichen hinter &lt;code&gt;sec&lt;/code&gt; und &lt;code&gt;ssb&lt;/code&gt; sagen mir, das sich in meinem Schlüsselbund nur sogenannte Stubs befinden, also nur Platzhalter, und sich die eigentlichen Schlüssel auf einer Hardware-Karte befinden. Welche Karte das ist steht in der dritten Zeile:
&lt;/p&gt;

&lt;pre class="example" id="org874f55a"&gt;
Kartenseriennr. = 0006 15889829
&lt;/pre&gt;

&lt;p&gt;
Wann immer ich also etwas mit diesem Schlüssel entschlüsseln möchte, fordert gnupg mich auf, genau diese Karte einzustecken. Keine andere Karte wird akzeptiert, auch nicht, wenn sie ebenfalls die passenden Schlüssel enthält.
&lt;/p&gt;

&lt;p&gt;
Nun habe ich aber diese Karte verloren, und möchte gnupg beibringen meine Backupkarte zu akzeptieren.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgdc6559a"&gt;Die Lösung&lt;/h2&gt;
&lt;div id="outline-container-orgdc6559a" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgdc6559a"&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org902fc70"&gt;Alte Karte entfernen&lt;/h3&gt;
&lt;div id="outline-container-org902fc70" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org902fc70"&gt;
&lt;p&gt;
Zunächst brauche ich dazu die sogenannten Keygrips der betroffenen Schlüssel
&lt;/p&gt;

&lt;pre class="example" id="org68ec9b3"&gt;
andy@drops:~$ gpg --edit-key 3E572D5964195D5FEABC3284405D44C9EE5427D5
gpg (GnuPG) 2.2.27; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/405D44C9EE5427D5
     erzeugt: 2021-04-19  verfällt: niemals     Nutzung: SC  
     Kartennummer:0006 15889829
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/9CE3093DEDB0EFA7
     erzeugt: 2021-04-19  verfällt: niemals     Nutzung: A   
     Kartennummer:0006 15889829
ssb  rsa4096/BFB3A95BEE2789E0
     erzeugt: 2021-04-19  verfällt: niemals     Nutzung: E   
     Kartennummer:0006 15889829
[ ultimativ ] (1). Andy Drop (internal use only) 

gpg&amp;gt; grip
pub   rsa4096/405D44C9EE5427D5 2021-04-19 [SC]
      Keygrip: 952111DC39E0687E154045F1B54BA5BFC6242DBC
sub   rsa4096/9CE3093DEDB0EFA7 2021-04-19 [A]
      Keygrip: 95B287025E371F29E4FD871A87558B1680B99130
sub   rsa4096/BFB3A95BEE2789E0 2021-04-19 [E]
      Keygrip: F0F87AFE74FEF37BA47A414979685B063D319EC2

gpg&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;
Diese Keygrips finde ich als Dateien im Verzeichnis &lt;code&gt;~/.gnupg/private-keys-v1.d&lt;/code&gt; wieder
&lt;/p&gt;

&lt;pre class="example" id="org55580ab"&gt;
/home/andy/.gnupg/private-keys-v1.d:
insgesamt 64K
-rw------- 1 andy andy 1,2K 30. Nov 15:43 952111DC39E0687E154045F1B54BA5BFC6242DBC.key
-rw------- 1 andy andy 1,2K 30. Nov 15:43 95B287025E371F29E4FD871A87558B1680B99130.key
-rw------- 1 andy andy 1,2K 30. Nov 16:04 F0F87AFE74FEF37BA47A414979685B063D319EC2.key
&lt;/pre&gt;

&lt;p&gt;
In diesen Dateien ist der Verweis auf meine Schlüsselkarte hinterlegt. Da die Karte weg ist, müssen die Dateien nun auch gelöscht werden, Danach verlangt gnupg nicht mehr nach der alten Karte, weiss aber auch mit der Backup-Karte noch nichts anzufangen
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org44999f9"&gt;Neue Karte verknüpfen&lt;/h3&gt;
&lt;div id="outline-container-org44999f9" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org44999f9"&gt;
&lt;p&gt;
Dies ist dann wiederum sehr einfach. Ich stoppe zunächst den gpg-agent, da der mir sonst mit seinen gecachten Informationen das Leben zur Hölle macht.
&lt;/p&gt;

&lt;pre class="example" id="org04599e7"&gt;
gpgconf --kill gpg-agent
&lt;/pre&gt;

&lt;p&gt;
Danach stecke ich die neue Karte ein, und mache gnupg mit der neuen Karte bekannt
&lt;/p&gt;

&lt;pre class="example" id="org74987e7"&gt;
gpg --card-status
&lt;/pre&gt;

&lt;p&gt;
Danach hat gnupg neue Dateien für die Keygrips der neuen Karte angelegt, und nach einem herzhaften Neustart der User-Session verlangt er ab nun nach der Backup-Karte
&lt;/p&gt;

&lt;p&gt;
Ziel erreicht!
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>backup</category><category>crypto</category><category>gpg</category><guid>https://plaindrops.de/de/blog/2022/ChangePGPCard/</guid><pubDate>Fri, 02 Dec 2022 15:00:00 GMT</pubDate></item><item><title>Mein Tastaturlayout</title><link>https://plaindrops.de/de/blog/2022/moonlanderlayout/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Irgendwann Anfang des Jahres habe ich mir nach langem Zögern eine &lt;a href="https://www.zsa.io/moonlander"&gt;Moonlander MK1 Tastatur&lt;/a&gt; angeschafft. Ich hatte mir einige Vorteile davon versprochen, aber auch leider einen entscheidenden Nachteil gesehen… 
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;
Die Vorteile sind:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Dadurch, dass die Tastatur in 2 Hälften geteilt ist, kann ich mir die beiden Seiten passend zu meinem Schulterabstand hinstellen, und habe eine entspanntere Sitzhaltung&lt;/li&gt;
&lt;li&gt;Jede Hälfte ist nach außen geneigt, dadurch ist auch jeder Arm nicht mehr so in sich gedreht, wie an einer "normalen" Tastatur&lt;/li&gt;
&lt;li&gt;Die einzelnen Tasten sind in Spalten angeordnet, bei denen der Finger nur auf und ab greifen muss, und sich dabei nicht noch zur Seite bewegt, wenn es nicht nötig ist. Das kommt mir beim Schreiben besonders entgegen, weil mein Hirn anscheinend in Tabellen und Bäumen denkt. Meine Hirnzellen scheinen rechtwinklig zueinander angeordnet zu sein. Mit den versetzten Tasten bin ich beim Versuch, Tastschreiben zu lernen, nicht wirklich klargekommen. Der Versatz zwischen den Tasten kommt ja daher, die Typenhebel bei mechanischen Schreibmaschinen  zu bedienen, und ist eigentlich schon seit der Zeit der Kugelkopf- oder Typenrad-Schreibmaschinen überflüssig.&lt;/li&gt;
&lt;li&gt;Dafür sind die einzelnen Spalten in der Höhe gegeneinander versetzt, um dem Umstand Rechnung zu tragen, dass die einzelnen Finger auch verschieden lang sind.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Der leider wichtige Nachteil:
&lt;/p&gt;
&lt;ul class="org-ul"&gt;
&lt;li&gt;Die Tastatur zwingt einen dazu, mit zehn Fingern zu schreiben, was ich zu diesem Zeitpunkt leider nicht beherrscht hatte.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Dieser Umstand wiegt besonders schwer, weil ich die selbe Tastatur für meinen privaten und für meinen Dienstrechner benutze. Aber, da ich dort im Wesentlichen Bugs aus Legacy Software entferne, und an vielen Tagen keine 10 Zeilen neuen Code schreibe, schien mir das Risiko vertretbar.
&lt;/p&gt;

&lt;p&gt;
Ein riesiger Vorteil ist, dass die Tastatur vollständig frei programmierbar ist, in mehreren Ebenen und unterscheidbar in kurzen, langen, doppelten und gehaltenen Tasten.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org9e9c39c"&gt;Das Layout&lt;/h2&gt;
&lt;div id="outline-container-org9e9c39c" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9e9c39c"&gt;
&lt;p&gt;
Ich hab mir gedacht, wenn ich sowieso ganz neu mit dem Tastschreiben anfange, dann erspare ich mir auch das leidige QWERTZ-Layout, das so auch wieder nur existiert, damit sich die Typenhebel bei mechanischen Schreibmaschinen möglichst wenig verklemmen.
&lt;/p&gt;

&lt;p&gt;
Für heutiges Schreiben am PC gibt es deutlich besser geeignete Layouts, die die Hände besser entspannen. &lt;a href="https://de.wikipedia.org/wiki/Dvorak-Tastaturbelegung"&gt;Dvorak&lt;/a&gt;, &lt;a href="https://colemak.com/"&gt;Colemak&lt;/a&gt;, oder &lt;a href="https://www.neo-layout.org/"&gt;Neo&lt;/a&gt; zum Beispiel. Ich habe mich für Letzteres entschieden, weil es für die deutsche Sprache optimiert ist, und ich es leicht zu merken finde, alle Vokale in Ruhestellung unter den Fingern der linken Hand zu haben.
&lt;/p&gt;

&lt;p&gt;
Und so habe ich mich bei der Belegung auch im Wesentlichen an Neo 2 orientiert. 
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgd8ea9b6"&gt;Layer 0&lt;/h3&gt;
&lt;div id="outline-container-orgd8ea9b6" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgd8ea9b6"&gt;
&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Layer1.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Die Beschriftung der Tasten liest sich so, dass die obere Hälfte angibt, was die Tastatur ausgibt, wenn ich die Taste drücke, die untere Hälfte zeigt, was beim kurzen Halten der Taste (200 ms, konfigurierbar) der Taste passiert. Wenn ich z.B, die Taste für das "c" kurz halte, wird daraus ein Strg-C.
&lt;/p&gt;

&lt;p&gt;
Wie man sieht habe ich nicht besonders viele Änderungen gegenüber dem normalen Neo-Layout vorgenommen. Die Änderungen sind:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Punkt und Komma haben im Original zwei verschiedene Tasten, aber da ich noch unbedingt Platz für Cursortasten unter der rechten Hand haben wollte, musste der Punkt weichen und ist nun ein kurz gehaltenes Komma.&lt;/li&gt;

&lt;li&gt;Die Zahlenreihe oben ist für mich ohnehin schwer erreichbar, und daher für die vielen Zahlen, die ich ständig tippe, unpraktisch. Ich habe sie also dort komplett entfallen lassen, und in einen Zehnerblock in Ebene 3 verschoben. Stattdessen gibt es in der oberen Reihe nun 20 Funktionstasten F1-F20. Die ersten 10 durch normales Tippen. Durch kurzes Halten wird aus F2 dann F12 etc..&lt;/li&gt;

&lt;li&gt;Die Tasten, um in die anderen Ebenen umzuschalten, sind allesamt auf die unteren Daumentasten gewandert. Dort sind sie besonders einfach zu erreichen.&lt;/li&gt;

&lt;li&gt;Für die Shift-Taste, die normalerweise vom schwachen kleinen Finger gehalten wird, habe ich diverse Stellen ausprobiert. Bewährt hat sich am Ende, die Leertaste - wenn sie gehalten wird - als Shift-Taste zu verwenden.&lt;/li&gt;

&lt;li&gt;sämtliche Sonderzeichen sind beim Neo Layout normalerweise im 2. Layer vergraben, aber da ich den Bindestrich im normalen Schreibfluss immer mal wieder brauche, habe ich mir den auf das gehaltene "j" gelegt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgaf3f577"&gt;Layer 1&lt;/h3&gt;
&lt;div id="outline-container-orgaf3f577" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgaf3f577"&gt;
&lt;p&gt;
Hier finden sich normalerweise alle Sonderzeichen gut verteilt auf beide Hände. Aber mein Kopf hat es einfach nicht hinbekommen, sich deren Anordnung zu merken, also habe ich mir für diese Ebene eine komplett neue Anordnung ausgedacht, die sich an meinen persönlichen Schreibgewohnheiten ausrichtet und passenderweise auch noch sehr einfache Eselsbrücken bereitstellt.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Layer2.png" alt="nil"&gt;]]
&lt;/p&gt;

&lt;p&gt;
Die linke Hälfte der Tastatur ist auf Layer 1  quasi unbelegt. Lediglich die Tasten F21-F24 finden sich hier, wo sich in Ebene 0 F1-F4 finden. Ansonsten benutze ich die Tasten für Textblöcke, die ich beruflich häufig verwende, daher habe ich sie hier auch nicht dargestellt. Stattdessen spielt sich alles unter der rechten Hand ab.
&lt;/p&gt;

&lt;p&gt;
Hier finden sich die PgUp und PgDn Tasten, die beim kurzen Halten den Cursor nicht nur eine Seite nach oben oder unten befördern, sondern gleich bis ganz an den Anfang oder das Ende des Textes. Dazu geht meine Hand wegen der Entfernung ein kleines bisschen aus der Ruheposition heraus.
&lt;/p&gt;

&lt;p&gt;
Die blöde obere Reihe ist nur mit sehr selten benutzten Währungs- und Akzentzeichen belegt.
&lt;/p&gt;

&lt;p&gt;
Zeige- und Mittelfinger sind mit Klammern beschäftigt. In der Ruhestellung mit den normalen und eckigen Klammern, die ich als Programmierer häufig brauche. Wenn ich die Finger nach oben strecke, dann mit den spitzen und geschweiften Klammern. Bei allen Klammern ist es so, dass ich durch Drücken die Klammer öffne, und durch kurzes Halten wieder schliesse. Halten muss ich allerdings sehr selten, da ich mir meinen Editor so eingestellt habe, dass ich beim Öffnen einer Klammer immer auch schon die schließende Klammer automagisch eingefügt bekomme.
&lt;/p&gt;

&lt;p&gt;
Zufällig ergaben sich die Eselsbrücken:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;N - normale Klammern&lt;/li&gt;

&lt;li&gt;R - rechteckige Klammern&lt;/li&gt;

&lt;li&gt;H - HTML Klammern&lt;/li&gt;

&lt;li&gt;G - geschweifte Klammern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Außerdem bilden sie ein hübsches Quadrat
&lt;/p&gt;

&lt;p&gt;
Rechts daneben liegt ein weiteres Quadrat, das ich beruflich benötige, weil ich viele Oracle-SQL-Abfragen schreibe.
&lt;/p&gt;

&lt;p&gt;
Es enthält die einfachen Anführungsstriche, um Strings zu begrenzen, das Semikolon, um Statements zu beenden, das Prozentzeichen, für Wildcards und das Gleichheitszeichen für viele Vergleiche.
&lt;/p&gt;

&lt;p&gt;
Wenn ich die beiden stärksten Finger nach unten bewege finden sich dort alle Zeichen, die ich auf der Kommandozeile benötige, um Pfade einzugeben ( ~ / . ) schön einfach zu erreichen.
&lt;/p&gt;

&lt;p&gt;
Die seltener benötigten Zeichen sind hübsch in die verbleibenden Lücken gestreut.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orged636b2"&gt;Layer 2&lt;/h3&gt;
&lt;div id="outline-container-orged636b2" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orged636b2"&gt;
&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Layer3.png" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Die Ebene 2 ist dann für den Zehnerblock reserviert. Das ist für mich einfach die intuitivere Art Ziffern zu erfassen, und als eigene Ebene ist es damit noch nicht einmal nötig, die rechte Hand zur Seite zu bewegen. Der linke Daumen wechselt in die Ebene und sofort liegt die 5 unter meinem rechten Mittelfinger und alle wichtigen Rechenzeichen sind rundherum angeordnet. Punktrechnung rechts, Strichrechnung links.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org11252a3"&gt;Fazit&lt;/h2&gt;
&lt;div id="outline-container-org11252a3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org11252a3"&gt;
&lt;p&gt;
Das Layout, wie es heute ist, hat sich mittlerweile sehr bewährt, und was das korrekte Tastschreiben angeht, schreibe ich mittlerweile weitgehend blind in nahezu der alten in 40 Jahren angewöhnten 6-Finger-Geschwindigkeit. In den letzten 2 Wochen habe ich allerdings schon mehrfach bemerkt, wie das Muskelgedächtnis mehr und mehr die Steuerung übernimmt. Häufig bennutzte Buchstabenfolgen tippen meine Finger mittlerweile selbstständig, noch bevor mein Kopf dazu kommt, sie in einzelne Buchstaben zu zerlegen. Da wird sich im nächsten Jahr bestimmt noch viel tun.
&lt;/p&gt;

&lt;p&gt;
Der befürchtete Effekt, dass ich das Standard QWERTZ-Layout verlerne, ist ausgeblieben. Ich muss mich zwar immer erst 1-2 Minuten eingewöhnen, aber dann ist alles wieder da. In QWERTZ kann ich sowieso nicht blind schreiben und möchte es mir dort auch nicht angewöhnen. Ich bin aber immer noch schnell genug, um z.B. diesen Blogeintrag auf QWERTZ zu schreiben, weil er auf meinem alten Laptop unterwegs entstanden ist.
&lt;/p&gt;

&lt;p&gt;
Die Tastaturen fühlen sich so deutlich unterschiedlich an (auch weil ich die Standard-Neigung von knapp 20° mit Hilfe eines &lt;a href="https://www.thingiverse.com/thing:4881967"&gt;Keils von Thingiverse&lt;/a&gt; auf knapp 30° Neigung gebracht habe), dass mein Kopf automatisch umschaltet.
&lt;/p&gt;

&lt;p&gt;
Alles in allem wundere ich mich mittlerweile darüber, wie einfach Tastschreiben ist, wenn nur die Umgebung dafür stimmt, und warum immer noch ein System gelehrt wird, und verbreitet ist, das auf Geräte optimiert ist, die es mittlerweile nur noch auf Flohmärkten zu Ramschpreisen zu finden gibt.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>hardware</category><category>keyboard</category><guid>https://plaindrops.de/de/blog/2022/moonlanderlayout/</guid><pubDate>Sun, 27 Nov 2022 07:00:00 GMT</pubDate></item><item><title>Einsparpotentiale ermitteln (Gas)</title><link>https://plaindrops.de/de/blog/2022/wintermute3/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Nachdem ich in der &lt;a href="https://plaindrops.de/blog/2022/wintermute2/"&gt;letzten Folge&lt;/a&gt; von Operation Wintermute mit dem Energiemessgerät von Steckdose zu Steckdose gelaufen bin, um herauszufinden wo ich Energie sparen kann, war das beim Gas doch deutlich entspannter. Ich habe nur eine handvoll Warmwasser-Zapfstellen und eine Heizung. Vor dieser Heizung habe ich dann auch etwa eine Stunde auf einem Stuhl sitzend verbracht,  bis ich verstanden habe,  wie sie für meinen Modell genau funktioniert. Und da die ganze Wärme nicht für zwei dutzend Geräte sondern nur für mich da ist, menschelt es in diesem Blogeintrag besonders
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;


&lt;p&gt;
Auch wenn ich mich beim Strom um deutlich mehr Verbraucher kümmern musste,  ist es dort doch viel einfacher jederzeit festzustellen,  ob man mit seinem aktuellen Verbrauch gut liegt oder nicht. Das liegt daran dass der Verbrauch über das Jahr weitgehend gleichmäßig ist.
&lt;/p&gt;

&lt;p&gt;
Beim Gas ist das komplett anders. In den Sommermonaten ist die Heizung abgestellt,  das heißt das einzige was zu der Zeit verbraucht wird,  ist warmes Wasser zum waschen und duschen, Im Winter wird die Dusche weiterhin benutzt, jetzt wird jedoch zusätzlich die Heizung eingeschaltet, und die Heizung verbraucht ein vielfaches der Energie die wir beim duschen benötigen.
&lt;/p&gt;

&lt;p&gt;
Wir können also nicht davon ausgehen dass wir nach einem Drittel des Jahres auch ein Drittel der Energie benötigt haben, und nach zwei Dritteln des Jahres zwei Drittel. Zu Beginn des Frühjahrs haben wir fast die Hälfte der Energie verbraucht, und zu Beginn des Herbstes  noch nicht viel mehr da wir im Sommer lediglich geduscht haben.
&lt;/p&gt;

&lt;p&gt;
Um diesem Problem zu begegnen, gibt es etwas das sich Lastprofil nennt. Im Prinzip gibt ein Lastprofil an wieviel Energie ich an welchem Tag im Jahr üblicherweise verbrauche.
&lt;/p&gt;

&lt;p&gt;
Ich bin zunächst ganz naiv davon ausgegangen, dass man so ein Profil einfach so im Internet findet, aber dem war nicht so. Eine entsprechende Frage im Fediverse brachte auch kein Ergebnis. Also habe ich eine halbe Nacht rumgegoogelt und bin schließlich auf die Seite Musterhaushalt.de gestoßen, auf der es die nette Funktion gibt, dass man seinen üblichen Jahresverbrauch eingeben kann und dann eine Tabelle zurückbekommt, wieviel davon man in welchem Monat üblicherweise verbraucht. 
&lt;/p&gt;

&lt;p&gt;
Das ganze ist leider nur monatlich aufgelöst. Da ich aber gerne wöchentliche Ergebnisse hätte, hab ich angefangen mir das ganze in eine Excel-Tabelle zu übertragen und aus den Monatswerden Wochenwerte zu machen.
&lt;/p&gt;

&lt;p&gt;
Das ganze sah dann so aus:
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Lastprofil.png" alt="Mein Lastprofil"&gt;
&lt;/p&gt;

&lt;p&gt;
Die blauen Balken sind das Modell, und die grünen Balken sind mein tatsächlicher Verbrauch. Wie man sieht liege ich also schon sehr gut und fast permanent unter dem Musterverbrauch. L laut dem Diagramm müsste ich pro Jahr ungefähr 500 kWh sparen. Daraufhin hab ich mal in meine Vorjahresabrechnungen geschaut, und gesehen, dass hier entgegen meiner ursprünglichen Zielsetzung von 10.000 kWh in den letzten Jahren circa 9500 kWh verbraucht habe. Für ein dermaßen grobes Modell passte das Ergebnis also überraschend genau. Für die kommenden Jahre werde ich also doch eher 9000 kWh statt der angenommenen 10.000 kWh ins Auge fassen.
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgd6bb34a"&gt;Wie kann ich dieses Ziel nun erreichen?&lt;/h2&gt;
&lt;div id="outline-container-orgd6bb34a" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd6bb34a"&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org5fd076b"&gt;Der Kessel&lt;/h3&gt;
&lt;div id="outline-container-org5fd076b" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org5fd076b"&gt;
&lt;p&gt;
Nun, dazu müssen wir uns erstmal ansehen, wie die Wärmeversorgung in meinem Haus so funktioniert.
&lt;/p&gt;

&lt;p&gt;
Ich habe ein Heizkessel, der im Prinzip ein großer isolierter Wasserbehälter ist. Dieser Wasserbehälter ist über Rohre mit den Heizkörpern verbunden und eine Pumpe bewegt das Wasser im Kreis immer vom Heizkessel zur Heizung und zurück. Dabei kühlt sich das Wasser nach und nach ab.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Kessel.jpg" alt="Mein Kessel"&gt;
&lt;/p&gt;

&lt;p&gt;
Das Wasser in diesem Kessel hat eine Soll-Temperatur, und die Heizung versucht den Kessel auf dieser Temperatur zu halten. Das tut sie allerdings nicht, indem sie sofort Energie aufwendet wenn sich die Temperatur auch nur ein bisschen abkühlt, sondern der Kessel oszilliert um den eingestellten Sollwert herum. In meinem fall geht es dabei um plus minus fünfzehn Grad. Das heißt wenn mein Heizkessel, so wie ich ihn vorgefunden habe, auf 55 Grad eingestellt ist, dann nun kühlt sich das Wasser nach und nach ab bis 40 Grad erreicht sind. Daraufhin springt die Heizung an und erhitzt das Wasser wieder auf 70 Grad. Dann kühlt sich das Wasser wieder langsam auf 40 Grad ab, und das Spiel beginnt von vorne.
&lt;/p&gt;

&lt;p&gt;
ich habe also ständig Wasser mit einer Temperatur zwischen 40 und 70 Grad im Kessel, Die Mitte stellt genau die Solltemperatur dar.
&lt;/p&gt;

&lt;p&gt;
Es gibt genau 3 Gründe warum die Kessel Temperatur sinkt
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;ist die Isolierung des Kessels nicht perfekt.
Das heißt, die Temperatur im Kessel sinkt nach und nach auf die Raumtemperatur ab. Je wärmer es im Kessel ist. desto schneller sinkt der Wert ab. Wenn die Kesseltemperatur selbst nur knapp über der Raumtemperatur liegt, dann schreitet das Abkühlen langsamer voran.&lt;/li&gt;

&lt;li&gt;Ich dreh die Heizkörper auf.
Wenn das Wasser zu den Heizkörpern gepumpt wird, wird die Wärme dort, wie ist die Aufgabe eines Heizkörpers ist, an den Raum abgegeben, und abgekühltes Wasser strömt zurück in den Kessel. Dadurch kühlt sich der Kessel natürlich deutlich schneller ab, als durch einfaches rumstehen.&lt;/li&gt;

&lt;li&gt;ich benutze Brauchwasser, also ich dusche oder wasche mir die Hände mit warmem Wasser. Die Wasserleitung, die mir das Brauchwasser im Haus liefert, läuft nämlich auch durch den Kessel. In meinem Kopf ist sie dort eine lange schmale Leitung die in vielen Windungen durch den Kessel geht und vom umgebenden Warmwasser erwärmt wird. Das reicht mir als Modellannahme. Wenn ich nun den Wasserhahn aufdrehe, strömt kaltes Wasser vom Hauptanschluss nach, und kühlt damit auch den Kessel ab.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
Es gibt also keinen unmittelbaren Zusammenhang zwischen der Energie die ich beim Duschen verbrauche, und der Energie die meine Heizung verbraucht. Es kann sein, dass ich nur kurz dusche, und sich die Kessel Temperatur dabei lediglich von siebzig auf fünfundsechzig Grad absenkt. Da die Marke von 40 Grad noch nicht erreicht ist, springt die Heizung nicht an, und es wird auch kein Gas verbraucht. Im Gegensatz dazu kann es auch sein, dass ich überhaupt nichts vom Wasser verbrauche, nun aber der Kessel durch einfaches rumstehen von 43 auf 40 Grad abgekühlt. Nun springt natürlich die Heizung an, und heizt den Kessel wieder auf 70 Grad auf, ohne dass ich in diesem Moment wirklich Energie verbraucht habe.
&lt;/p&gt;

&lt;p&gt;
Die Menge die ein Aaufheizvorgang an Energie benötigt ist dabei weitgehend gleich. Es kommt also im wesentlichen darauf an wie häufig der Kessel aufheizen muss. Je mehr Energie ich verbrauche, desto öfter muss die Heizung den Kessel aufheizen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org35a60d2"&gt;Was habe ich also für Handlungsoptionen?&lt;/h2&gt;
&lt;div id="outline-container-org35a60d2" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org35a60d2"&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org81560b3"&gt;Beim Duschen&lt;/h3&gt;
&lt;div id="outline-container-org81560b3" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org81560b3"&gt;
&lt;p&gt;
Als erstes habe ich mir mal das Bedienungshandbuch unserer Heizung vorgenommen, denn kein Mensch braucht 70 Grad heißes Wasser, und selbst 40 Grad sind zum duschen noch sehr großzügig bemessen. Ich habe beschlossen dass mir als Solltemperatur 45 Grad reichen, das heißt der Kessel oszilliert zwischen 30 und 60 Grad. 30 Grad sind zum duschen zwar recht wenig, aber dafür liege ich im mittel bei 45 Grad, und sollte ich wirklichen nah an der 30 Grad Grenze sein, dann sorgt der Temperaturabfall durch das Duschen sehr schnell dafür, dass der Kessel neu aufgeheizt. Ich habe das ganze jetzt eine Woche ausprobiert, und komme mit dieser Temperatureinstellung auch beim Duschen hervorragend und ohne Komfortverlust klar.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Nennwert.jpg" alt="Der neue Nennwert"&gt;
&lt;/p&gt;

&lt;p&gt;
Dann kann ich beim Duschen noch dafür sorgen, dass ich dem Kessel möglichst wenig abkühle. Das geht zum einen dadurch, dass ich möglichst kurz dusche, das heißt beim einseifen zum Beispiel das Wasser abstelle, und zum anderen, wenn das Wasser eingeschaltet ist, möglichst wenig davon verbrauche. Das kann man zum Beispiel dadurch erreichen, dass man einen Durchflussminderer in seinen Schlauch einsetzt, im Prinzip eine Art kleine Unterlegscheibe, die ein Loch hat, das kleiner ist als der Schlauchdurchmesser.
&lt;/p&gt;

&lt;p&gt;
Und zu guter Letzt gibt es natürlich noch die Option seltener zu duschen. Wenn ich zum Beispiel weiß, dass ich einen Tag HomeOffices vor mir habe, und auch ansonsten das Haus nicht verlassen und anderen Menschen treffen möchte, spricht überhaupt nichts dagegen auch mal das Duschen zu überspringen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org59c76ba"&gt;Bei der Heizung&lt;/h3&gt;
&lt;div id="outline-container-org59c76ba" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org59c76ba"&gt;
&lt;p&gt;
Der effektivste Ansatz ist natürlich auch hier, einfach nicht zu heizen. Da das aber im tiefsten Winter nicht wirklich Sinn macht, geht es hier nicht darum seine Heizung komplett abzustellen. Natürlich kann man das machen, denn beim heizen geht es ja eigentlich darum, mich als Menschen warm zu halten, und nicht die Räume in meinem Haus. Ich könnte also im Extremfall komplett auf die Heizung meines Hauses verzichten, und einfach nur mich warm halten, indem ich warme Kleidung trage, oder direkt -zum Beispiel durch eine Wärmflasche- meinem Körper heize. Wer einen interessanten Artikel dazu lesen möchte, dem sei &lt;a href="https://www.lowtechmagazine.com/2011/02/body-insulation-thermal-underwear.html"&gt;dieser Artikel&lt;/a&gt; im &lt;a href="https://www.lowtechmagazine.com/"&gt;LOW-TECH MAGAZINE&lt;/a&gt;  empfohlen.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Heizung.jpg" alt="Die Heizung"&gt;
&lt;/p&gt;

&lt;p&gt;
Soweit möchte ich nicht gehen, aber es ist überhaupt kein Problem, erst etwas später mit dem heizen anzufangen, oder, wenn es Frühling wird, schon etwas früher damit aufzuhören, und sich mit einer schönen warmen Decke aufs Sofa zu setzen.
&lt;/p&gt;

&lt;p&gt;
Räume in denen ich mich kaum, oder gar nicht, aufhalte, muss ich auch überhaupt nicht heizen,
&lt;/p&gt;

&lt;p&gt;
In der Küche mache ich es zum Beispiel so, dass ich die Abwärme des Herdes und des Ofens nutze. Das reicht mir da an Wärme in der Küche, und ich brauche die Heizung dort gar nicht, obwohl ich mich dort öfters aufhalte. 
&lt;/p&gt;

&lt;p&gt;
Im Arbeitszimmer machen der Computer oder der Laptops eine Menge Abwärme, so dass mir dort eine kleine Kerze ausreicht um ebenfalls auf eine angenehme Arbeitstemperatur zu kommen, solange ich die Tür dort geschlossen halte.
&lt;/p&gt;


&lt;p&gt;
Im Schlafzimmer mochte ich es früher immer ungewöhnlich warm, da ich Problem mit meinen Nebenhöhlen bekomme, wenn diese nachts sehr auskühlen. Dieses Problem habe ich mittlerweile dadurch gelöst, dass ich wärmere Bettwäsche für den Winter habe, und man glaubt es oder nicht, Opas gute alte Nachtmütze wirkt Wunder gegen verkühlte Nebenhöhlen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org80f272e"&gt;Ich wurde geNerdSniped&lt;/h2&gt;
&lt;div id="outline-container-org80f272e" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org80f272e"&gt;
&lt;p&gt;
Für mein relativ grob aufgelöstes Lastprofil habe ich übrigens in der Zwischenzeit eine sehr viel bessere Lösung gefunden. Ich bin auf TUM und SigLinDe gestoßen, die beiden Modelle mit denen die Energiewirtschaft in Deutschland tatsächlich arbeitet, und es gibt sogar ein Dokument darüber, dass leider 166 Seiten umfasst, wie diese Modelle im Detail arbeiten. Nachdem ich nun einige Stunden darüber gebrütet habe, glaube ich, dass ich die Modelle komplett verstanden habe, was ich nachher mal überprüfen werde, indem ich sie in eine Excel-tabelle überführe. In diese Modelle stecke ich die Tagesmitteltemperaturen eines Jahres und erhalte dann eine Prognose für den tagesgenauen Energieverbrauch für mein Gas.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/SigLinDe.png" alt="SigLinDe"&gt;
&lt;/p&gt;

&lt;p&gt;
Mit diesem Modell werde ich definitiv noch sehr intensiv rumspielen, und nachdem der nächste Blogeintrag aus der reihe Wintermute nun um das Benzin gehen soll, würde ich sagen geht der übernächste um SigLinDe.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://plaindrops.de/de/blog/2022/wintermute3/</guid><pubDate>Thu, 29 Sep 2022 15:00:00 GMT</pubDate></item><item><title>Einsparpotentiale ermitteln (Strom)</title><link>https://plaindrops.de/de/blog/2022/wintermute2/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
In der letzten Folge von &lt;a href="https://plaindrops.de/blog/2022/wintermute/"&gt;Operation Wintermute&lt;/a&gt; hatte ich ja versucht, ein Ziel festzulegen um das Energiesparen ein bisschen zu gamifizieren. es geht nun also um 2.000 kWh Stromverbrauch, 10.000 kWh Gasverbrauch und unter 150 Euro pro Monat für Benzin als Zielmarke. Um herauszufinden wo ich zum Beispiel Strom sparen kann bin ich die letzten 24 Stunden durchs Haus gelaufen und habe den Verbrauch aller möglichen elektrischen Geräte nachgemessen, und habe dabei ein paar nette Stellen zum sparen gefunden,
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Messgeraet.jpg" alt="Mein Verbrauchsmesser"&gt;
&lt;/p&gt;

&lt;p&gt;
Nachdem ich mir eine Tabelle erstellt hatte, in der ich alle Räume, und dann alle darin befindlichen elektrischen Verbraucher eingetragen habe, bin ich losgezogen. Bereits im Wohnzimmer erwarteten mich die ersten Überraschungen. In der Lampe über der Couch hatte ich eigentlich Energiesparbirnen erwartet bei näherer Betrachtung fanden sich dort allerdings Halogenbirnchen vier Stück zu je 20 Watt. Also verbraucht diese Lampe um die achtzig Watt. Und sie ist, wenn ich auf dem Sofa sitze, die Lampe die am häufigsten und längsten benutzt wird im Raum.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Wohnzimmer&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Couch&lt;/td&gt;
&lt;td class="org-left"&gt;80 Watt&lt;/td&gt;
&lt;td class="org-left"&gt;Fuuuuck!&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;12 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Esstisch&lt;/td&gt;
&lt;td class="org-left"&gt;11,5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt;evtl Kriechstrom&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Stehlampe&lt;/td&gt;
&lt;td class="org-left"&gt;11 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Fernseher&lt;/td&gt;
&lt;td class="org-left"&gt;10/90 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;XBox&lt;/td&gt;
&lt;td class="org-left"&gt;22/62 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lautsprecher&lt;/td&gt;
&lt;td class="org-left"&gt;10 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Die zweite Lampe, die über am Esstisch, konnte auch mit einer Überraschung aufwarten. Zwar waren hier bereits Energiesparbirnchen verbaut, aber im Dunkeln konnte ich feststellen, dass diese auch bei abgeschalteter Lampe ganz sachte vor sich hin glimmen. Lustigerweise lässt sich die Helligkeit des Glimmens dadurch verändern dass ich die Stehlampe ein- und ausschalte. Es sieht also so aus, als wenn in der Verteilerdose irgendwie Strom vom Anschluss der Stehlampe zur Lampe überm Esstisch fließt. Mal schauen wie viel das ist, oder ob ich das abschalten kann.
&lt;/p&gt;

&lt;p&gt;
Bei den AV-Komponeten also Fernseher und die Boxen hat mich nicht wirklich überrascht dass sie Stand-By Strom ziehen, allerdings war ich über die Höhe überrascht. Der Fernseher tut sich im Standbybetrieb 10 Watt weg, die XBox habe ich mit 22 Watt gemessen und die Lautsprecher haben zwar im abgeschalteten Zustand keinen Stromverbrauch, jedoch sind sie ständig eingeschaltet damit ich nur den Fernseher einschalten muss, und direkt Ton habe. Alles zusammen waren das schicke 42 Watt die 24 Stunden am Tag verbraucht werden. Das Telefon, das daneben auf dem Tisch stand, spielte dagegen überhaupt keine Rolle. Sein Stromverbrauch liegt unter einem Watt, war allerdings der Grund warum ich bisher davon abgesehen habe, einen Schalter dort einzubauen, da das Telefon ja ständig geladen werden muss, und nicht vom Strom genommen werden kann.
&lt;/p&gt;

&lt;p&gt;
Nach kurzem Nachdenken habe ich aber festgestellt, dass, seit meine Tochter aus dem Haus ist, ich mich sowieso am meisten in meinem Arbeitszimmer aufhalte, und das Telefon dort unten eigentlich nutzlos ist. Ich könnte es viel besser oben im Arbeitszimmer gebrauchen. Also habe ich das Telefon nach oben befördert, und alle Audio-Video Geräte zusammen an einer Mehrfachsteckdose mit einem Schalter angeschlossen. Damit wurden aus 42 Watt Dauerleistung 0 Watt.
&lt;/p&gt;

&lt;p&gt;
ich gehe Moment davon aus, dass beim zukünftigen Strompreis 1 Watt Dauerverbrauch circa 6 Euro pro Jahr kosten wird. Hier ließen sich also bereits 240.- Euro einsparen
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Küche&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Tisch&lt;/td&gt;
&lt;td class="org-left"&gt;20 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;19,5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Arbeitsfläche&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Herd&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Abzugshaube&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Kühlschrank&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Geschirrspüler&lt;/td&gt;
&lt;td class="org-left"&gt;7/  Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Wasserkocher&lt;/td&gt;
&lt;td class="org-left"&gt;7/1850  Watt&lt;/td&gt;
&lt;td class="org-left"&gt;0,05 kWh pro Kaffee. Oh. Standby&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Mikrowelle&lt;/td&gt;
&lt;td class="org-left"&gt;800 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
In der Küche entpuppte sich dann die Lampe über dem Esstisch zwar als Energiesparlampe, aber eine aus der allerersten Generationen. Ihr erinnert euch bestimmt noch daran, dass Energiesparlampen damals eine Weile brauchten, bis sie die volle Helligkeit erreicht haben. Und für den Spaß tut sich das Exemplar über meinem Esstisch in der Küche auch noch 20 Watt rein.  Die Putzbeleuchtung im Raum ist dagegen mit 19,5 Watt deutlich heller, und wird auch nur selten gebraucht. Die lappen über der Arbeitsfläche sind kleine Halogenstrahler, die ich bisher noch nicht ausgebaut bekommen habe, aber ich vermute, dass dort dreimal circa 15 Watt verbaut sind.
&lt;/p&gt;

&lt;p&gt;
Geschirrspüler und Wasserkocher haben mich durch ihren Standby Strom überrascht. Sie nehmen jeweils 7 Watt, sodass dort 14 Watt mal 6 Euro, also 84 Euro pro Jahr den Kamin rausgehen, Die Mikrowelle die sogar ein hintergrundbeleuchtetes Display hat, hält sich dabei mit einem Standbyverbrauch von unter einem Watt nett zurück.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Hauswirtschaft&lt;/td&gt;
&lt;td class="org-left"&gt;Waschmaschine&lt;/td&gt;
&lt;td class="org-left"&gt;16/425 Watt&lt;/td&gt;
&lt;td class="org-left"&gt;0,75 kWh pro Ladung. Oh. Standby&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Trockner&lt;/td&gt;
&lt;td class="org-left"&gt;10/300 Watt&lt;/td&gt;
&lt;td class="org-left"&gt;0,78 kWh pro Ladung. Oh. Standby&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Gefrierschrank&lt;/td&gt;
&lt;td class="org-left"&gt;18.5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Router&lt;/td&gt;
&lt;td class="org-left"&gt;10 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Heizung&lt;/td&gt;
&lt;td class="org-left"&gt;10 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;–58– Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Raspi Home Assistant&lt;/td&gt;
&lt;td class="org-left"&gt;2.5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Im Hauswirtschaftsraum stehen erwartungsgemäß die Großverbraucher des Hauses. Waschmaschine, Trockner und Gefrierschrank. Letzteren habe ich noch nicht gemessen da ich dazu hinter den Schränken rumkrabbeln müsste, aber es handelt sich dabei um einen modernen Gefrierschrank mit brauchbaren Verbrauchswerten. Auch Waschmaschine und Trockner haben ansprechende Werte, wenn sie eingeschaltet sind. Erstaunt war ich hier über 26 Watt, die sich Waschmaschine und Trockner reintun, wenn sie nicht eingeschaltet sind. Hier war also der erste Einsatzort für meine Wunderwaffe: Schaltbare Steckdosen. Die sollten mich pro Jahr circa 150 Euro sparen, bei nur vier Euro Anschaffungskosten pro Stück
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Schalter.jpg" alt="Schaltbare Steckdosen"&gt;
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;WC&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Die Lampe im Gäste WC ist gut dimensioniert und wird sowieso nur sehr selten gebraucht.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Flur&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe unten&lt;/td&gt;
&lt;td class="org-left"&gt;9,5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe oben&lt;/td&gt;
&lt;td class="org-left"&gt;3,6 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Im Flur ist alles im grünen Bereich.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Ladestation.jpg" alt="Mein Laderegal"&gt;
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Arbeitszimmer&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;15 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Schreibtischlampe&lt;/td&gt;
&lt;td class="org-left"&gt;6 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Computer&lt;/td&gt;
&lt;td class="org-left"&gt;7/35 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Laptop&lt;/td&gt;
&lt;td class="org-left"&gt;11/40 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Monitor&lt;/td&gt;
&lt;td class="org-left"&gt;5/23 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Moodlight&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Mischpult&lt;/td&gt;
&lt;td class="org-left"&gt;10 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Globus&lt;/td&gt;
&lt;td class="org-left"&gt;20 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Video Licht&lt;/td&gt;
&lt;td class="org-left"&gt;1-2 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Drucker&lt;/td&gt;
&lt;td class="org-left"&gt;8/30 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;3D-Drucker&lt;/td&gt;
&lt;td class="org-left"&gt;0/X Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Laderegal&lt;/td&gt;
&lt;td class="org-left"&gt;6/X Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Telefon&lt;/td&gt;
&lt;td class="org-left"&gt;&amp;lt;1 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Im Arbeitszimmer geht es im wesentlichen um Verhaltensänderung. Die Geräte haben alle ungefähr die Werte, die ich erwartet hatte. Ich hab mir leider im Laufe der letzten Jahre angewöhnt, dass mein Rechner, und oft auch der Firmenrechner permanent eingeschaltet sind. Zusammen mit dem Standby vom Drucker sind das quasi permanente 70-80 Watt. Das sind pro Jahr dann knapp 500 Euro.
&lt;/p&gt;

&lt;p&gt;
Hier wird es also in Zukunft darum gehen die Geräte nach Gebrauch wirklich abzuschalten, und damit auch die Standby-Last verschwindet, sie alle an eine schaltbare Steckdose zu hängen. Positiv überrascht hat mich das Videolicht, dass ich für Livestreams nutze. Obwohl meine Schreibtischlampe nur 6 Watt hat, verbraucht das Videolicht mit seinen zwei sehr hellen Scheinwerfern im Normalfall nicht einmal die Hälfte der Schreibtischlampe, und erreicht sie so eben, wenn ich die Leistung voll aufdrehe. Dann werde ich allerdings blind.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Schlafzimmer&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;10,5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Bett&lt;/td&gt;
&lt;td class="org-left"&gt;7 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Wecker&lt;/td&gt;
&lt;td class="org-left"&gt;2 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Im Schlafzimmer ist alles im grünen Bereich.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Kinderzimmer&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt;5,3 Watt&lt;/td&gt;
&lt;td class="org-left"&gt;unbewohnt&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Das Kinderzimmer ist aktuell unbewohnt, unbeheizt und unbeleuchtet.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Bad&lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Raum&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Lampe Spiegel&lt;/td&gt;
&lt;td class="org-left"&gt;3.5 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Rasierer&lt;/td&gt;
&lt;td class="org-left"&gt;&amp;lt;1 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Zahnstation&lt;/td&gt;
&lt;td class="org-left"&gt;&amp;lt;1 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Föhn&lt;/td&gt;
&lt;td class="org-left"&gt;800 Watt&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Die Deckenlampe im Bad habe ich mir noch nicht genauer angeguckt, da das Glas der Lampe dort gesprungen ist, und ich mich nicht traue sie von der Decke zu nehmen, weil ich nicht weiß ob ich sie wieder aufgehängt bekomme. Ich weiß allerdings, dass sich darin eine Energiesparbirne befindet die eher knapp bemessen ist, und gerade genug Licht macht. Spiegel, Lampe, Rasierer und die Zahnstation verbrauchen vorbildlich wenig Strom. Lediglich der Föhn mit seinen 800 Watt wäre zu nennen, aber mit meinen spärlichen Haaren brauche ich den nicht, und er ist überhaupt nur dort falls ich Bersuch mit längeren Haaren habe.
&lt;/p&gt;

&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;

&lt;col class="org-left"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-left"&gt;Raum&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Verbraucher&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Strom&lt;/th&gt;
&lt;th scope="col" class="org-left"&gt;Bemerkung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-left"&gt;Garten&lt;/td&gt;
&lt;td class="org-left"&gt;Rasenmäher&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Wasserpumpe&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Trimmer&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Springbrunnen&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Schuppenbeleuchtung&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Aussenbeleuchtung&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt;Kriechstrom?&lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;td class="org-left"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;
Den Strom im Garten konnte ich bisher noch nicht genau ermitteln, da ich den Garten bereits winterfest gemacht habe. Das werde ich mir dann also im nächsten Frühjahr vornehmen
&lt;/p&gt;

&lt;p&gt;
Insgesamt freue ich mich dass ich mir so ein Einsparpotenzial von etwa 800 Euro erschließen kann. Endgültig reich werde ich dann, wenn mir jeder einen Euro zahlt, der mir nun erklären möchte dass meine Glühbirnen eigentlich Leuchtmittel heißen.
&lt;/p&gt;

&lt;p&gt;
Im nächsten Beitrag nehme ich mir dann das Gas vor.
&lt;/p&gt;</description><guid>https://plaindrops.de/de/blog/2022/wintermute2/</guid><pubDate>Tue, 20 Sep 2022 11:00:00 GMT</pubDate></item><item><title>Operation Wintermute</title><link>https://plaindrops.de/de/blog/2022/wintermute/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
in den Nachrichten ist es aktuell überall Thema: Die steigenden Kosten für Gas und Strom und andere Energieträger. Dabei hatte ich bisher sogar noch Glück. Ich hatte relativ langfristige Verträge,  die erst in den kommenden Wochen auslaufen. Im Moment treffen bei mir die ersten Briefe ein, die mich darauf vorbereiten sollen. Also bereite ich mich darauf vor,  indem ich schaue wo  ich in diesem Winter Energie sparen kann.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Da die Verbrauchswerte messbar sind, bietet es sich an, das ganze zu gameifizieren. Das erhöht die Motivation, und wenn es da noch einen coolen Projektnamen wie "Operation Wintermute" kriegt, hoffe ich, dass ich dran bleibe. Die Chancen stehen gut, da ich ja auch in den vergangenen Jahren schon regelmäßig meine Zählerstände abgelesen habe, und immer wieder beim Verbrauch nachgesteuert.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org857218c"&gt;Der IST-Zustand&lt;/h2&gt;
&lt;div id="outline-container-org857218c" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org857218c"&gt;
&lt;p&gt;
Ich lebe in einem kleinen Einfamilienhaus mit 117qm Wohnfläche. Bis Herbst letzten Jahres wohnten wir hier noch zu zweit doch seit meine Tochter zum studieren weggezogen ist, habe ich das Haus für mich alleine. Mein Arbeitsplatz und meine Freundin sind beide in der selben, etwa fünfzig Kilometer entfernten Stadt, welche leider nicht vernünftig mit öffentlichen Verkehrsmitteln an meinen Wohnort angebunden ist.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org037a9eb"&gt;Strom&lt;/h3&gt;
&lt;div id="outline-container-org037a9eb" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org037a9eb"&gt;
&lt;p&gt;
Beim Strom habe ich aktuell einem Grundpreis von 11 Euro im Monat und einen Verbrauchspreis pro Kilowattstunde von 29,91 Cent. Das bedeutet, ich habe aktuell noch keine Putin Erhöhung erhalten
&lt;/p&gt;

&lt;p&gt;
Der Verbrauch hat sich in den letzten Jahren so enwickelt:
&lt;/p&gt;


&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-right"&gt;

&lt;col class="org-right"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-right"&gt;Jahr&lt;/th&gt;
&lt;th scope="col" class="org-right"&gt;kWh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-right"&gt;2018&lt;/td&gt;
&lt;td class="org-right"&gt;2381&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2019&lt;/td&gt;
&lt;td class="org-right"&gt;2390&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2020&lt;/td&gt;
&lt;td class="org-right"&gt;2731&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2021&lt;/td&gt;
&lt;td class="org-right"&gt;2788&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2022&lt;/td&gt;
&lt;td class="org-right"&gt;ca 2400&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Die Zahl für 2022 kann ich bisher nur schätzen,  da die Abrechnung etwa Mitte Dezember erfolgen wird. Da mein Verbrauch über das Jahr allerdings weitgehend linear erfolgt habe ich ihn anhand der bisherigen Zählerablesung extrapoliert. 
Die knapp 400 Kilowattstunden mehr die in den Jahren 2020/21 in der Liste stehen schiebe ich auf das Homeoffice. Ich habe seither hier natürlich öfter die Beleuchtung im Arbeitszimmer laufen,  und auch der Laptop trägt seinen Teil dazu bei. Damit läge ich für das Jahr 2022 bei 850 € Gesamtkosten, und einem Abschlag von etwa 71 €.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org7d3fc30"&gt;Gas&lt;/h3&gt;
&lt;div id="outline-container-org7d3fc30" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org7d3fc30"&gt;
&lt;p&gt;
Beim Gas habe ich aktuell einem Grundpreis von 4,33 € im Monat und einen Verbrauchspreis pro Kilowattstunde von 6,3 Cent. Ab dem 1. November kommen die Gasbeschaffungs- und die Gasspeicher-Umlage dazu,  sodass mein Verbrauchspreis auf 10,2 Cent/kWh steigt. Die gestiegenen Beschaffungskosten hat mein Versorger bisher noch nicht weitergegeben. Ich denke er wird damit bis kurz vor Ende meines derzeitigen Vertrages warten, um einen möglichst genauen Stand weitergeben zu können.
&lt;/p&gt;

&lt;p&gt;
Der Verbrauch hat sich in den letzten Jahren so enwickelt:
&lt;/p&gt;


&lt;table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides"&gt;


&lt;colgroup&gt;
&lt;col class="org-right"&gt;

&lt;col class="org-right"&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th scope="col" class="org-right"&gt;Jahr&lt;/th&gt;
&lt;th scope="col" class="org-right"&gt;kWh&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class="org-right"&gt;2018&lt;/td&gt;
&lt;td class="org-right"&gt;9840&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2019&lt;/td&gt;
&lt;td class="org-right"&gt;10689&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2020&lt;/td&gt;
&lt;td class="org-right"&gt;12723&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2021&lt;/td&gt;
&lt;td class="org-right"&gt;10447&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class="org-right"&gt;2022&lt;/td&gt;
&lt;td class="org-right"&gt;noch keine Schätzung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;
Die Zahl für 2022 kann ich bisher noch nicht schätzen, da mein Verbrauch über das Jahr leider nicht linear erfolgt. Die Aufstellung einer entsprechend gewichteten Verbrauchskurve ist einer der nächsten Schritte die ich vorhabe. 
Bei einem Verbrauch vergleichbar zum Vorjahr, läge ich für das Jahr 2022 bei 775 € Gesamtkosten, und einem Abschlag von etwa 65 €.
&lt;/p&gt;

&lt;p&gt;
Durch die Verbrauchspreiserhöhung für die letzten beiden Monate des Jahres, werde ich vermutlich eine Nachzahlung haben. Da ich aber im letzten Jahr eine kleine Rückzahlung hatte und schon abzusehen war,  dass sich die Preise erhöhen werden, habe ich diese Rückzahlung in meinem Gas-Budget belassen, Ich gehe davon aus, dass diese Rückzahlung die Nachzahlung etwa ausgleicht.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org6441ccc"&gt;Benzin&lt;/h3&gt;
&lt;div id="outline-container-org6441ccc" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org6441ccc"&gt;
&lt;p&gt;
Den Benzinverbrauch für mein Auto beobachte ich derzeit von allen Verbräuchen am ungenauesten. Was ich weiß, ist, dass mein Auto im Mischbetrieb mit einer Strecke die etwa zur Hälfte aus Autobahn besteht circa 4,2 l/100km verbraucht, wenn ich es extrem sparsam fahre ich etwa auf 3,8 l/100km komme. Im Moment mache ich es so, dass ich ein Benzin Budget von 180€ im Monat habe, von dem am Ende des Monats immer noch etwas übrig ist. Das übrige Geld buche ich derzeit auf das Budget für Wartung und Reparaturen um. Ich tanke also für weniger als 180€ im Monat. Ich würde schätzen dass es aktuell etwa 130€-140€ sind. In der nächsten Zeit werde ich vermutlich einmal pro Woche zur Arbeit und zweimal pro Woche zu meiner Freundin fahren. Es besteht allerdings die Möglichkeit die Fahrt zur Arbeit mit einer Fahrt zu meiner Freundin zu kombinieren, da beide im gleichen Ort sind.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd7fe16c"&gt;Der SOLL-Zustand&lt;/h2&gt;
&lt;div id="outline-container-orgd7fe16c" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd7fe16c"&gt;
&lt;p&gt;
Schön wäre es, wenn ich durch die Energieeinsparungen so viel Geld einsparen könnte, dass sich die Preiserhöhung damit auffangen ließe,  davon gehe ich allerdings noch nicht wirklich aus.  Beim Strom würde ich es gerne schaffen auf 2000 kWh zu kommen beim Gas etwa 10.000 kWh und beim Auto wäre ich gerne mittelfristig bei 150€ im Monat für Benzin.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><guid>https://plaindrops.de/de/blog/2022/wintermute/</guid><pubDate>Mon, 19 Sep 2022 07:00:00 GMT</pubDate></item><item><title>Browser Lesezeichen in Org-Mode speichern</title><link>https://plaindrops.de/de/blog/2021/MyBookmarks/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Das Problem begann eigentlich schon vor &lt;a href="https://de.wikipedia.org/wiki/Lynx_(Browser)"&gt;knapp 30 Jahren&lt;/a&gt;. Es war sehr einfach im Browser ein Lesezeichen zu einer Seite zu speichern, und genau so einfach war es auch die Seiten danach wieder damit aufzurufen. So sammelten sich im Laufe der Zeit mehr und mehr Lesezeichen an, und wenn dann eine neue Version des Browsers erschien, war es eine mühsame Arbeit die Datei mit den Lesezeichen in das passende Verzeichnis des neuen Browsers zu kopieren.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Immerhin hatten die Hersteller schnell begriffen, dass dies ein Problem war, und boten bald dann eine Möglichkeit an die Lesezeichen automatisiert von einer Vorgängerversion zu übernehmen.  Nun arbeiten Menschen aber durchaus mit mehr als einem Browser, und es wurde immer klarer, das es sehr praktisch ist wenn man sowohl auf dem Rechner zu Hause, als auch auf dem Laptop, oder dem Firmen-Rechner die gleichen Lesezeichen zur Verfügung hat.
&lt;/p&gt;

&lt;p&gt;
Damit begann zu erst die Zeit der Online- Lesezeichen Speicherdienste, die über ein Browser-Plugin die Favoriten in ihre Verzeichnisse aufnahmen, später bauten auch alle großen Browserhersteller eine Funktion ein um die Lesezeichen zwischen verschiedenen Browsern zu synchronisieren, was wiederum den Niedergang der Online-Speicherdienste einläutete.
&lt;/p&gt;

&lt;p&gt;
Ich habe damals auch so einen Dienst benutzt, auch weil es praktisch war, seine eigenen Lesezeichen für andere Personen freizugeben. Dennoch sind mir immer wieder Lesezeichen abhanden gekommen, wenn mal das Plugin nicht richtig funktionierte, und Unmengen von Dubletten waren an der Tagesordnung.
&lt;/p&gt;

&lt;p&gt;
So kam es, das ich mich entschied meine Lesezeichen ab jetzt an einem zentralen Ort zu sammeln, der unabhängig von Browser und Internet sein sollte. Seit damals, bis heute ist das eine reine Textdatei, und das Format ist auch nur wenig geändert wurden. Ich habe schon immer den Link gespeichert, und zu Anfang einfach noch ein paar Stichworte dazu geschrieben. Seit einigen Jahren bin ich beim jetzigen Format einem Org-Mode Link inklusive dem Seitentitel, plus einem Zeitstempel, wann ich das Lesezeichen erzeugt habe, angekommen.
&lt;/p&gt;

&lt;p&gt;
Dadurch ist das aufrufen von Seiten ein Kinderspiel. Im Org-Mode von Emacs sind Links einfach anklickbar, und rufen das konfigurierte Programm, also am besten einen Browser, auf.
&lt;/p&gt;

&lt;p&gt;
Das Abspeichern der Links war schon immer eine eigene Baustelle und läuft bei mir mittlerweile in der dritten Fassung
&lt;/p&gt;
&lt;h2 class="collapsible" id="org8b03d25"&gt;Die Emacs Seite&lt;/h2&gt;
&lt;div id="outline-container-org8b03d25" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8b03d25"&gt;
&lt;p&gt;
Auf der Empfängerseite, also in Emacs war die Lösung von Anfang an sehr einfach. Hier gibt es einen Mechanismus der sich &lt;a href="https://orgmode.org/manual/Capture.html"&gt;Org-Capture&lt;/a&gt; nennt. Dieser ist eigentlich dazu gedacht, um neben der normalen Arbeit an einem Text mal eben eine Information zu einem Anruf, oder einem Gespräch mit dem Kollegen, der gerade ins Büro kam festzuhalten. Neben dem normalen Fenster geht ein weiteres Fenster auf, in das man seine Notiz eintragen kann, und diese wird dann an einem festgelegten Ort gespeichert. Dabei lassen sich &lt;a href="https://orgmode.org/manual/Capture-templates.html"&gt;Templates&lt;/a&gt; nutzen, die z.B. bereits Datum und Uhrzeit des Eintrags hinzugefügt haben, noch bevor man los tippt.
&lt;/p&gt;

&lt;p&gt;
Passend zu diesem Mechanismus gibt es das &lt;a href="https://orgmode.org/manual/The-capture-protocol.html#index-capture-protocol"&gt;Capture-Protocol&lt;/a&gt;. Dadurch wird es möglich Emacs von aussen her aufzurufen, und als Aufrufparameter Informationen mitzugeben, die dann in ein solches Template eingetragen werden, und in die entsprechende Datei eingetragen.
&lt;/p&gt;

&lt;p&gt;
Wer dieses Protokoll nutzen möchte stößt allerdings schnell auf zwei Probleme, die sich allerdings beide lösen lassen:
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Da es sich um ein neues Protokoll handelt wird dieses vom Betriebssystem behandelt, und muss diesem zunächst mal bekannt gemacht werden. Das bedeutet unter Windows das &lt;a href="https://www.reddit.com/r/emacs/comments/gssl86/question_setting_up_orgcapture_on_windows/"&gt;anlegen von Registry Einträgen&lt;/a&gt;, und unter Linux das schreiben (wenn auch sehr kleiner) Konfigurationsdateien. Ohne diese Bekanntgabe passiert absolut nichts. Das Betriebssystem muss wissen, das es jedes mal den Emacsclient aufruft, wenn jemand das org-capture-protocol verwendet.&lt;/li&gt;
&lt;/ul&gt;


&lt;ul class="org-ul"&gt;
&lt;li&gt;Die Syntax des Aufrufs hat sich im Verlauf der Emacs Versionen einmal geändert, so das es quasi zwei verschiedene Versionen gibt, wie es richtig funktioniert, und auch wenn mittlerweile wohl nur noch Emacs Versionen mit der neuen Syntax in Gebrauch sein sollten, stammen sehr viele Erklärungen im Internet noch aus der Zeit der alten Syntax, die umständlicher, und dazu noch weniger flexibel war. Leider wird fast nirgendwo darauf hingewiesen, dass es mittlerweile eine neuere, bessere Syntax gibt. Selbst Anleitungen, die die neue Syntax zeigen, erwähnen selten, dass es auch mal eine alte Syntax gab, und so geraten Anfänger schnell in die Falle beide Versionen für die Wahrheit zu halten, und sie munter zu mixen, was dann dazu führt, das es überhaupt nicht mehr funktioniert.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Hat man diese beidem Probleme aber einmal erkannt, lässt sich das ganze schnell korrekt konfigurieren (und so schwer ist das dann auch nicht mehr). Ein Tipp: Die aktuelle Syntax findet sich in der Dokumentation, die man sowohl online, als auch innerhalb von in der Hilfe findet.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf2406e0"&gt;Die Browser-Seite&lt;/h2&gt;
&lt;div id="outline-container-orgf2406e0" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf2406e0"&gt;
&lt;p&gt;
Um in Emacs ein Lesezeichen abzuspeichern reicht also ein Aufruf von 
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;emacsclient "org-protocol://capture?template=L&amp;amp;url=%%TAB-URL%%&amp;amp;title=%%TAB-TITLE%%"
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Der Browser muss also einfach nur diesen Aufruf hinbekommen, und der Drops ist gelutscht. Leider ist der Aufruf von ausführbaren Programmen von der Platte des Benutzers auch eine riesige Sicherheitslücke, denn wenn ein Angreifer das von einer Internetseite aus tun kann, kann er auch Schadcode dort ausführen. Entsprechend haten die Browser Hersteller keinen einfachen Weg dafür in ihre Browser eingebaut.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org0630268"&gt;Iteration 1&lt;/h3&gt;
&lt;div id="outline-container-org0630268" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org0630268"&gt;
&lt;p&gt;
Mein erster Weg damit umzugehen, war es mir einen anderen Browser zuzulegen. Ich hab mir damals Qutebrowser ausgesucht, weil er eine Funktion bot, jede Funktion des Browsers mit einer Tastenkombination zu verbinden. Dazu war noch eine sehr wichtige Funktion eingebaut, mit der man beliebige Programme aufrufen konnte, und der Browser konnte dazu die URL, den Namen der Seite, oder den markierten Text als Aufrufparameter einsteuern. Der Ansatz war also trivial: einfach Ctrl-D mit dem Aufruf eines kleinen Python-Scripts verbunden, das die URL passend formatiert, und dann den Emacsclient aufruft.
&lt;/p&gt;

&lt;p&gt;
Es war ein Traum. … bis zu Debian 10. Dann stellte sich heraus, dass die Versionen von Python, und die von Debian installierten Qt-Bibliotheken für Python unterschiedliche Abhängigkeiten hatten, die sich widersprachen, kurz es knallte an allen Ecken und Enden, und die Lösung wäre es gewesen eine isolierte Python umgebung zu schaffen, mit gepinten Versionen der einzelnen Pakete, und das wollte ich mir dann doch nicht antun.
&lt;/p&gt;

&lt;p&gt;
Es wurde also Zeit für 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org2a315cc"&gt;Iteration 2&lt;/h3&gt;
&lt;div id="outline-container-org2a315cc" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org2a315cc"&gt;
&lt;p&gt;
Wenn ich den Qutebrowser sowieso nicht mehr nutzen konnte bin ich also wieder zurück zu einem der Standardbrowser gewechselt - Firefox
&lt;/p&gt;

&lt;p&gt;
Hier gab es also wieder das bekannte Problem, dass Firefox nicht besonders gewillt ist externe Programme aufzurufen, und ich habe ein wenig gegrübelt, wie sich das am besten umgehen lässt, ohne die Sicherheit von Firefox auszuhebeln. Die Lösung lieferte dann meine Freundin quasi frei Haus. Wir unterhielten uns eines Tages darüber, das Ihr Arbeitskollege unter Windows sehr virtuos Standard-eMails schreibt, indem er alle wichtigen
Textbausteine in einer Software namens Klavier hat, und auf Knopfdruck abrufen kann, verbunden mit der Frage, ob sie das nicht auch irgendwie installieren kann. Nun, für die Software hatte ihr Kollege wohl eine Lizenz gekauft, und das Geld wollte sie nicht ausgeben, aber ich hab eine Software namens AutoHotKey gefunden, die quasi das gleiche kann, und mit der sie seither arbeitet.
&lt;/p&gt;

&lt;p&gt;
Neugierig geworden wollte ich sehen, ob es so etwas auch für Linux gibt (ich hab es nie gebraucht, da Emacs ein paar eingebaute Wege hat mit Textbausteinen zu arbeiten).
&lt;/p&gt;

&lt;p&gt;
Und ich fand ein Programm namens Autokey, und schon die ersten Beispiele, die ich sah zeigten auch, das es auch mit dem Clipboard umgehen kann, und auch externe Programme aufrufen. BINGO!
&lt;/p&gt;

&lt;p&gt;
Von da an ging es ganz schnell. Ich hab Autokey installiert, und CTRL-D mit einen Script belegt das den Cursor in die URL-Zeile setzt, alles markiert, und die URL ins Clipboard kopiert. Mit dieser URL wurde dann mein altes Python-Script aus Iteration 1 aufgerufen, und Voila, die URL landete wieder in meinem Emacs, und damit in der Link-Datei.
&lt;/p&gt;

&lt;p&gt;
Es waren wieder friedliche Zeiten. So einigermaßen.
&lt;/p&gt;

&lt;p&gt;
Denn leider konnte ich so den Seitentitel nicht übernehmen, und musste im Nachgang nochmal ein Skript über meine Links laufen lassen, welches zu jedem Link den Seitetntitel holte, und den Org-Link entsprechend anpasste. Es funktionierte, aber meine Nerd-Seele litt. Ich wollte EINEN EINZIGEN SCHRITT mit EINEM Tastendruck.
&lt;/p&gt;

&lt;p&gt;
Ich begann also die Suche nach 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="orgb6779b1"&gt;Iteration 3&lt;/h3&gt;
&lt;div id="outline-container-orgb6779b1" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-orgb6779b1"&gt;
&lt;p&gt;
Ich hab dann angefangen die Firefox AddOns nach Erweiterungen zu durchsuchen, die es irgendwie doch ermöglichen ein externes Skript aus dem Browser zu starten. Die ersten Ergebnisse trieben mir eine Gänsehaut nach der anderen über den Rücken, viele davon verlangten, einen nicht näher  beschriebenen Code aus dem Internet zu laden, bei dem der Autor versprach, das er das Problem löst, aber nicht wie, oder ob damit die Browser Sicherheit ausgehebelt wird. Viele dieser Erweiterungen sind mittlerweile aus den AddOns verschwunden, und ich habe mich auch nie getraut, eine davon zu installieren.
&lt;/p&gt;

&lt;p&gt;
Bis ich auf &lt;a href="https://github.com/waldner/Firefox-RunWith"&gt;RunWith&lt;/a&gt; stieß. Auch hier muss man zwei weitere Dateien auf seinem System installieren, und eventuell war das auch genau der gleiche Mechanismus, wie die anderen AddOns die ich so ignoriert hatte, allerdings machte der Autor zwei entscheidende Dinge anders, als die Pakete, die mir so dubios erschienen. Er zeigte die beiden Dateien &lt;a href="https://github.com/waldner/Firefox-RunWith#configuration-example"&gt;ganz offen&lt;/a&gt;, und erklärte ihre Funktion Stück für Stück, so dass ich nachvollziehen konnte, wozu ich diese brauche und er stellte &lt;a href="https://github.com/waldner/Firefox-RunWith#detailed-explanation"&gt;ihre Funktion&lt;/a&gt; dar, in einen Framework, das sich &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_messaging"&gt;Native Messaging&lt;/a&gt; nennt, und das die von den Browserherstellern bevorzugte sichere Methode ist externe Programme aus einem Browser aufzurufen, und mit Parametern zu versehen. Also exakt das, wonach ich gesucht habe.
&lt;/p&gt;

&lt;p&gt;
URL, Seitentitel und markierter Text gehören auch hier zu den Standard Parametern, die übergeben werden können, aber darüber hinauch auch Bild-URLs oder die Art der Objekts von wo das Skript aufgerufen wurde, denn im Standard enthalten ist auch, das ich beim Klick nur Scripte angezeigt bekomme, die in der jeweiligen Situation sinnvoll sind. Wenn ich also einfach irgendwo auf der Seite dieses AddOn aufrufe bietet es mir an ein Script für
ein Lesezeichen auszuführen. Habe ich hingegen einen Teil der Seite markiert, wird zusätzlich ein Script angeboten, das mir den markierten Text als Zitat speichert, und die URL als Quelle darunter schreibt.
&lt;/p&gt;

&lt;p&gt;
Die zentrale Datei der Native Messaging Host ist hier in Python geschrieben, und damit schon mal auf seinen Inhalt überprüfbar. Darüber hinaus beschreibt der Autor auf der Homepage noch sehr schön wie die Schnittstelle aussieht, die ein Skript zur Verfügung stellen muss, um als NM Host fungieren zu können, und welche Aufgaben die einzelnen Teile des Skripts dabei übernehmen. Das ist nicht nur genug um mein Vertrauen zu gewinnen,
sondern geradezu vorbildlich.
&lt;/p&gt;

&lt;p&gt;
Ich hoffe daher, dass Iteration 3 damit die letzte Station auf der Reise zur perfekten Bookmark Lösung für mich war. Dabei bleibt wieder einmal eine Erkenntnis zurück. Obwohl alle 3 Iterationen technologisch vollständig unterschiedliche Ansätze waren, konnten alle perfekt mit einer Textdatei arbeiten, und ich möchte mir nicht ausmalen wie es gelaufen wäre, wenn diese auch noch in einem proprietären Dateiformat abgelegt wären.
&lt;/p&gt;

&lt;p&gt;
Dazu kommt noch, das ich diese Textdatei einfach in HTML exportieren kann, und das Ergebnis ist dann unmittelbar die &lt;a href="https://plaindrops.de/page/links/"&gt;LINKS Seite&lt;/a&gt; dieses Blogs, bei der einfach alle privaten Links nicht exportiert wurden.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>bookmarks</category><category>browser</category><category>emacs</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2021/MyBookmarks/</guid><pubDate>Tue, 02 Nov 2021 02:00:00 GMT</pubDate></item><item><title>Mein Hardware Setup</title><link>https://plaindrops.de/de/blog/2021/MyHardware/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Karl Voit bat darum, von den Hardware-Setups anderer Leute zu hören, also beschloss ich, meines ebenfalls mal  aufzuschreiben, auch als Erinnerung für mich. Manchmal fragen mich Leute, was ich zu Hause benutze und ich weiß es nicht, weil ich meine Hardware immer dann kaufe, wenn alte Geräte sterben, was selten passiert, und oft genug ist es nur das, was mein lokaler Computerhändler zu dieser Zeit auf Lager hat, falls es gut geeignet ist. Es ist also einigermassen schwierig festzustellen, was sich zu dieser Zeit auf meinem Schreibtisch befindet
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 class="collapsible" id="org80fb6d3"&gt;Zu Hause&lt;/h2&gt;
&lt;div id="outline-container-org80fb6d3" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org80fb6d3"&gt;
&lt;p&gt;
Zu Hause arbeite ich an einem Acer Aspire XC-885 (Intel i3-8100 (4) @ 3.600GHz) mit einer 500 GB SSD für System- und tägliche Arbeitsdateien und einer 1 TB HDD, auf der Debian GNU/Linux Buster mit einem qtile-Desktop-Manager läuft.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/computer.jpg" alt="Ein kleiner Desktop-Computer"&gt;
&lt;/p&gt;

&lt;p&gt;
Meine Tastatur ist eine WASD-Tastatur V2 mit blauen Cherry MX-Schaltern und einem leicht angepassten US-Layout (sie hat Super-, Hyper- und Meta-Tasten sowie Pinguine auf den Windows Tasten). Wie man anhand dieser Tasten erraten kann, bin ich ein Emacs-Benutzer. Es ist also keine Überraschung, dass mehr Tasten immer besser sind, und ich verwende auch ein Elgato Streamdeck XL für alle möglichen Aufgaben, hauptsächlich für Gimp, Emacs und Blender.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/keyboard.jpg" alt="Eine mechanische Tastatur mit bunten Sondertasten"&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/streamdeck.jpg" alt="Ein Elgato-Streamdeck mit Symbolen für OPS, Mail, Links, Ledger usw."&gt;
&lt;/p&gt;

&lt;p&gt;
18 Tasten mehr befinden sich auf meiner Maus, einer Lioncast LM30, ach und die Samsung SSD T5 auf dem Bild ist mein alltägliches Backup-Gerät.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/mouse.jpg" alt="Eine Maus mit vielen Tasten, die auf einem Schreibtisch sitzt"&gt;
&lt;/p&gt;

&lt;p&gt;
Als Monitor habe ich einen Samsung 4K UHD Monitor (3840x2160) gewählt, hauptsächlich weil ich so beim Streamen von Videos nur ein Viertel meines Bildschirms streamen kann und eine exakte HD-Auflösung habe, ohne skalieren zu müssen, und ich drei Viertel meines Monitors für drei verschiedene Szenen im Stream nutzen kann.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/monitormount.jpg" alt="Eine hängende Monitorhalterung, eindeutig selbstgemacht mit einer Holzplatte, die aussieht wie die Halterung für Schiebetüren an einem Schlaffzimmer-Schrank
"&gt;
Er hat eine recht ungewöhnliche Halterung, wie auf dem Bild zu sehen, da er zu breit ist, um die Türen an meinem Schreibtisch im Sekretärstil zu öffnen, und ich habe mich entschieden, ihn horizontal beweglich zu montieren, um ihn von der gewünschten Tür wegbewegen zu können. Oben drauf sitzt eine Ausdom HD-Webcam.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/monitor.jpg" alt="Ein Monitor, der den Artikel zeigt, den ich gerade schreibe"&gt;
&lt;/p&gt;

&lt;p&gt;
Mein Sound wird über eine externe Behringer U-Control UCA202 Soundkarte verarbeitet. Daran angeschlossen ist mein Soundequipment und ein alter Radioempfänger als Hauptlautsprecher. Das Soundequipment besteht aus zwei t.bone SC400 Kondensatormikrofonen, einer Boss RC-505 Loop Station, einem VOX Mini 5 Rhythm Gitarrenverstärker für meinen Klampfinator und einem AKAI MPK miniplay als Keyboard, alle über ein Yamaha MG82cx an den Soundkarteneingang angeschlossen Mixer.
&lt;/p&gt;

&lt;p&gt;
Zum Drucken und Scannen von Dokumenten verwende ich einen HP Photosmart Premium m309g.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/printer.jpg" alt="Ein Drucker im Standby"&gt;
&lt;/p&gt;

&lt;p&gt;
Mein Hauptrouter ist eine FritzBox, die direkt mit dem Glasfaser-Endpunkt verbunden ist. Sie versorgt uns sowohl mit WLAN als auch dem LAN für den Computer meiner und meiner Tochter sowie für die D-LINK SAN Box, die eine weitere Kopie der Langzeitdaten in unserem Haushalt enthält.
&lt;/p&gt;

&lt;p&gt;
Zum Fotografieren verwende ich mein Fairphone 3 mit &lt;i&gt;&lt;i&gt;e&lt;/i&gt;&lt;/i&gt; als Betriebssystem. Und dann ist da noch eine Canon DSLR in diesem Haushalt, aber die wird meistens von meiner Tochter verwendet.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/yogatab.jpg" alt="Mein Yoga Tab 3 mit einer Bluetooth-Tastatur davor"&gt;
&lt;/p&gt;

&lt;p&gt;
Zum Surfen &amp;amp; Lesen auf der Couch nutze ich meistens entweder mein Lenovo Yoga Tablet mit LineageOS oder den Kindle 4 Reader, der nun in den ewigen Flugmodus übergegangen ist, da ich kein Amazon-Konto mehr habe. Also benutze ich ihn, um alle ePubs zu lesen, die ich in meinem lokalen Buchladen kaufe, da ich versuche, nach Möglichkeit papierlos zu lesen. Ich mag ihn für seinen "Nur-Lesegerät"-Ansatz. Keine Hintergrundbeleuchtung, kein Musikplayer, keine Gadgets, viel Akkulaufzeit.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/kindle.jpg" alt="Mein alter, aber geliebter Kindle eBook-Reader zeigt eine Seite von 'A Closed and Common Crbit'"&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org77562ce"&gt;Unterwegs&lt;/h2&gt;
&lt;div id="outline-container-org77562ce" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org77562ce"&gt;
&lt;p&gt;
Wenn ich nicht zu Hause bin, habe ich mein Lenovo ThinkPad L560-Notebook, ebenfalls mit Debian X. Ich versuche, den größten Teil der Konfiguration und des Verzeichnislayouts zwischen diesem und meinem Hauptcomputer identisch zu halten. Beide synchronisieren sich über mein Telefon als zentralen Hub, was den Vorteil hat, dass ich den Laptop nicht einschalten muss, wenn ich nach Hause komme, nur um meine Arbeit wieder mit dem Computer auf meinem Schreibtisch zu synchronisieren. Alle Daten, an denen ich gearbeitet habe, sind bereits mit meinem Telefon synchronisiert, wenn ich weg bin, und das Telefon gibt sie an meinen Hauptcomputer weiter, sobald ich wieder in meinem Heim-WLAN-Bereich bin.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgb5bd209"&gt;In der Firma&lt;/h2&gt;
&lt;div id="outline-container-orgb5bd209" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgb5bd209"&gt;
&lt;p&gt;
Mein Firmen-Notebook ist ein Dell Latitude 5511 mit 32 GB RAM und 500 GB HDD mit Windows 10, aber die meiste Zeit des Tages verbringe ich in einer virtuellen Windows8 32-Bit-Maschine, da ich mich mit einer ziemlich alten IDE auseinandersetzen darf. Momentan benutze ich es mit einer DREVO Calibur Tastatur, aber das bedeutet, dass ich 4 Tastaturen auf meinem Schreibtisch habe, wenn ich arbeite. Also habe ich beschlossen, Maus und Tastatur in Zukunft über einen KVM-Switch zu teilen.
&lt;/p&gt;

&lt;p&gt;
Die erwähnte 4. Tastatur ist eine ActiveKey UVB/35 POS Tastatur, die einst der Vorgänger meines Streamdecks war. Seitdem benutze ich es für die Arbeitsaufgabe, die ich täglich mache: Debuggen von Visual Basic Code. Es hat alle häufig verwendeten Tastenkombinationen in seinen 35 Tasten codiert, wie Start, Step into, Step Over, Set Breakpoint, Goto Definition usw. Es debuggt sich traumhaft damit.
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/debugkeyboard.jpg" alt="Eine Kassentastatur mit bunten Tasten für alle möglichen debugging Aufgaben"&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>hardware</category><guid>https://plaindrops.de/de/blog/2021/MyHardware/</guid><pubDate>Sun, 04 Jul 2021 14:00:00 GMT</pubDate></item><item><title>Emacs mit dem Elgato Streamdeck(r)</title><link>https://plaindrops.de/de/blog/2021/GTDorgmode/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
In seinem Blog-Beitrag  &lt;a href="https://karl-voit.at/2020/08/14/project-mgt-draft/"&gt;A Draft Workflow for Advanced Project Management Using Org Mode and Org Edna&lt;/a&gt; schrieb Karl Voit über seinen Traum von einem Workflow, der es ihm ermöglichen würde, ein komplexes Projektmanagement im Org-mode durchzuführen. Wenn du es nicht gelesen hast, tue dies bitte. Wie immer ist es ein toller Text über gut durchdachter Prozesse, und ich kann die meisten hier nicht wiederholen.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Der größte Teil des Arbeitsablaufs wird bereits vom Org mode abgedeckt, und ein weiterer wichtiger Teil der Behandlung von Abhängigkeiten zwischen den Schritten wird vom Paket &lt;a href="https://www.nongnu.org/org-edna-el/"&gt;org-edna&lt;/a&gt; geleistet. Um sein Ziel zu erreichen, benötigte er nur zwei Patches für einige von ihm verwendete Emacs-Packeges.
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgc08be95"&gt;Und so begann meine Reise&lt;/h2&gt;
&lt;div id="outline-container-orgc08be95" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgc08be95"&gt;
&lt;p&gt;
Ich habe noch nie einen längeren Code in Emacs Lisp geschrieben, aber ich dachte, "halt' mal meine Teetasse" und fing an. Um fair zu sein, am Ende hat der Code seinen Job gemacht, aber was noch wichtiger war, ich habe einige mal ernsthaft über meinen eigenen Workflow nachgedacht und festgestellt, dass ich Projekte etwas anders als Karl mache.
&lt;/p&gt;

&lt;p&gt;
Das wurde mir klar, als ich an seinem Garagenbeispiel arbeitete (eine Garage neu streichen). Nachdem der Lack gekauft wurde, müssen das Auto, das Fahrrad und die Regale entfernt werden. Um letzteres zu tun, müssen diese erst ausgeräumt werden. Nun entwickelten sich folgende Gedanken:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Beim Durchsuchen des Codes von &lt;code&gt;org-edna&lt;/code&gt;, um die Stelle zu finden, an der ich eine Abhängigkeitsbehandlung einfügen konnte, die gruppierte Abhängigkeiten zulässt, stellte ich fest, dass der Beispielworkflow vollständig flach war und dass diese Abhängigkeiten im Org mode behandelt werden konnten wenn ich nur die Hierarchie als Baum verwende&lt;/li&gt;
&lt;li&gt;Danach wurde klar, dass ich nie mehr als höchstens drei Aufgaben als nächste Aufgabe planen würde. Mit &lt;a href="https://de.wikipedia.org/wiki/Getting_Things_Done"&gt;GTD&lt;/a&gt; wäre die reine Lehre, nur eine aktive nächste Aufgabe pro Kontext zu haben, aber in Wirklichkeit verliere ich den Überblick, wenn sie zu viele werden.&lt;/li&gt;
&lt;li&gt;Und die Reihenfolge ist mir wichtig. Was ist, wenn ich 5 Minuten brauche, um das Auto zum nächsten öffentlichen Parkplatz zu bringen, und 3 Tage, um die Regale zu leeren und zu entfernen? Ich müsste die ganzen Tage zum Parkplatz gehen, während ich die Garage ausräume. Also würde ich diese Schritte sowieso in der besten Reihenfolge planen.&lt;/li&gt;
&lt;li&gt;Wenn es jetzt wieder eine flache Liste ist, aber mit einer bestimmten Reihenfolge, warum nicht die Eigenschaft &lt;code&gt;ORDERED&lt;/code&gt; verwenden?&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [1/4] Brille richten                    :Brille:project:
         :PROPERTIES:
         :COOKIE_DATA: todo recursive
         :ORDERED: t
         :TRIGGER: next-sibling todo!(NEXT)
         :END:
*** done Zum Optiker fahren
          CLOSED: [2020-08-22 Sa 15:22]
*** NEXT Warten ob es ein neues Mittelteil gibt
*** todo Bestellen 
*** todo Gläser einsetzen
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wenn wir diese Eigenschaft verwenden und auf "t" setzen, wird erzwungen, dass jede Aufgabe nur ausgeführt werden kann, wenn alle vorherigen Aufgaben abgeschlossen sind. Wenn mir dabei etwas in den Weg kommt, möchte ich zuerst die nächste Aufgabe erledigen. Ich bin immer noch frei, sie nur einen Schritt nach vorne zu bewegen und dann zuerst daran zu arbeiten. Zumindest muss ich manuell zugewiesene Abhängigkeiten nicht neu zuweisen. Ich denke, ohne einen Graphen, muss sowas in der Dependency Hölle enden.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org855521f"&gt;Aber was kommt als nächstes?&lt;/h2&gt;
&lt;div id="outline-container-org855521f" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org855521f"&gt;
&lt;p&gt;
Nachdem sichergestellt ist, dass ich so nah wie möglich am Plan arbeite, wie wäre es mit der nächsten Aktion. Wenn ich eine Aufgabe beendet habe, sollte der nächste Task die nächste Aktion sein, an der gearbeitet werden soll. Dafür benutze ich die Hilfe von org-edna. Die TRIGGER-Eigenschaft im obigen Beispiel setzt den ToDo-Status des nächsten Tasks auf NEXT, wenn eine Aufgabe auf einen fertigen Status gesetzt wird. Dies muss als Eigenschaft in jeder Aufgabe festgelegt werden, in der sie benötigt wird, oder im Fall einer einfachen flachen Aufgabenliste kann dies nur im Header erfolgen, indem die Variable org-edna-use-inheritance auf 't' gesetzt wird.
&lt;/p&gt;

&lt;p&gt;
Es gibt also immer eine neue, als NEXT umsetzbare Aufgabe, wenn ich die vorherige abgeschlossen habe. Aber was ist, wenn ich mich entscheide, mit dieser Aufgabe zu warten und das Projekt zum Stillstand zu bringen? Dafür habe ich eine Agenda-Ansicht eingerichtet, die mir alle Projekte zeigt (sie werden durch einen TODO-Status von 'proj' definiert), die keine nächste umsetzbare Aufgabe haben. Diese Projekte werden in der Agenda für feststeckende Projekte angezeigt, die in den Org-Modus integriert ist.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org3c875cf"&gt;Was wäre ein Projekt ohne eine DEADLINE?&lt;/h2&gt;
&lt;div id="outline-container-org3c875cf" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org3c875cf"&gt;
&lt;p&gt;
Bisher konnten alle Probleme mit meinem Workflow nur mit dem Org-Modus oder org-edna gelöst werden, ohne den Code zu manipulieren.
Aber eines blieb. Wie soll ich &lt;code&gt;SCHEDULED&lt;/code&gt; oder &lt;code&gt;DEADLINE&lt;/code&gt; Daten setzen, abhängig vom Enddatum der vorherigen Aufgabe?
Karls Idee war es, es an die Fertigstellung der Aufgabe oder einer Gruppe von Aufgaben vorher zu binden, aber da ich das Konzept von Aufgaben aufgegeben habe, die durch statische Verknüpfungen explizit miteinander verbunden sind, ist dies auch nicht möglich.
&lt;/p&gt;

&lt;p&gt;
Ich musste es vom empfangenden Ende aus angehen. Immer wenn eine Aufgabe zum ersten Mal auf &lt;code&gt;NEXT&lt;/code&gt; gesetzt wird, berechne ich das Datum &lt;code&gt;SCHEDULED&lt;/code&gt; und &lt;code&gt;DEADLINE&lt;/code&gt;. Ich habe eine Funktion geschrieben, die an den hook &lt;code&gt;org-after-todo-state-change-hook&lt;/code&gt; gebunden ist, die nach einer Eigenschaft mit dem Namen &lt;code&gt;PLANNED&lt;/code&gt; sucht und deren Wert zur Berechnung eines Datums verwendet.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(add-hook 'org-after-todo-state-change-hook 'gtd/planning-trigger)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nehmen wir an, ich möchte die Aufgabe 'Geschirrspüler leeren' 3 Stunden nach Abschluss der Aufgabe 'Geschirrspüler laden' ausführen. Also gebe ich ihm einen Eigenschaftswert von + 3h für &lt;code&gt;PLANNED&lt;/code&gt; wie folgt:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [0/2] Wash dishes         :dishes:project:
                 :PROPERTIES:
                 :COOKIE_DATA: todo recursive
                 :ORDERED: t
                 :TRIGGER: next-sibling todo!(NEXT)
                 :END:
*** NEXT Load dishwasher
*** todo Empty dishwasher
                 :PROPERTIES:
                 :PLANNED:: +3h
                 :END:
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nachdem die erste Aufgabe auf &lt;code&gt;done&lt;/code&gt; gesetzt wurde, wird die zweite Aufgabe durch &lt;code&gt;: TRIGGER: next-sibling todo! (NEXT)&lt;/code&gt; auf &lt;code&gt;NEXT&lt;/code&gt; gesetzt.
Bei erfolgreicher Änderung in &lt;code&gt;NEXT&lt;/code&gt; zieht der Hook meine Funktion und voila:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [1/2] Wash dishes                       :dishes:project:
                 :PROPERTIES:
                 :COOKIE_DATA: todo recursive
                 :ORDERED: t
                 :TRIGGER: next-sibling todo!(NEXT)
                 :END:
*** done Load dishwasher
          CLOSED: [2020-08-24 Mo 17:18]
*** NEXT Empty dishwasher
          SCHEDULED: &amp;lt;2020-08-24 Mo 20:18&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Der Code dafür ist ziemlich einfach, und ich muss ihn noch auf &lt;code&gt;DEADLINE&lt;/code&gt; erweitern und gegen Fehler sichern, aber es funktioniert bisher.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(defun gtd/planning-trigger ()
  "Automatically insert chain-find-next trigger when entry becomes NEXT"
  (when (equal org-state "NEXT")
    (message "das war next")
    (setq planned (car (org-map-entries (lambda () (
      org-entry-get nil  "PLANNED")) "PLANNED&amp;lt;&amp;gt;\"\"" 'tree)))
    (if planned (
      (message "Geplant ist %s" planned)
      (org-entry-put nil "SCHEDULED" planned)
      (org-entry-delete nil "PLANNED")
  ) nil) ))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org9e66700"&gt;Abschliessend&lt;/h2&gt;
&lt;div id="outline-container-org9e66700" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org9e66700"&gt;
&lt;p&gt;
Während der letzten zehn Tage habe ich viel über meinen eigenen Workflow gelernt, indem ich versucht habe, den Gedanken eines anderen über seinen eigenen Workflow zu folgen. Genau dafür wurde das Internet gemacht, und es hat mich glücklich gemacht. Und ich habe noch viel mehr gelernt.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Elisp in den Griff bekommen&lt;/li&gt;
&lt;li&gt;gelernt, wie man in Emacs debuggt&lt;/li&gt;
&lt;li&gt;und vor allem habe ich gelernt, wie sehr ich meinem Workflow vertraue, wenn er eine vollständige Agenda erstellt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Aber das wird eine andere Geschichte sein …
 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>code</category><category>gtd</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2021/GTDorgmode/</guid><pubDate>Thu, 27 May 2021 13:00:00 GMT</pubDate></item><item><title>Ein einfacher GTD Ansatz mit Org mode und Org Edna</title><link>https://plaindrops.de/de/blog/2020/GTDorgmode/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
In seinem Blog-Beitrag  &lt;a href="https://karl-voit.at/2020/08/14/project-mgt-draft/"&gt;A Draft Workflow for Advanced Project Management Using Org Mode and Org Edna&lt;/a&gt; schrieb Karl Voit über seinen Traum von einem Workflow, der es ihm ermöglichen würde, ein komplexes Projektmanagement im Org-mode durchzuführen. Wenn du es nicht gelesen hast, tue dies bitte. Wie immer ist es ein toller Text über gut durchdachter Prozesse, und ich kann die meisten hier nicht wiederholen.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Der größte Teil des Arbeitsablaufs wird bereits vom Org mode abgedeckt, und ein weiterer wichtiger Teil der Behandlung von Abhängigkeiten zwischen den Schritten wird vom Paket &lt;a href="https://www.nongnu.org/org-edna-el/"&gt;org-edna&lt;/a&gt; geleistet. Um sein Ziel zu erreichen, benötigte er nur zwei Patches für einige von ihm verwendete Emacs-Packeges.
&lt;/p&gt;
&lt;h2 class="collapsible" id="orgcdba655"&gt;Und so begann meine Reise&lt;/h2&gt;
&lt;div id="outline-container-orgcdba655" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgcdba655"&gt;
&lt;p&gt;
Ich habe noch nie einen längeren Code in Emacs Lisp geschrieben, aber ich dachte, "halt' mal meine Teetasse" und fing an. Um fair zu sein, am Ende hat der Code seinen Job gemacht, aber was noch wichtiger war, ich habe einige mal ernsthaft über meinen eigenen Workflow nachgedacht und festgestellt, dass ich Projekte etwas anders als Karl mache.
&lt;/p&gt;

&lt;p&gt;
Das wurde mir klar, als ich an seinem Garagenbeispiel arbeitete (eine Garage neu streichen). Nachdem der Lack gekauft wurde, müssen das Auto, das Fahrrad und die Regale entfernt werden. Um letzteres zu tun, müssen diese erst ausgeräumt werden. Nun entwickelten sich folgende Gedanken:
&lt;/p&gt;

&lt;ol class="org-ol"&gt;
&lt;li&gt;Beim Durchsuchen des Codes von &lt;code&gt;org-edna&lt;/code&gt;, um die Stelle zu finden, an der ich eine Abhängigkeitsbehandlung einfügen konnte, die gruppierte Abhängigkeiten zulässt, stellte ich fest, dass der Beispielworkflow vollständig flach war und dass diese Abhängigkeiten im Org mode behandelt werden konnten wenn ich nur die Hierarchie als Baum verwende&lt;/li&gt;
&lt;li&gt;Danach wurde klar, dass ich nie mehr als höchstens drei Aufgaben als nächste Aufgabe planen würde. Mit &lt;a href="https://de.wikipedia.org/wiki/Getting_Things_Done"&gt;GTD&lt;/a&gt; wäre die reine Lehre, nur eine aktive nächste Aufgabe pro Kontext zu haben, aber in Wirklichkeit verliere ich den Überblick, wenn sie zu viele werden.&lt;/li&gt;
&lt;li&gt;Und die Reihenfolge ist mir wichtig. Was ist, wenn ich 5 Minuten brauche, um das Auto zum nächsten öffentlichen Parkplatz zu bringen, und 3 Tage, um die Regale zu leeren und zu entfernen? Ich müsste die ganzen Tage zum Parkplatz gehen, während ich die Garage ausräume. Also würde ich diese Schritte sowieso in der besten Reihenfolge planen.&lt;/li&gt;
&lt;li&gt;Wenn es jetzt wieder eine flache Liste ist, aber mit einer bestimmten Reihenfolge, warum nicht die Eigenschaft &lt;code&gt;ORDERED&lt;/code&gt; verwenden?&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [1/4] Brille richten                    :Brille:project:
         :PROPERTIES:
         :COOKIE_DATA: todo recursive
         :ORDERED: t
         :TRIGGER: next-sibling todo!(NEXT)
         :END:
*** done Zum Optiker fahren
          CLOSED: [2020-08-22 Sa 15:22]
*** NEXT Warten ob es ein neues Mittelteil gibt
*** todo Bestellen 
*** todo Gläser einsetzen
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Wenn wir diese Eigenschaft verwenden und auf "t" setzen, wird erzwungen, dass jede Aufgabe nur ausgeführt werden kann, wenn alle vorherigen Aufgaben abgeschlossen sind. Wenn mir dabei etwas in den Weg kommt, möchte ich zuerst die nächste Aufgabe erledigen. Ich bin immer noch frei, sie nur einen Schritt nach vorne zu bewegen und dann zuerst daran zu arbeiten. Zumindest muss ich manuell zugewiesene Abhängigkeiten nicht neu zuweisen. Ich denke, ohne einen Graphen, muss sowas in der Dependency Hölle enden.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgd109208"&gt;Aber was kommt als nächstes?&lt;/h2&gt;
&lt;div id="outline-container-orgd109208" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgd109208"&gt;
&lt;p&gt;
Nachdem sichergestellt ist, dass ich so nah wie möglich am Plan arbeite, wie wäre es mit der nächsten Aktion. Wenn ich eine Aufgabe beendet habe, sollte der nächste Task die nächste Aktion sein, an der gearbeitet werden soll. Dafür benutze ich die Hilfe von org-edna. Die TRIGGER-Eigenschaft im obigen Beispiel setzt den ToDo-Status des nächsten Tasks auf NEXT, wenn eine Aufgabe auf einen fertigen Status gesetzt wird. Dies muss als Eigenschaft in jeder Aufgabe festgelegt werden, in der sie benötigt wird, oder im Fall einer einfachen flachen Aufgabenliste kann dies nur im Header erfolgen, indem die Variable org-edna-use-inheritance auf 't' gesetzt wird.
&lt;/p&gt;

&lt;p&gt;
Es gibt also immer eine neue, als NEXT umsetzbare Aufgabe, wenn ich die vorherige abgeschlossen habe. Aber was ist, wenn ich mich entscheide, mit dieser Aufgabe zu warten und das Projekt zum Stillstand zu bringen? Dafür habe ich eine Agenda-Ansicht eingerichtet, die mir alle Projekte zeigt (sie werden durch einen TODO-Status von 'proj' definiert), die keine nächste umsetzbare Aufgabe haben. Diese Projekte werden in der Agenda für feststeckende Projekte angezeigt, die in den Org-Modus integriert ist.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org5c43483"&gt;Was wäre ein Projekt ohne eine DEADLINE?&lt;/h2&gt;
&lt;div id="outline-container-org5c43483" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org5c43483"&gt;
&lt;p&gt;
Bisher konnten alle Probleme mit meinem Workflow nur mit dem Org-Modus oder org-edna gelöst werden, ohne den Code zu manipulieren.
Aber eines blieb. Wie soll ich &lt;code&gt;SCHEDULED&lt;/code&gt; oder &lt;code&gt;DEADLINE&lt;/code&gt; Daten setzen, abhängig vom Enddatum der vorherigen Aufgabe?
Karls Idee war es, es an die Fertigstellung der Aufgabe oder einer Gruppe von Aufgaben vorher zu binden, aber da ich das Konzept von Aufgaben aufgegeben habe, die durch statische Verknüpfungen explizit miteinander verbunden sind, ist dies auch nicht möglich.
&lt;/p&gt;

&lt;p&gt;
Ich musste es vom empfangenden Ende aus angehen. Immer wenn eine Aufgabe zum ersten Mal auf &lt;code&gt;NEXT&lt;/code&gt; gesetzt wird, berechne ich das Datum &lt;code&gt;SCHEDULED&lt;/code&gt; und &lt;code&gt;DEADLINE&lt;/code&gt;. Ich habe eine Funktion geschrieben, die an den hook &lt;code&gt;org-after-todo-state-change-hook&lt;/code&gt; gebunden ist, die nach einer Eigenschaft mit dem Namen &lt;code&gt;PLANNED&lt;/code&gt; sucht und deren Wert zur Berechnung eines Datums verwendet.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(add-hook 'org-after-todo-state-change-hook 'gtd/planning-trigger)
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nehmen wir an, ich möchte die Aufgabe 'Geschirrspüler leeren' 3 Stunden nach Abschluss der Aufgabe 'Geschirrspüler laden' ausführen. Also gebe ich ihm einen Eigenschaftswert von + 3h für &lt;code&gt;PLANNED&lt;/code&gt; wie folgt:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [0/2] Wash dishes         :dishes:project:
                 :PROPERTIES:
                 :COOKIE_DATA: todo recursive
                 :ORDERED: t
                 :TRIGGER: next-sibling todo!(NEXT)
                 :END:
*** NEXT Load dishwasher
*** todo Empty dishwasher
                 :PROPERTIES:
                 :PLANNED:: +3h
                 :END:
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Nachdem die erste Aufgabe auf &lt;code&gt;done&lt;/code&gt; gesetzt wurde, wird die zweite Aufgabe durch &lt;code&gt;: TRIGGER: next-sibling todo! (NEXT)&lt;/code&gt; auf &lt;code&gt;NEXT&lt;/code&gt; gesetzt.
Bei erfolgreicher Änderung in &lt;code&gt;NEXT&lt;/code&gt; zieht der Hook meine Funktion und voila:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;** proj [1/2] Wash dishes                       :dishes:project:
                 :PROPERTIES:
                 :COOKIE_DATA: todo recursive
                 :ORDERED: t
                 :TRIGGER: next-sibling todo!(NEXT)
                 :END:
*** done Load dishwasher
          CLOSED: [2020-08-24 Mo 17:18]
*** NEXT Empty dishwasher
          SCHEDULED: &amp;lt;2020-08-24 Mo 20:18&amp;gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Der Code dafür ist ziemlich einfach, und ich muss ihn noch auf &lt;code&gt;DEADLINE&lt;/code&gt; erweitern und gegen Fehler sichern, aber es funktioniert bisher.
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(defun gtd/planning-trigger ()
  "Automatically insert chain-find-next trigger when entry becomes NEXT"
  (when (equal org-state "NEXT")
    (message "das war next")
    (setq planned (car (org-map-entries (lambda () (
      org-entry-get nil  "PLANNED")) "PLANNED&amp;lt;&amp;gt;\"\"" 'tree)))
    (if planned (
      (message "Geplant ist %s" planned)
      (org-entry-put nil "SCHEDULED" planned)
      (org-entry-delete nil "PLANNED")
  ) nil) ))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org301f3aa"&gt;Abschliessend&lt;/h2&gt;
&lt;div id="outline-container-org301f3aa" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org301f3aa"&gt;
&lt;p&gt;
Während der letzten zehn Tage habe ich viel über meinen eigenen Workflow gelernt, indem ich versucht habe, den Gedanken eines anderen über seinen eigenen Workflow zu folgen. Genau dafür wurde das Internet gemacht, und es hat mich glücklich gemacht. Und ich habe noch viel mehr gelernt.
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Elisp in den Griff bekommen&lt;/li&gt;
&lt;li&gt;gelernt, wie man in Emacs debuggt&lt;/li&gt;
&lt;li&gt;und vor allem habe ich gelernt, wie sehr ich meinem Workflow vertraue, wenn er eine vollständige Agenda erstellt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
Aber das wird eine andere Geschichte sein …
 
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>gtd</category><category>orgmode</category><guid>https://plaindrops.de/de/blog/2020/GTDorgmode/</guid><pubDate>Mon, 24 Aug 2020 13:00:00 GMT</pubDate></item><item><title>Mein virtuelles Bücherregal</title><link>https://plaindrops.de/de/blog/2020/my-virtual-bookshelf/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich habe vor einigen Jahren beschlossen, mir wenn es irgendwie geht, keine Bücher mehr anzuschaffen. Dabei geht es mir nicht darum, das ich nichts mehr lesen möchte, im Gegenteil, sondern um diese riesige raumverschlingende Menge an Papier in den Regalen, die man bei jedem Umzug einmal ein- und dann auch wieder auspacken muss. EBooks sind also OK und seither meine bevorzugte Art Bücher zu lesen.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
So hat sich im Laufe der Zeit so einiges an Lesestoff angesammelt. Ich habe mir das ein oder andere &lt;a href="https://blog.humblebundle.com/"&gt;Humble Bundle&lt;/a&gt; gekauft, mir die Klassiker aus der &lt;a href="https://www.gutenberg.org/"&gt;Gutenberg Sammlung&lt;/a&gt; in meine Sammlung geladen, jede Menge verbilligte Altauflagen von Grundlagenwissen gehortet, und neben der Sammlung aller verfügbaren Datenschleudern habe ich auch noch jede Menge Scans von interessanten Artikeln aufgehoben, als ich diese entsorgt habe. Im Laufe der Zeit sind so gut 1000 "Werke" zusammengekommen.
&lt;/p&gt;

&lt;p&gt;
Wer wie ich mit Linux arbeitet wir zur Verwaltung wahrscheinlich ganz natürlich zu &lt;a href="https://calibre-ebook.com/"&gt;Calibre&lt;/a&gt; greifen., Damit kann ich die Bücher zwischen meinem PC und den Readern hin und her kopieren, Metadaten hinzufügen und auch direkt die Bücher lesen. Dabei bewege ich mich im Wesentlichen die ganze Zeit in einer langen Liste von Büchern. Und ich verliere ständig den Überblick.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org0fb38e2"&gt;Wie viel einfacher wäre jetzt ein Bücherregal&lt;/h2&gt;
&lt;div id="outline-container-org0fb38e2" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org0fb38e2"&gt;
&lt;p&gt;
Oft hatte ich beim suchen in dieser Liste den Gedanken, wie viel intuitiver dieses Suchen ging als ich früher vor meinem Bücherregal stand. Ich wusste genau, das meine Fantasy Ecke dort begann, wo die neongrüne Ausgabe des Herrn der Ringe im Regal leuchtete, und die Programmierbücher standen auf Hüfthöhe und gruppierten sich rund um den dicken "C von A bis Z" Wälzer. Optisch markante Bücher bildeten eine Art mentales Gerüst in dem sich das Hirn sehr schnell orientieren kann. Das Auge ist immer noch der breitbandigste Eingangskanal des Menschen. Lange Listen nutzen diese Eigenschaft nur sehr unzureichend aus.
&lt;/p&gt;

&lt;p&gt;
Also habe ich nach einem Plugin für Calibre gesucht um mir meine Sammlung als eine Art Bücherregal darstellen zu lassen, und zu meinem eigenen Erstaunen nicht gefunden.
&lt;/p&gt;

&lt;p&gt;
Als sich kurz drauf meine Partnerin für ein Wochenende zu Hause verbarrikadierte, um letzte Hand an ihre Masterarbeit zu legen, hab ich das auch für einen kleinen Coders-Retreat getan, um an einer Umsetzung zu arbeiten. Das Ergebnis war dann kurz darauf schon sehr zufriedenstellend:
&lt;/p&gt;

&lt;div&gt;
&lt;iframe src="https://chaos.social/@Drops/103907495461385734/embed" class="mastodon-embed" height="720" width="100%" allowfullscreen="allowfullscreen"&gt;&lt;/iframe&gt;&lt;script src="https://chaos.social/embed.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="orgf45ed94"&gt;SVG als Mittel der Wahl&lt;/h2&gt;
&lt;div id="outline-container-orgf45ed94" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-orgf45ed94"&gt;
&lt;p&gt;
SVG also &lt;a href="https://de.wikipedia.org/wiki/Scalable_Vector_Graphics"&gt;Scalable Vector Graphics&lt;/a&gt;, hatte für mich als Mittel der Wahl einige Vorteile
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Es kann mit jedem Browser angezeigt werden, was bedeutet ich brauche die grafische Darstellung nur erzeugen, und muss mich nicht selbst um die Anzeige kümmern&lt;/li&gt;
&lt;li&gt;Ich kann direkt in die Grafik Links einbauen, die dann vom Browser verarbeitet werden. Dadurch wird für jede Art von eBook (epub, mobi, pdf) genau der Betrachter aufgerufen, den das Betriebssystem dafür vorsieht. Auch darum muss ich mich nicht kümmern. Ich klicke auf das Buch, und es öffnet sich im Reader.&lt;/li&gt;
&lt;li&gt;Die Grafik ist, wie der Name schon nahelegt skalierbar, ich kann also näher an das Regal zoomen, und sehe dann auch tatsächlich mehr Details.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org3d6d25a"&gt;Interessante Probleme bei der Umsetzung&lt;/h2&gt;
&lt;div id="outline-container-org3d6d25a" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org3d6d25a"&gt;
&lt;p&gt;
Umgesetzt habe ich das ganze mit Python, der komplette Code liegt auf meinem &lt;a href="https://codeberg.org/dr.ops/ebookshelf"&gt;Codeberg&lt;/a&gt;.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org8c8fb87"&gt;Unterschiedliche Grössen und Farben&lt;/h3&gt;
&lt;div id="outline-container-org8c8fb87" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org8c8fb87"&gt;
&lt;p&gt;
Wenn ich in mein Bücherregal schaue (ich habe noch ca 1,5 Meter davon) dann fällt mir zum Beispiel direkt die Death Note Serie auf. Die Bücher sind alle kleiner als die anderen, und sie haben den gleichen Buchrücken. Etwas ähnliches wollte ich für meine virtuellen Bücher auch tun.
&lt;/p&gt;

&lt;p&gt;
Gelöst habe ich das vorerst dadurch, dass ich je nach Verlag den Büchern eine einheitliche Farbe und Größe gebe. Das mache ich auf die simpelste Weise, die mir einfiel:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;publisher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utf-8'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"0x"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"#"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;span class="n"&gt;pubcol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"#"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;hex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;series&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utf-8'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sercol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"#"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;svg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;formats&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                      &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"application/epub+zip"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;linktitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;linktitle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;

&lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;stroke&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                      &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                      &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shelfspace&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
                      &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"stroke-width"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.5"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;publisher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SVG&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SubElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"rect"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pubcol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;stroke&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                           &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                           &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                           &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shelfspace&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
                           &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;publisher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"stroke-width"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.5"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;
Ich generiere mir einfach aus dem Verlagsnamen einen md5 Hash (hier kommt es nicht auf cryptographische Sicherheit an) und benutze z.B. das letzte Byte davon um die Höhe zu berechnen, oder nehme die letzten 3 Bytes als Farbwert für den Buchrücken. Ähnliches mache ich dann mit einem kleinen Viereck am oberen Buchrand, um Serien unterscheiden zu können
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 class="collapsible" id="org18f6af5"&gt;Unterschiedliche Buchdicke&lt;/h3&gt;
&lt;div id="outline-container-org18f6af5" class="outline-3 collapsme"&gt;
&lt;div class="outline-text-3" id="text-org18f6af5"&gt;
&lt;p&gt;
Eine weitere optische Besonderheit, die einem das auffinden von Büchern im Regal leicht machen ist die unterschiedliche Dicke der Bücher. Mein erster naiver Ansatz war zu sagen, dass mein dickstes Buch im Regal einfach 10 cm dick sein soll, und alle anderen entsprechend der Seitenzahl proportional dünner. Das ging jedoch ziemlich schief. Mein dickstes Buch hat etwa 4100 Seiten, meine dünnsten Bücher haben nur 2 - 5 Seiten. abgesehen davon das diese Scans von Artikeln dann im Regal kaum sichtbar wären, wäre es außerdem noch unmöglich ihren Rücken zu beschriften.
&lt;/p&gt;

&lt;p&gt;
Dazu muss ein Buch bei mir mindestens 10mm dick sein. Ich habe den Büchern also quasi einen Einband verpasst der diese Mindestdicke hat, und  nach einer Methode gesucht, wie die Dicke bei dünnen Büchern sehr schnell ansteigt, mit zunehmender Seitenanzahl dann aber immer langsamer wächst, bis schließlich 90mm erreicht sind. Plus Einband liege ich dann wieder bei 10cm heraus kam folgendes:
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shelfspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seiten&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;Book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxPages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;
Da sich das nicht auf Anhieb erschließt ist hier meine Skizze dazu:
&lt;/p&gt;

&lt;p&gt;
&lt;img src="https://plaindrops.de/images/Seitendicke.jpg" alt="nil"&gt;
&lt;/p&gt;

&lt;p&gt;
Wie man unten rechts sieht hatte ich kurz darüber nachgedacht das über Sinus und Kosinus zu machen, aber als ich den Radius eingezeichnet hatte, wurde deutlich, dass ich es hier mit einem rechtwinkligen Dreieck zu tun habe, und da geht immer a²+b²=c².
Wenn man sich den Kreisbogen ansieht, und die Seitenanzahl von links nach rechts stetig steigt, dann sieht man wie die Dicke anfangs nahezu senkrecht zunimmt um dann immer langsamer auf die maximale Dicke zu klettern. Während es einen großen Unterschied macht, ob ein Buch 50 oder 150 Seiten hat, so ist es nahezu belanglos, ob es 1900 oder 2000 Seiten hat. Am Ende liegt es bei 90 Millimetern plus 10 Millimetern für den Einband.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org5896bd6"&gt;Was ich noch tun möchte&lt;/h2&gt;
&lt;div id="outline-container-org5896bd6" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org5896bd6"&gt;
&lt;p&gt;
Derzeit in Arbeit ist es die Bücher thematisch zu sortieren. Dazu brauche ich zunächst mal eine thematische Reihenfolge, und dazu müssen alle Bücher verschlagwortet werden. Bei 1000 Büchern nimmt das eine ganze Zeit in Anspruch, dann werde ich die Schlagworte inhaltlich gruppieren, und beim füllen darauf achten das in der passenden Reihenfolge zu tun. An die Regale kommen dann kleine Schildchen auf denen Steht welche Themen wo beginnen. Grosse Themen bekommen auch ein Schild an den Kopf des Regals ähnlich wie in einer Buchhandlung.
&lt;/p&gt;

&lt;p&gt;
Die Buchrücken sollen realistischer werden, in dem Sinne, das sie das Cover ein wenig nachahmen. Ich möchte aus dem linken Rand des Covers (ein paar Pixel breit) einen Streifen erzeugen, der dann als Rücken genutzt wird.
&lt;/p&gt;

&lt;p&gt;
Ein paar grafische Gimmicks, wie schräg angelehnte Bücher oder kleine Bücherstapel verschaffen bestimmt auch mehr Orientierung.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>ebooks</category><category>plaintext</category><category>svg</category><guid>https://plaindrops.de/de/blog/2020/my-virtual-bookshelf/</guid><pubDate>Mon, 13 Apr 2020 13:16:35 GMT</pubDate></item><item><title>Finanzen im Griff mit Ledger (2) - Der Emacs Ledger-Mode</title><link>https://plaindrops.de/de/blog/2020/finance-under-control-2/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Im letzten Teil hatte ich darüber geschrieben, wie Buchungen in Ledger
funktionieren, und wie sie geschrieben werden. Dadurch, dass es sich
um einfache Textdateien handelt, braucht man dazu nicht mehr als einen
beliebigen Texteditor. Wählt man dazu Emacs macht die Arbeit allerdings
schon deutlich mehr Spass.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Naja zugegeben Spass ist was anderes, aber wenn man seine Finanzen mal
im Griff hat, und nicht mehr jeden Januar von der Welle der
"unerwartbaren" Buchung überrascht wird hinterlässt das schon ein sehr
gutes Gefühl. Und Emacs macht es mit dem Ledger Mode schon recht
einfach schnell einwandfreie Buchungssätze zu schreiben
&lt;/p&gt;
&lt;h2 class="collapsible" id="org8a26ed5"&gt;Automatische Namensergänzung&lt;/h2&gt;
&lt;div id="outline-container-org8a26ed5" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org8a26ed5"&gt;
&lt;p&gt;
Eine grosse Fehlerquelle besteht darin, dass die Kontonamen (die ja in
der Regel auch noch innerhalb von Kategorien liegen) schnell sehr lang
werden können. Ausgaben:Wohnen:Nebenkosten:GasWasser ist durchaus ein
ganz gewöhnlicher Kontenname. Der Ledger Mode liest beim laden der
Datei alle Konten ein und es reicht ab dann die einzelnen Teile der
Bezeichnung zu beginnen, und dann einfach per Tab-Completion
automatisch ergänzen zu lassen. Neben der eingesparten Zeit beim
Tippen können so auch keine Tippfehler mehr entstehen.
&lt;/p&gt;

&lt;p&gt;
Apropos Tippfehler in Kontennamen. Ledger bietet die Möglichkeit bei
unbekannten Konten in einer Buchung, dieses Konto einfach nebenbei zu
erzeugen. So verführerisch diese Option auch ist sollte davon Abstand
genommen werden, und stattdessen lieber die gegenteilige Einstellung
zur Norm werden. 
&lt;/p&gt;

&lt;p&gt;
Dann weigert sich Ledger zu arbeiten sobald ein Konto bebucht werden
soll, dass vorher nicht explizit eingerichtet wurde. Diese Weigerung
mag anfangs lästig erscheinen, aber wenigstens gibt Ledger dann genau
an welches Konto falsch geschrieben wurde, wenn man sich doch mal
vertippt. Ohne dies Meldung staht man ansonsten vor der
Herausforderung einfach nur falsche Werte in seinen Konten zu haben,
und die Ursache aus hunderten Buchungen herauslesen zu müssen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org81c8469"&gt;Unterstützter Realitätsabgleich.&lt;/h2&gt;
&lt;div id="outline-container-org81c8469" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org81c8469"&gt;
&lt;p&gt;
Eine weitere Hilfe, damit die Buchführung nicht von der Realität
abweicht, ist ein regelmmässiger Kontenabgleich ich mache das für mein
Girokonto, und die Kreditkarte anhand der Kontoauszüge und für das
Bargeld indem ich einfach den Inhalt meines Portemonaies auf den
Schreibtisch entleere. 
&lt;/p&gt;

&lt;p&gt;
In jedem Fall erhalte ich so den Kontostand, den auch meine
Buchführung aufweisen &lt;b&gt;sollte&lt;/b&gt;. Die Reconcile Funktion des Ledger Modes
fragt mich beim Aufruf nach diesem Wert, und gibt mir anschliessend
eine Auflisteung aller Buchungen, die ich noch nicht abgeglichen
habe. Nun kann ich mich mit meinem Kontoauszug in der Hand hinsetzen
und alle Buchungen markieren, die ich in Ledger ebenfalls sehe. Dabei
bekomme ich ständig die Differenz meiner bestätigten Buchungen zur
Realität angezeigt. Sobald diese Differenz 0 beträgt ist der Abgleich
erledigt, und aus den temporären markierungen werden endgültige.
Um diese so markierten Buchungen muss ich mich danach nie wieder kümmern.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org6d48976"&gt;Automatische Reportupdates&lt;/h2&gt;
&lt;div id="outline-container-org6d48976" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org6d48976"&gt;
&lt;p&gt;
Gerade beim Bargeld ist so ein Realitätsabgleich manchmal schwierig,
denn er setzt voraus, dass man jeden Cent den man irgendwo für einen
Schkoriegel ausgegeben hat, irgendwie in die Buchführung bekommt. Aus
diesem Grund empfehle ich für den Anfang die BArgeldums"tze einfach zu
minimieren und vieles mit der Karte zu bezahlen. Das Geld was man dann
noch am Geldautomaten abholt kann man dann entweder einem allgemeinen
Konto zuordnen, oder nach Gefühl aufteilen. Nur wer es hier genauer
wissen will und entsprechen diszipliniert bucht wird Spass damit
haben.
&lt;/p&gt;

&lt;p&gt;
Ich nutze sowieso für kleine Notizen ein USB Diktiergerät und so
klappt auch die Bargeldbuchführung recht gut. Falls ich mal ein wenig
mehr Arbeit damit habe meine Ausgaben nachzuvollziehen, ist es sehr
hilfreich das Emacs mir in einem zweiten Fenster den Verlauf meiner
Ausgaben und Einnahmen (wenn ich am Geldautomaten war) im Portmonai zu
zeigen, und sofort zu aktualisieren, wenn ich Buchungen hinzufüge.
&lt;/p&gt;

&lt;p&gt;
Angenommen ich dachte, das ich vor zwei Wochen mal 15 Euro beim
Chinamann ausgegeben habe, sehe ich beim eintragen so sofort, dass da
irgendetwas nicht stimmen kann, weil zwar die Endsumme meines
Bargeldkontos dem entspricht, was ich im Portemonaie habe (und somit
die 15 Euro tatsächlich ausgegeben wurden) aber der Zeitpunkt nicht
stimmen kann, weil mein Portemonaie ansonsten zwischenzeitlich im
Minus gewesen wäre, was bei Bargeld einfach nicht möglich ist.
&lt;/p&gt;

&lt;p&gt;
Offensichtlich war es also nicht vor 2 sondern vor einer Woche,
&lt;b&gt;nachdem&lt;/b&gt; ich zwischendurch am Geldautomaten war. Ich kann meine Buchung
durch die Zeit schieben, und sehe im Report sofort live, ob eine
Buchung evtl so nicht möglich gewesen sein kann.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org0557c8d"&gt;Automatisches Grossreinemachen&lt;/h2&gt;
&lt;div id="outline-container-org0557c8d" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org0557c8d"&gt;
&lt;p&gt;
Auch wenn dies Funktion eigentlich nichts umwerfendes ist, ist es doch
ungeheuer praktisch wenn man bei der Erfassung von Buchungen nicht
darauf achten muss wohin in der Datei man seine Buchng schreibt, oder
ob man auch alle Dezimalpunkte untereinander schreibt. Der Ledger
Mode hat sowohl für die lesbare Formatierung, wie auch die zeitliche
Sortierung von Buchungen Funktionen. Ich habe es mir besonders
einfach gemacht und rufe dieses "hübsch machen" einfach per Hook bei
jedem Speichern meiner Ledger Datei auf. So sind immer alle Daten
lesefreundlich formatiert
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>emacs</category><category>ledger</category><guid>https://plaindrops.de/de/blog/2020/finance-under-control-2/</guid><pubDate>Fri, 21 Feb 2020 12:00:00 GMT</pubDate></item><item><title>Warum ich Plaintext mag</title><link>https://plaindrops.de/de/blog/2020/why-I-like-plaintext/</link><dc:creator>Andy Drop</dc:creator><description>&lt;p&gt;
Ich sass sehr gespannt vor meinem Homebanking Programm. Es war das einzige, mit dem ich unter Linux direkt mit meiner Bank kommunizieren konnte. Leider waren die Möglichkeiten der Auswertung sehr begrenzt, aber das ist ja kein Problem. Linux stellt eine Menge Software zur Verfügung um aus tristen Zahlen schöne Grafiken zu machen. Allerdings speicherte die Banking Software ihre Daten nur in einem antiken und scheinbar auch verschlüsselten Datenbanksystem.
&lt;/p&gt;
&lt;!-- TEASER_END --&gt;

&lt;p&gt;
Also hatte ich nochmal gutes Geld für die PRO Version gezahlt weil die laut Hersteller in der Lage
sein sollte Daten im XLM Austauschformat ex- und importieren zu können. Da XML in der Regel
einfach zu lesen ist, fand ich das eine gute Idee, um meine eigenen Grafikausgaben mit den Daten
zu füttern.
&lt;/p&gt;

&lt;p&gt;
Der ein oder andere wird schon bemerkt haben, was ich damals auch für einen Schreibfehler gehalten
habe. Da stand XLM und nicht XML, und genau so meinte der Hersteller das auch. XLM war ein Format,
das komplett kryptisch war, nicht dokumentiert, und ausser von diesem Hersteller vermutlich von
niemandem gelesen oder geschrieben werden konnte. Für mich war das für nichts anderes gut, um als
Ausrede für die oft geäusserten Beschwerden gegen fehlende Schnittstellen nach aussen zu dienen.
&lt;/p&gt;

&lt;p&gt;
Sowas macht mich halsig
&lt;/p&gt;

&lt;p&gt;
Wenn ich mich schon aus Not an einen Hersteller binde, dann will ich nicht auch noch so über den
Tisch gezogen werden. Zu meiner Erleichterung hatte damals das &lt;a href="https://aquamaniac.de/rdm/"&gt;aqbanking Projekt&lt;/a&gt; seine Software so
weit entwickelt, dass es möglich wurde auch mit meiner Bank zu kommunizieren. Und das beste war,
es legte seine Daten einfach im Klartext auf meine Festplatte. Die konnte ich dann mit anderen
Programmen lesen, verarbeiten, grafisch darstellen, und all die Dinge machen, die niemand zusammen
in ein einziges Programm packen würde.
&lt;/p&gt;
&lt;h2 class="collapsible" id="org0a88604"&gt;Queryologie&lt;/h2&gt;
&lt;div id="outline-container-org0a88604" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org0a88604"&gt;
&lt;p&gt;
Und hier kommt auch schon der Große Vorteil davon, alle meine Daten in Plaintext zu haben. Ich
weiss selbst heute noch nicht, was ich eines Tages alles mit diesen Daten anfangen möchte. Oder
wie Michael Seemann es formuliert: Welche Query ich später mal auf diese Daten anwende.
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;

&lt;/p&gt;

&lt;p&gt;
"Nicht mehr der Sender soll definieren, was der Empfänger für Signal und was er für Rauschen zu
halten habe, sondern der Empfänger soll dies in Zukunft selbst entscheiden, ohne den Sender
überhaupt zu fragen."
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://www.ctrl-verlust.net/"&gt;Michael Seeman&lt;/a&gt;:  &lt;i&gt;&lt;a href="http://irights-media.de/webbooks/dasneuespiel"&gt;Das Neue Spiel&lt;/a&gt;, Kap2, Die Emanzipation der Query&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Im konkreten Beispiel kann weder die Bank, noch mein Softwarehersteller wissen, dass ich mein
Girokonte in meinem privaten Kassenbuch noch in eine handvoll virtueller Briefumschläge aufteile, 
in die ich jeweils am Anfang des Monats ein bisschen Geld stecke um damit z.B. in jedem Halbjahr
die Autoversicherung zu bezahlen.
&lt;/p&gt;

&lt;p&gt;
Jetzt wo ich einfach meine Umsätze und den Kontostand als Plaintext-Datei bekomme kann ich das
leicht in meiner Buchfühung abbilden und auch grafisch anzeigen lassen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org7bdca68"&gt;Vendor Lock-In&lt;/h2&gt;
&lt;div id="outline-container-org7bdca68" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org7bdca68"&gt;
&lt;p&gt;
Und so geht es mir an vielen Stellen, wenn ich mit Software arbeite. Sei es die Fotoverwaltung, in
der ich zwar alle Bilder wunderbar mit Personennamen, Orten und Ereignissen markieren kann, oder
die Ahnenforschung, bei der ich  meine 200 Vorfahren mühelos mit anderen Ahnenforschern am
gleichen Stammbaum abgleichen kann, aber sie nicht an meine Tochter weitergeben, wenn ich keine
Lust habe bis zu meinem Lebensende horrende Mitgliedsbeitrage für die Aufbewahrung zu zahlen.
&lt;/p&gt;

&lt;p&gt;
Mein aktuellstes Beispiel ist meine Buchsammlung von knapp 100 eBooks, die ich im Laufe der Jahre
bei Amazon erstanden (es geht um hunderte Euro) habe, und die ich seit einer Kündigung meines
Benutzerkontos planmässig nicht mehr lesen kann. Immer geht es um den Effekt der
Herstellerbindung.
&lt;/p&gt;

&lt;p&gt;
Darunter versteht man etwa folgendes
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;

&lt;/p&gt;

&lt;p&gt;
"Unter Lock-in-Effekt (englisch lock in, „einschließen“ oder „einsperren“) versteht man generell
in den Wirtschaftswissenschaften und speziell im Marketing die enge Kundenbindung an
Produkte/Dienstleistungen oder einen Anbieter, die es dem Kunden wegen entstehender Wechselkosten
und sonstiger Wechselbarrieren erschwert, das Produkt oder den Anbieter zu wechseln."
&lt;/p&gt;

&lt;p&gt;
Wikipedia: &lt;i&gt;&lt;a href="https://de.wikipedia.org/wiki/Lock-in-Effekt"&gt;Lock-In-Effekt&lt;/a&gt;&lt;/i&gt;
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 class="collapsible" id="org4d29946"&gt;Ausbruch&lt;/h2&gt;
&lt;div id="outline-container-org4d29946" class="outline-2 collapsme"&gt;
&lt;div class="outline-text-2" id="text-org4d29946"&gt;
&lt;p&gt;
Plaintext erlaubt es mir aus diesem, und noch einigen anderen Gefängnissen auszubrechen. Ich werde
dadurch unabhängig, dass ich mich von Datenformaten löse, die nur von Maschinen, und im
schlimmsten Falle nur von den Maschinen oder Programmen einzelner Hersteller, gelesen werden
können. Ich werde unabhängig davon dass
&lt;/p&gt;

&lt;ul class="org-ul"&gt;
&lt;li&gt;Hersteller die Funktionen anbieten die ich möchte&lt;/li&gt;
&lt;li&gt;Hersteller in 10 Jahren noch existieren&lt;/li&gt;
&lt;li&gt;Hersteller in 50 Jahren noch ihre Server betreiben&lt;/li&gt;
&lt;li&gt;Hersteller ihre eigenen Datenformate weiterhin unterstützen&lt;/li&gt;
&lt;li&gt;Software auch mit den Produkten der Konkurrenz zusammenarbeiten möchte
&lt;ul class="org-ul"&gt;
&lt;li&gt;Auch wenn diese Konkurrenzfirma erst in 3 jahren gegründet wird&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Es überhaupt noch Software zur Verarbeitung gibt. Zur Not kann ich all diese Daten auch einfach
ausdrucken und mit dem blossen Auge lesen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
In der Praxis kann dank Plaintext mein Kochrezept-Programm seine Daten einfach gut lesbar auf der
Festplatte ablegen, und ich kann mir ein kleines Programm schreiben, dass mir ein Rezept auswahlt
und die Zutaten dafür als Einkaufszettel in meine ToDo-Liste schiebt, und an mein Handy schickt.
&lt;/p&gt;

&lt;p&gt;
Vermutlich ist das auch der Grund warum Linux so gut zu mir und meinem Arbeitsstil passt. Statt
mir ein komplette Arbeitsweise vorgeben zu wollen, bietet es mir viele kleine Programme die kleine
Aufgaben lösen, und alle mit den selben Daten arbeiten können, und dadurch in Summe ein
sehr mächtiges Team darstellen. Und dieses Team habe ich lieber an meiner Seite, als die Firma,
die mir mit Absicht einen Druckfehler unterjubelt um mir das Geld aus der Tasche zu ziehen.
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description><category>banking</category><category>plaintext</category><category>query</category><guid>https://plaindrops.de/de/blog/2020/why-I-like-plaintext/</guid><pubDate>Fri, 14 Feb 2020 14:16:35 GMT</pubDate></item></channel></rss>