<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Old Fashioned: Technicals]]></title><description><![CDATA[Writeups related to software engineering, trading, and product management. Some of my consulting stories sprinkled in for good measure.]]></description><link>https://blog.virenmohindra.me/s/technicals</link><image><url>https://substackcdn.com/image/fetch/$s_!HVjP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8935defa-4d02-402b-879e-d7f8b6ed5e10_76x76.png</url><title>Old Fashioned: Technicals</title><link>https://blog.virenmohindra.me/s/technicals</link></image><generator>Substack</generator><lastBuildDate>Tue, 07 Apr 2026 17:42:05 GMT</lastBuildDate><atom:link href="https://blog.virenmohindra.me/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Viren Mohindra]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[oldfashioned@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[oldfashioned@substack.com]]></itunes:email><itunes:name><![CDATA[Viren Mohindra]]></itunes:name></itunes:owner><itunes:author><![CDATA[Viren Mohindra]]></itunes:author><googleplay:owner><![CDATA[oldfashioned@substack.com]]></googleplay:owner><googleplay:email><![CDATA[oldfashioned@substack.com]]></googleplay:email><googleplay:author><![CDATA[Viren Mohindra]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The State of Agent Memory (2026)]]></title><description><![CDATA[what $31.5M in funding and 120K GitHub stars worth of agent memory looks like from the inside]]></description><link>https://blog.virenmohindra.me/p/the-state-of-agent-memory-2026</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/the-state-of-agent-memory-2026</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 26 Feb 2026 09:38:02 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!M6T3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>8-min read<br>We were four days into reading Mem0&#8217;s source code when we found the graph mentions counter</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!M6T3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!M6T3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 424w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 848w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!M6T3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png" width="1456" height="878" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:878,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:223391,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://blog.virenmohindra.me/i/189231943?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!M6T3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 424w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 848w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!M6T3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6169a74-157e-4d11-bc43-26a3208a2d3f_2368x1428.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every time an entity gets referenced, whether a person, a project, a concept, Mem0 increments a <code>mentions</code> count on that node and its edges. It&#8217;s tracked on every update. Written to the database. Never read back. Never used in retrieval scoring. The data&#8217;s there, the infrastructure&#8217;s there &#8212; it just hasn&#8217;t been connected yet.</p><p>That turned out to be the recurring theme. These codebases are full of good infrastructure and good ideas, often in different places than you&#8217;d expect.</p><p>I should back up.</p><h2>Why we did this</h2><p>We&#8217;re building <a href="https://mnem.dev">Mneme</a>, a proactive engineering intelligence system, where it watches your team&#8217;s signals (commits, PRs, Slack threads, Jira tickets, error spikes, stripe txns) and synthesizes context before decisions get made. To build that, we needed to understand what already exists in the memory space. Blog posts or READMEs only get you so far, so we dove into the actual source code.</p><p>So we cloned 10 of the most relevant repos and read through them (read: with some heavy lifting from Claude Code). The list~</p><ol><li><p>Graphiti (23K stars),</p></li><li><p>Mem0 (48K stars, $24M raised),</p></li><li><p>Cognee (12.5K stars, $7.5M seed),</p></li><li><p>Letta (21K stars),</p></li><li><p>memU (11K stars),</p></li><li><p>SimpleMem (3K stars),</p></li><li><p>mcp-memory-service (1.4K stars),</p></li><li><p>A-Mem (800 stars),</p></li><li><p>memsearch (612 stars), and</p></li><li><p>claude-cognitive (310 stars)</p></li></ol><p><em>Over 120K GitHub stars and $31.5M in venture funding aimed at a single thesis: LLMs need persistent memory to be useful.</em></p><p>They&#8217;re right about the thesis. The disagreement is about how to get there. And we have obvious bias since we&#8217;re building in this space. The research is real, but the interpretation is ours. Keep that in mind.</p><h2>Three approaches</h2><p>The approaches fall into three paradigms~</p><ol><li><p><strong>System-managed extraction</strong>: the system decides what to remember</p><ol><li><p>Mem0, Graphiti, Cognee fall into this bucket: expensive writes, clean output</p></li></ol></li><li><p><strong>Agent self-management</strong>: the agent decides what to remember</p><ol><li><p>Letta&#8217;s MemGPT holds its own here - elegant, and depends on agent discipline</p></li></ol></li><li><p><strong>Compression and retrieval</strong>: the system compresses conversation history</p><ol><li><p>SimpleMem, memsearch, mcp-memory-service, claude-cognitive - all trade fidelity for token efficiency</p></li></ol></li></ol><p><em>Most production systems will need some mix of all three. But what I found more interesting than the paradigm choices was what happened when I looked at the actual implementations.</em></p><h2>What we found when we read the code</h2><p>The gap between marketing and implementation runs in both directions. Both directions are worth seeing.</p><p><strong>Graphiti&#8217;s bi-temporal model is as good as advertised.</strong> This is from <code>graphiti_core/edges.py</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:&quot;73301a2b-a26f-4f7b-af42-545e7147d9f9&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">class EntityEdge(Edge):
    # Edge base class provides: uuid, source_node_uuid, target_node_uuid, created_at
    name: str = Field(description='name of the edge, relation name')
    fact: str = Field(description='fact representing the edge and nodes that it connects')
    fact_embedding: list[float] | None = Field(default=None)
    episodes: list[str] = Field(default=[])
    expired_at: datetime | None = Field(
        default=None, description='datetime of when the node was invalidated'
    )
    valid_at: datetime | None = Field(
        default=None, description='datetime of when the fact became true'
    )
    invalid_at: datetime | None = Field(
        default=None, description='datetime of when the fact stopped being true'
    )</code></pre></div><p>Four datetime fields. <code>valid_at</code> and <code>invalid_at</code> track when a fact was true in the real world. <code>created_at</code> and <code>expired_at</code> track when the system <em>learned</em> and <em>retired</em> the fact. When a new fact contradicts an old one, the old edge gets <code>invalid_at</code> set to the new edge&#8217;s <code>valid_at</code>. Nothing is ever deleted. This enables a query you can&#8217;t do anywhere else: &#8220;What did we know about X at time T?&#8221;</p>
      <p>
          <a href="https://blog.virenmohindra.me/p/the-state-of-agent-memory-2026">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Git Identity Crisis: Automating Multi-Account GitHub Like a Sane Person]]></title><description><![CDATA[Stop manually switching between your work and personal GitHub accounts like it's 2015]]></description><link>https://blog.virenmohindra.me/p/git-identity-crisis-automating-multi</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/git-identity-crisis-automating-multi</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 19 Feb 2026 18:07:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HVjP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8935defa-4d02-402b-879e-d7f8b6ed5e10_76x76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>3-min read<br>I have two GitHub accounts. One for work, one for personal projects. If you&#8217;re reading this, you probably do too. And if you&#8217;re anything like me, you&#8217;ve been committing from the wrong email at least once a month, silently polluting your contribution graph with phantom identities</em></p><p>The problem is deceptively simple: when I <code>git push</code> for any of my various open source projects, I would like it routed through my personal account.</p><p>And when I push from work, it should use my work email. No manual switching. No &#8220;oh crap, wrong email&#8221; moments at 2am.</p><p>Here&#8217;s the setup I landed on. It took a couple minutes and I haven&#8217;t thought about it since.</p><p><em>Note: If you&#8217;re an SSH person, you can solve this with separate keys and ~/.ssh/config Host aliases but I use HTTPS across machines and prefer leaning on </em><code>gh</code>&#8217;s<em> token management rather than juggling key pairs</em></p><h3>The Commit Identity Problem</h3><p>Git uses a global <code>user.name</code> and <code>user.email</code> from <code>~/.gitconfig</code> for every commit. If your global config is your work email, every commit across every repo &#8212; including your weekend passion project &#8212; gets stamped with <code>you@acme.com</code>.</p><p>You <em>could</em> set a <strong>per-repo override</strong> with git config <code>user.email</code> in each project dir, but that&#8217;s fragile. You&#8217;ll forget (read: I have). You&#8217;ll clone a new repo and push three commits before realizing you&#8217;ve been committing as the wrong person.</p><h3>The Fix: <code>includeIf</code> with Remote URL Matching</h3><p>Git <code>v2.36</code> introduced <code>hasconfig:remote</code>,<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> which lets you conditionally include config files based on the remote URL. This is the key.</p><p>First, create a separate config file for your personal identity:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">  # ~/.gitconfig-personal
  [user]
      name = Your Name
      email = you@gmail.com</code></pre></div><p>Then add conditional includes to your <code>~/.gitconfig</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;c9f47cc1-74fd-4ff3-a213-fc5f2512c67f&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">

  [user]
      name = Your Name
      email = you@work.com
  [includeIf &#8220;hasconfig:remote.*.url:https://github.com/YourPersonalUsername/**&#8221;]
      path = ~/.gitconfig-personal
  [includeIf &#8220;hasconfig:remote.*.url:git@github.com:YourPersonalUsername/**&#8221;]
      path = ~/.gitconfig-personal</code></pre></div><p>That&#8217;s it. Any repo with a remote pointing to your personal GitHub org automatically uses the personal identity. HTTPS and SSH both covered. No per-repo config, no directory-based hacks.</p><h3>The Push / Pull Auth Problem</h3><p>Solving the commit identity is only half the battle. When you <code>git push</code>, <code>git</code> also needs to authenticate with GitHub. If you use <code>gh</code> (the GitHub CLI), it has its own auth &#8212; and it only has one &#8220;active&#8221; account at a time.</p><p>The naive approach: <code>gh auth switch</code> before every push. The correct approach: a custom credential helper that routes automatically.</p><h3>The Fix: A Custom Credential Helper</h3><p>Git&#8217;s credential system supports custom helpers &#8212; scripts that receive the target host and repo path, and return the appropriate credentials. We can write one that checks the repo owner in the URL and picks the right `gh` token:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">  #!/bin/bash

  # ~/.local/bin/gh-credential-switcher
  if [ &#8220;$1&#8221; != &#8220;get&#8221; ]; then
    exit 0
  fi

  host=&#8221;&#8220;
  path=&#8221;&#8220;

  while IFS=&#8217;=&#8217; read -r key value; do
    [ -z &#8220;$key&#8221; ] &amp;&amp; break
    case &#8220;$key&#8221; in host) host=&#8221;$value&#8221; ;; path) path=&#8221;$value&#8221; ;;
    esac
  done

  if [[ &#8220;$host&#8221; != &#8220;github.com&#8221; ]]; then
    exit 0
  fi

  if [[ &#8220;$path&#8221; == YourPersonalUsername/* ]]; then
    user=&#8221;YourPersonalUsername&#8221;
  else
    user=&#8221;your-work-username&#8221;
  fi

  token=$(gh auth token --user &#8220;$user&#8221; 2&gt;/dev/null)
  if [ -n &#8220;$token&#8221; ]; then
    echo &#8220;protocol=https&#8221;
    echo &#8220;host=github.com&#8221;
    echo &#8220;username=$user&#8221;
    echo &#8220;password=$token&#8221;
  fi</code></pre></div><p>  Make it executable <code>chmod +x</code>) and wire it into your <code>~/.gitconfig</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">  [credential &#8220;https://github.com&#8221;]
      helper =
      helper = !/path/to/gh-credential-switcher
      useHttpPath = true</code></pre></div><p><em>The empty helper = line clears any previously registered credential helpers (looking at you, macOS Keychain). </em>And <code>useHttpPath = true</code> is critical &#8212; without it, <code>git</code> only sends the host to credential helpers, not the repo path, and the script can&#8217;t distinguish between orgs.</p><h3>The macOS Gotcha</h3><p>If you&#8217;re on a Mac, Xcode ships a system-level <code>gitconfig</code> at <code>/Applications/Xcode.app/Contents/Developer/usr/share/git-core/gitconfig</code> that registers <code>osxkeychain</code> as a credential helper. This runs before your custom helper and returns whatever cached credential it has &#8212; defeating the entire setup.</p><p>The <code>helper =</code> line in <code>[credential &#8220;https://github.com&#8221;]</code> clears this. If it doesn&#8217;t stick (system-level configs can be stubborn), you can also add a global <code>[credential]</code> block:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">  [credential]
      helper =
      helper = !/path/to/gh-credential-switcher</code></pre></div><h3>Prerequisites</h3><p>Both GitHub accounts need to be logged into gh:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">  gh auth login  # login with your work account
  gh auth login  # login with your personal account</code></pre></div><p>You can verify both are available with</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">gh auth status</code></pre></div><p><em>The &#8220;active&#8221; account doesn&#8217;t matter anymore &#8212; the credential helper bypasses it entirely.</em></p><h3>Verification</h3><p>Quick sanity check across repos:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash"># Personal repo
$ git -C ~/projects/side-project config user.email
you@gmail.com

$ git -C ~/projects/side-project ls-remote --heads origin
a1b2c3d  refs/heads/main</code></pre></div><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:&quot;6f279ee2-636f-4ba4-b1f5-1da96fc01956&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash"># Work repo

$ git -C ~/projects/work-thing config user.email
you@work.com

$ git -C ~/projects/work-thing ls-remote --heads origin
d4e5f6a  refs/heads/main</code></pre></div><p><em>Different identities, different auth tokens, zero manual switching.</em></p><h3>TL;DR</h3><ol><li><p><strong>Layer</strong></p><ol><li><p>Mechanism</p></li><li><p>Config</p></li></ol></li></ol><div><hr></div><ol><li><p><strong>Commit identity</strong></p><ol><li><p>includeIf hasconfig:remote</p></li><li><p><code>~/.gitconfig</code> + <code>~/.gitconfig-personal</code></p></li></ol></li><li><p><strong>Push / pull auth</strong></p><ol><li><p>Custom credential helper</p></li><li><p><code>~/.local/bin/gh-credential-switcher </code></p></li></ol></li><li><p><strong>macOS Keychain bypass</strong></p><ol><li><p><code>helper =</code> (clear line)</p></li><li><p><code>~/.gitconfig</code></p></li></ol></li><li><p><strong>Path-based routing</strong></p><ol><li><p><code>useHttpPath = true</code></p></li><li><p><code>~/.gitconfig</code></p></li></ol></li></ol><p>Clone any repo and it just works. New personal project? Personal identity and auth. New work repo? Work credentials. The setup is entirely URL-based, so it doesn&#8217;t matter where on disk the repo lives or what branch you&#8217;re on.</p><p><em>Ten minutes of config. Months of not thinking about it.</em></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Introduced in Git 2.36, see docs: https://git-scm.com/docs/git-config#Documentation/git-config.txt-hasconfigremoteurl</p><p></p></div></div>]]></content:encoded></item><item><title><![CDATA[Building a GitHub PR Diff for ChatGPT analysis]]></title><description><![CDATA[Easiest way to summarize a pull request is via automation (by feeding it into an LLM)]]></description><link>https://blog.virenmohindra.me/p/building-a-github-pr-diff-for-chatgpt</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/building-a-github-pr-diff-for-chatgpt</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Sat, 05 Oct 2024 05:51:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-I2w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>4-min read<br>Convert PRs into useful context with this one simple trick! Head to the bottom to see the actual bookmarklet. Open source <a href="https://github.com/VirenMohindra/github-diff">here</a> and chrome extension <a href="https://chromewebstore.google.com/detail/github-diff/hhopppbhdogliepfdaihcoicedlieibn">here</a></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-I2w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-I2w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 424w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 848w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 1272w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-I2w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png" width="1456" height="1750" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1750,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1216085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-I2w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 424w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 848w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 1272w, https://substackcdn.com/image/fetch/$s_!-I2w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F008eef4e-d716-4955-b900-82798ca0c40f_3368x4048.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>copy-able code is below, this is just a <a href="https://carbon.now.sh/">Carbon</a> screenshot</em></figcaption></figure></div><p>As an engineer, I often find myself sifting through GitHub pull requests, pulling branches down and opening <code>.diffs</code> to review changes. It&#8217;s a tedious process to understand the full context and then provide helpful comments. After repeating this for months, <em>why not automate everything with a bookmarklet?</em></p><p>ChatGPT 4o is powerful enough to give me summaries of PRs but selecting all the text on the site isn&#8217;t good enough and introduces a lot of clutter. It is much better to provide a diff with appropriate context (like full changed source files) so it can paint a clearer picture.</p><p>This also helps when I&#8217;ve finalized my own PR and want to provide useful pointers on what&#8217;s changed. I feed the diff into the LLM along with the GitHub PR template and it spits out the changes instead of having to manually type it out.</p><h3>Step 1: The Simple Idea &#8211; just open the <code>.diff</code></h3><p>GitHub already provides <code>.diff</code> and <code>.patch</code> files for PRs &#8212; by appending the extension to the URL, you get the all the changes in a raw format.</p><pre><code>javascript:window.open(window.location.href + '.diff');</code></pre><p><strong>What if I'm not on a PR page?</strong> I also needed the bookmarklet to know when I was on a valid pull request page and act accordingly.</p><h3>Step 2: Handling Edge Cases (Because I Click Everywhere)</h3><p>I quickly realized that I&#8217;m not always on the "Files changed" tab or even on a valid PR page. Sometimes I&#8217;d hit the bookmarklet while still on the main repo, the list of PRs, or even issues tabs. I needed to handle these cases gracefully.</p><p>So, I added checks for specific pages like <code>/pulls</code>, <code>/issues</code>, and <code>/actions</code>, displaying an alert if I wasn&#8217;t on a valid PR page. That made things a lot smoother:</p><pre><code>if (/\/(pulls|issues|actions)|github\.com\/[^\/]+\/[^\/]+$/.test(window.location.href)) {
  alert('You are not on a valid PR page. Please navigate to a specific PR.');
  return;
}</code></pre><p><em>Update: This guard evolved over time while building out the chrome extension to guard against all pages that do not follow the format of &#8212;</em></p><pre><code>https://github.com/&lt;repo-owner&gt;/&lt;repo-name&gt;/pull/&lt;number&gt;</code></pre><h3>Step 3: Adding the "View raw" for Files</h3><p>Once I had the diff part working, the next natural step was to extend the bookmarklets capabilities by opening each changed file in the pull request. This would be helpful in painting a better picture on how the files related to each other and to create a contextual mind map. The dropdown was just a click away, but why click it manually when I can automate that too?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r0AR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r0AR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 424w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 848w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r0AR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png" width="1456" height="602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:477913,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r0AR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 424w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 848w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 1272w, https://substackcdn.com/image/fetch/$s_!r0AR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F095ed357-1198-4e39-bf4c-5a1fa3cc8a96_3456x1428.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The script was updated to automatically click the ellipsis buttons for each file, wait for the dropdown to appear, and then click on the "View raw" menu section. Here&#8217;s what it ended up looking like:</p><pre><code>document.querySelectorAll('.file-header').forEach((fileHeader, index) =&gt; {
  const kebabButton = fileHeader.querySelector('.octicon-kebab-horizontal');
  if (kebabButton) {
    setTimeout(() =&gt; {
      kebabButton.closest('summary').click();
      setTimeout(() =&gt; {
        const viewRawLink = fileHeader.closest('.file').querySelector('a[href*="/raw/"]');
        if (viewRawLink) window.open(viewRawLink.href, '_blank');
      }, 500);
    }, index * 1000);
  }
});
</code></pre><p>Learnt the preferred nomenclature is kebab not ellipsis. Now the bookmarklet could handle both the <code>.diff</code> file and individual "View raw" links for all files in the "Files changed" tab.</p><h3><strong>The final code</strong></h3><pre><code>javascript:(function() {
  const prUrl = window.location.href;

  // List of invalid URL patterns (main page, /pulls, /issues, /actions)
  const invalidPatterns = ['/pulls', '/issues', '/actions', /github\.com\/[^\/]+\/[^\/]+$/];

  // Check if the URL matches any invalid patterns
  if (invalidPatterns.some(pattern =&gt; prUrl.match(pattern))) {
    alert('You are not on a valid PR page. Please navigate to a specific PR.');
    return;
  }

  // Part 1: Open the diff file after extracting base PR URL
  const normalizedUrl = prUrl.split('/pull/')[0] + prUrl.match(/\/pull\/\d+/)[0]; // Extract base PR URL
  const diffUrl = normalizedUrl + '.diff';
  window.open(diffUrl, '_blank');

  // Part 2: If not on the "Files changed" tab, exit after opening the diff
  if (!prUrl.includes('/files')) {
    return;
  }

  // Part 3: If on the "Files changed" tab, open the "View raw" links
  const fileHeaders = document.querySelectorAll('.file-header');

  function openRawView(fileHeader) {
    const kebabButton = fileHeader.querySelector('.octicon-kebab-horizontal');

    if (kebabButton) {
      // Click the ellipsis button to open the dropdown
      kebabButton.closest('summary').click();

      // Wait for the dropdown to appear, then click "View raw"
      setTimeout(() =&gt; {
        const viewRawLink = fileHeader.closest('.file').querySelector('a[href*="/raw/"]');
        if (viewRawLink) {
          window.open(viewRawLink.href, '_blank');
        } else {
          console.error('Could not find the "View raw" link.');
        }
      }, 500); // Delay to allow the dropdown to appear
    } else {
      console.error('Could not find the kebab button.');
    }
  }

  // Loop through each file header, trigger the process for "View raw"
  fileHeaders.forEach((fileHeader, index) =&gt; {
    // Stagger the openings to prevent overload
    setTimeout(() =&gt; openRawView(fileHeader), index * 1000);
  });
})();</code></pre><h3><strong>And a</strong> <strong>One-Liner Bookmarklet</strong></h3><pre><code>javascript:(function(){const prUrl=window.location.href;if(/\/(pulls|issues|actions)|github\.com\/[^\/]+\/[^\/]+$/.test(prUrl)){alert('You are not on a valid PR page. Please navigate to a specific PR.');return;}const diffUrl=prUrl.match(/\/pull\/\d+/)?prUrl.split('/pull/')[0]+prUrl.match(/\/pull\/\d+/)[0]+'.diff':null;if(diffUrl)window.open(diffUrl,'_blank');if(!prUrl.includes('/files'))return;document.querySelectorAll('.file-header').forEach((fileHeader,index)=&gt;{const kebabButton=fileHeader.querySelector('.octicon-kebab-horizontal');if(kebabButton){setTimeout(()=&gt;{kebabButton.closest('summary').click();setTimeout(()=&gt;{const viewRawLink=fileHeader.closest('.file').querySelector('a[href*="/raw/"]');if(viewRawLink)window.open(viewRawLink.href,'_blank');},500);},index*1000);}});})();
</code></pre><p>You can add this by either</p><ol><li><p>using this<a href="https://caiorss.github.io/bookmarklet-maker/"> website</a> or</p></li><li><p>bookmarking this site, changing the name to GH - ChatGPT or any equivalent, editing the bookmark and pasting the one-liner above in the URL section</p></li></ol><p><em>Remember to always allow pop-ups when using this for the first time and try not use this on PRs with many files changed, it&#8217;ll open a bunch of tabs.</em></p><h3>Another one - Opening a ChatGPT chat programmatically</h3><p>If you don&#8217;t want to copy the contents of the diff into ChatGPT you can run this bookmarklet which opens a new chat. You do need an account &#8212;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!47Il!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!47Il!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 424w, https://substackcdn.com/image/fetch/$s_!47Il!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 848w, https://substackcdn.com/image/fetch/$s_!47Il!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 1272w, https://substackcdn.com/image/fetch/$s_!47Il!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!47Il!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png" width="1456" height="880" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:880,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:579984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!47Il!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 424w, https://substackcdn.com/image/fetch/$s_!47Il!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 848w, https://substackcdn.com/image/fetch/$s_!47Il!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 1272w, https://substackcdn.com/image/fetch/$s_!47Il!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5b220fa8-98e9-49bd-ac5e-feb7566c4a17_3368x2036.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3>Code</h3><pre><code>(function() {
  const prUrl = window.location.href;

  // Check if the URL contains ".diff" to ensure it's a valid diff page
  if (!prUrl.includes('.diff')) {
    alert('This bookmarklet only works on .diff pages.');
    return;
  }

  // Get the contents of the diff file
  const diffContent = document.body.innerText;

  // Create the prompt for ChatGPT, broken into multiple lines for readability
  const prompt = encodeURIComponent(
    `You are an expert programmer in React Native and Python. I've provided a diff file.\n\n` +
    `I want you to summarize the changes and provide any helpful comments, feedback, fixes, and optimizations that can be done to the code to make it better in bullet points.\n\n` +
    `I can also provide the files if needed, let me know.\n\n` +
    `Here is the diff:\n\n${diffContent}`
  );

  // Open ChatGPT with the pre-filled prompt
  window.open(`https://chatgpt.com/?q=${prompt}`, '_blank');
})();
</code></pre><h3><strong>And a</strong> <strong>One-Liner Bookmarklet</strong></h3><pre><code>javascript:(function(){if(!window.location.href.includes('.diff')){alert('This bookmarklet only works on .diff pages.');return;}const prompt=encodeURIComponent(`You are an expert programmer in React Native and Python. I've provided a diff file. I want you to summarize the changes and provide any helpful comments, feedback, fixes, and optimizations that can be done to the code to make it better in bullet points. I can also provide the files if needed, let me know.\n\n${document.body.innerText}`);window.open(`https://chatgpt.com/?q=${prompt}`,'_blank');})();</code></pre><p>Same instructions as above to create a bookmarklet. Happy Friday!</p><h3>Chrome Extension</h3><p>Adding bookmarklets is tough. I created a chrome extension that streamlines the workflow for interacting with GitHub pull requests. This tool allows one to quickly open diff files, access raw files, and even send pull request diffs to ChatGPT for feedback&#8212;all with the click of a button! The extension is built with <strong>TypeScript</strong> for type safety and leverages Chrome's powerful <strong>scripting</strong> and <strong>activeTab</strong> permissions to interact directly with the GitHub page.</p><p>The best part? The tool is fully customizable! I added an editable prompt feature for ChatGPT, so one can fine-tune the kinds of feedback they&#8217;re seeking. From improving code quality to reviewing changes more efficiently, this extension has been a game changer in my development workflow. If you prefer a GUI, there is an open source chrome extension available here &#8212;</p><ul><li><p>https://github.com/VirenMohindra/github-diff, and here</p></li><li><p>https://chromewebstore.google.com/detail/github-diff/hhopppbhdogliepfdaihcoicedlieibn</p></li></ul><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Sports Bet Hedging with Free Rolls for +EV]]></title><description><![CDATA[It's called March Madness for a reason -- I don't even watch sports.]]></description><link>https://blog.virenmohindra.me/p/sports-bet-hedging-with-free-rolls</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/sports-bet-hedging-with-free-rolls</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 07 Dec 2023 02:42:36 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>6-min read<br>How I made ~$1600 a week churning sports books in &#8216;23. No this isn&#8217;t one of those WFH Google Ads comments that plagued your photography-Wordpress-site, this is the real deal.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4032" height="3024" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3024,&quot;width&quot;:4032,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;people on ice skating rink&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="people on ice skating rink" title="people on ice skating rink" srcset="https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1581852549708-72910bd52cff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwzfHxzcG9ydHMlMjBiZXR0aW5nfGVufDB8fHx8MTcwMTkxNjY5OHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by <a href="https://unsplash.com/@timhart0421">Tim Hart</a></em></figcaption></figure></div><h1>Premise</h1><p>Sports books in America are synonymous to the credit card companies of yesteryear. They&#8217;re looking to capture the largest market share in the least amount of time, and are willing to cut into their massive profits to make the onboarding process easier.</p><p>This aggressiveness lends them to providing outrageous sign up bonuses for first time users, and follow up bonuses so you don&#8217;t churn away. Let&#8217;s take a look at our players.</p><ol><li><p><strong>BetMGM</strong> - There are many benefits when you&#8217;re working with quite possibly the worst sportsbook user interface. Their </p></li><li><p><strong>Fanduel</strong> - $3000 promo for Super Bowl. I&#8217;ve churned this twice for a neat 1.6K profit. My accounts been marked as a whale with my weekly turnover.</p></li><li><p><strong>Hard Rock Casino</strong> - Can&#8217;t multi state bet which sucks since I really enjoyed turning a tidy profit on Alcaraz&#8217;s game.</p></li><li><p><strong>Caesar&#8217;s</strong> - we&#8217;ll touch on this beauty later.</p></li></ol><h1>A conversation</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xpgk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xpgk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 424w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 848w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xpgk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png" width="1024" height="1014" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1014,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:195724,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xpgk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 424w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 848w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!Xpgk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7857dc32-5a42-450f-9b83-bfb53381cc9d_1024x1014.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div>
      <p>
          <a href="https://blog.virenmohindra.me/p/sports-bet-hedging-with-free-rolls">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Navigating a Maze of Frustration: My Grievances with Magic's Services]]></title><description><![CDATA[Raising $80MM to shit the bed]]></description><link>https://blog.virenmohindra.me/p/navigating-a-maze-of-frustration</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/navigating-a-maze-of-frustration</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Wed, 29 Nov 2023 19:03:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HVjP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8935defa-4d02-402b-879e-d7f8b6ed5e10_76x76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>3-min read<br>In the tech world, we often hear stories of seamless integrations (Stripe), stellar customer service (Stripe), and products that seem almost magical in their efficiency (Stripe). Unfortunately, my recent experience with Magic, a third-party provider, starkly contrasts these ideals. I'm writing this post to share the myriad of issues we've faced, highlighting the significant impact on our business and the lessons learned along the way.</em></p><p><strong>Unanticipated Service Downgrades and Billing Confusion:</strong> Our journey into the abyss began with an unexpected downgrade in our Pro Bundle Plan. No communication, no email alerts &#8211; just a sudden change that we stumbled upon. This wasn't just an oversight; it reflected a deeper problem in transparency and customer communication within Magic.</p><p><strong>The Domino Effect on Our Services:</strong> This downgrade triggered a loss of auto-refresh magic sessions. Imagine our shock when this led to a month-long (and counting) disruption of service for all our users. An app-breaking issue, stemming from a change we weren't even informed about!</p><p><strong>Quick Fixes, Lingering Problems:</strong> Magic's response, while prompt, was akin to placing a band-aid on a gaping wound. The fixes resolved nothing substantial, leaving us to grapple with TypeScript issues and untested Expo packages. Our engineering team spent precious time scouring GitHub issues, trying to discern if the problem was on our end or Magic's. Spoiler alert: it was on Magic's.</p><p><strong>Wasted Resources and Stalled Development:</strong> The fallout was immense. We burned through a long weekend and three full working days, troubleshooting, attending calls, and reporting issues &#8211; all to no avail. Our development cycle ground to a halt, as Magic's issues blocked us from pushing out new builds.</p><p><strong>Reluctance to Change, Despite Discontent:</strong> Staying with Magic wasn&#8217;t a choice driven by satisfaction but a lack of bandwidth to switch providers or develop our own authentication solution. This is a crucial point for startups to consider &#8211; sometimes the devil you know seems better than the devil you don't.</p><p><strong>Support Channels: A Labyrinthine Endeavor:</strong> Seeking support from Magic turned into a Herculean task. Immediate help was a myth; we were funneled into scheduled calls and endless back-and-forths, leading nowhere but to increased frustration.</p><p><strong>A Broken Website Experience:</strong> To add insult to injury, Magic's website was a nightmare. A non-functional search feature, a user export request that took months to implement (and still underperforms), and the inability to perform basic sorting &#8211; it was less magic and more tragic.</p><p><strong>Conclusion: A Call for Accountability and Change:</strong> This post isn't just a venting session but a call to action. Service providers like Magic must understand the gravity of their shortcomings and the ripple effect on their clients' businesses. As for fellow entrepreneurs and tech enthusiasts, let this be a reminder to continuously evaluate your service providers, demand transparency, and always have a contingency plan.</p><p>In the end, the magic we seek in technology services lies not in grand promises but in reliability, effective communication, and a commitment to problem-solving. It's time for Magic to step up their game or step aside.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Mandatory Update OTA on React Native]]></title><description><![CDATA[Over the Air Update]]></description><link>https://blog.virenmohindra.me/p/mandatory-update-ota-on-react-native</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/mandatory-update-ota-on-react-native</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Wed, 01 Nov 2023 19:25:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HVjP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8935defa-4d02-402b-879e-d7f8b6ed5e10_76x76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>1-min read<br>Trivial implementation to force update users to the latest version without having to install any number of the various paid libraries out there in React-land.</em></p><p>The optimal use case is when you have access to OTA and can target prior versions to upgrade backend endpoints so that everyone is pushed to the latest version. With expo this fairly easy and can be run with this command</p><pre><code>eas update --branch production -p ios</code></pre><p>Code snippet below - </p><pre><code>// your various imports here

// constants
const LATEST_VERSION = '2.2.8'
const LATEST_VERSION_NUMBER = Number(STABLE_VERSION.split('.').join(''))
const appStoreName = 'gently-shop-fashion-deals'
const appStoreId = 'id6450376418'
const appStoreURL = `itms-apps://apps.apple.com/id/app/${appStoreName}/${appStoreId}?l=id`

const Root = () =&gt; {
  const ver = Number(Constants.expoConfig.version.split('.').join(''))

  if (ver &lt; LATEST_VERSION_NUMBER) {
    Alert.alert(
      'New Update Available',
      'For the best experience and new features, please update your app now.',
      [{ text: 'Update Now', onPress: () =&gt; Linking.openURL(appStoreURL) }]
    )
  } else
    return (
      &lt;SessionProvider&gt;
        &lt;HomeStateProvider&gt;
          &lt;GlobalStateProvider&gt;
            &lt;StripeProvider
              publishableKey={STRIPE_PUBLISHABLE_KEY}
              urlScheme="gently"
              merchantIdentifier="merchant.com.gently"
            &gt;
              &lt;ThemeProvider theme={theme}&gt;
                &lt;Toast&gt;
                &lt;App /&gt;
              &lt;/ThemeProvider&gt;
            &lt;/StripeProvider&gt;
          &lt;/GlobalStateProvider&gt;
        &lt;/HomeStateProvider&gt;
      &lt;/SessionProvider&gt;
    )
}</code></pre><p>A simple explanation of the constants for the uninitiated</p><ol><li><p><code>LATEST_VERSION</code>:  This will be the minimum semver in a string format. Any version below will be forced to update, i.e. a user still on v2.6.0 will see the non-dismissible Alert dialog if the latest app version is v2.8.0.</p></li><li><p><code>appStoreName</code>, <code>appStoreId</code>: You can find these when visiting your app URL and copying it over. Various resources available.</p></li></ol><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Soho House Arbitrage]]></title><description><![CDATA[why you gotta dump all the data for me to dive through]]></description><link>https://blog.virenmohindra.me/p/soho-house-arbitrage</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/soho-house-arbitrage</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Tue, 27 Sep 2022 14:57:53 GMT</pubDate><enclosure url="https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/06145c33-7b4b-4a94-ac0b-326d56792908_1168x1141.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>3-min read<br>Tell us a bit about yourself. Provide a few sentences about you, what you care about and why you'd like to be part of Soho House. A short bio please. Oh, you were nominated by a board member? Nevermind.</em></p>
      <p>
          <a href="https://blog.virenmohindra.me/p/soho-house-arbitrage">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Reverse Engineering the Clubhouse API]]></title><description><![CDATA[4-min read]]></description><link>https://blog.virenmohindra.me/p/reverse-engineering-the-clubhouse</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/reverse-engineering-the-clubhouse</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Sat, 12 Feb 2022 05:00:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!29Ss!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>4-min read</em></p><p><em>One can ostensibly create a network graph of their most relevant potential users based on a few curl requests to Clubhouses undocumented API.<br>Disclaimer: I do not support reverse engineering any systems without authorized permission. This was purely an academic exercise.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!29Ss!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!29Ss!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 424w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 848w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!29Ss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/c35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:570720,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!29Ss!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 424w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 848w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!29Ss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fc35603f3-bc23-436f-94eb-dd43623bfa42_3447x1939.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by <a href="https://unsplash.com/@williamk?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">William Krause</a></em></figcaption></figure></div><h2>Purpose</h2><p>Finding users who are interested in your product is hard. Scratch that &#8212; finding users is hard. Clubhouse simplifies this by allowing their users to follow topics they are interested in, and joining clubs they fancy. Unfortunately clicking around on their mobile-only platform is a waste of time. I wanted a way to get the public information of Clubhouse users without manual work. </p><p>Armed with this information it should be trivial to create a master list of your target demographic who have specific interests, say journalists interested in improving their marketing skills.</p><p>I haven&#8217;t been timed out by Clubhouse <em>yet.</em></p><h2>Requirements</h2><ol><li><p>You&#8217;ll need a clubhouse account (which requires a verified phone number).</p></li><li><p><a href="https://mitmproxy.org/">mitmproxy</a> (optional) &#8212; All requests need to be authorized with a bearer token which can be grabbed via mitmproxy and tunneling through your PC as proxy. For the sake of conciseness I&#8217;ve chosen to not include them, finding the auth_check calls are trivial. From my understanding it is best to do this on your mobile since their might be additional tracking information and one might be painted as a bad actor.</p></li></ol><h2>Technicals</h2><p>There are many additional headers and parameters which I&#8217;ve omitted for brevity. One can include those if needed, but I&#8217;ve included the bare minimum below to get a successful response from the servers.</p><h3>POST | Get Your Profile</h3><pre><code>curl --location --request POST 'https://www.clubhouseapi.com/api/me' \
--header 'Authorization: Token {{YOUR_TOKEN_HERE}}'</code></pre><p>The token should persist but <code>refresh_tokens</code> are also provided in the response.</p><p><em>All the relevant data should be under <code>user_profile</code>, in this format:</em></p><pre><code>"user_profile": {
    "user_id": 578458,
    "name": "Viren Mohindra",
    "photo_url": "https://d14u0p1qkech25.cloudfront.net/578458_38c43e6d-b258-4301-9849-9f7748837880_thumbnail_250x250",
    "username": "virenmohindra"
},</code></pre><h3>GET | Get Club Members by Club ID</h3><p>Required: <code>club_id</code> needs to be passed in as a parameter.</p><pre><code>curl --location --request GET 'https://www.clubhouseapi.com/api/get_club_members?club_id={{CLUB_ID}}' \
--header 'Authorization: Token {{YOUR_TOKEN_HERE}}'</code></pre><p><em>Response will be a list of <code>Users</code>, in this format:</em></p><pre><code>{
    "user_id": 532095,
    "name": "Professor",
    "photo_url": "https://d14u0p1qkech25.cloudfront.net/532095_8a6db39e-7da0-4938-ab4c-1ab37c2f73cd_thumbnail_250x250",
    "username": "jocelynjkopac",
    "bio": "MY CLUBHOUSE BOOK JUST LAUNCH!!! &#127881;&#127881;&#127881; \nIt's on Amazon: Social Audio Jumpstart &#9994;&#127998;\n&#8230;",
    "is_admin": true,
    "is_leader": false,
    "is_member": true,
    "is_follower": false,
    "is_pending_accept": false,
    "is_pending_approval": false
},</code></pre><h3>POST | Get User by User ID</h3><p>Required: <code>user_id</code> needs to be passed in as a parameter.<br>Note: Information needs to be <code>x-www-form-urlencoded</code> in the body.</p><p>Sometimes this particular request will hang if you haven&#8217;t provided the <code>logging_context</code>. If you&#8217;re following along with mitmproxy you might just have a JSON object handy. Use this nifty <a href="https://stackoverflow.com/a/39787203">StackOverflow answer</a> to convert the JSON object into a properly formatted value.</p><pre><code>curl --location --request POST 'https://www.clubhouseapi.com/api/get_profile' \
--header 'Authorization: Token {{YOUR_TOKEN_HERE}}' \
--data-urlencode 'user_id={{USER_ID}}'</code></pre><p>The most important fields would be the <code>user_profile</code> which houses all verified social handles and the list of <code>clubs</code> and <code>topics</code>.</p><p><em>An example sanitized response can be found as a <a href="https://gist.github.com/VirenMohindra/37d8ca6b149f6f5c6616587ae9e7dae0">Github Gist here</a>.</em></p><p>Good luck!</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Dynamically Generating Meta Tags in Next.js]]></title><description><![CDATA[Search Engine Optimization in a Server Side Rendering Progress Web Application]]></description><link>https://blog.virenmohindra.me/p/dynamically-generating-meta-tags</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/dynamically-generating-meta-tags</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Fri, 06 Aug 2021 13:54:44 GMT</pubDate><enclosure url="https://cdn.substack.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>3-min read</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!x6od!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!x6od!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 424w, https://substackcdn.com/image/fetch/$s_!x6od!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 848w, https://substackcdn.com/image/fetch/$s_!x6od!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 1272w, https://substackcdn.com/image/fetch/$s_!x6od!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!x6od!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png" width="1456" height="435" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:435,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86267,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!x6od!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 424w, https://substackcdn.com/image/fetch/$s_!x6od!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 848w, https://substackcdn.com/image/fetch/$s_!x6od!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 1272w, https://substackcdn.com/image/fetch/$s_!x6od!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F74f4e73c-c531-4941-bab2-b76bafe7fdad_1591x475.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Feature</strong></p><p>You&#8217;re in a subpage on your website and you need to set SEO-related tags based on the information you receive from the back-end. For instance, if a user clicks on an events page, the title tag should expectedly display the <code>eventName</code>, and hopefully relevant information like the <code>artistName</code> and <code>location</code>, formatted for Facebook and Twitter (or any other relevant Open Graph protocol).</p><p><strong>Problem Statement</strong></p><p>You&#8217;ve tried hardcoding the meta tags, like such:</p><pre><code>&lt;title&gt;Donda - Kanye West in Pittsburgh '21&lt;/title&gt;</code></pre><p>but instantly some issues pop up, namely: <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a></p><ol><li><p>The data isn&#8217;t getting propagated, and/ or is missing.</p></li><li><p>Duplicated tags (since you have base meta tags for the root page).</p></li></ol><p><strong>Fix</strong></p><ol><li><p>Customized <code>&lt;Head/&gt;</code> component removed from <code>_document.js</code>, and instead imported into <code>_app.js</code></p></li><li><p>Each tag has a <code>key</code> prop which handles deduplication.</p></li><li><p>calling <code>getServerSideProps</code> inside the relevant page.</p></li></ol><p><strong>Explanation</strong>:</p><ol><li><p>_document.js doesn&#8217;t support the title tag and I&#8217;d preferably like to keep all my tags in one single source of truth. <a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> The easiest way to do this would be to create a wrapper component which renders all the base meta tags.</p></li><li><p>Each tag also a <code>key</code> property which will handle potential duplication. I used an <code>enum</code> to handle the various meta tags, so I wouldn&#8217;t mistakenly misspell any attributes. I&#8217;ve added them below for posterity:</p></li></ol><pre><code>enum MetaTagKeys {
  TITLE = 'title',
  META_TITLE = 'meta_title',
  DESCRIPTION = 'description',
  OG_TYPE = 'og:type',
  OG_TITLE = 'og:title',
  OG_URL = 'og:url',
  OG_DESC = 'og:description',
  OG_IMG = 'og:image',
  TWITTER_CARD = 'twitter:card',
  TWITTER_URL = 'twitter:url',
  TWITTER_TITLE = 'twitter:title',
  TWITTER_DESC = 'twitter:description',
  TWITTER_IMG = 'twitter:image',
}</code></pre><p>An example of a meta tag in <code>&lt;DocumentHead /&gt;</code> would look something like this:</p><pre><code>&lt;meta name={MetaTagKeys.DESCRIPTION} key={MetaTagKeys.DESCRIPTION} content="Kanye West performs Donda live at the PPG Paints Arena in Pittsburgh on 10/27/2021."/&gt;</code></pre><p>This wrapper also contains the various scripts (<code>dangerouslySetInnerHTML</code>), and link icons which inevitably end up in your head tag. I prefer to keep <code>_app.js</code> as clean as possible.</p><ol start="3"><li><p>To get Facebook, Twitter, and any other social network to scrape your page and prettily display your meta tags and content, one has to pre-render the page. In Next.js this can be done via <code>getServerSideProps. </code><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a></p></li></ol><p>The final code in all its glory.</p><pre><code>import Head from 'next/head'
import { GetServerSideProps, GetServerSidePropsContext } from 'next';

interface MetaTag {
  property: string,
  key?: string,
  content: string,
}

export const getServerSideProps: GetServerSideProps = async ({req}: GetServerSidePropsContext) =&gt; {
  const {url = ''} = req;
  const urlSlug = url.split('event/')[1];
  const eInfo = await User.getUserInfo(urlSlug);

  const metaTagTitle = `${eInfo.eventName} -  ${eInfo.artistName} in ${eInfo.eventState}`;

  const metaTagDescription = `${eInfo.artistName} performs live at the ${eInfo.eventLocation} in ${eInfo.eventState} on ${eInfo.eventDate}`;

  const metaTagsList: MetaTag[] = [
    // &lt;meta property="title ... /&gt; has the same property as the &lt;title name="title&gt;...&lt;/title&gt;, but still needs a unique key.
    // we handle this logic while mapping over the metaTagsList prop.
    {property: MetaTagKeys.TITLE, key: MetaTagKeys.META_TITLE, content: metaTagTitle},
    {property: MetaTagKeys.DESCRIPTION, content: metaTagDescription},
    // &lt;!-- Open Graph / Facebook --&gt;
    {property: MetaTagKeys.OG_URL, content: url},
    {property: MetaTagKeys.OG_TITLE, content: metaTagTitle},
    {property: MetaTagKeys.OG_DESC, content: metaTagDescription},
    {property: MetaTagKeys.OG_IMG, content: "https://jpt-ugc.s3.ap-southeast-1.amazonaws.com/metaTag.png"},
    // &lt;!-- Twitter --&gt;
    {property: MetaTagKeys.TWITTER_CARD, content: 'summary_large_image'},
    {property: MetaTagKeys.TWITTER_URL, content: url},
    {property: MetaTagKeys.TWITTER_TITLE, content: metaTagTitle},
    {property: MetaTagKeys.TWITTER_DESC, content: metaTagDescription},
    {property: MetaTagKeys.TWITTER_IMG, content: "https://jpt-ugc.s3.ap-southeast-1.amazonaws.com/metaTag.png"}
  ];
  return {
    props: {
      metaTagsList
    }
  }
}

const Home = ({metaTagsList}: HomeProps): JSX.Element =&gt; {
// one might have a useEffect() hook here to get additional information or to set the title.

  const metaTagTitle = eInfo &amp;&amp; eInfo.displayName !== null ?
    `${eInfo.eventName} -  ${eInfo.artistName} in ${eInfo.eventState}` : null;

return (
          &lt;Head&gt;
            &lt;title
              key={MetaTagKeys.TITLE}&gt;
                {metaTagTitle}
              &lt;/title&gt;
            {metaTagsList
             &amp;&amp; metaTagsList.map((entry: MetaTag) =&gt; (
               &lt;meta
                 property={entry.property}
                 key={entry.key ? entry.key : entry.property}
                 content={entry.content}
               /&gt;
            ))}
       )
}</code></pre><p><em>Another StackOverflow solution <a href="https://stackoverflow.com/a/66417246">for reference</a>.</em></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>(in order of severity).</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>Adding&nbsp;<code>&lt;title&gt;</code>&nbsp;in&nbsp;<code>pages/_document.js</code>&nbsp;will lead to <a href="https://nextjs.org/docs/messages/no-document-title">unexpected results</a> with&nbsp;<code>next/head</code>&nbsp;since&nbsp;<code>_document.js</code>&nbsp;is only rendered on the initial pre-render.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>If you export an&nbsp;<code>async</code>&nbsp;function called&nbsp;<code>getServerSideProps</code>&nbsp;from a page, Next.js will <a href="https://nextjs.org/docs/basic-features/data-fetching#getserversideprops-server-side-rendering">pre-render this page</a> on each request using the data returned by&nbsp;<code>getServerSideProps</code>.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Go to First Commit on GitHub]]></title><description><![CDATA[I source a bunch of ideas from GitHub. These repositories help me understand how to implement functionality without rifling through pages of doc&#8230;]]></description><link>https://blog.virenmohindra.me/p/go-to-first-commit-on-github</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/go-to-first-commit-on-github</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Wed, 10 Mar 2021 08:04:11 GMT</pubDate><enclosure url="https://cdn.substack.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I source a bunch of ideas from GitHub. These repositories help me understand how to implement functionality without rifling through pages of documentation, validate if a particular npm package I want to install is worth its weight in gold (or is bogged down with countless issues and unresolved pull requests), and keep up to date on research proposals and development on popular codebases.</p><p>But I&#8217;ve always found it difficult to navigate to the first commit. I do this for several reasons, whether I need to judge the age of the software &#8212; which I can also trivially do by checking the commit date of the <code>README.MD</code> or <code>LICENSE</code>, but is sometimes inaccurate. Or I&#8217;m curious, and I want to see how the project grew from the first sown seed. Barring quickly looking at the number of stars and forks of a project, I would hope that Github adds a label that can indicate when the project&#8217;s first lines of code were written.</p><p>Now, power users can click on the total number of commits on the homepage of a repository and go to the last page by simply editing the number after the <code>SHA</code> in the URL. An example:</p><p>TrumpTracker has 330 commits at the time of writing. The URL for the repo is &#8212;</p><blockquote><p><code>https://github.com/TrumpTracker/trumptracker.github.io/commits/master?after=7d27f3b4278ad9a8f1282e0cc7dad53e9bf11c77+</code><strong><code>300</code></strong><code>&amp;branch=master</code></p></blockquote><p>Where the bolded 300 should be the</p><p><code>total # of commits - 30 === 330 - 30 = 300</code></p><p>And the constant <code>30</code> is the arbitrary number of commits they show per page.</p><p>One can perform these calculations and brute force render the last page, but I have a better, more sophisticated solution.</p><p>Add this piece of code as a bookmarklet, go to any Github repository and click it.</p><pre><code>javascript:(b%3D&gt;fetch(%27https://api.github.com/repos/%27%2Bb%5B1%5D%2B%27/commits%3Fsha%3D%27%2B(b%5B2%5D%7C%7C%27%27)).then(c%3D&gt;Promise.all(%5Bc.headers.get(%27link%27),c.json()%5D)).then(c%3D&gt;%7Bif(c%5B0%5D)%7Bvar d%3Dc%5B0%5D.split(%27,%27)%5B1%5D.split(%27%3B%27)%5B0%5D.slice(2,-1)%3Breturn fetch(d).then(e%3D&gt;e.json())%7Dreturn c%5B1%5D%7D).then(c%3D&gt;c.pop().html_url).then(c%3D&gt;window.location%3Dc))(window.location.pathname.match(/%5C/(%5B%5E%5C/%5D%2B%5C/%5B%5E%5C/%5D%2B)(%3F:%5C/tree%5C/(%5B%5E%5C/%5D%2B))%3F/))%3B</code></pre><p>I recommend bookmarking any site (such as this one) and then editing the bookmark by right-clicking it. I&#8217;ve set it up in a similar fashion.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J3QG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J3QG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 424w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 848w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 1272w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J3QG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png" width="356" height="374.3204678362573" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:899,&quot;width&quot;:855,&quot;resizeWidth&quot;:356,&quot;bytes&quot;:125160,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J3QG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 424w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 848w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 1272w, https://substackcdn.com/image/fetch/$s_!J3QG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7fa206e7-0338-48b2-95a3-f588e7eeb6c2_855x899.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oQKp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oQKp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 424w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 848w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 1272w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oQKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png" width="396" height="399.60655737704917" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1108,&quot;width&quot;:1098,&quot;resizeWidth&quot;:396,&quot;bytes&quot;:388925,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!oQKp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 424w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 848w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 1272w, https://substackcdn.com/image/fetch/$s_!oQKp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F6005e593-21fa-40c0-b451-10c6b6091d10_1098x1108.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I can&#8217;t for the life of me remember where I sourced this code, but if anyone has any leads, I&#8217;ll be sure to credit the author. :)</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Setting up React Native on Apple M1]]></title><description><![CDATA[How I got my entire React Native Environment set up in less than an hour on the new Apple M1 laptop, including troubleshooting.]]></description><link>https://blog.virenmohindra.me/p/setting-up-react-native-on-apple</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/setting-up-react-native-on-apple</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 18 Feb 2021 07:22:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mF9l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>How I got my entire React Native Environment set up in less than an hour on the new Apple M1 laptop, including troubleshooting.</em></p><h1>Xcode &#128421;</h1><p>I recommend downloading and installing Xcode at the start &#8212; it&#8217;ll take the longest. Once you&#8217;re done setting up, run the application once and download the required components. Also, for command line tools:</p><pre><code>$ xcode-select --install</code></pre><p>If you end up running the above command before Xcode installs you might have to run this command to switch to Xcode&#8217;s CLI:</p><pre><code>$ sudo xcode-select --switch /Applications/Xcode.app</code></pre><h1>Other Applications &#128242;</h1><p>I use <a href="https://macapps.link/en/">MacApps.link</a> (a flavor of Ninite &#8212; a Windows package management software) which handles the downloading of all other apps required on my work laptop.</p><pre><code>$ curl -s 'https://api.macapps.link/en/chrome-dropbox-alfred-github-sublime-iterm-unarchiver-cyberduck-spotify-vlc-slack-whatsapp-discord' | sh</code></pre><p>Choose whichever apps work for you.</p><h1>IntelliJ IDEA &#129489;&#127997;&#8205;&#128187;</h1><p>I&#8217;ve been sucked into the IntelliJ ecosystem, and doubt I&#8217;ll ever be break away. It&#8217;s definitely worth the yearly  Start by downloading the <a href="https://www.jetbrains.com/toolbox-app/">Jetbrains Toolbox</a>, and through that get access to the latest version of IntelliJ IDEA Ultimate for Apple Silicon. It&#8217;s optimized for ARM chips.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mF9l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mF9l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 424w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 848w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 1272w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mF9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png" width="350" height="514.8550724637681" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1624,&quot;width&quot;:1104,&quot;resizeWidth&quot;:350,&quot;bytes&quot;:935964,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mF9l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 424w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 848w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 1272w, https://substackcdn.com/image/fetch/$s_!mF9l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3cd6b2c0-1b91-4892-982b-7d6996d87ad8_1104x1624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For React Native dev of course I need to set up both native mobile dev environments. iOS was (unsurprisingly) straight-forward, but Android posed some problems. While the Studio initially installed without problems, when installing emulators I hit the real issues: the emulators that come with Android Studio don&#8217;t run on ARM Macs at all.</p><p>There is a ray of hope with some&nbsp;<a href="https://github.com/google/android-emulator-m1-preview">preview versions of Android emulator for Apple M1</a>&nbsp;coming from Google. But don&#8217;t get your hopes up too high as there&#8217;s already a list of <a href="https://stackoverflow.com/a/66005851">known issues</a> (no webviews and no sound being probably the biggest dealbreakers for me) and no activity in the repo in the past month and a half. I did manage to use it to run the app I&#8217;m currently working on, though.</p><p>Personally, I&#8217;m sticking with running my Android apps on a real device. Less hassle and faster, more reliable testing. It&#8217;s also been my workflow before switching to ARM, so that&#8217;s not much of a problem for me.</p><h1>Chrome Extensions &#129517;</h1><ul><li><p><a href="https://chrome.google.com/webstore/detail/ghostery-%E2%80%93-privacy-ad-blo/mlomiejdfkolichcflejclcbmpeaniij?hl=en">Ghostery</a> | <a href="https://chrome.google.com/webstore/detail/google-analytics-opt-out/fllaojicojecljbmefodhfapmkghcbnh">Google Analytics Opt-out Add-on</a> | <a href="https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm?hl=en">uBlock Origin</a> | <a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi">React Developer Tools</a></p></li></ul><h1>Brew &#9749;&#65039;</h1><p>Homebrew, the essential package manager you need, finally <a href="https://brew.sh/2021/02/05/homebrew-3.0.0/">officially supported </a>Apple Silicon on the 5th of February, 2021. Preferably follow the instructions<a href="https://brew.sh/"> on their website</a>, but for posterity, I&#8217;ve added the commands below.</p><pre><code>$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

..

$ echo 'eval $(/opt/homebrew/bin/brew shellenv)' &gt;&gt; /Users/<strong>{YOUR_NAME_HERE}</strong>/.zprofile
$ eval $(/opt/homebrew/bin/brew shellenv)

$ brew upgrade &amp;&amp; brew update &amp;&amp; brew install node &amp;&amp; brew install yarn &amp;&amp; brew git &amp;&amp; brew install python@3.9</code></pre><h1>Rosetta &#127801;</h1><p>By now, if you&#8217;ve already installed a handful of apps, you might have already come across Rosetta. For now, you&#8217;ll have to make do with this translation layer until everyone switches over.</p><pre><code>$ /usr/sbin/softwareupdate --install-rosetta --agree-to-license</code></pre><p>cd into your ios/ folder and run these commands</p><pre><code>$ arch -x86_64 sudo gem install cocoapods
$ arch -x86_64 pod install --repo-update</code></pre><p>I also recommend duplicating iTerm and appending with _rosetta and running that application with the option &#8216;Open using Rosetta&#8217;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TIFe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TIFe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 424w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 848w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TIFe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png" width="1456" height="1064" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1064,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1761063,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TIFe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 424w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 848w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 1272w, https://substackcdn.com/image/fetch/$s_!TIFe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7a54eea0-8213-46c7-bfea-936047abaefd_1672x1222.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Mac AppStore &#128187;</h1><p>When you first open it, there are a bunch of agreements you&#8217;ll have to accept. The only applications I care for are Helium, ColorSlurp, and Amphetamine.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!H-RB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!H-RB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 424w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 848w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!H-RB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png" width="1456" height="910" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:910,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1205328,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!H-RB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 424w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 848w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 1272w, https://substackcdn.com/image/fetch/$s_!H-RB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F043288e0-3005-4c03-8379-e4a93ab6f422_2880x1800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I also downloaded</p><ul><li><p><a href="https://linear.app/">Linear</a> &#8212; <em>issue tracking tool</em>,</p></li><li><p><a href="https://www.figma.com">Figma</a> &#8212; <em>collaborative UI design tool</em>, and</p></li><li><p><a href="https://veeer.io/">VEEER</a> &#8212; <em>window manager for MacOS</em></p></li></ul><p>from their respective websites.</p><h1>Troubleshooting &#9888;&#65039;</h1><p>If you recently got the computer and ended up inadvertently downloaded the software update for MacOS, I recommend restarting your computer at-least once. This solved some of the issues.</p><ol><li><p><a href="https://github.com/CocoaPods/CocoaPods/issues/10220#issuecomment-736118564">CocoaPods LoadError</a>:</p></li></ol><pre><code><code>$ sudo arch -x86_64 gem install ffi
$ arch -x86_64 pod install</code></code></pre><p><a href="https://github.com/CocoaPods/CocoaPods/issues/9907">Or</a></p><pre><code>$ brew install libffi
$ ln -s $(brew --cellar libffi)/*/include/ffi.h /usr/local/include/ffi.h</code></pre><ol start="2"><li><p><a href="https://github.com/facebook/react-native/issues/29984#issuecomment-737382396">Missing architecture</a>:</p></li></ol><p>Inside <strong>BOTH</strong> Pods and your workspace, navigate to Build Settings -&gt; Excluded Architectures -&gt; Debug and add <code>arm64</code>. Remember to make this change in both places otherwise it won&#8217;t take effect.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dAxM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dAxM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 424w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 848w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dAxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png" width="1456" height="950" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:950,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:988914,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dAxM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 424w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 848w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!dAxM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F242e8ed8-690f-4301-9ec0-74ed1645981d_3024x1974.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another reference from <a href="https://stackoverflow.com/a/63622570">StackOverflow</a>.</p><ol start="3"><li><p><a href="https://github.com/flutter/flutter/issues/72492">Class AMSupportURLConnectionDelegate is implemented in both ?? (0x1eb0e27a0) and ?? (0x1296d02b8). One of the two will be used. Which one is undefined.</a></p></li></ol><p>Still figuring this one out. Fortunately it doesn&#8217;t affect development. Here&#8217;s another <a href="https://apple.stackexchange.com/questions/407603/amsupporturl-is-implemented-in-both">reference</a>.</p><ol start="4"><li><p><a href="https://stackoverflow.com/a/66130332">CompileC Error in ios/Pods/Flipper/xplat/Flipper</a>.</p></li></ol><p>In Podfile, update this line</p><pre><code>use_flipper!</code></pre><p>With this: </p><pre><code>use_flipper!({ 'Flipper-Folly' =&gt; '2.3.0' })</code></pre><p>Make sure to remove Podfile.lock and then run pod install after making this change.</p><h1>Miscellaneous &#9874;</h1><p>Switching off last login time in terminals</p><pre><code>$ touch .hushlogin</code></pre><p>Generating SSH keys for signing commits/ pulling repositories</p><pre><code>$ ssh-keygen -t ed25519 -C "viren@company.com"</code></pre><h1>Cleanse &#128465;</h1><p>Clean your build in Xcode. <code>&#8984; + Shift + K</code></p><p>Purging the system might help.</p><pre><code>$ gem uninstall ffi
$ gem list --local --no-version | grep cocoapods | xargs gem uninstall
$ rm -rf ~/.cocoapods
$ gem list</code></pre><p>Restart terminal after checking the option &#8216;Open Using Rosetta&#8217;</p><pre><code>$ sudo xcode-select --switch /Applications/Xcode.app</code></pre><p>Then try</p><pre><code>$ sudo gem install cocoapods
$ sudo gem install ffi
$ pod install</code></pre><p>Whenever I run into an issue, I</p><pre><code>$ rm -rf node_modules &amp;&amp; cd ios &amp;&amp; rm -rf Pods &amp;&amp; rm -rf Podfile.lock</code></pre><p>If nothing works, purge the entire repository and start over.</p><pre><code>$ git clone git@github.com:{YOUR_REPO_HERE}
$ cd {YOUR_REPO_HERE}
$ yarn
$ cd ios
$ pod install
$ cd .. &amp;&amp; yarn run ios-native</code></pre><p>More troubleshooting hotfixes &#8212; <a href="https://stackoverflow.com/a/64800814">CompileC AppDelegate.m Error</a>.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Building Publicly]]></title><description><![CDATA[An exercise in system design]]></description><link>https://blog.virenmohindra.me/p/building-publicly</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/building-publicly</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Fri, 29 Jan 2021 08:24:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!U9-h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>10-min read</em></p><p><em>I was recently assigned a technical project &#8212; to create a micro-service architecture and design the system from the ground up. After clearing the proposal and receiving approval from management, I thought it would be a good idea to post the results and keep adding to this document to further build on the insights I&#8217;ve gathered to improve the application. I love open-source solutions and Product Managers might also find this useful! Below are my findings.</em></p><h1>Overview</h1><p>My understanding from the prompt is that a user is looking for a matchmaking service (in the form of a native application) that can connect people to different business owners based on &#8203;<strong>goals, interests, and industries.</strong>&#8203; I thought it would be best to take a step back and approach this from a high level by first designing the Entity-Relationship Diagram (ERD). I&#8217;ve linked a preliminary <code>UserAccountClass</code> here as a &#8203;<a href="https://gist.github.com/VirenMohindra/b76cba44972e5d416bc048b6b06adb4b">GitHub Gist&#8203;</a> and also attached an image below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U9-h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U9-h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 424w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 848w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 1272w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U9-h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png" width="1186" height="1510" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1510,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:307442,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U9-h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 424w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 848w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 1272w, https://substackcdn.com/image/fetch/$s_!U9-h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F371574f0-8c99-410c-82d2-f0af5f3b1bc9_1186x1510.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While designing the architecture, I primarily focused on the Objectives <code>field</code>, which contained what the user was looking to get from the app.</p><blockquote><p><em>Are you looking for a job, mentorship, to mentor someone, or exchange industry knowledge, or other? </em></p></blockquote><p>Building a user recommendation algorithm should start with the user, which is why I wanted to start scaffolding the <code>UserProfile</code> first to get an understanding of how everything might work and add additional fields based on needs and requirements. </p><p>Based on the supplied mockups and interface, I divided Objectives into these four categories: Coffee, Collab, Tutoring, and Jobs. This would form the bulk of the &#8203;<strong><code>RecommendationEngine</code></strong>&#8203;.</p><h1>FRONTEND </h1><p>I first needed to define the use cases and the most optimal infrastructure for the mobile application. Since I have previous experience in JavaScript, I thought it would be best to go with React Native (TypeScript) with a mix of firebase functions and hopefully a serverless backend. More on that later.</p><p>Using React Native (or Expo at the start) will achieve feature-parity across all mobile systems (iOS/ Android), limit the need for maintaining two codebases, while also having the added advantage of allowing for a future launch of the platform on PCs via <a href="https://github.com/necolas/react-native-web">React Native for Web</a>.</p><p>For Market Research I looked at the onboarding process of Tinder:</p><ol><li><p>They have their own login system and OAuth from several social media platforms. They also request your mobile number and the subsequent OTP for verification. Firebase has similar Authentication features, including one-time password phone verification.</p></li></ol><p>I&#8217;d start by porting and converting over all the UI/ UX designs via Expo for quick iterations and rapid development, and then eject if and when native modules are required.</p><p>I&#8217;d use a combination of global classes/ themes while also introducing a highly componentized design to reduce redundancy. Each screen will be divided into separate components for reusability and modularity -- i.e, <code>PrimaryButtonComponent</code> for Call to Actions (CTAs) usable everywhere, <code>UserCardComponents</code> for use on the <code>NetworkScreen</code> and <code>ChatItemComponent</code> on the <code>MessagesScreen</code>. The <em>Business Logic</em> of the application (including but not limited to any calculations) will be completely separated from the designs and screens to allow for the future web launch.</p><p>The <code>ChatScreen</code> for each thread can be broken into the <code>ChatBubble</code>, which will grab the entire conversation and spread the props based on the <code>senderUid</code> (whether it&#8217;s a sent/ received message.) The Disconnect option in chat will purge the database of the entire conversation thread. </p><p>I&#8217;m not familiar with the Remarks option and how that might work but I&#8217;m imagining a pop-up modal that will allow a user to give feedback for a particular user. This can also be highly component-based. I&#8217;ve gone into more depth on the Report function in the Content Moderation part under the <strong>POTENTIAL FUTURE REQUIREMENTS </strong>section below.</p><ol><li><p><a href="https://fusejs.io/"><code>Fuse.js</code></a> can assist with the <code>SearchBarPillComponent</code> in the <code>MessagesScreen</code> and as defined by the <code>UserAccount</code> it can either be filtered on a name, full-text conversation or Objectives basis.</p></li><li><p><a href="https://reactnavigation.org/">React Navigation</a> to navigate the screens and <a href="https://redux.js.org/">Redux</a> for State Management.</p></li><li><p>Updates can be sent over the air with <a href="https://github.com/microsoft/react-native-code-push">CodePush</a> and will allow for immediate bug fixes based on any errors reported by <a href="https://docs.sentry.io/platforms/react-native/">Sentry</a> or <a href="https://github.com/AppsFlyerSDK/appsflyer-react-native-plugin">AppsFlyer</a>.</p></li><li><p>Dynamic User-related Notifications can also be pushed to the device with AppsFlyer.</p></li><li><p><a href="https://github.com/invertase/react-native-firebase/tree/master/packages/analytics">Firebase Analytics</a>/ <a href="https://segment.com/docs/connections/sources/catalog/libraries/mobile/react-native/">Segment</a> is a great way to visualize conversions and analyze user data. </p></li><li><p>I&#8217;d also use <a href="https://reactnative.dev/docs/hermes">Hermes</a> (for Android) to improve start-up time, decrease memory usage, and result in a smaller app size package. </p></li><li><p>For optimizations, you can either only add .webP images in-app or introduce a middleman bundler like <a href="https://webpack.js.org/">Webpack</a> to minify code pre-build. Heavy caching will be implemented (<a href="https://rossbulat.medium.com/how-to-memoize-in-react-3d20cbcd2b6e">memoization</a>) to reduce network overhead and unnecessary calls to the servers. </p></li><li><p>Internationalization via <a href="https://github.com/zoontek/react-native-localize"><code>react-native-localize</code></a> might help in a) providing translators a separate file to convert all text into whatever preferred language, and b) decoupling the business logic and screens from the actual generated text. Also, the more languages, the more global the app can become.</p></li><li><p>Testing would be a combination of <a href="https://jestjs.io/docs/en/tutorial-react-native">Jest</a>/ <a href="https://github.com/callstack/react-native-testing-library">React Native Testing Library</a>/ <a href="https://github.com/wix/Detox">Detox</a> for components + E2E unit tests </p></li></ol><h1>BACKEND SERVICES</h1><p>The Backend would have multiple <code>Services</code> and I&#8217;ve attempted to utilize a micro-service architecture to a) decouple any authentication mechanisms (regarding access) so there aren&#8217;t any clashes and b) create a single source of truth so the user can always go back to the previous state if they delete the application from their phone. </p><p>The three journeys would be something similar to this: </p><ol><li><p>Client (New User) -&gt; &#8203;<strong><code>UserCreationService</code></strong>&#8203; -&gt; dB</p></li><li><p>Client -&gt; Web Socket -&gt; &#8203;<strong><code>RecommendationEngine</code></strong>&#8203; -&gt; sends the information on what Objectives a user requires (sends multiple micro shards, and makes a parallel call to each of these shards, and receives the stack of User Profiles for that particular day.)</p></li><li><p>Client -&gt; Web Socket -&gt; &#8203;<strong><code>MatchingService</code> </strong>&#8203;-&gt; &#8203;<strong><code>ChatService</code></strong></p></li></ol><p><em>Each client request will be sent to a gateway and <code>ProfileService</code> to ensure the right person has access to the correct data. Every request will be preceded by a check on their access control. </em></p><p>Similar to how Monet, another newly formed dating app works, at the start we can match users globally and aren&#8217;t limited by country. &#8203;<strong>This will form the basis for database optimizations on not just geolocational sharding but sharding by Objectives instead.</strong></p><p>I&#8217;ve highlighted the necessary services and gone into more depth below.</p><p><strong>RecommendationEngine: </strong></p><ol><li><p>Instead of Gender/ Age/ Location (which is what dating applications primarily use to form a recommendation), we can use Objectives, Job Title, and Location. </p></li><li><p>Pulls out all relevant people from the <code>ProfileService</code>, or it could just be storing the <code>userIDs</code> and the <code>Objectives</code>. </p></li><li><p>To optimize for latency, we can shard the data by <code>Objectives</code>, and later on by geographical location, once enough users have onboarded.</p></li><li><p>To strike a perfect balance between low latency and cost $$$, one can host a single virtual server for every shard per cell. A cell can start as high-level categories taken from various freelancing websites (such as Photographer/ Graphic Designer/ Filmmaker, etc), and if and when required we can create subcategories to reduce latency. For example, there might be a huge number of Photographers, but a dearth of magicians, which means you&#8217;ll have to break up the number of photographers but can include all magicians in a single shard.</p></li><li><p>The shards can also be balanced based on the Unique User Count (in a particular location), active user count, and # of queries from a certain region.</p></li><li><p>By employing the use of a <code>TagManager</code>/ <code>TagService</code> we can modify the type of recommendations a user receives and make the system modular. <code>TagManager</code> in this context would be the parameters you choose. For now, we can stick to <code>Objectives</code>.</p></li></ol><p><strong>RecommendationAlgorithm</strong>&#8203; (part of the <code>RecommendationService</code>): </p><ol><li><p><strong>Active Usage</strong>: upon app open, updated <code>lastActive</code> field on UserProfile. </p></li><li><p><strong>Collect Tags</strong>: Location, Objectives, Job Title, Location, Experience, etc</p></li><li><p><strong>Grouping Users</strong>: In its preliminary stage, we can start by matching users to their needs and requirements based on the provided Objectives, and as soon as we have sufficient data and the value-add of a particular user we can start creating groups of users. This essentially means the combination of people who like your profile as a whole, and the people you like who like you back. This will pave the way for an ELO matching system and will generate better recommendations for new users. An example of this would be graphic designers matching with like-minded graphic designers for the pure objective of collaboration. </p></li><li><p><strong>Pickiness/ bad actors</strong>: Low (or egregiously high) swipe percentage will affect the quality of your matches and reduce your ELO. </p></li><li><p><strong>Reply Rate</strong>: penalizes accounts that have a low reply rate percentage </p></li><li><p><strong>Progressive Taxation</strong>: A high-value account (for instance a mentee with 10+ years of experience in the banking sector) will get taxed and normalized to make the playing field more &#8216;fair&#8217; for other user profiles. </p></li><li><p><strong>GROUP BY Stacks</strong>: and if a user swipes left to a particular stack show the other surrounding stack cells. For example, a user who is employed as a photographer looking for collaborations might also want to collaborate with Graphic Designers (instead of just photographers) since there is some overlap.</p></li></ol><p><strong>UserManagement/ ProfileService: </strong></p><ol><li><p>Each user will have its own record and any creations/ updates/ deletions will be managed by this service. This will include Authentication of each request and the creation of a token for <code>SessionManagement</code>.</p></li><li><p>There can be multiple authentication mechanisms, for example, an <code>EmailService</code>, but for the sake of brevity, we can use Firebase.</p></li><li><p>Firebase can provide the relevant access controls and assist in authenticating requests. In the backend, we can also do some redundancy checks. A <code>JWT token</code> should work.</p></li></ol><p><strong>SessionManagement</strong>&#8203;:</p><ol><li><p>To check and see if a user can interact with another user and that they&#8217;re active. Also links back to the RecommendationService since this serves as an important matching factor. </p></li></ol><p><strong>GatewayService: </strong></p><ol><li><p>Takes the request and asks the above service if the user is authenticated, and if resolves as true, forwards the request to the appropriate service. </p></li></ol><p><strong>BillingService: </strong></p><ol><li><p>Billing can be decoupled from <code>UserManagement</code> and for accepting different currencies since the application will be global. A neat way to remove this dependency would be In-App Purchases (IAP) but both Apple and Android charge hefty service fees, and sending users to a website to pay would be a better alternative option. </p></li></ol><p><strong>MessageService: </strong></p><ol><li><p>Peer Protocol. XMPP can work here. Web Socket (Firebase) or TCP (building out a protocol of your own).</p></li></ol><p><strong>MatchingService: </strong></p><ol><li><p>A table that lists the users who have matched with whichever other users.</p></li><li><p>If a user A right swipes, both the IDs are sent to the <code>MatchingService</code> and waits for the other user B to either swipe right or left to complete the relationship and allow for messaging. </p></li><li><p>If user A left swipes on user B, user B&#8217;s profile is marked as hidden to the user and not shown in subsequent stacks.</p></li><li><p>Every time a swipe occurs, the <code>MatchingService</code> table will check to see whether it&#8217;s a match or not. If it&#8217;s a match, the UID pair is purged from the database and marked as hidden for x amount of time for the user who swiped left. If the user right swipes the dB is checked to see if there are any existing pairs for both UIDs. If yes, they match, if no, a new record is created, and the profile is displayed in the awaiting profiles stack. </p></li><li><p>Note: If a user uninstalls an application, the only information you&#8217;ll end up losing is the number of swipes a user has performed, whether they have liked or disliked a profile. They&#8217;re going to get recommendations of a disliked user.</p></li></ol><p><strong>NotificationService/ ChatManagement: </strong></p><ol><li><p>Web Sockets/ TCP to keep the connection open and push notifications to inform when a user receives a message, a message is undelivered, and the order and timestamp of each message in a particular thread. </p></li></ol><p><strong>ImageService/ ImageHandler: </strong></p><ol><li><p>Users can share images/ videos/ and other assets in chat.</p></li><li><p>File Systems are static so you can easily build a CDN over this. Allows fast access and with aggressive caching the overhead and network requests will be negligible.</p></li><li><p>Cheaper compared to storing Blobs/ Distributed File System (DFS). </p></li><li><p>I would prefer to decouple the Images from the <code>UserProfile</code> and create an entirely different database that can, in the future, be used for machine learning and improved recommendations, or object detection. DFS + database with all the information for the particular images.</p></li></ol><p><strong>Monitoring</strong>&#8203;: <a href="https://prometheus.io/">Prometheus</a> for server performance, latency, uptime, and logging/ <a href="https://sentry.io/welcome/">Sentry</a> for in-app error reporting.</p><h1>DATABASE</h1><p>Based on the services required, these are some of the requirements from the database: </p><ol><li><p><strong>Low Latency</strong>: Fast Search of Profiles. </p></li><li><p><strong>Doesn&#8217;t necessarily need to be real-time</strong>: a new user doesn&#8217;t instantly have to be added to the <code>RecommendationService</code> but can be shown other profiles already in the database.</p></li><li><p><strong>Easy to Shard/ Distributed</strong>: for scalability </p></li><li><p><strong>Full-Text Search Support</strong>: there are a lot of parameters to search for (the tags) that need to be fully supported </p></li><li><p><strong>HTTP Interface</strong>: TCP/ Web Socket </p></li><li><p><strong>Structured Date</strong>: xml/ json </p></li></ol><p><a href="https://www.elastic.co/"><code>ElasticSearch</code></a> accomplishes all of these requirements.</p><p>Client -&gt; &#8203;<strong>elasticsearch</strong>&#8203; Feeder -&gt; Kafka or any Queue (index all the data asynchronously) -&gt; </p><p><code>elasticsearch</code> workers (which will request the &#8203;<strong><code>TagService</code></strong>&#8203; and what shard you need to write into) </p><p><a href="https://firebase.google.com/">Firebase</a>/ <a href="https://firebase.google.com/docs/firestore">Firestore</a> can also achieve all of these and have inbuilt helper functions. For a real-world setup, you&#8217;ll want to configure security rules for Firestore. Cloud Firestore favors a denormalized data structure, so it&#8217;s okay to include <code>senderId</code> and <code>senderName</code> for each <code>MessageItem</code>. A denormalized data structure means you&#8217;ll duplicate a lot of data, but the upside is faster data retrieval. There are a lot of tradeoffs. From the mockup, I could see a user can add images and content to chat also. Rather than storing the image data directly with the message, you&#8217;ll use Firebase Storage, which is better suited to storing large files like audio, video, or images. </p><p>If you&#8217;d like to go a more homegrown route, NoSQL Databases like <a href="https://cassandra.apache.org/"><code>Cassandra</code></a>, which is good at querying for these kinds of data types, you just replicate the data, and depending on the query you build an efficient table. Distributed Database + <a href="https://aws.amazon.com/dynamodb/"><code>AmazonDynamoDB</code></a> work here too.</p><p>Also, Redis &#8212; using transactions to make this process consistent.</p><p>If you&#8217;d like more control you can use a relational database. The same concepts apply, you&#8217;d just have to employ Sharding.</p><h1>TECHNICAL DEBTS</h1><p>Working on a project of this breadth and also safeguarding against any single point of failure (leveraging the Master-Slave architecture), will introduce more challenges and complexity. The project will need to be thoroughly tested to ensure feature-parity as well as cohesion between all systems, whether that is client-machine or machine-machine.</p><p>I can also imagine combining the older, more mature freelancing platform users with this new app will be somewhat of a challenge and introduce a lot of bandaid code which should be ironed out before launch.</p><p>Fortunately, using the error reporting tools both on the client and the server-side should potentially solve both of these issues.</p><h1>ROADMAP</h1><p>Starting off by building an MVP of the application would be the first potential step. Knocking out the screens and while also figuring out how everything works together (business logic) might be cumbersome but well worth it at the start.</p><p>A web launch can be a possible future addition to the roadmap.</p><h1>OTHER THOUGHTS AND POSSIBLE FEATURES</h1><p>At the start, the number of users using the app will be fairly limited, and the best way to sidestep this and induce growth is to optionally include all accounts on the pre-existing platform and send them an email if and when they get matched by our users. This viable route will leverage the existing 30,000+ freelancers and generate leads. </p><p>I received a generous amount of help from Tinder&#8217;s unofficial API to get some sort of sense of what the required fields would be for a profile of this sort. I also went through the various freelancing websites to grab the <code>CategContent</code> enum to help divide and subsequently subdivide groups of users for lower latency during recommendations. </p><p>A move away from the <strong>Tinder landscape</strong> &#8212; if a user swipes too fast on a match notify them that they&#8217;re only receiving x number of matches a day in a particular stack and they should check out the profile properly for a) finding a hidden gem or something they can connect with the match, and b) improving the recommendation engine. Or, a counter at the top which decrements after every swipe.</p><h1>POTENTIAL FUTURE REQUIREMENTS/ ADDITIONS</h1><p>Content Moderation, whether people are using false images (celebrity pictures, copied pictures, no pictures at all) can be achieved with machine learning algorithms in <code>ImageService</code>. Text/ Chat Moderation, keeping the platform clean would be of paramount importance, and employing the use of a database that allows for full-text search would be a great addition to improving the community.</p><div><hr></div><p><strong>Feb 01, 2021 Update:</strong></p><p>Imagine getting <a href="https://vicki.substack.com/p/you-dont-need-kafka">called out</a> a few days after you share your thoughts:</p><blockquote><p><em><strong>Most startups (and big companies) don&#8217;t need the tech stack they have.</strong><br><br>The overhead in setting up Kafka versus a very hefty Postgres (or BigQuery, or your relational database of choice instance hooked up to a web service receiving JSON sensor data) is enormous, because distributed systems are hard - really hard - and much, much harder than traditional systems.</em></p><p><em>Overarchitecture is real. As&nbsp;<a href="https://www.nemil.com/on-software-engineering/beware-engineering-media.html">Nemil says in this fantastic post</a>,<br><br>&#8216;Early in your career, a surprising number of poorly engineered software systems&nbsp;are due to mistakes with engineering media.</em></p><p><em>In college and at bootcamps, your primary exposure to engineering is through engineering media like&nbsp;Hacker News, meetups, conferences,&nbsp;Free Code Camp, and&nbsp;Hacker Noon. Technology that is widely discussed there &#8212;&nbsp;say micro services or a frontend framework or the blockchain &#8212;&nbsp;then unnecessarily shows up in your technology stack.&#8217;</em></p></blockquote><p>I&#8217;ll keep revising my architecture and stack to strike a better balance between convenience and sophistication.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Hacker's Guide to the Galaxy]]></title><description><![CDATA[Or correctly guessing Your SO's creds based on the information they share with you]]></description><link>https://blog.virenmohindra.me/p/hackers-guide-to-the-galaxy</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/hackers-guide-to-the-galaxy</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 17 Dec 2020 01:15:44 GMT</pubDate><enclosure url="https://cdn.substack.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>15-min read</em></p><p><em>I should probably focus on Cracking the Coding Interview. Instead, I came across this tweet &#8212; spurring the idea of detailing my approach to determining a user&#8217;s credentials via various means, whether that is through FLIR cameras, general stupidity, wordlists, or OSINT.<br>Disclaimer: I do not support penetration testing into national systems or any systems for that matter without authorized permission. This was purely an academic exercise.</em></p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/Foone/status/1331430202136690689?s=20&quot;,&quot;full_text&quot;:&quot;I wonder what username someone was typing on THIS keyboard? &quot;,&quot;username&quot;:&quot;Foone&quot;,&quot;name&quot;:&quot;foone&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Wed Nov 25 02:51:11 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EnowtVRVQAAlzIc.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/hQ3Q1JV40o&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:21,&quot;like_count&quot;:446,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:false}" data-component-name="Twitter2ToDOM"></div><p><em>Hint: focus on the Twitter username.</em></p><h1>Extracting ATM pins w/ Infrared Cameras</h1><p>Forward-looking infrared cameras aren&#8217;t particularly new &#8212; they&#8217;ve been around for ages, conveniently classified for military appliance until the technology was deemed appropriate for general use. Then also, FLIR only touched retail in the past four decades, first focusing on more profitable (and frankly more suitable) endeavors: settling in the niche B2B services industry of electrical and pipeline maintenance, outdoor adventures, and emergency rescues. Fast forward to 2014, industry leader and aptly-namesaked FLIR Systems launched their first consumer-focused mountable attachment &#8212; as a mobile case. Skimming their technical specifications, one can see the relevant Imaging &amp; Optical <em>Palette</em> they use to color-code their images.</p><blockquote><p><em>Gray (white hot), Hottest, Coldest, Iron, Rainbow, Rainbow HC, Arctic, Lava and Wheel</em></p></blockquote><p>A picture here might be worth more than the above dozen colorful words:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uOXf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uOXf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uOXf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg" width="522" height="392" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/eab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:522,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:33543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uOXf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uOXf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Feab32d4f-24af-4f7b-9973-5d5b6ef2300e_522x392.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Instead of dropping &#8364;300 on an entire smartphone-compatible system to catch your dog redhanded, better yet, put UV pigment in a bottle of hand sanitizer, then use a blacklight to trace their last steps.</em></figcaption></figure></div><p>Trust me, I love the resurgence of this technology. On my very own platforms, I&#8217;ve implemented <em><a href="https://hotjar.com/">Hotjar</a></em>, which analyzes site traffic to generate heatmaps and recordings.</p><blockquote><p><em>Armed with Google Analytics, I can, with a ~80% confidence, identify who is visiting our websites according to their frequency, activity, and location  &#8212; even with anonymized data</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lrcR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lrcR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lrcR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg" width="184" height="439.17894736842106" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:907,&quot;width&quot;:380,&quot;resizeWidth&quot;:184,&quot;bytes&quot;:28548,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lrcR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lrcR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6cec56a-bc39-4d3b-b92e-12127136d011_380x907.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Mobile taps on <a href="https://virenmohindra.me/">VirenMohindra.me</a>. Data from 26th November to December 12th, 2020. Nothing is sacred anymore.</em></figcaption></figure></div><p>And this entire flow is automated, neatly packaged, and shipped to my inbox week after week for me to glean over. If a lowly web developer can wield this kind of power, imagine what governments (NSA) and corporations (Palantir) are capable of achieving. But what if you&#8217;re looking for a more professional (or more nefarious) solution?</p><p>In <em><a href="https://cseweb.ucsd.edu/~kmowery/papers/thermal.pdf">Heat of the Moment: Characterizing the Efficacy of Thermal Camera-Based Attacks</a></em>, a handful of UC San Diego researchers could theoretically guess the right pin code (typed into a keypad) 80% of the time if the image was taken immediately after. If the image was taken a minute later, they had a fifty percent chance of guessing correctly.</p><p>Another unnerving aspect of this potential vulnerability is as the heat signature fades with time, one can figure out the order in which the keys were pressed, with the dimmest (coolest) button pressed first and the warmest (hottest) pressed last. With relatively fewer numbers of permutations and combinations and a bit of solid guesswork, you can accurately predict and gain access. For safety deposit boxes use the opposite element &#8212; perspiration i.e. water or sweat &#8212; and reverse the methodology.</p><p>Should you now start removing rubber and plastic buttons, replacing them with metal keys? Are we always going to be defenseless to high-functioning sociopaths who <a href="https://youtu.be/HyKaxdlWAPs">measure our body temperature</a> to see if we are lying about our unprofessed love?</p><p><strong>TL;DR?</strong> You&#8217;re fine. Regular image sensors only detect near-infrared and not the mid to far IR radiated by hot objects. I&#8217;ve run &#8216;tests&#8217; on DSLRs with the filter removed and wasn&#8217;t able to remotely capture the same level of heat on plastic buttons as the paper.</p><p>Or you can just follow my handy guide to safeguarding the (<a href="https://www.nerdwallet.com/article/banking/how-much-money-in-checking-and-savings">hopefully less than</a>) ten bands in your checkings account:</p><ul><li><p>After use, an attacker requires physical access to the device in less than a minute for a higher success rate. Cherish the card machine for a minute longer. Maybe kiss it for good luck, but remember to be COVID-friendly though.</p></li><li><p>This attack vector won&#8217;t work on all keypads &#8212; metal keypads reflect IR like a mirror, are highly thermally conductive, and dissipate heat quickly, which doesn&#8217;t allow for a thermal signature to be left behind.</p></li><li><p>One can easily thwart attempts to extract the passcode by resting their figures on the remaining keys. This simple precaution produces a meaningless thermal signature. This isn&#8217;t even particularly hard, just smash the keypad a few times, or pass the bill to your inebriated friend right after.</p></li></ul><h1>Stupidity &#8212; The U1timat3 Anaphrodisiac </h1><p>According to <a href="https://www.datagenetics.com/blog/september32012/">DataGenetics</a>, 10.7% of the population chose <code>1234</code> as their ATM pin code. Ignoring this egregious error, there are a number of ways a person is vulnerable to credential theft, besides one&#8217;s own foolishness.</p><blockquote><p><em>Statistically,&nbsp;one third&nbsp;of all codes can be guessed by trying just 61 distinct combinations</em></p></blockquote><p>If you&#8217;re looking to choose the world&#8217;s least common pin then you could potentially go with <code>8068</code>, which is statistically the least likely pin code (based on frequency). But that might have some unintended consequences, for instance, the least popular four-digit sequence might end up bubbling up to the top, like some sick twisted game of Nash Equilibrium, or for more gamer-inclined minds, akin to Gandhi in <em><a href="https://civilization.fandom.com/wiki/Mohandas_Gandhi_(Civ1)">Civilization 1</a></em>:</p><p>Allegedly, there was a bug that caused Mahatma Gandhi&#8217;s aggression to go to the maximum value of 255 due to an integer underflow error. In short, his aggressiveness stat is low enough&nbsp;that, upon adopting the democracy option and incurring the government&#8217;s inherent drop in militancy (-2), his default one point of aggression would sum to a negative value. This would cause it to wrap around to the highest value and subsequently turn Gandhi into a genocidal maniac. I&#8217;ve solved the complex math:</p><pre><code><code>1 + (-2) = -1</code></code></pre><blockquote><p><em>&#8216;Its fair to say that Gandhi could, on occasion, seem a little unnecessarily zealous,&#8217; Sid Meier, main developer and designer of the turn-based strategy video game, concludes.</em></p></blockquote><p>The existence of this bug was <a href="https://www.kotaku.com.au/2020/09/civilisation-creator-shoots-down-our-memories-of-a-nuke-happy-gandhi/">denied by Meier</a>,&nbsp;and has no mention on the internet prior to&nbsp;the fifth installment of the award-winning game, <a href="https://civilization.fandom.com/wiki/Civilization_V" title="Civilization V">Civ V</a>, where&nbsp;Gandhi&nbsp;has an unnervingly high nuke rating (possibly as a homage.)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S07n!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S07n!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S07n!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S07n!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S07n!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S07n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg" width="1000" height="563" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/a578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:563,&quot;width&quot;:1000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66095,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S07n!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S07n!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S07n!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S07n!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fa578e794-8807-4d7f-8d4c-8aff6d586d06_1000x563.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>You can&#8217;t spell Pacifist without fist.</em></figcaption></figure></div><p>Assumptions based on data and empirical evidence can backfire and instead make one shoot themselves in the foot. Don&#8217;t be a sheep. There is always a relevant <em><a href="https://xkcd.com/936/">xkcd</a></em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HlEm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HlEm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 424w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 848w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 1272w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HlEm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png" width="444" height="360.6" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:601,&quot;width&quot;:740,&quot;resizeWidth&quot;:444,&quot;bytes&quot;:93029,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HlEm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 424w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 848w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 1272w, https://substackcdn.com/image/fetch/$s_!HlEm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0ed862c6-c271-40d7-be11-d553691b1f26_740x601.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>My current WiFi password.</em></figcaption></figure></div><p>I am a sheep. I shot myself in the foot. Enter <a href="https://www.security.org/how-secure-is-my-password/">Security.org</a> to call me out:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vPMd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vPMd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 424w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 848w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 1272w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vPMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png" width="1456" height="1220" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1220,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:167178,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vPMd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 424w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 848w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 1272w, https://substackcdn.com/image/fetch/$s_!vPMd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F291fef2c-7343-4811-9972-92dab1d88500_1538x1289.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Hint: look at the highlighted text.</em></figcaption></figure></div><p>In a <a href="https://www.cl.cam.ac.uk/~rja14/Papers/BPA12-FC-banking_pin_security.pdf">paper</a> by the Computer Laboratory team at the University of Cambridge, they utilized a regression model to identify the factors which influence consumers picking a particular pin code combination. I&#8217;ll append parts of the abstract for the click-lazy:</p><blockquote><p><em>We find that guessing PINs based on the victims&#8217; birthday, which nearly all users carry documentation of, will enable a competent thief to gain use of an ATM card <strong>once for every 11&#8211;18 stolen wallets</strong>, depending on whether banks prohibit weak PINs such as 1234. The lesson for cardholders is to never use one&#8217;s date of birth as a PIN. The lesson for card-issuing banks is to implement a denied PIN list, which several large banks still fail to do. However, blacklists cannot effectively mitigate guessing given a known birth date, suggesting banks should move away from customer-chosen banking PINs in the long term.</em></p></blockquote><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WSGS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WSGS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 424w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 848w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WSGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png" width="523" height="457.625" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1134,&quot;width&quot;:1296,&quot;resizeWidth&quot;:523,&quot;bytes&quot;:353769,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WSGS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 424w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 848w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 1272w, https://substackcdn.com/image/fetch/$s_!WSGS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4569884f-d799-445b-8f27-9da3f5f53ea9_1296x1134.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>You might see my love for scatter plots surface more than once in this writeup.</em></figcaption></figure></div><p>People are stupid. Or Naive. I prefer to harbor on the latter for the sake of humanity. We choose recurring passwords for consistency (<code>2244</code>), patterns that can be etched into memory (<code>2864</code> - north, south, east, west), or important dates (birthdays, most likely mothers). How hard would it be for an acquaintance to ask about your mother&#8217;s birthday? Or know about your affinity for compasses? Or slight OCD tendencies?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K4b2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K4b2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K4b2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg" width="410" height="410" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:480,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:44948,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K4b2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K4b2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5b5a4c89-2d95-4e0f-8674-3a71a27e8cfd_480x480.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I spent a grand total of four seconds on Tumblr for this image quote, up on last year&#8217;s average of zero.</figcaption></figure></div><p>Know your customer. Their likes, dislikes, their innermost desires, and some sequence of numbers that might make them exploitable.</p><blockquote><p><em>According to our computed model, the following blacklist of 100 PINs is optimal: 0000, 0101&#8211;0103, 0110, 0111, 0123, 0202, 0303, 0404, 0505, 0606, 0707, 0808, 0909, 1010, 1101&#8211;1103, 1110&#8211;1112, 1123, 1201&#8211;1203, 1210&#8211;1212, 1234, 1956&#8211; 2015, 2222, 2229, 2580, 3333, 4444, 5252, 5683, 6666, 7465, 7667.</em></p></blockquote><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/poppy_haze/status/1308408732632657922?s=20&quot;,&quot;full_text&quot;:&quot;if your Big Data person does NOT know what this picture means, get rid of them &quot;,&quot;username&quot;:&quot;poppy_haze&quot;,&quot;name&quot;:&quot;Rev. Poppy Haze&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Tue Sep 22 14:12:05 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EihlmG0XkAAOq4U.png&quot;,&quot;link_url&quot;:&quot;https://t.co/0yVHZzcYoz&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:2739,&quot;like_count&quot;:11997,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Remember to swap these out a year down the line.</p><p>Enough numbers, let&#8217;s move onto characters. In 2015, security researcher Mark Burnett released&nbsp;<a href="https://xato.net/today-i-am-releasing-ten-million-passwords-b6278bbe7495#.VNojhPnF98E">a list of 10 million passwords</a>. The data consisted of</p><ul><li><p>Portions of most major data leaks in the last five years where there were plaintext passwords leaked or published later</p></li><li><p>Thousands of smaller leaks found on Pastebin and similar text-storage sites</p></li><li><p>Google Searches/ Alerts for leaked databases</p></li><li><p>Forums that share premium file-sharing and gaming accounts + porn passwords</p></li><li><p>Dumps discovered through torrent searches</p></li></ul><p>There is a defunct <a href="https://old.reddit.com/r/10millionpasswords/">subreddit</a> dedicated to sharing research on the list. Some of the most popular posts <a href="http://pp19dd.com/2015/02/levenshtein-distance-10-million-usernames-passwords/">performed Levenshtein distance</a> between usernames and passwords, <a href="https://old.reddit.com/r/10millionpasswords/comments/2x19t9/passwords_list_with_patterns_character_counts/">checked patterns/ character counts</a>, and <a href="https://old.reddit.com/r/10millionpasswords/comments/2w07mf/a_list_of_flaws_in_the_data_set/">listed potential flaws</a> of the set.</p><div><hr></div><p>Slight digression: <code>69</code> was the 3rd most used pair-combination. A commenter <a href="https://news.ycombinator.com/item?id=12700965">replied</a>:</p><blockquote><p><em>I assume because most users were born in 1969?</em></p></blockquote><p>This reminds me of when my mother wished her neighbor on April 20th because the Wi-Fi network name had 420 appended at the end of his SSID. Another <a href="https://news.ycombinator.com/item?id=3018400">one</a>:</p><blockquote><p><em>Unrelated, but did anyone else notice that the number <code>5683</code> was one of the top 10 most common PINs? I can&#8217;t think of a <strong>single reason</strong> why that would be.</em></p><p><em>It spells &#8216;LOVE&#8217; using the alphanumeric code on the keypad.</em></p></blockquote><p>The patterns of numbers in passwords offer a brief glimpse into human psychology, similar to the insights gleaned from the pin code paper. Birth years are a common trope, as well as repetitions (<code>111</code>/ <code>999</code>). <code>768</code> is an <a href="https://islam.stackexchange.com/a/800">important number</a> for Muslims.</p><p>Another insightful <a href="https://news.ycombinator.com/item?id=12700177">comment</a> from Hacker News:</p><blockquote><p><em>When sites require a digit, everybody appends &#8216;1&#8217; to their usual password. The exponential declining frequency of subsequent digits is because when passwords &#8216;expire&#8217; folks just add 1. The short lifetime of site usage results in that decline. Just thinking out loud.</em></p></blockquote><div><hr></div><p>But the onus isn&#8217;t only on users. Strings like <code>Password2020</code><em>used</em> to score high on password strength meters because it fulfilled the abjectly bad base criteria being:</p><ul><li><p>Longer than 8 characters, and</p></li><li><p>One of each small letter, capital letter, digit, or symbol.</p></li></ul><p>Take the <a href="https://www.my1login.com/resources/password-strength-test/">Password Test</a>. If you&#8217;re curious about whether your password or email has been compromised check <a href="https://haveibeenpwned.com/">HaveIBeenPwned</a>. The website doesn&#8217;t store any passwords &#8212; their <a href="https://haveibeenpwned.com/Privacy">Privacy Policy</a> has a brief on how they accomplish this. <a href="https://www.troyhunt.com/enhancing-pwned-passwords-privacy-with-padding/">Technicals</a> for nerds.</p><p>HSBC forces you to use a six-digit pin code compared to the customary four digits, increasing the number of combinations hundred-fold (10,000 -&gt; 1MM). But they also renege on other responsibilities &#8212; like providing an appropriate login user interface.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cRUI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cRUI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 424w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 848w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 1272w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cRUI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png" width="1456" height="659" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:659,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:171300,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cRUI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 424w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 848w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 1272w, https://substackcdn.com/image/fetch/$s_!cRUI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3be85cd1-91c8-488d-8b6f-625207465f40_1988x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>If I end up using an automatically generated password, how can I possibly remember the positions of each character in my password?</em></figcaption></figure></div><p>And God save you if a bank limits the max length or bans the use of special characters.</p><p><strong>TL;DR?</strong> Rotate passwords regularly, definitely don&#8217;t reuse them, and forget your mother&#8217;s birthday for the sake of your bank balance. And don&#8217;t use xkcd&#8217;s <code>correcthorsebatterystaple</code>. Do we really need to worry though? Not <em>really</em>.</p><ol><li><p>The dataset is not representative of all passwords. The list also has no indication of any source or user attitude. Awful websites with awful security will store awful passwords. If one would go on a flower companies website they wouldn&#8217;t care to use a strong password, especially if it&#8217;s a one-off visit. Their bank credentials and social media accounts will most likely have a more well-thought-out password.</p></li><li><p><code>password</code> is #2 on the list only because frequency can&#8217;t possibly decrease. In retrospect, it might be beneficial to have a list of common passwords that people don&#8217;t end up using &#8212; one&#8217;s that crackers keep regurgitating when attempting to access your account. Your unique passwords could theoretically never reach the top of the list because they&#8217;re <em>unique</em>. Plus, the dataset is incorrigible:</p></li></ol><blockquote><p><em>Many dumps include passwords in a hashed format that requires you to crack them yourself.</em></p></blockquote><ol start="3"><li><p>Use <a href="https://www.lastpass.com/">LastPass</a> or any other password manager to securely store and generate high-entropy strings. My hot take is you shouldn&#8217;t even remember your credentials. The less human intervention the better. People introduce errors.</p></li><li><p><a href="http://passwords12.at.ifi.uio.no/Kirsi_Helkala/Kirsi_Helkala_Passwords12.pdf">Research suggests</a> that users&#8217; first option for the language chosen for their password is their mother tongue. Add some french in there. I can <a href="https://blog.virenmohindra.me/p/how-to-hack-hotel-wifi">help</a>.</p></li></ol><p><strong>What can companies do on their side?</strong></p><ol><li><p>Like the Cambridge Team suggested, companies can take the leaked dataset, run the <code>uniq</code> command to filter out duplicates, and create a blacklist to deter people from <a href="https://blog.virenmohindra.me/p/the-plight-of-the-intelligently-stupid">choosing the easiest path</a>. That&#8217;ll easily make the list redundant.</p></li><li><p>User-accessible features that assist in pasting passwords from password managers instead of creating one&#8217;s own convoluted login system. HSBC, please.</p></li></ol><h1>Big Black Box</h1><p>Let&#8217;s say you&#8217;re tech-savvy enough that you follow all the above precautions. You&#8217;re emailing confidential information and have redacted the necessary fields. You&#8217;re still not technically safe. There have been <a href="https://github.com/beurtschipper/Depix">many advancements</a> in software tools that make it surprisingly easy to recover text from pixelated images or PDF files.</p><blockquote><p><em>Not only can the length of the redaction give an estimate on the password length, but for variable width fonts, one could even rule out many passwords using pixel measurements between the text on either side.</em></p></blockquote><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/Phthalaldehyde/status/1334714740740927489&quot;,&quot;full_text&quot;:&quot;<span class=\&quot;tweet-fake-link\&quot;>@questauthority</span> We know who the 305th military intelligence guy is because they can&#8217;t redact PDFs correctly &quot;,&quot;username&quot;:&quot;Phthalaldehyde&quot;,&quot;name&quot;:&quot;Anthony&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Fri Dec 04 04:22:46 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EoXb-3sXcAEAlav.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/IkpFvJGYB1&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:85,&quot;like_count&quot;:466,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>It took a while to convince people to not use a bit of Gaussian Blur because it&#8217;s extremely insecure. Well, get ready for round 2. Case in point: the child abuser who was caught by <a href="https://boingboing.net/2007/10/08/untwirling-photo-of.html">simply reversing a Photoshop filter</a>.</p><blockquote><p><em>Police [essentially 4Chan] took a photo with a &#8216;swirl&#8217; effect of the paedophiles face and reversed it to reveal a very usable picture. So good in fact he was found and arrested.</em></p></blockquote><p>One can ostensibly reverse-engineer the underlying blur encoder and in turn, decode any screenshot. It&#8217;s a cat-and-mouse chase &#215; arms-race. Why don&#8217;t people use black boxes properly? Simple: it attracts more attention. A redacted rectangle with sharp edges has much more contrast than all the other elements in the image, becomes visually dominant, taking the front row seat.</p><blockquote><p><em>A pixelated area communicates more clearly that there&#8217;s information present that is hidden from you- but not from others. It also can&#8217;t be mistaken for a design element.</em></p></blockquote><p>In 2017, two French &#8216;hackers&#8217; <a href="https://www.bbc.com/news/technology-41737248">reconstructed a blurred-out</a> cryptocurrency QR code on TV and claimed bitcoin cash worth $1,000 (or &#163;760 at the time of discovery).</p><blockquote><p><em>Sassano and Storck, [the hackers], have explained&nbsp;<a href="https://medium.com/@SassanoM/lets-enhance-how-we-found-rogerkver-s-1000-wallet-obfuscated-private-key-8514e74a5433">the process in detail in a blog</a>.</em></p></blockquote><p>As always, you gotta share the content for those clicks and page views. Cough.</p><p>One can even decensor Hentai with Deep Neural Networks. A project humorously titled <em><a href="https://github.com/deeppomf/DeepCreamPy">DeepCreamPy</a></em> handles the dirty work so you can take care of your <em>own</em> business. Remember the markup tool <a href="https://9to5mac.com/2018/03/13/ios-markup-reveal-redact-sensitive-info/amp/">debacle</a> in iPhones? It was actually mostly transparent and barely hid any information, and ended up becoming a meme to slightly hide people&#8217;s names but in actuality dox them. You can see many instances of this on the <a href="https://old.reddit.com/r/Tinder/">/r/Tinder subreddit</a>. The funniest part is it&#8217;s the most commonly used pen tool because Apple purposely choosing to place it front-and-center in their user interface, and giving it the widest stroke. People can&#8217;t be bothered, and end up picking the easy option. Image metadata (if not properly stripped) can geolocate you to a very accurate degree.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l1c4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l1c4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 424w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 848w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 1272w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l1c4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png" width="540" height="595" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/601ca4ab-c619-423e-89f0-4c302851507f_540x595.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:595,&quot;width&quot;:540,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84883,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l1c4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 424w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 848w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 1272w, https://substackcdn.com/image/fetch/$s_!l1c4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F601ca4ab-c619-423e-89f0-4c302851507f_540x595.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Selective censoring is worse.</em></figcaption></figure></div><p>So that begs the question, can you do the same with faces? Sure the contrast is a lot worse but the added frames from the video might serve as a sort of interpolation? In some cases even blurring faces might be a bad idea. Just because we are unable to unblur a face today doesn&#8217;t mean we are unable in 10 or 100 years. Food for thought.</p><p><strong>TL;DR? </strong>Be careful with everything you put up online. The age-old adage rings true:</p><blockquote><p><em>what you put on the internet stays there forever, etched/ carved in stone.</em></p></blockquote><ol><li><p>I pipe all of the images I upload online through <a href="https://imageoptim.com/mac">ImageOptim</a> first.</p></li><li><p>Use the Adobe Acrobat Redaction tool. It&#8217;ll obliterate everything + the metadata.</p></li><li><p>Image formats like JPEG have a thumbnail (<a href="http://graphicssoft.about.com/b/2003/07/26/techtvs-cat-schwartz-exposed-is-photoshop-to-blame.htm">part of the EXIF metadata</a>) stored in them, which may not be updated when you edit the image. Also, leave generous margins. JPEGs can have compression artifacts that leak information outside the boundaries of the object. I&#8217;m sure you can sense my hatred towards this format.</p></li><li><p>Are you printing a document? Follow these instructions to safeguard yourself &#8212;</p><pre><code><code>Redact -&gt; print -&gt; scan -&gt; distribute.</code></code></pre><p>US courts and lawyers are finally starting to learn. Or for the paperless moguls:</p><pre><code><code>Redact -&gt; convert to image -&gt; convert to PDF -&gt; distribute.</code></code></pre></li></ol><p>And companies?</p><ol><li><p>In Photoshop, the <code>Filter &gt; Pixelate &gt; Mosaic</code> option should have a checkbox called <code>Secure?</code> or <code>Security Noise</code>. Or there should be a separate filter called <code>Pixelate &gt; Redact</code>. Ideally, it would use some intelligence to figure out the size of characters/ symbols in the selected area and automatically figure out the right combination of pixel size and noise.</p></li><li><p>Or, Keep It Simple Stupid (KISS): flood the whole rectangle with black. If that&#8217;s the only layer of the picture, there&#8217;s no need to worry if the &#8216;secure noise&#8217; is secure enough, or if it keeps staying secure two years down the line.</p></li><li><p>Pixelization algorithms should implement some degree of brightness and chromatic random noise in order to defeat this new wave of attacks.</p></li></ol><p>Might be overkill.</p><h1>Open-source intelligence (OSINT)</h1><p>Won&#8217;t share too much here because I might lose access to this tool, but there are a number of completely legal websites out there that one can use to perform KYC. The paid solutions provide a trove of data to:</p><ol><li><p>locate persons of interest</p></li><li><p>Uncover associations between people, addresses, phones, and social handles&nbsp;</p></li><li><p>Determine the credibility of sources, witnesses, or suspects</p></li><li><p>Track changes in historical online and offline identity information</p></li><li><p>Connect personal, professional, and social information</p></li></ol><p>Think of the site as a search engine for people. Social media resources like Twitter and  Facebook are especially useful, wherein you can <a href="https://developer.twitter.com/en">programmatically access</a> or <a href="https://github.com/twintproject/twint">publicly scrape</a> information on target users. Not using API keys grants you an additional level of security as well as the possibility of bypassing developer limitations.</p><p><strong>TL;DR? </strong>Keep a tight check on your social media presence and old content purge regularly, after saving it somewhere. The <a href="https://www.nakivo.com/blog/3-2-1-backup-rule-efficient-data-protection-strategy/">3-2-1 backup rule</a> might work well here.</p><h1>Please Charge Your Phone with My Wire</h1><p>Hey, we&#8217;re back to iPhone accessories. Last year, at the annual Def Con hacking conference, security researcher MG introduced an Apple charging cable capable of remotely connecting to a computer. Talking to <a href="https://www.vice.com/en/article/evj4qw/these-iphone-lightning-cables-will-hack-your-computer">Vice</a>, the devilish creator suggested you may even give the malicious version as a gift to the target &#8212; the cables even come with some of the correct little pieces of packaging holding them together. MG said:</p><blockquote><p><em>It&#8217;s like being able to sit at the victims computer but without actually being there.</em></p><p><em>The cable comes with various payloads, or scripts and commands that an attacker can run on the victim&#8217;s machine. A hacker can also remotely &#8216;kill&#8217; the USB implant, hopefully hiding some evidence of its use or existence.</em></p></blockquote><p>He is selling the cables for $200 each. Pricey, but Apple has always <em>thought differently</em>.</p><p><strong>TL;DR?</strong> Don&#8217;t use random people&#8217;s wires, and if you have to, don&#8217;t &#8216;trust&#8217; the wire.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rMrP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rMrP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rMrP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/e3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:834897,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rMrP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rMrP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3187131-281a-4ee0-b2de-e4fe48789a86_3456x3456.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Next, I show you how to look at private Spotify Activity. Photo by Ben Kolde</em></figcaption></figure></div><h1>Back to Basics (ABC&#8217;s)</h1><p>Let&#8217;s bring everything we&#8217;ve learned today, together. Once you&#8217;ve figured out the specifics of a user, all you really need to crack their password is a <a href="https://crackstation.net/crackstation-wordlist-password-cracking-dictionary.htm">wordlist</a> along with the internet&#8217;s most popular cracking tool, <em><a href="https://en.wikipedia.org/wiki/John_the_Ripper">John the Ripper</a></em>. He supports four modes:</p><ol><li><p><strong>Single crack mode:</strong> Tries mangling usernames obtained from the GECOS field, and tries them as possible passwords</p></li><li><p><strong>Wordlist mode:</strong> Tries all words in the provided wordlist (see above dataset)</p></li><li><p><strong>Incremental mode (aka Brute-Force attack): </strong>Tries all possible character combinations.</p></li><li><p><strong>External mode:</strong> Optional mode in which John may use program code to generate words. One can add their own rules to drastically decrease solve time. What rules you might ask? All the exploitable details about the target user you collected (including, but not limited to, their parent&#8217;s/ pets name, birth year, school, etc)</p></li></ol><p>Now, let&#8217;s create a hypothetical situation:</p><p>Using a wordlist dictionary (sourced from the internet) that has approximately 1,493,677,782 words (sized at 15GB) of the most commonly used phrases and database leak of existing user passwords, one would assume that it would take forever to crack the password and gain access. Combine this with external mode, and you&#8217;re exponentially multiplying the number of words. You&#8217;re safe right? Nope.</p><p>According to <a href="https://openwall.info/wiki/john/benchmarks">JtR benchmarks</a>, an <code>AWS c5a.24xlarge</code> instance can perform ~408 billion checks per second (is it cracks? not entirely sure). Even if you multiply your standard wordlist by 100,000 it would take a little over 36 seconds* to run through the entire set. Spread and parallelize that across multiple instances and you have a formidable password cracking tool. Now, not everyone has access to a beefy c5a, which costs ~$3.696 <a href="https://aws.amazon.com/ec2/pricing/on-demand/">per hour</a> in the cloud. What about running the cracking tool on your own laptop? You&#8217;ll likely easily reach 5MM c/s on a single core, which isn&#8217;t too bad.  On an 8-core machine, you&#8217;ll end up taking 43 days. Probably best to fork over that cash to our <a href="https://en.wikipedia.org/wiki/History_of_Amazon#:~:text=Online%20bookstore%20and%20IPO,-After%20reading%20a&amp;text=Amazon%20was%20founded%20in%20the,service%20as%20an%20online%20bookstore.&amp;text=In%20October%201995%2C%20the%20company%20announced%20itself%20to%20the%20public.">friendly neighborhood book rental company</a>.</p><p>For the time-strapped but cash-heavy individuals, please run Jack on <code>x1e.32xlarge</code> and share the results. At 7 times the hourly cost of the archaic <code>c5a</code>, I can&#8217;t wait for an optimized program to cross 1 trillion c/s, but for someone else to front the dough.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nom2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nom2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 424w, https://substackcdn.com/image/fetch/$s_!nom2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 848w, https://substackcdn.com/image/fetch/$s_!nom2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 1272w, https://substackcdn.com/image/fetch/$s_!nom2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nom2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png" width="1456" height="163" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:163,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:74847,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nom2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 424w, https://substackcdn.com/image/fetch/$s_!nom2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 848w, https://substackcdn.com/image/fetch/$s_!nom2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 1272w, https://substackcdn.com/image/fetch/$s_!nom2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F399c6282-0037-4f4e-ac07-d6ee0ec1601e_1977x221.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><em>* my math might be egregiously wrong here, I wrapped up this section at six in the morning.</em></p><h1>Epilogue</h1><p>So what can be done? Are we out of luck and is privacy dead? The famous (and somewhat obligatory) quote from Edward Snowden, the NSA whistleblower:</p><blockquote><p><em>Arguing that you don&#8217;t care about the right to privacy because you have nothing to hide is no different than saying you don't care about free speech because you have nothing to say.</em></p></blockquote><p><strong>TL;DR? </strong>Follow the tl;dr&#8217;s and you should honestly be fine.</p><h1>Further Reading</h1><ol><li><p><em><a href="https://www.pcmag.com/archive/google-wallet-security-experts-raise-concerns-over-pin-numbers-287978">Google Wallet pin code can be cracked in as little as 18 minutes</a></em>&#8212; Sept &#8216;11</p></li><li><p><em><a href="https://news.softpedia.com/news/smartwatches-can-be-used-to-spy-on-your-card-s-pin-code-498756.shtml">Smartwatches Can Be Used to Spy on Your Card&#8217;s PIN Code</a></em> &#8212; Jan &#8216;16</p></li><li><p><em><a href="https://xato.net/is-123456-really-the-most-common-password-51cd4259927d">Is 123456 Really The Most Common Password?</a></em> by security researcher Mark Burnett.</p></li><li><p><em><a href="https://xato.net/a-glimpse-into-the-world-of-internet-password-dumps-5ee4609da237">A Glimpse Into the World of Internet Password Dumps</a>,</em> also published by Burnett.</p></li><li><p><em><a href="https://minimaxir.com/2015/02/password-numbers/">Analyzing the Patterns of Numbers in 10 Million Passwords</a></em> by Max Woolf, insightful.</p></li><li><p><em><a href="https://passwordscon.org/">PasswordsCon</a></em> &#8212; brilliant research papers presented here.</p></li><li><p><em><a href="https://wpengine.com/resources/passwords-unmasked-infographic/">Unmasked</a></em> by WPEngine. The psychological reasons a person chooses a password.</p></li><li><p><em><a href="http://turbulence.org/project/the-secret-lives-of-numbers/">The Secret Lives of Numbers</a></em> currently hosted at Turbulence. An exhaustive 2002 empirical study to determine the relative popularity of every integer between 0 and one million. The authors themselves pitch the project best:</p><blockquote><p><em>We surmise that our dataset is a numeric snapshot of the collective consciousness.</em></p></blockquote></li><li><p><em><a href="https://www.linkedin.com/pulse/recovering-passwords-from-pixelized-screenshots-sipke-mellema/">Recovering passwords from pixelized screenshots</a> </em>by Sipke Mellema, creator of Depix.</p></li><li><p><em><a href="http://dheera.net/projects/blur">Why Blurring Sensitive Information is a Bad Idea</a></em> by Dheera Venkatraman.</p></li><li><p><em><a href="http://refocus-it.sourceforge.net/">Refocus-it</a></em> can be used to refocus images acquired by a defocused camera, blurred by Gaussian or motion blur, or any combination of these.</p></li><li><p><em><a href="https://www.forbes.com/sites/zakdoffman/2020/09/20/apple-iphone-12-ios14-ipad-upgrade-update-security-warning-lightning-charging-cable/?sh=4b00b95144ed">Why You Should Stop Using Other People&#8217;s iPhone Cables</a></em> &#8212; Sep &#8216;2020</p></li><li><p><em><a href="https://hashcat.net/hashcat/">Hashcat</a></em> &#8212; advanced password recovery. World&#8217;s fastest password cracker.</p></li><li><p><em><a href="https://write.privacytools.io/freddy/why-privacy-matters-even-if-you-have-nothing-to-hide">Privacy matters even if &#8216;you have nothing to hide&#8217;</a></em></p></li></ol><div><hr></div>]]></content:encoded></item><item><title><![CDATA[My Sudden Infatuation with Oil]]></title><description><![CDATA[&#1581;&#1576;&#1610; &#1604;&#1604;&#1606;&#1601;&#1591;]]></description><link>https://blog.virenmohindra.me/p/my-sudden-infatuation-with-oil</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/my-sudden-infatuation-with-oil</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Tue, 15 Dec 2020 23:23:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nJE5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>8-min read</em></p><p><em>Everything comes full circle. After attempting to reverse engineer a <a href="https://blog.virenmohindra.me/p/scripts-are-bad-mkay">cracked version of Turmoil</a> (a simulation game in which you drill for oil and expand on your capitalistic tendencies) earlier this year &#8212; I now start my investment foray into the hottest liquid commodity.</em></p><p><em>All information provided in this report is for informational purposes only and should not be deemed as investment advice or a recommendation to purchase or sell any specific security. One can safely assume the author holds a position in any discussed security. Their economic interest is subject to change without notice.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nJE5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nJE5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nJE5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg" width="1456" height="995" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:995,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:248623,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nJE5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nJE5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5bf2a894-49a1-4587-9612-4508b589bdc0_3626x2479.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1><strong>Two Sides of the Same Lubricated Coin</strong></h1><p>When it comes to physical oil, there are <a href="https://www.thebalance.com/crude-oil-brent-versus-wti-808872">different grades</a>. &#65279;&#65279;The two most popularly traded are:</p><ol><li><p>Brent North Sea Crude (commonly known as Brent crude) and</p></li><li><p>West Texas Intermediate (WTI).</p></li></ol><p><em>Brent refers to oil that is produced in the Brent oil fields and other sites in the North Sea.</em></p><p>I use $<a href="https://etfdb.com/etf/BNO/#holdings">BNO</a> to track Brent, $<a href="https://etfdb.com/etf/USL/#holdings">USL</a> to track the latter, and $<a href="https://etfdb.com/etf/DBO/#holdings">DBO</a> to cover the entire liquid gold commodities market, which has a mixture* of mutual funds, United States Treasury Bills dated for the end of Feb + mid-March &#8216;21, Invesco&#8217;s CLTL, and ~200 basis points of USD Currency. DBO also provides exposure to light sweet crude oil (WTI), which is the most popular oil benchmark in the world. Now one might ask why I&#8217;m not adding $<a href="https://etfdb.com/etf/USO/#etf-ticker-profile">USO</a> to my ETF/ ETN basket. Surely with one of the (comparatively) lower expense ratios (0.73% compared to the category average of 0.76) and largest assets &#8216;<em>under management&#8217;</em> ($3.65BB), and the added advantage of decent liquidity if I wanted to sell at short notice, I&#8217;d jump on the proverbial cargo boat.  The issue is the relatively higher price and along the same line <em><a href="https://www.investopedia.com/terms/c/contango.asp#:~:text=Key%20Takeaways-,Contango%20is%20a%20situation%20where%20the%20futures%20price%20of%20a,strategies%20to%20profit%20from%20contango.">contango</a></em>. From the Investopedia page:</p><blockquote><p><em>Contango is a situation where the futures price of a commodity is higher than the spot price. In all futures market scenarios, the futures prices will usually converge toward the spot prices as the contracts approach expiration. Contango tends to cause losses for investors in commodity ETFs that use futures contracts, but these losses can be avoided by buying ETFs that hold actual commodities.</em></p></blockquote><p>I choose USL because as its name suggests, they diversify across multiple maturities and rebalance on expiry, potentially eliminating the adverse impacts of contango.</p><blockquote><p><em>USO suffers from severe contango making it more appropriate for short-term traders.</em></p></blockquote><p>I guess I&#8217;m growing up and turning into a &#8216;seasoned investor&#8217;. Also &#8212; why not invest directly in the futures market to bypass this nonsense? Nope. I&#8217;ve tried and failed (read: my brief stint in soybeans, culminating in a piqued interest and eventual pivot to insect feed farming). If I&#8217;m dipping my toes again in commodities I&#8217;ll only stick to exchange-traded funds (or notes). As the Invesco description rightly states:</p><blockquote><p><em>This product may be a good choice for investors looking to gain exposure to futures contracts on fossil fuels, but do not want the risks associated with a futures-contracts.</em></p></blockquote><p>I digress. Year-to-date, they&#8217;re all doing horribly. Across the board, they&#8217;ve lost ~30% of their value, with outlier USO taking a huge hit of 68.61%. But since the time I exposed myself to the oil &amp; gas sector, which was about twelve weeks ago, month-on-month they&#8217;ve consistently gained 3-4%.</p><pre><code><code>YTD Performance for select O&amp;G ETFS, ranked by assets (in ascending order) --
</code><strong><code>USO: -68.61%</code></strong><code>
DBO: -22.96%
UNG: -42.94%
BNO: -39.86%
USL: -27.05%
UGA: -30.01%
</code><strong><code>OILK: -61.95%</code></strong><code>
DBE: -27.28%
OIL: -27.52%
UNL: -5.13%
GAZ: -39.29%
</code><strong><code>RJN: -46.51%</code></strong><code>
JJE: -42.95%

</code><em><code>Data from etfdb, dated Dec 16, 2020</code></em></code></pre><p><em>* I really wanted to use emulsion here instead.</em></p><h1>Some Barely Passable Technical Analysis</h1><p>Now the burning question &#8212; why am I switching gears in the final month of the final quarter of 2020 from my usual tech and biopharma plays to not only an entirely different sector but a totally unrelated industry? <strong>I believe oil is poised to make a huge comeback next year.</strong> This year, and the pandemic, has been particularly brutal on our beloved time-tested corporations and combined with a huge demand and a dramatic increase in Airbnb rentals and pickup in flights (especially on Thanksgiving), we&#8217;re looking at a complete overhaul for shale. Now, some cool graphs!</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/BayesData/status/1328480692641128453?s=20&quot;,&quot;full_text&quot;:&quot;AirBnB S-1\n\nLook at that dip.\n\n<a class=\&quot;tweet-url\&quot; href=\&quot;https://www.sec.gov/Archives/edgar/data/1559720/000119312520294801/d81668ds1.htm\&quot;>sec.gov/Archives/edgar&#8230;</a> &quot;,&quot;username&quot;:&quot;BayesData&quot;,&quot;name&quot;:&quot;Bayes&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Nov 16 23:30:53 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/Em-13jMW8AM9C3f.png&quot;,&quot;link_url&quot;:&quot;https://t.co/CkolQVD0dL&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:3,&quot;like_count&quot;:30,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>and</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/flightradar24/status/1331286193875640322?s=20&quot;,&quot;full_text&quot;:&quot;The skies above North America at Noon ET on the Tuesday before Thanksgiving.\n\nActive flights\n2018: 6,815 \n2019: 7,630 \n2020: 6,972\n\n&#128225; <a class=\&quot;tweet-url\&quot; href=\&quot;https://www.flightradar24.com/35.17,-90.21/5\&quot;>flightradar24.com/35.17,-90.21/5</a> &quot;,&quot;username&quot;:&quot;flightradar24&quot;,&quot;name&quot;:&quot;Flightradar24&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Tue Nov 24 17:18:57 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EnmtZ_tW8AEiVp0.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/WOY9j0BXpx&quot;},{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EnmtZ_uXIAYVbj8.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/WOY9j0BXpx&quot;},{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EnmtaAGXIAAQcLX.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/WOY9j0BXpx&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:639,&quot;like_count&quot;:1870,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Now one might look at the actual dataset from <a href="https://www.tsa.gov/coronavirus/passenger-throughput">TSA checkpoint travel numbers</a> and point the <em>number-of-passengers</em> discrepancy, but why should I care? Sure, total traveler throughput has fallen 33% compared to last year, but flights are still being chartered. Also, the initial investment is literal pennies on the dollar after COVID-19 ravaged the market. Warren Buffet seems to agree with my acuity:</p><blockquote><p><em>Buffett has a reputation for spending his money fairly parsimoniously. Meaning he buys good companies when they are cheap, and famously, rarely sells them. I think there are two things that he likes about the pipeline business. One, it's a tolling business with long-term take or pay-type contracts and without nominally much exposure to commodity prices, although as we have seen those chickens will eventually come home to roost. And, as WB has told us previously,&nbsp;<a href="https://www.thestreet.com/investing/5-stocks-to-buy-to-be-like-buffett-11682154">he likes businesses where he can just collect fees.</a></em></p></blockquote><p>Read: <a href="https://oilprice.com/Energy/Energy-General/Why-Warren-Buffet-Is-Betting-Big-On-Oil-Gas-Pipeline-Companies.html">Why Warren Buffet Is Betting Big On Oil &amp; Gas Pipeline Companies</a><br><em>Disclaimer: I wouldn&#8217;t pay too much heed to information from a website named </em>oilprice.com but they do have some neat insights.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FXWO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FXWO!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 424w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 848w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 1272w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FXWO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png" width="1200" height="800" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:188803,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FXWO!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 424w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 848w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 1272w, https://substackcdn.com/image/fetch/$s_!FXWO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F4f20ad6b-b733-4b06-b001-9845ff348a90_1200x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>From <a href="https://www.flightradar24.com/data/statistics">FlightRadar24</a></em></figcaption></figure></div><p>We&#8217;re slowly converging on the equilibrium point, akin to contango!</p><p>Let&#8217;s correlate random data together and compare our ETF/ ETNs 2-year charts to another prominent oil player of the S&amp;P 500 (which recently closed around mid-40s &#8212; laughable after holding the #1 spot in 2008): <strong>Exxon</strong>, ticketed as <strong>XOM</strong>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dq4P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dq4P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 424w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 848w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dq4P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png" width="1456" height="811" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:811,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:592813,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dq4P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 424w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 848w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 1272w, https://substackcdn.com/image/fetch/$s_!dq4P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F61875933-3d11-4793-8c34-ef01cf016eba_2334x1300.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Created on <a href="https://www.barchart.com/my/compare-stocks">BarChart</a>. E and D refer to Earnings and Dividends respectively. All instruments reached their ATH five days after New Years&#8217; 2020.</em></figcaption></figure></div><h1>Correlation = Causation?</h1><p>One would expect similarities between a company whose primary industry focus is Oil, but comments by current CEO Darren Woods suggest otherwise:</p><blockquote><p><em>&#8216;I believe the assumption that affordable energy and a cleaner environment are a zero-sum game is mistaken. It underestimates the power of technology. The zero-sum view is a static one, and the world of energy is anything but static. But technology changes the equation.&nbsp; It makes a dream &#8211; growing the economy while reducing emissions &#8211; a reality.&#8217;</em></p></blockquote><p>Read: <a href="https://corporate.exxonmobil.com/News/Newsroom/News-releases/2020/0811_ExxonMobil-and-Global-Clean-Energy-Holdings-sign-agreement-for-renewable-diesel">ExxonMobil and Global Clean Energy Holdings sign agreement for renewable diesel</a> &#8212; Aug &#8216;20</p><p>Interesting take from a Rockefeller company, especially when in 2015 they prefaced a shareholder meeting with the then CEO making fun out of clean energy by <a href="https://www.politico.com/story/2015/05/exxonmobil-ceo-downplays-climate-change-mock-renewable-energy-118330">commenting</a> <em>&#8216;We Choose Not to Lose Money on Purpose&#8217;.</em> He then went on to get nominated as Secretary of State by then-President-elect Donald Trump on December 14, 2016, almost retiring four months early and potentially giving up a $180MM retirement package. He did redeem himself later:</p><blockquote><p><em>following Trump&#8217;s strangely political and inappropriate speech at the annual Boy Scout Jamboree, Tillerson, according to NBC, was so offended that he was going to resign, until Vice-President Pence, Defense Secretary James Mattis, and the incoming chief of staff, John Kelly, persuaded him to stay. That same month, Mattis reportedly attended a meeting of national-security officials at which Tillerson referred to Trump as a &#8216;fucking moron.&#8217;</em></p></blockquote><p>Read: <a href="https://www.newyorker.com/magazine/2017/10/16/rex-tillerson-at-the-breaking-point">Rex Tillerson at the Breaking Point</a> &#8212; Oct &#8216;17</p><p>And I don&#8217;t want only want to shame Exxon alone. BP, Shell, Eni, Chevron all have <a href="https://www.nsenergybusiness.com/features/oil-companies-renewable-energy/">reneged on their idealistic green-thumbed promises</a>:</p><blockquote><p><em>Despite the growth in renewables, big oil only spent 1% of its combined budget on green energy schemes in 2018.</em></p></blockquote><p>A <a href="https://www.sciencedirect.com/science/article/pii/S2211467X19300574">2019 report </a>by Matthias J Pickl &#8212; an economics professor at King Fahd University of Petroleum and Minerals in Saudi Arabia &#8212; discussed whether oil companies are transforming themselves into energy firms.</p><blockquote><p><em>Furthermore, growing concerns about climate change following the&nbsp;<a href="https://www.ns-businesshub.com/science/what-is-the-paris-agreement-climate-change/">Paris Agreement</a>&nbsp;may provide an additional drive for such strategy to hedge against hardening investor sentiment towards carbon emissions.</em></p></blockquote><h1>Playing Devil&#8217;s Advocate</h1><p>Why is it so difficult to predict oil trends? Well, we&#8217;re living in tumultuous times. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ERgf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ERgf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ERgf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/afdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110696,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ERgf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ERgf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fafdc7243-0f56-48d2-abad-0bb424ee5bc8_1920x1080.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Short-sellers (like me) have <a href="https://edition.cnn.com/2020/12/04/investing/tesla-short-sellers-elon-musk/index.html">lost more this year on Tesla</a> than ever before.</p><blockquote><p><em>According to analysis by S3 Partners, short investors in Tesla&#8212; those who placed bets in the market that its shares would lose value &#8212; have lost $35 billion on those positions so far this year. To put that loss into context, the US airline industry posted combined net losses of $24.2 billion, excluding special items, through the first nine months of 2020, the&nbsp;<a href="http://www.cnn.com/2020/10/12/investing/airlines-third-quarter-losses-predictions/index.html">worst losses the industry has ever reported</a>.</em></p></blockquote><p>The automobile company is also <a href="https://www.barrons.com/articles/tesla-stock-is-set-up-for-volatile-week-ahead-of-inclusion-in-index-51607957121">poised to join</a> the S&amp;P 500 with a 1.5% weighting (compared to Apple&#8217;s 5.8%) on Monday, December 21, 2020. And I would prefer not to comment on Musk&#8217;s meteoric rise from multi-billionaire to current Twitter meme-lord. In a span of 9 hours on December 14th, he shared these golden nuggets:</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/elonmusk/status/1338365886542049282?s=20&quot;,&quot;full_text&quot;:&quot;&quot;,&quot;username&quot;:&quot;elonmusk&quot;,&quot;name&quot;:&quot;Elon Musk&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Dec 14 06:11:07 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EpLUrc2W4AE3484.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/qbNT1dUsED&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:23273,&quot;like_count&quot;:251247,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/elonmusk/status/1338375990217760771?s=20&quot;,&quot;full_text&quot;:&quot;&quot;,&quot;username&quot;:&quot;elonmusk&quot;,&quot;name&quot;:&quot;Elon Musk&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Dec 14 06:51:16 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EpLd3knW4AArmU4.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/sdmXKbHdzd&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:3723,&quot;like_count&quot;:73754,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/elonmusk/status/1338502080911306755?s=20&quot;,&quot;full_text&quot;:&quot;Hehe &quot;,&quot;username&quot;:&quot;elonmusk&quot;,&quot;name&quot;:&quot;Elon Musk&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Dec 14 15:12:18 +0000 2020&quot;,&quot;photos&quot;:[{&quot;img_url&quot;:&quot;https://pbs.substack.com/media/EpNQjCfXcAA_VSY.jpg&quot;,&quot;link_url&quot;:&quot;https://t.co/SkLMiL3OxT&quot;}],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:24101,&quot;like_count&quot;:324918,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Will this one trade put me in the black for the next year? I&#8217;m not sure. These publicly listed companies have to deal with new regulations, comply with ESG principles, and face the highest possible level of government scrutiny before they stand a chance of turning a profit in &#8216;21. Oil supply is currently outcompeting demand, and we might never go back to the way it was before. And if you look at the 5-year-window of any O&amp;G corp you see red lines and losses. It might already be too late &#8212; the gold rush is finally over. How am I hedging my bets? I&#8217;m being less risky, by investing in ETFs of commodities instead of the futures market, but also riskier, because of the incontrovertible proof that oil is a dangerous business and I&#8217;m probably way over my head. But combined with stop losses and my unnervingly high-risk profile (thanks to crypto), I do believe oil will make a good enough comeback to lock in profits. I would like to close on two questions:</p><ul><li><p>Will the R&#178; of these big conglomerates stocks and oil ETFs continue along with these trends or show some meaningful divergence in the near future?</p></li><li><p>And when?</p></li></ul><p>I don&#8217;t believe they&#8217;re going to be changing teams anytime soon, but nevertheless, I&#8217;ve included more resources below for you to accurately judge and ponder for yourself:</p><ul><li><p><a href="https://www.industryweek.com/leadership/companies-executives/article/22024490/exxon-quietly-researching-hundreds-of-green-projects">Exxon Quietly Researching Hundreds of Green Projects</a> &#8212; Nov&#8217; 17</p></li><li><p><a href="https://www.texasmonthly.com/news/exxon-mobil-failure-green-energy-financial-losses/">ExxonMobil&#8217;s Failure to Go Green Could Worsen Its Financial Future</a> &#8212; Nov&#8217; 20</p></li></ul><p>I&#8217;ll leave this as an exercise to the reader on where the road less taken (and frankly hopefully less polluted) might take us. Also, please let me know so I can exit some positions.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3LYI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3LYI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 424w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 848w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 1272w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3LYI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png" width="432" height="323.6387959866221" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:448,&quot;width&quot;:598,&quot;resizeWidth&quot;:432,&quot;bytes&quot;:49085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3LYI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 424w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 848w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 1272w, https://substackcdn.com/image/fetch/$s_!3LYI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9c71a506-8e8b-499a-9b0b-47f335ef8b36_598x448.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Further Reading</h1><ol><li><p><a href="https://www.bloomberg.com/news/articles/2020-12-14/shell-eni-settle-dispute-with-kazakhstan-in-1-3-billion-deal">Shell, Eni Settle Dispute With Kazakhstan in $1.3 Billion Deal</a> &#8212; Dec &#8216;20</p><p><em>The deal unlocks plans to boost output from the Karachaganak [oil] field.</em></p></li></ol><div><hr></div>]]></content:encoded></item><item><title><![CDATA[do the needful]]></title><description><![CDATA[The trials and tribulations of outsourcing.]]></description><link>https://blog.virenmohindra.me/p/needful</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/needful</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Mon, 23 Nov 2020 20:37:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!na_B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>7-min read</em></p><p><em>Finding a reputable, trustworthy developer from India for a client project is challenging. Especially if you&#8217;re navigating this minefield alone. In this write-up, I try and make the process easier by identifying a few core issues and how I work around them. Please Find Attached: suicide rates in India (due to the rat race), mitigating &#8216;overpromising and under-delivering&#8217;, weeding out subpar developers through rigorous interviewing, and why I hate certain phrases.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!na_B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!na_B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!na_B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!na_B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!na_B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!na_B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg" width="1456" height="1941" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1941,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2360012,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!na_B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 424w, https://substackcdn.com/image/fetch/$s_!na_B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 848w, https://substackcdn.com/image/fetch/$s_!na_B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!na_B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F66d17435-325d-45f0-8657-073b56720bec_3024x4032.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by Shamees Cm</em></figcaption></figure></div><p>Indian-based developers aren&#8217;t all that bad. Some of my most extensive projects have been outsourced to experienced IITians and they&#8217;ve handled deadlines with relative ease &#8212; with comprehensive code documentation, unit tests, and a close feedback loop. And they&#8217;ve been handsomely rewarded for their efforts. But for all of these software engineers, soft skills are something that lacks across the board. This problem rears its ugly head in many forms:</p><ol><li><p>Overpromising and Under-delivering &#8212; setting proper expectations</p></li><li><p>Fake Credentials &#8212; spring cleaning</p></li><li><p>Email Etiquette &#8212; why I hate the phrases <em>do the needful, P.F.A, kindly revert back</em>.</p></li></ol><p>I attempt to address each point of contention below.</p><h1>Rat Race</h1><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aHAM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aHAM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aHAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg" width="422" height="149" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:149,&quot;width&quot;:422,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aHAM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aHAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e9b5-ba0a-4edc-8d58-5aba02c7ba2b_422x149.jpeg 1456w" sizes="100vw"></picture><div></div></div></a><figcaption class="image-caption"><em>A 2009 dramedy exploring parental expectations, </em>students' aptitudes, and rote memorization.<em> A refreshing outlook compared to the bleak future of current Indian students. Appropriately subtitled &#8216;Chase Excellence, Success will Follow&#8221;.</em></figcaption></figure></div><p>For some reason, unbeknownst to me, all of these young graduates fall into this communication trap. They&#8217;re raised in extremely competitive environments combined with heavy tiger parenting, where if one loses a contract or can&#8217;t secure a job they&#8217;re deemed unworthy and fall behind. An unfortunate byproduct of this <em>perceived failure</em> is the uptick in average daily suicides in India (381), with a 3.4% increase in observed suicides in 2019 (139,123) as compared to 2018 (134,516) and 2017 (129,887), as reported by the <a href="https://ncrb.gov.in/en/accidental-deaths-suicides-in-india?field_adsi_year_value%5Bvalue%5D%5Byear%5D=2020&amp;field_accidental_deaths_suicides_value=2&amp;items_per_page=All">National Crime Records Bureau</a>.</p><blockquote><p><em>In 2019, a person in India died by suicide every four minutes.</em>&#185;</p></blockquote><p>Now, not all deaths can be attributed to career/ educational aspirations, and the farmers of Sikkim and Karnataka are indicative of this causal relationship. Different reasons: droughts, low yield prices, exploitation by middlemen, and loan defaults lead them to cut their lives short. But still, the statistic holds true, because a <em>kisaans</em> inability to provide for his or her family is just another synonym of frustration</p><blockquote><p><em>India is the greatest contributor to the absolute number of suicide deaths.<br>&#8212; <a href="http://ghdx.healthdata.org/gbd-results-tool?params=gbd-api-2017-permalink/4eda0172a1cdc5d92b2be4b4950cf9a8">Global Health Data Exchange</a></em></p></blockquote><p>In a pathetic attempt to curb these numbers, The Indian Government decided to deem suicide illegal, whereby survivors would face a jail term of up to one year and fines under <a href="https://indiankanoon.org/doc/1501595/?__cf_chl_jschl_tk__=166268928aa2f6b886a2d06fbf292e9f14d8f0a9-1606151397-0-AWzKiMfpo3nWq_de3pXUf0TZsdK3vJxNISMnJxVAH40iB1HENwvb5hIkmp8dFEkWNeYugn64F7WPQQU-IgekOE_gRT-YZSsjzg97DUNkGqP0pFpAkL87Mx1prtZyI4lzzmpKlvcrNhFENRXd4OHgQx9x_UBPcoMBT_oZYMvPXkfQ4oxTNFPcEqQb-Wk03buT7H0FiYGgSvg-M7qcddIvaSOKPf2x2P5bmng0ZsGjs0QLMu4BbjnrlkUFnrkhGOU6fDtztnAa4rmY3WullLdy0TxMh_X8gF2xNYrgqqDBtL1m_RggH-AWOFr94JYPKb_-Uh_-pN9_e3LM7KVLPf1Eh1L470KT7DXL5uLlc_RpfioaDdAMJXo8bYnDKGIfUTBimA">Section 309</a> of the Indian Penal Code. Trust me, this irony wasn&#8217;t lost, especially after Parliament decided to repeal the law in 2014, and in April 2017, decriminalize suicide by passing the <a href="http://egazette.nic.in/WriteReadData/2017/175248.pdf">Mental Healthcare Act</a>. Baby steps.</p><p>&#185; The word &#8216;committing&#8217; implies performing a cardinal sin through a deliberate act, however victims usually do not feel as though they have a choice. And while etymologically speaking this wording might not hold a lot of weight, according to <a href="https://www.dictionary.com/e/right-words-about-suicide/">Dictionary.com</a>, replacing the phrase with <em>died by suicide</em>&nbsp;is a small change that can have a big impact.</p><h1>The Duality of Man and One&#8217;s Achievements</h1><blockquote></blockquote><p>I&#8217;ve digressed a bit, and since it a month has passed since Mental Health Day, I&#8217;ll get back on topic. What I&#8217;m trying to say is communal pressure pushes these developers to carve unrealistic goals which unfortunately results in one either losing trust in their ability (or lack thereof) in performing the tasks at hand or dropping them entirely. I pay well above the market rate and expect solid results.</p><blockquote><p><em>I understand their predicament, but can&#8217;t empathize.</em></p></blockquote><p>The time wasted, vetting, hiring, and peer-programming are lost and can never be gained back.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9bqN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9bqN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9bqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg" width="1456" height="520" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:172772,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9bqN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9bqN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F57f13ad0-e8ea-4dd0-8012-f4d91af6a7fb_2100x750.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Playing devil&#8217;s advocate, <a href="https://www.melissacoaching.com/the-over-promise--under-deliver-trap.html">Melissa Rutherford</a> provides more context:</p><blockquote><p><em>People who over promise and under deliver are often thought of as lazy, self-indulgent and irresponsible, when the opposite may be just as true.<br><br>We may get bored after the exciting &#8216;promise&#8217; has passed.&nbsp; Then we may begin to fear failure and avoid or procrastinate the now boring task, until it is too late.&nbsp; We may become distracted by more urgent or fun tasks, telling ourselves that we will do it right after we do this other thing.&nbsp; This results in last minute urgency and a poor job, thus self-fulfilling that prophecy of failure &#8211; and round and round we go -ugh.</em></p></blockquote><p>Another concern of mine is the lack of communication between outsourcer and subcontractor. I myself had lived through countless horror stories of following up with developers numerous times over the course of a single day so I can then report back to a client. The most common reason why this persists is a direct tangent to the aforementioned issue &#8212; when one is knee-deep in a project and a deadline is nearing, they drop the ball and under-communicate to &#8216;attempt&#8217; to <em>focus</em> on a particular feature. I&#8217;m not immune: I&#8217;ve done this countless times and have been chastised by clients and employers alike. I go into a hole (my room) and then try digging myself out by rushing to build out a screen or functionality when in actuality I should have known my limitations and either asked for help or asked for more time to address the problem.</p><p>A better approach for an engineer would be to identify the project scope at the very start, define strict end goals, and have complete clarity from both channels. Take a few days off and revisit the contract so you know exactly what you&#8217;re getting into, and if you have one iota of doubt about your ability to complete the project, be clear about expectations vs. reality. The client will greatly appreciate truthfulness and transparency over promises, promises, promises.</p><p>Also: Buffers. Add ten more days for <a href="https://en.wikipedia.org/wiki/Scope_creep">scope creep</a>, and then a few more for bug fixes. You&#8217;ll thank me later.</p><h1>The Ancient Eight Forged Diplomas</h1><p>In my four years of outsourcing projects, I&#8217;ve rifled through hundreds of resumes and CVs &#8212; some patterns emerge. Credentials, educational qualifications, plagiarism are rampant and omnipresent when you&#8217;re doing work online. If you ever feel something is amiss, one can generally connect the dots with a quick search and a perusal of their online professional profiles.</p><blockquote><p><em>I&#8217;ve haven&#8217;t yet hired a developer who doesn&#8217;t have an online presence or glowing recommendations.</em></p></blockquote><p>GitHub repositories are indexed frequently, and committed code can easily be searched. I use a combination of <a href="https://grep.app/">Grep</a>, GitHub Search (unfortunately still lacking), and concatenated Google <a href="https://ahrefs.com/blog/google-advanced-search-operators/">operators</a> to drill down and find instances of forks. You can also just have a quick call with them to walk you through their favorite project.</p><p>For coding interviews, I provide the developer a single prompt, wherein they can either tackle the simpler 1-hour project or take on the 2-hour extensive project, (which has a handful of more accessibility features, for instance, unit testing, documentation, etc.) Prospectives can choose either, I hold no prejudice, but I do set hard limits on the time they can take to solve the question. This kills two birds with one stone: I respect their time and don&#8217;t waste it, and I get to see their creativity flow.</p><blockquote><p><em>Later, we get on a call and once they&#8217;ve presented their application I ask them how they would plan to future proof or extend/ add features. If they had one more day what would they do? What about a week? A year? Ten years?</em></p></blockquote><p>This provides me great insight on how they would operate and the extent to which they would think to hash out a solution. Some interesting nuggets from Twitter below (which in hindsight might be too pretentious and asking for a lot from the Indian subcontinent, but the replies are worth checking out):</p><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/dtrinh/status/1307056329522020356&quot;,&quot;full_text&quot;:&quot;Favorite interview question: What was the last piece of feedback you got that seriously changed how you work?&quot;,&quot;username&quot;:&quot;dtrinh&quot;,&quot;name&quot;:&quot;Danny Trinh&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Fri Sep 18 20:38:07 +0000 2020&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:7,&quot;like_count&quot;:150,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/kunalb11/status/1302898373989523456&quot;,&quot;full_text&quot;:&quot;What are some good interview questions to assess general problem solving skills?&quot;,&quot;username&quot;:&quot;kunalb11&quot;,&quot;name&quot;:&quot;Kunal Shah&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Mon Sep 07 09:15:53 +0000 2020&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:95,&quot;like_count&quot;:1201,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><div class="twitter-embed" data-attrs="{&quot;url&quot;:&quot;https://twitter.com/gregisenberg/status/1294621179941183488&quot;,&quot;full_text&quot;:&quot;My recent go-to interview question: \n\nYou have a Instagram account with 5m followers. It&#8217;s a dog meme page. \n\nYou have 30 days to generate at least $15000 per day.\n\n How do you do it??&quot;,&quot;username&quot;:&quot;gregisenberg&quot;,&quot;name&quot;:&quot;GREG ISENBERG&quot;,&quot;profile_image_url&quot;:&quot;&quot;,&quot;date&quot;:&quot;Sat Aug 15 13:05:16 +0000 2020&quot;,&quot;photos&quot;:[],&quot;quoted_tweet&quot;:{},&quot;reply_count&quot;:0,&quot;retweet_count&quot;:67,&quot;like_count&quot;:1100,&quot;impression_count&quot;:0,&quot;expanded_url&quot;:{},&quot;video_url&quot;:null,&quot;belowTheFold&quot;:true}" data-component-name="Twitter2ToDOM"></div><p>Jeff Bezos&nbsp;once <a href="https://www.fastcompany.com/50661/inside-mind-jeff-bezos">said</a>:</p><blockquote><p><em>&#8216;I&#8217;d rather interview 50 people and not hire anyone than hire the wrong person.&#8217;</em></p></blockquote><p><a href="https://theinterviewguys.com/amazon-interview-questions/">Please</a> take <a href="https://interviewpenguin.com/amazon-interview-guide-50-interview-questions-answers/">advantage</a> of the Amazon Interview Question Bank:</p><ul><li><p>Tell us about a time when you missed a deadline or productivity target?</p></li><li><p>Describe a time when you struggled to communicate something to your boss, colleague, or customer. How did you manage to get your message over?</p></li><li><p>Can you describe your most difficult customer and how you were able to handle their needs?</p></li><li><p>Can you tell me about a time when you were more than halfway through a project and had to pivot quickly due to an unexpected change? How did you handle it?</p></li><li><p>If one of your close work colleagues stole a $1 item, what would you do?</p></li></ul><h1>Why I Prefer Canned Replies</h1><p>Onto my pet peeve. You'll never find the phrases <em>do the needful</em>, <em>please find attached</em> or, my most hated <em>kindly revert back</em>, in any of my emails. For some odd reason, I detest  when I read them in one of the back-and-forths from my subcontractors. I&#8217;m guessing, years back, those particularly worded emails burnt me and have now left a bad aftertaste in my mouth. It's not the phrases themselves, it's (almost always) the context they are used in. They signify <em><a href="https://en.wiktionary.org/wiki/babudom#:~:text=Noun,or%20red%20tape%2C%20in%20India.">babudom</a></em> at its worst. Where did that saying come from?</p><p>Likely of British origin, during the Raj. I can imagine &#8216;<em>Kindly do the needful, old chap</em>&#8217; scrawled in the margin of an official missive, as it languidly flitted from one administrative table to another. Many such anachronisms exist; and thankfully, they're dying out one by one. A few decades ago (in the last century, to be precise), it wasn&#8217;t very uncommon for official letters to be signed off with</p><blockquote><p><em>I remain, Sir, your obedient servant.</em></p></blockquote><p>Later, it was shortened to yours obediently and now has vanished altogether. But why are these phrases still ubiquitous in Indian-English-speak? It partly comes from the language <em>the bureaucracy</em> uses and expects in communication, and given several<strong> </strong>sociological<strong> </strong>factors like</p><ul><li><p>India&#8217;s socialist history combined with a</p></li><li><p>weak pre-92 marketplace,</p></li><li><p>and a strong presence of state-owned businesses (even today)</p></li></ul><p>hereditary roots/ the way you&#8217;re raised</p><ul><li><p>learning from the grandparents and parents who worked in this bureaucracy</p></li></ul><p>educational misnomers</p><ul><li><p>with schools failing to teach soft skills like written communication &#8212; which won't help you ace exams and get a job, or push you forward in the rat race, so, therefore, aren&#8217;t important &#8212; pushing templated answers instead</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RIdu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RIdu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 424w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 848w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 1272w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RIdu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png" width="406" height="496.6360856269113" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:800,&quot;width&quot;:654,&quot;resizeWidth&quot;:406,&quot;bytes&quot;:107256,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RIdu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 424w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 848w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 1272w, https://substackcdn.com/image/fetch/$s_!RIdu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F25e2700a-6b61-41ed-b235-0ea8bede0104_654x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>An example ripped straight from an NCERT textbook showing the &#8216;perfect&#8217; way to write a formal email or letter.</em></figcaption></figure></div><p>and company norms, business practices, and formal mannerisms</p><ol><li><p>with workplace culture influencing one&#8217;s speech and also what their mentors and management previously did when they were junior (and how they set the tone) &#8212; somewhat akin to the polite language you hear in the U.S. South.</p></li></ol><blockquote><p><em>You can pick up habits easily when you are not sure what is the right way to behave.</em></p></blockquote><p>The Indian white-collar mindset is already set in stone, and it&#8217;s proving difficult to enact any sort of change. Now, you might say this has no material impact on my life, I&#8217;m being facetious, and to some extent incredibly racist, but, for me, words matter.</p><p>It showcases a want to break away from the norm, explore possibilities by yourself, and most importantly, have your own voice. But forget all of this, I&#8217;m the one hiring and paying developers, and similar to Airbnb having their coding style guide, I can have my very own format where subcontractors should abide by and toe the line.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[How to Hack Hotel Wifi]]></title><description><![CDATA[Using Onomatology]]></description><link>https://blog.virenmohindra.me/p/how-to-hack-hotel-wifi</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/how-to-hack-hotel-wifi</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Tue, 17 Nov 2020 10:30:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Ku4y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>2-min read</em></p><p><em>According to <a href="https://www.census.gov/newsroom/press-releases/2020/2020-census-all-states-top-99-percent.html">updated numbers</a> released by the U.S. Census Bureau, 99.98% of all housing units and addresses nationwide were accounted for in the 2020 Census as of the end of self-response and field data collection operations on Oct. 15, 2020. Let&#8217;s leverage this data for common good. Here, I take advantage of frequently common surnames to gain free wifi access at hotels.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ku4y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ku4y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ku4y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg" width="1456" height="970" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:970,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1092393,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ku4y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ku4y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F0c811f58-9e3b-4608-8b68-0a89f81d1f11_4096x2730.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by Rhema Kallianpur</em></figcaption></figure></div><p>Many hotels ask you to provide your last name and room number to use their WiFi. According to the <a href="https://www.census.gov/topics/population/genealogy/data/2010_surnames.html">2010 U.S. Census Bureau</a>,&nbsp;around 3% (or ~8,863,537) of people have</p><pre><code><code>Smith, Johnson, Williams, Brown, or Jones as surnames. // 2.87*</code></code></pre><p>And this number is only increasing. Therefore, theoretically, in a hotel with 50 rooms, there is a 78% chance that one could sign in by just trying these names for each room. It would be trivial to write a script that accepts a range of numbers and a list of surnames and generate pairs of permutation of combinations for input.</p><blockquote><p><em>In fact, when I tested this using <code>Smith</code> as a proxy, I got access by my ninth room.</em></p></blockquote><p>YMMV, but I doubt this would be theoretically possible in India. Too many edge cases.</p><p>I&#8217;ve curated a list of common surnames in each country (sorted first by region, then alphabetically) that could potentially save you on incidental costs during travels:</p><h4>Asia</h4><pre><code><strong><code>Bangladesh (Bangla Romanization):</code></strong><code> Ahmed, Ali, Akhtar</code></code></pre><pre><code><strong><code>China:</code></strong><code> Wong, Lee, Cheung, Chan</code></code></pre><pre><code><strong><code>Japan:</code></strong><code> Sato, Suzuki</code></code></pre><pre><code><strong><code>Korea:</code></strong><code> Kim, Lee, Park, Choi</code></code></pre><pre><code><strong><code>Philippines:</code></strong><code> Santos, Reyes, Cruz</code></code></pre><pre><code><strong><code>Turkey:</code></strong><code> Yilmaz, Kaya, Demir, &#350;ahin // does the </code><a href="https://en.wikipedia.org/wiki/Cedilla"><code>cedilla</code></a><code> hook-tail in </code><strong><code>&#350;</code></strong><code>ahin count?</code></code></pre><pre><code><strong><code>Vietnam:</code></strong><code> Nguyen, Tran, Le, Pham, Phan // 70.1%</code></code></pre><p>Also, I thought it would be interesting to share this <a href="https://web.archive.org/web/20080226203617/http://seasrc.th.net/pdf/xthname.pdf">tidbit</a> presented at the 1997 International Conference on Computer Processing of Oriental Languages in HK:</p><blockquote><p><em>There are no common Thai surnames. Surnames were largely introduced to Thai culture only by the 1913 Surname Act. The law does not allow one to create any surname that is duplicated with any existing surnames. Under Thai law, only one family can create any given surname: any two people of the same surname must be related, and it is very rare for two people to share the same full name. In one sample of 45,665 names, 81% of family names were unique.</em></p></blockquote><p></p><h4>Europe</h4><pre><code><strong><code>Denmark: </code></strong><code>Nielsen, Jensen, Hansen // patronymic ending in Norse -sen (son of)</code></code></pre><pre><code><strong><code>France: </code></strong><code>Martin, Bernard, Dubois, Thomas, Robert, Richard</code></code></pre><pre><code><strong><code>Germany: </code></strong><code>M&#252;ller, Schmidt, Schneider, Fischer // I wonder if </code><a href="https://en.wikipedia.org/wiki/Diaeresis_(diacritic)"><code>umlaut's</code></a><code> are required or they sanitize input</code></code></pre><pre><code><strong><code>Ireland:</code></strong><code> Murphy, O'Kelly, O'Sullivan, Walsh, Smith // ^ same question with apostrophes</code></code></pre><pre><code><strong><code>Italy:</code></strong><code> Rossi, Russo, Ferrari // From </code><a href="https://www.mappadeicognomi.it/classifica_cognomi_piu_diffusi.php?p=2"><code>Mappa dei Cognomi website</code></a></code></pre><pre><code><strong><code>Malta:</code></strong><code> Borg, Camilleri, Vella // 9.3%</code></code></pre><pre><code><strong><code>Portugal:</code></strong><code> Silva, Santos, Ferreira // 20.65%</code></code></pre><pre><code><strong><code>Russia (transliterated):</code></strong><code> Smirnov, Ivanov, Kuznetsov // 3.81%. Again, do they use the Cyrillic Alphabet or Anglicised form?</code></code></pre><pre><code><strong><code>Spain:</code></strong><code> Garcia, Fern&#225;ndez, Gonz&#225;lez, Rodr&#237;guez // 3.48% just for Garcia! Cumulative total is 9.78%. </code><a href="https://en.wikipedia.org/wiki/Diacritic"><code>Diacritic</code></a><code>-safe? Mayb&#233;&#233;&#233;.</code></code></pre><pre><code><strong><code>Sweden: </code></strong><code>Johansson, Nyman, Lindholm, Karlsson, Andersson // .677</code></code></pre><pre><code><strong><code>United Kingdom:</code></strong><code> Smith, Jones, Taylor, Brown, Williams // 3.55%. Two sides of the same coin with regards to The States.</code></code></pre><blockquote><p><em>In Greater London, Patel shoots up to third place.</em></p></blockquote><p></p><h4>Oceania</h4><pre><code><strong><code>Fiji:</code></strong><code> Kumar, Prasad, Chand, Singh, Lal, Sharma</code></code></pre><blockquote><p><em>I need to read up more on the Indian indenture system (read: slave trade) in Fiji&#8230;</em></p></blockquote><p></p><h4>South America</h4><pre><code><strong><code>Argentina:</code></strong><code> Fern&#225;ndez, Rodr&#237;guez, Gonz&#225;lez // 3.828%</code></code></pre><pre><code><strong><code>Brazil: </code></strong><code>Silva, Santos, Sousa // Silva 10.5%, total at 22.2%</code></code></pre><pre><code><strong><code>Chile: </code></strong><code>Gonz&#225;lez, Mu&#241;oz, Rojas // 11%</code></code></pre><pre><code><strong><code>Paraguay:</code></strong><code> Gonz&#225;lez, Ben&#237;tez, Mart&#237;nez // 15.64%</code></code></pre><blockquote><p><em>8 of the top 11 surnames end with &#8216;ez&#8217;, the distinctive suffix of Castilian family names. The suffix means &#8216;son of&#8217;. This is similar to the suffix &#8216;son&#8217; in&nbsp;English and to &#8216;ic&#8217; or &#8216;ich&#8217; of&nbsp;Slavic&nbsp;names .</em></p></blockquote><pre><code><strong><code>Peru:</code></strong><code> Quispe, Flores, S&#225;nchez // 6.35%</code></code></pre><p>Yes, I know, I&#8217;ve missed a lot of countries, but 24 should be comprehensive enough. :-)</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Bypassing Robinhood's Flagging System]]></title><description><![CDATA[Placing API Option Orders via Gaussian Distribution]]></description><link>https://blog.virenmohindra.me/p/bypassing-robinhoods-flagging-system</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/bypassing-robinhoods-flagging-system</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Thu, 12 Nov 2020 06:10:22 GMT</pubDate><enclosure url="https://cdn.substack.com/image/fetch/h_600,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>3-min read</em></p><p><em>I thought a good weekend project would be to play with Robinhood&#8217;s unofficial API and zero commissions and see if it would be possible to create a profitable algo strategy. What followed was a USD$1000 deposit, a potentially restricted account, and a passive-aggressive email from Management. Here, I write about alternative brokers and how I&#8217;m planning on bypassing these restrictions. If you&#8217;re only looking for the code head straight down to the last section.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!85Fv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!85Fv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 424w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 848w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 1272w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!85Fv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png" width="300" height="533.3333333333334" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/ccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:432,&quot;resizeWidth&quot;:300,&quot;bytes&quot;:135514,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!85Fv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 424w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 848w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 1272w, https://substackcdn.com/image/fetch/$s_!85Fv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Fccf0fa85-a753-4400-ab33-58ca64e6902a_432x768.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>My trading activities (Android) are divorced from my daily driver (iPhone) to keep my sanity in check.</em></figcaption></figure></div><h1>Caught with your Hand in the Cookie Jar</h1><p>I know, I should have flown under the radar, been more diligent. I was! At least with the headers I sent across with each request (<code>User-Agent</code>/ <code>Referrer</code>, etc). But to be completely honest I&#8217;m sure the folks at the Robinhood headquarters have more sophisticated ways of flagging an account, whether that is through unique timing characteristics and order of operations which can be used to fingerprint the app to detect direct access. It is a very common machine learning application to detect bot automation; tech is available right off the shelf. Given their <a href="https://www.cnbc.com/2019/11/05/some-robinhood-users-were-able-to-trade-with-unlimited-borrowed-money.html">track record</a>, I&#8217;m not surprised that they&#8217;re terrified of people using the API directly &#8212; it likely exposes them to more risk from their own corner-cutting.</p><p>I&#8217;ve read that the email I received isn&#8217;t uncommon. Adding a 5-second delay between orders seemingly isn&#8217;t enough and my account was inadvertently flagged by customer support. If you continue to use RH you need to submit requests as a regular user would, not ~390 a day (to stay under the professional trader limit).</p><blockquote><p><em>The number is interesting because the exchange is only open for 6.5 hrs/ day (exactly 390 minutes). It seems like the limit is designed to keep trades to about one per minute.</em></p></blockquote><p>To combat these restrictions, I export and count all of my trades. Once I have hit my monthly cap, my program doesn&#8217;t run until the following month. Anyway, I&#8217;m digressing. Now one might say, &#8216;why don&#8217;t you use an actual brokerage that supports algorithmic trading?&#8217;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ni19!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ni19!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ni19!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ni19!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ni19!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ni19!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg" width="596" height="405" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/fcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:405,&quot;width&quot;:596,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:68846,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ni19!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ni19!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ni19!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ni19!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2Ffcd4c917-efb4-4724-9fec-aca120d92a65_596x405.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>Meaningless Metrics, Countless Choices</h1><p>The problem is my strategy only applies when I&#8217;m trading options with <strong>zero</strong> commission. Some people might say if my strat breaks with this initial upfront cost, then it <strong>sucks</strong>. Whatever, it&#8217;s low risk and works for me. Let&#8217;s look at what the free market has to offer:</p><ol><li><p><a href="https://www.tdameritrade.com/api.page">TD Ameritrade</a> &#8212; USD $0.65/ contract</p><p><em>Some back of the envelope calculations &#8212; with a lower limit of ~200 trades/ day, and a $1.30 round-trip, TD will cost me $4,000 a month.</em></p></li><li><p><a href="https://www.interactivebrokers.com/en/index.php?f=5041">Interactive Brokers</a> won&#8217;t scam me on the spread like Robinhood, provides better support, and much better order execution/ fill. Take advantage of the tiered option pricing structure &#8212; if deposit a significant amount or have good liquidity or execute enough trades, you might be able to swing some rebates your way.</p><p><em>Will unlock wider delta spreads and probably have more of an upside meaning more $$$ but IB is my main and Robinhood is my play account. Don&#8217;t mix business with pleasure. </em></p></li><li><p>But <a href="https://brokerage.tradier.com/pricing">Tradier</a> does free options for $30/ month?! </p><p><em>Last I checked, they don&#8217;t actually support OTO/OCO/OTOCO orders, even though it&#8217;s mentioned in the documentation. The API also has a few rough edges, which breeds mistrust, but in my short experimenting stint, I haven&#8217;t had any notable trading failures. I did have issues with their historical options price data but didn&#8217;t bother digging deeper.</em></p></li><li><p><a href="https://alpaca.markets/">Alpaca</a>, as often mentioned, is great &#8212; but no options yet.</p><p><em>It handy to have an Alpaca account for their free Polygon.io API key. Both Alpaca and Tradier have a decent data API/ streamer too, although it&#8217;s not IQFeed, etc.</em></p></li><li><p>Maybe stick to <a href="https://robinhood.com/us/en/">Robinhood</a>, and use an automation macro on their website. You won't have to roll the dice in regards to getting banned.</p><p><em>Unfortunately, the website can get really delayed sometimes, so doing it through the API seemed more reliable. Worth looking at it if I can&#8217;t get around the aforementioned triggers the signals the tech boys in Menlo Park are looking for.</em></p></li></ol><p>Maybe I&#8217;m looking at this the wrong way. I went back to the email and dug deeper.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NUB9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NUB9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 424w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 848w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 1272w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NUB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png" width="420" height="420" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:420,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:232631,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NUB9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 424w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 848w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 1272w, https://substackcdn.com/image/fetch/$s_!NUB9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1b2887d1-bb4b-4f6e-a735-d1241fa1c20a_420x420.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I guess I&#8217;ll stick with the latter.</p><h1>The Meat</h1><p>A fixed interval would be easy to detect on any brokerage&#8217;s API endpoints. Whenever I&#8217;m worried about the timing of requests I end up generating a bimodal Gaussian distribution. Maybe Poisson is better, but this is simple and gets the job done.</p><p>The words and math make it sound complicated but all you really need to use is pythons <code>random</code> package and tune it to make it look somewhat real:</p><pre><code><code>from random import gauss, random
from time import sleep
s = random()
if s &lt; 0.3:
  t = gauss(10, 2)
else:
  t = gauss(30, 5)
t = max(min(t,120), 5)
sleep(t)</code></code></pre><p>You can get crazier than this and sample from multiple distributions or look into research on user behavior to try and best mimic a user. I knew a guy who wrote his own mouse driver with laplacian curves to mimic a user and avoid detection.</p><p>I&#8217;m not that particularly invested so I&#8217;ll stick to randomness.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Interacting with Cores As A Developer]]></title><description><![CDATA[The macOS SDK exposes a processor affinity API that you can program against.]]></description><link>https://blog.virenmohindra.me/p/interacting-with-cores-as-a-developer</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/interacting-with-cores-as-a-developer</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Wed, 11 Nov 2020 01:49:10 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HVjP!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F8935defa-4d02-402b-879e-d7f8b6ed5e10_76x76.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The macOS SDK exposes a <a href="https://developer.apple.com/library/archive/releasenotes/Performance/RN-AffinityAPI/#//apple_ref/doc/uid/TP40006635-CH1-DontLinkElementID_2">processor affinity API</a> that you can program against. With ARM you can also selectively turn on and off cores. For example, when traveling with the work Linux laptop I turn the big cores off to drastically improve battery life. And this can be done at runtime not just at boot.</p><p>To offline a core:</p><pre><code>echo 0 &gt; /sys/devices/system/cpu/cpuN/online</code></pre><p>To online a core:</p><pre><code>echo 1 &gt; /sys/devices/system/cpu/cpuN/online</code></pre><p><em>Where cpuN is 0-4.</em></p><p></p><p>Keep in mind there's always one core you cannot disable to process interrupts.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Always Be Closing]]></title><description><![CDATA[How to Write an Email to a prospective client]]></description><link>https://blog.virenmohindra.me/p/always-be-closing</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/always-be-closing</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Tue, 27 Oct 2020 12:29:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1XEP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>9-min read</em></p><p><em>I&#8217;ve built websites for over seven years, and over the course of that time, I&#8217;ve learned what not to say during an engagement. Below is some advice on how to handle clients and manage expectations (without overpromising and underdelivering) &#8212; via email.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1XEP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1XEP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1XEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3638954,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1XEP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1XEP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F3d668850-e75c-4e4a-9255-1bac64052991_5184x3888.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by Brett Jordan</em></figcaption></figure></div><p>This my magnum opus. My <em>closing emails</em>. They address all the concerns a potential client might have and answer their questions <strong>after</strong> you&#8217;ve sent over the contract. </p><p>I&#8217;d like to address a few disclaimers before we get to the body of the email:</p><ul><li><p>This email works only when you&#8217;re already in the door and the client is experiencing some form of apprehensiveness. One might expect this after you&#8217;ve sent over the <a href="https://www.investopedia.com/terms/r/request-for-proposal.asp#:~:text=A%20request%20for%20proposal%20(RFP)%20is%20a%20business%20document%20that,will%20help%20complete%20the%20project.">RFP</a>, or have met the prospective for a coffee chat and are moving towards drawing up the <a href="https://en.wikipedia.org/wiki/Product_requirements_document">PRD</a>. Please don&#8217;t send this before you&#8217;ve at least had a conversation.</p></li><li><p>In this particular case, my client had sent a 14-pointer list of questions. I thought it would be best to walk her through my vision. Most of the time, shorter is better, but when you&#8217;re at the finish line I prefer to hit the nail on the head.</p></li><li><p>Judge the importance of your email based on the value of the project: I don&#8217;t write 1100+ word emails for smaller contracts.</p></li><li><p>You should also probably take my advice with a grain of salt. Most of my clients are word-of-mouth which gives me a great amount of leverage during negotiations.</p></li></ul><p>Now the email:</p><div><hr></div><pre><code>Hello!</code></pre><p>Always casual.</p><pre><code>I understand this is your first technical project, and as I mentioned before I&#8217;d like to be completely transparent so we&#8217;re both on the same page regarding expectations and deliverables.</code></pre><p>Assuage concerns and assure them this Agreement is mutually beneficial. This is especially important with non-technical clients &#8212; there isn&#8217;t any point in explaining the specifics &#8212; they rather prefer a simple yes or no. Technicals can be defined in the contract which for the most part will be skimmed over and is boilerplate anyway. The last sentence is the most important &#8212; I never overpromise even when you&#8217;re looking to close. There is no point in the biting hand that feeds, and the easiest way you can achieve this is by acting like something is accomplishable in the defined timeframe. Rushing to receive remittance always looks cheap.</p><pre><code>I can be pretty flexible in regards to changes, provided they occur within the timeframe and are reasonably within the scope of the contract.</code></pre><p>The client&#8217;s main concern was scope creep and how the project might evolve over time. I&#8217;ve worked on both sides of the tracks, and this is an inevitability in software development contracts. The Developer has to understand that some stuff sticks and some don&#8217;t, but on the other hand, the Client needs to understand limitations. I prefer to keep it flexible to appease clients, but still draw hard lines on new features.</p><pre><code>The reason I recommended a per-project contractual agreement in this scenario was that all the materials and assets haven&#8217;t been completely fleshed out yet and I know there might be a lot of back and forth from both sides.

If you prefer to switch to an hourly rate, I can provide you a breakdown of the number of hours this project might take. To be completely honest I haven&#8217;t looked into this yet, I merely went off the deadline you provided and how long each feature might take to develop (in terms of days). I&#8217;m estimating around 200-300 hours of work. The hours required for development will not include the administrative work, sprints reviews, back and forth open communication channels that I&#8217;ve set up and most importantly the revisions and scope creep which might occur. If we go down the hourly rate I have a number of tools at my disposal that can log my hours and track productivity!</code></pre><p>Hourly or Project-Based? The age-old question. There are positives and negatives to both sides to the argument, some developers love the idea of getting paid hourly but detest being logged and tracked. Project-based Agreements allow for some sort of financial security (based on the milestones set). I know many projects which fell through after committing 60 hours when the contract stated a minimum of 200.</p><p>To see the benefits of a client, swap the roles. Hourly rates include administrative work, weekly sprints, calls, which bump up the bottom line. If you&#8217;re sure about the project and know exactly what you want, hourly might work better. Otherwise, try and stick with the latter.</p><p>As a person engaging a client, one should be flexible and let the client choose.</p><pre><code>From our previous conversations, to reiterate (and to answer your questions in chronological order):

1. I&#8217;ve replaced the company with your name and attached the revised contract below.</code></pre><p>Versioning with contracts. Email attachments suffice but I have a folder of every client I&#8217;ve ever engaged with, whether completed, in progress, or failed, with files named as</p><pre><code>[CLIENT_CODE_NAME or FILE_CONTENT]_[DATE]_[INCR_VERSION_NUMBER]</code></pre><p>Something like this &#8212;</p><pre><code>Contract_v1_Oct_19.pdf</code></pre><p>I keep the editable copies for easier revisioning. Fortunately, I have a script that accepts client name, date, project cost and spits out a template filled with the relevant details so I don&#8217;t have to go around &#8984;+F and replacing everything. Also, DocuSign.</p><pre><code>2. You might re-engage me for more work, but the Support Period shall refer to any bugs or issues relating to the featured defined in the PRD and does not include any new feature development. Any updates, changes, and new features not defined in the contract will be charged on a USD$50/ hour basis. We can also look into drawing up a new contract at the end of this agreement.</code></pre><p>My contract is ironclad. The most recent iteration is actually more in favor of Client than Developer. Again, I prefer it this way to see I&#8217;m not looking to make a quick buck but instead guide them to the promised land of sexy application development :)</p><p>But also I don&#8217;t mess around with freebies. It protects me and my contractors from being unfairly utilized even after the project is complete. The shining light of overpromising here might appeal to some, but it&#8217;s better to set expectations.</p><pre><code>3. Answered above. Everything is included in the per-project contract and is all-inclusive up till the end of the agreement, there is no overcharge fee. If we switch to the hourly rate I&#8217;ve also provided the hourly rates above, but there still won&#8217;t be any extra fees you&#8217;ll need to worry about, only up to the hours logged and tracked.</code></pre><p>Self-explanatory. I don&#8217;t charge extra (no overcharge fees). I actually wouldn&#8217;t even know how that would work if we have an end date for the contract.</p><pre><code>4. It might not have been spelled out in the contract but I work keeping Agile methodology in mind. There will be continuous testing throughout the project and I&#8217;ll provide you with weekly updates along with progress over call, all while being fully transparent. If you&#8217;d like me to create weekly breakdown documentation on the progress I&#8217;d prefer to switch to an hourly contract.</code></pre><p>Communication is key. But also display how all of this extra work (read: non-development hassle) can be detrimental to the progress of the project and will be subject to fees if you end up going the hourly route.</p><pre><code>5. I&#8217;ll be testing on a physical device from the start &#8212; I actually prefer it compared to an emulator or virtual device. As for when you can test a working build on your own phone that should be after a month or so &#8212; you&#8217;ll be clued in on the progress.</code></pre><p>Clients love instant gratification. They&#8217;d like to see the project as soon as possible, even if there&#8217;s barely any architecture set up. This sets them up for disappointment. Be colloquial when addressing their concern to always be clued in but also provide a date so they&#8217;re not left in the dark.</p><pre><code>6. I created the skeleton PRD after our conversations and looking through our previous emails. I&#8217;ve made notes on features you mentioned that aren&#8217;t required at this current MVP stage:

[REDACTED] - If I remember correctly, we agreed on this being a clickable tile which opened a pop-up that intimated to users that a [REDACTED] feature would be coming soon. From our previous email correspondence on [REDACTED]:</code></pre><blockquote><pre><code>4. Dashboard: If I recall correctly the lookbook was not part of the MVP? I recommend not having a flow to review at a later time since it will add unnecessary complications. This means user settings and displaying information to the user and making it editable which would make this a fully-fleshed out application. If this is important we can expand the scope.</code></pre></blockquote><p>I always take notes during calls no matter how insignificant. But I rarely do this when meeting in person &#8212; I prefer to be completely engaged and let the person know I&#8217;m focused. Notes help me form the basic structure of the contract and in turn a point in time which I can revisit (for negotiations).</p><pre><code>If this is something which is essential, I can jump on a call with you today to really flesh this out completely so I know what you want. Still slightly unclear on [REDACTED].</code></pre><p>Clearly draw a line. Redraw the contract and expand the scope if new features are added while also bumping project costs. This sort of professionalism garners respect (if at least not from a Client&#8217;s side some sort of self-respect). Phone calls are great, they provide a much-needed break from electronic mail and the feedback loop shortens.</p><pre><code>[REDACTED] - Users will definitely be able to see [REDACTED] &#8212; otherwise, the feature wouldn&#8217;t work! I apologize &#8212; I should have been clearer. I can add [REDACTED] that provide feedback on whether the user [REDACTED] but we&#8217;re bordering on full [REDACTED] functionality now. We should try and stick to PRD.</code></pre><p>As a Developer, one might forget that some technical specifications need to be spelled out. Apologize often, it really doesn&#8217;t take much. And if the Client is asking to flesh out a feature point to the product requirements document to cover your bases.</p><pre><code>Regarding the PRD &#8212; once we have defined the goals and milestones &#8212; if I cross the deadline without completing the entire application to your satisfaction the additional time it&#8217;ll take to complete the project will be at no cost to you. This is usually how I work and I like to see a project through till the end.</code></pre><p>Self-explanatory. I prefer to end contracts on a good note.</p><pre><code>7. I have many recommendations, we can sit down/ jump on a call and discuss how it might look on your end. I&#8217;ve built [REDACTED] before so this is trivial, the [REDACTED] connection is the only cumbersome aspect.</code></pre><p>The Client was unsure of a particular section of the application and didn&#8217;t have the mockups. I find it easier to provide examples from websites or screenshots of live applications and letting them point at features they would like to implement. At the end of the day they&#8217;re Users too, and they might know what <em>OnboardingSection</em> entails.</p><pre><code>8. Answered above. Any reasonable changes can be included in the project requirements but overarching changes to the structures  If you think the project might evolve more during developed (even more than the defined PRD) we can switch to an hourly contract.</code></pre><p>Bridging the gap once again.</p><pre><code>9. You will have complete access, you own the entire codebase from the start! Yes, to all the above &#8212; the code will be maintained professionally and fully commented on.</code></pre><p>Self-explanatory.</p><pre><code>10. Any major iOS version changes during the contract period will be fully supported. I can also support 2 major versions down for compatibility &#8212; but I do recommend sticking to the latest for security.</code></pre><p>So iOS versions rarely change over a three-month period and occur once a year. But also there is no point in me explaining this to the Client so I instead go the path less traveled and confirm her hypothesis.</p><pre><code>11. Yes, that is correct.</code></pre><p>A simple yes or no always works. No explanation warranted, and if needed can be addressed over a phone call instead.</p><pre><code>12. The project end date will be 3 months from the date of signing the contract.</code></pre><p>Clarity.</p><pre><code>13. I understand your apprehensiveness but this is usually how I work. I&#8217;m willing to work out a payment plan for the remaining milestones but the first remittance is 50%.</code></pre><p>I always work on a 50% upfront payment &#8212; it guarantees commitment from both sides and helps me commit completely to a project. It might be on the higher side for some developers but I&#8217;ve never once had a problem with this proposal.</p><pre><code>14. If we want to hit the [REDACTED] deadline I recommend we wrap up the administrative work by the end of this week. A project of this complexity requires 3 months at the very minimum. Fortunately, it&#8217;ll take two weeks to set up the scaffolding and basic structure of the application and your input will be minimal. I&#8217;ll still update you on progress but I&#8217;ll really only need some assistance and hand-holding when we get to the content stage. Your UI designs provide a good starting point and we don&#8217;t have to iterate on the vision which saves a lot of time. Once I receive the first payment I&#8217;ll be locked in with you for the next three months and will be able to guide you better.</code></pre><p>The Client wanted a few weeks to prepare the assets for the project. I explained why that wasn&#8217;t necessary and in fact detrimental to the project timeline itself.</p><pre><code>As always, if you have any questions please feel free to shoot an email or a message over on WhatsApp &#8212; I reply much quicker!

Thank you,
Viren Mohindra</code></pre><p>I prefer to keep open communication channels with all clients.</p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[How to rig an election]]></title><description><![CDATA[Primaries huh]]></description><link>https://blog.virenmohindra.me/p/how-to-rig-an-election</link><guid isPermaLink="false">https://blog.virenmohindra.me/p/how-to-rig-an-election</guid><dc:creator><![CDATA[Viren Mohindra]]></dc:creator><pubDate>Fri, 04 Sep 2020 17:06:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!RxCx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>2-min read</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RxCx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RxCx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RxCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:248125,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RxCx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RxCx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F72fac625-0a7f-4cb6-a969-79732318f2c1_3000x2000.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>Photo by Morning Brew</em></figcaption></figure></div><p>With elections around the corner, I thought it would be a good idea to write about a hypothetical story that occurred two years ago, and explain how easy it is to bump up voter count on online survey platforms.</p><p>Burning the midnight oil, I was on a Discord call with a few friends. Student elections were around the corner and votes were lagging for the friend who was contesting. The SurveyMonkey was linked on the channel and some non-technical friends started spamming the votes for our friend&#8217;s favor. With absolutely no verification (whether this was in the form of student email verification or CAPTCHA&#8217;s), a programmer mentioned off-hand it was trivial to write a script to turn the tables.</p><blockquote><p><em>Selenium simulates and automates user interactions with websites. Used for unit tests, my experience with this software is to write one-off scripts to either scrape information from websites for local analysis or run regression test suites on some of my hosted applications whenever I commit or make any new changes.</em></p></blockquote><p>In a few minutes, a script was posted in chat which leveraged Selenium to automate the voting. One interesting takeaway was that SurveyMonkey rotated options around to prevent bots from targeting specific values. One could potentially circumvent this by targeting text on the screen (instead of <code>className, id, or name</code>):</p><pre><code><code>driver.find_element_by_xpath('//label/span[contains(text(), 'TARGET_TEXT')]/ancestor::label')</code></code></pre><p><em>You can find the complete python code <a href="https://gist.github.com/VirenMohindra/77b6b51b10ebe0ca207a7f0752ef7266">here</a></em></p><p>The script was hitting 100+ votes a minute. But the programmer realized the admin dashboard on the survey website might track and log IP addresses and they would have to rotate connections after every successful vote to hide their identity. With their VPN client, they wrote another script with a configuration file to handle this restriction, checking for server availability and performance on the fly to increase reliability and not leave their actual address exposed.</p><p>Wit this roadblock, one successful vote meant closing your previous connection, waiting for it to resolve the next IP address, and then execute, which slowed down the script to a vote every 10 seconds. Completely unreasonable cycle times. Spinning up multiple instances of the script and hosting it on multiple servers was the next best alternative option.</p><p>In a few hours, the final log showed more than 1000 votes submitted in the primary runner&#8217;s favor. Only a few hundred people were allowed to vote. The student election locked voting and launched an investigation. Nothing ever surfaced, because, in random intervals, the script also voted for other candidates. The only egregious mistake the programmer made was they ran it for too long and didn&#8217;t impose a hard limit.</p><div><hr></div>]]></content:encoded></item></channel></rss>