<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Scratchpad</title>
		<link>https://www.toor.su/</link>
		<description>Recent content on Scratchpad</description>
		<generator>Hugo 0.154.5</generator>
		<language>en</language>
		<managingEditor>root@localhost (Fritz Pfiffig)</managingEditor>
		<webMaster>root@localhost (Fritz Pfiffig)</webMaster>
		<lastBuildDate>Sun, 08 Mar 2026 13:33:37 +0100</lastBuildDate>
		<atom:link href="https://www.toor.su/index.xml" rel="self" type="application/rss+xml"/>
		<item>
			<title>Jails without pkg?!</title>
			<link>https://www.toor.su/posts/2026/03/jail-pkg/</link>
			<pubDate>Sun, 08 Mar 2026 13:33:37 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2026/03/jail-pkg/</guid>
			<description>&lt;p&gt;This is interesting:&lt;/p&gt;
&lt;p&gt;I just created a new jail on my server.&lt;/p&gt;
&lt;p&gt;Solely operating from the base system I did the initial
setup of tools like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pkg -j jail install …
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Still from the base system I did that later on:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;jexec jail pkg install …
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At that moment the famous&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The package management tool is not yet installed on your system.&lt;/p&gt;
&lt;p&gt;Do you want to fetch and install it now? [y/N]:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;message came up, installing &lt;code&gt;pkg&lt;/code&gt; inside the jail.&lt;/p&gt;
&lt;p&gt;The reason I write this post: Does it mean it is possible to run jails without
any &lt;code&gt;pkg&lt;/code&gt; installation inside it?
Seems so. Needs further investigation, but I like what I see so far 🙃&lt;/p&gt;
&lt;p&gt;&lt;code&gt;freebsd-version&lt;/code&gt; currently outputs &lt;code&gt;14.3-RELEASE-p9&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;How much &lt;code&gt;pkgbase&lt;/code&gt; is involved there I cannot say, haven&amp;rsquo;t switched to it yet.&lt;/p&gt;
&lt;p&gt;So long&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Ping</title>
			<link>https://www.toor.su/posts/2025/04/ping/</link>
			<pubDate>Fri, 25 Apr 2025 21:21:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2025/04/ping/</guid>
			<description>&lt;p&gt;It&amp;rsquo;s been a while since I&amp;rsquo;ve posted something here,
so it&amp;rsquo;s time to write some update.&lt;/p&gt;
&lt;p&gt;A lot has happened (and still is going on) but regarding this site:
You are reading this from my new server!&lt;/p&gt;
&lt;p&gt;The old server was a fine machine that ran stable for years
(thanks to FreeBSD).
On the other hand, hardware does not get any younger and tends to
wear out over time.&lt;/p&gt;
&lt;p&gt;Also – as that machine had such a long path a lot of (wrong?) choices piled up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switching from manually compiled world, kernel &amp;amp; ports to precompiled ones
was leaving a huge trail of non needed dependencies behind.&lt;/li&gt;
&lt;li&gt;Being stuck on &lt;a href=&#34;https://erdgeist.org/arts/software/ezjail/&#34;&gt;ezjail&lt;/a&gt;
– it is still a fine project and does it&amp;rsquo;s job, but it seems this project
has been abandoned for a long time now.&lt;/li&gt;
&lt;li&gt;Not planning ahead for having a separate partition for generic data was
a crucial mistake. ZFS datasets do ease out the pain, but having just one
for the base system, and another one for the jails does not provide
much freedom. As a result a weird mixture appears storing that data
alongside the jails (or worse inside them) – which leaves you with
ugly and very confusing setup &amp;amp; configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So after some toying around how to setup some native (thick) jails on a
clean base system using a small box at home, everything I needed to know was
there.&lt;/p&gt;
&lt;p&gt;Only thing left was hitting the &amp;ldquo;buy now&amp;rdquo; button for the new server.
Now I have twice the CPU count, RAM amount has doubled and the new disks
are huge. All for roughly the same price as for the old machine.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve estimated it will take me approximately three months to migrate
everything between those servers. In the beginning this assumption seemed
to be correct, as I was struggling to bootstrap a clean FreeBSD installation
(the hosting provider does not offer images for it anymore). But at last
I figured out some way how to bootstrap a clean installation.&lt;/p&gt;
&lt;p&gt;After that things became very easy – as I already had working configuration
for the old machine, the only thing left was to move them over, adjust to new
addresses, and stripping out all that cruft mentioned above. Databases and
static files were copied over via &lt;code&gt;ssh&lt;/code&gt;. Easy as cake.&lt;/p&gt;
&lt;p&gt;Roughly five weeks later everything was set, everything worked, so I was ready
to hit the &amp;ldquo;cancel&amp;rdquo; button for the old server.
I was a little bit sad when I did it, as it was such a great machine.
But well, the new one seems to be even better! Still amazed how blazing fast
that new machine is. So a very good choice in the end.&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Dateien, Ordner, Schmerzen</title>
			<link>https://www.toor.su/posts/2024/02/dateien-ordner-schmerzen/</link>
			<pubDate>Wed, 21 Feb 2024 07:42:23 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2024/02/dateien-ordner-schmerzen/</guid>
			<description>&lt;p&gt;Nach über Tausend&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; Jahren &amp;ldquo;Computer&amp;rdquo; ist es noch immer ein ungelöstes Problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Zwei Computer stehen einen halben Meter nebeneinander.
Wie tauscht man jetzt Dateien aus?!?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ja, dafür gibt es doch Nullmodem-Kabel, Infrarot-Schnittstellen, oder dieses moderne &amp;ldquo;Ethernet&amp;rdquo;.. Schon gehört?
Setz doch &amp;ldquo;einfach&amp;rdquo; einen Samba Server auf, oder schick dir doch selbst eine Mail mit Anhang.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ich kotz im dicken Strahl.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wie? Du willst an beiden Computern die selben Dateien bearbeiten, und es soll immer aktuell bleiben, ohne die immer manuell rüber zu schieben?&lt;/p&gt;
&lt;p&gt;Ach ja? Die Computer sind nicht im selben Netzwerk, und dank IPv4 NAT-Hölle können die sich nicht sehen?&lt;/p&gt;
&lt;p&gt;Stellt sich raus, damals™ hat Dropbox das Problem gelöst..
Aber hey, es kann doch wohl nicht wahr sein, dass &amp;ldquo;der einfachste Weg&amp;rdquo; Dateien von Süderbrarup nach Flensburg zu synchronisieren einmal über den Atlantik und wieder zurück geht.
Wie, was? Datenschutz?!? Nie gehört - Vielleicht doch lieber Google Drive oder OneDrive?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Strahl wird noch dicker!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wir wären ja nicht im &lt;a href=&#34;https://www.toor.su/series/self-host&#34;&gt;Self-Host&lt;/a&gt; Abenteuer, gäbe es nicht doch was brauchbares.&lt;/p&gt;
&lt;p&gt;Es heißt &lt;a href=&#34;https://syncthing.net/&#34;&gt;Syncthing&lt;/a&gt; und es ist sehr gut!&lt;/p&gt;
&lt;p&gt;Was mir sehr viel Freude bereitet - es läuft alles lokal, nur auf Maschinen die man selbst kontrolliert (und nicht über fremde Server in anderen Ländern, auf die irgendwelche Leute im Zweifel zugreifen ohne dass man es weiß).
Noch ein bisschen Kryptographie drüber gestreut, Schlüssel-Austausch wird mittels QR-Codes vereinfacht. Dazu ein offenes Protokoll, mit UPnP zum entkommen aus der IPv4 NAT-Hölle..&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Einfaches Setup&lt;/strong&gt;: Zwei Computer, sonst nix.&lt;/p&gt;
&lt;p&gt;Meine Mutti (die Beste!) hat ein MacBook und eine Wintendo-Maschine am Start. Und möchte den &amp;ldquo;Dokumente&amp;rdquo; Ordner immer gleich haben.&lt;/p&gt;
&lt;p&gt;Also hab ich ihr Syncthing untergejubelt.
Am Mac gibt es ein &lt;a href=&#34;https://formulae.brew.sh/cask/syncthing&#34;&gt;Homebrew Cask&lt;/a&gt; das alles mitbringt, für die Büchse muss man bisschen improvisieren: mit &lt;a href=&#34;https://github.com/canton7/SyncTrayzor&#34;&gt;SyncTrayzor&lt;/a&gt; (oder davor &lt;a href=&#34;https://github.com/sieren/QSyncthingTray&#34;&gt;QSyncthingTray&lt;/a&gt; - Hilfe, diese Namen.. &lt;em&gt;grusel&lt;/em&gt;).
Funktioniert alles wunderbar. Das größte Problem: man muss ab und an mal sicher stellen, dass beide Computer gleichzeitig laufen. Aber wenn man mal zu Hause ist, und Updates installiert und Probleme repariert lässt man beide parallel laufen, dann hat sich das.&lt;/p&gt;
&lt;p&gt;Positiver Nebeneffekt: Die wichtigsten Sachen sind mehrfach gespeichert. Ist nicht direkt ein Backup, das ist klar, aber doch besser als gar nichts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Fortgeschritten&lt;/strong&gt;: Mein Setup (FreeBSD, MacBooks, Linux &amp;amp; iPhone)&lt;/p&gt;
&lt;p&gt;Hab einen FreeBSD Server beim Hoster der immer läuft, also soll dieser doch &amp;ldquo;einmal alles&amp;rdquo; (mit Soße &amp;amp; Scharf) vorhalten, und die anderen Maschinen untereinander koordinieren.&lt;/p&gt;
&lt;p&gt;Also eine neue Jail angelegt, den &lt;code&gt;net/syncthing&lt;/code&gt; Port (mit &lt;code&gt;pkg&lt;/code&gt;) installiert. Dann die passenden Löcher in die Firewall gebohrt, und den Reverse-Proxy mit LetsEncrypt-Zertifikat in die Jail zeigen lassen (&lt;a href=&#34;https://wiki.freebsd.org/syncthing&#34;&gt;Wiki-Seite&lt;/a&gt;). Fertig ist der Karton.&lt;/p&gt;
&lt;p&gt;Auf meinem NAS zu Hause (natürlich auch FreeBSD weil ZFS!) genauso wie oben, bloß ohne Reverse-Proxy; Für die MacBooks gibt es Homebrew (noch weiter oben), für Linux ist was in den jeweiligen Repositories. Alles schick!&lt;/p&gt;
&lt;p&gt;Am iPhone jedoch war es lange Zeit leider echt übel, da gab es nichts, und/oder nichts brauchbares. Irgendwann tauchte aber &lt;a href=&#34;https://www.mobiussync.com/&#34;&gt;Möbius Sync&lt;/a&gt; auf (der Name, das Icon.. &lt;em&gt;grusel&lt;/em&gt;).
Es ist zwar &amp;ldquo;nur&amp;rdquo; die Web-Oberfläche von SyncThing in einem Safari-Frame, jedoch an den entsprechenden Stellen so modifiziert, damit dann alles funktioniert. Letztendlich landen die Dateien im App-Bundle der &lt;em&gt;Files.app&lt;/em&gt; und sind dadurch von überall erreichbar. Wunderbar!
Es lohnt sich da auch Geld einzuwerfen - die App wird aktiv entwickelt und funktioniert bei mir schon seit Jahren ohne Probleme.
Das einzig nervige ist - ab und an muss man die App manuell starten: iOS Akku sparen und Hintergrund-Prozesse kommen nicht so gut miteinander klar. Aber gut, so ist es halt.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Sonst so&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Das Leben macht man sich einfacher, wenn man den Server als &amp;ldquo;Introducer&amp;rdquo; an den anderen Computern einträgt, und ggf. das &amp;ldquo;Auto Accept&amp;rdquo; Setting anschaltet. Somit werden neue geteilte Ordner automatisch bei den anderen Computern zum Austausch angeboten und man spart sich den Weg über die QR-Codes.
Auch hab ich meist &amp;ldquo;Staggered File Versioning&amp;rdquo; aktiviert, gebraucht hab ich das noch nie wirklich (&lt;em&gt;puh, Glück&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Es ist in &lt;a href=&#34;https://go.dev/&#34;&gt;Go&lt;/a&gt; geschrieben. Persönlich hat die Sprache bei mir nicht verfangen, aber aus Anwender-Sicht wird alles richtig gemacht.
Das Executable irgendwie herbekommen, starten, und dank statischem linken funktioniert das einfach so - und das auf Dauer.. Wunderbar.&lt;/p&gt;
&lt;p&gt;Auf bald!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Internet-Jahre&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
		</item>
		<item>
			<title>$&gt; sl dc gti!!1!</title>
			<link>https://www.toor.su/posts/2024/01/sl-dc-gti/</link>
			<pubDate>Sat, 20 Jan 2024 15:23:42 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2024/01/sl-dc-gti/</guid>
			<description>&lt;p&gt;So, I spend 98% of my life in the command line.
It&amp;rsquo;s super effective and a lot of fun. But typos happen&amp;hellip; A lot.&lt;/p&gt;
&lt;p&gt;I am well aware of external commands that annoy you when you type
the wrong command:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/mtoyoda/sl&#34;&gt;sl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/rwos/gti&#34;&gt;gti&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Having a &lt;em&gt;steam locomotive&lt;/em&gt; or some &lt;em&gt;gti&lt;/em&gt; car running through the
terminal is fun!&lt;/p&gt;
&lt;p&gt;But there is the &lt;code&gt;dc&lt;/code&gt; command - known as &lt;em&gt;desk calculator&lt;/em&gt;.
Preinstalled on most systems.
This is unfortunate as it drops you into some prompt, interrupting
what you intended to do in the first place.&lt;/p&gt;
&lt;p&gt;So I have solved this problem little bit differently:
I&amp;rsquo;ve decided to count how often I type something wrong.&lt;/p&gt;
&lt;p&gt;Inside my shell rc I&amp;rsquo;ve put some functions similar to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;_missed&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;track&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/.missed_&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;count&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;cat &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$track&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; 2&amp;gt; /dev/null&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#39;%s&amp;#39; missed %d times!!1!\n&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$2&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$((&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; count &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;%d&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$count&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$track&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dc&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; _missed &lt;span class=&#34;s2&#34;&gt;&amp;#34;dc&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cd&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sl&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; _missed &lt;span class=&#34;s2&#34;&gt;&amp;#34;sl&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; ls &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gti&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; _missed &lt;span class=&#34;s2&#34;&gt;&amp;#34;gti&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;git&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; git &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$@&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;They should work on most shells, might need some adaptions for different
implementations.&lt;/p&gt;
&lt;p&gt;I should synchronize the &lt;code&gt;~/.missed_*&lt;/code&gt; files across all my machines
to have the total failure rate available 😅&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Docker Purge</title>
			<link>https://www.toor.su/posts/2023/11/docker-purge/</link>
			<pubDate>Wed, 15 Nov 2023 09:13:12 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2023/11/docker-purge/</guid>
			<description>&lt;p&gt;My relation with docker is &amp;hellip; well mixed.&lt;/p&gt;
&lt;p&gt;Constantly I am oscillating between &amp;ldquo;I love docker&amp;rdquo; and &amp;ldquo;I hate docker&amp;rdquo;.
This happens in a matter of seconds, many times per day.&lt;/p&gt;
&lt;p&gt;The containers I run are mostly locally, I do not use it on the server.&lt;/p&gt;
&lt;p&gt;My primary use case is during development of software:
It&amp;rsquo;s nice to run your Unit-Tests against the real deal instead of mocking
everything away.
That would be for example some MySQL database in
&lt;a href=&#34;https://testcontainers.com/&#34;&gt;Testcontainers&lt;/a&gt; instead of using
some In-Memory database or something.
They behave little bit different than the real deal, drawing in subtle
bugs that only occur later in production. Horrible.&lt;/p&gt;
&lt;p&gt;Doing cross compiling of software is my other use case:
Starting from a clean system, drawing in only required dependencies and then
running the build during container creation.
This keeps your normal system clean, and comes with the benefit that every
build step is automatically documented: every step is part of the &lt;code&gt;Dockerfile&lt;/code&gt;.
When it finally works you have already written down every detail how
to setup the environment and every step how to build it. Nice!&lt;/p&gt;
&lt;p&gt;So enough of the introduction - why I am writing this post?&lt;/p&gt;
&lt;p&gt;It turns out that sometimes you leave some broken state behind.
Old containers are still running, eating up resources of your machine,
unused volumes still lurk around, the network setup is all messed up&amp;hellip;&lt;/p&gt;
&lt;p&gt;Sad.&lt;/p&gt;
&lt;p&gt;But there is a solution. I use these helper snippets in my shell rc to
address the cleanup parts.&lt;/p&gt;
&lt;p&gt;This one is obvious - If I want to try something out, not messing
up the shell history this comes in handy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;focker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;docker&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To actually remove all running containers, images, volumes and whatnot
there are these functions:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-containers&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker containers&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker container ls --all --quiet &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs docker container rm --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-images&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker images&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker image ls --all --quiet &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs docker image rm --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-volumes&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker volumes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker volume prune --all --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-network&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker network&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker network prune --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-cache&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker builder&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker builder prune --all --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge-system&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: docker system&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  docker system prune --all --force --volumes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;function&lt;/span&gt; dockerpurge&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;:: :: :: ::&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-containers
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-images
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-volumes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-network
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-cache
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  dockerpurge-system
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So to remove all running containers I run &lt;code&gt;dockerpurge-containers&lt;/code&gt;, to
actually reset everything &lt;code&gt;dockerpurge&lt;/code&gt; does it&amp;rsquo;s job.
Then I can start over from a clean state.&lt;/p&gt;
&lt;p&gt;This is nice, and helps me to say &amp;ldquo;I hate docker&amp;rdquo; less often&amp;hellip;&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Notizen, digital</title>
			<link>https://www.toor.su/posts/2023/09/notizen-digital/</link>
			<pubDate>Mon, 04 Sep 2023 18:26:56 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2023/09/notizen-digital/</guid>
			<description>&lt;p&gt;Ach ja, Notizen in digitaler Form.. Ein Thema voller Missverständnisse.&lt;/p&gt;
&lt;p&gt;Es könnte ja so einfach sein - Macht man einfach ein &lt;code&gt;C:\notizen.txt&lt;/code&gt;, schreibt alles rein, fertig ist der Karton.&lt;/p&gt;
&lt;p&gt;Stellt sich raus, Menschen haben mehr als ein Gerät am Start (vor allem kein Wintendo®), und den selben Inhalt darüber verteilen ist schon ein nettes Feature.&lt;/p&gt;
&lt;p&gt;Wenn es um die Sammlung von Schmierzettel geht, für kleine Schnipsel ohne groß Features gibt es etwas sehr einfaches:&lt;/p&gt;
&lt;p&gt;Das Zauberwort heißt &lt;em&gt;IMAP&lt;/em&gt;. Fast alle Plattformen unterstützen dies auf irgend eine Art und Weise. Hat man irgendwo ein Mail-Postfach dann ist man schon fast fertig!&lt;/p&gt;
&lt;p&gt;Am Mac kann man die &lt;em&gt;Notes.app&lt;/em&gt; darauf ansetzen, genauso auch am iPhone (Einfach in den Settings anschalten - wenn man sein Postfach einrichtet).
Unter &lt;em&gt;KDE&lt;/em&gt; läuft das fluffig auch in der &lt;em&gt;Kontact&lt;/em&gt; Anwendung; auf Arbeit geht das sogar in &lt;em&gt;Outlook&lt;/em&gt; (&lt;em&gt;grusel&lt;/em&gt;) - zumindest auf dem Mac.&lt;/p&gt;
&lt;p&gt;Und zack fertig, sind die Schmierzettel überall immer aktuell. Unter der Haube funktioniert das wie ein extra Postfach, in dem einzelne Mails drinnen liegen. Kann also durchaus sein dass man das am Mail-Client extra ausblenden muss, ist aber ein lösbares Problem™.
Einmal eingerichtet, funktioniert das sehr gut, der sync ist dank &lt;em&gt;IMAP&lt;/em&gt; atomar und stressfrei. Ist gekauft!&lt;/p&gt;
&lt;p&gt;Was bisschen Schade ist - Die Qualität der Implementierungen variiert immer ein bisschen, also ist es gut möglich dass die Formatierung mal flöten geht, oder irgendwie kaputt ist.
Dennoch - wir reden hier über die Sammlung der Schmierzettel, da sollte man sich nicht zu arg austoben. Für was anspruchsvolleres (z.B. Entwürfe für Blog-Artikel wie diesen hier) gibt es andere Tools, aber das wär dann das Thema von einem anderen Beitrag.. Spoiler-Alert!&lt;/p&gt;
&lt;p&gt;Auf bald!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Heiter bis wolkig</title>
			<link>https://www.toor.su/posts/2023/07/heiter-bis-wolkig/</link>
			<pubDate>Sun, 30 Jul 2023 11:56:10 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2023/07/heiter-bis-wolkig/</guid>
			<description>&lt;p&gt;Habe das im Blog immer mal angestreift, nie direkt drüber geschrieben:&lt;/p&gt;
&lt;p&gt;Der Grund warum diese Seite hier existiert, ist die Domain &lt;code&gt;toor.su&lt;/code&gt;.
Dort antwortet mein eigener Server aus den Untiefen des Internets
(Kiste, aus Blech, 2x Festplatte, Netzwerk, Speicher, Strom, usw. beim Hoster des geringsten Misstrauens).&lt;/p&gt;
&lt;p&gt;Keine Antwort auf &lt;code&gt;HTTP&lt;/code&gt; oder nur statisch die Standard Seite von &lt;em&gt;nginx&lt;/em&gt; ausliefern ist doof.
Also neues Projekt gestartet: Blog schreiben. Dieses hier!&lt;/p&gt;
&lt;p&gt;Parallel dazu: Genau die Dienste betreiben die ich für ein modernes Leben ohne Cloud benötige
(Schön war auch die Episode: eine &lt;code&gt;.su&lt;/code&gt; Domain zu registrieren. Irgendwann ist alles nur noch auf russisch in den Mails &lt;em&gt;..hmm, not sure if scam, or legit invoice..&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Warum mir das &lt;em&gt;so&lt;/em&gt; wichtig ist, kann ich schwer beschreiben, finde allerdings dass alle Daten die man so hat &amp;amp; produziert nur auf eigenen Geräten oder zumindest Geräten unter eigener Kontrolle halten sollte.
Natürlich gibt es Abstufungen je nach Kontext, dennoch - je vertraulicher umso mehr sollte man drauf achten, dass z.B. die Passwörter nicht in der &lt;em&gt;iCloud Keychain&lt;/em&gt;, oder die Sachen von der Bank in der &lt;em&gt;Dropbox&lt;/em&gt; landen&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ist definitiv das Nischenthema deluxe - perfekt geeignet auf Parties, es interessiert exakt niemanden!!1!
Dennoch: No kink shaming! kthnxbye&lt;code&gt;:wq!&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Die Lösung liegt auf der Hand, alles immer selbst hosten!!!1!
Der Weg dahin ist &amp;hellip; schwierig. Mache das schon länger, hab vieles ausprobiert, wieder verworfen, manches funktioniert.
Neben dem Technischen gibt es viele Erfahrungen die man sonst so macht.&lt;/p&gt;
&lt;p&gt;Lass doch mal die Serien Funktion in diesem Blog nutzen:
&lt;a href=&#34;https://www.toor.su/series/self-host&#34;&gt;&lt;em&gt;Self Host&lt;/em&gt;&lt;/a&gt; - Live-Berichte aus den Irrungen und Wirrungen des Maschinenraums des Wahnsinns. Oder so..&lt;/p&gt;
&lt;p&gt;Auf bald!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>The struggle is real</title>
			<link>https://www.toor.su/posts/2023/07/the-struggle-is-real/</link>
			<pubDate>Fri, 28 Jul 2023 11:51:39 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2023/07/the-struggle-is-real/</guid>
			<description>&lt;p&gt;Oh yeah, there is this box somewhere in the internet..
Minding it&amp;rsquo;s business and running a lot of services..&lt;/p&gt;
&lt;p&gt;But the &amp;ldquo;blog&amp;rdquo; service hasn&amp;rsquo;t been updated for a while. Content wise.
Nothing much, but something to have some regular activity (more then every &lt;em&gt;x&lt;/em&gt; months/years)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Well, &amp;hellip;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2023/07/thug-life.jpg&#34;&gt;
&lt;/figure&gt;
&lt;hr&gt;
&lt;p&gt;So. Jetzt mal ernsthaft:
Stimmt, hier auf dem Blog ist gar nichts los!&lt;/p&gt;
&lt;p&gt;Schade - grob hatte ich das Ziel, im allgemeinen über Technik schreiben, und das auf Englisch.&lt;/p&gt;
&lt;p&gt;But as it turns out - Die Sprache an sich ist kein Problem für mich, aber gut lesbare Texte in Englisch zu schreiben dauert bei mir ewig und ist sehr arbeitsintensiv.
Kann sein dass sich das durch Übung verbessert - aber das Experiment die letzten Jahre zeigt:
Bin ja gar nicht am üben, weil sich hier ja nichts tut. &lt;em&gt;Deadlock&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Also: Planänderung, die erste Regel wird beibehalten, die zweite gelockert.
Ab sofort werden die Einträge hier wahlweise auf &lt;em&gt;Englisch&lt;/em&gt; oder &lt;em&gt;Kartoffel&lt;/em&gt; erscheinen, je nach Lust und Laune.&lt;/p&gt;
&lt;p&gt;Völlig unklar ob mein schönes, &lt;em&gt;von Hand gedängeltes&lt;/em&gt;, Hugo-Theme das irgendwie unterstützt, zur Not hab ich schon wieder eine Dauerbaustelle aufgemacht. 😅
Das Ergebnis wird man ja dann hier sehen: 👈 👇 👆 👉 🤞 🫵&lt;/p&gt;
&lt;p&gt;Ansonsten. Baustellen. Davon reiße ich grad eine Menge auf, und habe eine Menge Spaß dabei.. Muss bisschen aufpassen dass es nicht zu viel wird, aber da fällt eine Menge auch für den Blog bei ab, so hoffe ich. 😀&lt;/p&gt;
&lt;p&gt;Auf bald!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Location aware config in git</title>
			<link>https://www.toor.su/posts/2022/10/location-aware-config-in-git/</link>
			<pubDate>Mon, 10 Oct 2022 17:45:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2022/10/location-aware-config-in-git/</guid>
			<description>&lt;p&gt;Something you should know about, because it is really useful:&lt;/p&gt;
&lt;p&gt;It is possible to change the (global) &lt;code&gt;git&lt;/code&gt; configuration depending on
the folder you are in.&lt;/p&gt;
&lt;p&gt;For example - when mixing work-related and private projects
on the same machine:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[user]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;Some Name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    email = my.personal.address@example.org&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[includeIf &amp;#34;gitdir:~/code/work/&amp;#34;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;~/code/work/.gitconfig&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then inside &lt;code&gt;~/code/work/.gitconfig&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[user]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;my.work.address@example.com&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I rely on this daily - It is very useful!&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Pylint magic</title>
			<link>https://www.toor.su/posts/2021/05/pylint-magic/</link>
			<pubDate>Thu, 20 May 2021 18:31:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2021/05/pylint-magic/</guid>
			<description>&lt;p&gt;I am using pylint on most of my code to make sure nothing
bad or too complicated sneaks in.
So far it has helped me a lot in discovering stuff I would not notice, and
if you are not using &lt;code&gt;#pylint: disable=...&lt;/code&gt; too often it forces you
to write better code.&lt;/p&gt;
&lt;p&gt;I just stumbled across this:&lt;/p&gt;
&lt;p&gt;I want to find the first element in a list of elements that is
bigger than the specified one. For simplicity I am just using numbers
here&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./some.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;selection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;num&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;num&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;selection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;num&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;number&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But my tests show me that something bad is happening&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./test_some.py&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;some&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;NUMBERS&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;test_function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;assert&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NUMBERS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;assert&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running the tests shows that the last assert statement goes over the
for loop end exits the &lt;code&gt;function&lt;/code&gt;, returning &lt;code&gt;None&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ pytest -vv  test_some.py
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;================= test session starts =================
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;collected 1 item
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test_some.py::test_function PASSED              [100%]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;================== 1 passed in 0.02s ==================
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But running the tests yields no errors:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ pylint --disable &amp;#34;C0114&amp;#34; --disable &amp;#34;C0116&amp;#34; some.py test_some.py
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;------------------------------------
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Your code has been rated at 10.00/10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I would have expected this typical message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Either all return statements in a function should return an expression,
or none of them should.
(&lt;code&gt;inconsistent-return-statements&lt;/code&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Weird.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So, digging a little further, that example can be trimmed down to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fun&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It seems, that the check for &lt;code&gt;inconsistent-return-statements&lt;/code&gt; gets
confused by the &lt;code&gt;return&lt;/code&gt; inside the &lt;code&gt;for&lt;/code&gt; loop.
It does (or cannot?) not check if the input of the &lt;code&gt;for&lt;/code&gt; loop is empty or
not.&lt;/p&gt;
&lt;p&gt;So, now I am aware of this. Anyway, I only discovered this while doing
test driven development. For a moment I was confused why some &lt;code&gt;assert&lt;/code&gt;
bailed out with some &lt;code&gt;None&lt;/code&gt; value for some edge-case that was not implemented
yet..&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Fixed!</title>
			<link>https://www.toor.su/posts/2021/01/fixed/</link>
			<pubDate>Sun, 10 Jan 2021 21:29:42 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2021/01/fixed/</guid>
			<description>&lt;p&gt;Again, there has been a long time since the last post.&lt;/p&gt;
&lt;p&gt;Somehow I lost motivation, because syntax highlighting did not really work.
Black text on a very dark background is not much fun to read.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&#34;https://www.toor.su/posts/2020/10/cant-fix/&#34;&gt;the previous post&lt;/a&gt; I thought this needs
to be fixed inside Firefox.
But no, it seems to be intended behaviour, because at some point
Chrome also stopped working.
And with that, all the Electron apps suffered from the same issue.&lt;/p&gt;
&lt;p&gt;Things went quickly then, as the bug trackers filled up with random
Electron app users complaining.&lt;/p&gt;
&lt;p&gt;So the colored SVG glyphs of the font were dropped and a new release
was published. Great.
Who would have thought that Electron is good for anything after all? 🤭&lt;/p&gt;
&lt;p&gt;But the node package was not updated.&lt;/p&gt;
&lt;p&gt;Sad, so my blog theme still was broken. But tonight it struck me:
&amp;ldquo;Hey, isn&amp;rsquo;t it possible to install node packages directly from the git repos?!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Yes it is. I tried that, and guess what:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;It works!!1!&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is great. Let&amp;rsquo;s see, if I can find more time to write about
random stuff in the future&amp;hellip;&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Can&#39;t fix</title>
			<link>https://www.toor.su/posts/2020/10/cant-fix/</link>
			<pubDate>Tue, 06 Oct 2020 00:02:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2020/10/cant-fix/</guid>
			<description>&lt;p&gt;So after many many debugging sessions I finally found the real culprit
for &lt;a href=&#34;https://www.toor.su/posts/2020/04/weird-css/&#34;&gt;this issue here&lt;/a&gt;..
It has nothing to do with CSS, but with SVG. Who would have guessed?!&lt;/p&gt;
&lt;p&gt;I figured — it has something to do with the web-font, so there
&lt;a href=&#34;https://github.com/adobe-fonts/source-code-pro/issues/248&#34;&gt;is this issue&lt;/a&gt;
and also
&lt;a href=&#34;https://github.com/adobe-fonts/source-code-pro/issues/250&#34;&gt;that issue&lt;/a&gt;.
But in reality it is some
&lt;a href=&#34;https://bugzilla.mozilla.org/show_bug.cgi?id=1520157&#34;&gt;regression in Firefox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oh no. I have spent so many hours trying to figure out what&amp;rsquo;s going on.
And now I am very sad to not really be able to fix this.
My knowledge of SVG font rendering inside Firefox is very very limited,
so I don&amp;rsquo;t feel like solving this issue anytime soon. Sorry about that.&lt;/p&gt;
&lt;p&gt;Reading through the original ticket some high profile sites are also affected..
Hopefully this speeds up things..&lt;/p&gt;
&lt;p&gt;Otherwise - this is something very frustrating - not be able to fix some bug.
Let&amp;rsquo;s see what the future will bring..&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Weird CSS</title>
			<link>https://www.toor.su/posts/2020/04/weird-css/</link>
			<pubDate>Thu, 30 Apr 2020 13:34:02 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2020/04/weird-css/</guid>
			<description>&lt;p&gt;I am puzzled. My work laptop runs on macOS Catalina.
Somehow it tricked me into updating, and here we are.&lt;/p&gt;
&lt;p&gt;After some pain in the beginning, now I can say I don&amp;rsquo;t have any
issues with it.&lt;/p&gt;
&lt;p&gt;But I noticed something odd.
Only on Catalina and only on Firefox, the syntax highlighting on this
Website does not work.&lt;/p&gt;
&lt;p&gt;If I use any other Browser it is fine, and if I use Firefox on any other
system everything is good.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2020/04/high-sierra.jpg&#34;
    alt=&#34;High Sierra&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;High Sierra&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2020/04/catalina.jpg&#34;
    alt=&#34;Catalina&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Catalina&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This is weird, and I do not know why this happens, and cannot remember
when this started.&lt;/p&gt;
&lt;p&gt;Guess I&amp;rsquo;ll have some debugging to do on the long weekend.&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Indentation</title>
			<link>https://www.toor.su/posts/2020/03/indentation/</link>
			<pubDate>Mon, 30 Mar 2020 18:52:30 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2020/03/indentation/</guid>
			<description>&lt;p&gt;So, while digging around in some external library code I stumbled
across this method:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;hasattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Nested&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;enumerate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see it is very difficult to understand what is going on there..
Please do not try to understand what the method is doing or where it comes
from. That&amp;rsquo;s not the point I am trying to make here -
just look inside &lt;code&gt;self.container.output&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The method &lt;code&gt;self.container.output&lt;/code&gt; gets the parameter &lt;code&gt;idx&lt;/code&gt; and
either &lt;code&gt;val&lt;/code&gt; or &lt;code&gt;value&lt;/code&gt; based on some conditions.
These conditions are the cause why it is hard to understand.
It is &lt;code&gt;val&lt;/code&gt; if three conditions are met, but the first one contains
further nested conditions where one of them is again nested&amp;hellip; Complicated.&lt;/p&gt;
&lt;p&gt;So I took the liberty to reformat the code without changing the
logic of it (just whitespace changes).
It turned out to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;output&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;ow&#34;&gt;or&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;hasattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attribute&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Nested&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;container&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;enumerate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Well, yes, it became much longer, but on the pro side my PEP8
linter in the editor won&amp;rsquo;t complain about &lt;em&gt;bad-continuation&lt;/em&gt; anymore.
(It still complains about the &lt;em&gt;Redefining built-in &amp;lsquo;format&amp;rsquo;&lt;/em&gt;, but anyway&amp;hellip;)&lt;/p&gt;
&lt;p&gt;Basically I removed all the hanging indents - now it is much easier to
understand how these conditions interact.
That single &lt;code&gt;or&lt;/code&gt; moved one indentation step further to the right,
so one can clearly see, it has nothing to do with the &lt;code&gt;and&lt;/code&gt;s on the outside.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Then I remembered some talk I watched years ago - If your code is easy to
grasp visually, the chance someone else understands it is way higher.&lt;/p&gt;
&lt;p&gt;Ok, let&amp;rsquo;s give it a try - how about some dirty script?&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;string&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;whitespace&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;whitespace&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;#&amp;#39;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;char&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It replaces everything but whitespace with an &lt;code&gt;#&lt;/code&gt; character.&lt;/p&gt;
&lt;p&gt;The first example turns out like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### ############ #######
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ## ################# #####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ##### # ###########
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ###### #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ##########################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ### ## ################ #####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    ## #########################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                        ### ############ ###########################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    ### ### ########################## #######
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    ### ### #################### ## ###
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                #### ######
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ### #### ### ## ################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    #
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the second one like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;### ############ #######
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ## ################# #####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ##### # ###########
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ###### #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ######################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ###
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                ############### #####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                ## #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    ########################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    ### ############ #########################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ### ### ########################## #######
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            ### ### #################### ## ###
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            #### #####
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        #
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ### #### ### ## ################
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    #
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just by looking at these outputs without comparing it to the original code
(don&amp;rsquo;t scroll up) it is suddenly possible to see the different nesting
levels, and how they act together.&lt;/p&gt;
&lt;p&gt;In my opinion, the second one shows it more clearly - although
it takes up much more horizontal space.
But I think this is worth it - scrolling through text on the screen
takes much less effort than reading the same code over and over again&amp;hellip;&lt;/p&gt;
&lt;p&gt;Think of it next time you are trying to write very dense code!&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Updates</title>
			<link>https://www.toor.su/posts/2020/02/updates/</link>
			<pubDate>Mon, 10 Feb 2020 21:11:43 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2020/02/updates/</guid>
			<description>&lt;p&gt;So, here are some updates. I am still alive, and I have not forgotten
about that website.&lt;/p&gt;
&lt;p&gt;Originally I had the plan to write something new each month. It worked
well in the beginning, but then stuff happened.&lt;/p&gt;
&lt;p&gt;Primarily: I have a new job!&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a very good one, the company is pretty good, and I pretty much
enjoy it there.
Part of the company culture is the willingness to learn something new,
so there are many places where I can bring in my knowledge.
On the other hand my head is exploding, because there is so much new stuff
for me to learn. I have the feeling I am improving my skills every week.&lt;/p&gt;
&lt;p&gt;Very good.&lt;/p&gt;
&lt;p&gt;Along with this new job came the relocation to Leipzig – finally some
decent city, it&amp;rsquo;s not that big, but big enough. There are a lot of very
interesting people and every day I am somewhere else to discover new
stuff to do. It is a lot of fun!&lt;/p&gt;
&lt;p&gt;That is the reason I rarely find time to take care of this website.
I am very sorry.
But slowly my life sorts itself out, so there will be more time in the future
for personal stuff like this. Maybe I can come back to former glory and write
something new on a monthly basis&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;In other news:
The development of the &lt;a href=&#34;https://slick.toor.su/&#34;&gt;Slick Hugo theme&lt;/a&gt; continues.
Not that fast as it used to be, primarily because I don&amp;rsquo;t have so much time
to do so, but also because it slowly gets to the point where it is finished.&lt;/p&gt;
&lt;p&gt;Worth mentioning is maybe the switch to TypeScript for all the
client side logic, introduction of &lt;a href=&#34;https://gohugo.io/hugo-pipes/&#34;&gt;Hugo Pipes&lt;/a&gt;
for CSS and JavaScript delivery for fingerprinting and of course some
adjustments to keep up with recent Hugo versions.&lt;/p&gt;
&lt;p&gt;Also – Today I killed the 447 days of uptime of the server this page is
running on.
I think it is a quite impressive number and also a little bit scary..&lt;/p&gt;
&lt;p&gt;It is pretty good that some system can run stable for such a long time
(have I mentioned that I love FreeBSD?!?) but very scary that all the
time no kernel patches were applied&amp;hellip;&lt;/p&gt;
&lt;p&gt;Well, now it&amp;rsquo;s over, both userland and kernel are now fully updated and
patched and everything seems to run fine again.&lt;/p&gt;
&lt;p&gt;I discovered some issues while rebooting - It is somehow not possible to
send DNS requests from within newly started jails, because my firewall
is not aware of the network interface of the jail.
So the webserver inside the jail cannot apply
&lt;a href=&#34;https://en.wikipedia.org/wiki/OCSP_stapling&#34;&gt;OCSP stapling&lt;/a&gt;
and waits endlessly&amp;hellip; Sad.&lt;/p&gt;
&lt;p&gt;This is something I have to dig into in near future, so rebooting
(and thus updating the kernel) won&amp;rsquo;t be so much pain anymore.&lt;/p&gt;
&lt;p&gt;Maybe this is stuff for the next entry here, we will see..&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Weird JavaScript</title>
			<link>https://www.toor.su/posts/2019/07/weird-javascript/</link>
			<pubDate>Wed, 03 Jul 2019 16:42:23 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/07/weird-javascript/</guid>
			<description>&lt;p&gt;This is
&lt;a href=&#34;https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true&#34;&gt;something I stumbled&lt;/a&gt;
across a while ago.
Someone on the internet said he was asked this question
during an job interview:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Can you think of a situation where this is true:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;a == 1 &amp;amp;&amp;amp; a == 2 &amp;amp;&amp;amp; a == 3&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, yes.&lt;/p&gt;
&lt;p&gt;You have to ask the question, what &lt;code&gt;a&lt;/code&gt; is.&lt;/p&gt;
&lt;p&gt;Is it a &lt;code&gt;Number&lt;/code&gt;? Obviously not.&lt;/p&gt;
&lt;p&gt;The solution is quite simple if you know how JavaScript works.&lt;/p&gt;
&lt;p&gt;You can define &lt;code&gt;a&lt;/code&gt; to be an &lt;code&gt;Object&lt;/code&gt; and overwrite &lt;code&gt;.valueOf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;valueOf&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;yeah&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I think this is very awkward!&lt;/p&gt;
&lt;p&gt;Or like
&lt;a href=&#34;https://twitter.com/bendhalpern/status/578925947245633536&#34;&gt;someone else&lt;/a&gt;
on the internet said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sometimes when I&amp;rsquo;m writing Javascript I want to throw up my hands
and say &amp;ldquo;this is bullshit!&amp;rdquo; but I can never remember
what &amp;ldquo;&lt;code&gt;this&lt;/code&gt;&amp;rdquo; refers to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Generate htpasswd entries with bcrypt</title>
			<link>https://www.toor.su/posts/2019/06/htpasswd-with-bcrypt/</link>
			<pubDate>Thu, 27 Jun 2019 10:42:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/06/htpasswd-with-bcrypt/</guid>
			<description>&lt;p&gt;This week I was digging around in the configuration of my webserver.&lt;/p&gt;
&lt;p&gt;For some internal pages I am using &lt;em&gt;Basic Auth&lt;/em&gt;.
Looking at the password hashes I noticed they start with &lt;code&gt;$apr1$&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What is that? The &lt;a href=&#34;https://httpd.apache.org/docs/2.4/misc/password_encryptions.html&#34;&gt;Apache documentation about password formats&lt;/a&gt;
tells us that this is some kind of &lt;strong&gt;MD5&lt;/strong&gt; hash.&lt;/p&gt;
&lt;p&gt;Thanks, but no thanks (It&amp;rsquo;s a mystery to me why I decided to use this..).&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s strengthen security by using &lt;strong&gt;blowfish&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;It is possible to create &lt;strong&gt;bcrypt&lt;/strong&gt; hashes using the &lt;code&gt;htpasswd&lt;/code&gt; command.
This is some utility that ships alongside Apache.
I am no Apache user, and I am not willing to install it
just for one small task. So what do we do?&lt;/p&gt;
&lt;p&gt;There are some alternative implementations of just &lt;code&gt;htpasswd&lt;/code&gt;
(&lt;code&gt;htpasswd.py&lt;/code&gt; in python and &lt;code&gt;Apache::Htpasswd&lt;/code&gt; in perl)
but they don&amp;rsquo;t support &lt;strong&gt;blowfish&lt;/strong&gt; as far I can see. Sad.
Alternatively, there are a lot of online generators out there.
But someone must be totally crazy to use them&amp;hellip;&lt;/p&gt;
&lt;p&gt;Python to the rescue! If you have the &lt;code&gt;bcrypt&lt;/code&gt; package installed,
you can use this script to generate the hash:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;bcrypt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;bcrypt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hashpw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;bcrypt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gensalt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rounds&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I am using &lt;code&gt;input()&lt;/code&gt; here, so the password won&amp;rsquo;t show up in plaintext
inside the &lt;code&gt;~/.python_history&lt;/code&gt; file when using the interactive prompt.&lt;/p&gt;
&lt;p&gt;If you save the script inside some file, you may use it like this to
append a new entry:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user:&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;./htspass.py&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .htpasswd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So long.&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Fnord Day</title>
			<link>https://www.toor.su/posts/2019/05/fnord-day/</link>
			<pubDate>Thu, 23 May 2019 23:05:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/05/fnord-day/</guid>
			<description>&lt;p&gt;Happy fnord day!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;23&lt;/strong&gt;.&lt;strong&gt;5&lt;/strong&gt;&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Live CSS editing on page</title>
			<link>https://www.toor.su/posts/2019/05/live-css-editing/</link>
			<pubDate>Sat, 04 May 2019 16:59:01 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/05/live-css-editing/</guid>
			<description>&lt;p&gt;So, I just stumbled across something really cool!&lt;/p&gt;
&lt;p&gt;It is possible to edit CSS live on page!&lt;/p&gt;
&lt;p&gt;If you have some &lt;code&gt;&amp;lt;style/&amp;gt;&lt;/code&gt; tag, you can add some style attribute to itself.
First use &lt;code&gt;display: block&lt;/code&gt;, so it shows up on page.&lt;/p&gt;
&lt;p&gt;And then the second trick:
Add the &lt;code&gt;contenteditable&lt;/code&gt; attribute, to make it changeable.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;display: block;&amp;#34;&lt;/span&gt; &lt;span class=&#34;nt&#34;&gt;contenteditable&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c&#34;&gt;/* ... */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;style&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;rsquo;s it - new styles get applied immediately.&lt;/p&gt;
&lt;h2 id=&#34;demo&#34;&gt;Demo&lt;/h2&gt;
&lt;div class=&#34;demo-box&#34; style=&#34;margin: 1em 0;&#34;&gt;Demo Box&lt;/div&gt;
&lt;p&gt;So, go on and change some of the CSS below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;pre&gt;&lt;/p&gt;
&lt;style style=&#34;display: block;&#34; contenteditable&gt;.demo-box {
  background-color: #efefef;
  border: .125em dashed #4d4d4c;
  border-radius: 1.5em;
  color: #f5871f;
  font-size: 1.25em;
  padding: .5em;
  text-align: center;
}
&lt;/style&gt;&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;I think this is awesome!
Please don&amp;rsquo;t ask me, where it could be useful &amp;ndash; still, awesome!&lt;/p&gt;
&lt;p&gt;You could also do that for &lt;code&gt;&amp;lt;script/&amp;gt;&lt;/code&gt; tags, but to trigger the Javascript
again you&amp;rsquo;ll have to reload the page and then all the changes are gone.&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Calculate IPv6 link-local from MAC Address</title>
			<link>https://www.toor.su/posts/2019/04/ipv6-link-local-from-mac/</link>
			<pubDate>Tue, 30 Apr 2019 12:42:42 +0200</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/04/ipv6-link-local-from-mac/</guid>
			<description>&lt;p&gt;While preparing for my final exams I stumbled across some question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please calculate the IPv6 link-local Address
from the following MAC Address&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Good question.&lt;/p&gt;
&lt;p&gt;Well, it&amp;rsquo;s pretty easy if you know how to do it.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s say you have the following (hypothetical) MAC Address:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5f:4e:3d:2c:1b:0a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;First thing, you have to add some &lt;code&gt;ff:fe&lt;/code&gt; in the middle:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5f:4e:3d:ff:fe:2c:1b:0a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now for the tricky part - the calculation.
Look at the first part, in this case &lt;code&gt;5f&lt;/code&gt;. Convert it from HEX to BIN
(see table below if you need help):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      5        f    (HEX)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 1 0 1  1 1 1 1    (BIN)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The second to last bit needs to be flipped. Or more technically speaking
the result needs to be XORed with &lt;code&gt;0 0 0 0 0 0 1 0&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 1 0 1  1 1 1 1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 0 0 0  0 0 1 0    (XOR)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 1 0 1  1 1 0 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lastly, convert it back to HEX:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 1 0 1  1 1 0 1    (BIN)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      5        d    (HEX)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we get the following:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;5d:4e:3d:ff:fe:2c:1b:0a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;As a final step add the prefix &lt;code&gt;fe80&lt;/code&gt;, fill it with zeros and format
it like a proper IPv6 Address:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fe80::5d4e:3dff:fe2c:1b0a&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;As I told you - pretty easy.&lt;/p&gt;
&lt;h2 id=&#34;bin---hex-table&#34;&gt;BIN - HEX table&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;HEX&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;BIN&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;—&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;HEX&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;BIN&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 0 0 0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;8&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 0 0 0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 0 0 1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;9&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 0 0 1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 0 1 0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;a&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 0 1 0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;3&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 0 1 1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;b&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 0 1 1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;4&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 1 0 0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;c&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 1 0 0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;5&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 1 0 1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;d&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 1 0 1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;6&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 1 1 0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;e&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 1 1 0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0 1 1 1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;f&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1 1 1 1&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;xor-table&#34;&gt;XOR table&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;A&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;B&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;XOR&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;0&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The other way around is similar &amp;ndash; chomp both &lt;code&gt;fe80::&lt;/code&gt; and &lt;code&gt;ff:fe&lt;/code&gt;, then
use the same XOR operation as above.&lt;/p&gt;
&lt;p&gt;If you know all this above, you can easily spot generated link-local addresses,
when they contain some &lt;code&gt;ff:fe&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There are some operation systems around that use randomly generated ones -
so don&amp;rsquo;t be confused if your machine does not generate one like above.
I don&amp;rsquo;t know if this is compliant with the spec&amp;hellip;&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Just fixed some mistake &amp;ndash;
the final address was incorrect, I forgot to add leading zeros:&lt;/p&gt;
&lt;p&gt;Changed: &lt;code&gt;fe80:&lt;/code&gt; → &lt;code&gt;fe80::&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Further &amp;ndash;
If you want to know more, take a look at those RFCs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4291#section-2.5.6&#34;&gt;4291&lt;/a&gt;
IP Version 6 Addressing Architecture
&amp;ndash; Section 2.5.6 Link-Local IPv6 Unicast Addresses&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4862#section-5.3&#34;&gt;4862&lt;/a&gt;
IPv6 Stateless Address Autoconfiguration
&amp;ndash; Section 5.3 Creation of Link-Local Addresses&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc7721&#34;&gt;7721&lt;/a&gt;
Security and Privacy Considerations for IPv6 Address Generation Mechanisms&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://tools.ietf.org/html/rfc4941&#34;&gt;4941&lt;/a&gt;
Privacy Extensions for Stateless Address Autoconfiguration in IPv6&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, yes, using randomly generated link-local addresses is
compliant with the spec&amp;hellip;&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Catchall Mail</title>
			<link>https://www.toor.su/posts/2019/03/catchall-mail/</link>
			<pubDate>Sat, 09 Mar 2019 18:49:26 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/03/catchall-mail/</guid>
			<description>&lt;p&gt;As a proud owner of a domain coupled with a mail server I have the freedom
to use any mail address below that domain.
So a long time ago I decided to use a catchall address.
This is great, I can use it to track who is leaking my mail address
(either by accident or on purpose - does not matter).&lt;/p&gt;
&lt;p&gt;So when I register somewhere using &lt;code&gt;shabby-webshop@example.org&lt;/code&gt; and, after
a certain period of time, spam arrives on that address I know what to do:
Cancel my account there and reject all further mails to that address.
Maybe also poke around how this happened - but that&amp;rsquo;s optional&amp;hellip;&lt;/p&gt;
&lt;p&gt;But catchall addresses have some huge drawback:&lt;/p&gt;
&lt;p&gt;After some time you completely lose track which addresses are in use, how
often mails arrive there, and so on.
All I have is my list of blacklisted addresses - I don&amp;rsquo;t know anything of the
active ones.&lt;/p&gt;
&lt;p&gt;This has to stop - so today I started to fiddle around in my mail setup
to track active addresses.&lt;/p&gt;
&lt;p&gt;I am using &lt;a href=&#34;https://en.wikipedia.org/wiki/Procmail&#34;&gt;procmail&lt;/a&gt; to sort the
mails directly on the server anyway - so why not start here? The first
rule inside the definitions looks now like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;:0 c
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;| /some/path/to/monitor.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It passes a copy of the mail (note the &lt;code&gt;c&lt;/code&gt; flag) to the &lt;code&gt;monitor.py&lt;/code&gt; script
and continues normally afterwards.&lt;/p&gt;
&lt;p&gt;Inside the &lt;code&gt;monitor.py&lt;/code&gt; script I am using something similar to this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-py&#34; data-lang=&#34;py&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message_from_file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;email.utils&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getaddresses&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dump&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;FILENAME&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;monitor.json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# read the mail from stdin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;mail&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;message_from_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# parse the recipients&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;recipients&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;field&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;To&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Cc&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Bcc&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;recipients&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;extend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mail&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get_all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;field&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# load existing content from json file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FILENAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FILENAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# count the addresses&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getaddresses&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;recipients&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# store result in json file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;FILENAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;dump&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jfile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;small&gt;Please note this is just some example code -
I&amp;rsquo;ve added error handling and much more. Please &lt;strong&gt;do not&lt;/strong&gt; just copy &amp;amp; paste
that if you intend to use it!&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;The result is a json file with that content:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;info@example.org&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;23&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;mail@example.org&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;something@example.org&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I am totally looking forward to look into the json file after some time.
Hopefully this will help me to find some addresses I am using and already
have forgotten about.
And much more important: Hopefully this script won&amp;rsquo;t eat up all my mail.&lt;/p&gt;
&lt;p&gt;If I won&amp;rsquo;t reply for some time, you know what happened&amp;hellip; 🙈🙉🙊&lt;/p&gt;
&lt;p&gt;So long.&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Compound Words</title>
			<link>https://www.toor.su/posts/2019/02/compound-words/</link>
			<pubDate>Sun, 24 Feb 2019 17:06:59 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/02/compound-words/</guid>
			<description>&lt;p&gt;In programming you always have the problem to join words together
keeping the syntax intact and to keep at least some amount of readability.&lt;/p&gt;
&lt;p&gt;Those compound words got some names, so everyone knows what you are talking
about.&lt;/p&gt;
&lt;p&gt;You might be familiar with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CamelCase&lt;/code&gt; - Maybe the most famous one, most people might know it from
Wikipedia&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;snake_case&lt;/code&gt; - Very popular in Python, but don&amp;rsquo;t fall for that. The
name of the language refers to Monty Python, and not the snake.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;kebab-case&lt;/code&gt; - This is my favorite name - Not really common because it is
not easy to distinguish it from a minus sign. So you&amp;rsquo;ll find
it mostly in markup languages (Pretty common for HTML class names and/or CSS)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But there is one which was new for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;beercase&lt;/code&gt; - I guess it is inspired by two glasses clinking together. 🍻&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can grow old, but you never stop learning.&lt;/p&gt;
&lt;p&gt;Cheers&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Reading List</title>
			<link>https://www.toor.su/posts/2019/01/reading-list/</link>
			<pubDate>Tue, 22 Jan 2019 19:16:18 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2019/01/reading-list/</guid>
			<description>&lt;p&gt;It&amp;rsquo;s been a while since my last post..
Yes, I promised to write about my experiences of how I built
&lt;a href=&#34;https://github.com/spookey/slick&#34;&gt;this Hugo template&lt;/a&gt;, and yes, I haven&amp;rsquo;t
forgotten about it.&lt;/p&gt;
&lt;p&gt;FYI - it doesn&amp;rsquo;t really look like it will get better in the near future:&lt;/p&gt;
&lt;p&gt;I can program quite well, but sometimes I have the impression, that
I&amp;rsquo;m not using the most optimal solution.
Mostly I&amp;rsquo;m lacking a general overview of what&amp;rsquo;s possible, and some search
terms, so I can read more about it.&lt;/p&gt;
&lt;p&gt;Lately I&amp;rsquo;ve read a lot of positive things about the following books I stumbled:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://www.crackingthecodinginterview.com/&#34;&gt;Cracking the Coding Interview&lt;/a&gt;:
189 Programming Questions and Solutions
(&lt;a href=&#34;https://www.amazon.com/gp/product/0984782850&#34;&gt;Amazon&lt;/a&gt;,
&lt;a href=&#34;https://www.goodreads.com/book/show/12544648-cracking-the-coding-interview&#34;&gt;GoodReads&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;http://elementsofprogramminginterviews.com/&#34;&gt;Elements of Programming Interviews&lt;/a&gt;:
The Insiders&amp;rsquo; Guide
(&lt;a href=&#34;https://www.amazon.com/gp/product/1479274836/&#34;&gt;Amazon&lt;/a&gt;,
&lt;a href=&#34;https://www.goodreads.com/book/show/29731528-elements-of-programming-interviews&#34;&gt;GoodReads&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&#34;https://pimbook.org/&#34;&gt;A Programmer&amp;rsquo;s Introduction to Mathematics&lt;/a&gt;
(&lt;a href=&#34;https://www.amazon.com/gp/product/1727125452&#34;&gt;Amazon&lt;/a&gt;,
&lt;a href=&#34;https://www.goodreads.com/book/show/42970131-a-programmer-s-introduction-to-mathematics&#34;&gt;GoodReads&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I invested the money I got for Christmas and just bought them.
The package arrived today - so I can&amp;rsquo;t tell if they are good or not, yet.&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2019/01/pile-of-books.jpg&#34;
    alt=&#34;This is a lot to read, I guess&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;This is a lot to read, I guess&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I am especially looking forward to
&amp;ldquo;A Programmer&amp;rsquo;s Introduction to Mathematics&amp;rdquo;
The Approach to explain mathematics via code really looks promising.&lt;/p&gt;
&lt;p&gt;Guessing from the titles you may notice that I&amp;rsquo;ll have some plans for
the future. But this will be another story, to be told..&lt;/p&gt;
&lt;p&gt;But what I can tell you right now is how I&amp;rsquo;ll spend my evening: reading!&lt;/p&gt;
&lt;p&gt;So long.&lt;/p&gt;
</description>
		</item>
		<item>
			<title>How light chains work</title>
			<link>https://www.toor.su/posts/2018/12/light-chain/</link>
			<pubDate>Mon, 24 Dec 2018 15:05:23 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2018/12/light-chain/</guid>
			<description>&lt;p&gt;Every year, on Christmas I ask myself the same question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How does a light chain work?
Why is it possible to blow a single light, but the others still work?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Obviously they are connected in a row.
I had the basic understanding that a light chain looks like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/12/chain-diagram-null.png&#34;
    alt=&#34;This is how I thought a light chain would work&amp;hellip;&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;This is how I thought a light chain would work&amp;hellip;&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you would open &lt;code&gt;SW1A&lt;/code&gt; as depicted (= lamp is broken),
all lamps would turn off, because the circuit is interrupted.&lt;/p&gt;
&lt;small&gt;
    Please don&#39;t take that diagram too serious. It&#39;s not aimed to be
    technically correct, I just want to explain the basic principles.
&lt;/small&gt;
&lt;p&gt;Investigating further — The first hint you get:
If you manually plug out one lamp, the whole chain stops working.
In conclusion - there must be something inside (or near) the single
light bulbs.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take a closer look:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/12/bulb.png&#34;
    alt=&#34;Taking a closer look..&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Taking a closer look..&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In the bottom of the bulb please note the little thing connecting the wires
(right above the glass knob). It turns out this is a so called
&lt;a href=&#34;https://en.wikipedia.org/wiki/Varistor&#34;&gt;varistor&lt;/a&gt;.
It is also called a &lt;q&gt;voltage-dependent resistor&lt;/q&gt; - Something I&amp;rsquo;ve
never heard of before&amp;hellip;&lt;/p&gt;
&lt;p&gt;Think of it like something between a valve or a fuse:
At low voltage it has a high electrical resistance, at high voltage the
resistance gets lower.&lt;/p&gt;
&lt;p&gt;So we have to correct the diagram to look like this:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/12/chain-diagram-real.png&#34;
    alt=&#34;This is how it really works&amp;hellip;&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;This is how it really works&amp;hellip;&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Because the lamp and the varistor are set in parallel, they divide the voltage
in two halves.
The moment one bulb gets broken, the full voltage ends up at the varistor.
The varistor then drops his resistance and let&amp;rsquo;s the current flow
through itself&amp;hellip;
As a result the circuit is still intact, and someone can quickly see which
bulb has to be replaced. Genius!&lt;/p&gt;
&lt;p&gt;I learned something new today, and I hope you did too.&lt;/p&gt;
&lt;p&gt;Merry Christmas!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Hello Hugo</title>
			<link>https://www.toor.su/posts/2018/12/hello-hugo/</link>
			<pubDate>Sat, 22 Dec 2018 11:24:14 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2018/12/hello-hugo/</guid>
			<description>&lt;p&gt;Say hello to my new site!&lt;/p&gt;
&lt;p&gt;You may have guessed it - I was
&lt;a href=&#34;https://www.toor.su/posts/2018/11/ghost-theme/&#34;&gt;not really happy with Ghost&lt;/a&gt;
so I decided to use &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; for this site now.&lt;/p&gt;
&lt;p&gt;The migration of the content was really a breeze. I wrote the entries in
Markdown inside Ghost, so after all it was just copy pasting.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s great that Hugo supports &lt;em&gt;aliases&lt;/em&gt; for URLs, so all the links should stay
intact. You&amp;rsquo;ll get redirected to the new location if you hit an old one.
Also I&amp;rsquo;m trying to redirect the URL of the RSS feed - Let&amp;rsquo;s see how this will
work out..&lt;/p&gt;
&lt;p&gt;As a cherry on top, I wrote myself some script to automatically build the
Website when I&amp;rsquo;m pushing new content into the &lt;code&gt;git&lt;/code&gt; repository.
This is very comfortable - editing content locally inside a good and
well adjusted text editor, publish it with &lt;code&gt;git&lt;/code&gt;,
and let the server do the rest.&lt;/p&gt;
&lt;p&gt;But the best part: I can finally abandon &lt;a href=&#34;https://nodejs.org/&#34;&gt;Node.js&lt;/a&gt;
from my server. Node itself is not a problem, but keeping all packages
for Ghost up to date is really time consuming and all the worries about it
are driving me mad&amp;hellip;&lt;/p&gt;
&lt;p&gt;However I struggled very much to select a decent theme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It should look good
&lt;ul&gt;
&lt;li&gt;Must work on small and big screen sizes&lt;/li&gt;
&lt;li&gt;Text should be readable (high contrast)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It must have a decent quality in code
&lt;ul&gt;
&lt;li&gt;Doesn&amp;rsquo;t use string concatenation to construct URLs
&lt;ul&gt;
&lt;li&gt;this will break if you have some special requirement
- been there, done that)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(HTML) Output should be readable and straight forward
&lt;ul&gt;
&lt;li&gt;As little JavaScript as possible, please&lt;/li&gt;
&lt;li&gt;Doesn&amp;rsquo;t use a full blown framework for just one tiny feature&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Must be focused on privacy
&lt;ul&gt;
&lt;li&gt;No external requests for CSS, Fonts, JS, whatever&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RSS Feed must have full content
&lt;ul&gt;
&lt;li&gt;I hate that when others do it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is really much to ask, so the selection boils down to (almost ?) zero.
So I did what seemed logical - I forked some existing theme which I liked
and implemented/changed what was missing.&lt;/p&gt;
&lt;p&gt;It would have been faster to write a theme from scratch I guess&amp;hellip;
In a future blog post I&amp;rsquo;ll tell you more about the adventures I encountered
while building a theme for Hugo.&lt;/p&gt;
&lt;p&gt;Stay tuned!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Shortcuts on iOS - not even close!</title>
			<link>https://www.toor.su/posts/2018/11/shortcuts-on-ios/</link>
			<pubDate>Fri, 16 Nov 2018 21:07:23 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2018/11/shortcuts-on-ios/</guid>
			<description>&lt;p&gt;I was very excited when
&lt;a href=&#34;https://mjtsai.com/blog/2017/03/23/apple-acquires-workflow/&#34;&gt;Apple acquired Workflow&lt;/a&gt;,
and I was more excited when iOS 12 finally came out
&lt;a href=&#34;https://mjtsai.com/blog/2018/06/14/shortcuts-a-new-vision-for-siri-and-ios-automation/&#34;&gt;with the all new Shortcuts app&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have the understanding that a platform can only be considered as a
serious one, if it is possible to develop for it on itself.
So any step to bring iOS closer to that goal is a good one.
That&amp;rsquo;s also why I was pretty excited.&lt;/p&gt;
&lt;p&gt;Shortcuts is of course a pretty early and a pretty small step&amp;hellip;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t know many people who are using
&lt;a href=&#34;https://support.apple.com/guide/automator/welcome/mac&#34;&gt;Automator.app&lt;/a&gt;
on Mac OS.
And it is not really possible to build serious applications with it.
But it can help to ease out the pain on repetitive tasks.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Speaking of repetitive tasks - in my current situation, I have some weeks I
have to get up early, and some weeks I have to get up very early.&lt;/p&gt;
&lt;p&gt;I do what most people in my age are doing - I pretty much enjoy sleeping&amp;hellip;
It turns out, for me it&amp;rsquo;s better to set four alarm clocks, all
15 minutes apart.&lt;/p&gt;
&lt;p&gt;Despite I&amp;rsquo;m losing one hour of sleep, it really helps me to finally get up
in the end.&lt;/p&gt;
&lt;p&gt;So - every evening I have to remember to activate four alarm clocks, and I
have to pick the right ones&amp;hellip;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/11/alarms.png&#34;
    alt=&#34;This is my long list of possible alarm clocks. Currently set for the very early mode. I named them all 🦆 - maybe I should have been more creative than that&amp;hellip;&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;This is my long list of possible alarm clocks. Currently set for the &lt;em&gt;very early&lt;/em&gt; mode. I named them all 🦆 - maybe I should have been more creative than that&amp;hellip;&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;But Shortcuts will help me there!&lt;/p&gt;
&lt;p&gt;I now have two buttons in my widget area - &lt;em&gt;early&lt;/em&gt; &amp;amp; &lt;em&gt;very early&lt;/em&gt; - which will
activate the alarm clocks for me.&lt;/p&gt;
&lt;p&gt;You may wonder why I&amp;rsquo;m writing about this. The thing is - I have no way to
completely finish those two Shortcuts:&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/11/search.png&#34;
    alt=&#34;Searching for alarm yields only a limited number of results&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Searching for &lt;strong&gt;alarm&lt;/strong&gt; yields only a limited number of results&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Both of them work, but only kind of:&lt;/p&gt;
&lt;p&gt;Neither by searching for &amp;ldquo;&lt;strong&gt;Alarm&lt;/strong&gt;&amp;rdquo;, nor by directly accessing the &amp;ldquo;&lt;strong&gt;Clock&lt;/strong&gt;&amp;rdquo;
section it is possible to retrieve a full list of all possible alarm clocks&amp;hellip;&lt;/p&gt;
&lt;p&gt;Note in the screenshots - there is no way to enable alarm clocks before
06:00 and after 08:00.
Further - there are less options to disable alarm clocks than to enable.&lt;/p&gt;
&lt;p&gt;And worst - all entries do not follow any logical order:
Enable alarm at &lt;em&gt;07:45&lt;/em&gt;; &lt;em&gt;08:00&lt;/em&gt;; &lt;em&gt;07:00&lt;/em&gt;&amp;hellip;&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/2018/11/options.png&#34;
    alt=&#34;And this is what I get, when directly navigating to the Clock section inside Shortcuts. You may have noticed: Many alarm clocks are missing&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;And this is what I get, when directly navigating to the &lt;strong&gt;Clock&lt;/strong&gt; section inside Shortcuts. You may have noticed: Many alarm clocks are missing&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I am very frustrated. Now I have a situation where I can use the shortcuts to
set three out of four alarm clocks, but still I have to switch to the &amp;ldquo;Clock&amp;rdquo;
app to enable the missing one.&lt;/p&gt;
&lt;p&gt;In conclusion - I am very happy that there is finally some officially supported
way to build little scripts to help on repetitive tasks.&lt;/p&gt;
&lt;p&gt;But the way how one can build them is still very far from perfect.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why does it only show a small subset of all possibilities and
why aren&amp;rsquo;t they sorted?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not a very satisfactory solution - it&amp;rsquo;s better than nothing - but I
fear there is still a very long way to go&amp;hellip;&lt;/p&gt;
&lt;p&gt;So long.&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Blog Template &amp; the current state of JavaScript</title>
			<link>https://www.toor.su/posts/2018/11/ghost-theme/</link>
			<pubDate>Tue, 13 Nov 2018 19:00:53 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2018/11/ghost-theme/</guid>
			<description>&lt;p&gt;I decided to recompile userland &amp;amp; kernel on the machine this blog is running
on and naturally this will take a while.
So why not use the time to write my first proper blog entry&amp;hellip;&lt;/p&gt;
&lt;p&gt;In the last days I spend some time taking a closer look on the template for
this blog.&lt;/p&gt;
&lt;p&gt;The reason why I decided to use
&lt;a href=&#34;https://github.com/zutrinken/attila&#34;&gt;Attila&lt;/a&gt;
as theme is that it seems to care a little bit on privacy.&lt;/p&gt;
&lt;p&gt;If you click through the
&lt;a href=&#34;https://marketplace.ghost.org/&#34;&gt;demos on template marketplace for ghost themes&lt;/a&gt;
you&amp;rsquo;ll notice that a lot of them are loading assets from external sources.&lt;/p&gt;
&lt;p&gt;For me privacy is very important, and loading external ressources from third
parties is an absolute no-go! This is not something I want to experience
personally, and therefore this is nothing I want to force on my visitors.&lt;/p&gt;
&lt;p&gt;Scrolling
&lt;a href=&#34;https://github.com/zutrinken/attila/commits/master&#34;&gt;through the changelog&lt;/a&gt;
of Attila one can see, this theme never was designed
in terms of &amp;ldquo;privacy first&amp;rdquo;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zutrinken/attila/commit/dec804a2782c3459c4b343fee64e158c54339b7e&#34;&gt;Protocol relative load&lt;/a&gt;
of assets and
&lt;a href=&#34;https://github.com/zutrinken/attila/commit/876e337b6bd5c840f80de9eaac6cf773ab9b0566&#34;&gt;mixed content&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/zutrinken/attila/commit/0fda3b5726036be7bb2fb3d39db9b573ca33c037&#34;&gt;Using local fonts&lt;/a&gt;
insted of loading them from Google.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please don&amp;rsquo;t get me wrong - I do not want to rant about the template - the
template is great, it looks very good, is very usable, and even comes
&lt;a href=&#34;https://github.com/zutrinken/attila/blob/master/LICENSE&#34;&gt;licensed as open source&lt;/a&gt;.
Awesome! Thanks!&lt;/p&gt;
&lt;p&gt;I am very well aware I am complaining on a very high ground.&lt;/p&gt;
&lt;p&gt;But there is still a thing that bugs me - The logo from the top left corner is
still fetched from &lt;code&gt;casper.ghost.org&lt;/code&gt;. I do not want that and maybe I could
patch it out..&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;So I set up a local development installation of Ghost, cloned the repository,
and replaced that logo by a local one.&lt;/p&gt;
&lt;p&gt;Easy task, five stars - would do again!&lt;/p&gt;
&lt;p&gt;And while we&amp;rsquo;re on it I removed the comment feature for Disqus
(because privacy)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Then I noticed that this template was using JQuery for it&amp;rsquo;s JavaScript logic.
At least it is bundled inside the template and is not loaded via some
third party content distribution network.&lt;/p&gt;
&lt;p&gt;But the bundled version is a pretty old one (version 1) - nowadays version 3 is
recent. The old ones aren&amp;rsquo;t patched anymore.&lt;/p&gt;
&lt;p&gt;For most parts JQuery isn&amp;rsquo;t needed anymore - So I thought it could be possible
to remove it completely by rewriting some parts of the source code.&lt;/p&gt;
&lt;p&gt;It turns out that there are some plugins inside the template which require
JQuery.&lt;/p&gt;
&lt;p&gt;For example
&lt;a href=&#34;https://github.com/davatron5000/FitVids.js&#34;&gt;FitVids.js&lt;/a&gt;
which resizes embedded videos from YouTube and Vimeo.&lt;/p&gt;
&lt;p&gt;Ok - there is
&lt;a href=&#34;https://github.com/toddmotto/fluidvids&#34;&gt;fluidvids.js&lt;/a&gt;
which has no dependencies and does the same. Great.&lt;/p&gt;
&lt;p&gt;So I started to fiddle around inside
&lt;a href=&#34;https://gruntjs.com/&#34;&gt;Grunt&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the JS build tool used in this project&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After updating most
&lt;a href=&#34;https://www.npmjs.com/&#34;&gt;NPM&lt;/a&gt;
dependencies inside the template, I started updating them to a more
recent version.&lt;/p&gt;
&lt;p&gt;While fixing all the trouble I caused by updating all those packages I stumbled
across the information that nobody is seriously using Grunt anymore&amp;hellip;&lt;/p&gt;
&lt;p&gt;Sigh. While we&amp;rsquo;re on it - let&amp;rsquo;s also replace the complete toolchain. Most blog
posts mentioned
&lt;a href=&#34;https://webpack.js.org/&#34;&gt;webpack&lt;/a&gt;
as state of the art build &amp;amp; bundle tool.&lt;/p&gt;
&lt;p&gt;It can do anything, but most of it only via external packages - yay more
dependencies, more problems.&lt;/p&gt;
&lt;p&gt;To configure webpack builds
&lt;a href=&#34;https://webpack.js.org/concepts/&#34;&gt;the documentation&lt;/a&gt;
is very well written to get started, but leaves you in the dark with a
lot of corner cases.&lt;/p&gt;
&lt;p&gt;To make the &lt;code&gt;require&lt;/code&gt; and &lt;code&gt;import&lt;/code&gt; statements work (I guess)
the build output is inflated by some JavaScript code - over 100 lines of weird
stuff, bundled right into my Hello World test script&amp;hellip;
Why is it there, what does it even do?!?&lt;/p&gt;
&lt;p&gt;Better - I set up building &lt;code&gt;.scss&lt;/code&gt; files into CSS like it is recommended in
the documentation. And all I got was a &lt;code&gt;style.js&lt;/code&gt; file.
What am I supposed to do with that?!?&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Every once in a while I take a journey into JavaScript-Land.
And I don&amp;rsquo;t really like what I see.&lt;/p&gt;
&lt;p&gt;It becomes more complicated each time - I don&amp;rsquo;t get it why there are always at
least three competing solutions for the same problem.&lt;/p&gt;
&lt;p&gt;If there is something new, no one can tell you if it is worth the effort to
learn about it or if it is already gone next year.
Tooling in JavaScript-Land is still an issue. After all this time.
A lot has become better, but there is still a very very long way to go.&lt;/p&gt;
&lt;p&gt;The thing I don&amp;rsquo;t understand is that most problems JavaScript tooling is
trying to solve has already been solved in most of the other languages.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t need much - You have some source files there, want to process them
in some way, and copy them somewhere else.&lt;/p&gt;
&lt;p&gt;This is something a &lt;code&gt;makefile&lt;/code&gt; can do best - And as long tooling in
JavaScript is such a mess, I will always help myself by writing a &lt;code&gt;makefile&lt;/code&gt;
for my tasks.&lt;/p&gt;
&lt;p&gt;It is not the shiny new technology, and has a steep learning curve, but it has
proven to be very solid and flexible. It was not invented to be used for
JavaScript (it is much older than the language itself) - but it can accomplish
the job better than most native tools in JavaScript.&lt;/p&gt;
&lt;p&gt;I think the situation is just sad, let&amp;rsquo;s see if my next journey into
JavaScript-Land will bring up something useful.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m now done with my rant and off, writing a &lt;code&gt;makefile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So long.&lt;/p&gt;
</description>
		</item>
		<item>
			<title>About</title>
			<link>https://www.toor.su/about/</link>
			<pubDate>Wed, 31 Oct 2018 20:12:54 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/about/</guid>
			<description>&lt;p&gt;Welcome to my blog!&lt;/p&gt;
&lt;figure&gt;&lt;img src=&#34;https://www.toor.su/about/nothing-to-say.jpg&#34;
    alt=&#34;I have nothing to say! - You should blog about it&#34;&gt;
&lt;/figure&gt;
&lt;p&gt;I am a computer person currently living in Leipzig, Germany.&lt;/p&gt;
&lt;p&gt;This page is the place where I write about things I find interesting or
I stumble upon.&lt;/p&gt;
&lt;p&gt;I like technology in general, that&amp;rsquo;s also why I am currently
working as backend software engineer and enjoy it very much.
But I also can and often do system administration, frontend stuff,
embedded development, know my way around electronics, soldering and much more.&lt;/p&gt;
&lt;p&gt;A long long time ago I already had some blog, but unfortunately it was
german only and slowly degraded to a collection of random content
found somewhere on the Internet, thus suffering from linkrot&amp;hellip;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s not repeat that.&lt;/p&gt;
&lt;p&gt;At the moment, I am not quite sure where this journey will take us. But over
time I will figure out what will work on this site.&lt;/p&gt;
&lt;p&gt;So long!&lt;/p&gt;
</description>
		</item>
		<item>
			<title>Hello World</title>
			<link>https://www.toor.su/posts/2018/10/hello-world/</link>
			<pubDate>Fri, 19 Oct 2018 22:47:51 +0100</pubDate>
			<author>root@localhost (Fritz Pfiffig)</author>
			<guid isPermaLink="true">https://www.toor.su/posts/2018/10/hello-world/</guid>
			<description>&lt;blockquote&gt;
&lt;p&gt;What it is is beautiful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This post was created as a test - after long hours of installing the
server where this site runs on, writing configuration files and installing
the blog software I was too tired to think of something more
creative than that.&lt;/p&gt;
&lt;p&gt;Sorry about that, to see some more information, take a look at the
&lt;a href=&#34;https://www.toor.su/about/&#34; title=&#34;about  &#34;&gt;about page&lt;/a&gt;.&lt;/p&gt;
</description>
		</item>
	</channel>
</rss>
