<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Devops on Janusworx</title><link>https://janusworx.com/tags/devops/</link><description>Recent content in Devops on Janusworx</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>feedback@janusworx.com (Mario Jason Braganza)</managingEditor><webMaster>feedback@janusworx.com (Mario Jason Braganza)</webMaster><copyright>© 2026, Mario Jason Braganza</copyright><lastBuildDate>Tue, 11 Nov 2025 07:37:54 +0530</lastBuildDate><atom:link href="https://janusworx.com/tags/devops/index.xml" rel="self" type="application/rss+xml"/><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><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/kubernetes-note-to-self-need-load-balancer-installed-on-bare-metal/</guid><description>&lt;br&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2025/kubernetes.svg" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="info"&gt;
 &lt;div class="flex items-center gap-2 font-semibold text-inherit"&gt;
 &lt;div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"&gt;&lt;span class="relative block icon"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z"/&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/div&gt;
 &lt;div class="grow"&gt;
 Intended Audience
 &lt;/div&gt;
 &lt;/div&gt;&lt;div class="admonition-content mt-3 text-base leading-relaxed text-inherit"&gt;&lt;p&gt;Mostly me. Also other grizzly sysadmins who are learning devops like me.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;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.&lt;br&gt;
I had to then go expose a “NodePort” to gain access from outside.&lt;/p&gt;
&lt;p&gt;So to expose my stuff in as “&lt;a href="https://www.scotthyoung.com/blog/2020/05/04/do-the-real-thing/" target="_blank" rel="noreferrer"&gt;real world&lt;/a&gt;” a way as possible, we need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Either install a load balancer implementation like &lt;a href="https://metallb.io/" target="_blank" rel="noreferrer"&gt;MetalLB&lt;/a&gt;. OR&lt;/li&gt;
&lt;li&gt;Use a Kubernetes distribution that has a load balancer implementation built-in, like &lt;a href="https://k3s.io" target="_blank" rel="noreferrer"&gt;K3s&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I chose option 2 and used K3s, because I am, as they say in popular parlance, using Kubernetes at the edge.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
In which case, I prefer to have as many batteries built-in as possible.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post?&lt;br&gt;
Mail me at &lt;a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: Kubernetes, Note to Self: Need Load Balancer Installed on Bare Metal
%22" &gt;feedback at this domain&lt;/a&gt; or [continue the discourse here][2].
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&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;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Although, from the articles I’ve read, if you’re doing a multiple node cluster, then you’re better off using MetalLB.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></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><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/k3s-move-data-folder/</guid><description>&lt;br&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2025/k3s.svg" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="info"&gt;
 &lt;div class="flex items-center gap-2 font-semibold text-inherit"&gt;
 &lt;div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"&gt;&lt;span class="relative block icon"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"&gt;&lt;path fill="currentColor" d="M256 0C114.6 0 0 114.6 0 256s114.6 256 256 256s256-114.6 256-256S397.4 0 256 0zM256 128c17.67 0 32 14.33 32 32c0 17.67-14.33 32-32 32S224 177.7 224 160C224 142.3 238.3 128 256 128zM296 384h-80C202.8 384 192 373.3 192 360s10.75-24 24-24h16v-64H224c-13.25 0-24-10.75-24-24S210.8 224 224 224h32c13.25 0 24 10.75 24 24v88h16c13.25 0 24 10.75 24 24S309.3 384 296 384z"/&gt;&lt;/svg&gt;
&lt;/span&gt;&lt;/div&gt;
 &lt;div class="grow"&gt;
 Intended Audience
 &lt;/div&gt;
 &lt;/div&gt;&lt;div class="admonition-content mt-3 text-base leading-relaxed text-inherit"&gt;&lt;p&gt;Mostly me. Also other grizzly sysadmins who are learning devops like me.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 class="relative group"&gt;Problem
 &lt;div id="problem" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#problem" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;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.&lt;/p&gt;

&lt;h2 class="relative group"&gt;Solution
 &lt;div id="solution" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#solution" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;div class="admonition relative overflow-hidden rounded-lg border-l-4 my-3 px-4 py-3 shadow-sm" data-type="caution"&gt;
 &lt;div class="flex items-center gap-2 font-semibold text-inherit"&gt;
 &lt;div class="flex shrink-0 h-5 w-5 items-center justify-center text-lg"&gt;&lt;span class="relative block icon"&gt;&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"&gt;
&lt;path fill="currentColor" d="M159.3 5.4c7.8-7.3 19.9-7.2 27.7 .1c27.6 25.9 53.5 53.8 77.7 84c11-14.4 23.5-30.1 37-42.9c7.9-7.4 20.1-7.4 28 .1c34.6 33 63.9 76.6 84.5 118c20.3 40.8 33.8 82.5 33.8 111.9C448 404.2 348.2 512 224 512C98.4 512 0 404.1 0 276.5c0-38.4 17.8-85.3 45.4-131.7C73.3 97.7 112.7 48.6 159.3 5.4zM225.7 416c25.3 0 47.7-7 68.8-21c42.1-29.4 53.4-88.2 28.1-134.4c-2.8-5.6-5.6-11.2-9.8-16.8l-50.6 58.8s-81.4-103.6-87.1-110.6C133.1 243.8 112 273.2 112 306.8C112 375.4 162.6 416 225.7 416z"/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/div&gt;
 &lt;div class="grow"&gt;
 Caution
 &lt;/div&gt;
 &lt;/div&gt;&lt;div class="admonition-content mt-3 text-base leading-relaxed text-inherit"&gt;&lt;p&gt;Before you do any of the following, make sure to stop the cluster with:&lt;br&gt;
&lt;code&gt;sudo systemctl stop k3s&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;K3s supports having a&lt;a href="https://docs.k3s.io/cli/server#data" target="_blank" rel="noreferrer"&gt; custom data directory&lt;/a&gt;, by letting me specify a &lt;code&gt;data-dir&lt;/code&gt;.&lt;br&gt;
I decided to specify it in the &lt;a href="https://docs.k3s.io/installation/configuration#configuration-file" target="_blank" rel="noreferrer"&gt;K3s &lt;code&gt;config&lt;/code&gt; file&lt;/a&gt; at &lt;code&gt;/etc/rancher/k3s/config&lt;/code&gt;.&lt;br&gt;
If it isn’t there (as it wasn’t in my case), just create one. You’ll need to do this as the &lt;code&gt;root&lt;/code&gt; user.&lt;br&gt;
This is what I now have in there.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;data-dir: /BIGHDD/rancher/k3s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And then, I …&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Created a &lt;code&gt;rancher&lt;/code&gt; directory in my big hard disk. (&lt;code&gt;root&lt;/code&gt; owns it)&lt;/li&gt;
&lt;li&gt;Ran rsync as the &lt;code&gt;root&lt;/code&gt; user: &lt;code&gt;rsync -a /var/lib/rancher/k3s/ /BIGHDD/rancher/k3s/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Started up my cluster again with a &lt;code&gt;sudo systemctl start k3s&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post?&lt;br&gt;
Mail me at &lt;a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: K3s: Move Data Folder
%22" &gt;feedback at this domain&lt;/a&gt; or [continue the discourse here][2].
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&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></item><item><title>The Plan for My New Hetzner VM</title><link>https://janusworx.com/work/the-plan-for-my-new-hetzner-vm/</link><pubDate>Thu, 06 Nov 2025 08:30:54 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/the-plan-for-my-new-hetzner-vm/</guid><description>
&lt;h2 class="relative group"&gt;Update: &lt;a href="https://janusworx.com/nm/2025-12-11/" &gt;2025-12-11&lt;/a&gt;
 &lt;div id="update-2025-12-11" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#update-2025-12-11" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;I got it done!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;Preamble
 &lt;div id="preamble" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#preamble" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;If this post is weird and stream of consciousness like, that’s by design.&lt;br&gt;
You are seeing a &lt;a href="https://janusworx.com/" &gt;notes and miscellanea&lt;/a&gt; post, in the work category.&lt;br&gt;
I want to be able to think through what I am doing. Mostly to clarify, document and explicitly state &lt;em&gt;&lt;strong&gt;what&lt;/strong&gt;&lt;/em&gt; I want. To avoid shifting goalposts (or rather to shift them intentionally, if need be.)&lt;br&gt;
I’ll be updating and revising this post as I think and learn and experience things&lt;/p&gt;

&lt;h2 class="relative group"&gt;Goals
 &lt;div id="goals" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#goals" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Think about and write what I want to get done with my hetzner&lt;/li&gt;
&lt;li&gt;For now, the how does not matter&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;What I want
 &lt;div id="what-i-want" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-i-want" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A VM running K3s, that I can deploy my Hugo website to, as well all the apps that I choose to run on Janusworx&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Everything goes through my Forgejo instance at home&lt;/li&gt;
&lt;li&gt;I write a post and it should deploy to the website somehow&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;Secrets should be self hosted, via environment variables or some self hosted solution. Never at a third party service&lt;/li&gt;
&lt;/ul&gt;
&lt;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;'/&gt;


&lt;h3 class="relative group"&gt;2025-11-06 09:35
 &lt;div id="2025-11-06-0935" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2025-11-06-0935" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Got tangled with Hugo in the morning.&lt;/li&gt;
&lt;li&gt;I think I got the basics down, the VM comes up. K3s in installed, but in what order do I move my apps over?&lt;/li&gt;
&lt;li&gt;Think I’ll the root domail last. And try beginning with the “simpler” apps first&lt;/li&gt;
&lt;li&gt;Begin with familiarising myself with Helm&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2025-11-06 10:06:&lt;/em&gt; Tea break&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2025-11-06 13:06:&lt;/em&gt; Lunch break&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;2025-11-06 16:00
 &lt;div id="2025-11-06-1600" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2025-11-06-1600" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Back. Trying to port my dev terraform setup to production. It should &lt;em&gt;just&lt;/em&gt; work. But it does not.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2025-11-06 16:59:&lt;/em&gt; Solved. I had somehow borked my Terraform state. Nuked it. And then things started working again&lt;/li&gt;
&lt;li&gt;Show stopper now. My GPG key has expired. Need to figure out how to sign my git commits with SSH now&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2025-11-06 18:26:&lt;/em&gt; I &lt;em&gt;think&lt;/em&gt; 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&lt;/li&gt;
&lt;li&gt;&lt;em&gt;2025-11-06 20:00:&lt;/em&gt; Done! My production cluster is up! &lt;em&gt;&lt;strong&gt;And&lt;/strong&gt;&lt;/em&gt; I can tear it down and build it up consistently. Now to work with it tomorrow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post?&lt;br&gt;
Mail me at &lt;a href="mailto:feedback@janusworx.com?subject=%22Feedback on post: The Plan for My New Hetzner VM
%22" &gt;feedback at this domain&lt;/a&gt;.
&lt;br&gt;
&lt;/p&gt;</description></item><item><title>Forgejo</title><link>https://janusworx.com/work/forgejo/</link><pubDate>Sat, 28 Sep 2024 15:39:12 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/forgejo/</guid><description>&lt;p&gt;Setup a new instance of Forgejo for myself today.&lt;br&gt;
The first thing I felt, was … instant relief.&lt;br&gt;
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.&lt;br&gt;
I’m going to slowly move over to my little Forgejo instance as I learn more.&lt;/p&gt;
&lt;p&gt;Right now I’ve set up pull mirrors for all the projects I love.
&lt;br&gt;
&lt;/p&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2024/forgejo.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;p&gt;Next step is to figure out how to automate my Hugo blog deployment and more importantly; having all my posts in source control.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post?&lt;br&gt;
Mail me at &lt;a href="mailto:feebdback@janusworx.com?subject=%22Feedback on post: Forgejo
%22" &gt;feedback at this domain&lt;/a&gt; &lt;em&gt;or&lt;/em&gt; [continue the discourse here][3].
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Doing Devops, Dropping Rust</title><link>https://janusworx.com/work/doing-devops-dropping-rust/</link><pubDate>Fri, 07 Jun 2024 16:37:50 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/doing-devops-dropping-rust/</guid><description>&lt;p&gt;Been struggling to do it all over the past few months.&lt;br&gt;
But no! Life says no :)&lt;/p&gt;
&lt;p&gt;So I’m building some margin into my life.&lt;br&gt;
And the only thing I can talk about work wise, is the familiarity I am trying to gain as part of the career pivot.&lt;br&gt;
The Devops Stuff.&lt;br&gt;
The only thing that is career adjacent to all the stuff I did as a sysadmin and then consultant. So hopefully lots of boring stuff about exciting tech as I try to build new mental models, to fit over old ones.&lt;/p&gt;
&lt;p&gt;Problem though, is what do I write?&lt;br&gt;
I don’t have a good spin on most computer devops stuff. I don’t know what to say.&lt;br&gt;
So for now, they probably will be, just like I point above, boring progress logs.&lt;br&gt;
Mostly consistent, to give me accountability.&lt;br&gt;
And hopefully, I’ll find a voice.&lt;/p&gt;
&lt;p&gt;On the personal front, books, reading, art, language, poetry, photography and other posts will continue. Those are what make my soul sing :)&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;?subject=%22Feedback on post: Doing Devops, Dropping Rust
%22" &gt;feedback at this domain&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Moved My Music Library From Jellyfin to Emby Today</title><link>https://janusworx.com/work/moved-my-music-library-from-jellyfin-to-emby-today/</link><pubDate>Tue, 04 Jun 2024 10:47:23 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/moved-my-music-library-from-jellyfin-to-emby-today/</guid><description>&lt;p&gt;I had moved off Plex, close to two years ago, because … reasons.&lt;br&gt;
Unable to decide between Emby and Jellyfin and having just learned containers at the time, I deployed both on my Pi.&lt;br&gt;
Emby handled video duties while Jellyfin did music.&lt;/p&gt;
&lt;p&gt;And now after close to two years, I’m moving off Jellyfin to Emby.&lt;br&gt;
The only reason being its iOS client.&lt;br&gt;
It still has a lot of growing up to do, and I’ve reached the end of my tether trying to adjust to its foibles.&lt;br&gt;
I cannot turn the phone off, else the music goes off.&lt;br&gt;
I cannot switch away from the Jellyfin app, else the music goes off.&lt;br&gt;
If I get a call, then the app sorta-kinda loses its mind and I have to kill it and relaunch it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;All&lt;/strong&gt;&lt;/em&gt; I want from my music player is to be a good audio citizen on iOS. Connect to the server, read my songs, play my music. And do it in the background.&lt;/p&gt;
&lt;p&gt;While I am sympathetic to the priorities of the open source Jellyfin team, I am not getting any younger and my hour long walks are the only time I get to enjoy my music.&lt;/p&gt;
&lt;p&gt;So … I moved.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Setting the stage
 &lt;div id="setting-the-stage" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#setting-the-stage" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;There had to be &lt;em&gt;two&lt;/em&gt; instances of Emby running. I don’t want my video online and so I don’t want it exposed&lt;/li&gt;
&lt;li&gt;Video is secondary anyway. So that had to be the second container. The main one is Music.&lt;/li&gt;
&lt;li&gt;Music needs to be accessible from anywhere on the web.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Doing it
 &lt;div id="doing-it" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#doing-it" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I already had docker running and installed, along with Nginx&lt;/li&gt;
&lt;li&gt;Jellyfin has better documentation. So I used &lt;a href="https://jellyfin.org/docs/general/networking/nginx/" target="_blank" rel="noreferrer"&gt;their guide&lt;/a&gt; to reverse proxy Nginx to the Emby service that would come up. All I had to do, was put in my SSL cert paths correctly and change the variable &lt;code&gt;jellyfin&lt;/code&gt; to &lt;code&gt;embymusicserver&lt;/code&gt; (along with the rest of the require settings.)&lt;/li&gt;
&lt;li&gt;I created a folder to hold Emby’s &lt;a href="https://hub.docker.com/r/emby/embyserver/" target="_blank" rel="noreferrer"&gt;&lt;code&gt;docker compose&lt;/code&gt;&lt;/a&gt; file. I modified the container name to &lt;code&gt;embymusicserver&lt;/code&gt; and gave the path to mount for its config and another one that pointed to my music folder. Pretty straightforward. (I had already changed the ports earlier on the video emby instance to 8097 &amp;amp; 8921 to avoid conflicts with Jellyfin, so I did not have to touch that.)&lt;/li&gt;
&lt;li&gt;Assigned ownership recursively to the user that would run the container.&lt;/li&gt;
&lt;li&gt;Did a &lt;code&gt;docker compose up&lt;/code&gt; to see if everything came up ok. And then tore it down&lt;/li&gt;
&lt;li&gt;And finally, once again, adapted my &lt;a href="https://jellyfin.org/docs/general/installation/container#using-docker-compose" target="_blank" rel="noreferrer"&gt;old Jellyfin systemd script&lt;/a&gt; to ensure I could have it start and stop with the system&lt;/li&gt;
&lt;/ul&gt;
&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2024/emby-1.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2024/emby-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;p&gt;In hindsight, there was no way to pull all of this off in an hour, if it wasn’t for Docker and Emby’s image. Now I realise why containers are taking over the world.&lt;/p&gt;
&lt;p&gt;And thank you for all you do, Jellyfin. I shall return as soon as the app gets more useful.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;?subject=%22Feedback on post: Moved My Music Library From Jellyfin to Emby Today
%22" &gt;feedback at this domain&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Getting Emacs Windows to Not Be Shy</title><link>https://janusworx.com/work/getting-emacs-windows-to-not-be-shy/</link><pubDate>Sat, 18 Nov 2023 09:37:35 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/getting-emacs-windows-to-not-be-shy/</guid><description>&lt;p&gt;Figuring out my webapps problem yesterday made me ask myself if I could somehow repurpose that little &lt;code&gt;xdotool&lt;/code&gt; script to solve another niche itch that I had.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Spoiler alert: It did.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I run &lt;a href="https://www.emacswiki.org/emacs/EmacsAsDaemon" target="_blank" rel="noreferrer"&gt;Emacs as a daemon&lt;/a&gt;, and use EmacsClient to connect to the Emacs process.&lt;br&gt;
Makes it really ease to launch, work on, sling around and close lots of Emacs windows.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Which brings me to the hiccough. I launch EmacsClient and a window (frame) does indeed launch, but it just … stays there in the background.&lt;/p&gt;
&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ec-err-1.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;p&gt;Repeated attempts to launch EmacsClient are to no avail.&lt;br&gt;
The pesky little windows just pile up in their corner.&lt;/p&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ec-err-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;p&gt;Ergo, this little bit of Bash/xdotool shenanigans …&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;EMACSWINID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;xdotool search &lt;span class="s2"&gt;&amp;#34;\*scratch\*&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -n1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$EMACSWINID&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xdotool windowactivate &lt;span class="nv"&gt;$EMACSWINID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sh -c &lt;span class="s1"&gt;&amp;#39;emacsclient --create-frame --no-wait --alternate-editor=&amp;#34;&amp;#34; &amp;amp;&amp;amp; export EMACSWINID=$(xdotool search &amp;#34;\*scratch\*&amp;#34; | tail -n1) &amp;amp;&amp;amp; xdotool windowactivate $EMACSWINID&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Check to see if an Emacs scratch buffer is open. If it is, switch to it.&lt;/li&gt;
&lt;li&gt;Otherwise, just launch EmacsClient, get the id of the scratch buffer window (frame) and raise it, so that I can work on it. In peace.&lt;/li&gt;
&lt;/ul&gt;
&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ec-err-3.png" alt="An Emacs frame in the foreground" /&gt;
 
 
 &lt;/figure&gt;
&lt;figcaption style="font-style: italic; text-align: center; font-size: 85%; color: var(--secondary)"&gt;
&lt;p&gt;&lt;em&gt;Cue: sounds of relief, in the background&lt;/em&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Frames, in Emacs parlance&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Getting Around Linux Mint Web App Manager Window Errors</title><link>https://janusworx.com/work/getting-around-linux-mint-web-app-manager-window-errors/</link><pubDate>Fri, 17 Nov 2023 19:09:46 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/getting-around-linux-mint-web-app-manager-window-errors/</guid><description>&lt;p&gt;One of best parts of using Linux Mint is its &lt;a href="https://www.linuxmint.com/rel_ulyssa_cinnamon_whatsnew.php" target="_blank" rel="noreferrer"&gt;Web Apps Manager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I can use most of my websites as dedicated applications now.&lt;br&gt;
Case in point, I use a dedicated web app to run &lt;a href="https://elk.zone/" target="_blank" rel="noreferrer"&gt;Elk&lt;/a&gt;, the web client for Mastodon.&lt;br&gt;
Social stuff like this, or banking stuff or my webmail for that matter, stays away from the rest of my browsing and lets me keep these activities cognitively separate.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ff-err-1.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/p&gt;
&lt;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;'/&gt;

&lt;p&gt;So far, so good.&lt;br&gt;
The issue arises, when I try to launch one of these dedicated apps and it is already running.&lt;br&gt;
Due to the way these little web containers are created, it cannot run another instance and I run into this error.&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;“Firefox is already running, but is not responding. To use Firefox, you must first close the existing Firefox process, restart your device, or use a different profile.”&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;br&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ff-err-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;br&gt;

And I’m like, I know this you git! I &lt;em&gt;am&lt;/em&gt; running a different profile. Can’t you just switch to it? Apparently it cannot. So I’d have to go looking for my app and then &lt;em&gt;Alt-Tab&lt;/em&gt; through dozens of windows or look in my dock&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt; and then get it back.&lt;/p&gt;
&lt;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;'/&gt;

&lt;p&gt;The problem wasn’t the error per se, the problem was the slightly longish delay between me calling the app and the error popping up. And also all that crazy hunting and pecking to find the right window, once I see the error. It gets maddening when I need to do this dance and all I want to do is get to my email window to go look for something important.&lt;/p&gt;
&lt;p&gt;So I began casting around for a way to somehow switch to the actually running window. Was it possible?&lt;br&gt;
That’s when I found &lt;a href="https://github.com/jordansissel/xdotool" target="_blank" rel="noreferrer"&gt;&lt;code&gt;xdotool&lt;/code&gt;&lt;/a&gt;&lt;br&gt;
It lets you do all sorts of crazy things with windows and keyboard and mouse input, but most importantly for me, it let me search for my running app window &lt;em&gt;and&lt;/em&gt; it let me raise and bring it back up. Awesome!&lt;/p&gt;
&lt;p&gt;So instead of telling &lt;a href="https://ulauncher.io/" target="_blank" rel="noreferrer"&gt;Ulauncher&lt;/a&gt; to directly launch the app, I told it to run this script instead.&lt;/p&gt;
&lt;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;'/&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/ff-err-3.png" alt="pic of the ulauncher script window" /&gt;
 
 
 &lt;/figure&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ELKWINID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;xdotool search WebApp-ElkforToots1234 &lt;span class="p"&gt;|&lt;/span&gt; tail -n1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$ELKWINID&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; xdotool windowactivate &lt;span class="nv"&gt;$ELKWINID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sh -c &lt;span class="s1"&gt;&amp;#39; firefox --class WebApp-ElkforToots1234 --profile /home/user/.local/share/ice/firefox/ElkforToots1234 --no-remote &amp;#34;https://elk.zone/&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;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;'/&gt;

&lt;p&gt;In a nutshell, I’m looking to see if Elk is already running (using the xdotool search option in line 3).&lt;br&gt;
If it is, I tell xdotool to get that window to the forefront of the display; and if it isn’t, then to just go ahead and launch the app anew.&lt;/p&gt;
&lt;p&gt;What a load off my mind, this one was!&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I don’t know if this would happen if I use Chrome as the browser engine. I don’t even use it as a browser, much. And for things like these, I wouldn’t touch it with a ten foot pole.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;and still some how miss it&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Quick Fix: Go Mod File Not Found in Current Directory</title><link>https://janusworx.com/work/quick-fix-go-mod-file-not-found-in-current-directory/</link><pubDate>Wed, 15 Mar 2023 19:11:11 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/quick-fix-go-mod-file-not-found-in-current-directory/</guid><description>&lt;p&gt;As I have begun learning Go (or &lt;code&gt;golang&lt;/code&gt; as I needed to use for searching on the web), I’ve been running into some sort of chasm that the Go language seems to have crossed&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; that my old textbook obviously could not have foreseen when it was published.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The book asks me to do a &lt;code&gt;go run .&lt;/code&gt; to get my file to compile and run.&lt;br&gt;
Go seems to having none of it.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: go.mod file not found in current directory or any parent directory; see &amp;#39;go help modules&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Some searching on the web, and I found setting the &lt;code&gt;GO111MODULE&lt;/code&gt; environment variable to &lt;code&gt;auto&lt;/code&gt; or &lt;code&gt;off&lt;/code&gt; will do the trick. So …&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GO111MODULE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;auto&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;did indeed do the trick.&lt;/p&gt;
&lt;p&gt;I’m not putting this in my &lt;code&gt;.bashrc&lt;/code&gt; to make it persistent though. The Go folks must have had some reason to make this change, which I’m (currently) not aware of. Was it architectural? Security related? That is a web search for another day.&lt;/p&gt;
&lt;p&gt;Right now the code compiles and I must be off to my next exercise.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;I’m using v1.20.1&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I’m learning from Packt’s, The Go Workshop (Delio D’Anna et al), 2019&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Huginn: Vive La Pratique Délibérée Avec Les Flux RSS</title><link>https://janusworx.com/work/huginn-vive-la-pratique-d%C3%A9lib%C3%A9r%C3%A9e-avec-les-flux-rss/</link><pubDate>Wed, 15 Mar 2023 09:32:05 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/huginn-vive-la-pratique-d%C3%A9lib%C3%A9r%C3%A9e-avec-les-flux-rss/</guid><description>&lt;p&gt;I’ve been learning French, on my own at a snail’s pace over the past year or so.&lt;br&gt;
All because I want to read Émilie du Châtelet, Dumas, Verne, and Montaigne in their native tongue.&lt;/p&gt;
&lt;p&gt;Since I cannot do immersion nor give regular practice the time it wants, it’s … slow going
But I do, do it. Regularly and &lt;a href="https://jamesclear.com/deliberate-practice-theory" target="_blank" rel="noreferrer"&gt;deliberately&lt;/a&gt;. I’ve built up a vocabulary of about 500-700 words by now and I know if I keep this up, I’ll be able to do read well in time.&lt;/p&gt;
&lt;p&gt;One way I practice is to take something in French and read it slowly, looking up words and phrases and slowly building up the missing pieces.&lt;br&gt;
And to do that, I need something in French. I stumbled across the &lt;a href="https://www.france-pittoresque.com/" target="_blank" rel="noreferrer"&gt;France Pittoresque&lt;/a&gt; site and fell in love with it. French &lt;em&gt;and&lt;/em&gt; History! Just my kind of site.&lt;/p&gt;
&lt;p&gt;Being the lazy bum, that I am, I went looking for an RSS feed, so that I could read their daily article in &lt;a href="https://reeder.app/" target="_blank" rel="noreferrer"&gt;Reeder&lt;/a&gt;.&lt;br&gt;
And hit my first stumbling block.&lt;br&gt;
The good folk at France Pittoresque, don’t provide a feed. Or if they do, I couldn’t find it. Even after looking and looking. And then looking some more.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;You know where I’m going with this. This is a job for &lt;a href="https://janusworx.com/blog/huginn" &gt;Huginn&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;This is how the site looks today&lt;/p&gt;
&lt;p&gt;&lt;a href="https://janusworx.com/images/2023/huginn-france-pittoresque-0.png" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-france-pittoresque-0.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption style="font-style: italic; text-align: center; font-size: 85%; color: var(--secondary)"&gt;
&lt;p&gt;click to embiggen.&lt;/p&gt;
&lt;/figcaption&gt;
&lt;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;'/&gt;

&lt;p&gt;And this little item is what I want to get, on a daily basis.&lt;br&gt;
&lt;br&gt;

&lt;a href="https://janusworx.com/images/2023/huginn-france-pittoresque-1.jpeg" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-france-pittoresque-1.jpeg" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption style="font-style: italic; text-align: center; font-size: 85%; color: var(--secondary)"&gt;
&lt;p&gt;click to embiggen. Actually click any of them to embiggen!&lt;/p&gt;
&lt;/figcaption&gt;
&lt;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;'/&gt;

&lt;p&gt;So I whipped up this scenario.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://janusworx.com/images/2023/huginn-france-pittoresque-2.png" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-france-pittoresque-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;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;'/&gt;

&lt;ol&gt;
&lt;li&gt;It scrapes that little section I mentioned above and gets me the title, the url and the description of the article&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://janusworx.com/images/2023/huginn-france-pittoresque-3.png" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-france-pittoresque-3.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;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;'/&gt;

&lt;ol start="2"&gt;
&lt;li&gt;And generates an RSS feed that I can then use in my feed reader!&lt;br&gt;
The feed is normally at:&lt;br&gt;
&lt;code&gt;http://your-huginn-instance/users/[your-user-id-int]/web_requests/[agent-id-int]/some-'secret'-string.xml&lt;/code&gt;&lt;br&gt;
&lt;br&gt;

It looks more complicated than it is. It’ll get generated the moment you create your agent. One advantage of &lt;a href="https://janusworx.com/blog/why-i-use-an-online-vm/" &gt;using a vm&lt;/a&gt; is that my feed is accessible from any device.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://janusworx.com/images/2023/huginn-france-pittoresque-4.png" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-france-pittoresque-4.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;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;'/&gt;

&lt;p&gt;You can &lt;a href="https://github.com/jasonbraganza/huginn-scenarios/tree/main/france-pittoresque-scrape-create-rss" target="_blank" rel="noreferrer"&gt;find the scenario code here&lt;/a&gt;, if you want to play with it.&lt;/p&gt;
&lt;p&gt;Huginn has proven invaluable when it comes to doing all the little things, that I’d rather not do :)&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Merci beaucoup, Huginn!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;You’re talking to a lazy bum here. So quite possible I overlooked something.&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Huginn: On Becoming a Cal Newport Podcast Packrat</title><link>https://janusworx.com/work/huginn-on-becoming-a-cal-newport-podcast-packrat/</link><pubDate>Tue, 14 Mar 2023 17:55:01 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/huginn-on-becoming-a-cal-newport-podcast-packrat/</guid><description>&lt;p&gt;First things first, you should be &lt;a href="https://www.thedeeplife.com/listen/" target="_blank" rel="noreferrer"&gt;listening to Cal Newport&lt;/a&gt; and &lt;a href="https://calnewport.com/writing/#books" target="_blank" rel="noreferrer"&gt;reading his books too&lt;/a&gt;!&lt;br&gt;
His recent episode on &lt;a href="https://www.thedeeplife.com/podcasts/episodes/ep-238-the-joys-of-the-reading-life/" target="_blank" rel="noreferrer"&gt;books and reading&lt;/a&gt; was lovely!&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;If I remember right, he started doing the podcast, a couple of months after the &lt;a href="https://en.wikipedia.org/wiki/COVID-19_pandemic" target="_blank" rel="noreferrer"&gt;pandemic&lt;/a&gt; broke out and the world shut down. And it felt very much at the time, like one of those friendly voices across the waves in some post apocalyptic movie.&lt;br&gt;
It felt warm, personal and gave me something to do in those dark days.&lt;br&gt;
Ergo, I have a strong connection to it and I began saving every episode, at around episode 10 or so.&lt;/p&gt;
&lt;p&gt;Oh, and speaking of slow productivity, it’s amazing to see what Cal has fashioned the podcast into. A slow steady drumbeat of episodic growth has led to what he call the Cal Newport Empire, with &lt;a href="https://www.thedeeplife.com/" target="_blank" rel="noreferrer"&gt;media galore&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, like I was saying, I’ve been downloading them ever since the beginning, because I’ve some sort of unnatural attachment to them. They’re the thing I want to listen to if I’m marooned on a desert island.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;And now that I have &lt;a href="https://janusworx.com/blog/huginn" &gt;Huginn&lt;/a&gt;, the computer downloads it for me, in the folder I want, with the naming convention, I want.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Here’s the scenario that does it.&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-cnp-0.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It scrapes the website, once every twelve hours to check for a new episode, and grabs the url and title.&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-cnp-1.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;
&lt;/li&gt;
&lt;li&gt;It uses the url to download the episode to a folder.&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-cnp-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;
&lt;/li&gt;
&lt;li&gt;And at the same time, sends me a notification. The title tells me what’s new :)

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-cnp-4.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I probably could use Huginn to rename and copy the file to where I want, but it runs from a Docker container and does not have access to the parent filesystem.&lt;br&gt;
So this little Python script&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; does it for me.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;shutil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;downloads_folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/path/to/downloaded/episode/directory/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;destination_folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/path/to/destination/directory/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;audio_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;downloads_folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iterdir&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;audio_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.mp3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;original_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;audio_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;original_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;original_name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;episode_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raw_file_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CNPE&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;original_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_file_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;episode_number&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; - &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;raw_file_name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;audio_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suffix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloads_folder&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;audio_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;destination_folder&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;new_file_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;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;'/&gt;

&lt;p&gt;It looks for any mp3 files in the specified folder, renames them the way I want them named and then moves them to my packrat archive. &lt;em&gt;&lt;strong&gt;Et voilà!&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-cnp-5.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;
&lt;/p&gt;
&lt;p&gt;The scenario and scripts &lt;a href="https://github.com/jasonbraganza/huginn-scenarios/tree/main/cal-newport-podcast-episode-download" target="_blank" rel="noreferrer"&gt;are here, if you want them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;What else, do you expect a bookworm to tell ya? 😂&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;with a stock of mp3 players and rechargable batteries&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;scheduled via crontab&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Huginn: the Rube Goldbergness of Updating Hugo</title><link>https://janusworx.com/work/huginn-the-rube-goldbergness-of-updating-hugo/</link><pubDate>Mon, 13 Mar 2023 19:35:06 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/huginn-the-rube-goldbergness-of-updating-hugo/</guid><description>&lt;p&gt;&lt;br&gt;

&lt;a href="https://janusworx.com/images/2023/rube_goldberg_war_machine_large.jpg" &gt;
&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/rube_goldberg_war_machine_small.jpg" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption style="font-style: italic; text-align: center; font-size: 85%; color: var(--secondary)"&gt;
&lt;p&gt;Click the pic to embiggen.&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Rube_Goldberg" target="_blank" rel="noreferrer"&gt;Rube Goldberg&lt;/a&gt; illustration via &lt;a href="https://www.flickr.com/photos/x-ray_delta_one/18482076814" target="_blank" rel="noreferrer"&gt;James Vaughan&lt;/a&gt;&lt;/p&gt;
&lt;/figcaption&gt;
&lt;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;'/&gt;

&lt;p&gt;Ended up too sick to even tinker, since I last wrote.&lt;br&gt;
Well enough now, to scratch out some prose to get my brains in gear.&lt;br&gt;
Let’s start with Huginn adventure #1.&lt;br&gt;
Buckle up!&lt;/p&gt;

&lt;h3 class="relative group"&gt;Background
 &lt;div id="background" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#background" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;I found &lt;a href="https://janusworx.com/blog/huginn" &gt;Huginn&lt;/a&gt;, and am using it as my man friday.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;h3 class="relative group"&gt;The “Problem”
 &lt;div id="the-problem" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#the-problem" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;I run Hugo on &lt;del&gt;two&lt;/del&gt; three machines.&lt;br&gt;
I’m tired of updating to the latest release manually.&lt;br&gt;
The computer can do it for me!&lt;/p&gt;

&lt;h3 class="relative group"&gt;Why this way? Why? Why?!
 &lt;div id="why-this-way-why-why" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-this-way-why-why" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;It’s fun!&lt;/li&gt;
&lt;li&gt;Yes, there are other (most likely simpler) ways to do it, but Huginn is my new shiny hammer … and well you know!&lt;/li&gt;
&lt;li&gt;Did I tell you it’s fun? :)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class="relative group"&gt;How now brown cow?
 &lt;div id="how-now-brown-cow" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#how-now-brown-cow" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Some more background:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I could just &lt;code&gt;apt install&lt;/code&gt;, but I’m too posh for that 😂 I want the &lt;em&gt;latest&lt;/em&gt; version of Hugo. And the &lt;em&gt;extended&lt;/em&gt; version at that.&lt;/li&gt;
&lt;li&gt;I depend on two more helpers.&lt;br&gt;
a. &lt;a href="syncthing.net/" &gt;Syncthing&lt;/a&gt; syncs the folder that the Hugo deb package downloads to, across all my machines&lt;br&gt;
b. Pushover sends me push notifications. Huginn &lt;a href="https://pushover.net/apps" target="_blank" rel="noreferrer"&gt;integrates&lt;/a&gt; with it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Having said that, here’s a pic of my four step scenario, followed by the output of each step.&lt;/p&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-0.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;ol&gt;
&lt;li&gt;Scrape the Hugo github releases page to get the title.&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-1.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;ol start="2"&gt;
&lt;li&gt;Get the latest release title&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt; and fashion a url out of it.&lt;/li&gt;
&lt;/ol&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-2.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

&lt;ol start="3"&gt;
&lt;li&gt;Download Hugo to a folder.&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-3.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;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;'/&gt;

&lt;ol start="4"&gt;
&lt;li&gt;Send myself a push notification.&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-4.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;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;'/&gt;

&lt;ol start="5"&gt;
&lt;li&gt;And tada!

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-5.png" alt="" /&gt;
 
 
 &lt;/figure&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;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;'/&gt;

&lt;p&gt;So we done? No, you silly goose!&lt;br&gt;
&lt;br&gt;

We’re done downloading the installer. Said installer now needs installing.&lt;br&gt;
So my very imaginatively titled &lt;code&gt;install-hugo.sh&lt;/code&gt; script&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;, which runs once a day via a &lt;code&gt;crontab&lt;/code&gt; entry …&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;takes the file,&lt;/li&gt;
&lt;li&gt;checks to see if it’s downloaded in the last day&lt;/li&gt;
&lt;li&gt;and if so, installs it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mind you, it needs root privileges. And then it also …&lt;br&gt;
4. deletes any stray debs more than a few days old.&lt;sup id="fnref:6"&gt;&lt;a href="#fn:6" class="footnote-ref" role="doc-noteref"&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#! /usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/hugo/deb/file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install deb from the last 24 hours&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find *.deb -maxdepth &lt;span class="m"&gt;1&lt;/span&gt; -mmin -1440 &lt;span class="p"&gt;|&lt;/span&gt; xargs -d &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; dpkg -i
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Remove debs more than 2 days old&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find *.deb -maxdepth &lt;span class="m"&gt;1&lt;/span&gt; -mtime +2 &lt;span class="p"&gt;|&lt;/span&gt; xargs -d &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; rm -rf &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;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;'/&gt;

&lt;p&gt;And &lt;em&gt;&lt;strong&gt;now&lt;/strong&gt;&lt;/em&gt; we’re done :)&lt;/p&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn-hugo-6.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;figcaption style="font-style: italic; text-align: center; font-size: 85%; color: var(--secondary)"&gt;
&lt;p&gt;Holy shiny hammer, Batgirl! It worked!&lt;/p&gt;
&lt;/figcaption&gt;
&lt;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;'/&gt;

&lt;p&gt;The scenario, should you install Huginn and want to import and play with, as well as the shell script are here, &lt;a href="https://github.com/jasonbraganza/huginn-scenarios/tree/main/hugo-update" target="_blank" rel="noreferrer"&gt;on Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note: I had originally used the RSS agent in step one, instead of the Website agent I use now, and that was much easier. But it would detect the new feed entry and then just sit there hatching eggs, not doing anything. I wish I had a snapshot (of the missed events, not hatched eggs) but I digress. The website agent, for all its hacky xpath quackery &lt;em&gt;works.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;it could have been girl friday too, but I call mine Bertuccio, after &lt;a href="https://en.wikipedia.org/wiki/The_Count_of_Monte_Cristo" target="_blank" rel="noreferrer"&gt;Edmond Dantes&lt;/a&gt;’ man friday&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I cannot believe, I go scrape a website and learn all that xpath voodoo, just to get a measly text string.&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;And here’s where Huginn helps. It remembers the last title. And only proceeds if something has changed.&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;the push notification is just like that. something whimsical for me. It’s independent of the download. I should probably have called it Step 3a. or 2b. Never mind now.&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;which is also synced and available across all three machines&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:6"&gt;
&lt;p&gt;I let them be for a couple of days, in case a machine is not online that day.&amp;#160;&lt;a href="#fnref:6" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Huginn</title><link>https://janusworx.com/work/huginn/</link><pubDate>Thu, 02 Mar 2023 05:00:00 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/huginn/</guid><description>&lt;p&gt;&lt;br&gt;


&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/huginn.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;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;'/&gt;

Let’s get the, “What the heck is &lt;a href="https://github.com/huginn/huginn" target="_blank" rel="noreferrer"&gt;Huginn&lt;/a&gt;?” out of the way.&lt;br&gt;
If you’ve heard of Zapier or IFTTT, that’s what this is. Only better. You host it. You control it. You program it. And everything’s in your control.&lt;br&gt;
If you’ve used &lt;a href="https://en.wikipedia.org/wiki/Yahoo!_Pipes" target="_blank" rel="noreferrer"&gt;Yahoo Pipes&lt;/a&gt;, then I tip my hat to you my dear friend and tell the rest of you folk, that I believe all of these new fangled pieces of zaps and agents are the spiritual successor to that pioneering web app. IBM has a similar open source alternative, with all the new fangled hotness called &lt;a href="https://en.wikipedia.org/wiki/Node-RED" target="_blank" rel="noreferrer"&gt;Node-RED&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just like piping and transforming text with Unix utilities locally, &lt;a href="https://github.com/huginn/huginn" target="_blank" rel="noreferrer"&gt;Huginn&lt;/a&gt; lets us do that with web data. RSS feeds, webhooks, JSON data and the like. Take ’em, ingest ’em, chew on ’em, transform ’em and do what the heck you want with ’em!&lt;/p&gt;

&lt;h3 class="relative group"&gt;Why Huginn?
 &lt;div id="why-huginn" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#why-huginn" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;So why did I settle on Huginn? And what do I use it for?&lt;br&gt;
Well, I liked the name. And I wanted something Yahoo-pipesque for myself :)&lt;br&gt;
I used it originally on my desktop, to push my blog posts to twitter and my &lt;a href="https://toots.dgplug.org/@jason" target="_blank" rel="noreferrer"&gt;mastodon account&lt;/a&gt;. And then I lost it in a system crash&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; and I didn’t get to putting it up again.&lt;/p&gt;
&lt;p&gt;Until a recent bout of sickness, and the urge to tinker led me to put it up on my vm.&lt;br&gt;
I realised that I don’t want to use my programming hammer to tackle every computing hammer that I face. There’s too much to learn and too little life.&lt;br&gt;
So if Huginn lets me do interesting things with json and liquid and duct tape, why ever not?&lt;/p&gt;
&lt;p&gt;I still have to do the autopost to my social accounts&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;, but I’ve already set it up to scratch several itches I had.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It scrapes a couple of art websites, that don’t have feeds and then creates RSS feeds so that I can read them peacefully in my RSS &lt;a href="https://www.reederapp.com/" target="_blank" rel="noreferrer"&gt;Reeder&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I check my &lt;a href="https://calibre-ebook.com/" target="_blank" rel="noreferrer"&gt;Calibre&lt;/a&gt; &lt;a href="https://calibre-ebook.com/changelog.rss" target="_blank" rel="noreferrer"&gt;release feed&lt;/a&gt;, update my local install of Calibre to the latest hotness, and then get notified via a push notification, using a &lt;a href="https://youtu.be/3isQI0nXQRE" target="_blank" rel="noreferrer"&gt;Rube Goldberg&lt;/a&gt; pastiche of &lt;a href="https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29" target="_blank" rel="noreferrer"&gt;Bash&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/CURL" target="_blank" rel="noreferrer"&gt;cURL&lt;/a&gt; and &lt;a href="https://pushover.net/" target="_blank" rel="noreferrer"&gt;Pushover&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;I love archiving episodes of my favourite podcast (the &lt;a href="https://www.thedeeplife.com/listen/" target="_blank" rel="noreferrer"&gt;Cal Newport podcast&lt;/a&gt;&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;), so Huginn and Python and &lt;a href="https://syncthing.net/" target="_blank" rel="noreferrer"&gt;Syncthing&lt;/a&gt; and cron all pull together to get it in the right place, with the naming convention I want.&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I hope to write a bit more about each of these in the coming days, but needless to say, I’m having more fun playing with Huginn, than I imagined I ever would!&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;it did work like the little engine that could, without a hitch until then&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;I’ve forgotten how I did it!&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;I think it’s called &lt;em&gt;&lt;strong&gt;Deep Questions&lt;/strong&gt;&lt;/em&gt;, but to me it’ll always be the Cal Newport Podcast&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;If you lose all your audio files in a fire Cal, you know who to call!&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Why I Use an Online VM</title><link>https://janusworx.com/work/why-i-use-an-online-vm/</link><pubDate>Wed, 01 Mar 2023 05:00:00 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/why-i-use-an-online-vm/</guid><description>&lt;p&gt;I am fortunate enough, to run most of my life between my local computer and another VM in a cloud. In this day and age of cloud native and serverless, why would anyone choose to run their life off a virtual server aka VM?&lt;br&gt;
This post is me, thinking this through. I’ll return to this every now and then, and see if things have changed enough out there, for me to evaluate and make a change.&lt;br&gt;
For now, I am happy using my dinky little box in the cloud.&lt;/p&gt;

&lt;h3 class="relative group"&gt;Reasons I use a VM.
 &lt;div id="reasons-i-use-a-vm" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#reasons-i-use-a-vm" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Because I cannot have a cloud connected desktop.&lt;br&gt;
If I could I would. But commercial forces, at least in India don’t bode well for an always on, always connected desktop. The VM is a good compromise&lt;/li&gt;
&lt;li&gt;Because I can. Being an old sysadmin lets me do this. But don’t let that scare you off. If you can afford one, I’d venture to say you should. If you put in the time to learn &lt;a href="https://lym.readthedocs.io/en/latest/" target="_blank" rel="noreferrer"&gt;Linux fundamentals&lt;/a&gt;, most hosting providers now have excellent guides that will let you have a box that is pretty secure.&lt;/li&gt;
&lt;li&gt;The amount of control it affords me. Most cloud services will handicap you, some way or the other. When you’re using a VM on the other hand, you have the power of the whole machine&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt; in the palm of your hand. You can do what you want with it. Install programming languages to your hearts content, access all the storage that you have, run containers if you wish. Your VM is your oyster :)&lt;/li&gt;
&lt;li&gt;I can host what I want to. Without paying per service. Or without letting outsiders slurp my data and attention to serve me ads. Right now I host — &lt;em&gt;(goes and looks)&lt;/em&gt; —
&lt;ol&gt;
&lt;li&gt;This website&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.znc.in/ZNC" target="_blank" rel="noreferrer"&gt;ZNC&lt;/a&gt;, an IRC bouncer, so I can stay connected always to my favourite IRC channels along with&lt;/li&gt;
&lt;li&gt;&lt;a href="https://thelounge.chat/" target="_blank" rel="noreferrer"&gt;The Lounge&lt;/a&gt;, so I can then access IRC from anywhere&lt;/li&gt;
&lt;li&gt;an instance of &lt;a href="https://miniflux.app/" target="_blank" rel="noreferrer"&gt;Miniflux&lt;/a&gt;, to read my RSS feeds, to keep my self update with all my interests&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sendy.co/" target="_blank" rel="noreferrer"&gt;Sendy&lt;/a&gt;, to send emails to my mailing list.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sabre.io/baikal/" target="_blank" rel="noreferrer"&gt;Baikal&lt;/a&gt;, for my contacts and calendars and finally…&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/huginn/huginn" target="_blank" rel="noreferrer"&gt;Huginn&lt;/a&gt;, to let me do all sorts of wizardry with stuff on the net. Think of it as a self hosted &lt;a href="https://zapier.com/" target="_blank" rel="noreferrer"&gt;Zapier&lt;/a&gt; / &lt;a href="https://ifttt.com/" target="_blank" rel="noreferrer"&gt;IFTTT&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;My data is not held hostage!&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class="relative group"&gt;Reasons I wouldn’t use a VM
 &lt;div id="reasons-i-wouldnt-use-a-vm" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#reasons-i-wouldnt-use-a-vm" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;If I am sharing something with the world at large.&lt;br&gt;
Something that might have the potential of being abused, even if I made or shared out of the goodness of my heart. No concrete example of this, comes to mind right now.&lt;/li&gt;
&lt;li&gt;Serving or hosting something that my VM cannot handle. I wouldn’t serve video from my little box, for e.g.&lt;/li&gt;
&lt;li&gt;Storing data. As in long lived collections. I doubt I’d store, my audio or photo library on here. Too large. It’d probably run too expensive and too risky.&lt;/li&gt;
&lt;li&gt;Tradeoff between control and life. I outsource email and my fediverse, because for me, maintaining them, was too much of a time suck. (No matter how much I loved doing it)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class="relative group"&gt;Conclusion: Control
 &lt;div id="conclusion-control" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#conclusion-control" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;The more I think about it, the more I think it’s about control more than cost.&lt;br&gt;
I want as much of my data and digital life, out of the control of the software giants and/or other third parties to extent, I can control.&lt;br&gt;
As much as possible, I want to express myself without constraint. Most SAAS options in this day and age, don’t come close to the power and options that old desktop software gave us.&lt;br&gt;
Having a VM lets me be creative, expressive and grab some semblance of control back for myself.&lt;/p&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;well, as much as you’re paying for 😂&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>What I Learned Today (14th of February, 2023)</title><link>https://janusworx.com/work/what-i-learned-today-2023-02-14/</link><pubDate>Tue, 14 Feb 2023 20:17:24 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/what-i-learned-today-2023-02-14/</guid><description>&lt;p&gt;Happy Valentine’s all you lovely people! :)&lt;/p&gt;
&lt;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;'/&gt;


&lt;h3 class="relative group"&gt;Hugo
 &lt;div id="hugo" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hugo" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Upgraded to the latest &lt;a href="https://github.com/adityatelange/hugo-PaperMod/releases/tag/v7.0" target="_blank" rel="noreferrer"&gt;Papermod&lt;/a&gt; theme on the website&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Devops
 &lt;div id="devops" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#devops" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Installed Fedora in a VM on my machine in order to do Devopsy work&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Python
 &lt;div id="python" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#python" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learnt about the &lt;code&gt;object()&lt;/code&gt; function.
If I want an native &lt;em&gt;something&lt;/em&gt; to use later, I can always cast to an basic object (&lt;code&gt;x = object()&lt;/code&gt;) and use it. Best to use it, when using &lt;code&gt;None&lt;/code&gt; would cause ambiguities. &lt;a href="https://treyhunner.com/2019/03/unique-and-sentinel-values-in-python/" target="_blank" rel="noreferrer"&gt;Read more here&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Urdu
 &lt;div id="urdu" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#urdu" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Did the “fe” group today.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Physical Fitness
 &lt;div id="physical-fitness" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#physical-fitness" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Had a good workout. Worked my core.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>What I Learned Today (11th of February, 2023)</title><link>https://janusworx.com/work/what-i-learned-today-2023-02-11/</link><pubDate>Sat, 11 Feb 2023 14:42:56 +0530</pubDate><author>feedback@janusworx.com (Mario Jason Braganza)</author><guid>https://janusworx.com/work/what-i-learned-today-2023-02-11/</guid><description>&lt;p&gt;Rest day! Not doing much!
&lt;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;'/&gt;
&lt;/p&gt;

&lt;h3 class="relative group"&gt;Emacs
 &lt;div id="emacs" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#emacs" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It works! &lt;a href="https://janusworx.com/blog/what-i-learned-today-2023-02-10#emacs" &gt;Yesterday’s little hack&lt;/a&gt;, to clock in and out when I change state works well! It doesn’t seem to have broken anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also I added a &lt;code&gt;WORKING&lt;/code&gt; state, and tagged my function to that. The clock in and out happen when I switch in an out of the &lt;code&gt;WORKING&lt;/code&gt; state. Because I want my parent task to show &lt;code&gt;IN_PROGRESS&lt;/code&gt; and the current subtask to be what I am working on. Like so …&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-org" data-lang="org"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;**&lt;/span&gt; IN_PROGRESS Emacs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;***&lt;/span&gt; WORKING Learn about Org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;***&lt;/span&gt;&lt;span class="err"&gt; TODO&lt;/span&gt; Write about what you learnt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;br&gt;

&lt;ul&gt;
&lt;li&gt;Here’s an image of an actual task …&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
 &lt;img class="my-0 rounded-md" src="https://janusworx.com/images/2023/org-tasks.png" alt="" /&gt;
 
 
 &lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;Except for one more thing.&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
When I switch another task to &lt;code&gt;WORKING&lt;/code&gt;, it &lt;em&gt;does&lt;/em&gt; clock me out of the old task, but it leaves the TODO state at &lt;code&gt;WORKING&lt;/code&gt;. I want the old task to switch to &lt;code&gt;WAITING&lt;/code&gt;. I’ll look at doing this as soon as I get some breathing time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Devops
 &lt;div id="devops" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#devops" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Spoke to a friend about some how and what and why for close to an hour&lt;br&gt;
Helped me clear my mind lots!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Urdu
 &lt;div id="urdu" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#urdu" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Did “toey” and “zoey”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Did I mention three letters for the same S sound &lt;a href="https://janusworx.com/blog/what-i-learned-today-2023-02-10#urdu" &gt;yesterday&lt;/a&gt;?&lt;br&gt;
Ha! Z has &lt;em&gt;&lt;strong&gt;four!&lt;/strong&gt;&lt;/em&gt; Zaal, Ze, Zuaad &amp;amp; Zoey&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also tutor’s note:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;the word “zan” (ज़न) when written with ‘zoey’ means “presumption” whereas, the same word, when written with a ‘ze’ instead, means “woman”.&lt;/p&gt;
&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;Which means? Lots of practice and reading ahead :)&lt;br&gt;
Also coming from &lt;a href="https://youtube.com/shorts/BgqDRTQ7lJs" target="_blank" rel="noreferrer"&gt;the madness that is English&lt;/a&gt;, I keep telling myself, this is not so bad 😂&lt;br&gt;
Like Lizzo doing &lt;a href="https://youtu.be/hRJzez4UDm8" target="_blank" rel="noreferrer"&gt;crack&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 class="relative group"&gt;Physical Fitness
 &lt;div id="physical-fitness" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#physical-fitness" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;Rest day!&lt;/p&gt;

&lt;h3 class="relative group"&gt;Thoughts
 &lt;div id="thoughts" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#thoughts" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The meta need / theme of learning and working, as I am doing now, is that I need to work to a time budget
&lt;ul&gt;
&lt;li&gt;Here’s the problem, try and solve it in an hour (or whatever time I budget)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I need to have no shame if I cannot get it done&lt;/li&gt;
&lt;li&gt;I need to ask for help / look up solutions faster&lt;/li&gt;
&lt;li&gt;I also need to budget the time to understand the solutions.
&lt;ul&gt;
&lt;li&gt;If I cannot fix it one day and the solution is taking time to “get”, be ok with spending time the next day&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;It’s just me. There is no one else. There is no need to pressure myself more than necessary.&lt;/li&gt;
&lt;li&gt;Work to the spec. Generalising (at least for now) is taboo. Now, I understand what my friends tell me about me perfectionism. I keep spending way too long about what if this? and what if that? I need to get something working first. Refine / expand / refactor it later&lt;/li&gt;
&lt;li&gt;Get better at logging times&lt;/li&gt;
&lt;li&gt;Get better at taking breaks between tasks&lt;/li&gt;
&lt;li&gt;Writing these logs has helped gain insight and understanding. I need to keep at it. It’ll help with the “what now? what next?” questions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;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;'/&gt;

Feedback on this post? Mail me at &lt;a href="mailto:&amp;amp;#102;&amp;amp;%23101;&amp;amp;%23101;&amp;amp;%23100;&amp;amp;%2398;&amp;amp;%2397;&amp;amp;%2399;&amp;amp;%23107;&amp;amp;%2364;&amp;amp;%23106;&amp;amp;%2397;&amp;amp;%23110;&amp;amp;%23117;&amp;amp;%23115;&amp;amp;%23119;&amp;amp;%23111;&amp;amp;%23114;&amp;amp;%23120;&amp;amp;%2346;&amp;amp;%2399;&amp;amp;%23111;&amp;amp;%23109;" &gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href="https://janusworx.com/subscribe/" target="_blank" rel="noreferrer"&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share" target="_blank" rel="noreferrer"&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;Getting greedy, aren’t I? :)&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item></channel></rss>