<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Work on Janusworx</title>
    <link>https://janusworx.com/categories/work/</link>
    <description>Recent content in Work on Janusworx</description>
    <image>
      <title>Janusworx</title>
      <url>https://janusworx.com/images/jw-logo.png</url>
      <link>https://janusworx.com/images/jw-logo.png</link>
    </image>
    <generator>Hugo -- 0.163.0</generator>
    <language>en</language>
    <lastBuildDate>Fri, 22 May 2026 16:13:29 +0530</lastBuildDate>
    <atom:link href="https://janusworx.com/categories/work/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Matthias Endler Built His Own Newsletter Setup</title>
      <link>https://janusworx.com/work/matthias-endler-built-his-own-newsletter-setup/</link>
      <pubDate>Fri, 22 May 2026 16:13:29 +0530</pubDate>
      <guid>https://janusworx.com/work/matthias-endler-built-his-own-newsletter-setup/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://janusworx.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css&#34; integrity=&#34;sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition info&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path d=&#34;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Intended Audience&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;Mostly me (confirmation bias. slight gloating 😂)&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;&lt;br&gt;

&lt;figure class=&#34;align-center &#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://janusworx.com/images/2026/matthias-endler-newsletter-setup-rust-in-production.jpg#center&#34;
         alt=&#34;Rust in Production podcast logo&#34; width=&#34;500px&#34;/&gt; 
&lt;/figure&gt;

&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;p&gt;I’m writing this post today, because I monkeyed with my &lt;a href=&#34;https://janusworx.com/work/found-mjml/&#34;&gt;newsletter template&lt;/a&gt;. &lt;em&gt;&lt;strong&gt;Again!&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
So this post is just to make sure there are no more hiccoughs :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[
            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Mostly me (confirmation bias. slight gloating 😂)</p>
      </div>
    </div><br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2026/matthias-endler-newsletter-setup-rust-in-production.jpg#center"
         alt="Rust in Production podcast logo" width="500px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I’m writing this post today, because I monkeyed with my <a href="/work/found-mjml/">newsletter template</a>. <em><strong>Again!</strong></em><br>
So this post is just to make sure there are no more hiccoughs :)</p>
<p>Matthias Endler, he of the fantastic <a href="https://corrode.dev/podcast/s06e04-rust4linux/">Rust in Production podcast</a> (and the Corrode rust consultancy) just published <a href="https://endler.dev/2026/newsletter-setup/">a post on his newsletter setup</a> and how he went about building it.</p>
<p>His reasons (and his story) are really similar to mine.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
Tinyletter =&gt; Mailchimp =&gt;<br>
Wanting to have a semblance of control after being burnt =&gt; Self hosting!</p>
<p>He settled on <a href="https://www.useplunk.com/">Plunk</a>, while I use my <a href="https://sendy.co">Sendy</a> + Amazon SES combo. (they look pretty similar to me)<br>
Newsletters live in a git controlled repo. Same.<br>
Write in my favourite editor. Ditto.<br>
One markdown file per letter. Same pinch!</p>
<p>The only difference, is his workflow is controlled by a fancy cli, while I depend on ye old copy &amp; paste.</p>
<p>Having someone with a visible presence do this, hopefully serves as an inspiration to others.<br>
I just wish more of my nerd kinfolk do this!</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Matthias Endler Built His Own Newsletter Setup
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>except for his audience ofcourse! Which is orders of magnitude larger than my dinky little circle of friends&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Found MJML</title>
      <link>https://janusworx.com/work/found-mjml/</link>
      <pubDate>Thu, 21 May 2026 10:51:49 +0530</pubDate>
      <guid>https://janusworx.com/work/found-mjml/</guid>
      <description>&lt;br&gt;


            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://janusworx.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css&#34; integrity=&#34;sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition info&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path d=&#34;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Intended Audience&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;Mostly me.&lt;br&gt;
Also hopefully, other folks struggling with, or looking for a way to create email newsletters.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<br>


            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Mostly me.<br>
Also hopefully, other folks struggling with, or looking for a way to create email newsletters.</p>
      </div>
    </div><figure class="align-center ">
    <img loading="lazy" src="/images/2026/mjml-logo.svg#center"
         alt="MJML SVG logo" width="500px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I recently upgraded <a href="https://sendy.co/">Sendy</a>, the software, I’m using to create and send my newsletters.<br>
(I don’t need the new shiny, or the extra features, but also those folks have been pretty good as far as pricing and functionality go, and I want them to stick around for a long time.)</p>
<p>The new release, in addition to a refreshed interface, now features a block WYSIWYG editor. And my old template (based on the venerable <a href="https://github.com/internations/antwort">Antwort</a>) that I used to compose my emails broke. What used to be a predictable way of writing emails, now turned into something filled with papercuts. Everything would look alright, but everything was ever so subtly out of place.</p>
<p>So I went looking for something that I could live with long term once again.<br>
Since all of this is a personal hobby and I only use all of this to send mail to a handful of my friends, most of the paid options go right out of the window, because. And because I am a control freak, hosted options aren’t a thing for me either.</p>
<p>Enter <a href="https://mjml.io/">MJML</a>.<br>
From their website:</p>
<blockquote>
<p>MJML was created in early 2015 by a team of Mailjet developers while they were working on Passport, Mailjet’s drag-and-drop interface for creating responsive emails. Having been knee deep in email for five years, the Mailjet team saw two things: a) email HTML is antiquated and not developer friendly b) a growing trend of email being viewed on mobile and tablet and the number of screens is only increasing. This means that finding a way to code responsive email easily and quickly is pretty important. The team started by creating a new markup language that would abstract the complexity of responsive HTML and automatically generate it. And that’s how MJML was born.</p>
<p>After learning so much from our users, we wanted to give back to the community by sharing this open-source framework to make responsive email easier and redefine the coding experience once and for all.</p>
</blockquote>
<p>It works in the same vein as <a href="https://revealjs.com/">revealjs</a>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
You install the tool and use their semantic markup to write a document.<br>
The MJML cli tool, in this case, then renders it to email worthy HTML.<br>
The <a href="https://documentation.mjml.io/#mjml-guide">markup</a> is simple and well thought out. Writing it is a breeze.<br>
I used Timo Reymann’s <a href="https://plugins.jetbrains.com/plugin/16418-mjml-support">MJML plugin</a> for Jetbrains editors to help me write, which makes things even easier, since it let’s me preview my work live.</p>
<p>I took one of their pretty templates, <a href="https://mjml.io/try-it-live/templates/recast">Recast</a> and then stripped it down to meet my needs and match it as closely as I could to my old customised Antwort template.</p>
<p>Now all I do, is write, copy the HTML into the sendy editor and send. Life is good!</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Found MJML
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Or does revealjs work in the same vein as mjml?&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes &amp; CNCF Awards</title>
      <link>https://janusworx.com/work/kubernetes-cncf-awards/</link>
      <pubDate>Mon, 20 Apr 2026 11:15:00 +0530</pubDate>
      <guid>https://janusworx.com/work/kubernetes-cncf-awards/</guid>
      <description>&lt;link rel=&#34;stylesheet&#34; href=&#34;https://janusworx.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css&#34; integrity=&#34;sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition info&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path d=&#34;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Intended Audience&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;Mostly me.&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;&lt;br&gt;

&lt;figure&gt;
&lt;a href=&#34;https://janusworx.com/images/2026/cncf-k8s-awards.jpg&#34;&gt;&lt;img style=&#34;display:flex;justify-content:center;&#34; src=&#34;https://janusworx.com/images/2026/cncf-k8s-awards-s.jpg&#34;  alt=&#34;Diptych of two award photos&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;figcaption style=&#34;font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)&#34;&gt;
&lt;p&gt;Click the image to embiggen!&lt;/p&gt;</description>
      <content:encoded><![CDATA[
            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Mostly me.</p>
      </div>
    </div><br>

<figure>
<a href="/images/2026/cncf-k8s-awards.jpg"><img style="display:flex;justify-content:center;" src="/images/2026/cncf-k8s-awards-s.jpg"  alt="Diptych of two award photos"></a>
</figure>
<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>Click the image to embiggen!</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>This is a note of gratitude.<br>
A tad late. But better late than never :)</p>
<p>I decided to get involved with the Kubernetes community on a lark about four years ago.<br>
I wanted to learn about containers and orchestration, and I thought learning via joining the upstream community was it.</p>
<p>I was wrong 😂<br>
Life got in the way and I only finally got around to learning it all last December.</p>
<p>But the community was interesting and helpful.<br>
I got to learn the terms of art, by osmosis.<br>
I got to see how a large community functions, how a large software project was run.</p>
<p>And in time, I got to pitch in and help a bit as well.<br>
I pitched in with the Release Team for v1.25 to gain a sense of how a release comes about.<br>
And a couple of years ago, I saw my good friend (and frequent collaborator) Priyanka buckling a bit under the weight of the work, in the <a href="https://psaggu.com/about.html">various roles</a> she had assumed to help out in the community. I asked her if there was anyway I could help her, that did <em>not</em> involve meetings or talking to people 😂<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>
And she asked me if I could pitch in and help with helping folks gain membership into various Kubernetes orgs on Github.</p>
<p>I ayed.</p>
<p>She taught me the ropes. And I became a <a href="https://github.com/kubernetes/community/tree/main/github-management#new-membership-coordinator">Github New Membership Coordinator</a> for the Kubernetes project.</p>
<p>And all of this history to say, I’m grateful to Priyanka for this serendipitous opportunity.<br>
I fell in love with the work.<br>
For someone who has had to face a lot of cynicism in his real world day job, it’s been a lot of joy, welcoming folks into the project. It’s one of the happier parts of my day, when I sit at the desk to process the requests that come in.</p>
<p>I’m also grateful to the Kubernetes as well as the overarching CNCF communities for recognising what I do, for two successive years.<br>
I was the recipient of the <a href="https://www.kubernetes.dev/community/awards/2024/#:~:text=Jason%20Braganza">Kubernetes Contributor award in 2024</a> and the <a href="https://www.cncf.io/announcements/2025/11/12/cncf-honors-innovators-and-defenders-with-2025-community-awards-at-kubecon-cloudnativecon-north-america/#:~:text=Mario%20Jason%20Braganza">CNCF’s, Chop Wood Carry Water award in 2025</a>.<br>
I’m both, honoured and humbled.<br>
I hope to contribute to this community, a while longer :)</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Kubernetes &amp; CNCF Awards
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I was well and truly burned out then&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Trying a Different Tack to Writing Work Posts</title>
      <link>https://janusworx.com/work/trying-a-different-tack-to-writing-work-posts/</link>
      <pubDate>Mon, 20 Apr 2026 11:00:00 +0530</pubDate>
      <guid>https://janusworx.com/work/trying-a-different-tack-to-writing-work-posts/</guid>
      <description>Just for reference</description>
      <content:encoded><![CDATA[
            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>My tiny audience, who reads these posts via email or rss</p>
      </div>
    </div><br>

<p>My last post in this section / category was in <a href="/work/the-big-plan-change-my-vm-to-be-gitops-driven/">December</a>.<br>
There ought to be more, because I learn so much every week.<br>
Even in December, the massive move I did, needs documenting. (at least for me, if not for your reading)</p>
<p>So the new plan is to cut the <em>doing</em> and the learning in half (or by a third). And use that time to write about what I learned.<br>
I know this about myself. I write real good … sometimes. But to even get to that point, I have to write a <em>lot of drivel.</em></p>
<p>So, in essence, welcome to the drivel :)<br>
The posts will get more frequent, so if that bothers you or I write about things that aren’t what you came to read me for, I won’t hold it against you if you choose to unsubscribe. I need to be able to write for me. And this is the only place where I can.</p>
<p>If you do decide to stay and read, as always, I’m grateful. I truly am.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Trying a Different Tack to Writing Work Posts
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>The Big Plan: Change My VM to Be Gitops Driven</title>
      <link>https://janusworx.com/work/the-big-plan-change-my-vm-to-be-gitops-driven/</link>
      <pubDate>Fri, 19 Dec 2025 18:00:00 +0530</pubDate>
      <guid>https://janusworx.com/work/the-big-plan-change-my-vm-to-be-gitops-driven/</guid>
      <description>Just for reference</description>
      <content:encoded><![CDATA[
            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Me!</p>
      </div>
    </div><p><em>Update 2025-12-19: All done!</em></p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I just finished a move from one Hetzner VM to another.<br>
The type of VMs are the same, in fact.<br>
It’s just that the new VM and all the software on it are entirely software driven. I kept logging my progress in my <a href="/nm">notes</a>, copy pasting the plan from day to day and ticking things off.<br>
Now that it’s done and I <em>still</em> want to <a href="/nm/2025-12-12">refer to it regularly</a>, as the rest of the services come over, I wanted a place to keep it. And so this post, it is.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h2 id="list-of-services-that-absolutely-need-to-come-over-miscellaneous-stuff-later">List of services that absolutely need to come over. Miscellaneous stuff later.</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> the main domain</li>
<li><input checked="" disabled="" type="checkbox"> french version of the website</li>
<li><input checked="" disabled="" type="checkbox"> the mastodon archive</li>
<li><input checked="" disabled="" type="checkbox"> the email distribution list</li>
<li><input checked="" disabled="" type="checkbox"> miniflux for rss feeds</li>
<li><input checked="" disabled="" type="checkbox"> joplin</li>
<li><input checked="" disabled="" type="checkbox"> baikal</li>
<li><input checked="" disabled="" type="checkbox"> <del>discourse</del> (no more discourse!)</li>
<li><input checked="" disabled="" type="checkbox"> markdown editor (hedgedoc)</li>
<li><input checked="" disabled="" type="checkbox"> anki</li>
<li><input checked="" disabled="" type="checkbox"> huginn</li>
<li><input checked="" disabled="" type="checkbox"> syncthing</li>
<li><input checked="" disabled="" type="checkbox"> IRC: theLounge + znc (see if we can make do with a single service now <em>(2025-12-15: we could!)</em>)</li>
<li><input checked="" disabled="" type="checkbox"> kanboard</li>
<li><input checked="" disabled="" type="checkbox"> Certs, Move them over, or figure out a way to generate and renew them via Ansible</li>
</ul>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h2 id="the-big-point-of-the-big-plan">The Big Point of The Big Plan</h2>
<ul>
<li>Save time and energy. Managing all the disparate services I use is taking more and more of my time. I need to claim that back, while being able to use said services.</li>
<li>Be gitops driven. Managing stuff gets easier. Tearing down things and rebuilding them gets easier</li>
<li>Have most everything I use, be in a Kubernetes cluster.</li>
<li>Be pragmatic enough to know that everything cannot be in a Kubernetes cluster and will have to live in the root VM</li>
<li>Have Flux CD manage everything in the cluster</li>
<li>Have Ansible Pull manage everything in the VM, acting as my single node. The point of doing this is not idempotency, rather to have everything in code; something that I can comment and uncomment and manipulate at will, something I can update at will and something that is documented. Never again will Future Jason have to scratch his head about, just how to go about doing something. <em>(Long term note to self: Have the discipline to write tasks and drive everything with Ansible, despite the ease of “just doing it at the command line”)</em></li>
</ul>
<h2 id="the-big-plan-done-">The Big Plan (<em>Done!</em> 🎉🎉🎉)</h2>
<ul>
<li>The plan is to redo the cluster again and do my own instance of
<ul>
<li><input checked="" disabled="" type="checkbox"> K3s</li>
<li><input checked="" disabled="" type="checkbox"> Sealed Secrets</li>
<li><input checked="" disabled="" type="checkbox"> Flux CD</li>
<li><input checked="" disabled="" type="checkbox"> <del>Certmanager</del> (Not using it)</li>
<li><input checked="" disabled="" type="checkbox"> <del>Letsencrypt</del> (using pre existing Letsencrypt certs)</li>
<li><input checked="" disabled="" type="checkbox"> Get Traefik Ingress to work</li>
<li><input checked="" disabled="" type="checkbox"> Figure out a way to get certs automatically into the cluster</li>
</ul>
</li>
<li>And once <em>that</em> is done, figure out an app to move (Miniflux or Hedgedoc?); 2025-12-03: Kanboard it is!</li>
<li>Begin by moving (lifting and shifting in popular parlance) Kanboard to the cluster
<ul>
<li><input checked="" disabled="" type="checkbox"> Cert will probably be needed (Wildcard cert works now, just like it does without the cluster)</li>
<li><input checked="" disabled="" type="checkbox"> Convert a docker-compose to kubernetes manifests</li>
<li><input checked="" disabled="" type="checkbox"> Learn how to configure an app with code</li>
<li><input checked="" disabled="" type="checkbox"> Learn how to store data and back it up</li>
<li><input checked="" disabled="" type="checkbox"> Figure out secrets, if there are any (for now sealed secrets ok, figure out vault and vault injection later)</li>
<li><input checked="" disabled="" type="checkbox"> Learn how to tunnel through and reverse proxy</li>
<li><input checked="" disabled="" type="checkbox"> Make Kubernetes manifests work with flux</li>
<li><input checked="" disabled="" type="checkbox"> Figure out how to automate deployment of manual manifests</li>
<li><input checked="" disabled="" type="checkbox"> Figure out how to migrate there if there is any in an old app</li>
<li><input checked="" disabled="" type="checkbox"> Figue out how to automate updation of images in manual manifests</li>
<li><input checked="" disabled="" type="checkbox"> Get another app (Miniflux) deployed</li>
<li><input checked="" disabled="" type="checkbox"> Figure out what needs to happen as part of the lifecycle. What you want in the cluster, what stays out, do they intersect, how do updates of cluster happen? VM (node) updates as well?</li>
<li><input checked="" disabled="" type="checkbox"> Then begin to think along the lines of Live Deploys. Prototype locally and once it works, migrate to production immediately</li>
<li><input disabled="" type="checkbox"> Convert Kubernetes manifests to Helm Charts (optional, based on energy)</li>
</ul>
</li>
<li>Go live! Git is source of truth. Two repos.
<ul>
<li><input checked="" disabled="" type="checkbox"> One for the Main node and its update
<ul>
<li><input checked="" disabled="" type="checkbox"> Terraform will provision node and install package, setup firewall</li>
<li><input checked="" disabled="" type="checkbox"> Figure out how to get Terraform to get the node talking to the git forge</li>
<li><input checked="" disabled="" type="checkbox"> Structure repo, copy every thing node related there, and make sure stuff gets updated periodically and if possible, idempotantly, via ansible pull and a systemd timer</li>
</ul>
</li>
<li><input checked="" disabled="" type="checkbox"> The other one for k3s and flux
<ul>
<li><input checked="" disabled="" type="checkbox"> Convert everything I have done locally to run on prod. Add more steps as you do them below</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="unrelated-long-term-optional-just-here-so-that-i-remember">Unrelated. Long term. Optional. Just here so that I remember</h2>
<ul>
<li><input checked="" disabled="" type="checkbox"> Get Moi publish script running</li>
<li><input checked="" disabled="" type="checkbox"> Redo Huginn Scenarios</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: The Big Plan: Change My VM to Be Gitops Driven
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Moved From Reeder to Readkit</title>
      <link>https://janusworx.com/work/moved-from-reeder-to-readkit/</link>
      <pubDate>Mon, 17 Nov 2025 08:59:16 +0530</pubDate>
      <guid>https://janusworx.com/work/moved-from-reeder-to-readkit/</guid>
      <description>Le client du RSS est mort, vive le client du RSS!</description>
      <content:encoded><![CDATA[<p><br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/moved-from-reeder-to-readkit-00.jpg#center"
         alt=" "/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

I used <a href="https://reederapp.com/">Reeder</a> for reading all my <a href="https://en.wikipedia.org/wiki/RSS">RSS feeds</a> ever since the app launched over fifteen years ago. RSS is how I keep up with everything in the world outside and having a pleasant reading experience is very important to me.</p>
<p>It no longer serves that need for me.<br>
For a long time, the way the app worked aligned with the way I want to read. Earlier this year though, the developer decided to take the app in a different direction, with a different reading experience. The older app is still available as Reeder Classic, but only a few months of use have shown me that the app is basically abandoned. The attention to detail is obviously now being applied to the new app.</p>
<p>Enter <a href="https://readkit.app/">ReadKit</a>.<br>
I had used it briefly during the <a href="https://en.wikipedia.org/wiki/Google_Reader#Discontinuation">Google Reader apocalypse</a> when every feed reader was scrambling to find new backends to sync to. Reeder similarly had switched to local only mode and was taking a while before it supported other services.<br>
ReadKit in the meanwhile already had support for Feedwrangler, and so I switched to it until Reeder came back to speed.</p>
<p>And I’ve switched to it for the foreseeable future.<br>
It looks beautiful!<br>
It does everything I want, shows everything the way and want and behaves just the way I want it to. The only knock I have against it, is that it does not feel as <em>fluid</em> as Reeder does. But that’s nothing compared to the constant launch and relauch dance, I have to do with Reeder nowadays. Consistency and stability matter a lot to me.<br>
Even better, it syncs natively with <a href="https://miniflux.app/">Miniflux</a>, the service I use to actually fetch and read RSS feeds on my Linux desktop. No more Google Reader API!</p>
<p>This is a list of all my categories (with one of them expanded, click for a larger view)</p>
<p><a href="/images/2025/moved-from-reader-to-readkit-01-categories.jpg"><figure class="align-center ">
    <img loading="lazy" src="/images/2025/moved-from-reader-to-readkit-01-categories.jpg#center"
         alt="Readkit App Screenshot" width="800px"/> 
</figure>
</a></p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>and this is a list of unread articles in a feed, alongside one that is open (once again, click to enlarge if you want to see details)</p>
<p><a href="/images/2025/moved-from-reader-to-readkit-02-feeds.jpg"><figure class="align-center ">
    <img loading="lazy" src="/images/2025/moved-from-reader-to-readkit-02-feeds.jpg#center"
         alt="Readkit App Screenshot" width="800px"/> 
</figure>
</a>
<br>
</p>
<p>That gnawing feeling has now gone away from the back of my brain.<br>
The experience of reading and catching up with the world is once again a <em>glorious</em> experience thanks to ReadKit.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Moved From Reeder to Readkit
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/moved-from-reeder-to-readkit
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Kubernetes, Note to Self: Need Load Balancer Installed on Bare Metal</title>
      <link>https://janusworx.com/work/kubernetes-note-to-self-need-load-balancer-installed-on-bare-metal/</link>
      <pubDate>Tue, 11 Nov 2025 07:37:54 +0530</pubDate>
      <guid>https://janusworx.com/work/kubernetes-note-to-self-need-load-balancer-installed-on-bare-metal/</guid>
      <description>&lt;br&gt;

&lt;figure class=&#34;align-center &#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://janusworx.com/images/2025/kubernetes.svg#center&#34; width=&#34;600px&#34;/&gt; 
&lt;/figure&gt;

&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;


            &lt;link rel=&#34;stylesheet&#34; href=&#34;https://janusworx.com/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css&#34; integrity=&#34;sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=&#34; crossorigin=&#34;anonymous&#34;&gt;
    &lt;div class=&#34;admonition info&#34;&gt;
      &lt;div class=&#34;admonition-header&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path d=&#34;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&#34;/&gt;&lt;/svg&gt;
        &lt;span&gt;Intended Audience&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&#34;admonition-content&#34;&gt;
        &lt;p&gt;Mostly me. Also other grizzly sysadmins who are learning devops like me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/kubernetes.svg#center" width="600px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>


            <link rel="stylesheet" href="/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css" integrity="sha256-U82fivqdmorAkJP2aN8Fe8bQ9LvQiG85mRp7mZNKdDI=" crossorigin="anonymous">
    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Mostly me. Also other grizzly sysadmins who are learning devops like me.</p>
      </div>
    </div><p>One thing that bit me when I was trying to expose my apps to the world when working on the home cluster, is that Kubernetes on bare metal—I was using Kind at the time—expects to talk to a load balancer service, which then talk to an actual load balancer. Which if you are using bare metal, you won’t usually have.<br>
I had to then go expose a “NodePort” to gain access from outside.</p>
<p>So to expose my stuff in as “<a href="https://www.scotthyoung.com/blog/2020/05/04/do-the-real-thing/">real world</a>” a way as possible, we need to:</p>
<ol>
<li>Either install a load balancer implementation like <a href="https://metallb.io/">MetalLB</a>. OR</li>
<li>Use a Kubernetes distribution that has a load balancer implementation built-in, like <a href="https://k3s.io">K3s</a>.</li>
</ol>
<p>I chose option 2 and used K3s, because I am, as they say in popular parlance, using Kubernetes at the edge.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
In which case, I prefer to have as many batteries built-in as possible.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: Kubernetes, Note to Self: Need Load Balancer Installed on Bare Metal
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/kubernetes-note-to-self-need-load-balancer-installed-on-bare-metal
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Although, from the articles I’ve read, if you’re doing a multiple node cluster, then you’re better off using MetalLB.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>K3s: Move Data Folder</title>
      <link>https://janusworx.com/work/k3s-move-data-folder/</link>
      <pubDate>Mon, 10 Nov 2025 16:50:45 +0530</pubDate>
      <guid>https://janusworx.com/work/k3s-move-data-folder/</guid>
      <description>It’s all about the data!</description>
      <content:encoded><![CDATA[<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/k3s.svg#center" width="600px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>


    <div class="admonition info">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336l24 0 0-64-24 0c-13.3 0-24-10.7-24-24s10.7-24 24-24l48 0c13.3 0 24 10.7 24 24l0 88 8 0c13.3 0 24 10.7 24 24s-10.7 24-24 24l-80 0c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z"/></svg>
        <span>Intended Audience</span>
      </div>
      <div class="admonition-content">
        <p>Mostly me. Also other grizzly sysadmins who are learning devops like me.</p>
      </div>
    </div><h2 id="problem">Problem</h2>
<p>My main SSD is too small to hold all my kubernetes and K3s shenanigans. (It’s only about 512gb)
So I need a way to move my K3s data folder out to my big HDD.</p>
<h2 id="solution">Solution</h2>

    <div class="admonition caution">
      <div class="admonition-header"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z"/></svg>
        <span>Caution</span>
      </div>
      <div class="admonition-content">
        <p>Before you do any of the following, make sure to stop the cluster with:<br>
<code>sudo systemctl stop k3s</code></p>
      </div>
    </div><p>K3s supports having a<a href="https://docs.k3s.io/cli/server#data"> custom data directory</a>, by letting me specify a <code>data-dir</code>.<br>
I decided to specify it in the <a href="https://docs.k3s.io/installation/configuration#configuration-file">K3s <code>config</code> file</a> at <code>/etc/rancher/k3s/config</code>.<br>
If it isn’t there (as it wasn’t in my case), just create one. You’ll need to do this as the <code>root</code> user.<br>
This is what I now have in there.</p>
<pre tabindex="0"><code>data-dir: /BIGHDD/rancher/k3s
</code></pre><p>And then, I …</p>
<ol>
<li>Created a <code>rancher</code> directory in my big hard disk. (<code>root</code> owns it)</li>
<li>Ran rsync as the <code>root</code> user: <code>rsync -a /var/lib/rancher/k3s/ /BIGHDD/rancher/k3s/</code></li>
<li>Started up my cluster again with a <code>sudo systemctl start k3s</code></li>
</ol>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: K3s: Move Data Folder
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/k3s-move-data-folder
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Hugo Redirect From Post in One Section to Another</title>
      <link>https://janusworx.com/work/hugo-redirect-from-post-in-one-section-to-another/</link>
      <pubDate>Thu, 06 Nov 2025 08:34:36 +0530</pubDate>
      <guid>https://janusworx.com/work/hugo-redirect-from-post-in-one-section-to-another/</guid>
      <description>&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;I have a post in one section of my site, say &lt;a href=&#34;https://janusworx.com/nm/2025-11-06/&#34;&gt;notes and miscellanea&lt;/a&gt;&lt;br&gt;
That is my canonical post.&lt;br&gt;
But I also need it to show up in the work section of my site, possibly with a another name.&lt;br&gt;
A Hugo &lt;code&gt;alias&lt;/code&gt; in the &lt;code&gt;yaml&lt;/code&gt; front matter does not work, since both sections exist and Hugo gets confused.&lt;/p&gt;
&lt;h2 id=&#34;solution&#34;&gt;Solution&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Make sure &lt;code&gt;layouts/redirect/single.html&lt;/code&gt; exists within your Hugo folder structure and it contains just this line …&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;template&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;alias.html&amp;#34;&lt;/span&gt; (&lt;span style=&#34;color:#a6e22e&#34;&gt;dict&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Permalink&amp;#34;&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;Params&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;target&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;}}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Create your &lt;a href=&#34;https://janusworx.com/nm/2025-11-06/&#34;&gt;orginal post&lt;/a&gt; as usual&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Then&lt;/em&gt; go create a post in your &lt;em&gt;other&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; section with the following metadata:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;Your title here&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#date autogenerated by my archetype. if missing, add date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;2025-11-06T08:30:54&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;+05&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;target&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;url-to-redirect-to&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;summary&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;&amp;lt;Optional text, that will appear in the sectiones listing page&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;The &lt;code&gt;date&lt;/code&gt; field is critical. The post might not appear where you expect it, if it’s absent.&lt;br&gt;
If not date, then you might need to use &lt;code&gt;weight&lt;/code&gt;. One of the two is needed.&lt;/li&gt;
&lt;li&gt;In my case, the metadata looked like this:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;title&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;The Plan for My New Hetzner VM&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;date&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;2025-11-06T08:30:54&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;+05&lt;/span&gt;:&lt;span style=&#34;color:#ae81ff&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;type&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;redirect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;target&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;/nm/2025-11-06/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;summary&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;Alone and helpless, like you&amp;#39;ve lost your fight &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;Done! You can see an entry for “The Plan for My New Hetzner VM” in my work section as you see in the pic below. &lt;a href=&#34;https://janusworx.com/work/the-plan-for-my-new-hetzner-vm/&#34;&gt;Clicking that&lt;/a&gt; will redirect to the actual post in my &lt;a href=&#34;https://janusworx.com/nm/2025-11-06/&#34;&gt;Notes and Miscellanea&lt;/a&gt; section!&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&#34;align-center &#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://janusworx.com/images/2025/hugo-redirect-from-post-in-one-section-to-another.png#center&#34;
         alt=&#34;Hugo Section with Post entries&#34;/&gt; 
&lt;/figure&gt;

&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;Tada 🎉&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

Feedback on this post?&lt;br&gt;
Mail me at &lt;a href=&#34;mailto:feedback@janusworx.com?subject=%22Feedback on post: Hugo Redirect From Post in One Section to Another
%22&#34;&gt;feedback at this domain&lt;/a&gt; or &lt;a href=&#34;https://dc.janusworx.com/t/hugo-redirect-from-post-in-one-section-to-another
&#34;&gt;continue the discourse here&lt;/a&gt;.
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href=&#34;https://janusworx.com/subscribe/&#34;&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="problem">Problem</h2>
<p>I have a post in one section of my site, say <a href="/nm/2025-11-06/">notes and miscellanea</a><br>
That is my canonical post.<br>
But I also need it to show up in the work section of my site, possibly with a another name.<br>
A Hugo <code>alias</code> in the <code>yaml</code> front matter does not work, since both sections exist and Hugo gets confused.</p>
<h2 id="solution">Solution</h2>
<ol>
<li>Make sure <code>layouts/redirect/single.html</code> exists within your Hugo folder structure and it contains just this line …</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-golang" data-lang="golang"><span style="display:flex;"><span>{{<span style="color:#f92672">-</span> <span style="color:#a6e22e">template</span> <span style="color:#e6db74">&#34;alias.html&#34;</span> (<span style="color:#a6e22e">dict</span> <span style="color:#e6db74">&#34;Permalink&#34;</span> .<span style="color:#a6e22e">Params</span>.<span style="color:#a6e22e">target</span>) <span style="color:#f92672">-</span>}}
</span></span></code></pre></div><ol start="2">
<li>Create your <a href="/nm/2025-11-06/">orginal post</a> as usual</li>
<li><em>Then</em> go create a post in your <em>other</em><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> section with the following metadata:</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#ae81ff">&lt;Your title here&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#date autogenerated by my archetype. if missing, add date</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2025-11-06T08:30:54</span><span style="color:#ae81ff">+05</span>:<span style="color:#ae81ff">30</span> 
</span></span><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">redirect</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">target</span>: <span style="color:#ae81ff">&lt;url-to-redirect-to&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">summary</span>: <span style="color:#ae81ff">&lt;Optional text, that will appear in the sectiones listing page&gt;</span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><ol start="4">
<li>The <code>date</code> field is critical. The post might not appear where you expect it, if it’s absent.<br>
If not date, then you might need to use <code>weight</code>. One of the two is needed.</li>
<li>In my case, the metadata looked like this:</li>
</ol>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#e6db74">&#34;The Plan for My New Hetzner VM&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2025-11-06T08:30:54</span><span style="color:#ae81ff">+05</span>:<span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">type</span>: <span style="color:#ae81ff">redirect</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">target</span>: <span style="color:#ae81ff">/nm/2025-11-06/</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">summary</span>: <span style="color:#ae81ff">Alone and helpless, like you&#39;ve lost your fight </span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></div><ol start="6">
<li>Done! You can see an entry for “The Plan for My New Hetzner VM” in my work section as you see in the pic below. <a href="/work/the-plan-for-my-new-hetzner-vm/">Clicking that</a> will redirect to the actual post in my <a href="/nm/2025-11-06/">Notes and Miscellanea</a> section!</li>
</ol>
<figure class="align-center ">
    <img loading="lazy" src="/images/2025/hugo-redirect-from-post-in-one-section-to-another.png#center"
         alt="Hugo Section with Post entries"/> 
</figure>

<ol start="7">
<li>Tada 🎉</li>
</ol>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: Hugo Redirect From Post in One Section to Another
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/hugo-redirect-from-post-in-one-section-to-another
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>in my case, <a href="/work">work</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>2025-11-06 Notes aka The Plan for My New Hetzner VM</title>
      <link>https://janusworx.com/nm/2025-11-06/</link>
      <pubDate>Thu, 06 Nov 2025 08:03:54 +0530</pubDate>
      <guid>https://janusworx.com/nm/2025-11-06/</guid>
      <description>Alone and helpless, like you&amp;rsquo;ve lost your fight</description>
      <content:encoded><![CDATA[<h2 id="update-2025-12-11">Update: <a href="/nm/2025-12-11">2025-12-11</a></h2>
<ul>
<li><a href="/nm/2025-12-11"><em>I got it done!</em></a></li>
</ul>
<h2 id="preamble">Preamble</h2>
<p>If this post is weird and stream of consciousness like, that’s by design.<br>
You are seeing a <a href="/">notes and miscellanea</a> post, in the work category.<br>
I want to be able to think through what I am doing. Mostly to clarify, document and explicitly state <em><strong>what</strong></em> I want. To avoid shifting goalposts (or rather to shift them intentionally, if need be.)<br>
I’ll be updating and revising this post as I think and learn and experience things</p>
<h2 id="goals">Goals</h2>
<ul>
<li>Think about and write what I want to get done with my hetzner</li>
<li>For now, the how does not matter</li>
</ul>
<h2 id="what-i-want">What I want</h2>
<ul>
<li>A VM running K3s, that I can deploy my Hugo website to, as well all the apps that I choose to run on Janusworx</li>
<li>My main need with a cluster is the GitOps aspect. Not the scaling or redundancy.
I want infrastructure as code and automated updates, as much as possible.</li>
<li>Everything goes through my Forgejo instance at home</li>
<li>I write a post and it should deploy to the website somehow</li>
<li>Apps that I put in there, either just my config files of already published images/deployments, or my own custom things, ought to be pushed to or pulled by the cluster and deployed. Upgrades should be a matter of manipulating code</li>
<li>Secrets should be self hosted, via environment variables or some self hosted solution. Never at a third party service</li>
</ul>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="2025-11-06-0935">2025-11-06 09:35</h3>
<ul>
<li>Got tangled with Hugo in the morning.</li>
<li>I think I got the basics down, the VM comes up. K3s in installed, but in what order do I move my apps over?</li>
<li>Think I’ll the root domail last. And try beginning with the “simpler” apps first</li>
<li>Begin with familiarising myself with Helm</li>
<li><em>2025-11-06 10:06:</em> Tea break</li>
<li><em>2025-11-06 13:06:</em> Lunch break</li>
</ul>
<h3 id="2025-11-06-1600">2025-11-06 16:00</h3>
<ul>
<li>Back. Trying to port my dev terraform setup to production. It should <em>just</em> work. But it does not.</li>
<li><em>2025-11-06 16:59:</em> Solved. I had somehow borked my Terraform state. Nuked it. And then things started working again</li>
<li>Show stopper now. My GPG key has expired. Need to figure out how to sign my git commits with SSH now</li>
<li><em>2025-11-06 18:26:</em> I <em>think</em> I’ve licked it. Both Github and Forgejo don’t seem to be complaining. Let’s see what else I’ve broken over the coming days</li>
<li><em>2025-11-06 20:00:</em> Done! My production cluster is up! <em><strong>And</strong></em> I can tear it down and build it up consistently. Now to work with it tomorrow.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: 2025-11-06 Notes aka The Plan for My New Hetzner VM
%22">feedback at this domain</a>.
<br>
</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Make a Ruckus: 001, Done! Or Are We? Thank you, Dave!</title>
      <link>https://janusworx.com/work/make-a-ruckus-001/</link>
      <pubDate>Sat, 20 Sep 2025 13:39:01 +0530</pubDate>
      <guid>https://janusworx.com/work/make-a-ruckus-001/</guid>
      <description>I cannot wait to, have my brains exploded once again :)</description>
      <content:encoded><![CDATA[<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/ruckus-mabel.jpg#center" width="600px"/> 
</figure>

<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>Cute wolf Mabel, who caused quite a Ruckus, courtesy David Beazley</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I had <a href="/work/make-a-ruckus-000/">started this series</a>, to catalogue my journey learning Rust whilst doing David Beazley’s, <a href="https://dabeaz.com/ruckus.html">Ruckus</a> course.<br>
And just like that, it’s over! 😂  The course is done, and I am already missing Dave and my fellow journey folk, Rodica, Yadu, Marko, Upul, Gabriela, and Eugene!<br>
I never thought the end would be so bittersweet.</p>
<h2 id="worth-it-financially">Worth it financially?</h2>
<p>Yes! Oh, dear God, yes!<br>
To begin with, I never thought that Dave’s courses were expensive. Yes, they cost money, but he’s given so much away for free, that I was willing to save up and put my money where my mouth was.<br>
I also think, I’ve figured out Dave’s schtick with the idea of what he teaches.<br>
Take something, something hard, (Write a <a href="https://dabeaz.com/compiler.html">compiler</a>? Figure out <a href="https://dabeaz.com/raft.html">distributed consensus</a> in networked systems? <a href="https://dabeaz.com/sicp.html">The big ideas and paradigms</a> in computing?); something that would take an average Joe, 4-6 months (or a college semester) to learn, and then compress it down to anything from a couple of days to a work week. Compress the time that is … not the knowledge.<br>
Having <em>that</em> much knowledge <a href="https://www.youtube.com/watch?v=w_8NsPQBdV0">dowloaded into your head</a> in that short a time frame, is what (to use a Dave-ism) makes your brain explode.<br>
And now having actually done it, I’m now swinging around to the price is just right or “He actually undercharges a bit” camp.<br>
This is bloody addicting. I’m just going to save up and <a href="https://dabeaz.com/courses.html">do them all</a> as and when I can over time. Like Neo answering Tank’s, “How about some more?”, with a <em><strong><a href="https://youtu.be/w_8NsPQBdV0?t=41">Hell yes!</a></strong></em></p>
<br>

<h2 id="worth-it-for-the-knowledge-i-gained">Worth it for the knowledge I gained?</h2>
<p>Have I already said, Oh, dear God, Yes?! Doubly so, here!<br>
Learning it myself, I realised that Rust had paradigms, teasing me at the edge of my vision, which I couldn’t quite see, frustrating my attempts to learn the language.<br>
Python (C/OOP) is my <a href="https://madhadron.com/programming/seven_ur_languages.html">ur-language</a>. Having that, made it easy to learn Go. Rust turned out to be a different beast altogether. Having the big ideas of Rust laid bare and then explained thoroughly was therefore, such an eye opening experience. And I learned it while doing something else, that is inherently hard. Dave makes it easy though, like I describe below.</p>
<p>I just wanted to learn Rust. I didn’t really want to write a small programming language.<br>
But doing that, made me learn Rust without even realising it. He’s that good. The pedagogical method is that good.<br>
Most big ideas were in there. Ownership and borrowing, check. Compare and contrast how things are done in other languages, double check. Macro magic, check and triple check.<br>
The course was more focussed on the why of Rust, more than the more easily discoverable, how.<br>
A fascinating mental model was looking at Rust like Earth. An inner strict core, surrounded by a more relaxed, friendlier outer shell.</p>
<p>Daily work was tremendously, mentally taxing. In a <em><strong>good</strong></em> way.<br>
Dave keeps saying that minds explode due to the material. But no good Sir, that is not true!<br>
To Dave I say, <em>“’Tis thou, Dave, who dost cause the explosions of brains!”</em><br>
He starts with an innocent problem, something seemingly innocuous, and then lays his trap.<br>
Simple solutions are shown not to work, teensy yet ghastly exceptions show up to trip you, dreadful scenarios that you’d never imagine, lie beneath the surface. And your mind gets wound up so tight, that when Dave finally has had his fun, takes pity on us and shows us the solution, it naturally goes, <em><strong>Boom!</strong></em></p>
<p>I cannot wait, to have my brains exploded once again :)</p>
<h2 id="am-i-done-with-this-series">Am I done with this series?</h2>
<p>No.<br>
I jumped into the deep end of the pool, by attempting to learn Rust with a hard project at the same time.<br>
So while I’ve learned a lot, there’s plenty of work to do.<br>
While the others could do their programming exercises quickly, I have seriously lagged behind.<br>
With the notes I’ve made and the resources that I have access to, I will attempt to redo this week myself over the coming months and write about it, and ponder, struggle, work through it here.</p>
<h2 id="dave-as-teacher-and-all-round-good-egg">Dave as teacher and all round good egg</h2>
<p>The man puts in tremendous amounts of work.<br>
Every bit of the course, is planned and structured meticulously and then he just riffs off of the ideas.<br>
There was a collaborative Github repo ready and waiting, there were video recordings ready as soon as the day was done.<br>
Dave never pretends to have all the answers. 99% of the time, he does and hides it well, so we do the thinking, but the few times he didn’t, he let us know and then came back to us with answers and thoughts either in the next session or the next day.<br>
Unfailingly polite, kind and generous to a fault, he fostered an extremely collaborative environment, in which, even when there were other folks much more learned and experienced than I; I never felt like a dunce. I never felt spoken down to.<br>
All my kooky ideas were evaluated, and then Dave would point out why doing something like what I suggested wouldn’t quite work or why stuff would crash and burn or why what I suggested doing eeny, meeny, miny, moe was in fact, pretty good.<br>
I learned not just <em>what</em>, not just <em>how</em>, but also <em>why</em>.<br>
And I learned it all in a place that was nice, and friendly, and warm, and kind.</p>
<p>Dave, thank you for all you do! I’m very grateful!</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Make a Ruckus: 001, Done! Or Are We? Thank you, Dave!
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/make-a-ruckus-001
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Make a Ruckus: 000, The Motivation</title>
      <link>https://janusworx.com/work/make-a-ruckus-000/</link>
      <pubDate>Thu, 11 Sep 2025 13:47:52 +0530</pubDate>
      <guid>https://janusworx.com/work/make-a-ruckus-000/</guid>
      <description>Let’s make some noise!</description>
      <content:encoded><![CDATA[<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/ruckus-wolf-howl.svg#center" width="600px"/> 
</figure>

<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p><a href="https://commons.wikimedia.org/wiki/File:Wolf_howl_icon.svg">Wolf howl, by Lorc</a>, <a href="https://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>, via Wikimedia Commons</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I signed up for the latest cohort of <a href="https://dabeaz.com/about.html">David Beazley’s</a>, <a href="https://dabeaz.com/ruckus.html">Ruckus</a>.<br>
The basic idea, behind Ruckus is to write a small interpreter in Rust!</p>
<h3 id="why">Why?</h3>
<p>From the <a href="https://dabeaz.com/ruckus.html">Ruckus</a> page:</p>
<blockquote>
<p>This course tackles Rust by stepping back and thinking about it from the standpoint of a &ldquo;programming languages&rdquo; project. If Rust is really so different, how would you go about finding out how? Suffice to say, building a programming language will cut right to the heart of the matter.</p>
</blockquote>
<p>This is exactly how I learned Python. Only it took me an inordinately long time. And I didn’t even realise that I was doing it that way. While most of my friends were happy just using Python, I could not quite do it right, because I had no fundamentals<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, and since my background has been tech support, hardware and people management, I needed to unlearn a ton of stuff.</p>
<p>I’m cautiously hoping Ruckus will help me do the same with Rust, only in a turbo charged manner.</p>
<p>Rust fascinates me. And I quite like my journey to its doorstep.<br>
I learned writing for myself with Python. But when it came time to sharing my tiny projects with friends and family, I was a bit stumped.<br>
I learned Go, just so I could give them a binary and then instruct them with a “just run this.”<br>
And while that solved my distribution problem, Go’s type system made me realise, just how well suited a typed language is for collaboration.<br>
Which brings me to Rust. Long term, this is the language<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, I would love to write for performant code, because Rust’s big picture features (safe, performant, easy to distribute) are exactly what I want for all my tiny bits and bobs.</p>
<p>Which in turn brings me back to Ruckus.<br>
Getting a teensy peek at how everything works underneath, while at the same time, getting a firm handle on the language seems like a fun challenge.<br>
I also wanted to try what Cal Newport, calls a grand gesture in <a href="https://calnewport.com/deep-work-rules-for-focused-success-in-a-distracted-world/">Deep Work</a>:</p>
<blockquote>
<p>The concept is simple: By leveraging a radical change to your normal environment, coupled perhaps with a significant investment of effort or money, all dedicated toward supporting a deep work task, you increase the perceived importance of the task. This boost in importance reduces your mind’s instinct to procrastinate and delivers an injection of motivation and energy.<br>
[…] The dominant force is the psychology of committing so seriously to the task at hand. To put yourself in an exotic location to focus on a writing project, or to take a week off from work just to think, or to lock yourself in a hotel room until you complete an important invention: These gestures push your deep goal to a level of mental priority that helps unlock the needed mental resources. Sometimes to go deep, you must first go big.</p>
</blockquote>
<p>Make no mistake, my current state is that of an enthusiastic, ignorant newbie. How hard can it be? I’m woefully unprepared for what might come. The only thing I know, is that I <em>don’t</em> know. I fully expect to be like the wolf above, losing my mind, howling at the moon and generally creating a ruckus.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Make a Ruckus: 000, The Motivation
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/make-a-ruckus-000-the-motivation/159">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I have <em>some</em> now&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I thought I could be pragmatic about the giant that stewards Go, but I realise that it’s something that’ll always stick in my craw. I have no issues using it with other folks or in a collaborative project. I just don’t want to use it for myself and my projects.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>14 (All is Possible!)</title>
      <link>https://janusworx.com/personal/14/</link>
      <pubDate>Wed, 10 Sep 2025 00:00:00 +0530</pubDate>
      <guid>https://janusworx.com/personal/14/</guid>
      <description>How it started &lt;em&gt;&amp;amp;&lt;/em&gt; How it’s going!</description>
      <content:encoded><![CDATA[<br>

<p><a href="/images/2025/happy-anniversary-14.jpg"> <figure class="align-center ">
    <img loading="lazy" src="/images/2025/happy-anniversary-14s.jpg#center"/> 
</figure>
 </a></p>
<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>How it started <em>&amp;</em> How it’s going!</p>
<p>Picture credits, Walter Pinto <em>&amp;</em> <a href="https://psaggu.com/">Priyanka Saggu</a><br>
Click the pic, to make big!</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<center>In love, as in dreams,<br>  
all is possible!<br></center>  
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I love you for completing me, in every possible way. I cannot imagine life without you! 😘</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: 14 (All is Possible!)
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/14
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Emacs Package Updation Checklist</title>
      <link>https://janusworx.com/work/emacs-package-updation-checklist/</link>
      <pubDate>Sun, 06 Jul 2025 08:36:44 +0530</pubDate>
      <guid>https://janusworx.com/work/emacs-package-updation-checklist/</guid>
      <description>Checklist for future, lost, Jason</description>
      <content:encoded><![CDATA[<figure class="align-center ">
    <img loading="lazy" src="/images/2024/emacs-logo.svg#center" width="500px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I’ve never updated my Emacs packages until recently, because Emacs is where <em>all</em> my writing happens, and so I’m justifiably paranoid.<br>
But then some packages stopped working, due to various circumstances<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and an update solved it.</p>
<p>So I’ve decided to update my packages once a quarter, so that I don’t lose days yak shaving when something goes wrong and I handle breakage on my terms and not the machine’s.</p>
<p>As far as package management goes, I want to keep things simple.<br>
In fact, I still haven’t graduated to <a href="https://www.gnu.org/software/emacs/manual/html_mono/use-package.html"><code>use-package</code></a> or <a href="https://github.com/radian-software/straight.el"><code>straight.el</code></a> because my package needs are few and conservative<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. And so, while there are <a href="https://github.com/rranelli/auto-package-update.el">automatic update options</a> out there, I’ll just stick to updating them manually, every quarter.</p>
<p>Ergo, this is the checklist I’ll use next time onwards …</p>
<ol>
<li>Stop emacs user service, <code>systemctl --user stop emacs</code></li>
<li>Backup emacs folder in <code>~/.config</code></li>
<li>Start emacs manually (not the service).</li>
<li><code>M-x package-refresh-contents</code></li>
<li><code>M-x package-upgrade-all</code></li>
<li>Problems? Quit emacs. Revert backup folder.</li>
<li>In the end, start emacs user sevice, <code>systemctl --user start emacs</code></li>
</ol>
<p>There’s an Org mode task, scheduled quarterly, so that I won’t forget.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Emacs Package Updation Checklist
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/emacs-package-updation-checklist
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>While I don’t want updated packages, I do want updated Emacs and that broke stuff 😂&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>The biggest change I forsee, is if Jetbrains ever turn evil and I have to move off their editors and subsequently need to use Emacs as an IDE&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Forgejo Workflow Action to Publish Hugo Blog</title>
      <link>https://janusworx.com/work/forgejo-workflow-action-to-publish-hugo-blog/</link>
      <pubDate>Mon, 09 Jun 2025 15:09:16 +0530</pubDate>
      <guid>https://janusworx.com/work/forgejo-workflow-action-to-publish-hugo-blog/</guid>
      <description>Trying to publish on a schedule</description>
      <content:encoded><![CDATA[<figure class="align-center ">
    <img loading="lazy" src="/images/common/forgejo-logo.svg#center" width="500px"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I’d gotten this working earlier and wanted to post it up.<br>
And then promptly forgot about it.<br>
Until today that is, when I wanted to make changes to it.</p>
<p>Here it is for posterity.<br>
The newest change is that the action now runs every six hours.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">24
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">25
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">26
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">27
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">28
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">29
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">30
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">31
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">32
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">33
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">34
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">35
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">36
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">37
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">38
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">39
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">40
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">41
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">42
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">43
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">44
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">45
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">46
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">47
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">48
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">49
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">50
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">51
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">52
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">53
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">54
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Build and Deploy Janusworx website</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">schedule</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">cron</span>: <span style="color:#e6db74">&#39;0 */6 * * *&#39;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">workflow_dispatch</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">branches</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">main</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">build-and-deploy</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">intel</span> <span style="color:#75715e"># make sure there are runners tagged &#34;intel&#34; on your network or replace this with something of your own</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">HUGO_VERSION</span>: <span style="color:#ae81ff">${{ vars.HUGO_VERSION }}</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:  
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Install wget &amp; rsync</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: <span style="color:#ae81ff">apt-get update &amp;&amp; apt-get install wget rsync -y</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Install Hugo</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          &amp;&amp; dpkg -i ${{ runner.temp }}/hugo.deb</span>
</span></span><span style="display:flex;"><span>      
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Checkout the website repo</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v4</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">submodules</span>: <span style="color:#ae81ff">recursive</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">fetch-depth</span>: <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>      
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Build website with Hugo</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">HUGO_ENVIRONMENT</span>: <span style="color:#ae81ff">production</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">TZ</span>: <span style="color:#ae81ff">Asia/Kolkata</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          hugo \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            --gc \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            --minify
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            </span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Install SSH key</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          mkdir -p ~/.ssh
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          echo &#34;${{ secrets.SSH_PRIVATE_KEY }}&#34; &gt; ~/.ssh/id_ed25519
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          chmod 600 ~/.ssh/id_ed25519
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          echo &#34;${{ secrets.SSH_KNOWN_HOSTS }}&#34; &gt; ~/.ssh/known_hosts
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          chmod 644 ~/.ssh/known_hosts</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Deploy website with rsync</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">REMOTE_HOST</span>: <span style="color:#ae81ff">${{ vars.REMOTE_HOST }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">REMOTE_USER</span>: <span style="color:#ae81ff">${{ vars.REMOTE_USER }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">REMOTE_PATH</span>: <span style="color:#ae81ff">${{ vars.REMOTE_PATH }}</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          rsync -avz --delete public/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Notes:<br>
It needs a few variables set, in the repo (repo-&gt;Settings-&gt;Actions-&gt;Variables), which are the details I need (Hugo version, Remote Host IP, Remote path to copy the built output to, and the Remote user to use for SSH) to push via rsync to the host.<br>
Hugo version is in there, because Hugo breaks things all the time, so I upgrade cautiously.</p>
<p>It also needs a couple of secrets, set in the repo (repo-&gt;Settings-&gt;Actions-&gt;Secrets) to enable rsync to copy. (SSH_KNOWN_HOSTS and SSH_PRIVATE_KEY). Also best if this is a dedicated private key just for copying.
Running <code>ssh-keyscan &quot;your-host-name-or-ip&quot; &gt; known_host_data.txt</code> should dump the data you’d need for SSH_KNOWN_HOSTS</p>
<p>With the changes I made today, the workflow can publish</p>
<ul>
<li>on demand</li>
<li>every 6 hours</li>
<li>every time I commit to the repo</li>
</ul>
<p>I added time based publishing, so that I could publish future dated posts as and when the time rolls around.<br>
With this, I think I’m done tinkering with my blog, with the exception of moving it out of my home network and out on to my VM, so that I can truly publish from anywhere. That is a big heft for me currently and a job for future Jason.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subjectFeedback on post: Forgejo Workflow Action to Publish Hugo Blog
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/forgejo-workflow-action-to-publish-hugo-blog
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_l_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Books I Read in the First Quarter of 2025</title>
      <link>https://janusworx.com/reading/books-i-read-in-the-first-quarter-of-2025/</link>
      <pubDate>Wed, 21 May 2025 05:45:00 +0530</pubDate>
      <guid>https://janusworx.com/reading/books-i-read-in-the-first-quarter-of-2025/</guid>
      <description>Lots and lots and lots of books</description>
      <content:encoded><![CDATA[<p><em>This newsletter went out to the <a href="/subscribe/" title="Subscribe to the mailing list!">mailing list</a> on April 21st.</em><br>
<em>If you want to read them as soon as they come out,</em> <em><strong><a href="/subscribe/" title="Subscribe to the mailing list!">Subscribe!</a></strong></em></p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I’m tired of making excuses for my tardiness 😂<br>
So, like Don Cheadle says in Iron Man 2, “Look, it’s me. I’m here. Deal with it. Let’s move on.”</p>
<p>While I tell you about the books I loved, you can also click each month to find the complete list of titles I loved.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h2 id="january"><a href="/reading/2025/#january">January</a></h2>
<p>I think this year continues my fascination with Agatha Christie.<br>
January was mostly spent in the world of Marple. I think I’ll be back doing Christie runs in the coming months. I don’t know what it is about her worlds, but I keep coming back to them  ove and over again.<br>
(even more than Doyle and Holmes, though I love the new fresh takes in the Holmesian world. While <a href="https://www.youtube.com/watch?v=lqzn3q0RYKs">David Suchet and his run</a> will always remain the canonical Poirot to me, I have no such qualms with anyone else doing Holmes)</p>
<p>So I spent January with Ms. Marple. <em>The Mirror Crack’d from Side to Side</em> was my favourite. The sudden, heart-stopping realisation of what must have happened, by one of the main characters, the immense grief that must have rolled down on them all over again, summed up in the lines from <a href="https://www.poetryfoundation.org/poems/45359/the-lady-of-shalott-1832#:~:text=The%20mirror%20crack%27d%20from%20side%20to%20side%3B">Tennyson’s poem</a> that give the book its title.</p>
<blockquote>
<p>     She look’d down to Camelot.<br>
Out flew the web and floated wide;<br>
The mirror crack’d from side to side;<br>
‘The curse is come upon me,’ cried<br>
     The Lady of Shalott.</p>
</blockquote>
<p>I also love following these pretty webs, authors lay for me. Thanks to Agatha Christie penning these words in 1962, I went looking for a poem from 1832 and <a href="https://www.poetryfoundation.org/poems/45359/the-lady-of-shalott-1832">thoroughly enjoyed it</a> :)</p>
<p>Honourable mention to the <em><a href="https://podcasts.apple.com/gb/podcast/sherlock-co/id1710121792">Sherlock &amp; Co. podcast</a>.</em><br>
I began listening to it, just for curiosity’s sake and have now been looking forward to each new adventure of our intrepid heroes. My favourite parts are when other hosts from the Goalhanger universe come in to do cameos, like Will Dalrymple and Anita Anand <a href="https://podcasts.apple.com/in/podcast/empire/id1639561921">(Empire)</a> did in one of my recent favorites, The Sign of Four (Season 22 on iTunes)  or when Dominic Sandbrook <em><a href="https://therestishistory.com/episodes/">(The Rest is History)</a></em> played a crazy, stressed lawyer in <em>The Norwood Builder (season 27 on iTunes)</em>. It’s really fun!</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h2 id="february"><a href="/reading/2025/#february">February</a></h2>
<p>February started me on the road of my (hidden) goal of reading at least one technical book a month. <em><a href="https://www.oreilly.com/library/view/learning-go-2nd/9781098139285/">Learning Go, by Jon Bodner</a></em> taught me the language. One thing I’ve learnt though, is that I almost nearly always need 2-3 authors / books before I understand whatever it is I need to learn. I’ve realised that I have been spoiled with authors in other domains when it comes to explaining things lucidly. (plus any topic in tech is vast and no single author  can fill in all the gaps of my ignorance.) My solution to this is to be a <a href="https://fs.blog/how-to-read-a-book/">syntopical reader</a> and figure out whatever it is I need from multiple texts.</p>
<p>I learnt well enough from Bodner, and <em><a href="https://pragprog.com/titles/rggo/powerful-command-line-applications-in-go/">Ricardo Gerardi’s Powerful Command-Line Applications in Go</a></em> to go write a tool I sorely needed in Go lang. A small tool to generate RSS feeds for my audiobooks, I call <a href="https://github.com/jasonbraganza/rederb">Rederb</a>. It’s still raw and unpolished, but it got my audiobook ducks in row, so I could listen to whatever struck my fancy on the recent break.</p>
<p>I also discovered Grant Snider this month. While full of <a href="https://images.squarespace-cdn.com/content/v1/58adfd4c2e69cf88059b4baa/bc207286-94ca-4445-a6a4-e21d5f63c94b/WordsofWonder1.jpg">whimsy</a>, they are also really <a href="https://images.squarespace-cdn.com/content/v1/58adfd4c2e69cf88059b4baa/f2a679d9-e139-439f-865d-329f4a852994/Mindfulness-IG.jpg?format=1500w">thought provoking</a>. I devoured <em><a href="https://www.themarginalian.org/2022/06/09/the-art-of-living-the-contemplative-cartoonist-grant-snider/">The Art of Living</a></em>, and <em><a href="https://www.abramsbooks.com/product/shape-of-ideas_9781419723179/#">The Shape of Ideas</a></em>. Highly recommended!
The one that started it all for me and was specifically written for me, was <em><a href="https://www.abramsbooks.com/product/i-will-judge-you-by-your-bookshelf_9781419737114/">I Will Judge You by Your Bookshelf</a></em>.</p>
<p>Honourable mention to Anita Anand and William Dalrymple for doing <em><a href="https://podcasts.apple.com/in/podcast/empire/id1639561921">the Three Kings (Empire Podcast, episodes 212-214)</a></em>, explaining the confluence of Byzantine and Persian cultures, myths and history.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h2 id="march"><a href="/reading/2025/#march">March</a></h2>
<p>was spent mostly in the company of the aforementioned Anand &amp; Dalrymple charting the rise and fall of <em><a href="https://podcasts.apple.com/in/podcast/empire/id1639561921">the Mughal Empire (Empire Podcast, episodes 205-211, and 215-222)</a></em>. This engaging series filled in so many gaps in my head and what the landscape of our country was like. I need to now go see what my land was like, before the Mughals.</p>
<p>More history was in the offing with part two of The Rest is History’s continuing history of <em><a href="https://therestishistory.com/episodes/">the French Revolution</a></em>. I listened to Parts Two and Three this month. <em>(Episodes 503-507 and 544-547)</em>. Part one was last year <em>(Episodes 475-482)</em>.<br>
A really refreshing change of pace by Holland and Sandbrook, considering they have covered the Revolution once before in two twenty minute episodes! I love the slow, measured march this time. The more I listen, the more I wonder how much of history hinges on chance events! I also love their slightly irreverent and self deprecating tone. We’re still not done, and I look forward to revisiting France during the revolution, soon.</p>
<p>Honourable mention to the Acquired Podcast’s coverage of <em><a href="https://www.acquired.fm/episodes/rolex">Rolex</a></em>. This was one of the few I really enjoyed, besides their story on <em><a href="https://www.acquired.fm/episodes/hermes">Hermès</a></em>. I think I just like old company stories. Hopefully someday we’ll get Nintendo and Yamaha.</p>
<p>And that’s it for now. I hope you folks find something in here, that interests you too :)</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Books I Read in the First Quarter of 2025
%22">feedback at this domain</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Books I Read in the First Quarter of 2025
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/books-i-read-in-the-first-quarter-of-2025
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Math for English Majors, Ben Orlin</title>
      <link>https://janusworx.com/reading/math-for-english-majors-ben-orlin/</link>
      <pubDate>Tue, 25 Feb 2025 09:21:57 +0530</pubDate>
      <guid>https://janusworx.com/reading/math-for-english-majors-ben-orlin/</guid>
      <description>A mathematician is hardly a reasonable person. More like a feral philosopher or a logician gone rogue.</description>
      <content:encoded><![CDATA[<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/mfembo-cover.jpg#center"
         alt="cover of the book. purple/lavender background, with cartoon stick figure Shakespeare in the front proclaming the book is a human take on the universal language"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>Ben Orlin, the modern Maths apologist, brings to us what I’d call his Magnum Opus, the modern <a href="/reading/a-mathematicians-lament/">Mathematician’s Lament.</a><br>
Everytime, I read an <a href="/tags/ben-orlin">Orlin book</a>, I always wish, I had teachers like him when I was young, so that I would not have had such crippling math-phobia for so much of my life.<br>
It should actually be called, <em><strong>Maths for the Rest of Us.</strong></em><br>
It’s great! So great!</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="my-highlights-from-the-book">My highlights, from the book</h3>
<blockquote>
<p>A mathematician is hardly a reasonable person. More like a feral philosopher or a logician gone rogue.</p>
</blockquote>
<blockquote>
<p>It’s a bit peculiar to say that I add 4 and 3 to create 7; 4 and 3 simply <strong>are</strong> 7, irrespective of my efforts. When I multiply or divide or take a logarithm, the result equals whatever it equals, regardless of my labors. I do not, in a strict sense, change the numbers, but merely discover or reveal them. Operations act not upon the quantities themselves, but only upon our understandings of them.</p>
</blockquote>
<blockquote>
<p>In my childhood, back when money was made of metal and paper instead of software and lies, I learned that two quarters add up to 50 cents: 25 + 25 = 50. I loved knowing this</p>
</blockquote>
<blockquote>
<p>… the beauty of mathematical language lies in its unreality. Math lets us escape this world of crumbs and mud for a realm of rigorous abstractions. The purer the logic—that is, the further from physical reality—the deeper the truth. “As far as laws of mathematics refer to reality, they are not certain,” said Einstein, “and as far as they are certain, they do not refer to reality.”</p>
</blockquote>
<blockquote>
<p>I sometimes envision mathematics as a tower. It leads from the earthy crust of everyday experience (piles of cookies; buckets of water; half-dollar coins) up to the thin atmosphere of abstract concepts (Lie groups, whatever those are). There’s pleasure and power in climbing to the upper floors. But there’s an equal pleasure—and a different kind of power—in descending to the bottom. Down there, you can touch the foundations, poke at the joints where math attaches to the world, and fill your half-gallon bucket with a new kind of insight</p>
</blockquote>
<blockquote>
<p>Consider 2 + 3. If + is a verb, then who is the subject carrying out the addition? Neither 2 nor 3 performs any action; those nouns just sit there being nouns. <strong>You’re</strong> the one who adds, but you’re not a part of mathematical speech</p>
</blockquote>
<blockquote>
<p>Such confusion is not limited to the youth. Adult textbook authors have been known to include gratuitous fighter jets and non sequitur cheetahs, as if the secret to math is picturing something, anything. But the hard part of math isn’t remembering what cats look like. It’s making sense of abstract ideas.</p>
<p>The challenge of algebra is to visualize the invisible</p>
</blockquote>
<blockquote>
<p>“The point of doing algebra,” writes math teacher Paul Lockhart, “is… to move back and forth between several equivalent representations,depending on the situation at hand and depending on our taste. In this sense, all algebraic manipulation is psychological.”</p>
<p>Old information, new formation</p>
</blockquote>
<blockquote>
<p>I like this rule because it’s rarely even taught. Mathematicians apply it automatically, the way fluent English speakers always say “a big ugly bath toy” and not “a bath ugly big toy.” In fact, as Mark Forsyth points out in The Elements of Eloquence, English adjectives are typically placed in a certain order: opinion, size, age, shape, color, origin, material, purpose. Hence, “a lovely little old rectangular green French silver whittling knife.</p>
<p>Likewise, in math, numbers are typically multiplied in a certain order: numeral, radical, constant, variable. Hence, we write 3πxy<sup>2</sup>z, and never (unless we’re trying to provoke someone) zy<sup>2</sup>πx3</p>
</blockquote>
<blockquote>
<p>Toward the end of a sixth-grade lesson, a chipper young fellow named Kieran raised his hand. “I don’t really understand anything you’re saying,” he informed me. “But I can still get the right answer.” He beamed a patient smile.</p>
<p>I stifled a sigh. “Which part can I help you with?”</p>
<p>“Oh, I don’t need help,” he said. “It’s just that you were talking about this extra stuff. Like, the ideas behind it. I don’t, you know, do that.”</p>
<p>I blinked. He blinked. A great silence passed between us.</p>
<p>“Is that okay?” he concluded. “I mean, as long as I can get the right answer?”</p>
<p>There it was, out in the open: the subtext of almost every lesson I had taught that year. Day after day, I tried to illuminate the logic behind the symbols. Day after day, my students politely ignored my prattle to focus on the symbols themselves. What made that afternoon stand out was that Kieran broke the fourth wall. He uttered the title of the film we were acting in.</p>
<p>To do math, must you think about the ideas, or can you just focus on the symbols?</p>
</blockquote>
<figure class="align-center ">
    <img loading="lazy" src="/images/2025/mfembo-symbols-ideas.jpg#center"/> 
</figure>

<blockquote>
<p>As David Hilbert quipped, “Mathematics is a game played according to certain simple rules with meaningless marks on paper.” That’s symbol pushing in a nutshell. Language divorced from meaning</p>
<p>But a few weeks after Kieran’s query, I learned that not all mathematicians share my dim view of symbol pushing. I mentioned to my dad (a mathematician himself) that I had started writing an essay titled ”How to Avoid Thinking in Math Class.” Before I could say any more, he gave the project his stamp of approval. “Great,” he said. “I’ve always said that the point of math education is to help you not to think.”</p>
<p>I was taken aback. No, I explained, the title was ironic. On the question of “Should we think?” I was firmly in favor.</p>
<p>“Oh, yes, thinking is good,” he generously conceded. “But it’s too hard to do all the time.”</p>
<p>He (and, indeed, Kieran) had a point. For example, it is an algebraic truth that (x + 1)(x − 1) is the same as x2 − 1. This fact boils down to a repeated application of the distributive property; as such, you can explain it entirely in terms of pile rearrangement. But trying to do so is like ascending a sheer cliff face.</p>
</blockquote>
<figure class="align-center ">
    <img loading="lazy" src="/images/2025/mfembo-si-climb-1.jpg#center"/> 
</figure>

<blockquote>
<p>Quite a climb! Invigorating as an occasional workout, but unthinkable as a morning commute. This was exactly my dad’s point: Thinking is good. But it’s too hard to do all the time.</p>
<p>“Operations of thought,” wrote the mathematician Alfred North Whitehead, “are like cavalry charges in battle—they are strictly limited in number, they require fresh horses, and must only be made in decisive moments.”</p>
</blockquote>
<blockquote>
<p>In this case, there is no need to send in the cavalry. The symbol pusher, thinking only about letters and parentheses, reaches the same summit in a few effortless strides</p>
</blockquote>
<figure class="align-center ">
    <img loading="lazy" src="/images/2025/mfembo-si-climb-2.jpg#center"/> 
</figure>

<blockquote>
<p>Can you imagine if English worked this way? An object’s name would indicate its physical size, so that a chihuahua (nine letters) would be three times the size of a cow (three letters). A food’s name would encode its recipe, so that a pizza would be a “DoughSauceCheeseBake.” Chemistry would be a tediously safe area of study, because we could run experiments simply by smushing together the names of various chemicals and seeing which ones spell “explosion.”</p>
<p>Symbol pushing boils the laws of logic down to laws of grammar. The language becomes a scale model of reality. We can wrangle ideas simply by wrangling ink.</p>
<p>So who was right, me or Kieran? The answer, of course, is both. To speak mathematics is to slip back and forth between two worlds, to inhabit two distinct frames of mind: the hard joy of thinking and the mindless trance of symbol pushing. Without the ink, the ideas are befuddling; but without the ideas, the ink means nothing. Learn the logic, learn it well, and then turn off your brain and let the symbols on the page dance to the silent music of the mind.</p>
</blockquote>
<br>

<blockquote>
<p>… notations often gain popularity precisely because they lend themselves to simple mechanical rules. You could say we choose the symbols for the express purpose of pushing them around. We can then generate right answers with no insight, no inspiration, no input other than elbow grease. Just turn the crank, and new knowledge pops out</p>
</blockquote>
<blockquote>
<p>When someone is too focused on details, we say they’re missing the forest for the trees. Mathematicians, if anything, are guilty of the opposite: missing the trees for the forest. Their habit is to inspect not objects themselves, but the objects’ properties. (Not the trees, but the number of them.) Then, having distilled these properties, they look at the properties’ properties. (Not the number, but its evenness or oddness.) And so on: the properties of the properties of the properties of the things. “Matter does not engage their attention,” Henri Poincaré once said of mathematicians. “They are interested in form alone.”</p>
</blockquote>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Math for English Majors, Ben Orlin
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/math-for-english-majors-ben-orlin
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Here’s What is Stopping Us From Using Free Software</title>
      <link>https://janusworx.com/work/heres-what-is-stopping-us-from-using-free-software/</link>
      <pubDate>Tue, 18 Feb 2025 12:13:45 +0530</pubDate>
      <guid>https://janusworx.com/work/heres-what-is-stopping-us-from-using-free-software/</guid>
      <description>What is this life if, full of care. We have no time to stand and stare.</description>
      <content:encoded><![CDATA[<p>A couple of thoughts on <a href="https://blog.schubisu.de/blog/2023/1/">Robin’s post</a>.<br>
Because I’ve spent a lifetime using both FOSS and proprietary software <em><strong>and</strong></em> more than two decades, advising and supporting people and businesses who do the same.</p>
<ol>
<li>To paraphrase Robin’s own point. Most people don’t care.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
</ol>
<blockquote>
<p><a href="https://blog.schubisu.de/blog/2023/1/#:~:text=If%20it,fine">If it runs Minetest, then it’s fine.</a></p>
</blockquote>
<p>aka “If it does the thing, I want it to do, without too much cognitive overhead, I’ll use it.”<br>
Learning the skill, so I can do this task, is definitely not what the world at large wants to do. Nor do I imagine, do most folk have the time and the bandwidth.
iTunes (and Netflix) when they launched<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, were the prime examples of this. Convenience and ease of use trumps Free. Also by that same token, VLC is probably one of the most installed and used video players in the world, not because they are FOSS, but because they make it easy to install and use.</p>
<ol start="2">
<li>
<p>Some people feel strongly about having control over what they do, over their data. Those folks were those I found easiest to move to Free software, because it aligned with what they wanted.</p>
</li>
<li>
<p>Support costs are about the same.<br>
If a small business chooses to use free software, the cost of supporting it, if stuff breaks, (specially if it’s business critical<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>) probably is about the same as paying for the proprietary version. The fact that paying and getting it fixed benefits the world at large is lost on most. Or maybe it’s something, we Free Software evangelists could learn to to better. Robin promises his team, first-level support, but what happens when he goes on to better opportunities and is no longer around?</p>
</li>
</ol>
<p>So I agree with most of what Robin says, with just one caveat.</p>
<p>People aren’t afraid of change. Atleast not the kind of change, Free Software poses.<br>
People just don’t have the time and the energy to deal with change, with everything else happening in their lives.<br>
Free software is just not as important to them, as it is to us. That is all.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Here’s What is Stopping Us From Using Free Software
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/heres-what-is-stopping-us-from-using-free-software
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>And I’d venture to say, that’s perfectly ok.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>before they went to pot&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>rpm updates, bork my expensive garment printing machine, anyone?&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>And once again, that’s perfectly ok too.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Blog Questions Challenge 2025</title>
      <link>https://janusworx.com/work/blog-questions-challenge-2025/</link>
      <pubDate>Tue, 04 Feb 2025 12:10:17 +0530</pubDate>
      <guid>https://janusworx.com/work/blog-questions-challenge-2025/</guid>
      <description>Now, this is one viral trend, I can get behind</description>
      <content:encoded><![CDATA[<p><a href="https://blog.avas.space/bear-blog-challenge/">Ava</a> started this, <a href="https://kevquirk.com/blog/blog-questions-challenge">Kev</a> modified this, and <a href="https://saptaks.website/">Saptak</a> egged me on to write this. So here goes …<br>
<br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2025/meta-homepage.png#center"
         alt="screenshot of my homepage"/> 
</figure>
</p>
<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>What the home page looks like in 2025</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="1-why-did-you-make-the-blog-in-the-first-place">1. Why did you make the blog in the first place?</h3>
<p>I write for me mostly. Because writing <a href="/personal/why-i-write/">helps me think</a>. My thoughts are too scattered otherwise. I can’t not write. I’ve always written. Privately, publicly, there’s always been some place where I’ve jotted things down.</p>
<h3 id="2-what-platform-are-you-using-to-manage-your-blog-and-why-did-you-choose-it">2. What platform are you using to manage your blog and why did you choose it?</h3>
<p>I use <a href="https://gohugo.io/">Hugo</a> to generate the site, which I host on my own Hetzner VM. I use it because I <a href="/work/all-about-the-move-to-hugo/">outgrew</a> my previous tool, <a href="https://getnikola.com/blog/">Nikola</a>, which still holds a dear place in my heart. While Hugo is enormously complex, it is also deceptively simple enough to get started with. And it’s <em>fast</em>. That’s what I love about it. It lets me write. It does not get in my way. It lets me preview what I’m doing with its live server. And it’s <em>unbelievably fast.</em></p>
<h3 id="3-have-you-blogged-on-other-platforms-before">3. Have you blogged on other platforms before?</h3>
<p>I’ve been writing in some form or other since the late 90s. So … yea :)<br>
Livejournal, Blogger, self hosted Wordpress, wordpress.com, Posterous, Tumblr, self hosted Wordpress, self hosted Ghost, Nikola and now Hugo. It’s been quite a ride!</p>
<h3 id="4-how-do-you-write-your-posts">4. How do you write your posts?</h3>
<p>I write them in Emacs (in Markdown, using Markdown Mode) on my desktop, with <a href="https://gohugo.io/commands/hugo_server/">Hugo Server</a> running alongside giving me a preview of what things will look like. Once I commit it to my self hosted Forgejo instance, an action publishes the site automatically</p>
<h3 id="5-when-do-you-feel-most-inspired-to-write">5. When do you feel most inspired to write?</h3>
<p>I never do. I write because it helps me function. And yet, it always feels like a chore.</p>
<h3 id="6-do-you-publish-immediately-after-writing-or-do-you-let-it-simmer-a-bit-as-a-draft">6. Do you publish immediately after writing or do you let it simmer a bit as a draft?</h3>
<p>I always publish it immediately. I almost never write something that is deeply thought out, that needs to stand the test of time. It’s the <em>process</em>, the <em>writing</em>, the putting words out of my mind, through my fingers down to paper,  that leads to the result, the thought, the opinion, the aha, the insight. So I’m never quite done. Which means if I ever wait for <em>finished</em>, the post will never get published. The <em>moment</em> I publish something, is invariably the moment something needs changing. So I just go back and edit it. I never notify folks about updating things on the first day. If I ever edit something much later than a day or two, then I do.</p>
<h3 id="7-your-favorite-post-on-your-blog">7. Your favorite post on your blog?</h3>
<p>None. All. They’re my thoughts, so depending on my mood, they’re either worthless or priceless gems!</p>
<h3 id="8-any-future-plans-for-your-blog-maybe-a-redesign-changing-the-tag-system-etc">8. Any future plans for your blog? Maybe a redesign, changing the tag system, etc.?</h3>
<p>Not really. For all my wandering, I’ve only ever moved when my tools outgrew me<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, or I outgrew my tools. For now, Hugo does all I ask of it, without getting in the way. The day that changes, will be the day I move.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I’ll ask <a href="https://psaggu.com/">Priyanka</a>, <a href="https://sreeram.xyz/">Sreeram</a>, <a href="https://blogs.dgplug.org/sandeepk/">Sandeep</a>, <a href="https://pradhvanbisht.in/">Pradhvan</a>, <a href="https://rj722.com/">Rahul</a>, <a href="https://geeksocket.in/">Bhavin</a>, <a href="https://blog.lazkani.io/posts/what-2025-blog-question-challenge/">Elia</a>, <a href="https://microblog.desipenguin.com/">Mandar</a>, <a href="https://saptaks.website/">Saptak</a>, <a href="https://farhaan.me/">Farhaan</a>, <a href="https://blog.schubisu.de/blog/2025/1/">Robin</a> and <a href="https://kushaldas.in/">Kushal</a> to share more, if they have the time, energy and the inclination.</p>
<p>Folks, who’ve answered my call to arms! Go read their answers too!</p>
<ul>
<li><a href="https://blog.schubisu.de/blog/2025/1/">Robin</a></li>
<li><a href="https://blog.lazkani.io/posts/what-2025-blog-question-challenge/">Elia</a></li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Blog Questions Challenge 2025
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/blog-questions-challenge-2025
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Wordpress.com too restrictive, Ghost stopped serving my specific needs etc.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Hack Hugo Post Metadata With Python</title>
      <link>https://janusworx.com/work/hack-hugo-post-metadata-with-python/</link>
      <pubDate>Mon, 03 Feb 2025 09:33:37 +0530</pubDate>
      <guid>https://janusworx.com/work/hack-hugo-post-metadata-with-python/</guid>
      <description>Adding alias urls to my blog posts</description>
      <content:encoded><![CDATA[<p><a href="/work/some-site-housekeeping-new-sections-and-rss-feeds/">A while back</a>, I rejigged the sections on my site to better reflect how I think and write.<br>
Which meant, all the urls, on all my posts changed, since they now used the new category as a slug, instead of ye old <code>/blog</code>.</p>
<p>For e.g. <a href="https://janusworx.com/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo/">https://janusworx.com/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo/</a> …<br>
was now at,  <a href="https://janusworx.com/work/using-hugo-variables-to-help-with-mailto-links-in-hugo/">https://janusworx.com/work/using-hugo-variables-to-help-with-mailto-links-in-hugo/</a></p>
<p>After searching a bit, I found that Hugo supported <a href="https://gohugo.io/content-management/urls/#aliases">aliases</a>. For me, it would redirect the original <code>/blog</code> path url to its new location<br>
Ass I had to do, was add an <code>aliases: [&quot;/blog/old-post-slug&quot;]</code> line to each post’s metadata.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
Line 4 in the snippet below shows, what I added to fix the post above.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">8
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#e6db74">&#34;Using Hugo Variables to Help With Mailto Links in Hugo&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2024-05-30T18:17:35</span><span style="color:#ae81ff">+05</span>:<span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">aliases</span>: [<span style="color:#e6db74">&#34;/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#f92672">categories</span>: [<span style="color:#e6db74">&#34;work&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#f92672">tags</span>: [<span style="color:#ae81ff">100WordHabit, Dgplug, Hugo]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">summary</span>: <span style="color:#ae81ff">Shortcodes! Hugo Variables in Shortcodes!</span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></td></tr></table>
</div>
</div><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I did <em><strong>not</strong></em> want to do this by hand for 800+ posts.<br>
One stroke of luck for me, was that I let Hugo use its default behaviour of generating url slugs from the file names. So even if the category slugs had changed (from <code>/blog</code> to <code>/work</code> or from <code>/blog</code> to <code>/personal</code>), the url slugs would stay the same. Which meant, I could whip up a script to run through all my markdown posts and add the alias line.<br>
So I did.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pathlib <span style="color:#f92672">import</span> Path
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>INPUT_FOLDER <span style="color:#f92672">=</span> Path(<span style="color:#e6db74">&#34;old-posts-folder&#34;</span>)
</span></span><span style="display:flex;"><span>OUTPUT_FOLDER <span style="color:#f92672">=</span> Path(<span style="color:#e6db74">&#34;modified-posts-folder&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> each_file <span style="color:#f92672">in</span> INPUT_FOLDER<span style="color:#f92672">.</span>iterdir():
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> open(each_file, <span style="color:#e6db74">&#39;r&#39;</span>) <span style="color:#66d9ef">as</span> file_to_read:
</span></span><span style="display:flex;"><span>        alias_derived_from_file <span style="color:#f92672">=</span> each_file<span style="color:#f92672">.</span>stem
</span></span><span style="display:flex;"><span>        contents_as_list <span style="color:#f92672">=</span> file_to_read<span style="color:#f92672">.</span>readlines()
</span></span><span style="display:flex;"><span>        contents_as_list<span style="color:#f92672">.</span>insert(<span style="color:#ae81ff">3</span>, <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;aliases: [</span><span style="color:#ae81ff">\&#34;</span><span style="color:#e6db74">/blog/</span><span style="color:#e6db74">{</span>alias_derived_from_file<span style="color:#e6db74">}</span><span style="color:#ae81ff">\&#34;</span><span style="color:#e6db74">]</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(Path(OUTPUT_FOLDER, each_file<span style="color:#f92672">.</span>name), <span style="color:#e6db74">&#39;w+&#39;</span>) <span style="color:#66d9ef">as</span> file_to_write:
</span></span><span style="display:flex;"><span>            file_to_write<span style="color:#f92672">.</span>writelines(contents_as_list)
</span></span></code></pre></td></tr></table>
</div>
</div><p><br>

It takes all the posts from my old folder, inserts the alias line and puts them into a new folder.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> In essence, take each file, figure out the url slug from the file name, read in the contents as a list, insert my alias at position 3 (fourth actually. zero based indexing) of the list (below the title and date) and then write it all out to a new file.</p>
<p>I ran it, published the site and then went to check on the old urls with bated breath.<br>
Hurrah, it all worked :)</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Hack Hugo Post Metadata With Python
%22">feedback at this domain</a> or <a href="https://dc.janusworx.com/t/hack-hugo-post-metadata-with-python
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>it’s a list, so I can add more aliases if I want to&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>no sense in botching up my originals :)&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Tmux Start Session Maximized With Three Panes</title>
      <link>https://janusworx.com/work/tmux-start-session-maximized-with-three-panes/</link>
      <pubDate>Sat, 01 Feb 2025 09:27:25 +0530</pubDate>
      <guid>https://janusworx.com/work/tmux-start-session-maximized-with-three-panes/</guid>
      <description>New short ritual to get my writing sessions going</description>
      <content:encoded><![CDATA[<p>So I got tired of starting up a dedicated tmux session to manage all the work related to my writing sessions. Over the past few months, I’ve boiled it down to three.<br>
And it still irks me that I have to …</p>
<ol>
<li>Launch Terminal</li>
<li>Launch Tmux</li>
<li>Split it into three windows err … panes.</li>
<li>Go to the top left pane and launch Hugo server</li>
<li>Switch to the right pane and then launch Emacs with whatever new post I want to write today.</li>
</ol>
<p>So <em>of course</em>, a <a href="https://en.wikipedia.org/wiki/Rube_Goldberg">Rube Goldberg-esque</a>, tiny bash-pipey monster took form.
It now resides, chained to an alias, <code>hssx</code><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> in my <code>.bash_aliases</code> file</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>alias hssx<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;cd /path/to/my/hugo/folder &amp;&amp; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">xdotool windowsize $(xdotool getactivewindow) 100% 100% &amp;&amp; \
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">tmux new-session \; split-window -h \; select-pane -l \; split-window -v \; select-pane -U \; send-keys &#34;hugo serve&#34; C-m \; select-pane -R&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><ol>
<li>The first line switches to my hugo folder</li>
<li>The second calls <code>xdotool</code> and maximises the terminal window</li>
<li>And the last line is a series of instructions to the tmux command. I’ve split it below for readability.</li>
</ol>
<pre tabindex="0"><code>tmux new-session \; #Tmux start a new session
split-window -h \; # Split the window into two vertical panes
select-pane -l \; # Switch to the left pane
split-window -v \; # Split that into two horizontal panes
select-pane -U \; # Select the upper pane
send-keys &#34;hugo serve&#34; C-m \; # Type in `hugo serve` followed by Enter
select-pane -R # Select the right pane
</code></pre><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>And boom!</p>
</figcaption>
<p><a href="/images/2025/tmux-layout.png"><figure class="align-center ">
    <img loading="lazy" src="/images/2025/tmux-layout.png#center"
         alt="bash terminal showing a tmux window split into three panes"/> 
</figure>
</a></p>
<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>Click pic for a larger version</p>
</figcaption>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Tmux Start Session Maximized With Three Panes
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/tmux-start-session-maximized-with-three-panes
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><code>hugo start session</code> and x just because all my aliases have ended with x for years and years&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>View Only the Day, With Org Agenda</title>
      <link>https://janusworx.com/work/view-only-day-with-org-agenda/</link>
      <pubDate>Mon, 20 Jan 2025 08:50:40 +0530</pubDate>
      <guid>https://janusworx.com/work/view-only-day-with-org-agenda/</guid>
      <description>Live in Day Tight Compartments; only worry about what’s happening today; that’s all you can control — Dale Carnegie</description>
      <content:encoded><![CDATA[<p>Org Mode, by default, shows me the whole week, when I pull up my agenda. That’s not how I work though. I normally look at the week on Monday mornings (or Sunday evenings) to plan out the week and then work everyday by just looking at what I ought to get done that particular day.</p>
<p>Like Dale Carnegie says,</p>
<blockquote>
<p>Shut off the past! Let the dead past bury its dead. Shut out the yesterdays which have lighted fools the way to dusty death.</p>
<p>The load of tomorrow, added to that of yesterday, carried today, makes the strongest falter. Shut off the future as tightly as the past.</p>
<p>The future is today. There is no tomorrow. The day of man&rsquo;s salvation is now.</p>
<p>Waste of energy, mental distress, nervous worries dog the steps of a man who is anxious about the future. Shut close, then the great fore and aft bulkheads, and prepare to cultivate the habit of life of day-tight compartments.</p>
</blockquote>
<p>So I want then, my Org Mode to do show me, only the things, I have on my plate today.</p>
<p>And Org is nothing if not adaptable. <code>org-agenda-span</code> is the variable that controls what the Agends shows me. According to the docs,</p>
<blockquote>
<p>This variable can be set to any number of days you want to see by default in the agenda, or to a span name, such a <code>day</code>, <code>week</code>, <code>month</code> or <code>year</code>.</p>
</blockquote>
<p>So that’s what I did. This little snippet went into my <code>init</code> file</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-elisp" data-lang="elisp"><span style="display:flex;"><span><span style="color:#75715e">;; Set Agenda to show a day as the default timespan, instead of a week</span>
</span></span><span style="display:flex;"><span>(setq org-agenda-span <span style="color:#e6db74">&#39;day</span>)
</span></span></code></pre></div><p><br>

Et voilà!</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: View Only the Day, With Org Agenda
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/view-only-day-with-org-agenda
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>More Espanso &amp; Emacs Shenanigans</title>
      <link>https://janusworx.com/work/more-espanso-emacs-shenanigans/</link>
      <pubDate>Sun, 19 Jan 2025 12:45:09 +0530</pubDate>
      <guid>https://janusworx.com/work/more-espanso-emacs-shenanigans/</guid>
      <description>Fixing my blog post, CTA snippet …</description>
      <content:encoded><![CDATA[<p><br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2024/espanso.png#center"
         alt="Espanso Logo"/> 
</figure>
</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>Now that I use my local machine to draft all my posts, desktop Emacs makes everything easier … with one exception. It swallows up a lot of my Espanso expansions.</p>
<p>My current bugbear is that it will not render a <code>=</code> when expanding.<br>
I know this is entirely something that I brought on myself, and neither Emacs or Espanso in isolation will have issues.</p>
<p>My workaround after rummaging through Espanso’s documentation was to set the backend to use <code>xdotool</code>, in my config. (<code>~/.config/espanso/config/default.yml</code>)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">x11_use_xdotool_backend</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>One downside now is that it no longer <a href="https://espanso.org/docs/matches/basics/#cursor-hints">jumps back to a predefined location</a> in the snippets where I’ve defined such a thing. No matter. I use them rarely and I’ll figure something out later. (Alongside why desktop emacs won’t render markdown expansions sometimes as well)</p>
<p>For now, most of my expansions work. Hurrah!</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: More Espanso &amp; Emacs Shenanigans
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/more-espanso-emacs-shenanigans
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>This Is What I Want to Do the Rest of My Life</title>
      <link>https://janusworx.com/reading/this-is-what-i-want-to-do-the-rest-of-my-life/</link>
      <pubDate>Fri, 17 Jan 2025 12:33:12 +0530</pubDate>
      <guid>https://janusworx.com/reading/this-is-what-i-want-to-do-the-rest-of-my-life/</guid>
      <description>Read, read, read, the rest of my life.</description>
      <content:encoded><![CDATA[<p>This image has been floating around the web, once again, so I’ve snatched a copy to post here<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and keep reminding myself of what I want to do with the rest of my life.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p><a href="/images/2025/read-like-this-the-rest-of-my-life.jpg"><figure class="align-center ">
    <img loading="lazy" src="/images/2025/read-like-this-the-rest-of-my-life.jpg#center"/> 
</figure>
</a></p>
<figcaption style="font-style: italic; text-align: center;  font-size: 85%; color: var(--secondary)">
<p>Susan Sontag’s annotations in her copy of <em>Finnegans Wake.</em> Click to slightly enlarge</p>
</figcaption>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>I am a reader.<br>
In the <a href="https://fs.blog/how-to-read-a-book/">Mortimer Adler</a> sense of the word.<br>
This is my dream :)<br>
To be surrounded by books.<br>
And to be able to savour them, a line … a page at a time.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subjectFeedback on post: This Is What I Want to Do the Rest of My Life
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/this-is-what-i-want-to-do-the-rest-of-my-life
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_l_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I found it this time, courtesy a <a href="https://dduane.tumblr.com/post/772854275606003713/macrolit-susan-sontags-annotations-in-her-copy">Diane Duane Tumblr repost</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Notes Now Has No RSS Feed</title>
      <link>https://janusworx.com/work/notes-now-has-no-rss-feed/</link>
      <pubDate>Sat, 04 Jan 2025 16:34:20 +0530</pubDate>
      <guid>https://janusworx.com/work/notes-now-has-no-rss-feed/</guid>
      <description>&lt;p&gt;Finally figured out how to disable RSS feeds on a post by post basis.&lt;/p&gt;
&lt;p&gt;I needed to do this for my stream of consciousness / wip / progress notes in the &lt;a href=&#34;https://janusworx.com/nm/&#34;&gt;Notes and Miscellanea&lt;/a&gt; section
I did not want to disable the whole section, because some posts, I do want to leak out.&lt;/p&gt;
&lt;p&gt;What it boiled down to was getting the RSS template to ignore sites with some parameter set in the front matter. Most posts on the web do a &lt;code&gt;rss_disabled: true&lt;/code&gt; or something to that effect.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finally figured out how to disable RSS feeds on a post by post basis.</p>
<p>I needed to do this for my stream of consciousness / wip / progress notes in the <a href="/nm/">Notes and Miscellanea</a> section
I did not want to disable the whole section, because some posts, I do want to leak out.</p>
<p>What it boiled down to was getting the RSS template to ignore sites with some parameter set in the front matter. Most posts on the web do a <code>rss_disabled: true</code> or something to that effect.</p>
<p>Joe Mooring over on the Hugo Discourse <a href="https://discourse.gohugo.io/t/disable-rss-for-one-or-more-specific-posts-in-a-blog/52995/2?u=jasonbraganza">logically pointed out</a> that I’d want such posts to be disabled in the sitemap as well, so I’d do well to just piggy back off of that.</p>
<p>So all I had to do was set the following in the my front matter</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">sitemap</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">disable</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><p>and then configure the embedded <a href="https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_default/rss.xml">RSS template</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> to just range through pages that didn’t have that parameter set, like so …</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-gotmpl" data-lang="gotmpl"><span style="display:flex;"><span><span style="color:#75715e">{{-</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">where</span> <span style="color:#a6e22e">$pages</span> <span style="color:#e6db74">&#34;Sitemap.Disable&#34;</span> <span style="color:#e6db74">&#34;ne&#34;</span> <span style="color:#66d9ef">true</span> <span style="color:#75715e">}}</span>
</span></span></code></pre></div><p>The original line would’ve been something like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-gotmpl" data-lang="gotmpl"><span style="display:flex;"><span><span style="color:#75715e">{{-</span> <span style="color:#66d9ef">range</span> <span style="color:#a6e22e">$pages</span> <span style="color:#75715e">}}</span>
</span></span></code></pre></div><p>You’ll need to create a new feed file by copying the contents of the embedded template to a file called  <code>rss.xml</code> in the <code>layouts/_default/</code> directory</p>
<p>Once that’s done, all should be hunky dory.<br>
Posts with this frontmatter, will now no longer appear in RSS feeds or the sitemap.<br>
To make things simpler, I edited this sections archetype, so that the next time I create a new Notes &amp; Miscellenea post, all of this metadata is already set for me.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subjectFeedback on post: Notes Now Has No RSS Feed
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/notes-now-has-no-rss-feed
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_l_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>If you already have it defined in your theme, then override it.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Fixing Espanso Expansions</title>
      <link>https://janusworx.com/work/fixing-espanso-expansions/</link>
      <pubDate>Sun, 29 Sep 2024 17:05:19 +0530</pubDate>
      <guid>https://janusworx.com/work/fixing-espanso-expansions/</guid>
      <description>Text used to not g</description>
      <content:encoded><![CDATA[<p><br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2024/espanso.png#center"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>
</p>
<p>I never had the time to deal with my <a href="https://espanso.org/">Espanso</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> hijinks until today.<br>
While it worked perfectly, when I installed it all those years ago, when I migrated over from the Mac, Espanso itself has changed and evolved over the years.<br>
It took over my old configuration like a champ and <em>mostly</em> worked, with the exception of a few shortcuts; ones that I <em>frequently</em> used 😂</p>
<p>Emacs was one application of mine that never quite worked right with Espanso.<br>
I’d frequently get <code>timed out waiting for reply from selection owner</code> whenever I tried expansions in there. Typing :joy to get 😂 would work in every other program, but no joy with Emacs, in additon to plenty of other expansions err … not expanding.</p>
<p>All my browser url expansions would not expand properly either, with mangled expansions most of the time.</p>
<p>So today I <a href="https://espanso.org/docs/">dove in to the docs</a>, and realised two things.<br>
1. My emacs needed a longer time out<br>
2. Espanso now tries to identify the <em>kind</em> of text, and maybe those were causing my issues?</p>
<br>

<h3 id="emacs">Emacs</h3>
<p>I realised I needed a longer clipboard threshold, only for Emacs.<br>
So I created an <a href="https://espanso.org/docs/configuration/app-specific-configurations/">App specific configuration</a>, just for Emacs to use and gave it said option. Here’s what the contents of my <code>espanso/config/emacs.yml</code> look like</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">filter_class</span>: <span style="color:#e6db74">&#39;Emacs&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">clipboard_threshold</span>: <span style="color:#ae81ff">10000</span>
</span></span></code></pre></div><br>

<h3 id="rich-text-expansions">Rich Text Expansions</h3>
<p>That helped with a lot of expansions in Emacs, but not with my joy expansion.<br>
And not with stuff that were links and oh … links! and html! and markdown! Could those be the culprits?<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><br>
The docs mention that Espanso now has <a href="https://espanso.org/docs/matches/basics/#rich-text">rich text support</a><br>
What that means, is that the trigger nows supports two new keywords <code>html</code> and <code>markdown</code> in addition ye ole <code>replace</code>
So I changed most of my affected shortcuts to either of those two keywords; <code>markdown</code> for most everything and <code>html</code> for linky stuff. Here’s what my beloved joy looks like now …</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">matches</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">trigger</span>: <span style="color:#e6db74">&#34;:joy&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">markdown</span>: <span style="color:#ae81ff">😂</span>
</span></span></code></pre></div><p><br>

And those two things did it! Every shortcut expands everwhere! What joy 😂</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subjectFeedback on post: Fixing Espanso Expansions
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/fixing-espanso-expansions
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_l_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Espanso lets you assign short snippets of text to longer streams of text, that you’d frequently use. I use <code>:adhx</code> for example, and it expands out to type my whole address. Pretty handy!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>dun! dun! dun! they were!&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Testing Opengraph Logo</title>
      <link>https://janusworx.com/work/testing-opengraph-logo/</link>
      <pubDate>Sat, 28 Sep 2024 17:46:14 +0530</pubDate>
      <guid>https://janusworx.com/work/testing-opengraph-logo/</guid>
      <description>J, Where art thou?</description>
      <content:encoded><![CDATA[<p>‘Romeo, Romeo! Wherefore art thou Romeo?’</p>
<p>(Romeo and Juliet, Act 2, Scene 2)</p>
]]></content:encoded>
    </item>
    <item>
      <title>Forgejo</title>
      <link>https://janusworx.com/work/forgejo/</link>
      <pubDate>Sat, 28 Sep 2024 15:39:12 +0530</pubDate>
      <guid>https://janusworx.com/work/forgejo/</guid>
      <description>Light up the forge!</description>
      <content:encoded><![CDATA[<p>Setup a new instance of Forgejo for myself today.<br>
The first thing I felt, was … instant relief.<br>
I didn’t realise just how much cognitive discomfort I was feeling, because Github was the only place I had all my code. As well as mirrors/forks of all the stuff I loved.<br>
I’m going to slowly move over to my little Forgejo instance as I learn more.</p>
<p>Right now I’ve set up pull mirrors for all the projects I love.
<br>
</p>
<figure class="align-center ">
    <img loading="lazy" src="/images/2024/forgejo.png#center"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>Next step is to figure out how to automate my Hugo blog deployment and more importantly; having all my posts in source control.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Forgejo
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/forgejo
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Smol Note to Self, on Deploying Stuff</title>
      <link>https://janusworx.com/work/smol-note-to-self-on-deploying-stuff/</link>
      <pubDate>Sat, 28 Sep 2024 14:34:47 +0530</pubDate>
      <guid>https://janusworx.com/work/smol-note-to-self-on-deploying-stuff/</guid>
      <description>This goes here, that goes there</description>
      <content:encoded><![CDATA[<ol>
<li>Anything I want folks to see and/or interact with, goes on the public VM</li>
<li>Anything I want to host for myself, goes on the Pi.</li>
</ol>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post?<br>
Mail me at <a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Smol Note to Self, on Deploying Stuff
%22">feedback at this domain</a> <em>or</em> <a href="https://dc.janusworx.com/t/smol-note-to-self-on-deploying-stuff
">continue the discourse here</a>.
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>anki-push-u, Creating a Tiny Pushover Addon for Anki</title>
      <link>https://janusworx.com/anki-push-u/</link>
      <pubDate>Sat, 21 Sep 2024 11:31:39 +0530</pubDate>
      <guid>https://janusworx.com/anki-push-u/</guid>
      <description>Notifications! Notifications! Notifications! Notifications!</description>
      <content:encoded><![CDATA[<br>

<p>I want to slowly increase my French vocabulary, so I got this comprehensive frequency word deck from <a href="https://ankiweb.net/shared/info/893324022">Shared Decks section of the Anki website</a>.</p>
<p>I keep forgetting to look it up during the day, after my morning session and the only way I can get those stubborn words<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> to stick in my mind, is if I keep doing the deck 4–5 times a day.</p>
<p>I know! With all my newfound devops/python skills, could I figure out a way to remind myself to do it? Turns out I can! :)</p>
<p>I already use <a href="https://pushover.net">Pushover</a>, to get notified of darn near anything.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><br>
And I read enough of <a href="https://addon-docs.ankiweb.net/a-basic-addon.html">Anki’s add-on documentation</a> to know I could whip something up.<br>
So a bit of searching on the net, a bit of jiggery pokery with <a href="https://claude.ai/">Claude</a>, and some spelunking through Anki’s source code and <a href="https://forums.ankiweb.net/t/how-to-get-the-number-of-cards-due-to-today/10658">forums</a> later, I present to you … <em><strong><a href="https://github.com/jasonbraganza/anki-push-u">anki-push-u</a>!</strong></em><sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>As long as your Anki’s running, this little add-on will find cards due, at the interval you tell it to, and then notify you wherever you have Pushover running!<br>
No more forgetting due cards!</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<figure class="align-center ">
    <img loading="lazy" src="/images/2024/anki-pushover-notifications.png#center"
         alt="A screenshot of Pushover notifications on two devices"/> 
</figure>

<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p><a href="https://github.com/jasonbraganza/anki-push-u">Find the add-on and instructions over at Github.</a></p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: anki-push-u, Creating a Tiny Pushover Addon for Anki
%22">feedback at this domain</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I’m looking at you, ailleurs&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Hugo updates on three machines, calibre updates on two machines, podcast downloads and quite a bit else&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>It pushes you to do your due cards! Tada!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
  </channel>
</rss>
