<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Python on Janusworx</title>
    <link>https://janusworx.com/tags/python/</link>
    <description>Recent content in Python on Janusworx</description>
    <image>
      <title>Janusworx</title>
      <url>https://janusworx.com/images/jw-logo.png</url>
      <link>https://janusworx.com/images/jw-logo.png</link>
    </image>
    <generator>Hugo -- 0.162.1</generator>
    <language>en</language>
    <lastBuildDate>Mon, 03 Feb 2025 09:33:37 +0530</lastBuildDate>
    <atom:link href="https://janusworx.com/tags/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hack Hugo Post Metadata With Python</title>
      <link>https://janusworx.com/work/hack-hugo-post-metadata-with-python/</link>
      <pubDate>Mon, 03 Feb 2025 09:33:37 +0530</pubDate>
      <guid>https://janusworx.com/work/hack-hugo-post-metadata-with-python/</guid>
      <description>Adding alias urls to my blog posts</description>
      <content:encoded><![CDATA[<p><a href="/work/some-site-housekeeping-new-sections-and-rss-feeds/">A while back</a>, I rejigged the sections on my site to better reflect how I think and write.<br>
Which meant, all the urls, on all my posts changed, since they now used the new category as a slug, instead of ye old <code>/blog</code>.</p>
<p>For e.g. <a href="https://janusworx.com/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo/">https://janusworx.com/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo/</a> …<br>
was now at,  <a href="https://janusworx.com/work/using-hugo-variables-to-help-with-mailto-links-in-hugo/">https://janusworx.com/work/using-hugo-variables-to-help-with-mailto-links-in-hugo/</a></p>
<p>After searching a bit, I found that Hugo supported <a href="https://gohugo.io/content-management/urls/#aliases">aliases</a>. For me, it would redirect the original <code>/blog</code> path url to its new location<br>
Ass I had to do, was add an <code>aliases: [&quot;/blog/old-post-slug&quot;]</code> line to each post’s metadata.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
Line 4 in the snippet below shows, what I added to fix the post above.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">8
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>---
</span></span><span style="display:flex;"><span><span style="color:#f92672">title</span>: <span style="color:#e6db74">&#34;Using Hugo Variables to Help With Mailto Links in Hugo&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">date</span>: <span style="color:#e6db74">2024-05-30T18:17:35</span><span style="color:#ae81ff">+05</span>:<span style="color:#ae81ff">30</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">aliases</span>: [<span style="color:#e6db74">&#34;/blog/using-hugo-variables-to-help-with-mailto-links-in-hugo&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#f92672">categories</span>: [<span style="color:#e6db74">&#34;work&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#f92672">tags</span>: [<span style="color:#ae81ff">100WordHabit, Dgplug, Hugo]</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">summary</span>: <span style="color:#ae81ff">Shortcodes! Hugo Variables in Shortcodes!</span>
</span></span><span style="display:flex;"><span>---
</span></span></code></pre></td></tr></table>
</div>
</div><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

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

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

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

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>it’s a list, so I can add more aliases if I want to&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>no sense in botching up my originals :)&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>anki-push-u, Creating a Tiny Pushover Addon for Anki</title>
      <link>https://janusworx.com/anki-push-u/</link>
      <pubDate>Sat, 21 Sep 2024 11:31:39 +0530</pubDate>
      <guid>https://janusworx.com/anki-push-u/</guid>
      <description>Notifications! Notifications! Notifications! Notifications!</description>
      <content:encoded><![CDATA[<br>

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

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

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

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

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

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I’m looking at you, ailleurs&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Hugo updates on three machines, calibre updates on two machines, podcast downloads and quite a bit else&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>It pushes you to do your due cards! Tada!&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>derb; Script to Create podcast RSS feeds</title>
      <link>https://janusworx.com/work/derb/</link>
      <pubDate>Thu, 14 Sep 2023 17:38:03 +0530</pubDate>
      <guid>https://janusworx.com/work/derb/</guid>
      <description>&lt;p&gt;I wrote a tiny script that creates an RSS feed for all the audio files it finds in a folder.&lt;br&gt;
I call it &lt;a href=&#34;https://github.com/jasonbraganza/derb&#34;&gt;derb&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My mother gets devotional songs and sermons on cds, which I rip to MP3 files and then dump on her phone for her.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
She listens to them all the time, and now three of her friends want to do the same too.&lt;br&gt;
I thought of just sticking them in my self hosted &lt;a href=&#34;https://jellyfin.org/&#34;&gt;Jellyfin&lt;/a&gt; instance,&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; but then I realised, all of them have erratic, slow internet. So the idea of self hosting a podcast feed really appealed to me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I wrote a tiny script that creates an RSS feed for all the audio files it finds in a folder.<br>
I call it <a href="https://github.com/jasonbraganza/derb">derb</a>.</p>
<p>My mother gets devotional songs and sermons on cds, which I rip to MP3 files and then dump on her phone for her.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
She listens to them all the time, and now three of her friends want to do the same too.<br>
I thought of just sticking them in my self hosted <a href="https://jellyfin.org/">Jellyfin</a> instance,<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> but then I realised, all of them have erratic, slow internet. So the idea of self hosting a podcast feed really appealed to me.</p>
<p>So I quickly used <a href="https://github.com/lkiesow/python-feedgen">Feedgenerator</a> in conjunction with <a href="https://github.com/devsnd/tinytag">Tinytag</a>, to whip up a script that’d help me do just that.
<a href="https://github.com/jasonbraganza/derb">The code’s up on Github</a>, if you want to go install and play with it yourselves.</p>
<p>Here’s a quick walk through <code>derb.py</code>.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<h3 id="setting-up-house">Setting up house</h3>
<p>We set up a place to accept a path containing the files. The feed will ultimately be placed as a <code>feed.xml</code> in  the same folder as well
We then walk through the folder (after a really basic sanity check) and gather all the files into a list.<br>
The <code>base_url</code> is where the feeds (along with the audio) will be served from.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span>base_url <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://ab.janusworx.com&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>book_folder <span style="color:#f92672">=</span> input(<span style="color:#e6db74">&#34;Paste path to audiobook folder here: &#34;</span>)
</span></span><span style="display:flex;"><span>book_out_path <span style="color:#f92672">=</span> base_url <span style="color:#f92672">+</span> (book_folder<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#34;/&#34;</span>)[<span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>])
</span></span><span style="display:flex;"><span>file_list <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>walk(book_folder)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Do a basic check on the validity of the path we get, </span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># before we build the audio file list.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>    all_files <span style="color:#f92672">=</span> (list(file_list)[<span style="color:#ae81ff">0</span>][<span style="color:#ae81ff">2</span>])
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">except</span> <span style="color:#a6e22e">IndexError</span> <span style="color:#66d9ef">as</span> e:
</span></span><span style="display:flex;"><span>    print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;ERROR!: </span><span style="color:#e6db74">{</span>e<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Have you typed in the right path?</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>)
</span></span><span style="display:flex;"><span>    sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;Quitting script!&#34;</span>)
</span></span><span style="display:flex;"><span>audio_files <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> each_file <span style="color:#f92672">in</span> all_files:
</span></span><span style="display:flex;"><span>    each_file <span style="color:#f92672">=</span> Path(each_file)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> each_file<span style="color:#f92672">.</span>suffix <span style="color:#f92672">in</span> [<span style="color:#e6db74">&#39;.mp3&#39;</span>, <span style="color:#e6db74">&#39;.m4a&#39;</span>, <span style="color:#e6db74">&#39;.m4b&#39;</span>]:
</span></span><span style="display:flex;"><span>        audio_files<span style="color:#f92672">.</span>append(str(each_file))
</span></span><span style="display:flex;"><span>audio_files <span style="color:#f92672">=</span> sorted(audio_files)
</span></span></code></pre></td></tr></table>
</div>
</div><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="creating-a-feed">Creating a feed</h3>
<p>We now go about the business of setting up the feed proper.<br>
To begin with, we grab the first file we can get our grubby paws on, and create a TinyTag object that’ll give us a lot of metadata. (If there isn’t any, we quit.)<br>
Oh, and by the way, how do I know what data I’d need to create a feed? I just cribbed everything from the <a href="https://github.com/lkiesow/python-feedgen">Feedgenerator’s excellent documentation</a>. I also looked at the widely linked to, <a href="https://cyber.harvard.edu/rss/rss.html">RSS</a> reference page for clarification if I got confused.</p>
<p>We then, instantiate create a feedgenerator object along with the podcast extension.<br>
Following which, we supply the feed a title, an id<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, feed author details, a language, podcast category and description.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">19
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">20
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">21
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">22
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">23
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># Setup a feed</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Grab feed metadata from the first audio file</span>
</span></span><span style="display:flex;"><span>feed_metadata_file <span style="color:#f92672">=</span> TinyTag<span style="color:#f92672">.</span>get(Path(book_folder, audio_files[<span style="color:#ae81ff">0</span>]))
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Grab title from metadata file.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## At the same time, break out if there isn’t any.</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> feed_metadata_file<span style="color:#f92672">.</span>album:
</span></span><span style="display:flex;"><span>    sys<span style="color:#f92672">.</span>exit(<span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">---</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">Stopping feed creation.</span><span style="color:#ae81ff">\n</span>
</span></span><span style="display:flex;"><span>		Setup audio file metadata <span style="color:#66d9ef">with</span> a tag editor<span style="color:#e6db74">&#34;)</span>
</span></span><span style="display:flex;"><span>feed_title <span style="color:#f92672">=</span> feed_metadata_file<span style="color:#f92672">.</span>album
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Creating feed instance</span>
</span></span><span style="display:flex;"><span>audio_book_feed <span style="color:#f92672">=</span> FeedGenerator()
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>load_extension(<span style="color:#e6db74">&#34;podcast&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Setting up more stuff on the feed proper</span>
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>id(base_url)
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>title(feed_title)
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>author({<span style="color:#e6db74">&#34;name&#34;</span>: <span style="color:#e6db74">&#34;Jason Braganza&#34;</span>, <span style="color:#e6db74">&#34;email&#34;</span>: <span style="color:#e6db74">&#34;feedback@janusworx.com&#34;</span>})
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>link(href<span style="color:#f92672">=</span><span style="color:#e6db74">f</span><span style="color:#e6db74">&#39;</span><span style="color:#e6db74">{</span>book_out_path<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;</span>, rel<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;self&#39;</span>)
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>language(<span style="color:#e6db74">&#39;en&#39;</span>)
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>podcast<span style="color:#f92672">.</span>itunes_category(<span style="color:#e6db74">&#39;Private&#39;</span>)
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>description(feed_title)
</span></span></code></pre></td></tr></table>
</div>
</div><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="adding-episodes-and-writing-out-the-file">Adding episodes and writing out the file</h3>
<p>After which it’s then a matter of looping through that audio file list we created and adding them as entries to the feed object we created.<br>
Once again we grab the metadata from each file, using <a href="https://github.com/devsnd/tinytag">Tinytag</a>, and then set each feed entry’s details (title, id and enclosure).<br>
I’ve hardcoded the mime types, since I know I only have two basic type of audio files. If you don’t know what kind of audio, you might be serving, the <a href="https://pypi.org/project/mimetypes-magic/"><code>mimetypes-magic</code></a> package should help.<br>
Finally we write it all out to a file.</p>
<div class="highlight"><div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;">
<table style="border-spacing:0;padding:0;margin:0;border:0;"><tr><td style="vertical-align:top;padding:0;margin:0;border:0;">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 1
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 2
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 3
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 4
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 5
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 6
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 7
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 8
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"> 9
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">10
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">11
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">12
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">13
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">14
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">15
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">16
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">17
</span><span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f">18
</span></code></pre></td>
<td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%">
<pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e"># Loop the file list and create entries in the feed</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">for</span> each_file <span style="color:#f92672">in</span> audio_files:
</span></span><span style="display:flex;"><span>    each_file_metadata <span style="color:#f92672">=</span> TinyTag<span style="color:#f92672">.</span>get(Path(book_folder, each_file))
</span></span><span style="display:flex;"><span>    episode_file_path <span style="color:#f92672">=</span> Path(each_file)
</span></span><span style="display:flex;"><span>    episode_suffix <span style="color:#f92672">=</span> episode_file_path<span style="color:#f92672">.</span>suffix
</span></span><span style="display:flex;"><span>    episode_mime_type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#39;audio/mpeg&#39;</span> <span style="color:#66d9ef">if</span> episode_suffix <span style="color:#f92672">==</span> <span style="color:#e6db74">&#39;.mp3&#39;</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#39;audio/x-m4a&#39;</span>
</span></span><span style="display:flex;"><span>    episode_title <span style="color:#f92672">=</span> each_file_metadata<span style="color:#f92672">.</span>title
</span></span><span style="display:flex;"><span>    episode_size <span style="color:#f92672">=</span> str(each_file_metadata<span style="color:#f92672">.</span>filesize)
</span></span><span style="display:flex;"><span>    episode_link <span style="color:#f92672">=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>book_out_path<span style="color:#e6db74">}</span><span style="color:#e6db74">/</span><span style="color:#e6db74">{</span>each_file<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    
</span></span><span style="display:flex;"><span>	audio_episode <span style="color:#f92672">=</span> audio_book_feed<span style="color:#f92672">.</span>add_entry()
</span></span><span style="display:flex;"><span>    audio_episode<span style="color:#f92672">.</span>title(episode_title)
</span></span><span style="display:flex;"><span>    audio_episode<span style="color:#f92672">.</span>id(episode_link)
</span></span><span style="display:flex;"><span>    audio_episode<span style="color:#f92672">.</span>enclosure(episode_link, episode_size, episode_mime_type)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Write the rss feed to the same folder as the source audio files</span>
</span></span><span style="display:flex;"><span>audio_book_feed<span style="color:#f92672">.</span>rss_file(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>book_folder<span style="color:#e6db74">}</span><span style="color:#e6db74">/feed.xml&#34;</span>)
</span></span></code></pre></td></tr></table>
</div>
</div><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="serving">Serving</h3>
<p>Once done, I moved it all to my trusty Pi, which runs barebones Nginx with a single bare page, protected by basic auth.<br>
<figure class="align-center ">
    <img loading="lazy" src="/images/2023/private-web-page.png#center"/> 
</figure>

I decided not to publish the feeds publicly.<br>
Rather I’m going to just set it up in their podcast players, when I meet them, or pass it over to their kids over Signal.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup><br>
It’s already worked with three of them, so everyone’s happy and here’s me hoping, fingers crossed,  it’ll be easy to support in the long run.</p>
<p><em><strong>Update (2023-09-15):</strong></em> <em><a href="https://www.humblebundle.com/books/sci-fi-classic-audiobooks-feat-hell-divers-books">Guess I’m using it for myself too, now</a> 😂</em></p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Yes, while it’s slowly moving to Youtube, that world still mostly depends on CDs and USB sticks.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>the audio files, not my mother’s friends.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Large parts are elided. Please look at Github for the actual file.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>normally, the site it’ll be served from&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Why should I be the only one doing family tech support?&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>TIL: The Difference Between a CLI Tool and a Freeze Tool</title>
      <link>https://janusworx.com/work/til-the-difference-between-a-cli-tool-and-a-freeze-tool/</link>
      <pubDate>Wed, 01 Mar 2023 11:35:47 +0530</pubDate>
      <guid>https://janusworx.com/work/til-the-difference-between-a-cli-tool-and-a-freeze-tool/</guid>
      <description>&lt;p&gt;I keep writing these tiny utilities for myself in Python and while I &lt;em&gt;love&lt;/em&gt; writing in Python, I definitely don’t enjoy the little war dance I have to do everytime I want to run it on a new machine. Keeping track of virtual environments, and then installing packages in them, quickly gets tiresome. I want to just run the program once I’m done with it. Like a C program. Or Rust. Or Go.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I keep writing these tiny utilities for myself in Python and while I <em>love</em> writing in Python, I definitely don’t enjoy the little war dance I have to do everytime I want to run it on a new machine. Keeping track of virtual environments, and then installing packages in them, quickly gets tiresome. I want to just run the program once I’m done with it. Like a C program. Or Rust. Or Go.</p>
<p>I could go learn one of those languages. Sure. That’s an option.<br>
And I see no problem doing it for other needs (like if I’m working with a group that uses said language) or for my career’s sake or just for being a polyglot.</p>
<p>But when I write for myself, I’d rather stick to Python.<br>
Its mental model fits my brain. I find writing Python joyful.</p>
<p>So what’s a boy to do?<br>
Since I was writing CLI applications, I went and looked for how to write Python CLIs and I found <code>argparse</code> and <a href="https://typer.tiangolo.com/">Typer</a> and <a href="https://click.palletsprojects.com/en/8.1.x/">Click</a> and I was confused. They didn’t seem to give me my executable. They had all sorts of other powerful features, but the one I wanted.<br>
And I went looking some more. And the penny dropped.</p>
<p>What I wanted, wasn’t a way to build a CLI, (although that is what I was writing).<br>
What I wanted, was a way to bundle my environment into an executable.<br>
What I wanted, I learned, was a way to <em><a href="https://docs.python-guide.org/shipping/freezing/">freeze my code</a></em>.</p>
<p>More searching led to <a href="https://nuitka.net/pages/overview.html">Nuitka</a>, <a href="https://github.com/indygreg/PyOxidizer">PyOxidizer</a>, <a href="https://pyinstaller.org/en/stable/">PyInstaller</a> and their ilk.<br>
I went with Nuitka, because that is what I found first and what I found was <em>dead simple</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>python -m nuitka --static-libpython<span style="color:#f92672">=</span>no mastodon-to-moi.py
</span></span></code></pre></div><p>and <em>boom!</em><br>
I got myself an executable <code>mastodon-to-moi.bin</code>!<br>
And then I got greedy and did a <code>mastodon-to-moi.bin --help</code> and figured, <em>that’s</em> where the cli/tui frameworks like Typer and Textualize, come in handy. To scaffold and help these interfaces.</p>
<p>But when  I ran it on my laptop, which has nothing other than system Python, it hiccoughed. I tried Pyinstaller next, and that too, did not do the trick. It choked on a loop, that worked when I ran it as with Python normally. PyOxidizer scared me off.</p>
<p>This needs looking further looking into, but atleast I know what I need to do now</p>
<p><em><strong>Afterthought:</strong></em> The one con I do see, is losing platform independence. My binaries will be Linux on Intel only.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I could just take my Python source anywhere, set up my environment and <em>go</em>. Well, I still have that option if I need it and in the meanwhile, having binaries affords me a lot of convenience.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>until I learn to cross compile that is.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (8th of February, 2023)</title>
      <link>https://janusworx.com/personal/what-i-learned-today-2023-02-08/</link>
      <pubDate>Wed, 08 Feb 2023 20:20:06 +0530</pubDate>
      <guid>https://janusworx.com/personal/what-i-learned-today-2023-02-08/</guid>
      <description>&lt;p&gt;Don’t know if it’s the gym or the regular work beat, but I seem to be waking up later and later everyday. I don’t know what to do about this. I feel a little anxious about not having enough hours in the day.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Why use comprehensions? Because it reads better.&lt;br&gt;
Like I advice the young ones in DPGLUG on writing.&lt;br&gt;
Write short, choppy sentences.&lt;br&gt;
They read better.&lt;/li&gt;
&lt;li&gt;With my problem sets …
&lt;ul&gt;
&lt;li&gt;I should stop trying to generalise in advance and solve the specific problem first.&lt;/li&gt;
&lt;li&gt;Read stuff carefully. Don’t do more than is necessary&lt;/li&gt;
&lt;li&gt;Solutions take time to understand too. Budget the time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;linux-mint&#34;&gt;Linux Mint&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Nemo, the file browser in Linux Mint always opens the home directory, when I click on it and there’s no apparent way to change it to a preferred directory. I want it to always open &lt;code&gt;Downloads&lt;/code&gt;
&lt;strike&gt;&lt;/li&gt;
&lt;li&gt;A little bit of web spelunking led to an acceptable work-around.
&lt;ol&gt;
&lt;li&gt;Right click the main &lt;code&gt;menu&lt;/code&gt; button&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Menu =&amp;gt; Open the menu editor =&amp;gt; Accessories&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Then click &lt;code&gt;Files&lt;/code&gt; in the items from the right and click &lt;code&gt;Properties&lt;/code&gt; further right&lt;/li&gt;
&lt;li&gt;Change the command form &lt;code&gt;nemo %U&lt;/code&gt; to &lt;code&gt;nemo Downloads&lt;/code&gt;&lt;br&gt;
And that does it!
&lt;/strike&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;update&#34;&gt;Update&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;2023-02-09: Does not work. Will look for some other approach. Right now, with the workaround it opens a &lt;code&gt;Downloads&lt;/code&gt; window alongside any other folder I click on 😂&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;hugo&#34;&gt;Hugo&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Added a plain, hamburger menu to this blog, using Aditya’s helpful instructions &lt;a href=&#34;https://discord.com/channels/971046860317921340/1047919068075802714&#34;&gt;over on the PaperMod Discord&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;With all the extra nav items, I’ve added to the header the menu would overflow on my iPhone (and probably on other folks’ phones too). So if this page scooches narrow enough, it will change the links on top to a plain menu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;

&lt;figure class=&#34;align-center &#34;&gt;
    &lt;img loading=&#34;lazy&#34; src=&#34;https://janusworx.com/images/2023/blog-menu.png#center&#34;/&gt; 
&lt;/figure&gt;

&lt;br&gt;
&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Don’t know if it’s the gym or the regular work beat, but I seem to be waking up later and later everyday. I don’t know what to do about this. I feel a little anxious about not having enough hours in the day.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python">Python</h3>
<ul>
<li>Why use comprehensions? Because it reads better.<br>
Like I advice the young ones in DPGLUG on writing.<br>
Write short, choppy sentences.<br>
They read better.</li>
<li>With my problem sets …
<ul>
<li>I should stop trying to generalise in advance and solve the specific problem first.</li>
<li>Read stuff carefully. Don’t do more than is necessary</li>
<li>Solutions take time to understand too. Budget the time</li>
</ul>
</li>
</ul>
<h3 id="linux-mint">Linux Mint</h3>
<ul>
<li>Nemo, the file browser in Linux Mint always opens the home directory, when I click on it and there’s no apparent way to change it to a preferred directory. I want it to always open <code>Downloads</code>
<strike></li>
<li>A little bit of web spelunking led to an acceptable work-around.
<ol>
<li>Right click the main <code>menu</code> button</li>
<li>Click <code>Menu =&gt; Open the menu editor =&gt; Accessories</code></li>
<li>Then click <code>Files</code> in the items from the right and click <code>Properties</code> further right</li>
<li>Change the command form <code>nemo %U</code> to <code>nemo Downloads</code><br>
And that does it!
</strike></li>
</ol>
</li>
</ul>
<h4 id="update">Update</h4>
<ul>
<li>2023-02-09: Does not work. Will look for some other approach. Right now, with the workaround it opens a <code>Downloads</code> window alongside any other folder I click on 😂</li>
</ul>
<h3 id="hugo">Hugo</h3>
<ul>
<li>Added a plain, hamburger menu to this blog, using Aditya’s helpful instructions <a href="https://discord.com/channels/971046860317921340/1047919068075802714">over on the PaperMod Discord</a>.</li>
<li>With all the extra nav items, I’ve added to the header the menu would overflow on my iPhone (and probably on other folks’ phones too). So if this page scooches narrow enough, it will change the links on top to a plain menu.</li>
</ul>
<p><br>

<figure class="align-center ">
    <img loading="lazy" src="/images/2023/blog-menu.png#center"/> 
</figure>

<br>
</p>
<h3 id="huginn--rss">Huginn / RSS</h3>
<ul>
<li>I often have sites that have no RSS feeds, but they’re still interesting enough to me that I want to keep tabs on them for anything new.</li>
<li>While I wrote a tiny program to scrape and generate a <a href="https://janusworx.com/blog/updated-poemfeed/">custom RSS feed</a> to get my <a href="https://www.poetryfoundation.org/poems/poem-of-the-day">Poetry</a> fix, I needed something more robust, if I wanted to do this with lots of sites.</li>
<li>I realised that my Huggin instance <a href="https://blog.andrewcantino.com/blog/2014/04/13/adding-rss-feeds-to-any-site-with-huginn/">could do that for me</a>. Huginn is documented pretty well, that even a slowpoke like me, could figure out a fix for himself, inside an hour</li>
<li>I also learnt something fun. How do I choose a specific, nested, div on the page when all of them are similarly named? By using the power of <a href="https://www.w3schools.com/xml/xpath_intro.asp">XPath</a>! I found it to be a more robust way of picking something from a web page, compared to its alternatives.</li>
<li>It’s also pretty easy to at least get a basic XPath selection. Just inspect your element in your browser’s web inspector and a right/context click should normally give you the option to copy a link as an XPath.
Getting to an <code>href</code> link in the <code>div</code> I wanted, led to something like <code>/html/body/div[1]/div[1]/div/div/div/main/div/div[1]/div/header/h2/a/@href</code> and <em><strong>BAM!</strong></em> I got the link!</li>
<li>This solves a really big problem for me. So once again, I’m pretty chuffed today as well :)</li>
</ul>
<h3 id="urdu">Urdu</h3>
<ul>
<li>Got done with the “siin” group of letters today.</li>
<li>It is getting more and more confusing to read, but I’m sure I’ll slowly get over it with practice.</li>
</ul>
<h3 id="physical-fitness">Physical Fitness</h3>
<ul>
<li>More Cardio today</li>
<li>I’ve gotten comfortable doing an hour of active cardio at around 160, without worrying that my heart would burst. Now to focus on doing the same hour at a slower heart rate, over time.</li>
<li>The pain’s almost gone. Let’s see what the coming days hold.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (7th of February, 2023)</title>
      <link>https://janusworx.com/personal/what-i-learned-today-2023-02-07/</link>
      <pubDate>Tue, 07 Feb 2023 19:02:53 +0530</pubDate>
      <guid>https://janusworx.com/personal/what-i-learned-today-2023-02-07/</guid>
      <description>&lt;p&gt;Yesterday, took a lot out of me.&lt;br&gt;
Took it easy today.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;p&gt;Got today’s assignment done well in time; and then went out looking for better ways to write it over again.&lt;br&gt;
Writing code is getting exciting now. Just like how I learnt to write in my teens.&lt;br&gt;
Write. And then go figure out, how I’d do it better.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday, took a lot out of me.<br>
Took it easy today.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python">Python</h3>
<p>Got today’s assignment done well in time; and then went out looking for better ways to write it over again.<br>
Writing code is getting exciting now. Just like how I learnt to write in my teens.<br>
Write. And then go figure out, how I’d do it better.</p>
<h3 id="busywork">Busywork</h3>
<p>Spent a coupla hours doing some busywork for A Thing; that if it pans out will be a good thing for me.</p>
<h3 id="urdu">Urdu</h3>
<p>Did “chhoTii ye”,  “ba.Dii ye” and  “chhoTii he”.<br>
<a href="https://aamozish.com/Rasm-ul-Khat">Aamozish</a> says, I’m done with the alphabet.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
Pretty chuffed with myself :)</p>
<h3 id="physical-fitness">Physical Fitness</h3>
<p>Did an hour of cardio today.<br>
My body seems to have gotten over the hump of all that pain.<br>
Hoping I’m not speaking too soon, though.<br>
If this keeps up, getting weight training to be a habit will get easier.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>with the exception of a few, infrequently used sounds&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (6th of February, 2023)</title>
      <link>https://janusworx.com/work/what-i-learned-today-2023-02-06/</link>
      <pubDate>Mon, 06 Feb 2023 19:31:33 +0530</pubDate>
      <guid>https://janusworx.com/work/what-i-learned-today-2023-02-06/</guid>
      <description>&lt;p&gt;Everything went to hell in a handbasket today.&lt;br&gt;
Time was short.&lt;br&gt;
I got up late.&lt;br&gt;
I forgot, I had physio.&lt;br&gt;
So most things got slightly abbreviated or dropped.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;p&gt;Did not complete my assignment.&lt;br&gt;
Flunked it again.&lt;br&gt;
But on the plus side, those 45 minutes were some of the hardest thinking and iterating, I have done in weeks. So there’s that.&lt;br&gt;
And on the plusser&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; side, I am proud of having stopped and then looked for help.&lt;br&gt;
That was my biggest learning for the day.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Everything went to hell in a handbasket today.<br>
Time was short.<br>
I got up late.<br>
I forgot, I had physio.<br>
So most things got slightly abbreviated or dropped.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python">Python</h3>
<p>Did not complete my assignment.<br>
Flunked it again.<br>
But on the plus side, those 45 minutes were some of the hardest thinking and iterating, I have done in weeks. So there’s that.<br>
And on the plusser<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> side, I am proud of having stopped and then looked for help.<br>
That was my biggest learning for the day.</p>
<h3 id="hugo">Hugo</h3>
<ul>
<li>I need to write about what I actually did in another post.<br>
But I created a custom Table of Contents for my <a href="https://janusworx.com/reading/">Reading</a> page, by hacking my <a href="https://github.com/adityatelange/hugo-PaperMod">theme’s</a> template and layout. It was fun.<br>
Long story short, the theme has the ability to create a table of contents by reading all the headers elements in the page. I restricted it to just the <code>H1</code> and <code>H2</code> elements.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></li>
</ul>
<h3 id="urdu">Urdu</h3>
<ul>
<li>Did the “vaao” group of letters today</li>
</ul>
<h3 id="physical-fitness">Physical Fitness</h3>
<ul>
<li>Did gym <em>and</em> basic physio for my back.<br>
Wiped out!</li>
</ul>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Yes, that <em><strong>is</strong></em> the technical term for even more&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>It would have gotten too unwieldy otherwise&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (4th of February, 2023)</title>
      <link>https://janusworx.com/personal/what-i-learned-today-2023-02-04/</link>
      <pubDate>Sat, 04 Feb 2023 21:26:59 +0530</pubDate>
      <guid>https://janusworx.com/personal/what-i-learned-today-2023-02-04/</guid>
      <description>&lt;p&gt;A week in! Woohoo!&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Exercised with dictionaries today.&lt;/li&gt;
&lt;li&gt;Today was the first time, I could not solve my assignment, no matter what I tried.&lt;/li&gt;
&lt;li&gt;Lessons learnt:
&lt;ul&gt;
&lt;li&gt;Stick to a schedule and do hard stops, since Python is only a small part of what I want to learn&lt;/li&gt;
&lt;li&gt;Learn to quit sooner. I’m like a dog with a bone, when it comes to problems. This approach may have helped me in the past, but it hinders me a lot, when writing code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;urdu&#34;&gt;Urdu&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Did the ‘re’ group of letters&lt;/li&gt;
&lt;li&gt;Exercised with the ‘re’ and ‘daal’ groups&lt;/li&gt;
&lt;li&gt;I’m learning the alphabet, using the wonderful &lt;a href=&#34;https://aamozish.com/Rasm-ul-Khat&#34;&gt;Aamozish&lt;/a&gt; website, in case you folks have been confused about what I was doing with the language.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;webdev&#34;&gt;Webdev&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Watched &lt;a href=&#34;https://youtu.be/41NOoEz3Tzc&#34;&gt;Webhooks for Beginners&lt;/a&gt;&lt;br&gt;
Sooner or later, I want to customise my dinky little &lt;a href=&#34;https://github.com/huginn/huginn&#34;&gt;Huginn&lt;/a&gt; instance to do a lot more.&lt;br&gt;
This’ll come in handy then.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;physical-fitness&#34;&gt;Physical Fitness&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Today was the first day, gym felt a wee bit normal.&lt;br&gt;
Hope this positive phase continues …&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I seem to have got into a good work rhythm.&lt;/li&gt;
&lt;li&gt;Next step seems to prioritise my work and do more of what is needed, to get me a devops job.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

Feedback on this post? Mail me at &lt;a href=&#34;mailto:feedback@janusworx.com&#34;&gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

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

<h3 id="python">Python</h3>
<ul>
<li>Exercised with dictionaries today.</li>
<li>Today was the first time, I could not solve my assignment, no matter what I tried.</li>
<li>Lessons learnt:
<ul>
<li>Stick to a schedule and do hard stops, since Python is only a small part of what I want to learn</li>
<li>Learn to quit sooner. I’m like a dog with a bone, when it comes to problems. This approach may have helped me in the past, but it hinders me a lot, when writing code.</li>
</ul>
</li>
</ul>
<h3 id="urdu">Urdu</h3>
<ul>
<li>Did the ‘re’ group of letters</li>
<li>Exercised with the ‘re’ and ‘daal’ groups</li>
<li>I’m learning the alphabet, using the wonderful <a href="https://aamozish.com/Rasm-ul-Khat">Aamozish</a> website, in case you folks have been confused about what I was doing with the language.</li>
</ul>
<h3 id="webdev">Webdev</h3>
<ul>
<li>Watched <a href="https://youtu.be/41NOoEz3Tzc">Webhooks for Beginners</a><br>
Sooner or later, I want to customise my dinky little <a href="https://github.com/huginn/huginn">Huginn</a> instance to do a lot more.<br>
This’ll come in handy then.</li>
</ul>
<h3 id="physical-fitness">Physical Fitness</h3>
<ul>
<li>Today was the first day, gym felt a wee bit normal.<br>
Hope this positive phase continues …</li>
</ul>
<h3 id="thoughts">Thoughts</h3>
<ul>
<li>I seem to have got into a good work rhythm.</li>
<li>Next step seems to prioritise my work and do more of what is needed, to get me a devops job.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (3rd of February, 2023)</title>
      <link>https://janusworx.com/work/what-i-learned-today-2023-02-03/</link>
      <pubDate>Fri, 03 Feb 2023 19:25:43 +0530</pubDate>
      <guid>https://janusworx.com/work/what-i-learned-today-2023-02-03/</guid>
      <description>&lt;p&gt;Slightly distracted day, today compared to the rest of the week before.&lt;br&gt;
Well, c’est la vie.
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;
&lt;/p&gt;
&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Read about &lt;a href=&#34;https://www.pythonmorsels.com/built-in-functions-in-python/&#34;&gt;functions&lt;/a&gt;, &lt;a href=&#34;https://treyhunner.com/2019/03/python-deep-comparisons-and-code-readability/#Sorting_by_multiple_attributes_at_once&#34;&gt;key functions&lt;/a&gt;, and &lt;a href=&#34;https://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/&#34;&gt;asterisks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Practiced list comprehensions and dictionary lookups&lt;/li&gt;
&lt;li&gt;Learnt and practised some, about decimals and rounding up&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;devops&#34;&gt;Devops&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Devops-ish? Upgraded the BIOS of my desktop to the current the latest available version. I was on v1.5, when I had last done it in July ’21. Now I am on v1.9 from November last year. Fixes plenty of &lt;a href=&#34;https://www.dell.com/support/home/en-in/drivers/driversdetails?driverid=1gtt7&amp;amp;oscode=ws19l&amp;amp;productcode=poweredge-t40&#34;&gt;vulnerabilities&lt;/a&gt;.&lt;br&gt;
While I got to know of it last eve, I did not upgrade then, because I wanted my mind fresh and attentive while I did this. I have bricked enough PCs and handhelds  in my misspent youth and I cannot risk killing my daily driver to tiredness.&lt;br&gt;
What &lt;em&gt;do&lt;/em&gt; they call it now? UEFI firmware?&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;urdu&#34;&gt;Urdu&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learnt the ‘daal’ group of letters&lt;/li&gt;
&lt;li&gt;Today was also the first day, I realised reading right to left is becoming intuitive.&lt;br&gt;
I read “Daataa”&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; in Urdu and went to check if I was correct  by trying to read the English, and was wondering why they nonsensically called it “aataad”, until my brain switched back to Latin and reading left to right 😂&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;physical-activity&#34;&gt;Physical Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;I hope gym gets easier, because I am getting crankier about the pain by the day.&lt;/li&gt;
&lt;li&gt;The better half says I sustained much more pain with physio and bore it longer and more stoically when I broke my back in 2017. Well, that was my body doing it to me and I had no control over it. Right now, &lt;em&gt;I am doing this to myself&lt;/em&gt;, ergo the crankiness. I know this is good for me in the long run. Does not stop me from hating the process and its repercussions right now. I’m getting old and grumpy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

Feedback on this post? Mail me at &lt;a href=&#34;mailto:feedback@janusworx.com&#34;&gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href=&#34;https://janusworx.com/subscribe/&#34;&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href=&#34;https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share&#34;&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Slightly distracted day, today compared to the rest of the week before.<br>
Well, c’est la vie.
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>
</p>
<h3 id="python">Python</h3>
<ul>
<li>Read about <a href="https://www.pythonmorsels.com/built-in-functions-in-python/">functions</a>, <a href="https://treyhunner.com/2019/03/python-deep-comparisons-and-code-readability/#Sorting_by_multiple_attributes_at_once">key functions</a>, and <a href="https://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/">asterisks</a></li>
<li>Practiced list comprehensions and dictionary lookups</li>
<li>Learnt and practised some, about decimals and rounding up</li>
</ul>
<h3 id="devops">Devops</h3>
<ul>
<li>Devops-ish? Upgraded the BIOS of my desktop to the current the latest available version. I was on v1.5, when I had last done it in July ’21. Now I am on v1.9 from November last year. Fixes plenty of <a href="https://www.dell.com/support/home/en-in/drivers/driversdetails?driverid=1gtt7&amp;oscode=ws19l&amp;productcode=poweredge-t40">vulnerabilities</a>.<br>
While I got to know of it last eve, I did not upgrade then, because I wanted my mind fresh and attentive while I did this. I have bricked enough PCs and handhelds  in my misspent youth and I cannot risk killing my daily driver to tiredness.<br>
What <em>do</em> they call it now? UEFI firmware?<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></li>
</ul>
<h3 id="urdu">Urdu</h3>
<ul>
<li>Learnt the ‘daal’ group of letters</li>
<li>Today was also the first day, I realised reading right to left is becoming intuitive.<br>
I read “Daataa”<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> in Urdu and went to check if I was correct  by trying to read the English, and was wondering why they nonsensically called it “aataad”, until my brain switched back to Latin and reading left to right 😂</li>
</ul>
<h3 id="physical-activity">Physical Activity</h3>
<ul>
<li>I hope gym gets easier, because I am getting crankier about the pain by the day.</li>
<li>The better half says I sustained much more pain with physio and bore it longer and more stoically when I broke my back in 2017. Well, that was my body doing it to me and I had no control over it. Right now, <em>I am doing this to myself</em>, ergo the crankiness. I know this is good for me in the long run. Does not stop me from hating the process and its repercussions right now. I’m getting old and grumpy.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Dell seems to be old fashioned like me. They still call it the BIOS.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>God&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (2nd of February, 2023)</title>
      <link>https://janusworx.com/personal/what-i-learned-today-2023-02-02/</link>
      <pubDate>Thu, 02 Feb 2023 19:30:55 +0530</pubDate>
      <guid>https://janusworx.com/personal/what-i-learned-today-2023-02-02/</guid>
      <description>&lt;p&gt;Long day today&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. I thought I got nothing much done, until I wrote this post.&lt;br&gt;
So, more incentive to keep writing these.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learning  about how to make keyword arguments stick.&lt;/li&gt;
&lt;li&gt;And how to think about structuring programs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;devops&#34;&gt;Devops&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Deep dive into how to add prow job listings to the dashboard and viceversa; how to go about looking for the job from the dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;urdu--french&#34;&gt;Urdu / French&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lots of practice with vowels and the ‘jiim’ group of letters. Since I know Hindi, Urdu progress is much, much, much faster than French. I think that is because, I am forcing my English grammar / vocabulary on another Romance language that has Germanic influences. This is leading to a lot of cognitive dissonance and slow progress.&lt;br&gt;
Much of my Urdu vocabulary comes from Hindi, which I learnt as a kid, and I definitely did not go looking for the “right” way to speak it. Better to just do French similarly as well. While I cannot do immersion, I can do what I want to do with French. Begin reading what I want to. Whether I understand it or not. I realise this will take me a lot longer than Urdu or Hindi, but that’s ok. Émilie du Châtelet, Montaigne and Dumas are not going anywhere, and neither am I :)&lt;/li&gt;
&lt;li&gt;My frame of learning now, after doing these two languages, as well as the rest of the stuff I am doing, is to just begin &lt;em&gt;doing&lt;/em&gt;&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. And figure out / learn the rules, the grammar, the conventions as you go.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;physical-activity&#34;&gt;Physical Activity&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;They call it chest and arm day. I presume, the exercises are meant to strengthen them. Right now, it’s just a stiff, painful mess.&lt;/li&gt;
&lt;li&gt;I cannot wait for this phase to be over.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;books--reading&#34;&gt;Books / Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished reading, The Boy, the Mole, the Fox and the Horse by Charlie Mackesy. It’s a hauntingly, beautiful book. A spiritual successor to the Little Prince and a &lt;a href=&#34;https://janusworx.com/lindy-books/&#34;&gt;Lindy&lt;/a&gt; book for sure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

Feedback on this post? Mail me at &lt;a href=&#34;mailto:feedback@janusworx.com&#34;&gt;feedback@janusworx.com&lt;/a&gt;
&lt;br&gt;

&lt;br&gt;

P.S. Subscribe to my &lt;a href=&#34;https://janusworx.com/subscribe/&#34;&gt;mailing list!&lt;/a&gt;&lt;br&gt;
Forward these posts and letters to your friends and get them to subscribe!&lt;br&gt;
P.P.S. Feed my &lt;a href=&#34;https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share&#34;&gt;insatiable reading habit.&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Long day today<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. I thought I got nothing much done, until I wrote this post.<br>
So, more incentive to keep writing these.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python">Python</h3>
<ul>
<li>Learning  about how to make keyword arguments stick.</li>
<li>And how to think about structuring programs</li>
</ul>
<h3 id="devops">Devops</h3>
<ul>
<li>Deep dive into how to add prow job listings to the dashboard and viceversa; how to go about looking for the job from the dashboard</li>
</ul>
<h3 id="urdu--french">Urdu / French</h3>
<ul>
<li>Lots of practice with vowels and the ‘jiim’ group of letters. Since I know Hindi, Urdu progress is much, much, much faster than French. I think that is because, I am forcing my English grammar / vocabulary on another Romance language that has Germanic influences. This is leading to a lot of cognitive dissonance and slow progress.<br>
Much of my Urdu vocabulary comes from Hindi, which I learnt as a kid, and I definitely did not go looking for the “right” way to speak it. Better to just do French similarly as well. While I cannot do immersion, I can do what I want to do with French. Begin reading what I want to. Whether I understand it or not. I realise this will take me a lot longer than Urdu or Hindi, but that’s ok. Émilie du Châtelet, Montaigne and Dumas are not going anywhere, and neither am I :)</li>
<li>My frame of learning now, after doing these two languages, as well as the rest of the stuff I am doing, is to just begin <em>doing</em><sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>. And figure out / learn the rules, the grammar, the conventions as you go.</li>
</ul>
<h3 id="physical-activity">Physical Activity</h3>
<ul>
<li>They call it chest and arm day. I presume, the exercises are meant to strengthen them. Right now, it’s just a stiff, painful mess.</li>
<li>I cannot wait for this phase to be over.</li>
</ul>
<h3 id="books--reading">Books / Reading</h3>
<ul>
<li>Finished reading, The Boy, the Mole, the Fox and the Horse by Charlie Mackesy. It’s a hauntingly, beautiful book. A spiritual successor to the Little Prince and a <a href="/lindy-books/">Lindy</a> book for sure.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I hate the gym&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Priyanka, Pradhvan, Rahul and Kushal be like, We told you so!&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (1st of February, 2023)</title>
      <link>https://janusworx.com/work/what-i-learned-today-2023-02-01/</link>
      <pubDate>Wed, 01 Feb 2023 19:25:30 +0530</pubDate>
      <guid>https://janusworx.com/work/what-i-learned-today-2023-02-01/</guid>
      <description>&lt;p&gt;Did a full day.&lt;br&gt;
But is this sustainable?&lt;br&gt;
I’ll know in a week or so.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finally figured out what &lt;code&gt;def __init__ (self):&lt;/code&gt; does in an class, in a way that makes sense to &lt;em&gt;my&lt;/em&gt; mind.&lt;br&gt;
If I create an class and I want it (i.e. the objects created with it) to take in arguments, then I need to define an &lt;code&gt;__init__&lt;/code&gt; method to set it all up.&lt;br&gt;
For e.g. if the class definition is just &lt;code&gt;class chantSomeName():&lt;/code&gt;  where do I reconcile the fact that I need to pass in a name that needs chanting? In its &lt;code&gt;__init__&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;chantSomeName&lt;/span&gt;():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;__init__&lt;/span&gt;(self, name):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        self&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Python does a &lt;em&gt;lot&lt;/em&gt; for me. My first approach going into any problem should henceforth be,
&lt;ul&gt;
&lt;li&gt;Does Python already do this for me already, natively?&lt;/li&gt;
&lt;li&gt;I should think of Python less, as a forge where I make my own tools (which it undoubtedly is) and more as a librarian, where I can just ask it for something and it will return it to me. The more I study it, the more I realise just how much it keeps track of and how much it tries to make life easy for me&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;devops&#34;&gt;Devops&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learnt a bit about how Prow jobs work&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;english&#34;&gt;English&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Learnt a new (old) word
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.websters1913.com/words/Viscid&#34;&gt;viscid&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Vis&amp;quot;cid&lt;/strong&gt; (?), a. [L. &lt;strong&gt;viscidus&lt;/strong&gt;, fr. &lt;strong&gt;viscum&lt;/strong&gt; the mistletoe, birdlime made from the berries of the mistletoe; akin to Gr. ?: cf. F. &lt;strong&gt;viscide&lt;/strong&gt;.] Sticking or adhering, and having a ropy or glutinous consistency; viscous; glutinous; sticky; tenacious; clammy; as, turpentine, tar, gums, etc., are more or less &lt;strong&gt;viscid&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Did a full day.<br>
But is this sustainable?<br>
I’ll know in a week or so.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python">Python</h3>
<ul>
<li>Finally figured out what <code>def __init__ (self):</code> does in an class, in a way that makes sense to <em>my</em> mind.<br>
If I create an class and I want it (i.e. the objects created with it) to take in arguments, then I need to define an <code>__init__</code> method to set it all up.<br>
For e.g. if the class definition is just <code>class chantSomeName():</code>  where do I reconcile the fact that I need to pass in a name that needs chanting? In its <code>__init__</code> method</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">chantSomeName</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> <span style="color:#a6e22e">__init__</span>(self, name):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>name <span style="color:#f92672">=</span> name
</span></span></code></pre></div><ul>
<li>Python does a <em>lot</em> for me. My first approach going into any problem should henceforth be,
<ul>
<li>Does Python already do this for me already, natively?</li>
<li>I should think of Python less, as a forge where I make my own tools (which it undoubtedly is) and more as a librarian, where I can just ask it for something and it will return it to me. The more I study it, the more I realise just how much it keeps track of and how much it tries to make life easy for me</li>
</ul>
</li>
</ul>
<h3 id="devops">Devops</h3>
<ul>
<li>Learnt a bit about how Prow jobs work</li>
</ul>
<h3 id="english">English</h3>
<ul>
<li>Learnt a new (old) word
<ul>
<li><a href="https://www.websters1913.com/words/Viscid">viscid</a></li>
</ul>
<blockquote>
<p><strong>Vis&quot;cid</strong> (?), a. [L. <strong>viscidus</strong>, fr. <strong>viscum</strong> the mistletoe, birdlime made from the berries of the mistletoe; akin to Gr. ?: cf. F. <strong>viscide</strong>.] Sticking or adhering, and having a ropy or glutinous consistency; viscous; glutinous; sticky; tenacious; clammy; as, turpentine, tar, gums, etc., are more or less <strong>viscid</strong>.</p>
</blockquote>
</li>
</ul>
<h3 id="urdu">Urdu</h3>
<ul>
<li>Working my way through the alphabet. Did the jeem group of letters today</li>
</ul>
<h3 id="physical-activity">Physical Activity</h3>
<ul>
<li>An hours worth of cardio. I am <em>really</em> gritting my teeth and hoping all of this pain, pays off.</li>
</ul>
<h3 id="django">Django</h3>
<ul>
<li>Learnt how to docker-ise my tiny Django app, that I’m writing, so I can have a contact form on the website.</li>
</ul>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>What I Learned Today (31st of January, 2023)</title>
      <link>https://janusworx.com/blog/what-i-learned-today-2023-01-31/</link>
      <pubDate>Tue, 31 Jan 2023 21:10:12 +0530</pubDate>
      <guid>https://janusworx.com/blog/what-i-learned-today-2023-01-31/</guid>
      <description>&lt;p&gt;Been knocked down a little too much over the past few months.&lt;br&gt;
This is me, getting up from my knees.&lt;/p&gt;
&lt;p&gt;Doing some things daily to learn.&lt;br&gt;
To give myself grace&lt;br&gt;
To be kind to my self.&lt;/p&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;python-morsels&#34;&gt;Python Morsels&lt;/h3&gt;
&lt;p&gt;Getting back into the swing of writing code.&lt;br&gt;
Today was basically just looking at a blank screen and wondering why nothing would come out.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Been knocked down a little too much over the past few months.<br>
This is me, getting up from my knees.</p>
<p>Doing some things daily to learn.<br>
To give myself grace<br>
To be kind to my self.</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="python-morsels">Python Morsels</h3>
<p>Getting back into the swing of writing code.<br>
Today was basically just looking at a blank screen and wondering why nothing would come out.</p>
<h3 id="urdu">Urdu</h3>
<p>Started with module one of Rekhta’s wonderful <a href="https://aamozish.com/">Aamozish</a>.<br>
I hope to have read at least one Urdu book by the end of the year.</p>
<h3 id="physical-activity">Physical Activity</h3>
<p>Went to the gym. Worked with a kindly trainer, who understands my pain and then keeps telling me about all the good  things “one”<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> needs to do. I have no legs.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><br>
I hope I get used to this soon.</p>
<h3 id="devops">Devops</h3>
<p>Worked with a colleague. Trying to create a presentation.</p>
<h3 id="french">French</h3>
<p>This is something I barely spend 5 minutes on.<br>
But I do it daily.<br>
The only reason I mention it here, because today is Day 100 of showing up.</p>
<p><hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

Feedback on this post? Mail me at <a href="mailto:feedback@janusworx.com">feedback@janusworx.com</a>
<br>

<br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>There is no “one”. It’s all specific to me 😂&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I do in fact, have legs. It’s just that the gym session killed me. Well, I am in fact alive. I am just prone to hyperbole.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>FOSS.training / DGPLUG Summer Training 2022 Begins</title>
      <link>https://janusworx.com/personal/summer-training-2022-begins/</link>
      <pubDate>Sun, 24 Jul 2022 12:35:43 +0530</pubDate>
      <guid>https://janusworx.com/personal/summer-training-2022-begins/</guid>
      <description>&lt;p&gt;Let’s get the important bits out of the way first.&lt;br&gt;
I have been both, busy and lazy. Mea culpa.&lt;br&gt;
But the new &lt;a href=&#34;https://foss.training/&#34;&gt;FOSS.training’s&lt;/a&gt; aka DGPLUG Summer Training cohort begins tomorrow, &lt;em&gt;&lt;strong&gt;the 25th of July, 2022 (6.30pm IST). Come, join!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Join the &lt;a href=&#34;https://mail.python.org/mailman3/lists/dgplug.python.org/&#34;&gt;mailing list, here.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Come join the &lt;a href=&#34;https://web.libera.chat/#dgplug&#34;&gt;#dgplug irc channel on Libera&lt;/a&gt;, because that’s where the training will be conducted.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr style=&#39;margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;&#39;/&gt;

&lt;h3 id=&#34;so-what-is-it&#34;&gt;So, what is it?&lt;/h3&gt;
&lt;p&gt;The summer training is short-ish, couple of months-ish long, series of meetups on irc.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
Mentors come. Students gather. A cohort forms.&lt;br&gt;
And we learn all about the free and open source world.&lt;br&gt;
If you’re a young person, looking to learn the &lt;em&gt;culture&lt;/em&gt; and the tacit knowledge of how the free and open source or someone older or if you feel like someone who is on the outside looking in, &lt;em&gt;all are welcome.&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Let’s get the important bits out of the way first.<br>
I have been both, busy and lazy. Mea culpa.<br>
But the new <a href="https://foss.training/">FOSS.training’s</a> aka DGPLUG Summer Training cohort begins tomorrow, <em><strong>the 25th of July, 2022 (6.30pm IST). Come, join!</strong></em></p>
<ol>
<li>Join the <a href="https://mail.python.org/mailman3/lists/dgplug.python.org/">mailing list, here.</a></li>
<li>Come join the <a href="https://web.libera.chat/#dgplug">#dgplug irc channel on Libera</a>, because that’s where the training will be conducted.</li>
</ol>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<h3 id="so-what-is-it">So, what is it?</h3>
<p>The summer training is short-ish, couple of months-ish long, series of meetups on irc.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup><br>
Mentors come. Students gather. A cohort forms.<br>
And we learn all about the free and open source world.<br>
If you’re a young person, looking to learn the <em>culture</em> and the tacit knowledge of how the free and open source or someone older or if you feel like someone who is on the outside looking in, <em>all are welcome.</em></p>
<p>From learning tactical things like communication skills, or basic programming to the more important things like, the importance of our culture, we aim to communicate all of this, so that you get a good grounding in <em>becoming</em> an open source contributer.</p>
<p>This year, will be our 15th cohort.<br>
And folks from all walks of life have come and better their lives and gained opportunities thanks to the skills they’ve learnt.<br>
Even more important though, are the people you will meet on this journey and the friendships you will make.<br>
<a href="https://pradhvanbisht.in/">Pradhvan</a>, <a href="https://farhaan.me/">Farhaan</a>, <a href="https://geeksocket.in/">Bhavin</a>, <a href="https://nabarun.dev/">Nabarun</a>, <a href="https://yudocaa.in/">Sayan</a>, <a href="https://www.linkedin.com/in/trishnaguha/">Trishna</a>, <a href="https://twitter.com/raukadah">Chandan</a>, <a href="https://kushaldas.in/">Kushal</a>, <a href="anweshadas.in/">Anwesha</a>, and <a href="https://www.psaggu.com/">Priyanka</a> are all friends, I have made here.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><br>
You could be next friend I make :)</p>
<p>Anwesha has more about past attendees and the mentor’s posts in her <a href="https://anweshadas.in/dgplug-summer-training-2022/">announcement post.</a><br>
Kushal has been <a href="https://kushaldas.in/categories/dgplug.html">writing about his journey</a> through these years on his blog.<br>
Read more about the training on <a href="https://foss.training/">the main website.</a><br>
And if you decide to take the plunge, here’s a good <a href="https://summertraining.readthedocs.io/en/latest/beforestart.html">before you start guide.</a></p>
<p>Hope to see you all there!<br>
And oh, here’s to the <a href="https://www.poetrygrrrl.com/oh-the-places-youll-go-by-dr-seuss/">places we will go!</a></p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p><br>

P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<hr>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>All the -ish’s are because, the training in fact never ends. We hang around and keep learning.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>and lots more. Apologies to all the people, I haven’t listed here :)&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Updated Poemfeed</title>
      <link>https://janusworx.com/personal/updated-poemfeed/</link>
      <pubDate>Fri, 27 May 2022 18:52:00 +0530</pubDate>
      <guid>https://janusworx.com/personal/updated-poemfeed/</guid>
      <description>&lt;p&gt;&lt;em&gt;Update: fixed Github link&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://janusworx.com/blog/a-hundred-days-of-code-day-029/&#34;&gt;little script&lt;/a&gt; I wrote in 2020, to get me my daily poetry fix, died a couple of months ago.&lt;br&gt;
Life got in the way of me, figuring out what was wrong.&lt;/p&gt;
&lt;p&gt;I finally got around to it today.&lt;br&gt;
A little bit of peeking under the hood revealed that Cloudflare did not like me using the Python Requests library to check the Poetry Foundation page.&lt;br&gt;
Or maybe it just did not like the useragent string that Requests gave it.&lt;br&gt;
I was in no mood to go down that rabbit hole, so I just went looking for modern alternatives to Requests.&lt;br&gt;
Found &lt;a href=&#34;https://www.python-httpx.org/&#34;&gt;HTTPX.&lt;/a&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and switched over to it.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;br&gt;
And then while I was at it, replaced PyRSS2Gen with &lt;a href=&#34;https://feedgen.kiesow.be/&#34;&gt;FeedGenerator.&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Update: fixed Github link</em></p>
<p>The <a href="https://janusworx.com/blog/a-hundred-days-of-code-day-029/">little script</a> I wrote in 2020, to get me my daily poetry fix, died a couple of months ago.<br>
Life got in the way of me, figuring out what was wrong.</p>
<p>I finally got around to it today.<br>
A little bit of peeking under the hood revealed that Cloudflare did not like me using the Python Requests library to check the Poetry Foundation page.<br>
Or maybe it just did not like the useragent string that Requests gave it.<br>
I was in no mood to go down that rabbit hole, so I just went looking for modern alternatives to Requests.<br>
Found <a href="https://www.python-httpx.org/">HTTPX.</a><sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and switched over to it.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup><br>
And then while I was at it, replaced PyRSS2Gen with <a href="https://feedgen.kiesow.be/">FeedGenerator.</a></p>
<p>And tada!
Poemfeed lives again!<br>
Find the updated code, <a href="https://github.com/jasonbraganza/poemfeed">over on Github.</a></p>
<p>Writing code today, made me realise, how far I have come since I wrote that code.<br>
I figured out the issue, I knew just how I wanted it to work, I went out, researched the code,  and then wrote and iterated over the code and got it working in a matter of hours.<br>
<a href="https://github.com/kushaldas/">Kushal</a> was right.<br>
Writing lots of shitty code, over and over and over again is the best way to get fluent.<br>
Here’s to more contributing and lots more of writing code!</p>
<hr style='margin-left: auto; margin-right: auto; margin-bottom: 40px; margin-top: 50px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;'/>

<p>P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>which delightfully, has a Requests compatible API&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>and to be sure, changed the userstring, so that my script presented itself as Firefox&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Installing PyCLD3 on an Apple M1 Mac</title>
      <link>https://janusworx.com/work/installing-pycld3-on-an-apple-m1-mac/</link>
      <pubDate>Wed, 30 Mar 2022 09:33:39 +0530</pubDate>
      <guid>https://janusworx.com/work/installing-pycld3-on-an-apple-m1-mac/</guid>
      <description>&lt;p&gt;While building my work product on the fancy-schmancy M1 work Mac, I kept running into &lt;code&gt;clang&lt;/code&gt; errors, when I did a &lt;code&gt;pip install&lt;/code&gt;&lt;br&gt;
Turns out, PyCLD3 would not build.&lt;br&gt;
So I did it manually. &lt;a href=&#34;https://github.com/bsolomon1124/pycld3/issues/17#issuecomment-1023857132&#34;&gt;This tip on Github did the trick&lt;/a&gt;&lt;br&gt;
We need &lt;code&gt;brew&lt;/code&gt; installed.&lt;br&gt;
And then we run the following commands in a terminal …&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  
brew install protobuf #install protobuf

# set various compiler flags
export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
export CFLAGS=&amp;#39;-I /opt/homebrew/opt/protobuf/include&amp;#39;
export LDFLAGS=-L/opt/homebrew/opt/protobuf/lib

# install pycld3
python3 -m pip install pycld3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And we’re set!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>While building my work product on the fancy-schmancy M1 work Mac, I kept running into <code>clang</code> errors, when I did a <code>pip install</code><br>
Turns out, PyCLD3 would not build.<br>
So I did it manually. <a href="https://github.com/bsolomon1124/pycld3/issues/17#issuecomment-1023857132">This tip on Github did the trick</a><br>
We need <code>brew</code> installed.<br>
And then we run the following commands in a terminal …<br>
<br></p>
<pre tabindex="0"><code>  
brew install protobuf #install protobuf

# set various compiler flags
export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
export CFLAGS=&#39;-I /opt/homebrew/opt/protobuf/include&#39;
export LDFLAGS=-L/opt/homebrew/opt/protobuf/lib

# install pycld3
python3 -m pip install pycld3
</code></pre><p>And we’re set!</p>
<p>P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list</a>!<br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit</a>.</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>I’ve Joined Scrollstack</title>
      <link>https://janusworx.com/work/ive-joined-scrollstack/</link>
      <pubDate>Tue, 16 Nov 2021 11:09:28 +0530</pubDate>
      <guid>https://janusworx.com/work/ive-joined-scrollstack/</guid>
      <description>&lt;p&gt;I’ve been job hunting for nearly a year and I was resigned to the vagaries of the interview process.&lt;br&gt;
Close to 16 interviews later, I was inured to every possible rejection note under the sun.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We don’t quite know what to do with you.&lt;/li&gt;
&lt;li&gt;You’re too slow.&lt;/li&gt;
&lt;li&gt;It’s us, not you.&lt;/li&gt;
&lt;li&gt;The position just got filled.&lt;/li&gt;
&lt;li&gt;While we don’t want you, we assure you, someone else will.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I understand it’s a process, that everyone goes through, but I somehow still held hope that someone would inject some humanity into what seems to be a pretty inhumane process.&lt;br&gt;
And &lt;a href=&#34;https://scrollstack.com/&#34;&gt;Scrollstack was exactly it.&lt;/a&gt;&lt;br&gt;
While I still haven’t asked the powers that be, why I got in, their process of treating people humanely is what attracted me to them.&lt;br&gt;
They wanted me on, and I’ve joined up as a Software Developer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’ve been job hunting for nearly a year and I was resigned to the vagaries of the interview process.<br>
Close to 16 interviews later, I was inured to every possible rejection note under the sun.</p>
<ul>
<li>We don’t quite know what to do with you.</li>
<li>You’re too slow.</li>
<li>It’s us, not you.</li>
<li>The position just got filled.</li>
<li>While we don’t want you, we assure you, someone else will.</li>
</ul>
<p>I understand it’s a process, that everyone goes through, but I somehow still held hope that someone would inject some humanity into what seems to be a pretty inhumane process.<br>
And <a href="https://scrollstack.com/">Scrollstack was exactly it.</a><br>
While I still haven’t asked the powers that be, why I got in, their process of treating people humanely is what attracted me to them.<br>
They wanted me on, and I’ve joined up as a Software Developer.</p>
<p>And ofcourse, would a guy who loves writing, <a href="https://samir.scrollstack.com/post/332/Why-we-built-ScrollStack">love to help build tools</a> that helps folk write? And earn, while we’re at it?<br>
Does a bear shit in the woods?<br>
<em><strong><a href="https://sive.rs/hellyeah">Hell, yeah!</a></strong></em></p>
<p>Here’s to upwards and onwards!<br>
And Scrollstack, you have my undying gratitude for helping me start a new phase of my career.</p>
<p>P.S. Subscribe to my <a href="https://janusworx.com/subscribe/">mailing list</a>!<br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit</a>.</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>To my Teachers, With Gratitude</title>
      <link>https://janusworx.com/personal/to-my-teachers-with-gratitude/</link>
      <pubDate>Wed, 27 Oct 2021 16:00:00 +0530</pubDate>
      <guid>https://janusworx.com/personal/to-my-teachers-with-gratitude/</guid>
      <description>&lt;p&gt;Shoutouts of Gratitude to the teachers who I learnt programming from over the past couple of years …&lt;/p&gt;
&lt;!-- TEASER_END --&gt;
&lt;p&gt;&lt;a href=&#34;https://kushaldas.in/&#34;&gt;Kushal Das&lt;/a&gt;, for bringing me in, teaching me the ropes and assuring me there was a place for me here&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://lerner.co.il/reuven-m-lerner/&#34;&gt;Reuven Lerner&lt;/a&gt;, who unravelled Python for me and made me realise that languages were small, and the reason I was struggling was not Python, but because I wanted to understand &lt;em&gt;all&lt;/em&gt; of computer science in too short a time frame.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Shoutouts of Gratitude to the teachers who I learnt programming from over the past couple of years …</p>
<!-- TEASER_END -->
<p><a href="https://kushaldas.in/">Kushal Das</a>, for bringing me in, teaching me the ropes and assuring me there was a place for me here</p>
<p><a href="https://lerner.co.il/reuven-m-lerner/">Reuven Lerner</a>, who unravelled Python for me and made me realise that languages were small, and the reason I was struggling was not Python, but because I wanted to understand <em>all</em> of computer science in too short a time frame.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p><a href="https://cs.harvard.edu/malan/">David Malan</a> and <a href="https://brianyu.me/">Brian Yu</a> for the grounding that is <a href="https://www.edx.org/course/introduction-computer-science-harvardx-cs50x">CS50.</a></p>
<p><a href="https://www.dr-chuck.com/">Dr. Chuck (Charles Severance)</a> for opening my eyes to the wonder that is web programming.<br>
And databases, and Postgresql.<br>
And Django.<br>
And so much more!<br>
You taught me how the pieces fit.</p>
<p><a href="https://jvns.ca/">Julia Evans</a> for showing me that being good at sharing knowledge, is not magic, just a lot of hard work and dedication.<br>
And for teaching me oh so much, with your magical zines.</p>
<p><a href="https://learning-python.com/author-photo1.html">Mark Lutz</a> for his exhaustive, thorough books on Python.</p>
<p><a href="https://www.dr-chuck.com/">Damian Conway</a> for making regexes make sense.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<p><a href="https://coursera.org/learn/learning-how-to-learn">Barbara Oakley</a>, for teaching an old dog how to learn.</p>
<p><a href="https://www.calnewport.com/">Cal Newport</a> and <a href="https://www.scotthyoung.com/">Scott Young</a> for helping me put it into practice (<a href="https://top-performer-course.com">deliberately</a> 😂)</p>
<p><a href="https://www.traversymedia.com/#about">Brad Traversy</a>, while he may not have melted my mind, he is the embodiment of everything i learnt from the teachers above. Patient, humble, transparent, persistent, <a href="https://youtu.be/zA9krklwADI">all round hero.</a></p>
<p>And last, but certainly not least, my young friend and mentee, <a href="https://www.psaggu.com/">Priyanka Saggu</a>, for teaching me <a href="https://www.psaggu.com/fitness.html">dogged persistence</a> and for being an unabashed cheerleader on my journey.</p>
<hr style='margin-left: auto; margin-right: auto;margin-bottom: 40px; width:100px; border: none; background-color:rgb(238, 238, 238); color: rgb(238, 238, 238);  height: 1px;' />
<p>All of this to say, good teachers are hard to find, and are worth their weight in gold. For every teacher on the list above, I failed with at least 5 more.</p>
<p>If you ever feel dumb, despite doing your best, like I constantly did, maybe it’s just the fact that the teacher and you are not compatible. The way they teach, might not be the way you understand</p>
<p>Which is why, if you are privileged enough to do so (or are willing to put in the time and the effort), there is no shame in looking for a ‘better’ teacher.
No worries in doing the work of finding that someone who can make stuff go ‘click’ in your mind; who can make the world make better sense to you</p>
<p>My experience has been that such folk are hard to find, and when you do luck across gems (like the people above) make sure they know it.<br>
Be grateful that life has brought you to them.<br>
And make sure you learn all you can, to the best of your ability.</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em>Reuven’s courses are worth it, for the groan worthy puns alone.</em>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><em>Something that I’ve wanted to do since the 90s</em>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>Learning Backend WebDev, Log #1</title>
      <link>https://janusworx.com/work/learning-backend-webdev-log-1/</link>
      <pubDate>Mon, 07 Jun 2021 19:33:46 +0530</pubDate>
      <guid>https://janusworx.com/work/learning-backend-webdev-log-1/</guid>
      <description>&lt;p&gt;test&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>test</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Day of Updates</title>
      <link>https://janusworx.com/work/a-day-of-updates/</link>
      <pubDate>Mon, 16 Nov 2020 18:08:36 +0530</pubDate>
      <guid>https://janusworx.com/work/a-day-of-updates/</guid>
      <description>&lt;p&gt;Could not focus much on programming today.&lt;br&gt;
So decided on &lt;em&gt;doing&lt;/em&gt; things with Python programs.&lt;/p&gt;
&lt;!-- TEASER_END --&gt;  
&lt;h3 id=&#34;nikola-upgrade&#34;&gt;Nikola Upgrade&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.getnikola.com/&#34;&gt;Nikola&lt;/a&gt; to generate both my websites.&lt;br&gt;
It is an extremely easy to use, no fuss static site generator, which is easy on my server’s resources.&lt;br&gt;
&lt;a href=&#34;https://github.com/getnikola/nikola/releases/tag/v8.1.2&#34;&gt;Version 8.1.2&lt;/a&gt; was released a few hours ago and I hopped on and installed it.&lt;br&gt;
I follow a slightly unconventional upgrade path, because I was terrified of breaking my server in the early days, when I was still learning about how to go about installing things on servers.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Could not focus much on programming today.<br>
So decided on <em>doing</em> things with Python programs.</p>
<!-- TEASER_END -->  
<h3 id="nikola-upgrade">Nikola Upgrade</h3>
<p>I use <a href="https://www.getnikola.com/">Nikola</a> to generate both my websites.<br>
It is an extremely easy to use, no fuss static site generator, which is easy on my server’s resources.<br>
<a href="https://github.com/getnikola/nikola/releases/tag/v8.1.2">Version 8.1.2</a> was released a few hours ago and I hopped on and installed it.<br>
I follow a slightly unconventional upgrade path, because I was terrified of breaking my server in the early days, when I was still learning about how to go about installing things on servers.</p>
<ul>
<li>I have <a href="https://docs.conda.io/en/latest/miniconda.html">Miniconda</a> installed.</li>
<li>I use that to generate a conda environment, which I then installed Nikola into.</li>
<li>When a new release drops, I create a <em>new</em> conda environment, install the new release in there and run them against my source folders (after backing them up).</li>
<li>This lets me revert very quickly to the old data and the older version of Nikola, in case I do something boneheaded and screw things up.</li>
<li>If all works fine for a month, I delete the older conda environment along with the old Nikola release.</li>
<li>I have been doing this for quite a while now, and while it may be overkill, it gives me peace of mind.</li>
<li>As usual, Nikola upgraded with no issues at all.</li>
</ul>
<h3 id="pleroma-bot">Pleroma Bot</h3>
<p>I always wanted to understand what bots do.<br>
Now I realise they are athromorphic programs that (with the right permissions and the right credentials) look like actual users of a service, doing sets of activities they are programmed to do.<br>
Like your banking app has set of solutions to common queries that it shows you, before it hands off to an actual human, if those solutions don’t fit your needs.<br>
They feel like supercharged scripts to me.<br>
So I decided to see if I could install one.<br>
Since I am learning Python, I love reading the low volume <a href="https://twitter.com/python_tip">Daily Python Tip</a> Twitter account.<br>
It has surprising, handy, funny, interesting tips and tricks about the Python language and the massive ecosystem around it.<br>
<em>But,</em> I have weaned myself off Twitter for my own sanity.<br>
I only use it sparingly once a day.<br>
And going back to that noise and tumult no longer interests me.<br>
I saw <a href="https://mastodon.social/@newsbot">a bot</a> that mirrored tech news accounts to Mastodon and wondered if a bot could get Daily Python Tip to me on my Pleroma timeline.<br>
A quick search led me to <a href="https://github.com/robertoszek/pleroma-twitter-info-grabber">Pleroma Bot</a>.<br>
A couple of struggling hours later, (creating a twitter developer account, creating a pleroma account for the bot, figuring out how to get bearer tokens for said accounts) and tada, I got the <a href="https://cb.janusworx.com/@ptjwbot">bot to come alive!</a><br>
It checks the Twitter account once a day, and mirrors the tweets to the bot account.<br>
You’re most welcome to follow it for a Python tip, daily.<br>
The next thing to do, is to see if I can get a bot to post a tagged pleroma status to my twitter account.<br>
But that is something for another day …<br>
<em>Update, 2020/11/17: figured out how to use the bot to mirror multiple accounts. It now mirrors, <a href="https://twitter.com/python_tip">Daily Python Tip</a>, <a href="https://twitter.com/regextip">RegexTip</a>, and <a href="https://twitter.com/compscifact">CompSciFact</a>.</em></p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Git the Branch</title>
      <link>https://janusworx.com/work/git-the-branch/</link>
      <pubDate>Fri, 13 Nov 2020 18:55:00 +0530</pubDate>
      <guid>https://janusworx.com/work/git-the-branch/</guid>
      <description>&lt;p&gt;I started playing with a way to control &lt;a href=&#34;https://janusworx.com/blog/starting-work-on-git-the-branch/&#34;&gt;Git via Python&lt;/a&gt;.&lt;br&gt;
Kushal had asked me to write a program, that would show me the local git branches.&lt;br&gt;
So here it is!&lt;br&gt;
I call it &lt;em&gt;&lt;strong&gt;Git the Branch&lt;/strong&gt;&lt;/em&gt;. (painfully, punny, I know :))&lt;/p&gt;
&lt;p&gt;And now I realise why he asked me to do this.&lt;br&gt;
The program itself is trivial.&lt;br&gt;
Here’s the code on my &lt;a href=&#34;https://cr.janusworx.com/jason/git-the-branch&#34;&gt;code repo&lt;/a&gt;, &lt;a href=&#34;https://gitlab.com/jasonbraganza/git-the-branch&#34;&gt;Gitlab&lt;/a&gt;, and &lt;a href=&#34;https://github.com/jasonbraganza/git-the-branch&#34;&gt;Github&lt;/a&gt;.&lt;br&gt;
It just consists of me using &lt;a href=&#34;https://gitpython.readthedocs.io/en/stable/&#34;&gt;GitPython&lt;/a&gt; to access the current folder via a GitPython &lt;code&gt;Repo&lt;/code&gt; object.&lt;br&gt;
And then querying it for its branches.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I started playing with a way to control <a href="https://janusworx.com/blog/starting-work-on-git-the-branch/">Git via Python</a>.<br>
Kushal had asked me to write a program, that would show me the local git branches.<br>
So here it is!<br>
I call it <em><strong>Git the Branch</strong></em>. (painfully, punny, I know :))</p>
<p>And now I realise why he asked me to do this.<br>
The program itself is trivial.<br>
Here’s the code on my <a href="https://cr.janusworx.com/jason/git-the-branch">code repo</a>, <a href="https://gitlab.com/jasonbraganza/git-the-branch">Gitlab</a>, and <a href="https://github.com/jasonbraganza/git-the-branch">Github</a>.<br>
It just consists of me using <a href="https://gitpython.readthedocs.io/en/stable/">GitPython</a> to access the current folder via a GitPython <code>Repo</code> object.<br>
And then querying it for its branches.</p>
<p>The important work was done <em>yesterday</em>, when I pored over the documentation and figured out how GitPython actually works.<br>
And I realised that is what Kushal wanted me to do.<br>
Read something and figure out how I could adapt it to my situation.</p>
<p>The other thing I realised, was licensing.<br>
I want my programs to be used, played with and adapted.<br>
So it makes sense for me, to make it as easy to use as possible.<br>
This is why I have decided, that until circumstances dictate otherwise, I shall use the <a href="https://choosealicense.com/licenses/mit/">MIT License</a>.<br>
This led me to check if I could then actually license my software as such, if the software that I depend on (in this case GitPython) have different licenses.<br>
My arbitrary and random research suggests that I can do so.<br>
If I learn otherwise, I shall think about what to do next.<br>
If you have anything to suggest, please let me know, by mailing me at jason at this domain.</p>
<p>One other (painful) thing, that I realised is that I cannot focus at all when I am writing code.<br>
This post has come out in a blur of focussed writing.<br>
My academic studies are also something that I can focus for hours on.<br>
Apparently that focus does not translate to programming.<br>
I need to build up this skill for this domain seperately.<br>
Hopefully, this will come with showing up daily.</p>
<p>This was fun to do.<br>
Here’s to writing my way to fluency.</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list</a>!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit</a>.<br>
P.P.P.S. <em>Update, 7pm the same day,</em> The answer to focus, lies in <a href="https://seths.blog/2020/11/the-incoming/">this serendipitous Seth post</a></p>
<blockquote>
<p><em>A third might be, just for an hour, to turn it off.<br>
All of it.<br>
To sit alone and create the new thing, the thing worth seeking out, the thing that will cause a positive change.</em></p>
</blockquote>
<p>I love it when the universe speaks to me :)</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>Poem Feed</title>
      <link>https://janusworx.com/personal/poem-feed/</link>
      <pubDate>Fri, 13 Nov 2020 17:00:00 +0530</pubDate>
      <guid>https://janusworx.com/personal/poem-feed/</guid>
      <description>&lt;p&gt;&lt;em&gt;Update, 2020/11/13: This has been working beautifully! I love the poems as they show up in my feed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a tiny little niche thing, I built all for my ownsome.&lt;br&gt;
It all &lt;a href=&#34;https://janusworx.com/blog/a-hundred-days-of-code-day-029/&#34;&gt;started&lt;/a&gt;, when I got hooked on reading the daily poem, on the Poetry Foundation page.&lt;/p&gt;
&lt;p&gt;Learning Python as I am, I wondered if there was a way to have it come to my RSS reader.&lt;br&gt;
And so &lt;a href=&#34;https://cr.janusworx.com/jason/poemfeed/src/branch/main/poemfeed.py&#34;&gt;Poemfeed&lt;/a&gt; is a tiny little utility that does just that for me.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Update, 2020/11/13: This has been working beautifully! I love the poems as they show up in my feed.</em></p>
<p>This is a tiny little niche thing, I built all for my ownsome.<br>
It all <a href="https://janusworx.com/blog/a-hundred-days-of-code-day-029/">started</a>, when I got hooked on reading the daily poem, on the Poetry Foundation page.</p>
<p>Learning Python as I am, I wondered if there was a way to have it come to my RSS reader.<br>
And so <a href="https://cr.janusworx.com/jason/poemfeed/src/branch/main/poemfeed.py">Poemfeed</a> is a tiny little utility that does just that for me.</p>
<p>It looks up Poetry Foundation’s, <a href="https://www.poetryfoundation.org/poems/poem-of-the-day">Poem of the Day</a> for a new poem.<br>
If there is one, it follows the link to the complete poem, and then gets the link to <em>that</em> page and writes that into an simple RSS entry in an xml file.</p>
<p>I then wrote a simple cron job that executes the python script twice a day, and if an xml file is generated, it moves it to a place that my RSS reader can access.<br>
Et voilà, a brand new poem everyday! (or as often as they publish :))</p>
<p>The code’s here, on <a href="https://cr.janusworx.com/jason/poemfeed/src/branch/main/poemfeed.py">my repo</a>, on <a href="https://gitlab.com/jasonbraganza/poemfeed/-/blob/main/poemfeed.py">Gitlab</a> and on <a href="https://github.com/jasonbraganza/poemfeed/blob/main/poemfeed.py">Github</a>, if you want to have a look see.</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Starting Work on Git-the-Branch</title>
      <link>https://janusworx.com/work/starting-work-on-git-the-branch/</link>
      <pubDate>Thu, 12 Nov 2020 15:16:12 +0530</pubDate>
      <guid>https://janusworx.com/work/starting-work-on-git-the-branch/</guid>
      <description>&lt;h3 id=&#34;the-itch&#34;&gt;The Itch&lt;/h3&gt;
&lt;p&gt;Aiming to write a tool using this which will show all the git branches in the current directory and the last commit date on those branches (and only the local branches :))&lt;/p&gt;
&lt;h3 id=&#34;what-i-did-today&#34;&gt;What I did today&lt;/h3&gt;
&lt;p&gt;I had to carry my phone in to the service centre, so I did not quite have as much focussed time as yesterday, with all the coordinating and carrying, but I learned a few new things&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h3 id="the-itch">The Itch</h3>
<p>Aiming to write a tool using this which will show all the git branches in the current directory and the last commit date on those branches (and only the local branches :))</p>
<h3 id="what-i-did-today">What I did today</h3>
<p>I had to carry my phone in to the service centre, so I did not quite have as much focussed time as yesterday, with all the coordinating and carrying, but I learned a few new things</p>
<p><a href="https://kushaldas.in/">Kushal</a> hinted that I could use <a href="https://gitpython.readthedocs.io/en/stable/index.html">GitPython</a> to do what I want.<br>
So I spent a little while reading there.<br>
And then decided to test it out.</p>
<p>And then immediately went yak shaving, because I wanted to solve the problem of how to quickly type iterate in Visual Studio Code.<br>
I learnt <a href="/tags/pythonoop/">lots of Python</a> using <a href="https://store.lerner.co.il/">Reuven Lerner</a>’s courses and I used a lot of <a href="https://jupyter.org/">Jupyter Notebooks</a> then.<br>
And I love them.<br>
The trick now, is to figure out how to use them in Visual Studio Code.<br>
To my delight, the Python extension in VS Code has support for notebooks. And all works well for the most part.<br>
The only thing that tripped me up was that when I tried importing a module in the notebook after activating my virtual environment, the Jupyter server hiccoughed and threw up some error about not finding the module (which I knew was <em>definitely</em> installed) and then something about it not being in the PYTHONPATH (which I had no clue of which places, it was looking in.)<br>
A little snooping and I realised that the extension loads the server with a default kernel in someplace. And I need to tell it about my environment. Once I told it to use the kernel from my venv, all was fine.<br>
VS Code went and installed a ton of things and found what was already there and everything was hunky dory.<br>
A <code>from git import Repo</code> worked just fine.</p>
<p>I felt good about this piece of dawdling, because I know this is something I am going to do every day and better I spend <em>some</em> time figuring it out, right at the start.</p>
<p>I learnt that I could use the ! mark as a prefix in Jupyter to run shell commands! A <code>!ls</code> will show me the contents of my folder :)</p>
<p>I skimmed the GitPython documentation.<br>
I kind of got what I want.<br>
This will require lots more work, which I shall have to put in.<br>
But even a cursory glance, showed me that GitPython was an <em>exhaustive</em> wrapper, that would let you do practically anything you would want to do with Git.</p>
<p>More tomorrow …</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A Good First Day</title>
      <link>https://janusworx.com/work/a-good-first-day/</link>
      <pubDate>Wed, 11 Nov 2020 19:05:10 +0530</pubDate>
      <guid>https://janusworx.com/work/a-good-first-day/</guid>
      <description>&lt;p&gt;Was a really good day to ease back into Python today.&lt;br&gt;
I got my VS Code up and running.&lt;br&gt;
I got a personal [Gitea instance][crjw] up, to host my code, from where I will syndicate it to Github and Gitlab.&lt;br&gt;
And finally I got a &lt;a href=&#34;https://janusworx.com/programming-projects/&#34;&gt;projects page&lt;/a&gt; up, to slowly fill up with projects.&lt;/p&gt;
&lt;p&gt;I also managed to improve an old program I wrote for myself, but I’ll write about that in the next post.&lt;br&gt;
All in all, a day well spent. A journey well begun.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Was a really good day to ease back into Python today.<br>
I got my VS Code up and running.<br>
I got a personal [Gitea instance][crjw] up, to host my code, from where I will syndicate it to Github and Gitlab.<br>
And finally I got a <a href="https://janusworx.com/programming-projects/">projects page</a> up, to slowly fill up with projects.</p>
<p>I also managed to improve an old program I wrote for myself, but I’ll write about that in the next post.<br>
All in all, a day well spent. A journey well begun.</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Getting Back on the Horse</title>
      <link>https://janusworx.com/personal/getting-back-on-the-horse/</link>
      <pubDate>Wed, 11 Nov 2020 09:49:28 +0530</pubDate>
      <guid>https://janusworx.com/personal/getting-back-on-the-horse/</guid>
      <description>&lt;p&gt;Ok, one more time.&lt;br&gt;
I know there have been &lt;a href=&#34;https://janusworx.com/blog/a-hundred-days-of-code-day-000-begin-again/&#34;&gt;lots of one more times&lt;/a&gt; before, but I am going to keep at this until I get proficient enough at this to land a job :)&lt;br&gt;
And while I may not be brainy enough, the one thing I &lt;em&gt;can&lt;/em&gt; do is be persistent enough to show up.&lt;/p&gt;
&lt;p&gt;This time, I will focus on building tiny projects.&lt;br&gt;
I realise my life is too chaotic for &lt;a href=&#34;https://janusworx.com/tags/100daysofcode/&#34;&gt;#100DaysofCode&lt;/a&gt;.&lt;br&gt;
But I can do this, one tiny thing at a time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ok, one more time.<br>
I know there have been <a href="https://janusworx.com/blog/a-hundred-days-of-code-day-000-begin-again/">lots of one more times</a> before, but I am going to keep at this until I get proficient enough at this to land a job :)<br>
And while I may not be brainy enough, the one thing I <em>can</em> do is be persistent enough to show up.</p>
<p>This time, I will focus on building tiny projects.<br>
I realise my life is too chaotic for <a href="/tags/100daysofcode/">#100DaysofCode</a>.<br>
But I can do this, one tiny thing at a time.</p>
<p>Wish me luck!</p>
<p>P.S. Subscribe to my <a href="/subscribe/">mailing list!</a><br>
Forward these posts and letters to your friends and get them to subscribe!<br>
P.P.S. Feed my <a href="https://www.amazon.in/hz/wishlist/ls/2QAUKHHAMOOVS?ref_=wl_share">insatiable reading habit.</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 026 - Refactoring</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-026-refactoring/</link>
      <pubDate>Mon, 03 Aug 2020 13:00:03 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-026-refactoring/</guid>
      <description>&lt;p&gt;Worked only an hour today.&lt;br&gt;
Trying to change the little &lt;a href=&#34;https://janusworx.com/blog/a-hundred-days-of-code-day-023-day-24-tiny-utility-to-do-comparative-dns-lookups/&#34;&gt;lookup program&lt;/a&gt;, I made the other day, into something a little better.&lt;/p&gt;
&lt;p&gt;Not quite a good day.&lt;br&gt;
Calling it quits early.&lt;/p&gt;
&lt;hr&gt;</description>
      <content:encoded><![CDATA[<p>Worked only an hour today.<br>
Trying to change the little <a href="https://janusworx.com/blog/a-hundred-days-of-code-day-023-day-24-tiny-utility-to-do-comparative-dns-lookups/">lookup program</a>, I made the other day, into something a little better.</p>
<p>Not quite a good day.<br>
Calling it quits early.</p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 025 - Comprehension Exercises</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-025-comprehension-exercises/</link>
      <pubDate>Mon, 03 Aug 2020 12:57:20 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-025-comprehension-exercises/</guid>
      <description>&lt;p&gt;Working on Comprehension exercises today.&lt;/p&gt;
&lt;h2 id=&#34;reflections-and-experience&#34;&gt;Reflections and Experience&lt;/h2&gt;
&lt;!-- TEASER_END --&gt;  
&lt;ul&gt;
&lt;li&gt;I really need feedback, when it comes to programming. I cannot face a blank page. I always seem to start with printing something out to screen and then my brain kind of kicks into gear. Everything after that is just type, print, is this what I expected, if not then fix, type, print …&lt;/li&gt;
&lt;li&gt;Exercise 3.1 and I think, I am &lt;em&gt;finally&lt;/em&gt; getting good handle on comprehensions.
&lt;ul&gt;
&lt;li&gt;from something that would take me at least 10 lines of code to just expressing it concisely in 1!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I can read Python messages and take a gander at what I need to do next.
&lt;ul&gt;
&lt;li&gt;I see a &lt;code&gt;&#39;_io.TextIOWrapper&#39; object&lt;/code&gt; and know I can iterate over it.&lt;/li&gt;
&lt;li&gt;I see &lt;code&gt;AttributeError: &#39;_io.TextIOWrapper&#39; object has no attribute &#39;strip&#39;&lt;/code&gt; and realise that it cannot be stripped into parts. I need another way to skin that cat.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;And then I took it too far (just like this sentence), and nested a comprehension in another one, in where, I had to learn how to put in a conditional in the form of a ternary operator, in Exercise 3.2 (the commented for loop is much simpler!), but that was &lt;em&gt;very good&lt;/em&gt; practice. Really stretched me!&lt;/li&gt;
&lt;li&gt;I caught myself getting distracted a lot. I needed to set a 30 min timer and I spent about 15, looking for where the timer app in my Mint Desktop was, instead of just setting the darned timer on the phone.&lt;/li&gt;
&lt;li&gt;Took an hour to figure out the comprehension for 3.2 and about 20 minutes to do it for Exercise 3.3. Practice helps!&lt;/li&gt;
&lt;li&gt;Watching the solutions, and I realise, I got them right in principle, but that I need to be more aware of what happens to an object in memory, so that I can simplify code. I was able to remove one level of comprehension, which I used just to get the end of a string.&lt;/li&gt;
&lt;/ul&gt;</description>
      <content:encoded><![CDATA[<p>Working on Comprehension exercises today.</p>
<h2 id="reflections-and-experience">Reflections and Experience</h2>
<!-- TEASER_END -->  
<ul>
<li>I really need feedback, when it comes to programming. I cannot face a blank page. I always seem to start with printing something out to screen and then my brain kind of kicks into gear. Everything after that is just type, print, is this what I expected, if not then fix, type, print …</li>
<li>Exercise 3.1 and I think, I am <em>finally</em> getting good handle on comprehensions.
<ul>
<li>from something that would take me at least 10 lines of code to just expressing it concisely in 1!</li>
</ul>
</li>
<li>I can read Python messages and take a gander at what I need to do next.
<ul>
<li>I see a <code>'_io.TextIOWrapper' object</code> and know I can iterate over it.</li>
<li>I see <code>AttributeError: '_io.TextIOWrapper' object has no attribute 'strip'</code> and realise that it cannot be stripped into parts. I need another way to skin that cat.</li>
</ul>
</li>
<li>And then I took it too far (just like this sentence), and nested a comprehension in another one, in where, I had to learn how to put in a conditional in the form of a ternary operator, in Exercise 3.2 (the commented for loop is much simpler!), but that was <em>very good</em> practice. Really stretched me!</li>
<li>I caught myself getting distracted a lot. I needed to set a 30 min timer and I spent about 15, looking for where the timer app in my Mint Desktop was, instead of just setting the darned timer on the phone.</li>
<li>Took an hour to figure out the comprehension for 3.2 and about 20 minutes to do it for Exercise 3.3. Practice helps!</li>
<li>Watching the solutions, and I realise, I got them right in principle, but that I need to be more aware of what happens to an object in memory, so that I can simplify code. I was able to remove one level of comprehension, which I used just to get the end of a string.</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 023, Day 24 - Tiny Utility to do comparative DNS Lookups</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-023-day-24-tiny-utility-to-do-comparative-dns-lookups/</link>
      <pubDate>Sat, 01 Aug 2020 15:33:22 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-023-day-24-tiny-utility-to-do-comparative-dns-lookups/</guid>
      <description>&lt;h2 id=&#34;problem---compare-domain-lookups-against-doh-servers&#34;&gt;Problem - Compare domain lookups, against DoH Servers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Take a list of domains (one per line) from a text file as input, find the IP address for the domain using the standard system level DNS, and then check against DoH answers from both cloudflare and google. and say if all answers match properly or not.&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- TEASER_END --&gt;
&lt;h2 id=&#34;notes&#34;&gt;Notes&lt;/h2&gt;
&lt;p&gt;What do I need to do? (checklist)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get a list of popular websites, (probably Alexa)&lt;/li&gt;
&lt;li&gt;figure out a way to read them in&lt;/li&gt;
&lt;li&gt;loop through each line, and look up its ip
&lt;ul&gt;
&lt;li&gt;with the local dns (use the sockets module)&lt;/li&gt;
&lt;li&gt;with Google’s &lt;a href=&#34;https://developers.google.com/speed/public-dns/docs/doh/json&#34;&gt;DoH json endpoint&lt;/a&gt; (use the requests module)&lt;/li&gt;
&lt;li&gt;with Cloudflare’s &lt;a href=&#34;https://developers.cloudflare.com/1.1.1.1/dns-over-https/json-format/&#34;&gt;DoH json endpoint&lt;/a&gt; (ditto like Google)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compare all the values.&lt;/li&gt;
&lt;li&gt;Print if they match or not.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;experience&#34;&gt;Experience&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I should commit my work often. This took me two days, because I lost all of yesterday’s progress in a computer hiccough.&lt;/li&gt;
&lt;li&gt;The program runs well. It intentionally limits itself to only the first result in the Google and Cloudflare lookups.&lt;/li&gt;
&lt;li&gt;I should learn to focus more on what is at hand and not overthink the program.&lt;/li&gt;
&lt;li&gt;I should be learning to build primitive little, handy dandy tools, not giant cathedrals.&lt;/li&gt;
&lt;li&gt;I spent two hours fiddling with a way to create &lt;em&gt;another&lt;/em&gt; program that would process files for me. (and abandoned it)&lt;/li&gt;
&lt;li&gt;I need to read the documentation across sites &lt;em&gt;very carefully&lt;/em&gt;.
&lt;ul&gt;
&lt;li&gt;They are written with experienced programmers in mind, and not beginners like me.&lt;/li&gt;
&lt;li&gt;For e.g. When I was trying to look up domain names with Cloudflare, I blindly copied the example and then wondered why it was not giving me the appropriate replies. I then realised I was missing a seperate parameter, &lt;code&gt;&amp;amp;ct=application/dns-json&lt;/code&gt; which was quite clearly listed above, but not in the example below. (which in truth &lt;em&gt;was&lt;/em&gt; listed, but as part of the command at the command line and I, like a dumbass, just copied the requisite code to adapt to my Python program. &lt;em&gt;Lesson: Cargo cult with extreme caution&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Which leads back to the fact, that I should stick to what is assigned, because just doing that much at this stage is taking me a long time. Improvements and features can wait until I am much more fluent.&lt;/li&gt;
&lt;li&gt;I realise I am trusting autocomplete too much, and I should at least &lt;em&gt;look&lt;/em&gt; at what I am completing. I spent 40 minutes, wondering why my comparisons were not working, when in fact, I was using the wrong variables.&lt;/li&gt;
&lt;li&gt;Lost loads of time with typos.&lt;/li&gt;
&lt;li&gt;Be more intentional. More slow.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code.&lt;/h2&gt;
&lt;p&gt;Put your sitenames into a file called dumpsites.txt
Run check-ip.py&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="problem---compare-domain-lookups-against-doh-servers">Problem - Compare domain lookups, against DoH Servers</h2>
<ul>
<li>Take a list of domains (one per line) from a text file as input, find the IP address for the domain using the standard system level DNS, and then check against DoH answers from both cloudflare and google. and say if all answers match properly or not.</li>
</ul>
<!-- TEASER_END -->
<h2 id="notes">Notes</h2>
<p>What do I need to do? (checklist)</p>
<ul>
<li>Get a list of popular websites, (probably Alexa)</li>
<li>figure out a way to read them in</li>
<li>loop through each line, and look up its ip
<ul>
<li>with the local dns (use the sockets module)</li>
<li>with Google’s <a href="https://developers.google.com/speed/public-dns/docs/doh/json">DoH json endpoint</a> (use the requests module)</li>
<li>with Cloudflare’s <a href="https://developers.cloudflare.com/1.1.1.1/dns-over-https/json-format/">DoH json endpoint</a> (ditto like Google)</li>
</ul>
</li>
<li>Compare all the values.</li>
<li>Print if they match or not.</li>
</ul>
<h2 id="experience">Experience</h2>
<ul>
<li>I should commit my work often. This took me two days, because I lost all of yesterday’s progress in a computer hiccough.</li>
<li>The program runs well. It intentionally limits itself to only the first result in the Google and Cloudflare lookups.</li>
<li>I should learn to focus more on what is at hand and not overthink the program.</li>
<li>I should be learning to build primitive little, handy dandy tools, not giant cathedrals.</li>
<li>I spent two hours fiddling with a way to create <em>another</em> program that would process files for me. (and abandoned it)</li>
<li>I need to read the documentation across sites <em>very carefully</em>.
<ul>
<li>They are written with experienced programmers in mind, and not beginners like me.</li>
<li>For e.g. When I was trying to look up domain names with Cloudflare, I blindly copied the example and then wondered why it was not giving me the appropriate replies. I then realised I was missing a seperate parameter, <code>&amp;ct=application/dns-json</code> which was quite clearly listed above, but not in the example below. (which in truth <em>was</em> listed, but as part of the command at the command line and I, like a dumbass, just copied the requisite code to adapt to my Python program. <em>Lesson: Cargo cult with extreme caution</em>)</li>
</ul>
</li>
<li>Which leads back to the fact, that I should stick to what is assigned, because just doing that much at this stage is taking me a long time. Improvements and features can wait until I am much more fluent.</li>
<li>I realise I am trusting autocomplete too much, and I should at least <em>look</em> at what I am completing. I spent 40 minutes, wondering why my comparisons were not working, when in fact, I was using the wrong variables.</li>
<li>Lost loads of time with typos.</li>
<li>Be more intentional. More slow.</li>
</ul>
<h2 id="code">Code.</h2>
<p>Put your sitenames into a file called dumpsites.txt
Run check-ip.py</p>
<p><a href="https://gitlab.com/jasonbraganza/programming-practice/-/tree/master/check-ip">Gitlab</a> / <a href="https://github.com/jasonbraganza/programming-practice/tree/master/check-ip">Github</a></p>
<hr>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 022 - Getting into the Groove</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-022-getting-into-the-groove/</link>
      <pubDate>Thu, 30 Jul 2020 12:03:45 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-022-getting-into-the-groove/</guid>
      <description>&lt;p&gt;Did the same time as yesterday.&lt;br&gt;
Only about an hour.&lt;br&gt;
Was much more prodcutive though.&lt;/p&gt;
&lt;p&gt;Getting the hang of how to sit and program and work through things I do not know.&lt;br&gt;
Gaining a bit of experience with the workflow now.&lt;br&gt;
I have the basics in hand. I know what I want to look up.&lt;br&gt;
So check problem, work a bit, look up, try, fail, repeat, gain incremental success, work some more.&lt;br&gt;
Love the feedback loop too.&lt;br&gt;
With other stuff I try, I have to wait days, weeks, months.&lt;br&gt;
Here, it’s immediate.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Did the same time as yesterday.<br>
Only about an hour.<br>
Was much more prodcutive though.</p>
<p>Getting the hang of how to sit and program and work through things I do not know.<br>
Gaining a bit of experience with the workflow now.<br>
I have the basics in hand. I know what I want to look up.<br>
So check problem, work a bit, look up, try, fail, repeat, gain incremental success, work some more.<br>
Love the feedback loop too.<br>
With other stuff I try, I have to wait days, weeks, months.<br>
Here, it’s immediate.</p>
<p>Beginning to love the work, as I get more familiar with it.<br>
Tomorrow is another day :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 021 - Swing and a miss</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-021-swing-and-a-miss/</link>
      <pubDate>Wed, 29 Jul 2020 18:06:35 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-021-swing-and-a-miss/</guid>
      <description>&lt;p&gt;Only did about an hour of distracted work and exercises today.&lt;br&gt;
I’ll still count it though.&lt;/p&gt;
&lt;p&gt;Tomorrow is another day :)&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Only did about an hour of distracted work and exercises today.<br>
I’ll still count it though.</p>
<p>Tomorrow is another day :)</p>
]]></content:encoded>
    </item>
    <item>
      <title>A Hundred Days of Code, Day 020 - Setting up an Editor for Python Development</title>
      <link>https://janusworx.com/work/a-hundred-days-of-code-day-020-setting-up-an-editor-for-python-development/</link>
      <pubDate>Tue, 28 Jul 2020 17:29:08 +0530</pubDate>
      <guid>https://janusworx.com/work/a-hundred-days-of-code-day-020-setting-up-an-editor-for-python-development/</guid>
      <description>&lt;p&gt;Had given myself a day, to see if I could get a good Python development environment using Elpy and Emacs.&lt;br&gt;
It &lt;em&gt;does&lt;/em&gt; work.&lt;br&gt;
Just not well enough for me.&lt;br&gt;
At the end of the day today, I was happy I learnt so much about Emacs.&lt;br&gt;
But that is not my focus right now. Python is.&lt;br&gt;
Emacs knowledge can come slowly and organically.&lt;/p&gt;
&lt;p&gt;So I have kept Emacs as my regular editor for nearly everything text.&lt;br&gt;
And switched to the community edition of Pycharm for all my Python projects.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Had given myself a day, to see if I could get a good Python development environment using Elpy and Emacs.<br>
It <em>does</em> work.<br>
Just not well enough for me.<br>
At the end of the day today, I was happy I learnt so much about Emacs.<br>
But that is not my focus right now. Python is.<br>
Emacs knowledge can come slowly and organically.</p>
<p>So I have kept Emacs as my regular editor for nearly everything text.<br>
And switched to the community edition of Pycharm for all my Python projects.</p>
<p>I am also grateful to all of you, who gave me problems to practice on.<br>
These will help me grow.</p>
<hr>
]]></content:encoded>
    </item>
  </channel>
</rss>
