<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://ramvasuthevan.ca/feed/bitsbipsbricks.xml" rel="self" type="application/atom+xml" /><link href="https://ramvasuthevan.ca/" rel="alternate" type="text/html" /><updated>2026-03-08T17:50:20+00:00</updated><id>https://ramvasuthevan.ca/feed/bitsbipsbricks.xml</id><title type="html">Ram’s Personal Website | Bitsbipsbricks</title><subtitle>Built by Ram Vasuthevan with ❤️ on the [shoulders of giants](/acknowledgements.html)</subtitle><entry><title type="html">Export Most of Your Data from Todoist with Nushell</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Todoist-Export-Nushell" rel="alternate" type="text/html" title="Export Most of Your Data from Todoist with Nushell" /><published>2025-02-20T00:00:00+00:00</published><updated>2025-02-20T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/2025-02-20-todoist-export</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Todoist-Export-Nushell"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Todoist-Export-Nushell/todoist-export-nushell.png" alt="Todoist Export Nushell" />
    <div class="caption">
        

    </div>
</div>

<p><strong>Editor’s Note: Fixed some typos and the list numbering not working. See <a href="https://github.com/RamVasuthevan/Personal-Website/pull/477/files">diff</a></strong></p>

<p>I have recently changed how I use Todoist, but before doing so, I exported all (okay, I think it was more like most of) my data.</p>

<p>Since I exported all of my data once, I now want to export and back up my Todoist data regularly.</p>

<p>Here is how to get most of your data from Todoist using Nushell:</p>

<p>I’m going to assume you have Nushell installed. If not, install <a href="https://www.nushell.sh/book/installation">Nushell</a>.</p>

<p>I would probably recommend doing so in Homebrew:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>brew install nushell
</code></pre></div></div>

<p>But I’m not sure, because I installed Nushell before I realized I should be installing as much of my software through a package manager as possible.</p>

<ol>
  <li>
    <p>Get your API key from <a href="https://app.todoist.com/app/settings/integrations/developer">Todoist</a>.</p>

    <p>Be aware that this API key has, as far as I can tell, admin-level permissions for your Todoist account.</p>

    <p>Whatever you can do through the GUI, the API key allows you authorization to do. You can
 only have 1 API key at a time. You can’t restrict the API key in any way.</p>

    <p>You can revoke the API key by clicking the <code class="language-plaintext highlighter-rouge">Issue a new API token</code> button (on the <a href="https://app.todoist.com/app/settings/integrations/developer">same page</a>). But that is going to log you out of all Todoist sessions, which is super annoying if you are logged into Todoist in Chrome, your phone and have a bunch of scripts and widgets using that API key.</p>
  </li>
  <li>
    <p>Set the API key as the <code class="language-plaintext highlighter-rouge">TODOIST_API_TOKEN</code> environment variable</p>
  </li>
  <li>
    <p>Copy <a href="/assets/bitsbipsbricks/Todoist-Export-Nushell/sync.nu">this</a> in as <code class="language-plaintext highlighter-rouge">sync.nu</code>:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> #! /usr/bin/env nu

 use std log

 const COMPLETED_TASKS_MAX_LIMIT = 200
 const ARCHIVED_SECTIONS_MAX_LIMIT = 100

 def get-sync-data [] {
     log info "Getting sync data"
     let result = http post --headers [ "Authorization" $"Bearer ($env.TODOIST_API_TOKEN)" ] --content-type "application/x-www-form-urlencoded" https://api.todoist.com/sync/v9/sync { sync_token: "*", resource_types: '["all"]' }
     $result
 }

 def get-completed-tasks-with-offset [offset: int] {
     log info $"Getting completed tasks with offset: ($offset)"
     const annotate_notes = true
     const annotate_items = true
     const limit = $COMPLETED_TASKS_MAX_LIMIT
     let url = $"https://api.todoist.com/sync/v9/completed/get_all?limit=($limit)&amp;annotate_notes=($annotate_notes)&amp;annotate_items=($annotate_items)&amp;offset=($offset)"

     let result = http post --headers [ "Authorization" $"Bearer ($env.TODOIST_API_TOKEN)" ] --content-type "application/x-www-form-urlencoded" $url { sync_token: "*", resource_types: '["all"]' }
        
     $result
 }

 def get-completed-tasks [] {
     mut results = []
     mut offset = 0

     while true {
         let result = get-completed-tasks-with-offset $offset
         $results = $results | append $result
         $offset += $COMPLETED_TASKS_MAX_LIMIT

         if ($result | get items | is-empty) {
             break
         }
     }

     $results
 }

 def get-stats [] {
     log info "Getting stats"
     let result = http get --headers [ "Authorization" $"Bearer ($env.TODOIST_API_TOKEN)" ] https://api.todoist.com/sync/v9/completed/get_stats
     $result
 }
</code></pre></div>    </div>
  </li>
  <li>
    <p>Copy <a href="/assets/bitsbipsbricks/Todoist-Export-Nushell/runner.nu">this</a> in as <code class="language-plaintext highlighter-rouge">runner.nu</code>:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> #! /usr/bin/env nu

 const RFC3339_FORMAT = "%Y-%m-%dT%H:%M:%S%z"

 source ./sync.nu


 let sync_data = get-sync-data
 let completed_tasks = get-completed-tasks
 let completed_tasks_stats = get-stats


 let endpoints = {
     "sync": $sync_data,
     "completed/get_all": $completed_tasks,
     "completed/get_stats": $completed_tasks_stats
 }

 let metadata = {
 "created_at": (date now | format date $RFC3339_FORMAT),
 }

 let result =  {endpoints: $endpoints, metadata: $metadata}


 $result | save -f todoist-export.json
</code></pre></div>    </div>
  </li>
  <li>
    <p>Run <code class="language-plaintext highlighter-rouge">nu runner.nu</code> in your terminal.</p>

    <p>You should get a file called <code class="language-plaintext highlighter-rouge">todoist-export.json</code> in the same directory as the script.</p>
  </li>
</ol>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Todoist-Export-Nushell/todoist-export-nushell.png" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Todoist-Export-Nushell/todoist-export-nushell.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Maybe Coming Soon: Daily Plaintext Todo</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Daily-Plaintext-Todo" rel="alternate" type="text/html" title="Maybe Coming Soon: Daily Plaintext Todo" /><published>2025-01-07T00:00:00+00:00</published><updated>2025-01-07T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/daily-plaintext-todo</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Daily-Plaintext-Todo"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Daily-Plaintext-Todo/maybe_coming_soon.png" alt="Maybe Coming Soon" />
    <div class="caption">
        

    </div>
</div>

<blockquote class="twitter-tweet" data-dnt="true"><p lang="en" dir="ltr">actually lemme start with something simpler: tell me about your unfinished works? what do you have that you haven&#39;t gotten around to publishing/finishing? you don&#39;t need to post the thing just tell me *about* the thing <a href="https://t.co/1bsC6BUZaz">https://t.co/1bsC6BUZaz</a></p>&mdash; Visakan Veerasamy (@visakanv) <a href="https://twitter.com/visakanv/status/1874692485374681327?ref_src=twsrc%5Etfw">January 2, 2025</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>This tweet really resonated with me. I have a dozen-plus essays rattling around in my head that I want to write—some of which I’ll actually end up writing. An essay about how I manage my daily todo list in a plaintext file feels like the lowest-hanging fruit.</p>

<blockquote class="twitter-tweet" data-dnt="true"><p lang="en" dir="ltr">An essay on managing my daily todo list in a plain text file and how I want to extend that system going forward<a href="https://t.co/3wkiyAFmeR">https://t.co/3wkiyAFmeR</a></p>&mdash; Ram Vasuthevan (12/100) (@RamVasuthevan) <a href="https://twitter.com/RamVasuthevan/status/1876709275755802883?ref_src=twsrc%5Etfw">January 7, 2025</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Daily-Plaintext-Todo/maybe_coming_soon.png" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Daily-Plaintext-Todo/maybe_coming_soon.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Colon Analogy Notation</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Colon-Analogy-Notation" rel="alternate" type="text/html" title="Colon Analogy Notation" /><published>2024-11-28T00:00:00+00:00</published><updated>2024-11-28T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Colon-Analogy-Notation</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Colon-Analogy-Notation"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Colon-Analogy-Notation/colon_analogy_notation.png" alt="A:B::C:D to represent A is to B as C is to D" width="500px" />
    <div class="caption">
        

    </div>
</div>

<p>I have been trying to find the name for this very common notation for analogies:</p>

<blockquote>
  <p>
    <strong style="font-weight: bold; color: #111;">A:B::C:D</strong> to represent <strong style="font-weight: bold; color: #111;">A is to B as C is to D</strong>
  </p>
</blockquote>

<p>I have found it helpful to query LLMs (ChatGPT 4o in my case) with questions in the format <strong>A:B::C:??</strong></p>

<p>I have tried to find the name for this notation by asking <a href="https://chatgpt.com/share/671d1380-56b8-8013-84c4-7f1ace68b6db">ChatGPT</a>, using Google Search and Google Scholar, but I have not found anything authoritative.</p>

<p>I think the name <strong>Colon Analogy Notation</strong> is a good <a href="https://en.wikipedia.org/wiki/Schelling_point">Schelling point</a>. Someone familiar with the syntax would intuitively recognize the connection upon hearing the name. Likewise, if someone knows the syntax, this might be the name they would naturally search for.</p>

<p>I would love to know if there is a preexisting name for this notation and the history of its use. But it is hard to search for something when you don’t know its name.</p>

<p>So I have written the article I would like to have found for the next searcher.</p>

<p>This <a href="/bitsbipsbricks/Jekyll-Sub-Blogs">sub-blog</a> is for posts written at a certain point in time. I don’t usually update them, but I’ll update this if I learn more.</p>

<p>If you know more, please email me (my email is in the footer) or reach out on <a href="https://twitter.com/RamVasuthevan">Twitter</a>.</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Colon-Analogy-Notation/colon_analogy_notation.png" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Colon-Analogy-Notation/colon_analogy_notation.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Maximizing, Satisficing and Perfectionism</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Maxing" rel="alternate" type="text/html" title="Maximizing, Satisficing and Perfectionism" /><published>2024-08-10T00:00:00+00:00</published><updated>2024-08-10T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Maxing</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Maxing"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Maxing/PXL_20240701_183556254.RAW-01.COVER.jpg" alt="Caffe latte on white ceramic cup beside silver and black laptop computer" width="500px" />
    <div class="caption">
        <p>Me <a href="https://streams.place/ramvasuthevan/drops/203230380562751488">experimenting</a> with my daily bagel</p>

    </div>
</div>

<p>I have always had the temperament of a satisficer. I find something that works for me, and I stick to it forever. It’s simple and easy, once I make a commitment to something, I don’t have to think about that category of thing again. I do this for <a href="https://streams.place/ramvasuthevan/drops/203230380562751488">bagels</a>, <a href="/ram-warrants#black-uni-ball-signo-um-151-gel-ink-pen---038-mm">pens</a> and IDEs. But I am starting to wonder if I am missing out by not maximizing more.</p>

<p>When thinking about new solutions, whether it be software tools, hot sauces, or notetaking apps, I become a perfectionist. I start thinking of my elaborate theoretical use cases and then become overwhelmed and actually do nothing.</p>

<p>If it’s a cheap, <a href="https://fs.blog/reversible-irreversible-decisions/">reversible decision</a>, the only real mistake is procrastinating on making a decision</p>

<p>TLDR: JUST DO IT!</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[Me experimenting with my daily bagel]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Maxing/PXL_20240701_183556254.RAW-01.COVER.jpg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Maxing/PXL_20240701_183556254.RAW-01.COVER.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Twitter Cards Images are Cached</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Twitter-Cards-Cached" rel="alternate" type="text/html" title="Twitter Cards Images are Cached" /><published>2024-07-16T00:00:00+00:00</published><updated>2024-07-16T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Twitter-Cards-Cached</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Twitter-Cards-Cached"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Twitter-Cards-Cached/replicate-prediction-ey7z80d79srgj0cgqhpvf0sw7m.png" alt="A Blue Jay generated by [sdxl](https://replicate.com/p/ey7z80d79srgj0cgqhpvf0sw7m)" width="300px" />
    <div class="caption">
        

    </div>
</div>

<p><br /></p>

<p><a href="https://x.com/search?q=%22Today%20I%20learned%22%20OR%20TIL%20from%3ARamVasuthevan&amp;src=typed_query&amp;f=top">Recently, I learned</a> in a not-so-enjoyable fashion that Twitter caches <a href="https://developer.x.com/en/docs/twitter-for-websites/cards/overview/summary-card-with-large-image">summary card images</a>.</p>

<p>While writing <a href="/bitsbipsbricks/Mastodon-Verification">Verify Jekyll Minima Sites on Mastodon</a>, I originally had a summary card image which was getting cropped poorly, so I kept the image that was being displayed at the top of the article but changed the summary card image with a wider version which got a better crop. And it showed up correctly in my preferred Twitter Card preview tool: <a href="https://www.bannerbear.com/tools/twitter-card-preview-tool/">BannerBear Twitter Card Preview Tool</a>.</p>

<div class="image-container">
    <img src="/assets/bitsbipsbricks/Twitter-Cards-Cached/Screenshot 2024-07-13 at 3.50.56 PM.png" alt="" width="300px" />
    <div class="caption">
        

    </div>
</div>

<p>But when I posted it to Twitter, the old image would show up both when I actually posted it and in the preview when I was composing it.</p>

<p><br /></p>

<div style="display: flex; align-items: flex-end; justify-content: center;">
    
    <img src="/assets/bitsbipsbricks/Twitter-Cards-Cached/Screenshot%202024-07-13%20at%202.54.40%E2%80%AFPM.png" alt="Image 1" style="width: 300px; margin-right: 5px;" />
    <img src="/assets/bitsbipsbricks/Twitter-Cards-Cached/Screenshot%202024-07-13%20at%203.50.53%E2%80%AFPM.png" alt="Image 2" style="width: 300px;" />
</div>

<p>After some frustrating troubleshooting, I found this <a href="https://devcommunity.x.com/t/twitter-summary-cards-are-they-cached/18345">support forum thread</a> that said Twitter caches summary images for about a week, and the <a href="https://cards-dev.twitter.com/validator">preview tool</a> could be used to expire the cache.</p>

<p>And while the preview tool, no longer actually shows you a preview of a tweet, it does bust the cache.</p>

<div class="image-container">
    <img src="/assets/bitsbipsbricks/Twitter-Cards-Cached/Screenshot%202024-07-13%20at%204.43.36%E2%80%AFPM.png" alt="" />
    <div class="caption">
        

    </div>
</div>

<p>Unfortunately, this type of amateurism is typical of Twitter.</p>

<p>I am not really happy with my investigation into this issue. I wonder if there is a way to accurately preview tweets with the cached images.</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Twitter-Cards-Cached/replicate-prediction-ey7z80d79srgj0cgqhpvf0sw7m.png" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Twitter-Cards-Cached/replicate-prediction-ey7z80d79srgj0cgqhpvf0sw7m.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Verify Jekyll Minima Sites on Mastodon</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Mastodon-Verification" rel="alternate" type="text/html" title="Verify Jekyll Minima Sites on Mastodon" /><published>2024-07-13T00:00:00+00:00</published><updated>2024-07-13T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Mastodon-Verification</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Mastodon-Verification"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Mastodon-Verification/mastodon-elephant-logo.webp" alt="Mastodon elephant logo" width="300px" />
    <div class="caption">
        

    </div>
</div>

<p><br /></p>

<p>On Mastodon, one way that you can prove that you are who you say you are is by verifying that you own your personal site.</p>

<p>For example, on my <a href="https://mastodon.social/@RamVasuthevan">Mastodon account</a>, I have verified that I own <a href="https://ramvasuthevan.ca">ramvasuthevan.ca</a></p>

<p>You prove that you own a page by having a link from that page to your Mastodon account with a <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel/me"><code class="language-plaintext highlighter-rouge">rel="me"</code></a> attribute.</p>

<p>The two simplest ways to verify your site:</p>

<ol>
  <li>
    <p>Adding an invisible <code class="language-plaintext highlighter-rouge">&lt;link&gt;</code> tag inside the <code class="language-plaintext highlighter-rouge">&lt;head&gt;</code> tag at the top page to the account that you’d like to be verified for:</p>

    <div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nt">&lt;link</span> <span class="na">rel=</span><span class="s">"me"</span> <span class="na">href=</span><span class="s">"https://mastodon.social/@RamVasuthevan"</span><span class="nt">&gt;</span> 
</code></pre></div>    </div>
  </li>
  <li>
    <p>By adding a hyperlink to your Mastodon profile somewhere on the page, like:</p>

    <div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nt">&lt;a</span> <span class="na">rel=</span><span class="s">"me"</span> <span class="na">href=</span><span class="s">"https://mastodon.social/@RamVasuthevan"</span><span class="nt">&gt;</span>Mastodon<span class="nt">&lt;/a&gt;</span> 
</code></pre></div>    </div>
  </li>
</ol>

<p>Unfortunately, if you add your Mastodon profile to your config file like <a href="https://github.com/jekyll/minima/tree/2.5-stable?tab=readme-ov-file#social-networks">this</a>:</p>

<figure class="highlight"><pre><code class="language-yaml" data-lang="yaml"><span class="na">mastodon</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">username</span><span class="pi">:</span> <span class="s">RamVasuthevan</span>
    <span class="na">instance</span><span class="pi">:</span> <span class="s">mastodon.social</span></code></pre></figure>

<p>Minima 2.5 does not automatically add the <code class="language-plaintext highlighter-rouge">rel=me</code> attribute to the link in the footer of your site. And there is no <a href="https://github.com/jekyll/minima/issues/696#issuecomment-1357651146">plans</a> to add automatic verification until Minima 3.</p>

<p>But you can copy the <a href="https://github.com/jekyll/minima/blob/2.5-stable/_includes/social.html">_includes/social.html</a> file and add it to your <code class="language-plaintext highlighter-rouge">_includes</code> file. And then add a <code class="language-plaintext highlighter-rouge">rel="me"</code> attribute to the a href tag for Mastodon.</p>

<p>Or you can just copy my <a href="https://github.com/RamVasuthevan/Personal-Website/blob/dd4391b0aeee65c8d03cd49cfe8f17e3d37f960b/website/_includes/social.html">version</a>.</p>

<p>After adding the link to your page, go to <a href="https://mastodon.social/settings/profile">https://mastodon.social/settings/profile</a> and add the page you want to verify as one of the extra fields.</p>

<p><br /></p>

<div class="image-container">
    <img src="/assets/bitsbipsbricks/Mastodon-Verification/Screenshot 2024-07-13 at 1.55.02 PM.png" alt="Mastodon elephant logo" width="400px" />
    <div class="caption">
        

    </div>
</div>

<p><br /></p>

<p>Your profile must be updated after adding the rel-me link to your web page. If you have added the link to your profile before, try removing the link from your profile, saving, re-adding the link, and then saving again. (See <a href="https://docs.joinmastodon.org/user/profile/#verification">documentation</a>).</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Mastodon-Verification/mastodon-elephant-logo-wider.webp" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Mastodon-Verification/mastodon-elephant-logo-wider.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Search for All Dependabot Created PRs on Your Repos</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Github-Dependabot-PRs" rel="alternate" type="text/html" title="Search for All Dependabot Created PRs on Your Repos" /><published>2024-06-29T00:00:00+00:00</published><updated>2024-06-29T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/github-dependabot-prs</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Github-Dependabot-PRs"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Github-Dependabot-PRs/nolan-issac-It0DCaCBr40-unsplash.jpg" alt="Caffe latte on white ceramic cup beside silver and black laptop computer" />
    <div class="caption">
        
<p>Photo by <a href="https://unsplash.com/@@nolanissac">Nolan Issac</a> from <a href="https://unsplash.com/photos/caffe-latte-on-white-ceramic-cup-beside-silver-and-black-laptop-computer-It0DCaCBr40">Unsplash</a></p>

    </div>
</div>

<p>In the spirit of early <a href="https://www.kalzumeus.com/2006/">patio11</a>, I’m going to write more about what I worked on, what I learned, and the problems I solved on any given day.</p>

<p>In that spirit, I have a bunch of repos with Dependabot enabled. It’s a pain in the ass to manually go to all of the repos and see if a Dependabot PR has been created.</p>

<p>Search query: <code id="search-query">is:pr author:app/dependabot is:open archived:false user:@me</code></p>

<p><a href="https://github.com/search?q=is%3Apr+author%3Aapp%2Fdependabot+is%3Aopen+archived%3Afalse+user%3A%40me&amp;type=pullrequests" target="_blank">GitHub Search for Dependabot PRs</a></p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[Photo by Nolan Issac from Unsplash]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Github-Dependabot-PRs/nolan-issac-It0DCaCBr40-unsplash.jpg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Github-Dependabot-PRs/nolan-issac-It0DCaCBr40-unsplash.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Create Jekyll Sub Blogs using only Liquid</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Jekyll-Sub-Blogs" rel="alternate" type="text/html" title="Create Jekyll Sub Blogs using only Liquid" /><published>2024-05-14T00:00:00+00:00</published><updated>2024-05-14T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Jekyll-Sub-Blogs</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Jekyll-Sub-Blogs"><![CDATA[<style>
  :not(pre) > code {
    background-color: #f4f4f4; /* Light grey background */
    color: #333; /* Darker text for better readability */
    padding: 2px 4px;
    border-radius: 4px;
  }
</style>

<div class="image-container">
    <img src="/assets/bitsbipsbricks/Jekyll-Sub-Blogs/andrew-neel-cckf4TsHAuw-unsplash.jpg" alt="Stock photo of a laptop, coffee, pen, notepad and phone" />
    <div class="caption">
        
<p>Photo by <a href="https://unsplash.com/@@andrewtneel">Andrew Neel</a> from <a href="https://unsplash.com/photos/macbook-pro-white-ceramic-mugand-black-smartphone-on-table-cckf4TsHAuw">Unsplash</a></p>

    </div>
</div>

<p>I started writing this <a href="/bitsbipsbricks.html">blog</a> in the spirit of <a href="https://www.visakanv.com/blog/do100things/">Visa’s do 100’s things</a>. The best way to become a better writer is to write. Writing and writing energy is not scarce. It’s not like you have a finite number of things you can write in your life. The more you write, the more you can write. If you write an article about an idea, it doesn’t need to be perfect. You can always write more about it later.</p>

<p>I started writing on <a href="https://ghost.org/">Ghost</a> because it was easy to set up and maintain. At first, I didn’t mention my name anywhere. Eventually, I decided to merge it with my personal site after I became more confident with my writing and so that I could gain more control over how the site looked. As an engineer, I love being able to take advantage of Git for version control, setting up my writing environment using VS Code and knowing that I can easily maintain and migrate it from Jekyll if necessary.</p>

<p>Jekyll by default puts all blog posts into one feed, but sometimes, I want to write something small, a <a href="/snippets">snippet</a>, a note mostly for myself, that doesn’t really fit in <a href="/bitsbipsbricks">Bits, Bips and Bricks</a>.</p>

<p>By taking advantage of Jekyll categories and tags you can easily have multiple sub blogs each with their own Atom feed using only Liquid.</p>

<p>A <a href="https://jekyllrb.com/docs/posts/#categories">category</a> can be defined using the front matter keys <code class="language-plaintext highlighter-rouge">category</code> or <code class="language-plaintext highlighter-rouge">categories</code> (a space separated list of categories) or putting a directory above the post’s <code class="language-plaintext highlighter-rouge">_post</code> directory with the name of the category.</p>

<p>A <a href="https://jekyllrb.com/docs/posts/#tags">tag</a> can be defined using can be defined using the front matter keys <code class="language-plaintext highlighter-rouge">tag</code> or <code class="language-plaintext highlighter-rouge">tags</code> (a space separated list of tags)</p>

<p>This snippet is built to match the style of Minma, but similar logic can be used for other themes.</p>

<p>Copy the following code and paste it in <code class="language-plaintext highlighter-rouge">_includes/blog.html</code>:</p>

<figure class="highlight"><pre><code class="language-liquid" data-lang="liquid">&lt;div class="blog"&gt;
    &lt;h2 class="post-list-heading"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">page</span><span class="p">.</span><span class="nv">list_title</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">default</span><span class="p">:</span><span class="w"> </span><span class="s2">"Posts"</span><span class="w"> </span><span class="cp">}}</span>&lt;/h2&gt;
    &lt;ul class="post-list"&gt;
      <span class="cp">{%-</span><span class="w"> </span><span class="nt">for</span><span class="w"> </span><span class="nv">post</span><span class="w"> </span><span class="nt">in</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">posts</span><span class="w"> </span><span class="cp">-%}</span>
      <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">categories</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">tags</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="cp">-%}</span>
      &lt;li&gt;
        <span class="cp">{%-</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">date_format</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">minima</span><span class="p">.</span><span class="nv">date_format</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">default</span><span class="p">:</span><span class="w"> </span><span class="s2">"%b %-d, %Y"</span><span class="w"> </span><span class="cp">-%}</span>
        &lt;span class="post-meta"&gt;<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">date</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">date</span><span class="p">:</span><span class="w"> </span><span class="nv">date_format</span><span class="w"> </span><span class="cp">}}</span>&lt;/span&gt;
        &lt;h3&gt;
          &lt;a class="post-link" href="<span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">url</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;
            <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">title</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">escape</span><span class="w"> </span><span class="cp">}}</span>
          &lt;/a&gt;
        &lt;/h3&gt;
        <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">show_excerpts</span><span class="w"> </span><span class="cp">-%}</span>
          <span class="cp">{{</span><span class="w"> </span><span class="nv">post</span><span class="p">.</span><span class="nv">excerpt</span><span class="w"> </span><span class="cp">}}</span>
        <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>
      &lt;/li&gt;
      <span class="cp">{%-</span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>
      <span class="cp">{%-</span><span class="w"> </span><span class="nt">endfor</span><span class="w"> </span><span class="cp">-%}</span>

    &lt;/ul&gt;

    <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">feed</span><span class="p">.</span><span class="nv">categories</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="cp">-%}</span>
      <span class="cp">{%</span><span class="w"> </span><span class="nt">unless</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="cp">%}</span>
      <span class="cp">{%</span><span class="w"> </span><span class="nt">assign</span><span class="w"> </span><span class="nv">feed_location</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">feed</span><span class="p">.</span><span class="nv">categories</span><span class="p">[</span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="p">].</span><span class="nv">path</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">default</span><span class="p">:</span><span class="w"> </span><span class="s1">'/feed/'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="s1">'.xml'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">%}</span>
        &lt;p class="rss-subscribe"&gt;subscribe &lt;a href="<span class="cp">{{</span><span class="w"> </span><span class="s1">'/feed/'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="s1">'.xml'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;via RSS&lt;/a&gt;&lt;/p&gt;
        <span class="cp">{%</span><span class="w"> </span><span class="nt">endunless</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>

    <span class="cp">{%-</span><span class="w"> </span><span class="nt">if</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="nv">site</span><span class="p">.</span><span class="nv">feed</span><span class="p">.</span><span class="nv">tags</span><span class="w"> </span><span class="ow">contains</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="cp">-%}</span>
    <span class="cp">{%</span><span class="w"> </span><span class="nt">unless</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">category</span><span class="w"> </span><span class="cp">%}</span>
      &lt;p class="rss-subscribe"&gt;subscribe &lt;a href="<span class="cp">{{</span><span class="w"> </span><span class="s1">'/feed/'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="nv">include</span><span class="p">.</span><span class="nv">tag</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">append</span><span class="p">:</span><span class="w"> </span><span class="s1">'.xml'</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nf">relative_url</span><span class="w"> </span><span class="cp">}}</span>"&gt;via RSS&lt;/a&gt;&lt;/p&gt;
    <span class="cp">{%</span><span class="w"> </span><span class="nt">endunless</span><span class="w"> </span><span class="cp">%}</span>
    <span class="cp">{%-</span><span class="w"> </span><span class="nt">endif</span><span class="w"> </span><span class="cp">-%}</span>

&lt;/div&gt;</code></pre></figure>

<p>The above code is available under the <a href="/assets/bitsbipsbricks/Jekyll-Sub-Blogs/license.txt">MIT license</a> and contains code from <a href="https://github.com/jekyll/minima/blob/38a84a949f9753c4542e25f422935f59b4913053/_layouts/home.html">minima/_layouts/home.html</a>
<br /></p>

<p>On the page that you want a sub blog with only posts from a certain category:</p>

<figure class="highlight"><pre><code class="language-liquid" data-lang="liquid"><span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>blog.html<span class="w"> </span><span class="na">category</span><span class="o">=</span><span class="s2">"category_name"</span><span class="w"> </span><span class="cp">%}</span></code></pre></figure>

<p>On the page that you want a sub blog with only posts with a certain tag:</p>

<figure class="highlight"><pre><code class="language-liquid" data-lang="liquid"><span class="cp">{%</span><span class="w"> </span><span class="nt">include</span><span class="w"> </span>blog.html<span class="w"> </span><span class="na">tag</span><span class="o">=</span><span class="s2">"tag_name"</span><span class="w"> </span><span class="cp">%}</span></code></pre></figure>

<p>If you don’t add a category or tag parameter, then all posts will be in the sub blog.</p>

<p><a href="https://github.com/jekyll/minima/pull/137/files#r124796175">Minima</a> assumes that if there are no posts, the feed will not be shown. I disagree, you can have a blog without blog posts.</p>

<p>Make sure to update your <em>_config.yml</em> according to the instructions for <a href="https://github.com/jekyll/jekyll-feed">jekyll-feed</a> to make sure that the feeds for your category or tag are generated.</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Jekyll-Sub-Blogs/andrew-neel-cckf4TsHAuw-unsplash.jpg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Jekyll-Sub-Blogs/andrew-neel-cckf4TsHAuw-unsplash.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">A Bit of a Sabbatical: Time for More Focus</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Focus" rel="alternate" type="text/html" title="A Bit of a Sabbatical: Time for More Focus" /><published>2023-11-25T00:00:00+00:00</published><updated>2023-11-25T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/A%20Bit-of-a-Sabbatical-Time-for-More-Focus</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Focus"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Focus/patrick-tomasso-61MtRBl1qeE-unsplash.jpg" alt="Toronto Buildings In Fog" />
    <div class="caption">
        
<p>Photo by <a href="https://unsplash.com/@impatrickt">Patrick Tomasso</a> from <a href="https://unsplash.com/photos/high-rise-buildings-covered-with-fog-61MtRBl1qeE">Unsplash</a></p>

    </div>
</div>

<p><strong>Editor’s Note: This was written in early November and my views have changed a bit, but I’ve decided to post this now for posterity</strong></p>

<p>The last 12 weeks have been great. It helped me figure out what to do with my life:</p>

<p><em>I am a software engineer on sabbatical. I am working on applying technology to real estate in Toronto.</em></p>

<p>But my sabbatical is constrained by money and and thus constrained by time. It’s now time for focus.</p>

<p>Projects which will be focusing on:</p>

<ol>
  <li>Lobbying in Toronto
    <ul>
      <li>Build a great way to search and visualize data published by the <a href="https://www.toronto.ca/city-government/accountability-operations-customer-service/accountability-officers/lobbyist-registrar/search-the-registry-register-as-a-lobbyist/search-the-lobbyist-registry/">City of Toronto’s Lobbyist Registrar</a></li>
    </ul>
  </li>
  <li>TRREB MLS Search Engine
    <ul>
      <li>Build a <a href="https://en.wikipedia.org/wiki/Virtual_Office_Website">Virtual Office Website
</a> for TRREB’s MLS to make it easier for Realtor and their clients to search for properties in Toronto</li>
    </ul>
  </li>
  <li>Open Map of Toronto
    <ul>
      <li>Combine open data sources to create a better view of Toronto. Definitely <a href="https://open.toronto.ca/dataset/property-boundaries/">Property Boundaries</a> and <a href="https://open.toronto.ca/dataset/address-points-municipal-toronto-one-address-repository/">Address Points (Municipal) - Toronto One Address Repository
</a>, plus some more data from the <a href="https://open.toronto.ca/">City of Toronto’s Open Data Portal</a> and other data sources</li>
    </ul>
  </li>
  <li>Bits, Bips and Bricks
    <ul>
      <li>Write more regularly and about more topics</li>
      <li>The vibe that I am going for:</li>
    </ul>
    <blockquote class="twitter-tweet"><p lang="en" dir="ltr">I really like this. It&#39;s helpful in getting over the little voice in my head that says &quot;It&#39;s not as good as the writers you admire&quot; <a href="https://t.co/h0HzKUrQSm">https://t.co/h0HzKUrQSm</a></p>&mdash; Ram Vasuthevan (in SF Oct 31 - Nov 7) (@RamVasuthevan) <a href="https://twitter.com/RamVasuthevan/status/1684079350050881536?ref_src=twsrc%5Etfw">July 26, 2023</a></blockquote>
    <script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
  </li>
</ol>

<p>I will also work on side projects, especially if they align with my goal of applying technology to real estate but it is now time to impose a discipline on myself.</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[Photo by Patrick Tomasso from Unsplash]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Focus/mwangi-gatheca-qlKaN7eqay8-unsplash.jpg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Focus/mwangi-gatheca-qlKaN7eqay8-unsplash.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Felt Feels like Magic</title><link href="https://ramvasuthevan.ca/bitsbipsbricks/Felt-Magic" rel="alternate" type="text/html" title="Felt Feels like Magic" /><published>2023-09-13T00:00:00+00:00</published><updated>2023-09-13T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/bitsbipsbricks/Felt-Magic</id><content type="html" xml:base="https://ramvasuthevan.ca/bitsbipsbricks/Felt-Magic"><![CDATA[<div class="image-container">
    <img src="/assets/bitsbipsbricks/Felt-Magic/francesca-saraco-u8DiM00gIR8-unsplash.jpg" alt="Descriptive Alt Text" />
    <div class="caption">
        
<p>Photo by <a href="https://unsplash.com/@fransaraco">Francesca Saraco</a> from <a href="https://unsplash.com/photos/u8DiM00gIR8">Unsplash</a></p>

    </div>
</div>

<p><strong>Editor’s Note: Here is the link to the <a href="https://felt.com/map/Toronto-Property-Boundaries-Blog-Post-2023-08-29-Felt-Feels-like-Magic-copy-n0X6GPVNTjWv6keVeffKRD?loc=43.62012,-79.36888,13.6z&amp;share=1">map</a>. Embedding maps now requires the “Talk to Sales” Enterprise tier.</strong></p>

<p>I just started using <a href="https://felt.com/">Felt</a>. The best way to describe it is it feels like magic.
I have been thinking about side projects involving creating maps or using geospatial data for a while, but I’ve procrastinated on learning Mapbox or QGIS. And I’ve spent way too much time trying to install SpatiaLite on a Windows Laptop.</p>

<p>No coding involved. I just dragged the two Shapefiles (<a href="https://open.toronto.ca/dataset/property-boundaries/">Property Boundaries</a> and <a href="https://open.toronto.ca/dataset/address-points-municipal-toronto-one-address-repository/">Address Points (Municipal) - Toronto One Address Repository</a>) from the Toronto Open Data Portal on, and the map appeared. I then added the Felt’s preexisting building footprint layer. It was then easy to quickly add colouring by category. And even better (unlike some other tools), there is a working search bar so that you can look up parcels at an address.</p>

<p>In general, I like open tools so that I can have more control over the output and be confident that the publisher won’t stop supporting the tool in a couple of years. But I value velocity more than everything else. (If you’re reading this ten years from now, you’ll know how it worked out).</p>

<p>It didn’t take me that long to start seeing interesting things near the water, on Algonquin Island, near my home, etc.
However, I need to work on my styling.</p>]]></content><author><name></name></author><category term="bitsbipsbricks" /><summary type="html"><![CDATA[Photo by Francesca Saraco from Unsplash]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Felt-Magic/francesca-saraco-u8DiM00gIR8-unsplash.jpg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/bitsbipsbricks/Felt-Magic/francesca-saraco-u8DiM00gIR8-unsplash.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>