<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../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>erdgeist.org</title><link>http://erdgeist.org/</link><description>is the personal page of Dirk Engling aka erdgeist</description><atom:link href="http://erdgeist.org/blog/rss.xml" rel="self" type="application/rss+xml"></atom:link><language>de</language><lastBuildDate>Fri, 31 Oct 2025 17:07:24 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Record your browser</title><link>http://erdgeist.org/posts/2025/record-your-browser/</link><dc:creator>erdgeist</dc:creator><description>&lt;div&gt;&lt;p&gt;As &lt;a class="reference external" href="https://events.ccc.de/congress/2025/infos/styleguide.html"&gt;this year's Congress design&lt;/a&gt; relies heavily on the &lt;a class="reference external" href="https://erdgeist.org/39C3/font/KarioDuplexVar-Roman.woff2"&gt;Kario Duplex Var main font&lt;/a&gt;, we needed a rendering engine that could take full advantage of all the font's typographic features while enabling the relatively straightforward creation of images.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://erdgeist.org/posts/2025/record-your-browser/"&gt;Weiterlesen…&lt;/a&gt; (10 min verbleiben zum Lesen)&lt;/p&gt;&lt;/div&gt;</description><guid>http://erdgeist.org/posts/2025/record-your-browser/</guid><pubDate>Thu, 30 Oct 2025 22:42:00 GMT</pubDate></item><item><title>Lights on</title><link>http://erdgeist.org/posts/2024/lights-on/</link><dc:creator>erdgeist</dc:creator><description>&lt;div&gt;&lt;p&gt;I'm not much of a web dev, but I embrace the occasional &lt;a class="reference external" href="https://erdgeist.org/gitweb/halfnarp2/tree"&gt;quick and dirty Flask-SQLAlchemy hack to scratch my itch&lt;/a&gt; and when forced, I try to resort to &lt;a class="reference external" href="https://erdgeist.org/gitweb/abmahn-beantworter/tree/js/abmahn.js"&gt;solve my problems using vanilla.js&lt;/a&gt;. So when I committed to freshen up a certain site to make it presentable until the imminent rewrite, one of the loudest requests was to implement a dark mode. So I dug down a rabbit hole to find out how to do that properly, using only minimally invasive tools. Here's what I learned, so you don't have to sit through meandering youtube videos.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://erdgeist.org/posts/2024/lights-on/"&gt;Weiterlesen…&lt;/a&gt; (4 min verbleiben zum Lesen)&lt;/p&gt;&lt;/div&gt;</description><guid>http://erdgeist.org/posts/2024/lights-on/</guid><pubDate>Sat, 24 Feb 2024 22:42:00 GMT</pubDate></item><item><title>Picking your tools of the trade</title><link>http://erdgeist.org/posts/2022/tools-of-the-trade/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Over the years I've had to make a lot of choices, about what editor, programming language, frameworks and whole projects to pick to get stuff done. Think coding for university, setting up projects for work and customers, writing open source software and maintaining services for the community.&lt;/p&gt;
&lt;p&gt;While some of the decisions were no-brainers, e.g. when the company I worked for has had already settled on a framework or there was only a single tool available, most of the times there was quite an array of options to chose from and picking the right one required some effort – and hindsight I simply didn't have at the time.&lt;/p&gt;
&lt;p&gt;As all older people do, I assume that me writing down my lessons learned will prevent you, dear reader, from making your own mistakes. So without further ado, I introduce my 7 points of how to spot software projects that may or may not work for you.&lt;/p&gt;
&lt;h2&gt;1. Define your breaking points!&lt;/h2&gt;
&lt;p&gt;Remember: Sometimes it's okay to just &lt;em&gt;say no&lt;/em&gt; completely. You do not have to settle for the least ugly option, especially when doing open source work. You should decide in advance how much energy your project is worth. You may then decide if it's smarter to abandon your plans or to bite the bullet and chose a sub-optimal dependency, or even fork or set up a new project to solve the unsolved.&lt;/p&gt;
&lt;p&gt;At your work place, you might put up with much worse options than with projects you want to do in your spare time, but maybe you can take this list and convince your boss or co-workers to re-evaluate decisions.&lt;/p&gt;
&lt;h2&gt;2. How much does the project know and communicate about prior art, best practises and how they fit in there?&lt;/h2&gt;
&lt;p&gt;Did the project authors and maintainers spend the effort of building platform ports or are you required to follow a &lt;em&gt;"Best viewed with Internet Explorer 6 in 1024 x 768"&lt;/em&gt; approach and force you to deploy precise replicas of their setups?&lt;/p&gt;
&lt;p&gt;red flags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;curl | bash&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;bashisms in Makefile or shell scripts,&lt;/li&gt;
&lt;li&gt;"Windows filenames" (build breaks if filesystem is case sensitive),&lt;/li&gt;
&lt;li&gt;temp files or editor backup files in distribution,&lt;/li&gt;
&lt;li&gt;hard-coded credentials or certificates,&lt;/li&gt;
&lt;li&gt;project builds only in Docker / github CI pipeline,&lt;/li&gt;
&lt;li&gt;source code treated as second-class installation option (they really want you to install binary packages),&lt;/li&gt;
&lt;li&gt;dependencies on tools or libraries in versions other than current stable release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;green flags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;packages for more than one platform,&lt;/li&gt;
&lt;li&gt;build enables all compiler warnings and none show up during regular build,&lt;/li&gt;
&lt;li&gt;build system comes prepared for cross-compilation,&lt;/li&gt;
&lt;li&gt;project has open bug tracker,&lt;/li&gt;
&lt;li&gt;bug tracker shows that bugs are attended to and not closed on a whim,&lt;/li&gt;
&lt;li&gt;README clearly states security contact for when you find a security bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Are the project's devs and contributors active on other projects, maybe even some you've heard of?&lt;/p&gt;
&lt;p&gt;Does the user and admin documentation hint at the authors following best practices?
&lt;em&gt;This is important because, for example as an admin, you don't want to be stuck studying the complete project and their dependencies just for trouble shooting a single problem.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Are the project's maintainers aware of trade-offs and short comings of their project?&lt;/p&gt;
&lt;p&gt;red flag:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The project page is full of marketing speech and a liberal use of "awesome" words.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;green flag:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Embracing criticism. &lt;em&gt;You can only be a true fan of a project if you have at least one hour worth of rant about the warts-and-all.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Do you like the project's documentation?&lt;/h2&gt;
&lt;p&gt;Does the project's documentation cover the basics with some handy primers and how to grow from using a small feature set to the whole API?&lt;/p&gt;
&lt;p&gt;Will the first google hit for a medium complexity keyword from the project – be it an API call, a config keyword or keyboard short cut – be somewhere at the project's page or on Stack Overflow?&lt;/p&gt;
&lt;p&gt;Does the project come with some good opinionated defaults along with their respective rationales?&lt;/p&gt;
&lt;p&gt;Are the defaults there because they are useful or for backwards compatibility?&lt;/p&gt;
&lt;p&gt;Do you have to manually turn on vital security aspects?&lt;/p&gt;
&lt;p&gt;Are obscure knobs documented? &lt;em&gt;Older projects usually have some special functions or knobs for special cases that probably won't apply to you. The documentation should make clear which options are for obscure special cases so you don't get lost in the details when looking for a specific thing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Do they thoroughly cover how to maintain the projects or do all the guides stop right after you installed the project? Which leads us to …&lt;/p&gt;
&lt;h2&gt;4. How much regular attention does the project require?&lt;/h2&gt;
&lt;p&gt;Good tools require cleaning and maintainance – but once you spend all your time just on your tools, you're not getting work done.&lt;/p&gt;
&lt;p&gt;Does the project clearly understand and communicate what dependencies they bring and how to keep those up to date?&lt;/p&gt;
&lt;p&gt;Are those dependencies well balanced? Is the same true for their recursive dependencies (this includes the programming languages chosen).&lt;/p&gt;
&lt;p&gt;As a more specific example, is the project written in a language with a clear and complete runtime for the basics? Think libc vs. leftpad, python's &lt;em&gt;batteries included approach&lt;/em&gt;, etc.&lt;/p&gt;
&lt;p&gt;A good sign is a few dependencies with a guaranteed stable API.&lt;/p&gt;
&lt;p&gt;Once you understand the dependency tree, is there another option with fewer deps? IOW: Do you need all the things provided by the project at hand, or is there a more specific tool for your problem?&lt;/p&gt;
&lt;p&gt;Given how much time you can realistically spend on a single dependency: Can the project and its stack cope with routine maintainance intervals of one year? Does the project give guarantees not to break config or user data on updates?&lt;/p&gt;
&lt;p&gt;Does the project have a policy and a schedule for updates vs upgrades vs security patches? Are they free without a subscription?&lt;/p&gt;
&lt;p&gt;If the user can't chose maintainance time (e.g. on security updates), does the project guarantee that you will not be forced to upgrade to breaking changes?&lt;/p&gt;
&lt;p&gt;How quickly are dependencies deprecated? Are you required to re-work basic functionality within less than a year?&lt;/p&gt;
&lt;h2&gt;5. Is the project there to stay?&lt;/h2&gt;
&lt;p&gt;What is the project's head count?&lt;/p&gt;
&lt;p&gt;Is the community's size in a healthy proportion to the project's complexity?&lt;/p&gt;
&lt;p&gt;What kind of contributors and users does the project attract? How's the tone in associated forums? Is that a good sign for you?&lt;/p&gt;
&lt;p&gt;Where's the project hosted at? Does it run some own infrastructure or will the dependency break once you or your customers are in a sanctioned region?&lt;/p&gt;
&lt;p&gt;Has project ownership changed hands? More than once?&lt;/p&gt;
&lt;h2&gt;6. … and if not do they help you to move on?&lt;/h2&gt;
&lt;p&gt;If the project provides migration helpers, do they only point in one direction?&lt;/p&gt;
&lt;p&gt;Can you dump payloads, meta data and config information in a structured format that helps you inspecting and importing it elsewhere later? &lt;em&gt;From my experience it is best, if the project did anticipate its obsolescence and provide these functions right from the start.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Does the project's config language require knowledge about some plumbing that you should not need to care about?&lt;/p&gt;
&lt;p&gt;Can you see a clear path how to use a competing project or it's API should you reconsider or are you stuck to the point of requiring a rewrite or complete re-start of your project?&lt;/p&gt;
&lt;h2&gt;7. What's the extra baggage YOU leave?&lt;/h2&gt;
&lt;p&gt;If you need to hand over the project due to unforeseeable circumstances, is it easy to find replacement for you, your config, private forks or tweaks?&lt;/p&gt;
&lt;p&gt;Does your choice of programming language or framework leave your colleagues or peers with further technical debt and fewer good options? &lt;em&gt;Sometimes it's better to go with a mainstream choice so that more or more affordable peers can contribute later.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Would your own project tick all the above points to your own satisfaction?&lt;/p&gt;</description><guid>http://erdgeist.org/posts/2022/tools-of-the-trade/</guid><pubDate>Sun, 13 Nov 2022 15:00:00 GMT</pubDate></item><item><title>Gewissensbits</title><link>http://erdgeist.org/posts/2020/gewissensbits/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Gestern erreichte mich eine freundliche E-Mail eines Juristen, der in der &lt;a href="https://www.legal-tech.de/was-ist-legal-tech-ffi/"&gt;Legal-Tech-Szene&lt;/a&gt; aktiv ist. Darin erklärte er, Teil eines Teams zu sein, das im Februar überraschend mit seinem Projekt einen Hackathon gewonnen hätte. Das dort entstandene Tool &lt;a href="https://dickstinction.com"&gt;"Dickstinction"&lt;/a&gt; wurde am Tag der E-Mail &lt;a href="https://netzpolitik.org/2020/dickpics-anzeige-in-fuenf-minuten/"&gt;bei Netzpolitik&lt;/a&gt; behandelt. In der Folge wurden ihm Hinweise zugetragen, nach denen eine gewisse Ähnlichkeit mit dem &lt;a href="https://www.ccc.de/de/updates/2016/der-abmahnbeantworter"&gt;Abmahnbeantworter des CCC&lt;/a&gt; unverkennbar ist. Der wird in dem Artikel bei netzpolitik.org erwähnt, allerdings fälschlicherweise in eine Reihe gestellt mit kommerziellen Projekten. Der Abmahnbeantworter hat aber kein Geschäftsmodell, sondern ist ein kostenloses Angebot an Betroffene von unberechtigten Abmahnungen.&lt;/p&gt;
&lt;p&gt;In der E-Mail entschuldigte sich der Jurist freundlich für die ungefragte Übernahme des Konzepts und bot an, nachträglich einen Hinweis auf den Ideengeber (also uns) auf die Webseite von Dickstinction zu schreiben und unser Projekt fortan in Interviews zu erwähnen, da sich das Team ja stark an der Vorlage des Abmahnbeantworters orientiert habe. Genaues wisse er nicht, da er kein Programmierer sei, aber er wolle auf jeden Fall bescheidgeben und nach meiner Meinung fragen. Soweit total korrekt.&lt;/p&gt;
&lt;p&gt;Der Abmahnbeantworter wurde vor vier Jahren – unter juristischer Beratung von &lt;a href="https://netzpolitik.org/2016/interview-warum-ein-abmahnbeantworter-der-antwortschreiben-generiert/"&gt;RAin Beata Hubrig&lt;/a&gt; und durch Umsetzen des Interface- und Usability-Designs von &lt;a href="https://malik-aziz.de"&gt;Malik Aziz&lt;/a&gt; – nach mehreren Monaten harten Lernens und Testens entwickelt. Ich bin tatsächlich kein Webprogrammierer, sondern eher in C/C++/Assembler zuhause, weswegen der Lernprozess zeitintensiv war. Daher war ich natürlich erstmal interessiert, welche Aspekte des Abmahnbeantworters wohl übernommen worden waren, auch um eventuell selber Ideen für Verbesserungen aufzuschnappen – Konkurrenz belebt ja das Geschäft. Eine kurze Inspektion der Web-Resourcen des Dickstinction-Projekts hat mich dann doch ehrlich erschüttert: Man muss schlicht nur &lt;a href="https://dickstinction.com/js/main.js"&gt;deren main.js&lt;/a&gt; gegen &lt;a href="https://abmahnbeantworter.ccc.de/js/abmahn.js"&gt;unsere abmahn.js&lt;/a&gt; halten oder die Strukturen der jeweiligen HTML-Seiten oder das CSS vergleichen, um in Abgründe zu sehen, derer sich wohl einzig von Guttenberg nicht schämen würde.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://dickstinction.com/faq.html"&gt;der FAQ von Dickstinction&lt;/a&gt; wird neben einem Vorstellungsvideo die Genese des Dickstinction-Projekts kurz umrissen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"Dickstinction haben wir im Februar 2020 im Rahmen des Berlin Legal Hackathon 2020 in weniger als 24h programmiert und damit den ersten Preis gewonnen."&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dazu kann ich nur sagen: &lt;em&gt;Nein, habt ihr nicht!&lt;/em&gt; Programmieren bedeutet eine recht langwierige Arbeit mit Nachdenken, Selbstkorrektur, manchmal ein bisschen Schweiß. Kopieren ist hingegen schnell erledigt.&lt;/p&gt;
&lt;p&gt;Während mir Euer Projekt-Konzept wirklich schwer am Herzen liegt und es mir schon jetzt die Tränen in die Augen treibt, sollte dieser Rant hier dem Projekt schaden, fühlt es sich unendlich mies an, wenn sich (laut der E-Mail zwei) Entwickler für die Präsentation eines dreisten Plagiats beklatschen lassen, in dessen Original ich ehrenamtlich viel Herzblut, monatelange Arbeit und Koordinationsaufwand gesteckt habe. Daher weiß ich übrigens auch, dass man sowas nicht mal eben in einem 24-Stunden-Hackathon runterschreibt. Ich weiß zwar nicht, wer aus der Liste in der FAQ genau die Programmierer sind, die sich an meinem Code bedient haben, aber ich sehe hier erstmal mehrere Probleme, die das Dickstinction-Projekt nun intern klären muss.&lt;/p&gt;
&lt;p&gt;Das alles wirft einen schweren Ballast auf meinen Eifer und mein ehrenamtliches Engagement, vor allem, weil vor drei Jahren bereits ein anderes meiner Open-Source-Projekte als Voll-Plagiat neu-veröffentlicht und vom Plagiator auch noch öffentlich auf allen Kanälen beworben wurde: Das hatte ich damals &lt;a href="http://erdgeist.org/posts/2017/dont-piss-in-my-beer.html"&gt;in einem Blog-Post zu ezjail vs qjail niedergeschrieben&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich habe dem Verfasser der E-Mail geantwortet und meine Gedanken dargelegt.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Zuerst: Ich persönlich bin eigentlich kein Web-Programmierer, daher macht es mir eher Angst, wenn mein Web-Code von Leuten verwendet wird, die von den intrinsischen Annahmen über dessen Verwendung wenig Ahnung haben. Es ist eben keine Software-Bibliothek, was sich auch in der eher unterdurchschnittlichen Kommentierung und Dokumentation niederschlägt. Weil es eben nicht zum Wiederverwenden gedacht war, habe ich mir auch keine Gedanken um eine Lizenz gemacht. Ich bin schlicht nicht davon ausgegangen, dass sich jemand daran "orientiert" oder es eben komplett kopiert.&lt;/p&gt;
&lt;p&gt;Das bringt mich nun in eine blöde Lage. Normalerweise veröffentliche ich meine Open-Source-Projekte (https://erdgeist.org so der Abschnitt links) unter der Beerware-Lizenz https://erdgeist.org/beerware.html, was grundsätzlich Public-Domain mit der Ausnahme Namensnennung ist. Am Projekt selber steht aus o. g. Gründen keine Lizenz dran, was grundsätzlich ja erstmal bedeutet, dass wir am Code volles Urheber- und Verwertungsrecht haben. Natürlich wollen wir das nicht hart geltend machen, aber … als Open-Source-Coder hat man quasi nicht viel außer Reputation, und es fühlt sich nicht cool an.&lt;/p&gt;
&lt;p&gt;Was mich noch mehr bewegt, IHR müsst ja erstmal irgendwie damit umgehen, dass ihr mit einem Plagiat Eurer beiden Entwickler einen ersten Platz bei einem Hackathon belegt habt. Das schmälert nicht die Leistung derer, die am Ende die Projekt-Idee entwickelt haben. Aber ich denke, für den Gewinn eines Hackathons sollten die Programmierer schon ein bisschen mehr vorzuweisen haben als "ich habe ein fremdes Projekt genommen, andere Farben rangemacht und meinen Namen drangeschrieben".&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Es gibt außer sonst nur leichten optischen Änderungen übrigens eine nicht ganz unwichtige Abweichung zwischen dem Abmahnbeantworter und Dickstinction: Die gloriosen Hackathon-Gewinner haben sich immerhin die Zeit genommen, das Google-Tracking (firebase) zu integrieren. Ob das eine gute Idee ist, die Penisbilder-Informationen in die Vereinigten Staaten zu übermitteln, will ich nicht weiter kommentieren. Selbstverständlich findet beim Abmahnbeantworter keinerlei Tracking statt.&lt;/p&gt;
&lt;p&gt;Ich werde rechtlich nicht gegen das Projekt vorgehen, sondern unterstütze die Intention weiterhin. Aber diese Art, für den billigen Ruhm beim Hackathon bei anderen Leuten zu klauen, darf nicht zum Standard werden. Deswegen kann ich auch nicht dazu schweigen, wenn ich derjenige bin, von dem dreist kopiert wurde. Ich denke sogar: Man darf dazu nicht schweigen, denn dann machen solche Leute einfach weiter wie bisher.&lt;/p&gt;
&lt;p&gt;Und während in der E-Mail noch der Hinweis auf den nichtkommerziellen Hintergrund des Projekts kam:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wie ihr sehen könnt, dient die nicht-kommerzielle Seite einem guten Zweck, weshalb wir uns über die Nutzungsmöglichkeit sehr freuen würden!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;, deutet die &lt;a href="https://twitter.com/legaltechcenter/status/1233129959474057216"&gt;Übergabe des Gewinnerschecks in Höhe von 2000 €&lt;/a&gt; darauf hin, dass sich die Projektbeteiligten das eine oder andere Spielzeug shoppen gehen konnten. Natürlich kommt es mir nicht darauf an, das Geld jetzt selber einzustreichen, aber ich habe so ein Bauchgefühl, wo es korrekterweise nicht hingehört. Und auch für die Zukunft würde ich mir wünschen, dass &lt;a href="https://legal-tech-verzeichnis.de/fachartikel/interview-mit-dem-gewinner-des-berlin-legal-hackathon-2020-dickstinction/"&gt;der Austausch mit Unternehmen für weitere Features&lt;/a&gt; den "nicht-kommerziellen" Hintergrund des Projekts nicht korrumpiert.&lt;/p&gt;
&lt;p&gt;Im selben Interview finden sich auch besorgniserregende Informationshäppchen. Die verklausulierte Perspektive:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rein rechtlich finden wir diesen aber besonders spannend, weil man sich auf elegante Weise den Möglichkeiten des Strafprozessrechts bedienen kann, um einen zivilrechtlichen Anspruch durchzusetzen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;bedeutet letztendlich nichts anderes, als auf dem automatisierten Generator ein eigenes kostenpflichtiges Abmahn-Modell zu begründen. Ein zuckersüßes Sahnehäubchen ins Gesicht unserer ursprünglichen Bemühungen, den Abmahnwahn einzudämmen.&lt;/p&gt;
&lt;p&gt;Was die Mädels und Jungs bei Dickstinction jetzt draus machen, wird sich zeigen.&lt;/p&gt;
&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;Inzwischen habe ich von einem der Programmierer, Stefan B, eine E-Mail bekommen, in der er die Geschichte als kleines Versehen abtut und mich bittet, doch nachträglich die Engine als Open-Source-Projekt zu veröffentlichen und ihnen die Nutzung zu erlauben.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Was hältst du davon den Code der Seite unter einer Open-Source Lizenz zu veröffentlichen, sodass jeder diesen nutzten und weiterentwickeln kann? &lt;/p&gt;
&lt;/blockquote&gt;</description><guid>http://erdgeist.org/posts/2020/gewissensbits/</guid><pubDate>Sat, 18 Jul 2020 16:00:00 GMT</pubDate></item><item><title>Selbstausbeuter</title><link>http://erdgeist.org/posts/2018/selbstausbeuter/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;In einer Welt des Kommerz einen nicht- oder antikommerziellen Kosmos zu pflegen, ist hart. Die Menschen, die sich in dieser besonderen Sphäre zusammenfinden, wie wir sie auf unseren CCC-Veranstaltungen seit Jahren hochhalten, kommen aus den unterschiedlichsten Schichten und leben im Rest des Jahres nicht im luftleeren Raum. Sie müssen sich ernähren, müssen wohnen und wollen gesellschaftliche Teilhabe auch an Ereignissen, bei denen sie nicht – wie bei Camp und Congress und viele der kleineren CCC-Veranstaltungen – bewusst subventioniert werden. Doch auf unseren Veranstaltungen müssen wir alle damit klarkommen, das Spannungsfeld von deutlichen Wohlstandsunterschieden und die Auswirkungen von Lebensentwürfen mit unterschiedlicher Zeitflexibilität hautnah mitzuerleben.&lt;/p&gt;
&lt;p&gt;Wir sehen unsere Veranstaltungen als solidarisch organisierte Ereignisse, bei denen Teilnehmer mit mehr finanziellen Resourcen regelmäßig mehr geben – sei es direkt beim Solidar-Eintrittspreis oder beim großzügigeren Merch-Kauf – als Teilnehmer mit weniger flexiblen Möglichkeiten. Für besondere Härtefälle versuchen wir zudem seit Jahren, &lt;a class="reference external" href="http://erdgeist.org/2009/11/13/bilanzbalance/"&gt;faire Möglichkeiten anzubieten&lt;/a&gt;, sich an den unvermeidlichen Kosten der Veranstaltung im Rahmen der eigenen finanziellen Kräfte zu beteiligen. Auch wenn sich hundert Euro pro Jahr erträglich anhören, gibt es genug Lebenskünstler und Hacker, für die dieser Zehner im Monat einen bedeutenden Einschnitt bedeutet.&lt;/p&gt;
&lt;p&gt;Dass wir trotzdem mit einem konkurrenzlos fairen Eintritt von rund hundert Euro für vier Tage Konferenz hinkommen, liegt an der beeindruckenden, sich selbst organisierenden freiwilligen Arbeit der inzwischen tausenden Helfer. Und diese sind dazu natürlich nicht für jede beliebige Veranstaltung bereit, sondern spenden ihre Zeit und Energie einer Community, der sie gern angehören. Niemand mag es aber, ausgenutzt zu werden. Unser Experiment funktioniert nur deshalb so gut, weil wir seit Jahren offensiv vorleben, und auch sozial kontrollieren, dass dieses ehrenamtliche, unbezahlte Engagement vieler nicht von einzelnen anderen monetarisiert wird. Denn in dem Moment, wo Zweifel aufkommen, ob die Orga Entscheidungen trifft, um sich selber zu bereichern, oder wenn geduldet wird, dass sich jemand innerhalb der Veranstaltung oder am Namen bereichern möchte – da liegt ja schließlich buchstäblich das Geld auf der Straße – , bricht die einzigartige Kultur des nicht-kommerziellen Raums zusammen.&lt;/p&gt;
&lt;p&gt;Nun ist es so, dass auch die Menge Freizeit, die ein Einzelner in sein Ehrenamt (und als solches sehen wir den Beitrag zu den C3) investieren kann, je nach Hintergrund schwankt. Alleine zu den Orga-Treffen aus der Bundesrepublik anzureisen, ist zeitlich und finanziell anstrengend und wird daher von uns gefördert. Einige Menschen werden von den Mechanismen der "hochflexiblen" Arbeitswelt täglich von 7-17 Uhr plus Anfahrt ausgelaugt, haben familiäre Verpflichtungen und können sich vielleicht nur an Wochenenden voll einbringen, andere hingegen haben hochspezialisierte Jobs, kommen mit moderatem Zeiteinsatz finanziell gut über die Runden und können daher mehr oder regelmäßiger Energie in unser gemeinsames Projekt stecken.&lt;/p&gt;
&lt;p&gt;Und hier liegt die größte Gefahr für das Gerechtigkeitsempfinden: Wer seine Resourcen überschätzt (und das ist nicht als Vorwurf an die Freiwilligen zu verstehen) und sich in unserer Szene in einem Maße einbringt, wie es ihnen andere mit zeitflexibleren Umständen vorleben, kann schnell an die Grenzen seiner Möglichkeiten kommen. Ich habe es in meinem Umfeld mehrfach gesehen, dass sich gerade in Jahren mit Congress- und Camp-Vorbereitung Freunde Hals über Kopf in den Orgatrubel gestürzt haben statt erwerbszuarbeiten, um dann am Ende des Jahres überrascht auf ihren Kontoauszug zu starren. Mir selber ist es passiert, dass ich nach einem Campsommer mit den über's Jahr mental beiseitesortierten Steuerforderungen konfrontiert wurde und dem Vollzieher Dinge erklären musste.&lt;/p&gt;
&lt;p&gt;Daher denke ich, dass die Szene einen offensiven Umgang mit Freunden braucht, die dabei sind, sich selbst zu verheizen. Es ist total cool, wenn sich jeder im Rahmen seiner Möglichkeiten zu 100 % einbringt – eventuell mit koordinierten und an anderer Stelle wieder aufgefangenen 110 %. Nicht cool ist, wenn wir als Community einige Teilnehmer erst nach einer Phase der Anstrengungen &lt;em&gt;über&lt;/em&gt; ihrem Limit auflesen, wenn sie sich verzweifelt nach einem Lebensunterhalt oder gar einem Schuldenabbauplan umsehen müssen. Der naheliegendste – weil vordergründig gerechte – Weg ist natürlich, die Community mit Verweis auf die Ursachen der Klemme zu aktivieren und mit Crowdfunding oder einem Spendenhut das Schlimmste aufzufangen. Die Hilfsbereitschaft in der Community gibt dies meist auch her.&lt;/p&gt;
&lt;p&gt;Problematisch sind hier aber zwei Dinge: Wenn aus einer kurzfristigen Hilfe in einer Notsituation ein Anspruch extrapoliert wird, landen wir ziemlich schnell bei der Diskussion, ab wann diese teils selbstverschuldeten Umstände keine Hilfe mehr rechtfertigen, oder anders, wie man schon im Vorfeld freiwillige Mithilfe am Projekt zurückweist, bei der abzusehen ist, dass sich der Teilnehmer in eine solche Abhängigkeit begibt.&lt;/p&gt;
&lt;p&gt;Denn wenn die ersten anfangen, ihre Existenz – wenn auch teilweise – an den Erfolg der Community zu hängen, braucht es für die Sicherstellung ihrer Existenz Mittel. Und wenn es Mittel zu verteilen gibt, wird jeder seinen Beitrag mit dem Beitrag dieser anderen vergleichen – nicht mehr seine Möglichkeiten mit denen der anderen – und eine entsprechende Vergütung für sich einfordern. Es bräuchte plötzlich viel mehr Geld und ein striktes Controlling für die zu verteilenden Mittel. Und wenn Teilnehmer dieselben Aufgaben unbezahlt erledigen wie vergütete Mit-Teilnehmer, kommt die berechtigte Frage nach dem Warum auf. Die Folge davon ist, dass Teilnehmer anfangen, ihre Beteiligung zu überdenken und zurückzufahren.&lt;/p&gt;
&lt;p&gt;Dieser dem Congress-Gedanken diametral stehende Gegenentwurf – eine Annäherung an so etwas wie reale Personalkosten – würde eine Spirale von zwangsweise darauffolgenden Eintrittspreis-Erhöhungen nach sich ziehen oder schlimmer noch: den Einmarsch von gezielter Werbung, was einem Ende der Unabhängigkeit und Glaubwürdigkeit des Kulturkreises gleichkäme. Bis heute zeichnet sich die ganze Veranstaltung durch eine erfrischende Freiheit von Werbemüll aus – und wir wollen das so behalten. Und an den Preisen deutlich zu drehen, würde wiederum einen Ausschluss von Schwächeren nach sich ziehen – für uns ebenso inakzeptabel.&lt;/p&gt;
&lt;p&gt;Zweitens finde ich bedenklich, dass die Möglichkeiten, die Community zu aktivieren, stark von der Sichtbarkeit (oder Reichweite oder Vernetzung) des Betroffenen abhängt. Im Konkreten: Wenn ein Teilnehmer als Lagerverwalter im LOC nach dem Abbau vor dem Nichts steht, hat er eine viel kleinere Plattform als beispielsweise ich oder bestimmte Teams mit einer starken Außen- oder Innenwirkung (think Podcaster, c3nav, Heralde). Dieser privilegierten Position müssen sich die sichtbaren Helfer bewusst werden, bevor sie diese von uns allen hergestellte Reichweite benutzen, um einen gefühlt gerechtfertigten Ausgleich für ihre Arbeit zu fordern.&lt;/p&gt;
&lt;p&gt;Und wir als Community müssen uns der Aufgabe stellen, offen über Selbstausbeutung zu sprechen, Mithilfe-Angebote kritisch nach der individuellen Nachhaltigkeit hinterfragen und im Zweifel zurückzuweisen.&lt;/p&gt;</description><guid>http://erdgeist.org/posts/2018/selbstausbeuter/</guid><pubDate>Tue, 18 Sep 2018 20:00:00 GMT</pubDate></item><item><title>Wild wild certs</title><link>http://erdgeist.org/posts/2018/wild-wild-certs/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;TLS certificates, not so long ago still a gold mine for shady “trust” resellers, have become a commodity, since &lt;a class="reference external" href="https://letsencrypt.org/"&gt;Let’s encrypt&lt;/a&gt; made it their mission to provide everyone with domain-validated certificates to secure their connections. There’s a &lt;a class="reference external" href="https://letsencrypt.org/docs/client-options/"&gt;plethora of useful tools&lt;/a&gt; to keep your certs up-to-date. I for my part favour the bash-only &lt;a class="reference external" href="https://github.com/lukas2511/dehydrated"&gt;dehydrated&lt;/a&gt; and even wrote a &lt;a class="reference external" href="http://erdgeist.org/posts/2017/just-add-water.html"&gt;tiny guide&lt;/a&gt; how to get it running on FreeBSD using privilege separation (i.e. not as root).&lt;/p&gt;
&lt;p&gt;Now all was well and I deployed this everywhere until I stumbled over a project where users could create their own team-sites on demand, having their own subdomain. But because acme – the protocol behind Let’s encrypt – did not support wild card certs, I would (at least in theory) have created a different cert for each of these domains, or at least have their sub domain added to the SubjAltName list of the web server’s cert. Which is what I grudgingly did for a while: Identify the most active team sites and manually add them to the domain name list for my LE certs.&lt;/p&gt;
&lt;p&gt;You can imagine how glad I was when I heard that &lt;a class="reference external" href="https://community.letsencrypt.org/t/acme-v2-production-environment-wildcards/55578"&gt;acme v2&lt;/a&gt; added support for wild card certs. Until I noticed that they require a new authentication method over DNS to provide them. What the hell were they smoking? In order to renew your wild card cert every 90 days, you would need to allow unattended updates to your name server from the server taking care of the renewals. To understand, what a stupid idea the is, look no further than at the proliferation of plugins of varying software quality now scripting &lt;a class="reference external" href="https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks"&gt;DNS service updates&lt;/a&gt; for dehydrated.&lt;/p&gt;
&lt;p&gt;In every remotely sane setup you would separate the services so that your web server wouldn’t need to know about its name server, let alone have access and credentials to update it. With the old acme http-01 protocol, the instance handling nearly every aspect of TLS anyway – in my case nginx – would be the only service involved, allowing for some neat separation: Only the &lt;cite&gt;.well-known&lt;/cite&gt; directory would need to have a letsencrypt specific ownership.&lt;/p&gt;
&lt;p&gt;A much less intrusive solution would have been to just require a static TXT record in your zone, stating that wild card certs are okay in principle (i.e. &lt;cite&gt;_acme.example.com   TXT   "wild card enable"&lt;/cite&gt;) and then have the acme server use the old http-01 mechanism to fetch challenge tokens from one or multiple random sub domains. This should be more than enough to proof that you control wild card dns.&lt;/p&gt;
&lt;p&gt;However now we’re stuck with the less than optimal solution and I still needed a wild card cert. Since I do not directly control the name server, I needed to ask for a delegation. That meant that I would actually have to run a name server for this zone. On my web server. Great!&lt;/p&gt;
&lt;p&gt;After &lt;a class="reference external" href="http://linuxmafia.com/faq/Network_Other/dns-servers.html"&gt;shopping around for a while&lt;/a&gt; I’ve found tinydns, the authoritative name server from the &lt;a class="reference external" href="https://cr.yp.to/djbdns.html"&gt;djbdns&lt;/a&gt; bundle, to still be the least complicated server around. It sports its own very simple &lt;a class="reference external" href="https://cr.yp.to/djbdns/tinydns-data.html"&gt;DNS record description language&lt;/a&gt; (that’s important, if you want to update and create it from simple shell scripts), is really, REALLY tiny and has an excellent security and performance track record. It basically pre-compiles every conceivable DNS response, stores it in an &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Cdb_(software)"&gt;efficient constant single file database&lt;/a&gt; which can be atomically replaced while the server is running, meaning I didn’t have to meddle with permission to send signals to reload the zones.&lt;/p&gt;
&lt;p&gt;Unfortunately, Dan Bernstein, tinydns’ author really likes you to run services the way he considers most convenient, using the &lt;a class="reference external" href="https://cr.yp.to/daemontools.html"&gt;daemon tools package&lt;/a&gt; sporting a steep learning curve. Since tinydns comes as a simple stand alone server, I just wrote a FreeBSD rc-script to start it as the FreeBSD gods have intended services to be started. Just place this file as &lt;cite&gt;/usr/local/etc/rc.d/tinydns&lt;/cite&gt;, set execute (+x) permissions and enable it in rc.conf.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-1" name="rest_code_3a43f4e814684d6095af4b1477347c97-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-1"&gt;&lt;/a&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-2" name="rest_code_3a43f4e814684d6095af4b1477347c97-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-3" name="rest_code_3a43f4e814684d6095af4b1477347c97-3" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-3"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-4" name="rest_code_3a43f4e814684d6095af4b1477347c97-4" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-4"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# PROVIDES: tinydns&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-5" name="rest_code_3a43f4e814684d6095af4b1477347c97-5" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-5"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# REQUIRE: DAEMON cleanvar&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-6" name="rest_code_3a43f4e814684d6095af4b1477347c97-6" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-6"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# BEFORE: LOGIN&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-7" name="rest_code_3a43f4e814684d6095af4b1477347c97-7" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-7"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# KEYWORD: shutdown&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-8" name="rest_code_3a43f4e814684d6095af4b1477347c97-8" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-9" name="rest_code_3a43f4e814684d6095af4b1477347c97-9" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-9"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Add the following to /etc/rc.conf to enable this service:&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-10" name="rest_code_3a43f4e814684d6095af4b1477347c97-10" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-10"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-11" name="rest_code_3a43f4e814684d6095af4b1477347c97-11" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-11"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# tinydns_enable="YES"&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-12" name="rest_code_3a43f4e814684d6095af4b1477347c97-12" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-12"&gt;&lt;/a&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-13" name="rest_code_3a43f4e814684d6095af4b1477347c97-13" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-13"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# tinydns_ip&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-14" name="rest_code_3a43f4e814684d6095af4b1477347c97-14" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# tinydns_root&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-15" name="rest_code_3a43f4e814684d6095af4b1477347c97-15" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-15"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-16" name="rest_code_3a43f4e814684d6095af4b1477347c97-16" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-16"&gt;&lt;/a&gt;.&lt;span class="w"&gt; &lt;/span&gt;/etc/rc.subr
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-17" name="rest_code_3a43f4e814684d6095af4b1477347c97-17" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-17"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-18" name="rest_code_3a43f4e814684d6095af4b1477347c97-18" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-18"&gt;&lt;/a&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tinydns
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-19" name="rest_code_3a43f4e814684d6095af4b1477347c97-19" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-19"&gt;&lt;/a&gt;&lt;span class="nv"&gt;rcvar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tinydns_enable
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-20" name="rest_code_3a43f4e814684d6095af4b1477347c97-20" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-20"&gt;&lt;/a&gt;&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin/tinydns
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-21" name="rest_code_3a43f4e814684d6095af4b1477347c97-21" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-21"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-22" name="rest_code_3a43f4e814684d6095af4b1477347c97-22" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-22"&gt;&lt;/a&gt;&lt;span class="nv"&gt;start_cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tinydns_start
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-23" name="rest_code_3a43f4e814684d6095af4b1477347c97-23" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-23"&gt;&lt;/a&gt;&lt;span class="nv"&gt;pidfile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/run/tinydns
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-24" name="rest_code_3a43f4e814684d6095af4b1477347c97-24" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-24"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-25" name="rest_code_3a43f4e814684d6095af4b1477347c97-25" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-25"&gt;&lt;/a&gt;load_rc_config&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$name&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-26" name="rest_code_3a43f4e814684d6095af4b1477347c97-26" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-26"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-27" name="rest_code_3a43f4e814684d6095af4b1477347c97-27" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-27"&gt;&lt;/a&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tinydns_enable&lt;/span&gt;&lt;span class="p"&gt;:=no&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-28" name="rest_code_3a43f4e814684d6095af4b1477347c97-28" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-28"&gt;&lt;/a&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tinydns_ip&lt;/span&gt;&lt;span class="p"&gt;:=0.0.0.0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-29" name="rest_code_3a43f4e814684d6095af4b1477347c97-29" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-29"&gt;&lt;/a&gt;:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tinydns_root&lt;/span&gt;&lt;span class="p"&gt;:=/etc/tinydns/root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-30" name="rest_code_3a43f4e814684d6095af4b1477347c97-30" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-30"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-31" name="rest_code_3a43f4e814684d6095af4b1477347c97-31" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-31"&gt;&lt;/a&gt;tinydns_start&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-32" name="rest_code_3a43f4e814684d6095af4b1477347c97-32" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;IP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tinydns_ip&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ROOT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tinydns_root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;UID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;GID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;/dev/null&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-33" name="rest_code_3a43f4e814684d6095af4b1477347c97-33" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-33"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pidfile&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-34" name="rest_code_3a43f4e814684d6095af4b1477347c97-34" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-34"&gt;&lt;/a&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-35" name="rest_code_3a43f4e814684d6095af4b1477347c97-35" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-35"&gt;&lt;/a&gt;
&lt;a id="rest_code_3a43f4e814684d6095af4b1477347c97-36" name="rest_code_3a43f4e814684d6095af4b1477347c97-36" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_3a43f4e814684d6095af4b1477347c97-36"&gt;&lt;/a&gt;run_rc_command&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I placed my compiled zone file in &lt;cite&gt;/etc/tinydns/root/data.cdb&lt;/cite&gt;, so the paths just work. My uncompiled zone file (i.e. source at &lt;cite&gt;/etc/tinydns/root/data&lt;/cite&gt;) looks like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code text"&gt;&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-1" name="rest_code_57657dd16da6431caa9d5070892c1a96-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-1"&gt;&lt;/a&gt;Zservice.example.com.:ns.service.example.com.:erdgeist@ccc.de.::86400:7200:604800:43200:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-2" name="rest_code_57657dd16da6431caa9d5070892c1a96-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-2"&gt;&lt;/a&gt;&amp;amp;service.example.com.::ns.service.example.com.:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-3" name="rest_code_57657dd16da6431caa9d5070892c1a96-3" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-4" name="rest_code_57657dd16da6431caa9d5070892c1a96-4" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-4"&gt;&lt;/a&gt;+ns.service.example.com.:10.1.1.1:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-5" name="rest_code_57657dd16da6431caa9d5070892c1a96-5" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-6" name="rest_code_57657dd16da6431caa9d5070892c1a96-6" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-6"&gt;&lt;/a&gt;@service.example.com.::mail.service.example.com.:50:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-7" name="rest_code_57657dd16da6431caa9d5070892c1a96-7" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-7"&gt;&lt;/a&gt;@*.service.example.com::mail.service.example.com.:50:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-8" name="rest_code_57657dd16da6431caa9d5070892c1a96-8" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-9" name="rest_code_57657dd16da6431caa9d5070892c1a96-9" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-9"&gt;&lt;/a&gt;+service.example.com.:10.1.1.2:43200
&lt;a id="rest_code_57657dd16da6431caa9d5070892c1a96-10" name="rest_code_57657dd16da6431caa9d5070892c1a96-10" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_57657dd16da6431caa9d5070892c1a96-10"&gt;&lt;/a&gt;+*.service.example.com.:10.1.1.2:43200
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For AAAA records you might pre-compile an answer &lt;a class="reference external" href="https://anders.com/projects/sysadmin/djbdnsRecordBuilder/#AAAA"&gt;here&lt;/a&gt; or use &lt;a class="reference external" href="https://www.fefe.de/dns/"&gt;Fefes tindydns IPv6 patches&lt;/a&gt; for a simpler syntax.&lt;/p&gt;
&lt;p&gt;Once the file is there, you compile it using &lt;cite&gt;tinydns-data&lt;/cite&gt; (within the &lt;cite&gt;/etc/tinydns/root/&lt;/cite&gt; directory. Yay!). Best is to also give it to your letsencrypt user right now.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_bb0890aac3404eec961d4a0285c793c9-1" name="rest_code_bb0890aac3404eec961d4a0285c793c9-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_bb0890aac3404eec961d4a0285c793c9-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root
&lt;a id="rest_code_bb0890aac3404eec961d4a0285c793c9-2" name="rest_code_bb0890aac3404eec961d4a0285c793c9-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_bb0890aac3404eec961d4a0285c793c9-2"&gt;&lt;/a&gt;tinydns-data&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;data.cdb
&lt;a id="rest_code_bb0890aac3404eec961d4a0285c793c9-3" name="rest_code_bb0890aac3404eec961d4a0285c793c9-3" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_bb0890aac3404eec961d4a0285c793c9-3"&gt;&lt;/a&gt;chown&lt;span class="w"&gt; &lt;/span&gt;-R&lt;span class="w"&gt; &lt;/span&gt;letsencrypt&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, you need to add the actual code to your hooks. I just modified the file hook.sh in &lt;cite&gt;/usr/local/etc/dehydrated/&lt;/cite&gt; to read in the &lt;cite&gt;deploy_challenge() {&lt;/cite&gt; function&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_4a60196899554fa58de4a4e6c94b47aa-1" name="rest_code_4a60196899554fa58de4a4e6c94b47aa-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_4a60196899554fa58de4a4e6c94b47aa-1"&gt;&lt;/a&gt;&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"\'_acme-challenge.%s:%s:120\n"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOMAIN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TOKEN_VALUE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/data
&lt;a id="rest_code_4a60196899554fa58de4a4e6c94b47aa-2" name="rest_code_4a60196899554fa58de4a4e6c94b47aa-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_4a60196899554fa58de4a4e6c94b47aa-2"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/
&lt;a id="rest_code_4a60196899554fa58de4a4e6c94b47aa-3" name="rest_code_4a60196899554fa58de4a4e6c94b47aa-3" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_4a60196899554fa58de4a4e6c94b47aa-3"&gt;&lt;/a&gt;tinydns-data&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/data.cdb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and for later cleanup in the &lt;cite&gt;clean_challenge() {&lt;/cite&gt; function I added&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_240a627b90be4596997fdaf9bfb0b22b-1" name="rest_code_240a627b90be4596997fdaf9bfb0b22b-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_240a627b90be4596997fdaf9bfb0b22b-1"&gt;&lt;/a&gt;sed&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/_acme-challenge/d'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/data
&lt;a id="rest_code_240a627b90be4596997fdaf9bfb0b22b-2" name="rest_code_240a627b90be4596997fdaf9bfb0b22b-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_240a627b90be4596997fdaf9bfb0b22b-2"&gt;&lt;/a&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/
&lt;a id="rest_code_240a627b90be4596997fdaf9bfb0b22b-3" name="rest_code_240a627b90be4596997fdaf9bfb0b22b-3" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_240a627b90be4596997fdaf9bfb0b22b-3"&gt;&lt;/a&gt;tinydns-data&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/tinydns/root/data.cdb
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After all is set and done, you need to change the default scheme to dns-01 in your dehydrated config (which is kind of silly, because all other domains on that nginx host require http-01 auth, but maybe there’ll be a patch to dehydrated to support multiple challenge types in the same config). I just changed the config line for &lt;cite&gt;CHALLENGETYPE&lt;/cite&gt; line to read &lt;cite&gt;CHALLENGETYPE="dns-01"&lt;/cite&gt; in my &lt;cite&gt;/usr/local/etc/dehydrated/config&lt;/cite&gt;. I also enabled the &lt;cite&gt;HOOK=/usr/local/etc/dehydrated/hook.sh&lt;/cite&gt; line.&lt;/p&gt;
&lt;p&gt;Then you can just run&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code sh"&gt;&lt;a id="rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-1" name="rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-1" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-1"&gt;&lt;/a&gt;su&lt;span class="w"&gt; &lt;/span&gt;letsencrypt
&lt;a id="rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-2" name="rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-2" href="http://erdgeist.org/posts/2018/wild-wild-certs/#rest_code_6d985a9c6c534f8188f6a2b4a00b37d0-2"&gt;&lt;/a&gt;dehydrated&lt;span class="w"&gt; &lt;/span&gt;-c
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and enjoy your wild card certs.&lt;/p&gt;</description><guid>http://erdgeist.org/posts/2018/wild-wild-certs/</guid><pubDate>Sun, 09 Sep 2018 13:30:00 GMT</pubDate></item><item><title>Kinderkrankheiten</title><link>http://erdgeist.org/posts/2018/kinderkrankheiten/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Nachdem ich jetzt zwei Jahre mit meinem Elektroroller &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; quasi täglich &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; durch die Stadt gleite, ist es Zeit für eine Retrospektive. Ich habe lange überlegt, ob ich meine Erfahrungen mit meinem speziellen Modell so allgemeingültig zusammenfassen kann. Zudem bin ich kein erfahrener Produkttester und würde ungern unnötig Werbung oder Schmäh für einen Anbieter verbreiten. Da ich aber wieder an jeder zweiten Kreuzung von nebenan wartenden Leihroller-Fahrern über mein Moped ausgefragt werde, kann ich auch mal allen eine Zusammenfassung dalassen: Ich habe mir vor zwei Jahren einen Unu-Roller mit einem 3kW-Motor gekauft und einen zweiten Akku dazu.&lt;/p&gt;
&lt;p&gt;Die wichtigsten Kenndaten &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;: nominelle Reichweite mit beiden Akkus 100 km, realistisch: 80 km. Die letzten fünf Kilometer fährt man nur noch 20 km/h. Ladegeschwindigkeit (pro Akku) sind 10 km/h, zweites Ladegerät zu kaufen lohnt, Y-Kaltgeräte-Adapter für die Reise auch. Akku wiegt so 8-9 kg, kriegt man mit Tragegurt (ist bei) auch mal zwei Treppen hoch. Moped wiegt weniger als ich.&lt;/p&gt;
&lt;p&gt;Zuallererst: Im realen Leben ist die Reichweitenangst vollständig unbegründet. In den letzten zwei Jahren Regulärbetrieb bin ich genau einmal liegengeblieben. Hört sich erstmal doof an, heißt aber nur, dass man seinen Akku rausholen per ÖPNV heimbringen, aufladen und zurückbringen muss. Mit meinem Verbrenner bin ich mehrmals im Jahr leergefahren und musste dann tatsächlich schieben oder Kanister organisieren, befüllen und mich mit dem Taxifahrer streiten, die stinkende Plastebox per Kurzstrecke mitnehmen zu dürfen.&lt;/p&gt;
&lt;p&gt;Das Aufladen geht durch einen ganz einfachen Effekt in die tägliche Routine über: Zwischen 75 % und 100 % Akkuladung pumpt der Motor-Controller an der Kreuzung nochmal extra Strom in den Motor, darunter verhält er sich konservativer. Soll heißen: Je voller der Akku, desto mehr Fahrvergnügen an der Ampel. Das konditioniert von ganz alleine darauf, den Akku zum Laden mit reinzunehmen. Für längere Strecken innerhalb der Stadt nehme ich daher immer zwei volle Akkus mit, wenn eins dicke reichen würde.&lt;/p&gt;
&lt;p&gt;Für einen Trip in die Pampa sollte man sich im Umkreis von 75 km ein Restaurant suchen, in dem man seine Akkus aufladen darf. In zwei Stunden bekommt man in der Summe rund 40 km drauf. Der Rest ist Mathematik. Wenn alles gut geht. Bei meinem ersten Testtrip ging leider nicht alles gut. Das Hinterrad hatte aufgrund einer kleinen Delle in der Felge subtilen Luftverlust. Und platte Reifen sind der natürliche Feind der Reichweite. Das kurz vor Bernau festzustellen, brachte mir die ganze Tourplanung durcheinander &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-4" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; und machte, dass ich am Ende doch noch mit der U-Bahn den Akku nach hause fahren musste.&lt;/p&gt;
&lt;p&gt;Das Problem artete sogar noch aus, und das lag absurderweise daran, dass ich mein Moped ganz leise wollte. Die meisten E-Roller kommen mit einem unangenehmen Plaste-Surren daher. Da ich mich nach zwei Jahrzehnten Rasselmotor Fahren darauf gefreut hatte, majestätisch durch die Nacht zu gleiten, sind diese Roller ein No-go für mich. Das Geräusch stammt (soweit ich das beobachten konnte) vom Riemenantrieb – der Motor ist unter dem Sitz und die Kraft muss auf's Hinterrad. Die Unus haben hingegen einen Nabenmotor direkt im Rad eingebaut und produzieren außer dem Reifen-Fahrbahn-Geräusch &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-5" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; keinen Ton. Leider hat sich Unu entschieden, die Felge fest auf dem Motor zu verschweißen. In der Werkstatt wollten sie daher für die defekte Felge (eBay-Preis gebraucht 'n Zehner) ungefähr den Neupreis des Motors haben. Nach einigem Grübeln kam dann die Werkstatt darauf, die Felge geradezuhämmern und einen Schlauch einzuziehen. Muss man wissen. Seitdem hatte ich keine überraschenden Reichweitenprobleme mehr.&lt;/p&gt;
&lt;p&gt;Unüberraschend kommen die nur im Winter. Kalte Akkus sind zickig – so ab 0 Grad. Nehmt die rein. Eiskalte Akkus machen, dass der Motor kaum noch anzieht und die Reichweite einbricht – wenn man überhaupt noch Lust hat, die auszufahren. Ansonsten ist das Moped auch im Winterbetrieb tauglich. So richtig meterhohen Schnee zum Testen hatten wir leider nicht. Obwohl ich diesen Winter nur schwer testen konnte. Das lag daran, dass man mit dem Unu super einkaufen fahren kann.&lt;/p&gt;
&lt;p&gt;Im Fach unter dem Sitz passen zwei Akkus nebeneinander rein. Wenn man eins rausnimmt, passt ein kompletter Rewe-Einkaufskorb &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-6" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; rein. Und dann ist zwischen den Beinen immer noch Platz. Bei einem späten Einkauf – meine Kaufhalle hat 24/6 auf – habe ich in einer Novembernacht das volle Einkaufsprogramm mitgemacht und mir noch eine TKP &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-7" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; in der linken Hand balanciert. Wie das dann halt so ist, habe ich elegant mit dem Knie den Pizzakarton unglücklich gegen das Lenkrad geschoben, das mich prompt gegen einen fies platzierten Poller lenkte. &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-8" id="footnote-reference-8" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;8&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Die Geschichte des Pärchens, das mir beim Zusammensammeln von Verkleidungsteilen und Einkäufen half, im Tausch gegen die Benutzung meines Mobiltelefons, würde noch einen ganzen Blogpost füllen. Ein paar strukturell wichtige Teile wie Blinker und Fußstellflächen waren ab, daher musste ich zur Werkstatt und wurde dann von den Freuden deutsch-chinesischer Handelsfreundschaft überrascht:&lt;/p&gt;
&lt;p&gt;Unu wechselte Mitte 2017 den Zulieferer für die Ersatzteile, der wiederum eine ganz eigene Idee von Vorratshaltung hatte. Als bei dem die Bestellungen für die Karosserieteile eingingen, fingen die erst an, die Produktion dafür binnen Monatsfrist zu planen. Kurzum: nach einem Vierteljahr hatte ich meinen Roller wieder. Zum Glück war ich ein gut Stück dieser Zeit eh nicht im Lande. Bisschen peinlich ist es trotzdem, wenn sie jetzt auch – nach eigenen Beteuerungen – die Lieferkette wieder im Griff haben.&lt;/p&gt;
&lt;p&gt;Eins noch: Das erste, zu dem mich die mir zugeteilte Bosch-Vertragswerkstatt zu meinem Roller fragte, war der Zustand der Spiegel. Und tatsächlich, so ziemlich alles an den Spiegeln wirkt wacklig: Allein weil das Moped so leicht ist, zittern die Spiegel schon auf asphaltierten Straßen ganz verwirrend, auf Kopfsteinpflaster braucht man sie gar nicht zu benutzen versuchen. Die Konterschrauben unten an den Spiegel muss man mit echtem Werkzeug nachziehen,  sie lösen sich sehr gern von allein. Unu legt aus Verlegenheit schon den passenden 15-er Schlüssel zum Handbuch bei. Die kleinen Blinker/Licht-Konsolen, auf denen sie draufstecken, geben auch irgendwann nach, drehen sich dann so leicht nach vorne und hinten und wurden bei mir schon drei mal gewechselt. Aber dafür sind die Spiegel schick!&lt;/p&gt;
&lt;p&gt;Kurzum, wie das so ist als early adopter einer hippen Technologie: Man macht alle Kinderkrankheiten einmal mit. Zwischendurch war die Frustration durchaus da, mich auch nach anderen Anbietern umzuschauen. &lt;a class="brackets" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-9" id="footnote-reference-9" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;9&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Meine Probleme sind aber fürs erste gelöst, die Lösungen für andere Betroffene runterzuschreiben, war auch Motivation für diesen Text. Ich weiß jetzt nach zwei Jahren ziemlich genau, woran ich bin, meine Akkus tun immer noch und fühlen sich nach zwei weiteren Jahren Stadtbetrieb an. Und auf ein neues Akku- oder Ladesystem umzusteigen, ist mit impliziten Kosten verbunden, zudem würde ich bei anderen Herstellern eben auch nochmal alle Kinderkrankheiten mitnehmen und die wären wiederum neu und überraschend. Daher bleibe ich erstmal bei meinem Model.&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://erdgeist.org/posts/2017/emobil.html"&gt;https://erdgeist.org/posts/2017/emobil.html&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Warum ich den letzten Winter nicht täglich fuhr, erfahrt ihr weiter unten!&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-3"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unumotors.com/de/product/specs"&gt;https://unumotors.com/de/product/specs&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-4"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://twitter.com/erdgeist/status/871031823396220929"&gt;https://twitter.com/erdgeist/status/871031823396220929&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-5"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://de.wikipedia.org/wiki/Reifen-Fahrbahn-Ger%C3%A4usch"&gt;https://de.wikipedia.org/wiki/Reifen-Fahrbahn-Ger%C3%A4usch&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-6"&gt;6&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Also dessen Inhalt. Nicht der Korb.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-7" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-7"&gt;7&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.sueddeutsche.de/stil/tiefkuehlpizza-im-test-salami-taktik-1.2364180"&gt;Tiefkühlpizza.&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-8" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-8"&gt;8&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Zu den Kosten und Effekten der Disziplinierung von Autofahrern &lt;a class="reference external" href="http://itstartedwithafight.de/2017/07/18/was-uns-die-disziplinlosigkeit-von-autofahrern-kostet/"&gt;hier entlang&lt;/a&gt;.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-9" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2018/kinderkrankheiten/#footnote-reference-9"&gt;9&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Unter anderem will &lt;a class="reference external" href="https://www.homeandsmart.de/vespa-elettrica-e-roller-piaggio"&gt;Vespa jetzt mit einem E-Roller rauskommen&lt;/a&gt;.&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;</description><guid>http://erdgeist.org/posts/2018/kinderkrankheiten/</guid><pubDate>Thu, 14 Jun 2018 14:07:00 GMT</pubDate></item><item><title>Just add water</title><link>http://erdgeist.org/posts/2017/just-add-water/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Since &lt;a class="reference external" href="https://letsencrypt.org/"&gt;letsencrypt&lt;/a&gt; has made it easy to actually get the little green lock icon in all the browser, I've deployed it nearly everwhere, where reloading keys every three months is not an issue (looking at you, dovecot and ejabberd). When using FreeBSD, the &lt;a class="reference external" href="http://www.freshports.org/security/dehydrated"&gt;security/dehydrated&lt;/a&gt; port has made things smooth enough for me not to be to afraid to execute it from a periodic script: It only requires bash and curl and can be executed as non-privileged user.&lt;/p&gt;
&lt;p&gt;So here's a step by step instruction how to properly set it up:&lt;/p&gt;
&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;Install the port/package:&lt;/p&gt;
&lt;pre class="literal-block"&gt;pkg install dehydrated&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the letsencrypt user, for example:&lt;/p&gt;
&lt;pre class="literal-block"&gt;echo letsencrypt::::::::/bin/sh: | adduser -w random -f -&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create your config copy &lt;code class="docutils literal"&gt;/usr/local/etc/dehydrated/config&lt;/code&gt; by duplicating the example:&lt;/p&gt;
&lt;pre class="literal-block"&gt;cp /usr/local/etc/dehydrated/config.example /usr/local/etc/dehydrated/config&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Edit &lt;code class="docutils literal"&gt;/usr/local/etc/dehydrated/config&lt;/code&gt; so it reads &lt;code class="docutils literal"&gt;CONTACT_EMAIL=me@foo.com&lt;/code&gt;. (Don't forget to remove the # at the line's start.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By default, dehydrated's work dir is &lt;code class="docutils literal"&gt;/usr/local/etc/dehydrated&lt;/code&gt;. I do not like that, because the letsencrypt user needs write access to that directory for its housekeeping files and could modify things like the config and – worse – the &lt;code class="docutils literal"&gt;deploy.sh&lt;/code&gt; script. So I create a different work dir:&lt;/p&gt;
&lt;pre class="literal-block"&gt;mkdir /var/dehydrated
chown -R letsencrypt /var/dehydrated&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And then I change &lt;code class="docutils literal"&gt;/usr/local/etc/dehydrated/config&lt;/code&gt; to read &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;BASEDIR=/var/dehydrated&lt;/span&gt;&lt;/code&gt;. (Again, don't forget to un-comment the line.)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The web directory for challenge replies defaults to &lt;code class="docutils literal"&gt;/usr/local/www/dehydrated&lt;/code&gt;. It needs to be writable by letsencrypt user:&lt;/p&gt;
&lt;pre class="literal-block"&gt;chown -R letsencrypt /usr/local/www/dehydrated&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure domains.txt:&lt;/p&gt;
&lt;pre class="literal-block"&gt;echo 'foo.com www.foo.com' &amp;gt; /var/dehydrated/domains.txt&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I want dehydrated to be run weekly by periodic, I also setup the deploy script (see below). I put those lines in &lt;code class="docutils literal"&gt;/etc/periodic.conf&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;weekly_dehydrated_enable="YES"
weekly_dehydrated_user="letsencrypt"
weekly_dehydrated_deployscript="/usr/local/etc/dehydrated/deploy.sh"&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The deploy.sh script needs to be setup, it will tell all frontends to reload certs. For my nginx installations, it is enough to put this into &lt;code class="docutils literal"&gt;/usr/local/etc/dehydrated/deploy.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;#!/bin/sh

/usr/sbin/service nginx reload&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don't forget execute permissions:&lt;/p&gt;
&lt;pre class="literal-block"&gt;chmod +x /usr/local/etc/dehydrated/deploy.sh&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, for nginx to correctly route requests to the web dir, add this to your server block. Don't forget to enable &lt;code class="docutils literal"&gt;listen 80&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;location /.well-known/acme-challenge/ {
    alias /usr/local/www/dehydrated/;
}&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before running dehydrated for the first time, you should reload your nginx config. This also is an implicit check for correct permissions on &lt;code class="docutils literal"&gt;deploy.sh&lt;/code&gt; ;):&lt;/p&gt;
&lt;pre class="literal-block"&gt;/usr/local/etc/dehydrated/deploy.sh&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run dehydrated to set up and agree to terms and conditions:&lt;/p&gt;
&lt;pre class="literal-block"&gt;su letsencrypt -c 'dehydrated --register --accept-terms'&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then run it again to actually do a challenge/response and generate certs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;su letsencrypt -c 'dehydrated -c'&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If everything went fine, tell nginx to use the new certs in your server block. Don't forget to enable &lt;code class="docutils literal"&gt;listen 443 ssl&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="literal-block"&gt;ssl_certificate /var/dehydrated/certs/www.foo.com/fullchain.pem;
ssl_certificate_key /var/dehydrated/certs/www.foo.com/privkey.pem;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make nginx use your new certs:&lt;/p&gt;
&lt;pre class="literal-block"&gt;/usr/local/etc/dehydrated/deploy.sh&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You should be able to see your web site with a little green lock icon now, carrying a letsencrypt cert.&lt;/p&gt;
&lt;p&gt;In order to verify that all your setups have been setup correctly, I wrote a script that checks them all:&lt;/p&gt;
&lt;pre class="literal-block"&gt;HOSTS="mail.foo.com:25:smtp mail.foo.com:imaps www.foo.com jabber.foo.com:5232"
unset LANG LC_CTYPE LC_MESSAGES LC_TIME

for host in $HOSTS; do
  unset starttls
  [ ${host%:*} = ${host} ] &amp;amp;&amp;amp; host=${host}.:443
  if [ ${host%*:*:*} != ${host} ]; then
    starttls="-starttls ${host#*:*:} "
    host=${host%:*}
  fi
  echo $host ${starttls}
  notafter=$( yes q | openssl s_client -servername ${host} -connect ${host} ${starttls} 2&amp;gt;/dev/null | openssl x509 -noout -enddate | grep ^notAfter= | cut -d = -f 2- )
  secs=$( date -j -f "%b %d %T %Y %Z" "${notafter}" +%s )
  now=$( date +%s )
  printf "% 4d days .. until %s\n" $(( (secs - now) / 86400 )) "${notafter}"
done&lt;/pre&gt;</description><guid>http://erdgeist.org/posts/2017/just-add-water/</guid><pubDate>Thu, 24 Aug 2017 17:07:00 GMT</pubDate></item><item><title>Running poudriere in ezjail</title><link>http://erdgeist.org/posts/2017/poudriere-in-ezjail/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Ever since &lt;a class="reference external" href="https://github.com/freebsd/poudriere"&gt;poudriere&lt;/a&gt; was published, I felt the obligation to run a public repository with packages tuned to my needs (i.e. without X11, without Java, with a certain TLS library as default, etc). But considering this tool's complexity, I never felt comfortable running it on a production system's host. So naturally I've been looking for a way to jail it away and only 2 years after &lt;a class="reference external" href="https://github.com/freebsd/poudriere/wiki/poudriere_in_jail"&gt;this tutorial&lt;/a&gt; outlined how that works, I managed to acutally try it out. Long story short: This guide kinda works and I got poudriere running in a jail. But I want the jail to automatically start up, get the correct dataset attached and receive all permissions needed to do zfs stuff and creating its own builder jails, in other words: I wanted to embed it as an ezjail.&lt;/p&gt;
&lt;p&gt;Now, turns out, that's actually not so hard: If you're running ezjail with zfs enabled, you first create the dataset for poudriere to work on:&lt;/p&gt;
&lt;pre class="literal-block"&gt;zfs create -o jailed=on tank/poudriere&lt;/pre&gt;
&lt;p&gt;then you just create your poudriere jail, making sure to pass it an ::1 IP address:&lt;/p&gt;
&lt;pre class="literal-block"&gt;ezjail-admin create -c zfs poudriere 127.0.0.1,lo0|::1&lt;/pre&gt;
&lt;p&gt;and then manually edit the two config lines in &lt;code class="docutils literal"&gt;/usr/local/etc/ezjail/poudriere&lt;/code&gt; to read:&lt;/p&gt;
&lt;pre class="literal-block"&gt;export jail_poudriere_parameters="children.max=10 allow.mount=1 allow.mount.devfs=1 allow.mount.procfs=1 allow.mount.zfs=1 allow.mount.nullfs=1 allow.raw_sockets=1 allow.socket_af=1 allow.sysvipc=1 allow.chflags=1 enforce_statfs=1"
export jail_poudriere_zfs_datasets="tank/poudriere"&lt;/pre&gt;
&lt;p&gt;dont forget that this jail needs a resolv.conf, too and now you can just:&lt;/p&gt;
&lt;pre class="literal-block"&gt;ezjail-admin console -f poudriere&lt;/pre&gt;
&lt;p&gt;and follow &lt;a class="reference external" href="https://www.freebsd.org/doc/handbook/ports-poudriere.html"&gt;the FreeBSD handbook section on poudriere&lt;/a&gt; to get your poudriere jobs running. Since I wanted the web server jail to serve the packages, I exposed them in &lt;code class="docutils literal"&gt;/etc/fstab.www_domain.com&lt;/code&gt; by adding a line:&lt;/p&gt;
&lt;pre class="literal-block"&gt;/usr/jails/poudriere/tank/poudriere/data/packages /usr/jails/www.domain.com/packages nullfs ro 0 0&lt;/pre&gt;
&lt;p&gt;and after an &lt;code class="docutils literal"&gt;&lt;span class="pre"&gt;ezjail-admin&lt;/span&gt; restart www.domain.com&lt;/code&gt;, you should be able to use the packages built by adding a &lt;code class="docutils literal"&gt;/usr/local/etc/pkg/repos/www.conf&lt;/code&gt; of:&lt;/p&gt;
&lt;pre class="literal-block"&gt;www: {
  url: "file:///packages/103amd64-local-workstation/",
  enabled: yes
}&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Update:&lt;/em&gt; Should you be missing the file systems inside your poudriere jail, make sure to mount them in your periodic script that runs poudriere (using &lt;code class="docutils literal"&gt;zfs mount &lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/code&gt;, before running poudriere), or take a look at &lt;a class="reference external" href="https://elektropost.org/ezjail/msg00902.html"&gt;the thread on the ezjail mailing list&lt;/a&gt; regarding rc.d/zfs not finding the dataset when it's run.&lt;/p&gt;</description><guid>http://erdgeist.org/posts/2017/poudriere-in-ezjail/</guid><pubDate>Sun, 06 Aug 2017 19:42:00 GMT</pubDate></item><item><title>Sonne im Tank</title><link>http://erdgeist.org/posts/2017/emobil/</link><dc:creator>erdgeist</dc:creator><description>&lt;p&gt;Seit September bin ich e-mobil. Ich bin mein ganzes Führerschein tragendes Leben lang auf Mopeds durch Berlin geheizt, beginnend bei einer &lt;a class="reference external" href="https://de.wikipedia.org/wiki/Simson_Schwalbe"&gt;Schwalbe&lt;/a&gt;, seitdem immer mit lauten und müffelnden Zweitaktern – bei entsprechendem Verschleiß. Ich wollte vermeiden, mehrere Tonnen Stahl durch die Gegend zu hieven, wenn ich doch nur meinen Hintern von A nach B bewegen wollte, und habe daher trotz mehrerer Autos auch immer noch als primäres Fortbewegungsmittel ein Moped beibehalten. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-1" id="footnote-reference-1" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;1&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Trotzdem ist der wohlige Geruch von Zweitaktabgasen, der harmonische und weit wahrnehmbare Klang nicht unbedingt das Omen, das man seiner Ankunft voraussenden möchte – und die Wartungsanfälligkeit dieses fragilen Haufens beweglicher Teile ließ mich schon vor einer Weile die Fühler in Richtung Elektroroller ausstrecken.&lt;/p&gt;
&lt;p&gt;Zwar gab der Markt seit sechs, sieben Jahren auch welche her – allerdings schreckten die Preise im Bereich einer Kleinwagenneuanschaffung ab und meine guten Vorsätze verschwanden schnell wieder in der Schublade. Und die frühen Reichweiten-Angebote von so 25 bis 30 Kilometern haben nichts mit den Strecken zu tun, die ich an einem terminlich gut befüllten Tag in Berlin so in die Reifen schrubbe. Mein Reichweiten-Maßstab ist die Sommerresidenz von Freunden nahe Berlin, für die ich rund 80 Kilometer runterreißen muss – jaja, kein Spaß auf einem geschwindigkeitsbegrenzten Kraftfahrzeug, und auch auf meinen Verbrennern hatte ich unterwegs schon eine Stammtankstelle auserkoren. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-2" id="footnote-reference-2" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;2&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Aber zumindest kann ich mal eben ranfahren, "Kaffee" kaufen und weiterfahren. "Mal eben" Akkus aufladen kannste hingegen knicken.&lt;/p&gt;
&lt;p&gt;Schon vor ein paar Jahren &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-3" id="footnote-reference-3" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;3&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; startete die Firma Gogoro in Taipei einen Dienst, bei dem man sich um das Laden nicht mehr kümmern muss, sondern die Akkus an Straßenecken im Späti leer gegen voll tauschen kann. Die sind nun als Mietmobile nach Berlin expandiert &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-4" id="footnote-reference-4" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;4&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, jedoch finde ich die weder gutaussehend noch gutklingend. Aber hohe Absatzzahlen ziehen ja auch immer sinkende Preise nach sich und richtig:&lt;/p&gt;
&lt;p&gt;In den letzten Jahren hat sich da so richtig was getan: Die Preise für Elektromotoren und Batterien sind gepurzelt – nicht zuletzt durch die krassen E-Mobilisierungsprogramme in China und Indien &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-5" id="footnote-reference-5" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;5&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, Ladezeiten und Energiedichten kommen in erträgliche Größenordnungen und ein Berliner Unternehmen bietet Hipster-geeignete Scooter zum Kampfpreis an. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-6" id="footnote-reference-6" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;6&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; In der Rechts-Unten-Vollausstattung mit zwei Akkus ist man schon mit 3,5 k€ &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-7" id="footnote-reference-7" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;7&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; dabei – das ist nur marginal mehr, als ich in meine alten Benziner investiert habe. Und das liegt vor allem daran, dass an so einem E-Roller nix mehr dran ist:&lt;/p&gt;
&lt;p&gt;Nabenmotor im Hinterrad nebst Motorsteuerung, einigermaßen stabiler leichtgewichtiger Rahmen, quasi ein besseres Fahrrad, Akkufach und Sattel. Also habe ich zugeschlagen und fahre seit September quasi durchgängig E-Roller im Berufsverkehr. Und ja, es rockt: Kaum bewegliche Teile, so ein Elektromotor ist im Vergleich zu einem Verbrenner trivial und hält gern mal zig Jahre. Gut, bisschen Bremskram, Tacho und Verkleidung, aber im Prinzip war's das. Und als mir das Akkufach wegen eines unglücklichen Steinschlags an einer Ecke rausgebrochen ist, gab's vom Hersteller ein Paket mit einem tiefgezogenen Plasteteil, das ich mit einem Schraubendreher in 10 Minuten selber tauschen konnte. Ich kann im Prinzip für die nächsten zwanzig Jahre mit dem Gerät fahren, ohne nennenswerte Wartungskosten zu haben.&lt;/p&gt;
&lt;p&gt;Und dann der Verbrauch: Aufladen geht mit 220 V, Netzteil ist bei und lädt in rund vier Stunden voll. Die Hersteller-Angaben von "70 % aufgeladen in einer Stunde" sind doch ein bisschen optimistisch, aber eine komplette Ladung bekomme ich zuhause für rund 30 Cent. Da ich nicht erst tanke, wenn die Akkus leer sind, ist der genaue Preis schwer zu schätzen, aber meine monatlichen Ausgaben für's Tanken sind von 60 Euro auf 6 Euro gesunken. Und das noch in den ersten Monaten, wo mich der Fahrspaß das Moped noch deutlich häufiger benutzen lässt. Und Fahrspaß it is!&lt;/p&gt;
&lt;p&gt;Das Moped, was ich mir ausgesucht habe, ist im Vergleich zu den Leihrollern von eMio und Coup rund 20 % kleiner und deutlich leichter – und jedes am Roller gesparte Kilo muss ich nicht abnehmen, um an der Ampel schneller wegzukommen. Entsprechend saust es sich an der Kreuzung auch los. Danach gleitet man quasi durch den Straßenverkehr und viel toller: durch Parks und über Fahrradwege und Bürgersteige, ohne negativ aufzufallen. Um das Moped am Café abzustellen, bin ich auch schon durch die Stuhlreihen auf dem Gehweh gerollt und niemand hat auch nur geguckt – mit dem 2-Takter undenkbar. Und wenn man einen Sozius an Board hat &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-8" id="footnote-reference-8" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;8&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, ist sogar ein entspanntes Gespräch möglich.&lt;/p&gt;
&lt;p&gt;Tzschja, und der Pferdefuß? Die Reichweiten-Experimente sind nicht vollständig geglückt: Vollständig leer kann (und sollte man) das Akku nicht realistisch fahren, da auf den letzten 15 % Ladestand ein bequemes Fußgängertempo rauskommt &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-9" id="footnote-reference-9" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;9&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;. Und auch dann landet man nicht bei den 50 Kilometern Distanz, sondern eher so bei 45, von denen man nur die ersten 40 vorankommt. Selbst mit den beiden Akkus sind die 80 Kilometer zur Datsche &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-10" id="footnote-reference-10" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;10&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; des Kumpels also nicht (oder nur ohne Bremsen und mit viel Bangen) ohne Zwischenstopp zu erreichen. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-11" id="footnote-reference-11" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;11&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Das heißt, dass ich mir jetzt ein Restaurant suchen muss, wo ich auf dem Weg kurz zum Schnitzel Essen anhalten und währenddessen zwei Akkus kurz-betanken muss. Hmm.&lt;/p&gt;
&lt;p&gt;Auch ansonsten ist die Kapazität noch nicht da, wo man überhaupt nicht mehr drüber nachdenken muss: Die Akkus selber wiegen so acht Kilogramm und kommen mit Henkel: Mit Erdgeschoss-Büro ist das Tauschen schon in die tägliche Routine übergegangen, weil der Motorcontroller auf den ersten 25 % Akku noch einmal spürbar schneller anzieht und daher ein volles Akku spaßsteigernd ist. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-12" id="footnote-reference-12" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;12&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Allerdings ist es nicht so, dass ich ernstlich leide, wenn ich mal zwei Tage das Tauschen vergessen habe, also kein nervöses Hetzen wie beim Smartphone. Was die Kapazität angeht, bin ich verdammt nah am Wohlfühlbereich dran, und wenn von den wöchentlichen Presseberichten über eine Verdopplung und Verdreifachung der Energiedichte in Akkus im Labor &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-13" id="footnote-reference-13" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;13&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; auch nur eins die Serienreife erreicht, erreiche ich die Auftank-Frequenz des Benziners.&lt;/p&gt;
&lt;p&gt;Da ich auch stolzer Winterfahrer bin, habe ich ein paar Erfahrungen mit den Akkus in der Kälte gemacht. Grundsätzlich gilt: Akkus nicht nachts draußen parken. Und wenn man sie tagsüber ein paar Stunden in der Kälte lässt, zieht das Moped nochmal deutlich schlechter an und man verliert bei Frost rund 10 % Reichweite. Kein Showstopper, aber sollte man beachten.&lt;/p&gt;
&lt;p&gt;Das einzige, was mich beim Unu ein bisschen ankekst, ist die Helmsituation. Das Akkufach ist riesig, und wenn man nur einen Akku mitnimmt, hat man echt viel Stauraum für einen mittleren Einkauf. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-14" id="footnote-reference-14" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;14&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; Jedoch ist das Akku quaderförmig hoch (es passen also zwei nebeneinander), was keinen Platz mehr für einen normalen Helm lässt. Sinnigerweise passt der Helm prima rein, wenn kein Akku drin ist: Aber ganz ehrlich schleppe ich lieber Helm statt Akku mit. &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-15" id="footnote-reference-15" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;15&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nun kann ich also mit gutem Beispiel voran Energie sparend durch die Stadt heizen und meine Gesamtökobilanz wieder massieren. Beim Recherchieren bin ich noch auf das offensichtlich weit verbreitete Vorurteil gestoßen, Elektro-Mobile würden ja viel dreckiger betrieben werden, als Benziner, da der Strom aus Kohlekraftwerken käme. Gilt für mich zwar nicht, aber noch krasser ist, dass die meisten Raffinerien Benzin mittels Kohlestrom herstellen &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-16" id="footnote-reference-16" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;16&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt;, der die Bilanz pro Kilometer sofort wieder Richtung Elektro-Mobil korrigiert. Und Meldungen wie die hier &lt;a class="brackets" href="http://erdgeist.org/posts/2017/emobil/#footnote-17" id="footnote-reference-17" role="doc-noteref"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;17&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/a&gt; machen mir Mut, wirklich Sonnenkraft unterm Hintern zu spüren – Proctoheliose FTW!&lt;/p&gt;
&lt;p&gt;Fußnoten:&lt;/p&gt;
&lt;aside class="footnote-list brackets"&gt;
&lt;aside class="footnote brackets" id="footnote-1" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-1"&gt;1&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Als ich mal den Verbrauch meines letzten Mopeds auf 100 km hochgerechnet habe, schlackerten mir aber auch die Ohren. Zweitakter sind wirklich ineffizient.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-2" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-2"&gt;2&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Präteritum und Perfektform von erkiesen. &lt;a class="reference external" href="https://de.wiktionary.org/wiki/erkiesen"&gt;https://de.wiktionary.org/wiki/erkiesen&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-3" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-3"&gt;3&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.intaiwan.de/2016/08/08/gogoro-berlin-e-scooter-elektro-roller/"&gt;http://www.intaiwan.de/2016/08/08/gogoro-berlin-e-scooter-elektro-roller/&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-4" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-4"&gt;4&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.electrive.net/2016/08/02/bosch-startet-elektro-scooter-sharing-namens-coup-in-berlin/"&gt;https://www.electrive.net/2016/08/02/bosch-startet-elektro-scooter-sharing-namens-coup-in-berlin/&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-5" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-5"&gt;5&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="http://business.financialpost.com/news/transportation/fossil-fuel-vehicles-will-vanish-in-8-years-in-twin-death-spiral-for-big-oil-and-big-autos-says-study-that-shocking-the-industry"&gt;http://business.financialpost.com/news/transportation/fossil-fuel-vehicles-will-vanish-in-8-years-in-twin-death-spiral-for-big-oil-and-big-autos-says-study-that-shocking-the-industry&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-6" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-6"&gt;6&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://unumotors.com/"&gt;https://unumotors.com/&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-7" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-7"&gt;7&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Dabei kostet der zweite Akku 700 Euro und das Upgrade von der noch erträglichen 2kW-Motor-Version auf die 3kW-Vollausstattung 500 Euro. Den 1-kW-Motor zum Starterpreis von 1600 Euro will man sich nicht wirklich antun.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-8" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-8"&gt;8&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Für einen Beifahrer muss man sich ob des geringeren Platzangebots sehr lieb haben oder zwei schmale Personen anordnen, sonst heißt es Gepäckträgerberührung.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-9" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-9"&gt;9&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Jaja, ich weiß das daher, dass ich das Akku auch tatsächlich leergefahren habe.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-10" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-10"&gt;10&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Für Wessis: Ferienlaube.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-11" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-11"&gt;11&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Ob das mit einem der beiden Motoren geringerer Leistung möglich gewesen wäre, weiß ich dabei aber nicht.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-12" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-12"&gt;12&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Es kann daher sein, dass die Anzugsfreudigkeit auf den ersten Kilometern in die Reichweite frisst.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-13" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-13"&gt;13&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Citation needed.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-14" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-14"&gt;14&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Der Rest vom Großeinkauf passt bequem zwischen die Füße und in den Rucksack.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-15" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-15"&gt;15&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;Obwohl das im Winter vielleicht doch die bessere Wahl wäre.&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-16" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-16"&gt;16&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.youtube.com/watch?v=BQpX-9OyEr4"&gt;https://www.youtube.com/watch?v=BQpX-9OyEr4&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;aside class="footnote brackets" id="footnote-17" role="doc-footnote"&gt;
&lt;span class="label"&gt;&lt;span class="fn-bracket"&gt;[&lt;/span&gt;&lt;a role="doc-backlink" href="http://erdgeist.org/posts/2017/emobil/#footnote-reference-17"&gt;17&lt;/a&gt;&lt;span class="fn-bracket"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.indy100.com/article/two-thirds-germany-powered-renewable-energy-easter-day-green-7737221"&gt;https://www.indy100.com/article/two-thirds-germany-powered-renewable-energy-easter-day-green-7737221&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;/aside&gt;
&lt;script&gt;
  (function () {
      var FOOTNOTE_REGEX = /^\[[0-9]+\]$/;

      var oldOnLoad = window.onload;
      window.onload = function (event) {
          var elems = document.getElementsByClassName("footnote-reference");
          for (var i = 0; i&lt;elems.length; i++) {
              var elem = elems[i];
              var ptrText = elem.innerHTML;
              if (FOOTNOTE_REGEX.test(ptrText)) {
                  elem.className = "footnote-reference footptr";
                       elem.onclick = toggle;
              }
              elem.setAttribute("href", "#"+ptrText);
          }
          addListItemIds("footnotes", "[", "]");

          if (typeof oldOnLoad === "function") {
              oldOnLoad(event);
          }
      };

      function addListItemIds(parentId, before, after) {
          var refs = document.getElementById(parentId);
          if (refs &amp;&amp; refs.getElementsByTagName) {
              var elems = refs.getElementsByTagName("li");
              for (var i = 0; i&lt;elems.length; i++) {
                  var elem = elems[i];
                  elem.setAttribute("id", before+(i+1)+after);
              }
          }
      }

      var currentDiv = null;
      var currentId = null;
      function toggle(event) {
          var parent = this.parentNode;
          if (currentDiv) {
              currentDiv.parentNode.removeChild(currentDiv);
              currentDiv = null;
          }
          var footnoteId = this.innerHTML.match(/[0-9]+/)[0];
          if (currentId === footnoteId) {
              currentId = null;
          } else {
              currentId = footnoteId;
              currentDiv = document.createElement("div");
              var footElem = document.querySelector('[href$="#id'+currentId+'"]').parentNode.parentNode;
              var footHtml = footElem.childNodes[3].innerHTML;
              currentDiv.innerHTML = footHtml;
              currentDiv.className = "foot-tooltip";
              parent.insertBefore(currentDiv, this.nextSibling);
              setTimeout(function () {
                  currentDiv.style.opacity = "1";
              }, 0);
          }
          event.preventDefault();
      }
  }());
&lt;/script&gt;</description><guid>http://erdgeist.org/posts/2017/emobil/</guid><pubDate>Thu, 25 May 2017 11:06:00 GMT</pubDate></item></channel></rss>