<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 
  xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sridhar's Weekly updates</title>
    <link>https://sridhar.co/weekly-updates</link>
    <description>Sridhar's weekly update.</description>
    <pubDate>Tue, 13 Dec 2022 08:12:58 GMT</pubDate>
    <image>
      <url>https://sridhar.co/avatar.png</url>
      <title>Sridhar Raj Sampath Kumar</title>
      <link>https://sridhar.co</link>
    </image>
    <item>
      <title>Commonplace: A static site for the quotes I keep</title>
      <description>
        <![CDATA[<p>
    I collect quotes that resonated with me when reading books, listening to podcasts, or watching videos in respective
    md file - <code>quote-money.md</code>, <code>quote-work.md</code>,
    <code>quote-health.md</code>, <code>quote-life.md</code>.
</p><p>After collecting over 250+ quotes, I'm seeing following problem emerge</p><ul><li>
        Since I was using markdown there was no way cross reference category, if the quote span across multiple
        categories. For a short time, using tags solved the problem, but it was not ideal for listing quote by tag.
    </li><li>
        Reading by tag/author is simply not possible.
    </li><li>
        No randomness: I wanted to see one of my collected quote randomly.
    </li></ul><p>
    While brainstorming with Claude, I learnt there's a name for what I was doing. People call it a
    <a href="https://en.wikipedia.org/wiki/Commonplace_book" rel="nofollow">commonplace book</a>, a personal notebook of
    quotes and ideas worth keeping. So I built an online version of it -
    <a href="https://sridharrajs.github.io/commonplace/">Sridhar's commonplace</a>.
</p><h2 class="weekly-heading">Design choices</h2><p>
    I made only two design choices for this project.
</p><ul><li>
        Quotes are full of quote marks, and escaping every one of them in JSON is painful. YAML needs no escaping, and
        its multi-line support keeps long quotes readable. So, I chose YAML over JSON. Each quote is a YAML object with
        three fields: <code>text</code>, <code>author</code>, and <code>tags</code>.
        <link type="text/css" href="/styles/prism.css" rel="stylesheet" /><script src="/scripts/prism.js"></script><pre><code class="language-yaml">- text: |
    Be curious. Read widely. Try new things.
    What people call intelligence just boils down to curiosity.
  author: Aaron Swartz
  tags: [curiosity]</code></pre></li><li>
        There should be NO database and NO server. Each category can have its own YAML file to be backward compatible.
    </li></ul><h2 class="weekly-heading">Commonplace</h2><p>
    I wrote a neat little Python utility script to turn these yaml files into a static website. 
    Every time I push to GitHub, GitHub Actions builds the site and publishes it on GitHub Pages for free.
</p><div style="padding: 2rem 0 2rem;" class="image-container"><a href="https://sridharrajs.github.io/commonplace/"><img alt="Home page of Sridhar's commonplace, showing a random quote, categories, tags and authors"
             class="responsive drop-shadow" src="/images/commonplace.png" /></a></div><p>URL: <a href="https://sridharrajs.github.io/commonplace/">https://sridharrajs.github.io/commonplace</a></p><p>
    Each Category/Author/tag has its own page with associated quotes. The home page shows a random quote, and the <code><em>Surprise me</em></code> button
    shuffles to the next.
</p><p>
    So far, I've moved 53 of my 250+ quotes, and the rest are work in progress. Meanwhile, if you keep quotes too,
    <a href="https://github.com/sridharrajs/commonplace" rel="nofollow">fork commonplace</a> and start your own.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/commonplace</link>
      <guid>https://sridhar.co/weekly-updates/commonplace</guid>
      <pubDate>Thu, 01 Oct 2026 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Enabling Dropbox on Kobo clara</title>
      <description>
        <![CDATA[<p>
    The Kobo Clara 2024 model doesn't natively support Dropbox integration. We need to install
    <a href="https://pgaskin.net/NickelMenu/" rel="nofollow">NickelMenu</a>, a third party plugin to enable it.
</p><div style="padding: 2rem 0 2rem;" class='image-container'><img alt="Enabling dropbox on kobo clara ebook reader"
        class="responsive"
    src="/images/enabling-dropbox-on-kobo.png" /></div><p>
    Follow these steps to enable Dropbox on your Kobo eReader:
</p><ul><li><strong>Install NickelMenu:</strong> Connect the device via USB cable. Download <a
            href="https://pgaskin.net/NickelMenu/" rel="nofollow">NickelMenu</a> and extract the files and copy the
        nickelmenu folder into the
        <code>.kobo</code> folder.
        After copying, restart the device.
    </li><li>Connect the device again, you can see <code>nickelmenu</code> or <code>nm</code> present within
        <code>.adds</code> folder.
    </li><li>
        Open the <code>nickelmenu.cfg</code> file within it and add the following line:
        <link type="text/css" href="/styles/prism.css" rel="stylesheet" /><script src="/scripts/prism.js"></script><code class="yaml"><pre>menu_item:main:Dropbox:nickel_open:library:dropbox</pre></code>
        If you don't find it, create a new file named <code>config.txt</code> and add the above line.

    </li><li>
        Save the changes, eject your Kobo.
    </li><li>
        Connect the device again. Go to <code>.kobo/Kobo</code> and open the <code>Kobo eReader.conf</code> file.
    </li><li>
        Find <code>[FeatureSettings]</code> section, if it doesn’t exist, create it. <br> Add the following sections. <br><code class="yaml">
           dropbox_link_account_poll=https://authorize.kobo.com/{region}/{language}/LinkDropbox <br>
           kobo_dropbox_link_account_enabled=True
        </code></li></ul><p>
    Now, Dropbox will be available in the menu. You can link your account and access your files directly from the Kobo
    eReader.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/enabling-dropbox-on-kobo</link>
      <guid>https://sridhar.co/weekly-updates/enabling-dropbox-on-kobo</guid>
      <pubDate>Sat, 16 Aug 2025 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Regex route filtering in chrome</title>
      <description>
        <![CDATA[<p>
    While working on a project, I found myself needing to filter out multiple routes in Chrome DevTools. Instead of manually entering each route, I discovered a neat trick using regular expressions (regex) to match multiple paths at once.
</p><div class="main"><div class="image-container"><img alt="regex pattern" height="100px" class="responsive" src="/images/browser-regex-pattern.png"/></div></div><p><pre><code class="language-js">
        /app|log|create|ping|graphql/ domain:*.google.com
    </code></pre></p><p>
    This pattern matches any of the following paths under google.com:
    <ul><li><code>/app</code></li><li><code>/log</code></li><li><code>/create</code></li><li><code>/ping</code></li><li><code>/graphql</code></li></ul></p><p>
    You can also make it case-insensitive by adding the <code>i</code> flag at the end of the regex pattern:    
    <code>
        /app|log|create|ping|graphql/i domain:*.google.com
    </code></p><link type="text/css" href="/styles/prism.css" rel="stylesheet" /><script src="/scripts/prism.js"></script>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/regex-route-filtering-chrome</link>
      <guid>https://sridhar.co/weekly-updates/regex-route-filtering-chrome</guid>
      <pubDate>Mon, 09 Jun 2025 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>20-Year Software and Exploring .vimrc Configs for File Opening, Syntax, and Search Highlighting</title>
      <description>
        <![CDATA[<h2 class="weekly-heading">Books and Links</h2><p>Completed <strong>The Intelligent Investor</strong>, this will be the 2nd book for the year.</p><p>
    When I wrote <a href="/year-2023-in-review">2023 year end review</a>, I had <code>7425</code> bookmarks, now Its
    <code>6629</code> - a <code>10%</code> reduction.
</p><p>Gmail is now 20 years old. Though I
    <a href="/my-toolbox">use many software</a>, the following are the list of software that I use almost 
    <em>everyday</em>, which are in the same league.
</p><ul><li>Python: 33 years</li><li>Vim: 32 years</li><li>Debian: 30 years</li><li>JavaScript: 28 years</li><li>VLC player: 23 years</li><li>Firefox: 19 years</li><li>Git: 19 years</li><li>Android: 15 years</li></ul><p>
    It takes at least <a rel="nofollow"
        href="https://www.joelonsoftware.com/2001/07/21/good-software-takes-ten-years-get-used-to-it/">10 years
        to make a good software</a>.
</p><p>
    JavaScript, which wasn't even invented when I was born, is what pays my bills now. Who knows what the
    future
    holds? Learning and adopting new technology is the only way to be relevant in the future.
</p><h2 class="weekly-heading">Vim</h2><p>
    There are two things.
</p><ol><li>Vim, the editor</li><li>Vim motions</li></ol><p>
    The easiest way to use Vim is to master the motions and practise before jumping right into using Vim, the editor.
    The next step is to start customizing the <code>.vimrc</code>, the Vim config file, as needed.
    Let's see some of the changes I made to my
    <a href="https://github.com/sridharrajs/dotfiles/blob/master/.vimrc" rel="nofollow">
        .vimrc</a> file.
</p><link type="text/css" href="/styles/prism.css" rel="stylesheet" /><script src="/scripts/prism.js"></script><script src="/scripts/prism.vim.js"></script><p>
    First, some basics: let's disable the <code>nocompatible</code>, disable swap and back file creation, show title and status line, highlight the cursor line and set encoding.
</p><pre><code class="language-vim">
    set nocompatible
    set nobackup
    set noswapfile
    set history=1000
    set encoding=UTF-8

    set title
    set ls=2
    set cursorline
</code></pre><p><section>
    Let's display the line numbers on the gutter by default. <code>relativenumber</code> will be helpful for jumping from
    bottom to top.
    </p><pre><code class="language-vim">
    set relativenumber
    set number
</code></pre></section><section><p>
    Let's configure the search to search incrementally highlighting the matching characters we type and wrap around once
    we reach the end of file.
</p><pre><code class="language-vim">
    set nowrap
    set ignorecase
    set smartcase
    set showmatch
    set hlsearch
    set incsearch
    set wrapscan
</code></pre></section><section><p>
    Let's now enable syntax for languages, add editor config and set colour code.
</p><pre><code class="language-vim">
    syntax on

    filetype on
    filetype plugin on 
    filetype indent on 

    call plug#begin()
        Plug 'doums/darcula'
        Plug 'editorconfig/editorconfig-vim' "EditorConfigReload to reload configs
    call plug#end()

    colorscheme darcula "enable darcula theme, the closet to webstorm dark theme
</code></pre></section><section><p>
    Next, we need to start opening files in Vim. 
</p><pre><code class="language-vim">
    call plug#begin()
            Plug 'ctrlpvim/ctrlp.vim'
    call plug#end()

    let g:ctrlp_map = '&lt;space>&lt;space>' " use double spaces instead of ⌘P
    let g:ctrlp_cmd = 'CtrlP'

    " auto completion for fuzzy matching
    set wildmenu
    set wildmode=list:longest
    set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx
</code></pre></section><section><p>
    Porting some of the utility I use in VScode.
</p><pre><code class="language-vim">
 
    " moving lines up/down
    nnoremap &lt;S-k&gt; :m -2&lt;CR&gt;
    nnoremap &lt;S-j&gt; :m +1&lt;CR&gt;
</code></pre></section><section><p>
    And finally, some Vim specific tweaks
</p><pre><code class="language-vim">
    " change block cursor when in insert mode
    let &t_SI = "\&lt;Esc&gt;]50;CursorShape=1\x7"
    let &t_SR = "\&lt;Esc&gt;]50;CursorShape=2\x7"
    let &t_EI = "\&lt;Esc&gt;]50;CursorShape=0\x7"
    
    set ttimeout
    set ttimeoutlen=1
    set listchars=tab:>-,trail:~,extends:>,precedes:<,space:.
    set ttyfast

    " disable arrow keys
    for key in ['&lt;Up&gt;', '&lt;Down&gt;', '&lt;Left&gt;', '&lt;Right&gt;']
        exec 'noremap' key '&lt;Nop&gt;'
        exec 'cnoremap' key '&lt;Nop&gt;'
    endfor
</code></pre></section><p>
    To check my current <code>.vimrc</code> configs, head over to <a rel="nofollow"
        href="https://github.com/sridharrajs/dotfiles/blob/master/.vimrc">sridharrajs/dotfiles/blob/master/.vimrc</a></p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/20-year-software-vimrc-syntax-highlighting</link>
      <guid>https://sridhar.co/weekly-updates/20-year-software-vimrc-syntax-highlighting</guid>
      <pubDate>Thu, 30 May 2024 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Weeklies season 2</title>
      <description>
        <![CDATA[<p>
    I learnt that you need a <a href="/year-2022-in-review#health">systematic</a> approach to pursue your interests without burning
    out. And the best way to design a system is through defining boundary and rules. So, I choose 2 simple rules and a
    boundary condition to begin with.
</p><ul><li><strong>Rule 1</strong>: I should publish for a year, aka 52 weeks.</li><li><strong>Rule 2</strong>: I should mention the week number on the title to factor in the missing weeks.</li><li><strong>Boundary</strong>: Never spend more than 1 hour per day: for all book reading and tinkering with side projects.</li></ul><p>
    Looking back, the <a href="https://twitter.com/sridharrajs/status/1541696060925415424">version 1</a> of the experiment
    was sucessful. I
    <a href="/weekly-updates/week-27">read 7 books, worked on 4 side projects, and answered
    5 questions on stackoverflow</a>.
</p><p>Now, for this year, I want to tweak rule #1. I'm changing the frequency from <em>weekly</em> to publishing when
    <em>ready</em>. The rest will stay the same. Let's see how weeklies season 2 goes!
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/weeklies-season-2</link>
      <guid>https://sridhar.co/weekly-updates/weeklies-season-2</guid>
      <pubDate>Mon, 15 Apr 2024 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 54: My podcast roll and ignoring localhost in google analytics</title>
      <description>
        <![CDATA[<p>
    In <a href="/weekly-updates/week-53">week 53</a>, I said I was looking for a podcast transcription service. Curious people asked what those
    podcasts were. So, here is the list.
</p><ul><li><a href="https://open.spotify.com/show/58g95EqsrSk5ViIl3wGDzo" rel="noopener noreferrer nofollow">Naallanaa Murukku - The RJ Balaji Podcast</a
        >: I've been listening to this podcast since Season One. If you understand Tamil, I highly recommend this. Since this is a Spotify exclusive,
        you can listen to it only on Spotify.
    </li><li><a href="https://softskills.audio/" rel="noopener noreferrer nofollow">Soft Skills Engineering</a>: Listening to this podcast for 5+ years. If
        you're working in tech, you must listen to this podcast.
    </li><li><a href="https://open.spotify.com/show/2l01lGyIh9xodneIV37dD3" rel="noopener noreferrer nofollow">The Morgan Housel Podcast</a>: I've been
        listening to this podcast since its inception.
    </li></ul><p>Other than these, I listen to a few podcasts based on the episode title.</p><h2 class="weekly-heading">Reading</h2><p>I started reading <strong>Outlive: The Science and Art of Longevity</strong>.</p><h2 class="weekly-heading">Fixing Google Analytics</h2><p>
    By default, google analytics will record analytics for all events irrespective of the domain. But this can be problematic since tracking
    <code>localhost</code> will add more noise to the analytics. The solution for this is to ignore the analytics based on the domain.
</p><link type="text/css" href="/styles/prism.css" rel="stylesheet" /><script src="/scripts/prism.js"></script><pre><code class="language-js"><script>
      window.dataLayer = window.dataLayer || [];
      var host = window.location.hostname;

      if (host !== "localhost") {
        function gtag() {
          dataLayer.push(arguments);
        }

        gtag('js', new Date());
        gtag('config', 'YOUR-G-ID');
      }
    </script></code></pre>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-54</link>
      <guid>https://sridhar.co/weekly-updates/week-54</guid>
      <pubDate>Mon, 14 Aug 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 53: Book summary - WIP and My Current Android home screen</title>
      <description>
        <![CDATA[<p>I was busy with office related work, so I only had a little time to work on my own agenda.</p><h2 class="weekly-heading">Reading</h2><p>
    Summarizing my notes from the Range book is still pending for 3 weeks in a row. The only meaningful update I could
    make for now is to add my notes
    of the original raft paper<sup>[<a href="#1">1</a>]</sup>, which I read in <a href="/weekly-updates/week-50">Week
    50: Understanding Raft</a>.
</p><h2 class="weekly-heading">Mobile</h2><p>
    I learnt <a href="/year-2020-in-review">the hard way to not rely</a> on a single phone without backups in 2020. But
    these days, I'm mostly on
    Android after my iPhone died due to lack of OS Updates.
</p><div class="split-image-container"><div class="image-container"><p style="text-align: center"><strong>2020 - iPhone SE 1st Gen</strong></p><img alt="old" class="responsive drop-shadow" src="/images/2020.jpg"/></div><div class="image-container"><p style="text-align: center"><strong>2023 - Motog40</strong></p><img alt="new" class="responsive drop-shadow" src="/images/mobile-2023.jpeg"/></div></div><p>One obvious difference here is the screen size. Other than that, rest all remains the same.</p><ul><li><strong>Utility</strong> - Bhim, Dropbox, Authy, Sodexo and Spotify.</li><li><strong>Work</strong> - Slack and teams</li><li><strong>Family</strong> - Telegram and Google Meet.</li><li><strong><a href="/free-of-whatsapp">Necessary evil</a></strong> - what’s app
    </li></ul><p>For everything else, Firefox.</p><h2 class="weekly-heading">Scouting for good podcast transcription software</h2><p>I listen to a lot of podcasts, and not all of them have transcript enabled. I'm scouting for a decent podcast
    transcriptor that will help to extract the quotes and interesting ideas from them. </p><h3>References</h3><ul><li id="1">
        [1]
        <a rel="nofollow" class="pdf-link" href="/others/raft.pdf">
            Raft: In Search of an Understandable Consensus Algorithm - My annotated version
        </a></li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-53</link>
      <guid>https://sridhar.co/weekly-updates/week-53</guid>
      <pubDate>Wed, 09 Aug 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 52: Book summary - WIP, adding og meta tags and privacy page</title>
      <description>
        <![CDATA[<p>Thejesh has completed <a href="https://thejeshgn.com/2023/07/28/weekly-notes-30-2023/" rel="nofollow">1 year of
    writing weeklies</a>.</p><blockquote>
    I still have a Twitter account, but My Twitter usage has decreased considerably in the last year. Anyway, this week,
    the Twitter app on my phone
    is gone too. So now it's only on my Desktop browser, usage of which is rare and mostly broadcasting. Let's see when
    I feel like coming back fully.
    It's not just Twitter; even my Instagram usage has decreased heavily. <strong>In general, my social media usage is
    at an all-time low.</strong></blockquote><p>
    This has been my usage pattern as well. From being <a href="/which-is-your-third-place">my 3rd place to hangout</a>
    on the Internet, Twitter usage has decreased drastically over the last few months. Removing the free API has
    broken my workflow. Bookmarking on Twitter means it is yet another place to read.
</p><h2 class="weekly-heading">Reading</h2><ul><li>
        Summarizing my notes from
        <a rel="nofollow" href="https://www.goodreads.com/book/show/41795733-range"
        ><strong>Range: Why Generalists Triumph in a Specialized World</strong></a
        >
        book is still a work in progress.
    </li><li>
        Total unread count = <code>10257</code>.
    </li></ul><h2 class="weekly-heading">Onebible</h2><ul><li><a href="/weekly-updates/week-51">Last week</a>, I deployed the minimal version of the onebible.in. This week, I
        migrated the index.html to a proper node app. This is to add the page templating for <a
            href="https://onebible.in/privacy" rel="nofollow">privacy
        policy</a> page, setting analytics + og tags and to serve the cached assets.
    </li><li>
        Added <a href="https://ogp.me/" rel="nofollow">og meta tags</a> for better SEO indexing.
    </li><li><code>v1.5.14</code> release was politely calm. No crashes.
    </li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-52</link>
      <guid>https://sridhar.co/weekly-updates/week-52</guid>
      <pubDate>Sun, 30 Jul 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 51: Onebible v1.5.14 release and website revamp</title>
      <description>
        <![CDATA[<h2 class="weekly-heading">Reading</h2><p>I completed the <a rel="nofollow" href="https://www.goodreads.com/book/show/41795733-range"><strong>Range: Why
    Generalists Triumph in a Specialized World</strong></a> book. Summarizing the notes is WIP.</p><p></p><h2 class="weekly-heading">Onebible</h2><p>I fixed the following bugs</p><ul><li><a rel="nofollow" href="https://github.com/onebible/android.onebible.in/issues/28">fix I யோவான் 2 : 13 #28</a></li><li><a rel="nofollow" href="https://github.com/onebible/android.onebible.in/issues/29">fix: proverbs 24:4 #29</a></li></ul><p>
    These were part of <code>v1.5.14</code> release via <a rel="nofollow"
                                                           href="https://github.com/onebible/android.onebible.in/pull/30">
    release(v1.5.14): upgrade db to v18 #30 </a></p><p>
    Also, I revamped the <a rel="nofollow" href="https://onebible.in/">onebible.in</a></p><div class="main"><div class="image-container"><img alt="onebible.in" height="100px" class="responsive" src="/images/week-51.png"/></div></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-51</link>
      <guid>https://sridhar.co/weekly-updates/week-51</guid>
      <pubDate>Sun, 23 Jul 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 50: Understanding Raft</title>
      <description>
        <![CDATA[<p>
    Raft is a consensus algorithm for managing a replicated log. It decomposes the consensus problem into three
    independent subproblems as follows.
</p><ul><li><strong>Leader election</strong>: a new leader must be chosen when an existing leader fails.</li><li><strong>Log replication</strong>: the leader must accept log entries from clients and replicate them across the
        cluster, forcing the other
        logs to agree with its own.
    </li><li><strong>Safety</strong> if any server has applied a particular log entry to its state machine, then no other
        server may apply a different
        command for the same log index.
    </li></ul><h2>Leader election</h2><h3>Election Process</h3><p>
    Raft divides time into terms of <em>arbitrary</em> length, and each term begins with an election, in which one or
    more server attempt to become the leader. At any given time each server is in one of three states:
    <strong>leader</strong>, <strong>follower</strong>, or <strong>candidate</strong>.
</p><div class="main"><div class="image-container"><img alt="raft states transistions" height="100px" class="responsive"
             src="/images/raft-state-transistions.webp"/></div></div><p>
    In normal operation there is exactly one leader and all of the other servers are followers. Followers are passive:
    they issue no requests on their
    own but simply respond to requests from leaders and candidates. The leader handles all client requests (if a client
    contacts a follower, the
    follower redirects it to the leader). The third state, candidate, is used to elect a new leader
</p><div class="main"><div class="image-container"><img alt="raft term" height="100px" class="responsive" src="/images/raft-term.png"/></div></div><p>
    If a candidate wins the election, then it serves as leader for the rest of the term. In some situations an election
    will result in a split vote.
    In this case the term will end with no leader; a new term (with a new election) will begin shortly. Raft ensures
    that there is at most one leader
    in a given term.
</p><h3>Communication</h3><p>Communication between server happen using remote procedure calls (RPCs), and it requires only two types of RPCs for
    driving consensus</p><ul><li><strong>RequestVote RPC</strong>: initiated by candidates during elections.
    </li><li><strong>AppendEntries RPC</strong>: initiated by leaders to replicate log entries</li></ul><h3>Leader-follower protocol</h3><p>
    The first step is to elect a distinguished leader, and then give the complete responsibility for managing the
    replicated log. The leader accepts
    log entries from clients, replicates them on other servers, and tells servers when it is safe to apply log entries
    to their state machines.
</p><p>
    Each server stores a current term number, which increases monotonically over time. Current terms are exchanged
    whenever servers communicate; if
    one server’s current term is smaller than the other’s, then it updates its current term to the larger value. If a
    candidate or leader discovers
    that its term is out of date, it immediately reverts to follower state. If a server receives a request with a stale
    term number, it rejects the
    request.
</p><h3>Election process</h3><p>
    Raft uses a heartbeat mechanism to trigger leader election. When servers start up, they begin as followers. A server
    remains in follower state as
    long as it receives valid RPCs from a leader or candidate. Leaders send periodic heartbeats
    (<code>AppendEntries</code> RPCs that
    carry no log entries) to all
    followers in order to maintain their authority. If a follower receives no communication over a period of time called
    the election timeout, then it
    assumes there is no viable leader and begins an election to choose a new leader. a follower increments its current
    term and transitions to
    candidate state. - electing the leader which has the recent version of the log(key difference)
</p><p>
    A candidate wins an election if it receives votes from a majority of the servers in the full cluster for the same
    term. Each server will vote for
    at most one candidate in a given term, on a first-come-first-served basis
</p><p>
    While waiting for votes, a candidate may receive an <code>AppendEntries</code> RPC from another server claiming to
    be leader. If
    the leader’s term (included in
    its RPC) is at least as large as the candidate’s current term, then the candidate recognizes the leader as
    legitimate and returns to follower
    state. If the term in the RPC is smaller than the candidate’s current term, then the candidate rejects the RPC and
    continues in candidate state.
    The third possible outcome is that a candidate neither wins nor loses the election: if many followers become
    candidates at the same time, votes
    could be split so that no candidate obtains a majority. When this happens, each candidate will time out and start a
    new election by incrementing
    its term and initiating another round of
    <code>RequestVote</code> RPCs. Raft uses randomized election timeouts to ensure that split votes are rare and that
    they are resolved quickly.
</p><h2>Log replication</h2><p>
    The leader appends the command to its log as a new entry, then issues <code>AppendEntries</code> RPCs in parallel to
    each of the other servers to
    replicate the entry. When the entry has been safely replicated, the leader applies the entry to its state machine
    and returns the result of that
    execution to the client. If followers crash or run slowly, or if network packets are lost, the leader retries
    <code>AppendEntries</code> RPCs indefinitely (even after it has responded to the client) until all followers
    eventually store all log entries.
</p><p>
    The leader decides when it is safe to apply a log entry to the state machines; such an entry is called committed.
    Raft guarantees that committed
    entries are durable and will eventually be executed by all of the available state machines. A log entry is committed
    once the leader that created
    the entry has replicated it on a majority of the servers.
</p><p>
    The leader keeps track of the highest index it knows to be committed, and it includes that index in future
    <code>AppendEntries</code> RPCs (including
    heartbeats) so that the other servers eventually find out. Once a follower learns that a log entry is committed, it
    applies the entry to its local
    state machine
</p><p>
    In Raft, the leader handles inconsistencies by forcing the followers’ logs to duplicate its own. This means that
    conflicting entries in follower
    logs will be overwritten with entries from the leader’s log. To bring a follower’s log into consistency with its
    own, the leader must find the
    latest log entry where the two logs agree, delete any entries in the follower’s log after that point, and send the
    follower all of the leader’s
    entries after that point.
</p><p>
    When a leader first comes to power, it initializes all nextIndex values to the index just after the last one in its
    log. If a follower’s log is
    inconsistent with the leader’s, the <code>AppendEntries</code> consistency check will fail in the next AppendEntries
    RPC. After a rejection, the leader decrements nextIndex and retries the <code>AppendEntries</code> RPC. Eventually
    nextIndex will reach a point where the leader and follower logs match. When this happens, <code>AppendEntries</code>
    will
    succeed, which removes any conflicting entries in the follower’s log and appends entries from the leader’s log
    (if any). Once <code>AppendEntries</code> succeeds, the follower’s log is consistent with the leader’s, and it will
    remain that way for the rest of the term. A leader never overwrites or deletes entries in its own log
</p><h3>Timing and availability</h3><blockquote>broadcastTime ≪ electionTimeout ≪ MTBF</blockquote><ul><li><strong>broadcastTime</strong> is the average time it takes a server to send RPCs in parallel to every server in
        the cluster and receive their
        responses;
    </li><li><strong>MTBF</strong> is the average time between failures for a single server.</li></ul><p>
    In order to avoid availability gaps, new servers join the cluster as non-voting members (the leader replicates log
    entries to them, but they are not considered for majorities). Once the new servers have caught up with the rest
    of the cluster, it can start to act as leader.
</p><h2>Log compaction</h2><p>Creating a Snapshot with metadata like the last included index and last entry in log can help in doing the
    consistency checks in the AppendEntries. The leader must occasionally send snapshots to followers that lag
    behind.</p><p>
    the leader would create a snapshot, then it would send this snapshot to each of its followers. However, this has
    two disadvantages.
</p><ul><li>

        Sending the snapshot to each follower would waste network bandwidth and slow the snapshotting process. Each
        follower already has the information needed to produce its own snapshots, and it is typically much cheaper for a
        server to produce a snapshot from its local state than it is to send and receive one over the network.
    </li><li>
        the leader’s implementation would be more complex. For example, the leader
        would need to send snapshots
        to followers in parallel with replicating new log entries to them, so as not to block new client requests.
        servers
        must decide when to snapshot.
    </li></ul><p>
    One simple strategy is to take a snapshot when the log reaches a fixed size in bytes. If this size is set to be
    significantly larger than the
    expected size of a snapshot, then the disk bandwidth overhead for snapshotting will be small.
</p><h2>Safety</h2><h3>Election restriction</h3><p>
    In any leader-based consensus algorithm, the leader must eventually store all of the committed log entries. Raft
    uses a simpler approach where it
    guarantees that all the committed entries from previous terms are present on each new leader from the moment of its
    election, without the need to
    transfer those entries to the leader. This means that log entries only flow in one direction, from leaders to
    followers, and leaders never overwrite existing entries in their logs. <code>RequestVote</code> RPC implements this
    restriction: the RPC includes information
    about the candidate’s log
</p><h3>Follower and candidate crashes</h3><p>
    If a follower or candidate crashes, then future <code>RequestVote</code> and <code>AppendEntries</code> RPCs sent to
    it will fail. Raft
    handles these failures by retrying
    indefinitely; if the crashed server restarts, then the RPC will complete successfully. If a server crashes after
    completing an RPC but before
    responding, then it will receive the same RPC again after it restarts. Raft RPCs are idempotent, so this causes no
    harm.
</p><h3>Client interaction</h3><p>
    Clients of Raft send all of their requests to the leader. When a client first starts up, it connects to a randomly-
    chosen server. If the client’s
    first choice is not the leader, that server will reject the client’s request and supply information about the most
    recent leader it has heard from
    (<code>AppendEntries</code> requests include the network address of the leader). If the leader crashes, client
    requests will time
    out; clients then try again
    with randomly-chosen servers.
</p><h3>References</h3><ul><li><a
                rel="nofollow"
                class="pdf-link"
                href="https://raft.github.io/raft.pdf"
        >
            Raft: In Search of an Understandable Consensus Algorithm (Extended Version)
        </a></li></ul>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-50</link>
      <guid>https://sridhar.co/weekly-updates/week-50</guid>
      <pubDate>Sun, 16 Jul 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 49: A bare minimum checklist for building a website</title>
      <description>
        <![CDATA[<p>Following is a non-comprehensive list of things to create a highly functional website for a side project.</p><h2 class="weekly-heading">Page structuring</h2><ul><li>
        Structure the content with a <code>&lt;title&gt;</code> & 1 <code>&lt;h1&gt;</code>, <code>&lt;h2&gt;</code> - <code>&lt;h6&gt;</code>: for
        sub headings.
    </li><li>Always have an About section.</li><li>Configure to display <code>404</code> page for the missing/invalid pages.</li><li>
        Check for a11y assistance using <a href="https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/" rel="nofollow">axe DevTools</a> and
        <a href="https://wave.webaim.org/">Web Accessibility Evaluation Tools</a>.
    </li></ul><h2 class="weekly-heading">Content</h2><ul><li>Images: Compress the images for size.</li><li>Images: Set <code>alt</code> texts.</li><li>Add external links with <code>rel="nofollow"</code>.</li></ul><h2 class="weekly-heading">Social</h2><ul><li>
        Enable RSS feeds for your site. If you want to generate a dynamic feed, check
        <a href="/how-to-generate-custom-rss-feed-from-scratch-programmatically">How to generate a custom RSS feed from scratch programmatically</a>.
    </li><li>
        Add your other social(Twitter, Github, Instagram, LinkedIn) links using:<code
            >&lt;link rel="me" type="text/html" href="social URL&gt;"/&gt;</code
        >.
    </li><li>If you are collecting email, secure your form with csrf tokens.</li></ul><h2 class="weekly-heading">Server configurations</h2><ul><li>Enable https using <a href="https://letsencrypt.org/" rel="nofollow">lets encrypt</a>.</li><li>
        Enable caching at the server side for static assets like image, js and CSS by adding
        <code>location ~* \.(css|gif|jpg|jpeg|js|png|ico)$ { expires 365d; }</code> in site's nginx config.
    </li><li>Redirect the non-https traffic to https version.</li></ul><h2 class="weekly-heading">Performance</h2><ul><li>Use CDN-minified versions for bootstrap and other widely used dependent libraries to leverage browser caching.</li><li>Minifying and serving the site's own static assets like JS and CSS.</li><li>
        Verify the page performance on <a rel="nofollow" href="https://pagespeed.web.dev/">Google PageSpeed Insights</a>,
        <a rel="nofollow" href="http://tools.pingdom.com">Pingdom Website Speed Test</a> and
        <a rel="nofollow" href="https://gtmetrix.com">GTmetrix</a>.
    </li></ul><h2 class="weekly-heading">SEO</h2><ul><li>Set author name as meta: <code>&lt;meta name="author" content="YOUR_NAME_HERE"&gt;</code>.</li><li>Add <code>robots.txt</code> and updated <code>sitemap.xml</code> to the site.</li><li>Verify site ownership on both Google and Bing webmaster tools.</li><li>In webmaster consoles: Add all variants of domain - <code>http</code>, <code>www</code>.</li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-49</link>
      <guid>https://sridhar.co/weekly-updates/week-49</guid>
      <pubDate>Sun, 09 Jul 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 48: Don't End the Week With Nothing</title>
      <description>
        <![CDATA[<p>
    While
    <a href="/weekly-updates/week-35">reading and clearing the bookmarks</a>, I found Patrick McKenzie's advice on
    <a href="https://training.kalzumeus.com/newsletters/archive/do-not-end-the-week-with-nothing" rel="nofollow"> Don't End The Week With Nothing</a>
    interesting.
</p><ul><li><strong>Prefer Working On Things You Can Show</strong>: Work you can show off is <em>prima facie evidence</em>
        of your skills. One of the reasons developers have embraced OSS so much is because it gives you portable capital between companies: if your
        work is sitting on Github, even if you leave one job, you can take it with you to your next job. If you cannot build things you can show at
        work, you should build things you can show outside of work.
    </li><li><strong>Prefer To Work Where People Can See You</strong>: Don't try to make a career out of optimizing the SQL queries. <em>Instead</em>, work
        in positions where by you're exposed to lots of people. Optimize for impact and visibility.
    </li><li><strong>Consumption Is Sometimes Valuable, But Creation Moves You Forward</strong>: Reading and watching videos about the latest happening is
        valuable. But you'll learn more by shipping a failure than from reading about a thousand successes.
    </li></ul><h2 class="weekly-heading">Few things that I'm working in parallel.</h2><ul><li>
        I initially created <a href="https://github.com/sridharrajs/utilities" rel="nofollow">utilities</a> in Python to create an OS wide installer.
        After learning about <a href="https://github.com/sindresorhus/execa">sindresorhus's execa</a>, I'm porting my scripts to JavaScript to publish
        an npm.
    </li><li>
        Resumed reading books after a very long time, I'm <code>68%</code> through
        <a href="https://www.goodreads.com/book/show/41795733-range" rel="nofollow">Range: Why Generalists Triumph in a Specialized World.</a></li><li>
        The free Twitter developer key for self, used in <a href="https://github.com/sridharrajs/pin-tweet">pin-tweet</a>
        is broken for the second time. I'm considering turning Twitter completely.
    </li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-48</link>
      <guid>https://sridhar.co/weekly-updates/week-48</guid>
      <pubDate>Sun, 02 Jul 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 47: NPS vs Index funds</title>
      <description>
        <![CDATA[<p>
    After understanding the <a href="/weekly-updates/week-40"> What and Why of NPS</a>, I wanted to compare it with Index funds in terms of Investment style,
    Equity exposure, and Benefits.
</p><br><h2 class="weekly-heading">NPS vs Index funds</h2><table class="table table-hover"><thead><tr><th>Parameters</th><th>NPS</th><th>Index funds</th></tr></thead><tbody><tr><td>Portability</td><td>You can switch your pension fund manager without exiting the funds.</td><td>You've to exit-reinvest your funds to change your fund manager.</td></tr><tr><td>Withdrawals</td><td><ul><li>Age &lt; 60: Full withdrawal if the corpus is < ₹ 2,50,000 and completed 5 years since inception.</li><li>
                        Age &lt; 60: Partial withdrawal for Higher education or Marriage of children, purchase of land, treatment of critical illness
                        <sup>[<a href="#1">1</a>]</sup>.
                    </li><li>Age &gt; 60: 60% of the corpus; rest will be used to purchase an annuity.</li></ul></td><td>You can withdraw as and when required.</td></tr><tr><td>Diversification in equity</td><td>
                Top 200 stocks <sup>[<a href="#2">2</a>]</sup></td><td><ul><li>50 stocks, if tracking Nifty.</li><li>30 stocks, if tracking SENSEX.</li></ul></td></tr><tr><td>Investment style</td><td>Though regulated, stock picking within the range of top 200 market cap stock is technically <em>active</em>.</td><td>Passively mirroring the index</td></tr><tr><td>Tax benefits</td><td>₹ 1,50,000(80 CCE) + ₹ 50,000 80 CCD(1B) = ₹ 2,00,000.</td><td>NA</td></tr><tr><td>Maximum equity allocation</td><td><code>75%</code><sup>[<a href="#3">3</a>]</sup></td><td><code>95%</code><sup>[<a href="#4">4</a>]</sup></td></tr><tr><td>Historical returns (Mini. 5yrs)</td><td><code>12.54%</code></td><td><code>14.61%</code></td></tr><tr><td>Expense ratio</td><td><code>0.09%</code><sup>[<a href="#5">5</a>]</sup></td><td><code>0.06%</code></td></tr></tbody></table><br /><br /><div><h3>References</h3><ul><li id="1">
            [1]
            <a rel="nofollow" href="https://npscra.nsdl.co.in/all-faq-withdrawal.php">https://npscra.nsdl.co.in/all-faq-withdrawal.php</a></li><li id="2">
            [2]
            <a rel="nofollow" class="pdf-link" href="https://www.pfrda.org.in/myauth/admin/showimg.cshtml?ID=1972"
                >PFRDA/2021/28/REG-PF/2: Investment Guidelines - 2021 for NPS Schemes (Applicable to Scheme CG, Scheme SG, Corporate CG and NPS Lite
                scheme of NPS and Atal Pension Yojana) w.e.f 20th July, 2021</a
            ></li><li id="3">
            [3]
            <a
                rel="nofollow"
                class="pdf-link"
                href="https://npstrust.org.in/sites/default/files/Circular%20on%20allowing%20option%20to%20allocate%2075%25%20of%20subscriber%E2%80%99s%20contribution%20in%20Asset%20Class%20E%20%28Equity%29%20in%20Tier-I%20and%20100%25%20in%20Asset%20Class%20E%20%28Equity%29%20in%20Tier-II%20under%20active%20choice%20without%20any%20conditions%20of%20tapering%20from%20age%20of%2051%20years.pdf"
            >
                Circular on allowing option to allocate 75% of subscriber’s contribution in Asset Class E (Equity) in Tier-I and 100% in Asset Class E
                (Equity) in Tier-II under active choice without any conditions of tapering from the age of 51 years (2.83 MB) - 20/10/2022
            </a></li><li id="4">
            [4]
            <a rel="nofollow" href="https://www.amfiindia.com/investor-corner/knowledge-center/SEBI-categorization-of-mutual-fund-schemes.html"
                >https://www.amfiindia.com/investor-corner/knowledge-center/SEBI-categorization-of-mutual-fund-schemes.html</a
            ></li><li id="5">
            [5]
            <a rel="nofollow" href="https://npstrust.org.in/content/charges-under-nps">https://npstrust.org.in/content/charges-under-nps</a></li></ul></div>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-47</link>
      <guid>https://sridhar.co/weekly-updates/week-47</guid>
      <pubDate>Sun, 18 Jun 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 46: Practising Thirukkural #942</title>
      <description>
        <![CDATA[<p>
    I was busy in attending friends' marriages for the last two weeks. And since I was on the move most
    of the time, I was on the consumption side of things, reading and clearing bookmarks. Naturally, I had the following
    thoughts
</p><h2 class="weekly-heading">Extracting Links from emails</h2><p>
    I believe everything you need to read should be in a single place. I created
    pin-tweet to help with that. It posts links to Pinboard
    <a href="/pin-tweet-a-node-utility-to-move-your-liked-tweets-to-pinboard">from Twitter</a>,
    <a href="https://github.com/sridharrajs/pin-tweet/pull/12">from mastodon</a>, and
    <a href="https://github.com/sridharrajs/pin-tweet/pull/9">from mobile</a>,
    but one thing still left out is <em>email</em>. I'm considering exploring options to post from email as well.
</p><h2 class="weekly-heading">Changes in the email subscription</h2><p>
    Earlier, this blog had four categories for the subscription. I'm consolidating them into a single list to keep things
    simple. Also, I'll be offloading the email list to a third-party app for delivering emails.
</p><h2 class="weekly-heading">Unread bookmarks count down by 193</h2><blockquote>
    மருந்தென வேண்டாவாம் யாக்கைக்கு அருந்தியது <br>
    அற்றது போற்றி உணின் - குறள் 942<br><br>
    His body needs no drugs who only eats <br>
    After digesting what he ate before
</blockquote><p> Taking inspiration from Thirukkural #942, I
    chose to read and clear about <code>193</code> bookmarks instead of starting anything new. Now, the total unreads
    are at <code>10327</code>.
</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">&quot;our domestic helpers are not just cooking our food,
        dusting our shelves, and mopping our floors. They are literally saving our marriages from certain doom.&quot;
        via <a href="https://twitter.com/mahimavashisht?ref_src=twsrc%5Etfw">@mahimavashisht</a><a
                href="https://t.co/JquDlKFpPs">https://t.co/JquDlKFpPs</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1666048597006209024?ref_src=twsrc%5Etfw">June 6,
            2023</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-46</link>
      <guid>https://sridhar.co/weekly-updates/week-46</guid>
      <pubDate>Sun, 11 Jun 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 45: Understanding Proxy in JavaScript</title>
      <description>
        <![CDATA[<link type="text/css" href="/styles/prism.css" rel="stylesheet"/><script src="/scripts/prism.js"></script><p>
    We can use <code>Proxy</code> to create a <em>proxy</em> for another object in JavaScript. We can intercept and
    redefine the operations on the proxied object through a proxy object.
</p><pre><code class="language-js">
    const proxy = new Proxy(target, handler);
</code></pre><p><code>Proxy</code> takes 2 parameter.
</p><ul><li><code>target</code> - the object to proxy.</li><li><code>handler</code> - the object with redefined operations.</li></ul><p>
    Setting an empty <code>{}</code> as a handler creates a no=ops proxy.
</p><pre><code class="language-js">
    const user = { name: 'john', age: 20 };

    const proxyUser = new Proxy(user, {}); // creates a no-ops proxy
    proxyUser.name; // john
    proxyUser.age; // 20
</code></pre><p>
    We can use also can redefine operations in the handler.
</p><pre><code class="language-js">
    const user = { name: 'john', age: 20 };

    const handler = {
        get(target, property) {
            if (!target[property]) {
              throw new Error(`'${property}' doesn't exist. Read the doc manual.`);
            }

            console.log(`Property '${property}' has been read.`);
            return target[property];
        }
    };

    const proxyUserWithLogs = new Proxy(user, handler);
    proxyUserWithLogs.name; // Property 'name' has been read.
</code></pre><p>
    Please note that private fields won't be accessible since the proxy create a different object.
</p><pre><code class="language-js">
    class User {
      #details = {
        firstName: "John",
        lastName: "Doe",
        email: "john.doe@example.com"
      };

      get details() {
        return this.#details;
      }
    }

    const user = new User();
    const userProxy = new Proxy(user, {});

    user.details.firstName; // Property 'details' has been read.
    userProxy.details.firstName; // TypeError: can't access private field or method: object is not the right class
</code></pre>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-45</link>
      <guid>https://sridhar.co/weekly-updates/week-45</guid>
      <pubDate>Tue, 30 May 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 44: Understanding Two Phase Commit</title>
      <description>
        <![CDATA[<p>I was reading about Two Phase Commit, a distributed systems pattern for atomically storing transactions on multiple
    cluster nodes.</p><h2>Problem</h2><p>
    Ensuring atomic property in a transaction is relatively easy when the transaction happens within one
    application transacting with a single database. However, it would be challenging if the transaction spans
    multiple microservices or uses heterogeneous database mixes(RDBMS + NoSQL).
</p><h2>Two Phase Commit</h2><p>
    This pattern involves a <code>coordinator</code> orchestrating the transaction between the
    participating microservices. As the name suggests, it involves two phases.
</p><ul><li>Prepare</li><li>Commit</li></ul><div class="main"><div class="image-container"><img alt="two phase commit" height="100px" class="responsive" src="/images/week-44.png"/><span>Two Phase Commit</span></div></div><p><strong>Prepare phase</strong>: We acquire the lock on the resource we want to update and make the change but wait
    to commit. If the microservices could do that, it would respond OK to the coordinator in the happy path. It will
    still respond if it cannot do, stating that it couldn't acquire the resources. After sending back the response, the
    services await further instruction from the coordinator.
</p><p><strong>Commit phase</strong>: If the coordinator receives a guarantee from all the participating microservices, it
    proceeds to the commit phase. Else, it aborts the transaction. Timeouts must be implemented at each service level to
    free up resource locks If the coordinator doesn't send the commit instructions.
</p><h2>Working</h2><ul><li><strong>All or nothing</strong>: It is all or nothing. All
        services
        complete the transaction, or we
        roll back the partial ones. Failures are handled through rollbacks.
    </li><li><strong>Latency</strong>: Since the coordinator awaits responses from all the participant services, the longest
        response time
        determines the overall
        response time of the system.
    </li><li><strong>Single point of failure</strong>: Improper implementation of the coordinator would turn it into a single
        point of failure for the system. Sufficient
        redundancy should be built at the service
        level to avoid deadlocks. Also, each coordinator should have redo logs to resume working in case of crashes.
    </li></ul><p>
    Source code for generating diagram via mermaid.js is at <a
        href="https://gist.github.com/sridharrajs/f97ba3ed8c176aeb2b10b5986b21d931">https://gist.github.com/sridharrajs/f97ba3ed8c176aeb2b10b5986b21d931</a></p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-44</link>
      <guid>https://sridhar.co/weekly-updates/week-44</guid>
      <pubDate>Sun, 21 May 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 43: Use URL() to work with URLs in JavaScript</title>
      <description>
        <![CDATA[<h2>Using native URL()</h2><p>
    In pin-tweet, I manually built the URL by individually <code>encodeURIComponent</code> for each query string.
</p><div class="tweet-container"><div class="image-container"><img alt="url parsing without URL()" class="responsive"
             src="/images/without-native-url.png"/><p style="text-align: center">Ref: <a
                href="https://github.com/sridharrajs/pin-tweet/blame/f10dd5354f529bb90f6b90714c9a3080c4b0df04/service/pinboard-service.js">pinboard-service.js</a></p></div></div><p>
    But discovered native <a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/URL">URL()</a> that offers a
    better way to work with URLs. By default, all params are automatically encoded.
</p><ul><li><code>searchParams.set()</code> - for building the URL</li><li><code>searchParams.get()</code> - for parsing the URL</li><li><code>searchParams.has()</code> - to check for the existence of a param</li></ul><p>
    You can check <code><a
        href="https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams">searchParams</a></code> for other
    helpful functions.
</p><link type="text/css" href="/styles/prism.css" rel="stylesheet"/><script src="/scripts/prism.js"></script><pre><code class="language-js">
const url = new URL('http://example.org')

url.searchParams.set('q', 'demo')
url.searchParams.set('title','some long title')
url.searchParams.set('third_param', 3)
url.searchParams.set('boolean_param', true)
url.searchParams.set('invalid_param', 'some value')

const destinationURL = url.toString() // http://example.org/?q=demo&title=some+long+title

// fetching and checking keys
url.searchParams.has('page') // false
url.searchParams.get('third_param') // '3'

url.toString() // http://example.org/?q=demo&title=some+long+title&third_param=3&boolean_param=true&invalid_param=some+value

if (url.searchParams.has('invalid_param')) {
    url.searchParams.delete(key)
}

url.searchParams.size // 4
url.toString() // http://example.org/?q=demo&title=some+long+title&third_param=3&boolean_param=true

</code></pre><p>
    I made pin-tweet to use URL() via <a href="https://github.com/sridharrajs/pin-tweet/pull/20"> tech: using native URL() for setting the URL #20</a> PR.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-43</link>
      <guid>https://sridhar.co/weekly-updates/week-43</guid>
      <pubDate>Sun, 07 May 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 42: Using the free basic version of Twitter API and releasing an update for the Onebible Android app</title>
      <description>
        <![CDATA[<h2>Pintweet</h2><p>
    I migrated pintweet to use <a href="https://github.com/twitterdev/twitter-api-typescript-sdk">twitter-api-sdk</a>,
    Twitter's official npm library via <a href="">tech: upgrade to twitter official npm #18</a> PR. The credentials which used to
    work earlier aren't working any more. I had to create a fresh project-app and generate a token to use the
    <code>Basic</code>
    API.
</p><h2>Onebible</h2><p>I fixed 10 bugs and did an Android app release.</p><ul><li><a href="https://github.com/onebible/android.onebible.in/issues/14" >Tamil typo in Acts 1:12 #14</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/15" >Tamil typo in Ezra 10:14,24 #15</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/16" >Tamil typo in Hebrew 11:10 #16</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/17" >Tamil typo in Revelations 9:5 #17</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/18" >Tamil typo in எரேமியா 4 : 25 #18</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/19" >Tamil typo in எபிரெயர் 4 : 3 #19</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/20" >Tamil typo in எபிரெயர் 7:20 #20</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/21" >Tamil typo in II நாளாகமம் 7:14 #21</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/22" >missed out word in II சங்கீதம் 45 : 10 #22</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/25" >Font issue - Malachi 2:16 #25</a></li></ul><p>All these fixes are part of the 1.5.12 release. If you haven't updated the app yet,
    <a href="https://play.google.com/store/apps/details?id=co.sridhar.tamilbible.full">do it now</a>.</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-42</link>
      <guid>https://sridhar.co/weekly-updates/week-42</guid>
      <pubDate>Mon, 01 May 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 41: How to optimize your page description and remove duplicates for SEO</title>
      <description>
        <![CDATA[<h2>SEO - Description</h2><p>
    You should optimize your page <code>description</code> after optimizing the <a
        href="https://sridhar.co/weekly-updates/week-37">Page
    structure</a> and <a
        href="https://sridhar.co/weekly-updates/week-38">Title</a> for the SEO.
</p><ul><li>The description is for the user. Make a crisp summary of why they have to visit the link and what will be the reward for it.
    </li><li>Search engines display your first 110 - 150 characters based on the listing page's device(web, mobile).
    </li><li>Add a keyword to the description contextually. e.g., Github in the image.</li><li>Avoid: Don't use a standard template. It would be considered <code>duplicate</code>, negatively impacting the
        search rankings.
    </li></ul><link type="text/css" href="https://sridhar.co/styles/prism.css" rel="stylesheet"/><script src="https://sridhar.co/scripts/prism.js"></script><div class="split-image-container"><div class="image-container"><span><strong>Search result</strong></span><img alt="search engine result" class="responsive" src="https://sridhar.co/images/week-41.png"/></div><div class="image-container"><span><Strong>Page's description</Strong></span><pre><code class="language-xml">
&lt;meta name="description"
          content="GitHub is where over 100 million developers shape the future of software, together. Contribute to the open source community, manage your Git repositories, review code like a pro, track bugs and features, power your CI/CD and DevOps workflows, and secure code before you commit it."/&gt;
</code></pre></div></div><h2>How to remove duplicates gracefully</h2><p>
    If you're building a site from scratch, one of the things that you need to take care of is preventing duplicates. It
    can be the <code>title</code>, <code>description</code> or <code>URL</code>.
</p><p>e.g.,</p><ul><li>https://example.org/about-us</li><li>https://example.org/about-us/</li></ul><p>If both these pages serve the same content, it is a <em>duplicate</em>. It will negatively impact the
    search
    engine ranking. You need to do the following things to solve it.</p><ul><li>
        Remove the trailing slash in the URL and redirect the user back to the preferred URL version.
    </li><li>Redirect the <code>HTTP</code> and <code>non-WWW</code> versions to the preferred URL version.</li></ul><p><strong>Note:</strong> When redirecting the user to the preferred version of the URL, the status code should be
    <code>301</code> to update the site's change on the search index.
</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-41</link>
      <guid>https://sridhar.co/weekly-updates/week-41</guid>
      <pubDate>Sun, 23 Apr 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 40: Understanding National Pension Scheme(NPS)</title>
      <description>
        <![CDATA[<p>
    I liked the simplicity of <a href="/weekly-updates/week-39">Scott Adams' Financial Advice</a>. So I continued
    reading about NPS.
</p><h2>What is NPS</h2><p>
    National Pension Scheme(NPS) is a voluntary retirement solution for individuals. The individual has to
    contribute to their pension account while working, and during their retirement, an income will be generated from the
    accumulated pension corpus. At the time of retirement, you can withdraw a maximum of up to 60% of the corpus in
    a lump sum without tax. But for the remaining (minimum) 40%, you must purchase an annuity to pay a monthly pension. The
    monthly income from the annuity would be taxable based on the slab tax that would prevail then.
</p><h2>How does it work</h2><p>
    As per Pension Fund Regulatory and Development Authority(PFRDA) guidelines, your contribution gets invested
    into Equities(top 200 stocks based on market capitalisation, max exposure to equity is 75%), Govt. Securities,
    Corporate Bonds and Alternate Assets are based on the following schemes to build your retirement corpus. </p><ol><li>Aggressive Life Cycle Fund (with equity up to 75%)</li><li>Moderate Life Cycle Fund (with equity up to 50%)</li><li>Conservative Life Cycle Fund (with equity up to 25%)</li></ol><p>There are two types of accounts</p><ul><li>Tier I</li><li>Tier II</li></ul><table class="table"><thead><tr><th>Features</th><th>Tier I</th><th>Tier II</th></tr></thead><tbody><tr><td>Account Type</td><td>It is the <em>Pension</em> account. Its default</td><td>Its an optional <em>investment</em> account.
        </td></tr><tr><td>Contributions required to keep the account active</td><td>₹1000/year.</td><td>₹250/year.</td></tr><tr><td>Withdrawal</td><td>Withdrawal are restricted.</td><td>Unrestricted Withdrawals.</td></tr><tr><td>Tax Benefits</td><td>Applicable.</td><td>Since withdrawals are unrestricted. Tax benefits aren't applicable.</td></tr></tbody></table><p><strong>Note:</strong> You can open a Tier II account only if you have an active Tier I account.


<p>Profession pension fund managers(SBI, UTI, HDFC, ICICI, Kotak and others) will manage the funds under both these
    accounts. You can switch between them once a year for Tier I and 4 per year for Tier II account.</p><h3>Why</h3><p></p><dl><dt><strong>Tax benefits</strong> ~ 2 Lakh/annum.</dt><dd>- Your employer can contribute 10% of your salary (Basic + DA) under Section 80 CCD(2). The contribution upto
        up-to 7.5 Lakh is tax-free.
    </dd><dd>- ₹1,50,000 tax deduction under Section 80 CCE.</dd><dd>- ₹50,000 under section 80 CCD(1B) over and above ₹1.50 lakh under Sec 80 CCE.</dd></dl><dl><dt>It is a genuine <strong>long term</strong> product.</dt><dd>- ELSS has 3 years lock-in period.</dd><dd>- PPF has 15 years lock-in period.</dd><dd>- But with NPS, Funds within your Tier I account is locked for the longest period (60 - your age at the time of
        enrollment). E.g., Since it is available for an individual from the age of 18. The lock-in period would be 42 years.
    </dd><dd>- With <code>12%</code> being the average 5 year CARG, Your money
        has the best chance to compound <strong><em>uninterrupted</em></strong>.
    </dd></dl><dl><dt>Lowest cost ratio</dt><dd>With <code>0.09%</code> as the fee, NPS has the lowest cost ratio for managing funds.
    </dd></dl>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-40</link>
      <guid>https://sridhar.co/weekly-updates/week-40</guid>
      <pubDate>Sun, 16 Apr 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 39: Why use flatMap over filter + map and the best financial advice in 87 words</title>
      <description>
        <![CDATA[<h2>Use flatMap instead of filter + map.</h2><p>
    Instead of using filter and map together to extract a list. We can also use <code>flatMap</code> to save iterating
    through the collections.
</p><script src="https://gist.github.com/sridharrajs/3d2753d2f11d98942c0b4a40781f69bf.js"></script><p>Since we're not reducing the array to a single item, <code>flatMap</code> seems more natural than
    <code>reduce</code>.</p><h2>Scott Adams' Financial Advice</h2><p>
    I came across <a href="https://www.mattcutts.com/blog/scott-adams-financial-advice/">Scott Adams' financial
    advice</a>. All simple, sensible advice covering mutual funds, credit cards and insurance. The only change it
    requires to work within the Indian context is, swapping 401K/IRA with National Pension System(NPS). Rest all hold
    good. But remember, <strong>simple is <em>not easy</em></strong>.
</p><blockquote><ul><li>Make a will.</li><li>Pay off your credit card balance.</li><li>Get term life insurance if you have a family to support.</li><li>Fund your company 401K to the maximum.</li><li>Fund your IRA to the maximum.</li><li>Buy a house if you want to live in a house and can afford it.</li><li>Put six months’ expenses in a money market account.</li><li>
            Take whatever is left over and invest it 70 percent in a stock index fund and 30 percent in a bond fund
            through any discount brokerage
            company and never touch it until retirement
        </li><li>
            If any of this confuses you, or you have something special going on (retirement, college planning, tax
            issue), hire a fee-based financial
            planner, not one who charges you a percentage of your portfolio.
        </li></ul></blockquote><h2>Onebible 1.5.10</h2><p><a href="/weekly-updates/week-38">As said</a> earlier, I've published <code>v1.5.10</code>. If you haven't updated
    it, update it
    now.</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-39</link>
      <guid>https://sridhar.co/weekly-updates/week-39</guid>
      <pubDate>Mon, 03 Apr 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 38: How to optimize page title for SEO and app update</title>
      <description>
        <![CDATA[<h2>SEO - Title</h2><p>
    I <a href="/weekly-updates/week-38">continued reading</a> more about SEO best practices. This week I learnt about
    <code>&lt;title&gt;</code>.
</p><ul><li>The average length of the page title that ranks on page 1 of Google is between 45 to 55 characters. If the title is
        lengthier, Google truncates it after displaying up to 60 characters.
    </li><li>
        Use only <strong>ONE</strong><code>&lt;title&gt;</code> tag to represent the page's title. Use <code>&lt;h2&gt;</code>
        for subheadings.
    </li><li>If you're writing list-style posts, include the number in your title. e.g., N way to do ABC</li><li>Prefer <code>:</code>, <code>()</code> over <code>-</code> when writing the title, since <code>-</code> is reserved
        for specifying the domain name.
    </li><li>
        Avoid setting the date on the title unless there is a scope for updates + re-rank. e.g., How to solve XYZ in 2022.
    </li><li>Avoid: appending domain names to the title to save characters since search engines auto appends it based on the
        context
    </li></ul><h2>Onebible Android app updates</h2><p>I released <code>v1.5.9</code> on Jul 12, 2021. An update was due for a very long time.
    Before I could work on any of the
    <a href="https://github.com/onebible/android.onebible.in/issues" rel="nofollow">user reported issues</a>, a
    migration to a recent android version was required even to get the
    build passing. I was focusing on wrapping it via <a
            href="https://github.com/onebible/android.onebible.in/pull/23" rel="nofollow"> tech: upgrade
        app to the recent android
        version (#23)</a> PR.</p><h2>Vimtutor</h2><p>If you're learning vim, you can use <code>vimtutor</code> to learn the basic navigation and functionalities. It comes
    default along with vim, so if you've vim, you've <code>vimtutor</code> as well.</p><div class="main"><div class="image-container"><img alt="vimtutor" class="responsive" src="/images/week-38.jpg"/></div></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-38</link>
      <guid>https://sridhar.co/weekly-updates/week-38</guid>
      <pubDate>Sun, 26 Mar 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 37: Reading on Silicon Valley Bank and how to optimize your site for the SEO</title>
      <description>
        <![CDATA[<h2>Reading on Silicon Valley Bank</h2><p>
    I was reading about the bank run that happened at the Silicon Valley Bank. They went bust not because of the lending practices but because they
    needed their invested assets at a loss to meet short-term deposit withdrawals. Though in India, deposits are
    <a
        rel="nofollow"
        href="https://m.economictimes.com/wealth/personal-finance-news/if-bank-fails-rs-5-lakh-deposit-insurance-amount-to-be-available-immediately-to-depositors/articleshow/80626568.cms"
        >insured up to 5 Lakhs per person per bank</a
    >, the withdrawal can be
    <a
        rel="nofollow"
        href="https://www.livemint.com/industry/banking/yes-bank-withdrawal-limited-to-rs-50-000-rbi-says-don-t-panic-10-points-11583424601685.html"
        >restricted, as in the case of YesBank</a
    >. <strong> The only way to mitigate this risk is to diversify your funds across banks.</strong></p><h2>Pointers to improve SEO</h2><p>If you want to rank well on search, you need to optimize three things</p><ul><li>Assets - Images, JavaScript and CSS.</li><li>Load time.</li><li>Page structure.</li></ul><p><strong>Assets:</strong> Images, <code>CSS</code>, and <code>js</code> are called static assets because they don't change often. So, it is
    recommended to minify and cache assets. We can use <a href="https://tinypng.com/" rel="nofollow">tinypng</a> to compress image size to keep them
    light.
</p><p><strong>Load time:</strong>
    The faster the page loads, the better the user engagement with the page. So, run the page with the following sites and work on the suggestions.
</p><ul><li><a rel="nofollow" href="https://pagespeed.web.dev/">Google PageSpeed Insights</a></li><li><a rel="nofollow" href="http://tools.pingdom.com">Pingdom Website Speed Test</a></li><li><a rel="nofollow" href="https://gtmetrix.com">GTmetrix</a></li></ul><p><strong>Page structure:</strong> Optimize the page for a better user reading experience.</p><ul><li>Place one <code>&lt;title&gt;</code> within <code>&lt;head&gt;</code> with a unique title for each page.</li><li><code>&lt;description&gt;</code>: summarize what the page will be about as the description.</li><li>
        Add <a rel="nofollow" href="https://developers.google.com/search/docs/appearance/structured-data/article">structured data markup</a>, if
        applicable.
    </li><li>Add both HTTP and HTTPS versions and www and non-www versions to the search console.</li><li>Set a proper <code>alt</code> description for the images.</li><li>When linking to other site, if you don't want to part some of your reputation, use <code>rel="nofollow"</code>.</li><li>Enable <code>HTTPS</code> for your page. You can use <a href="https://letsencrypt.org/" rel="nofollow">lets encrypt</a>.</li><li>Set <code>&lt;lastmod&gt;</code> in <code>sitemap.xml</code> to force reindex the page.</li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-37</link>
      <guid>https://sridhar.co/weekly-updates/week-37</guid>
      <pubDate>Sun, 19 Mar 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 36: Cut/copy/paste in vim and use prettyDOM to debug failing tests in react-testing-library</title>
      <description>
        <![CDATA[<h2>Cut/copy/paste in vim</h2><p>I'm continuing to learn more keys for cut/copy/paste in vim</p><table class="table table-hover"><thead><tr><td>Navigation</td><td>Combination</td></tr></thead><tbody><tr><td>Cut</td><td><code>dd</code> - entire line</td></tr><tr><td>Copy</td><td><code>yy</code> - entire line</td></tr><tr><td>Paste</td><td><code>p</code> - paste below the current line <br/><code>P</code> - paste at the current line
        </td></tr></tbody></table><p>
    You can also use these keys along with numbers. eg: <code>:3</code> - will simply take you 3rd line. We can add
    <code>d</code> or
    <code>y</code> based on whether we need to copy or cut/delete.
</p><ul><li><code>:3d</code> - for deleting 3rd line.</li><li><code>:3y</code> - for copying 3rd line.</li><li><code>Ndd</code> - for deleting the next N lines including the current.</li></ul><p>Since I'm using <code>ESC</code> key for switching modes, I remapped the <code>caps lock</code> key to be
    <code>ESC</code> within vim.</p><h2>Debugging in react-testing-library</h2><p>While debugging the failing tests in a different repo, I learnt about <a
        href="https://testing-library.com/docs/dom-testing-library/api-debugging/#prettydom"><code>prettyDOM</code></a>, which is an effective way to debug the HTML code that gets rendered.</p><link type="text/css" href="/styles/prism.css" rel="stylesheet"/><script src="/scripts/prism.js"></script><pre><code class="language-js">
    import { prettyDOM } from '@testing-library/dom';

    const div = document.createElement('div');
    div.innerHTML = '<div><h1>HTML Element</h1></div>';

    console.log(prettyDOM(div));
    //&lt;div&gt;
    //&lt;h1&gt;HTML Element&lt;/h1&gt;
    //&lt;/div&gt;
    </code></pre>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-36</link>
      <guid>https://sridhar.co/weekly-updates/week-36</guid>
      <pubDate>Sun, 12 Mar 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 35: My notes from rich dad and poor dad, effective deleting in vim, and Thirukkural #942 on information obesity</title>
      <description>
        <![CDATA[<h2>Books & links</h2><p>I published my notes from <a href="/books/rich-dad-poor-dad"><strong>Rich Dad and Poor Dad</strong></a>. Next, I'm
    picking <strong>Refactoring, 2nd</strong> edition.
</p><h2>Effective deleting</h2><p>
    I'm learning how to <em>effectively</em> delete in vim with key combinations in <code>NORMAL</code> mode.
</p><p>
    eg:
</p><table class="table table-hover"><thead><tr><td>Navigation</td><td>Combination</td><td>Replace navigation with delete</td></tr></thead><tbody><tr><td>move forward by a word</td><td><code>w</code></td><td><code>dw</code></td></tr><tr><td>move backwards by a word</td><td><code>b</code></td><td><code>db</code></td></tr><tr><td>Go to line N</td><td><code>:N</code> eg: <code>:3</code> for jumping to 3rd line</td><td><code>:Nd</code></td></tr></tbody></table><p>
    You can also delete the current line by <code>dd</code> and
    <code>x</code> to delete the character that's under the cursor. Since all of these are vim shortcuts on doom emacs,
    you can use them on <code>vim</code> elsewhere too.
</p><h2>Thirukkural #942</h2><blockquote>
    மருந்தென வேண்டாவாம் யாக்கைக்கு அருந்தியது <br>
    அற்றது போற்றி உணின் - குறள் 942<br><br>
    His body needs no drugs who only eats <br>
    After digesting what he ate before
</blockquote><p>
    I've been thinking about this thirukkural for some time. Though it talks about medicine, I think it can be applied to
    our urge to keep consuming information every day. I started this year with <code>8943</code>, but currently, it is at
    <code>9464</code>. ~<code>500</code> links in 2 months. I need to devise a strategy and burn this list down.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-35</link>
      <guid>https://sridhar.co/weekly-updates/week-35</guid>
      <pubDate>Sun, 05 Mar 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 34: Completed rich dad and poor dad, update on emacs, and Twitter</title>
      <description>
        <![CDATA[<h2>Books & links</h2><p>I completed <strong>Rich Dad Poor Dad</strong> last week, and this will be the first completed book for 2023.
    Currently, I'm summarising my notes from the book. Next, there are a bunch of books in which I've completed
    somewhere around 6 to 18%. I'm planning to pick and finish one of them.
</p><ul><li>Mindset - Updated Edition: Changing The Way You think To Fulfil Your Potential - 13%</li><li>Refactoring: Improving the Design of Existing Code - 13%</li><li>Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems - 6%
    </li></ul><h2>Update on emacs</h2><p> Since <a href="/weekly-updates/week-33">switching to doom emacs two weeks ago</a>, things have been going
    well after getting the initial learning curve. It is emacs with vim mode for people unfamiliar with doom emacs. You
    get all the key binding for vim on emacs for editing + all emacs modes.
</p><ul><li><code>C-x</code> becomes <code>SPC</code></li><li><code>M-x</code> becomes <code>ESC :</code></li></ul><h2>Update on Twitter</h2><p>
    After cross posting both on my <a href="https://twitter.com/sridharrajs">Twitter</a> and <a
        href="https://mastodon.social/@sridharrajs">Mastodon</a> accounts, it is clear that folks I
    follow on Twitter have yet to all migrate to Mastodon. But at the same time, I've discovered a few interesting people
    mastodon. So, I'll continue to use both for some time until I have a clear preference.
</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Irrespective of whether you want to take up Twitter blue
        subscription or not, Its is recommended to migrate 2 factor authentication apps like <a
                href="https://twitter.com/Authy?ref_src=twsrc%5Etfw">@Authy</a> or Google/Microsoft authenticator<a
                href="https://t.co/8YRql6BrO7">https://t.co/8YRql6BrO7</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1627882759728541696?ref_src=twsrc%5Etfw">February
            21, 2023</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-34</link>
      <guid>https://sridhar.co/weekly-updates/week-34</guid>
      <pubDate>Mon, 20 Feb 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 33: Use mark for highlighting, trying out doom emacs and reading books</title>
      <description>
        <![CDATA[<p>If you're in the tech industry, the last few weeks have been hard. I couldn't focus much on creating new things. I
    rather chose to clear some backlogs from pinboard and read books.</p><h3>Books</h3>
Regarding books, I resumed reading <strong>Designing Data-Intensive Applications</strong>, and <strong>Rich Dad Poor
    Dad</strong> is 73% complete.

<h3>Use <code>mark</code> for highlighting</h3><p>
    If you're using <code>&lt;strong&gt;</code> + some styling for highlighting the text, you can use
    <code>&lt;mark&gt;</code>, which is the semantic equivalent of it.
</p><h3>emacs update</h3><p>I've been tinkering with my emacs configs for a while now. But now, for a change, I started using
    <a href="https://github.com/doomemacs/doomemacs">doom emacs</a>.</p><div class="main"><div class="image-container"><img alt="doom emacs" class="responsive" src="/images/week-33.png"/></div></div><h3>Pin-tweet</h3><p>Starting from Feb 9, Twitter will charge for the API access. Not sure whether it would be applicable
    for developer self-token as well. But it certainly impacts pin-tweet.</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Starting February 9, we will no longer support free access
        to the Twitter API, both v2 and v1.1. A paid basic tier will be available instead 🧵</p>&mdash; Twitter Dev
        (@TwitterDev) <a href="https://twitter.com/TwitterDev/status/1621026986784337922?ref_src=twsrc%5Etfw">February
            2, 2023</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-33</link>
      <guid>https://sridhar.co/weekly-updates/week-33</guid>
      <pubDate>Sun, 05 Feb 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 32: Use prismjs instead of gist, update on NGO website requirements, subscription by email - WIP</title>
      <description>
        <![CDATA[<p>The week was more about reading and experimenting with websites.</p><h3>Books and Links</h3><p>
    I resumed book reading. <strong>Rich Dad Poor Dad</strong> is 55% complete.
</p><p>
    Despite clearing 200+ links, there are about <code>9064</code> links to be read in my pinboard account.
</p><h3>Subscribe by email</h3><p>Adding an email subscription is still in progress.</p><h3>NGO websites</h3><p>We got a new requirement. NGOs wanted to check the possibility of collecting the email address of the volunteers.
    <a href="/weekly-updates/week-31#ngo-design">Based on the requirements</a>, WordPress seem to be a good fit since it matches all the required criteria.</p><h3>Prismjs</h3><p>I have been using GitHub gist to display code snippets. But recently, I discovered <a href="https://prismjs.com/">prismjs</a>
    for the same. It is light. Just 15KB in total and can be served from our server instead of making multiple calls like gist.
</p><p>A comparison between a sample gist from <a href="/cleaner-array-manipulation-using-es5-6-lodash">Cleaner array
    manipulation using ES5/6/lodash</a> post and prismjs block.</p><script src="https://gist.github.com/sridharrajs/f5388deadd2d2dcce339.js"></script><link type="text/css" href="/styles/prism.css" rel="stylesheet"/><script src="/scripts/prism.js"></script><pre><code class="language-js">
const totalByOne = users.reduce((previous, current) => {
    return previous + current.balance;
},0);

const totalByTwo = _.reduce(users, (totalBalance, user) => {
    return totalBalance + user.balance;
}, 0);

console.log(totalByOne); //220
console.log(totalByTwo); //220
</code></pre><p>The best part is that <b>it isn't an image. It is copyable code highlighted text.</b></p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-32</link>
      <guid>https://sridhar.co/weekly-updates/week-32</guid>
      <pubDate>Sun, 29 Jan 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 31: Brought books at the book fair, initiative to design 12 NGOs' websites, subscription by email - WIP</title>
      <description>
        <![CDATA[<p> This week was mostly spent discussing an initiative that my friend suggested. More on that to follow in the post.
</p><h3>Books</h3><p>
    We visited the Chennai book fair during the last week of the event and brought the following books.
</p><div class="tweet-container"><div class="image-container"><img alt="books sridhar brought from chennaibookfair in 2023" class="responsive"
             src="/images/2023-book-fair.jpeg"/><p style="text-align: center">Spoils from chennaibookfair 2023 📚</p></div></div><h3>PinQL</h3><p>
    I raised <a href="https://github.com/sridharrajs/pinql/pull/2">chore(react-ui): adding react to the app #2</a></p><p>This PR does the following things</p><ul><li>Adds <code>react</code> to the repo at <code>clients/reactui/</code> folder. For now, it is going to be react
        only. But in the future, I'm planning to add more clients like Svelte. All of them will be consuming the same
        response from GraphQL powered backend.
    </li><li>Since now we have 2 apps within the same repo technically, I added <a
            href="https://www.npmjs.com/package/concurrently">concurrently</a>, to start both of them at once.
    </li></ul><h3>Subscribe by email</h3><p>I'm wrapping up the final form validations and DB schema changes to accommodate the new category for
    <code>weeklies</code>. It
    should be ready in a week or two.
</p><div id="ngo-design"><h3 class="hyperlinked-header"><a href="#ngo-design">Free website design for NGOs</a></h3><p>My friend Eswar has a unique goal for 2023. He wants to help <a
        href="https://eswarcreatives.com/2023/01/17/free-website-design-development-for-ngo/">design 12 NGO websites for
    free of cost</a> this year. We have received excellent responses from the post. Based on the initial discussion with
    the registered NGOs, they had little to no presence online since they are heavily fieldwork based. The only
    tech they use is WhatApp, for organizing and sharing pictures of the event. They want to share all their work
    <em>digitally</em> on the Internet for others to see.</p><p>
    I'm thinking of the following criteria to help them meet their requirement.
</p><ul><li><strong>Admin accounts:</strong> for creating dynamic posts instead of static pages.</li><li><strong>SEO:</strong> dynamically generating sitemap.xml and robots.txt to be findable on Google search.</li><li><strong>Social media:</strong> Link all their social media account to their page.</li><li><strong>Google photos:</strong> Helping them move their old pictures to Google photo albums with public links.
    </li></ul><p>I'll share more here as I get to know them better.</p></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-31</link>
      <guid>https://sridhar.co/weekly-updates/week-31</guid>
      <pubDate>Sun, 22 Jan 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 30: Todos for 2023</title>
      <description>
        <![CDATA[<p> I'm taking stock of things that I plan to work on in 2023. These are the planned things. As always, there will be plenty of unplanned ones that I might also explore.
</p><h3>Publishing book summary</h3><p>I need to publish my notes for the following books I completed in 2022.</p><ol><li>Just Keep Buying: Proven Ways to Save Money and Build Your Wealth by Nick Maggiulli</li><li>Show Your Work!: 10 Ways to Share Your Creativity and Get Discovered by Austin Kleon</li><li>How to Live on 24 Hours a Day by Arnold Bennett</li><li>How to Fail at Almost Everything and Still Win Big: Kind of the Story of My Life by Scott Adams</li><li>Extreme Programming Explained: Embrace Change by Kent Beck</li></ol><h3>Side Projects</h3><ol><li><a href="https://github.com/sridharrajs/pin-tweet">pin-tweet</a>: Parse RSS feeds from youtube channels and
        Spotify and add them to Pinboard.
    </li><li><a href="https://github.com/sridharrajs/pinql">pinql</a>: build React front end UI.</li><li><a href="https://github.com/sridharrajs/backup-scripts">backup-scripts</a>: add Google/Azure to the mix?
    </li></ol><h3>Tools</h3><ol><li>TabPro: Publish it as a chrome plugin.</li><li>vi: publish my dotfiles</li></ol>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-30</link>
      <guid>https://sridhar.co/weekly-updates/week-30</guid>
      <pubDate>Sun, 15 Jan 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 29: adding hamburger menu, porting TabPro to Chrome, and Subscribe by email</title>
      <description>
        <![CDATA[<h3>Adding hamburger menu</h3><p> If you visit the home page, you can check the other site pages, such as books and archives. But if you land directly
    on one of the posts via Google search, you won't be able to access these pages since there is no entry point to
    them. I've fixed this now by adding a hamburger menu to the site.
</p><h3>TabPro</h3><p>I made TabPro Chrome compatible via <a href="https://github.com/sridharrajs/tabpro/pull/2">feat(chrome): add support
    for chrome #2</a> PR. The icon is WIP before uploading it to the chrome web store.</p><h3>Subscribe by email</h3><p>
    Based on the feedback I got from people, I'm working on adding an option to subscribe to the blog by email.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-29</link>
      <guid>https://sridhar.co/weekly-updates/week-29</guid>
      <pubDate>Sun, 08 Jan 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 28: published 2022 year in review, fixed emacs auto install missing package issue, and unread link count</title>
      <description>
        <![CDATA[<h3>Year in review</h3><p>I published the <a href="/year-2022-in-review">2022 year in review</a>.</p><div class="tweet-container"><iframe src="https://mastodon.social/@sridharrajs/109616015397972528/embed" class="mastodon-embed"
            style="max-width: 100%; border: 0" width="400" allowfullscreen="allowfullscreen"></iframe><script src="https://static-cdn.mastodon.social/embed.js" async="async"></script></div><h3>Unread links</h3><p>My backlog links count at the beginning of the year is <code>8943</code></p><h3>Emacs</h3><p>While doing a fresh install of emacs on a new system, I ran into package unavailable issues. So, I fixed it via <a
        href="https://github.com/sridharrajs/emacs.d/pull/1">chore: fix fresh installing issues #1</a> PR. This PR does a
    couple of things</p><ul><li>When you run
        emacs with this repo as your config folder, it will auto-install all the missing dependencies when it loads for
        the very first time using emacs's <code>package-install package</code></li><li>Adds a script to display the load time.</li></ul><div class="main"><div class="image-container"><img alt="emacs with load time" height="100px" class="responsive" src="/images/emacs-load.png"/><span>emacs with load time</span></div></div>

]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-28</link>
      <guid>https://sridhar.co/weekly-updates/week-28</guid>
      <pubDate>Sun, 01 Jan 2023 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 27: consolidated all books read, unread links and progress made in side projects in 2022</title>
      <description>
        <![CDATA[<p>
    This post will be the last weekly update of 2022, and I'm taking this as an opportunity to consolidate everything
    I've done so far this year.
</p><h3>Learning</h3><ul><li><a href="/how-to-generate-custom-rss-feed-from-scratch-programmatically">How to generate a custom RSS feed from
        scratch programmatically</a></li><li><a href="/weekly-updates/week-1">Learning vim</a></li><li><a href="/weekly-updates/week-1">ES2022 - JS standard vim</a></li></ul><h3>Books read in 2022</h3><p>I read the following books.</p><ol><li>
        Building a Second Brain: A Proven Method to Organize Your Digital Life and Unlock Your Creative Potential by
        Tiago Forte -
        <a href="/books/building-a-second-brain">My notes.</a></li><li>Just Keep Buying: Proven Ways to Save Money and Build Your Wealth by Nick Maggiulli</li><li>Show Your Work!: 10 Ways to Share Your Creativity and Get Discovered by Austin Kleon</li><li>How to Live on 24 Hours a Day by Arnold Bennett</li><li>What The Heck Do I Do With My Life by Ravi Venkatesan - <a href="/books/what-the-heck-do-i-do-with-my-life">My
        notes.</a></li><li>How to Fail at Almost Everything and Still Win Big: Kind of the Story of My Life by Scott Adams</li><li>Extreme Programming Explained: Embrace Change by Kent Beck</li></ol><h3>My backlog links count in 2022</h3><p>I started tracking the number of unread links seriously in June only. The idea is to be read-and-process-it than
    merely being an information hoarder.</p><div class="main"><div class="image-container"><img alt="pinboard unread link count" height="100px" class="responsive" src="/images/pinboard-links.png"/><span>Unread links</span></div></div><h3>StackOverflow</h3><p>I wrote the following answers</p><ol><li><a href="https://stackoverflow.com/a/73604165/978501">how to use async-await in custom validators</a></li><li><a href="https://stackoverflow.com/a/73457669/978501">How to make Telegram BOT reply to a specific message?</a></li><li><a href="https://stackoverflow.com/a/73485930/978501">Why is my code not working properly my output reflects
            twice in console , in for loop statement for
            print month date until 31</a></li><li><a href="https://stackoverflow.com/a/73589310/978501">How can use the .count() method in mongoose to count
            multiple collections</a></li><li><a href="https://stackoverflow.com/a/73589384/978501">Undefined when searching with Find Mongoose Express</a></li></ol><h3>Side projects in 2022</h3><p>I followed working in PR-style. PRs will have the following title based on the scope of change.</p><ul><li><strong>feat</strong>: for a new feature</li><li><strong>refactor</strong>: refactoring the existing functionality</li><li><strong>fix</strong>: bugs fixes</li><li><strong>docs</strong>: for adding and tweaking <code>README.md</code> and other docs.</li></ul><p>The followings are the list of side projects I worked</p><h4>pin-tweet</h4><ul><li><a href="https://github.com/sridharrajs/pin-tweet/pull/17"> tech(trackers): refactor stripping away the tracker
            from URL #17</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/16">fix: empty [] in ack response #16</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/14">refactor: tagging #14</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/13">docs: adding changelog and version bump #13</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/12">feat: add support for mastodon #12</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/11">fix(telegram): inform the user when bookmarking fails
            #11</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/10">tech: replace node-fetch with axios #10</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/9">feat(telegram): adding support for posting links
            directly from telegram to pinboard #9</a></li><li><a href="https://github.com/sridharrajs/pin-tweet/pull/8">feat(normalize-url): using normalize-url to strip
            tracking codes #8</a></li></ul><h4>utilities</h4><ul><li><a href="https://github.com/sridharrajs/utilities/pull/2">feat: support for pulling all github changes at once
        #2</a></li><li><a href="https://github.com/sridharrajs/utilities/pull/1">feat(commit.py): adding support for multiple origins
        #1</a></li></ul><h4>backup-scripts</h4><p>
    Script for uploading backups to s3. <br><small>Source code: <a href="https://github.com/sridharrajs/backup-scripts">sridharrajs/backup-scripts</a></small></p><h3>Tool list</h3><p></p><ul><li><a href="https://github.com/sridharrajs/vscode">VS Code</a> - Added shortcut to splitting the pane vertically.
    </li><li><a href="https://github.com/sridharrajs/browser-configurations">Browser configurations</a> - Added a11y related
        (<a
            href="https://wave.webaim.org/"
    >Wave</a
    >, <a href="https://addons.mozilla.org/en-US/firefox/addon/axe-devtools">axe DevTools</a>),
        <a href="https://docs.clearurls.xyz">ClearURLs</a> and <a
            href="https://github.com/sridharrajs/tabpro">TabPro</a>
        plugins
    </li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-27</link>
      <guid>https://sridhar.co/weekly-updates/week-27</guid>
      <pubDate>Sun, 25 Dec 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 26: Completed extreme programming book and added RSS feeds</title>
      <description>
        <![CDATA[<p>
    After 25 editions, I'm arriving at a rhythm in tracking-planning-executing things for the side projects.
    Based on the learnings, I'm also making changes to the format, more on this in the coming weeks.
</p><h3>Books & links</h3><p>I completed the <strong>Extreme Programming Explained: Embrace Change</strong> by Kent back. </p><p>
    The last unread link count was <code>8540</code><a href="/weekly-updates/week-24">two weeks</a> ago, and I cleared
    around 80 links this week alone. Hoping to allocate more time to this activity as we head towards year end.</p><h3>Adding RSS feeds to the site - WIP.</h3><p>
    I summarised my understanding of RSS in <a
        href="/how-to-generate-custom-rss-feed-from-scratch-programmatically">How to generate a custom RSS feed from
    scratch programmatically</a>. This site has a couple of RSS feeds.
<ul><li><a href="https://sridhar.co/rss.xml">https://sridhar.co/rss.xml</a> - RSS feed for all posts</li><li><a href="https://sridhar.co/weekly-updates-rss.xml">https://sridhar.co/weekly-updates-rss.xml</a> - RSS feed for
        weekly updates
    </li></ul><p>For now, the RSS feed does not have the content of the posts, and I'll work on improving this in the coming
    weeks.</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-26</link>
      <guid>https://sridhar.co/weekly-updates/week-26</guid>
      <pubDate>Sun, 18 Dec 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 25: Onebible - 1 issue filed, Pin-tweet - trackers stripped, Adding RSS feeds to the site - WIP #25th edition</title>
      <description>
        <![CDATA[<p>
    The <strong>Weekly update</strong> has reached its 25th edition. A milestone worth celebrating.
    Be it reading a variety of books or hacking on side projects. I always have a whole bunch of things going for me.
    But I was also finding it increasingly difficult to allocate time for such activities during my day. That's when I
    came across this idea
    from <a href="https://mastodon.social/@chadfowler/">Chad Fowler</a> from <strong>The
    Passionate Programmer: Creating a Remarkable Career in Software Development</strong> book.
</p><blockquote><strong> Simply setting a goal (daily, weekly, or whatever you’re capable of) and tracking this type of
        accomplishment can
        radically change your behavior.</strong> When you start to search for outstanding accomplishments, you naturally
    go through
    the process of evaluating and prioritizing your activities based on the business value of what you might work on.
    <br><br><strong> Tracking hits at a reasonably high frequency will ensure that you don’t get stuck: if you’re supposed to
        produce a
        hit per day, you can’t spend two weeks crafting the perfect task. This type of thinking and work becomes a habit
        rather than a major production. And, like a developer addicted to the green bar of a unit test suite, you start
        to
        get itchy if you haven’t knocked out today’s hit.</strong> You don’t have to worry so much about tracking your
    progress,
    because performing at this level becomes more akin to a nervous tic than a set of tasks that need to be planned out
    in Microsoft Project.
</blockquote><p>
    I choose <strong>weekly</strong> to plan and execute things per project/week. So far, this has been going
    great and
    has helped me accomplish more without burning out.
</p><h2>Programming & Learning</h2><h3>Onebible</h3><p>I filed a new user reported issue - <a href="https://github.com/onebible/android.onebible.in/issues/21">Tamil
    typo in II நாளாகமம் 7:14 #21</a>.</p><h3>Pin-tweet</h3><p>
    As mentioned
    <a href="/weekly-updates/week-24#pin-tweet">last week</a>, I implemented trimming query params like utm_campaign,
    utm_medium and utm_source for the rest of the channels via
    <a href="https://github.com/sridharrajs/pin-tweet/pull/17">tech(trackers): refactor stripping away the tracker from
        URL #17</a> PR.
</p><h3>Adding RSS feeds to the site - WIP</h3><p>
    I'm learning how to build RSS feeds for the site from scratch. The idea is to have two feeds, one for the regular
    posts and the other for the weekly updates.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-25</link>
      <guid>https://sridhar.co/weekly-updates/week-25</guid>
      <pubDate>Sun, 11 Dec 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 24: Onebible - 1 PR merged, 2 user reported issues and pin-tweet - 1 bug fix</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 58% completed.</li></ul><p>The unread bookmark count is <code>8540</code>.</p><h2>Programming & Learning</h2><h3>Onebible</h3><p>While I got the <a href="https://github.com/godlytalias/Bible-Database/pull/21">fix(tamil): grammatically error in 6
    verse #21</a> PR
    was merged last week, I got a couple of user reported issues.</p><ul><li><a href="https://github.com/onebible/android.onebible.in/issues/19"> Tamil typo in எபிரெயர் 4:3 #19</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/20"> Tamil typo in எபிரெயர் 7:20 #20</a></li></ul><p>I'm planning to address them this coming week.</p><div class="pin-tweet"><h3 class="hyperlinked-header"><a href="#pin-tweet">Pin-tweet</a></h3><p>I'd changed the telegram bot's response to include the list of applicable tags for the given URL. While using it
        for
        some time, I noticed that <a href="https://github.com/sridharrajs/pin-tweet/issues/15">if the URL doesn't have
            any matching rule, empty <code>[]</code> is set in ack response.</a>
        I've fixed this via <a href="https://github.com/sridharrajs/pin-tweet/pull/16">fix: empty [] in ack response
            #16</a> PR.
    </p><div class="split-image-container"><div class="image-container"><span><strong>Bug</strong></span><img alt="old"
                 class="responsive drop-shadow" src="/images/pin-tweet-bug.png"/></div><div class="image-container"><span><Strong>Fix</Strong></span><img alt="new"
                 class="responsive drop-shadow" src="/images/pin-tweet-fix.jpeg"/></div></div><p>
        Pin-tweet trims query params like <code>utm_campaign, utm_medium and utm_source</code> only when used as CLI.
        I need to extend this for other channels as well, so that bookmarked doesn't contain any trackers. Also, these
        query parameters should be config driven from
        <code>rules.json</code> file instead of being part of the code.
    </p></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-24</link>
      <guid>https://sridhar.co/weekly-updates/week-24</guid>
      <pubDate>Sun, 04 Dec 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 23: update on my Mastodon account and adding mastodon service to pin-tweet</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>The unread bookmark count is <code>8438</code>.</p><h2>Programming & Learning</h2><h3>Updates on My Mastodon account</h3><p>A good majority of the people whom I follow on Twitter have migrated to mastodon. Despite following them, my
    following hasn't achieved the right balance. Currently, it is tech-heavy, but I'm planning to experiment by
    following people across my interests to fine tune it. If you have any suggestions of people to follow for Humour,
    தமிழ், and personal finance topics, send them my way.</p><h3>Pin-tweet 2.0.0 changes</h3><p><a href="/weekly-updates/week-23">Last week</a>, I was evaluating npms for working with Mastodon APIs. But when I
    sat down to do the actual implementation, I discovered that both the <a
        href="https://docs.joinmastodon.org/methods/bookmarks/#get">bookmarks</a> and <a
        href="https://docs.joinmastodon.org/methods/statuses/#unbookmark">unbookmark</a> APIs are straightforward, and
    using
    an npm to make a couple of network calls seemed overkill. So, I changed the implementation to reflect this. More
    details on <a href="https://github.com/sridharrajs/pin-tweet/pull/12">feat: add support for mastodon #12</a> PR.
</p><p>The logic for tagging the URL as a bookmark was tightly coupled with Twitter since it was the only service for which
    this script was written. But now things have changed. So, I took this as an opportunity to refactor it to be generic
    through
    <a href="https://github.com/sridharrajs/pin-tweet/pull/14">refactor: tagging #14 </a> PR.</p><p>Also, I've added <code>Changelog.md</code> to the repo through <a
        href="https://github.com/sridharrajs/pin-tweet/pull/13">docs: adding changelog and version bump #13</a> PR.</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-23</link>
      <guid>https://sridhar.co/weekly-updates/week-23</guid>
      <pubDate>Sun, 27 Nov 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 22: site revamp - done, book updates, evaluating mastodon-api</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 55% completed</li></ul><p>The unread bookmark count is <code>8293</code>.</p><h2>Programming & Learning</h2><h3>site revamp</h3><p><a href="/weekly-updates/week-21">Last week</a>, it was a home page revamp. This week, it is
    <code>sitemap.xml</code>
    and
    <code>archive</code> revamp. I build the entire site in the <code>expressjs</code> framework while optimizing the
    home page, I noticed that the
    generation setup could be improved. I exactly worked on that this week.
</p><h3>pin-tweet</h3><p>
    Evaluating the <a href="https://github.com/vanita5/mastodon-api">mastodon-api</a> module to retrieve the mastodon
    bookmarks. Once that is done, I need to update the <a href="https://github.com/sridharrajs/pin-tweet">pin-tweet</a> to
    post them to the pinboard.
</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-22</link>
      <guid>https://sridhar.co/weekly-updates/week-22</guid>
      <pubDate>Sun, 20 Nov 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 21: home page revamp - done, book updates, reprioritizing tasks</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 37% completed</li><li>Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems - 6%
        completed.
    </li></ul><p>
    The unread bookmark count is at <code>8238</code>.
</p><h2>Programming & Learning</h2><h3>Home page revamp</h3><p>As I said <a href="/weekly-updates/week-20">last week</a>, home page revamp is complete. The new page is visually
    optimized
    for the quick eye <em>scan</em> than wanting to read anything to know.
</p><div class="split-image-container"><div class="image-container"><span><strong>Old</strong></span><img alt="old"
             class="responsive drop-shadow" src="/images/old.png"/></div><div class="image-container"><span><Strong>New</Strong></span><img alt="new"
             class="responsive drop-shadow" src="/images/new.png"/></div></div><p>Also, new page is 100% optimized for speed and accessibility.
</p><div class="split-image-one3-container"><div class="image-container"><p><strong>Google PageSpeed Insights</strong></p><img alt="old"
             class="responsive drop-shadow" src="/images/google-page-sight.png"/></div><div class="image-container"><span><Strong>Wave evaulation</Strong></span><img alt="Wave evaulation"
             class="responsive drop-shadow" src="/images/wave-evaulation.png"/></div><div class="image-container"><span><Strong>Axe dev tool</Strong></span><img alt="Axe dev tool"
             class="responsive drop-shadow" src="/images/axe-dev-tool.png"/></div></div><h3>Reprioritizing tasks</h3><ul><li>Planning to complete <strong>Extreme Programming Explained</strong> by this week.</li><li>Adding support for moving mastodon <code>bookmarks</code> to pinboard in <a
            href="https://github.com/sridharrajs/pin-tweet">pin-tweet</a>.
    </li><li><strong>The Richest Man in Babylon</strong> summary - Paused.
    </li></ul>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-21</link>
      <guid>https://sridhar.co/weekly-updates/week-21</guid>
      <pubDate>Sun, 13 Nov 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 20: home page revamp - WIP, pull.py for pulling remote changes and dusted off mastodon handle</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Mindset - 13% completed.</li><li>Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems - 6%
        completed.
    </li></ul><p>
    Summarizing my notes from <strong>The Richest Man in Babylon</strong> - WIP.
</p><p>
    The unread bookmark count is at <code>8113</code>.
</p><h2>Programming & Learning</h2><h3>Mastodon.social</h3><p>I created <a href="https://mastodon.social/@sridharrajs">@sridharrajs@mastodon.social</a> in 2017, but haven't been
    active on the site. After the recent changes at Twitter, I dusted off the handle. Mastodon today reminds me of the
    early days of Twitter. I'm hoping to spend some time there. </p><h3>utilities</h3><p>Raised a <a href="https://github.com/sridharrajs/utilities/pull/2">feat: support for pulling all github changes at
    once #2</a> PR that adds <code>pull.py</code> for <code>git pull</code> across all git repos at once. This utility
    project eventually needs to be an installer.</p><h3>pin-tweet</h3><p>I'm refactoring tagging section of <a
        href="https://github.com/sridharrajs/pin-tweet/blob/master/service/pinboard-service.js#L12-L38">pin-tweet</a> to
    use regex instead <code>if</code> checks.</p><h3>Revamping home page</h3><p>
    I'm revamping the home page of this site. Should be published by next week.
</p><h3>Tweets</h3><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Given that we&#39;re seeing a lot of discussions happening
        around pricing/features at <a href="https://twitter.com/Twitter?ref_src=twsrc%5Etfw">@Twitter</a>, it is a good
        idea to download your Twitter archive while it is available.<a href="https://t.co/M4LuZSpuHe">https://t.co/M4LuZSpuHe</a><a href="https://t.co/VvDqrenA5H">pic.twitter.com/VvDqrenA5H</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1587367753820037121?ref_src=twsrc%5Etfw">November
            1, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-20</link>
      <guid>https://sridhar.co/weekly-updates/week-20</guid>
      <pubDate>Sun, 06 Nov 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 19: Fixing broken URLs, book summary - WIP and app update - paused</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    Mindset - 13% completed. Summarizing my notes from <strong>The Richest Man in Babylon</strong> - WIP.
</p><p>
    The unread bookmark count is at <code>7915</code>. I've inbox 0 on all my email account, meaning I've
    read-replied-deleted-moved links to pinboard.
</p><h2>Programming & Learning</h2><h3></h3><h3>Onebible</h3><p><a href="https://github.com/godlytalias/Bible-Database/pull/21">fix(tamil): grammatically error in 6 verse #21</a>
    is still open. But I've paused App development for now to allocate time for other high priority things.
</p><h3>Fixing broken URL on sridhar.co</h3><p>
    I was working on fixing the broken URL on this blog.
</p><h3>Tweets</h3><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">&quot;If you take any kind of writing course, the first
        advice they give you is “understand your audience”. And, like it or not, code is no different. We write code for
        a human audience.&quot; by <a href="https://twitter.com/jrsinclair?ref_src=twsrc%5Etfw">@jrsinclair</a><a
                href="https://t.co/2eJioprWbq">https://t.co/2eJioprWbq</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1585195931477372931?ref_src=twsrc%5Etfw">October
            26, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-19</link>
      <guid>https://sridhar.co/weekly-updates/week-19</guid>
      <pubDate>Sat, 29 Oct 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 18: Resumed reading Mindset, book summary and app update - WIP</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>சிவகாமியின் சபதம் - 59% completed.</li><li>Mindset - 6% completed.</li></ul><p>
    Summarizing my notes from <strong>The Richest Man in Babylon</strong> - WIP.
</p><p>
    The unread count is at <code>7857</code>. I think this will the maximum count I'll have for sometime. I've cleared
    all my email inbox and moved all links to the pinboard.
</p><h2>Programming & Learning</h2><h3>Onebible</h3><p>
    Last release was made on Jul, 2021. I'm taking this as an opportunity to revisit the item that can be trimmed
    from the app.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-18</link>
      <guid>https://sridhar.co/weekly-updates/week-18</guid>
      <pubDate>Sun, 23 Oct 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 17: சிவகாமியின் சபதம் - 57% complete, Onebible - 1 PR raised, and resurrecting my Debian laptop</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    சிவகாமியின் சபதம் - 57% completed.
</p><p>
    The unread count is at <code>7761</code>.
</p><h2>Programming & Learning</h2><h3>Onebible</h3><p>
    Raised <a href="https://github.com/godlytalias/Bible-Database/pull/21"> fix(tamil): grammatically error in 6 verse
    #21</a> in the upstream repo that fixes the following issues
</p><ul><li><a href="https://github.com/onebible/android.onebible.in/issues/14">#14 Tamil typo in Acts 1:12</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/15">#15 Tamil typo in Ezra 10:14,24</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/16">#16 Tamil typo in Hebrew 11:10</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/17">#17 Tamil typo in Revelations 9:5</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/18">#18 Tamil typo in எரேமியா 4:25</a></li></ul><p>These issues will be addressed from the app side in version <code>1.5.10</code> which is in works.</p><h3>Going all-in on vim</h3><p>
    I'm using <code>vim</code> for writing journal and diary. The idea is to replace vscode with vim eventually.
</p><h3>Resurrecting My Debian laptop</h3><p>
    I resurrected <a href="/my-desktop">My HP laptop</a> by servicing it for the hardware issue. In fact this entry itself is
    written using
    <code>vim</code> on Debian. Feels so good.
</p><h3>Tweet</h3><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Learning is vast; the learner&#39;s time is short. So, be
        wise
        in choosing what you want to read via <a href="https://twitter.com/OldTamilPoetry?ref_src=twsrc%5Etfw">@OldTamilPoetry</a><a href="https://t.co/Jgu6pv0Z5X">pic.twitter.com/Jgu6pv0Z5X</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs)
        <a href="https://twitter.com/sridharrajs/status/1580839415890354176?ref_src=twsrc%5Etfw">October 14, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-17</link>
      <guid>https://sridhar.co/weekly-updates/week-17</guid>
      <pubDate>Sat, 15 Oct 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 16: Reading சிவகாமியின் சபதம்</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    The unread count is at <code>7739</code>.
</p><p>I took a break from my regular format and focused only on reading சிவகாமியின் சபதம். 38% completed.</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-16</link>
      <guid>https://sridhar.co/weekly-updates/week-16</guid>
      <pubDate>Sat, 08 Oct 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 15: Auto-detecting remotes in commit.py, Onebible - fixing typos - WIP</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>சிவகாமியின் சபதம் - 22% completed</li></ul><p>
    The unread count is at <code>7621</code>.
</p><h2>Programming & Learning</h2><h3>Utilities</h3><p><code>commit.py</code>, an utility script to publish the staged changed was hard coded to push only to
    <code>origin</code>. I fixed it to pick all the <code>remotes</code> available at repository setup in <a
        href="https://github.com/sridharrajs/utilities/pull/1"> feat(commit.py): adding support for multiple origins
    #1</a></p><h3>android.onebible.in</h3><p>I've started working on fixing typo issues and will be raising PR next week and if possible, release an app
    update.</p>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-15</link>
      <guid>https://sridhar.co/weekly-updates/week-15</guid>
      <pubDate>Sat, 01 Oct 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 14: Published my notes from building your second brain book, Started reading சிவகாமியின் சபதம்</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Building your second brain - <a href="/books/building-a-second-brain">My notes</a></li><li>சிவகாமியின் சபதம் - 18% completed</li></ul><p>
    Finally, I published my notes from the book and resumed my book reading.
</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Building a Second Brain by <a
            href="https://twitter.com/fortelabs?ref_src=twsrc%5Etfw">@fortelabs</a> will teach you<br><br>1. Why you
        should
        take notes.<br>2. How to effectively organize them for actionability using CODE.<br><br>My notes from the book<a
                href="https://t.co/cPGbdiPR44">https://t.co/cPGbdiPR44</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1574166191110729728?ref_src=twsrc%5Etfw">September
            25, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><p>
    If you're a serious note-taker, you might already know most of the things that Second brain teaches, but if you're
    entire new to the subject, I highly recommended checking on Derek Siver's take on the subject.
</p><blockquote><strong>If digital, use only plain text. </strong>It’s a standard format not owned by any company. It will be
    readable in 50 years on
    devices we haven’t even imagined yet. Don’t use formats that can only be read by one program, because that program
    won’t be around in 50 years. Don’t use the cloud, unless you’re also going to download it weekly and back it up in
    plain text outside that cloud. (Companies shut down. Clouds disappear. Think long-term.)
</blockquote><p>
    From <a href="https://sive.rs/dj">Benefits of a daily diary and topic journals</a></p><p>
    Or Thoreau's take on same subject.
</p><div class="tweet-container"><iframe width="560" height="315" src="https://www.youtube.com/embed/eky5uKILXtM" title="YouTube video player"
            frameborder="0"
            allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
            allowfullscreen></iframe></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-14</link>
      <guid>https://sridhar.co/weekly-updates/week-14</guid>
      <pubDate>Sat, 24 Sep 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 13: Book summary - WIP and filed 1 issue</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    The unread count is at <code>7475</code>.
</p><p>
    I'm solely focusing only on completing the <strong>Building a Second Brain</strong> summary. Until it is done, won't
    be
    spending my time on anything else.
</p><h2>Programming & Learning</h2><h3>Filing issues</h3><p>
    I filed one of issues on Github.
</p><ul><li><a href="https://github.com/onebible/android.onebible.in/issues/17">android.onebible.in: Tamil typo in
        revelations 9:5 #17</a></li></ul>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-13</link>
      <guid>https://sridhar.co/weekly-updates/week-13</guid>
      <pubDate>Sat, 17 Sep 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 12: Book summary - WIP, filed 2 issues, and 1 answers on StackOverflow</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    The unread count is at <code>7397</code>.
</p><p>
    I'm solely focusing only on completing the <strong>Building a Second Brain</strong> summary. Until it is done, won't
    be
    spending my time on anything else.
</p><h2>Programming & Learning</h2><h3>Filing issues</h3><p>
    I filed couple of issues on Github.
</p><ul><li><a href="https://github.com/fibelatti/pinboard-kotlin/issues/82">pinboard-kotlin: incorrect bookmark count
            #82</a></li><li><a href="https://github.com/onebible/android.onebible.in/issues/16">android.onebible.in: Tamil typo in Hebrew
        11:10 #16</a></li></ul><h3>StackOverflow</h3>

I wrote an answer to a question on StackOverflow.
<ul><li><a href="https://stackoverflow.com/a/73604165/978501">how to use async-await in custom validators</a></li></ul>

]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-12</link>
      <guid>https://sridhar.co/weekly-updates/week-12</guid>
      <pubDate>Sun, 11 Sep 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 11:  Book summary - WIP, Python script for S3 upload, and 2 answers on StackOverflow</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>
        Extreme Programming Explained: Embrace Change (The XP Series) - 27% completed.
    </li><li>
        Mindset - Updated Edition: Changing The Way You think To Fulfil Your Potential - 5% completed.
    </li></ul><p>
    Summarizing <strong>Building a Second Brain</strong> book is still WIP.
</p><p>
    The telegram integration has improved my workflow so much that, my bookmark count now increases by double digits
    every day. So much information to <em>read-process-journal-discard</em>. The unread count is at <code>7242</code>.
</p><h2>Programming & Learning</h2><h3>Improving backup strategy</h3><p>Both Google one and iCloud seem to be offering 200GB of storage(inclusive of phone backups) at ~ ₹200. But if
    you want to be <em>self-reliant</em> without being locked into their ecosystem, <a
            href="https://aws.amazon.com/s3/storage-classes/glacier/instant-retrieval/">Amazon S3 Glacier Instant
        Retrieval storage</a> seems a viable option for storing backups on the cloud. I wrote <a
            href="https://github.com/sridharrajs/backup-scripts">backup-scripts</a>, a python script to explore
    uploading
    images to s3.</p><div class="main"><div class="image-container"><img alt="a11y-before"
             title="s3-upload of my weekly update"
             class="responsive" src="/images/s3-upload.png"/></div></div><h3>Pin-tweet</h3><p>
    I deployed the PR changes, I noticed that in case of failure due to timeout, there is no message to the user in case
    of failure to bookmark. Fixed that in <a href="https://github.com/sridharrajs/pin-tweet/pull/11"> PR #11</a> and
    migrated from <code>node-fetch</code> to <code>axios</code> in
    <a href="https://github.com/sridharrajs/pin-tweet/pull/10">PR #10</a>. After adding telegram, I'm preferring the bot
    over the Pinkt app since it is just a one step process of bookmarking links.
</p><h3>StackOverflow</h3>

I wrote answers to a couple of questions on StackOverflow.
<ul><li><a href="https://stackoverflow.com/a/73589310/978501">How can use the .count() method in mongoose to count
            multiple collections</a></li><li><a href="https://stackoverflow.com/a/73589384/978501">Undefined when searching with Find Mongoose Express</a></li></ul>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-11</link>
      <guid>https://sridhar.co/weekly-updates/week-11</guid>
      <pubDate>Sat, 03 Sep 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 10: Completed 'Building a Second Brain' and summary - WIP, created a bot to post links from telegram to pinboard, wrote 2 answers on StackOverflow</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    I've completed the <strong>Building a Second Brain</strong> book, and a post summarizing my notes from it is WIP.
    Not much of
    a change in the unread count, it is at <code>7064</code>.
</p><h2>Programming & Learning</h2><h3>pin-tweet</h3><p>
    Adding links from the <a href="https://fossunited.org/">FOSS United</a> telegram group to the pinboard, individually
    was painful. so, I created a telegram bot for added it to pin-tweet via <a
        href="https://github.com/sridharrajs/pin-tweet/pull/9">#9 PR</a></p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Organise notes for actionability <a
            href="https://t.co/4LSYEcsUVN">pic.twitter.com/4LSYEcsUVN</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1561927063338041344?ref_src=twsrc%5Etfw">August
            23, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><h3>StackOverflow</h3>

After brief inactivity, I wrote answers to a couple of questions on StackOverflow.
<ul><li><a href="https://stackoverflow.com/a/73457669/978501">How to make Telegram BOT reply to a specific message?</a></li><li><a href="https://stackoverflow.com/a/73485930/978501">Why is my code not working properly my output reflects
            twice in console , in for loop statement for
            print month date until 31</a></li></ul>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-10</link>
      <guid>https://sridhar.co/weekly-updates/week-10</guid>
      <pubDate>Sat, 27 Aug 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 9: 7k links, Onebible - nodejs migration script - WIP, replacing KeePassX with KeePassXC in my toolbox</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>As predicted <a
        href="/weekly-updates/week-8">last week</a>, my unread count has crossed 7k and currently is at
    <code>7020</code>.
    I got a few interesting pointers from <strong>Building a Second Brain</strong> book on how to improve my note-taking
    workflow. I'm already putting them into practice. 90% done with the book and the rest should be completed by this week.
</p><h2>Programming & Learning</h2><h3>Onebible</h3><p>
    Earlier, <strong>godlytalias</strong> had
    <a href="https://github.com/godlytalias/Bible-Database/pull/19#pullrequestreview-1041137825">suggested</a> that we
    fix both <code>XML</code> and <code>JSON</code> files as
    well. Both <code>bible.xml</code> and <code>bible.json</code> have <code>31K+</code> lines and roughly around <code>~14MB</code>
    each. I'm writing a nodejs migration script that efficiently reads the file's content <em>line by line</em> and
    replaces-if-required
    without loading all the content at once into the memory.
</p><h3>KeePassXC - a replacement for KeePassX</h3><p>

    KeePassX, my password manager since 2014 is <a href="https://www.keepassx.org/index.html%3Fp=636.html">no longer
    being actively maintained</a>. So like me, If you're using KeePassX, you can migrate to
    <a href="https://keepassxc.org/">KeePassXC</a> as suggested in the official <a
        href="https://www.keepassx.org/index.html%3Fp=636.html">blog</a>. No other change is required. Everything works
    as-is since the password databases are compatible with each other. Also, for mobile, I discovered <a
        href="https://github.com/Kunzisoft/KeePassDX">KeePassDX</a>, and updated <a href="/my-toolbox">my toolbox</a> to
    reflect all these changes.
</p><h3>Updating utility script</h3><p>
    Updated <a href="https://github.com/sridharrajs/utilities/blob/master/commit.py#L66-L69">commit.py</a>,
    my utility script to push the changes to BitBucket and Gitlab services.
</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Python script I use to post my notes across git hosting
        services as stated on the weekly review.<br><br>1. Add GitLab as &quot;gl&quot; and BitBucket as &quot;bb&quot;
        remote origins.<br>2. Copy `<a href="https://t.co/T16EBsyKtx">https://t.co/T16EBsyKtx</a>` to your notes
        project.<br>3. Do `python3 <a href="https://t.co/T16EBsyKtx">https://t.co/T16EBsyKtx</a>`<a
                href="https://t.co/PRGSsK0fcs">https://t.co/PRGSsK0fcs</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1560268402375413763?ref_src=twsrc%5Etfw">August
            18, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-9</link>
      <guid>https://sridhar.co/weekly-updates/week-9</guid>
      <pubDate>Sat, 20 Aug 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 8: Onebible 1 PR merged, 1 VS code mindmap extension, exploring backup options - still on</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>No change in the book reads. Unread count <code>6924</code> and will probably hit <code>7k</code> next week.</p><h2>Programming & Learning</h2><h3>Onebible PRs</h3><p>
    I raised a massive PR - <a href="https://github.com/godlytalias/Bible-Database/pull/20">#20</a> correcting 100+
    verses and got it merged.
</p><h3>Markmap - VS Code extension </h3><p>
    I discovered <a href="https://github.com/gera2ld/markmap-vscode">Markmap</a>, an extension to visualize your markdown
    files in VSCode. I've been using it for a week, seems to be solid.
</p><div class="main"><div class="image-container"><img alt="a11y-before"
             title="mindmap of my weekly update"
             class="responsive" src="/images/mind-map.png"/></div></div><h3>Improving backup strategy</h3><p>
    There are three categories of things that need to be backed up.
</p><ol><li>Notes.</li><li>Code</li><li>Media files.</li><li>Docs - pdfs, password file.</li></ol><p>
    For #1, I create and edit notes as plain simple markdown <code>.md</code> files on vscode and store them using
    <code>git</code>. I leverage <code>git remote</code> to keep my backup on <code>GitLab</code>
    and <code>bitbucket</code> in sync. Improving redundancy here means, having multiple <code>remote</code> set!
</p><p>
    For #2, I've all my code and configs for text editor(<a href="https://github.com/sridharrajs/emacs.d">emacs</a>, <a
        href="https://github.com/sridharrajs/dotfiles">dotfiles</a>,
    <a href="https://github.com/sridharrajs/vscode">vscode</a>, <a
        href="https://github.com/sridharrajs/webstorm-settings">webstorm-settings</a>), and
    <a href="https://github.com/sridharrajs/browser-configurations">browser tweaks</a> on Github. My 2FA codes are on Authy.
</p><p>
    For #3 & #4, I've been using an external hard disk. Thinking of improving the redundancy by adding a cloud provider.
</p><p><a href="https://fully-faltoo.com/"><strong>Pratyush</strong></a> had a <a
        href="https://twitter.com/faltoo/status/1556356731277836288">suggestion</a> that does an incremental backup of
    the
    OS. <a href="https://piwigo.org/">Piwingo</a> seems to be a decent option for #3 alone. I'm exploring other options
    as well. I'm more interested in backing up the content I create on the system than
    the system itself. Since <a href="/year-2020-in-review#mobile">2020</a>, I've been intentionally switching phone platforms
    now and then to keep my tech dependency in
    check. So far, it is successful and this helped me learn what is important and what isn't. So, wanted to replicate
    the same on the laptop as well.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-8</link>
      <guid>https://sridhar.co/weekly-updates/week-8</guid>
      <pubDate>Sat, 13 Aug 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 7: PinQL - Adding mutation and publishing roadmap, exploring S3</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Building a Second Brain - 30% completed</li><li>Extreme Programming Explained: Embrace Change (The XP Series) - 21% completed</li><li>Refactoring - 2nd edition - 13% completed</li><li>Mindset: Changing The Way You think To Fulfil Your Potential - 8% completed</li></ul><p>Pinboard unread count <code>6873</code>.</p><h2>Programming & Learning</h2><h3>PinQL updates</h3><p>
    I published the <a href="/pinql-roadmap">roadmap</a> for the PinQL and was working on adding the
    mutations to complete the CRUD operations on links.
</p><ul><li>Create a bookmark - <code>addBookmark</code> mutation</li><li>Read all bookmarks - <code>Post</code> query</li><li>Update an existing bookmark - <code>updateBookmark</code> mutation</li><li>Delete a bookmark - <code>deleteBookmark</code> mutation</li></ul><p>For schema design and screenshot, Please refer to <a href="https://github.com/sridharrajs/pinql/pull/1">#1</a> PR.
    Integrating <code>rule</code> is in progress.
</p><h3>Improving backup strategy</h3><p>
    One of the goals of 2022 was to work on <a href="/year-2021-in-review#be-tech-independent">being tech independent</a>.
    I've started working on that. The cost for storing 1GB of
    data on Amazon S3 is ~ ₹2 ($0.025) in Asia pacific Mumbai region. I've 10s of GB of kids' photos and videos. Exploring
    options to have a copy on the cloud as a backup option in
    addition to the external hard drives.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-7</link>
      <guid>https://sridhar.co/weekly-updates/week-7</guid>
      <pubDate>Fri, 05 Aug 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 6: Practising being deliberate with time, resuming PinQL, retiring now page</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    Reading <strong>Building a Second Brain</strong> book gave ideas on how to capture notes, and organize
    them. I was focusing on reading links from Pinboard. Despite clearing a whole bunch of links, my unread count
    is still at <code>6868</code>. Net -10 only.
</p><ul><li>Building a Second Brain - 30% completed</li><li>Extreme Programming Explained: Embrace Change (The XP Series) - 21% completed</li><li>Refactoring - 2nd edition - 13% completed</li><li>Mindset: Changing The Way You think To Fulfil Your Potential - 8% completed</li></ul><h2>Programming & Learning</h2><h3></h3><p>If you want to have control over your time, and thereby your life. You need to be deliberate with the things that
    you do with your time. Sometimes it means making it <a href="/books/atomic-habits#response">harder for you to do
        certain
        things.</a></p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">The single best thing you can do to be deliberate about the
        amount of time you spend on the Internet. <a href="https://t.co/w1FEcmLYco">pic.twitter.com/w1FEcmLYco</a></p>&mdash;
        Sridhar Raj Sampath Kumar (@sridharrajs) <a
                href="https://twitter.com/sridharrajs/status/1552911760579268610?ref_src=twsrc%5Etfw">July 29, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><h3>PinQL - updates</h3><p>
    I'd written a Query for fetching the article for <a href="https://github.com/sridharrajs/pinql">PinQL</a> on <a
        href="/weekly-updates/week-3">Week 3</a>. This week I was working on adding mutation for bookmarking an article.
    Also, a blog post about the idea behind PinQL is in the works.
</p><h3>Site clean up</h3><p>
    I'm retiring the now page of this site, from now on any request to <a href="https://sridhar.co/now">https://sridhar.co/now</a>
    will be redirected to <a href="https://sridhar.co/weekly-updates">https://sridhar.co/weekly-updates</a> with status
    code
    <code>301</code>.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-6</link>
      <guid>https://sridhar.co/weekly-updates/week-6</guid>
      <pubDate>Sat, 30 Jul 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 5: Deploying Jenkins, fixing couple of a11y issues, 1 new browser extension and a published book notes</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><p>
    I didn't read books this week, was focusing on completing the review of <strong>What The Heck Do I Do With My
    Life</strong> book. Here is the <a href="/books/what-the-heck-do-i-do-with-my-life">published summary</a>.
</p><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 21% completed</li><li>Refactoring - 2nd edition - 13% completed</li><li>Building a Second Brain - 6% completed</li></ul><p>
    Read a bunch of a11y related links, my bookmark count is <code>6878</code></p><h2>Programming & Learning</h2><h3>a11y</h3><p>
    I'm continuing to learn more on the <code>a11y</code> standards and on how to improving the accessibility for the
    webpages. Will be sharing my learnings soon. Meanwhile, if you're using eslint for your JavaScript linting, add <a
        href="https://www.npmjs.com/package/eslint-plugin-jsx-a11y">eslint-plugin-jsx-a11y</a> to your project to to
    spot accessibility issues in React apps.
</p><p>
    Fixed a couple of a11y issues. Following is the report.


</p><div class="main"><div class="image-container"><img alt="a11y-before"
             class="responsive" src="/images/a11y-report.png"/><span>Google Lighthouse report - accessibility score 100</span></div></div><p>
    Discovered <a href="https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/">axe DevTools - Web Accessibility
    Testing</a>, a browser plugin for static analysing the a11y issues. Adding it to my <a
        href="https://github.com/sridharrajs/browser-configurations/blob/master/README.md">browser-configuration</a></p><h3>Side projects - Jenkins & FB page clean ups</h3><p>
    I'm was mostly working on configuring Jenkins to do the CI/CD for my side projects. Closed down FB pages of my
    defunct
    side projects except <a
        href="https://www.facebook.com/onebible.in">onebible.in</a> page to narrow down focus.
</p>]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-5</link>
      <guid>https://sridhar.co/weekly-updates/week-5</guid>
      <pubDate>Sat, 23 Jul 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 4: Learning a11y, Node.js - assert(), Onebible - 2 PR merged, 2 new browser extension addition to my tool box</title>
      <description>
        <![CDATA[<h2>Books and Links</h2>

I started reading <strong>Building a Second
    Brain</strong> and trying to squeeze in some time for summarizing my notes from the
<strong> What The Heck Do I Do With My Life</strong> book - still WIP.
<br><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 21% completed</li><li>Refactoring - 2nd edition - 13% completed</li><li>Building a Second Brain - 6% completed</li></ul><p>
    Added a bunch of a11y links, as a result, my bookmark count is <code>6867</code></p><h2>Programming & Learning</h2><h3>Onebible PRs</h3><p>
    PR <a href="https://github.com/godlytalias/Bible-Database/pull/19">#19</a> which I raised last week and <a
        href="https://github.com/godlytalias/Bible-Database/pull/17">#17</a> were merged
    this week. These PRs were making changes only on the <code>.sql</code>file. In addition to the <code>.sql</code>
    file, the repo has <code>.xml</code>, <code>.json</code> file format as well. Next up, I'm planning to write a
    script to take care of updating these as <a
        href="https://github.com/godlytalias/Bible-Database/pull/19#pullrequestreview-1041137825">suggested</a> by
    the repo owner.
</p><br><h3>Testing for a11y</h3><p>
    I was learning more about a11y and was focusing on how to make the site accessible for both keyboard-only users and screenreader-only users.
</p><div class="main"><div class="image-container" style="width: 50%"><img alt="a11y-before"
             class="responsive" src="/images/a11y-before.png"/><span>Before</span></div><div class="image-container" style="width: 50%"><img alt="a11y-after"
             class="responsive" src="/images/a11y-after.png"/><span>After</span></div></div><p>Testing and fixing a11y issues is easy using the <a href="https://wave.webaim.org/">WAVE</a> browser extension.
    Along with WAVE, I discovered
    <code><a href="https://github.com/ClearURLs/Addon/">ClearURLs</a></code> - an open sourced browser extension for removing <code>utm_source</code>, <code>utm_medium</code>, <code>utm_campaign</code>,
    and similar tracking parameters from URLs
    before loading them.
</p><p>
    Adding both <code>WAVE</code> & <code>ClearURLs</code> to my <a
        href="https://github.com/sridharrajs/browser-configurations/">browser-configuration</a></p><br><h3>Adding test for a node script</h3><p>
    While adding tests for the node script, I learnt that you can use <code>assert</code> that comes with Node.js
    instead of using an npm dependency.
</p><blockquote class="twitter-tweet"><p lang="en" dir="ltr">If you want to test a condition for a little utility program
    without wanting to add any additional dependencies, you can use the native assert that comes with Node.js <a
            href="https://t.co/oLAIQZEc4z">pic.twitter.com/oLAIQZEc4z</a></p>&mdash; Sridhar Raj Sampath Kumar
    (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1547570823741177856?ref_src=twsrc%5Etfw">July 14,
        2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-4</link>
      <guid>https://sridhar.co/weekly-updates/week-4</guid>
      <pubDate>Sat, 16 Jul 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 3: PinQL - a GraphQL side project, book notes WIP</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li>Extreme Programming Explained: Embrace Change (The XP Series) - 21% completed</li><li> Refactoring - 2nd edition - 13% completed</li></ul>

Summarizing the notes from the <strong> What The Heck Do I Do With My Life</strong> book - WIP.

<p>
    Bookmark count = <code>6790</code>. Apparently rate of
    adding new links > my rate of reading links.
</p><h2>Programming & Learning</h2>

The idea I had for <a href="/pin-tweet-auto-tagging">pin-tweet</a> is simple:

<blockquote>
    One way to improve your reading habits is to have <strong>a HEALTHY BACKLOG of all YOUR links in one place</strong>
    before you want
    to read them. Links from email newsletters, tweets, WhatsApp, and telegram all in one place.
    <p>I wrote <a href="https://github.com/sridharrajs/pin-tweet">pin-tweet</a>, a node utility script to solve it.</p></blockquote><p>In <a href="/year-2020-in-review#sideproject">2020</a>, I wanted to do a side project using GraphQL but didn't really
    get started with it. But this year, I'm getting started. Introducing <a href="https://github.com/sridharrajs/pinql">PinQL</a>,
    a webclient for Pinboard + my rules powered using GraphQL. I just got the basic things set up. </p>

]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-3</link>
      <guid>https://sridhar.co/weekly-updates/week-3</guid>
      <pubDate>Sat, 09 Jul 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 2: Digging into JavaScript Objects, Onebible - 1 PR raised and 1 book completed</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li><strike>Just Keep Buying: Proven Ways to Save Money and Build Your Wealth</strike> - completed this week.</li><li>Extreme Programming Explained: Embrace Change (The XP Series) - 19% completed</li><li> Refactoring - 2nd edition - 12% completed</li></ul>

Currently summarizing the notes from the <strong> What The Heck Do I Do With My Life</strong> book.

<p>
    Bookmark count = <code>6730</code>. Apparently rate of
    adding new links > my rate of reading links.
</p><h2>Programming & Learning</h2><p>As I said <a href="/weekly-updates/week-1">last week</a>, I raised <a
        href="https://github.com/godlytalias/Bible-Database/pull/17"> fix(tamil):
    unrecognized font clean up and verse corrections - batch3 #17 </a> in OneBible.
</p><p>
    I'm digging into <a
        href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object">MDN pages</a> and
    refreshing my understanding of JavaScript <code>Object</code></p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Starting with ES2022, You can use `Object.hasOwn()` to
        determine whether an object has the indicated property as its own property or not. <a
                href="https://t.co/0i5dT5ovDr">pic.twitter.com/0i5dT5ovDr</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1542083422364917760?ref_src=twsrc%5Etfw">June 29,
            2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">In JavaScript, Object keys can either be a string or a
        symbol. Any other type will implicitly be cast to a string via the `toString()` method. <a
                href="https://t.co/f6Wt25oi1c">pic.twitter.com/f6Wt25oi1c</a></p>&mdash; Sridhar Raj Sampath Kumar
        (@sridharrajs) <a href="https://twitter.com/sridharrajs/status/1542432049507684352?ref_src=twsrc%5Etfw">June 30,
            2022</a></blockquote></div>




]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-2</link>
      <guid>https://sridhar.co/weekly-updates/week-2</guid>
      <pubDate>Sat, 02 Jul 2022 18:30:00 GMT</pubDate>
    </item>
    <item>
      <title>Week 1: Learning vi, ES2022 - Array.at(), Onebible - 1 PR merged and 6689 unread bookmarks</title>
      <description>
        <![CDATA[<h2>Books and Links</h2><ul><li> Just Keep Buying: Proven Ways to Save Money and Build Your Wealth - 56% completed</li><li>Extreme Programming Explained: Embrace Change (The XP Series) - 19% completed</li><li> Refactoring - 2nd edition - 12% completed</li></ul><p>
    There are about 6689 bookmarked links lying on my pinboard account.
</p><h2>Programming & Learning</h2><p>My <a href="https://github.com/godlytalias/Bible-Database/pull/15">fix: font issue in tamil/bible.sql #15</a> PR was
    merged last week. I've 2 PR worth of patches, planning to raise at least 1 coming week.</p><p>
    If you are using <code>JavaScript</code>, starting with ES2022, you can use <code>Array.at()</code> for accessing
    array items instead of accessing them using <code>[]</code> braces.
</p><div class="tweet-container"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Starting with ES2022, you can use `at()` to access the
        array elements in reverse order. <a href="https://t.co/1wwoTIhfdk">pic.twitter.com/1wwoTIhfdk</a></p>&mdash;
        Sridhar Raj Sampath Kumar (@sridharrajs) <a
                href="https://twitter.com/sridharrajs/status/1540260422791548928?ref_src=twsrc%5Etfw">June 24, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div><p>After trying to use emacs for so long, I'm starting to learn <code>vi</code> editor.</p>


]]>
      </description>
      <atom:link href="https://sridhar.co/weekly-updates-rss.xml" rel="self" type="application/rss+xml" />
      <link>https://sridhar.co/weekly-updates/week-1</link>
      <guid>https://sridhar.co/weekly-updates/week-1</guid>
      <pubDate>Sat, 25 Jun 2022 18:30:00 GMT</pubDate>
    </item>
  </channel>
</rss>