<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>Port19s Webpage</title>
      <link>https://port19.xyz</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://port19.xyz/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Wed, 13 May 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>💻Offline Stack💻</title>
          <pubDate>Wed, 13 May 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/offline/</link>
          <guid>https://port19.xyz/offline/</guid>
          <description xml:base="https://port19.xyz/offline/">&lt;p&gt;also check my &lt;em&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;programs&#x2F;&quot;&gt;programs I use&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Precursor to this list: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;internet-exit&#x2F;&quot;&gt;💻 Internet Exit Strategy&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;🌸 = high value, those are also saved on my phone&lt;&#x2F;p&gt;
&lt;h2 id=&quot;llms&quot;&gt;LLMs&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;9GB &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;lmstudio-community&#x2F;gemma-4-E4B-it-MLX-8bit&quot;&gt;gemma-4-E4B-it-MLX-8bit&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;3.6GB &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;huggingface.co&#x2F;mlx-community&#x2F;gemma-4-e2b-it-4bit&quot;&gt;gemma-4-e2b-it-4bit&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;non-kiwix&quot;&gt;Non Kiwix&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;🌸1.42GB all of standardebooks.org &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;standardebooks.org&#x2F;donate&quot;&gt;(Patrons Circle)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1GB Music &lt;code&gt;yt-dlp -f 249&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;🌸600MB &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;organicmaps&#x2F;organicmaps&quot;&gt;OrganicMaps&lt;&#x2F;a&gt; Offline Maps of all of Baden-Württemberg&lt;&#x2F;li&gt;
&lt;li&gt;464MB Newadvent Catholic Encyclopedia &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;newadvent.gumroad.com&#x2F;l&#x2F;na2&quot;&gt;(20 USD Offline Version)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;200MB &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.geoguessr.com&#x2F;quiz&#x2F;seterra&quot;&gt;Seterra&lt;&#x2F;a&gt; (ipad app on mac)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;kiwix&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Kiwix&quot;&gt;Kiwix&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;🌸52GB full  English Wikipedia without pictures&lt;&#x2F;li&gt;
&lt;li&gt;22.3GB CrashCourse&lt;&#x2F;li&gt;
&lt;li&gt;2.22GB WikiMed Medical Encyclopedia&lt;&#x2F;li&gt;
&lt;li&gt;1.19GB StackExchange: Apple Q&amp;amp;A&lt;&#x2F;li&gt;
&lt;li&gt;189MB StackExchange: Christianity Q&amp;amp;A&lt;&#x2F;li&gt;
&lt;li&gt;115MB StackExchange: Economics Q&amp;amp;A&lt;&#x2F;li&gt;
&lt;li&gt;🌸35MB ArchWiki&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 Site Archival &amp; My Favorite Posts</title>
          <pubDate>Tue, 07 Apr 2026 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/farewell/</link>
          <guid>https://port19.xyz/tech/farewell/</guid>
          <description xml:base="https://port19.xyz/tech/farewell/">&lt;p&gt;My domain expires exactly a year from now, so I thought it fitting to release a short update.
Basically I don&#x27;t feel like publicly writing as port19 anymore.
Lists, especially &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;bible-study&quot;&gt;bible study&lt;&#x2F;a&gt;, will probably receive some more updates, but no more standalone posts are planned after this one.&lt;&#x2F;p&gt;
&lt;p&gt;After domain expiry, you&#x27;ll be able to access my website via my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&quot;&gt;github profile&lt;&#x2F;a&gt;, since it&#x27;s hosted on github pages.
Alternatively, with my entire site being only 12 megabytes in size, you can download it for local archival in less than a minute via &lt;code&gt;wget -mpEknp https:&#x2F;&#x2F;port19.xyz&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Thank you for your enduring interest and your many kind emails over the years.&lt;br &#x2F;&gt;
~port19&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-favorite-posts&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-favorite-posts&quot; aria-label=&quot;Anchor link for: my-favorite-posts&quot;&gt;🔗&lt;&#x2F;a&gt;

My Favorite Posts&lt;&#x2F;h2&gt;
&lt;p&gt;This is a good opportunity to highlight some of my favorite posts over the years, in no particular order.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;tech&quot;&gt;
Tech&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;webapps&#x2F;&quot;&gt;💻 Web apps are marketable&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;ansible-provision&#x2F;&quot;&gt;💻 DigitalOcean Provisioning with Ansible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;emacs&#x2F;&quot;&gt;💻 Why Emacs?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;fonttools&#x2F;&quot;&gt;💻 Optimizing Unicode Fonts with Fonttools&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;shell&#x2F;&quot;&gt;💻 Shell Scripting Advice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;licenses&#x2F;&quot;&gt;💻 On FOSS Licenses&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;neovim-customization&#x2F;&quot;&gt;💻 Neovim customization is inexcusably bad&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;git-signing&#x2F;&quot;&gt;💻 Commit Signatures via SSH&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;blog&#x2F;&quot;&gt;💻 My Blogging System&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;recipes&quot;&gt;
Recipes&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;recipes&#x2F;mushroom-stew&#x2F;&quot;&gt;🍚 Mushroom Stew&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;recipes&#x2F;chickpea-curry&#x2F;&quot;&gt;🍚 Chana masala with spinach&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;recipes&#x2F;shrimp-rice&#x2F;&quot;&gt;🍚 Shrimp rice&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;lifestyle&quot;&gt;
Lifestyle&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;rolling-shoppinglist&#x2F;&quot;&gt;📚 The rolling shopping list&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;no-smartphone&#x2F;&quot;&gt;📚 3 weeks without a smartphone&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;bullshit-job-fallacy&#x2F;&quot;&gt;📚 Overcoming the bullshit job fallacy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>📚 What I&#x27;ve read this year</title>
          <pubDate>Sun, 30 Nov 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/reading-2025/</link>
          <guid>https://port19.xyz/lifestyle/reading-2025/</guid>
          <description xml:base="https://port19.xyz/lifestyle/reading-2025/">&lt;img src=&quot;.&#x2F;z.jpg&quot; width=400vw&gt;
&lt;details&gt;
&lt;summary&gt;
plaintext list for copy-pasting
&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;font-weight: bold;&quot;&gt;# Fiction&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; George Orwell - Animal Farm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Leo Tolstoy - The Kreutzer Sonata&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Franz Kafka - Metamorphosis&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; F. Scott Fitzgerald - The Great Gatsby&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;font-weight: bold;&quot;&gt;# Politics&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Arthur Schopenhauer - On Women&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Lewis Carroll - Alice&amp;#39;s Adventures in Wonderland&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Niccolò Machiavelli - The Prince&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; Karl Marx - The Communist Manifesto&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;font-weight: bold;&quot;&gt;# Theology&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; The Holy Spirit - The New Testament&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; St. Alphonsus Liguori - 12 Steps to Holiness and Salvation&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; St. Louis de Montfort - The Secret of the Rosary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;  -&lt;&#x2F;span&gt;&lt;span&gt; St. Benedict of Nursia - The Rule of Saint Benedict&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;br&gt;
&lt;p&gt;This year was the first year in a long time that I took reading seriously.
In the first half of the year this started as a religiously motivated reading of the new testament, one chapter a day at first.
As spring turned into summer and I grew in my faith, I started reading &quot;12 Steps To Holiness And Salvation&quot;, which I read a chapter every 2-3 weeks, and plan to re-read next year 1 chapter a month, as intended by the redemptorist order.&lt;&#x2F;p&gt;
&lt;p&gt;In summer, I expanded my reading to &quot;The New Penguin History Of The World&quot;, which I may finish next year and fiction with Kafka&#x27;s Metamorphosis. One thing that helped with retaining what I read in &quot;The New Penguing History Of The World&quot; better was to first listen to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;playlist?list=PLNlh4Gp_Ev_an3LoU7kipa1eHdyQa3Syx&quot;&gt;audiobook version&lt;&#x2F;a&gt; of a chapter before reading it the next day.&lt;&#x2F;p&gt;
&lt;p&gt;The move to reading ebooks with apple books had the biggest impact on my reading by far. Something about the 30 minute daily reading goal and streaks is just really motivating to me, especially on days where I&#x27;m not super motivated to read.
Having my books on my phone also enables me to read in short bursts when commuting or standing in line somewhere.
It was in ebook form that I read the majority of the books on display.
Also just look at how pretty the widget looks:&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;widget.jpg&quot; width=400vw&gt;
&lt;p&gt;Next year I&#x27;d like to match my 12 books this year, but perhaps read books that are a bit longer, as this year the only book that definitely surpasses 100k words is the New Testament.&lt;&#x2F;p&gt;
&lt;p&gt;At this point I want to shoutout &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;standardebooks.org&quot;&gt;standardebooks.org&lt;&#x2F;a&gt;, which is the best place to get perfect quality public domain ebooks.
Go and read at least a short book this advent.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Floor Sleeping Review 2</title>
          <pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/floor-sleeping-review2/</link>
          <guid>https://port19.xyz/lifestyle/floor-sleeping-review2/</guid>
          <description xml:base="https://port19.xyz/lifestyle/floor-sleeping-review2/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;setup.jpg&quot; height=&quot;400vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
right side profile of my setup
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;I finally got it, I cracked the code.&lt;br &#x2F;&gt;
For the last nine nights I have slept on the floor and I have no intentions of going back.
Even my apple watch agrees that the sleep I now get is as restful as on my bed.&lt;&#x2F;p&gt;
&lt;p&gt;The last time I seriously tried this three years ago I used a 6mm yoga mat and a sleeping bag.
Now I am layering &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ikea.com&#x2F;de&#x2F;de&#x2F;p&#x2F;trattviva-tagesdecke-dunkelgrau-60615067&#x2F;&quot;&gt;this&lt;&#x2F;a&gt; 230x250cm blanket from IKEA, folded twice on the long side, on top of the yoga mat.
Since the short side is still a bit longer than the mat, I let it overhang slightly and fold in the head side for some extra elevation.
During the day I let both the blanket and yoga mat air out.
As for sleeping positions, this works well on my back and on either side.&lt;&#x2F;p&gt;
&lt;p&gt;Finally I can rid myself of my most annoying possession, my bed.&lt;br &#x2F;&gt;
This is a sequel to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;floor-sleeping-review&#x2F;&quot;&gt;my second lifestyle post&lt;&#x2F;a&gt; from 3 years ago.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Edit Oct 31st: I did this until the 24th, comfort decreased gradually with the compression of blanket and yoga mat. I also found side sleeping more unpleasant, as head elevation was difficult to maintain at the desired level. Also its cold now. I know where to proceed when I go back to the floor, but this winter I shall remain in my bed&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Internet Exit Strategy</title>
          <pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/internet-exit/</link>
          <guid>https://port19.xyz/tech/internet-exit/</guid>
          <description xml:base="https://port19.xyz/tech/internet-exit/">&lt;p&gt;&lt;em&gt;the majority of this blogpost was written mid september&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The dead internet theory was still fringe 5 years ago, but now even mainstream
voices are complaining about the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pluralistic.net&#x2F;2022&#x2F;11&#x2F;28&#x2F;enshittification&#x2F;&quot;&gt;enshittification&lt;&#x2F;a&gt; of social media and all other online platforms.
With the rise of generative AI, the rest of the internet, previously accessible via search indices, has been drowned out in SEO garbage.
Since this view is as mainstream as it is, I&#x27;ll stop lamenting the issue and tell you what I&#x27;m doing about it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;download-everything&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#download-everything&quot; aria-label=&quot;Anchor link for: download-everything&quot;&gt;🔗&lt;&#x2F;a&gt;

Download Everything&lt;&#x2F;h2&gt;
&lt;p&gt;The first obvious thing to do is to download a lot of media.
So here&#x27;s the list of what I&#x27;ve been downloading with approximate sizes and links if you want to do so as well.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;65GB Seinfeld &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;1337x.to&#x2F;torrent&#x2F;4507711&#x2F;Seinfeld-1989-Season-1-9-S01-S09-Mixed-x265-HEVC-10bit-AAC-2-0-Silence-QxR&#x2F;&quot;&gt;(torrent)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;22GB Spongebob &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;1337x.to&#x2F;torrent&#x2F;3060521&#x2F;SpongeBob-SquarePants-1999-2015-480p-720p-HEVC-x265-pseudo&#x2F;&quot;&gt;(torrent)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1GB Music &lt;code&gt;yt-dlp -f 249&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;500MB Books (library genesis)&lt;&#x2F;li&gt;
&lt;li&gt;500MB Websites &lt;code&gt;wget  --mirror --convert-links --adjust-extension --page-requisites&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;4GB SNES ROM Set &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;myrient.erista.me&#x2F;&quot;&gt;myrient&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;better-content&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#better-content&quot; aria-label=&quot;Anchor link for: better-content&quot;&gt;🔗&lt;&#x2F;a&gt;

Better Content&lt;&#x2F;h2&gt;
&lt;p&gt;The next issue is breaking the habit of browsing algorithmic online platforms, which in my case is mostly just Reddit and YouTube.
Now I could go ahead and just add a small selection of subreddits and youtube channels to an RSS feed reader, but I believe its better to just default to 4chan for now, since I find that site more entertaining and enriching.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;internet-curfews&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#internet-curfews&quot; aria-label=&quot;Anchor link for: internet-curfews&quot;&gt;🔗&lt;&#x2F;a&gt;

Internet Curfews&lt;&#x2F;h2&gt;
&lt;p&gt;Eventually I want to spend less and less time online, so a good place to start is to just unplug the router an hour before bed and only plug it back in an hour after getting up.
An alternative is to spend a whole day offline every once in a while, but I prefer just chunks of offline time for now.&lt;&#x2F;p&gt;
&lt;p&gt;Ofc once I actually have a regular job I will adapt this as needed. If I only have an hour in the morning before commuting to work, I will go online for a couple minutes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;offloading-to-mobile&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#offloading-to-mobile&quot; aria-label=&quot;Anchor link for: offloading-to-mobile&quot;&gt;🔗&lt;&#x2F;a&gt;

Offloading to Mobile&lt;&#x2F;h2&gt;
&lt;p&gt;If I install discord, email and github on my phone that already covers the majority of stuff I need to do online.
Even if I keep using the laptop for these, having them on the phone as well makes me more resilient against network outages, since the phone is even more portable and I can go into the city for wifi. This may eventually enable me to shift to mobile data only and save the money for at home internet.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Easy Lockscreen Autoreboot</title>
          <pubDate>Tue, 09 Sep 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/autoreboot/</link>
          <guid>https://port19.xyz/tech/autoreboot/</guid>
          <description xml:base="https://port19.xyz/tech/autoreboot/">&lt;h2 id=&quot;why&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;🔗&lt;&#x2F;a&gt;

Why&lt;&#x2F;h2&gt;
&lt;p&gt;Full Disk Encryption is more secure than any lockscreen.
My FDE password is much more secure than my lockscreen password.
If my laptop is stolen while in lockscreen, whether by criminals or feds, I want it to move into a more secure state eventually to circumvent brute-force attacks.&lt;&#x2F;p&gt;
&lt;p&gt;Also I guess this is neat to save power if you go on vacation or sth.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#how&quot; aria-label=&quot;Anchor link for: how&quot;&gt;🔗&lt;&#x2F;a&gt;

How&lt;&#x2F;h2&gt;
&lt;p&gt;On arch based distros with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Polkit&quot;&gt;polkit&lt;&#x2F;a&gt;, an unpriviledged user can execute power management commands like &lt;code&gt;reboot&lt;&#x2F;code&gt; and &lt;code&gt;poweroff&lt;&#x2F;code&gt;.
I use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Slock&quot;&gt;slock&lt;&#x2F;a&gt; as my lockscreen, any alternative should work.
Modify the number of seconds to sleep as needed. I use 12 hours, but I can see anything from 1-24 hours being useful depending on threat model.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;emacs-lisp&quot;&gt;
Emacs Lisp&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; launch&lt;&#x2F;span&gt;&lt;span&gt; (command)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (interactive (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;list&lt;&#x2F;span&gt;&lt;span&gt; (read-shell-command &lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;$ &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (start-process-shell-command command &lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;nil&lt;&#x2F;span&gt;&lt;span&gt; command))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;defun&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; slock&lt;&#x2F;span&gt;&lt;span&gt; () (interactive)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         (launch &lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;sleep 43200 &amp;amp;&amp;amp; reboot&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;;12 hours&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         (launch &lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;slock &amp;amp;&amp;amp; killall sleep&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;shell&quot;&gt;
Shell&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;sleep&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 43200&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; reboot&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;slock&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt; killall&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; sleep&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>📚 Second Nursing Internship</title>
          <pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/2nd-nursing-internship/</link>
          <guid>https://port19.xyz/lifestyle/2nd-nursing-internship/</guid>
          <description xml:base="https://port19.xyz/lifestyle/2nd-nursing-internship/">&lt;h1 id=&quot;update-from-inside-the-welfare-trap&quot;&gt;Update From Inside The Welfare Trap&lt;&#x2F;h1&gt;
&lt;p&gt;I have been unemployed for a little over 6 months at this point and believe this warrants another NEET update.
I&#x27;m also now in my second week of my second nursing internship, which I will also talk about at length.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;q1-q2&quot;&gt;Q1-Q2&lt;&#x2F;h2&gt;
&lt;p&gt;Being unemployed was pretty nice in March, where I mostly enjoyed it as I would a regular
vacation and could do so in good conscience in anticipation of my first &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;nursing-internship&#x2F;&quot;&gt;nursing internship&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Then starting in late April throughout May and even June, I spent most of my time learning about Christian
theology and bootstrapping myself in the faith and practice of roman Catholicism.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;applying-for-it-support-roles&quot;&gt;Applying for IT Support Roles&lt;&#x2F;h2&gt;
&lt;p&gt;Starting in late June, following through most of July, I sent out a couple of job applications
for IT support positions coinciding with a job coaching that I got financed by the German
Bureau of Unemployment.
It is not that I was unsuccessful in my pursuit of IT support positions, in fact, I got
invitations to the interview for a majority of the applications I sent out.
But to put it delicately, the positions were dishonestly advertised at best requiring travel
for work, with them raising their eyebrows at my absent driver&#x27;s license and even containing
a significant amount of work that I claim falls outside the responsibility of an ordinary
IT support agent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nursing&quot;&gt;Nursing&lt;&#x2F;h2&gt;
&lt;p&gt;Getting fed up with it, I made the resolution to, once again, pursue nursing.
Over the course of last month, I managed to secure a seat in a school offering
the theoretical half of the nursing apprenticeships starting in April of next year.
I also updated my spreadsheet and contacted several of the facilities in my city that are
convenient to commute to and even lined up an internship which I&#x27;m now in the second week of.&lt;&#x2F;p&gt;
&lt;p&gt;Regarding the internship, I can so far confidently state that nursing in this facility is a lot
more joyful and welcoming than it is in the previous facility I got to know in March.
At least with regards to elderly care nursing, I can also say it feels like a very non-bullshit
and even distinctly human activity, and I like that it puts its drawbacks right up front.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lamenting-bullshit-jobs&quot;&gt;Lamenting Bullshit Jobs&lt;&#x2F;h2&gt;
&lt;p&gt;I don&#x27;t think anyone is surprised to find out that in nursing
you have to do shift work and you have to deal with human excrement and be witness to
people suffering.
Contrast this with your average 9 to 5 office bullshit job where you may go in expecting
to engage with your subject material for 8 hours a day and to be able to, to the best of
your ability, produce quality outcomes but are ultimately faced with heavy bureaucracy,
endless meetings and economic constraints that force you to compromise on the quality of
your labor as well as compounding inadequacies that are so common in legacy code bases to be specific.&lt;br &#x2F;&gt;
Yes, I am biased here, but am I not speaking the truth?&lt;br &#x2F;&gt;
In fact, with regards to computer science specifically, I can very much do without the
constant reinventing of wheels and ever-growing towers of abstraction.
The human body, while certainly complicated and all, is rather constant.
I would be surprised if we, in the next decades, find out about a new organ, or invent the
liver 2.0. That just doesn&#x27;t happen.
And especially in the role of a mere nurse, your primary responsibility is to keep people alive, medicated, clean,
fed and clothed.
It&#x27;s not rocket science.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;welfare-trap&quot;&gt;Welfare Trap&lt;&#x2F;h2&gt;
&lt;p&gt;This brings me to the present. while interesting and kind of fulfilling, nursing is still
work and right now I have all my needs met by the German welfare state (arguably socialism). I believe this
is the definition of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Welfare_trap&quot;&gt;welfare trap&lt;&#x2F;a&gt;. The certainly subjective notion that going and working
yields an increase in pay that is disproportionate and perhaps not even worthwhile compared to the
increase in workload and of course the coinciding decrease of general quality of life.&lt;&#x2F;p&gt;
&lt;p&gt;I am not seriously proposing I stay unemployed indefinitely but given this situation I do appreciate
that the apprenticeship will only start next April and that I can basically reap the
benefits of other taxpayers&#x27; money for another several months. Something I am
pretty sure I will not be able to do in another 10, 20, 30 years when certain
demographic and economic realities materialize in Germany as well as many
other nations around the globe.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;in-summary&quot;&gt;In Summary&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;m alive, I&#x27;m Christian and I&#x27;m doing pretty well.&lt;br &#x2F;&gt;
After months of unemployment, I am now pursuing nursing seriously again and have everything
lined up to start the apprenticeship next April.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Re-Reviewing the Apple Ecosystem</title>
          <pubDate>Thu, 07 Aug 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/apple-ecosystem-2/</link>
          <guid>https://port19.xyz/tech/apple-ecosystem-2/</guid>
          <description xml:base="https://port19.xyz/tech/apple-ecosystem-2/">&lt;h2 id=&quot;previously&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#previously&quot; aria-label=&quot;Anchor link for: previously&quot;&gt;🔗&lt;&#x2F;a&gt;

Previously&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;m4-power&#x2F;&quot;&gt;(2025) X86 vs M4 Mac Mini Benchmarks&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;garmin-vs-apple-watch&#x2F;&quot;&gt;(2024) Garmin vs Apple Watch&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;apple-ecosystem&#x2F;&quot;&gt;(2024) Apple Ecosystem Review&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;macos&#x2F;&quot;&gt;(2023) M1 Mac Review&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;introduction&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#introduction&quot; aria-label=&quot;Anchor link for: introduction&quot;&gt;🔗&lt;&#x2F;a&gt;

Introduction&lt;&#x2F;h2&gt;
&lt;p&gt;In my on-off relationship with apple hard- and software, I converged on some specific usage patterns and have now formed a sufficiently refined opinion that it warrants a fresh review of the apple ecosystem.
Apple makes great hardware that I can readily recommend to anyone willing to invest into multiple of their products to get a polished out of the box experience.
Where apple falls short is the software availability and in the details of their synergy.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;airpods&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#airpods&quot; aria-label=&quot;Anchor link for: airpods&quot;&gt;🔗&lt;&#x2F;a&gt;

Airpods&lt;&#x2F;h2&gt;
&lt;p&gt;These are just basic bluetooth headphones.
The Airpods 3 also have a much worse earbud shape than the 2s I also own.
They fall out constantly. Synergy? Nonexistent.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;airtags&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#airtags&quot; aria-label=&quot;Anchor link for: airtags&quot;&gt;🔗&lt;&#x2F;a&gt;

Airtags&lt;&#x2F;h2&gt;
&lt;p&gt;Airtags are a fine addition to a collection of apple hardware.
I treat them like insurance for my wallet and keys, as in I will probably never actually need them, but when I do they will make a big difference.
Synergy? Strong.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;m4-mac-mini&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#m4-mac-mini&quot; aria-label=&quot;Anchor link for: m4-mac-mini&quot;&gt;🔗&lt;&#x2F;a&gt;

M4 Mac Mini&lt;&#x2F;h2&gt;
&lt;p&gt;The things I noted in the apple synergy section of my X86 vs M4 Benchmarks post still apply here, but my perspective has changed slightly.
Sure, having a synced productivity trio of notes, reminders and calendar is nice.
Apple also greatly simplifies at least wireless file transfers from phone to pc compared to an android plus linux combo.
If I were to constantly make photographs, this would be a great choice, easily outweighing its downsides.
Similarly, if I was a startup founder or in some other position where I need a maximalist productivity system that easily syncs between phone and PC, the M4 Mac Mini would be preferable.&lt;&#x2F;p&gt;
&lt;p&gt;Annoyances accumulate on the software side.
If I want to do any semi-serious work, macos is just inferior to linux.
If I want to do any semi-serious play, it is still inferior to linux. &lt;br &#x2F;&gt;
Not all emulators I know and love for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;retro-games&#x2F;&quot;&gt;retro gaming&lt;&#x2F;a&gt; are available on mac os. Let&#x27;s not even get to all the steam games that don&#x27;t work.
Similarly, basic scripting tools from the gnu coreutils and util-linux are missing in mac os.
Emacs is also less performant and has slight compatibility issues on mac os.&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t get me wrong, I&#x27;m still skeptical of my long term career investments in IT and am divesting into other options, so I don&#x27;t care nearly as much about coding productivity on my pc as I did two or three years ago.
I am however still a technology enthusiast that appreciates diversity and change in his software environment.
Perhaps it is this tech enthusiasm that still gives me friction in mac os.&lt;&#x2F;p&gt;
&lt;p&gt;One further point of synergy I want to mention here is that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.apple.com&#x2F;en-us&#x2F;102546&quot;&gt;continuity camera&lt;&#x2F;a&gt; does indeed work if you wire up the iphone.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iphone-16e-apple-watch-series-9&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#iphone-16e-apple-watch-series-9&quot; aria-label=&quot;Anchor link for: iphone-16e-apple-watch-series-9&quot;&gt;🔗&lt;&#x2F;a&gt;

iPhone 16e &amp;amp; Apple Watch Series 9&lt;&#x2F;h2&gt;
&lt;p&gt;The iPhone 16e is a great phone with easily 2 days of battery life.
The Apple Watch Series 9 at least has a fresh battery, but still only lasts a day and a night, certainly not two days.&lt;&#x2F;p&gt;
&lt;p&gt;I am still of the opinion that the iphone and apple watch, while mediocre in isolation, easily beat any android plus smartwatch combo for every day use, especially if you also want to do health and fitness monitoring. I will keep these for the foreseeable future.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;🔗&lt;&#x2F;a&gt;

Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;For anyone that would label themselves a technology enthusiast, let alone IT professional, my advice is to not bet on a mac as your sole computer.
It is fine as a secondary device, and does have some nice interplay with an iphone, but this synergy does not elevate it to be a superior choice over an X86 linux system, not even with the great power efficiency and cpu performance of the m4 chip.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Basic Prepping</title>
          <pubDate>Wed, 06 Aug 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/basic-prepping/</link>
          <guid>https://port19.xyz/lifestyle/basic-prepping/</guid>
          <description xml:base="https://port19.xyz/lifestyle/basic-prepping/">&lt;p&gt;In February I played the game &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;282070&#x2F;This_War_of_Mine&#x2F;&quot;&gt;This War Of Mine&lt;&#x2F;a&gt;, in which you play a civilian surviving during war. It&#x27;s a very fun resource management type game and is what got me interested in the topic.
By the end of April, I was pretty much done with my prepping, but I didn&#x27;t feel like making a post out of it until now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;scope&quot;&gt;Scope&lt;&#x2F;h2&gt;
&lt;p&gt;This is not intended to keep you alive indefinitely in a true &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.urbandictionary.com&#x2F;define.php?term=shtf&quot;&gt;SHTF&lt;&#x2F;a&gt; scenario.
It&#x27;s supposed to give you a baseline for lasting 14 days, enough for any natural disaster or infrastructure outage to blow over for the foreseeable future.
I base all of this on information provided by the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bbk.bund.de&#x2F;EN&#x2F;Prepare-for-disasters&#x2F;Personal-Preparedness&#x2F;personal-preparedness_node.html&quot;&gt;german federal office of civil protection and disaster assistance&lt;&#x2F;a&gt;, as well as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=FzbsmrchwzY&quot;&gt;this youtube video&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;water-30eur&quot;&gt;Water (~30€)&lt;&#x2F;h2&gt;
&lt;p&gt;Drinking water is pretty important. 2 Liters per person per day is a good start, although I prefer to plan with 3 liters per day for myself.
I emphasise water over food, and have a goal capacity of 90 liters, which should last a month.&lt;&#x2F;p&gt;
&lt;p&gt;Also having some kind of container to capture rain water is a good idea since you can use subpar quality water for hygienic purposes.
If you have a bathtub, getting a water bladder for it makes sense, since water infrastructure is usually more resilient to faults than electricity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;food-100eur&quot;&gt;Food (~100€)&lt;&#x2F;h2&gt;
&lt;p&gt;I guess you can do just beans and rice if you want to be the stereotype.
I prefer having about a kilogram of nut mix, with a quarter each of almonds, hazelnuts, walnuts and cashews.
Dark chocolate is a staple of my diet and lasts for a year so I have about a kilogram of that stored in any given time.
Milk and cereal is good.
Pasta and canned chopped tomatoes are good.
Canned fruit is a waste of space due to low calorie density, but you can add one or two cans for variety.&lt;&#x2F;p&gt;
&lt;p&gt;Make sure you also have a plan for preparing the food you do have.
Although if your planning horizon is two weeks, you&#x27;ll be fine with just having a sufficient amount of foods that are consumable without preparation.
I&#x27;m not satisfied with my current protein planning, beef jerky is way too sweet and the canned pork I tried is extremely salty.
Any recommendations are greatly appreciated.&lt;&#x2F;p&gt;
&lt;p&gt;I also welcome any pointers regarding the beans and rice meta, I have no clue how to make a coherent meal with those.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;medical-100eur&quot;&gt;Medical (~100€)&lt;&#x2F;h2&gt;
&lt;p&gt;Get yourself a first aid kit, like the ones used in cars. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.eu&#x2F;leina-werke-kfz-verbandkasten-standard-schwarz-10002-a2004018.html&quot;&gt;(example)&lt;&#x2F;a&gt; &lt;br &#x2F;&gt;
Additionally, get the following as a medicinal baseline:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Pain Killer: Paracetamol (less side effects) or an NSAID like ibuprofen or aspirin&lt;&#x2F;li&gt;
&lt;li&gt;Electrolytes for diarrhea&lt;&#x2F;li&gt;
&lt;li&gt;Burn&#x2F;wound cream&lt;&#x2F;li&gt;
&lt;li&gt;Wound disinfectant&lt;&#x2F;li&gt;
&lt;li&gt;Hand disinfectant&lt;&#x2F;li&gt;
&lt;li&gt;Gloves&lt;&#x2F;li&gt;
&lt;li&gt;FFP2 Masks&lt;&#x2F;li&gt;
&lt;li&gt;Regular Masks&lt;&#x2F;li&gt;
&lt;li&gt;Sunscreen&lt;&#x2F;li&gt;
&lt;li&gt;Fever thermometer&lt;&#x2F;li&gt;
&lt;li&gt;Tweezers&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Also get yourself the necessary tools to take care of your usual problem area in terms of health.
In my case I added a blood pressure monitor and blood oxygen sensor to be able to monitor any heart issues.
They are pretty good now, but in times of malnutrition I&#x27;m sure they would creep up again, and at least with the heart you can run some diagnostics.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;radio-30eur&quot;&gt;Radio (~30€)&lt;&#x2F;h2&gt;
&lt;p&gt;Get a cheap battery powered radio and a dozen or two batteries of 2-3 different kinds. &lt;br &#x2F;&gt;
Radio stations are core parts of the disaster plans of nations since they are purely broadcast based and you only need a passive receiver.
You&#x27;ll receive important communications via radio, whether the status of the current natural disaster, or even in an SHTF scenario.
Even a weather forecast and a bit of background music can be useful.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;energy-500-eur-or-80eur&quot;&gt;Energy (500+€ or 80€)&lt;&#x2F;h2&gt;
&lt;p&gt;It makes sense to buy a solar generator if you have the necessary funds.
Having access to at least your offline electronic media library can keep spirits high when material conditions are subpar.&lt;&#x2F;p&gt;
&lt;p&gt;A minimalist approach could also be to get a power bank with a solar panel that&#x27;s just enough to charge your phone with. This way you stay under 100€ and can still access your downloaded media that way, including topical ebooks which become interesting once you scale to SHTF prepping. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.eu&#x2F;sandberg-solar-6-panel-powerbank-20000-schwarz-420-73-a2796676.html&quot;&gt;(example)&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Also make sure you at least have a book or two for backup.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;This standard of prepping is reasonably cheap, and can benefit you even if you just get sick for a week or two and don&#x27;t want to leave the house for that reason.
You can proceed to build up to a full SHTF Prep, but at that point it becomes its own hobby and the objective risk management returns diminish.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 The Rosary &gt;&gt; Mindfulness Meditation</title>
          <pubDate>Tue, 24 Jun 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/rosary/</link>
          <guid>https://port19.xyz/lifestyle/rosary/</guid>
          <description xml:base="https://port19.xyz/lifestyle/rosary/">&lt;p&gt;I&#x27;ve been praying the rosary for about a month now to great effect.
In this post I want to contrast the religious devotion of the rosary it with the secular exercise of mindfulness meditation.
I will do so from a secular perspective, withholding from you the many religious benefits of the rosary as propagated over the last ~500 years by many popes and saints.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mindfulness-meditation&quot;&gt;Mindfulness Meditation&lt;&#x2F;h2&gt;
&lt;p&gt;When I talk about mindfulness meditation, I&#x27;m talking about the common kind where you focus your attention on the breath.
This type of meditation has many proven benefits to mental and cognitive health, with thousands of studies and dozens of gurus ready to preach about it.
Beginners will benefit from guided meditation, so for those of you who want to give it a shot, I recommend the ad free &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;meditofoundation.org&#x2F;&quot;&gt;medito app.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In the past while I was still agnostic and later an undecided theist, I had a few phases where I picked up the habit of mindfulness meditation for a few weeks.
I would say I&#x27;m actually pretty good at mindfulness meditation. In those phases where I meditated I usually did so for about 10 minutes a day, often with light guidance of intermediate to advanced courses in the medito app, but also frequently with nothing but a timer.&lt;&#x2F;p&gt;
&lt;p&gt;10 minutes daily seems to be the most common practice.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-holy-rosary&quot;&gt;The Holy Rosary&lt;&#x2F;h2&gt;
&lt;p&gt;Now the rosary is a complex prayer and the most popular catholic private devotion.
It goes back to saint dominic who, according to pious catholic belief, received it from an apparition of the virgin mary.
It consists of 53 hail marys, 6 our fathers, 6 glory bes, 6 optional fatima prayers as well as the apostolic creed as an opener.
Additionally, there are 4 sets of 5 mysteries with a different one being assigned to each day of the week, focusing on different events in the life of jesus christ.
The rosary is split up into five decades, each starting with an our father and ending with a glory be and a fatima prayer. The meat of each decade is the mystery assigned to it and you&#x27;re supposed to contemplate it while reciting the hail marys.&lt;&#x2F;p&gt;
&lt;p&gt;The rosary is what we would secularly lump in with mantra meditation, not unlike what is practiced by many hindus and buddhists. Its contemplative component of the mysteries also adds the element of visualisation &#x2F; imagination.&lt;&#x2F;p&gt;
&lt;p&gt;A rosary takes me about 20-25 minutes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;rosary-superiority&quot;&gt;Rosary Superiority&lt;&#x2F;h2&gt;
&lt;p&gt;The difficulty of mindfulness meditation as a habit is that its notoriously difficult to make it stick and has a steep learning curve for beginners. Just check what self-help guru improvement pill has to say in this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;GriR73kSvPY?feature=shared&amp;amp;t=1313&quot;&gt;1 minute clip&lt;&#x2F;a&gt; from his habit tier list video.&lt;&#x2F;p&gt;
&lt;p&gt;The only difficulty of the rosary is the memorisation of the prayers used within it, but that actually has the positive effect of capturing your focus more fully while you are still learning them and are praying the rosary with a guide.
Even given this difficulty, it is much easier to get into than mindfulness meditation and importantly much easier to maintain as a habit as well, especially once you have memorised the prayers and can go on a walk while praying the rosary.&lt;&#x2F;p&gt;
&lt;p&gt;Under ideal conditions, that is under such conditions where it is sustainable as a daily habit to do so, 30 minutes of mindfulness meditation may even be superior to the rosary. But I challenge you to try and stick to even 5 minutes of daily mindfulness meditation for a month, its much easier said than done.
For mere mortals, the rosary handily beats mindfulness meditation on account of accessibility and ease of acquiring the habit.&lt;&#x2F;p&gt;
&lt;p&gt;So if you&#x27;re a christian that is open to this catholic practice I urge you to give the rosary a try.
If you&#x27;re from a different religion, research the repetitive prayer of it, as every major world religion has a devotion like this.
And to the atheists I say, try out mindfulness meditation or mantra meditation, its still better than nothing.&lt;&#x2F;p&gt;
&lt;p&gt;For further reading I&#x27;m gonna recommend an intro to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;iMQ_CRYWHME&quot;&gt;the rosary&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Track Everything</title>
          <pubDate>Tue, 24 Jun 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/track-everything/</link>
          <guid>https://port19.xyz/lifestyle/track-everything/</guid>
          <description xml:base="https://port19.xyz/lifestyle/track-everything/">&lt;p&gt;It randomly dawned on me today that I track way more stuff than most people and that it may be very insightful to my readers to know what and why.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;finance-spendnotes-rolling-shopping-list&quot;&gt;Finance: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;us&#x2F;app&#x2F;spendnotes-budget-tracker&#x2F;id1505752740&quot;&gt;Spendnotes&lt;&#x2F;a&gt; &amp;amp; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;rolling-shoppinglist&#x2F;&quot;&gt;Rolling Shopping List&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;I started the habit of tracking my spending in high school over five years ago at this point.
It&#x27;s a good way to hold yourself accountable and troubleshoot excess spending after the fact.
Even once your spending habits are under control and healthy, its best to keep tracking to keep them that way.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dining.gifts&#x2F;@mrblow&#x2F;piggybudget-a-personal-money-management-tool-for-getting-your-finances-under-control&quot;&gt;PiggyBudget&lt;&#x2F;a&gt; is a good free and open source alternative for android.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;rolling-shoppinglist&#x2F;&quot;&gt;Rolling Shopping List&lt;&#x2F;a&gt; is something I track in my journal and
neatly fits into this by greatly mitigating impulse purchases and also giving inspiration for spending in times of prosperity by looking back at older shopping lists for
items that are struck through but still somewhat compelling.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nutrition-cronometer&quot;&gt;Nutrition: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cronometer.com&#x2F;&quot;&gt;Cronometer&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;This is an area I wish I would have tracked much sooner, having only started this year.&lt;&#x2F;p&gt;
&lt;p&gt;The problem with nutrition trackers is that most merely track the macronutrients which are basically useless unless you have a predisposition that makes you need more of one macronutrient,
such as protein for body builders, carbs for endurance athletes and fats for people with inflammatory issues.
Worse yet, there tends to be a focus on calories which is really only relevant if you&#x27;re either overweight or underweight.&lt;&#x2F;p&gt;
&lt;p&gt;Cronometer is drastically different in that it does track macros and calories, but also all necessary micronutrients.
This is really helpful to identify an insufficiency or deficiency that you may have due to your dietary preferences and that may even cause health issues for you.
To give a concrete example: when I started tracking my nutrition via cronometer, I found out I never got more than 50% of the RDA of Vitamin A.
I bought a bag of carrots and ate 2 a day for a week and finally fixed my dry skin on my hand, that was red and flaky for months at that point.
I also, despite my best efforts, cannot for the life of me get more than 50% of the RDA of Vitamin B9&#x2F;Folate.
So I ordered a supplement for that and am looking forward to seeing if that cures some symptom I wasn&#x27;t even aware of.&lt;&#x2F;p&gt;
&lt;p&gt;Take some nutrition fun facts I learned from tracking with cronometer:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;1 Liter of orange juice has 3x the RDA of Vitamin C&lt;&#x2F;li&gt;
&lt;li&gt;20g of 85% Dark Chocolate has 35% the RDA of Iron and 10% the RDA of Magnesium&lt;&#x2F;li&gt;
&lt;li&gt;300g Steamed Broccoli twice a week will top off your Vitamin K&lt;&#x2F;li&gt;
&lt;li&gt;Potatoes are by far the easiest way to get loads of Vitamin E&lt;&#x2F;li&gt;
&lt;li&gt;Pasta with Tomato Sauce is jarringly nutritious&lt;&#x2F;li&gt;
&lt;li&gt;1 Banana has 25% of your Potassium RDA&lt;&#x2F;li&gt;
&lt;li&gt;My &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;recipes&#x2F;overnight-oats-2&#x2F;&quot;&gt;Overnight Oats&lt;&#x2F;a&gt; Recipe singlehandedly gives you 50% of your B Vitamins and Minerals&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;On top of giving you reliable nutrition metrics, tracking your food intake on its own will nudge you into making more healthy choices and eating more real food.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;health-fitness-via-apple&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Health_(Apple)&quot;&gt;Health&lt;&#x2F;a&gt; &amp;amp; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Fitness_(Apple)&quot;&gt;Fitness&lt;&#x2F;a&gt; (via Apple)&lt;&#x2F;h2&gt;
&lt;p&gt;Without my apple watch ecg, I wouldn&#x27;t have gotten my diagnosis and corrective surgery for my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;AV_nodal_reentrant_tachycardia&quot;&gt;AVNRT&lt;&#x2F;a&gt;, a rare heart arrhythmia that I&#x27;ve had for 10 years.
That alone will make the apple watch forever one of my best purchases.&lt;&#x2F;p&gt;
&lt;p&gt;But even as a healthy young man its useful to track several vitals and watch for potential changes.
I&#x27;m very confident that by taking it slow on days with elevated overnight heart rate I have fended off a few colds before even getting the first symptoms.
HRV can give you insight to overtraining or excess stress.
Sleep tracking may help you identify sleep problems or even sleep apnea.
You can even track symptoms and medications if you have a chronic illness to manage.&lt;&#x2F;p&gt;
&lt;p&gt;I should note that in addition to the default metrics already tracked by apple health I measure my blood pressure and enter my weight every few weeks.&lt;&#x2F;p&gt;
&lt;p&gt;The apple fitness app is a bit less useful, but still good to keep an eye on training load and performance.
Right now I&#x27;m keeping it conservative with my fitness ambitions, aiming for an average of 10k steps a day, but when I was at the height of my running phase it was extremely useful for its detailed metrics.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;journaling&quot;&gt;Journaling&lt;&#x2F;h2&gt;
&lt;p&gt;I don&#x27;t keep a diary, but I journal. The difference being that unlike a diary, I make entries far from daily. &lt;br &#x2F;&gt;
I started journaling in Q4 of 2022 and recently filled up my first &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.leuchtturm1917.de&#x2F;notizbuch-classic.html&quot;&gt;A6 Leuchtturm Journal&lt;&#x2F;a&gt; in Q1.
I would estimate that I make about one entry per week on average with them mostly clustering to once or twice a month.&lt;&#x2F;p&gt;
&lt;p&gt;While on this blog I share insights that I believe to be potentially useful to others, I use my journal for more private topics regarding whatever is keeping my mind occupied at the time or whatever I want to keep record of for the benefit of my future self looking back on my youth.&lt;&#x2F;p&gt;
&lt;p&gt;Journaling brings profound long term benefits to your mind and soul, but if you&#x27;re somehow oblivious to those, check out this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=FNJO1pZV-I8&quot;&gt;Video by Dr K&lt;&#x2F;a&gt; as a starting point.
Also don&#x27;t copy my approach to journaling and take the time try out different methods in the beginning.
Perhaps a diary or a bullet journal is more suited to your needs.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Overnight Oats 2.0</title>
          <pubDate>Tue, 24 Jun 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/overnight-oats-2/</link>
          <guid>https://port19.xyz/recipes/overnight-oats-2/</guid>
          <description xml:base="https://port19.xyz/recipes/overnight-oats-2/">&lt;img src=&quot;.&#x2F;overnight-oats.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;recipes&#x2F;overnight-oats&quot;&gt;V 1.0&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Fridge time: 6-12 hours&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;150g Oatmeal&lt;&#x2F;li&gt;
&lt;li&gt;70g raspberries&lt;&#x2F;li&gt;
&lt;li&gt;300g of milk&lt;&#x2F;li&gt;
&lt;li&gt;(optional) 10g flavored protein powder&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;bowl&lt;&#x2F;li&gt;
&lt;li&gt;plate&lt;&#x2F;li&gt;
&lt;li&gt;spoon&lt;&#x2F;li&gt;
&lt;li&gt;teaspoon&lt;&#x2F;li&gt;
&lt;li&gt;measuring cup&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;measure your oatmeal and add half of it to your bowl&lt;&#x2F;li&gt;
&lt;li&gt;now add the protein powder and mix&lt;&#x2F;li&gt;
&lt;li&gt;now add some raspberries, lightly mix again&lt;&#x2F;li&gt;
&lt;li&gt;add the remaining oatmeal&lt;&#x2F;li&gt;
&lt;li&gt;add the milk and stab it with your spoon a few times&lt;&#x2F;li&gt;
&lt;li&gt;cover the bowl with a plate&lt;&#x2F;li&gt;
&lt;li&gt;put the covered bowl into your fridge&lt;&#x2F;li&gt;
&lt;li&gt;go to sleep&lt;&#x2F;li&gt;
&lt;li&gt;Enjoy with a healthy breakfast&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>✝️ Bible Study ✝️ </title>
          <pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/bible-study/</link>
          <guid>https://port19.xyz/bible-study/</guid>
          <description xml:base="https://port19.xyz/bible-study/">&lt;p&gt;Yes, I&#x27;m christian. Roman Catholic to be percise.&lt;&#x2F;p&gt;
&lt;p&gt;My Bible is the revised &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Einheits%C3%BCbersetzung&quot;&gt;Einheitsübersetzung&lt;&#x2F;a&gt;, a german translation used in the liturgy of the catholic church, and the most widespread in germany.
It&#x27;s a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bibelwerk.shop&#x2F;produkte&#x2F;die-bibel-44020&quot;&gt;large leather edition.&lt;&#x2F;a&gt; For US shoppers I recommend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.catholiccompany.com&#x2F;&quot;&gt;the catholic company&lt;&#x2F;a&gt;,
from where I bought my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.catholiccompany.com&#x2F;blue-floral-ceramic-stretch-rosary-bracelet-i129114&#x2F;&quot;&gt;rosary&lt;&#x2F;a&gt; and my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.catholiccompany.com&#x2F;traditional-crucifix-w-chain-i36361&#x2F;&quot;&gt;crucifix chain&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I have 3 little statues, of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;de.aliexpress.com&#x2F;item&#x2F;1005010045705922.html&quot;&gt;Mary&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;de.aliexpress.com&#x2F;item&#x2F;1005009506834358.html&quot;&gt;St. Michael&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.de&#x2F;dp&#x2F;B0CJ6RK7CM&quot;&gt;Jesus&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;From &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tanbooks.com&#x2F;&quot;&gt;TAN Books&lt;&#x2F;a&gt; I have:&lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tanbooks.com&#x2F;products&#x2F;books&#x2F;the-12-steps-to-holiness-and-salvation-deluxe-leatherette&#x2F;&quot;&gt;St. Alphonsus Ligouri: 12 Steps to Holiness and Salvation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Picture of it all
&lt;&#x2F;summary&gt;
&lt;img src=&quot;&#x2F;catholicstuff3.jpg&quot; height=&quot;800vw&quot;&gt;
&lt;&#x2F;details&gt;
&lt;h2 id=&quot;completed&quot;&gt;Completed&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;spiritual-reading&quot;&gt;Spiritual Reading&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;1093642.The_12_Steps_to_Holiness_and_Salvation&quot;&gt;St Alphonsus Ligouri: 12 Steps to Holiness and Salvation&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;1448527.The_Secret_Of_The_Rosary&quot;&gt;St. Louis de Montfort: The Secret of the Rosary&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;82406.The_Rule_of_Saint_Benedict&quot;&gt;St. Benedict of Nursia: The Rule of Saint Benedict&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;132153.The_Sayings_of_the_Desert_Fathers&quot;&gt;Benedicta Ward: The Sayings of the Desert Fathers - The Alphabetical Collection&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;1590924.Uniformity_with_God_s_Will&quot;&gt;St. Alphonsus Ligouri: Uniformity with Gods Will&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;2105820.The_Secret_of_Confession&quot;&gt;Fr. Paul O&#x27;Sullivan: The Secret of Confession&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;7910670-how-to-converse-with-god&quot;&gt;St. Alphonsus Ligouri: How to Converse with God&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;31376513-doctrina-christiana&quot;&gt;St. Robert Bellarmine: Doctrina Christiana Explicatio&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;bible&quot;&gt;Bible&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Book&lt;&#x2F;th&gt;&lt;th&gt;Chapters&lt;&#x2F;th&gt;&lt;th&gt;Date Completed&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Ecclesiastes&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;26.02.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Gospel of John&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;td&gt;20.04.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Gospel of Luke&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;td&gt;12.05.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Romans&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;25.05.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Song of Songs&lt;&#x2F;td&gt;&lt;td&gt;8&lt;&#x2F;td&gt;&lt;td&gt;26.05.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Proverbs&lt;&#x2F;td&gt;&lt;td&gt;31&lt;&#x2F;td&gt;&lt;td&gt;18.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 John&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;19.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 John&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;19.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;3 John&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;19.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 Peter&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;20.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 Peter&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;20.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;James&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;22.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Jude&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;22.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Philemon&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;23.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Gospel of Mark&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;30.06.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Gospel of Matthew&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;29.07.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Acts&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;03.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 Corinthians&lt;&#x2F;td&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;15.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 Corinthians&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;18.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Galatians&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;21.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ephesians&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;23.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Philippians&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;25.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Colossians&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;25.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 Thessalonians&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;25.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 Thessalonians&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;27.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;1 Timothy&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;29.09.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;2 Timothy&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;03.10.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Titus&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;03.10.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hebrews&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;04.10.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Revelation&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;td&gt;03.11.2025&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Psalms&lt;&#x2F;td&gt;&lt;td&gt;150&lt;&#x2F;td&gt;&lt;td&gt;08.03.2026&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Genesis&lt;&#x2F;td&gt;&lt;td&gt;50&lt;&#x2F;td&gt;&lt;td&gt;11.04.2026&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Exodus&lt;&#x2F;td&gt;&lt;td&gt;40&lt;&#x2F;td&gt;&lt;td&gt;07.05.2026&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wisdom&lt;&#x2F;td&gt;&lt;td&gt;19&lt;&#x2F;td&gt;&lt;td&gt;13.05.2026&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Liturgy of the Hours: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;divineoffice.org&#x2F;&quot;&gt;English&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mein.stundengebet.de&#x2F;jetzt-beten&quot;&gt;German&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Mass Readings of the day: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.vaticannews.va&#x2F;en&#x2F;word-of-the-day.html&quot;&gt;English&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.vaticannews.va&#x2F;de&#x2F;tagesevangelium-und-tagesliturgie.html&quot;&gt;German&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ecatholic2000.com&#x2F;catena&#x2F;&quot;&gt;Catena Aurea&lt;&#x2F;a&gt; (extensive patristic commentaries on the gospels)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ecatholic2000.com&#x2F;library2&#x2F;library.shtml&quot;&gt;Library 1 (ecatholic2000.com)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.newadvent.org&#x2F;fathers&#x2F;&quot;&gt;Library 2 (newadvent.org)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fisheaters.com&#x2F;catholiclibrary.html&quot;&gt;Library 3 (fisheaters.com)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Chaplet of St. Michael the Archangel: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chapletofsaintmichael.com&#x2F;&quot;&gt;English&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;chapletofsaintmichael.com&#x2F;german&quot;&gt;German&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>📚 On (Rage)Bait, The News and Reddit</title>
          <pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/worse-than-social-media/</link>
          <guid>https://port19.xyz/lifestyle/worse-than-social-media/</guid>
          <description xml:base="https://port19.xyz/lifestyle/worse-than-social-media/">&lt;img src=&quot;.&#x2F;ragebait.gif&quot; height=&quot;400vw&quot;&gt;
&lt;p&gt;So almost 3 years ago I wrote a post about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;avoid-social-media&#x2F;&quot;&gt;social media&lt;&#x2F;a&gt; and how it wastes your time.
I kind of cringe at this cheap proclamation of virtue that any critique of social media is.
We all know that we should spend less time on our devices to a point that its fallback content for uninspired youtubers to yap about how bad TikTok is.
In that post I focused on one aspect of what makes social media disadvantageous to engage in: time cost &#x2F; opportunity cost.&lt;&#x2F;p&gt;
&lt;p&gt;I have now changed my perspective on the matter and am gonna go ahead and say that &lt;strong&gt;consuming brainrot on TikTok or video essays on Youtube is infinitely better and more virtuous than watching the news or scrolling reddit.&lt;&#x2F;strong&gt;
To scroll mindlessly is vacuous and can cost a great deal of time, I&#x27;m not denying that, but it does not by its nature poison your very soul.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m putting reddit and the news on the same tier of degeneracy because both have an extreme negativity bias.
War here, economic turmoil there, with some orange man tweets sprinkled in as well.
Culture war, man against woman, right against left, up against down, while our kids can&#x27;t even read a book front to back.
The news at least has a professional touch to it and tries to convince you it has objective or nuanced takes, on reddit the hivemind is so bad that on the political posts, which make up half of the frontpage, you usually see a chorus of identical opinions, half of which probably being bots, and a couple &quot;removed by moderator&quot;s, remnants of opposition.
X formerly Twitter TM is not better either. Its the same deal just right wing instead of left wing and with perhaps slightly less obnoxious censorship.&lt;&#x2F;p&gt;
&lt;p&gt;However if I unplug and spend a day offline I realise how quiet my neighbors are, I appreciate the full fridge and freezer I have, enjoy a short walk in the forrest.
I don&#x27;t care about the bombs exploding in far-off lands or the apparent oppression of the minority of the day. Even cleaning the bathroom is kind of fun in that mood of blissful indifference.&lt;&#x2F;p&gt;
&lt;p&gt;This is a rant more than it is advice. I fall for ragebait every day. I still watch the news every once in a while. But yeah, if you&#x27;re scrolling reddit or X thinking you&#x27;re somehow superior to gen alpha ipad kids doing TikTok dances, think again zoomer. You&#x27;re the grumpy old guy now.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 X86 vs M4 Mac Mini Benchmarks</title>
          <pubDate>Fri, 23 May 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/m4-power/</link>
          <guid>https://port19.xyz/tech/m4-power/</guid>
          <description xml:base="https://port19.xyz/tech/m4-power/">&lt;p&gt;I&#x27;m too lazy to write a large introductory paragraph, so take a look at the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pcpartpicker.com&#x2F;list&#x2F;MdvgQd&quot;&gt;X86 PC Part List&lt;&#x2F;a&gt; and head straight to the benchmarks.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benchmarks&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#benchmarks&quot; aria-label=&quot;Anchor link for: benchmarks&quot;&gt;🔗&lt;&#x2F;a&gt;

Benchmarks&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;power&quot;&gt;
Power&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Idle: 55W vs 5W&lt;&#x2F;li&gt;
&lt;li&gt;Youtube 1080p: 75W vs 5W&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;browserbench.org&#x2F;Speedometer3.1&#x2F;&quot;&gt;Speedometer 3.1&lt;&#x2F;a&gt; Brave: 110W peak vs 15W peak&lt;&#x2F;li&gt;
&lt;li&gt;Super Mario Sunshine 4K: 120W-130W vs 18-24W&lt;&#x2F;li&gt;
&lt;li&gt;XCOM 2 4K Minimal Menu: 200W vs 30W&lt;&#x2F;li&gt;
&lt;li&gt;Peak: 275W in Overwatch 2 vs 36W compiling Emacs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;performance&quot;&gt;
Performance&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;browserbench.org&#x2F;Speedometer3.1&#x2F;&quot;&gt;Speedometer 3.1&lt;&#x2F;a&gt; Brave: 23.6 vs 48.9&lt;&#x2F;li&gt;
&lt;li&gt;XCOM 2 4K Minimal Menu: 40FPS vs 15FPS&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks#submit-your-own&quot;&gt;Emacs Lisp Benchmark&lt;&#x2F;a&gt; Default GC Threshold: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks&#x2F;blob&#x2F;master&#x2F;cpu&#x2F;intel-i3-14100F.org#results-with-default-gc-cons-threshold&quot;&gt;30.95s&lt;&#x2F;a&gt; vs &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks&#x2F;blob&#x2F;master&#x2F;cpu&#x2F;apple-m4.org#results-with-default-gc-cons-threshold&quot;&gt;20.65s&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks#submit-your-own&quot;&gt;Emacs Lisp Benchmark&lt;&#x2F;a&gt; Comp 8MB GC Threshold: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks&#x2F;blob&#x2F;master&#x2F;cpu&#x2F;intel-i3-14100F.org#results&quot;&gt;20.87s&lt;&#x2F;a&gt; vs &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;enzuru&#x2F;native-comp-elisp-benchmarks&#x2F;blob&#x2F;master&#x2F;cpu&#x2F;apple-m4.org#results&quot;&gt;16.01s&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;amortisation&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#amortisation&quot; aria-label=&quot;Anchor link for: amortisation&quot;&gt;🔗&lt;&#x2F;a&gt;

Amortisation&lt;&#x2F;h2&gt;
&lt;p&gt;With my current electricity contract, I pay a little over 1€ per 3KWh.
Being mostly at home right now I use about 500Wh more power per day with the X86 PC than the M4.
This can accumulate with just 10 hours doing light PC work, 5 hours playing Gamecube at 4k or most often a combination of the two.
500Wh * 30 = 15 KWh = 5€ per month&lt;&#x2F;p&gt;
&lt;p&gt;The M4 Mac Mini cost 600€.
Given local used market pricing and liquidity, I can easily sell my X86 PC for 300€.
This gives a 300€ adjusted upgrade price.
Since 5*12 = 60 and 60*5 = 300, it would take five years for this upgrade to completely pay for itself.&lt;&#x2F;p&gt;
&lt;p&gt;Given my track record with computers its highly unlikely that I will actually keep the M4 Mac Mini for 5 years, but I feel like its still important to point out that the reduced electricity cost slowly amortises my upgrade and slowly decreases the adjusted upgrade cost towards zero.
Disregarding the excellent resell value of Apple Hardware, consider the following alternative outcomes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I upgrade in 1 year, leading to 240 euro adjusted cost &#x2F; 12 months = 20 Euro a month&lt;&#x2F;li&gt;
&lt;li&gt;I upgrade in 2 years, leading to 180 euro adjusted cost &#x2F; 24 months = 7.5 Euro a month&lt;&#x2F;li&gt;
&lt;li&gt;I upgrade in 3 years, leading to 120 euro adjusted cost &#x2F; 36 months = 3.33 Euro a month&lt;&#x2F;li&gt;
&lt;li&gt;I upgrade in 4 years, leading to 60 euro adjusted cost &#x2F; 48 months = 1.25 Euro a month&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;apple-synergy&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#apple-synergy&quot; aria-label=&quot;Anchor link for: apple-synergy&quot;&gt;🔗&lt;&#x2F;a&gt;

Apple Synergy&lt;&#x2F;h2&gt;
&lt;p&gt;In the meantime, I&#x27;ll enjoy the synergy this M4 Mac Mini has with my Iphone and, to a lesser extent, my Apple Watch.
The biggest pain on linux has always been transferring files from my phone to my pc and the reverse.
This is made trivial by iCloud, or alternatively by Airdrop.
The productivity trio of Calendar, Notes and Reminders also works better when available on both PC and Phone.&lt;&#x2F;p&gt;
&lt;p&gt;I will of course continue to miss sensible placements of special characters and my middle click paste, but in terms of gaming, the linux&#x2F;windows exclusive parts of my steam library are played through and retro gaming works just as well on mac os nowadays.
Programming is also marginally worse on Mac, but I&#x27;m not sinking massive amounts of time into programming these days anyway.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Nursing Internship &amp; NEET Update</title>
          <pubDate>Fri, 18 Apr 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/nursing-internship/</link>
          <guid>https://port19.xyz/lifestyle/nursing-internship/</guid>
          <description xml:base="https://port19.xyz/lifestyle/nursing-internship/">&lt;p&gt;&lt;em&gt;today my last day at work was exactly two months ago&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nursing-internship&quot;&gt;Nursing Internship&lt;&#x2F;h2&gt;
&lt;p&gt;My nursing internship in the last week of march was certainly interesting.
It started with an early shift from 7:30 am until 1:30 pm, which was my record in terms of steps per day this year: 20k steps and 360 stand minutes according to my apple watch.
That is a lot for now, but I could get used to that with some training leading up to it.
My job was mostly to make the beds, fetch material and disinfect the rooms. &lt;br &#x2F;&gt;
On the second day the shift started a bit earlier but I was able to get by with fewer steps because I fed one of the maximally impaired residents which took quite a while. &lt;br &#x2F;&gt;
On the third day I woke up exhausted with a sore throat and slightly elevated overnight heart rate. Since I got a good impression of the job already and didn&#x27;t want to get sick or spread my virus to the elderly, I called it quits. I managed to fend off that flu.&lt;&#x2F;p&gt;
&lt;p&gt;The job is exactly how I imagined it to be, but one big issue I could not have seen coming was my sensitivity to the smells.
I didn&#x27;t really mind the mild urine odour in over half the rooms, but feces stinks quite bad.
Aside from smells nothing bothered me, not the sound of rattling breath, not the sight of naked old people or even the soma of a resident.
Honestly the housekeeping tasks were kind of fun, so maybe I should try a hotel job next.&lt;&#x2F;p&gt;
&lt;p&gt;I won&#x27;t rule out nursing completely, but its not my first pick for right now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-i-pass-the-time&quot;&gt;How I pass the time&lt;&#x2F;h2&gt;
&lt;p&gt;In the meantime, I&#x27;ve started to build up some provisions according to our ministry for natural disasters using this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.bbk.bund.de&#x2F;SharedDocs&#x2F;Downloads&#x2F;DE&#x2F;Mediathek&#x2F;Publikationen&#x2F;Buergerinformationen&#x2F;Ratgeber&#x2F;ratgeber-notfallvosorge-checkliste.pdf?__blob=publicationFile&amp;amp;v=7&quot;&gt;checklist&lt;&#x2F;a&gt;.
In terms of exercise I&#x27;ve shifted my focus from running to regular walks in the forest after a mild knee injury caught me off guard. Additionally, I added this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=0o0kNeOyH98&quot;&gt;yoga routine&lt;&#x2F;a&gt; to most of my evenings.
Of course I&#x27;ve also continued to play a bunch of video games, currently I&#x27;m in my second run through castlevania symphony of the night, a game I can highly recommend.
But enough rambling about my NEET lifestyle, whats my plan from here?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;career-prospects&quot;&gt;Career Prospects&lt;&#x2F;h2&gt;
&lt;p&gt;First of all I&#x27;m not in a hurry to get my next job. But once my boredom reaches a certain point, likely sometime next month, I&#x27;ll send out some applications again.
It would be the wisest choice to just give IT a second chance at another employer, maybe a smaller company and a position with a slightly different focus.&lt;&#x2F;p&gt;
&lt;p&gt;But in the medium to long term everything is still on the table.
If my fitness wasn&#x27;t at such a low point right now, military service would be fun.
I could also try out a generic chill minimum wage job, especially if&#x2F;when they bump the minimum wage again.&lt;&#x2F;p&gt;
&lt;p&gt;I will post another update if something materialises, until then you may check out my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;retro-games&#x2F;&quot;&gt;retro gaming&lt;&#x2F;a&gt; list for updates on what I&#x27;m up to.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Leaving IT And Future Of This Blog</title>
          <pubDate>Tue, 11 Mar 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/leaving-it/</link>
          <guid>https://port19.xyz/tech/leaving-it/</guid>
          <description xml:base="https://port19.xyz/tech/leaving-it/">&lt;h2 id=&quot;low-activity&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#low-activity&quot; aria-label=&quot;Anchor link for: low-activity&quot;&gt;🔗&lt;&#x2F;a&gt;

Low Activity&lt;&#x2F;h2&gt;
&lt;p&gt;As you may have noticed, the frequency of posts on this blog has decreased from about two a month to almost radio silence.
Out of sheer laziness, I still have not built out the kitchen, almost half a year into this new apartment, so that doesn&#x27;t leave much opportunity to blog about new &lt;em&gt;recipes&lt;&#x2F;em&gt;.
In terms of &lt;em&gt;lifestyle&lt;&#x2F;em&gt;, everything has already been said and I wouldn&#x27;t want to repeat myself or just put out status updates about my mood or whatever.
The &lt;em&gt;tech&lt;&#x2F;em&gt; category, which used to be the majority of posts, has been kind of obsoleted due to dwindling interest on my part, let me elaborate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;early-it&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#early-it&quot; aria-label=&quot;Anchor link for: early-it&quot;&gt;🔗&lt;&#x2F;a&gt;

Early IT&lt;&#x2F;h2&gt;
&lt;p&gt;Going into IT, I knew from high school that I did not want to become a programmer.
I couldn&#x27;t stand Java or object oriented programming, and to this day after having OOP explained by three different professors over the course of my academic career I still can&#x27;t fathom why it&#x27;s the dominant paradigm in software development.
So instead after a brief attempt at studying mathematics, which I&#x27;m definitely too stupid for, I focused on IT Administration since I did a lot of linux tinkering at the time.
That tinkering continued throughout my time in college, with lisp and emacs being notable areas I focused on and enjoyed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-it-job&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#first-it-job&quot; aria-label=&quot;Anchor link for: first-it-job&quot;&gt;🔗&lt;&#x2F;a&gt;

First IT Job&lt;&#x2F;h2&gt;
&lt;p&gt;I finished my bachelors degree in computer science and got that first IT job.
But despite the great working conditions and at least decent pay I was not fulfilled by my work since it was utterly boring and pointless at best.
Perhaps that apathy was what lead me to give ever decreasing efforts at my job, leading to my eventual termination.
Right now I&#x27;m unemployed, it&#x27;s been almost a month now, it&#x27;s still pretty nice but I can already see it getting very boring soon.
So probably no tech posts to come, maybe a product review here or there if I feel like it.
If you subscribed to my rss feed for only those posts you may as well remove it from your list.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;future-of-this-blog&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#future-of-this-blog&quot; aria-label=&quot;Anchor link for: future-of-this-blog&quot;&gt;🔗&lt;&#x2F;a&gt;

Future of this Blog&lt;&#x2F;h2&gt;
&lt;p&gt;Since this blog is hosted on github pages, it doesn&#x27;t cost anything for me to keep around.
The domain itself is paid for until April 5 2026, but even after that point I&#x27;ll likely renew it or at least make an announcement with the free github pages domain it moves to for archival.
The anime and retro-gaming lists will still continue to receive updates for the foreseeable future, as I look at those quite often myself.
Some opportunities for lifestyle posts will likely come as I try out different jobs and internships.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;career-prospects&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#career-prospects&quot; aria-label=&quot;Anchor link for: career-prospects&quot;&gt;🔗&lt;&#x2F;a&gt;

Career Prospects&lt;&#x2F;h2&gt;
&lt;p&gt;At the end of this month I&#x27;ll have a nursing internship at an elderly care home.
Nursing is definitely Plan A right now.
Plan B, given my affinity to endurance exercise, would be joining the German Military.
If neither of those work out I can just job-hop in the so called low-skilled labour market or whatever.
I think I&#x27;m not alone among my generation in my belief that the 40 year career isn&#x27;t a real thing anymore.
&quot;Grinding&quot; also doesn&#x27;t really make sense when no one can afford a house or kids.
As my fellow zoomers, I&#x27;ll just make the best of it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 The Synergy Of Triathletic Training</title>
          <pubDate>Mon, 03 Feb 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/triathlon-synergy/</link>
          <guid>https://port19.xyz/lifestyle/triathlon-synergy/</guid>
          <description xml:base="https://port19.xyz/lifestyle/triathlon-synergy/">&lt;p&gt;&lt;em&gt;for runners&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;While I love running and its my main sport, its high impact nature means that pure running training opens you up to overuse injuries. Since I dislike the cold, and running in it, I&#x27;ve visited the indoor pool and rode my bike into the city a couple of times this winter. I now believe I can achieve 80% or more of the results of pure running training by including the two other major endurance sports and training like a triathlete.&lt;&#x2F;p&gt;
&lt;p&gt;Within a five zone model of intensity, I&#x27;ve found that running at zone 2 is the most pleasant, with zone 1 needing a conscious effort to slow down and zone 3+ needing a conscious effort to speed up.&lt;&#x2F;p&gt;
&lt;p&gt;Riding the bike at anything above zone 1 requires a good course without traffic lights or intersections. Biking for two hours running various errands in the city or just exploring can be almost as beneficial as a one hour long run while being a lot more pleasant in suboptimal conditions.
Also, provided you don&#x27;t live in the US, Canada or Australia, commuting to work by bike is a time efficient and popular option to get a bit of extra exercise in.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m sure with perfect technique you can swim in zone 2, but for me a 400 meter swim gets into zone 3 after a lap or two and ends in zone 4. And that&#x27;s for breast stroke and back stroke. If I were to use front crawl, my heart rate would surely creep even higher.&lt;&#x2F;p&gt;
&lt;p&gt;Replacing the tempo run with a pool session gets rid of a big chunk of injury risk and gives the legs a bit of a break. Replacing the long run with a bike tour keeps most of the metabolic benefit, while allowing for a more scenic route and a longer ride in total.&lt;&#x2F;p&gt;
&lt;p&gt;Since almost no running races are scheduled in summer, but all the triathlons happen there, training for a triathlon also has a scheduling advantage. It fills that gap in the calendar, so there is something to be excited for in the summer as well. As for distance, a super sprint triathlon consisting of a 400m swim, 10k bike and 2.5k run should be well within my reach by this summer.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Flu Bomb Tea</title>
          <pubDate>Mon, 02 Dec 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/flu-bomb-tea/</link>
          <guid>https://port19.xyz/recipes/flu-bomb-tea/</guid>
          <description xml:base="https://port19.xyz/recipes/flu-bomb-tea/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=9sdwrEGA7j0&amp;amp;t=938s&quot;&gt;&lt;em&gt;source&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Steep time: 5 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;2 cloves of garlic&lt;&#x2F;li&gt;
&lt;li&gt;as much ginger as garlic&lt;&#x2F;li&gt;
&lt;li&gt;1 lemon&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp turmeric&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp cayenne pepper&lt;&#x2F;li&gt;
&lt;li&gt;2 tsp apple cider vinegar&lt;&#x2F;li&gt;
&lt;li&gt;400ml water&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;kitchen knife&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;teaspoon&lt;&#x2F;li&gt;
&lt;li&gt;kettle&lt;&#x2F;li&gt;
&lt;li&gt;teacup&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Put water in the kettle and turn it on&lt;&#x2F;li&gt;
&lt;li&gt;Cut the stuff&lt;&#x2F;li&gt;
&lt;li&gt;Dump it into the cup along with the spices&lt;&#x2F;li&gt;
&lt;li&gt;Add lemon juice and apple cider vinegar last&lt;&#x2F;li&gt;
&lt;li&gt;Then pour boiling water on there&lt;&#x2F;li&gt;
&lt;li&gt;Wait 5 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Stir well, enjoy&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>📚 Run Warmup</title>
          <pubDate>Mon, 18 Nov 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/run-warmup/</link>
          <guid>https://port19.xyz/lifestyle/run-warmup/</guid>
          <description xml:base="https://port19.xyz/lifestyle/run-warmup/">&lt;h2 id=&quot;pre-warmup&quot;&gt;Pre-warmup&lt;&#x2F;h2&gt;
&lt;p&gt;Before doing any mobilizing exercises it makes sense to somewhat get the blood flowing for a few minutes. I like to do this by either going to the grocery store or doing some other household chores for at least five to ten minutes, but if I&#x27;m running late I will do ten burpees instead to give myself a jump start. &lt;br &#x2F;&gt;
The rest of the warmup should take only around 5 minutes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;upper-body&quot;&gt;Upper Body&lt;&#x2F;h2&gt;
&lt;p&gt;Goal is just to loosen things up a little. Ten of each per direction:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;hip circles&lt;&#x2F;li&gt;
&lt;li&gt;neck circles&lt;&#x2F;li&gt;
&lt;li&gt;shoulder circles&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;legs&quot;&gt;Legs&lt;&#x2F;h2&gt;
&lt;p&gt;The goal with the legs is to go through some range of motion as well as activating the muscles in the lower legs, especially around the ankles and feet.
This focus on the ankles and feet is important for forefoot or midfoot strikers like myself.
If you&#x27;re a heel striker, you can still do these but might want to add something extra for the knees.&lt;&#x2F;p&gt;
&lt;p&gt;Staying on one leg, without holding onto anything, 10 each:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;swinging leg raises back to front&lt;&#x2F;li&gt;
&lt;li&gt;side leg raises&lt;&#x2F;li&gt;
&lt;li&gt;foot circles (per direction)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Then switch legs.&lt;&#x2F;p&gt;
&lt;p&gt;Since I don&#x27;t hold onto anything, I have to balance myself during dynamic motion, which activates the muscles in the foot of the grounded leg. For me, this is the main purpose of the leg raises, with hip mobilization and activation of glutes and abs being merely a nice bonus.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;walking&quot;&gt;Walking&lt;&#x2F;h2&gt;
&lt;p&gt;With that I&#x27;m ready to head out the door, where I&#x27;ll do a brisk walk for 2-3 minutes before starting to run.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Running Race Protocol</title>
          <pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/race-protocol/</link>
          <guid>https://port19.xyz/lifestyle/race-protocol/</guid>
          <description xml:base="https://port19.xyz/lifestyle/race-protocol/">&lt;p&gt;&lt;em&gt;Story of a 5k&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;3-5-days-before-race&quot;&gt;3-5 Days before Race&lt;&#x2F;h2&gt;
&lt;p&gt;I try to get more than enough sleep in the days leading up to the race and eat a little healthier and more than I usually do.
This becomes more important the closer race day gets. Sleeping poorly five days before a race won&#x27;t have too big of an effect, but two days before the race it will have a noticeable impact.
In terms of nutrition I try to add, not subtract. So instead of cutting out the sweets I always eat too much of, I just add a salad to my lunches.
Depending on race day logistics, it makes sense to eat a large dinner the day before so you can cope with the reduced breakfast.
Make sure you plan out all the logistics the evening before race day, so you&#x27;re not stressed out by it.&lt;&#x2F;p&gt;
&lt;p&gt;Training volume should also be reduced during this time. I might do a session three days pre-race, but prefer to rest at least the two days leading up to a race.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;morning-of-the-race&quot;&gt;Morning of the Race&lt;&#x2F;h2&gt;
&lt;p&gt;On the morning of the race, your goal is to conserve energy and prevent any stomach issues.
What works for me is a low fiber cereal with low fat milk at T-5 hours, coffee sometime after that cereal, one banana at T-2.5 and another banana at T-1.5 hours.
This is for a race starting at 3pm, if the race starts at 10am I would skip the cereal and just do the bananas, with coffee first thing in the morning.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hour-before-the-race&quot;&gt;Hour before the Race&lt;&#x2F;h2&gt;
&lt;p&gt;I leave an hour before the race start, provided logistics allow it, just packing my keys and some tissues, maybe some money for post race cake.
The walk &#x2F; bike to the start is kind of a first warmup.
I do my regular warmup a little earlier than is ideal, starting at half an hour before the start.
Its just my regular warmup with perhaps some more reps, and a kilometer jog added on.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hour-after-the-race&quot;&gt;Hour after the Race&lt;&#x2F;h2&gt;
&lt;p&gt;First, I gotta catch my breath for 5-10 minutes.
Then I check out the free stuff behind the finish line, get some water and&#x2F;or protein bars and try my best to keep moving in a foolish attempt to fend of the lactic acid.
I am not a big fan of extensive stretching. The muscles need rest, not being tugged on.
I stick around the finish area for 30-60 minutes before slowly dragging myself home.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;evening-after-the-race&quot;&gt;Evening after the Race&lt;&#x2F;h2&gt;
&lt;p&gt;This is a good time to do a brief race review and then do next to nothing for the rest of the day.
Maybe watch a movie or play some games.
Going to bed early won&#x27;t work because of lactic acid burn, at least last time I stayed up quite late because my legs kept me up.&lt;&#x2F;p&gt;
&lt;p&gt;If you have a lifting background you might fear that this pain correlates with the soreness in the coming days, but it really doesn&#x27;t.
The soreness the day after is not too bad, certainly less than after any reasonable &quot;leg day&quot; in the gym.&lt;&#x2F;p&gt;
&lt;p&gt;Take at least two days off and then you can get back to regular training. This is a mental thing as well: If during the next race I know I won&#x27;t run for the next 2-3 days I am free to push as hard as I can.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Garmin vs Apple Watch</title>
          <pubDate>Fri, 18 Oct 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/garmin-vs-apple-watch/</link>
          <guid>https://port19.xyz/lifestyle/garmin-vs-apple-watch/</guid>
          <description xml:base="https://port19.xyz/lifestyle/garmin-vs-apple-watch/">&lt;p&gt;&lt;em&gt;Garmin Forerunner 945 vs Apple Watch Series 6&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;p&gt;About a month ago I decided to side-grade my apple watch to a garmin watch because those are said to be way better for running.
I got lucky and scored a cheap used forerunner 945 for just 80 bucks.
After wearing it for now exactly 3 weeks I want to now compare the two from the perspective of a beginner runner that owns an iphone.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;garmin-strengths&quot;&gt;Garmin Strengths&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;look-feel&quot;&gt;Look &amp;amp; Feel&lt;&#x2F;h3&gt;
&lt;p&gt;The garmin forerunner 945 looks and feels much more like a proper digital watch with it&#x27;s large round watch face and all black design.
The 945 has no touch screen, which is more of a blessing than a curse since the 5 physical buttons make manual laps, pause and resume much easier to trigger.
The non-velcro watch strap is also way better than the non-velcro watch strap for the apple watch.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;exercise-specific-features&quot;&gt;Exercise Specific Features&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;daily suggested workout&lt;&#x2F;li&gt;
&lt;li&gt;training status&lt;&#x2F;li&gt;
&lt;li&gt;training load focus&lt;&#x2F;li&gt;
&lt;li&gt;training effect&lt;&#x2F;li&gt;
&lt;li&gt;performance condition&lt;&#x2F;li&gt;
&lt;li&gt;shoe mileage tracking&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These are nice, but not very well thought out. Training status and load focus are often contradicting each other and the daily suggested workout, contrary to online reports, does not take a race entered into the calendar into account.
Why else would it suggest a 30 minute base run today, the day before a race?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;battery-life&quot;&gt;Battery Life&lt;&#x2F;h3&gt;
&lt;p&gt;By far its biggest strength when compared to the apple watch is the immense battery life.
With both watches being bought used, they both are below their prime capacity, but the garmin still lasts several days to maybe even a full week.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;garmin-weaknesses&quot;&gt;Garmin Weaknesses&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;garmin-connect&quot;&gt;Garmin Connect&lt;&#x2F;h3&gt;
&lt;p&gt;The garmin app is called garmin connect and takes a similar role to what apple fitness and apple health would play.
Garmin connect has a terrible UI with extra features being near impossible to discover without a guide.
Garmin connect is also impossible to use offline, which I missed greatly compared to the apple watch.
Viewing activities is also pretty terrible with graph legends having no dotted lines and not zooming in when the time axis is zoomed in.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;accuracy&quot;&gt;Accuracy&lt;&#x2F;h3&gt;
&lt;p&gt;GPS takes half a minute to find a signal sometimes.
Pace gets updated like 3-4 times a minute.
Heart rate lags behind and is not updated nearly frequently enough.
And that is just while recording an exercise activity.&lt;&#x2F;p&gt;
&lt;p&gt;Yesterday I sprinted up 9 floors of stairs in my office building leaving me gasping for minutes, but when I reached the top and looked at my wrist garmin claimed I had a heart rate of 100.
I could feel my heart pounding at probably around 180 +&#x2F;- 10.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;apple-strengths&quot;&gt;Apple Strengths&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;UI is superb, as expected for an Apple device&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;screen-weight&quot;&gt;Screen &amp;amp; Weight&lt;&#x2F;h3&gt;
&lt;p&gt;The Apple watch series 6 has a great oled screen with no visibility issues even on sunny days in late summer.
It is a lot lighter than the Garmin watch as well, but I&#x27;ve not found a reliable source online to compare the two.
I may update this post with the weights if I buy a scale for cooking.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;responsiveness&quot;&gt;Responsiveness&lt;&#x2F;h3&gt;
&lt;p&gt;When a friend gave me the advice to start my watch a minute before the race start for it to find gps in time I was a little confused, but after using the garmin I know what he was talking about.
With the apple watch I always instantly had gps, even at a race.&lt;&#x2F;p&gt;
&lt;p&gt;Heart rate and pace also update at least every second and using the watch as a pacer is very easy to set up.
Just press the 3 dots in the upper right of the running workout and you can select it, among previous races to race against and interval sessions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;apple-weaknesses&quot;&gt;Apple Weaknesses&lt;&#x2F;h2&gt;
&lt;p&gt;Terrible battery life.
I don&#x27;t think it would last me a full marathon, but maybe that&#x27;s their strategy for upselling me to the ultra.
Or maybe the watch just bullies me to not run a marathon before I can confidently run a sub-4.&lt;&#x2F;p&gt;
&lt;p&gt;The non-velcro watch strap is also something to get used to, it&#x27;s pretty bad because it opens itself when you close it so you gotta apply this weird technique.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;What I didn&#x27;t factor into the watches is that the apple watch of course has synergies with other apple devices and that garmin pay doesn&#x27;t work with my bank.&lt;&#x2F;p&gt;
&lt;p&gt;Either way I can&#x27;t be bothered to put up with garmins bullshit any longer. Back to the apple watch.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 ZSA Voyager Review</title>
          <pubDate>Wed, 25 Sep 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/voyager/</link>
          <guid>https://port19.xyz/tech/voyager/</guid>
          <description xml:base="https://port19.xyz/tech/voyager/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;voyager.jpg&quot; height=&quot;500vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
ZSA Voyager next to M1 Macbook Air - Oryx Training
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;price-breakdown&quot;&gt;
Price Breakdown&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.zsa.io&#x2F;voyager&quot;&gt;ZSA Voyager&lt;&#x2F;a&gt;: ~330€ (365 USD)&lt;&#x2F;li&gt;
&lt;li&gt;VAT &amp;amp; Imprort Duties: 77€&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;keycapsss.com&#x2F;switchestester&#x2F;switches&#x2F;272&#x2F;ambients-silent-choc-switches-lowprokb-kailh-choc-v1?number=KC10221_NOC&quot;&gt;Ambient Nocturnal Switches&lt;&#x2F;a&gt; &amp;amp; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;keycapsss.com&#x2F;artisan-keycaps&#x2F;226&#x2F;bongo-cat-novelty-keycap-oem&#x2F;dsa&#x2F;low-profile-choc?number=KC10117.4&amp;amp;c=5&quot;&gt;Bongo Cat Keycaps&lt;&#x2F;a&gt;: 70€&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sum: ~480€&lt;&#x2F;p&gt;
&lt;h2 id=&quot;light-silent-linear-switches&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#light-silent-linear-switches&quot; aria-label=&quot;Anchor link for: light-silent-linear-switches&quot;&gt;🔗&lt;&#x2F;a&gt;

Light Silent Linear Switches&lt;&#x2F;h2&gt;
&lt;p&gt;The Ambient Nocturnal Switches I ordered for this keyboard are choc style key switches, which is an emerging standard for low profile keyboards.
They are silent linears, perfect for an office environment, and actually make the keyobard much quieter than even regular office keyboards.
The 20g bottom out weight is only a third of the usual switch weight you encounter in the cherry mx brown for example, but also in the aliaz 60g I used in my previous keyboard.&lt;&#x2F;p&gt;
&lt;p&gt;Since the switches are so drastically different from anything else I have previously used it was actually easy to adapt.
I believe switching to a cherry mx red would have been more difficult, since it would have been similar enough that the small differences would annoy me.
I highly recommend these switches, especially over the 35g version. Go all the way.&lt;&#x2F;p&gt;
&lt;p&gt;One thing to note: resting my full finger weight on these actuates them, which is jarring at first but promotes ergonomic hover typing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;column-stagger&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#column-stagger&quot; aria-label=&quot;Anchor link for: column-stagger&quot;&gt;🔗&lt;&#x2F;a&gt;

Column Stagger&lt;&#x2F;h2&gt;
&lt;p&gt;This took a bit of getting used to and some retraining of how I hit &quot;c&quot;.
Ultimately I think that ortholinear, that is having the keys in a grid, does help ergonomics.
I am not sold that column stagger meaningfully enhances ergonomics further, but ultimately feel indifferent towards it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;split-keyboard&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#split-keyboard&quot; aria-label=&quot;Anchor link for: split-keyboard&quot;&gt;🔗&lt;&#x2F;a&gt;

Split Keyboard&lt;&#x2F;h2&gt;
&lt;p&gt;I will say that in the first few days, including when that picture was taken, I overdid it with the distance between my keyboard halves.
This misuse of my ergonomic keyboard ironically gave me some slight wrist pain before I adjusted it.
Now there is a little more than a hands width between the keyboard halves.
It is nice for ergonomics, but since my RSI has always been localized more to the fingers I benefit less from this than someone with wrist pain.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quality-and-portability&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#quality-and-portability&quot; aria-label=&quot;Anchor link for: quality-and-portability&quot;&gt;🔗&lt;&#x2F;a&gt;

Quality and Portability&lt;&#x2F;h2&gt;
&lt;p&gt;The Keyboard arrived with lots of little accessories and in a nice packaging.
The board is made of some kind of metal from what I can tell, but still remains light due to its small size.
The tenting magnets are a nice touch, but I don&#x27;t use them myself.&lt;&#x2F;p&gt;
&lt;p&gt;On the software side, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.zsa.io&#x2F;oryx&quot;&gt;oryx&lt;&#x2F;a&gt; is awesome.
It makes custom keyboard configuration that much more accessible.
I have not made full use of this yet, as I wanted to adapt to the new keyboard shape and switches first before even considering a change in keyboard layout.
What I do use currently is the tap&#x2F;hold overloading of keys, to great effect.
I will say that as I have gotten more proficient at typing on this keyboard I have continued to lower the hold threshold from the default 175 to 125, and then recently to 100 milliseconds.&lt;&#x2F;p&gt;
&lt;p&gt;The included carrying case seems to be of decent quality and I use it every day to carry my keyboard from home to work and back.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pipe-problems&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#pipe-problems&quot; aria-label=&quot;Anchor link for: pipe-problems&quot;&gt;🔗&lt;&#x2F;a&gt;

Pipe Problems&lt;&#x2F;h2&gt;
&lt;p&gt;If there is one major thing I&#x27;m going to complain about it&#x27;s the pipe key and the crocodiles: &amp;lt;|&amp;gt;&lt;&#x2F;p&gt;
&lt;p&gt;I use a german keyboard layout in my OS, with the voyager actually needing an american layout in the OS for all the keys in the online configurator to correspond to the actual keys arriving in your text buffer.
Since (american) ANSI keyboards have one key less than the (european) ISO keyboards do, there is actually no key that corresponds to where &amp;lt;|&amp;gt; are on a german layout.
I searched the web for like half an hour before giving up on the matter and instead binding keys in emacs for this purpose.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;🔗&lt;&#x2F;a&gt;

Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;This is a really expensive keyboard.
I do like it and believe it will pay for itself in the form of reduced RSI, increased work capacity or both.
However I don&#x27;t recommend it to anyone who is not affected by ergonomic issues.
If you like expensive high quality peripherals it is also a justifiable purchase.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;If only there was a way to make the mouse more ergonomic as well.&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Foreshadowing&quot;&gt;¹&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Review of my Playstation 2 and 3</title>
          <pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/playstation/</link>
          <guid>https://port19.xyz/tech/playstation/</guid>
          <description xml:base="https://port19.xyz/tech/playstation/">&lt;p&gt;&lt;em&gt;tl;dr ps2 is too pixelly and better emulated or played via ps3 re-releases&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;ff12.jpg&quot; height=&quot;500vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
PS2 - Final Fantasy 12 - 4k VA
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;the-glorious-used-market&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-glorious-used-market&quot; aria-label=&quot;Anchor link for: the-glorious-used-market&quot;&gt;🔗&lt;&#x2F;a&gt;

The Glorious Used Market&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;d like to open this review of my gaming consoles by expressing the great gratitude I have for the well priced used tech market in Germany.
Playstations from all generations grow on trees, if local ebay offers are any indication, and so do their games.
A PS2 slim + Card + Controller + 1-2 games can be had for under 100 Euros, and a PS3 slim + Controller + 1-2 games won&#x27;t exceed it by much.
At the same time &quot;Gaming PCs&quot; that are capable of upscaled PS2 emulation are available under 200 Euros, with deals under 100 being possible if you make the right compromises.&lt;&#x2F;p&gt;
&lt;p&gt;For both the PS2 and the PS3, the slim versions have a reputation of higher reliability at less power consumption and noise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ps2-hardware&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#ps2-hardware&quot; aria-label=&quot;Anchor link for: ps2-hardware&quot;&gt;🔗&lt;&#x2F;a&gt;

PS2 Hardware&lt;&#x2F;h2&gt;
&lt;p&gt;The PS2 wired controller is almost identical to the PS3 wireless controller in terms of shape and feel, with the notable exception being the analog face buttons.
It was a surprise when I tried to play Gran Turismo 3 A-Spec and couldn&#x27;t reliably accelerate without rebinding acceleration to one of the analog sticks.&lt;&#x2F;p&gt;
&lt;p&gt;The console itself, the PS2 slim anyway, is very quiet with only the optical drive making annoying noises occasionally.
It is small, light and certainly power efficient.&lt;&#x2F;p&gt;
&lt;p&gt;What sucks is that you need a PS2 memory card and either an old-ish TV that supports a composite signal or a converter.
These costs can make the PS2 more expensive than a PS3, and having that one more power cable, that one more converter laying around does clutter my desk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ps2-games-and-graphics&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#ps2-games-and-graphics&quot; aria-label=&quot;Anchor link for: ps2-games-and-graphics&quot;&gt;🔗&lt;&#x2F;a&gt;

PS2 Games and Graphics&lt;&#x2F;h2&gt;
&lt;p&gt;The Playstation 2 has some great games, see the top list I link to on my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;retro-games&#x2F;&quot;&gt;retro-games page&lt;&#x2F;a&gt;.
The graphics are bearable, which is not something I can say for the original Playstation, but they are definitely dated.
I can definitely make out individual pixels on that 480p resolution, and even a nice 4k screen can only go so far in enhancing the image quality.&lt;&#x2F;p&gt;
&lt;p&gt;Most good Playstation 2 games have been re-released as HD Remasters or as part of a collection on the PS3.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ps3-hardware&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#ps3-hardware&quot; aria-label=&quot;Anchor link for: ps3-hardware&quot;&gt;🔗&lt;&#x2F;a&gt;

PS3 Hardware&lt;&#x2F;h2&gt;
&lt;p&gt;The PS3 slim is sadly not a rectangle, and neither is the super slim, so you can&#x27;t stack it.
It does get loud, but doesn&#x27;t become a PS4 level jet engine.
Youtube has decent comparisons for noise.&lt;&#x2F;p&gt;
&lt;p&gt;The controller is comfy I guess.&lt;&#x2F;p&gt;
&lt;p&gt;I swapped the cheap old HDD in my PS3 slim for a used Samsung 850 Evo SSD, which noticeably improves boot times as well as load times in games like Rage.
I believe it also marginally improves noise and power consumption.&lt;&#x2F;p&gt;
&lt;p&gt;HDMI is weird to note as a perk, but once you went through adapter-hell with the PS2, you learn to appreciate it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ps3-games-and-graphics&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#ps3-games-and-graphics&quot; aria-label=&quot;Anchor link for: ps3-games-and-graphics&quot;&gt;🔗&lt;&#x2F;a&gt;

PS3 Games and Graphics&lt;&#x2F;h2&gt;
&lt;p&gt;The graphics are at the perfect level for my tastes.
Good, but with no watts being wasted to ray trace the exact reflections in a mud pit.
The 1080p resolution helps a lot here.&lt;&#x2F;p&gt;
&lt;p&gt;PS3 has nice remasters from the PS2 era as well as plenty of originals of its own.
I&#x27;d say it&#x27;s the last generation before the gaming industry got extremely uncreative.
PS3 is already less radical in terms of game designs than the PS2 and it is more of a generation of refinements and small improvements.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;emulation&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#emulation&quot; aria-label=&quot;Anchor link for: emulation&quot;&gt;🔗&lt;&#x2F;a&gt;

Emulation&lt;&#x2F;h2&gt;
&lt;p&gt;If you have a reasonably recent PC, you can emulate PS2.
If you have a dedicated GPU or Ryzen APU, you can heavily upscale PS2.
PS2 emulation works with few flaws and I highly recommend it over original hardware after having tried both.&lt;&#x2F;p&gt;
&lt;p&gt;PS3 definitely requires some tinkering to emulate and upscaling is less unnecessary and a lot more costly.
You would need an impressive midrange gaming PC, like Ryzen-something plus 300+ USD GPU, to upscale PS3.
And even then a large minority (like 30%) of PS3 games don&#x27;t work yet.
Also ROMs begin to seriously eat away at your storage in this territory.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;my-advice&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#my-advice&quot; aria-label=&quot;Anchor link for: my-advice&quot;&gt;🔗&lt;&#x2F;a&gt;

My Advice&lt;&#x2F;h2&gt;
&lt;p&gt;To the time travelling me of 4 months ago:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;don&#x27;t buy a PS2&lt;&#x2F;li&gt;
&lt;li&gt;emulate upscaled PS2 ROMs over buying their PS3 remasters&lt;&#x2F;li&gt;
&lt;li&gt;buying a PS3 Slim is worth it&lt;&#x2F;li&gt;
&lt;li&gt;SSD swapping a PS3 is worth it &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=DnGOftkdAM0&quot;&gt;(Tutorial)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;No (physical) game hoarding, only buy a new game when you finish or completely quit an old one&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-i-plan-to-proceed&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#how-i-plan-to-proceed&quot; aria-label=&quot;Anchor link for: how-i-plan-to-proceed&quot;&gt;🔗&lt;&#x2F;a&gt;

How I plan to proceed&lt;&#x2F;h2&gt;
&lt;p&gt;I plan to sell my PS2, although being 20 hours &#x2F; one third into final fantasy 12 with no convenient way to transfer the save file will delay that sale a little.
I may or may not sell my PS3, depending on how much use it sees over the coming months.
Some PS3 Remasters will be sold (or traded) and instead played via emulation. Final Fantasy 10 and Kingdom Hearts come to mind.
I will buy a used midrange tower PC, like 200 bucks, and put &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;batocera.org&#x2F;&quot;&gt;Batocera Linux&lt;&#x2F;a&gt; on it to use it as a general Media PC.&lt;&#x2F;p&gt;
&lt;p&gt;Check &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;retro-games&#x2F;&quot;&gt;retro-games page&lt;&#x2F;a&gt; from time to time for updates.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Beginner Running Advice</title>
          <pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/running/</link>
          <guid>https://port19.xyz/lifestyle/running/</guid>
          <description xml:base="https://port19.xyz/lifestyle/running/">&lt;p&gt;&lt;em&gt;heart rate zones are important&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve picked up running again in early august and ran an official 11.5k 8 days ago.
This is after 20 months of no running.
I did run regularly in 2022, but mistakes in my training made that do more harm than good.
In this post I want to give some running advice that I wish I had known in 2022.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re completely unfamiliar with the concept, watch this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtube.com&#x2F;shorts&#x2F;IF0vEJwUAUA&quot;&gt;youtube short&lt;&#x2F;a&gt; and then read on.&lt;&#x2F;p&gt;
&lt;p&gt;My primary mistake in my running throughout 2022 was that I never did any walking breaks.
The result of this stubbornness was that I always ran at a pretty high effort.
&quot;Run slower&quot; is advice you frequently hear from running elites trying their best to give advice to beginners.
This, in my opinion, is out of touch with the reality of a running beginner.
Running, at all, put me well outside the upper bounds of zone 2 after a few minutes.&lt;&#x2F;p&gt;
&lt;p&gt;Never taking walk breaks in 2022 not only hindered my progress and made me plateau after a couple of months, it gave me heart rhythm issues and almost daily discomfort related to it.
Heart stitches, pressure in my chest, palpitations, were all common during that time and only stopped (and abruptly at that) when I gave up running in 2023.
Yes, I visited a cardiologist during the summer of that year, who took a good look at me and my heart before declaring me healthy.
I just over-trained my heart. Don&#x27;t do that.&lt;&#x2F;p&gt;
&lt;p&gt;In contrast, my first run on august 3rd this year was a 1.7k run with 4 walk breaks to allow my heart rate to come down.
I kept doing walk breaks as I built up to 3k during that month, being able to finally run a full 3k in zone 2 without walk breaks on the 27th, on my 9th run.
I occasionally still take a short walking break when my heart rate gets too high.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;training-frequency&quot;&gt;Training Frequency&lt;&#x2F;h2&gt;
&lt;p&gt;Here I once again have to disagree with the well intentioned elites that prescribe 3 runs a week, or every other day as &quot;beginners advice&quot;.
In early 2022 I used to be sore for 3-4 days after a run, as my calves have never been used so much in my life.
Now, in 2024 the soreness is a lot less pronounced, as I seem to have retained a lot of the muscle I put on in 2022, but my joints (especially knees and feet) took more than a day to recover at first.&lt;&#x2F;p&gt;
&lt;p&gt;I say run when you&#x27;re not sore anymore and no more than every third day in the first 2-3 months.
Then listen to the &quot;beginners advice&quot; given by youtube elites.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;progression&quot;&gt;Progression&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;gradually run longer, up to a 3k, keeping the walk breaks.&lt;&#x2F;li&gt;
&lt;li&gt;keep running 3ks and reduce the walk breaks, while staying in zone 2.&lt;&#x2F;li&gt;
&lt;li&gt;after you no longer need walk breaks, slowly increase frequency to every other day. (I&#x27;m here)&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;gear&quot;&gt;Gear&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;A smartwatch, to me, is most important, as heart rate training was the difference between heart arrhythmia and healthy progress.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Running shoes are pretty important to not fuck up your joints.
I like my hoka clifton 9s, but your best bet is getting consultation by a sales rep at a sports store.&lt;&#x2F;p&gt;
&lt;p&gt;Running shorts and shirt are much less important, but nice if you have the money.
I like the shorts and shirt from the adidas &quot;Own The Run&quot; line, and also own the long sleeved variants.&lt;&#x2F;p&gt;
&lt;p&gt;That should be enough for a while.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;miscellaneous-tips&quot;&gt;Miscellaneous tips&lt;&#x2F;h2&gt;
&lt;p&gt;Rhytmic breathing is nice, ideally breathing through the nose.&lt;&#x2F;p&gt;
&lt;p&gt;Bring a tissue on the run, especially in colder weather.&lt;&#x2F;p&gt;
&lt;p&gt;Binge watch running form tutorials for an afternoon and you should be good.&lt;&#x2F;p&gt;
&lt;p&gt;Avoid GTN (Global Triathlon Network) on youtube, their vids are consistently underwhelming.&lt;&#x2F;p&gt;
&lt;p&gt;A thorough warmup before a run and thorough stretching after help a lot in the beginning and for races.&lt;&#x2F;p&gt;
&lt;p&gt;Bring a chocolate bar, a snickers or sth, on your first 10k for a celebratory half-way point.&lt;&#x2F;p&gt;
&lt;p&gt;If you don&#x27;t like running after a few weeks, stop and choose a different sport.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 I coded my own dead link checker</title>
          <pubDate>Tue, 27 Aug 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/deadsniper/</link>
          <guid>https://port19.xyz/tech/deadsniper/</guid>
          <description xml:base="https://port19.xyz/tech/deadsniper/">&lt;p&gt;&lt;em&gt;Go is an acquired taste&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;foreshadowing&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#foreshadowing&quot; aria-label=&quot;Anchor link for: foreshadowing&quot;&gt;🔗&lt;&#x2F;a&gt;

Foreshadowing&lt;&#x2F;h2&gt;
&lt;p&gt;As foreshadowed in my post explaining &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;blog&#x2F;#quality-assurance&quot;&gt;my blogging setup&lt;&#x2F;a&gt;, I always wanted a faster dead link checker to run on my evergrowing website.
My &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;go-review&#x2F;&quot;&gt;dislike for go&lt;&#x2F;a&gt; made me procrastinate on this project for quite a while.
Then, last Friday I finally had some motivation to code some go and ended up writing the v1.0 of my own dead link checker in about two hours.
Some async bug fixes and feature additions later and it now sits at v1.4, ~170LoC and is available as a github action as well.
I estimate that I now spent ~10h total on it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;go-review-revised&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#go-review-revised&quot; aria-label=&quot;Anchor link for: go-review-revised&quot;&gt;🔗&lt;&#x2F;a&gt;

Go Review Revised&lt;&#x2F;h2&gt;
&lt;p&gt;I must say that go as a language to me feels similar to php in the sense that I dislike its lack of elegance, but can&#x27;t resist it for its incredible deployment path. Nothing easier than &lt;code&gt;scp&lt;&#x2F;code&gt;-ing an &lt;code&gt;index.php&lt;&#x2F;code&gt; and nothing easier than uploading a statically linked go binary to github releases.&lt;&#x2F;p&gt;
&lt;p&gt;The concurrency model and error handling are pretty neat, as is the tooling.&lt;&#x2F;p&gt;
&lt;p&gt;One thing that still bugs me is that go has no list membership function, so I have to code my own like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;go&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;func&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt; contains&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;slice&lt;&#x2F;span&gt;&lt;span&gt; []&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; item&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; int&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; bool&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;	for&lt;&#x2F;span&gt;&lt;span&gt; _, v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; :=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; range&lt;&#x2F;span&gt;&lt;span&gt; slice {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;		if&lt;&#x2F;span&gt;&lt;span&gt; v&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; item {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;			return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;		}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;	return&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But at least I can amuse myself by doing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;deadsniper&#x2F;blob&#x2F;ce6d506bd4f9fa2f2f3c2513eb109ba81e5e5bb3&#x2F;main.go#L107-L124&quot;&gt;argument parsing with gotos&lt;&#x2F;a&gt;, among other affronts to the clean-code crowd.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;deadsniper&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#deadsniper&quot; aria-label=&quot;Anchor link for: deadsniper&quot;&gt;🔗&lt;&#x2F;a&gt;

Deadsniper&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re in the market for a dead link checker to min-max your website quality please do check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;deadsniper&quot;&gt;deadsniper&lt;&#x2F;a&gt;, you&#x27;ll like it.
I also consider the code to be well written and commented overall, so if you want to see an example of goroutines in action, there are worse codebases than mine to investigate.&lt;&#x2F;p&gt;
&lt;p&gt;As a final sales pitch, check out this help text:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Usage: deadsniper [options] &amp;lt;link to sitemap.xml&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Options:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -h | --help    print this help text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -V | --version print the version number&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -s | --strict  allow only HTTP 200 response codes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -t | --timeout set the request timeout in seconds (default 5)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Examples:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  deadsniper https:&#x2F;&#x2F;port19.xyz&#x2F;sitemap.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  deadsniper -V&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  deadsniper --strict https:&#x2F;&#x2F;port19.xyz&#x2F;sitemap.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  deadsniper -t 1 -s https:&#x2F;&#x2F;port19.xyz&#x2F;sitemap.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>📚 Stop Whining</title>
          <pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/stop-whining/</link>
          <guid>https://port19.xyz/lifestyle/stop-whining/</guid>
          <description xml:base="https://port19.xyz/lifestyle/stop-whining/">&lt;p&gt;&lt;em&gt;habitual complaining is not healthy&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-have-it-good&quot;&gt;I have it good&lt;&#x2F;h2&gt;
&lt;p&gt;For context, me and my colleagues work at a large company in an air-conditioned building, in a small team-contained office of four people.
We get payed slightly above the industry average, have a nice canteen serving cheap tasty meals, and have free fruit baskets and coffee machines.
We have multiple high resolution monitors, pretty new laptops, ergonomic chairs and height adjustable desks.
Instead of cold-calling grandmas or writing the next marketing email to send to peoples spam folders, we do actually useful work maintaining a fleet of servers and company internal infrastructure services.
The work is varied, intellectually engaging, and frequently fun.
At least for me it is.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yet-people-complain&quot;&gt;Yet, people complain&lt;&#x2F;h2&gt;
&lt;p&gt;Yet, I see &lt;em&gt;several&lt;&#x2F;em&gt; of my colleagues habitually complain about expected realities of large scale IT work.
Many things don&#x27;t work, yes, and some systems fail in ways that seem incredibly stupid from our high horses.
But in those cases I like to repeat the mantra that if everything worked we&#x27;d be out of a job.
I have already grown at least somewhat aggravated by this constant negativity.
For every superficial complaint, all I can hear is:
&quot;Oh no, please rescue me from my well paid, interesting job that people would kill for&quot;&lt;&#x2F;p&gt;
&lt;p&gt;There are several factors at play here. Address them and things can change.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;stoicism-101&quot;&gt;Stoicism 101&lt;&#x2F;h2&gt;
&lt;p&gt;Some things are within your control while others are not.
If you can&#x27;t fix something because it&#x27;s outside your control, accept it and work on the things that are within your control.
Maybe shoot your manager an email, but then shut up about it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gratitude-entitlement&quot;&gt;Gratitude &amp;gt; Entitlement&lt;&#x2F;h2&gt;
&lt;p&gt;Think about the insurance sales guy from my exposition.
Think about every manual labourer and every customer service worker in existence.
You&#x27;re earning an above median salary to sit at a desk for 8 hours a day and solve funny IT issues.
If you really think it&#x27;s so bad, why don&#x27;t you intern at a mc donalds during your next vacation and see how you like that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;inflationary-whining&quot;&gt;Inflationary Whining&lt;&#x2F;h2&gt;
&lt;p&gt;Complaining on occasion is fine. A bit of cursing gives spice to the day.
But when you complain about the fact that there is work to do, at work, what are you even complaining about?
Sooner rather than later I&#x27;ll just mentally put you into the chronically-negative-person box.
And once you&#x27;re in there, the chances that I&#x27;ll pay attention when there is something legitimate to whine about are greatly diminished.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;respect-slander&quot;&gt;Respect &amp;gt; Slander&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Don&#x27;t cope with your insecurities by putting others down.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You know things that colleagues in other departments don&#x27;t. Great.
This doesn&#x27;t mean that the colleagues in those other departments are donkeys that just learned reading and writing.
And if they legitimately are at a lower level of competency, there is a good chance that their salary reflects that.
More often than not the actual impedance to better work is overbearing process anyway.
In those cases you should slander higher management, not your colleagues in other departments.&lt;&#x2F;p&gt;
&lt;p&gt;Also, while I&#x27;m on the topic, slandering previous team colleagues is like a girl complaining about her ex. Ick at best, red flag at worst.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;applications-outside-the-workplace&quot;&gt;Applications outside the workplace&lt;&#x2F;h2&gt;
&lt;p&gt;I guess you could apply this rationale to politics, countries and fellow citizens.
Constantly complaining about the problems in a first world country or a war that is more than a border away is similarly unhealthy.
Although given the negativity bias of the news I find it much easier to forgive the whining about political issues.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;For my international readers, Germans have a tendency to complain more than other cultures do, so this may not resemble your situation.
Yet, I hope you too can take something away from this and develop a more positive outlook.&lt;&#x2F;p&gt;
&lt;p&gt;The irony that this post complains about other people complaining is not lost on me btw.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Apple Ecosystem Review</title>
          <pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/apple-ecosystem/</link>
          <guid>https://port19.xyz/tech/apple-ecosystem/</guid>
          <description xml:base="https://port19.xyz/tech/apple-ecosystem/">&lt;p&gt;Since I bought myself some used Apple hardware at the end of June, I&#x27;m now writing a consolidated review on it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;macbook&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#macbook&quot; aria-label=&quot;Anchor link for: macbook&quot;&gt;🔗&lt;&#x2F;a&gt;

MacBook&lt;&#x2F;h2&gt;
&lt;p&gt;The M1 MacBook Air was the first piece of Apple hardware that I bought and cost me 630€.
There were no further surprises and everything I said about the M1 MacBook Air and about MacOS in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;macos&#x2F;&quot;&gt;my review&lt;&#x2F;a&gt; of last year still applies.
While it cost by far the most I consider the M1 MacBook Air to be the most useful of the three items I bought.&lt;&#x2F;p&gt;
&lt;p&gt;I should note that at work I continue to use a Linux PC with Emacs and strongly prefer that setup for productivity.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;iphone&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#iphone&quot; aria-label=&quot;Anchor link for: iphone&quot;&gt;🔗&lt;&#x2F;a&gt;

iPhone&lt;&#x2F;h2&gt;
&lt;p&gt;Shortly after the MacBook Air, I bought myself an iPhone XS that set me back 80€, plus another 10 for a case.
Despite it being heavily used, it still gets me around two and a half days of battery life, given my very light usage.
The only third party apps I have installed on it right now are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;ae&#x2F;app&#x2F;spendnotes-budget-tracker&#x2F;id1505752740?l=ar?l=ar&quot;&gt;SpendNotes&lt;&#x2F;a&gt; for expense tracking and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;meditofoundation.org&#x2F;&quot;&gt;Medito&lt;&#x2F;a&gt; for guided meditations.&lt;&#x2F;p&gt;
&lt;p&gt;What I don&#x27;t use in third-party apps I make up for in first-party apps.
Synchronizing with the MacBook Air, I like to use Apple notes, reminders and the calendar.
And also found it quite useful to have my photos synchronized between the devices.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;del&gt;With iOS apps working natively on the MacBook, I plan on relegating the
iPhone to the drawer and to continue using my dumb phone, as I&#x27;ve done for the past two years.&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Doesn&#x27;t work nearly as well as it seems at first glance. Also, turns out old phone is starting to get battery issues. iPhone stays default.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;apple-watch&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#apple-watch&quot; aria-label=&quot;Anchor link for: apple-watch&quot;&gt;🔗&lt;&#x2F;a&gt;

Apple Watch&lt;&#x2F;h2&gt;
&lt;p&gt;The Apple Watch is a heavily used series 6 that I purchased for 60€, with it arriving only two days ago.
I primarily tested it for workout tracking and apple pay and I also tested the apple maps navigation once.
I did also test the sleep tracking, but find that to be kind of useless given my near-perfect sleep.&lt;&#x2F;p&gt;
&lt;p&gt;I think an Apple Watch is a poor fashion choice and not really worth over a hundred bucks unless you are a cyclist
that will make frequent use of both the navigation feature and workout tracking.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;del&gt;But for those two features it&#x27;s useful enough to keep around and use occasionally.&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I&#x27;ll keep using it as my default and keep my analogue watches around for when I need to dress up.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#misc&quot; aria-label=&quot;Anchor link for: misc&quot;&gt;🔗&lt;&#x2F;a&gt;

Misc&lt;&#x2F;h2&gt;
&lt;p&gt;iCloud Web doesn&#x27;t work for me with advanced data protection enabled. Useless.&lt;&#x2F;p&gt;
&lt;p&gt;A cheap iPad might be nice for media consumption and&#x2F;or diagramming via apple freeform.
Without having tried it, I&#x27;ll recommend it to moms and startup techbros.&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Business_Model_Canvas#&#x2F;media&#x2F;File:Business_Model_Canvas.png&quot;&gt;¹&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;🔗&lt;&#x2F;a&gt;

Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Apple has some nice hardware available at decent prices on the used market.
If you&#x27;re the kind of guy who will make use of it, it surely isn&#x27;t a bad choice.
&lt;del&gt;But for me, I think I&#x27;ll refocus on the essentials and continue using a regular watch with a dumbphone while also leveraging the M1 MacBook Air to its fullest potential.&lt;&#x2F;del&gt;
&lt;em&gt;Sike&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 PHP Language Review</title>
          <pubDate>Thu, 18 Jul 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/php-review/</link>
          <guid>https://port19.xyz/tech/php-review/</guid>
          <description xml:base="https://port19.xyz/tech/php-review/">&lt;p&gt;For quite a while now I have wanted to develop a dynamic website.&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;webapps&#x2F;&quot;&gt;¹&lt;&#x2F;a&gt;
In that pursuit I looked at Python Django, even going through the whole tutorial.
I was almost certain that this would be the best way to do things, but frustrations with the deployment process made me hesitant to go any deeper.&lt;&#x2F;p&gt;
&lt;p&gt;Luckily, a hacker news post about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=40729671&quot;&gt;mildly dynamic websites&lt;&#x2F;a&gt; gave me
the impulse to at least give PHP a quick try since the author claimed its ease of deployment to be unparalleled
and its usefulness for especially smaller applications to far exceed that of the heavyweight full-stack frameworks
like Python Django or Ruby on Rails.&lt;&#x2F;p&gt;
&lt;p&gt;So, on a fateful evening, I thought to myself: &quot;What&#x27;s the worst that can happen?
Let&#x27;s just spend an hour or two trying to make a PHP website on a platform as a service provider.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;My expectations were that within about two hours I would get &lt;em&gt;something&lt;&#x2F;em&gt; up and running, but those were far exceeded.
Within less than an hour, including the time spent relearning SQL basics and creating my account at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.nearlyfreespeech.net&#x2F;&quot;&gt;nearlyfreespeech.net&lt;&#x2F;a&gt;, I had a dynamic website up and running.
I took note of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;php-monorepo&#x2F;tree&#x2F;master&#x2F;1-origin&quot;&gt;&quot;speedrun checkpoints&quot;&lt;&#x2F;a&gt;, if you want to check exactly how much time I spent on what.&lt;&#x2F;p&gt;
&lt;p&gt;This experiment made me very optimistic about PHP and so on the next evening I implemented
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;php-monorepo&#x2F;blob&#x2F;master&#x2F;2-fizzbuzz&#x2F;index.php&quot;&gt;fizzbuzz&lt;&#x2F;a&gt; and about a week later I re-implemented an old project of mine, a Clash Royale kicklist generator that at the time of writing was still online.&lt;&#x2F;p&gt;
&lt;p&gt;In the weeks since, I have bought myself used copies of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.oreilly.com&#x2F;library&#x2F;view&#x2F;programming-php-4th&#x2F;9781492054122&#x2F;&quot;&gt;Programming PHP&lt;&#x2F;a&gt; and the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.oreilly.com&#x2F;library&#x2F;view&#x2F;sql-pocket-guide&#x2F;9781449397586&#x2F;&quot;&gt;SQL Pocket Guide&lt;&#x2F;a&gt; and have made a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;php-monorepo&#x2F;&quot;&gt;monorepo&lt;&#x2F;a&gt; for future PHP projects.&lt;&#x2F;p&gt;
&lt;p&gt;If the positive sentiment of this little review surprises you, keep in mind that I&#x27;m talking about the old-school PHP as in &lt;em&gt;throw everything into a single file and use a small SQLite DB&lt;&#x2F;em&gt; PHP.
I&#x27;m not talking about the modern &lt;em&gt;object-oriented Laravel Symphony PHP&lt;&#x2F;em&gt; that requires a team of agile™ web developers to build things with.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;phpthewrongway.com&#x2F;&quot;&gt;PHP the wrong way&lt;&#x2F;a&gt;, and I love it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Optimizing Unicode Fonts with Fonttools</title>
          <pubDate>Tue, 25 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/fonttools/</link>
          <guid>https://port19.xyz/tech/fonttools/</guid>
          <description xml:base="https://port19.xyz/tech/fonttools/">&lt;p&gt;&lt;em&gt;good riddance subfont&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This week I added a nicer house emoji to the footer and added heading anchors to all my &lt;code&gt;&amp;lt;h2&amp;gt;&lt;&#x2F;code&gt;s in the tech category.
So to make sure everyone can actually see those I had to re-optimize my font of choice.
Previously I have written about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;subfont&#x2F;&quot;&gt;how to use subfont&lt;&#x2F;a&gt; for this, but it&#x27;s a pain to work with and despite my own documentation I didn&#x27;t manage to make it work again on its latest version.&lt;&#x2F;p&gt;
&lt;p&gt;Thank god I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fonttools.readthedocs.io&#x2F;en&#x2F;latest&#x2F;subset&#x2F;&quot;&gt;fonttools&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
First I grepped for all emojis in my website via a hideous grep command I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;43242440&#x2F;javascript-regular-expression-for-unicode-emoji&#x2F;45138005&quot;&gt;on stackoverflow&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;grep -IPorh &amp;quot;[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]&amp;quot; | sort -u | tr -d &amp;quot;\n&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;(no, I&#x27;m not gonna format this and break the copy-pastability)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Then I slapped the result onto the following fonttools command: &lt;br &#x2F;&gt;
&lt;code&gt;fonttools subset NotoColorEmoji-Regular.ttf --flavor=&quot;woff2&quot; --text=&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;That&#x27;s all. Just a short post for myself in a couple months time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Monitoring with Github Actions</title>
          <pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/github-actions-monitoring/</link>
          <guid>https://port19.xyz/tech/github-actions-monitoring/</guid>
          <description xml:base="https://port19.xyz/tech/github-actions-monitoring/">&lt;h2 id=&quot;why&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#why&quot; aria-label=&quot;Anchor link for: why&quot;&gt;🔗&lt;&#x2F;a&gt;

Why&lt;&#x2F;h2&gt;
&lt;p&gt;A little while ago I wrote rapture, a modern server setup, with the goal of covering a wide range of popular infrastructure tooling.
It used what I call the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;dang-stack&#x2F;&quot;&gt;DANG Stack&lt;&#x2F;a&gt;, and birthed the two technical deep dives: &lt;br &#x2F;&gt;
on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;persisting-grafana&#x2F;&quot;&gt;Persisting Grafana&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;ansible-provision&#x2F;&quot;&gt;DigitalOcean Provisioning with Ansible&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
While these fancy tools have their place in professional use, the high memory consumtion of Prometheus and Grafana, as well as the overhead of docker made me put the project on hold and set me on the lookout for more integrated, actually lightweight, alternatives.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;theyatemyram.png&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
They ate my ram
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;how&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#how&quot; aria-label=&quot;Anchor link for: how&quot;&gt;🔗&lt;&#x2F;a&gt;

How&lt;&#x2F;h2&gt;
&lt;p&gt;I like to make frequent and thorough use of advanced github features, especially github actions.
So I got to work to implement monitoring of basic server vitals via github actions.&lt;&#x2F;p&gt;
&lt;p&gt;Scheduling actions is pretty easy and uses the familiar cron syntax.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;on:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; schedule:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   - cron: &amp;quot;15 * * * *&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;For ssh without a third-party action I came across &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.benoitblanchon.fr&#x2F;github-action-run-ssh-commands&#x2F;&quot;&gt;this&lt;&#x2F;a&gt; informative post.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- name: Configure SSH&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  run: |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    mkdir -p ~&#x2F;.ssh&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    echo &amp;quot;$SSH_KEY&amp;quot; &amp;gt; ~&#x2F;.ssh&#x2F;ssh.key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    chmod 600 ~&#x2F;.ssh&#x2F;ssh.key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cat &amp;gt;&amp;gt;~&#x2F;.ssh&#x2F;config &amp;lt;&amp;lt;END&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Host monitoring&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      HostName ansible.how&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      User root&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      IdentityFile ~&#x2F;.ssh&#x2F;ssh.key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      StrictHostKeyChecking no&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    END&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  env:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    SSH_KEY: ${{ secrets.SSH_KEY }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Using this ssh access I managed to generate my desired csv line per poll.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- name: generate csv line&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   run: |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     echo $(date +%H:%M-%D),\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          $(ssh monitoring free -m | grep -ow [0-9.]* | head -n 2 | tail -n 1),\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          $(ssh monitoring df -m &#x2F; | grep -ow [0-9]* | head -n 2 | tail -n 1),\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          $(ssh monitoring uptime | cut -d &amp;quot;:&amp;quot; -f 5)\&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     | tr -d &amp;quot; &amp;quot; &amp;gt;&amp;gt; stats.csv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which then got appended to the already present csv and committed as an update.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- name: auwuto commit uwu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  uses: stefanzweifel&#x2F;git-auto-commit-action@v5&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  with:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    commit_message: bump stats.csv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    repository: .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    file_pattern: stats.csv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  env:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;results&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#results&quot; aria-label=&quot;Anchor link for: results&quot;&gt;🔗&lt;&#x2F;a&gt;

Results&lt;&#x2F;h2&gt;
&lt;p&gt;github actions are clearly not meant to adhere to the specified cron timing with most of my action runs being delayed for around 5 minutes. The most impressive delay way at 1am yesterday, where my run got delayed for a whole 23 minutes.&lt;&#x2F;p&gt;
&lt;p&gt;I could have gone the extra mile and written a matplotlib visualisation of the stats, but chose not to.
Plotting a csv with python is much less interesting and has been documented to death already.&lt;&#x2F;p&gt;
&lt;p&gt;All the code and the csv for this proof of concept are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;github-actions-monitoring&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 High Availability</title>
          <pubDate>Mon, 03 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/high-availability/</link>
          <guid>https://port19.xyz/tech/high-availability/</guid>
          <description xml:base="https://port19.xyz/tech/high-availability/">&lt;h1 id=&quot;how-many-nines-do-you-need&quot;&gt;
How many nines do you need?&lt;&#x2F;h1&gt;
&lt;p&gt;I consider myself to be a linux admin, or devops engineer as the kids say, so the goal of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;High_availability&quot;&gt;high availability&lt;&#x2F;a&gt; is one without which I&#x27;d be much less optimistic about my career. I want to put out this article to take a step back and cover in broad strokes what level of availability you may want to aspire towards and what measures you can take to achieve it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;first-nine-90&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#first-nine-90&quot; aria-label=&quot;Anchor link for: first-nine-90&quot;&gt;🔗&lt;&#x2F;a&gt;

First Nine - 90%&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;9 days downtime per quarter&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Not cracking the first nine is bad, even for hobby projects. To dip below the first nine, you need to ban the term &quot;best practice&quot; from your vocabulary, make pervasive use of all available hipster technology and abstain from any monitoring of any kind. The only way for you to dip below 90% availability that I can empathise with is if you run your server at home in a country with bad internet, like Germany.&lt;&#x2F;p&gt;
&lt;p&gt;If you follow your intuition and just throw your binary at a random VPS host, you&#x27;ll get the first nine.
And even in the event of an outage, you can take a day off before addressing it without adverse effect.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;second-nine-99&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#second-nine-99&quot; aria-label=&quot;Anchor link for: second-nine-99&quot;&gt;🔗&lt;&#x2F;a&gt;

Second Nine - 99%&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;22 hours downtime per quarter&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;To get the second nine I recommend you sign up for some free uptime monitoring service like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;uptimerobot.com&#x2F;&quot;&gt;uptimerobot&lt;&#x2F;a&gt; and configure it to send you email notifications on downtime. I&#x27;d say this level is perfectly appropriate for small personal projects or early public projects in the &quot;move fast and break things&quot; phase. &lt;br &#x2F;&gt;
Bonus points for using version control and doing a recovery test every so often.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;third-nine-99-9&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#third-nine-99-9&quot; aria-label=&quot;Anchor link for: third-nine-99-9&quot;&gt;🔗&lt;&#x2F;a&gt;

Third Nine - 99.9%&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;131 minutes downtime per quarter&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At this point you &lt;em&gt;need&lt;&#x2F;em&gt; monitoring, ideally a little more than just third party uptime monitoring. You need to configure the monitoring software to wake you up at night if the server fails, or alternatively have some primitive failover mechanism that kicks in automatically. Such a failover mechanism could be an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;load-balancing&#x2F;load-balancers&#x2F;common-configurations&#x2F;&quot;&gt;active-passive&lt;&#x2F;a&gt; setup behind a reverse proxy, where you have another instance of your application running all the time ready to take over. This is also a good point to stop rolling out updates on a Friday afternoon and to establish some holistic testing procedure.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fourth-nine-99-99&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#fourth-nine-99-99&quot; aria-label=&quot;Anchor link for: fourth-nine-99-99&quot;&gt;🔗&lt;&#x2F;a&gt;

Fourth Nine - 99.99%&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;13 minutes downtime per quarter&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Kubernetes! DevOps! Cloud! Congratulations, you&#x27;re now the target audience for many shiny new things and evidently have enough of a business to throw some money at people like me. At this point your product needs to have reached some level of maturity and the infrastructure people need to put failover mechanisms into place that catch every common and expectable failure mode.&lt;&#x2F;p&gt;
&lt;p&gt;This is also getting into ghost hunting territory, as even moderately complex systems can have hard to predict failure conditions and the relatively short time for recovery means that one regular outage, even if handled to the standards of a fortune 500 tech firm, can ruin your availability stat for the year.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe Kubernetes is the answer, maybe not. Add me to any team of software devs and I&#x27;ll get you that third nine, but for the fourth you&#x27;ll have to get me some colleagues. With a bit of luck, we&#x27;ll figure it out.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mythical-fifth-nine&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#mythical-fifth-nine&quot; aria-label=&quot;Anchor link for: mythical-fifth-nine&quot;&gt;🔗&lt;&#x2F;a&gt;

Mythical Fifth Nine&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;79 seconds downtime per quarter&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If the fourth nine requires hiring a couple of people, the fifth and beyond require hiring dozens, plus some very favourable conditions and&#x2F;or luck. Even a product like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.theverge.com&#x2F;2019&#x2F;6&#x2F;18&#x2F;18683625&#x2F;google-calendar-down-worldwide-outage-404-error&quot;&gt;Google Calendar&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.macrumors.com&#x2F;2024&#x2F;04&#x2F;25&#x2F;reddit-is-down-on-iphone-and-web&#x2F;&quot;&gt;Reddit&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;techcrunch.com&#x2F;2024&#x2F;03&#x2F;05&#x2F;discord-is-down-for-some-users&#x2F;?guccounter=1&quot;&gt;Discord&lt;&#x2F;a&gt; can be down for about an hour, easily ruining the fifth nine for a decade.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;before-the-first-nine&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#before-the-first-nine&quot; aria-label=&quot;Anchor link for: before-the-first-nine&quot;&gt;🔗&lt;&#x2F;a&gt;

Before The First Nine&lt;&#x2F;h2&gt;
&lt;p&gt;Make backups of your code. A git repository is sufficient for that, so you&#x27;re probably good already.
If you offer a stateful service, make regular backups of the application state, e.g. the customer data.
This is why people are so conservative when it comes to storage: an outage is an inconvenience, loss of data is a company killer.&lt;&#x2F;p&gt;
&lt;p&gt;I hope this was a nice read and I got someone motivated to at least slap uptimerobot onto their blog.
Maybe in a few years I&#x27;ll have some snake oil to sell that promises that next nine, but for now this will do.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 GPN CTF 2024 Writeup</title>
          <pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/gpn-ctf-2024-writeup/</link>
          <guid>https://port19.xyz/tech/gpn-ctf-2024-writeup/</guid>
          <description xml:base="https://port19.xyz/tech/gpn-ctf-2024-writeup/">&lt;h1 id=&quot;gpn-ctf-2024-writeup&quot;&gt;
GPN CTF 2024 Writeup&lt;&#x2F;h1&gt;
&lt;p&gt;This weekend I participated in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctftime.org&#x2F;event&#x2F;2257&quot;&gt;GPN CTF&lt;&#x2F;a&gt;, organised by the CTF team of the Karlsruhe Institute of Technology.
I focused on the challenges tagged &quot;Introduction&quot;, solving all except the Pwning one.
For my readers unfamiliar with CTFs, I recently wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;ctf&#x2F;&quot;&gt;this post&lt;&#x2F;a&gt; about their role in my career so far.
The flags are listed in the order I got them.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sanity-check-you-know-the-rules-and-so-do-i&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#sanity-check-you-know-the-rules-and-so-do-i&quot; aria-label=&quot;Anchor link for: sanity-check-you-know-the-rules-and-so-do-i&quot;&gt;🔗&lt;&#x2F;a&gt;

Sanity Check: You know the rules and so do I&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s customary for CTF organisers to include at least one trivially easy flag to alleviate the participants worries that subsequent flags are rejected due to the system not working.
As hinted at in the title, the flag was present in full on the site listing the rules for the event.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;web-never-gonna-tell-a-lie-and-type-you&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#web-never-gonna-tell-a-lie-and-type-you&quot; aria-label=&quot;Anchor link for: web-never-gonna-tell-a-lie-and-type-you&quot;&gt;🔗&lt;&#x2F;a&gt;

Web: Never gonna tell a lie and type you&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;This challenge gave a Dockerfile and some PHP code.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The Dockerfile told me there was a file called &lt;code&gt;flag.txt&lt;&#x2F;code&gt; under the root directory, making the objective pretty obvious.
What was less obvious was how to talk to the server and how the hell this PHP worked.&lt;&#x2F;p&gt;
&lt;p&gt;Talking to the server turned out to be not too complicated after looking up the appropriate curl options to arrive at something like this: &lt;br &#x2F;&gt;
&lt;code&gt;curl -A &quot;friendlyHuman&quot; --data &#x27;data={&quot;user&quot;: &quot;admin🤠&quot;, &quot;password&quot;: &quot;something&quot;}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The PHP wanted me to meet the strange condition that my supplied password be equal to the result of applying the function &lt;code&gt;securePassword&lt;&#x2F;code&gt; to it.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;perl&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;function securePassword($user_secret){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; ($user_secret &amp;lt; 10000){&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        die&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;nope don&amp;#39;t cheat&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    $o = (integer) (&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;substr&lt;&#x2F;span&gt;&lt;span&gt;(hexdec(md5(strval($user_secret))),0,7)*123981337);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; $user_secret * $o ;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So my first intuition was that &lt;code&gt;0*x=0&lt;&#x2F;code&gt; and surely that must be useful to find this flag.
I ended up spending about two hours first doing some napkin math of how long it would take my iGPU to find an md5 hash that starts with seven zeroes, followed by some &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hashcat.net&#x2F;hashcat&#x2F;&quot;&gt;Hashcat&lt;&#x2F;a&gt; related research and ultimately finding the hashgame (website dead now).&lt;&#x2F;p&gt;
&lt;p&gt;Somewhere along the way I heard about PHP type juggling and that in PHP, due to it, &lt;code&gt;md5(&#x27;240610708&#x27;)&lt;&#x2F;code&gt; equals &lt;code&gt;md5(&#x27;QNKCDZO&#x27;)&lt;&#x2F;code&gt;.
After a short break I fired up another instance to get the communication rolling again.
In my infinite wisdom, I supply the password &quot;11e777777&quot; and am surprised to be greeted as admin.&lt;&#x2F;p&gt;
&lt;p&gt;From here I just had to add &quot;cat &#x2F;flag.txt&quot; to the &quot;command&quot; field of my json POST data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reversing-never-gonna-run-around-and-reverse-you&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#reversing-never-gonna-run-around-and-reverse-you&quot; aria-label=&quot;Anchor link for: reversing-never-gonna-run-around-and-reverse-you&quot;&gt;🔗&lt;&#x2F;a&gt;

Reversing: Never gonna run around and reverse you&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;This challenge gave a binary that runs a hash function as well as the hashed flag.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;At first I ran the binary through &lt;code&gt;strings&lt;&#x2F;code&gt; and &lt;code&gt;xxd&lt;&#x2F;code&gt;, and with &lt;code&gt;strace&lt;&#x2F;code&gt; and &lt;code&gt;ltrace&lt;&#x2F;code&gt; to no avail.&lt;&#x2F;p&gt;
&lt;p&gt;I then tested various inputs, quickly noticing that the hashing function is linear. What do I mean by that?
Well, a character in the input string maps to a fixed number of digits in the output string, usually two.
The early characters influence later characters, but not the other way around.
If there was no influence at all, we could quickly build a substitution table, but this is still fine.&lt;&#x2F;p&gt;
&lt;p&gt;To get the flag I wrote a python script that builds up the flag, checking each character for matching hash output as it appends it.
The code speaks for itself:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;import&lt;&#x2F;span&gt;&lt;span&gt; subprocess&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;4717591a4e08732410215579264e7e0956320367384171045b28187402316e1a7243300f501946325a6a1f7810643b0a7e21566257083c63043404603f5763563e43&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;GPNCTF{&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;local_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; not&lt;&#x2F;span&gt;&lt;span&gt; local_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; target_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; range&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;32&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 127&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        local_flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; chr&lt;&#x2F;span&gt;&lt;span&gt;(x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        local_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; subprocess&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;check_output&lt;&#x2F;span&gt;&lt;span&gt;([&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;.&#x2F;hasher&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; local_flag])&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;decode&lt;&#x2F;span&gt;&lt;span&gt;()[&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;        if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt;(x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span&gt; y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; for&lt;&#x2F;span&gt;&lt;span&gt; x&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt;y&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; zip&lt;&#x2F;span&gt;&lt;span&gt;(local_hash&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span&gt; target_hash)))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; chr&lt;&#x2F;span&gt;&lt;span&gt;(x)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;            break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(flag)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;crypto-never-gonna-let-you-crypto&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#crypto-never-gonna-let-you-crypto&quot; aria-label=&quot;Anchor link for: crypto-never-gonna-let-you-crypto&quot;&gt;🔗&lt;&#x2F;a&gt;

Crypto: Never gonna let you crypto&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;This challenge gave a &lt;code&gt;chal.py&lt;&#x2F;code&gt; and a file with the encrypted flag.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;chal.py&lt;&#x2F;code&gt; contained an implementation of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;XOR_cipher&quot;&gt;XOR cipher&lt;&#x2F;a&gt;, with the notable weakness being the key length of 5.
The XOR cipher is uniquely symmetric in that it&#x27;s not just a symmetric cipher, but one where the encryption function is identical to the decryption function.
Since the flag format was known to match &lt;code&gt;GPNCTF{.*}&lt;&#x2F;code&gt;, we had a known plaintext.
With this, and after fighting pythons type system for a little, I was able to derive the key and then use that to decrypt the flag.
Check out the code:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;flag_enc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;d24fe00395d364e12ea4ca4b9f2da4ca6f9a24b2ca729a399efb2cd873b3ca7d9d1fb3a66a9b73a5b43e8f3d&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kpt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;GPNCT&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# convert to bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b_flag_enc&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;fromhex&lt;&#x2F;span&gt;&lt;span&gt;(flag_enc)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b_kpt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; kpt&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;encode&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;utf8&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# derive the key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; range&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;(b_kpt))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; [b_flag_enc[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span&gt;b_kpt[i]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; bytes&lt;&#x2F;span&gt;&lt;span&gt;(key)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;# get flag&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; []&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt; range&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;(b_flag_enc))&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    flag&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span&gt; [b_flag_enc[i]&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;^&lt;&#x2F;span&gt;&lt;span&gt;key[i&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F29668;&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;len&lt;&#x2F;span&gt;&lt;span&gt;(key)]]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #F07178;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;bytes&lt;&#x2F;span&gt;&lt;span&gt;(flag)&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FFB454;&quot;&gt;decode&lt;&#x2F;span&gt;&lt;span&gt;())&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;misc-a-full-solve-s-what-i-m-thinking-of&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#misc-a-full-solve-s-what-i-m-thinking-of&quot; aria-label=&quot;Anchor link for: misc-a-full-solve-s-what-i-m-thinking-of&quot;&gt;🔗&lt;&#x2F;a&gt;

Misc: A full solve&#x27;s what I&#x27;m thinking of&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;With this challenge you&#x27;re tasked with uploading a file to a website.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The website then executes the uploaded file, with a &lt;code&gt;catflag&lt;&#x2F;code&gt; binary available in the root directory of the server.
I&#x27;m not sure I could have done this challenge without hints.&lt;&#x2F;p&gt;
&lt;p&gt;First order of business was to write a hello world program in C, which went well.
Then, after a little digging, I thought &lt;code&gt;execl&lt;&#x2F;code&gt; would do the trick, calling &lt;code&gt;&#x2F;catflag&lt;&#x2F;code&gt; from within my binary.
While it worked locally to the extend testable, it did not yield a flag.&lt;&#x2F;p&gt;
&lt;p&gt;Checking the chat logs, I came across the recommendation to use &lt;code&gt;patchelf&lt;&#x2F;code&gt;.
So I thought to add &lt;code&gt;&#x2F;catflag&lt;&#x2F;code&gt; as a dependency via &lt;code&gt;patchelf --add-needed &quot;&#x2F;catflag&quot; a.out&lt;&#x2F;code&gt;, but that wasn&#x27;t enough.
What was actually necessary was to use &lt;code&gt;--set-interpreter&lt;&#x2F;code&gt; instead of &lt;code&gt;--add-needed&lt;&#x2F;code&gt;.
The idea for that came from &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;klamp.works&#x2F;2016&#x2F;04&#x2F;15&#x2F;code-exec-ldd.html&quot;&gt;this post&lt;&#x2F;a&gt;, but I&#x27;m sure the patchelf hint would have been sufficient with a little more perseverance.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Unyielding Consumerism</title>
          <pubDate>Tue, 07 May 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/unyielding-consumerism/</link>
          <guid>https://port19.xyz/lifestyle/unyielding-consumerism/</guid>
          <description xml:base="https://port19.xyz/lifestyle/unyielding-consumerism/">&lt;h1 id=&quot;1-year-update-on-my-spending-habits&quot;&gt;&lt;em&gt;~1 year update on my spending habits&lt;&#x2F;em&gt;&lt;&#x2F;h1&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;consoomer.png&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
Okay, it was never that bad
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;where-we-left-off&quot;&gt;Where we left off&lt;&#x2F;h2&gt;
&lt;p&gt;So in July of last year, following a particularly egregious impulse purchase, I started to curb my spending by following a new system.
I call it the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;rolling-shoppinglist&#x2F;&quot;&gt;rolling shopping list&lt;&#x2F;a&gt;, and have been using it as a tool to stop impulse purchases with great effect. Yet, it hasn&#x27;t been the silver bullet to solve all spending issues that I had wished it to be.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;needless-shopping&quot;&gt;Needless shopping&lt;&#x2F;h2&gt;
&lt;p&gt;While I&#x27;ve been largely consistent in my avoidance of impulse purchases, with only one or two minor slip-ups since, not all my purchases are as great as I&#x27;d like them to be.
The reason for this can&#x27;t be impulse, that variable is accounted for, but rather a discrepancy between perceived wants and actual wants.
I congratulate the advertising industry for successfully playing it&#x27;s part in this.&lt;&#x2F;p&gt;
&lt;p&gt;Whereas with the impulse purchases of before I would receive the item and go &lt;em&gt;&quot;what was I thinking!&quot;&lt;&#x2F;em&gt;, the new needless orders have me wondering how I came to my inflated expectations that are now disappointed.&lt;&#x2F;p&gt;
&lt;p&gt;To illustrate, I bought a used PlayStation 3 slim recently for 89€ and while I don&#x27;t flat out regret the purchase, it now sits on a shelf waiting to be used some day. More extreme would be my order of a shaker from GamerSupps, which I used once before recently throwing it away in realisation that I don&#x27;t even like protein shakes or energy drinks.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ripoff-restaurants&quot;&gt;Ripoff Restaurants&lt;&#x2F;h2&gt;
&lt;p&gt;Another annoyance I deal with is the inflation in german restaurants and their decline in quality.
I can easily justify the occasional restaurant visit with friends as a social event, but can&#x27;t help but feel a little ashamed for wasting 2-4 bucks for a coffee every other day.
Or 8€ for a mediocre döner kebab.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;d say with my cooking skills getting better and better, as you might infer from my recently published stew recipes, it should be manageable.
It&#x27;s nowhere near as bad as ~18 months ago where I set my personal record with 450€ in food expenses in a single month.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps it&#x27;s less about the monetary cost of the food and more about the perceived gap between the price and the quality. Should I do meal prep? Idk, I&#x27;ll figure something out.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;While I&#x27;m happy to have reduced my needless shopping over the past year, heck I even managed to avoid spending a thousand bucks on an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;macos&#x2F;&quot;&gt;M1 Mac&lt;&#x2F;a&gt;, I still have the unyielding urge to - occasionally - consoom product.
Oh well...&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Is Meditation Worth It?</title>
          <pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/meditation/</link>
          <guid>https://port19.xyz/lifestyle/meditation/</guid>
          <description xml:base="https://port19.xyz/lifestyle/meditation/">&lt;img src=&quot;.&#x2F;waking-the-npc.png&quot; height=&quot;200vw&quot;&gt;
&lt;p&gt;I&#x27;ve always wanted to write a piece on meditation, but could never think of a coherent message worth communicating.
This has now changed.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t meditate regularly. &lt;br &#x2F;&gt;
I had short phases in my late teens and early twenties, but didn&#x27;t see the true benefits, for those aren&#x27;t advertised. And frankly, even if they were, they would be a hard sell.
Meditation usually gets sold as some sort of spiritual stress relief to hippies and some anti-adhd performance enhancer to ambitious types like myself. &lt;br &#x2F;&gt;
It&#x27;s not that undertones of contemplation and introspection get fully swept under the rug, but they aren&#x27;t elaborated upon to the extent necessary to be perceived as sufficiently valuable by those on the proverbial &quot;other side&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;But why even care? Empirically, I have seen evidence to suggest that wisdom (making good decisions) is more valuable in modern&#x2F;western society than raw intelligence (speed of learning), given a healthy baseline of both.
And to gain this wisdom, there are few better shortcuts than to take everything into account and view your situation in an extremely holistic way. Becoming aware.
This includes the ability to put a good distance between yourself and your feelings or your thoughts.
It also includes the ability to observe and observe carefully yourself and your reactions to outside influence.&lt;&#x2F;p&gt;
&lt;p&gt;Put another way, your awareness has a dramatic effect on your wisdom, and with meditation increasing your awareness like few other things, it is by proxy a great way to &quot;level up&quot; your wisdom.&lt;&#x2F;p&gt;
&lt;p&gt;While in the beginning there are no substitutes to meditation, it should not go unmentioned that once you have gained some experience with it, you&#x27;ll learn to enter a state of mindfulness in increasingly less rigid practice, such as on a walk or when waiting.&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t meditate to gain 5% more grey matter in your prefrontal cortex or to be able to study for half an hour more.
If those are your reasons you&#x27;re not ready, just as I&#x27;m not, and that is fine.
Perhaps try out meditation just to be acquainted with the practice and discard it when you realise it&#x27;s no silver bullet (yet).&lt;&#x2F;p&gt;
&lt;p&gt;Once we reach a point where we&#x27;re free to make choices with impact, once wisdom reaps higher rewards than usual, or it&#x27;s deficiency puts us at great risk, it will be obvious to us.
Likewise, reaching a stage of personal development where it gets tough to make headway by other means will be hard to miss.&lt;&#x2F;p&gt;
&lt;p&gt;An alternative approach, one that never quite resonated with me, is to free yourself from the inside.
This is usually the route taken by the spiritual types, and you&#x27;re better of consulting with them if you&#x27;re interested.&lt;&#x2F;p&gt;
&lt;p&gt;So that&#x27;s it.
That&#x27;s why I meditate and why I don&#x27;t.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 CTF: My Origins</title>
          <pubDate>Mon, 29 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/ctf/</link>
          <guid>https://port19.xyz/tech/ctf/</guid>
          <description xml:base="https://port19.xyz/tech/ctf/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;google-ctf-2018.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
Google CTF 2018
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;what-are-ctfs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-are-ctfs&quot; aria-label=&quot;Anchor link for: what-are-ctfs&quot;&gt;🔗&lt;&#x2F;a&gt;

What are CTFs&lt;&#x2F;h2&gt;
&lt;p&gt;Security CTFs, with CTF standing for Capture The Flag, are challenging, time bound IT security contests.
Jeopardy style CTFs are more common and feature a wide selection of challenges in a few different categories.
The main 5 categories are &lt;code&gt;crypto&lt;&#x2F;code&gt; (cryptography), &lt;code&gt;pwn&lt;&#x2F;code&gt; (binary exploitation), &lt;code&gt;rev&lt;&#x2F;code&gt; (reverse engineering), &lt;code&gt;web&lt;&#x2F;code&gt; and &lt;code&gt;misc&lt;&#x2F;code&gt;.
Occasionally you&#x27;ll see stuff like &lt;code&gt;forensics&lt;&#x2F;code&gt;, &lt;code&gt;stegano&lt;&#x2F;code&gt; and &lt;code&gt;osint&lt;&#x2F;code&gt; pop up as well.
These contests usually last 48 or 72 hours over a weekend and can be competed in as teams or alone.&lt;&#x2F;p&gt;
&lt;p&gt;Outside of regular competition hours, there are long standing websites where you can improve your skills in a specific category.
These sites often host coherent paths that are called wargames, or may just have a loose collection of challenges. &lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;overthewire.org&#x2F;wargames&#x2F;bandit&#x2F;&quot;&gt;Bandit&lt;&#x2F;a&gt; on OverTheWire is often recommended for beginners and will leave you a very competent linux user.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;cryptohack.org&#x2F;&quot;&gt;cryptohack.org&lt;&#x2F;a&gt; and &lt;del&gt;crackmes.one&lt;&#x2F;del&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;challenges.re&#x2F;&quot;&gt;challenges.re&lt;&#x2F;a&gt; are also notoriously good for the &lt;code&gt;crypto&lt;&#x2F;code&gt; and &lt;code&gt;rev&lt;&#x2F;code&gt; categories in particular.&lt;&#x2F;p&gt;
&lt;p&gt;For more on CTFs I recommend you watch &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=8ev9ZX9J45A&quot;&gt;this&lt;&#x2F;a&gt; youtube video after you finish my post.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-4to3-era&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-4to3-era&quot; aria-label=&quot;Anchor link for: the-4to3-era&quot;&gt;🔗&lt;&#x2F;a&gt;

The 4to3 Era&lt;&#x2F;h2&gt;
&lt;p&gt;While I participated in my first CTF in the summer of 2018 - the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctftime.org&#x2F;event&#x2F;623&quot;&gt;Google CTF&lt;&#x2F;a&gt; - which prompted me to learn python, I ended up forming the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctftime.org&#x2F;team&#x2F;88176&quot;&gt;4to3&lt;&#x2F;a&gt; team for more CTFs in late 2019.
I consider the founding members to be SidSploit, SadKris, temeZer, flyfly and me, going by the alias of ura back then. The 43 in my ura43 alias before the port19 rebrand was an homage to them.&lt;&#x2F;p&gt;
&lt;p&gt;We were pretty good, finishing middle of the pack most of the time, with an affinity for shorter CTFs.
In addition to being the team captain, signing us up for events and stuff, I focused on the &lt;code&gt;crypto&lt;&#x2F;code&gt; category with some occasional &lt;code&gt;misc&lt;&#x2F;code&gt; stuff.
In 2021, after a good run of roughly two years and our joint interest in CTFs and cybersecurity slowly fading, we disbanded the team, with SadKris being the only member to remain focused on a career in the field of cybersecurity, tho I&#x27;ve lost touch with him since.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-mountain&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-mountain&quot; aria-label=&quot;Anchor link for: the-mountain&quot;&gt;🔗&lt;&#x2F;a&gt;

The Mountain&lt;&#x2F;h2&gt;
&lt;p&gt;CTFs have taught me the sheer mountain of competence you can ascend as a hacker&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.archive.org&#x2F;web&#x2F;20240824161944&#x2F;https:&#x2F;&#x2F;www.catb.org&#x2F;~esr&#x2F;faqs&#x2F;hacker-howto.html#what_is&quot;&gt;¹&lt;&#x2F;a&gt;.
Every cracked flag is a massive achievement with many hours of work behind it.
And even in events with no flags I did not leave feeling disheartened, rather inspired by a newfound gap in my knowledge and skills.
It has taught me that the journey doesn&#x27;t have to end after you learn basic programming and that there is a whole other league of experts that will welcome you in their ranks if you put in the &lt;em&gt;years&lt;&#x2F;em&gt; required to get there.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;celeste-mountain.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
how I felt embarking on CTFs
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;impostor-syndrome-resistance&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#impostor-syndrome-resistance&quot; aria-label=&quot;Anchor link for: impostor-syndrome-resistance&quot;&gt;🔗&lt;&#x2F;a&gt;

Impostor Syndrome Resistance&lt;&#x2F;h2&gt;
&lt;img src=&quot;.&#x2F;flow-state.png&quot; height=&quot;300vw&quot;&gt;
&lt;p&gt;You may know this diagram showing the optimal zone to enter the flow state.
The concept of a flow state itself isn&#x27;t particularly important for this, but notice the label of the lower right quadrant: &lt;em&gt;Anxiety&lt;&#x2F;em&gt;.
This is the quadrant you&#x27;ll find yourself in during a CTF when it comes to the challenges presented.
And this doesn&#x27;t just apply to DefCon.
For mere mortals like me &lt;del&gt;back then&lt;&#x2F;del&gt;, even regular CTFs present some of the hardest challenges available.&lt;&#x2F;p&gt;
&lt;p&gt;Persevering through these challenges and netting the occasional flag has made me extremely impostor syndrome resistant.
I know that the vast majority of programmers at least sometimes have the opportunity, the temptation, or perhaps the misfortune, to face the perceived impossible.
Some will interpret their hardship and failure as evidence of their incompetence, their poor fitness for the field of IT. I don&#x27;t.&lt;&#x2F;p&gt;
&lt;p&gt;It has been a few years since I participated in a CTF, but there is no doubt in my mind that they continue to show their influence on me.
Without my exposure to CTFs, I may not have persevered through the hardships along the way, and I wouldn&#x27;t have been inspired to rise to the occasion every time an opportunity for growth presented itself.&lt;&#x2F;p&gt;
&lt;p&gt;And thus, the grind goes on.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Leg Disk Stew</title>
          <pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/leg-disk-stew/</link>
          <guid>https://port19.xyz/recipes/leg-disk-stew/</guid>
          <description xml:base="https://port19.xyz/recipes/leg-disk-stew/">&lt;p&gt;&lt;em&gt;takes way too long&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h1 id=&quot;leg-disk-stew-recipe&quot;&gt;Leg Disk Stew Recipe&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Cooking time: 10 min&lt;&#x2F;li&gt;
&lt;li&gt;Oven time: 90 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;1 (~500-800g) leg disk with bone (beef)&lt;&#x2F;li&gt;
&lt;li&gt;6-8 carrots&lt;&#x2F;li&gt;
&lt;li&gt;~150 soup noodles&lt;&#x2F;li&gt;
&lt;li&gt;500ml water&lt;&#x2F;li&gt;
&lt;li&gt;3 tsp broth powder &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;black pepper &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;salt &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;potato peeler&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;cutting knife&lt;&#x2F;li&gt;
&lt;li&gt;large pot&lt;&#x2F;li&gt;
&lt;li&gt;small pot&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;li&gt;baking pan&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Preheat the oven at 200°C top-bottom&lt;&#x2F;li&gt;
&lt;li&gt;Briefly wash the leg disk&lt;&#x2F;li&gt;
&lt;li&gt;Put the leg disk into the large pot with plenty of water&lt;&#x2F;li&gt;
&lt;li&gt;Optionally add some broth powder
&lt;em&gt;(not necessary because of the bone marrow)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Crank up the heat&lt;&#x2F;li&gt;
&lt;li&gt;Peel your carrots&lt;&#x2F;li&gt;
&lt;li&gt;Cut the carrots into ~3cm oblique cuts&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;duckduckgo.com&#x2F;?q=oblique+cut+cooking&amp;amp;iax=images&amp;amp;ia=images&quot;&gt;¹&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Leave those on the cutting board for now&lt;&#x2F;li&gt;
&lt;li&gt;Once the large pot boils, partly cover with lid and put in oven&lt;&#x2F;li&gt;
&lt;li&gt;(Don&#x27;t panic about white foamy appearance right now, this normalizes)&lt;&#x2F;li&gt;
&lt;li&gt;Wait 30 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Stir&lt;&#x2F;li&gt;
&lt;li&gt;Wait another 30 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Add your carrots, salt and pepper and stir&lt;&#x2F;li&gt;
&lt;li&gt;Wait another 20 minutes&lt;&#x2F;li&gt;
&lt;li&gt;While waiting, bring water to a boil in the small pot&lt;&#x2F;li&gt;
&lt;li&gt;Add soup noodles and leave as per package instructions&lt;&#x2F;li&gt;
&lt;li&gt;Pull large pot out of the oven&lt;&#x2F;li&gt;
&lt;li&gt;Pull out the meat and bone&lt;&#x2F;li&gt;
&lt;li&gt;Cut up the meat and put it back in without the bone&lt;&#x2F;li&gt;
&lt;li&gt;Add the ready soup noodles to it and give it a final stir&lt;&#x2F;li&gt;
&lt;li&gt;Done. Serves 2 &lt;em&gt;(add more pepper when serving)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🍚 Mushroom Stew</title>
          <pubDate>Thu, 25 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/mushroom-stew/</link>
          <guid>https://port19.xyz/recipes/mushroom-stew/</guid>
          <description xml:base="https://port19.xyz/recipes/mushroom-stew/">&lt;img src=&quot;.&#x2F;mushroom-stew.png&quot; height=&quot;200vw&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 10 min&lt;&#x2F;li&gt;
&lt;li&gt;Cooking time: 15 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;250g champignon&lt;&#x2F;li&gt;
&lt;li&gt;50-100g other mushrooms &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;30g dried porcini &lt;em&gt;(sub: other expensive mushrooms)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;50g butter&lt;&#x2F;li&gt;
&lt;li&gt;2 small onions &#x2F; 1 large onion&lt;&#x2F;li&gt;
&lt;li&gt;200g cream&lt;&#x2F;li&gt;
&lt;li&gt;500ml water&lt;&#x2F;li&gt;
&lt;li&gt;3 tsp broth powder&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp curry powder&lt;&#x2F;li&gt;
&lt;li&gt;2 tsp white pepper &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;some parsley &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;black pepper &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 baguette &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;cutting knife&lt;&#x2F;li&gt;
&lt;li&gt;small pot&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Optionally, clean the mushrooms &lt;br &#x2F;&gt;
&lt;em&gt;(with a kitchen cloth&#x2F;paper towel, no water)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Cut half the mushrooms&lt;&#x2F;li&gt;
&lt;li&gt;Put the butter in the pot on high heat&lt;&#x2F;li&gt;
&lt;li&gt;Cut the other half of the mushrooms&lt;&#x2F;li&gt;
&lt;li&gt;Once the butter has melted, add the mushrooms&lt;&#x2F;li&gt;
&lt;li&gt;Roast for 3 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Meanwhile cut the onions&lt;&#x2F;li&gt;
&lt;li&gt;Add onions and curry powder&lt;&#x2F;li&gt;
&lt;li&gt;Mix&lt;&#x2F;li&gt;
&lt;li&gt;Roast for another 3 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Add borth powder, water and white pepper&lt;&#x2F;li&gt;
&lt;li&gt;Bring to a boil&lt;&#x2F;li&gt;
&lt;li&gt;Stir occasionally&lt;&#x2F;li&gt;
&lt;li&gt;Turn heat to low and add the cream&lt;&#x2F;li&gt;
&lt;li&gt;Simmer for another 3 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Optionally garnish with parsley&lt;&#x2F;li&gt;
&lt;li&gt;Works well with baguette as a side&lt;&#x2F;li&gt;
&lt;li&gt;Done. Serves 2 &lt;em&gt;(add black pepper when serving)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🌸Retro Games🌸</title>
          <pubDate>Wed, 17 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/retro-games/</link>
          <guid>https://port19.xyz/retro-games/</guid>
          <description xml:base="https://port19.xyz/retro-games/">&lt;p&gt;&lt;em&gt;also check my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;anime&quot;&gt;anime list&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;completed&quot;&gt;Completed&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;i style=&quot;color: gold&quot;&gt;• played through twice&lt;&#x2F;i&gt;&lt;&#x2F;p&gt;
&lt;!-- NA Relese Dates: SNES 1991, PSX 1995, N64 1996, PS2 2000, GBA 2001, GC 2001--&gt;
&lt;!-- SNES quit: Donkey Kong Country, F Zero, Secret of Mana, Chrono Trigger, Contra III, many shmups--&gt;
&lt;!-- SNES games with potential: Zelda ALTTP, Mega Man X, Yoshis Island, Aero Fighters--&gt;
&lt;!-- GBA games with potential: Castlevania CotM, Kirby, Zelda Minish Cap--&gt;
&lt;!-- PS2: God of War (&amp;2), Silent Hill 2 (&amp;3), Castlevania Lament of Innocence--&gt;
&lt;!-- GC: Metroid Prime 2, Luigis Mansion, Resident Evil--&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-castlevania-iv.jpg&quot; style=&quot;box-shadow: 0 0 0 3px gold;&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-metroid.jpg&quot; style=&quot;box-shadow: 0 0 0 3px gold;&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;kirby-super-star.jpg&quot; style=&quot;box-shadow: 0 0 0 3px gold;&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-mario-rpg.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-mario-kart.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-mario-all-stars.jpg&quot; title=&quot;only 1 so far&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;earthbound.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;tetris-attack.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;tmnt-4.jpg&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;super-mario-64.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;star-fox-64.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;paper-mario.jpg&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;castlevania-chronicles.jpg&quot; title=&quot;with save states, do not recommend&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;castlevania-symphony-of-the-night.jpg&quot; style=&quot;box-shadow: 0 0 0 3px gold;&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;silent-hill.jpg&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;metroid-fusion.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;castlevania-aria-of-sorrow.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;metroid-zero-mission.jpg&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;drill-dozer.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;pokemon-leafgreen.jpg&quot;&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;final-fantasy-1-2.jpg&quot; title=&quot;only 1, 2 sucks&quot;&gt;
&lt;br&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;metroid-prime.jpg&quot;&gt;
&lt;br&gt;
&lt;!-- NES sucks, but I played bubble bobble, tetris and kirbys adventure on it. Covers suck too, so I&#x27;m not including them--&gt;
&lt;h2 id=&quot;curation&quot;&gt;Curation&lt;&#x2F;h2&gt;
&lt;img src=&quot;&#x2F;retrocovers&#x2F;snes-classic.jpg&quot; width=600&gt;
&lt;h2 id=&quot;sourcing-emulation&quot;&gt;Sourcing &amp;amp; Emulation&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;myrient.erista.me&#x2F;&quot;&gt;Myrient&lt;&#x2F;a&gt; is good for curated nointro and redump romsets. It shuts down March 31st.&lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;romsfun.com&#x2F;&quot;&gt;Romsfun&lt;&#x2F;a&gt; is my current fallback site.&lt;&#x2F;p&gt;
&lt;p&gt;I use dolphin and pcsx2, but also the nintendo switch online library + expansion pack.
My Gamepad is a black &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.8bitdo.com&#x2F;pro2&#x2F;&quot;&gt;8bitdo pro 2.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pc&quot;&gt;PC&lt;&#x2F;h2&gt;
&lt;p&gt;Since the beginning of 2024 I have largely dropped PC gaming in favor of retro games.
However in the ~5 years before that I played a fair bit of PC, and as such my favourites deserve their fair mention on my site.
The following 6 are games I can wholeheartedly recommend.
They are well described and tagged on steam, you&#x27;ll definitely know if you like them within the 2 hour steam return window.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;49520&#x2F;Borderlands_2&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;borderlands2.jpg&quot;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;200510&#x2F;XCOM_Enemy_Unknown&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;xcom-enemy-unknown.jpg&quot;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;7670&#x2F;BioShock&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;bioshock.jpg&quot;&gt;&lt;&#x2F;a&gt;
&lt;br&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;311690&#x2F;Enter_the_Gungeon&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;enter-the-gungeon.jpg&quot;&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;1868140&#x2F;DAVE_THE_DIVER&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;dave-the-diver.jpg&quot;&gt;&lt;&#x2F;a&gt;
&lt;a href=&quot;https:&#x2F;&#x2F;store.steampowered.com&#x2F;app&#x2F;460950&#x2F;Katana_ZERO&#x2F;&quot;&gt;&lt;img src=&quot;&#x2F;retrocovers&#x2F;pc&#x2F;katana-zero.jpg&quot;&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Irish Coddle</title>
          <pubDate>Wed, 10 Apr 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/irish-coddle/</link>
          <guid>https://port19.xyz/recipes/irish-coddle/</guid>
          <description xml:base="https://port19.xyz/recipes/irish-coddle/">&lt;h1 id=&quot;irish-coddle-recipe&quot;&gt;Irish Coddle Recipe&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 30 min&lt;&#x2F;li&gt;
&lt;li&gt;Cooking time: 10 min&lt;&#x2F;li&gt;
&lt;li&gt;Oven time: 60 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;8 potatoes&lt;&#x2F;li&gt;
&lt;li&gt;3 carrots&lt;&#x2F;li&gt;
&lt;li&gt;100g bacon&lt;&#x2F;li&gt;
&lt;li&gt;200g sausage&lt;&#x2F;li&gt;
&lt;li&gt;50ml rapeseed oil &lt;em&gt;(sub: sunflower oil)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;500ml water&lt;&#x2F;li&gt;
&lt;li&gt;broth powder&lt;&#x2F;li&gt;
&lt;li&gt;black pepper&lt;&#x2F;li&gt;
&lt;li&gt;salt&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;potato peeler&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;cutting knife&lt;&#x2F;li&gt;
&lt;li&gt;deep plate&lt;&#x2F;li&gt;
&lt;li&gt;large pot&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;li&gt;baking pan&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Preheat the oven at 200°C top-bottom&lt;&#x2F;li&gt;
&lt;li&gt;Peel your potatoes and carrots&lt;&#x2F;li&gt;
&lt;li&gt;Chop the carrots into thin-ish slices (~2mm)&lt;&#x2F;li&gt;
&lt;li&gt;Chop the potatoes into medium slices (~5mm)&lt;&#x2F;li&gt;
&lt;li&gt;Store those in a plate for now&lt;&#x2F;li&gt;
&lt;li&gt;Add oil to your pot and crank up the heat&lt;&#x2F;li&gt;
&lt;li&gt;Line the bottom with the bacon and add the sausages&lt;&#x2F;li&gt;
&lt;li&gt;Wait 3-4 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Add your chopped veggies, broth powder, salt and water&lt;&#x2F;li&gt;
&lt;li&gt;Leave on the stove until it starts boiling&lt;&#x2F;li&gt;
&lt;li&gt;Partly cover with a lid&lt;&#x2F;li&gt;
&lt;li&gt;Put the pot in the oven&lt;&#x2F;li&gt;
&lt;li&gt;After 30 minutes, take it out&lt;&#x2F;li&gt;
&lt;li&gt;Done. Serves 2 &lt;em&gt;(add pepper when serving)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 The Other Lisps</title>
          <pubDate>Thu, 21 Mar 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/other-lisps/</link>
          <guid>https://port19.xyz/tech/other-lisps/</guid>
          <description xml:base="https://port19.xyz/tech/other-lisps/">&lt;h2 id=&quot;timeline&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#timeline&quot; aria-label=&quot;Anchor link for: timeline&quot;&gt;🔗&lt;&#x2F;a&gt;

Timeline&lt;&#x2F;h2&gt;
&lt;p&gt;My history with lisp and functional programming starts in august of &#x27;22 where I learned haskell&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;learnyouahaskell.github.io&#x2F;chapters.html&quot;&gt;¹&lt;&#x2F;a&gt;, doing a lot of coding puzzles with it.
When I eventually wanted to make an actual project with it, I ran into a wall regarding the tooling and practical applicability of it. &lt;br &#x2F;&gt;
So, in september, I started learning clojure and then had a very productive few months with the language.
An archive of my clojure projects is available &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;clojure-era&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;What eventually made me depart from clojure was a combination of platform pains with the jvm, as well as poor alignment of it&#x27;s strengths and my needs.
I wrote about it in a post looking back on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;clojure&#x2F;&quot;&gt;6 months with clojure&lt;&#x2F;a&gt;, but it took a few more for me to archive all the clojure projects and look back no more.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;emacs-lisp&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#emacs-lisp&quot; aria-label=&quot;Anchor link for: emacs-lisp&quot;&gt;🔗&lt;&#x2F;a&gt;

Emacs Lisp&lt;&#x2F;h2&gt;
&lt;p&gt;If you were to be pedantic about it, I technically wrote emacs lisp before I ever did clojure, as emacs is configured in emacs lisp and I switched to that in january of &#x27;22.
The first time I really wrote emacs lisp, in a standalone fashion, was last december for advent of code.
I then wrote a major mode for HAProxy config files that I made available via melpa.&lt;&#x2F;p&gt;
&lt;p&gt;I like emacs lisp. Especially with dash.el bringing idioms from clojure and cl-lib bringing stuff from common lisp, I have reason to suspect it is one of the most diverse lisp dialects out there.
I may elaborate on useful libraries and dev tools for elisp some other time.&lt;&#x2F;p&gt;
&lt;p&gt;One problem is that it&#x27;s slow.
I&#x27;m not proclaiming emacs itself is slow, but especially in the context of numerical coding problems, as are common in advent of code, it is.
You have to be careful with how you code your solutions, otherwise both your memory and cpu usage can spike through the roof.
Mitigations include using vectors instead of lists, memoization, good search algorithms and using &lt;code&gt;benchmark&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;scheme&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#scheme&quot; aria-label=&quot;Anchor link for: scheme&quot;&gt;🔗&lt;&#x2F;a&gt;

Scheme&lt;&#x2F;h2&gt;
&lt;p&gt;In february I read the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.wingolog.org&#x2F;archives&#x2F;2013&#x2F;01&#x2F;07&#x2F;an-opinionated-guide-to-scheme-implementations&quot;&gt;opinionated guide to scheme implementations&lt;&#x2F;a&gt; and decided to give &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;guile&#x2F;&quot;&gt;gnu guile&lt;&#x2F;a&gt; a fair shot, as it&#x27;s one of the few scheme dialects with a culture of interactive development. This bears repeating as many scheme dialects, notably racket, don&#x27;t develop code in an interactive fashion that leverages the repl.
Guile uses guix as it&#x27;s package manager, motivating the brief distro hop &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;nonguix&#x2F;&quot;&gt;I wrote about&lt;&#x2F;a&gt; last month.
After a couple days scheme ultimately began looking like a fruitless pursuit, as their implementation communities are tiny, as are their selections of available packages. &lt;br &#x2F;&gt;
The sole silver lining, the only use-case I&#x27;ll concede that scheme is useful for, is reading and working through &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.goodreads.com&#x2F;book&#x2F;show&#x2F;43713.Structure_and_Interpretation_of_Computer_Programs&quot;&gt;SICP&lt;&#x2F;a&gt;, the greatest computer science book ever written.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;common-lisp&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#common-lisp&quot; aria-label=&quot;Anchor link for: common-lisp&quot;&gt;🔗&lt;&#x2F;a&gt;

Common Lisp&lt;&#x2F;h2&gt;
&lt;p&gt;Immediately after playing with guile scheme, I read up on some lisp history and started learning common lisp.
I recommend reading the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stevelosh.com&#x2F;blog&#x2F;2018&#x2F;08&#x2F;a-road-to-common-lisp&#x2F;&quot;&gt;road to common lisp&lt;&#x2F;a&gt; if you happen to be interested in learning the language.
After setting up some basic emacs tooling, mostly just &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git.sr.ht&#x2F;~fosskers&#x2F;sly-overlay&quot;&gt;sly-overlay&lt;&#x2F;a&gt;, I checked out a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=LqBbGFMPcDI&quot;&gt;youtube video&lt;&#x2F;a&gt; by gavin freeborn about cl project management with quicklisp and asdf.&lt;&#x2F;p&gt;
&lt;p&gt;The common lisp community, tooling and package selection are all pretty good. I spent about two weeks on and off working through most of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;lisp-koans&quot;&gt;lisp koans&lt;&#x2F;a&gt; to familiarise myself with language idioms.
I also coded a little graphic with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;vydd&#x2F;sketch&quot;&gt;sketch&lt;&#x2F;a&gt;, which is the cl equivalent to the drawing library I used with clojure: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;quil&#x2F;quil&quot;&gt;quil.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;What made me put common lisp on an indefinite pause was the sheer size of it, but some of the common ways of doing things didn&#x27;t help either.
Notable things I dislike are the four different levels of equality&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;547436&#x2F;whats-the-difference-between-eq-eql-equal-and-equalp-in-common-lisp&quot;&gt;²&lt;&#x2F;a&gt;, an emphasis on iteration in the small and an emphasis on object orientation via CLOS in the large.
I&#x27;ll note the condition system, having a fast native compiler and just cl tooling in general are all pretty nice.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#conclusion&quot; aria-label=&quot;Anchor link for: conclusion&quot;&gt;🔗&lt;&#x2F;a&gt;

Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;All this programming language tourism reinforces my focus on shell and python as my primary languages of choice.
Both are extremely well suited to linux administration&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;go-review&#x2F;&quot;&gt;³&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
Even beyond my area of occupation, python remains a compelling choice for lisp programmers as well, since semantically speaking it has &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;norvig.com&#x2F;python-lisp.html&quot;&gt;few differences&lt;&#x2F;a&gt; with lisp. &lt;br &#x2F;&gt;
The lisp that stays in my toolbox is emacs lisp, as developing and distributing the improvements I want to add to emacs is fun and easy.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻Programs I use💻</title>
          <pubDate>Sat, 16 Mar 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/programs/</link>
          <guid>https://port19.xyz/programs/</guid>
          <description xml:base="https://port19.xyz/programs/">&lt;p&gt;&lt;em&gt;I&#x27;m not gonna keep updating this on every distro&#x2F;hardware change. For up-to-date info, check my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;dotfiles&quot;&gt;dotfiles&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;base&quot;&gt;Base&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;linux-mint&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;linuxmint.com&#x2F;&quot;&gt;Linux Mint&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;While I have mostly used Arch in the past, Mint has always been my second favorite distro.
Now that my computer usage is becoming less technical as I turn away from my career in IT, I thought it would be wise to migrate to a &quot;just works&quot; or &quot;beginner friendly&quot; linux distro.
This strikes a middle ground between the polish of mac os that comes at the price of terrible gaming and scripting, and the very hands on nature of my custom arch setup.
I make minimal adjustments to Linux Mint, only installing a small handful of packages that are documented in the readme of my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;dotfiles&quot;&gt;dotfiles&lt;&#x2F;a&gt; repo.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;librewolf&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;librewolf.net&#x2F;&quot;&gt;Librewolf&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m currently using librewolf as my primary web browser.
I like it due to it&#x27;s unparalleled out-of-the-box security and privacy.
For security reasons I use the flatpak version over the native package.
I&#x27;ve also extensively used both &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;brave.com&#x2F;&quot;&gt;Brave&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;qutebrowser.org&#x2F;&quot;&gt;Qutebrowser&lt;&#x2F;a&gt; in the past and can recommend them for speed and keyboard driven operation respectively.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;multimedia&quot;&gt;Multimedia&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;mpv&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mpv.io&#x2F;&quot;&gt;MPV&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;My media player of choice is mpv, it&#x27;s great for both audio and video and the dominant choice among linux users.
To mac users I can recommend &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;iina.io&#x2F;&quot;&gt;IINA&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ffmpeg&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ffmpeg.org&#x2F;&quot;&gt;FFMPEG&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I use ffmpeg to record audio and video, to do basic audio post-processing and to convert between the various encoders and container formats.
If you&#x27;re on linux it&#x27;s likely already installed as a dependency to something else.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;imagemagick&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;imagemagick.org&#x2F;&quot;&gt;Imagemagick&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I use imagemagick to do all my basic image conversion and editing. &lt;br &#x2F;&gt;
This includes cropping, scaling, captions, appending, rotation. &lt;br &#x2F;&gt;
For anything more advanced, which I only need to do every few months, I use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gimp.org&#x2F;&quot;&gt;gimp&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;poppler&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;poppler.freedesktop.org&#x2F;&quot;&gt;Poppler&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;Poppler is a great little library for basic pdf editing, like splitting and concatenation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yt-dlp&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;yt-dlp&#x2F;yt-dlp&quot;&gt;YT-DLP&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;With yt-dlp I download youtube videos, music, or full channels even. &lt;br &#x2F;&gt;
Enough said.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;writing&quot;&gt;Writing&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;this-website&quot;&gt;This Website&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;ve written at length about all the various components that go into this website. &lt;br &#x2F;&gt;
Check out my blog post on it &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;blog&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;latex&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.latex-project.org&#x2F;&quot;&gt;LaTeX&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I wrote all my academic papers in emacs org-mode using the latex export. &lt;br &#x2F;&gt;
This is a pretty common setup among emacs users.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;latex-beamer&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;latex-beamer.com&#x2F;quick-start&#x2F;&quot;&gt;LaTeX Beamer&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I also did my college presentations in emacs org-mode, leveraging latex beamer. &lt;br &#x2F;&gt;
One nice feature of latex beamer I&#x27;ve seen nowhere else is the progress indicator at the top.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;latex-moderncv&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;moderncv&#x2F;moderncv&quot;&gt;LaTeX Moderncv&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;I format job applications via LaTeX ModernCV and can highly recommend it to stand out amongst the mountain of poorly typeset CVs made in Microsoft word. &lt;br &#x2F;&gt;
I use the banking style and prefer a red accent color.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;aspell&quot;&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;aspell.net&#x2F;&quot;&gt;Aspell&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;My spell checker of choice is aspell, which I frequently invoke through &lt;code&gt;ispell&lt;&#x2F;code&gt; in emacs. &lt;br &#x2F;&gt;
It has it&#x27;s flaws, if you know of something better on linux please let me know.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 My Blogging System</title>
          <pubDate>Sun, 10 Mar 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/blog/</link>
          <guid>https://port19.xyz/tech/blog/</guid>
          <description xml:base="https://port19.xyz/tech/blog/">&lt;p&gt;&lt;em&gt;A tour of what makes my blog totally awesome&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been actively blogging for almost 2 years now, releasing over 50 posts in the process.
Along the way I optimised a bunch of parts of my publishing process and website. &lt;br &#x2F;&gt;
This post will cover all of the technical aspects of what powers this blog.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;static-site-generator&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#static-site-generator&quot; aria-label=&quot;Anchor link for: static-site-generator&quot;&gt;🔗&lt;&#x2F;a&gt;

Static Site Generator&lt;&#x2F;h2&gt;
&lt;p&gt;My static site generator of choice is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getzola&#x2F;zola&quot;&gt;Zola&lt;&#x2F;a&gt;.
What makes Zola special is that I retain full control over all the HTML&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;port19.xyz&#x2F;tree&#x2F;master&#x2F;templates&quot;&gt;¹&lt;&#x2F;a&gt; and CSS&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;port19.xyz&#x2F;blob&#x2F;master&#x2F;static&#x2F;style.css&quot;&gt;²&lt;&#x2F;a&gt; that ends up on my page, no theme bullshit like with Hugo.
It&#x27;s written in rust and thus reasonably fast, building my whole website in &amp;lt;100ms.&lt;&#x2F;p&gt;
&lt;p&gt;The documentation is okay-ish.
My gripe with it is that the hard part, how to effectively leverage the templating engine, is almost entirely undocumented.
Also it&#x27;s difficult to find large sites written in Zola to copy-paste things from.
I&#x27;ll claim mine is the biggest until proven otherwise.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve previously written on Zola and my dislike for Hugo &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;zola&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
Note that even Hugo is still leagues better than any of those javascript SSGs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hosting&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#hosting&quot; aria-label=&quot;Anchor link for: hosting&quot;&gt;🔗&lt;&#x2F;a&gt;

Hosting&lt;&#x2F;h2&gt;
&lt;p&gt;Site hosting is done via github pages.
That way I don&#x27;t have to administrate linux servers in my free time as well.
Also no expiring certificates like on every other old blog I see nowadays.&lt;&#x2F;p&gt;
&lt;p&gt;If you end up self-hosting with a proper VPS, please take the necessary precautions and at least automate cert-rotation as well as downtime alerting.&lt;&#x2F;p&gt;
&lt;p&gt;I bought my domain from Njalla.
They&#x27;re okay, a little expensive maybe.
It doesn&#x27;t really matter where you buy your domain.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;post-categories&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#post-categories&quot; aria-label=&quot;Anchor link for: post-categories&quot;&gt;🔗&lt;&#x2F;a&gt;

Post Categories&lt;&#x2F;h2&gt;
&lt;p&gt;I sort my posts by categories. Tags don&#x27;t really make sense until you reach triple digits of posts.
On my landing page, you can filter the post categories with some convenient buttons at the top.
This client-side interactivity is implemented using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;alpinejs.dev&#x2F;&quot;&gt;alpinejs&lt;&#x2F;a&gt;.
I hacked that filtering together in an afternoon sometime last year, not having touched javascript before or since.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;asset-management&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#asset-management&quot; aria-label=&quot;Anchor link for: asset-management&quot;&gt;🔗&lt;&#x2F;a&gt;

Asset Management&lt;&#x2F;h2&gt;
&lt;p&gt;I tend to convert any images I use in posts to jpegs. &lt;br &#x2F;&gt;
You can do this via imagemagick on most linux systems: &lt;code&gt;convert &amp;lt;input&amp;gt; asset.jpg&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Since my website uses unicode emojis for categories, and I don&#x27;t want to ship 10 megs of junk on every request, I used subfont to create a minimal subset of the unicode font I use.
I&#x27;ve written on my usage of subfont &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;subfont&#x2F;&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quality-assurance&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#quality-assurance&quot; aria-label=&quot;Anchor link for: quality-assurance&quot;&gt;🔗&lt;&#x2F;a&gt;

Quality Assurance&lt;&#x2F;h2&gt;
&lt;p&gt;To combat bit rot of my posts, I use a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hahwul&#x2F;deadfinder&quot;&gt;dead link checker&lt;&#x2F;a&gt; via github actions.
It&#x27;s pretty slow, taking like 2 minutes to check my site.
It also doesn&#x27;t give me the red X in CI that I want upon finding a dead link, but that&#x27;s probably just a bug that I should report. \&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re looking for an easy coding project, please write an asynchronous dead link checker with a github action to go along with it.&lt;&#x2F;p&gt;
&lt;p&gt;Sometime last year I checked my site with the various SEO checkers I could find, just to make sure my HTML head and other things are as compliant as they can be.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.chrome.com&#x2F;docs&#x2F;lighthouse&#x2F;&quot;&gt;Lighthouse&lt;&#x2F;a&gt; gets you 90% of the way there and is the official tool bundled with chromium based browsers.
Just make sure you get the full score with lighthouse and you&#x27;ll be fine.&lt;&#x2F;p&gt;
&lt;p&gt;I also check for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ocular-d&#x2F;trailing-spaces&quot;&gt;trailing whitespace&lt;&#x2F;a&gt;, but that&#x27;s probably excessive and doesn&#x27;t matter.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;misc&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#misc&quot; aria-label=&quot;Anchor link for: misc&quot;&gt;🔗&lt;&#x2F;a&gt;

Misc&lt;&#x2F;h2&gt;
&lt;p&gt;I disallow the GPTBot in my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;port19.xyz&#x2F;blob&#x2F;master&#x2F;templates&#x2F;robots.txt&quot;&gt;robots.txt&lt;&#x2F;a&gt;, and recommend you do the same.&lt;&#x2F;p&gt;
&lt;p&gt;This website doesn&#x27;t have an about page, which is fine since I don&#x27;t currently syndicate my posts on hacker news, lobste.rs or, god forbid, reddit.
I might add one in the future, or I might not.&lt;&#x2F;p&gt;
&lt;p&gt;I hope this post is helpful to some of you. &lt;br &#x2F;&gt;
Being an internet landlord&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;SynQFoNMcQU&quot;&gt;³&lt;&#x2F;a&gt; is fun, you should try it!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 (Non)Guix - The Uninstallable</title>
          <pubDate>Wed, 21 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/nonguix/</link>
          <guid>https://port19.xyz/tech/nonguix/</guid>
          <description xml:base="https://port19.xyz/tech/nonguix/">&lt;p&gt;&lt;em&gt;channelling my lambda grindset&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;motivation&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#motivation&quot; aria-label=&quot;Anchor link for: motivation&quot;&gt;🔗&lt;&#x2F;a&gt;

Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;So I&#x27;ve been writing lisp or 1-2 years now depending on how we count, mostly Clojure&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;clojure-era&quot;&gt;¹&lt;&#x2F;a&gt; and Emacs Lisp.&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;haproxy-mode&quot;&gt;²&lt;&#x2F;a&gt;
Recently I started looking into guile scheme as the next fun lisp to sink time into.
At the same time, friends in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pystardust&#x2F;ani-cli&quot;&gt;ani-cli&lt;&#x2F;a&gt; discord are moving to nixos in droves.
Wanting some of that functional package management goodness for myself, but with a lispy touch, I tried installing Guix on arch.
That actually somewhat works if you use the manual installation method, but integration is meh.
So, having another arch install on my laptop as a fallback, I set out on a little adventure.&lt;&#x2F;p&gt;
&lt;p&gt;Despite my experience this took me 4 hours to install, so I hope this post and the sources I link to can help someone.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;retrieving-the-iso&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#retrieving-the-iso&quot; aria-label=&quot;Anchor link for: retrieving-the-iso&quot;&gt;🔗&lt;&#x2F;a&gt;

Retrieving the ISO&lt;&#x2F;h2&gt;
&lt;p&gt;Guix is a FSF approved linux-libre distro, so it won&#x27;t work if you have a modern wifi card.
However don&#x27;t get a false sense of security from a wired connection. &lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;wingolog.org&#x2F;archives&#x2F;2024&#x2F;02&#x2F;16&#x2F;guix-on-the-framework-13-amd&quot;&gt;AMD GPUs need proprietary firmware.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;There is a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SystemCrafters&#x2F;guix-installer&quot;&gt;installer image&lt;&#x2F;a&gt; for current nonguix by systemcrafters, but &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SystemCrafters&#x2F;guix-installer&#x2F;issues&#x2F;27&quot;&gt;its CI has stalled&lt;&#x2F;a&gt;, so use the &quot;official&quot; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;nonguix&#x2F;nonguix&#x2F;-&#x2F;releases&quot;&gt;nonguix image&lt;&#x2F;a&gt; for now.&lt;&#x2F;p&gt;
&lt;p&gt;Be a good boy and verify the cryptographic signature.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;amending-the-config&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#amending-the-config&quot; aria-label=&quot;Anchor link for: amending-the-config&quot;&gt;🔗&lt;&#x2F;a&gt;

Amending the config&lt;&#x2F;h2&gt;
&lt;p&gt;After running through the guided installer, edit the &lt;code&gt;&#x2F;mnt&#x2F;etc&#x2F;config.scm&lt;&#x2F;code&gt; to include the snippets by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;nonguix&#x2F;nonguix&quot;&gt;nonguix&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Check back in the linked nonguix readme if something happens to change.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;use-module&quot;&gt;
&lt;code&gt;use-module&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;replace&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(use-module (gnu))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;with&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;common-lisp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(use-module (gnu)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            (nongnu packages linux)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            (nongnu system linux-initrd))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;operating-system&quot;&gt;
&lt;code&gt;operating-system&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;and add the following 3 lines in the &lt;code&gt;operating-system&lt;&#x2F;code&gt; block&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(operating-system&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (kernel linux)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (initrd microcode-initrd)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  (firmware (list linux-firmware))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then, change to tty3 or tty4 to make some more changes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;add-the-nonguix-channel&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#add-the-nonguix-channel&quot; aria-label=&quot;Anchor link for: add-the-nonguix-channel&quot;&gt;🔗&lt;&#x2F;a&gt;

Add the nonguix channel&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cp &#x2F;mnt&#x2F;etc&#x2F;config.scm .&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;mkdir -p ~&#x2F;.config&#x2F;guix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Put the following block into the &lt;code&gt;~&#x2F;.config&#x2F;guix&#x2F;channels.scm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(cons* (channel&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (name &amp;#39;nonguix)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (url &amp;quot;https:&#x2F;&#x2F;gitlab.com&#x2F;nonguix&#x2F;nonguix&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ;; Enable signature verification:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        (introduction&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         (make-channel-introduction&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          &amp;quot;897c1a470da759236cc11798f4e0a5f7d4d59fbc&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          (openpgp-fingerprint&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           &amp;quot;2A39 3FFF 68F4 EF7A 3D29  12AF 6F51 20A0 22FB B2D5&amp;quot;))))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       %default-channels)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;syncing-all-the-stuff&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#syncing-all-the-stuff&quot; aria-label=&quot;Anchor link for: syncing-all-the-stuff&quot;&gt;🔗&lt;&#x2F;a&gt;

Syncing all the stuff&lt;&#x2F;h2&gt;
&lt;p&gt;Then we gotta jump through some hoops to sync things.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;guix pull&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hash guix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Especially that &lt;code&gt;hash guix&lt;&#x2F;code&gt; can trip you up, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.systemcrafters.net&#x2F;guix&#x2F;nonguix-installation-guide&#x2F;#channels&quot;&gt;it is necessary&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installation&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#installation&quot; aria-label=&quot;Anchor link for: installation&quot;&gt;🔗&lt;&#x2F;a&gt;

Installation&lt;&#x2F;h2&gt;
&lt;p&gt;You could run the install like this: &lt;code&gt;guix system init &#x2F;mnt&#x2F;etc&#x2F;config.scm &#x2F;mnt&lt;&#x2F;code&gt;,
but I recommend adding the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dthompson.us&#x2F;posts&#x2F;installing-guix-on-a-10th-gen-thinkpad-x1.html&quot;&gt;substitutes&lt;&#x2F;a&gt; while they are non-standard&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;gitlab.com&#x2F;nonguix&#x2F;nonguix&#x2F;-&#x2F;issues&#x2F;315&quot;&gt;³&lt;&#x2F;a&gt;.
So you end up with &lt;code&gt;guix system init &#x2F;mnt&#x2F;etc&#x2F;config.scm --substitute-urls=&#x27;https:&#x2F;&#x2F;ci.guix.gnu.org https:&#x2F;&#x2F;bordeaux.guix.gnu.org https:&#x2F;&#x2F;substitutes.nonguix.org&#x27; &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Don&#x27;t get your hopes up that the nonguix substitutes are actually all available.
For me, linux-firmware was available but the kernel compiled from scratch.&lt;&#x2F;p&gt;
&lt;p&gt;I had an issue that during the install of my selected packages, the root partition of the installer filled up, erroring with something along the lines of &quot;no space left on device&quot;.
Even with an extremely minimal subset I barely got it installed, leaving with 89% (5.2 &#x2F; 5.8GB) usage on the installer root partition.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I suspect this to be a bug and will follow this up with the appropriate parties&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;finished&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#finished&quot; aria-label=&quot;Anchor link for: finished&quot;&gt;🔗&lt;&#x2F;a&gt;

Finished&lt;&#x2F;h2&gt;
&lt;p&gt;Now you can reboot.&lt;&#x2F;p&gt;
&lt;p&gt;Pray that you have good wifi utils.
I&#x27;m still struggling to configure it with &lt;code&gt;ip&lt;&#x2F;code&gt; and &lt;code&gt;iw&lt;&#x2F;code&gt; alone.
I&#x27;m more used to &lt;code&gt;iwctl&lt;&#x2F;code&gt;&#x2F;&lt;code&gt;iwd&lt;&#x2F;code&gt;.
Biggest issue will be WPA2 auth, that&#x27;s not as standard in some of these tools as you may think.&lt;&#x2F;p&gt;
&lt;p&gt;Sorry if this was a little handwavy, I barely got it installed myself.
I plan to write on Guix again once I&#x27;m a little more acclimated and have a config ready.
Once such a config is ready, any future install will be significantly easier anyway.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Commit Signatures via SSH</title>
          <pubDate>Sat, 17 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/git-signing/</link>
          <guid>https://port19.xyz/tech/git-signing/</guid>
          <description xml:base="https://port19.xyz/tech/git-signing/">&lt;p&gt;&lt;em&gt;The easy way to sign your git commits&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.gitbutler.com&#x2F;git-tips-and-tricks&#x2F;&quot;&gt;a talk&lt;&#x2F;a&gt; by GitButler I learned about the quick, gpgless way to sign commits on git 2.34+, supported by github and all major code forges, that I&#x27;ll share with you today.&lt;&#x2F;p&gt;
&lt;p&gt;As a prerequisite I assume you already have your ssh key pair that you use for authenticating with github.
If not, and you somehow still use access tokens to authenticate, check out the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.github.com&#x2F;en&#x2F;authentication&#x2F;connecting-to-github-with-ssh&#x2F;adding-a-new-ssh-key-to-your-github-account&quot;&gt;github docs&lt;&#x2F;a&gt; on the matter.&lt;&#x2F;p&gt;
&lt;p&gt;Locally, run the command &lt;code&gt;git config --global gpg.format ssh&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
Then follow it up with &lt;code&gt;git config --global user.signingkey ~&#x2F;.ssh&#x2F;github.pub&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
You may omit &lt;code&gt;--global&lt;&#x2F;code&gt; if you only want to sign commits of a specific repository.
Also keep in mind to replace &lt;code&gt;~&#x2F;.ssh&#x2F;github.pub&lt;&#x2F;code&gt; with the path to your public key.
Then add your public key to github (again), this time changing the key type to &quot;Signing Key&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;To sign selected commits, run &lt;code&gt;git commit&lt;&#x2F;code&gt; with the &lt;code&gt;-S&lt;&#x2F;code&gt; option. &lt;br &#x2F;&gt;
To sign all future git commits, run &lt;code&gt;git config --global commit.gpgsign true&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
To sign selected tags, use &lt;code&gt;git tag&lt;&#x2F;code&gt; with the lowercase &lt;code&gt;-s&lt;&#x2F;code&gt; option. &lt;br &#x2F;&gt;
To sign all future git tags, run &lt;code&gt;git config --global tag.gpgsign true&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 New PC Build</title>
          <pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/new-pc/</link>
          <guid>https://port19.xyz/tech/new-pc/</guid>
          <description xml:base="https://port19.xyz/tech/new-pc/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;various-scales.jpg&quot; height=&quot;500vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
The freshly built PC - various things for scale
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;So last weekend I built myself a fresh PC at a friends house.
I went with the Asrock DeskMini because I can mount it to the back of my monitor and, since I&#x27;m not that much of a gamer anyway, the inability to add a GPU doesn&#x27;t bother me.
The DeskMini combines a case, motherboard and power supply in one tiny, two liter package. &lt;br &#x2F;&gt;
One thing that was important to me was to have lots of storage, as I&#x27;ve been fighting storage limitations on the 500GB SSD in my laptop over the past few months.
There is an argument to be made that 4TB is overkill, but I&#x27;d rather have too much than too little space for my precious pirate treasures. &lt;br &#x2F;&gt;
One problem is that the CPU cooler makes direct contact with the case mesh, thus transmitting the fan vibrations.
With a custom fan curve the noise is manageable.
At least the CPU gets fresh air, with the CPU usually being ~15°C Δt over ambient at idle and ~20-25°C Δt during my normal usage. &lt;br &#x2F;&gt;
I hope to amortise most of the build cost by selling my laptop after the upcoming last theory semester in college.
All in all, I&#x27;m satisfied with my purchase.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;parts-list&quot;&gt;
Parts List&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Part (with links to geizhals.de)&lt;&#x2F;th&gt;&lt;th&gt;rounded price&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;samsung-ssd-990-pro-4tb-mz-v9p4t0bw-a2798124.html&quot;&gt;Samsung 990 Pro 4TB SSD&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;335€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;amd-ryzen-5-5600g-100-100000252box-a2536507.html&quot;&gt;AMD Ryzen 5 5600G&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;110€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;g-skill-ripjaws-so-dimm-kit-16gb-f4-3200c22d-16grs-a2349370.html&quot;&gt;2x8GB G.Skill SO-DIMM 3200MHz&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;35€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;asrock-deskmini-x300-a2345964.html&quot;&gt;Asrock DeskMini X300&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;155€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;asrock-deskmini-wifi-kit-5rb000010010-a1531843.html&quot;&gt;Asrock DeskMini Wifi Kit&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;15€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;asrock-deskmini-vesa-mount-kit-5rb000010030-a1530360.html&quot;&gt;Asrock DeskMini Vesa Mount Kit&lt;&#x2F;a&gt;&lt;&#x2F;td&gt;&lt;td&gt;5€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;em&gt;Shipping&lt;&#x2F;em&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;em&gt;10€&lt;&#x2F;em&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Total&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;665€&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</description>
      </item>
      <item>
          <title>💻 Recovering Rebased Git Commits</title>
          <pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/git-recovery/</link>
          <guid>https://port19.xyz/tech/git-recovery/</guid>
          <description xml:base="https://port19.xyz/tech/git-recovery/">&lt;p&gt;Yesterday I accidentally committed to my public &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;dotfiles&quot;&gt;dotfiles repository&lt;&#x2F;a&gt; with my work email, temporarily exposing both my full government name as well as my employer.
I rebased those commits away as fast as I could, temporarily loosing the changes of those two commits in the process.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s not implausible that I need to recover git commits again in the future,
so I thought I&#x27;d share how I got my changes back and how you can get yours back do too, no matter how you lost yours.&lt;&#x2F;p&gt;
&lt;p&gt;tl;dr: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-reflog&quot;&gt;&lt;code&gt;git reflog&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
→ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-cherry-pick&quot;&gt;&lt;code&gt;git cherry-pick&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
→ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-commit&quot;&gt;&lt;code&gt;git commit --amend&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
→ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;git-scm.com&#x2F;docs&#x2F;git-gc&quot;&gt;&lt;code&gt;(git gc)&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;step-1-git-reflog&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#step-1-git-reflog&quot; aria-label=&quot;Anchor link for: step-1-git-reflog&quot;&gt;🔗&lt;&#x2F;a&gt;

Step 1 - Git Reflog&lt;&#x2F;h2&gt;
&lt;p&gt;Step one is to run a &lt;code&gt;git reflog&lt;&#x2F;code&gt; to see if you still have the now orphaned commits lying around locally.
If the orphaned commits are not there, you can check a different machine or your file backups.
Without the reflog there is little chance of you recovering your changes.
You&#x27;ll need the commit hashes of the commits you want to recover, so either keep the respective terminal open or write them down somewhere.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;git-reflog.png&quot; height=&quot;300vw&quot; alt=&quot;output of git reflog&quot;&gt;
&lt;h2 id=&quot;step-2-git-cherry-pick&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#step-2-git-cherry-pick&quot; aria-label=&quot;Anchor link for: step-2-git-cherry-pick&quot;&gt;🔗&lt;&#x2F;a&gt;

Step 2 - Git Cherry-pick&lt;&#x2F;h2&gt;
&lt;p&gt;Step two has you cherry picking the sequentially oldest commit you want to recover.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;git-cherrypick.png&quot; height=&quot;100vw&quot; alt=&quot;output of git cherry-pick&quot;&gt;
&lt;h2 id=&quot;step-3-git-commit-amend&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#step-3-git-commit-amend&quot; aria-label=&quot;Anchor link for: step-3-git-commit-amend&quot;&gt;🔗&lt;&#x2F;a&gt;

Step 3 - Git Commit --amend&lt;&#x2F;h2&gt;
&lt;p&gt;Now in step three I amended the cherry-picked commit to update the author field to the appropriate contents.
You can also edit the commit message if necessary, if not &lt;code&gt;--no-edit&lt;&#x2F;code&gt; suppresses the editor.
Now repeat step two and three with the next newer commit to recover until you&#x27;re done.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;git-amend.png&quot; height=&quot;80vw&quot; alt=&quot;output with --no-edit&quot;&gt;
&lt;h2 id=&quot;step-4-git-gc-optional&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#step-4-git-gc-optional&quot; aria-label=&quot;Anchor link for: step-4-git-gc-optional&quot;&gt;🔗&lt;&#x2F;a&gt;

Step 4 - Git GC (optional)&lt;&#x2F;h2&gt;
&lt;p&gt;After a while of locally working on a git repository the reflog can become quite large and orphans can accumulate.
After recovery is an appropriate time to do a git gc.
But be careful, those orphans are the key to recovery, so only gc once you&#x27;re confident the recovery was successful.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;git-gc.png&quot; height=&quot;300vw&quot; alt=&quot;output with --no-edit&quot;&gt;
&lt;p&gt;See the following stack overflow exchange on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;55729&#x2F;how-often-should-you-use-git-gc&quot;&gt;if and when to run git gc&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Persisting Grafana</title>
          <pubDate>Mon, 15 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/persisting-grafana/</link>
          <guid>https://port19.xyz/tech/persisting-grafana/</guid>
          <description xml:base="https://port19.xyz/tech/persisting-grafana/">&lt;p&gt;Grafana is a visualization frontend for many metrics based monitoring solutions like prometheus.
Persisting its dashboards is far from trivial, so I thought I&#x27;d share how I&#x27;m doing it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#prerequisites&quot; aria-label=&quot;Anchor link for: prerequisites&quot;&gt;🔗&lt;&#x2F;a&gt;

Prerequisites&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;docs&#x2F;grafana&#x2F;latest&#x2F;setup-grafana&#x2F;installation&#x2F;&quot;&gt;&lt;code&gt;grafana&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prometheus.io&#x2F;docs&#x2F;prometheus&#x2F;latest&#x2F;installation&#x2F;&quot;&gt;&lt;code&gt;prometheus&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prometheus.io&#x2F;docs&#x2F;guides&#x2F;node-exporter&#x2F;&quot;&gt;&lt;code&gt;prometheus-node-exporter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;install &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;compose&#x2F;install&#x2F;&quot;&gt;&lt;code&gt;docker-compose&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;docker-compose-yml&quot;&gt;
docker-compose.yml&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m using docker-compose, both on my server as well as for this article. &lt;br &#x2F;&gt;
You should be able to extrapolate to your preferred infrastructure-as-code solution.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;3&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;networks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  default&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    internal&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  proxy&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    internal&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;services&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  grafana&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; grafana&#x2F;grafana:10.2.3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    networks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; proxy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    ports&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;3000:3000&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; .&#x2F;grafana.ini:&#x2F;etc&#x2F;grafana&#x2F;grafana.ini&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; .&#x2F;grafana-datasources.yml:&#x2F;etc&#x2F;grafana&#x2F;provisioning&#x2F;datasources&#x2F;datasources.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; .&#x2F;grafana-dashboard.yml:&#x2F;etc&#x2F;grafana&#x2F;provisioning&#x2F;dashboards&#x2F;dashboard.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; .&#x2F;grafana-dashboard.json:&#x2F;etc&#x2F;grafana&#x2F;provisioning&#x2F;dashboards&#x2F;dashboard.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  prometheus&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; prom&#x2F;prometheus:v2.49.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; .&#x2F;prometheus.yml:&#x2F;etc&#x2F;prometheus&#x2F;prometheus.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  node-exporter&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; prom&#x2F;node-exporter:v1.7.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    command&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;--path.rootfs=&#x2F;host&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;--path.procfs=&#x2F;host&#x2F;proc&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;--path.sysfs=&#x2F;host&#x2F;sys&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; --collector.filesystem.ignored-mount-points&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;^&#x2F;(sys|proc|dev|host|etc|rootfs&#x2F;var&#x2F;lib&#x2F;docker&#x2F;containers|rootfs&#x2F;var&#x2F;lib&#x2F;docker&#x2F;overlay2|rootfs&#x2F;run&#x2F;docker&#x2F;netns|rootfs&#x2F;var&#x2F;lib&#x2F;docker&#x2F;aufs)($$|&#x2F;)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    volumes&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;proc:&#x2F;host&#x2F;proc:ro&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;sys:&#x2F;host&#x2F;sys:ro&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;:&#x2F;rootfs:ro&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;:&#x2F;host:ro,rslave&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;prometheus-yml&quot;&gt;
prometheus.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;scrape_configs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; job_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;node-exporter&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    static_configs&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; targets&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;node-exporter:9100&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;the-global-config&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-global-config&quot; aria-label=&quot;Anchor link for: the-global-config&quot;&gt;🔗&lt;&#x2F;a&gt;

The Global Config&lt;&#x2F;h2&gt;
&lt;p&gt;Make sure to check the docker-compose file for where these files need to go.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;grafana-ini&quot;&gt;
grafana.ini&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;[server]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;serve_from_sub_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;root_url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; http:&#x2F;&#x2F;example.com&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;#[auth]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #5A6673;font-style: italic;&quot;&gt;#disable_login_form = true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;[auth.anonymous]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;org_role&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Viewer&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;[dashboards]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;default_home_dashboard_path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;etc&#x2F;grafana&#x2F;provisioning&#x2F;dashboards&#x2F;dashboard.json&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;[analytics]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;check_for_updates&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The server section is necessary to get Grafana to return, this doesn&#x27;t matter on localhost. &lt;br &#x2F;&gt;
I recommend terminating TLS on a reverse proxy in front of Grafana. &lt;br &#x2F;&gt;
&lt;code&gt;serve_from_sub_path&lt;&#x2F;code&gt; is only necessary if you locate your dashboard on a subpath like &lt;code&gt;example.com&#x2F;grafana&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
&lt;code&gt;default_home_dashboard_path&lt;&#x2F;code&gt; sets the default dashboard to display. &lt;br &#x2F;&gt;
Also, since this is corporate software, you have to opt-out of update checks and analytics. \&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;disable_login_form = true&lt;&#x2F;code&gt; is a useful setting for when your dashboard is exposed to the public. &lt;br &#x2F;&gt;
If it is, also add the &lt;code&gt;[auth.anonymous]&lt;&#x2F;code&gt; block. Otherwise you&#x27;re locking yourself out of Grafana. &lt;br &#x2F;&gt;
&lt;code&gt;disable_login_form&lt;&#x2F;code&gt; is commented out so we can edit the dashboard, but I recommend it for &quot;production&quot;.
The default Grafana login credentials are &lt;code&gt;admin&lt;&#x2F;code&gt; &lt;code&gt;admin&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;grafana-datasources-yml&quot;&gt;
grafana-datasources.yml&lt;&#x2F;h3&gt;
&lt;p&gt;The url will differ if you&#x27;re not using my docker-compose setup.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;apiVersion&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;datasources&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Prometheus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; prometheus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    access&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; proxy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    url&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; http:&#x2F;&#x2F;prometheus:9090&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;grafana-dashboard-yml&quot;&gt;
grafana-dashboard.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;apiVersion&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;providers&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;Node Load&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    options&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      path&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;etc&#x2F;grafana&#x2F;provisioning&#x2F;dashboards&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;persisting-a-dashboard&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#persisting-a-dashboard&quot; aria-label=&quot;Anchor link for: persisting-a-dashboard&quot;&gt;🔗&lt;&#x2F;a&gt;

Persisting a dashboard&lt;&#x2F;h2&gt;
&lt;p&gt;Dashboards can be exported and imported as a large json blob. &lt;br &#x2F;&gt;
In this example it lives in a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;persisting-grafana&#x2F;blob&#x2F;master&#x2F;grafana-dashboard.json&quot;&gt;&lt;code&gt;dashboard.json&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, remember that you can set the default dashboard in the &lt;code&gt;grafana.ini&lt;&#x2F;code&gt;.
You can browse your available dashboards from the Grafana web ui.&lt;&#x2F;p&gt;
&lt;p&gt;When you are done editing your dashboard, persist it back into a version controlled json file as follows:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;click the cog &lt;em&gt;(top right)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;save as &lt;em&gt;(top right)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;name it whatever¹&lt;&#x2F;li&gt;
&lt;li&gt;click the share icon &lt;em&gt;(top left)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;export &lt;em&gt;(top middle)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;toggle on &quot;Export for sharing externally&quot;&lt;&#x2F;li&gt;
&lt;li&gt;save to file &lt;em&gt;(select the previous iteration, overwriting it)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;¹I recommend adding a timestamp, as you can&#x27;t have two dashboards of the same name. &lt;br &#x2F;&gt;
Alternatively, you can find the dashboard name in your git diff and manually revert the name back.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-now&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-now&quot; aria-label=&quot;Anchor link for: what-now&quot;&gt;🔗&lt;&#x2F;a&gt;

What now?&lt;&#x2F;h2&gt;
&lt;p&gt;You can browse public dashboards on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;grafana&#x2F;dashboards&#x2F;&quot;&gt;Grafanas website&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
You can also check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;rapture&quot;&gt;my vps setup&lt;&#x2F;a&gt; &lt;br &#x2F;&gt;
The code for this article is available &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;persisting-grafana&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you run into any problems, feel free to reach out.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Shell Scripting Advice</title>
          <pubDate>Sun, 14 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/shell/</link>
          <guid>https://port19.xyz/tech/shell/</guid>
          <description xml:base="https://port19.xyz/tech/shell/">&lt;p&gt;Shell is an untyped, interpreted &quot;programming language&quot; ubiquitous since the 80s.
It comes with no package manager of its own and is weak in isolation.
It hinges on the operating system to do what the language can&#x27;t: almost everything.
When I&#x27;m talking about shell scripting I&#x27;m assuming a gnu (or busybox) environment to go along with it.&lt;&#x2F;p&gt;
&lt;p&gt;My authority on the matter comes primarily from two years leading ani-cli development.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pystardust&#x2F;ani-cli&quot;&gt;Ani-cli&lt;&#x2F;a&gt; is an incredibly cross-plattform and featureful cli tool to browse and play anime.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;when-not-to-use-shell&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#when-not-to-use-shell&quot; aria-label=&quot;Anchor link for: when-not-to-use-shell&quot;&gt;🔗&lt;&#x2F;a&gt;

When Not To Use Shell&lt;&#x2F;h2&gt;
&lt;p&gt;If your application needs to do math, use python instead.
Sure you can do some basic math in shell scripts, but when you can anticipate in advance that a lot of your program data will consist of numbers, pick sth else.
My heuristic: if it needs to do more than count, do it in python.&lt;&#x2F;p&gt;
&lt;p&gt;Shell Scripts are manageable up to around a thousand LoC.
Shell has significantly more footguns than Python.
Use Python if you need to frequently collaborate with noobs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dev-tools&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#dev-tools&quot; aria-label=&quot;Anchor link for: dev-tools&quot;&gt;🔗&lt;&#x2F;a&gt;

Dev Tools&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;koalaman&#x2F;shellcheck&quot;&gt;Shellcheck&lt;&#x2F;a&gt; is a linter for shell that catches many common pitfalls. &lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;patrickvane&#x2F;shfmt&quot;&gt;Shfmt&lt;&#x2F;a&gt; is a formatter for shell.
I like to use it with the &lt;code&gt;-i 4 -ci&lt;&#x2F;code&gt; options. &lt;br &#x2F;&gt;
I don&#x27;t use LSP, but a shell language server is available via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;bash-lsp&#x2F;bash-language-server&quot;&gt;bash lsp&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
For CI I like to use the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;luizm&#x2F;action-sh-checker&quot;&gt;sh-checker&lt;&#x2F;a&gt; by luizm. It combines shellcheck and shfmt.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;debugging-profiling&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#debugging-profiling&quot; aria-label=&quot;Anchor link for: debugging-profiling&quot;&gt;🔗&lt;&#x2F;a&gt;

Debugging &amp;amp; Profiling&lt;&#x2F;h2&gt;
&lt;p&gt;Just run your script with &lt;code&gt;sh -x&lt;&#x2F;code&gt; to get pretty verbose runtime output. &lt;br &#x2F;&gt;
Ideally, cook up increments of your program in an interactive shell of your choice, this speeds up the feedback loop.
For benchmarking, use &lt;code&gt;time&lt;&#x2F;code&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;sharkdp&#x2F;hyperfine&quot;&gt;hyperfine&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
For pinpointing bottlenecks it can be useful to put &lt;code&gt;date +%S:%N&lt;&#x2F;code&gt; statements near I&#x2F;O areas or borders of code segments, this prints seconds and nanoseconds. &lt;br &#x2F;&gt;
For advanced debugging and profiling, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;strace.io&#x2F;&quot;&gt;strace&lt;&#x2F;a&gt; can be useful.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;useful-external-programs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#useful-external-programs&quot; aria-label=&quot;Anchor link for: useful-external-programs&quot;&gt;🔗&lt;&#x2F;a&gt;

Useful External Programs&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;curl.se&#x2F;&quot;&gt;&lt;code&gt;curl&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; &amp;gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;wget&#x2F;&quot;&gt;&lt;code&gt;wget&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - sending network requests&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ffmpeg.org&#x2F;&quot;&gt;&lt;code&gt;ffmpeg&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - audio &amp;amp; video processing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;junegunn&#x2F;fzf&quot;&gt;&lt;code&gt;fzf&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - fuzzy match inputs (useful for terminal UIs)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.w3.org&#x2F;Tools&#x2F;HTML-XML-utils&#x2F;README&quot;&gt;&lt;code&gt;html-xml-utils&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - html parsing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;imagemagick.org&#x2F;&quot;&gt;&lt;code&gt;imagemagick&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - image processing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jqlang.github.io&#x2F;jq&#x2F;&quot;&gt;&lt;code&gt;jq&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - json parsing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.ikuamike.io&#x2F;posts&#x2F;2021&#x2F;netcat&#x2F;&quot;&gt;&lt;code&gt;netcat&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - receiving network requests&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.openssl.org&#x2F;&quot;&gt;&lt;code&gt;openssl&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - everything cryptography&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;parallel&#x2F;&quot;&gt;&lt;code&gt;parallel&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - ... parallel processing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;poppler.freedesktop.org&#x2F;&quot;&gt;&lt;code&gt;poppler&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; &amp;amp; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ghostscript.com&#x2F;&quot;&gt;&lt;code&gt;ghostscript&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - pdf processing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;copyconstruct.medium.com&#x2F;socat-29453e9fc8a6&quot;&gt;&lt;code&gt;socat&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - socket relay&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;facebook&#x2F;zstd&quot;&gt;&lt;code&gt;zstd&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; - nice compression at &lt;code&gt;-19&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;further-reading&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#further-reading&quot; aria-label=&quot;Anchor link for: further-reading&quot;&gt;🔗&lt;&#x2F;a&gt;

Further Reading&lt;&#x2F;h2&gt;
&lt;p&gt;Read through the lists of all the available programs in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;GNU_Coreutils&quot;&gt;GNU Coreutils&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.gentoo.org&#x2F;wiki&#x2F;Util-linux&quot;&gt;util-linux&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
If you want to deploy via docker, busybox too. &lt;br &#x2F;&gt;
Read the manuals for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;findutils&#x2F;manual&#x2F;html_mono&#x2F;find.html&quot;&gt;find&lt;&#x2F;a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;grep&#x2F;manual&#x2F;grep.html&quot;&gt;grep&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;sed&#x2F;manual&#x2F;sed.html&quot;&gt;sed&lt;&#x2F;a&gt; in depth. &lt;br &#x2F;&gt;
I won&#x27;t stop you from checking out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;software&#x2F;gawk&#x2F;manual&#x2F;gawk.html&quot;&gt;awk&lt;&#x2F;a&gt; for sake of completeness, but haven&#x27;t found it very fruitful myself.&lt;&#x2F;p&gt;
&lt;p&gt;After picking up the tools of this article and reading the recommended manuals, you will soon write better shell scripts than 90% of shell programmers out there, you&#x27;re welcome.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Emacs X Window Manager Review</title>
          <pubDate>Sun, 03 Dec 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/exwm/</link>
          <guid>https://port19.xyz/tech/exwm/</guid>
          <description xml:base="https://port19.xyz/tech/exwm/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;exwm.png&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
EXWM - ef-maris-dark theme
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;So one week ago I decided to scrap my &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;awesomeWM&#x2F;awesome&quot;&gt;awesomewm&lt;&#x2F;a&gt; config in favor of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ch11ng&#x2F;exwm&quot;&gt;EXWM&lt;&#x2F;a&gt;.
This has resulted in an noticeably more unified and fluent computing environment.
Now I can use my emacs bindings to launch and manipulate X windows!
One necessary workaround to make all my keybindings work in X windows was to add the &lt;code&gt;global-prefix&lt;&#x2F;code&gt; of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;noctuid&#x2F;general.el&quot;&gt;general.el&lt;&#x2F;a&gt; to the &lt;code&gt;exwm-input-prefix-keys&lt;&#x2F;code&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;dotfiles&#x2F;blob&#x2F;0484857d344c00c9a15bbc9ee55664e55bdda278&#x2F;init.el#L90&quot;&gt;¹&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;One thing I don&#x27;t like is how EXWM handles workspaces, as buffers are not shared between them. &lt;br &#x2F;&gt;
Because of this I currently only use one workspace, but I may look into &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;nex3&#x2F;perspective-el&quot;&gt;perspective.el&lt;&#x2F;a&gt; to replicate workspace functionality with shared buffers&lt;&#x2F;p&gt;
&lt;p&gt;One problem I didn&#x27;t encounter nearly as much as expected was emacs locking up. &lt;br &#x2F;&gt;
With emacs being single threaded, some EXWM reviews mention that you frequently have to spam escape or C-g to kill some blocking task.
This has only happened to me once when viewing a ~20000x10000 pixel jpeg and once when I spawned mpv from dired synchronously via &lt;code&gt;!&lt;&#x2F;code&gt; instead of asynchronously via &lt;code&gt;&amp;amp;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;EXWM, once set up, comes with zero learning curve for anyone already accustomed to emacs. &lt;br &#x2F;&gt;
Since I do most of my computing in emacs anyway, the move to EXWM was a natural next step. &lt;br &#x2F;&gt;
The only scenario in which I could see myself switching back to a separate window manager would be if multi-monitor support&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ch11ng&#x2F;exwm&#x2F;wiki#randr-multi-screen&quot;&gt;²&lt;&#x2F;a&gt; turns out to be poor when I&#x27;ll need it again in January&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 On Mortality</title>
          <pubDate>Wed, 29 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/mortality/</link>
          <guid>https://port19.xyz/lifestyle/mortality/</guid>
          <description xml:base="https://port19.xyz/lifestyle/mortality/">&lt;p&gt;💀&lt;&#x2F;p&gt;
&lt;p&gt;80 years. That&#x27;s roughly the life expectancy in germany and other developed countries.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;data.who.int&#x2F;countries&#x2F;276&quot;&gt;¹&lt;&#x2F;a&gt;
If you manage to survive childhood, that&#x27;s the average age you&#x27;re supposed to hit.
To get old presupposes that you don&#x27;t die early, but what are the chances of that?¹
Turns out, in germany, the probability of this would be ~10 percent, ~13.5 for men and ~6.5 for women.
Those are the numbers for the adult mortality rate, the probability of death between ages 15 and 60, given a survived childhood.
Of course you do have some influence on our life expectancy and risk of early death.
Diet and exercise can add a few years, while heavy drug use can subtract a few.
But we are not in control.&lt;&#x2F;p&gt;
&lt;p&gt;Memento mori is an old stoic tradition to regularly remind yourself of your mortality.
&quot;Memento mori&quot; is latin and can be translated to mean &quot;remember your death&quot;.
I initially planned to write about memento mori&#x27;s role as a sustainable motivator.
But the more I ponder the concept the more I&#x27;m coming to the conclusion that it&#x27;s a balancing force instead.
To be lazy is to waste life by virtue of doing nothing of meaning.
But when we prioritize productivity above all else we loose sight of the present moment. &lt;br &#x2F;&gt;
In pondering our mortality we can more clearly align ourselves with our purpose.&lt;&#x2F;p&gt;
&lt;p&gt;You are not the only one to be subject to death, the lives of the people you love are just as impermanent.
Thus we should cherish their presence while it lasts, which I find to be especially true for friends. &lt;br &#x2F;&gt;
When we finish a chapter in our life, say by graduating or moving cities, it can be difficult to stay in touch.
And even if we manage to stay in touch with a good friend, we won&#x27;t be able to spend nearly as much time together as we could back when our shared environment was more conducive.&lt;&#x2F;p&gt;
&lt;p&gt;This post was incredibly hard to write, yet very satisfying to finish. &lt;br &#x2F;&gt;
I hope you can take something away from my perspective.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Optimizing Unicode Fonts with Subfont</title>
          <pubDate>Wed, 29 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/subfont/</link>
          <guid>https://port19.xyz/tech/subfont/</guid>
          <description xml:base="https://port19.xyz/tech/subfont/">&lt;h1 id=&quot;from-23-megabytes-to-12-kilobytes&quot;&gt;
From 23 Megabytes to 12 Kilobytes&lt;&#x2F;h1&gt;
&lt;p&gt;So this website uses a small handful of unicode emojis to visually indicate different elements, most notably post category.
Since not every browser handles these well, I supply googles &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fonts.google.com&#x2F;noto&#x2F;specimen&#x2F;Noto+Color+Emoji&quot;&gt;noto color emoji&lt;&#x2F;a&gt; font as a fallback.
This font is about as large as my whole website, so sending it on every request is a non-starter.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Munter&#x2F;subfont&quot;&gt;Subfont&lt;&#x2F;a&gt; to the rescue!
A command line tool and generally available via npm.&lt;&#x2F;p&gt;
&lt;p&gt;Since this is a javascript project by someone I assume to be a frontend dev, it makes some weird assumptions.
By default it will spit out the optimized font as a massive base64 glob inside your css file. &lt;br &#x2F;&gt;
I don&#x27;t want that.
The workaround &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Munter&#x2F;subfont&#x2F;issues&#x2F;155&quot;&gt;¹&lt;&#x2F;a&gt; is to specify more than one format.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;If you&#x27;ve optimized the font previously and need to cover new glyphs, temporarily replace it with the larger parent font&lt;&#x2F;li&gt;
&lt;li&gt;Make sure you&#x27;re in a temporary directory as this will spit out a whole lot of garbage&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;subfont --formats=&#x27;woff2,woff&#x27; -r -d -o . https:&#x2F;&#x2F;port19.xyz&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Locate the optimized font in the &lt;code&gt;subfont&lt;&#x2F;code&gt; directory&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;That&#x27;s all. Just a quick reference for my future self, but maybe someone else finds it useful as well.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 On Gratitude</title>
          <pubDate>Sat, 25 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/gratitude/</link>
          <guid>https://port19.xyz/lifestyle/gratitude/</guid>
          <description xml:base="https://port19.xyz/lifestyle/gratitude/">&lt;h1 id=&quot;how-to-be-happy-now-tutorial&quot;&gt;How to be happy now (Tutorial)&lt;&#x2F;h1&gt;
&lt;p&gt;Imagine you bought everything on your shopping list and solved all the acute problems in your life.
Would that make you happy?
Of course it would, but for how long would that happiness last?&lt;&#x2F;p&gt;
&lt;p&gt;With most purchases, my mood is slightly elevated for a day or two.
For some it&#x27;s a week or two.
A few purchases are so appreciable that I am delighted by them even months or years later.
I&#x27;m unable to predict for how long a purchase will boost my happiness in advance.
The point I&#x27;m trying to make is that to consume is not a sustainable way to attain happiness, as the number of impactful purchases I can make is finite and their effect temporary.&lt;&#x2F;p&gt;
&lt;p&gt;On the other hand I&#x27;m not refuting that money buys happiness, from my experience it always has, but I want to warn that money won&#x27;t guarantee it.
To be happy in a life of excess one has to first recognise the abundance.
And once it is abundantly clear, practicing gratitude helps.&lt;&#x2F;p&gt;
&lt;p&gt;Gratitude can be practiced in many ways.
We can adopt it as a passive mindset to keep us company as we go through our days.
Or we can practice it actively through journaling on the things we are grateful for.
If you&#x27;re religious, gratitude makes for great content of a prayer.
No matter the method, setting aside a minute a day, or even every couple of days, will have a noticeable and sustainable impact on your happiness.&lt;&#x2F;p&gt;
&lt;p&gt;Happiness is overrated anyway.
Overrated in the sense that I don&#x27;t believe it should be your highest goal.
If we chase happiness, if we put it behind milestones or on conditions, it will continue to elude us.
Gratitude is one way to be happy now, so that you can spend your energy chasing something more meaningful.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 The Essence of Functional Programming</title>
          <pubDate>Sat, 18 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/functional-essence/</link>
          <guid>https://port19.xyz/tech/functional-essence/</guid>
          <description xml:base="https://port19.xyz/tech/functional-essence/">&lt;figure&gt;
&lt;img src=&quot;.&#x2F;consing.png&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
My attempt at a better explanation
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h2 id=&quot;state&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#state&quot; aria-label=&quot;Anchor link for: state&quot;&gt;🔗&lt;&#x2F;a&gt;

State&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;The key premise of functional programming is that there shall be no mutable global state.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Every other property of functional programming can be derived from this key premise.
Every semantic tool that is foreign to the imperative programmer exists to make handling immutable global state possible and ergonomic.
I do not consider the absence of (side-) effects or functional purity to be a defining factor, your programm needs to interact with the world after all.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;lists&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#lists&quot; aria-label=&quot;Anchor link for: lists&quot;&gt;🔗&lt;&#x2F;a&gt;

Lists&lt;&#x2F;h2&gt;
&lt;p&gt;In object oriented programming the most prominent composite data structure is the object, derived from classes.
In functional programming it is the variable sized, sometimes nested, list.&lt;&#x2F;p&gt;
&lt;p&gt;Some people make the case that recursion taking the place of loops is something that sets functional programming apart from imperative programming.
I disagree.
It is the treatment of the list as a holistic unit that semantically enriches functional programming over it&#x27;s imperative counterpart.
Whether you recurse through a list or loop it, explicitly taking time to look at each element individually, while sometimes necessary, isn&#x27;t elegant either way.&lt;&#x2F;p&gt;
&lt;p&gt;Functional programming languages provide a rich collection of list functions, often making it possible to forego recursion entirely.
Some of these are called higher order functions, which means they take one or more functions as their input.
Some of my favorites that are often absent in the imperative languages I know:
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;map&quot;&gt;&lt;code&gt;map&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;filter&quot;&gt;&lt;code&gt;filter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;reduce&quot;&gt;&lt;code&gt;reduce&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;apply&quot;&gt;&lt;code&gt;apply&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;partition&quot;&gt;&lt;code&gt;partition&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;take-while&quot;&gt;&lt;code&gt;take-while&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;identity&quot;&gt;&lt;code&gt;identity&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;,
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;clojuredocs.org&#x2F;clojure.core&#x2F;drop&quot;&gt;&lt;code&gt;drop&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;composition&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#composition&quot; aria-label=&quot;Anchor link for: composition&quot;&gt;🔗&lt;&#x2F;a&gt;

Composition&lt;&#x2F;h2&gt;
&lt;p&gt;Since functions in functional programming are pure, at least with regards to global state, they can be readily broken up and composed as necessary.
In my time practicing functional programming, the functions I defined were often just compositions of 5-10 readily available functions with one or two lamdas thrown in.
The prevelance of composition is about as high as in shell scripting, where the pipe enables expressive solutions by composing the utilities of the surrounding environment.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Baked Potatoes</title>
          <pubDate>Sun, 05 Nov 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/oven-potatoes/</link>
          <guid>https://port19.xyz/recipes/oven-potatoes/</guid>
          <description xml:base="https://port19.xyz/recipes/oven-potatoes/">&lt;h1 id=&quot;baked-potatoes-with-ham-cubes-cheese&quot;&gt;Baked Potatoes with Ham Cubes &amp;amp; Cheese&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 20 min&lt;&#x2F;li&gt;
&lt;li&gt;Baking time: 30 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;1 kg of potatoes&lt;&#x2F;li&gt;
&lt;li&gt;300g ham cubes&lt;&#x2F;li&gt;
&lt;li&gt;250g (gratin) cheese&lt;&#x2F;li&gt;
&lt;li&gt;50g butter&lt;&#x2F;li&gt;
&lt;li&gt;1sp salt&lt;&#x2F;li&gt;
&lt;li&gt;2sp black pepper&lt;&#x2F;li&gt;
&lt;li&gt;(opt) some rosemary&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;potato peeler&lt;&#x2F;li&gt;
&lt;li&gt;kitchen knife&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;oven dish&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Preheat the oven at 200°C top-bottom&lt;&#x2F;li&gt;
&lt;li&gt;Peel the potatoes&lt;&#x2F;li&gt;
&lt;li&gt;Butter the baking pan&lt;&#x2F;li&gt;
&lt;li&gt;Slice the potatoes&lt;&#x2F;li&gt;
&lt;li&gt;Add half the potatoes to baking pan&lt;&#x2F;li&gt;
&lt;li&gt;Add half the ham cubes, cheese, salt, pepper and rosemary&lt;&#x2F;li&gt;
&lt;li&gt;Add other half the potatoes to baking pan&lt;&#x2F;li&gt;
&lt;li&gt;Add other half the ham cubes, cheese, salt, pepper and rosemary&lt;&#x2F;li&gt;
&lt;li&gt;Put in the oven&lt;&#x2F;li&gt;
&lt;li&gt;Wait 30-35 minutes until cheese is slightly brown&lt;&#x2F;li&gt;
&lt;li&gt;Done&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 M1 Mac Review</title>
          <pubDate>Mon, 30 Oct 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/macos/</link>
          <guid>https://port19.xyz/tech/macos/</guid>
          <description xml:base="https://port19.xyz/tech/macos/">&lt;h1 id=&quot;m1-mac-review&quot;&gt;
M1 Mac Review&lt;&#x2F;h1&gt;
&lt;p&gt;Last Friday I rented an m1 Mac for a month to give it a thorough test drive.
Here are my thoughts.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dejavu&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#dejavu&quot; aria-label=&quot;Anchor link for: dejavu&quot;&gt;🔗&lt;&#x2F;a&gt;

DejaVu&lt;&#x2F;h2&gt;
&lt;p&gt;This is not the first time that I try out Mac OS.
Last time I tried it in july of 2022, ending with me returning the unit within 24 hours of purchase.
Back then I was still very adamant about customisation and when my misguided attempt to shoehorn my arch ricer setup into Mac OS failed, I gave up.
This time I’m a lot more accommodating.
I’m trying out Mac OS as intended this time, no shoe-horning!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;motivation&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#motivation&quot; aria-label=&quot;Anchor link for: motivation&quot;&gt;🔗&lt;&#x2F;a&gt;

Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;The Motivation is also that several of the more heavy apps caused trouble on my Linux setup in recent times.
Those included mainly jetbrains IDEs necessary for college classes.
I have also kind of developed my dotfiles into a corner, with not much moving these days.
Furthermore AwesomeWM is failing at its most basic job, window management, with some windows getting stuck in full-screen seemingly at random, to a point where even closing and reopening does not fix it.&lt;&#x2F;p&gt;
&lt;p&gt;Combined with the fortunate financial circumstances of being able to afford an entry level M1 MacBook Air, I wanted to give Mac OS  another try.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-hardware&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-hardware&quot; aria-label=&quot;Anchor link for: the-hardware&quot;&gt;🔗&lt;&#x2F;a&gt;

The Hardware&lt;&#x2F;h2&gt;
&lt;p&gt;Let’s get the obvious out of the way, the M1 MacBook Air is an incredible piece of tech.
The Speakers and Trackpad are the best I’ll ever see in a laptop.
The build quality is perfect.
The screen and keyboard are a joy to interact with.
Only downside: lacking ports, not even a single USB-A.&lt;&#x2F;p&gt;
&lt;p&gt;Performance wise, it’s also pretty impressive, being able to run my most demanding compatible game: XCOM 2 at 1440p Medium, which is nowhere near playable on the Tuxedo Aura 15.&lt;&#x2F;p&gt;
&lt;p&gt;Let’s talk battery life. On the extreme end, 1.5 hours of XCOM 2 depleted the battery from 97 to 37%.
In more modest applications it&#x27;s battery life is rather impressive, lasting for a full day of college.
The included usb-c charger appears to be of high quality with a long enough cable for my needs.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps most important to me, it&#x27;s fanless!&lt;&#x2F;p&gt;
&lt;p&gt;I really like the hardware!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;initial-setup&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#initial-setup&quot; aria-label=&quot;Anchor link for: initial-setup&quot;&gt;🔗&lt;&#x2F;a&gt;

Initial Setup&lt;&#x2F;h2&gt;
&lt;p&gt;My first steps consisted of installing homebrew and enabling both FileVault and the builtin firewall.
Then I used home-brew to install Brave to replace Safari as the default browser, rectangle to enable quarter tiling and also tiling of windows via dragging&#x2F;snapping.
Then I installed the other applications and utilities I use: zstd, gnupg, git, keepassxc, emacs and steam.&lt;&#x2F;p&gt;
&lt;p&gt;I recommend enabling tap to click as well as the option to drag windows (or other selections) via a three finger gesture.
Pro tip: a two finger click is equivalent to a traditional right click.&lt;&#x2F;p&gt;
&lt;p&gt;Note that I have not set up an Apple ID&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mac-os-features-i-like&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#mac-os-features-i-like&quot; aria-label=&quot;Anchor link for: mac-os-features-i-like&quot;&gt;🔗&lt;&#x2F;a&gt;

Mac OS Features I like&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Spotlight&lt;&#x2F;em&gt; (omg so useful)&lt;&#x2F;li&gt;
&lt;li&gt;Permissions&lt;&#x2F;li&gt;
&lt;li&gt;Usage Insights&lt;&#x2F;li&gt;
&lt;li&gt;Dictionary&lt;&#x2F;li&gt;
&lt;li&gt;Weather app&lt;&#x2F;li&gt;
&lt;li&gt;Productivity Trio: Calendar, Notes, Reminders&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;annoyances&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#annoyances&quot; aria-label=&quot;Anchor link for: annoyances&quot;&gt;🔗&lt;&#x2F;a&gt;

Annoyances&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Special characters are not where I expect them to on DE-ISO&lt;&#x2F;li&gt;
&lt;li&gt;No Middle-click paste&lt;&#x2F;li&gt;
&lt;li&gt;No Proton to make most Steam games compatible&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;will-i-continue-to-use-it&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#will-i-continue-to-use-it&quot; aria-label=&quot;Anchor link for: will-i-continue-to-use-it&quot;&gt;🔗&lt;&#x2F;a&gt;

Will I continue to use it?&lt;&#x2F;h2&gt;
&lt;p&gt;Yes, I probably will.
Unless there are any surprises, I’ll be buying a base model M1 MacBook Air in December.
If I have any doubts about that purchase I may extend my current lease by another 3-6 months.
The trackpad heavy workflow of Mac OS has grown on me incredibly quickly and spotlight has shown me some great features that I’ll replicate on linux should things go south.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Goal Setting</title>
          <pubDate>Fri, 20 Oct 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/goal-setting/</link>
          <guid>https://port19.xyz/lifestyle/goal-setting/</guid>
          <description xml:base="https://port19.xyz/lifestyle/goal-setting/">&lt;p&gt;Setting goals is one of the best ways to ensure you stay on track and keep improving yourself. &lt;br &#x2F;&gt;
In this post I want to reveal my method of goal setting and it&#x27;s supporting heuristics.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;smart-er&quot;&gt;SMART (-er)&lt;&#x2F;h2&gt;
&lt;p&gt;Just to get this out of the way: yes, I am familiar with the SMART acronym and employ it&#x27;s heuristics:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Specific, Measurable, Actionable, Relevant, Timed, &lt;em&gt;Evaluate, Reward&lt;&#x2F;em&gt;\&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;heuristics.png&quot; height=&quot;200vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
My ranking of the basic heuristics based on importance
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Of these heuristics I find Measurability, Actionability, Timing and Evaluation significantly more important than Specificity, Relevancy or Reward.
I won&#x27;t waste time assessing relevancy in depth, and also don&#x27;t need my goals to be more specific than what is necessary to fulfill the other heuristics of measurability and actionability.
As a reward, since I fortunately already have everything I want, I usually go for a nice meal downtown.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;frequency-and-dismissal&quot;&gt;Frequency and Dismissal&lt;&#x2F;h2&gt;
&lt;p&gt;Goals come in various shapes and sizes and deserve different treatment because of it. &lt;br &#x2F;&gt;
I don&#x27;t set new long-term&#x2F;yearly goals more than once a quarter at most, and when I do, I set one at a time.&lt;&#x2F;p&gt;
&lt;p&gt;More short term goals, quarterly or monthly goals, usually come in groups of up to ten. &lt;br &#x2F;&gt;
A couple of weeks into a quarter, or days into the month I reevaluate, discarding around half of them. &lt;br &#x2F;&gt;
This can be seen with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;status-update-2309&#x2F;&quot;&gt;Q4 goals&lt;&#x2F;a&gt; I shared recently.
I started setting up syncplay and jitsi, but then discarded those goals due to a change in perspective regarding their value proposition and operational difficulty.
Sometimes it&#x27;s new information that makes a goal obsolete, such as with my arch-mirror and netcup migration goals.&lt;&#x2F;p&gt;
&lt;p&gt;As a rule of thumb I set many short-term goals, but dismiss most of them quickly. &lt;br &#x2F;&gt;
I prefer trying out several short-term goals to over-analyzing them in advance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;don-t-talk-about-it&quot;&gt;Don&#x27;t talk about it&lt;&#x2F;h2&gt;
&lt;p&gt;For long-term goals: don&#x27;t tell anyone. &lt;br &#x2F;&gt;
Not telling anyone drastically increases your chances of sticking to and achieving your goal. \&lt;&#x2F;p&gt;
&lt;h2 id=&quot;fun-goals&quot;&gt;Fun goals&lt;&#x2F;h2&gt;
&lt;p&gt;One more thing I occasionally do that may appear strange is to set, for lack of a better term, fun goals. &lt;br &#x2F;&gt;
Like this month I set and achieved the goal to watch at least two anime series. &lt;br &#x2F;&gt;
I treat fun goals as no less important than regular productivity goals. &lt;br &#x2F;&gt;
This greatly helps to balance out any toxic perfectionism.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;start-small&quot;&gt;Start small&lt;&#x2F;h2&gt;
&lt;p&gt;My system has matured to be this elaborate over years. &lt;br &#x2F;&gt;
Goal setting takes practice and doesn&#x27;t need to be a consistent practice to yield results. &lt;br &#x2F;&gt;
I don&#x27;t set new goals every month if I don&#x27;t feel like it. \&lt;&#x2F;p&gt;
&lt;p&gt;Chances are you set a goal for this year. Are you on track? &lt;br &#x2F;&gt;
If you are not, is there a smaller sub-goal that you can still achieve this year?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Our time is being stolen</title>
          <pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/time-stealers/</link>
          <guid>https://port19.xyz/lifestyle/time-stealers/</guid>
          <description xml:base="https://port19.xyz/lifestyle/time-stealers/">&lt;p&gt;&lt;em&gt;Rambly post incoming&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Today was an ordinary day, yet if you were to ask me what I did with it I&#x27;d come up with embarrassingly little.
I can&#x27;t help but feel like my time has been stolen by a combination of content brain and low stress.
It&#x27;s not like I can&#x27;t appreciate a day off to enjoy myself, I binged a 24 episode anime recently, but while the anime left me feeling enriched and satisfied, whatever I did today did not.&lt;&#x2F;p&gt;
&lt;p&gt;As I&#x27;m writing this I&#x27;m unsure what I&#x27;m trying to achieve with this piece.
We all know those shameful moments when we realize that we&#x27;ve fallen for a rabbit hole served by some content algorithm.
Yet I hope this resonates with someone and perhaps inspires a feeling of rebellion.&lt;&#x2F;p&gt;
&lt;p&gt;The problem really isn&#x27;t the lack of productive advances on a Sunday. &lt;br &#x2F;&gt;
It&#x27;s the total neutrality and insignificance of one earth rotation.&lt;&#x2F;p&gt;
&lt;p&gt;What could I have done better? &lt;br &#x2F;&gt;
Should I have ventured outside for a small hike? &lt;br &#x2F;&gt;
Should I have cleaned the kitchen? &lt;br &#x2F;&gt;
Should I have started a new programming project? &lt;br &#x2F;&gt;
Who knows! &lt;br &#x2F;&gt;
Heck, even binging another anime or watching some old movie would have been plenty.&lt;&#x2F;p&gt;
&lt;p&gt;Why do I default to watching youtube despite knowing it&#x27;s my worst option to pass the time? &lt;br &#x2F;&gt;
Oh well...&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Shrimp rice</title>
          <pubDate>Sat, 14 Oct 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/shrimp-rice/</link>
          <guid>https://port19.xyz/recipes/shrimp-rice/</guid>
          <description xml:base="https://port19.xyz/recipes/shrimp-rice/">&lt;img src=&quot;.&#x2F;shrimp-rice.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Cook time: 25 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;100g (frozen) shrimp&lt;&#x2F;li&gt;
&lt;li&gt;2 eggs&lt;&#x2F;li&gt;
&lt;li&gt;150g basmati rice&lt;&#x2F;li&gt;
&lt;li&gt;1 small white onion&lt;&#x2F;li&gt;
&lt;li&gt;2 cloves of garlic&lt;&#x2F;li&gt;
&lt;li&gt;~50ml Rapeseed oil &lt;em&gt;(sub: sunflower oil)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 sp turmeric &lt;em&gt;(sub: curry powder)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp white pepper&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp sesame seeds &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;some green garnish &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;rice cooker &lt;em&gt;(buy one, it&#x27;s worth it)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;pan&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;knife&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Put rice into rice cooker&lt;&#x2F;li&gt;
&lt;li&gt;Heat oil in the pan&lt;&#x2F;li&gt;
&lt;li&gt;Chop the garlic&lt;&#x2F;li&gt;
&lt;li&gt;Chop the onion&lt;&#x2F;li&gt;
&lt;li&gt;Put garlic and onion into the pan&lt;&#x2F;li&gt;
&lt;li&gt;Add white pepper&lt;&#x2F;li&gt;
&lt;li&gt;Leave for 2 minutes on high heat&lt;&#x2F;li&gt;
&lt;li&gt;Add eggs&lt;&#x2F;li&gt;
&lt;li&gt;Leave for another 3 minutes, stir occasionally&lt;&#x2F;li&gt;
&lt;li&gt;Add shrimp&lt;&#x2F;li&gt;
&lt;li&gt;Leave 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Flip the shrimp&lt;&#x2F;li&gt;
&lt;li&gt;Leave another 5 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Add rice, turmeric and sesame seeds&lt;&#x2F;li&gt;
&lt;li&gt;Stir well until the rice is all yellow&lt;&#x2F;li&gt;
&lt;li&gt;Leave on low heat for 2-5 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Optionally garnish with some green herbs&lt;&#x2F;li&gt;
&lt;li&gt;Done. Serves 2&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🍚 Chana masala with spinach</title>
          <pubDate>Sat, 16 Sep 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/chickpea-curry/</link>
          <guid>https://port19.xyz/recipes/chickpea-curry/</guid>
          <description xml:base="https://port19.xyz/recipes/chickpea-curry/">&lt;img src=&quot;.&#x2F;chana-masala.png&quot; height=&quot;300vw&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 10 min&lt;&#x2F;li&gt;
&lt;li&gt;Cook time: 30 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;150g basmati rice&lt;&#x2F;li&gt;
&lt;li&gt;1 can (400g) chopped tomato&lt;&#x2F;li&gt;
&lt;li&gt;1 can (400g) chickpeas&lt;&#x2F;li&gt;
&lt;li&gt;~200g spinach&lt;&#x2F;li&gt;
&lt;li&gt;1 large white onion&lt;&#x2F;li&gt;
&lt;li&gt;2 cloves of garlic&lt;&#x2F;li&gt;
&lt;li&gt;100ml water&lt;&#x2F;li&gt;
&lt;li&gt;~50ml Rapeseed oil &lt;em&gt;(sub: sunflower oil)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp garam masala &lt;em&gt;(sub: curry powder)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp tumeric &lt;em&gt;(sub: curry powder)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp cumin seeds &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1 tsp white pepper &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1&#x2F;2 lemon &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;1&#x2F;2 fresh chili &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;some ginger &lt;em&gt;(opt)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;rice cooker &lt;em&gt;(buy one, it&#x27;s worth it)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;pan&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;knife&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Put rice into rice cooker&lt;&#x2F;li&gt;
&lt;li&gt;Heat oil in the pan&lt;&#x2F;li&gt;
&lt;li&gt;Chop the chili, ginger, garlic&lt;&#x2F;li&gt;
&lt;li&gt;Chop the onion last&lt;&#x2F;li&gt;
&lt;li&gt;Put chili, ginger, garlic and onion into the pan&lt;&#x2F;li&gt;
&lt;li&gt;Leave for 3 minutes on medium heat&lt;&#x2F;li&gt;
&lt;li&gt;Add spices and stir&lt;&#x2F;li&gt;
&lt;li&gt;Leave for another 3 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Add tomato, chickpeas (with can-fluid) and 100ml of water&lt;&#x2F;li&gt;
&lt;li&gt;Stir well and raise heat&lt;&#x2F;li&gt;
&lt;li&gt;Bring to a boil and simmer for at least 10 minutes&lt;&#x2F;li&gt;
&lt;li&gt;Simmer until it&#x27;s almost at the desired viscosity&lt;&#x2F;li&gt;
&lt;li&gt;Add lemon juice (or chunks) and spinach&lt;&#x2F;li&gt;
&lt;li&gt;Leave for another 2-5 minutes until spinach wilks&lt;&#x2F;li&gt;
&lt;li&gt;Done. Serves 2 &lt;em&gt;(when serving, have the rice below the curry)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 Go Language Review</title>
          <pubDate>Sun, 10 Sep 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/go-review/</link>
          <guid>https://port19.xyz/tech/go-review/</guid>
          <description xml:base="https://port19.xyz/tech/go-review/">&lt;h2 id=&quot;go-isn-t-important&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#go-isn-t-important&quot; aria-label=&quot;Anchor link for: go-isn-t-important&quot;&gt;🔗&lt;&#x2F;a&gt;

Go isn&#x27;t important&lt;&#x2F;h2&gt;
&lt;p&gt;In my continued research on admin languages I spotted an article by RedHat from three years ago.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.redhat.com&#x2F;sysadmin&#x2F;programming-languages-sysadmin&quot;&gt;That article&lt;&#x2F;a&gt; features a poll asking for the respondents favorite programming language for admin tasks.
By far the two most popular were Python and Shell, with C, Go and Perl forming a distant cluster of thirds.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;admin-langs.png&quot;&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;roadmap.sh&#x2F;devops?r=devops-beginner&quot;&gt;devops roadmap&lt;&#x2F;a&gt; from roadmap.sh, while also recommending Go, just states to pick any programming language.
The purpose of the language is to be able to write automation scripts to automate repetitive tasks.
Devops, for those out of the loop is basically &lt;em&gt;admin done right&lt;&#x2F;em&gt; or sysadmin 2.&lt;&#x2F;p&gt;
&lt;p&gt;So at that point I already reclassified Go from a potential cornerstone of my tech stack to a firm third place, relegated only to internal CLI tools.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;go-isn-t-fun&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#go-isn-t-fun&quot; aria-label=&quot;Anchor link for: go-isn-t-fun&quot;&gt;🔗&lt;&#x2F;a&gt;

Go isn&#x27;t fun&lt;&#x2F;h2&gt;
&lt;p&gt;I gave Go a shot yesterday. I tried to implement a TUI for the classic &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Mastermind_(board_game)&quot;&gt;mastermind&lt;&#x2F;a&gt; game.
Along the way I got reminded why I initially discarded the language when I spent a week doing coding puzzles with it about a year ago:
&lt;strong&gt;Working with composite data structures in Go sucks&lt;&#x2F;strong&gt;.
This is primarily regarding slices, but my very short time trying to leverage maps and then resorting to a switch case statement was no highlight either.
Slices are variable sized arrays. Go calls slices what would be lists in python or java.&lt;&#x2F;p&gt;
&lt;p&gt;Say you want to save a sorted copy of your slice. In python you just do &lt;code&gt;b = sorted(a)&lt;&#x2F;code&gt;. Let&#x27;s see what we need to do in Go and how we need to adapt the semantics.
Well, let&#x27;s figure out how to copy an array first, because &lt;code&gt;b := a&lt;&#x2F;code&gt; does not work and instead links to the same memory as a. &lt;br &#x2F;&gt;
Instead you have to do a &lt;code&gt;b := make([]int, len(a))&lt;&#x2F;code&gt; before doing a &lt;code&gt;copy(b, a)&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
Now you may import the sort package from the standard library. &lt;br &#x2F;&gt;
Perhaps the idea arises to to &lt;code&gt;b := sortInts(b)&lt;&#x2F;code&gt;, which then complains because of course a sort function doesn&#x27;t return a sorted slice.
No, instead it goes in and mutates the slice to be sorted directly.&lt;&#x2F;p&gt;
&lt;p&gt;Now, retrieving a sorted copy of a slice is surely an obscure operation that warrants a verbose workaround (it isn&#x27;t), but how about deleting an element from a slice?
Surely, something so trivial has it&#x27;s own easy to use function, right?
Python has several functions for this: &lt;code&gt;pop&lt;&#x2F;code&gt; removes the element at index and returns it, &lt;code&gt;del&lt;&#x2F;code&gt; just removes the element at index, and &lt;code&gt;remove&lt;&#x2F;code&gt; will traverse the list and remove the first element equal to the argument.
In Go, you need to do re-slicing. You can implement a function for removal like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;func remove(slice []int, s int) []int {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return append(slice[:s], slice[s+1:]...)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That this isn&#x27;t a standard feature is really stupid, so at some point Go agreed and since 1.21 ships with a slices package in the standard library.
When you import that package you finally get access to stuff like &lt;code&gt;Delete&lt;&#x2F;code&gt;, &lt;code&gt;Contains&lt;&#x2F;code&gt;, &lt;code&gt;Reverse&lt;&#x2F;code&gt;, &lt;code&gt;Min&lt;&#x2F;code&gt;, &lt;code&gt;Max&lt;&#x2F;code&gt;, etc.
A small subset of list functions available in python, which is again a small subset of list functions available in any respectable functional language (e.g. Haskell, Clojure).&lt;&#x2F;p&gt;
&lt;p&gt;Go 1.21 released 5 weeks ago!
Until 5 weeks ago people were writing for loops and performed re-slicing for the most basic of list operations.
That&#x27;s just not my cup of tea. If I have to write for loops to get basic functionality, have functions that mutate instead of returning, when I have a stupid gopath system to go on top of it, I&#x27;m out.&lt;&#x2F;p&gt;
&lt;p&gt;And, just to mention it, TUI libraries are as plentiful as in every other language, with no clear standard. &lt;br &#x2F;&gt;
CLI is clearly just Cobra and Viper, and that&#x27;s neat, but tbh CLIs are easy to write in any language I know.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;other-languages-of-interest&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#other-languages-of-interest&quot; aria-label=&quot;Anchor link for: other-languages-of-interest&quot;&gt;🔗&lt;&#x2F;a&gt;

Other languages of interest&lt;&#x2F;h2&gt;
&lt;p&gt;This leaves a gap in the stack for a natively compiled language. &lt;br &#x2F;&gt;
This gap will remain open for some time, but I do know a few languages that may be of interest. &lt;br &#x2F;&gt;
Julia and Racket both have nothing to do with admin work, but are languages I find beautiful. \&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;racket-lang.org&#x2F;&quot;&gt;Racket&lt;&#x2F;a&gt; is a dialect of Lisp, so it&#x27;s in my back pocket for when I miss functional programming. &lt;br &#x2F;&gt;
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;julialang.org&#x2F;&quot;&gt;Julia&lt;&#x2F;a&gt; is more of a fallback for if I dislike the data analytics and visualization workflow in python.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;go-maybe-later&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#go-maybe-later&quot; aria-label=&quot;Anchor link for: go-maybe-later&quot;&gt;🔗&lt;&#x2F;a&gt;

Go ... maybe later&lt;&#x2F;h2&gt;
&lt;p&gt;It isn&#x27;t entirely unrealistic that I&#x27;ll learn some Go sometime in the future.
It is very likely that I may have to make slight adjustments to someone elses &quot;scripts&quot; written in Perl or Go.
But at that point I&#x27;d rather learn on demand.
It&#x27;s not like programming languages are the only tools counting towards admin skill.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Status Update and Q4 Goals</title>
          <pubDate>Wed, 30 Aug 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/status-update-2309/</link>
          <guid>https://port19.xyz/tech/status-update-2309/</guid>
          <description xml:base="https://port19.xyz/tech/status-update-2309/">&lt;h2 id=&quot;it-s-been-a-while&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#it-s-been-a-while&quot; aria-label=&quot;Anchor link for: it-s-been-a-while&quot;&gt;🔗&lt;&#x2F;a&gt;

It&#x27;s been a while&lt;&#x2F;h2&gt;
&lt;p&gt;So my last post talking about what I&#x27;m doing and where I&#x27;m headed has been a while. &lt;br &#x2F;&gt;
I hinted at my server tech stack back in July in my post on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;dang-stack&#x2F;&quot;&gt;Dang Stack&lt;&#x2F;a&gt;,
but the last time I actually talked about what I&#x27;m learning and future plans was in February with my post &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;clojure&#x2F;&quot;&gt;Clojure: 6 months later&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
Time for another update!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;server-status&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#server-status&quot; aria-label=&quot;Anchor link for: server-status&quot;&gt;🔗&lt;&#x2F;a&gt;

Server Status&lt;&#x2F;h2&gt;
&lt;p&gt;As foreshadowed in February I dove head-first into modern infrastructure development.
I picked up a good bit of Ansible and spent time with Prometheus and Grafana.
I also host a copy of this website on Nginx, and a Gitea instance.
My involvement in docker has been as much by desire as by necessity, as I&#x27;m currently putting the finishing touches on a ~50 page paper on Kubernetes network monitoring. So it comes at no surprise that it is the fundamental runtime I host everything on. &lt;em&gt;(Docker not K8s)&lt;&#x2F;em&gt; &lt;br &#x2F;&gt;
One notable deviation from the &quot;DANG Stack&quot; I initially revealed in July is my move to HAProxy as the load balancer.
It is a lot nicer to configure and interfaces more seamlessly with my monitoring stack.
It is also a major component in the tech stack of my next department at work, where I&#x27;ll spend my third year.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;dashboard.jpg&quot;&gt;
&lt;p&gt;The server can be explored here.¹ &lt;br &#x2F;&gt;
Note the &lt;code&gt;git&lt;&#x2F;code&gt; and &lt;code&gt;status&lt;&#x2F;code&gt; subdomains for Gitea and Grafana respectively. &lt;br &#x2F;&gt;
The infrastructure code is hosted on github in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;rapture&quot;&gt;this repository&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;¹the site is no longer hosted&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coding-status&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#coding-status&quot; aria-label=&quot;Anchor link for: coding-status&quot;&gt;🔗&lt;&#x2F;a&gt;

Coding Status&lt;&#x2F;h2&gt;
&lt;p&gt;It actually took me until mid June to really let go of Clojure as my primary programming language of choice. I archived all nine projects I wrote in my time with the language under a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;clojure-era&quot;&gt;single github repo&lt;&#x2F;a&gt;. The archival was done in a way that keeps the git history intact: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.git-scm.com&#x2F;docs&#x2F;git-bundle&quot;&gt;git bundles&lt;&#x2F;a&gt;
Since then my programming has mostly been in posix shell again, with many small PRs as well as a proof of concept dockerized API &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;foxproxy&quot;&gt;(foxproxy)&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;server-goals&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#server-goals&quot; aria-label=&quot;Anchor link for: server-goals&quot;&gt;🔗&lt;&#x2F;a&gt;

Server Goals&lt;&#x2F;h2&gt;
&lt;p&gt;I would like to expand on the software I host on my server. In particular I&#x27;d like to host:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Calibre Web (ebook library)&lt;&#x2F;li&gt;
&lt;li&gt;Jitsi (video calls)&lt;&#x2F;li&gt;
&lt;li&gt;Syncplay Instance&lt;&#x2F;li&gt;
&lt;li&gt;A public Arch Linux Mirror&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This list will likely grow as I discover more cool software that would benefit me or my friends.&lt;&#x2F;p&gt;
&lt;p&gt;I also want to modularize my current Ansible setup via the use of roles and prepare it for a multi-server setup.
This entails the need to port some currently static config files to jinja templates.
This is motivated by the cost efficiency of horizontal scaling on digital ocean.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;coding-goals&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#coding-goals&quot; aria-label=&quot;Anchor link for: coding-goals&quot;&gt;🔗&lt;&#x2F;a&gt;

Coding Goals&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;d like to code (yet another) Nginx log exporter for Prometheus, but with a stated focus on analytics.
The current ones are more focused on health stats of Nginx, like quantile latencies and status codes.
My exporter will focus on metrics of the requested paths and thus be a viable way to get server side page analytics.
At that point I have enough reason to migrate this website from github pages to my own server.
If you&#x27;re worried about privacy intrusion because I&#x27;ll see you in my access log, keep in mind that currently it&#x27;s just logged out of my reach at microsoft. I hope I&#x27;m more trustworthy with benign data than microsoft. Besides, I&#x27;m only interested in page hits anyway.&lt;&#x2F;p&gt;
&lt;p&gt;Another thing I&#x27;d like to develop is a docker image for arch linux mirrors, with the express goal of it becoming an officially endorsed standard.&lt;&#x2F;p&gt;
&lt;p&gt;In terms of languages I&#x27;d like to hone in on a focused set of admin languages: shell, go, python.
Within these I&#x27;ll make sure to analyze their strengths and assign particular use-cases to the best respective programming language.
See my preliminary use-case analysis from about a week ago:&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;language-stack.png&quot;&gt;
&lt;p&gt;While I have extensive experience in python and shell already, go is something new. Its robust error handling, concurrency, pointers and static typing are foreign to me. I do of course have a rough understanding of the concepts, but I have never extensively used a language with said features.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;general-outlook&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#general-outlook&quot; aria-label=&quot;Anchor link for: general-outlook&quot;&gt;🔗&lt;&#x2F;a&gt;

General Outlook&lt;&#x2F;h2&gt;
&lt;p&gt;Q4 is also the start of the 5th semester of my CS degree, so if push comes to shove I&#x27;ll have to prioritize my formal education over these fun side projects.
I&#x27;ll try my best to at least stick to the somewhat frequent posts on this blog and keep you guys updated.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Why I prefer VA Monitors</title>
          <pubDate>Fri, 25 Aug 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/va/</link>
          <guid>https://port19.xyz/tech/va/</guid>
          <description xml:base="https://port19.xyz/tech/va/">&lt;p&gt;Ever noticed how some video games have a brightness slider? Such video games often have rich visuals and a dark atmosphere that would clash with an extremely bright image. You want that slider to be as dark as possible without losing visibility.&lt;&#x2F;p&gt;
&lt;img src=&quot;.&#x2F;brightnessslider.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;p&gt;VA Monitors and their 3000:1 static contrast ratio are the solution. &lt;br &#x2F;&gt;
IPS Monitors only manage to get 1000:1 in static contrast.&lt;&#x2F;p&gt;
&lt;p&gt;Back when I owned a 1080p VA Monitor &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;benq-gw2470hm-9h-leyla-tbe-a1498511.html&quot;&gt;(BENQ GW2470HM)&lt;&#x2F;a&gt;, some games looked better than even on the 4k IPS Monitor that eventually replaced it.
Such games include Control, the whole Tomb Raider series, Bioshock, Dishonored and even some 2D games like enter the gungeon.
Ghosting isn&#x27;t an issue at 60hz unless you have a really bad VA monitor.&lt;&#x2F;p&gt;
&lt;p&gt;If I had to buy a new monitor today, I&#x27;d go with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;benq-ew3270u-9h-lgvla-tse-a1790472.html&quot;&gt;BENQ3270U&lt;&#x2F;a&gt;. &lt;br &#x2F;&gt;
4k VA 32&quot; and speakers, just how I like it.&lt;&#x2F;p&gt;
&lt;p&gt;I also played with the idea of a 1440p ultrawide, the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;samsung-s34j550wqr-s34j552wqr-ls34j550wqrxen-ls34j552wqrxen-a2498760.html&quot;&gt;Samsung SJ550&lt;&#x2F;a&gt; being a good candidate at the time. Nowadays, that monitor seems to have been replaced by the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;geizhals.de&#x2F;samsung-viewfinity-s5-s50gc-ls34c500gauxen-a2952787.html&quot;&gt;Samsung ViewFinity S5 S50GC&lt;&#x2F;a&gt;.
1440p ultrawide would be attractive for the option of using a 3 column window manager layout, tho that seems to be a hassle to set up in awesomewm. I&#x27;d probably hop window managers to something like xmonad if I ever went with a 1440p ultrawide.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 DigitalOcean Provisioning with Ansible</title>
          <pubDate>Fri, 04 Aug 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/ansible-provision/</link>
          <guid>https://port19.xyz/tech/ansible-provision/</guid>
          <description xml:base="https://port19.xyz/tech/ansible-provision/">&lt;h2 id=&quot;prerequisites&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#prerequisites&quot; aria-label=&quot;Anchor link for: prerequisites&quot;&gt;🔗&lt;&#x2F;a&gt;

Prerequisites&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Have ansible installed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;ansible&#x2F;latest&#x2F;installation_guide&#x2F;intro_installation.html&quot;&gt;(docs)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Have a digital ocean account &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;m.do.co&#x2F;c&#x2F;e3fad703cc9b&quot;&gt;(ref link)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Create an API token &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.digitalocean.com&#x2F;reference&#x2F;api&#x2F;create-personal-access-token&#x2F;&quot;&gt;(docs)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Save the API token in a file with the name &lt;code&gt;.token&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Add &lt;code&gt;.token&lt;&#x2F;code&gt; as a line to your &lt;code&gt;.gitignore&lt;&#x2F;code&gt; file&lt;&#x2F;li&gt;
&lt;li&gt;Prepare ssh key pair or use the same you use for git &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.digitalocean.com&#x2F;products&#x2F;droplets&#x2F;how-to&#x2F;add-ssh-keys&#x2F;create-with-openssh&#x2F;&quot;&gt;(docs)&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;requirements-yml&quot;&gt;
requirements.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;collections&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; community.digitalocean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;inventory-yml&quot;&gt;
inventory.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;digitalocean&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  hosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    megamind.example.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;ansible-cfg&quot;&gt;
ansible.cfg&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #59C2FF;&quot;&gt;[defaults]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt;inventory&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; inventory.yml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;the-playbooks&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-playbooks&quot; aria-label=&quot;Anchor link for: the-playbooks&quot;&gt;🔗&lt;&#x2F;a&gt;

The Playbooks&lt;&#x2F;h2&gt;
&lt;p&gt;First, run &lt;code&gt;ansible-galaxy install -r requirements.yml&lt;&#x2F;code&gt; to install the digital ocean module. &lt;br &#x2F;&gt;
In the following, &lt;code&gt;~&#x2F;.ssh&#x2F;digital-ocean.pub&lt;&#x2F;code&gt; points to my public key. &lt;br &#x2F;&gt;
You may need to adapt that path.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;provision-yml&quot;&gt;
provision.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Provision Digital Ocean Ressources&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  hosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; localhost&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  vars&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ lookup(&amp;#39;ansible.builtin.file&amp;#39;, &amp;#39;.token&amp;#39;) }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  tasks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Register SSH Public Key&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      community.digitalocean.digital_ocean_sshkey&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;Digital Ocean SSH Key&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ oauth_token }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        ssh_pub_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ lookup(&amp;#39;ansible.builtin.file&amp;#39;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;                         &amp;#39;~&#x2F;.ssh&#x2F;digital-ocean.pub&amp;#39;) }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        state&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; present&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      register&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; sshkey_result&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Create Droplet&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      community.digitalocean.digital_ocean_droplet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        state&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; present&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ oauth_token }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ item }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        size&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; s-1vcpu-512mb-10gb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        region&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; fra1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        image&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; debian-12-x64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        unique_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        ssh_keys&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;&amp;quot;{{ sshkey_result.data.ssh_key.id }}&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      with_inventory_hostnames&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; digitalocean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      register&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; droplet_result&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Persist IP address in hostfile&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      become&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      ansible.builtin.lineinfile&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        dest&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &#x2F;etc&#x2F;hosts&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        regexp&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;#39;.*{{ item.data.droplet.name }}$&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        line&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ item.data.droplet.networks.v4.0.ip_address }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;               {{ item.data.droplet.name }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        state&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; present&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      with_items&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ droplet_result.results }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Please refer to the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;slugs.do-api.dev&#x2F;&quot;&gt;api docs&lt;&#x2F;a&gt; for regions, image and size shorthands. &lt;br &#x2F;&gt;
To provision your droplet now run &lt;code&gt;ansible-playbook provision.yml&lt;&#x2F;code&gt; &lt;br &#x2F;&gt;
Congrats, you should now have a virtual private server in the cloud.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;destroy-yml&quot;&gt;
destroy.yml&lt;&#x2F;h3&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #BFBDB6; background-color: #0D1017;&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; hosts&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; localhost&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Cleanup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  vars&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;    oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ lookup(&amp;#39;ansible.builtin.file&amp;#39;, &amp;#39;.token&amp;#39;) }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;  tasks&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Destroy Droplet&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      community.digitalocean.digital_ocean_droplet&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        state&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; absent&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ oauth_token }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ item }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        unique_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #D2A6FF;&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      with_inventory_hostnames&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; digitalocean&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Retrieve DigitalOcean Customer Balance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      community.digitalocean.digital_ocean_balance_info&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        oauth_token&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; &amp;quot;{{ oauth_token }}&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      register&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; balance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt; name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt; Display balance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;      ansible.builtin.debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #39BAE6;&quot;&gt;        msg&lt;&#x2F;span&gt;&lt;span style=&quot;color: #BFBDB6B3;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FF8F40;&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;          Total|MTD: {{ balance.data.account_balance }}|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #AAD94C;&quot;&gt;                     {{ balance.data.month_to_date_usage }}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Let&#x27;s save some bucks while we&#x27;re learning systems administration and deprovision our servers when we&#x27;re done playing with them for the day. &lt;br &#x2F;&gt;
Run &lt;code&gt;ansible-playbook destroy.yml&lt;&#x2F;code&gt; to squash your cloud infrastructure. &lt;br &#x2F;&gt;
This playbook will also display your current account balance and usage in the running month.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;common-errors&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#common-errors&quot; aria-label=&quot;Anchor link for: common-errors&quot;&gt;🔗&lt;&#x2F;a&gt;

Common Errors&lt;&#x2F;h2&gt;
&lt;p&gt;If the playbook run fails at the &quot;Persist IP address in hostfile&quot; step, it spits out a large error message.
This can be fixed by running &lt;code&gt;sudo echo hi&lt;&#x2F;code&gt; and then retrying. You need root privileges to write to your hostfile after all.&lt;&#x2F;p&gt;
&lt;p&gt;If the playbook run fails at the &quot;Register SSH public key&quot; step, it will fail with an HTTP 401 status code.
Seeing this error message indicates your api token has expired.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-now&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-now&quot; aria-label=&quot;Anchor link for: what-now&quot;&gt;🔗&lt;&#x2F;a&gt;

What now?&lt;&#x2F;h2&gt;
&lt;p&gt;To dive further into ansible, I recommend Jeff Geerlings book &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.ansiblefordevops.com&#x2F;&quot;&gt;Ansible for Devops&lt;&#x2F;a&gt; &lt;br &#x2F;&gt;
You can also check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;rapture&quot;&gt;my vps setup&lt;&#x2F;a&gt; &lt;br &#x2F;&gt;
The code for this article is available &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;digitalocean-provisioning-with-ansible&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you run into any problems, feel free to reach out.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 The rolling shopping list</title>
          <pubDate>Tue, 25 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/rolling-shoppinglist/</link>
          <guid>https://port19.xyz/lifestyle/rolling-shoppinglist/</guid>
          <description xml:base="https://port19.xyz/lifestyle/rolling-shoppinglist/">&lt;h1 id=&quot;wait-before-you-buy&quot;&gt;Wait before you buy&lt;&#x2F;h1&gt;
&lt;p&gt;My impulse purchases have been frequent cause for frustration in the past few years.
Only recently have I spent near 500€ for an all inclusive 48 core arm cluster without even sleeping on the purchase, only to realize my lack of adequate cooling to keep the cluster running for prolonged periods of time.&lt;&#x2F;p&gt;
&lt;figure&gt;
&lt;img src=&quot;.&#x2F;cluster.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;figcaption&gt;&lt;i&gt;
270€ of impulse purchase
&lt;&#x2F;i&gt;&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;Plenty of methods exist to cope with impulse purchasing, from plain frugality to budgeting, tho I have found it difficult to adhere to those.
Today I want to introduce to you my current method of avoiding overindulgence: by writing a shopping list.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-basic-idea&quot;&gt;The basic idea&lt;&#x2F;h2&gt;
&lt;p&gt;You&#x27;ll need a piece of paper, perhaps in a notebook or journal, and a pen or two.
Whenever you desire a certain product, you note it down, together with the current date as well as it&#x27;s price.
When you later decide you don&#x27;t want it anymore, you strike it through.
If a predetermined amount of time has passed and you still want it, you buy it.
Once you ordered it, you strike it through with a different pen, I like to use a green one for this.
If you want to keep things digital, I suggest bold plus strikethrough.&lt;&#x2F;p&gt;
&lt;p&gt;Example:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;&#x2F;th&gt;&lt;th&gt;Item&lt;&#x2F;th&gt;&lt;th&gt;Price&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;16.7.&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;Sandisk Extreme Pro 1TB microSD&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;120€&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;&lt;strong&gt;18.7.&lt;&#x2F;strong&gt;&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;&lt;strong&gt;Samsung Evo Plus 256GB microSD&lt;&#x2F;strong&gt;&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;&lt;strong&gt;15€&lt;&#x2F;strong&gt;&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;del&gt;22.7.&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;Anker Nano 2 65W&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;del&gt;40€&lt;&#x2F;del&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;24.7.&lt;&#x2F;td&gt;&lt;td&gt;8BitDo Wireless USB Adapter 2&lt;&#x2F;td&gt;&lt;td&gt;22€&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;how-long-to-wait&quot;&gt;How long to wait&lt;&#x2F;h2&gt;
&lt;p&gt;This will depend greatly on your spending habits and amount of disposable income.
While different wait times for different prices make things more complicated, I recommend doing it anyway, as waiting an eternity for a relatively small purchase is counter productive if you want shopping to still be fun.&lt;&#x2F;p&gt;
&lt;p&gt;Here are my timings:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Price&lt;&#x2F;th&gt;&lt;th&gt;Time&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;≤  30€&lt;&#x2F;td&gt;&lt;td&gt;2d&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;≤ 100€&lt;&#x2F;td&gt;&lt;td&gt;7d&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;≤ 250€&lt;&#x2F;td&gt;&lt;td&gt;14d&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&amp;gt; 250€&lt;&#x2F;td&gt;&lt;td&gt;30d&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Technicalities:&lt;&#x2F;p&gt;
&lt;p&gt;For me, price refers to the price of the product plus shipping, rounded up.
If I&#x27;m shopping in person, I&#x27;ll buy items under 30€ right away.
Purchases above 100€ are, and should stay, pretty rare for me.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Infrastructure with the DANG Stack</title>
          <pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/dang-stack/</link>
          <guid>https://port19.xyz/tech/dang-stack/</guid>
          <description xml:base="https://port19.xyz/tech/dang-stack/">&lt;img src=&quot;.&#x2F;DangStack.png&quot; height=&quot;400vw&quot;&gt;
&lt;p&gt;In this post I&#x27;ll introduce the tech stack I use to build my personal infrastructure.
It is ideal for monolithic deployments, but will scale well to about a dozen servers.
The four main components are each supported by one or two smaller components to coherently achieve some administration task.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;docker&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#docker&quot; aria-label=&quot;Anchor link for: docker&quot;&gt;🔗&lt;&#x2F;a&gt;

Docker&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.docker.com&#x2F;why-docker&#x2F;&quot;&gt;Docker&lt;&#x2F;a&gt; is the most common containerization software in use today.
Its role in the DANG stack is to be the application runtime.
Docker allows a developer to build their application in a reproducible and deployable manner.
Stateless applications are benefited the most, but stateful applications work as well.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;docker&#x2F;compose#quick-start&quot;&gt;Docker Compose&lt;&#x2F;a&gt; is a way to connect the container to it&#x27;s environment.
It connects ports, binds storage volumes and defines what containers are deployed in the first place.
This makes multi-container setups reproducible and easy.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;engine&#x2F;swarm&#x2F;&quot;&gt;Docker Swarm&lt;&#x2F;a&gt; is a way to coordinate docker containers across several hosts.
You can think of it as a poor mans kubernetes, but since it is a lot simpler it&#x27;s the superior choice for deployments up to a dozen servers.
I currently have no use for this, but might leverage it once I deploy to multiple servers.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ansible&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#ansible&quot; aria-label=&quot;Anchor link for: ansible&quot;&gt;🔗&lt;&#x2F;a&gt;

Ansible&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;Ansible&lt;&#x2F;a&gt; is the default Infrastructure as Code solution in use today.
It&#x27;s job in the DANG stack is the provisioning and configuration of cloud resources.
It fits particularly well, as it has rich templating support and uses a push based config management, enabling use in a CI&#x2F;CD context.&lt;&#x2F;p&gt;
&lt;p&gt;My current setup uses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;m.do.co&#x2F;c&#x2F;e3fad703cc9b&quot;&gt;Digital Ocean&lt;&#x2F;a&gt; for hosting, which is natively supported by Ansible.
This provisioning and deprovisioning saves me money during this experimental phase where I have no services to run 24&#x2F;7.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.terraform.io&#x2F;use-cases&#x2F;multi-cloud-deployment&quot;&gt;Terraform&lt;&#x2F;a&gt; is focused solely on cloud provisioning and as such supports many more clouds than Ansible does.
&lt;code&gt;terraform destroy&lt;&#x2F;code&gt; is also a more ergonomic way to deprovision resources when they are no longer needed, compared to having a &lt;code&gt;destroy.yml&lt;&#x2F;code&gt; playbook in ansible.
I will start using it once I leverage more involved cloud offerings or start to use more than one provider at once.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.github.com&#x2F;en&#x2F;actions&quot;&gt;Github Actions&lt;&#x2F;a&gt; can automate deployment in a CI&#x2F;CD fashion. You can get creative here.
Perhaps deploy to a test environment when not on the master branch?
Maybe have automatic deprovisioning and provisioning with roll-over at regular intervals?
Cool stuff!
In any case you&#x27;ll need to add an ssh key and an api token to Github secrets.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;nginx&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#nginx&quot; aria-label=&quot;Anchor link for: nginx&quot;&gt;🔗&lt;&#x2F;a&gt;

Nginx&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nginx.org&#x2F;en&#x2F;docs&#x2F;&quot;&gt;Nginx&lt;&#x2F;a&gt; handles all the traffic.
It serves the DANG stack as a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;lZVAI3PqgHc&quot;&gt;reverse proxy&lt;&#x2F;a&gt; first and foremost, but also provides usage statistics in the form of access logs that are visualized on a Grafana dashboard.
Once you scale up, it also supports caching and load balancing, so that&#x27;s nice.&lt;&#x2F;p&gt;
&lt;p&gt;Nginx is aided by any decent firewall, assuring visitors don&#x27;t just sidestep your reverse proxy.
For this I personally use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Uncomplicated_Firewall&quot;&gt;ufw&lt;&#x2F;a&gt;, the uncomplicated firewall, which is a wrapper around iptables.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;grafana&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#grafana&quot; aria-label=&quot;Anchor link for: grafana&quot;&gt;🔗&lt;&#x2F;a&gt;

Grafana&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;grafana&quot;&gt;Grafana&lt;&#x2F;a&gt; is the best visualization software for infrastructure monitoring out today.
It visualizes metrics that are aggregated by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;prometheus.io&#x2F;docs&#x2F;instrumenting&#x2F;exporters&#x2F;&quot;&gt;Prometheus&lt;&#x2F;a&gt;, which itself needs a few exporters to give us the insights we deserve.&lt;&#x2F;p&gt;
&lt;p&gt;This component is the most open ended, as you can easily expand to Log Aggregation (e.g. via &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;grafana.com&#x2F;products&#x2F;cloud&#x2F;logs&#x2F;?plcmt=footer&quot;&gt;Grafana Loki&lt;&#x2F;a&gt;) or even use all four Grafana products at once.
Prometheus is also not a set and forget solution, as you need to configure several exporters to gain insights beyond resource consumption.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-synergy&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-synergy&quot; aria-label=&quot;Anchor link for: the-synergy&quot;&gt;🔗&lt;&#x2F;a&gt;

The Synergy&lt;&#x2F;h2&gt;
&lt;p&gt;These four components lay a powerful foundation for an infrastructure that can grow to at least a moderate size.
Each component excels at it&#x27;s job while not impeding any of the other components.
Check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;rapture&quot;&gt;my repo&lt;&#x2F;a&gt; for a demonstration of what is possible and to follow where I&#x27;m going with this.
If you have any suggestions of software that might be fun for me to self-host, please let me know.
I&#x27;ll also be publishing more focussed tutorials on how to achieve specific things with the components mentioned, as related resources can be dry sometimes.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Faster Emacs Init</title>
          <pubDate>Tue, 06 Jun 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/emacs-init/</link>
          <guid>https://port19.xyz/tech/emacs-init/</guid>
          <description xml:base="https://port19.xyz/tech/emacs-init/">&lt;h1 id=&quot;5-2-seconds&quot;&gt;
5 → 2 seconds&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;profiling-and-margin-of-error&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#profiling-and-margin-of-error&quot; aria-label=&quot;Anchor link for: profiling-and-margin-of-error&quot;&gt;🔗&lt;&#x2F;a&gt;

Profiling and margin of error&lt;&#x2F;h2&gt;
&lt;p&gt;For profiling startup speed several options are available, but few of them worked for me.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jschaf&#x2F;esup&quot;&gt;esup&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;dholm&#x2F;benchmark-init-el&quot;&gt;benchmark-init&lt;&#x2F;a&gt; didn&#x27;t yield the desired results, showing me no output to speak of.
&lt;code&gt;(setq use-package-verbose t)&lt;&#x2F;code&gt; works for a first glance, but I landed on profile-dotemacs.el as my solution of choice. Note that this gives an optimistic time that is lower than &lt;code&gt;M-x emacs-init-time&lt;&#x2F;code&gt; for some reason. The following numbers are the ones from &lt;code&gt;M-x emacs-init-time&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;To get the theoretical minimum startup speed, run &lt;code&gt;emacs -q --eval=&#x27;(message &quot;%s&quot; (emacs-init-time))&#x27;&lt;&#x2F;code&gt;, mine was 0.25s.&lt;&#x2F;p&gt;
&lt;p&gt;Margin of error is ~0.1s for most of the numbers that follow, but obviously correlated to the number. The minimum startup speed has a margin of error of only 0.01s.&lt;&#x2F;p&gt;
&lt;p&gt;With that out of the way, my starting point today was 4.9s.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;garbage-collection&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#garbage-collection&quot; aria-label=&quot;Anchor link for: garbage-collection&quot;&gt;🔗&lt;&#x2F;a&gt;

Garbage Collection&lt;&#x2F;h2&gt;
&lt;p&gt;https:&#x2F;&#x2F;www.emacswiki.org&#x2F;emacs&#x2F;profile-dotemacs.el highlights runtime, gc count and gc time for each expression beyond a specified runtime percentage.
This highlighted an easy to fix issue: emacs did dozens of gc&#x27;s during init.&lt;&#x2F;p&gt;
&lt;p&gt;I added &lt;code&gt;(setq gc-cons-threshold most-positive-fixnum)&lt;&#x2F;code&gt; to the very top of my config and then added a hook to enable it again after init, increasing the threshold from the default 760KB to 8MB of memory usage.&lt;&#x2F;p&gt;
&lt;p&gt;This can be done with either of the following depending on if you use use-package:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(add-hook &#x27;emacs-startup-hook (lambda () (setq gc-cons-threshold (* 8 1024 1024))))&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;:hook (emacs-startup . (lambda () (setq gc-cons-threshold (* 8 1024 1024))))&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This brought down my startup time by ~33% to 3.3s&lt;&#x2F;p&gt;
&lt;h2 id=&quot;defer-n&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#defer-n&quot; aria-label=&quot;Anchor link for: defer-n&quot;&gt;🔗&lt;&#x2F;a&gt;

:defer N&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;code&gt;use-package&lt;&#x2F;code&gt; provides and option to explicitly defer loading via the &lt;code&gt;:defer&lt;&#x2F;code&gt; directive.
Note that when you specify &lt;code&gt;:mode&lt;&#x2F;code&gt;, &lt;code&gt;:hook&lt;&#x2F;code&gt;, &lt;code&gt;:bind&lt;&#x2F;code&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jwiegley&#x2F;use-package#notes-about-lazy-loading&quot;&gt;similar directives&lt;&#x2F;a&gt; it implicitly defers loading.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;code&gt;:defer t&lt;&#x2F;code&gt; defers loading until the package is needed, perhaps because you open a specific file or use a command. By providing a numeric argument, integer or float, it will load after N seconds of idle time.&lt;&#x2F;p&gt;
&lt;p&gt;I recommend explicitly deffering modes that meet all the following criteria:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;don&#x27;t involve ui&lt;&#x2F;li&gt;
&lt;li&gt;aren&#x27;t evil&lt;&#x2F;li&gt;
&lt;li&gt;are either mode specific or major modes&lt;&#x2F;li&gt;
&lt;li&gt;take &amp;gt;0.1s during profiling&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Using this method I deferred loading of 11 my 46 installed packages.
This brought down my load time by another ~40% to 2.0s.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Road of linux</title>
          <pubDate>Sun, 28 May 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/road-of-linux/</link>
          <guid>https://port19.xyz/tech/road-of-linux/</guid>
          <description xml:base="https://port19.xyz/tech/road-of-linux/">&lt;h1 id=&quot;in-linux-we-all-travel-a-similar-road&quot;&gt;
In Linux, we all travel a similar road&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;layer-1-distrohopping&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#layer-1-distrohopping&quot; aria-label=&quot;Anchor link for: layer-1-distrohopping&quot;&gt;🔗&lt;&#x2F;a&gt;

Layer 1: distrohopping&lt;&#x2F;h2&gt;
&lt;p&gt;At first, sometime late 2019, there was a blue screen of death and some instability with windows on my first self-built pc.
As I started getting into &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;8ev9ZX9J45A&quot;&gt;CTFs&lt;&#x2F;a&gt; at the time, I took the opportunity and installed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.parrotsec.org&#x2F;&quot;&gt;parrot&lt;&#x2F;a&gt; as my first linux distro.
In the following year, like many of you I hopped distros a lot.
The details of what distros I used when are both lost to time and irrelevant, tho I can say that it was important.&lt;&#x2F;p&gt;
&lt;p&gt;Getting to know many slightly different ways of using a computer as well as numerous different linux programs helps laying a foundation.
You discover properties in software that you like and dislike, but don&#x27;t consciously reason about them yet.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;layer-2-window-managers&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#layer-2-window-managers&quot; aria-label=&quot;Anchor link for: layer-2-window-managers&quot;&gt;🔗&lt;&#x2F;a&gt;

Layer 2: window managers&lt;&#x2F;h2&gt;
&lt;p&gt;After a while I hopped to arch linux, learning a lot in my first time configuring it.
I tried out the openbox window manager, a fantastic floating wm, but soon dismissed it in favor of qtile.
It was at this point that I started thoroughly tinkering with my application stack.
I tried out different terminal emulators, file managers and web browsers, as well as discovering many applications of lower importance, such as ncdu for disk usage analysis on the terminal, or calcurse for a basic scheduling and todo application.
I finally &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;ST7vnfKjfvY&quot;&gt;learned vim&lt;&#x2F;a&gt;!
This was also the point where I began storing the important parts of my configuration in a git repository.&lt;&#x2F;p&gt;
&lt;p&gt;At this stage you&#x27;re no longer changing your base operating system, or at least aren&#x27;t actively seeking to do so.
You start reading documentation. You actively pick some software and configure it via configuration files.
You learn vim.
You set up your dotfiles repo.
You browse the web for inspiration and get inspired by posts on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;reddit.com&#x2F;r&#x2F;unixporn&#x2F;top?t=month&quot;&gt;r&#x2F;unixporn&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;layer-3-refinement&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#layer-3-refinement&quot; aria-label=&quot;Anchor link for: layer-3-refinement&quot;&gt;🔗&lt;&#x2F;a&gt;

Layer 3: refinement&lt;&#x2F;h2&gt;
&lt;p&gt;Late 2021, my customizations slowed down a bit and I no longer swapped out different terminal programs on a near daily basis.
In this time my most notable change was from qtile to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;awesomeWM&#x2F;awesome&quot;&gt;awesome&lt;&#x2F;a&gt; as my window manager, as I grew frustrated with qtile&#x27;s maintainers.
I still tried out new stuff from time to time, I lived a few months in wayland with sway for example, but some components began to stabilize.
Throughout 2022 I also started to work on improving my bootstrapping:
While many prefer to write an installation script, I chose to put that into an arch pkgbuild so my package list could be managed alongside my dotfiles.
I also started using &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.conventionalcommits.org&#x2F;en&#x2F;v1.0.0&#x2F;#summary&quot;&gt;conventional commits&lt;&#x2F;a&gt; for my dotfiles repo.&lt;&#x2F;p&gt;
&lt;p&gt;This stage is marked by slow, incremental changes to your software, rather than big leaps from one offering to the next.
You might still change out some components from time to time, but a grand picture has formed and you now have a coherent environment.
You start working on reproducibility, you write an installation script or similar.
You definitely manage your config files in git.
You&#x27;re also very comfortable in the shell by now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;layer-4-the-editor&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#layer-4-the-editor&quot; aria-label=&quot;Anchor link for: layer-4-the-editor&quot;&gt;🔗&lt;&#x2F;a&gt;

Layer 4: the editor&lt;&#x2F;h2&gt;
&lt;p&gt;In terms of a timeline this overlaps with the previous point: On January the 7th 2022 I installed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;doomemacs&#x2F;doomemacs&quot;&gt;doom emacs&lt;&#x2F;a&gt; on my computer and started digging in.
This felt almost like another introduction to linux in the sense that I went through similar layers again, getting accustomed to a foreign environment.
It took me over a year until I moved from doom, which feels like the linux mint of emacs, to vanilla emacs.
And that is where I am today in my linux journey: I&#x27;m mostly tinkering with emacs now and am figuring out ways to be more productive or more comfortable in my editor, often both.&lt;&#x2F;p&gt;
&lt;p&gt;Whether you choose vim or emacs, at this stage your editor becomes the focus of your customization efforts.
You add plugins (vim) or packages (emacs) and slowly get more accustomed to doing more and more in your editor.
Adjustments to your other configurations become smaller with 1 line changes now being the norm.
Testing new software becomes the exception.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll link 2 particularly insightful videos on the topic of vim vs emacs here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;1mr3issv79s&quot;&gt;luke smith - why I don&#x27;t use emacs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;youtu.be&#x2F;qTncc2lI6OI&quot;&gt;protesilaos stavrou - emacs mindset and unix philosophy&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;layer-5-regression&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#layer-5-regression&quot; aria-label=&quot;Anchor link for: layer-5-regression&quot;&gt;🔗&lt;&#x2F;a&gt;

Layer 5(?): regression&lt;&#x2F;h2&gt;
&lt;p&gt;This is purely speculative, but an observation I&#x27;ve made at work as a sysadmin in training:
People that were on linux for years abandon their tailored environments to move back to the mainstream.
On several occasions I have seen co-workers trade in their linux laptop for a macbook.
I have met impressively knowledgeable co-workers with decades of admin experience using linux mint.
I assume this layer is not inevitable, but I wanted to mention it, since I found it odd when I first observed it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-similar-road-we-travel&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-similar-road-we-travel&quot; aria-label=&quot;Anchor link for: the-similar-road-we-travel&quot;&gt;🔗&lt;&#x2F;a&gt;

The similar road we travel&lt;&#x2F;h2&gt;
&lt;p&gt;Most of us start on some ubuntu based distro clicking through gtk menus and pointing at our text with the mouse in some floating window.
We hop around and eventually find our place in some distro base. For many that is arch linux, but others gravitate to gentoo, debian or nixos instead.
We may start playing around with window managers, crafting desktop environments of our own.
We live in the terminal, using dozens of small little gemstones that we got for free by the open source ecosystem.&lt;&#x2F;p&gt;
&lt;p&gt;And then, eventually, we focus on the primary task of the computer: text editing.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Habits and diminishing returns</title>
          <pubDate>Sat, 29 Apr 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/habits-and-diminishing-returns/</link>
          <guid>https://port19.xyz/lifestyle/habits-and-diminishing-returns/</guid>
          <description xml:base="https://port19.xyz/lifestyle/habits-and-diminishing-returns/">&lt;p&gt;&lt;em&gt;From the other side of self-improvement&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I discovered the online genre of self-improvement videos in my late teens.
Now I&#x27;m in my early 20s.
One of the main things that self-improvement gurus lament about is the importance of habits and I&#x27;m not here to disagree with them.
But there comes a point of diminishing returns.
A point where you&#x27;ve implemented most of the easy routines as well as several of the larger, more impactful habits.
Once you hit that point, building more habits becomes a form of procrastination.
Being promised gains in productivity, well-being, or some other metric of a desirable life, you chase after the next increment.&lt;&#x2F;p&gt;
&lt;p&gt;Let me illustrate with the example of cold showers.
A frequently recommended habit with unusually quick payoff.
My first 3-4 cold showers were rather intense, and left me very refreshed and energised.
The next dozen or so were still notably different from what I was used to.
After that point it was just very cold for a few seconds before feeling almost lukewarm.
At that point, the cold showers reward reduced to less dry skin, a slightly cleaner feeling and the achievement of having overcome the initial hesitation.
But at the cost of the comfort and relaxation a hot shower provides.
Then, after I catched a cold earlier this month, I switched back to hot showers and have mostly stuck to them since.&lt;&#x2F;p&gt;
&lt;p&gt;There are other examples, but I believe this is sufficient to communicate the point I&#x27;m trying to make.
Don&#x27;t make habits your bucket list.
Don&#x27;t go online searching for the &quot;top 50 habits&quot; to keep yourself occupied.
Many of them won&#x27;t have as big of an impact on you as they did on others.
Many will slightly diminish, instead of improve, your quality of life.&lt;&#x2F;p&gt;
&lt;p&gt;In place of only following some gurus advice online, contemplate and decide for yourself what the best use of your time is.
Often that best use of your time won&#x27;t even be productive in the strictest sense: play video games or watch movies if you enjoy them.
Sure, reflect on your trajectory every so often, but stop obsessing about little details with marginal payoff.&lt;&#x2F;p&gt;
&lt;p&gt;You can&#x27;t sharpen your axe forever, at some point it&#x27;s chopping time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Epigrams on Web Scraping</title>
          <pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/epigrams/</link>
          <guid>https://port19.xyz/tech/epigrams/</guid>
          <description xml:base="https://port19.xyz/tech/epigrams/">&lt;ol&gt;
&lt;li&gt;Never climb the tree when you can shoot down it&#x27;s apples&lt;&#x2F;li&gt;
&lt;li&gt;Web scraping is a cat and mouse game&lt;&#x2F;li&gt;
&lt;li&gt;A status sidecar is the only reasonable way to monitor continued effectiveness&lt;&#x2F;li&gt;
&lt;li&gt;Regex will never parse all of html&lt;&#x2F;li&gt;
&lt;li&gt;Regex will always parse a subset of html&lt;&#x2F;li&gt;
&lt;li&gt;In web scraping, all invariance is ephemeral. Embrace it&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t build too high on fragile grounds&lt;&#x2F;li&gt;
&lt;li&gt;Talking over the network, algorithmic speed becomes irrelevant&lt;&#x2F;li&gt;
&lt;li&gt;Web scraping is the combination of web requests and html data extraction&lt;&#x2F;li&gt;
&lt;li&gt;Web drivers are a sign of weakness, spiders are a sign of strength&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>📚 Text is vastly superior to video for content</title>
          <pubDate>Sun, 16 Apr 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/text-superiority/</link>
          <guid>https://port19.xyz/lifestyle/text-superiority/</guid>
          <description xml:base="https://port19.xyz/lifestyle/text-superiority/">&lt;p&gt;&lt;em&gt;unpublished post from january I found in my desk&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This one was a long time coming.
In the past few months I&#x27;ve worked to increase the volume of content I produce.
As a part of that process, I&#x27;ve experimented with video content over on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;odysee.com&#x2F;&quot;&gt;Odyssey&lt;&#x2F;a&gt;, producing about a dozen screen-casts in December.&lt;&#x2F;p&gt;
&lt;p&gt;When I say that text is superior to video I mean that from both the perspective of the producer, as well as the perspective of the consumer.
From the consumers perspective, text saves bandwidth and time and usually has a lot higher information density.
For pure entertainment value a consumer may prefer well made video, tho even that I&#x27;m not so sure of.
From my perspective as someone who publishes content to a small but existent audience, I&#x27;m usually more satisfied with my written work and enjoy it&#x27;s creation a lot more.&lt;&#x2F;p&gt;
&lt;p&gt;This is of course influenced by my preferences as a consumer, but also in no small part due to editing and versatility.
While video editors exist and have existed for decades now, I&#x27;m unwilling to invest time into learning one.
As a result my videos were one-takes that generally could have been better.
They were also visually lacking, usually my voice was accompanied by an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;excalidraw.com&#x2F;&quot;&gt;excalidraw&lt;&#x2F;a&gt; whiteboard and little else.
Increasing my production quality here means  a significant investment of time learning a new skill, but I would also likely need to upgrade my microphone in the process.&lt;&#x2F;p&gt;
&lt;p&gt;Now contrast that with text. I&#x27;ve been taught the basics of creative writing in school and have built on that slowly for many years.
Tooling is accessible and everywhere.
The whole world of personal computing has been built around text editing.
And even outside of that, writing is accessible.
I may sit down with a pen and paper and write the first draft to an article before later editing it on the computer.
&lt;em&gt;(Sometimes much later. This one is 3 months old!)&lt;&#x2F;em&gt;
I can then, during that editing process, find structure, reshape and adjust my arguments, fix spelling and grammatical errors as well as refine my choice of words to create a coherent and well written blog post.
Lastly, there is the element of formatting and version control that is missing with video.&lt;&#x2F;p&gt;
&lt;p&gt;Suffice to say I&#x27;m no longer producing video content.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Web apps are marketable</title>
          <pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/webapps/</link>
          <guid>https://port19.xyz/tech/webapps/</guid>
          <description xml:base="https://port19.xyz/tech/webapps/">&lt;h1 id=&quot;friction-cripples-adoption&quot;&gt;
Friction cripples adoption&lt;&#x2F;h1&gt;
&lt;p&gt;One of the biggest factors stopping potential users from adopting your software is the friction involved in said adoption process.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;friction-in-native-applications&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#friction-in-native-applications&quot; aria-label=&quot;Anchor link for: friction-in-native-applications&quot;&gt;🔗&lt;&#x2F;a&gt;

Friction in native applications&lt;&#x2F;h2&gt;
&lt;p&gt;If you distribute a native application, the best case for a smooth adoption process would be as follows:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;The user clicks on a link to you projects install instructions&lt;&#x2F;li&gt;
&lt;li&gt;The user immediately sees a command involving his native package manager and copies it&lt;&#x2F;li&gt;
&lt;li&gt;The user already has a terminal open and pastes the command&lt;&#x2F;li&gt;
&lt;li&gt;The user hits enter and isn&#x27;t prompted for any further confirmation&lt;&#x2F;li&gt;
&lt;li&gt;The user launches your application&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;This is a 5 step adoption process assuming extremely favourable conditions.
Step 2 could be 2 steps if you support many native package managers and the user has to find his one first.
Step 3 could be preceded by opening the terminal.
Step 4 could be extended to prompt for several more interactions, as is standard with yay the AUR helper.
Step 5 could be delayed because your user needs to read your documentation first to see how to launch your application.&lt;&#x2F;p&gt;
&lt;p&gt;You quickly end up with a 10 step process that, despite taking only a minute or two, delays the adoption of your software and introduces enough friction for many users to never bother to check out your offering.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;friction-in-web-apps&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#friction-in-web-apps&quot; aria-label=&quot;Anchor link for: friction-in-web-apps&quot;&gt;🔗&lt;&#x2F;a&gt;

Friction in web apps&lt;&#x2F;h2&gt;
&lt;p&gt;Contrast this with 90% of decent web apps: You click a link and are already using the software.
This is a one step process taking maybe 5 seconds with bad internet.
Even if your web app is corporate garbage, displaying a cookie banner and an email form, it&#x27;s only 2 more clicks to get rid of those.
And this only highlights the friction on a mere time axis.&lt;&#x2F;p&gt;
&lt;p&gt;Web apps come with an additional benefit of trust.
The web browser is giving some sense of safety to the users, as it protects them from ill intentioned developers.
Lastly, users might be less hesitant to adopt a web app, since it takes no additional storage and, assuming the browser is already open anyway, it might take less computing resources than many poorly written native applications.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;languages-for-the-full-stack-web&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#languages-for-the-full-stack-web&quot; aria-label=&quot;Anchor link for: languages-for-the-full-stack-web&quot;&gt;🔗&lt;&#x2F;a&gt;

Languages for the full stack web&lt;&#x2F;h2&gt;
&lt;p&gt;Assuming I have convinced you that much of your time may be better spent developing web apps, you might now think about the tools required.
I&#x27;d like to recommend you use programming languages that are well suited to both back-end and front-end code.
I am currently only aware of two programming languages that fit this criteria: Typescript and Clojure.
Typescript is extremely popular and tRPC makes connecting the front-end to the back-end very straightforward.
I personally prefer Clojure. It is a functional lisp with the reference implementation, also called Clojure, running on the JVM.
The other major implementation is Clojurescript which, as typescript, compiles to JavaScript.
Both implementations work together really well and, thanks to the languages emphasis on data oriented applications, they integrate nicely with all major databases.
For next level coherence you can even choose to use Datomic as your database.
Created by the same author, it is bound to support many of the idioms you&#x27;ll be used to and work well with your functional gem of a full stack web app.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Productivity Systems</title>
          <pubDate>Sun, 05 Mar 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/productivity-systems/</link>
          <guid>https://port19.xyz/lifestyle/productivity-systems/</guid>
          <description xml:base="https://port19.xyz/lifestyle/productivity-systems/">&lt;h1 id=&quot;reflecting-on-what-works-and-when&quot;&gt;Reflecting on what works - and when&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ve used powerful productivity systems for most of my past two years in college.
Along the way my strategies have adapted to the changing circumstances in my life.
In this post I hope to give you insight into how I organize myself and provide ideas on how you might pick a productivity system or adjust one to suit your needs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gtd-phone&quot;&gt;GTD + Phone&lt;&#x2F;h2&gt;
&lt;p&gt;For a long time I have used &quot;Getting Things Done&quot;, the GTD method, to organize myself.
I used a simple &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Etar-Group&#x2F;Etar-Calendar&quot;&gt;calendar app&lt;&#x2F;a&gt;, a powerful &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tasks&#x2F;tasks&quot;&gt;todo list&lt;&#x2F;a&gt;, and a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;iSoron&#x2F;uhabits&quot;&gt;habit tracker&lt;&#x2F;a&gt;.
The calendar held passive appointments, meaning appointments where I just had to show up, or that needed little preparation.
The habit tracker helped me build 1-3 habits at a time, and had pretty nice widgets for that.
My task management system got pretty elaborate, with prioritization, tags and different lists, along with a custom filter for the widget.&lt;&#x2F;p&gt;
&lt;p&gt;GTD excels at bandwidth, when you have a lot of small tasks and appointments, rather than one large project.
I&#x27;d say it&#x27;s the best system for staying on top of things, if your life gets chaotic and you have more urgent chores than important tasks.
On the flip side, GTD disappoints in growth and reflection, dumbing down your journey to checkboxes and providing no native mechanisms for self-review.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bullet-journaling&quot;&gt;Bullet Journaling&lt;&#x2F;h2&gt;
&lt;p&gt;When I first switched to a dumbphone, I soon craved an alternative to my previous setup.
Since I wanted to cut back on technology use, a large goal for me at the time, I arrived at bullet journaling as my system of choice.
My bullet journal had month and week spreads for it&#x27;s hierarchy, as opposed to one page per day, or a rolling structure.
I integrated habit tracking into the week spreads and also had some custom collections to track other aspects of my life.&lt;&#x2F;p&gt;
&lt;p&gt;Bullet journaling excels at making you reflect, by purposely increasing the friction of adding tasks to your todo-list, while also making you consciously migrate or eliminate any uncompleted tasks.
With the future log being great for scheduling, BuJo always gave me a great overview over my life.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-management-with-org-mode&quot;&gt;Project Management with Org Mode&lt;&#x2F;h2&gt;
&lt;p&gt;Orthogonal to both of these systems, I like to use emacs org mode for managing ongoing projects that have little contact to the rest of my life.
Such things can be individual classes in college, or one-off investigations into topics of interest, such as exercise or nutrition.
Org mode is great for a focused approach to work, such as longer projects or work.&lt;&#x2F;p&gt;
&lt;p&gt;Some people use org mode as their primary productivity tool, with org capture and the org agenda providing decent scheduling support.
I&#x27;ve tried to integrate these features into my workflow but haven&#x27;t found much success at using emacs for life management.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;I started out with GTD, went to BuJo for 3 months, went back for 3 months, to then use no productivity system for the last two months.
Since I&#x27;ve been using my dumbphone again this year, and because I don&#x27;t have a lot of separate tasks and appointments anymore, I&#x27;m gravitating towards the BuJo method again.
In parallel to bullet journaling, I plan to rely heavily on org mode to provide me with the tools to stay on track, in college and at work.&lt;&#x2F;p&gt;
&lt;p&gt;I hope you found this insightful and will look up some of the methods or tools discussed.
If you use some drastically different system, perhaps one that emphasises notes (e.g. Notion, Obsidian), I&#x27;d love to hear about it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Clojure: 6 months later</title>
          <pubDate>Fri, 24 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/clojure/</link>
          <guid>https://port19.xyz/tech/clojure/</guid>
          <description xml:base="https://port19.xyz/tech/clojure/">&lt;h1 id=&quot;not-everything-is-a-nail&quot;&gt;
Not everything is a nail&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;background-projects&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#background-projects&quot; aria-label=&quot;Anchor link for: background-projects&quot;&gt;🔗&lt;&#x2F;a&gt;

Background &amp;amp; Projects&lt;&#x2F;h2&gt;
&lt;p&gt;Half a year ago, after spending about a month learning haskell, I eventually switched to clojure because I had trouble actually making programs with it.
I picked up the language quite quickly, largely thanks to that previous exposure to functional programming, but also because &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.braveclojure.com&#x2F;clojure-for-the-brave-and-true&#x2F;&quot;&gt;clojure for the brave and the true&lt;&#x2F;a&gt; is awesome.
After reading the first couple of chapters I jumped into my first project and reimplemented the ranking logic of a discord bot I had used more than a year prior for clash royale clan management.
Then I wrote a dvd-animation with quil, a 2D graphics library.
I even did my best to keep up with advent of code, doing the first week and documenting it via orgmode.
Then things slowed down and after &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;port19x&#x2F;redqu&quot;&gt;redqu&lt;&#x2F;a&gt;, a reddit rss media scraper leveraging babashka, I only published some template repo and did some stuff on codewars I guess.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-m-not-a-programmer&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#i-m-not-a-programmer&quot; aria-label=&quot;Anchor link for: i-m-not-a-programmer&quot;&gt;🔗&lt;&#x2F;a&gt;

I&#x27;m not a programmer&lt;&#x2F;h2&gt;
&lt;p&gt;Then, last weekend, it hit me.
It was something so obvious and important, yet obscured by my tunnel vision on functional programming:
&lt;em&gt;I&#x27;m primarily a sysadmin.&lt;&#x2F;em&gt;
The programs I write are short and achieve simple goals.
They are used through the terminal and often use network connections.
They run and then they exit.
I&#x27;m not a &quot;software developer&quot;, building large applications that run on some server for all eternity.
Me being decent at coding is merely an accident, and should no longer stop me from growing the relevant skills for administration.
This alone made me discard clojure as a viable language, but further problems with it quickly became obvious.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;application-domains&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#application-domains&quot; aria-label=&quot;Anchor link for: application-domains&quot;&gt;🔗&lt;&#x2F;a&gt;

Application domains&lt;&#x2F;h2&gt;
&lt;p&gt;One of the primary problems that frustrated me throughout my clojure journey was its platform.
My scripts run ad-hoc, remember? Why the heck would I want a jvm or javascript platform for those.
Ideally, I could just distribute a binary, which is possible if you spend an evening setting up graalvm and praying that stuff works, but it&#x27;s clearly not intended.
And even an interpreter, like babashka, only solves half of the problem. With babashka I can run stuff more easily, but if I actually want to distribute my application, I have to tell people to install some very obscure dependency, that is far from being included in most linux distros repositories.&lt;&#x2F;p&gt;
&lt;p&gt;Another problem is clojures poor fitness for CLI applications.
Parsing arguments... does not spark joy.
Sure, it&#x27;s doable and it&#x27;s better than in many bad corporate languages of old, but it doesn&#x27;t remotely compete with the default admin languages that I&#x27;ll mention later.
And forget about terminal user interfaces.
There exists a gum wrapper for babashka, but at that point you might as well leave.&lt;&#x2F;p&gt;
&lt;p&gt;Now another domain I like to toy around with on occasion is 2D graphics.
And quil is actually somewhat usable for that, and probably a really good library if you want to create generative art.
But for games it&#x27;s lackluster at best, because thanks to how clojure and functional programming works, managing state is a huge chore.
This is hardly quils fault, but noteworthy enough for me to include it.&lt;&#x2F;p&gt;
&lt;p&gt;So since clojure is a hosted language that&#x27;s hard to distribute, is mediocre at networking and cli apps as well as being not great at 2D graphics, I&#x27;m moving on.
I&#x27;ll miss my pipes, my higher order functions, multi-arity and the repl, but they are all sacrifices I&#x27;m willing to make to have a language that is actually good at the things I&#x27;m trying to do.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-what-now&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#so-what-now&quot; aria-label=&quot;Anchor link for: so-what-now&quot;&gt;🔗&lt;&#x2F;a&gt;

So what now?&lt;&#x2F;h2&gt;
&lt;p&gt;Well, first of all, I&#x27;ll be shifting some focus away from programming to infrastructure administration.
For that purpose I opened an account with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;m.do.co&#x2F;c&#x2F;e3fad703cc9b&quot;&gt;digital ocean&lt;&#x2F;a&gt; and started playing with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.ansible.com&#x2F;ansible&#x2F;latest&#x2F;getting_started&#x2F;index.html&quot;&gt;ansible&lt;&#x2F;a&gt;, which I plan on continuing.
Some things I plan on setting up on that VPS through ansible:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;security hardening&lt;&#x2F;li&gt;
&lt;li&gt;firewall&lt;&#x2F;li&gt;
&lt;li&gt;web server, preferably nginx&lt;&#x2F;li&gt;
&lt;li&gt;monitoring, preferably with prometheus and grafana&lt;&#x2F;li&gt;
&lt;li&gt;a git server&lt;&#x2F;li&gt;
&lt;li&gt;docker&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;In terms of programming languages: Shell, Go, Python, in that order.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Shell is perfect for automation of system tasks and a must have for linux users.&lt;&#x2F;li&gt;
&lt;li&gt;Go is by far the best for terminal user interfaces, while also being awesome at network programming and capable at 2D graphics with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ebitengine.org&#x2F;&quot;&gt;ebiten&lt;&#x2F;a&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;Python has by far the most libraries, is best at webscraping and is also pretty good with networks and automation.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Clojure is perhaps the best programming language out today in terms of good language design and power.
But even with the best hammer I had to realize at some point that not everything is a nail.
I&#x27;ll keep you guys updated on further developments, especially once the VPS is set up with most of the things mentioned above.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Overcoming the bullshit job fallacy</title>
          <pubDate>Fri, 17 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/bullshit-job-fallacy/</link>
          <guid>https://port19.xyz/lifestyle/bullshit-job-fallacy/</guid>
          <description xml:base="https://port19.xyz/lifestyle/bullshit-job-fallacy/">&lt;h1 id=&quot;earn-to-give-and-finding-purpose-in-it&quot;&gt;Earn to Give, and finding purpose in IT&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;background&quot;&gt;Background&lt;&#x2F;h2&gt;
&lt;p&gt;As a student studying computer science in his third semester, I&#x27;ve had my fair share of setbacks and subsequent doubts regarding my career choice.
I won&#x27;t go into detail on the challenges I face, since I&#x27;ve already aired out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;lifestyle&#x2F;frustrations-with-college&#x2F;&quot;&gt;my frustrations with college&lt;&#x2F;a&gt; in a different article.
What I want to do today is dispel a lie I tend to tell myself whenever things get tough.
The lie goes something like this: &quot;You won&#x27;t make any positive impact on society as a programmer&#x2F;sysadmin. Become a &lt;em&gt;&amp;gt;insert social job here&amp;lt;&lt;&#x2F;em&gt; instead, that job makes sense and helps people.&quot;
Let me, for your amusement, list some of the jobs I&#x27;ve considered in such times of adversity: Nurse, prison guard, mortician, roofer, plumber.
Don&#x27;t get me wrong, every one of these jobs has self-evident purpose and wouldn&#x27;t be pointless to pursue.
But taking into account my large sunk cost in IT and my overall better fitness to this technical field, it quickly becomes a silly daydream.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;bullshit-jobs&quot;&gt;Bullshit Jobs&lt;&#x2F;h2&gt;
&lt;p&gt;The idea of a bullshit job, in it&#x27;s most narrow definition, is a job that is completely superfluous and achieves nothing.
Think receptionists, corporate lawyers, telemarketers, diversity managers and most middle management.
Problems arise when you extrapolate and extend the idea to encompass any job that contributes nothing to society at large.
Such an exaggeration quickly turns into a fruitless critique of modernity and capitalism.
Sure, the entire field of marketing has a large net-negative impact on society, but they do achieve something.
It would be equally ridiculous to dismiss the entire IT industry just because facebook spies on it&#x27;s users.
&lt;em&gt;If you find yourself in a job with net negative impact, as opposed to a net zero impact, you don&#x27;t have a bullshit job, you have a bullshit employer.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;earn-to-give&quot;&gt;Earn to Give&lt;&#x2F;h2&gt;
&lt;p&gt;Now let me introduce you to the concept of &lt;em&gt;Earn to Give&lt;&#x2F;em&gt;.
I&#x27;ve stumbled upon it on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;80000hours.org&#x2F;career-reviews&#x2F;earning-to-give-in-a-high-paying-role&#x2F;&quot;&gt;80000hours&lt;&#x2F;a&gt;, but in hindsight I&#x27;m a bit embarrassed to not have thought of this much sooner.
The idea acknowledges that each social worker has some positive social impact, but notes that a high paying job can yield an even higher net-positive impact.
This gives an alternative path to meaningful contribution for those of us who are better suited to a job that happens to pay well.
Practitioners will consistently donate a large portion, often 10% or more, of their net income to charity. &lt;br &#x2F;&gt;
Let&#x27;s face it: As a programmer or sysadmin I&#x27;ll likely be payed a handsome check and since I&#x27;m already donating about 5% of my net-income each month as a student it will be trivial to scale up.&lt;&#x2F;p&gt;
&lt;p&gt;At this point I&#x27;d like to encourage you to throw a couple of bucks to maintainers of open source software you use, especially if their product would be hard for you to replace.
Additionally, I find the following nonprofits to be particularly valuable:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;darebee.com&#x2F;&quot;&gt;darebee&lt;&#x2F;a&gt;: a creative commons fitness website&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.eff.org&#x2F;&quot;&gt;the electronic frontier foundation&lt;&#x2F;a&gt;: free software foundation, but competent&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;signalfoundation.org&#x2F;&quot;&gt;the signal foundation&lt;&#x2F;a&gt;: the only realistic whatsapp competitor \&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I hope you found this insightful and that, should you face similar challenges, you at least come up with better excuses for your lack of perseverance.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Farewell Qutebrowser</title>
          <pubDate>Tue, 14 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/bye-qutebrowser/</link>
          <guid>https://port19.xyz/tech/bye-qutebrowser/</guid>
          <description xml:base="https://port19.xyz/tech/bye-qutebrowser/">&lt;h1 id=&quot;notes-after-migrating-from-qutebrowser-to-librewolf&quot;&gt;
Notes after migrating from Qutebrowser to Librewolf&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;background&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#background&quot; aria-label=&quot;Anchor link for: background&quot;&gt;🔗&lt;&#x2F;a&gt;

Background&lt;&#x2F;h2&gt;
&lt;p&gt;So for the past 2 years I&#x27;ve been using Qutebrowser to browse the web, sponsoring the project for the past year.
It&#x27;s the best keyboard-driven browser currently in existence and is very actively maintained.
I originally switched to Qutebrowser back when I first learned about tiling window managers and wanted to use my keyboard for more and more things.
What now urged me to reconsider this browser choice was the continued lack of per-site cookie persistence in Qutebrowser.
This resulted in me having to log into every account (except discord for some reason) on each new browser session.
And since some issues with hand pain have resurfaced recently, repetitive unnecessary keystrokes are the last thing I need right now.
Librewolf has been my secondary browser for a while, being well known for it&#x27;s state of the art security and privacy.
Librewolf is basically a heavily patched Firefox and is what you&#x27;d get after configuring Firefox for privacy for a week.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mouse-keyboard&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#mouse-keyboard&quot; aria-label=&quot;Anchor link for: mouse-keyboard&quot;&gt;🔗&lt;&#x2F;a&gt;

Mouse &amp;gt; Keyboard&lt;&#x2F;h2&gt;
&lt;p&gt;In text editors it makes sense to have a keyboard-driven interface.
This is due to the nature of text editing: you primarily insert text, occasionally correcting mistakes, copying and pasting parts and moving around your body of text.
Web Browser are different: Your involvement is a lot more passive. You primarily navigate the web and only occasionally answer short text-prompts and rarely write longer content.
Using a two-handed input device provides no benefit for this activity.
It&#x27;s a lot simpler, a lot more precise to use some pointing device like a mouse, or a track point.
With minimal practice you can even switch hands.
I sometimes browse the web with my left hand when I&#x27;m experiencing hand pain from long typing sessions.
But the ergonomics go further than just halving the amount of required hands:
Mice buttons have a shorter travel distance and a lighter actuation weight than most keyboards.
Mice are shaped to fit and support your palm, or at least not require the hovered hands that constitute correct typing form.
They are lighter and allow for a wider, more natural range of motion.
I may go into more depth on the ergonomics of mice in a separate article, but you get the broad picture.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;accessibility&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#accessibility&quot; aria-label=&quot;Anchor link for: accessibility&quot;&gt;🔗&lt;&#x2F;a&gt;

Accessibility&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;uBlock Origin:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
Librewolf supports addons and therefore provides true, state of the art adblocking via uBlock Origin.
This is vastly superior to brave style adblocking provided to Qutebrowser by python-adblock.
Additionally, uBlock Origin provides optional filters to hide cookie banners and let&#x27;s you control what javascript gets executed.
Many people dismiss Qutebrowser on this merit alone, but since I mostly browse high-quality websites it was tolerable.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Dark Reader:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
Most of the web is stuck in light mode, which contributes greatly to eye strain.
The Dark Reader extension helps with that in ways Qutebrowser simply can&#x27;t.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Reader View:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
Reader View shows only the content you care about and provides a better interface to read most articles posted on the web by content factories that inevitably float to the top of search results.
This greatly reduces visual noise and allows me to waste less focus while consuming web content.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;quality-of-life&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#quality-of-life&quot; aria-label=&quot;Anchor link for: quality-of-life&quot;&gt;🔗&lt;&#x2F;a&gt;

Quality of Life&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Tabliss:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
A new-tab extension that is pretty easy to set up.
To be fair, you could set up something equivalent in Qutebrowser by using a proper webpage for such a task.
Bento is one project that comes to mind and has been on my bucket list for a while.
Well, tabliss is a lot more accessible and involves 0 code, so I&#x27;ll take that over Bento any day.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Auto-hiding Tab Bar on full screen:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
On Qutebrowser I had a key binding to hide both the status bar as well as the url bar for when I was reading something or just didn&#x27;t need it for a while.
On Librewolf, when I fullscreen the window, the tab bar automatically hides itself and reveals itself again when I hover near the top of the screen.
This is peak ux.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Content aware screenshots:&lt;&#x2F;strong&gt; &lt;br &#x2F;&gt;
When you screenshot something in Librewolf, it automatically shows you selectable regions while hovering across the page.
Since you often want to capture exactly one paragraph or one div or some other form of content container, this is immensely helpful and marginally improves the quality of your screenshots.
Qutebrowser doesn&#x27;t even do screenshots on it&#x27;s own!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;privacy-and-security&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#privacy-and-security&quot; aria-label=&quot;Anchor link for: privacy-and-security&quot;&gt;🔗&lt;&#x2F;a&gt;

Privacy and Security&lt;&#x2F;h2&gt;
&lt;p&gt;While many care little about privacy, I&#x27;ve been going above and beyond to harden my security and minimize my digital footprint.
Having suboptimal browser privacy was in stark contradiction to this, as the web browser covers the majority of your datas surface area, especially on desktop computers.
I can now rest assured that I have state of the art protection that is more in line with the drastic precautions I take in other areas of my digital life, such as using a feature phone and closing old accounts among other robust opsec habits.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;farewell&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#farewell&quot; aria-label=&quot;Anchor link for: farewell&quot;&gt;🔗&lt;&#x2F;a&gt;

Farewell&lt;&#x2F;h2&gt;
&lt;p&gt;So to round things off: Is Qutebrowser a good browser? Yes, for sure.
It is by far the best keyboard-driven web browser released today and has one of the most competent and active maintainers I&#x27;ve seen in any open source project.
It is great for the specific target audience it caters to.
It&#x27;s just that now I no longer fit into that target audience and am glad to have adopted a different product that caters to my needs.
I hope you found this piece insightful and gained some appreciation for the tools at your disposal.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Performance is a Software Problem</title>
          <pubDate>Sun, 12 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/performance-software/</link>
          <guid>https://port19.xyz/tech/performance-software/</guid>
          <description xml:base="https://port19.xyz/tech/performance-software/">&lt;h1 id=&quot;how-my-pinebook-pro-is-faster-than-your-m1-mac&quot;&gt;
How my pinebook pro is faster than your m1 mac&lt;&#x2F;h1&gt;
&lt;p&gt;Let me open this post with an anecdote:
About half a year ago, after a lot of hype surrounding the product, I got curious and bought an entry level m1 macbook air.
I unwrapped the immaculate packaging, connected it to the power and booted it up.
After some initial setup, I installed homebrew and got my suite of applications installed.
Since I like tiling window managers, I installed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ianyh&#x2F;Amethyst&quot;&gt;amethyst&lt;&#x2F;a&gt;, tho &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;koekeishiya&#x2F;yabai&quot;&gt;yabai&lt;&#x2F;a&gt; is another great option.
I played around for a few hours, trying to replicate my linux environment, to get the mac feeling snappy.
Eventually I gave up, repackaged the mac again, and refunded it the next day, returning to my linux setup on the pinebook pro.&lt;&#x2F;p&gt;
&lt;p&gt;Another anecdote:
About one year ago, as you might know from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;emacs&#x2F;&quot;&gt;my&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;emacs1y&#x2F;&quot;&gt;other&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;neovim-customization&#x2F;&quot;&gt;writings&lt;&#x2F;a&gt;, I switched to emacs.
I put as much of my desktop usage as possible into it and eventually figured that, since I used emacs for everything, I could switch back to some entry level linux distro, like linux mint.
This was on a beefy tower PC: Ryzen 7 3700x CPU, Vega 64 GPU, nvme SSD and 16 gigabytes of RAM.
Despite the PCs power, the environment felt heavy and even sluggish at times.
After a few weeks, I switched back to arch linux.&lt;&#x2F;p&gt;
&lt;p&gt;Now there are a few obvious limitations to my thesis that I want to acknowledge.
No, I can&#x27;t play 3D games like Rise of the Tombraider on my current laptop, the tuxedo aura 15, much less at 4k.
No, the pinebook pro will not play minecraft as the tuxedo aura will.
Transcoding stuff and compiling software does scale with raw processing power.
And I&#x27;m sure even some heavy websites might be slower to load on the pinebook pro.&lt;&#x2F;p&gt;
&lt;p&gt;This however says little about general responsiveness.
Just like you should choose an SSD based on random reads instead of sequential bandwidth,
you should measure your computers speed, it&#x27;s snappiness if you will, in latency and not in throughput.
It does not matter to me whether ffmpeg takes 5 or 50 seconds to transcode an hour long m4a to mp3,
I do not care if recompiling my emacs packages takes 2 minutes or 20.
Either way I&#x27;m afk making a tea, or maybe I&#x27;m just switching to my web browser and continuing my work there for a few minutes.
As long as you&#x27;re not a gamer, or you can appreciate retro games, performance is no reason to buy a new or even recent computer.&lt;&#x2F;p&gt;
&lt;p&gt;So what can you do in software to speed things up?
Disable animations, or at least make them very fast.
If I&#x27;m switching windows I don&#x27;t wanna wait 200 milliseconds for some animation.
Decrease your number of background processes as much as possible.
Cups and bluez do not need to be running all the time.
Start more systemd services on-demand to decrease resource consumption and possibly avoid a couple of rare bugs along the way.
Build your own &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Desktop_environment#Custom_environments&quot;&gt;desktop environment&lt;&#x2F;a&gt; by handpicking the applications you run and installing only what you need on top of a minimal base.
This alone should be enough to turn even 15 year old business laptops, like a thinkpad x200, into capable workhorses again.
Two bonus tips: Use wayland if you can, it&#x27;s always xorg that&#x27;s &quot;slow&quot;, never the window manager.
And keep your computer on for longer, or use hibernate, so that the linux caching systems can do their job.&lt;&#x2F;p&gt;
&lt;p&gt;With all that being said, I hope you&#x27;ll now think twice before buying new, expensive hardware.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Cold Shower Review</title>
          <pubDate>Sat, 11 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/cold-shower-review/</link>
          <guid>https://port19.xyz/lifestyle/cold-shower-review/</guid>
          <description xml:base="https://port19.xyz/lifestyle/cold-shower-review/">&lt;p&gt;&lt;em&gt;tldr: very worth it&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;So after many months of this rotting on my bucket list and the many contrast showers I had taken in the past, yesterday I finally took a proper cold shower.
To get the terminology out of the way: A contrast shower is when you start the shower hot and end it cold, possibly flicking back and forth between the two a few times.
A cold shower means turning the handle all the way to it&#x27;s coldest setting before jumping in.&lt;&#x2F;p&gt;
&lt;p&gt;My cold shower went like this: I hyped myself up for a few minutes, unsure of what would await me.
Then I got into the shower, and took several deep breaths before turning on the cold water.
It was a big shock, haven&#x27;t felt this much adrenaline in months, I breathed fast and heavily.
After what must have been 20 seconds, after my whole body was wet, the initial shock cooled down &lt;em&gt;(pun intended)&lt;&#x2F;em&gt;, my breath stabilized and I could think clearly again.
I stayed in the shower for another 3 minutes, taking in this meditative experience and giving into the cold.&lt;&#x2F;p&gt;
&lt;p&gt;After having turned the shower off, while drying myself, I couldn&#x27;t help but laugh.
I can&#x27;t overstate the intensity of this experience, I haven&#x27;t felt so alive in months.
I did not worry about the future or think about the past, I was just present and happy.
And that was just the mental side, my body felt like it was wrapped in an aura of purity and cold, like I was wearing some magical armor, like all my cells had died and been reborn. I felt invincible.
In the minutes that followed, the intensity of my experience decreased, and gave way to a deep feeling of peace.
When I went to bed a few minutes later, I fell asleep right away.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;You can do it too&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re afraid, great, that&#x27;s the point, everyone is. &lt;br &#x2F;&gt;
Read up on this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;reddit.com&#x2F;r&#x2F;coldshowers&#x2F;comments&#x2F;eyoiol&#x2F;faq_read_this_thread_if_you_are_new_to_cold&#x2F;&quot;&gt;FAQ&lt;&#x2F;a&gt; and then just do it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Reviewing all Terminal Emulators</title>
          <pubDate>Mon, 06 Feb 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/terminals/</link>
          <guid>https://port19.xyz/tech/terminals/</guid>
          <description xml:base="https://port19.xyz/tech/terminals/">&lt;h1 id=&quot;not-all-terminals-are-created-equally&quot;&gt;
Not all Terminals are created equally&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;consider-the-native-one-first&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#consider-the-native-one-first&quot; aria-label=&quot;Anchor link for: consider-the-native-one-first&quot;&gt;🔗&lt;&#x2F;a&gt;

Consider the native one first&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re using a full desktop environment like gnome or kde, using the builtin terminal might be a good starting point.
That way you get consistent themeing out of the box and benefit from a consistent user experience.
These terminals are pretty basic, but they get the job done.
If you use the terminal often or even &quot;live in the terminal&quot;, consider a more sophisticated product.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;special-purpose-terminals&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#special-purpose-terminals&quot; aria-label=&quot;Anchor link for: special-purpose-terminals&quot;&gt;🔗&lt;&#x2F;a&gt;

Special purpose terminals&lt;&#x2F;h2&gt;
&lt;p&gt;If you, for whatever reason, like suckless software and believe that patching source code is an acceptable way of configuring software, use st.
The suckless terminal st, will take the least disk space and lacks basic functionality out of the box, making it very attractive to the average suckless enthusiast.&lt;&#x2F;p&gt;
&lt;p&gt;If you use wayland and want &quot;speed&quot; above all else, you can&#x27;t beat foot. The foo terminal.
Foot has the lowest latency of any terminal I&#x27;ve tested.&lt;&#x2F;p&gt;
&lt;p&gt;If neither of those two are appealing to you, but you own an nvidia or arm gpu, consider some old terminal.
Test the gpu accelerated options and compare speeds with those old terminals.
Depending on how bad the drivers are, urxvt might be a better choice than the following options.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;intermezzo-how-to-benchmark-terminals&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#intermezzo-how-to-benchmark-terminals&quot; aria-label=&quot;Anchor link for: intermezzo-how-to-benchmark-terminals&quot;&gt;🔗&lt;&#x2F;a&gt;

Intermezzo: How to benchmark terminals&lt;&#x2F;h2&gt;
&lt;p&gt;This is often subject to controversial debates. Below I&#x27;ll give you some benchmarks I use. &lt;br &#x2F;&gt;
How fast the terminal feels is more important than these metrics anyway. &lt;br &#x2F;&gt;
Also consider &lt;code&gt;hyperfine&lt;&#x2F;code&gt; for multi-run benchmarks. \&lt;&#x2F;p&gt;
&lt;p&gt;Graphical throughput: &lt;code&gt;time ( tree &#x2F; )&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Redirection: &lt;code&gt;time ( find &#x2F; -type f -iname &quot;*.md&quot; 2&amp;gt; &#x2F;dev&#x2F;null; )&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Latency: &lt;code&gt;time ( ls )&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Images: &lt;code&gt;time ( wezterm imgcat sample.jpg)&lt;&#x2F;code&gt; or equivalent&lt;&#x2F;p&gt;
&lt;h2 id=&quot;gpu-accelerated-terminals&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#gpu-accelerated-terminals&quot; aria-label=&quot;Anchor link for: gpu-accelerated-terminals&quot;&gt;🔗&lt;&#x2F;a&gt;

GPU accelerated terminals&lt;&#x2F;h2&gt;
&lt;p&gt;GPU accelerated terminals have been hyped up for a while now.
Alacritty has been hyped because of the rust hype but with it&#x27;s two competitors I can&#x27;t in good conscience recommend it.
The speed debate between alacritty and kitty is childish at best.
Pay as little attention to it as you can.&lt;&#x2F;p&gt;
&lt;p&gt;Kitty is a neat terminal with an image viewer and some other small utilities like a diff viewer.
Kitty is pretty fast and has the highest graphical bandwidth&#x2F;throughput I&#x27;ve tested.
The kitty dev however is pretty delusional and rude, so don&#x27;t choose this one if you&#x27;re the kind of person that tries to contribute upstream.&lt;&#x2F;p&gt;
&lt;p&gt;My favorite terminal then is wezterm.
Wezterm is incredibly feature rich, supporting 3 image protocols, asciinema recording and shipping with hundreds of themes.
It&#x27;s configured in lua, giving it some hypothetical programmability.
Wezterm imgcat is about 10x faster than kitty icat, so if you regularly use the terminal as an image viewer, I recommend you use wezterm.
Wezterm, once you disable the tab bar, isn&#x27;t noticeably slower than kitty or alacritty in my testing.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;simplified-decision-tree&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#simplified-decision-tree&quot; aria-label=&quot;Anchor link for: simplified-decision-tree&quot;&gt;🔗&lt;&#x2F;a&gt;

Simplified decision tree&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;Do you use a desktop environment? → Use the native terminal&lt;&#x2F;li&gt;
&lt;li&gt;Do you enjoy suckless software? → Use st&lt;&#x2F;li&gt;
&lt;li&gt;Do you use wayland? → Use foot&lt;&#x2F;li&gt;
&lt;li&gt;Do you have bad gpu drivers? → Use urxvt&lt;&#x2F;li&gt;
&lt;li&gt;Do you like a featureful experience? → Use wezterm&lt;&#x2F;li&gt;
&lt;li&gt;Do you want gpu acceleration but can&#x27;t afford 100MB of disk space? → Flip a coin&lt;&#x2F;li&gt;
&lt;li&gt;Heads → Use kitty&lt;&#x2F;li&gt;
&lt;li&gt;Tails → Use alacritty&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>💻 Neovim customization is inexcusably bad</title>
          <pubDate>Fri, 27 Jan 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/neovim-customization/</link>
          <guid>https://port19.xyz/tech/neovim-customization/</guid>
          <description xml:base="https://port19.xyz/tech/neovim-customization/">&lt;h1 id=&quot;and-i-though-emacs-was-complicated&quot;&gt;
And I though Emacs was complicated&lt;&#x2F;h1&gt;
&lt;p&gt;In my previous post I looked back on one year of Emacs and it&#x27;s occasional sluggishness, announcing I would try to move to Neovim once more.
Today I want to give an update on how said attempted migration is coming along: it&#x27;s pretty bad.
I would have preferred customizing my Neovim in lua, but gave up after about two hours of every single plugin being documented for setup in an init.vim file instead.
Don&#x27;t even get me started with the possibility of using fennel (a lisp that compiles to lua) to configure it.
That would turn following documentation into a two step translation process.&lt;&#x2F;p&gt;
&lt;p&gt;After a bit of frustration, I threw my legacy Neovim config to the side and just started a new one from scratch.
After discovering and following an old blog post by the Conjure developer I was able to get a good Clojure environment going quite quickly.
So here I am after two days of hacking away at my config. With an awesome Clojure environment but nothing else.
There is no illusion left in me that Neovim is extensible in the way Emacs is.
There just is no substitute for &lt;code&gt;describe-variable&lt;&#x2F;code&gt; and &lt;code&gt;describe-function&lt;&#x2F;code&gt;, which I underappreciated before but drastically help with configuring.
Lisplessness is more of an ideological issue I guess, but I do feel the trade-off of not configuring Neovim in my programming language of choice.&lt;&#x2F;p&gt;
&lt;p&gt;Let me approach configuration and extensibility from another angle: What is Neovim?
At it&#x27;s core, Neovim is a set of keybindings. Any plugin system or configuration is a clear afterthought.
You wouldn&#x27;t use Nano as a text editor if it came with plugins either.
Emacs on the other hand is designed from the ground up to be extensible.
This shows not only in the self-documenting nature of &lt;code&gt;describe-*&lt;&#x2F;code&gt;, it shows in the way it treats windows and frames.
It shows in the way it handles buffers, minor- and major modes.&lt;&#x2F;p&gt;
&lt;p&gt;To give a concrete example of where true extensibility is useful: In Emacs I use a org-mode hook to start a 25 minute timer whenever I clock-in on some outline.
This is not just unrealistic in Neovim, this statement is likely incomprehensible to anyone who has not looked into Emacs or org-mode.
The fact that I can just set up a hook for something and execute arbitrary code from there is powerful and it&#x27;s only scratching the surface.
Emacs might have a steeper learning curve than Neovim, but in return you get a far higher skill ceiling.&lt;&#x2F;p&gt;
&lt;p&gt;A few days ago I mentioned in an online exchange that if Neovim is a text editor then Emacs must be an office suite.
This analogy feels more and more suitable as I try to make Neovim do even basic things.
Calling Emacs an operating system is going a bit far, as it lowkey sucks at handling media or browsing the web, but it sure does a whole lot of the things Microsoft sells as components in an office suite.
Emacs is a coherent environment empowering you to use it&#x27;s vast toolset. Meanwhile Neovim is nothing but one tool.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps my whole frustration with the occasional sluggishness of Emacs was foolish.
There may very well be aspects in it&#x27;s architecture that slow it down, but more significantly it just does a whole lot more than Neovim.
Let me reiterate my prior point: Neovim is primarily a set of keybindings. To make something so simple be slow would be an embarrassment.
I want and need a whole lot more than just some keybindings to do what I do effectively.&lt;&#x2F;p&gt;
&lt;p&gt;Suffice to say I&#x27;m going back to Emacs.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Emacs: One year later</title>
          <pubDate>Sun, 15 Jan 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/emacs1y/</link>
          <guid>https://port19.xyz/tech/emacs1y/</guid>
          <description xml:base="https://port19.xyz/tech/emacs1y/">&lt;h1 id=&quot;a-love-hate-relationship&quot;&gt;
A love-hate Relationship&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;brief-history&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#brief-history&quot; aria-label=&quot;Anchor link for: brief-history&quot;&gt;🔗&lt;&#x2F;a&gt;

Brief history&lt;&#x2F;h2&gt;
&lt;p&gt;On the 7th of January 2022 I decided to install Doom Emacs.
I toyed with the basics that night and continued to do so the next day.
After two months, I wrote a first blog post on it. That being the oldest post hosted on this site today &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;port19.xyz&#x2F;tech&#x2F;emacs&#x2F;&quot;&gt;(check it out)&lt;&#x2F;a&gt;.
I stayed on Emacs for a while, switched back to Neovim for a few months and then came back again.
I even wrote my first scientific paper in some org-latex hybrid.
Orgmode, not Emacs, has given me great power which comes with great responsibility that I&#x27;m getting tired off.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reasons-to-love-emacs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#reasons-to-love-emacs&quot; aria-label=&quot;Anchor link for: reasons-to-love-emacs&quot;&gt;🔗&lt;&#x2F;a&gt;

Reasons to love Emacs&lt;&#x2F;h2&gt;
&lt;p&gt;When people talk about Emacs, they often mention some &quot;killer features&quot;. Here are mine:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;magit&quot;&gt;
Magit&lt;&#x2F;h3&gt;
&lt;p&gt;Magit is a git client that empowers you greatly.
It&#x27;s different from any other git client I have seen or used previously.
Magit doesn&#x27;t dumb things down for you, but rather empowers you and shows you options you might not have known to exist.
Magit makes large rebases about twice as fast and half as daunting. It&#x27;s the best way to interact with git and will make you better at git, even if you revert to using the command line.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;orgmode&quot;&gt;
Orgmode&lt;&#x2F;h3&gt;
&lt;p&gt;Orgmode is a major mode and document format that has about as many features as my entire linux setup combined.
Markdown, tables, executable code blocks are all neat.
Rich export options make my life a lot easier.
Basic outlining and outline folding is great and makes plain text documents scalable to dozens of kilobytes.
Todo, scheduling and agenda are kinda meh compared to something like a bullet journal or smartphone productivity setup, but are nice to have, especially for project management.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lisp&quot;&gt;
Lisp&lt;&#x2F;h3&gt;
&lt;p&gt;Lisp support also makes the list. The overwhelming majority of lisp programmers use Emacs.
This is not very surprising, seeing as Emacs is primarily an elisp interpreter that has a long history within the lisp family of languages.
Clojure has been my primary programming language for some time now. Using Doom Emacs made the transition a lot easier than it could have been otherwise.&lt;&#x2F;p&gt;
&lt;p&gt;Other notable things: rapid theme switching, elfeed (rss), erc (irc)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;reasons-to-hate-emacs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#reasons-to-hate-emacs&quot; aria-label=&quot;Anchor link for: reasons-to-hate-emacs&quot;&gt;🔗&lt;&#x2F;a&gt;

Reasons to hate Emacs&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;it-s-slow-it-just-is&quot;&gt;
It&#x27;s slow. It just is&lt;&#x2F;h3&gt;
&lt;p&gt;Compared to Neovim, and especially it&#x27;s gpu accelerated frontends like Neovide, Emacs feels sluggish.
Doom Emacs ameliorates this, but it&#x27;s really emacs-nativecomp with ahead of time compilation that makes Emacs tolerable.
But you still feel the slowness on many occasions.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;it-s-large-very-large&quot;&gt;
It&#x27;s large, very large&lt;&#x2F;h3&gt;
&lt;p&gt;My &lt;code&gt;~&#x2F;.config&#x2F;emacs&lt;&#x2F;code&gt;, where Doom is installed, is 490 megabytes large.
For reference, this is 90% of my &lt;code&gt;~&#x2F;.config&lt;&#x2F;code&gt; with another 9% being used by signal-desktop, an electron app.
Coupled with native compilation of that whole setup taking a few minutes, this significantly increases my recovery time from backups.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;it-s-a-shaky-foundation-that-is-going-downhill&quot;&gt;
It&#x27;s a shaky foundation that is going downhill&lt;&#x2F;h3&gt;
&lt;p&gt;Since emacs is very old, it has enjoyed a massive first movers advantage.
I&#x27;m sure that when it was first released in 1976, it was superior to anything else at the time.
For reference, the same year vi was released.
Since then emacs has certainly improved. Slowly and steadily.
&quot;Killer features&quot; chose emacs as their platform of choice.
But...&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-competition-has-catched-up&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-competition-has-catched-up&quot; aria-label=&quot;Anchor link for: the-competition-has-catched-up&quot;&gt;🔗&lt;&#x2F;a&gt;

The competition has catched up&lt;&#x2F;h2&gt;
&lt;p&gt;It&#x27;s not 1976 anymore. I&#x27;m writing this article in 2023.
Vi got superseded by Vim in 1991.
Vim got then superseded by Neovim in 2015.
A vast package selection exists today for Neovim. Even a few attempting the herculean task that is porting Orgmode&lt;&#x2F;p&gt;
&lt;p&gt;Emacs users have largely given up on the foundations of the editor, staying either because of sunk cost, ideological alignment with lisp or because they are bound by one of the few killer features. People use evilmode because they know that vim keybindings are vastly superior. They use distributions like Doom to make Emacs be Neovim when it was never meant to be.
I&#x27;m on emacs today because of Orgmode and this has never been different.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-do-we-go-from-here&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#where-do-we-go-from-here&quot; aria-label=&quot;Anchor link for: where-do-we-go-from-here&quot;&gt;🔗&lt;&#x2F;a&gt;

Where do we go from here&lt;&#x2F;h2&gt;
&lt;p&gt;As part of my vacation I have planned to try a move back to Neovim, tho keeping around my emacs install just in case and to write my next paper in.&lt;&#x2F;p&gt;
&lt;p&gt;Conjure on Neovim has great Clojure support and it&#x27;s UX suits me even better than cider on emacs. I tried it today to great success.&lt;&#x2F;p&gt;
&lt;p&gt;Nvim-orgmode on the other hand isn&#x27;t very promising, as it&#x27;s reducing Orgmode to some markdown plus Todo and scheduling.
So for Orgmode I&#x27;ll just have to slowly wean myself off of it.&lt;&#x2F;p&gt;
&lt;p&gt;Magit is neat, but very optional for me. I don&#x27;t rebase every day, I can deal with a time penalty for doing things with aliases on the command line.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;I may get that lean and fast environment once more. &lt;br &#x2F;&gt;
I only have to sacrifice this little bit of power. &lt;br &#x2F;&gt;
I shall make it, but it will take a while.&lt;&#x2F;em&gt; \&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Hardlinks are underrated</title>
          <pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/hardlinks/</link>
          <guid>https://port19.xyz/tech/hardlinks/</guid>
          <description xml:base="https://port19.xyz/tech/hardlinks/">&lt;h1 id=&quot;hardlinks-symlinks-stow-for-dotfiles&quot;&gt;
Hardlinks &amp;gt; Symlinks + Stow (for dotfiles)&lt;&#x2F;h1&gt;
&lt;p&gt;Let&#x27;s just get a quick overview over our options to duplicate files from A to B&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;&#x2F;th&gt;&lt;th&gt;Copy&lt;&#x2F;th&gt;&lt;th&gt;Hardlink&lt;&#x2F;th&gt;&lt;th&gt;Symlink&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Command&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;cp a b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ln a b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;ln -s a b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Storage requirement&lt;&#x2F;td&gt;&lt;td&gt;2a&lt;&#x2F;td&gt;&lt;td&gt;a&lt;&#x2F;td&gt;&lt;td&gt;a&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;b &quot;survives&quot; rm a&lt;&#x2F;td&gt;&lt;td&gt;y&lt;&#x2F;td&gt;&lt;td&gt;y&lt;&#x2F;td&gt;&lt;td&gt;n&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Copying is pretty straight forward, no surprises here. &lt;br &#x2F;&gt;
Symlinks are the go-to solution if you want to reference a file from somewhere else. &lt;br &#x2F;&gt;
It&#x27;s what makes my config files appear to be in &lt;code&gt;~&#x2F;.config&lt;&#x2F;code&gt; when they&#x27;re actually in &lt;code&gt;~&#x2F;dotfiles&lt;&#x2F;code&gt;. &lt;br &#x2F;&gt;
This happens via the usage of &lt;code&gt;stow&lt;&#x2F;code&gt;, an age old program for these sorts of things.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll probably replace my &lt;code&gt;stow&lt;&#x2F;code&gt; usage with self scripted hardlinks.&lt;br &#x2F;&gt;
The reason for this is twofold.&lt;br &#x2F;&gt;
I don&#x27;t want to clean up broken symlinks when I switch programs &#x2F; decide a config file doesn&#x27;t deserve a spot in the git repo.&lt;br &#x2F;&gt;
Second, I may actually want to have residual configuration. Let me elaborate.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s say I configure neofetch and put that into my git repo only to, after a few commits, realise that such a minor program with it&#x27;s unimportant config file doesn&#x27;t deserve a spot in my dotfiles repo.&lt;br &#x2F;&gt;
In that case I&#x27;d get rid of it in my dotfiles folder, leaving the broken symlink.&lt;br &#x2F;&gt;
Equally bad, the config is now lost. Or at least obscured in the git history.&lt;br &#x2F;&gt;
I&#x27;d much prefer to have it still lying around, taking up the kilobyte that it is taking up in my git history anyway.&lt;&#x2F;p&gt;
&lt;p&gt;Kinda sad that stow doesn&#x27;t come with a hardlink option :&#x2F;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Frustrations with college</title>
          <pubDate>Thu, 05 Jan 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/frustrations-with-college/</link>
          <guid>https://port19.xyz/lifestyle/frustrations-with-college/</guid>
          <description xml:base="https://port19.xyz/lifestyle/frustrations-with-college/">&lt;h1 id=&quot;don-t-study-cs-for-administration&quot;&gt;Don&#x27;t study CS for administration&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;i-m-not-a-software-developer&quot;&gt;I&#x27;m not a Software Developer&lt;&#x2F;h2&gt;
&lt;p&gt;So I, as some of my readers may know, am a dual student studying computer science in my 3rd semester.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m also a sysadmin. Someone who plays with infrastructure.
I&#x27;m not a software developer, despite coding as a hobby and finding that quite enjoyable.
I don&#x27;t even want to become a software developer either.
If by some magical circumstance I get offered a dream job writing clojure at cognitect or by an even more substantial miracle I get to live off donations received for my work on open source I wouldn&#x27;t reject the idea of coding as my primary job.
But I find general corporate software development and associated practices repulsive and wouldn&#x27;t want to consciously risk putting myself in such an environment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;computer-science-software-development&quot;&gt;Computer Science == Software Development&lt;&#x2F;h2&gt;
&lt;p&gt;Surely there are ways in which computer science is more akin to mathematics than to the practical art of software development.
Yet computer science in the way it is taught at the colleges we dual students go to in the bachelors program could hardly be more aligned to suit future software developers.
There are plenty of courses that are either clearly for improving ones fit for software development or don&#x27;t require much mental gymnastics to determine to be of potential use for said field.
Little to nothing I learn in college enriches me beyond some form of intellectual stimulation.
Little to nothing can or will be applied in my day-job as a sysadmin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;theory-practice&quot;&gt;Theory != Practice&lt;&#x2F;h2&gt;
&lt;p&gt;If the previous paragraph lead you to believe I was promoting a CS degree for software devs, think again.
Even software devs don&#x27;t gain that much from a degree &#x2F; college program.
Sure, you can construct use-cases for them much more easily, but at that point you just get a collection of courses applicable to narrow and rare sub-fields of software development or computer science.
Or, perhaps more frequently, you get taught basics in a very long winded and monotonous way.
Everyone that studies CS does it for the degree.
Not unlike me, the rest of my class studies to pass the tests.
You extract useful bits and pieces here and there but ultimately it&#x27;s a waste of your time.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;academic-writing&quot;&gt;Academic Writing&lt;&#x2F;h2&gt;
&lt;p&gt;I already wrote one paper. It was terrible, but the bar was very low as well for that one so no major issues.
I have to write at least 3 more papers, gradually larger in scope.
Scientific writing is about proving or disproving a thesis. It may also be about measuring something.
But, even more so than programming, administration is a craft not a science.
Good admins have broad knowledge about some set of tools and&#x2F;or components and use said knowledge to develop, improve and most prominently maintain infrastructure.
While some programmer might at some point benefit from, to name an example, the concept of software complexity, we admins can learn pretty much all that&#x27;s needed with a whiteboard and some first party documentation.
I need to shoehorn a craft into a science and that mismatch has consequences.
It&#x27;s frustrating.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-continue-anyway&quot;&gt;Why Continue Anyway?&lt;&#x2F;h2&gt;
&lt;p&gt;Listen, I&#x27;m more or less half way through and will get some worthless piece of paper at the end that tells stupid recruiters that I&#x27;m capable of learning basic math.
If I could travel back in time I would surely pick a regular apprenticeship over my studies, but changing gears now would reflect even more negatively on myself than if I had simply chosen said apprenticeship from the start.&lt;&#x2F;p&gt;
&lt;p&gt;The other way to look at things is as a hobbyist.
I&#x27;m not a software developer by trade. But I&#x27;m a programmer and hacker recreationally.
I can extract some knowledge from what I&#x27;m being taught and apply it to my daily coding.
This knowledge is rather scarce and merely a byproduct of a ton of useless bullshit, but might as well take it.&lt;&#x2F;p&gt;
&lt;p&gt;The latter is my preferred justification.
I may not end up working in IT anyway. I have no crystal ball to look into the future with.
I&#x27;m open enough to try alternative lines of work.
My large ego won&#x27;t prevent me from pursuing jobs that get less recognition by the general public either.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-word-of-caution&quot;&gt;A Word Of Caution&lt;&#x2F;h2&gt;
&lt;p&gt;I see many young folks flocking towards IT as a goldmine of an employment opportunity.
In Germany we recommend avoiding a career as a cook to people who like cooking, so as to not ruin the fun of their hobby.
Why?&lt;&#x2F;p&gt;
&lt;p&gt;How is IT any different? Sure you get a ridiculous amount of money shoved up there but at it&#x27;s core you&#x27;re likely working for a stupid and&#x2F;or evil company doing meaningless labour and doing it very poorly at that because everything is legacy.
And who says this gold rush will never end? What guarantees that you&#x27;ll be paid well by the time you get to call yourself senior?&lt;&#x2F;p&gt;
&lt;p&gt;Try out the IT field, but don&#x27;t go in with the assumption that enjoying IT as a hobby will guarantee or even correlate with you enjoying IT as a job.
Have realistic expectations and stay as far away from institutionalised science as you can.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 On Programming Skill</title>
          <pubDate>Wed, 04 Jan 2023 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/on-programming-skill/</link>
          <guid>https://port19.xyz/tech/on-programming-skill/</guid>
          <description xml:base="https://port19.xyz/tech/on-programming-skill/">&lt;h1 id=&quot;tactics-strategy-and-project-management&quot;&gt;
Tactics, Strategy and Project Management&quot;&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;it-s-language-agnostic&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#it-s-language-agnostic&quot; aria-label=&quot;Anchor link for: it-s-language-agnostic&quot;&gt;🔗&lt;&#x2F;a&gt;

It&#x27;s language agnostic&lt;&#x2F;h2&gt;
&lt;p&gt;One mistake common in new and&#x2F;or bad programmers is to measure programming skill in language proficiency.
This might make sense for a first programming language, but any half decent programmer should quickly ascend beyond this level.
Programming skill is at most bound to paradigms, not languages.
If you&#x27;re a god at C you won&#x27;t suck at python, but you might suck at haskell.
But even the association of skill with a paradigm doesn&#x27;t sit quite right.
There is a way to assess programming skill independent the proficiency with tools.
You aren&#x27;t &quot;a good python programmer&quot;.
You may be a good programmer and you may be good at python.
But by describing yourself as a good python programmer you&#x27;re selling yourself short by binding your skill to that language, by implying your useless outside that domain.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tactics&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#tactics&quot; aria-label=&quot;Anchor link for: tactics&quot;&gt;🔗&lt;&#x2F;a&gt;

Tactics&lt;&#x2F;h2&gt;
&lt;p&gt;Tactics shows itself in the ability to solve coding puzzles. To sum the first 10000 prime numbers.
Tactics requires knowing data structures. It requires analytical thinking and a lot of practice.
A good tactician will be able to write and navigate highly complicated code and is able to leverage complicated tools to solve complicated problems.
To get better at tactics, pay attention in your data structures and algorithms class at college.
Alternatively, or afterwards, go to codewars and grind some Katas.
Maybe try some project euler problems if you want a more intense mathematical flair.
Advent of Code is the high end of tactical practice. Don&#x27;t feel bad if you can only keep up with the first week.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;strategy&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#strategy&quot; aria-label=&quot;Anchor link for: strategy&quot;&gt;🔗&lt;&#x2F;a&gt;

Strategy&lt;&#x2F;h2&gt;
&lt;p&gt;Strategy is about the broader ecosystem.
It&#x27;s also about knowing your tools and getting comfortable with them.
It&#x27;s about being able to modularize your code in a sensible way, to scale it from 100 to 1000 lines and beyond.
Strategy enables you to build powerful applications without being wasteful in the process.
Importing 10 python libraries that do the heavy lifting and writing 100 lines of uninspired glue code to hold it together is a sign of good strategy.
Build applications and get to know one or more languages in more depth to get better at this.
You learn over time what to delegate to a library and what to write yourself.
You learn to read documentation and search for information online.
You learn what kind of modularization works for you.
Perhaps you can start by writing a discord bot. Maybe host a dynamic website or an api.
The reasonable high end for strategy would be to write a simple 2D game.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;project-management&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#project-management&quot; aria-label=&quot;Anchor link for: project-management&quot;&gt;🔗&lt;&#x2F;a&gt;

Project Management&lt;&#x2F;h2&gt;
&lt;p&gt;Strategic skill shouldn&#x27;t be confused with project management skill.
Finishing projects takes more than just strategy.
Knowing how to prioritize issues during maintenance is management skill.
As is finding out your minimum viable product and working towards that milestone before implementing non-essentials.
The whole issue of scope is at the core of project management, especially when coding as a hobby or alone.
As a general rule of thumb, good project management is about knowing what not to do, rather than about knowing what to do.
It&#x27;s about being critical of your own ideas and about writing software that doesn&#x27;t just work but is useful as well.
While you gain strategic skill &lt;em&gt;during&lt;&#x2F;em&gt; a project, you can practice your management at the start and then again towards the end of a project.
Knowing basic task management and having common sense is enough here.
Don&#x27;t get caught up in agile bullshit, useful patterns in your programming practice will emerge on their own and don&#x27;t need to be prescribed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;be-well-rounded&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#be-well-rounded&quot; aria-label=&quot;Anchor link for: be-well-rounded&quot;&gt;🔗&lt;&#x2F;a&gt;

Be well rounded&lt;&#x2F;h2&gt;
&lt;p&gt;A well rounded programmer should work on improving all three dimensions of their programming skill.
But if you&#x27;re going to emphasise one over the other, do more tactics than strategy and more strategy than management.&lt;&#x2F;p&gt;
&lt;p&gt;Most importantly, learn to have fun while coding.
Learn to be proud of your work, even if it isn&#x27;t much in the grand scheme of things.
We programmers are blessed with the ability to move mountains through our keyboards and screens.
Appreciate that.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 2022 year review</title>
          <pubDate>Sat, 31 Dec 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/year-review22/</link>
          <guid>https://port19.xyz/tech/year-review22/</guid>
          <description xml:base="https://port19.xyz/tech/year-review22/">&lt;h1 id=&quot;looking-back-on-the-past-year&quot;&gt;
Looking back on the past year&lt;&#x2F;h1&gt;
&lt;p&gt;This year has been my first full year as a CS student.
I&#x27;ve learned a lot and made a ton of progress as a programmer.
I tried many programming languages and learned many tools that will help me in the future.
My linux setup and software selection has been continously refined to where it is now.
I&#x27;m proud of my work this year and want to take a few minutes to reflect it.&lt;&#x2F;p&gt;
&lt;p&gt;My top 3 good descisions this year:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;learning emacs&lt;&#x2F;li&gt;
&lt;li&gt;learning git&lt;&#x2F;li&gt;
&lt;li&gt;learning clojure&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;My top 3 mistakes this year:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;vimwiki &#x2F; my attempt to go back to neovim&lt;&#x2F;li&gt;
&lt;li&gt;coding very little over the summer&lt;&#x2F;li&gt;
&lt;li&gt;an overemphasis on tools over competence&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;languages&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#languages&quot; aria-label=&quot;Anchor link for: languages&quot;&gt;🔗&lt;&#x2F;a&gt;

Languages&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;shell&quot;&gt;
Shell&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;easy to read, hard to write&lt;&#x2F;li&gt;
&lt;li&gt;domain specific&lt;&#x2F;li&gt;
&lt;li&gt;well suited for system task automation and string processing&lt;&#x2F;li&gt;
&lt;li&gt;very intuitive for experienced linux terminal users&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;prolog&quot;&gt;
Prolog&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;conditional unification and variable binding are interesting concepts&lt;&#x2F;li&gt;
&lt;li&gt;swi prolog sucks a bit less than other dialects&lt;&#x2F;li&gt;
&lt;li&gt;maybe revisit in the future&lt;&#x2F;li&gt;
&lt;li&gt;book: &quot;logic programming with prolog&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;lua&quot;&gt;
Lua&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;one indexed arrays are cancer&lt;&#x2F;li&gt;
&lt;li&gt;syntax is meh&lt;&#x2F;li&gt;
&lt;li&gt;ecosystem is rather small&lt;&#x2F;li&gt;
&lt;li&gt;hard to justify learning or spending time with&lt;&#x2F;li&gt;
&lt;li&gt;boring &#x2F; unenlightening&lt;&#x2F;li&gt;
&lt;li&gt;löve2d not worth it on it&#x27;s own&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;java&quot;&gt;
Java&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;massive pain in the ass&lt;&#x2F;li&gt;
&lt;li&gt;unjustifiable to learn for intellectual progress&lt;&#x2F;li&gt;
&lt;li&gt;not just unenlightening: it makes you a worse programmer&lt;&#x2F;li&gt;
&lt;li&gt;oop is the most braindead ideology in programming&lt;&#x2F;li&gt;
&lt;li&gt;swing just makes things more frustrating&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;go&quot;&gt;
Go&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;simplicity&lt;&#x2F;li&gt;
&lt;li&gt;almost all basic list utilities missing&lt;&#x2F;li&gt;
&lt;li&gt;unreasonably hard to juggle data with&lt;&#x2F;li&gt;
&lt;li&gt;suprisingly vast ecosystem&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;haskell&quot;&gt;
Haskell&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;good for artificial coding problems&#x2F;wrangling data&lt;&#x2F;li&gt;
&lt;li&gt;extremely powerful for lists&lt;&#x2F;li&gt;
&lt;li&gt;recursion thinking&lt;&#x2F;li&gt;
&lt;li&gt;higher order funcitons (map, reduce, fold)&lt;&#x2F;li&gt;
&lt;li&gt;nice syntax (guards, texas ranger, few special characters)&lt;&#x2F;li&gt;
&lt;li&gt;steep onboarding if you want to make actual programs with it&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;clojure&quot;&gt;
Clojure&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;new main language&lt;&#x2F;li&gt;
&lt;li&gt;extremely fast feedback loop&lt;&#x2F;li&gt;
&lt;li&gt;nice syntax after you get used to it&lt;&#x2F;li&gt;
&lt;li&gt;good to have cljs to have a browser deployment option&lt;&#x2F;li&gt;
&lt;li&gt;enough libraries to support every large usecase&lt;&#x2F;li&gt;
&lt;li&gt;very competent community members&lt;&#x2F;li&gt;
&lt;li&gt;rich hickey is a great communicator&lt;&#x2F;li&gt;
&lt;li&gt;very tasteful language design&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;common-lisp&quot;&gt;
Common Lisp&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;archaeic function names&lt;&#x2F;li&gt;
&lt;li&gt;clojure has better ux&lt;&#x2F;li&gt;
&lt;li&gt;common lisp may still be worth it for vast builtins and native compilation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tooling&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#tooling&quot; aria-label=&quot;Anchor link for: tooling&quot;&gt;🔗&lt;&#x2F;a&gt;

Tooling&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;emacs&quot;&gt;
Emacs&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;org mode is huge&lt;&#x2F;li&gt;
&lt;li&gt;evil mode is a must&lt;&#x2F;li&gt;
&lt;li&gt;magit is pretty neat&lt;&#x2F;li&gt;
&lt;li&gt;prettify symbols mode is nice for math&lt;&#x2F;li&gt;
&lt;li&gt;emms is a buggy mess&lt;&#x2F;li&gt;
&lt;li&gt;emacs itself is quite buggy&lt;&#x2F;li&gt;
&lt;li&gt;don&#x27;t bother with gnu emacs&lt;&#x2F;li&gt;
&lt;li&gt;emacs is slow&lt;&#x2F;li&gt;
&lt;li&gt;emacs is not a replacement for a windowmanager + terminal applications&lt;&#x2F;li&gt;
&lt;li&gt;emacs native comp greatly mitigates performance problems&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;git&quot;&gt;
Git&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;rebases&lt;&#x2F;li&gt;
&lt;li&gt;tags, stashes&lt;&#x2F;li&gt;
&lt;li&gt;multiple remotes&lt;&#x2F;li&gt;
&lt;li&gt;pr-review-release workflow&lt;&#x2F;li&gt;
&lt;li&gt;writing good release notes&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;dotfiles&quot;&gt;
Dotfiles&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;two git remotes&lt;&#x2F;li&gt;
&lt;li&gt;semantic commits&lt;&#x2F;li&gt;
&lt;li&gt;refining software selection&lt;&#x2F;li&gt;
&lt;li&gt;pkgbuild as an install script&lt;&#x2F;li&gt;
&lt;li&gt;literate config&lt;&#x2F;li&gt;
&lt;li&gt;advanced bootstrapping&lt;&#x2F;li&gt;
&lt;li&gt;more zsh functions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;latex&quot;&gt;
Latex&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;beautiful for papers&lt;&#x2F;li&gt;
&lt;li&gt;hard to get a good org+latex setup up and running&lt;&#x2F;li&gt;
&lt;li&gt;bad syntax by default. Solution: org-mode + latex&lt;&#x2F;li&gt;
&lt;li&gt;good bibliography management and citations&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;zola&quot;&gt;
Zola&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;timestamped posts list&lt;&#x2F;li&gt;
&lt;li&gt;decent landing page&lt;&#x2F;li&gt;
&lt;li&gt;decent css&lt;&#x2F;li&gt;
&lt;li&gt;migrated old posts&lt;&#x2F;li&gt;
&lt;li&gt;templating is neat&lt;&#x2F;li&gt;
&lt;li&gt;simple deployment&lt;&#x2F;li&gt;
&lt;li&gt;rss feed&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;others&quot;&gt;
Others&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;ffmpeg&lt;&#x2F;li&gt;
&lt;li&gt;imagemagick&lt;&#x2F;li&gt;
&lt;li&gt;sourcehut&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;projects&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#projects&quot; aria-label=&quot;Anchor link for: projects&quot;&gt;🔗&lt;&#x2F;a&gt;

Projects&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;lead-ani-cli-shell&quot;&gt;
Lead ani-cli (shell)&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;people will contribute if you make it easy&lt;&#x2F;li&gt;
&lt;li&gt;issue tags are a must have&lt;&#x2F;li&gt;
&lt;li&gt;learning git is worth it&lt;&#x2F;li&gt;
&lt;li&gt;shellcheck is nice&lt;&#x2F;li&gt;
&lt;li&gt;shell is 3x as hard to write as python and 10x as hard to read&lt;&#x2F;li&gt;
&lt;li&gt;removing features is harder than adding them&lt;&#x2F;li&gt;
&lt;li&gt;semantic commits!&lt;&#x2F;li&gt;
&lt;li&gt;managing outages&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;kicklistbot2-clojure&quot;&gt;
Kicklistbot2 (clojure)&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;leiningen&lt;&#x2F;li&gt;
&lt;li&gt;clj-http, cheshire&lt;&#x2F;li&gt;
&lt;li&gt;first application of clojures awesome data processing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;dvd-animation-clojure&quot;&gt;
Dvd Animation (clojure)&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;collisions can be tough&lt;&#x2F;li&gt;
&lt;li&gt;functional state management via elm architecture&lt;&#x2F;li&gt;
&lt;li&gt;first contact with cljs&lt;&#x2F;li&gt;
&lt;li&gt;made a video tutorial series with it&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;redqu-clojure&quot;&gt;
Redqu (clojure)&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;never climb the tree when you can shoot down the apple&lt;&#x2F;li&gt;
&lt;li&gt;reddit rss is counterintuitively easier to parse than json&lt;&#x2F;li&gt;
&lt;li&gt;nix-clj has bad ux and doesn&#x27;t really work + has huge build times&lt;&#x2F;li&gt;
&lt;li&gt;standard clj build tools&lt;&#x2F;li&gt;
&lt;li&gt;distributing clojure is a pain due to lack of native binaries&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 On FOSS Licenses</title>
          <pubDate>Sat, 24 Dec 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/licenses/</link>
          <guid>https://port19.xyz/tech/licenses/</guid>
          <description xml:base="https://port19.xyz/tech/licenses/">&lt;h1 id=&quot;how-i-choose-open-source-licenses&quot;&gt;
How I choose Open Source Licenses&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;the-four-freedoms&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-four-freedoms&quot; aria-label=&quot;Anchor link for: the-four-freedoms&quot;&gt;🔗&lt;&#x2F;a&gt;

The Four Freedoms&lt;&#x2F;h2&gt;
&lt;p&gt;The four freedoms are what makes free software free.
They are defined by the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;&quot;&gt;Free Software Foundation&lt;&#x2F;a&gt;, pioneered by Richard Stallman.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Use: Free Software can be used for any purpose and is free of restrictions such as licence expiry or geographic limitations.&lt;&#x2F;li&gt;
&lt;li&gt;Study: Free Software and its code can be studied by anyone, without non-disclosure agreements or similar restrictions.&lt;&#x2F;li&gt;
&lt;li&gt;Share: Free Software can be shared and copied at virtually no cost.&lt;&#x2F;li&gt;
&lt;li&gt;Improve: Free Software can be modified by anyone, and these improvements can be shared publicly.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;philosophy&#x2F;free-sw.en.html&quot;&gt;More verbosely elaborated on by the FSF&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The open source definition has a few more clauses, but broadly aligns with free software.
You can read up on the ten clauses &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;opensource.org&#x2F;osd&quot;&gt;here&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;permissive-vs-copyleft&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#permissive-vs-copyleft&quot; aria-label=&quot;Anchor link for: permissive-vs-copyleft&quot;&gt;🔗&lt;&#x2F;a&gt;

Permissive vs Copyleft&lt;&#x2F;h2&gt;
&lt;p&gt;Permissive licenses pose very limited restrictions at best.
Copyleft denotes a type of FOSS license that prevents the &quot;propietization&quot; of FOSS code.
Permissive licenses mostly let people do whatever they want with the software.
Copyleft licenses aim to protect the software from ill intent, protecting it&#x27;s freedom.&lt;&#x2F;p&gt;
&lt;p&gt;In the following I&#x27;ll treat public domain licenses as permissive licenses.
I call less restrictive licenses weak and more restrictive licenses strong.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;permissive-licenses&quot;&gt;
Permissive Licenses&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;CC0: The best public domain dedication&lt;&#x2F;li&gt;
&lt;li&gt;MIT&#x2F;BSD: License copy must be included&lt;&#x2F;li&gt;
&lt;li&gt;Apache: License copy + changes must be documented&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;copyleft-licenses&quot;&gt;
Copyleft Licenses&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Mozilla: Modifications of existing files have same license&lt;&#x2F;li&gt;
&lt;li&gt;GPLv2: Actual full copyleft&lt;&#x2F;li&gt;
&lt;li&gt;LGPLv3: GPLv3 unless used as a library, if used as a library no copyleft.&lt;&#x2F;li&gt;
&lt;li&gt;GPLv3: GPLv2 + anti tivoization + drm protection + minor improvements. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;41460&#x2F;what-are-the-differences-between-gpl-v2-and-gpl-v3-licenses&quot;&gt;good stack overflow post&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;AGPLv3: GPLv3 + network use is distribution. protects back end software. &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;licenses&#x2F;why-affero-gpl.en.html&quot;&gt;reasoning by the fsf&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;choosing-between-apache-mit-and-cc0&quot;&gt;
Choosing between Apache, Mit and CC0&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Don&#x27;t care at all? Use CC0&lt;&#x2F;li&gt;
&lt;li&gt;Need license copy on distribution? Use MIT&lt;&#x2F;li&gt;
&lt;li&gt;Also want changes to be listed? Use Apache&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;choosing-between-the-gpls&quot;&gt;
Choosing between The GPLs&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Writing a library? Use the LGPLv3&lt;&#x2F;li&gt;
&lt;li&gt;Writing a backend service? Use the AGPLv3&lt;&#x2F;li&gt;
&lt;li&gt;Otherwise use the GPLv3&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;do-i-care-about-this-software&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#do-i-care-about-this-software&quot; aria-label=&quot;Anchor link for: do-i-care-about-this-software&quot;&gt;🔗&lt;&#x2F;a&gt;

Do I care about this Software?&lt;&#x2F;h2&gt;
&lt;p&gt;If I care about the software I&#x27;m writing and plan to invest significant time and ressources into it&#x27;s development.
If the Software is or could be useful to other people and get actual users.
If my Software has value beyond the code, beyond being a subject of education.
Then I&#x27;ll license it under a GPLv3, or a derivative if applicable.&lt;&#x2F;p&gt;
&lt;p&gt;If the Software has been a coding exercise or educational resource.
If the Software is small in scope and didn&#x27;t require much time or effort.
If the Software is useful to me but to few others.
Then I&#x27;ll license it under the CC0 and dedicate it under the public domain.&lt;&#x2F;p&gt;
&lt;p&gt;CC0 and GPLv3 are polar opposites, yet I use both. I hope I was able to explain why.&lt;&#x2F;p&gt;
&lt;p&gt;If you hold different views and want to explore the alternatives, check out &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;choosealicense.com&#x2F;&quot;&gt;choosalicense.com&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Hugo is inexcusably bad</title>
          <pubDate>Sat, 24 Dec 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/zola/</link>
          <guid>https://port19.xyz/tech/zola/</guid>
          <description xml:base="https://port19.xyz/tech/zola/">&lt;h1 id=&quot;why-this-blog-uses-zola-instead-of-hugo&quot;&gt;
Why this blog uses Zola instead of Hugo&lt;&#x2F;h1&gt;
&lt;p&gt;Before I get started, I should note that hugo is still less horrible than most of the crimes committed by javascript devs and pushed as static site generators.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hugo-onboarding-is-a-nightmare&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#hugo-onboarding-is-a-nightmare&quot; aria-label=&quot;Anchor link for: hugo-onboarding-is-a-nightmare&quot;&gt;🔗&lt;&#x2F;a&gt;

Hugo onboarding is a nightmare&lt;&#x2F;h2&gt;
&lt;p&gt;I spent several hours across a few days trying to get hugo to suit my needs.
As with every static site generator, getting the first piece of html served is no problem and I got through the basics fast.
Getting just a little further, I really enjoyed luke smiths video and followed &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ZFL09qhKi5I&quot;&gt;his tutorial&lt;&#x2F;a&gt; with his theme, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;LukeSmithxyz&#x2F;lugo&quot;&gt;lugo&lt;&#x2F;a&gt;.
Aside from some things not looking as expected because of some recent commits that I rolled back things somewhat worked.
But now I wanted to customize and get the directory structure to make sense.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-the-fuck-is-a-theme&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-the-fuck-is-a-theme&quot; aria-label=&quot;Anchor link for: what-the-fuck-is-a-theme&quot;&gt;🔗&lt;&#x2F;a&gt;

What the fuck is a theme&lt;&#x2F;h2&gt;
&lt;p&gt;Essentially defaults. Defaults that hugo seems to not have out of the box.
You can overwrite anything set in the themes directory in your own directories.
The themes directory and it&#x27;s contents just mimic the directory structure at the root of your project.
&quot;Using Hugo without a theme&quot; spit out pretty garbage search results.
But one forum post stuck out and actually managed to answer the simple question of wether it&#x27;s possible.
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;discourse.gohugo.io&#x2F;t&#x2F;solved-is-a-theme-a-requirement&#x2F;2154&quot;&gt;It is&lt;&#x2F;a&gt;, by just copying the themes files directly into the projects local folder.
That ship has sailed for me, then and there.
I want to write my own templates and craft my own website.
The vast majority of hugo users prefers precrafted templates and layouts and only customizes those sporadically.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;towards-a-less-cringe-alternative&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#towards-a-less-cringe-alternative&quot; aria-label=&quot;Anchor link for: towards-a-less-cringe-alternative&quot;&gt;🔗&lt;&#x2F;a&gt;

Towards a less cringe alternative&lt;&#x2F;h2&gt;
&lt;p&gt;I stopped for the day and browsed some of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@bugswriter_&quot;&gt;bugswriters&lt;&#x2F;a&gt; videos.
His &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=V_qy1BnEMCc&quot;&gt;introduction to zola&lt;&#x2F;a&gt; quickly had me sold.
Actually usable documentation.
A non-moronic directory structure.
No theme required by default, you write the templates yourself.
Unpolluted search results when checking for details.
Thats where I left off.  Convinced of zola but not yet applying it.&lt;&#x2F;p&gt;
&lt;p&gt;So the better answer to &quot;Using Hugo without a theme&quot; would have been &quot;Use zola&quot;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;migration&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#migration&quot; aria-label=&quot;Anchor link for: migration&quot;&gt;🔗&lt;&#x2F;a&gt;

Migration&lt;&#x2F;h2&gt;
&lt;p&gt;Then, yesterday, I started migrating most of my blog posts from vimwiki to markdown and Zola.
After having ported 2 articles I made sure to spice up my landing page, which I did for a few hours.
Understanding how to generate sorted sections was a matter of understanding the templating language.
But luckily &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;keats.github.io&#x2F;tera&#x2F;&quot;&gt;Tera&lt;&#x2F;a&gt; is just as well documented as &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;getting-started&#x2F;overview&#x2F;&quot;&gt;Zola&lt;&#x2F;a&gt; itself.
I rewrote my css, being inspired by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;lukesmith.xyz&#x2F;&quot;&gt;lukesmiths webpage&lt;&#x2F;a&gt; in many details.
To get back the categories I used by convention in vimwiki, I just prepended the site title with a unicode character and then filtered by those.
Taxonomies&#x2F;tags are inherently hard to work with, zola makes it somewhat accessible but I don&#x27;t want to deal with them until I have a real need.
After several hours of crafting my webpage it has become what you see now.
I&#x27;m sure I&#x27;ll hack away at the css some more and my index.html will grow organically.
But it&#x27;s mostly done and I&#x27;m very happy I went with zola over hugo.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 Why I like Monoliths</title>
          <pubDate>Thu, 01 Dec 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/monoliths/</link>
          <guid>https://port19.xyz/tech/monoliths/</guid>
          <description xml:base="https://port19.xyz/tech/monoliths/">&lt;h1 id=&quot;on-monoliths&quot;&gt;
On Monoliths&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;why-do-people-gravitate-to-modular-architectures&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-do-people-gravitate-to-modular-architectures&quot; aria-label=&quot;Anchor link for: why-do-people-gravitate-to-modular-architectures&quot;&gt;🔗&lt;&#x2F;a&gt;

Why do people gravitate to modular architectures&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;&quot;Scalability&quot;: both in terms of performance and project size&lt;&#x2F;em&gt;
I may choose to write another article about this phenomena, but for some reason developers fear performance issues more than anything else.
For this article it&#x27;s enough to say that your pet project will likely never have any issues regarding performance.
Even a raspberry pi will handle the traffic of several thousands of daily users for most scenarios.&lt;&#x2F;p&gt;
&lt;p&gt;More important to most developers, they allow for a more rigid separation of concerns, useful for scaling a development team to more than 2-3 devs.
If your scope becomes large enough you can no longer have a whole team work on one closely coupled set of classes &#x2F; modules &#x2F; files with code.
It is also worth noting that some applications inherently benefit from some form of modularization: a website without backend is, through technical means, limited in what it can accomplish.
The point I&#x27;m trying to make in this, admittedly, ranty article is not that a microservice architecture is &lt;em&gt;never&lt;&#x2F;em&gt; a good idea for anything.
My point is that it&#x27;s almost always a bad idea for small projects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-beauty-of-the-monolith&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-beauty-of-the-monolith&quot; aria-label=&quot;Anchor link for: the-beauty-of-the-monolith&quot;&gt;🔗&lt;&#x2F;a&gt;

The beauty of the monolith&lt;&#x2F;h2&gt;
&lt;p&gt;I believe I can sell you the upsides of developing a monolith far better than the downsides of everything else.
A monolith, in the way I use the term, is any one self contained programm that is not strongly separated into pieces on a conceptual level.
You may still have different files where you write code in, but at it&#x27;s core the system is interdependent and tightly coupled.
A monolith&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Encourages minimalism &#x2F; discourages feature creep&lt;&#x2F;li&gt;
&lt;li&gt;Leaves complexity to be tackled head on in code, rather than to be abstracted away&lt;&#x2F;li&gt;
&lt;li&gt;Is easy to grasp and reason about&lt;&#x2F;li&gt;
&lt;li&gt;Is easy to deploy &#x2F; package&lt;&#x2F;li&gt;
&lt;li&gt;Is easy to finish&lt;&#x2F;li&gt;
&lt;li&gt;Can reach a high degree of polish&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-design-process&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#the-design-process&quot; aria-label=&quot;Anchor link for: the-design-process&quot;&gt;🔗&lt;&#x2F;a&gt;

The design process&lt;&#x2F;h2&gt;
&lt;p&gt;As a matter of product design, let&#x27;s return to the example of a website.
After answering the basic questions, what it is and who it&#x27;s for, ask yourself wether it needs a backend.
Do you need to dynamically change contents on the page? No? Maybe don&#x27;t use a backend.
Do you need to store and&#x2F;or process user data? No? Why use a backend.
Is your website just a pile of documents to be viewed in a browser? Yes? Use html, css and maybe a static site generator. No backend.
Is your website capable of running purely on the clientside? Yes? Write some js and don&#x27;t dare to phone home to a backend.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Modularize as little as possible, but as much as necessary&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If one minor feature would require modularization, but it doesn&#x27;t contribute much to the overall value: &lt;em&gt;just don&#x27;t include it&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;don-t-solve-problems-you-don-t-have&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#don-t-solve-problems-you-don-t-have&quot; aria-label=&quot;Anchor link for: don-t-solve-problems-you-don-t-have&quot;&gt;🔗&lt;&#x2F;a&gt;

Don&#x27;t solve problems you don&#x27;t have&lt;&#x2F;h2&gt;
&lt;p&gt;You have enough problems as is. You have a product to develop. A project to hack on.
You gain nothing from preparing yourself for an unlikely future.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 2022 Jog Log</title>
          <pubDate>Mon, 28 Nov 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/joglog22/</link>
          <guid>https://port19.xyz/lifestyle/joglog22/</guid>
          <description xml:base="https://port19.xyz/lifestyle/joglog22/">&lt;p&gt;I like to jog for about 20-30 minutes and aim for twice a week&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;ID&lt;&#x2F;th&gt;&lt;th&gt;Date&lt;&#x2F;th&gt;&lt;th&gt;Minutes&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;01&lt;&#x2F;td&gt;&lt;td&gt;03.1.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;02&lt;&#x2F;td&gt;&lt;td&gt;20.1.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;03&lt;&#x2F;td&gt;&lt;td&gt;31.1.&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;04&lt;&#x2F;td&gt;&lt;td&gt;05.2.&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;05&lt;&#x2F;td&gt;&lt;td&gt;15.2.&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;06&lt;&#x2F;td&gt;&lt;td&gt;17.2.&lt;&#x2F;td&gt;&lt;td&gt;32&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;07&lt;&#x2F;td&gt;&lt;td&gt;21.2.&lt;&#x2F;td&gt;&lt;td&gt;19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;08&lt;&#x2F;td&gt;&lt;td&gt;24.2.&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;09&lt;&#x2F;td&gt;&lt;td&gt;28.2.&lt;&#x2F;td&gt;&lt;td&gt;&lt;em&gt;40&lt;&#x2F;em&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;14.3.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;21.3.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;22.3.&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;25.3.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;14&lt;&#x2F;td&gt;&lt;td&gt;30.3.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;td&gt;18.4.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;16&lt;&#x2F;td&gt;&lt;td&gt;22.4.&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;17&lt;&#x2F;td&gt;&lt;td&gt;25.4.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;18&lt;&#x2F;td&gt;&lt;td&gt;29.4.&lt;&#x2F;td&gt;&lt;td&gt;34&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;19&lt;&#x2F;td&gt;&lt;td&gt;01.5.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;td&gt;03.5.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;td&gt;05.5.&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;td&gt;07.5.&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;td&gt;11.5.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;td&gt;16.5.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;19.5.&lt;&#x2F;td&gt;&lt;td&gt;19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;31.5.&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;27&lt;&#x2F;td&gt;&lt;td&gt;03.6.&lt;&#x2F;td&gt;&lt;td&gt;&lt;em&gt;70&lt;&#x2F;em&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;10.6.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;29&lt;&#x2F;td&gt;&lt;td&gt;14.6.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;30&lt;&#x2F;td&gt;&lt;td&gt;18.6.&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;31&lt;&#x2F;td&gt;&lt;td&gt;20.6.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;32&lt;&#x2F;td&gt;&lt;td&gt;21.6.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;33&lt;&#x2F;td&gt;&lt;td&gt;22.6.&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;34&lt;&#x2F;td&gt;&lt;td&gt;23.6.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;35&lt;&#x2F;td&gt;&lt;td&gt;26.6.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;36&lt;&#x2F;td&gt;&lt;td&gt;27.6.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;37&lt;&#x2F;td&gt;&lt;td&gt;29.6.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;38&lt;&#x2F;td&gt;&lt;td&gt;20.7.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;39&lt;&#x2F;td&gt;&lt;td&gt;25.7.&lt;&#x2F;td&gt;&lt;td&gt;21&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;40&lt;&#x2F;td&gt;&lt;td&gt;11.9.&lt;&#x2F;td&gt;&lt;td&gt;18&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;41&lt;&#x2F;td&gt;&lt;td&gt;24.9.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;42&lt;&#x2F;td&gt;&lt;td&gt;23.10.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;43&lt;&#x2F;td&gt;&lt;td&gt;28.10.&lt;&#x2F;td&gt;&lt;td&gt;21+19&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;44&lt;&#x2F;td&gt;&lt;td&gt;02.11.&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;45&lt;&#x2F;td&gt;&lt;td&gt;04.11.&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;46&lt;&#x2F;td&gt;&lt;td&gt;07.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;47&lt;&#x2F;td&gt;&lt;td&gt;09.11.&lt;&#x2F;td&gt;&lt;td&gt;20&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;48&lt;&#x2F;td&gt;&lt;td&gt;14.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;49&lt;&#x2F;td&gt;&lt;td&gt;15.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;50&lt;&#x2F;td&gt;&lt;td&gt;25.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;51&lt;&#x2F;td&gt;&lt;td&gt;26.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;52&lt;&#x2F;td&gt;&lt;td&gt;28.11.&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</description>
      </item>
      <item>
          <title>📚 Avoid Social Media</title>
          <pubDate>Sat, 09 Jul 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/avoid-social-media/</link>
          <guid>https://port19.xyz/lifestyle/avoid-social-media/</guid>
          <description xml:base="https://port19.xyz/lifestyle/avoid-social-media/">&lt;h1 id=&quot;social-media-wastes-your-time&quot;&gt;social media wastes your time&lt;&#x2F;h1&gt;
&lt;p&gt;Are you short on time? Always busy? Rarely get a full nights sleep?
Consider quitting youtube and other video content.
Especially if you&#x27;re trying to learn something new, keep up with news or genuinely have time to kill.&lt;&#x2F;p&gt;
&lt;p&gt;I was gonna title this &quot;video content wastes your time&quot;, but this is mostly applicable to social media and youtube.
One video is 10 more minutes.
Thats one 144th of your day of which a third is sleeping and most of the remainder is &lt;em&gt;not&lt;&#x2F;em&gt; free time.&lt;&#x2F;p&gt;
&lt;p&gt;1 more post on reddit, instagram or tik tok wastes less time. You know that and because you do it becomes a lot harder to stop scrolling.
One more isn&#x27;t much of a waste after all.&lt;&#x2F;p&gt;
&lt;p&gt;Seek and carefully select the media you consume to serve you, be it for entertainment or for education.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>💻 NixOS ain&#x27;t worth it</title>
          <pubDate>Sat, 09 Jul 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/nixos/</link>
          <guid>https://port19.xyz/tech/nixos/</guid>
          <description xml:base="https://port19.xyz/tech/nixos/">&lt;h1 id=&quot;why-i-don-t-use-nix-os&quot;&gt;
Why I don&#x27;t use nix os&lt;&#x2F;h1&gt;
&lt;p&gt;Nix OS is a reproducible linux distribution where system state is declaratively stored in a version controllable configuration.nix file.&lt;&#x2F;p&gt;
&lt;p&gt;Even today it already has significantly more packages than arch + aur and due to the boot setup you can always roll back your system, making it practically unbreakable.&lt;&#x2F;p&gt;
&lt;p&gt;But nix os is very different.&lt;&#x2F;p&gt;
&lt;p&gt;If you google an issue, the solutions you find will likely not apply.&lt;&#x2F;p&gt;
&lt;p&gt;Worse, the knowledge and skill you gain will not cary over to more traditional distros like debian or arch.&lt;&#x2F;p&gt;
&lt;p&gt;Nix os vs arch is more like openbsd vs arch rather than debian vs arch.&lt;&#x2F;p&gt;
&lt;p&gt;Sure, the kernel is still linux, but the whole system will feel unfamiliar.&lt;&#x2F;p&gt;
&lt;p&gt;Ask yourself, is reproducibility via configuration.nix worth it?&lt;&#x2F;p&gt;
&lt;p&gt;Or would you rather maintain your dotfiles and a package list?&lt;&#x2F;p&gt;
&lt;p&gt;Do you always need more or is arch + aur enough software?&lt;&#x2F;p&gt;
&lt;p&gt;Are rollbacks important to you and do you also have beef with the timeshift maintainer?&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re unsure, stay away from nix os.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hlissner&#x2F;dotfiles&quot;&gt;doom emacs maintainer agrees&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 Floor Sleeping Review</title>
          <pubDate>Thu, 30 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/floor-sleeping-review/</link>
          <guid>https://port19.xyz/lifestyle/floor-sleeping-review/</guid>
          <description xml:base="https://port19.xyz/lifestyle/floor-sleeping-review/">&lt;p&gt;&lt;em&gt;tldr: not worth it&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been a minimalist for several years now, so when a few months ago after a sleepover at a friends house I had already slept on the flor for two days, I decided to extend the experiment.&lt;&#x2F;p&gt;
&lt;p&gt;Sleeping in a sleeping bag got better up until day 4 or 5 where comfort plateaued. I then had 2 weeks of back and fourth between bed and floor before giving up my first real attempt.&lt;&#x2F;p&gt;
&lt;p&gt;I then tried again recently, but it&#x27;s still not very restful.
I can sleep and I&#x27;m functioning well the next morning, but the whole night feels shallow, like it&#x27;s just an extended nap. The 6mm yoga mat wasn&#x27;t thick enough to prevent sore spots after some time and it wasn&#x27;t wide enough to make sure my hands would never slide of if I wanted to place them to my side.&lt;&#x2F;p&gt;
&lt;p&gt;During both attempts I used my slippers as lumbar support which worked pretty well. I slept on my back. I also tried some side positions, which work but are inferior and only really viable if you need to move a bit to get to sleep.&lt;&#x2F;p&gt;
&lt;p&gt;It wasn&#x27;t all bad though, getting out of bed was easier and it saves space. You also give your body a workout while you sleep and will inevitably do 30+ minutes of various stretchy positions before you give laying still your first shot.&lt;&#x2F;p&gt;
&lt;p&gt;Maybe with a thicker yoga mat and some more tactical coushins I can remedy the disadvantages, but for the time being the floor can have it&#x27;s 2:0 win.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>📚 3 weeks without a smartphone</title>
          <pubDate>Fri, 17 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/lifestyle/no-smartphone/</link>
          <guid>https://port19.xyz/lifestyle/no-smartphone/</guid>
          <description xml:base="https://port19.xyz/lifestyle/no-smartphone/">&lt;h2 id=&quot;how-it-happened&quot;&gt;How it happened&lt;&#x2F;h2&gt;
&lt;p&gt;For the past 2 years I have been using the Google Pixel 3a and really liked it.
Since I greatly value my Privacy and Security I used it with Graphene OS and installed mostly open source software from Fdroid.
The days were numbered for the Pixel 3a, at first predictably, because the Pixel 3a would not recieve further security updates from Google after May 2022.
But it also had issues charging for about a year, which meant just jamming the charger in with a little more force and cleaning the port for a while until it became more and more of a problem in May.
On May 28th, after visiting a good friend for a few days, the phone ran out of battery and when I arrived home to charge it I couldn&#x27;t get it to charge for a few minutes, where I then gave up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-i-got-the-featurephone&quot;&gt;How I got the featurephone&lt;&#x2F;h2&gt;
&lt;p&gt;But the switch wasn&#x27;t only one of necessity.
I had bought the phone I use now about a month prior to the Pixel 3a dying.
The CAT B40 seemed appealing to me since the day it came out, and the 50€ for what I still believe to be one of the best mass produced feature phones seemed so worth it that I bought it as a backup phone.
I even tried for 2 days in april, but wasn&#x27;t yet ready.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-not-just-buy-a-new-smartphone&quot;&gt;Why not just buy a new smartphone&lt;&#x2F;h2&gt;
&lt;p&gt;This is a question I&#x27;m undoubtedly going to get asked a whole lot in the coming months.
Short answer: they suck. For the long answer read ahead.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;hardware&quot;&gt;Hardware&lt;&#x2F;h3&gt;
&lt;p&gt;If I wanted a new smartphone today, my primary option would be the Pixel 6a, said to release in a few weeks for 450€.
That is if I want to uphold my high standard of privacy and security.
If I was willing to compromise on that for the benefit of my wallet, I could walk into an electronics store today and get a decent-ish phone for 100-200€.
This doesn&#x27;t seem appealing to me, so if I change my mind in the coming weeks and return to a smartphone, it will likely be the Pixel 6a.
But even that phone doesn&#x27;t exactly tick all the boxes.
Sure, it&#x27;ll have even more performance to blow my pants off, the Pixel 3a had more than enough, but it&#x27;s larger again, I don&#x27;t like the silly multi-camera design of basically all phones today and it drops the headphone jack.
That all is forgivable, if it came at a decent price. 450€ is not a decent price for what is firmly a midrange phone today. I remember buying the pixel 3a at a discount for just over 200€.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;software&quot;&gt;Software&lt;&#x2F;h3&gt;
&lt;p&gt;Let&#x27;s talk software for a bit.
I didn&#x27;t use my phone very extensively, I had whatsapp, signal, a few simple productivity apps, newpipe (a youtube client), infinity (a reddit client) and a webbrowser.
I used my phone for about 1-3 hours a day, and always had a love-hate relationship with it.&lt;&#x2F;p&gt;
&lt;p&gt;If whatsapp and signal had first class desktop support I would have switched to a featurephone months ago. But whatsapp web and signal desktop are clearly an afterthought.
In an ideal world they would be like webmail, or any other online account for that matter.
I open the browser, enter my username and password, and am free to communicate from whatever device I want.
Instead I have to sync it to my smartphone.&lt;&#x2F;p&gt;
&lt;p&gt;But I shouldn&#x27;t be too mad. Prior to the whatsapp multidevice beta this wouldn&#x27;t have been possible at all, since your phone needed an active internet connection for whatsapp desktop to work.
Now I have my smartphone at 80% battery powered off in a drawer for whenever I switch browsers or laptops and need to scan a qr code again.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lifestyle&quot;&gt;Lifestyle&lt;&#x2F;h3&gt;
&lt;p&gt;Up until now I&#x27;ve talked in details, but let&#x27;s look at the big picture.&lt;&#x2F;p&gt;
&lt;p&gt;At the end of the day the phone exists primarily to communicate.
If you need something from me and it&#x27;s urgent, call me.
If it could wait until the evening, send me a whatsapp message.
Many of us are very very connected. If you don&#x27;t return a message in minutes, something is off.
I don&#x27;t like that. Noone is entitled to my availability or a quick response.
I&#x27;m not afraid to miss out.&lt;&#x2F;p&gt;
&lt;p&gt;Secondarily, the phone is an entertainment device.
I don&#x27;t think my time spent watching youtube has dramatically decreased since my switch, I just entertain myself on my laptop instead.
Yesterday I watched the office for 8 hours in procrastination.
If you&#x27;re considering a feature phone, don&#x27;t lie to yourself and say it will miracolously cure your bad media consumption habits.
I&#x27;m sure it will make a difference, but it won&#x27;t be lifechanging.&lt;&#x2F;p&gt;
&lt;p&gt;This has been incredibly rambly, but I hope you enjoyed seeing my perspective on things.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>🍚 Baked Chickpeas</title>
          <pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/baked-chickpeas/</link>
          <guid>https://port19.xyz/recipes/baked-chickpeas/</guid>
          <description xml:base="https://port19.xyz/recipes/baked-chickpeas/">&lt;h1 id=&quot;baked-chickpeas-recipe&quot;&gt;Baked Chickpeas Recipe&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 10 min&lt;&#x2F;li&gt;
&lt;li&gt;Baking time: 35 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;1 can of chickpeas&lt;&#x2F;li&gt;
&lt;li&gt;1 Spoon Spicemix (customize to your taste)
&lt;ul&gt;
&lt;li&gt;3 parts curry&lt;&#x2F;li&gt;
&lt;li&gt;3 parts white pepper&lt;&#x2F;li&gt;
&lt;li&gt;3 parts chilli powder&lt;&#x2F;li&gt;
&lt;li&gt;1 part cinnamon&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;1 Spoon Olive oil (or chili oil)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;baking pan&lt;&#x2F;li&gt;
&lt;li&gt;baking paper&lt;&#x2F;li&gt;
&lt;li&gt;deep plate&lt;&#x2F;li&gt;
&lt;li&gt;small bowl&lt;&#x2F;li&gt;
&lt;li&gt;kitchen towels&lt;&#x2F;li&gt;
&lt;li&gt;strainer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;(optionally) preheat the oven at 220°C top-bottom&lt;&#x2F;li&gt;
&lt;li&gt;Put the can of chickpeas into the strainer and rinse thoroughly&lt;&#x2F;li&gt;
&lt;li&gt;Using some kitchen towels, dry the chickpeas&lt;&#x2F;li&gt;
&lt;li&gt;During the drying, remove any loose shells or broken chickpeas&lt;&#x2F;li&gt;
&lt;li&gt;put baking paper on a pan and the chickpeas on the baking paper&lt;&#x2F;li&gt;
&lt;li&gt;put the pan into the oven and wait for 40 minutes if you didn&#x27;t preheat or 30 if you did&lt;&#x2F;li&gt;
&lt;li&gt;while waiting, prepare your spices in a small bowl and mix&lt;&#x2F;li&gt;
&lt;li&gt;pull the pan out the oven and put the hot chickpeas onto your plate&lt;&#x2F;li&gt;
&lt;li&gt;Wait a minute if necessary until you don&#x27;t burn yourself touching the chickpeas, but short enough that they are still hot&lt;&#x2F;li&gt;
&lt;li&gt;Put approximately 1 spoon of oil onto the chickpeas and mix with your hands so all chickpeas are covered&lt;&#x2F;li&gt;
&lt;li&gt;Now add the spice mix and mix again&lt;&#x2F;li&gt;
&lt;li&gt;Your hands are now very dirty, wash them&lt;&#x2F;li&gt;
&lt;li&gt;Enjoy&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🍚 Overnight Oats</title>
          <pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/overnight-oats/</link>
          <guid>https://port19.xyz/recipes/overnight-oats/</guid>
          <description xml:base="https://port19.xyz/recipes/overnight-oats/">&lt;img src=&quot;.&#x2F;overnight-oats.jpg&quot; height=&quot;300vw&quot;&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Fridge time: 6-12 hours&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;200 ml oatmeal&lt;&#x2F;li&gt;
&lt;li&gt;handful of raspberries&lt;&#x2F;li&gt;
&lt;li&gt;150-200 ml of milk&lt;&#x2F;li&gt;
&lt;li&gt;(optional) 1 heaping teaspoon of flavored protein powder&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;bowl&lt;&#x2F;li&gt;
&lt;li&gt;plate&lt;&#x2F;li&gt;
&lt;li&gt;spoon&lt;&#x2F;li&gt;
&lt;li&gt;teaspoon&lt;&#x2F;li&gt;
&lt;li&gt;measuring cup&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;measure your oatmeal and add it to your bowl&lt;&#x2F;li&gt;
&lt;li&gt;now add the protein powder and mix&lt;&#x2F;li&gt;
&lt;li&gt;now add some raspberries, lightly mix again&lt;&#x2F;li&gt;
&lt;li&gt;add the milk and stab it with your spoon a few times&lt;&#x2F;li&gt;
&lt;li&gt;cover the bowl with a plate&lt;&#x2F;li&gt;
&lt;li&gt;put the covered bowl into your fridge&lt;&#x2F;li&gt;
&lt;li&gt;go to sleep&lt;&#x2F;li&gt;
&lt;li&gt;Enjoy with a healthy breakfast&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🍚 Roasted Broccoli</title>
          <pubDate>Wed, 15 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/recipes/roasted-broccoli/</link>
          <guid>https://port19.xyz/recipes/roasted-broccoli/</guid>
          <description xml:base="https://port19.xyz/recipes/roasted-broccoli/">&lt;h1 id=&quot;roasted-broccoli-recipe&quot;&gt;Roasted Broccoli Recipe&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Prep time: 5 min&lt;&#x2F;li&gt;
&lt;li&gt;Cooking time: 10 min&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ingredients&quot;&gt;Ingredients&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;1 unit of broccoli&lt;&#x2F;li&gt;
&lt;li&gt;some chili oil (or olive oil)&lt;&#x2F;li&gt;
&lt;li&gt;1 trunk&lt;&#x2F;li&gt;
&lt;li&gt;(optional) 1 chilli&lt;&#x2F;li&gt;
&lt;li&gt;(optional) spices (curry fits very well)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;tools&quot;&gt;Tools&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;frying pan&lt;&#x2F;li&gt;
&lt;li&gt;cooking spoon&lt;&#x2F;li&gt;
&lt;li&gt;cutting board&lt;&#x2F;li&gt;
&lt;li&gt;bowl&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;directions&quot;&gt;Directions&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;briefly rinse the broccoli under cold water&lt;&#x2F;li&gt;
&lt;li&gt;cut the brocolli to get only the flowering heads&lt;&#x2F;li&gt;
&lt;li&gt;heat some oil in the pan so that the bottom is covered, no more than necessary&lt;&#x2F;li&gt;
&lt;li&gt;cut the chilli in slices and add to the broccoli (if applicable)&lt;&#x2F;li&gt;
&lt;li&gt;(optional) add some spices&lt;&#x2F;li&gt;
&lt;li&gt;Put in the broccoli heads and move the broccoli around about once a minute&lt;&#x2F;li&gt;
&lt;li&gt;Put the finished broccoli with the chilli into your bowl&lt;&#x2F;li&gt;
&lt;li&gt;Enjoy with chopsticks&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>💻 Cool Searx Bangs</title>
          <pubDate>Thu, 02 Jun 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/searx/</link>
          <guid>https://port19.xyz/tech/searx/</guid>
          <description xml:base="https://port19.xyz/tech/searx/">&lt;h1 id=&quot;cool-searx-bangs&quot;&gt;
Cool Searx Bangs&lt;&#x2F;h1&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Category&lt;&#x2F;th&gt;&lt;th&gt;Bang&lt;&#x2F;th&gt;&lt;th&gt;Site&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;serch engines&lt;&#x2F;td&gt;&lt;td&gt;ddg&lt;&#x2F;td&gt;&lt;td&gt;duckduckgo&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;serch engines&lt;&#x2F;td&gt;&lt;td&gt;brave&lt;&#x2F;td&gt;&lt;td&gt;brave&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;serch engines&lt;&#x2F;td&gt;&lt;td&gt;qw&lt;&#x2F;td&gt;&lt;td&gt;qwant&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;serch engines&lt;&#x2F;td&gt;&lt;td&gt;wib&lt;&#x2F;td&gt;&lt;td&gt;wibby&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;search engines&lt;&#x2F;td&gt;&lt;td&gt;wp&lt;&#x2F;td&gt;&lt;td&gt;wikipedia&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;search engines&lt;&#x2F;td&gt;&lt;td&gt;sp&lt;&#x2F;td&gt;&lt;td&gt;startpage&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;map&lt;&#x2F;td&gt;&lt;td&gt;osm&lt;&#x2F;td&gt;&lt;td&gt;openstreetmap&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;music&lt;&#x2F;td&gt;&lt;td&gt;mc&lt;&#x2F;td&gt;&lt;td&gt;mixcloud&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;music&lt;&#x2F;td&gt;&lt;td&gt;yt&lt;&#x2F;td&gt;&lt;td&gt;youtube&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;it&lt;&#x2F;td&gt;&lt;td&gt;st&lt;&#x2F;td&gt;&lt;td&gt;stackoverflow&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;it&lt;&#x2F;td&gt;&lt;td&gt;gh&lt;&#x2F;td&gt;&lt;td&gt;github&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;it&lt;&#x2F;td&gt;&lt;td&gt;al&lt;&#x2F;td&gt;&lt;td&gt;arch wiki&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;it&lt;&#x2F;td&gt;&lt;td&gt;ge&lt;&#x2F;td&gt;&lt;td&gt;gentoo wiki&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;piracy&lt;&#x2F;td&gt;&lt;td&gt;1337x&lt;&#x2F;td&gt;&lt;td&gt;1337x&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;piracy&lt;&#x2F;td&gt;&lt;td&gt;nt&lt;&#x2F;td&gt;&lt;td&gt;nyaa&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;piracy&lt;&#x2F;td&gt;&lt;td&gt;tt&lt;&#x2F;td&gt;&lt;td&gt;tokyotoshokan&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;piracy&lt;&#x2F;td&gt;&lt;td&gt;zlib&lt;&#x2F;td&gt;&lt;td&gt;z-library&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;social media&lt;&#x2F;td&gt;&lt;td&gt;re&lt;&#x2F;td&gt;&lt;td&gt;reddit&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;other&lt;&#x2F;td&gt;&lt;td&gt;du&lt;&#x2F;td&gt;&lt;td&gt;duden&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;other&lt;&#x2F;td&gt;&lt;td&gt;wa&lt;&#x2F;td&gt;&lt;td&gt;wolframalpha&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
</description>
      </item>
      <item>
          <title>💻 Why Emacs?</title>
          <pubDate>Sat, 19 Mar 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/tech/emacs/</link>
          <guid>https://port19.xyz/tech/emacs/</guid>
          <description xml:base="https://port19.xyz/tech/emacs/">&lt;h2 id=&quot;keep-those-vim-bindings&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#keep-those-vim-bindings&quot; aria-label=&quot;Anchor link for: keep-those-vim-bindings&quot;&gt;🔗&lt;&#x2F;a&gt;

Keep those vim bindings&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;Emacs: Escape Meta Alt Control Shift&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Trying to choose between vim and emacs is pointless. Vim has far superior keybindings, while emacs is far more powerful.
&lt;em&gt;Evil mode&lt;&#x2F;em&gt; allows you to keep your beloved vim bindings making text editing inside emacs not just familiar, but nearly identical to text editing in vim with only a few rare edge cases.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;don-t-try-gnu-emacs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#don-t-try-gnu-emacs&quot; aria-label=&quot;Anchor link for: don-t-try-gnu-emacs&quot;&gt;🔗&lt;&#x2F;a&gt;

Don&#x27;t try GNU Emacs&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;Use doom emacs instead&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Two months before switching from vim to doom emacs as my primary editor I sunk half a workday into trying out GNU emacs.
A blinding wite canvas, terrible icons, no clear instructions, trash keybindings and confusing documentation scared me off. I left GNU emacs with more questions than answers.
Now you might be someone who likes to configure his stuff, and believe me I&#x27;m no different, but emacs really is an exception you should make.
I have heard stories of people spending a week with GNU emacs before even getting down the basics and then proceeding to spend another month constantly tweaking their config before slowly approaching a comfortable environment.
Don&#x27;t waste your time.&lt;&#x2F;p&gt;
&lt;p&gt;Doom emacs and spacemacs are two solid options, both focussing on ex vim users.
I am using doom emacs and think it is the better option if you still want to configure some things, but also want a solid foundation allowing you to get work done right away.
If you need everything and the kitchen sink and don&#x27;t care about bloat, spacemacs might be better suited to your needs.
With doom &lt;em&gt;I got productive in one day&lt;&#x2F;em&gt;, most of which was learning org mode.
Doom is pretty and welcoming out of the box, with config files that are easy to understand and intuitive defaults.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;don-t-live-in-emacs&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#don-t-live-in-emacs&quot; aria-label=&quot;Anchor link for: don-t-live-in-emacs&quot;&gt;🔗&lt;&#x2F;a&gt;

Don&#x27;t live in Emacs&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;Your rice is tasty enough&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The next trap is thinking you have to live inside emacs, or that that would even be beneficial.
Many vim users call emacs a fine operating system in lack of a good text editor but if you already have a nice tiling wm setup you will gain nothing from trying to move all your stuff into emacs.
I tried it out for the sake of experimentation and found most emacs alternatives to my software to be either more buggy, slower, or often both.
Two extreme cases were emms (emacs multimedia system) and a pdf mode that I forgot the name of.
Emms choked on my pipewire config a few times and complained about some mpv scripts, while also generally providing a worse experience than cmus, moc or even standalone mpv.
The pdf mode took a few seconds to buffer when I tried to skip a few pages by holding down j.
Using mupdf I can fly through 1000 pages of pdf without hickups no problem.
Some tasks where moving them into emacs could provide some value: email (mu4e), rss (elfeed), git (magit)
If you&#x27;re happy with your current application stack, keep using it and just use emacs for text editing and org mode.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;org-mode&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#org-mode&quot; aria-label=&quot;Anchor link for: org-mode&quot;&gt;🔗&lt;&#x2F;a&gt;

Org mode&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;The swiss army knife&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t really use emacs, I use org mode.
Emacs just happens to be the platform org mode runs on.
At first glance you might confuse org mode to be just another markup language.
But it also offers strong support for literate programming and can be exported to whatever format your heart desires. Project management and scheduling facilities are the cherry on top.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;damn-good-markup&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#damn-good-markup&quot; aria-label=&quot;Anchor link for: damn-good-markup&quot;&gt;🔗&lt;&#x2F;a&gt;

Damn good markup&lt;&#x2F;h2&gt;
&lt;p&gt;At it&#x27;s core, org documents are trees. Your headings are foldable branches of that tree, enableing you to focus on what you are doing and hide away everything else.
This funcitons much like the code folding you know from popular IDEs.
If you really wanted to, you could throw everything in one org document without things getting confusing.
It supports tables to an extent no other markup language does.
Of course it supports standards like &lt;del&gt;strikethrough&lt;&#x2F;del&gt; &lt;em&gt;cursive&lt;&#x2F;em&gt; &lt;em&gt;bold&lt;&#x2F;em&gt; and &lt;code&gt;inline code&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;computational-notebooks&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#computational-notebooks&quot; aria-label=&quot;Anchor link for: computational-notebooks&quot;&gt;🔗&lt;&#x2F;a&gt;

Computational Notebooks&lt;&#x2F;h2&gt;
&lt;p&gt;I had a programming lecture this semester that taught java.
Instead of having many separate files for the exercises, I used one org document that is now 34KB large spanning ~1400 lines.
I used a top level heading for each chapter with subheadings for each exercise.
I wrote my code inside code blocks that I then executed, printing the output right below.
The todo functionality helped me keep track of what exercises I was still missing and my overall progress.
In later chapters I even discovered plantuml which enabled me to make a flowchart and embed it into my document before writing the main code.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re familiar with jupyter notebooks from the python ecosystem, org mode gives you pretty much the same functionality.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;exporting&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#exporting&quot; aria-label=&quot;Anchor link for: exporting&quot;&gt;🔗&lt;&#x2F;a&gt;

Exporting&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re viewing this webpage right now, you may assume that I used some static site generator like hugo or jekyll to generate it, or even wrote the html by hand.
Luckily, I was able to conveniently write this entire page in org mode.
I use the admittedly long keychord of &lt;del&gt;SPC m e h h&lt;&#x2F;del&gt; to export it before checking it in my webbrowser and then pushing the changes to github where this website is hosted.
I&#x27;m really happy with that workflow so far.
In the coming months I may start exporting to odt, latex and pdf while writing my first scientific paper.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;life-management&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#life-management&quot; aria-label=&quot;Anchor link for: life-management&quot;&gt;🔗&lt;&#x2F;a&gt;

Life Management&lt;&#x2F;h2&gt;
&lt;p&gt;I prefer to use my phone for todo and expense tracking, but if I had to do those on my PC, I&#x27;d definitely use org.
Using tables you can easily get detailed financial statistics and if you combine this with literate programming you can easily get your feet wet with more detailed data analysis.
Using org-agenda you can keep track of your todos, schedule and prioritize them as well as use tags if you&#x27;re into that.
Org-capture enables you to take quick notes without interrupting your work, I plan to use this to keep track of my groceries list soon-ish.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;learn-vim-first&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#learn-vim-first&quot; aria-label=&quot;Anchor link for: learn-vim-first&quot;&gt;🔗&lt;&#x2F;a&gt;

Learn vim first&lt;&#x2F;h2&gt;
&lt;p&gt;Some of you reading this might still use a graphical text editor like vscode, atom or sublime text.
If that is the case, contemplate a move towards vim first, you won&#x27;t regret it.
Hopping to emacs from vscode is like ging from crawling to running without ever learning to walk.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;links&quot;&gt;
&lt;a class=&quot;zola-anchor&quot; href=&quot;#links&quot; aria-label=&quot;Anchor link for: links&quot;&gt;🔗&lt;&#x2F;a&gt;

Links&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Official feature preview: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;orgmode.org&#x2F;features.html&quot;&gt;org mode&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Introductory video by DistroTube: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=dr_iBj91eeI&amp;amp;list=PLyy8KUDC8P7X6YkegqrnEnymzMWCNB4bN&amp;amp;index=2&quot;&gt;Getting started with Doom Emacs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;hlissner&#x2F;doom-emacs&quot;&gt;Doom emacs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;syl20bnr&#x2F;spacemacs&quot;&gt;Spacemacs&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>🌸Anime List🌸</title>
          <pubDate>Thu, 17 Mar 2022 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://port19.xyz/anime/</link>
          <guid>https://port19.xyz/anime/</guid>
          <description xml:base="https://port19.xyz/anime/">&lt;h2 id=&quot;favorites&quot;&gt;Favorites&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;movies&quot;&gt;Movies&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;Josee, the Tiger and the Fish&lt;&#x2F;li&gt;
&lt;li&gt;A Silent Voice&lt;&#x2F;li&gt;
&lt;li&gt;Perfect Blue&lt;&#x2F;li&gt;
&lt;li&gt;5 Centimeters per Second&lt;&#x2F;li&gt;
&lt;li&gt;The Garden of Words&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;tv&quot;&gt;TV&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;FLCL Alternative&lt;&#x2F;li&gt;
&lt;li&gt;Girls Last Tour&lt;&#x2F;li&gt;
&lt;li&gt;Highschool of the Dead&lt;&#x2F;li&gt;
&lt;li&gt;Is this a Zombie&lt;&#x2F;li&gt;
&lt;li&gt;Tsukigakirei&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;watching-the-apothecary-diaries&quot;&gt;Watching: The Apothecary Diaries&lt;&#x2F;h2&gt;
&lt;h2 id=&quot;completed&quot;&gt;Completed&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Title&lt;&#x2F;th&gt;&lt;th&gt;Score&lt;&#x2F;th&gt;&lt;th&gt;Length&lt;&#x2F;th&gt;&lt;th&gt;Format&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;5 Centimeters per Second&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;A Silent Voice&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;After The Rain&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BLEND-S&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FLCL Alternative&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Frieren: Beyond Journey&#x27;s End&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;28&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Gabriel Dropout&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Girls Last Tour&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Highschool of the Dead&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Into the Forest of Fireflies Light&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Is this a Zombie?&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Josee, the Tiger and the Fish&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Konosuba 3&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;K-On!&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;K-On! Movie&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;ODDTAXI&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Paranoia Agent&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Perfect Blue&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Garden of Words&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Night is Short, Walk on Girl&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Toradora!&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Tsukigakirei&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Run With The Wind&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;23&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Say &quot;I Love You&quot;.&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Scum&#x27;s Wish&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Weathering With You&lt;&#x2F;td&gt;&lt;td&gt;5&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;AJIN: Demi-Human&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Akira&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Asobi Asobase&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Bakemonogatari&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;15&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Cowboy Bebop - Knockin&#x27; On Heaven&#x27;s Door&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Death Note&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;37&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Death Parade&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer - Swordsmith Village Arc&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Eroge! H mo Game mo Kaihatsu Zanmai&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Flavors of Youth&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FLCL&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;FLCL Progressive&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Frieren: Beyond Journey&#x27;s End Season 2&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Gantz&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ghost in the Shell&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Grave of the Fireflies&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Gunsmith Cats&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Himouto! Umaru-chan&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kiss x Sis&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Konosuba&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Konosuba 2&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;10&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Konosuba - Legend of Crimson&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Mushoku Tensei: Jobless Reincarnation&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Mushoku Tensei: Jobless Reincarnation - Season2&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Neon Genisis Evangelion - The End of Evangelion&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PUPARIA&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;ONA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Spirited Away&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Summer Ghost&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Tekkonkinkreet&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Girl Who Leapt Through Time&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Tokyo Godfathers&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Toradora!: Bento Battle&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Your Name.&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;A Place Further Than The Universe&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Children of the Sea&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Cowboy Bebop&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer Hashira Training Arc&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;8&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer Infinity Train&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Divine Gate&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elfen Lied&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Full Metal Alchemist: Brotherhood&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GANGSTA.&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Grimgar of Fantasy and Ash&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Gunslinger Girl&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Haibaane Renmei&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HELLO WORLD&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;High School of the Dead: Drifters of the Dead&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Himouto! Umaru-chan R&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Himouto! Umaru-chanS&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;Special&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Is the Order a Rabbit?&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Last Exile&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;One-Punch Man&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Serial Experiments Lain&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Pet Girl of Sakurasou&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Tatami Galaxy&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Tsubasa RESERVoir CHRoNiCLE&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Wolf Children&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Attack on Titan&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Attack on Titan Season 2&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer Entertainment District Arc&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;11&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Demon Slayer Infinity Castle Akaza Sairai&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;Movie&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;HELLSING&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;High School DxD&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ikkitousen: Dragon Destiny&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ikkitousen: Great Guardians&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Ikkitousen: Xtreme Xecutor&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Neon Genesis Evangelion&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Aesthetica of a Rogue Hero&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Battle Vixens: Ikki Tousen&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;GOLDEN BOY&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;6&lt;&#x2F;td&gt;&lt;td&gt;OVA&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PSYCHO-PASS&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;22&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Sword Art Online&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;25&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;The Future Diary&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;dropped-paused&quot;&gt;Dropped&#x2F;Paused&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Title&lt;&#x2F;th&gt;&lt;th&gt;Score&lt;&#x2F;th&gt;&lt;th&gt;Progress&lt;&#x2F;th&gt;&lt;th&gt;Format&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Nichijou - My Ordinary Life&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;17&#x2F;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Mob Psycho 100&lt;&#x2F;td&gt;&lt;td&gt;4&lt;&#x2F;td&gt;&lt;td&gt;9&#x2F;37&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Durarara&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;13&#x2F;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Hamatora&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;12&#x2F;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Lord of Mysteries&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;3&#x2F;13&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;One Piece&lt;&#x2F;td&gt;&lt;td&gt;3&lt;&#x2F;td&gt;&lt;td&gt;30&#x2F;&amp;gt;1000&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Blast of Tempest&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;2&#x2F;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Nekopara&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;4&#x2F;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;K-On!!&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;10&#x2F;26&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Sonny Boy&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;8&#x2F;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Toradora! SOS! Hurray for Gourmands&lt;&#x2F;td&gt;&lt;td&gt;2&lt;&#x2F;td&gt;&lt;td&gt;2&#x2F;4&lt;&#x2F;td&gt;&lt;td&gt;Special&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Dorei-ku The Animation&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;6&#x2F;12&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Food Wars! Shokugeki no Soma&lt;&#x2F;td&gt;&lt;td&gt;1&lt;&#x2F;td&gt;&lt;td&gt;2&#x2F;24&lt;&#x2F;td&gt;&lt;td&gt;TV&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;sourcing&quot;&gt;Sourcing&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nyaa.si&#x2F;&quot;&gt;nyaa&lt;&#x2F;a&gt;, sort by seeders and then pick a release that looks good&lt;&#x2F;li&gt;
&lt;li&gt;To watch torrented anime with a friend I recommend peer to peer file transfer via syncthing and then using syncplay for viewing&lt;&#x2F;li&gt;
&lt;li&gt;If you don&#x27;t have a vpn, try &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;pystardust&#x2F;ani-cli&quot;&gt;ani-cli&lt;&#x2F;a&gt;, it has syncplay support&lt;&#x2F;li&gt;
&lt;li&gt;Avoid using a web browser to watch anime. It&#x27;s highly cringe&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
    </channel>
</rss>
