<?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.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.xml</id><title type="html">Ram’s Personal Website</title><subtitle>Built by Ram Vasuthevan with ❤️ on the [shoulders of giants](/acknowledgements.html)</subtitle><entry><title type="html">US Election Vote Share by Race</title><link href="https://ramvasuthevan.ca/snippets/us-election-vote-share-by-race" rel="alternate" type="text/html" title="US Election Vote Share by Race" /><published>2025-08-23T00:00:00+00:00</published><updated>2025-08-23T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/snippets/us-election-vote-share-by-race</id><content type="html" xml:base="https://ramvasuthevan.ca/snippets/us-election-vote-share-by-race"><![CDATA[<div class="image-container">
    <img src="/assets/snippets/2025-08-23-us-election-vote-share-by-race/dem-chart.png" alt="US election vote share by race" />
    <div class="caption">
        <p>US election vote share by race for the 2016, 2020, and 2024 presidential elections</p>

    </div>
</div>

<p>Racial polarization in the US presidential election vote share has decreased since 2016.</p>

<p>Democrats have lost voter share among Black, Hispanic, and Asian voters between the 2016 and 2024 presidential elections, but gained voter share among White voters.</p>

<p>Conversely, Trump has gained voter share among Black, Hispanic, and Asian voters between the 2016 and 2024 presidential elections.</p>

<div class="image-container">
    <img src="/assets/snippets/2025-08-23-us-election-vote-share-by-race/rep-chart.png" alt="US election vote share by race" />
    <div class="caption">
        <p>US election vote share by race for the 2016, 2020, and 2024 presidential elections</p>

    </div>
</div>

<p>Based on data from the <a href="https://docs.google.com/spreadsheets/d/1JczVvbrlxkLiYYiNPSv0TRlWsbvYEihkZrnH1kQXIH8/edit">Pew Research Center</a>:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Race</th>
      <th style="text-align: left">2016_Dem</th>
      <th style="text-align: left">2016_Rep</th>
      <th style="text-align: right">2020_Dem</th>
      <th style="text-align: right">2020_Rep</th>
      <th style="text-align: right">2024_Dem</th>
      <th style="text-align: right">2024_Rep</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">White</td>
      <td style="text-align: left">39</td>
      <td style="text-align: left">54</td>
      <td style="text-align: right">43</td>
      <td style="text-align: right">55</td>
      <td style="text-align: right">43</td>
      <td style="text-align: right">55</td>
    </tr>
    <tr>
      <td style="text-align: left">Black</td>
      <td style="text-align: left">91</td>
      <td style="text-align: left">6</td>
      <td style="text-align: right">92</td>
      <td style="text-align: right">8</td>
      <td style="text-align: right">83</td>
      <td style="text-align: right">15</td>
    </tr>
    <tr>
      <td style="text-align: left">Hispanic</td>
      <td style="text-align: left">66</td>
      <td style="text-align: left">28</td>
      <td style="text-align: right">61</td>
      <td style="text-align: right">36</td>
      <td style="text-align: right">51</td>
      <td style="text-align: right">48</td>
    </tr>
    <tr>
      <td style="text-align: left">Asian*</td>
      <td style="text-align: left">-</td>
      <td style="text-align: left">-</td>
      <td style="text-align: right">70</td>
      <td style="text-align: right">30</td>
      <td style="text-align: right">57</td>
      <td style="text-align: right">40</td>
    </tr>
  </tbody>
</table>]]></content><author><name></name></author><category term="snippets" /><summary type="html"><![CDATA[US election vote share by race for the 2016, 2020, and 2024 presidential elections]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/snippets/2025-08-23-us-election-vote-share-by-race/dem-chart.png" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/snippets/2025-08-23-us-election-vote-share-by-race/dem-chart.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><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">U of T Law School Courses Related to Real Estate</title><link href="https://ramvasuthevan.ca/snippets/UofT-Real-Estate" rel="alternate" type="text/html" title="U of T Law School Courses Related to Real Estate" /><published>2024-03-20T00:00:00+00:00</published><updated>2024-03-20T00:00:00+00:00</updated><id>https://ramvasuthevan.ca/snippets/UofT-Real-Estate</id><content type="html" xml:base="https://ramvasuthevan.ca/snippets/UofT-Real-Estate"><![CDATA[<div class="image-container">
    <img src="/assets/snippets/UofT-Real-Estate/Flavellelaw.jpeg" alt="Flavelle House at the Faculty of Law" />
    <div class="caption">
        <p>Photo of <a href="https://en.wikipedia.org/wiki/University_of_Toronto_Faculty_of_Law#Flavelle_House">Flavelle House</a> at the Faculty of Law by <a href="https://en.wikipedia.org/wiki/File:Flavellelaw.JPG">Chensiyuan/Wikipedia</a></p>

    </div>
</div>

<p>On the <a href="https://web.archive.org/web/20240217124159/https://www.law.utoronto.ca/academic-programs/course-calendar">2023-2024 U of T Law School Course List</a>, there seems to be 3 course related to real esate:</p>
<ul>
  <li><a href="https://www.law.utoronto.ca/course/2023-2024/blueprints-buildings-legal-issues-in-construction-industry">From Blueprints to Buildings: Legal Issues in the Construction Industry (LAW306H1F)</a>
    <ul>
      <li>Instructor Michael Valo is the co-author of a chapter in “Review of Construction Law: Recent Developments” about Building Information Modeling (Toronto: Carswell, 2012), and of the chapter “Sustainable Construction” in “Modern Legal Landscape of Design Professional Practice” (Toronto: Carswell, 2023).</li>
    </ul>
  </li>
  <li><a href="https://www.law.utoronto.ca/course/2023-2024/real-estate-law">Real Estate Law (LAW275H1F)</a>
    <ul>
      <li>Instructor David Carter is the Co-author of Real Estate Transaction 2nd Edition</li>
    </ul>
  </li>
  <li><a href="https://www.law.utoronto.ca/course/2023-2024/community-planning-problems-in-urban-policy-and-land-use-regulation">Community Planning: Problems in Urban Policy and Land Use Regulation (LAW224H1S)</a>
    <ul>
      <li>Instructor Arnold Weinrib is the Editor-in-Chief of the Land Compensation Reports</li>
    </ul>
  </li>
</ul>]]></content><author><name></name></author><category term="snippets" /><summary type="html"><![CDATA[Photo of Flavelle House at the Faculty of Law by Chensiyuan/Wikipedia]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ramvasuthevan.ca/assets/snippets/UofT-Real-Estate/Flavellelaw.jpeg" /><media:content medium="image" url="https://ramvasuthevan.ca/assets/snippets/UofT-Real-Estate/Flavellelaw.jpeg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>