<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Jonathan Almeida</title>
    <subtitle>Scribblings and nonsense</subtitle>
    <link rel="self" type="application/atom+xml" href="https://jonalmeida.com/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://jonalmeida.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-08T00:00:00+00:00</updated>
    <id>https://jonalmeida.com/atom.xml</id>
    <entry xml:lang="en">
        <title>5x400s</title>
        <published>2026-06-08T00:00:00+00:00</published>
        <updated>2026-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-06-08-2/"/>
        <id>https://jonalmeida.com/runs/run-2026-06-08-2/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-06-08-2/">&lt;p&gt;As fit as a cow.&lt;&#x2F;p&gt;
&lt;p&gt;Third rep had a stitch that I could only walk off; came back during the fourth. Finished with a little pride on the final fifth.&lt;&#x2F;p&gt;
&lt;p&gt;Need better hydration. Didn&#x27;t eat well today to cover this effort, but it&#x27;s a good measure of where I am.&lt;&#x2F;p&gt;
&lt;p&gt;Body aches from some HITT weekend house cleaning.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;4.02 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;23:25&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:49 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;13 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [6.8, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 27.2, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 31.9, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 3.9, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 30.3]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-06-08T00:00:00+00:00</published>
        <updated>2026-06-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-06-08/"/>
        <id>https://jonalmeida.com/runs/run-2026-06-08/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-06-08/">&lt;p&gt;Warm-up prior to intervals.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;1.27 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;7:50&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;6:10 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;11 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 9.4, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 11.4, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 79.2]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-06-01T00:00:00+00:00</published>
        <updated>2026-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-06-01/"/>
        <id>https://jonalmeida.com/runs/run-2026-06-01/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-06-01/">&lt;p&gt;Encountered a very loud dog that looked like it was going to attack me while the leash was a bit too slack, and I had to jump onto the road. Shouty driver was shouty before he realized my predicament. Took a bit to get back into the run and relax. 🤷‍♂️&lt;&#x2F;p&gt;
&lt;p&gt;Good weather, but didn&#x27;t stretch. Right leg was hyper extending because the back of the knee was paining a bit - nothing new that I haven&#x27;t experienced before.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;7.49 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;40:02&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:21 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;50 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 3.6, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 29.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 17.4, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 49.9]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-05-31T00:00:00+00:00</published>
        <updated>2026-05-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-31/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-31/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-31/">&lt;p&gt;Felt very unfit despite a looong warmup and stretch. Need to make that training plan and build up fatigue in the legs again.&lt;&#x2F;p&gt;
&lt;p&gt;Ice cream for a job well done at the end.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;7.82 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;43:02&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:30 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;56 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 8.8, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 18.1, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 73.2]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Fun Running</title>
        <published>2026-05-25T00:00:00+00:00</published>
        <updated>2026-05-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-25/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-25/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-25/">&lt;p&gt;Went harder for fun, I guess. Didn&#x27;t feel like it, but wanted to see what was in the engine.&lt;&#x2F;p&gt;
&lt;p&gt;Shoes were tightened a bit much and the t-shirt I wore isn&#x27;t as breathable.&lt;&#x2F;p&gt;
&lt;p&gt;Felt good, all things considered.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;5.01 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;26:23&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:16 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;40 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 8.8, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 74.6, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 4.2, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 12.4]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Auto-resolve Jujutsu conflicts with your AI agent</title>
        <published>2026-05-25T00:00:00+00:00</published>
        <updated>2026-05-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/auto-resolve-conflicts-with-an-agent/"/>
        <id>https://jonalmeida.com/til/auto-resolve-conflicts-with-an-agent/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/auto-resolve-conflicts-with-an-agent/">&lt;p&gt;With Jujutsu, I&#x27;ve been able to work in multiple workstreams more efficiently than before. This means that if I&#x27;m working on multiple things, there is a higher likelihood of something going stale while I wait for a review or touch multiple files.
Dealing with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jonalmeida.com&#x2F;til&#x2F;android-studio-jj-conflicts&#x2F;&quot;&gt;conflicts aren&#x27;t so bad these days&lt;&#x2F;a&gt;, however if I can automate the easy ones, why not?&lt;&#x2F;p&gt;
&lt;p&gt;This is the prompt I&#x27;ve been using with my agent whenever I have a list of changes that have conflicts and don&#x27;t need me to participate actively on it.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Using the jj version control system, fix the conflicts that are in the changesets from `&amp;lt;start_rev&amp;gt;` to `&amp;lt;end_rev&amp;gt;`. Keep trying until there are no more &amp;quot;(conflict)&amp;quot; in the changesets between those two IDs.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-05-17T00:00:00+00:00</published>
        <updated>2026-05-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-17/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-17/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-17/">&lt;p&gt;So many excuses to use!&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Muscle pain from bowling (with style) during the week. Used the massage gun to get a warmup started, but it&#x27;s still a bit touchy.&lt;&#x2F;li&gt;
&lt;li&gt;Poor sleep from growing heat overnight.&lt;&#x2F;li&gt;
&lt;li&gt;Stupidly hot outside right now with a heatwave in-progress.&lt;&#x2F;li&gt;
&lt;li&gt;Made a few wrong turns trying to find the most shaded route.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I miss the cold already.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;&amp;#x2F;runs&amp;#x2F;2026-05-17_1.jpg&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
      width=480
    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;br&gt;

&lt;div&gt;
  &lt;img
    src=&quot;&amp;#x2F;runs&amp;#x2F;2026-05-17_2.jpg&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
      width=480
    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;br&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;3.47 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;21:00&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;6:03 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;17 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 24.3, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 22.7, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 53.0]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Sporting Life 10K 2026</title>
        <published>2026-05-10T00:00:00+00:00</published>
        <updated>2026-05-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-10/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-10/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-10/">&lt;p&gt;Better route, colder day, worse roads.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;10.14 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;1:33:42&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;9:14 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;43 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.9, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 5.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 94.1]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>jj presentation - cheat sheet</title>
        <published>2026-05-08T00:00:00+00:00</published>
        <updated>2026-05-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/2026-05-08-jujutsu-for-git-users/demo-presenter-notes/"/>
        <id>https://jonalmeida.com/blog/2026-05-08-jujutsu-for-git-users/demo-presenter-notes/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/2026-05-08-jujutsu-for-git-users/demo-presenter-notes/">&lt;h1 id=&quot;jj-presentation-cheat-sheet&quot;&gt;jj presentation - cheat sheet&lt;&#x2F;h1&gt;
&lt;p&gt;A throwaway Calculator app in &lt;code&gt;mobile&#x2F;android&#x2F;fenix&#x2F;...&#x2F;calculator&#x2F;&lt;&#x2F;code&gt; provides the demo material. Re-run between demos to reset:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;bash artifacts&#x2F;jj-demo-setup.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;the-starting-stack&quot;&gt;The starting stack&lt;&#x2F;h2&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@  wip small fixes (absorb me)    ← uncommitted: two 1-line fixes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;○  E: Add equals and clear logic&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;○  D: Add operator buttons and tighten outer padding   ← split target&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;○  C: Add digit buttons                                ← absorb target #2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;○  B: Add CalculatorViewModel with display state       ← absorb target #1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;○  A: Add CalculatorScreen scaffold&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;◆  main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The wip change contains two unrelated 1-line edits:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CalculatorViewModel.kt&lt;&#x2F;code&gt;: &lt;code&gt;MutableStateFlow(&quot;&quot;)&lt;&#x2F;code&gt; → &lt;code&gt;MutableStateFlow(&quot;0&quot;)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;CalculatorScreen.kt&lt;&#x2F;code&gt;: &lt;code&gt;Arrangement.spacedBy(4.dp)&lt;&#x2F;code&gt; → &lt;code&gt;8.dp&lt;&#x2F;code&gt; in &lt;code&gt;DigitRow&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Each line was last touched in a different commit, so absorb can route them.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;demo-1-jj-split&quot;&gt;Demo 1 - &lt;code&gt;jj split&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Commit D bundles two unrelated changes: an operator-row feature (across both .kt files) and a one-line outer-padding tweak. Split them apart.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj edit  &amp;lt;D&amp;#39;s change id&amp;gt;     # or: jj edit @--   if wip is on top of E&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj split&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The diff editor opens with all of D&#x27;s hunks. Keep just the operator-row hunks in the first commit, leave the padding tweak for the second. Save -&amp;gt; two commits. Re-describe the second:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj describe -m &amp;quot;DEMO: Tighten outer padding&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;jj log -r main..&lt;&#x2F;code&gt; shows D replaced by two narrowly-scoped commits.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demo-2-jj-absorb&quot;&gt;Demo 2 - &lt;code&gt;jj absorb&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Back to top of stack, with the wip fixes uncommitted:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj edit @         # if you&amp;#39;re not already there&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj diff           # show the two tiny hunks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj absorb&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Output:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Absorbed changes into 2 revisions:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;C&amp;gt;  DEMO: Add digit buttons&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;B&amp;gt;  DEMO: Add CalculatorViewModel with display state&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;jj log&lt;&#x2F;code&gt; to show the wip change is gone, its hunks now live in B and C where they belong. No interactive picking, no commit reordering.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demo-3-jj-rebase&quot;&gt;Demo 3 - &lt;code&gt;jj rebase&lt;&#x2F;code&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Show the &quot;pull a commit out of the middle of the stack&quot; superpower. Without conflicts first, move D after E:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj rebase -r &amp;lt;D&amp;gt; --insert-after &amp;lt;E&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;D pops up to the top of the stack, E sinks below it, descendants auto-rebase. No conflict because D and E touch disjoint lines.&lt;&#x2F;p&gt;
&lt;p&gt;(Reset before the next demo if you want a clean log.)&lt;&#x2F;p&gt;
&lt;h2 id=&quot;demo-4-conflicts-via-rebase&quot;&gt;Demo 4 - Conflicts via rebase&lt;&#x2F;h2&gt;
&lt;p&gt;Try the rebase that &lt;em&gt;can&#x27;t&lt;&#x2F;em&gt; clean up automatically: move E (which adds
&lt;code&gt;OperatorRow(...)&lt;&#x2F;code&gt;-adjacent equals&#x2F;clear UI) to before C (which adds the
digit buttons that E&#x27;s diff context relies on).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj rebase -r &amp;lt;E&amp;gt; --insert-before &amp;lt;C&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;jj reports:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;New conflicts appeared in 2 commits:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;C&amp;gt; (conflict) DEMO: Add digit buttons&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;lt;E&amp;gt; (conflict) DEMO: Add equals and clear logic&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;jj log&lt;&#x2F;code&gt; shows the two affected commits marked &lt;code&gt;×&lt;&#x2F;code&gt;. The stack stays in place - this is the killer property: &lt;strong&gt;conflicts are first-class state, not a mode you have to escape from&lt;&#x2F;strong&gt;. You can keep working, look at sibling commits, run &lt;code&gt;jj diff&lt;&#x2F;code&gt;, etc.&lt;&#x2F;p&gt;
&lt;p&gt;To resolve:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj new &amp;lt;E&amp;gt;                 # step onto a child of the first conflicted commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj resolve --list          # see the conflicted paths&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;jj resolve                 # opens the configured merge tool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                           # or edit conflict markers in place, then `jj squash`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After resolving E, the second conflict (in C) often resolves automatically
because jj re-propagates the resolution down the stack.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;useful-surrounding-commands&quot;&gt;Useful surrounding commands&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jj log -r &#x27;main..@&#x27;&lt;&#x2F;code&gt; - just the demo stack&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;jj op log&lt;&#x2F;code&gt; - every operation you&#x27;ve run; &lt;code&gt;jj op restore &amp;lt;id&amp;gt;&lt;&#x2F;code&gt; to undo anything&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;jj diff -r &amp;lt;change&amp;gt;&lt;&#x2F;code&gt; - show one commit&#x27;s diff&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;jj evolog -r &amp;lt;change&amp;gt;&lt;&#x2F;code&gt; - history of one logical change as you&#x27;ve reshaped it&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Jujutsu for git users (WIP)</title>
        <published>2026-05-08T00:00:00+00:00</published>
        <updated>2026-05-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/jujutsu-for-git-users/"/>
        <id>https://jonalmeida.com/blog/jujutsu-for-git-users/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/jujutsu-for-git-users/">&lt;h2 id=&quot;basics&quot;&gt;Basics&lt;&#x2F;h2&gt;
&lt;p&gt;You can use &lt;code&gt;jj&lt;&#x2F;code&gt; with any git repository that you have - it&#x27;s optional to use. So if you start using &lt;code&gt;jj&lt;&#x2F;code&gt; but don&#x27;t like it, you can go back to using &lt;code&gt;git&lt;&#x2F;code&gt; commands without a problem.&lt;&#x2F;p&gt;
&lt;p&gt;We can start off with&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;@&lt;&#x2F;code&gt; sign tells you where you currently are - it&#x27;s your working copy.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;new&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;In Jujutsu, you have an empty new working commit with &lt;code&gt;jj new&lt;&#x2F;code&gt; you never have an uncommitted set, you keep working on it until your next &lt;code&gt;new&lt;&#x2F;code&gt; or move to a different commit. In git, as you start working you are in a dirty&#x2F;uncommitted state, you finalize your set at the end.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;describe&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;Similar to git commit - except that you commit at the end. With describe, you can do it at anytime - while you&#x27;re planning out work, during some changes, or to finalize it. It&#x27;s a&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;edit&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;You can edit a previous item with work on top of it. It&#x27;s like an interactive rebase.&lt;&#x2F;li&gt;
&lt;li&gt;Git does not have that. You would need to make another branch and&#x2F;or cherry-pick some changes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;rebase&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;Rebases never fail - they are first class citizen to VCS.&lt;&#x2F;li&gt;
&lt;li&gt;You can get conflicts, but you aren&#x27;t required to fix it to move on.&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s fast - it applies all the rebased changes in-memory before it writes it to disk - this means that Android Studio doesn&#x27;t keep indexing while things are happening.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;op log&lt;&#x2F;code&gt;
&lt;ul&gt;
&lt;li&gt;Gives you a record of what you did. This is unlike the &lt;code&gt;git reflog&lt;&#x2F;code&gt;, where a rebase would show you twenty entries in there. You can restore to anywhere here.&lt;&#x2F;li&gt;
&lt;li&gt;Another way to use &lt;code&gt;undo&lt;&#x2F;code&gt; or &lt;code&gt;redo&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;advanced-or-mozilla-central-workflows&quot;&gt;Advanced or mozilla-central workflows&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;absorb&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Handling conflicts.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;split&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;No branches.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;moz-phab patch&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;workspaces&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-05-06T00:00:00+00:00</published>
        <updated>2026-05-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-06/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-06/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-06/">&lt;p&gt;More of a fun run. Better than two days ago with the massage gun to help with the warmup.&lt;&#x2F;p&gt;
&lt;p&gt;Cooler weather and didn&#x27;t wait too late before I depleted my energy stores.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;7.62 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;40:56&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:22 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;50 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 15.8, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 29.4, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 54.8]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-05-04T00:00:00+00:00</published>
        <updated>2026-05-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-05-04/"/>
        <id>https://jonalmeida.com/runs/run-2026-05-04/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-05-04/">&lt;p&gt;Tired run. Toe is still prickly.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;5.55 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;30:02&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:25 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;41 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 28.1, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 20.1, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 51.8]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Base</title>
        <published>2026-04-30T00:00:00+00:00</published>
        <updated>2026-04-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-04-30/"/>
        <id>https://jonalmeida.com/runs/run-2026-04-30/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-04-30/">&lt;p&gt;Prickly without half a toenail. Kept it short as I&#x27;ve failed to be consistent again.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;5.48 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;30:01&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:29 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;37 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---
        
xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 34.1, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 28.7, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 37.2]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gmail filters based on X-Phabricator-Stamps header</title>
        <published>2026-04-23T00:00:00+00:00</published>
        <updated>2026-04-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/phabricator-label-filters/"/>
        <id>https://jonalmeida.com/til/phabricator-label-filters/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/phabricator-label-filters/">&lt;p&gt;I want Phabricator emails to have a Gmail label so I can know which patches had me as a reviewer that then had follow-up comments from other folks.&lt;&#x2F;p&gt;
&lt;p&gt;This is useful for me when I review a patch and then I need to respond back to discussions in a more timely manner in comment threads that I&#x27;ve created.&lt;&#x2F;p&gt;
&lt;p&gt;It&#x27;s difficult to do this today similar to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;blog.margaretleibovic.com&#x2F;post&#x2F;32008790345&#x2F;how-i-manage-my-bugmail-with-gmail&quot;&gt;Bugzilla Gmail filters&lt;&#x2F;a&gt; because there are fewer identifiers that the more simplistic Gmail filter parameters can help with.&lt;&#x2F;p&gt;
&lt;p&gt;Today I learnt that there is an &lt;code&gt;X-Phabricator-Stamps&lt;&#x2F;code&gt; header in those Phabricator emails that let&#x27;s you identify you as a the reviewer in a patch. So using that information, I wrote the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;script.google.com&#x2F;&quot;&gt;Google script&lt;&#x2F;a&gt; below to run every minute and avoid re-processing the same email twice.&lt;&#x2F;p&gt;
&lt;p&gt;A couple variables were added to the top and some console.logs are sprinkled around for my own debugging.&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Code&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; REVIEWER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jonalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; LABEL_NAME&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Phabricator&#x2F;Comments&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; BODY_MATCH&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;commented on this revision.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; SENDER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;phabricator@mozilla.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * Run once manually to install the per-minute trigger.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; install&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  uninstall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ScriptApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;newTrigger&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;processInbox&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;timeBased&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;everyMinutes&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;create&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * Run once manually to remove the trigger.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; uninstall&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ScriptApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getProjectTriggers&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;forEach&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ScriptApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;deleteTrigger&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;t&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  PropertiesService&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getScriptProperties&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;deleteProperty&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * Every run, we try to avoid processing the same email twice because&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * there is no API trigger to run a script on every new email received.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; processInbox&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; props&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; PropertiesService&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getScriptProperties&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; parseInt&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;props&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getProperty&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ||&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; now&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; Math&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;floor&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;Date&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;now&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1000&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; On first run, look back 2 minutes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ===&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; now&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 120&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; label&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; GmailApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getUserLabelByName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;LABEL_NAME&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;label&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    label&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; GmailApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;createLabel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;LABEL_NAME&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;last run: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; lastRun&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; threads&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; GmailApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;search&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;from:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; SENDER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; after:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; lastRun&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;threads to process: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; threads&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; threads&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span&gt; thread&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; threads&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;i&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    var&lt;&#x2F;span&gt;&lt;span&gt; messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; thread&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getMessages&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;messages to process: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span&gt; messages&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span&gt; j&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; j&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; messages&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; j&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;      if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hasReviewerStamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;messages&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;j&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        thread&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;addLabel&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;label&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;thread&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getFirstMessageSubject&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        break&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  props&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;setProperty&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lastRun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;now&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; hasReviewerStamp&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt;message&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; raw&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; message&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getRawContent&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; raw&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;match&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;X-Phabricator-Stamps:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;!&lt;&#x2F;span&gt;&lt;span&gt;match&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; stamps&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; match&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;trim&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;split&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  return&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;stamps&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;indexOf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;reviewer(@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; REVIEWER&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt; raw&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;indexOf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;BODY_MATCH&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;**&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * For debugging - see the list of labels you can search which&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; * differs from what is used in the Gmail UI filter.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; *&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; listAllLabels&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;All labels&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  var&lt;&#x2F;span&gt;&lt;span&gt; labels&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; GmailApp&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getUserLabels&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;var&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span&gt; labels&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;++&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    console&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;log&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;labels&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;i&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getName&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto Running</title>
        <published>2026-04-19T00:00:00+00:00</published>
        <updated>2026-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-04-19-2/"/>
        <id>https://jonalmeida.com/runs/run-2026-04-19-2/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-04-19-2/">&lt;p&gt;Arrived too late for the group run, and made my way to the bakery right after the bit of the trail I wanted to do.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;5.01 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;25:52&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:10 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;29 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 40.4, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 25.7, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 33.9]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto Running</title>
        <published>2026-04-19T00:00:00+00:00</published>
        <updated>2026-04-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-04-19/"/>
        <id>https://jonalmeida.com/runs/run-2026-04-19/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-04-19/">&lt;p&gt;Warm-up run without a stretch because I&#x27;m lazy today morning.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;2.5 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;12:22&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;4:57 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;19 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.4, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 49.3, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 25.7, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 24.6]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-04-18T00:00:00+00:00</published>
        <updated>2026-04-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-04-18/"/>
        <id>https://jonalmeida.com/runs/run-2026-04-18/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-04-18/">&lt;p&gt;Unfit and kept it short. Legs are fine, but my upper body is tight.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;3.81 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;20:00&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:15 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;35 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 1.4, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 34.3, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 18.9, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 45.4]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Use Android Studio for resolving conflicts in Jujutsu</title>
        <published>2026-03-25T00:00:00+00:00</published>
        <updated>2026-03-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/android-studio-jj-conflicts/"/>
        <id>https://jonalmeida.com/til/android-studio-jj-conflicts/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/android-studio-jj-conflicts/">&lt;p&gt;You can use JJ&#x27;s built-in editor for conflict resolutions, but I&#x27;ve found it difficult to follow. A recommendation from co-workers was to use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;meldmerge.org&#x2F;&quot;&gt;Meld&lt;&#x2F;a&gt; and that has worked quite well once I (begrudingly) accepted that I needed to download another single-purpose app.&lt;&#x2F;p&gt;
&lt;p&gt;Today, another co-worker &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;andreyzinovyev&quot;&gt;Andrey Zinovyev&lt;&#x2F;a&gt; found out that we can use Android Studio&#x27;s (IntelliJ IDEA&#x27;s really) built-in merge tool to resolve the three-way merge. This is more convenient for me since I spend most of my time here already, so using it as a general purpose merge editor for my work projects is quite nice.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ui&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;merge-editor&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;studio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;merge-tools&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;studio&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;merge-args&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;merge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$left&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$right&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$base&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;program&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;Users&#x2F;jalmeida&#x2F;Applications&#x2F;Android Studio Nightly.app&#x2F;Contents&#x2F;MacOS&#x2F;studio&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Presto!&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;2026-03-25_1.png&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Create new revisions in Jujutsu with multiple heads</title>
        <published>2026-03-22T00:00:00+00:00</published>
        <updated>2026-03-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/jj-megamerge/"/>
        <id>https://jonalmeida.com/til/jj-megamerge/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/jj-megamerge/">&lt;p&gt;It was one of those &quot;ah ha!&quot; moments for me when I finally used it. Chris Krycho &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;v5.chriskrycho.com&#x2F;journal&#x2F;jujutsu-megamerges-and-jj-absorb&#x2F;&quot;&gt;covers the concept of megamerges&lt;&#x2F;a&gt; with this diagram:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       m --- n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &#x2F;       \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a -- b -- c -- [merge] -- [wip]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      \       &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       w --- x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I&#x27;ve found a more realistic example that best relates to my natural workflow: implementing feature (A) benefitted from having the changes of another tooling patch upgrade (B), that lead to discovering and fixing a bug (C).&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      (B)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       m ----- n&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &#x2F;         \           (A)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a -- b --------- [merge] --- y -- z&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      \                     &#x2F;      \                (C)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -------------------         ----- [merge] -- w -- x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        \                                &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          -------------------------------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this case, trying to separate these into distinct streams of work is quite logically, but we also don&#x27;t need to leave them unlinked so that they can benefit from each other.&lt;&#x2F;p&gt;
&lt;p&gt;This is what my &lt;code&gt;jj log&lt;&#x2F;code&gt; ended up looking like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;jj&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@  oppmsuvz &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-22&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 00:34:10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt; firefox@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 05259417&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;Bug xxxxxxx - Simplify the tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;○  &lt;&#x2F;span&gt;&lt;span&gt;ultowtnr &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-22&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 00:34:04&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 100c4cce&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;Bug xxxxxxx - Include private flag in ShareData&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;○    &lt;&#x2F;span&gt;&lt;span&gt;lorusmuo &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 20:19:30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 905b0460&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;├─╮  &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;(empty)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; (no description set)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ ○  &lt;&#x2F;span&gt;&lt;span&gt;sumqskuu &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 04:22:00&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 92f6028b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ │  &lt;&#x2F;span&gt;&lt;span&gt;Add a new secret settings fragment&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ ○  &lt;&#x2F;span&gt;&lt;span&gt;oylmprpu &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 04:22:00&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 18931825&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ │  &lt;&#x2F;span&gt;&lt;span&gt;Create a new feature for receiving and sending commands.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ ○  &lt;&#x2F;span&gt;&lt;span&gt;xrnnoonu &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 04:21:48&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 618020c7&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;╭─┤  &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;(empty)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; (no description set)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ ○  &lt;&#x2F;span&gt;&lt;span&gt;rqlyqqzx &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-19&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 17:20:20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; c9b5323c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ │  &lt;&#x2F;span&gt;&lt;span&gt;Bug xxxxxxx - Part 2: Create new android gradle module skill&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│ ○  &lt;&#x2F;span&gt;&lt;span&gt;txvozpwz &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-19&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 17:20:13&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; cee18510&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;├─╯  &lt;&#x2F;span&gt;&lt;span&gt;Bug xxxxxxx - Part 1: Add new gradle example module&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;◆  pwsnmryn &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;vxxxxxxxxxxxx@gmail.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-03-18&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 13:21:47&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt; main@&lt;&#x2F;span&gt;&lt;span&gt;origin &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;fa20ce29&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;Bug xxxxxxx - Make my feature work for everyone&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When I need to submit these, [moz-phab][&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pypi.org&#x2F;project&#x2F;MozPhab&#x2F;&quot;&gt;1&lt;&#x2F;a&gt; has support for specifying revset ranges with &lt;code&gt;moz-phab start_rev end_rev&lt;&#x2F;code&gt;. However, I can also use &lt;code&gt;jj rebase -s &amp;lt;rev&amp;gt; -d main@origin&lt;&#x2F;code&gt; to put out some try pushes to validate they still work separately - so far, no conflicts in this step.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Use |mach try --no-push| for a configuration dry run</title>
        <published>2026-03-22T00:00:00+00:00</published>
        <updated>2026-03-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/mach-try-no-push/"/>
        <id>https://jonalmeida.com/til/mach-try-no-push/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/mach-try-no-push/">&lt;p&gt;I wanted to see what the generated try configuration would be for a new preset I made and did this by submitting real try pushes (with &lt;code&gt;empty&lt;&#x2F;code&gt; so they don&#x27;t execute resources). What I was looking for was &quot;dry run&quot; in the help files, but I recently discovered it to be &lt;code&gt;--no-push&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; try-push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-preset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-no-push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &amp;#39;fenix&amp;#39; as an example preset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; builds&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; enabled,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-no-artifact&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; disable&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Commit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; message:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Fuzzy&lt;&#x2F;span&gt;&lt;span&gt; (preset:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fenix&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; query&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;build-apk-fenix-debug&amp;amp;query=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;build-apk-fenix-android-test-debug&amp;amp;query=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;test-apk-fenix-debug&amp;amp;query=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;query&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;u&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;fenix&amp;amp;query=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mach&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; try&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; command:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;.&#x2F;mach&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; try&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-preset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-no-push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Pushed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; via&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; `&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mach&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; try&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fuzzy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Calculated&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; try_task_config.json:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;parameters&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;optimize_target_tasks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;try_task_config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;disable-pgo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;env&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;TRY_SELECTOR&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;fuzzy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tasks&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;build-apk-fenix-android-test-debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;build-apk-fenix-debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;generate-baseline-profile-firebase-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-android-detekt-detekt-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-android-l10n-lint-l10n-lint-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-android-lint-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-buildconfig-buildconfig-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-ktlint-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;source-test-mozlint-android-fenix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;test-apk-fenix-debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ui-test-apk-fenix-arm-debug&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;                &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ui-test-apk-fenix-arm-debug-smoke&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ],&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;use-artifact-builds&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    },&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;version&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here, &lt;code&gt;jj try-push&lt;&#x2F;code&gt; is my quick alias around &lt;code&gt;.&#x2F;mach try&lt;&#x2F;code&gt; for personal simplicity with my workflow.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-03-20T00:00:00+00:00</published>
        <updated>2026-03-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-03-20/"/>
        <id>https://jonalmeida.com/runs/run-2026-03-20/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-03-20/">&lt;p&gt;Burpy run, felt some sloshing inside of me for the first few kms.&lt;&#x2F;p&gt;
&lt;p&gt;Quite happy that the legs are walking up. Did a slow 2K warmup around the block and didn&#x27;t feel any early tightness. Should include this is my pre-run workout during training season.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;8.16 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;45:08&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:32 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;44 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 8.5, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 22.4, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 69.0]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Don&#x27;t credit Claude for patches that you submit for code review</title>
        <published>2026-03-14T00:00:00+00:00</published>
        <updated>2026-03-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/claude-coauthorship/"/>
        <id>https://jonalmeida.com/blog/claude-coauthorship/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/claude-coauthorship/">&lt;p&gt;Spicy topic, right?&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t used Claude Code nearly as much as I could to be honest, but enough to have an opinion on it.&lt;&#x2F;p&gt;
&lt;p&gt;Adding credits or notifying the reviewers that you used an AI agent was useful for a few reasons:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;This patch was written with support from an agent, and it might be useful context during a code review from a human (e.g. asking them to take extra care on the correctness of the patch).&lt;&#x2F;li&gt;
&lt;li&gt;To be a good citizen and say where the work originated from.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Doing this now for those reasons seems unproductive. In the same order as the above, I&#x27;d say:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;What you submit for review shouldn&#x27;t matter how it came to be, even if it was a script someone else wrote that generated the updated files for you to check-in. &lt;em&gt;You&lt;&#x2F;em&gt; are submitting those changes with your name and therefore should take responsibility for what is submitted. If Claude generated slop, it was you that submitted it without vetting it and it put your name on it, so your code is slop.&lt;&#x2F;li&gt;
&lt;li&gt;There is more hostility online when you use AI tools. I can understand the frustration that some folks have had, but not everyone is abusing the tools and causing harm. It&#x27;s hard to avoid being lumped into the same bucket, and being open about your workflow puts a target on your back, unfortunately.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Maybe this is comes across as obvious for others, but it wasn&#x27;t for me, and I needed to ramble somewhere.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-03-12T00:00:00+00:00</published>
        <updated>2026-03-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-03-12/"/>
        <id>https://jonalmeida.com/runs/run-2026-03-12/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-03-12/">&lt;p&gt;Chilly. Ran fast to stay warm.&lt;&#x2F;p&gt;
&lt;p&gt;New baseball park construction almost done.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;&amp;#x2F;runs&amp;#x2F;2026-03-12_1.jpg&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
      width=480
    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;br&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;8.18 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;45:00&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:30 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;53 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 1.8, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 26.1, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 24.1, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 48.1]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Toronto - Easy Run</title>
        <published>2026-03-08T00:00:00+00:00</published>
        <updated>2026-03-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/runs/run-2026-03-08/"/>
        <id>https://jonalmeida.com/runs/run-2026-03-08/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/runs/run-2026-03-08/">&lt;p&gt;Body is a bit stiff and didn&#x27;t feel fluid, but managed to get through it. Overdressed a little, though it wasn&#x27;t a problem.&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Stat&lt;&#x2F;th&gt;&lt;th&gt;Value&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Distance&lt;&#x2F;td&gt;&lt;td&gt;8.06 km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Duration&lt;&#x2F;td&gt;&lt;td&gt;45:01&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pace&lt;&#x2F;td&gt;&lt;td&gt;5:35 &#x2F;km&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Elevation Gain&lt;&#x2F;td&gt;&lt;td&gt;54 m&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;heart-rate-zones&quot;&gt;Heart Rate Zones&lt;&#x2F;h2&gt;

&lt;pre class=&quot;mermaid&quot;&gt;
---
config:
  themeVariables:
    xyChart:
      plotColorPalette: &amp;quot;#555555,#FF8200,#56CC3C,#4090D4,#AAAAAA&amp;quot;
      backgroundColor: &amp;quot;transparent&amp;quot;
---

xychart horizontal
    title &amp;quot;Time in Heart Rate Zones (%)&amp;quot;
    x-axis [&amp;quot;Zone 5 Maximum&amp;quot;, &amp;quot;Zone 4 Threshold&amp;quot;, &amp;quot;Zone 3 Aerobic&amp;quot;, &amp;quot;Zone 2 Easy&amp;quot;, &amp;quot;Zone 1 Warm Up&amp;quot;]
    y-axis &amp;quot;%&amp;quot; 2 --&amp;gt; 100
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 0.0]
    bar [0.0, 0.0, 15.7, 0.0, 0.0]
    bar [0.0, 0.0, 0.0, 28.7, 0.0]
    bar [0.0, 0.0, 0.0, 0.0, 55.6]
&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>My Firefox for Android local build environment</title>
        <published>2026-03-05T00:00:00+00:00</published>
        <updated>2026-05-19T12:21:23.554-04:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/firefox-android-studio-setup/"/>
        <id>https://jonalmeida.com/blog/firefox-android-studio-setup/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/firefox-android-studio-setup/">&lt;p&gt;The Firefox for Android app has always had a complicated build process - we&#x27;re cramping a complex cross-platform browser engine and all the related components that make it work on Android into one package. In its current form, it lives in the Firefox mono-repo at &lt;code&gt;mozilla-central&lt;&#x2F;code&gt; (now &lt;code&gt;mozilla-firefox&lt;&#x2F;code&gt; using the git repository).&lt;&#x2F;p&gt;
&lt;p&gt;I wanted to document my &quot;artifact-mode&quot; environment here since it&#x27;s worked quite successfully for me for many years with minor changes.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE:&lt;&#x2F;strong&gt; After a fresh clone of the mono-repo, don&#x27;t forget to first run and follow the prompts of &lt;code&gt;.&#x2F;mach bootstrap&lt;&#x2F;code&gt; .&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;mozconfig&quot;&gt;mozconfig&lt;&#x2F;h2&gt;
&lt;p&gt;My &lt;code&gt;mozconfig&lt;&#x2F;code&gt; below is enabled for artifact mode, but occasionally I switch between various configurations. You can see those commented out, with these few extra notes:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I like to separate out my objdirs to avoid cache pollution between the different build types. I think you can get away without needing to specify this and an objdir for your build type and arch will be generated.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;sccache&lt;&#x2F;code&gt; speeds up the native portion of full builds after the first slow one, but it&#x27;s a hit or miss if you fetch from the remote repository but don&#x27;t need to rebuild as often.&lt;&#x2F;li&gt;
&lt;li&gt;I don&#x27;t care to manually run the clobber step, and I don&#x27;t truly appreciate why that isn&#x27;t always automatically done.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;emilio&#x2F;mozconfigs&quot;&gt;Emilio&#x27;s mozconfig manager&lt;&#x2F;a&gt; looks like a better solution, however my needs are very simple.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Build GeckoView&#x2F;Firefox for Android:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ac_add_options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-enable-application=mobile&#x2F;android&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Targeting the following architecture.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; For regular phones, no --target is needed.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; For x86 emulators (and x86 devices, which are uncommon):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; ac_add_options --target=i686&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; For newer phones or Apple silicon&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ac_add_options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-target=aarch64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; For x86_64 emulators (and x86_64 devices, which are even less common):&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; ac_add_options --target=x86_64&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; sccache will significantly speed up your builds by caching&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; compilation results. The Firefox build system will download&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; sccache automatically.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; This only works for non-artifact builds.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;ac_add_options --with-ccache=sccache&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Enable artifact builds; manager-mode.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ac_add_options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-enable-artifact-builds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Write build artifacts to..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# Full build dir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;mk_add_options MOZ_OBJDIR=.&#x2F;objdir-droid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;mk_add_options MOZ_OBJDIR=.&#x2F;objdir-desktop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# Artifact builds&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mk_add_options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; MOZ_OBJDIR=.&#x2F;objdir-frontend&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Automatic clobbering; don&amp;#39;t ask me.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mk_add_options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; AUTOCLOBBER=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;java-home&quot;&gt;JAVA_HOME&lt;&#x2F;h2&gt;
&lt;p&gt;Sometimes you might find yourself needing to run a (non-mach) command in the terminal. Those typically will need to invoke some parts of gradle for an Android build, so it&#x27;s best to make sure those are using the same JDK as the bootstrapped one in the mono-repo. This avoids weird build errors where something that compiles in one place isn&#x27;t working in another (like Android Studio).&lt;&#x2F;p&gt;
&lt;p&gt;The location for the JDKs are typically in &lt;code&gt;~&#x2F;.mozbuild&#x2F;jdk&#x2F;&lt;&#x2F;code&gt;, and if you&#x27;ve between around for ~6 months you end up with multiple versions after every JDK bump:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ls&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ~&#x2F;.mozbuild&#x2F;jdk&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;drwxr-xr-x@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Apr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  2025&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jdk-17.0.15+6&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;drwxr-xr-x@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 15&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Jul&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  2025&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jdk-17.0.16+8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;drwxr-xr-x@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 21&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Oct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  2025&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jdk-17.0.17+10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;drwxr-xr-x@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 20&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Jan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 09:00&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jdk-17.0.18+8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;drwxr-xr-x@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jalmeida&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 26&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Feb&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 15:04&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mozboot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can find some way to point your latest JDK to one location or you can be lazy like me and pick the latest version to assign as your &lt;code&gt;JAVA_HOME&lt;&#x2F;code&gt; property by adding this to your shell&#x27;s RC file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;export&lt;&#x2F;span&gt;&lt;span&gt; JAVA_HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ls&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1dr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;.mozbuild&#x2F;jdk&#x2F;jdk-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; head&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;Contents&#x2F;Home&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;android-studio&quot;&gt;Android Studio&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;&#x2F;strong&gt; With &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;phabricator.services.mozilla.com&#x2F;D286123&quot;&gt;D286123&lt;&#x2F;a&gt; landed, this should no longer be necessary! 🎉&lt;&#x2F;p&gt;
&lt;p&gt;Similarly for Android Studio, let&#x27;s do the same so that environment is identical. Head to, Settings | Build, Execution, Deployment | Build Tools | Gradle, and ensure that &quot;Gradle JDK&quot; path is set to &lt;code&gt;JAVA_HOME&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Lately, the default seems to be for it to follow &lt;code&gt;GRADLE_LOCAL_JAVA_HOME&lt;&#x2F;code&gt; which is a property we can&#x27;t easily override, so we have to manually set this ourselves.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;android-studio-build-tools-gradle.png&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Using the same Android SDK also helps speed things up and avoids source confusion. You can typically find it in &lt;code&gt;~&#x2F;.mozbuild&#x2F;android-sdk-macosx&lt;&#x2F;code&gt; and update it at Settings | Languages &amp;amp; Frameworks | Android SDK.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;android-studio-android-sdk.png&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;debugging&quot;&gt;Debugging&lt;&#x2F;h2&gt;
&lt;p&gt;This section is for miscellaneous build error situations that come-up, but assuming &lt;code&gt;mach build&lt;&#x2F;code&gt; work and there are no known Android build changes, my solution has typically always been the same.&lt;&#x2F;p&gt;
&lt;p&gt;For example, the other day I fetched another engineers patch to test out locally&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; as part of reviewing it where I faced the error message below:&lt;&#x2F;p&gt;
&lt;details&gt;
&lt;summary&gt;Execution failed for task &#x27;:components:feature-pwa:compileDebugKotlin&#x27;.&lt;&#x2F;summary&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FAILURE: Build failed with an exception.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* What went wrong:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Execution failed for task &amp;#39;:components:feature-pwa:compileDebugKotlin&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   &amp;gt; Internal compiler error. See log for more details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* Try:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; Run with --info or --debug option to get more log output.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; Run with --scan to generate a Build Scan (powered by Develocity).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; Get more help at https:&#x2F;&#x2F;help.gradle.org.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* Exception is:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;org.gradle.api.tasks.TaskExecutionException: Execution failed for task &amp;#39;:components:feature-pwa:compileDebugKotlin&amp;#39;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:135)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:288)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:133)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:121)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.plan.DefaultNodeExecutor.executeLocalTaskNode(DefaultNodeExecutor.java:55)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.plan.DefaultNodeExecutor.execute(DefaultNodeExecutor.java:34)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:339)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:84)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:339)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:328)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:289)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultAsyncWorkTracker.lambda$waitForItemsAndGatherFailures$2(DefaultAsyncWorkTracker.java:130)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.Factories$1.create(Factories.java:33)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withoutLocks$2(DefaultWorkerLeaseService.java:344)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:342)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLocks(DefaultWorkerLeaseService.java:326)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.withoutLock(DefaultWorkerLeaseService.java:331)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:126)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:92)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:78)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:260)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:237)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:220)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:203)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:170)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:39)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.Either$Right.fold(Either.java:176)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:64)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:62)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:40)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:76)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:45)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:136)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:38)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:297)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:31)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:132)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	... 30 more&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Caused by: org.jetbrains.kotlin.gradle.tasks.FailedCompilationException: Internal compiler error. See log for more details&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.jetbrains.kotlin.gradle.tasks.TasksUtilsKt.throwExceptionIfCompilationFailed(tasksUtils.kt:22)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:112)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:75)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.Factories$1.create(Factories.java:33)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:269)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:42)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:267)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:259)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:132)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;	... 2 more&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;&#x2F;details&gt;
&lt;p&gt;The full trace was long and didn&#x27;t seem related to a code failure in the module itself. So I employed the solution, which is always the same:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;.&#x2F;mach build&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In Android Studio, File &amp;gt; Sync Project with Gradle Files.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Yup, that&#x27;s all. Very simple and boring.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;With Jujutsu, this is the moz-phab command I use which has made it easier to manage review patches: &lt;code&gt;moz-phab patch &amp;lt;patch-id&amp;gt; --no-branch --apply-to main@origin&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;

&lt;section id=&quot;comments&quot; class=&quot;article-content&quot;&gt;
  &lt;h3&gt;Comments&lt;&#x2F;h3&gt;
  &lt;p&gt;With an account on the Fediverse or Mastodon, you can respond to this &lt;a href=&quot;https:&#x2F;&#x2F;mindly.social&#x2F;@jonalmeida&#x2F;116197244320129422&quot;&gt;post&lt;&#x2F;a&gt;. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don&#x27;t have an account on this one. Known non-private replies are displayed below.&lt;&#x2F;p&gt;
  &lt;p&gt;Learn how this was implemented from the original source &lt;a class=&quot;link&quot; href=&quot;&#x2F;2020&#x2F;12&#x2F;29&#x2F;adding-comments-to-your-static-blog-with-mastodon&#x2F;&quot;&gt;here.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

  &lt;p id=&quot;mastodon-comments-list&quot;&gt;
  &lt;button id=&quot;load-comment&quot;&gt;Load comments&lt;&#x2F;button&gt;&lt;&#x2F;p&gt;
  &lt;div id=&quot;comments-wrapper&quot;&gt;
    &lt;noscript&gt;&lt;p&gt;Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit &lt;a href=&quot;https:&#x2F;&#x2F;mindly.social&#x2F;@jonalmeida&#x2F;116197244320129422&quot;&gt;the original post&lt;&#x2F;a&gt; on Mastodon.&lt;&#x2F;p&gt;&lt;&#x2F;noscript&gt;
  &lt;&#x2F;div&gt;

  &lt;noscript&gt;You need JavaScript to view the comments.&lt;&#x2F;noscript&gt;
  &lt;script type=&quot;text&#x2F;javascript&quot;&gt;
    function escapeHtml(unsafe) {
      return unsafe
           .replace(&#x2F;&amp;&#x2F;g, &quot;&amp;amp;&quot;)
           .replace(&#x2F;&lt;&#x2F;g, &quot;&amp;lt;&quot;)
           .replace(&#x2F;&gt;&#x2F;g, &quot;&amp;gt;&quot;)
           .replace(&#x2F;&quot;&#x2F;g, &quot;&amp;quot;&quot;)
           .replace(&#x2F;&#x27;&#x2F;g, &quot;&amp;#039;&quot;);
    }
    function emojify(input, emojis) {
      let output = input;

      emojis.forEach(emoji =&gt; {
        let picture = document.createElement(&quot;picture&quot;);

        let source = document.createElement(&quot;source&quot;);
        source.setAttribute(&quot;srcset&quot;, escapeHtml(emoji.url));
        source.setAttribute(&quot;media&quot;, &quot;(prefers-reduced-motion: no-preference)&quot;);

        let img = document.createElement(&quot;img&quot;);
        img.className = &quot;emoji&quot;;
        img.setAttribute(&quot;src&quot;, escapeHtml(emoji.static_url));
        img.setAttribute(&quot;alt&quot;, `:${ emoji.shortcode }:`);
        img.setAttribute(&quot;title&quot;, `:${ emoji.shortcode }:`);
        img.setAttribute(&quot;width&quot;, &quot;20&quot;);
        img.setAttribute(&quot;height&quot;, &quot;20&quot;);

        picture.appendChild(source);
        picture.appendChild(img);

        output = output.replace(`:${ emoji.shortcode }:`, picture.outerHTML);
      });

      return output;
    }

    function loadCssFile(path) {
      const link = document.createElement(&#x27;link&#x27;);
      link.rel = &#x27;stylesheet&#x27;;
      link.type = &#x27;text&#x2F;css&#x27;;
      link.href = path; &#x2F;&#x2F; relative path to your CSS file
      document.head.appendChild(link);
    }

    function loadComments() {
      let purifyPromise = import(&quot;&#x2F;assets&#x2F;js&#x2F;purify.min.js&quot;);
      let cssPromise = loadCssFile(&quot;&#x2F;comments.css&quot;);

      let commentsWrapper = document.getElementById(&quot;comments-wrapper&quot;);
      document.getElementById(&quot;load-comment&quot;).innerHTML = &quot;Loading&quot;;
      fetch(&quot;https:&#x2F;&#x2F;mindly.social&#x2F;api&#x2F;v1&#x2F;statuses&#x2F;116197244320129422&#x2F;context&quot;)
        .then(function(response) {
          return response.json();
        })
        .then(function(data) {
          let descendants = data[&#x27;descendants&#x27;];
          if(
            descendants &amp;&amp;
            Array.isArray(descendants) &amp;&amp;
            descendants.length &gt; 0
          ) {
            commentsWrapper.innerHTML = &quot;&quot;;

            descendants.forEach(function(status) {
              &#x2F;* For debugging *&#x2F;
              &#x2F;* console.log(descendants) *&#x2F;
              if( status.account.display_name.length &gt; 0 ) {
                status.account.display_name = escapeHtml(status.account.display_name);
                status.account.display_name = emojify(status.account.display_name, status.account.emojis);
              } else {
                status.account.display_name = status.account.username;
              };

              let instance = &quot;&quot;;
              if( status.account.acct.includes(&quot;@&quot;) ) {
                instance = status.account.acct.split(&quot;@&quot;)[1];
              } else {
                instance = &quot;mindly.social&quot;;
              }

              const isReply = status.in_reply_to_id !== &quot;116197244320129422&quot;;

              let op = false;
              if( status.account.acct == &quot;jonalmeida&quot; ) {
                op = true;
              }

              status.content = emojify(status.content, status.emojis);

              let avatarSource = document.createElement(&quot;source&quot;);
              avatarSource.setAttribute(&quot;srcset&quot;, escapeHtml(status.account.avatar));
              avatarSource.setAttribute(&quot;media&quot;, &quot;(prefers-reduced-motion: no-preference)&quot;);

              let avatarImg = document.createElement(&quot;img&quot;);
              avatarImg.className = &quot;avatar&quot;;
              avatarImg.setAttribute(&quot;src&quot;, escapeHtml(status.account.avatar_static));
              avatarImg.setAttribute(&quot;alt&quot;, `@${ status.account.username }@${ instance } avatar`);

              let avatarPicture = document.createElement(&quot;picture&quot;);
              avatarPicture.appendChild(avatarSource);
              avatarPicture.appendChild(avatarImg);

              let avatar = document.createElement(&quot;a&quot;);
              avatar.className = &quot;avatar-link&quot;;
              avatar.setAttribute(&quot;href&quot;, status.account.url);
              avatar.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              avatar.setAttribute(&quot;title&quot;, `View profile at @${ status.account.username }@${ instance }`);
              avatar.appendChild(avatarPicture);

              let instanceBadge = document.createElement(&quot;a&quot;);
              instanceBadge.className = &quot;instance&quot;;
              instanceBadge.setAttribute(&quot;href&quot;, status.account.url);
              instanceBadge.setAttribute(&quot;title&quot;, `@${ status.account.username }@${ instance }`);
              instanceBadge.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              instanceBadge.textContent = instance;

              let display = document.createElement(&quot;span&quot;);
              display.className = &quot;display&quot;;
              display.setAttribute(&quot;itemprop&quot;, &quot;author&quot;);
              display.setAttribute(&quot;itemtype&quot;, &quot;http:&#x2F;&#x2F;schema.org&#x2F;Person&quot;);
              display.innerHTML = status.account.display_name;

              let header = document.createElement(&quot;header&quot;);
              header.className = &quot;author&quot;;
              header.appendChild(display);
              header.appendChild(instanceBadge);

              let permalink = document.createElement(&quot;a&quot;);
              permalink.setAttribute(&quot;href&quot;, status.url);
              permalink.setAttribute(&quot;itemprop&quot;, &quot;url&quot;);
              permalink.setAttribute(&quot;title&quot;, `View comment at ${ instance }`);
              permalink.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              permalink.textContent = new Date( status.created_at ).toLocaleString(&#x27;en-US&#x27;, {
                dateStyle: &quot;long&quot;,
                timeStyle: &quot;short&quot;,
              });

              let timestamp = document.createElement(&quot;time&quot;);
              timestamp.setAttribute(&quot;datetime&quot;, status.created_at);
              timestamp.appendChild(permalink);

              let main = document.createElement(&quot;main&quot;);
              main.setAttribute(&quot;itemprop&quot;, &quot;text&quot;);
              main.innerHTML = status.content;

              let interactions = document.createElement(&quot;footer&quot;);
              if(status.favourites_count &gt; 0) {
                let faves = document.createElement(&quot;a&quot;);
                faves.className = &quot;faves&quot;;
                faves.setAttribute(&quot;href&quot;, `${ status.url }&#x2F;favourites`);
                faves.setAttribute(&quot;title&quot;, `Favorites from ${ instance }`);
                faves.textContent = status.favourites_count;

                interactions.appendChild(faves);
              }

              let comment = document.createElement(&quot;article&quot;);
              comment.id = `comment-${ status.id }`;
              comment.className = isReply ? &quot;comment comment-reply&quot; : &quot;comment&quot;;
              comment.setAttribute(&quot;itemprop&quot;, &quot;comment&quot;);
              comment.setAttribute(&quot;itemtype&quot;, &quot;http:&#x2F;&#x2F;schema.org&#x2F;Comment&quot;);
              comment.appendChild(avatar);
              comment.appendChild(header);
              comment.appendChild(timestamp);
              comment.appendChild(main);
              comment.appendChild(interactions);

              if(op === true) {
                comment.classList.add(&quot;op&quot;);

                avatar.classList.add(&quot;op&quot;);
                avatar.setAttribute(
                  &quot;title&quot;,
                  &quot;Blog post author; &quot; + avatar.getAttribute(&quot;title&quot;)
                );

                instanceBadge.classList.add(&quot;op&quot;);
                instanceBadge.setAttribute(
                  &quot;title&quot;,
                  &quot;Blog post author: &quot; + instanceBadge.getAttribute(&quot;title&quot;)
                );
              }

              Promise.all([purifyPromise, cssPromise]).then(() =&gt; {
                commentsWrapper.innerHTML += DOMPurify.sanitize(comment.outerHTML);
              });

            });
          } else {
            commentsWrapper.innerHTML = &quot;&lt;p&gt;No comments.&lt;&#x2F;p&gt;&quot;;
          }
          &#x2F;&#x2F; Makes the button update more user-perceivable.
          setTimeout(() =&gt; {
            document.getElementById(&quot;load-comment&quot;).innerHTML = &quot;Reload comments&quot;;
          }, 300);
        });
      }
      document.getElementById(&quot;load-comment&quot;).addEventListener(&quot;click&quot;, loadComments);
  &lt;&#x2F;script&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A week at Sunshine and Lake Louise</title>
        <published>2026-02-28T00:00:00+00:00</published>
        <updated>2026-02-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/sunshine-lake-louise/"/>
        <id>https://jonalmeida.com/blog/sunshine-lake-louise/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/sunshine-lake-louise/">&lt;p&gt;I hadn&#x27;t been back to Banff in two years, so naturally I was nervous and excited to be back. It was nice to see that the strength was still there in the legs after a few days to build it back up again.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;image-4.jpg&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
      height=320
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;My skills improved considerably after the second day and I became a more efficient carver with the help of some fresh snow that came in around the same time. After the third day, we pushed past the aches and pains and I found my body adapted to it. We ate and slept well - &quot;second breakfast&quot; and a full nine hours of sleep (even when you can&#x27;t sleep), all helped aid in the recovery.&lt;&#x2F;p&gt;
&lt;p&gt;I found myself more comfortable at steeper inclines; seems like the trick for me is to not look (too far) down and take my time to catch my breath. Being there on the edge felt like one of those life lessons: if you aren&#x27;t pushing yourself in an uncomfortable or new situation, you aren&#x27;t learning.&lt;&#x2F;p&gt;
&lt;p&gt;We went off with a group, and I learnt that you can always find ways to have fun when with people of different skill levels or preferences.&lt;&#x2F;p&gt;
&lt;p&gt;Skiing through trees is a lot of fun. Not many people seem to do it, so the snow is fresher, the air is warmer, and protected me from the wind. It was a pretty grand place to sit and take a break on the mountain.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;image-6.jpg&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;After one of those long days, I&#x27;ve had to re-learn again that sleep deprivation causes my calfs to hurt - weird how I still keep forgetting that! Also, who would have known that Banff had surprisingly good ramen and it was glorious to end that day.&lt;&#x2F;p&gt;

&lt;div style=&quot;display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;&quot;&gt;

  
  
    
  
    
  
    
  



    
    

    &lt;a href=&quot;image-2.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-2.a587d8337b10bf30.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-3.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-3.b839e68862b484c1.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-5.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-5.164786adca9fb5ff.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;

&lt;div style=&quot;display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;&quot;&gt;

  
  
    
  
    
  
    
  



    
    

    &lt;a href=&quot;image-1.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-1.1377f5acd92ba139.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-7.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-7.d18b8bce4db7161d.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-8.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-8.01f507a78cf514e4.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Test a Firefox Android variant alongside your daily driver</title>
        <published>2026-02-06T00:00:00+00:00</published>
        <updated>2026-02-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/install-fenix-variants/"/>
        <id>https://jonalmeida.com/til/install-fenix-variants/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/install-fenix-variants/">&lt;p&gt;In the Mozilla Android team, we want engineers to talk with Product and UX more and hash out ideas sooner. Prototype an idea, then discuss the feature&#x27;s merits. For this, we built &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mozilla-mobile&#x2F;TryFox&#x2F;&quot;&gt;TryFox&lt;&#x2F;a&gt; to make it easier for everyone to get the latest version of Firefox Nightly or install a &quot;try&quot; build with a link to the build on our CI servers.&lt;&#x2F;p&gt;
&lt;p&gt;The downside with using a Try build is that you sometimes have to uninstall your existing version of Nightly before you can install another and that means losing app data. Typically, if you were doing this on your daily driver, you don&#x27;t want to do that. A quick work around is to add a temporary patch above your stack of commits which changes the App ID suffix (and optionally the application name) so that there is no conflict.&lt;&#x2F;p&gt;
&lt;p&gt;Here is an example diff from a patch that changed an animation, so having it install alongside what we shipped let you compare them easily:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;diff --git a&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;build.gradle b&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;build.gradle&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index 019fdb7ab4..772cc6cc3d 100644&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; a&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;build.gradle&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;+++&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; b&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;build.gradle&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt; -127,7 +127,7&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         debug {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             shrinkResources = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             minifyEnabled = false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;            applicationIdSuffix &amp;quot;.fenix.debug&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;            applicationIdSuffix &amp;quot;.fenix.debug_animator&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             resValue &amp;quot;bool&amp;quot;, &amp;quot;IS_DEBUG&amp;quot;, &amp;quot;true&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;             pseudoLocalesEnabled = true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;diff --git a&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;src&#x2F;main&#x2F;res&#x2F;values&#x2F;static_strings.xml b&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;src&#x2F;main&#x2F;res&#x2F;values&#x2F;static_strings.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;index 4f6703eb35..1a57988477 100644&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt; a&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;src&#x2F;main&#x2F;res&#x2F;values&#x2F;static_strings.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;+++&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt; b&#x2F;mobile&#x2F;android&#x2F;fenix&#x2F;app&#x2F;src&#x2F;main&#x2F;res&#x2F;values&#x2F;static_strings.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt;@@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt; -4,7 +4,7&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);font-weight: bold;&quot;&gt; @@&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - file, You can obtain one at http:&#x2F;&#x2F;mozilla.org&#x2F;MPL&#x2F;2.0&#x2F;. --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &amp;lt;resources xmlns:moz=&amp;quot;http:&#x2F;&#x2F;schemas.android.com&#x2F;apk&#x2F;res-auto&amp;quot; xmlns:tools=&amp;quot;http:&#x2F;&#x2F;schemas.android.com&#x2F;tools&amp;quot;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;lt;!-- Name of the application --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);background-color: light-dark(#FFEEF0, #86181D);&quot;&gt;    &amp;lt;string name=&amp;quot;app_name&amp;quot; translatable=&amp;quot;false&amp;quot;&amp;gt;Firefox Fenix&amp;lt;&#x2F;string&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);background-color: light-dark(#F0FFF4, #144620);&quot;&gt;    &amp;lt;string name=&amp;quot;app_name&amp;quot; translatable=&amp;quot;false&amp;quot;&amp;gt;Firefox Fenix (animator)&amp;lt;&#x2F;string&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;lt;string name=&amp;quot;firefox&amp;quot; translatable=&amp;quot;false&amp;quot;&amp;gt;Firefox&amp;lt;&#x2F;string&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     &amp;lt;!-- Preference for developers --&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the future, we can add &lt;code&gt;mach try&lt;&#x2F;code&gt; support to do this automatically for any push.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMD + Enter autocompletes a word with a .com TLD</title>
        <published>2026-02-05T00:00:00+00:00</published>
        <updated>2026-02-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/cmd-enter-dot-com/"/>
        <id>https://jonalmeida.com/til/cmd-enter-dot-com/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/cmd-enter-dot-com/">&lt;p&gt;This has apparently existed since the dawn of time in all browsers (except Safari?).&lt;&#x2F;p&gt;
&lt;p&gt;Entering a word into the address bar, and then using Cmd + Enter&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; wraps the word with &#x27;www.&#x27; in the front and &#x27;.com&#x27; and the end of it.&lt;&#x2F;p&gt;

&lt;div&gt;
  &lt;img
    src=&quot;search-word.png&quot;
    style=&quot;display: block; margin-left: auto; margin-right: auto;&quot;

    
    
  &#x2F;&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Pretty neat! I tried this with &lt;code&gt;nautil.us&lt;&#x2F;code&gt; but it didn&#x27;t work and went straight to &lt;code&gt;https:&#x2F;&#x2F;nautil.us&lt;&#x2F;code&gt; in Firefox. There might be some logic to respect known TLDs.&lt;&#x2F;p&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;Control + Enter on Windows.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Test sites for browser developers</title>
        <published>2026-01-19T00:00:00+00:00</published>
        <updated>2026-03-17T14:58:43-04:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/browser-test-sites/"/>
        <id>https://jonalmeida.com/blog/browser-test-sites/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/browser-test-sites/">&lt;p&gt;Working on the mobile Firefox team gives you the opportunity to touch on many different parts of the browser space. You often need to test the interaction between web content and the application integration&#x27;s to another component, say for example, a site registering for a WebPush subscription and Firefox using Firebase Cloud Messaging to deliver the encrypted message to the end-user. Hunting around for an example to validate everything fine and dandy takes time.&lt;&#x2F;p&gt;
&lt;p&gt;Sometimes a simple test site for your use case is helpful for initial validation or comparison against other browsers.&lt;&#x2F;p&gt;
&lt;p&gt;Below is a list of tests that I&#x27;ve used in the past (in no particular order):&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;webauthn-passkeys-prf-demo.explore.corbado.com&#x2F;&quot;&gt;WebAuthn &#x2F; Passkeys &amp;amp; PRF Demo&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;For &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;Web_Authentication_API&quot;&gt;WebAuthn&lt;&#x2F;a&gt; login&#x2F;registration, but also includes PRF extension support.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mozilla-services.github.io&#x2F;WebPushDataTestPage&#x2F;&quot;&gt;Web Push: Data Encryption Test Page&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Push notifications requires a server to send a notification to the client (not the same as a WebNotification), so you can use this WebPush test site for validating just that.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simple-push-demo.vercel.app&#x2F;&quot;&gt;Simple Push Demo&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Similar to the above, but prettier.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.sharonminsuk.com&#x2F;code&#x2F;storage-test.html&quot;&gt;Test of HTML5 localStorage and sessionStorage persistence - sharonminsuk.com&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;When you have to verify that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;Window&#x2F;localStorage&quot;&gt;&lt;code&gt;localStorage&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; is truly gone. This is especially helpful for Firefox Focus where private browsing is the primary feature.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;HTML&#x2F;Reference&#x2F;Elements&#x2F;input&quot;&gt;&lt;code&gt;&amp;lt;input&amp;gt;&lt;&#x2F;code&gt;: The HTML Input element - MDN&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;There are Too Many™ different prompt and input element types. The MDN docs have the best collection of all of them.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;browsing-privacy-and-tracking-protection&quot;&gt;Browsing privacy and Tracking Protection&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;badssl.com&quot;&gt;badssl.com&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Great for testing out the various error pages that a browser can show.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;testsafebrowsing.appspot.com&#x2F;&quot;&gt;(Safe) Safe Browsing Testing Links &lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;For making sure we are still using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;safebrowsing.google.com&#x2F;&quot;&gt;Safe Browsing&lt;&#x2F;a&gt; list correctly.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;senglehardt.com&#x2F;test&#x2F;trackingprotection&#x2F;test_pages&#x2F;tracking_protection&quot;&gt;senglehardt.com&#x2F;test&#x2F;trackingprotection&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Tracking Protection test page. Somewhat ancient so cookie blocking might not work.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;forms-and-autocomplete&quot;&gt;Forms and Autocomplete&lt;&#x2F;h3&gt;
&lt;p&gt;There are various form types and various heuristics to trigger completion options, so they deserve their own section. The more (test sites) the merrier!&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bugs.mattn.ca&#x2F;pwmgr&#x2F;login_and_change_form.html&quot;&gt;Registration, Login and Change Forms - MattN&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Web forms come in all shapes and sizes. Some simple forms to see if we can detect a login&#x2F;registration form and fill a login entry into them.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;fill.dev&#x2F;form&#x2F;login-simple&quot;&gt;fill.dev&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;More forms, but also includes credit card and address form filling.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;daleharvey.github.io&#x2F;testapp&#x2F;&quot;&gt;daleharvey.github.io&#x2F;testapp&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Good for sanity testing simple forms, links that have same&#x2F;different origins, or (location) permission prompts.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dimidl.github.io&#x2F;signup&#x2F;test.html&quot;&gt;Sign-Up &amp;amp; Login Forms - Dimi&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Sign-up and login forms behave differently, so they are handy to test separately. For example, autofilling a generated password is useful on a registration form but not on a login one.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;make-your-own&quot;&gt;Make your own&lt;&#x2F;h3&gt;
&lt;p&gt;If you need to make your own, try to write out the code yourself so you can understand the reduced test case. If it&#x27;s not straight-forward, try using the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;addons.mozilla.org&#x2F;en-CA&#x2F;firefox&#x2F;addon&#x2F;testcase-reducer&#x2F;&quot;&gt;Testcase Reducer by Thomas Wisniewski&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;

&lt;section id=&quot;comments&quot; class=&quot;article-content&quot;&gt;
  &lt;h3&gt;Comments&lt;&#x2F;h3&gt;
  &lt;p&gt;With an account on the Fediverse or Mastodon, you can respond to this &lt;a href=&quot;https:&#x2F;&#x2F;mindly.social&#x2F;@jonalmeida&#x2F;115937256635328128&quot;&gt;post&lt;&#x2F;a&gt;. Since Mastodon is decentralized, you can use your existing account hosted by another Mastodon server or compatible platform if you don&#x27;t have an account on this one. Known non-private replies are displayed below.&lt;&#x2F;p&gt;
  &lt;p&gt;Learn how this was implemented from the original source &lt;a class=&quot;link&quot; href=&quot;&#x2F;2020&#x2F;12&#x2F;29&#x2F;adding-comments-to-your-static-blog-with-mastodon&#x2F;&quot;&gt;here.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;

  &lt;p id=&quot;mastodon-comments-list&quot;&gt;
  &lt;button id=&quot;load-comment&quot;&gt;Load comments&lt;&#x2F;button&gt;&lt;&#x2F;p&gt;
  &lt;div id=&quot;comments-wrapper&quot;&gt;
    &lt;noscript&gt;&lt;p&gt;Loading comments relies on JavaScript. Try enabling JavaScript and reloading, or visit &lt;a href=&quot;https:&#x2F;&#x2F;mindly.social&#x2F;@jonalmeida&#x2F;115937256635328128&quot;&gt;the original post&lt;&#x2F;a&gt; on Mastodon.&lt;&#x2F;p&gt;&lt;&#x2F;noscript&gt;
  &lt;&#x2F;div&gt;

  &lt;noscript&gt;You need JavaScript to view the comments.&lt;&#x2F;noscript&gt;
  &lt;script type=&quot;text&#x2F;javascript&quot;&gt;
    function escapeHtml(unsafe) {
      return unsafe
           .replace(&#x2F;&amp;&#x2F;g, &quot;&amp;amp;&quot;)
           .replace(&#x2F;&lt;&#x2F;g, &quot;&amp;lt;&quot;)
           .replace(&#x2F;&gt;&#x2F;g, &quot;&amp;gt;&quot;)
           .replace(&#x2F;&quot;&#x2F;g, &quot;&amp;quot;&quot;)
           .replace(&#x2F;&#x27;&#x2F;g, &quot;&amp;#039;&quot;);
    }
    function emojify(input, emojis) {
      let output = input;

      emojis.forEach(emoji =&gt; {
        let picture = document.createElement(&quot;picture&quot;);

        let source = document.createElement(&quot;source&quot;);
        source.setAttribute(&quot;srcset&quot;, escapeHtml(emoji.url));
        source.setAttribute(&quot;media&quot;, &quot;(prefers-reduced-motion: no-preference)&quot;);

        let img = document.createElement(&quot;img&quot;);
        img.className = &quot;emoji&quot;;
        img.setAttribute(&quot;src&quot;, escapeHtml(emoji.static_url));
        img.setAttribute(&quot;alt&quot;, `:${ emoji.shortcode }:`);
        img.setAttribute(&quot;title&quot;, `:${ emoji.shortcode }:`);
        img.setAttribute(&quot;width&quot;, &quot;20&quot;);
        img.setAttribute(&quot;height&quot;, &quot;20&quot;);

        picture.appendChild(source);
        picture.appendChild(img);

        output = output.replace(`:${ emoji.shortcode }:`, picture.outerHTML);
      });

      return output;
    }

    function loadCssFile(path) {
      const link = document.createElement(&#x27;link&#x27;);
      link.rel = &#x27;stylesheet&#x27;;
      link.type = &#x27;text&#x2F;css&#x27;;
      link.href = path; &#x2F;&#x2F; relative path to your CSS file
      document.head.appendChild(link);
    }

    function loadComments() {
      let purifyPromise = import(&quot;&#x2F;assets&#x2F;js&#x2F;purify.min.js&quot;);
      let cssPromise = loadCssFile(&quot;&#x2F;comments.css&quot;);

      let commentsWrapper = document.getElementById(&quot;comments-wrapper&quot;);
      document.getElementById(&quot;load-comment&quot;).innerHTML = &quot;Loading&quot;;
      fetch(&quot;https:&#x2F;&#x2F;mindly.social&#x2F;api&#x2F;v1&#x2F;statuses&#x2F;115937256635328128&#x2F;context&quot;)
        .then(function(response) {
          return response.json();
        })
        .then(function(data) {
          let descendants = data[&#x27;descendants&#x27;];
          if(
            descendants &amp;&amp;
            Array.isArray(descendants) &amp;&amp;
            descendants.length &gt; 0
          ) {
            commentsWrapper.innerHTML = &quot;&quot;;

            descendants.forEach(function(status) {
              &#x2F;* For debugging *&#x2F;
              &#x2F;* console.log(descendants) *&#x2F;
              if( status.account.display_name.length &gt; 0 ) {
                status.account.display_name = escapeHtml(status.account.display_name);
                status.account.display_name = emojify(status.account.display_name, status.account.emojis);
              } else {
                status.account.display_name = status.account.username;
              };

              let instance = &quot;&quot;;
              if( status.account.acct.includes(&quot;@&quot;) ) {
                instance = status.account.acct.split(&quot;@&quot;)[1];
              } else {
                instance = &quot;mindly.social&quot;;
              }

              const isReply = status.in_reply_to_id !== &quot;115937256635328128&quot;;

              let op = false;
              if( status.account.acct == &quot;jonalmeida&quot; ) {
                op = true;
              }

              status.content = emojify(status.content, status.emojis);

              let avatarSource = document.createElement(&quot;source&quot;);
              avatarSource.setAttribute(&quot;srcset&quot;, escapeHtml(status.account.avatar));
              avatarSource.setAttribute(&quot;media&quot;, &quot;(prefers-reduced-motion: no-preference)&quot;);

              let avatarImg = document.createElement(&quot;img&quot;);
              avatarImg.className = &quot;avatar&quot;;
              avatarImg.setAttribute(&quot;src&quot;, escapeHtml(status.account.avatar_static));
              avatarImg.setAttribute(&quot;alt&quot;, `@${ status.account.username }@${ instance } avatar`);

              let avatarPicture = document.createElement(&quot;picture&quot;);
              avatarPicture.appendChild(avatarSource);
              avatarPicture.appendChild(avatarImg);

              let avatar = document.createElement(&quot;a&quot;);
              avatar.className = &quot;avatar-link&quot;;
              avatar.setAttribute(&quot;href&quot;, status.account.url);
              avatar.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              avatar.setAttribute(&quot;title&quot;, `View profile at @${ status.account.username }@${ instance }`);
              avatar.appendChild(avatarPicture);

              let instanceBadge = document.createElement(&quot;a&quot;);
              instanceBadge.className = &quot;instance&quot;;
              instanceBadge.setAttribute(&quot;href&quot;, status.account.url);
              instanceBadge.setAttribute(&quot;title&quot;, `@${ status.account.username }@${ instance }`);
              instanceBadge.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              instanceBadge.textContent = instance;

              let display = document.createElement(&quot;span&quot;);
              display.className = &quot;display&quot;;
              display.setAttribute(&quot;itemprop&quot;, &quot;author&quot;);
              display.setAttribute(&quot;itemtype&quot;, &quot;http:&#x2F;&#x2F;schema.org&#x2F;Person&quot;);
              display.innerHTML = status.account.display_name;

              let header = document.createElement(&quot;header&quot;);
              header.className = &quot;author&quot;;
              header.appendChild(display);
              header.appendChild(instanceBadge);

              let permalink = document.createElement(&quot;a&quot;);
              permalink.setAttribute(&quot;href&quot;, status.url);
              permalink.setAttribute(&quot;itemprop&quot;, &quot;url&quot;);
              permalink.setAttribute(&quot;title&quot;, `View comment at ${ instance }`);
              permalink.setAttribute(&quot;rel&quot;, &quot;external nofollow&quot;);
              permalink.textContent = new Date( status.created_at ).toLocaleString(&#x27;en-US&#x27;, {
                dateStyle: &quot;long&quot;,
                timeStyle: &quot;short&quot;,
              });

              let timestamp = document.createElement(&quot;time&quot;);
              timestamp.setAttribute(&quot;datetime&quot;, status.created_at);
              timestamp.appendChild(permalink);

              let main = document.createElement(&quot;main&quot;);
              main.setAttribute(&quot;itemprop&quot;, &quot;text&quot;);
              main.innerHTML = status.content;

              let interactions = document.createElement(&quot;footer&quot;);
              if(status.favourites_count &gt; 0) {
                let faves = document.createElement(&quot;a&quot;);
                faves.className = &quot;faves&quot;;
                faves.setAttribute(&quot;href&quot;, `${ status.url }&#x2F;favourites`);
                faves.setAttribute(&quot;title&quot;, `Favorites from ${ instance }`);
                faves.textContent = status.favourites_count;

                interactions.appendChild(faves);
              }

              let comment = document.createElement(&quot;article&quot;);
              comment.id = `comment-${ status.id }`;
              comment.className = isReply ? &quot;comment comment-reply&quot; : &quot;comment&quot;;
              comment.setAttribute(&quot;itemprop&quot;, &quot;comment&quot;);
              comment.setAttribute(&quot;itemtype&quot;, &quot;http:&#x2F;&#x2F;schema.org&#x2F;Comment&quot;);
              comment.appendChild(avatar);
              comment.appendChild(header);
              comment.appendChild(timestamp);
              comment.appendChild(main);
              comment.appendChild(interactions);

              if(op === true) {
                comment.classList.add(&quot;op&quot;);

                avatar.classList.add(&quot;op&quot;);
                avatar.setAttribute(
                  &quot;title&quot;,
                  &quot;Blog post author; &quot; + avatar.getAttribute(&quot;title&quot;)
                );

                instanceBadge.classList.add(&quot;op&quot;);
                instanceBadge.setAttribute(
                  &quot;title&quot;,
                  &quot;Blog post author: &quot; + instanceBadge.getAttribute(&quot;title&quot;)
                );
              }

              Promise.all([purifyPromise, cssPromise]).then(() =&gt; {
                commentsWrapper.innerHTML += DOMPurify.sanitize(comment.outerHTML);
              });

            });
          } else {
            commentsWrapper.innerHTML = &quot;&lt;p&gt;No comments.&lt;&#x2F;p&gt;&quot;;
          }
          &#x2F;&#x2F; Makes the button update more user-perceivable.
          setTimeout(() =&gt; {
            document.getElementById(&quot;load-comment&quot;).innerHTML = &quot;Reload comments&quot;;
          }, 300);
        });
      }
      document.getElementById(&quot;load-comment&quot;).addEventListener(&quot;click&quot;, loadComments);
  &lt;&#x2F;script&gt;
&lt;&#x2F;section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Update jj bookmarks to the latest revision</title>
        <published>2026-01-05T00:00:00+00:00</published>
        <updated>2026-03-04T18:52:14-05:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/jj-tug/"/>
        <id>https://jonalmeida.com/til/jj-tug/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/jj-tug/">&lt;p&gt;&lt;strong&gt;Update:&lt;&#x2F;strong&gt; As of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;releases&#x2F;tag&#x2F;v0.39.0&quot;&gt;v0.39.0&lt;&#x2F;a&gt;, &lt;code&gt;tug&lt;&#x2F;code&gt; is now built-in to jj as &lt;code&gt;bookmark advance&lt;&#x2F;code&gt;! :tada:&lt;&#x2F;p&gt;
&lt;p&gt;Got this one from another colleague as well but it seems like most folks use some version of this daily that it might be good to have this built-in.&lt;&#x2F;p&gt;
&lt;p&gt;Before I can &lt;code&gt;jj git push&lt;&#x2F;code&gt; my current bookmark to my remote, I need to update where my (tracked) bookmark is, to the latest change:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;jj&quot;&gt;&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: light-dark(#F6F8FA, #2B3036);&quot;&gt;&lt;span&gt;@  ptuqwsty &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git@jonalmeida.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-01-05&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 16:00:22&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 451384bf&lt;&#x2F;span&gt;&lt;span&gt; &amp;lt;-- move &amp;#39;main&amp;#39; here.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;TIL: Update remote bookmark to the latest revision&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: light-dark(#F6F8FA, #2B3036);&quot;&gt;&lt;span&gt;◆  xoqwkuvu &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git@jonalmeida.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2025-12-30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 19:50:51&lt;&#x2F;span&gt;&lt;span&gt; main &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;git_head()&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 9ad7ce11&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;TIL: Preserve image scale with ImageMagick&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A quick one-liner &lt;code&gt;jj tug&lt;&#x2F;code&gt; does that for me:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;jj&quot;&gt;&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: light-dark(#F6F8FA, #2B3036);&quot;&gt;&lt;span&gt;@  ptuqwsty &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git@jonalmeida.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2026-01-05&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 16:03:54&lt;&#x2F;span&gt;&lt;span&gt; main* &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;6e7173b4&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;TIL: Update remote bookmark to the latest revision&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot; style=&quot;background-color: light-dark(#F6F8FA, #2B3036);&quot;&gt;&lt;span&gt;◆  xoqwkuvu &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git@jonalmeida.com&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 2025-12-30&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 19:50:51&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt; main@&lt;&#x2F;span&gt;&lt;span&gt;origin &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;git_head()&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 9ad7ce11&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;│  &lt;&#x2F;span&gt;&lt;span&gt;TIL: Preserve image scale with ImageMagick&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The alias is quite straight-forward:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;aliases&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Update your bookmarks to your latest rev.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tug&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bookmark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;move&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;--from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;heads(::@ &amp;amp; bookmarks())&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;--to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Preserve image scale with ImageMagick</title>
        <published>2025-12-30T00:00:00+00:00</published>
        <updated>2025-12-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/imagemagick-resize/"/>
        <id>https://jonalmeida.com/til/imagemagick-resize/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/imagemagick-resize/">&lt;p&gt;Resizing images with &lt;code&gt;imagemagick&lt;&#x2F;code&gt; is straightforward even if the tool comes off intimidating.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;magick&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; input.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 1024x&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;1024x&lt;&#x2F;code&gt; is a &quot;geometry&quot; argument that says, &quot;make the image 1024 pixels width for any height&quot;. This preserves the scale for the image without needing to compute it yourself.&lt;&#x2F;p&gt;
&lt;p&gt;You can also do the same for the height as well.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;magick&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; input.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; x768&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There are more details on the full geometry argument at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;imagemagick.org&#x2F;script&#x2F;command-line-processing.php#geometry&quot;&gt;the ImageMagick documentation site&lt;&#x2F;a&gt; (&lt;a rel=&quot;external&quot; title=&quot;Alternative ImageMagick link to API docs.&quot; href=&quot;https:&#x2F;&#x2F;imagemagick.org&#x2F;Magick++&#x2F;Geometry.html&quot;&gt;alternative link&lt;&#x2F;a&gt;).&lt;&#x2F;p&gt;
&lt;p&gt;If you want to perform this in bulk, there seems to be built-in wildcard support or wildcard shell handling for it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; magick&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.jpg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;resize&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; x768&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; image.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ls&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;picture.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;another.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;onemore.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;image-0.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;image-1.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;image-2.jpg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Editing YAML front matter in bulk</title>
        <published>2025-12-28T00:00:00+00:00</published>
        <updated>2025-12-30T17:04:53-05:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/yq-editing-frontmatter/"/>
        <id>https://jonalmeida.com/til/yq-editing-frontmatter/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/yq-editing-frontmatter/">&lt;p&gt;When you want to edit YAML front matter in bulk on markdown files or similar, the tool &lt;code&gt;yq&lt;&#x2F;code&gt; works for this with similar syntax to &lt;code&gt;jq&lt;&#x2F;code&gt; for JSON query&#x2F;transformation.&lt;&#x2F;p&gt;
&lt;p&gt;First, try out the queries without writing them to the files:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.md&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; yq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-front-matter=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;extract&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.taxonomies.categories[]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE] This pipes only the extracted YAML properties output to the terminal. Keep reading below for writing it to the file.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;To append to the categories with new entries:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.md&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; yq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-front-matter=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;extract&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.taxonomies.categories[] += &amp;quot;archive&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When we&#x27;re ready to write our changes to the file, we use &lt;code&gt;--front-matter=&quot;process&quot;&lt;&#x2F;code&gt; and the in-place flag &lt;code&gt;-I&lt;&#x2F;code&gt; (using the example above):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;find&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;*.md&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; yq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-front-matter=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;process&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.taxonomies.categories[] += &amp;quot;archive&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; \;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>A short visit to Sri Lanka</title>
        <published>2025-12-27T00:00:00+00:00</published>
        <updated>2025-12-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/sri-lanka/"/>
        <id>https://jonalmeida.com/blog/sri-lanka/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/sri-lanka/">&lt;p&gt;We travelled to Colombo, Sri Lanka for the first time this year and it felt like a lost opportunity that we didn&#x27;t do that more often when we lived closer in that region. It was a quick trip to explore but also catch up with friends who moved there years ago.&lt;&#x2F;p&gt;

&lt;div style=&quot;display: flex; flex-wrap: wrap; justify-content: center; gap: 8px;&quot;&gt;

  



    
    

    &lt;a href=&quot;image-0.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-0.cf2f50508881b5ac.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-1.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-1.3efd26bff0d3a564.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-2.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-2.e6c80041fe9b6d25.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-3.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-3.89b613f2b0d9e3df.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-4.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-4.da50fe91c95996e1.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;

    
    

    &lt;a href=&quot;image-5.jpg&quot; target=&quot;_blank&quot;&gt;
      &lt;img src=&quot;https:&amp;#x2F;&amp;#x2F;jonalmeida.com&amp;#x2F;processed_images&amp;#x2F;image-5.49699944974691ca.jpg&quot; &#x2F;&gt;
    &lt;&#x2F;a&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;Some notable observations:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;So much greenery! My inner pessimist expected a city of this size to have removed it all for urban growth, but I was happy it wasn&#x27;t so.&lt;&#x2F;li&gt;
&lt;li&gt;We noticed there was an organized service of people wearing green t-shirts that kept the city clean of fallen leaves and litter. Local shops also seemed conscious about keeping the areas around their stalls or shops proper.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Hidden technology&quot; is the term I use for modern software or hardware that is helpful for everyday people but not in your face constantly - the inverse example of that would be touchscreens on self-serve machines that make accessibility difficult (e.g. vending machines). Colombo appeared to have some of this going for it with apps for rickshaws or easy payment options everywhere.&lt;&#x2F;li&gt;
&lt;li&gt;Sri Lankans come off as kind people. We were frequently mistaken for locals (until we started speaking) so we probably didn&#x27;t get the tourist treatment all the time. I thought found it pleasant that there was some sense of religious equality there - you could find a Hindu temple, Muslim mosque, and a Catholic church all practically on the same street and everyone seemed to live happily together.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It was a short visit and of course not everything is peachy, but I prefer focusing on the positives and potentials. Sri Lanka felt like a dilapidated version of Japan in an affectionate way that has a more people-first approach to development.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>On marathon training</title>
        <published>2025-10-18T00:00:00+00:00</published>
        <updated>2025-10-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/marathons/"/>
        <id>https://jonalmeida.com/blog/marathons/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/marathons/">&lt;p&gt;Folks have asked me why I&#x27;ve been running marathons, and since tomorrow I will be running the Toronto Waterfront Marathon course for the first time, I thought I&#x27;d write it out here to remind myself.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I&#x27;m not a natural runner. I grew up playing football&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#1&quot;&gt;1&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; and shorter sprints were alright (with heaving between them), but I was never good at running anything more than 200 meters. I  simply don&#x27;t have the natural talent or endurance compared to other folks that I&#x27;ve run with who seem to have good form without trying, so it&#x27;s something that I have to work hard at to succeed. I guess that strikes a cord with me somehow.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;It helps me think: as part of your typical training, you have to do a &quot;long run&quot; which has a longer distance than the other runs during the week. This run gets incrementally longer every week until you reach a 30-34K point. They aren&#x27;t the type where you are sprinting, instead it&#x27;s one where you run at a pace that lets you carry out a casual conversation with someone next to you. During my long runs, I try to focus on my breathing and running form so that I can zone out on everything else. At the end of it I feel physically drained, but my mind seems clearer and quieter in some ways.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;During the race, you are running at your &quot;race pace&quot; - faster than what you would do during your long runs where you are pushing yourself to work on the limit of what you can sustain for the distance. Around the 30-32K is when the inner demons&#x2F;voices come out and tell you to stop. You are tired and the mind starts to play tricks on you. It lies to you, telling you the distance is too far, or to just take a break and you can start again&lt;sup class=&quot;footnote-reference&quot;&gt;&lt;a href=&quot;#2&quot;&gt;2&lt;&#x2F;a&gt;&lt;&#x2F;sup&gt; , or worse it starts telling you that you can&#x27;t do hard things. So the mental game of fighting them is a therapeutic one for me where it&#x27;s more a battle of the mind than body.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Training takes months and if you&#x27;re determined, it forces you to follow a routine which I don&#x27;t typically have. Making time for your weekly runs amongst your social or work life means evaluating where you can find that time. I hate waking up early in the morning, but that&#x27;s the best time to get a run in to finish it off before I need to really start my day, and this helps me avoid being lazy and doom-scrolling on my phone in bed.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I am healthier and mentally more refreshed after having gone out for even a short run. Getting myself out the door for a procrastinator like myself is a lot, but once I&#x27;m done I realize that I wasn&#x27;t that hard.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Typically, once a week you would do a hard session where you repeat intervals at fast paces, the kind you can keep up for a few hundred meters. These are obviously draining, but I feel stronger at the end of an interval session even though it&#x27;s brutal during it.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I didn&#x27;t know I could enjoy it. I always had various aches and pains after football games or random runs when growing up. Now, I no longer recall how I got into this state, but around  years ago standing on my feet for too long would cause me knee pains on my left leg. A 3K run would leave me bedridden for the next day.&lt;&#x2F;p&gt;
&lt;p&gt;I was referred to a physio who told me that I was walking with a limp without realizing it, so before I could run I had to learn to walk (ha!). I followed their advice for many weeks and after growing muscles that I wasn&#x27;t properly using before, I started to go on incrementally longer runs in my neighbourhood and realized that my body didn&#x27;t hurt at the end of them.&lt;&#x2F;p&gt;
&lt;p&gt;I was still bad at nutrition mind you, forgetting to eat and hydrate before, but I felt good after it, which was new to me.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;When I train, motivation during the intervals or the long runs are hard to come by for me. After every run, I keep notes about how the run went, what I learnt along the way and what I did to prepare in advance for it. I keep these notes public within my small social circle to try to social engineer myself to believing people are reading it (like this blog!) and expect to see it.
Additionally, I like to write down what does or doesn&#x27;t work because maybe someone else might want to read and learn from it. Everyone&#x27;s running journey is different, but little hints along the way could help.
I also want to show that there aren&#x27;t only good (run) days - I get frustrated and upset at myself because I didn&#x27;t eat well the night before, stretch before the run, or even forget to take enough water for the distance. It should be normal to see failure along the way, and not just share only the victories in public. It&#x27;s the bad days that make the good ones matter.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Finally, it gives me a sense of accomplishment with an achievable goal that comes with a deadline. It takes months to train for the race where you have a 3-4 month period where you need to run about 4-5 times a week and try to get in 60+km in there. The race ends up feeling like a victory lap of all that effort.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;br&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;1&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;1&lt;&#x2F;sup&gt;
&lt;p&gt;Soccer.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;div class=&quot;footnote-definition&quot; id=&quot;2&quot;&gt;&lt;sup class=&quot;footnote-definition-label&quot;&gt;2&lt;&#x2F;sup&gt;
&lt;p&gt;Don&#x27;t! Once you stop, the voices start to win and you end up stopping again and again. Unless of course you really are in pain from your physical body. Over time you, maybe during your first couple of races or even your long runs you learn to know the signs of what are really physical pain and which ones are the mental ones.&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rebase all WIPs to the latest upstream head</title>
        <published>2025-10-07T00:00:00+00:00</published>
        <updated>2026-04-28T14:00:00-04:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/jj-rebase-all/"/>
        <id>https://jonalmeida.com/til/jj-rebase-all/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/jj-rebase-all/">&lt;p&gt;A small pet-peeve with fetching the latest main on jujutsu is that I like to move all my WIP patches to the new one. That&#x27;s also nice because jj doesn&#x27;t make me fix the conflicts immediately!&lt;&#x2F;p&gt;
&lt;p&gt;The solution from a co-worker (kudos to skippyhammond!) is to query all immediate decendants of the &lt;em&gt;previous&lt;&#x2F;em&gt; main after the fetch.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; assuming &amp;#39;z&amp;#39; is the rev-id of the previous main.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rebase&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;mutable()&amp;amp;z+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;del&gt;I haven&#x27;t learnt how to make aliases accept params with it yet, so this will have to do for now.&lt;&#x2F;del&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;&#x2F;strong&gt;: After a bit of searching, it seems that today this is only possible by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&#x2F;discussions&#x2F;7129#discussioncomment-13933358&quot;&gt;wrapping it in a shell script&lt;&#x2F;a&gt;. Based on the examples in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.jj-vcs.dev&#x2F;latest&#x2F;config&#x2F;#aliases&quot;&gt;the jj documentation&lt;&#x2F;a&gt; an alias would look like this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Update 2&lt;&#x2F;strong&gt;: After some months of usage across multiple repositories, I&#x27;ve found it better to be clear with the destination since &lt;code&gt;main&lt;&#x2F;code&gt;, &lt;code&gt;trunk&lt;&#x2F;code&gt; or others can be tracked with a combination of repository aliases too.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;aliases&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Update all revs to the latest main; point to the previous one.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;hoist&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;util&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;--&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bash&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;set -euo pipefail&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;jj rebase -s &amp;quot;mutable()&amp;amp;$1+&amp;quot; -d &amp;quot;$2&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can use this to rebase all your WIPs like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hoist&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;prev_mai&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;current_mai&lt;&#x2F;span&gt;&lt;span&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If my previous &lt;code&gt;main&lt;&#x2F;code&gt; revision was &lt;code&gt;kz&lt;&#x2F;code&gt;, this is what I would end up doing:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jj&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hoist&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; kz&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; main@origin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Restarting this blog &amp; migrating to Zola</title>
        <published>2025-10-05T00:00:00+00:00</published>
        <updated>2025-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/migrating-to-zola/"/>
        <id>https://jonalmeida.com/blog/migrating-to-zola/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/migrating-to-zola/">&lt;p&gt;I did it - finally restarted this blog! 🙌&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why&quot;&gt;Why&lt;&#x2F;h2&gt;
&lt;p&gt;I&#x27;ll keep this short - there are others who are more expressive and have &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simeon.staneks.de&#x2F;en&#x2F;posts&#x2F;zola-the-holy-grail-of-ssg&#x2F;&quot;&gt;shared&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;daudix.one&#x2F;blog&#x2F;zola-vs-jekyll&#x2F;&quot;&gt;their&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.kytta.dev&#x2F;blog&#x2F;one-week-with-zola&#x2F;&quot;&gt;opinion&lt;&#x2F;a&gt; on everything Zola does for them - go read those instead. Here is the shortform for me.&lt;&#x2F;p&gt;
&lt;p&gt;I found it tedious to maintain a Jekyll site and the various plugins that you needed for what I believe should be the built-in behaviour.&lt;&#x2F;p&gt;
&lt;p&gt;On every new machine I used, I found myself using a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BretFisher&#x2F;jekyll-serve&quot;&gt;Docker image&lt;&#x2F;a&gt; for building the Jekyll site locally so I could get the magic combination correct to have it always working, until it eventually didn&#x27;t work anymore.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;preserving-hard-links&quot;&gt;Preserving hard-links&lt;&#x2F;h2&gt;
&lt;p&gt;I started with trying to look out for a way to migrate my existing Jekyll posts while also preserving the hard-links to them. I came across &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;eugene-babichenko.github.io&#x2F;blog&#x2F;jekyll-to-zola&#x2F;&quot;&gt;Eugene Baichenko&#x27;s writings and script&lt;&#x2F;a&gt; which I used and got myself up and running in no time.&lt;&#x2F;p&gt;
&lt;p&gt;After some more research, I learnt that Zola supports &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.getzola.org&#x2F;documentation&#x2F;content&#x2F;page&#x2F;&quot;&gt;&lt;code&gt;aliases&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; which lets you preserve your hard-links without needing to build the directory structure required to keep those links. Those links just redirect to the new Zola ones, which was good enough for my needs.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;preserving-page-highlighting&quot;&gt;Preserving page highlighting&lt;&#x2F;h2&gt;
&lt;p&gt;Zola happily seems to support YAML as a frontmatter, so for legacy posts, I didn&#x27;t need to update the format and instead just include the new properties where needed (e.g. disabling table of contents on certain posts). Along the way, I also learnt that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;quickref.me&#x2F;yaml.html&quot;&gt;YAML supports references and inheritance&lt;&#x2F;a&gt; - wild stuff.&lt;&#x2F;p&gt;
&lt;p&gt;Existing syntax highlighting is also preserved and at most, I needed to update the language shortcodes to match Zola&#x27;s (e.g. &lt;code&gt;objc&lt;&#x2F;code&gt; to &lt;code&gt;m&lt;&#x2F;code&gt;). In miscellaneous posts I seemed to have used Liquid templating, but that too wasn&#x27;t hard to search-and-replace.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;incremental-migration-from-jekyll&quot;&gt;Incremental migration from Jekyll&lt;&#x2F;h2&gt;
&lt;p&gt;Doing the actual migration required slowly changing things over in my spare time. Starting off the blog in a sub-directory &lt;code&gt;&#x2F;jonalmeida&lt;&#x2F;code&gt; first to get everything working there. Finally, removing the existing blog from the root directory and moving the contents of &lt;code&gt;&#x2F;jonalmeida&lt;&#x2F;code&gt; into the root.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;final-thoughts&quot;&gt;Final thoughts&lt;&#x2F;h2&gt;
&lt;p&gt;It seems like most of the audience for Zola are coming from other Static Site Generators.&lt;&#x2F;p&gt;
&lt;p&gt;I haven&#x27;t found the Zola documentation to be spectacular so it took me a bit to understand what aliases were and how to use them - I came across &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;getzola&#x2F;zola&#x2F;issues&#x2F;86&quot;&gt;the original issue to support aliases&lt;&#x2F;a&gt; which linked to the Hugo docs that eventually told me what I needed to know.&lt;&#x2F;p&gt;
&lt;p&gt;In another case, I moved to Zola because I wanted separate feeds for each tag and I couldn&#x27;t figure out to get this to work even though I had already enabled it with this block:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;taxonomies&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;categories&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; feed&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; false&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;&#x2F;span&gt;&lt;span&gt;name&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;tags&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; feed&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; true&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This must be my own shortsightedness though, because it seems &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tilde.club&#x2F;~passthejoe&#x2F;zola&#x2F;blog&#x2F;zola-tag-category-feeds&#x2F;index.html&quot;&gt;obvious to others&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;m also not complaining too much since this is a community-driven project; happy to see it being used by sites like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;zola.discourse.group&#x2F;t&#x2F;allow-html-instead-of-md-for-pages-and-sections&#x2F;149&quot;&gt;Fastmail&lt;&#x2F;a&gt; too. All in all though, I&#x27;m quite happy with where I&#x27;ve gotten to and I find the Zola and Tera templating combination far less intimidating.&lt;&#x2F;p&gt;
&lt;p&gt;Let&#x27;s see where this takes me.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello, world!</title>
        <published>2025-10-05T00:00:00+00:00</published>
        <updated>2025-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/til/hello-world/"/>
        <id>https://jonalmeida.com/til/hello-world/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/til/hello-world/">&lt;p&gt;Like other blogs, this section is also inspired by Simon Willison’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;til&quot;&gt;til&lt;&#x2F;a&gt;. The desire is that small snippets of code or helper tools end up here as a record with relevant tags for future-me to be able to sort through.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Useful bookmark keywords for Firefox (mobile) development</title>
        <published>2021-10-15T00:00:00+00:00</published>
        <updated>2021-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/browser-keyboard-shortcuts-mozilla-mobile/"/>
        <id>https://jonalmeida.com/blog/browser-keyboard-shortcuts-mozilla-mobile/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/browser-keyboard-shortcuts-mozilla-mobile/">&lt;p&gt;Firefox has support for keyword search in the address bar, which is handy during development at Mozilla. There are often many sources of information to look through and being able to get to them efficiently will save you &lt;em&gt;a lot&lt;&#x2F;em&gt; of time.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;support.mozilla.org&#x2F;en-US&#x2F;kb&#x2F;how-search-from-address-bar&quot;&gt;support documentation&lt;&#x2F;a&gt; has excellent examples of how this works, but here is a simple annotated image of what it does:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20211015&#x2F;keywords.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Below are a list of keyword shortcuts I use on a daily basis. Many of them are related to mobile development, but there are other userful ones too. You can manually copy over to your bookmark manager the ones that might seem useful.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;search-fox&quot;&gt;Search Fox&lt;&#x2F;h1&gt;
&lt;p&gt;Search Fox is another internal tool at Mozilla for code indexes across all of mozilla-central and particular it&#x27;s branches, mozilla-mobile, rust and many others. Search Fox is a go because of how fast it is and with symbolic references to JS&#x2F;Rust&#x2F;C++, you can navigate quite easily around the place. There are a few keywords that I&#x27;d recommend here.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;sf - regular indexes of mozilla-central.&lt;&#x2F;li&gt;
&lt;li&gt;sfm - search through mozilla-mobile repositories (this includes application-services too).&lt;&#x2F;li&gt;
&lt;li&gt;sff - search through the 68 release branch code. This is particularly useful for mobile because it&#x27;s the last release of Fennec (old Firefox Mobile) if you want to compare implementations.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Searchfox - mozilla-central&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: sf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;searchfox.org&#x2F;mozilla-central&#x2F;search?path=&amp;amp;q=%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Searchfox - mozilla-mobile (Mobile)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: sfm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;searchfox.org&#x2F;mozilla-mobile&#x2F;search?path=&amp;amp;q=%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Searchfox - Fennec - mozsearch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: sff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: http:&#x2F;&#x2F;searchfox.org&#x2F;mozilla-esr68&#x2F;search?q=%s&amp;amp;path=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;mercurial&quot;&gt;Mercurial&lt;&#x2F;h1&gt;
&lt;p&gt;Sometimes you want to look up a diff from a changeset in your browser.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Search mozilla-central with revision (changeset) ID&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: diff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;hg.mozilla.org&#x2F;mozilla-central&#x2F;rev&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;github&quot;&gt;Github&lt;&#x2F;h1&gt;
&lt;p&gt;Many of our mobile projects are on Github so having quick access to an issue or pull request is great. We currently work on Android Components, Fenix and Focus a lot, so these keywords let me get to an issue or pull request directly. For example, &lt;code&gt;aci 10000&lt;&#x2F;code&gt; for navigating to the 10,000 issue in Android Components.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Github - Android Components - Issues&#x2F;Pull Requests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: aci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;github.com&#x2F;mozilla-mobile&#x2F;android-components&#x2F;issues&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Github - Fenix - Issues&#x2F;Pull Requests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: fbi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;github.com&#x2F;mozilla-mobile&#x2F;fenix&#x2F;issues&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Github - Focus - Issues&#x2F;Pull Requests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: fci&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;github.com&#x2F;mozilla-mobile&#x2F;focus-android&#x2F;issues&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;taskcluster&quot;&gt;Taskcluster&lt;&#x2F;h1&gt;
&lt;p&gt;Taskcluster is our internal CI build system. When a build fails or when you want to wait for a build, you can grab the ID from a pull request or release.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: FirefoxCI - Navigate to a task item (Task ID)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: ti&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;firefox-ci-tc.services.mozilla.com&#x2F;tasks&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: FirefoxCI - Navigate to a task group (Group ID)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: gi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;firefox-ci-tc.services.mozilla.com&#x2F;tasks&#x2F;groups&#x2F;%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;android-chromium&quot;&gt;Android &#x2F; Chromium&lt;&#x2F;h1&gt;
&lt;p&gt;It&#x27;s common to want source references to Android sources or compare Chromium implementations as well.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Chromium Android - Code Search (Chromium Reference)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: cr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;cs.chromium.org&#x2F;search&#x2F;?q=%s&amp;amp;sq=package:chromium&amp;amp;type=cs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Name: Android Source References&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Keyword: ar&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;URL: https:&#x2F;&#x2F;cs.android.com&#x2F;search?q=%s&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How I manage my github notifications with Gmail</title>
        <published>2021-10-14T00:00:00+00:00</published>
        <updated>2021-10-14T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/github-notifications-mozilla-mobile/"/>
        <id>https://jonalmeida.com/blog/github-notifications-mozilla-mobile/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/github-notifications-mozilla-mobile/">&lt;p&gt;A lot of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mozilla-mobile&#x2F;&quot;&gt;Mozilla mobile&lt;&#x2F;a&gt; product development is now hosted on Github, which is what many of our contributors prefer as a platform too. This leads to a lot of noise from Github&#x27;s notification system and I&#x27;ve had some troubles managing it over the years.&lt;&#x2F;p&gt;
&lt;p&gt;As a follow-up to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;blog.margaretleibovic.com&#x2F;2012&#x2F;09&#x2F;21&#x2F;how-i-manage-my-bugmail-with-gmail.html&quot;&gt;how you can manage bugmail with gmail&lt;&#x2F;a&gt;, I found a similar way to manage my most important Github notifications via Gmail:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20211014&#x2F;gmail-sidebar.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;You can apply the same filters with the rules below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: from:(notifications@github.com)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Skip Inbox, Apply label &amp;quot;GitHub&amp;quot;, Categorize as Forums&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: to:(author@noreply.github.com)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Apply label &amp;quot;GitHub&#x2F;Author&amp;quot;, Mark it as important&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: cc:comment@noreply.github.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Skip Inbox, Apply label &amp;quot;GitHub&#x2F;Comments&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: to:(mention@noreply.github.com)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Skip Inbox, Apply label &amp;quot;GitHub&#x2F;Mentions&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: to:(review_requested@noreply.github.com) &amp;quot;requested your review&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Apply label &amp;quot;GitHub&#x2F;Review Requested&amp;quot;, Mark it as important&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Matches: to:(review_requested@noreply.github.com)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Do this: Apply label &amp;quot;GitHub&#x2F;Reviews&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The filters above are sorted in the same order as the screenshot if you&#x27;d like to only use a select few.&lt;&#x2F;p&gt;
&lt;p&gt;If you&#x27;re feeling ambitious, you can &lt;a href=&quot;&#x2F;images&#x2F;20211014&#x2F;mailFilters.xml&quot;&gt;download the filters&lt;&#x2F;a&gt; in the appropriate XML format for Gmail so that you can import them for your account. This is probably not advisable because I&#x27;m someone on the internet that you probably do not know. :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Learning Erlang as a seasoned developer</title>
        <published>2018-05-01T00:00:00+00:00</published>
        <updated>2018-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/erlang/"/>
        <id>https://jonalmeida.com/blog/erlang/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/erlang/">&lt;blockquote&gt;
&lt;p&gt;I wrote this a while back in November 2017 while learning Erlang even earlier in February, but I’ve finally got around to posting it. It may contain some outdated information.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This is long overdue on my experiences learning Erlang. It was also my first introduction to functional programming. I’ve written this as an experienced developer learning new concepts so there are probably many implicit assumptions made.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-learn-erlang&quot;&gt;Why learn Erlang?&lt;&#x2F;h1&gt;
&lt;p&gt;I had been meaning to learn a functional language after a long time of interest. In a way, I probably felt that I was letting myself down by not challenging myself enough; a fear of fear.
Browsing Hacker News I came across a comment that mentioned a class to learn Erlang that was starting soon on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.futurelearn.com&#x2F;&quot;&gt;Future Learn&lt;&#x2F;a&gt;. Thankfully it wasn’t one of those 7 month long courses, taking three-fourth of your focus from daily life and expect you remember what you did the previous week when you can’t even remember where you left your socks the previous day. A meagre 3 weeks seemed like a perfect length for me to plow through.&lt;&#x2F;p&gt;
&lt;p&gt;For some background, I’ve come from a fair experience dabbling in C++, Python &amp;amp; Rust in my university years, and now a career in Android development. This made me feel confident in my knowledge on imperative programming to learn something new.&lt;&#x2F;p&gt;
&lt;p&gt;Erlang’s background also intrigued me. I’ve found sanity in learning languages that have stood the test of time and still remained relevant. Being the language of choice for what built WhatsApp was an additional plus - a small team able to scale to such a size of users sparked interest in a side of me that once cared deeply about distributed systems.&lt;&#x2F;p&gt;
&lt;p&gt;It must be said that Simon Thompson, Professor of Logic and Computation in Computing at the University of Kent, did an exceptional job of breaking down the classes to the right amount for more intermediate students. What previously bored me about other MOOCs were their need to assume everyone was coming from a beginner level, losing interest in their more experienced users because of slow momentum. I was happy to see Simon skip over unnecessary explanations with fair assumptions on student’s prior knowledge.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-i-liked-in-erlang&quot;&gt;What I liked in Erlang&lt;&#x2F;h1&gt;
&lt;p&gt;Immutable bindings and immutable data structures felt like a hinderance to my brain at first, similar to having a thought and not being able to change it. The first week was a bit painful for me to unlearn a lot of concepts I didn’t realise I had implicitly relied on and grew to love. Eventually this made sense.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tail-recursion&quot;&gt;Tail Recursion&lt;&#x2F;h2&gt;
&lt;p&gt;It was the first thing I remember clicking in my head that felt like I had unlocked a side of my brain I never knew existed, constantly walking past it, assuming it was just a wall. I can’t tell how how refreshing it felt that all parties in a function were always known then-and-there in the arity itself.&lt;&#x2F;p&gt;
&lt;p&gt;To explain in a little detail, Erlang is a language where everything is immutable and for-loops do not exist. The only way to loop is through a combination of recursive calls and function argument pattern matching.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;erlang&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is your usual naive example of writing a Fibonacci sequence that &lt;strong&gt;will&lt;&#x2F;strong&gt; add to the call stack. We can do better by approaching the problem similar to how one would when writing a memoized version, from 0 to N, but in the Erlang case we can store the previous two Fibonacci values in the function argument itself, so that there is on state left behind. Not having a recursive call take up space on the call stack didn’t take long to understand when the rest sunk in. Instead,  it pushes that said state, into the argument of the next call, allowing the VM to reuse the same function but with new inputs (the second call). This is how I understood tail recursion.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;erlang&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; when&lt;&#x2F;span&gt;&lt;span&gt; N&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; The tail recursive implementation is below. The above is just a cleaner API.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span&gt;B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    B&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span&gt;A&lt;&#x2F;span&gt;&lt;span&gt;, &lt;&#x2F;span&gt;&lt;span&gt;B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    fib&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; B&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span&gt;B&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What we’re doing here is counting upwards from &lt;code&gt;fib(1)&lt;&#x2F;code&gt; and &lt;code&gt;fib(0)&lt;&#x2F;code&gt;, putting the  values of the previous two calls in the last two arguments of &lt;code&gt;fib&#x2F;3&lt;&#x2F;code&gt; and reducing  &lt;code&gt;N&lt;&#x2F;code&gt; until we reach 0. When we do, we know what the Fibonacci of that number is.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pattern-matching-unpacking&quot;&gt;Pattern Matching &amp;amp; Unpacking&lt;&#x2F;h2&gt;
&lt;p&gt;It’s better to explain both of these two together given how well they compliment each other.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve worked on Rust for a bit prior with some smaller projects using pattern matching, but I didn’t find the language (or maybe the documentation material?) enough for me to have the same “ah-ha” moment that I did have with Erlang.&lt;&#x2F;p&gt;
&lt;p&gt;In most other languages, pattern matching stops at a “case” or “switch” level. Consider an argument or return value and match it against all possible combinations that you would like to handle. With Erlang, pattern matching existed at the function level, where you could call a function by the arguments or argument structure it had. To better explain what I’m probably failing to say..&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;erlang&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  zero&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;N&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  N&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If &lt;code&gt;f(0)&lt;&#x2F;code&gt; is called, it returns the atom &lt;code&gt;zero&lt;&#x2F;code&gt; otherwise, anything else is returned back; a fairly trivial example.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; I failed to originally explain that an atom is another data type that exists in Erlang. It doesn’t hold data, but is mostly used as an identifier for your data.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;erlang&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;zero&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; A&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  zero&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;span&gt;X&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Y&lt;&#x2F;span&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Y&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here, we’re going one step further. We match the function &lt;code&gt;f&lt;&#x2F;code&gt; against a tuple of two values. More over, the first pattern match is looking for the first argument to be the atom &lt;code&gt;zero&lt;&#x2F;code&gt;.
Take a minute to consider what we’ve just done. We checked to see we were given a non-empty tuple, a tuple with two values, a tuple with the first argument an atom, and held the second argument in a variable &lt;code&gt;A&lt;&#x2F;code&gt;.  Consider doing this in a different language where you would have to explicitly check each and every case before we were able to get to our actual logic (* &lt;em&gt;cough&lt;&#x2F;em&gt;Java 6 &lt;em&gt;cough&lt;&#x2F;em&gt; *).&lt;&#x2F;p&gt;
&lt;p&gt;This becomes even more powerful with Erlang’s list accessors for the head, tail and equality testing.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;erlang&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;List&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;3&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;hd&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;List&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;   %&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tl&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;List&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;   %&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; [2,3]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; If we wanted to match these into separate bindings in a more elegant way..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;A&lt;&#x2F;span&gt;&lt;span&gt;|&lt;&#x2F;span&gt;&lt;span&gt;B&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; List&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A&lt;&#x2F;span&gt;&lt;span&gt;.   &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;B&lt;&#x2F;span&gt;&lt;span&gt;.   &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; [2,3]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We just did something quite amazing that I’m certain I’ll fail to properly convey: a list can be defined as a head on the left of the vertical bar; the tail to the right. With the equality to the &lt;code&gt;List&lt;&#x2F;code&gt;, we’ve said that the bindings of &lt;code&gt;A&lt;&#x2F;code&gt; and &lt;code&gt;B&lt;&#x2F;code&gt; should satisfy that of &lt;code&gt;List&lt;&#x2F;code&gt;. What would happen is that if &lt;code&gt;A&lt;&#x2F;code&gt; and &lt;code&gt;B&lt;&#x2F;code&gt; were already bound, their values should be that of what is in &lt;code&gt;List&lt;&#x2F;code&gt;, if they were not bound, they will now have that binding. If that were to fail, it would throw an exception.&lt;&#x2F;p&gt;
&lt;p&gt;If that made sense to you, feel free to sit back and feel those quarks materialise in a Higgs-Boson field. &lt;em&gt;Sorry, I won’t do this again..&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; “guards” should also be given some merit to where we can also make assertions.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;message-passing-and-processes&quot;&gt;Message Passing and Processes&lt;&#x2F;h2&gt;
&lt;p&gt;My instinctual thoughts when I learnt that Erlang’s RPC methods were about asynchronous handing and overhead but I didn’t have to worry about it. Erlang threads, from what I understand, are some what similar to green threads with various scheduling differences that are beyond me. Spawning process as I pleased was also foreign to me, being able to send messages to it and have them do what ever I wanted felt too easy - it felt wrong coming from an Android world. I still struggle to get myself to use processes to do things in the background, but I suspect it’ll eventually becoming second nature.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;otp&quot;&gt;OTP&lt;&#x2F;h2&gt;
&lt;p&gt;Sadly, I have even less to say about OTP given my limited knowledge of it. I would really like to have another course that would focus more on it. That said, learning some of the basics of &lt;code&gt;gen_server&lt;&#x2F;code&gt; and playing with &lt;code&gt;gen_tcp&lt;&#x2F;code&gt; have shown me how brilliant it is to avoid writing a lot of boilerplate code Erlang code (even though it’s already a lot less than you would usually have to write in other languages).&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-i-didn-t-like&quot;&gt;What I didn’t like&lt;&#x2F;h1&gt;
&lt;p&gt;From what I understand, some of the later additions to the language were patched on without a more elegant solution compared to the rest of the language. Try&#x2F;catch blocks seemed like a strange addition to have where we have better ways or error checking already. Records too were a necessity but also fell short - more like an afterthought.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-s-next&quot;&gt;What&#x27;s Next&lt;&#x2F;h1&gt;
&lt;p&gt;My hopes are to learn more from OTP. After which, I’d like to see what Elixir has to offer, although I’ve grown quite fond of the world of Erlang.&lt;&#x2F;p&gt;
&lt;p&gt;I spent some time after the courses to implement a rudimentary &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;ws&#x2F;&quot;&gt;WebSocket library&lt;&#x2F;a&gt; in an effort to see what I could put into practice and what sunk in long term.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Reading and writing using the new Rust IO library</title>
        <published>2015-03-03T00:00:00+00:00</published>
        <updated>2015-03-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/rust-new-io/"/>
        <id>https://jonalmeida.com/blog/rust-new-io/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/rust-new-io/">&lt;p&gt;When the re-write of the &lt;code&gt;std::io&lt;&#x2F;code&gt; module landed in Rust &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;blog.rust-lang.org&#x2F;2015&#x2F;02&#x2F;20&#x2F;Rust-1.0-alpha2.html&quot;&gt;1.0.0-alpha.2&lt;&#x2F;a&gt;, there were a lot of changes to the way you read&#x2F;write to a file. I&#x27;ll cover some simple examples and probably make edits in the future to add more fancy stuff.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;&#x2F;strong&gt; At the time of writing this, &lt;code&gt;std::io&lt;&#x2F;code&gt; is still a work in progress! I&#x27;m also currently learning this new library as I go along, so there may be errors on my behalf as well!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h1 id=&quot;reading-from-a-file&quot;&gt;Reading from a file&lt;&#x2F;h1&gt;
&lt;p&gt;Reading to a file can be done in two ways (both really simple). I&#x27;ll talk about one way here and the second a little later.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; match&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; File&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;test_file.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;	Ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;	Err&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; panic!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;room&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;File::open&lt;&#x2F;code&gt; by default gives you &lt;code&gt;Read&lt;&#x2F;code&gt; permissons, so you can create a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;io&#x2F;struct.BufReader.html&quot;&gt;&lt;code&gt;BufReader&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; from that.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BufReader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; read_line takes reads a line and writes to a string, so we give it one.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; buffer_string&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;mut&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; String&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;read_line&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;buffer_string&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;We read a new line: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; buffer_string&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;writing-to-a-file&quot;&gt;Writing to a file&lt;&#x2F;h1&gt;
&lt;h3 id=&quot;permissons&quot;&gt;Permissons&lt;&#x2F;h3&gt;
&lt;p&gt;A simple example for writing to a file is to start by creating your &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;path&#x2F;index.html&quot;&gt;&lt;code&gt;Path&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and an &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;fs&#x2F;struct.OpenOptions.html&quot;&gt;&lt;code&gt;OpenOptions&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. An &lt;code&gt;OpenOptions&lt;&#x2F;code&gt; is how you provide the file permissons and that you would need to read or write to a file appropriately.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; OpenOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; We want to write to our file as well as append new data to it.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can also add &lt;code&gt;.read(true)&lt;&#x2F;code&gt; for read permissions as an alternate way to read from the file. Although, the interesting part about &lt;code&gt;OpenOptions&lt;&#x2F;code&gt; is that you can re-use the options set for multiple files:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; We can create a Path&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;test_file.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; or we can also just use a string slice:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; path2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;test_file2.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; We create file options to write&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; OpenOptions&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;write&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Both of these should be valid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;File&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; file2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Result&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;File&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Error&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;path2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;the-actual-writing-bit&quot;&gt;The actual writing bit&lt;&#x2F;h3&gt;
&lt;p&gt;So now that we have the permissons setup correctly, we can create a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;io&#x2F;struct.BufWriter.html&quot;&gt;&lt;code&gt;BufWriter&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; to actually write to the file. I&#x27;ve added a match statement to unwrap the unlike the previous snippet:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; match&lt;&#x2F;span&gt;&lt;span&gt; options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;open&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;path&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    Ok&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; file&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    Err&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;..&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; panic!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;at the Disco&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; We create a buffered writer from the file we get&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; writer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BufWriter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;file&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Then we write to the file. write_all() calls flush() after the write as well.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;writer&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;write_all&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h1 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h1&gt;
&lt;p&gt;In my examples, I&#x27;ve used separate buffers but you can use a &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.rust-lang.org&#x2F;std&#x2F;io&#x2F;struct.BufStream.html&quot;&gt;&lt;code&gt;BufStream&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as well to get all the same features combined.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Enabling print statements in Cargo tests</title>
        <published>2015-01-23T00:00:00+00:00</published>
        <updated>2015-01-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/print-cargo/"/>
        <id>https://jonalmeida.com/blog/print-cargo/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/print-cargo/">&lt;p&gt;When writing tests in Cargo, you sometimes need to debug failures and print statements are a great way to do that. When you run &lt;code&gt;cargo test&lt;&#x2F;code&gt; the output shows details about which tests pass or fail but filters out the stdout information.&lt;&#x2F;p&gt;
&lt;p&gt;The you can enable this by running tests with &lt;code&gt;-- --nocapture&lt;&#x2F;code&gt; like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-nocapture&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here is an example of what a test would look like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;test&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; new_linked_list&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    let&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; mut&lt;&#x2F;span&gt;&lt;span&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; super&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;LinkedList&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;String&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; super&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;LinkedList&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;first&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;to_string&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    println!&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Value added: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;head&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;unwrap&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;payload&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;When we run this with the &lt;code&gt;no capture&lt;&#x2F;code&gt; flag:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; target&#x2F;algorithms-43e2eed4b681635b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tests&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; datastructures::linkedlist::node_new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; added:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; first&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; datastructures::linkedlist::node_payload&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; datastructures::linkedlist::tests::new_linked_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; result:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; passed&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; failed&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ignored&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; measured&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Notice that the print statement is before the test passes (a false positive since I haven&#x27;t added an assertion), but it gets intertwined with our other tests which are running in parrallel. This can be annoying to see if you have a longer list of tests. We can remove that as well by only running the specific test that we want:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cargo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-nocapture&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; datastructures::linkedlist::tests::new_linked_list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;We then see:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;     Running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; target&#x2F;algorithms-43e2eed4b681635b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;running&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; added:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; first&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; datastructures::linkedlist::tests::new_linked_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ...&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; result:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ok.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; passed&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; failed&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ignored&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; measured&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 15 Notes</title>
        <published>2014-11-11T00:00:00+00:00</published>
        <updated>2014-11-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec15/"/>
        <id>https://jonalmeida.com/archive/htsas-lec15/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec15/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=uVhTvQXfibU&quot;&gt;fifteenth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-manage&quot;&gt;How to Manage&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;one-management-concept&quot;&gt;One Management Concept&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;When making a critical decision, you must understand how it will be interpreted from each person&#x27;s point of view and its impact on the union of the individual views (i.e. culture).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;demotions&quot;&gt;Demotions&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;as-a-founder-ceo&quot;&gt;As a founder&#x2F;CEO&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s tough to fire someone who has put in a big effort.&lt;&#x2F;li&gt;
&lt;li&gt;A demotion is a &quot;have your cake and eat it too&quot; scenario.
&lt;ul&gt;
&lt;li&gt;Win-win&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;No cultural backlash.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;as-an-executive&quot;&gt;As an executive&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;May not want the demotion, but it gives them an option.
&lt;ul&gt;
&lt;li&gt;It&#x27;s better than being fired.&lt;&#x2F;li&gt;
&lt;li&gt;Easier to explain to a new employer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Enables them to keep growing with the company even though they&#x27;re demoted.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;for-everyone-else&quot;&gt;For everyone else&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Does he keep his same equity package?&lt;&#x2F;li&gt;
&lt;li&gt;Is he going to work as hard being the guy who reports to that guy?&lt;&#x2F;li&gt;
&lt;li&gt;Do I have any respect for him now that he&#x27;s been demoted?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;raises&quot;&gt;Raises&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Excellent employee asks for a raise&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;as-a-founder-ceo-1&quot;&gt;As a founder&#x2F;CEO&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;You want to retain them.&lt;&#x2F;li&gt;
&lt;li&gt;They have done great work, so it&#x27;s &quot;fair&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;They will like you if you give them the raise and you want to be liked.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;other-employees&quot;&gt;Other employees&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Unfair that I didn&#x27;t get a raise.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;I did better work, so doubly unfair.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Maybe that means, you&#x27;re not evaluating people on their performance. You&#x27;re giving the raise to the first person that asks.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Maybe I should quit.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Cultural Conclusion:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Every employee has a fiduciary responsibility to heir family to ask for a raise all the time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;right-answer&quot;&gt;Right Answer&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;You have to be formal about the performance evaluation process.
&lt;ul&gt;
&lt;li&gt;You can&#x27;t say, we want it to be organic and a natural experience.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;All the right inputs.&lt;&#x2F;li&gt;
&lt;li&gt;Run as frequently as needed.&lt;&#x2F;li&gt;
&lt;li&gt;No raises outside of the process.
&lt;ul&gt;
&lt;li&gt;You can&#x27;t give raises when asked.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Makes the employees feel they are getting a fair chance.
&lt;ul&gt;
&lt;li&gt;They don&#x27;t have to play golf with you in order to get a raise.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;evaluating-a-sam-altman-blog-post&quot;&gt;Evaluating a Sam Altman blog post&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;&quot;&lt;&#x2F;strong&gt; &lt;em&gt;Most employees only have 90 days after they leave a job to exercise their options. Unfortunately, this requires money to cover the strike price and the tax bill due for the year of exercise (which is calculated on the difference between the strike and the current FMV). This is often more cash than an employee has, and so the employee often has to choose between walking away from vested options he or she can&#x27;t afford to exercise, or being locked into staying at the company. It&#x27;s a particularly bad situation when an employee gets terminated.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;This doesn&#x27;t seem fair. The best solution I have heard is from Adam D&#x27;Angelo at Quora. The idea is to grant options that are exercisable for 10 years from the grant date, which should cover nearly all cases (i.e. the company will probably either go public, get acquired, or die in that time frame, and so either the employee will have the liquidity to exercise or it won&#x27;t matter.) There are some tricky issues around this-for example, the options will automatically convert from ISOs to NSOs 3 months after employment terminates (if applicable) but it&#x27;s still far better than just losing the assets. I think this is a policy all startups should adopt.&lt;&#x2F;em&gt; &lt;strong&gt;&quot;&lt;&#x2F;strong&gt; -&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;blog.samaltman.com&#x2F;employee-equity&quot;&gt;sama&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Is Sam right?&lt;&#x2F;li&gt;
&lt;li&gt;How stock option package works in startups:
&lt;ul&gt;
&lt;li&gt;You get stock that vests over a period of time.&lt;&#x2F;li&gt;
&lt;li&gt;When you leave the company, you have 90 days to buy your stock options before it&#x27;s gone.&lt;&#x2F;li&gt;
&lt;li&gt;This has been a &quot;rule&quot; since the 80s.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;History:&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;your-perspective&quot;&gt;Your perspective&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Want to be fair.&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t want employees to stay who don&#x27;t want to be there, but feel handcuffed.&lt;&#x2F;li&gt;
&lt;li&gt;Want to reward people who stay.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;perspective-of-the-employee-who-leaves&quot;&gt;Perspective of the employee who leaves&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;I worked for my shares; I shouldn&#x27;t be prevented from getting them due to economics.&lt;&#x2F;li&gt;
&lt;li&gt;Did you tell me the truth when you hired me? If you didn&#x27;t, I&#x27;ll make sure that everyone knows that.&lt;&#x2F;li&gt;
&lt;li&gt;If I was fired, I just got screwed a second time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;perspective-of-the-employees-who-stays&quot;&gt;Perspective of the employees who stays&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Is it smarter for me to stay or leave?
&lt;ul&gt;
&lt;li&gt;Your employees know each other better, than they know you.&lt;&#x2F;li&gt;
&lt;li&gt;Should I have left too?&lt;&#x2F;li&gt;
&lt;li&gt;How does that compare to my deal?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Are my colleagues being treated fairly?&lt;&#x2F;li&gt;
&lt;li&gt;Does my loyalty matter?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;situation-analysis&quot;&gt;Situation Analysis&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Companies lose employees in Slicon Valley at around 10% per year.&lt;&#x2F;li&gt;
&lt;li&gt;SV companies dilute at 6-8% per year when they are private for employee group.&lt;&#x2F;li&gt;
&lt;li&gt;If an employee doesn&#x27;t exercise their stock during the exercise period, it goes back into the pool where it can be reissued to new or existing employees.&lt;&#x2F;li&gt;
&lt;li&gt;Losing all your stock is a big financial incentive to stay.&lt;&#x2F;li&gt;
&lt;li&gt;A 10 year option on a highly volatile security is quite valuable.&lt;&#x2F;li&gt;
&lt;li&gt;When the employee goes to the new company, she gets the new company stock plus the 10 year option.&lt;&#x2F;li&gt;
&lt;li&gt;The employee who stays gets the option only.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;two-alternative-cultural-statements&quot;&gt;Two Alternative Cultural Statements&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;We treat new employees with the utmost straight-forwardness and fairness and we will therefore give you 10 years to exercise your stock if you quit or are fired.&lt;&#x2F;li&gt;
&lt;li&gt;We&#x27;ll tell you up front: you are guaranteed to get your salary. For your stock to be meaningful, you must either:
&lt;ul&gt;
&lt;li&gt;Vest&lt;&#x2F;li&gt;
&lt;li&gt;Stay until we exit or have the cash to exercise&lt;&#x2F;li&gt;
&lt;li&gt;Make the company worth something (10% of nothing is nothing)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;We do this because we massively value those who see it through and will minimize the dilutive cost of those who leave.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;There should be more incentive to stay.&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;history-s-greatest-practitioner&quot;&gt;History&#x27;s greatest practitioner&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Toussaint_Louverture&quot;&gt;Touissaint L&#x27;Overture&lt;&#x2F;a&gt;
&lt;ul&gt;
&lt;li&gt;Born a slave&lt;&#x2F;li&gt;
&lt;li&gt;Most brutal form of African slavery (now known as Haiti)&lt;&#x2F;li&gt;
&lt;li&gt;Vision:
&lt;ul&gt;
&lt;li&gt;End slavery&lt;&#x2F;li&gt;
&lt;li&gt;Take control of Haiti&lt;&#x2F;li&gt;
&lt;li&gt;Make it a first class country&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;conquering-the-enemy&quot;&gt;Conquering the enemy&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Question: What do you do with the defeated leaders?&lt;&#x2F;li&gt;
&lt;li&gt;He had to take into consideration everyone&#x27;s POV:
&lt;ul&gt;
&lt;li&gt;His soldier&#x27;s&lt;&#x2F;li&gt;
&lt;li&gt;His enemy&#x27;s&lt;&#x2F;li&gt;
&lt;li&gt;The culture
&lt;ul&gt;
&lt;li&gt;What kind of country was he trying to build?&lt;&#x2F;li&gt;
&lt;li&gt;He didn&#x27;t allow his soldiers to rape or for them to cheat on their wives. He wanted to keep good culture among the army.&lt;&#x2F;li&gt;
&lt;li&gt;Famous for not pillaging.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;soldier-s-perspective&quot;&gt;Soldier&#x27;s Perspective&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Do we get to pillage? We like to pillage...&lt;&#x2F;li&gt;
&lt;li&gt;They were trying to kill us, let&#x27;s kill them.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;culture&quot;&gt;Culture&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Toussaint wanted a first-class culture.&lt;&#x2F;li&gt;
&lt;li&gt;He believed that Haitian culture was inferior to European culture and he believed that the slave culture was the most broken of them all.&lt;&#x2F;li&gt;
&lt;li&gt;Solution:
&lt;ul&gt;
&lt;li&gt;Make the enemy generals part of his army.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;what-do-you-do-with-the-slave-owners&quot;&gt;What do you do with the slave owners?&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;slaves&quot;&gt;Slaves&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Free us, we fought for this.&lt;&#x2F;li&gt;
&lt;li&gt;Kill those bastards!&lt;&#x2F;li&gt;
&lt;li&gt;Give us their land.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;toussaint&quot;&gt;Toussaint&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Economy is key to being a first world country and sugar is our top export by far, so productive plantations are critically important.&lt;&#x2F;li&gt;
&lt;li&gt;I was a slave and my army is mostly slaves.&lt;&#x2F;li&gt;
&lt;li&gt;None of us have the expertise to run sugar plantations.&lt;&#x2F;li&gt;
&lt;li&gt;We earned that land fair and square.&lt;&#x2F;li&gt;
&lt;li&gt;None of us have the business connections to trade sugar.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;slave-owners&quot;&gt;Slave Owners&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Our business cost structure is predicated on slave labour.&lt;&#x2F;li&gt;
&lt;li&gt;We paid a lot of money for those slaves up front.&lt;&#x2F;li&gt;
&lt;li&gt;We paid a lot of money for the land.&lt;&#x2F;li&gt;
&lt;li&gt;We have all the know how and business relationships, so you have to deal with us.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;solution&quot;&gt;Solution&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;End slavery.&lt;&#x2F;li&gt;
&lt;li&gt;Let slave owners keep their land.&lt;&#x2F;li&gt;
&lt;li&gt;Require plantation owners to pay salaries to workers.&lt;&#x2F;li&gt;
&lt;li&gt;Lower the taxes of the plantation owners, so that they could keep sugar business thriving.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;results&quot;&gt;Results:&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Only successful slave revolt in human history.&lt;&#x2F;li&gt;
&lt;li&gt;Let plantation owners keep their land.&lt;&#x2F;li&gt;
&lt;li&gt;Total defeat of Napoleon.&lt;&#x2F;li&gt;
&lt;li&gt;Booming economy + world-class culture.&lt;&#x2F;li&gt;
&lt;li&gt;Under Toussaint, Haiti had more export income than the USA.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s not your prespective or the perspective of the person that you are talking to at the moment that matters.&lt;&#x2F;li&gt;
&lt;li&gt;You must consider the people who are not in the room.&lt;&#x2F;li&gt;
&lt;li&gt;They are the company.&lt;&#x2F;li&gt;
&lt;li&gt;They are the culture.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;questions&quot;&gt;Questions&lt;&#x2F;h2&gt;
&lt;p&gt;Q. &lt;em&gt;If you&#x27;ve got to fire&#x2F;demote an exec, (i) how do you have the conversation, (ii) how do you explain it to everyone else?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Try to be honest.
&lt;ul&gt;
&lt;li&gt;Don&#x27;t project your anger (if you have any), onto them. It doesn&#x27;t help anyone.&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t be too mushy and treat it like a relationship.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The number one reason it didn&#x27;t work out is because you didn&#x27;t match the person with the job that you were looking for. You didn&#x27;t realize it then, but you did now.&lt;&#x2F;li&gt;
&lt;li&gt;Talking to the employees is difficult.&lt;&#x2F;li&gt;
&lt;li&gt;You can a person&#x27;s job if you have to take their job, &lt;strong&gt;but you don&#x27;t have to take their dignity&lt;&#x2F;strong&gt;.
&lt;ul&gt;
&lt;li&gt;What you say to the employees is what will eventually be their reputation that the employees see.&lt;&#x2F;li&gt;
&lt;li&gt;Employees won&#x27;t see it that you screwed up, but they will see it as they (the person leaving) screwed up. This is bad when they ask for references from the other employees.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Preserve their dignity.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How did you deal with all the stress?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;I used to be 6&#x27;4 and good looking. So clearly, not very well.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Have a really good spouse.&lt;&#x2F;li&gt;
&lt;li&gt;Keep focus on what you can do, and not what happened to you.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How did Toussaint get the French general&#x27;s to work for them?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;They were shocked that they were not going to be killed.&lt;&#x2F;li&gt;
&lt;li&gt;Ended up being more loyal to Toussaint than to the French army.&lt;&#x2F;li&gt;
&lt;li&gt;Borrowed that technique from Julius Caesar.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How do incorporate the same ideology with people who were previously against you, on to your side?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Show them there&#x27;s a better way.&lt;&#x2F;li&gt;
&lt;li&gt;You&#x27;re way of doing things just has to be just better to convince them.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How do you build a culture at Andreessen-Horowitz that is different from all other VCs?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A profesisonal CEO would bring in tons of people from a network who bought tech in big corporations to people in the press.&lt;&#x2F;li&gt;
&lt;li&gt;Build that network on your behalf at the firm.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Putting yourself in other people&#x27;s shoes is difficult in daily life. How can you do it management?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s difficult in daily life, even harder in management.&lt;&#x2F;li&gt;
&lt;li&gt;When you&#x27;re a leader, you want to feel like you have all the answers.&lt;&#x2F;li&gt;
&lt;li&gt;If something is important, you have to remember to pause and think it through.&lt;&#x2F;li&gt;
&lt;li&gt;Most CEOs learn this the hard way.&lt;&#x2F;li&gt;
&lt;li&gt;Impulse decisions can blow up your face later on. Safer to think it through.&lt;&#x2F;li&gt;
&lt;li&gt;The Kimchi Problem - &quot;The deeper you bury it, the hotter it gets.&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 14 Notes</title>
        <published>2014-11-06T00:00:00+00:00</published>
        <updated>2014-11-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec14/"/>
        <id>https://jonalmeida.com/archive/htsas-lec14/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec14/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=6fQHLK1aIBs&quot;&gt;fourteenth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-operate&quot;&gt;How to Operate&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Forging a company is harder than forging a product&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Building a company is taking all the irrational people you know, putting them in one building, and living with them for 12 hours a day at least.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Build a company that idiots can run because eventually they will&quot;&lt;&#x2F;em&gt; -Warren Buffett&lt;&#x2F;li&gt;
&lt;li&gt;As a leader (founder), what is your role?
&lt;ul&gt;
&lt;li&gt;Manage the maximum output of your organization AND the organizations around you.&lt;&#x2F;li&gt;
&lt;li&gt;In practice, you&#x27;re ordering smoothies, teaching your secretary to answer the phone correctly, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Everything will initially feel like a mess
&lt;ul&gt;
&lt;li&gt;Some things will go away (solve itself or isn&#x27;t really an issue), some things are fatal.&lt;&#x2F;li&gt;
&lt;li&gt;You need to triage them but you need to learn which is which.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;concept-of-editing&quot;&gt;Concept of Editing&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;A way to think about your job and transmit to your employees for them to know if they&#x27;re &quot;writing&quot; or &quot;editing&quot;&lt;&#x2F;li&gt;
&lt;li&gt;What does an editor do?
&lt;ol&gt;
&lt;li&gt;You start, by taking out a red pen and strike things off.
&lt;ul&gt;
&lt;li&gt;Your job is to clarify and simplify.&lt;&#x2F;li&gt;
&lt;li&gt;People might say, &quot;this is too challenging&quot;, &quot;this doesn&#x27;t work for me&quot;, etc.&lt;&#x2F;li&gt;
&lt;li&gt;This is wrong! Force yourself to simply everything you do!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Ask clarifying questions.
&lt;ul&gt;
&lt;li&gt;&quot;Did you mean this?&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Where is our competitive advantage here?&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Allocate resources
&lt;ul&gt;
&lt;li&gt;The goal is to use less red ink everyday.
&lt;ul&gt;
&lt;li&gt;It&#x27;s okay if you&#x27;re having a bad day, but your red ink should reduce every month&#x2F;quarter&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Ensure consistent voice
&lt;ul&gt;
&lt;li&gt;Not as intuitive to most people&lt;&#x2F;li&gt;
&lt;li&gt;Your PR release&#x2F;packaging&#x2F;recruiting page should all sound like it was written by one person.&lt;&#x2F;li&gt;
&lt;li&gt;Initially, you can do it all yourself. Over time, you want others to do this.&lt;&#x2F;li&gt;
&lt;li&gt;Almost every company has one piece that isn&#x27;t under the same voice.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Delegate
&lt;ul&gt;
&lt;li&gt;You shouldn&#x27;t be doing most of the work. The way to get out of doing the work is to delegate.&lt;&#x2F;li&gt;
&lt;li&gt;The problem: you&#x27;re actually responsible for everything.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Abdicate vs. Micromanagement&lt;&#x2F;strong&gt; requires you to use Task-Relevant Maturity
&lt;ul&gt;
&lt;li&gt;Any one executive&#x2F;CEO shouldn&#x27;t have one management style. Management style needs to be dictated by the employee.&lt;&#x2F;li&gt;
&lt;li&gt;Different people require varying amounts of management. Some require micro-management.&lt;&#x2F;li&gt;
&lt;li&gt;How do you make decisions? (Delegate vs. doing it yourself)&lt;&#x2F;li&gt;
&lt;li&gt;Delegate when you have a low confidence in your own opinion.
&lt;ul&gt;
&lt;li&gt;Let people make mistakes, so they can learn.&lt;&#x2F;li&gt;
&lt;li&gt;Letting your employees making mistakes teaches them the mistake, but it allows them to be excited about their job and how to filter their ideas.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If your conviction is high, you can&#x27;t let your employee make a mistake. (You&#x27;re ultimately responsible for that mistake).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;barrels-ammunition&quot;&gt;Barrels &amp;amp; Ammunition&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(Barrels referring to gun barrels)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Most great people in companies are &quot;ammunition&quot;&lt;&#x2F;li&gt;
&lt;li&gt;What you really need in your company are barrels
&lt;ul&gt;
&lt;li&gt;You can only shoot though the number of unique barrels you have&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Barrels are incredibly difficult to find
&lt;ul&gt;
&lt;li&gt;When you do, promote them, give them equity (Don&#x27;t lose them!)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;A barrel in one company is not always a barrel at another company&lt;&#x2F;li&gt;
&lt;li&gt;A barrel can take an idea from conception all the way to shipping and bring people to them&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;how-do-you-figure-out-who-is-a-barrel&quot;&gt;How do you figure out who is a barrel?&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Start by giving them very simple responsibilities&lt;&#x2F;li&gt;
&lt;li&gt;Keep expanding the scope of their responsibilities until they break&lt;&#x2F;li&gt;
&lt;li&gt;Everyone will break. Everyone has some level of complexity that they can handle&lt;&#x2F;li&gt;
&lt;li&gt;Some people will surprise you, so you have to keep testing the envelope to see what that point is for everyone&lt;&#x2F;li&gt;
&lt;li&gt;(!) Once you&#x27;ve hired someone, (in an open office) watch who goes up to other peoples desk. Particularly, people they don&#x27;t report to.
&lt;ul&gt;
&lt;li&gt;If people start going to people&#x27;s desk, it&#x27;s a sign that that person can help them&lt;&#x2F;li&gt;
&lt;li&gt;THESE ARE YOUR BARRELS!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;When do you hire somebody over somebody OR when do you replace someone?
&lt;ul&gt;
&lt;li&gt;You have to track the companies growth rate and the individuals growth rate to determine how much you can keep throwing at them. High velocity companies would probably need more hires instead.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;insist-on-focus&quot;&gt;Insist on Focus&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Peter Theil forced everyone to work on one thing and only one thing.&lt;&#x2F;li&gt;
&lt;li&gt;The idea is that if you have multiple things to work on, you&#x27;re more likely to solve B+ problems instead of A+ problems (which are more important to your company, but are much harder to solve).
&lt;ul&gt;
&lt;li&gt;Recommended workflow, but you can be less stringent though&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;metrics-transparency&quot;&gt;Metrics &amp;amp; Transparency&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;You can&#x27;t make every decision yourself&lt;&#x2F;li&gt;
&lt;li&gt;So you need to create tools that leverage people to make good decisions&lt;&#x2F;li&gt;
&lt;li&gt;Use dashboards. Draft out (as the founder) what your dashboard should look like
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;You&lt;&#x2F;em&gt; do this because it has to align to the company&#x27;s metrics for success&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Your key to success is: how many employees actually use that dashboard everyday
&lt;ul&gt;
&lt;li&gt;You want something close to 100%&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Very few people adhere to transparency within the company&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;transparency&quot;&gt;Transparency&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Take your board desk into daily meetings and review every slide with every employee
&lt;ul&gt;
&lt;li&gt;Use their feedback&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;As your company scales, not everyone is going to be able to go for every meeting but everyone will want to go for every meeting.
&lt;ul&gt;
&lt;li&gt;You scale by sending notes to everyone&lt;&#x2F;li&gt;
&lt;li&gt;Every conference room should have glass walls
&lt;ul&gt;
&lt;li&gt;When you have regular walls, people start to wonder what&#x27;s going on&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h4 id=&quot;minimal-viable-transparency-mvt&quot;&gt;Minimal Viable Transparency (MVT)&lt;&#x2F;h4&gt;
&lt;ul&gt;
&lt;li&gt;Tried by Steve Jobs at NeXT&lt;&#x2F;li&gt;
&lt;li&gt;Doesn&#x27;t work entirely well&lt;&#x2F;li&gt;
&lt;li&gt;Actual transparency seems to work more&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;metrics&quot;&gt;Metrics&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Gathering and simplifying information&lt;&#x2F;li&gt;
&lt;li&gt;Measure outputs, NOT inputs
&lt;ul&gt;
&lt;li&gt;Draft your dashboard to tie it all together&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Measure your false-positive rate&lt;&#x2F;li&gt;
&lt;li&gt;Track the quality of hires
&lt;ul&gt;
&lt;li&gt;Give metrics to recruiters&lt;&#x2F;li&gt;
&lt;li&gt;Helps you get better quality of hires as the quality of people coming in increases&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;details&quot;&gt;Details&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;If you get all the details right, you think about how to have a billion users&#x2F;how to get a billion dollars.
&lt;ul&gt;
&lt;li&gt;This is a byproduct&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If everyone does exactly what they&#x27;re supposed to do, the incremental outcome will be at the highest possible level&lt;&#x2F;li&gt;
&lt;li&gt;To a company, this translates to a lot of details that may not matter&lt;&#x2F;li&gt;
&lt;li&gt;What food do you serve people who work for you?
&lt;ul&gt;
&lt;li&gt;If you serve terrible food, people start to gossip and complain to their friends&lt;&#x2F;li&gt;
&lt;li&gt;This is time they could be using brainstorming instead&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The office environment that your company works in matters on your culture and how they make decisions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;effort&quot;&gt;Effort&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;You need to lead by example&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Do you know how to tell if you&#x27;re doing the job? If you&#x27;re up at 3 AM every night talking into a tape recorder and writing notes on scraps of paper, have a knot in your stomach and a rash on your skin, are losing sleep and losing touch with your wife and kids, have no appetite or sense of humour, and feel that everything might turn out wrong, then you&#x27;re probably doing the job.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;questions&quot;&gt;Questions&lt;&#x2F;h2&gt;
&lt;p&gt;Q. &lt;em&gt;How would to use transparency especially when people evaluate themselves on the salary that they get?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Either everyone in the company gets paid the same, or you could have it set by discipline (all engineers get paid the same), or by experience.&lt;&#x2F;p&gt;
&lt;p&gt;Steve Jobs at NeXT did it with bands (high or low). You were either highly experienced or low experience.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Besides food, what other details do people care about?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;For example, the laptops they use. 5 years ago, it was a &quot;benefit&quot; to give everyone a high quality laptop.&lt;&#x2F;li&gt;
&lt;li&gt;You want to give people the best possible tools to do the best possible job.&lt;&#x2F;li&gt;
&lt;li&gt;What things do they not need to be working on that are distracting, and what things can I give them to make them more valuable per day&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;When you&#x27;re in a startup, how do you optimize those things because resources are sparse.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You must have your own office.&lt;&#x2F;li&gt;
&lt;li&gt;(Keith) does not believe in shared office space.&lt;&#x2F;li&gt;
&lt;li&gt;Every good startup is a cult. A cult means that you&#x27;re better than others and you&#x27;re doing special things that others aren&#x27;t doing.&lt;&#x2F;li&gt;
&lt;li&gt;When you&#x27;re sharing places with others, it&#x27;s very hard to inculcate that.&lt;&#x2F;li&gt;
&lt;li&gt;This is a managing issue.
&lt;ul&gt;
&lt;li&gt;You need a good office space because it&#x27;s important for recruiting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;What is the best way to gain street cred when being a new manager?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You try to promote people who are already doing well in their position.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;No general manager&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Engineers can be promoted and have them learn to manage later.&lt;&#x2F;li&gt;
&lt;li&gt;Find a mentor who has been a manager before and get them to help you figure out how to manage your schedule
&lt;ul&gt;
&lt;li&gt;Not your boss - he already has a set of objectives that he needs you to focus on&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Can you give more examples on how to consistently have a consistent voice in the company?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Look at every piece of copy in every department
&lt;ul&gt;
&lt;li&gt;Look at your recruiting website&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Customer support
&lt;ul&gt;
&lt;li&gt;Treat it like a product&lt;&#x2F;li&gt;
&lt;li&gt;Have an engineering team and a design team for it in the end to get&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Can you talk about how you manage people, how do you give them roles on how to (???)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Seems canonical now, but you should have one-on-ones approx. every two weeks&lt;&#x2F;li&gt;
&lt;li&gt;You should also only have not more than 5 - 7 direct reports
&lt;ul&gt;
&lt;li&gt;This came from the idea that you can fit the number of one-on-ones into your calendar and still get other things done&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The agenda should be crafted by the employee, since the one-on-one is for the employee&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;When do you compromise and hire more ammunition instead of a barrel?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You&#x27;re going to hire more ammunition than barrels so that there&#x27;s a ratio between the two.&lt;&#x2F;li&gt;
&lt;li&gt;The real question is, what is that ratio?&lt;&#x2F;li&gt;
&lt;li&gt;You will be wasting resources if that ratio goes out of whack.&lt;&#x2F;li&gt;
&lt;li&gt;1:10 seems like the ideal&lt;&#x2F;li&gt;
&lt;li&gt;Tell barrels that &lt;code&gt;x&#x2F;y&lt;&#x2F;code&gt; is the grade they get on their performance review, where:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;&#x2F;code&gt; is the the number of successful things they&#x27;ve done&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;y&lt;&#x2F;code&gt; is the number of people on their team&lt;&#x2F;li&gt;
&lt;li&gt;The number of people that barrels what in their team goes down so that it averages out and creates less animosity between barrels&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;As a VC, how often do you meet with your companies?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Meet with the founders&#x2F;CEO every two weeks&lt;&#x2F;li&gt;
&lt;li&gt;Deals a lot with text message (some even snapchat)&lt;&#x2F;li&gt;
&lt;li&gt;Preferably an in-person meeting&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How do you harmonize when details matter and you&#x27;re only allowed one thing to do. How do you put those things together?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The underlying philosophy of getting the details right is important to install very early in the company.&lt;&#x2F;li&gt;
&lt;li&gt;This gets people to have this basis in their work.&lt;&#x2F;li&gt;
&lt;li&gt;You shouldn&#x27;t have to actually do this. If you have to, that means that you&#x27;ve done something wrong.&lt;&#x2F;li&gt;
&lt;li&gt;The key is how to start and get others to follow this rule. A framework for how to make decisions.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 13 Notes</title>
        <published>2014-11-04T00:00:00+00:00</published>
        <updated>2014-11-04T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec13/"/>
        <id>https://jonalmeida.com/archive/htsas-lec13/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec13/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=dQ7ZvO5DpIw&quot;&gt;thirteenth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-be-a-great-founder&quot;&gt;How to be a Great Founder&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;perception&quot;&gt;Perception&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Perception of a founder:
&lt;ul&gt;
&lt;li&gt;Elon Musk, Bill Gates, Steve Jobs, etc.&lt;&#x2F;li&gt;
&lt;li&gt;An image of Superman&#x2F;Superwoman&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Reality:
&lt;ul&gt;
&lt;li&gt;Someone who deals with a lot of problems&lt;&#x2F;li&gt;
&lt;li&gt;No one is generally &quot;superpowered&quot;&lt;&#x2F;li&gt;
&lt;li&gt;You want to have a couple of &quot;superpowers&quot;, something that gives you an edge&lt;&#x2F;li&gt;
&lt;li&gt;Although, this is not a function of genius&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s hard to tell the difference between genius&#x2F;madness&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Potential skills of a founder:
&lt;ul&gt;
&lt;li&gt;Founding Team&lt;&#x2F;li&gt;
&lt;li&gt;Location&lt;&#x2F;li&gt;
&lt;li&gt;Delegation&lt;&#x2F;li&gt;
&lt;li&gt;Flexibility&lt;&#x2F;li&gt;
&lt;li&gt;Vision&lt;&#x2F;li&gt;
&lt;li&gt;Focus&lt;&#x2F;li&gt;
&lt;li&gt;Confidence&lt;&#x2F;li&gt;
&lt;li&gt;Evaluation&lt;&#x2F;li&gt;
&lt;li&gt;Risk&lt;&#x2F;li&gt;
&lt;li&gt;Persistence&lt;&#x2F;li&gt;
&lt;li&gt;Data&lt;&#x2F;li&gt;
&lt;li&gt;Time Horizon&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;May seem like a super human task&lt;&#x2F;li&gt;
&lt;li&gt;You don&#x27;t necessarily want to score 10&#x2F;10 in all the skills of a founder&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;team&quot;&gt;Team&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s usually best to have two&#x2F;three people as the founders (broad set of skills to spread)&lt;&#x2F;li&gt;
&lt;li&gt;You can compensate with other founders weaknesses&lt;&#x2F;li&gt;
&lt;li&gt;Diversity of problems as a founder, you can go at them from different angles&lt;&#x2F;li&gt;
&lt;li&gt;Have a high degree of trust with those co-founders (see previous lectures for more detail)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;location&quot;&gt;Location&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;In order to be successful, I need to go where the strongest networks are where the particular kind of problem that I&#x27;m trying to solve.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Silicon Valley is good for software products (not for all though!)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;This is due to various off-topic reasons&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;e.g. Groupon needed massive numbers of sales forces. Silicon Valley is suboptimal for plans where you want to rent a 20 storey building full of sales people. Groupon was required to be in Chicago which is good at this.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;What kinds of startups would someone be an idiot to do in SV?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;e.g. Designing a fashion company. Great idea, but there isn&#x27;t a good network for it here!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Should I be a contrarian?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(A contrarian is a person who takes up a contrary position, a person who seems to be &quot;contrary for the sake of being contrary,&quot;)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Its hard to be contrarian and right.&lt;&#x2F;li&gt;
&lt;li&gt;How does a smart person actually disagree with me?&lt;&#x2F;li&gt;
&lt;li&gt;A really good contrarian idea: what would smart people (in that field) think is a good idea.&lt;&#x2F;li&gt;
&lt;li&gt;In general, as a founder, it&#x27;s good to be a contrarian.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;delegation&quot;&gt;Delegation&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I do the work or delegate the work?
&lt;ul&gt;
&lt;li&gt;In truth: both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Should I be recruiting people?&lt;&#x2F;li&gt;
&lt;li&gt;Sometimes one at 100% or the other at 100%&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;flexibility&quot;&gt;Flexibility&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I be flexible or persistent?
&lt;ul&gt;
&lt;li&gt;Again: both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;You get opinions from both ends of the spectrum on how to do this.&lt;&#x2F;li&gt;
&lt;li&gt;Have an investment thesis (possibly contrarian) on why you think is potentially a good idea.
&lt;ul&gt;
&lt;li&gt;Should include what you know that others don&#x27;t know&lt;&#x2F;li&gt;
&lt;li&gt;Do I have an increase in confidence or decreasing?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If increasing, stay on track, be persistent&lt;&#x2F;li&gt;
&lt;li&gt;If decreasing, you don&#x27;t have to necessarily jump out
&lt;ul&gt;
&lt;li&gt;What do we do to fix this? (flexibility)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;confident&quot;&gt;Confident&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I be confident or cautious?
&lt;ul&gt;
&lt;li&gt;Third time: both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;I have my vision of how the world should be &lt;strong&gt;BUT&lt;&#x2F;strong&gt; smart enough to listen to criticism, negative feedback, competitive entries.&lt;&#x2F;li&gt;
&lt;li&gt;Is this changing my investment thesis?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;internally&quot;&gt;Internally&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I focus internally or externally?
&lt;ul&gt;
&lt;li&gt;People in the back haven&#x27;t heard: both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Internally: Build the product, ignore the world, ignore competitors&lt;&#x2F;li&gt;
&lt;li&gt;Externally: Recruiting, meeting people, gathering network intelligence&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;vision-or-data&quot;&gt;Vision or Data&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I work by vision or data?
&lt;ul&gt;
&lt;li&gt;Both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Data: motivated by data, gather the data, be guided by the data&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Data&lt;&#x2F;em&gt; only exists within the framework of a &lt;em&gt;vision&lt;&#x2F;em&gt; you are building to&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;risk&quot;&gt;Risk&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I take risks or minimize risks?
&lt;ul&gt;
&lt;li&gt;Both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;You have to be a risk taker&lt;&#x2F;li&gt;
&lt;li&gt;One of the skillsets you need to build on is, how do I make intelligent risks
&lt;ul&gt;
&lt;li&gt;How do I minimize my other risks with this? (i.e. two birds with one stone)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;vision&quot;&gt;Vision&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Should I focus on the short term or long term?
&lt;ul&gt;
&lt;li&gt;Both&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Jump between the two&lt;&#x2F;li&gt;
&lt;li&gt;Solve the problem that&#x27;s immediately in front of you&lt;&#x2F;li&gt;
&lt;li&gt;Short term: What do I need to be doing today? Have I made progress today?
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BUT&lt;&#x2F;strong&gt;, is it largely on path?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-do-you-know-if-you-are-a-great-founder&quot;&gt;How do you know if you are a Great Founder?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You should have &lt;em&gt;some&lt;&#x2F;em&gt; superpowers&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Useful to be a product person (in software especially)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Useful to have leadership and persuading people&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Recognizing whether you&#x27;re on track or not (am I &lt;em&gt;STILL&lt;&#x2F;em&gt; on track with my thesis?)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There&#x27;s no one skillset&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There&#x27;s an ability to learn and adapt, and the ability to constantly have a vision that drives you, and take input from all sources and take networks from around you. (!)&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;questions&quot;&gt;Questions&lt;&#x2F;h2&gt;
&lt;p&gt;Q. &lt;em&gt;How did you stick with a strategy to get your investment thesis?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The problems in 2003 were different from what we have now. They (LinkedIn) sent out invitations to different people, and got PR to get people.&lt;&#x2F;li&gt;
&lt;li&gt;Now, how are you competing for potential customers?&lt;&#x2F;li&gt;
&lt;li&gt;What is the hack that I know that others don&#x27;t?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How do you know if someone is a good founder or not?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;I&#x27;m a believer of references&lt;&#x2F;li&gt;
&lt;li&gt;Only meet with people through a reference&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s a way to sort out time&lt;&#x2F;li&gt;
&lt;li&gt;Network is really key&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Density of insight is a strong signal for great founders. Being able to distil a thesis into a concise sentence.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The ability to be coherent on what you&#x27;re targetting.&lt;&#x2F;li&gt;
&lt;li&gt;NOT a Swiss army knife approach&lt;&#x2F;li&gt;
&lt;li&gt;Founders who have analyzed the problem in a good way&lt;&#x2F;li&gt;
&lt;li&gt;Founders who do not have a good analysis, but have an instinct on what they&#x27;re doing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;What kept you going with persistence (RE: LinkedIn)?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Believing the right economic system design was to have a public professional profile&lt;&#x2F;li&gt;
&lt;li&gt;It may not have taken off the speed that we want&lt;&#x2F;li&gt;
&lt;li&gt;It takes us longer to get there, but that&#x27;s okay&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;When you get a founder that you think is going to be good. What makes you get wrong about someone who looks good at first observation?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Conviction in the person when they&#x27;re trying to reason with you is what you look for in a founder&lt;&#x2F;li&gt;
&lt;li&gt;Sometimes you find people who have learned to mimic that behaviour. They look like they&#x27;re thinking about the challenges that you&#x27;re bringing up but they&#x27;re actually ignoring you.&lt;&#x2F;li&gt;
&lt;li&gt;Adaptability questions&lt;&#x2F;li&gt;
&lt;li&gt;Is there an ego issue that might get in the way&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Co-founding team, how to evaluate how to be co-founders?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Serious trust&lt;&#x2F;li&gt;
&lt;li&gt;People say don&#x27;t invest in a husband-wife team (since personal dynamics can affect)&lt;&#x2F;li&gt;
&lt;li&gt;You should ask: do they collaborate well? Do they help each other get to truth?&lt;&#x2F;li&gt;
&lt;li&gt;Adjusting to what is the truth (i.e. people who work off each other)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;Different founder, different areas. How do you identify them?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;This talk is about, what is unique to all founders as a whole (not specifically technology).&lt;&#x2F;li&gt;
&lt;li&gt;Investors try to understand a domain so they cam better invest in that domain.&lt;&#x2F;li&gt;
&lt;li&gt;Each domain has a set of attributes in that domain.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How do you know when to stay in longer than expected? Or when do you pivot?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The part of the reason of having an investment thesis (IT)&lt;&#x2F;li&gt;
&lt;li&gt;If your confidence in IT is decreasing for a very long time:
&lt;ul&gt;
&lt;li&gt;You&#x27;ve gone into intense mode to see what could do to increase confidence&lt;&#x2F;li&gt;
&lt;li&gt;When &lt;em&gt;THAT&lt;&#x2F;em&gt; starts failing, then you should consider pivoting.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;A frequent mistake: wait till everything has crashed into the wall. You waited way too long!&lt;&#x2F;li&gt;
&lt;li&gt;Founders have no balance
&lt;ul&gt;
&lt;li&gt;While you are working on this thing, you cannot remain balanced. It is 100% of you that goes into it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;(This isn&#x27;t forever, but maybe for a couple of years before you go off to do other things)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;How good is the startup eco-system in identifying contrarian opportunities?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Mixed.&lt;&#x2F;li&gt;
&lt;li&gt;Generally, the system is good at it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;What you do think about creating markets vs. covering them?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;What would lead you to believe what would be a market there or not?&lt;&#x2F;li&gt;
&lt;li&gt;What is it that you think you know that others don&#x27;t know.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Q. &lt;em&gt;When do you know someone long enough to ask someone to be their co-founder?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s one of the risks that you take&lt;&#x2F;li&gt;
&lt;li&gt;You&#x27;re going to spend 20+ hours with this person, do you feel comfortable doing that?&lt;&#x2F;li&gt;
&lt;li&gt;Have a set of robust conversations with this person that you can later bring up (re-iterating trust)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 10 Notes</title>
        <published>2014-10-23T00:00:00+00:00</published>
        <updated>2014-10-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec10/"/>
        <id>https://jonalmeida.com/archive/htsas-lec10/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec10/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=RfWgVWGEuGE&quot;&gt;tenth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;building-culture&quot;&gt;Building Culture&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;what-is-company-culture&quot;&gt;What is Company Culture?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Everyday &lt;em&gt;(a)&lt;&#x2F;em&gt; and &lt;em&gt;(b)&lt;&#x2F;em&gt; for each member of the team in pursuit of our company &lt;em&gt;(c)&lt;&#x2F;em&gt;.
&lt;ul&gt;
&lt;li&gt;(a) = assumptions, beliefs, values, core values&lt;&#x2F;li&gt;
&lt;li&gt;(b) = behaviours, actions&lt;&#x2F;li&gt;
&lt;li&gt;(c) = goals, bhag (big hairy audacious goal), mission.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;why-is-matters&quot;&gt;Why is matters?&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;First Principles&lt;&#x2F;strong&gt; that you go back to when you make decisions.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Alignment&lt;&#x2F;strong&gt; people to values that matter to the company.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stability&lt;&#x2F;strong&gt; to fall back on.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Trust&lt;&#x2F;strong&gt; each other with.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Exclusion&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Retention&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;It takes time to come up with a set of culture values that the company believes in.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Took a year to ask employees what core values they wanted and bring it down to 10.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Everyone says we want honest, service, team work, etc.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Instil the idea that it&#x27;s company first, department, team and then yourself.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;elements-of-high-performing-teams&quot;&gt;Elements of high performing teams&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Trust&lt;&#x2F;strong&gt; you can actually have debates if you have conflict and debate.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Conflict&lt;&#x2F;strong&gt; if you don&#x27;t have conflict and debate, it&#x27;s just the blind leading the blind&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Commitment&lt;&#x2F;strong&gt; people are not willing to commit then.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Accountability&lt;&#x2F;strong&gt; people are not held accountable to things they committed to&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Results&lt;&#x2F;strong&gt; you can&#x27;t get results then.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;best-practices&quot;&gt;Best practices&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Incorporate your mission to your values&lt;&#x2F;li&gt;
&lt;li&gt;Perforamnce - think harder, deeper, longer&lt;&#x2F;li&gt;
&lt;li&gt;Interview for culture fit (!)&lt;&#x2F;li&gt;
&lt;li&gt;Evaluate performance on culture&lt;&#x2F;li&gt;
&lt;li&gt;Make it a daily habit - if you don&#x27;t you eventually stop doing it and the company slowly dies&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;q-a-with-brian-airbnb&quot;&gt;Q&#x2F;A with Brian (Airbnb)&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;q-the-process-by-which-you-came-to-realize-that-culture-was-important&quot;&gt;Q. The process by which you came to realize that culture was important?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Airbnb was supposed to be the idea to pay the rent to think of the big idea.&lt;&#x2F;li&gt;
&lt;li&gt;We were lucky to have a team that were up to your level (see lecture 9 notes).&lt;&#x2F;li&gt;
&lt;li&gt;Founders are like parents
&lt;ul&gt;
&lt;li&gt;The company is the children: it&#x27;s up to the &quot;parents&quot; to set the right attitude.&lt;&#x2F;li&gt;
&lt;li&gt;You would want your child to endure and out live you.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Core values learned:&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;Behaviours that change over time&lt;&#x2F;li&gt;
&lt;li&gt;Some principles that never change.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-how-long-did-it-take-you-to-hire-your-first-employee&quot;&gt;Q. How long did it take you to hire your first employee?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;First employee was the first engineer.&lt;&#x2F;li&gt;
&lt;li&gt;Interviewed for 4 months.&lt;&#x2F;li&gt;
&lt;li&gt;Your first engineer was bringing in DNA to your company
&lt;ul&gt;
&lt;li&gt;There would be a 1000 people like this person.&lt;&#x2F;li&gt;
&lt;li&gt;Do I want to work with 1000 of this kind of people&lt;&#x2F;li&gt;
&lt;li&gt;You want diversity of backgrounds, age, etc.
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;You don&#x27;t want diversity of values&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-are-airbnb-s-values&quot;&gt;Q. What are Airbnb&#x27;s values?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Champion the mission - we want to hire people for the mission.&lt;&#x2F;li&gt;
&lt;li&gt;Be creative &amp;amp; frugal
&lt;em&gt;(better to watch this bit with the stories)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;q-how-does-having-a-story-culture-helped-you-make-strong-decisions&quot;&gt;Q. How does having a story culture helped you make strong decisions?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;
Three things no one tells you about culture:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;No one ever tells you about culture&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s hard to measure&lt;&#x2F;li&gt;
&lt;li&gt;It doesn&#x27;t pay off in the short-term&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;ul&gt;
&lt;li&gt;Interview for World Class &amp;amp; they fit the culture.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-culture-and-brand-were-two-sides-of-the-same-coin-talk-about-branding-for-a-bit&quot;&gt;Q. Culture and brand were two sides of the same coin. Talk about branding for a bit.&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;There&#x27;s no such thing as a good or bad culture. A culture that&#x27;s good for someone doesn&#x27;t necessarily have to be a good culture for you.&lt;&#x2F;li&gt;
&lt;li&gt;Brand is the connection between you and customers. If you have a really strong culture, the brand will come through.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-how-did-you-communicate-what-airbnb-does-in-the-early-days&quot;&gt;Q. How did you communicate what Airbnb does in the early days?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Early days, we communicated like a utility - it&#x27;s a cheap alternative to hotels.
&lt;ul&gt;
&lt;li&gt;This under-cut the ideas.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Did a lot of story telling.&lt;&#x2F;li&gt;
&lt;li&gt;Articulate the vision over and over again.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-how-do-we-make-sure-the-hosts-are-re-enforcing-the-culture-of-airbnb&quot;&gt;Q. How do we make sure the hosts are re-enforcing the culture of Airbnb?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Late to realizing this, but are gradually re-inforcing this in every step of the way.&lt;&#x2F;li&gt;
&lt;li&gt;Bad hosts were seriously affecting the business.&lt;&#x2F;li&gt;
&lt;li&gt;Hosts are partners. Had to get hosts that believed in this same values.&lt;&#x2F;li&gt;
&lt;li&gt;The super-host program gives them extra support and stuff.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-airbnb-has-made-contributions-to-the-open-source-community-thoughts-on-how-that-contributes-to-the-thoughts-around-the-development-team&quot;&gt;Q. Airbnb has made contributions to the open source community. Thoughts on how that contributes to the thoughts around the development team?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;We try to be a generally open culture.&lt;&#x2F;li&gt;
&lt;li&gt;Strong identification of the team.
&lt;ul&gt;
&lt;li&gt;Every company needed a mote that protects from your competition.&lt;&#x2F;li&gt;
&lt;li&gt;Wanted to be better technology. Changed this to be giving the best experience in the world instead.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The engineers (with those same strong culture values) independently decided this was a thing they should do.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-there-weren-t-that-many-visitors-to-the-site-when-trying-to-get-off-the-ground-how-did-you-get-users-to-the-site&quot;&gt;Q. There weren&#x27;t that many visitors to the site when trying to get off the ground. How did you get users to the site?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;(Not about culture)&lt;&#x2F;li&gt;
&lt;li&gt;&quot;It&#x27;s better to have 100 people who love you, than to have a million people that just kinda sorta like you.&quot; - PG&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;To get 100 people to love you, you need to do things that don&#x27;t scale.&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Living with your users and spending time with them.&lt;&#x2F;li&gt;
&lt;li&gt;Giving them attention to the point that they were really passionate.&lt;&#x2F;li&gt;
&lt;li&gt;A lot of things were done manually for the users.&lt;&#x2F;li&gt;
&lt;li&gt;Until they knew exactly what the perfect service was, &lt;em&gt;only then did they create the tools and technology to do it.&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-a-lot-of-people-think-airbnb-is-more-of-a-marketing-company-thoughts&quot;&gt;Q. A lot of people think Airbnb is more of a marketing company? Thoughts?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Have to work with a lot of things like people&#x27;s &lt;em&gt;ACTUAL&lt;&#x2F;em&gt; security since there are people sleeping in their hosts&#x27; sheets.&lt;&#x2F;li&gt;
&lt;li&gt;Countries that need to be convinced that this is a good thing for them.&lt;&#x2F;li&gt;
&lt;li&gt;Matching the right people with the right hosts.&lt;&#x2F;li&gt;
&lt;li&gt;These are just a few of the things that they have to do, so it would be wrong to call them a marketing company.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 9 Notes</title>
        <published>2014-10-21T00:00:00+00:00</published>
        <updated>2014-10-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec09/"/>
        <id>https://jonalmeida.com/archive/htsas-lec09/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec09/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=uFX95HahaUs&quot;&gt;ninth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;how-to-raise-money&quot;&gt;How to Raise Money&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;initial-questions&quot;&gt;Initial Questions&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;q-what-makes-you-want-to-invest-in-a-founder-company&quot;&gt;Q. What makes you want to invest in a founder&#x2F;company?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Is this person a leader? Are they focused?&lt;&#x2F;li&gt;
&lt;li&gt;What made you decide to invent this?&lt;&#x2F;li&gt;
&lt;li&gt;What are you communication skills to lead a team?&lt;&#x2F;li&gt;
&lt;li&gt;You have to be able to say in one sentence what your product does. &lt;em&gt;Practice saying this over and over again.&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Keep making decisions - procrastination is the devil.&lt;&#x2F;li&gt;
&lt;li&gt;Bootstrap as long as you possibly can.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;VC is a game about outliers
&lt;ul&gt;
&lt;li&gt;It&#x27;s about investing in the extreme&#x2F;edge cases.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;You look for the basic check offs: initial customers, launching, etc.
&lt;ul&gt;
&lt;li&gt;You also look for the special something that pushes them on the top.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Be so good that they can&#x27;t ignore you.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Raising VC is easier than recruiting, viral growth, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Be the Twitter guys.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;If you get in a situation where raising VC is hard, you&#x27;re going to have much more after this.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-do-you-wish-founders-did-differently&quot;&gt;Q. What do you wish founders did differently?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Risk &amp;amp; raising cash&lt;&#x2F;li&gt;
&lt;li&gt;Risk &amp;amp; spending cash&lt;&#x2F;li&gt;
&lt;li&gt;State your milestones and your risks&lt;&#x2F;li&gt;
&lt;li&gt;Calibrate the money you raised and spent to the amount of risks you&#x27;re removing from the business.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Don&#x27;t ask people to sign an NDA
&lt;ul&gt;
&lt;li&gt;You&#x27;re saying you don&#x27;t have trust at the beginning&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Do it as fast and efficiently as your can&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Don&#x27;t&lt;&#x2F;strong&gt; get your ego in the way
&lt;ul&gt;
&lt;li&gt;Get it over and done with fast so you can get back to building your product.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;When someone makes a commitment to you:
&lt;ul&gt;
&lt;li&gt;Write and email to them to confirm what they just said to you.&lt;&#x2F;li&gt;
&lt;li&gt;i.e. GET IT IN WRITING.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-tactics-how-does-the-process-go-can-people-email-you-directly-do-they-need-to-give-an-introduction-how-many-meetings-does-it-take-for-you-to-make-a-decision-how-do-you-figure-out-what-the-right-terms-are-when-can-a-founder-ask-you-for-a-cheque&quot;&gt;Q. Tactics - how does the process go? Can people email you directly? Do they need to give an introduction? How many meetings does it take for you to make a decision? How do you figure out what the right terms are? When can a founder ask you for a cheque?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SV Angel: invests in seed stage investments.
&lt;ul&gt;
&lt;li&gt;One company for every 30 they look at.&lt;&#x2F;li&gt;
&lt;li&gt;~1 company a week.&lt;&#x2F;li&gt;
&lt;li&gt;Now we take leads from within their network.&lt;&#x2F;li&gt;
&lt;li&gt;The SV Angel teams even vote to make a first phone call to you.
&lt;ul&gt;
&lt;li&gt;If there&#x27;s a phone call, they&#x27;re well on their way to invest.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Andreessen Horowitz: series A stage investing
&lt;ul&gt;
&lt;li&gt;Top (serious) investors invest in companies if they&#x27;ve already raised at the seed stage.
&lt;ul&gt;
&lt;li&gt;Do this first before you get to series A.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Rarely do they go straight to series A without a seed stage (usually only with someone who has been successful before and&#x2F;or they have worked with in the past).&lt;&#x2F;li&gt;
&lt;li&gt;~2000 referrals a year through their own network.&lt;&#x2F;li&gt;
&lt;li&gt;The best way to get through, is therefore through the referral network.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-terms-should-founders-care-most-about&quot;&gt;Q. What terms should founders care most about?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Picking the right seed investors.&lt;&#x2F;li&gt;
&lt;li&gt;Get a good introduction from someone that VC trusts and respects - higher chance of success.&lt;&#x2F;li&gt;
&lt;li&gt;YC is a good place where they tell you who those people are.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-how-should-founders-negotiate-how-do-figure-out-what-are-the-terms&quot;&gt;Q. How should founders negotiate? How do figure out what are the terms?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Started initial evaluation too high (11 million). People started to say it was too high.&lt;&#x2F;li&gt;
&lt;li&gt;Slowly lowering it down (9 million) hit a threshold that investors were fine with (this varies).&lt;&#x2F;li&gt;
&lt;li&gt;Above the level is crazy, and you should just focus on getting the money that you need, not more than you need.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-is-there-a-maximum-amount-of-the-company-you-think-founders-should-sell-in-their-seed-round-series-a&quot;&gt;Q. Is there a maximum amount of the company you think founders should sell in their seed round&#x2F;series A?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Roughly 20-30% or 10-15% also seems to work as well.&lt;&#x2F;li&gt;
&lt;li&gt;VCs are more ownership focused rather than price focused.&lt;&#x2F;li&gt;
&lt;li&gt;Above 30% makes it hard for everyone at the table to get around.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Ask yourself, at what point is my ownership starting to demotivate me?&lt;&#x2F;li&gt;
&lt;li&gt;If 40% is gone, you may have just doomed yourself.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-could-you-tell-the-story-of-the-most-successful-investment-you-ve-ever-made-and-how-that-came-to-happen&quot;&gt;Q. Could you tell the story of the most successful investment you&#x27;ve ever made and how that came to happen?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Investment in Google.&lt;&#x2F;li&gt;
&lt;li&gt;Came across via a party from David Sheraton who knew of the project happening in Stanford.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Investment in Airbnb.&lt;&#x2F;li&gt;
&lt;li&gt;Wasn&#x27;t an early investment by Andreessen Horowitz.&lt;&#x2F;li&gt;
&lt;li&gt;Heard that the customer behaviour showed them that it wasn&#x27;t a terrible idea.&lt;&#x2F;li&gt;
&lt;li&gt;They were impressed with the behaviour of the founders and how they were growing.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;All three founders were as good as the other founder.&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;In the case of Google, two founders.. one was a little better than the other one.&quot; &lt;em&gt;&amp;lt;- Ouch!&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&quot;When you start a company, you have to go find somebody as good or better than you to be the co-founder.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;The anomaly is Facebook&#x2F;Mark Zuckerberg.
&lt;ul&gt;
&lt;li&gt;You have to find phenomenal co-founders.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;audience-questions&quot;&gt;Audience questions&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;q-does-raising-money-help-you-with-an-exit-or-an-empire&quot;&gt;Q. Does raising money help you with an exit or an empire?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If you pick good investors with domain expertise, they will have more value than money. Look for those people.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Yes, but it doesn&#x27;t matter.&lt;&#x2F;li&gt;
&lt;li&gt;You can&#x27;t plan these things by the downside.&lt;&#x2F;li&gt;
&lt;li&gt;It shouldn&#x27;t enter the decision if you should raise money. It should depending on which investor you want to raise from.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-should-founders-do-for-capital-intensive-companies-to-still-cannot-identify&quot;&gt;Q. What should founders do for capital intensive companies to still ... (cannot identify)&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;The more capital you have, the more intense you have to be on what is going to be required to make the business work.&lt;&#x2F;li&gt;
&lt;li&gt;You have to raise as precise of the amount that you need.&lt;&#x2F;li&gt;
&lt;li&gt;If you have viral growth, that&#x27;s easy.&lt;&#x2F;li&gt;
&lt;li&gt;If you have a great idea, but it needs more to get to that point, they will still fund you, but the operational excellence from the team matters a lot more. It&#x27;s very easy to lose the company.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-is-a-sign-that-you-should-avoid-from-a-particular-investor&quot;&gt;Q. What is a sign that you should avoid from a particular investor?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;If an investor has no domain expertise in your company.&lt;&#x2F;li&gt;
&lt;li&gt;Doesn&#x27;t have a rolodex to help you with introductions for business development and series A funding.&lt;&#x2F;li&gt;
&lt;li&gt;Especially if they&#x27;re in it just to make money.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;These are people who you will (potentially) be spending the next 10-15 years working with.&lt;&#x2F;li&gt;
&lt;li&gt;These are people you need to trust during periods of great stress and anxiety.&lt;&#x2F;li&gt;
&lt;li&gt;Everyone needs to have the same shared goal, ethics, staying power during the storms that come up.&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s like getting married because the relationship is almost as long.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SV Angel invests for life.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Do you feel like you respect these people? Do you feel like you have a lot to learn from them?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-are-the-constraint-on-how-many-companies-you-invest-in&quot;&gt;Q. What are the constraint on how many companies you invest in?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It&#x27;s really the number of companies. SV Angel just likes 1 a week.&lt;&#x2F;li&gt;
&lt;li&gt;Conflict policy between two investments: only applies when one company morphed into another ones space. They will disclose it to both companies.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Biggest constraint is opportunity cost.
&lt;ul&gt;
&lt;li&gt;The cost that they&#x27;re worried about is ruling out conflicting companies. (e.g. Investing in MySpace removes us from Facebook).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Time and bandwidth of the general partners.
&lt;ul&gt;
&lt;li&gt;There&#x27;s a limited number of space that each partner has to offer. Once each partner is maxed out, you can&#x27;t make any more investments (you just don&#x27;t have the people resources for it).&lt;&#x2F;li&gt;
&lt;li&gt;Every investment they make in a company, takes them one spot out of investing in another. Reduces the ability of the company to make new deals.&lt;&#x2F;li&gt;
&lt;li&gt;Pass out based on the relative set.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-what-convinces-you-to-invest-in-a-company-with-no-product-or-no-traction&quot;&gt;Q. What convinces you to invest in a company with no product or no traction?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Ron:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;What usually convinces them: the founder and the team. The product tends to morph a lot.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Almost always someone they know with a good track record.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;q-can-you-talk-about-the-idea-of-board-structure&quot;&gt;Q. Can you talk about the idea of board structure?&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;Parker:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Having a co-founder and partner from your investor to help remove the fear someone will fire you.&lt;&#x2F;li&gt;
&lt;li&gt;If you trust the people you are working with, it hardly ever comes to a board vote unless something is already deeply broken already.&lt;&#x2F;li&gt;
&lt;li&gt;Less of a big deal people make it out to be.&lt;&#x2F;li&gt;
&lt;li&gt;You almost always have unlimited power on the decision.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Marc:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;In all his 20 years, he&#x27;s never been in a board vote that mattered. The decision has almost always been unanimous.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 7 Notes</title>
        <published>2014-10-19T00:00:00+00:00</published>
        <updated>2014-10-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec07/"/>
        <id>https://jonalmeida.com/archive/htsas-lec07/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec07/">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EDIT:&lt;&#x2F;strong&gt; Sorry these are late!&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=sz_LgBAGYyo&quot;&gt;seventh lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;making-products-users-love&quot;&gt;Making Products Users Love&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;How do we make things that have a passionate user base.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Our users are unconditionally want it to be successful: the products, and the company behind it.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Growth is the interaction between Conversion and Churn.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Gap between indicate how fast you&#x27;re going to grow.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Philosophy:&lt;&#x2F;strong&gt; To get a billion dollars, focus on what it takes to get that first user and the rest will fall into place.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;At Wufoo they compared how does real relationships work and how do we apply them to how we run our business.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Then, build our product that way.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Human beings always create a way to anthropomorphize things that we interact with over and over again.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;First time interactions means that the threshold is lower.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Users though, discover many other moments which they call first impressions later on which they make memorable.&lt;&#x2F;li&gt;
&lt;li&gt;Links, advertising, customer support emails, etc.&lt;&#x2F;li&gt;
&lt;li&gt;i.e. &quot;opportunities to seduce&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Judging quality uses two different concepts that we get from the Japanese:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;atarimae hinshitsu&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;Taking for granted quality (functionality).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;miryokuteki hinshitsu&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;Enchanting quality.&lt;&#x2F;li&gt;
&lt;li&gt;Example: A pen - if the weight of the pen. the ink flowing from the pen and the writing from the pen are pleasurable to the user.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;(slides of applications that take opportunities to put a smile on a users face when you know who your user is. Example: Your trial has expired. Everything works exactly the same but everything is written using Comic Sans)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Subscribe to Little Big Details.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Marriage problems (even in strong relationships) always fight about the same things.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;These things are remarkably similar to company problems:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Marriage&lt;&#x2F;th&gt;&lt;th&gt;Company&lt;&#x2F;th&gt;&lt;th&gt;Customer Support&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Money&lt;&#x2F;td&gt;&lt;td&gt;Cost&#x2F;Billing&lt;&#x2F;td&gt;&lt;td&gt;Website visitor&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Kids&lt;&#x2F;td&gt;&lt;td&gt;Users&#x27; Clients&lt;&#x2F;td&gt;&lt;td&gt;Signup to Trial&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Sex&lt;&#x2F;td&gt;&lt;td&gt;Performance&lt;&#x2F;td&gt;&lt;td&gt;Login to account&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Time&lt;&#x2F;td&gt;&lt;td&gt;Roadmap&lt;&#x2F;td&gt;&lt;td&gt;Active Users&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Others&lt;&#x2F;td&gt;&lt;td&gt;Others&lt;&#x2F;td&gt;&lt;td&gt;Paying Users&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;td&gt;Staying Users&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Think of each of these in terms of customer support.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Customer support is the thing that happens in-between each step.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There&#x27;s a big problem how every company builds up their engineering teams.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Software engineers and designers are often divorced from the consequences of their actions.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Before launch, everything you do is &quot;correct&quot;.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;After launch, new tasks start to crop up:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Customer Support&lt;&#x2F;li&gt;
&lt;li&gt;Fixing crap&lt;&#x2F;li&gt;
&lt;li&gt;Business crap&lt;&#x2F;li&gt;
&lt;li&gt;Hiring crap&lt;&#x2F;li&gt;
&lt;li&gt;Crap&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;What we need to do is change software development to inject new values:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Responsibility&lt;&#x2F;li&gt;
&lt;li&gt;Accountability&lt;&#x2F;li&gt;
&lt;li&gt;Humility&lt;&#x2F;li&gt;
&lt;li&gt;Modesty&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;We needed a new model to follow: Support Driven Development (SDD)&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SDD is another Agile development form&lt;&#x2F;li&gt;
&lt;li&gt;You don&#x27;t need scrum, post-it notes, etc.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;You just need everyone to do Customer Support.&lt;&#x2F;strong&gt;
&lt;ul&gt;
&lt;li&gt;This fixes the feedback loop!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Paul English from Kayak thought of this as well:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Why would you pay engineers $120K a year to do something that you can pay other people a fraction of to handle?&quot;&lt;&#x2F;li&gt;
&lt;li&gt;&quot;After the second or third time the phone rings and they get the same problem. They stop what they&#x27;re doing, they fix the bug, and we stop getting calls about it.&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Again, like marriage there are four warning signs that show you&#x27;re about to break up (The Four Horsemen).&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Marriage&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Criticism&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Contempt&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Defensiveness&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Stonewalling&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;At Wufoo:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;+500,000 users&lt;&#x2F;li&gt;
&lt;li&gt;~5 million people using Wufoo forms and reports&lt;&#x2F;li&gt;
&lt;li&gt;~400 issues&lt;&#x2F;li&gt;
&lt;li&gt;+800 emails&lt;&#x2F;li&gt;
&lt;li&gt;7-12 minutes for response time&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;This format of SDD was carried all they way up to this scale.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;At Wufoo, they added a drop down to add your emotional state at the time.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;People filled this out a similar percentage of time that they filled out &quot;Browser Type&quot;&lt;&#x2F;li&gt;
&lt;li&gt;What we can learn from this is: people feel that knowing their emotional state is just as important as all the technical details you need to know how to debug it.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Note: People didn&#x27;t try to game the system.&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;This let them know how much people cared about the issue they were filling out.&lt;&#x2F;li&gt;
&lt;li&gt;When communicating over written text, there are only three ways to express emotions: exclamation marks, curse words, all-caps.&lt;&#x2F;li&gt;
&lt;li&gt;By metrics, all three of those ways had gone down as people talked to the customer support.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Once people had a simple outlet for their emotion, they behaved a lot more rational and made our jobs a lot more pleasant as a result.&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Another by-product of this is that you actually build better software by doing this.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;There&#x27;s a direct correlation between the time spent with users, and how good our design gets.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;It has to come in a specific way otherwise your software will get worse over time:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Direct Exposure: It can&#x27;t be by someone who generates a report, or a graph. You have to be interacting with them somewhat real-time.&lt;&#x2F;li&gt;
&lt;li&gt;Minimum of every six weeks.&lt;&#x2F;li&gt;
&lt;li&gt;At least two hours.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;If you want your users to gain knowledge of your product:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You make your app more intuitive.&lt;&#x2F;li&gt;
&lt;li&gt;You increase your user&#x27;s knowledge.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;As engineers, we always think: we need more features, this means increasing the knowledge gap. So we need a better way to support our customers to &lt;em&gt;increase their knowledge&lt;&#x2F;em&gt; of your app.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Growth is a function of Conversion and Churn.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Wufoo paid no money on advertising, marketing, etc. All of it was done through word of mouth.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;relationships-atrophy&quot;&gt;Relationships Atrophy&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;When it comes to relationships, it tends to work like second law of thermodynamics: In a closed energy system, things tend to run down. So you have to constantly have to be putting energy back into it.&lt;&#x2F;li&gt;
&lt;li&gt;The typical way to show we care: blog, newsletters.&lt;&#x2F;li&gt;
&lt;li&gt;Wufoo created a new tool that showed all the new features that were implemented since their users&#x27; last login - &quot;Since You&#x27;ve Been Gone.&quot;&lt;&#x2F;li&gt;
&lt;li&gt;Every friday, the Wufoo team who get together and send out hand-written postcards to their users. This added an element of humility back into the cycle.&lt;&#x2F;li&gt;
&lt;li&gt;The discipline of market leaders can only be achieved by three ways. You have to organize your company in a very specific way.
&lt;ul&gt;
&lt;li&gt;Best price&lt;&#x2F;li&gt;
&lt;li&gt;Best product&lt;&#x2F;li&gt;
&lt;li&gt;Best overall solution&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The third one the only one that can be done at any stage in your company and requires almost no amount of money, just some humility and manners.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;What do you when you have a product that a lot of types of users, some users will love one thing, and others will love another?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Focus on those who are &lt;em&gt;most&lt;&#x2F;em&gt; passionate. Whatever niche it&#x27;s going to be.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;How do we balance between working on product but all the other skills are also needed by marketing?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; If you&#x27;re working with product, you should always have this flip side where you&#x27;re talking to users. Within Wufoo, we just made everyone talk to customers. Working on product &lt;strong&gt;must&lt;&#x2F;strong&gt; go with talking to your customers.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;How do you make a decision on product and how do you communicate that with engineering teamw when there are a lot of different dirrections to go?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; When you&#x27;re working with support, you can tell what people had the most amount of problems with or are asking you all the time.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;Tell the story how you came up with the &quot;king for a day&quot; at Wufoo.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; I don&#x27;t like hackathons that are done inside companies. Instead at Wufoo, they came up with &quot;King for a day&quot;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Someone from within the company got randomly drawn, and the &quot;king&quot; could tell everyone else what to do on the product. Everything that was bothering them about the company, a feature, could be worked on. Wufoo would do this one or two times a year during a weekend. This ended up being a huge moral boost.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;WFH, how did that not end up being a nightware?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; We would allow anyone to work from anywhere, but usually as we tried to recruit them usually ended up wanting to work there anyway. Remote working is tricky. An office gives you a lot of benefits and efficiencies that you now have to compensate for. But remote working has it&#x27;s own benefits: I don&#x27;t have to worry about my employees losing two hours to commuting. Thus, we had to respect people&#x27;s time.
At Wufoo, they had a 4.5 days for working. The 0.5 day was for meetings, and then you have the first day which was for customer support. So we have a firm belief that if you have a three day work week, you can finish whatever you need to work on, and you have to respect that persons three day work time to get their work done.
You couldn&#x27;t work for issues that took longer than 15 mins of that persons time. 95% of the time, people would just sleep on it and they ended up saying, &quot;Oh! We&#x27;ve solved it!&quot;.
Also, we were an extremely disciplined company and not many YC companies have been able to replicate what we&#x27;ve wanted to do.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;As the leader of the team, how did you manage to setup accountability as a manager?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; At Wufoo, we had profit sharing. They split up bonuses on how much people managed to do that they set out to, and how well they did in customer support. The simplest way to setup accountability was to create To-Do lists for each person. Everyone can see all the things you want to be done, here are the things you wanted to complete during the previous week, what are your problems at hand? They set the tone for how they want to be assessed.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;How do you hire people that can work remotely and work in this sort of fashion?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Have them work on a side-project for you as a contractor remotely. You get a good sense of how people managed them selves. Second, we had to screen them for their ability to do customer support. Interview would ask you how to write break up letters to you.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;With all these tricks to help with the company, do you have any that didn&#x27;t work out?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; We tried to motivate people during crunch time. We want to build a company vacation to reward the employees. So if the vacation is build into the crunch mode schedule. The first crunch mode was just between the co-founders. We each drew up a 10 item to-do list. The first person who got through 7 of the items would win and choose the next vacation location, and the last person would become the trip-bitch (you carried the other peoples luggage and get them drinks, etc.). During that period, one of the guys poorly estimated the items on his list and decided just to give up. So crunch mode just became blah-mode.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Written with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;stackedit.io&#x2F;&quot;&gt;StackEdit&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 5 Notes</title>
        <published>2014-10-07T00:00:00+00:00</published>
        <updated>2014-10-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec05/"/>
        <id>https://jonalmeida.com/archive/htsas-lec05/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec05/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=5_0dVHMpJlo&quot;&gt;fifth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;strategy-competition&quot;&gt;Strategy &amp;amp; Competition&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;capturing-value&quot;&gt;Capturing value&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;If you&#x27;re starting a company, aim for monopoly and avoid competition.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;what-makes-a-business-valuable&quot;&gt;What makes a business valuable?&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;If you have a valuable company:
&lt;ol&gt;
&lt;li&gt;That it creates X dollars of value for the world&lt;&#x2F;li&gt;
&lt;li&gt;That you make Y% of X&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;People forget: X and Y are independent variables&lt;&#x2F;li&gt;
&lt;li&gt;Comparing airlines to Google:
&lt;ul&gt;
&lt;li&gt;We can see airliners make more money than Google&lt;&#x2F;li&gt;
&lt;li&gt;However, Google&#x27;s profit margin is much higher (21% to 0.2%)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;perfect-competition&quot;&gt;Perfect competition&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Pros:
&lt;ul&gt;
&lt;li&gt;Easy to model&lt;&#x2F;li&gt;
&lt;li&gt;Efficient in a static world&lt;&#x2F;li&gt;
&lt;li&gt;Politically salable&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Cons:
&lt;ul&gt;
&lt;li&gt;Psychologically unhealthy&lt;&#x2F;li&gt;
&lt;li&gt;Irrelevant in a dynamic world&lt;&#x2F;li&gt;
&lt;li&gt;Preempts question of value&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;monopoly&quot;&gt;Monopoly&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pros:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Incentive to innovate&lt;&#x2F;li&gt;
&lt;li&gt;Stable, long-term planning&lt;&#x2F;li&gt;
&lt;li&gt;Deeper project financing&lt;&#x2F;li&gt;
&lt;li&gt;symptomatic of creation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Cons:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Lower output, higher prices&lt;&#x2F;li&gt;
&lt;li&gt;Price discrimination&lt;&#x2F;li&gt;
&lt;li&gt;Stifle Innovation&lt;&#x2F;li&gt;
&lt;li&gt;Tying&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;These are the two kinds of companies (it really is black &amp;amp; white).&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;This is not understood well because people are constantly lying about the nature of the business they are in.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-lies-that-people-tell&quot;&gt;The lies that people tell&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;em&gt;(diagram of two firms to show perception)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;People who have monopolies pretend not to:
&lt;ul&gt;
&lt;li&gt;They don&#x27;t want the government coming after them&lt;&#x2F;li&gt;
&lt;li&gt;Pretend they have incredible competition&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;People who have a lot of competition:
&lt;ul&gt;
&lt;li&gt;&quot;We are doing something unique!&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;This causes a distortion because of the lies.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;(diagram showing this information in set theory)&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;Union shows monopoly saying, &quot;We&#x27;re in a narrow market&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;Intersection shows non-monopoly saying, &quot;We&#x27;re actually unique in this fast market&quot;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;You open a restaurants&lt;&#x2F;li&gt;
&lt;li&gt;No one wants to invest because restaurants don&#x27;t make money&lt;&#x2F;li&gt;
&lt;li&gt;You then lie and say something like, &quot;We&#x27;re the only British food in Palo Alto&quot;
&lt;ul&gt;
&lt;li&gt;Two intersections are made here: British food &amp;amp; Palo Alto&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example 2:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Blockbuster movie you want to make on football hackers who try to catch sharks (?)&lt;&#x2F;li&gt;
&lt;li&gt;You say, &quot;It&#x27;s incredibly hard to make money in movies&quot;
&lt;ul&gt;
&lt;li&gt;The union here: football, hackers, sharks&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example 3 (Startup version):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Startups that use the same buzz words: sharing, mobile, social, apps, sharing mobile, social apps.&lt;&#x2F;li&gt;
&lt;li&gt;Are these even real business?&lt;&#x2F;li&gt;
&lt;li&gt;&quot;The something of somewhere, is really just the nothing of no where.&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example 4 (Large enterprise):&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Search engine market (Google): Describes itself as an advertising company.
&lt;ul&gt;
&lt;li&gt;Advertising is part of online advertising, which is part of all advertising, which is part of global advertising.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Or saying it&#x27;s a technology company
&lt;ul&gt;
&lt;li&gt;Technology market consists with automobiles, smartphones, cloud, social network.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;There&#x27;s competition for us everywhere!&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-to-build-a-monopoly&quot;&gt;How to build a monopoly&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Go after small markets&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s easier to dominate a small market than a large one&lt;&#x2F;li&gt;
&lt;li&gt;If you think your initial market might be too big, it almost certainly is
&lt;ul&gt;
&lt;li&gt;You haven&#x27;t properly defined the market you&#x27;re going after&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;&#x2F;strong&gt;
Amazon started as just a bookstore. It has all the books in the world. It&#x27;s online, there are things on it that you couldn&#x27;t do before.
Gradually expand to different kinds of ecommerce.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;&#x2F;strong&gt;
Ebay started selling pez dispensers -&amp;gt; beanie babies -&amp;gt; auctioning of different kinds of goods.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Counter Intuitive: these companies started in markets so small, that people don&#x27;t think that they&#x27;re valuable when they get started.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;&#x2F;strong&gt;
PayPal started with power sellers on ebay. It was a small market of people selling junk on the internet.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;start-big-and-then-shrink&quot;&gt;Start big and then shrink&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Clean tech bubble companies started in big markets&lt;&#x2F;li&gt;
&lt;li&gt;You have tons of competitors and you don&#x27;t even now who your competitors are&lt;&#x2F;li&gt;
&lt;li&gt;You DO NOT want to be the 4th online pet food company, or the 10th solar panel company, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Large existing markets are very hard to get into&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;last-mover-advantage&quot;&gt;Last mover advantage&lt;&#x2F;h2&gt;
&lt;p&gt;Characteristics of monopolies:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Proprietary Technology&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Network Effects&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Economics of scale&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Branding&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;All happy companies are different because they are doing something very unique.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;All unhappy companies are alike because they fail to escape the sameness i.e. competition.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Have a technology that is an order of magnitude better than the next best thing.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A very powerful improvement in a key dimension&lt;&#x2F;li&gt;
&lt;li&gt;Something completely new is an infinite improvement better&lt;&#x2F;li&gt;
&lt;li&gt;TLDR; get a massive delta over the next best thing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Branding:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It can create great value, hard to invest in companies that work only in branding.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;You want to be the &quot;last mover&quot;, the last company in that category&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;e.g. Microsoft was the last software company (for a long time)&lt;&#x2F;li&gt;
&lt;li&gt;e.g. Google was the last search engine&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Value in these companies exist far in the future.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; SV seems to overvalue growth rates and undervalues durability.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;(Chess analogy about being the last player)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;history-of-innovation&quot;&gt;History of innovation&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Innovation can become extremely valuable and often the creators&#x2F;inventors do not get rewarded for this.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;This happens because X and Y are independent&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;History of science shows: Y = 0%&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Scientists are often deluded into thinking that they live in a just universe and will be rewarded for their work and inventions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;E.g. (Einstein) smartest physicist of the 20th century, you come up with general relativity, you don&#x27;t get to be a billionaire&#x2F;millionaire.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Two broad categories of people who have come up with new ideas and made money off of it:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Vertically integrated complex monopolies (e.g. Ford, Standard Oil).
&lt;ul&gt;
&lt;li&gt;Key to Elon Musk&#x27;s Space X and Tesla is this structure&lt;&#x2F;li&gt;
&lt;li&gt;There was no single massive breakthrough in technology, but integrating all the pieces together (better than competitors).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;psychology-of-competition&quot;&gt;Psychology of competition&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;We think of the losers as people who can&#x27;t compete.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;We need to rethink this thinking:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;We don&#x27;t always understand this monopoly competition dicotomy intellectually&lt;&#x2F;li&gt;
&lt;li&gt;People lie about it (see above)&lt;&#x2F;li&gt;
&lt;li&gt;There&#x27;s also a psychological blindspot
&lt;ol&gt;
&lt;li&gt;We find it reassuring if other people are doing things&lt;&#x2F;li&gt;
&lt;li&gt;Mimetic preferences&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;We think of competition as a form a validation&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&quot;Don&#x27;t always go through the tiny little door that everyone is trying to rush through, maybe go around the corner and go through the vast gate that no one is taking.&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;Monopolies and perfect competition often look similar. How do you easily tell the difference?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Ask the question: what is the actual market?&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;Which of the aspects of monopolies that you mentioned, do you think software companies like Google excel at?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; They have network effects, they had the proprietary technology that gave them the initial page rank algorithm which was an order of magnitude better. They had the economies of scale with the need to store all these sites. So Google basically had all four.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;undistinguishable question&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Palantir started with the intelligence market that used a very different approach.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;What do you think about lean startups, iterative thinking where you get feedback from people vs complexity that may not work?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Personally sceptical of all lean startup methodologies. The really great companies did something more of a quantum improvement that really differentiated them from everybody else. Typically, did not do massive surveys.&lt;&#x2F;p&gt;
&lt;p&gt;If you take enough time to figure out what people want, you most often will have missed the boat by then.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;If you were someone who worked at a high paying company for 6 months, left to Stanford in comp sci. How would you recommend rethinking .. (undistinguishable bit)&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; There isn&#x27;t any easy psychological formula to avoid it. Never under-estimate how big the problem really is.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 4 Notes</title>
        <published>2014-10-01T00:00:00+00:00</published>
        <updated>2014-10-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec04/"/>
        <id>https://jonalmeida.com/archive/htsas-lec04/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec04/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=yP176MBG9Tk&quot;&gt;fourth lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;building-a-product&quot;&gt;Building a Product&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;what-not-to-do-when-starting-a-startup-sas&quot;&gt;What not to do when starting a startup (SAS)&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Adora learned these from experiences.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re in school, spend one or two days straight (per week) to work on your idea, instead of one or two hours throughout your week.
&lt;ul&gt;
&lt;li&gt;Less context switching is involved&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;The wrong approach:
&lt;ul&gt;
&lt;li&gt;Don&#x27;t tell anyone about your idea&lt;&#x2F;li&gt;
&lt;li&gt;Work on it in secret&lt;&#x2F;li&gt;
&lt;li&gt;Launch it on TC&lt;&#x2F;li&gt;
&lt;li&gt;Eventually loosing customers because you didn&#x27;t get that initial feedback&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;TODO: What is your problem and what are you trying to solve?&lt;&#x2F;li&gt;
&lt;li&gt;Where do you start?
&lt;ul&gt;
&lt;li&gt;Emerse yourself in that industry first&lt;&#x2F;li&gt;
&lt;li&gt;When you&#x27;re a noob coming into the industry, you have to understand how the bits and pieces work.&lt;&#x2F;li&gt;
&lt;li&gt;Reading books on the industry isn&#x27;t enough, you have to get a job in that industry.
&lt;ul&gt;
&lt;li&gt;You learn how a company in that industry works&lt;&#x2F;li&gt;
&lt;li&gt;Why it can&#x27;t become a large company (a.k.a it&#x27;s faults)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;e.g. If you want to get into the restaurant business, become a waiter.&lt;&#x2F;li&gt;
&lt;li&gt;Become obsessed with the industry:
&lt;ul&gt;
&lt;li&gt;Find the competitors&lt;&#x2F;li&gt;
&lt;li&gt;Go for their earning calls&lt;&#x2F;li&gt;
&lt;li&gt;Notes, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;BEFORE you start putting down code, storyboard the user experience you want.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-is-v1&quot;&gt;What is v1?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Build the Minimum Viable Product first
&lt;ul&gt;
&lt;li&gt;What is the smallest feature set you can build.
&lt;ul&gt;
&lt;li&gt;You need to talk to users to find out this.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;You should be able to describe it in one sentence.
&lt;ul&gt;
&lt;li&gt;&quot;Get your place clean for $20!&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-to-get-your-first-users&quot;&gt;How to get your first users?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;You &amp;amp; your co-founder should be using it&lt;&#x2F;li&gt;
&lt;li&gt;Mum, dad, friends, etc.&lt;&#x2F;li&gt;
&lt;li&gt;Online communities: Show HN, Reddit, mailing lists, local communities.&lt;&#x2F;li&gt;
&lt;li&gt;Guilt-trip people in your local communities to get them to use it the first time!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;what-do-you-do-with-all-these-users&quot;&gt;What do you do with all these users?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Customer feedback:
&lt;ul&gt;
&lt;li&gt;Phone number
&lt;ul&gt;
&lt;li&gt;Setup voicemail&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Email&lt;&#x2F;li&gt;
&lt;li&gt;What you really need is to get out and go meet them&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Send out surveys:
&lt;ul&gt;
&lt;li&gt;This gets you the extremes (people who really like you, or really hate you)&lt;&#x2F;li&gt;
&lt;li&gt;The in-between requires you to get out&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t poke your users, &quot;why why why?&quot;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;This is what you want -&amp;gt;&lt;&#x2F;strong&gt; Socialize with your users at a human-level (take them out for drinks, coffee, etc.)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Track customer retention:
&lt;ul&gt;
&lt;li&gt;People who came today, are they returning?&lt;&#x2F;li&gt;
&lt;li&gt;Collect NPS (Net Promoter Score).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;everybody-lies&quot;&gt;Everybody lies&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;For a free product:
&lt;ul&gt;
&lt;li&gt;Mum: She will always be nice and give you a great review (least honest)&lt;&#x2F;li&gt;
&lt;li&gt;Acquaintances: More likely to give you honest opinions&lt;&#x2F;li&gt;
&lt;li&gt;Random person (who doesn&#x27;t know you): More honest, but don&#x27;t care that much&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;For a paid product:
&lt;ul&gt;
&lt;li&gt;Mum: Still lies and says you&#x27;re awesome&lt;&#x2F;li&gt;
&lt;li&gt;Acquaintances: More likely to give you honest opinions&lt;&#x2F;li&gt;
&lt;li&gt;Random person: If they don&#x27;t think the product they paid for was worth it, they&#x27;re really going to tell you &lt;strong&gt;(Most honest)&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Doesn&#x27;t mean you should make people pay when you first launch.
&lt;ul&gt;
&lt;li&gt;If you&#x27;re going to make them pay eventually, get to the point where you do that really fast.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;post-feedback-pre-launch&quot;&gt;Post-feedback&#x2F;Pre-launch&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Build fast, optimize for this stage of growth.&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t build features if you had a million, build for the first 10&#x2F;100.&lt;&#x2F;li&gt;
&lt;li&gt;You don&#x27;t need to automate everything:
&lt;ul&gt;
&lt;li&gt;You need to learn what should be automated and what shouldn&#x27;t&lt;&#x2F;li&gt;
&lt;li&gt;e.g. Some questions for cleaners applying could be asked online, but some interviewing questions needed to be done in-person&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Temporary brokenness is better than permanent paralysis
&lt;ul&gt;
&lt;li&gt;Do not worry about all the edge cases&lt;&#x2F;li&gt;
&lt;li&gt;Worry about the generic user first&lt;&#x2F;li&gt;
&lt;li&gt;As you start to scale, the edge cases become more and more clearer&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Beware of &quot;Frankenstein&quot; approach:
&lt;ul&gt;
&lt;li&gt;With all the feedback, you build it the next day and try to make them happier.&lt;&#x2F;li&gt;
&lt;li&gt;When someone asks you to build a feature:
&lt;ul&gt;
&lt;li&gt;Get to the bottom of why they&#x27;re asking the feature&lt;&#x2F;li&gt;
&lt;li&gt;There maybe a root solution that would otherwise be hidden with all these features&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&#x27;S&#x27; is for stealth and stupidity
&lt;ul&gt;
&lt;li&gt;Don&#x27;t be worried about imitators, that will always be the case&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t let it stop you from launching&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;ready-for-a-lot-of-users&quot;&gt;Ready for a lot of users?&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Focus only on one channel for growth at a time:
&lt;ul&gt;
&lt;li&gt;DON&#x27;T be tempted to do many at once.&lt;&#x2F;li&gt;
&lt;li&gt;Try one channel for a week, move to the next
&lt;ul&gt;
&lt;li&gt;If it fails, move to the next&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Channels always change (e.g. Facebook ads, Google ads)
&lt;ul&gt;
&lt;li&gt;Always optimize for that&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Go back to the failed channels and try to re-visit&lt;&#x2F;li&gt;
&lt;li&gt;Three types of growth:
&lt;ul&gt;
&lt;li&gt;Sticky: Trying to get your existing users to pay you more&lt;&#x2F;li&gt;
&lt;li&gt;Viral: User uses your product, likes it, and tells their friends about it.&lt;&#x2F;li&gt;
&lt;li&gt;Paid: If you have money in the bank, you buy users.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;sticky-growth&quot;&gt;Sticky Growth&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;You need to deliver a good experience, people will want to keep using you&lt;&#x2F;li&gt;
&lt;li&gt;To measure this, you need to look at the CLVs and Retention Cohort analysis
&lt;ul&gt;
&lt;li&gt;Customer Life Time: How much a customer revenue gives you over a time period (6 months, 12 months, etc.)&lt;&#x2F;li&gt;
&lt;li&gt;Retention Cohort analysis: &lt;em&gt;(graph in the video explaining this bit at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;youtu.be&#x2F;yP176MBG9Tk?t=35m10s&quot;&gt;35:10&lt;&#x2F;a&gt;)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;viral-growth&quot;&gt;Viral Growth&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Like Sticky, you need to deliver a good experience, but you need to develop a REALLY good experience&lt;&#x2F;li&gt;
&lt;li&gt;You need a good referral program:
&lt;ul&gt;
&lt;li&gt;Where are people going learning that they can refer other people? (Customer Touch Point)&lt;&#x2F;li&gt;
&lt;li&gt;CTP should be when the user is highly engaged.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;You get $10 if your friend joins and they get $10 too&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;paid-growth&quot;&gt;Paid Growth&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Obvious ways:
&lt;ul&gt;
&lt;li&gt;Display ads&lt;&#x2F;li&gt;
&lt;li&gt;Groupon&lt;&#x2F;li&gt;
&lt;li&gt;Facebook ads&lt;&#x2F;li&gt;
&lt;li&gt;Street marketing&lt;&#x2F;li&gt;
&lt;li&gt;B2b sales&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Do the math to see if paying for the ads actually breaks even or gives you a profit.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;the-art-of-pivoting&quot;&gt;The art of pivoting&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Homejoy was the 13th idea they tried to build.&lt;&#x2F;li&gt;
&lt;li&gt;How did you get to that 13th idea and how did you decide whether to move on?
&lt;ul&gt;
&lt;li&gt;Once you realize you can&#x27;t grow&lt;&#x2F;li&gt;
&lt;li&gt;You can&#x27;t retain users&lt;&#x2F;li&gt;
&lt;li&gt;The economics of the business don&#x27;t make sense&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;How do you know if you may have a delayed growth period? (e.g. 3 years until you start growing)
&lt;ul&gt;
&lt;li&gt;Build what you need to to get 1 user, then 4 users, etc.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re doing this, and you go three-four weeks with no growth, you&#x27;re probably doing something fundamentally work.
&lt;ul&gt;
&lt;li&gt;In this stage you should always be growing.&lt;&#x2F;li&gt;
&lt;li&gt;The graph should start with an exponential growth.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;If your users already have a product that they&#x27;re comfortable with, how do you get them to switch?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;**Ans. ** Find the moments, when you&#x27;re product is much more different from their original product. E.g. If you had a party and you needed the place to be cleaned the next day, you would advertise the next day cleaning part. That&#x27;s when they start using it with the initial product and start to realize how your solution is better.
&quot;These are the 50 ways we&#x27;re better than product X!&quot; is harder to sell rather than a few points that clearly differentiate yourself.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 3 Notes</title>
        <published>2014-09-30T00:00:00+00:00</published>
        <updated>2014-09-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec03/"/>
        <id>https://jonalmeida.com/archive/htsas-lec03/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec03/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ii1jcLg-eIQ&quot;&gt;third lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;counter-intuition-in-startups&quot;&gt;Counter-intuition in Startups&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;em&gt;Ignored PG&#x27;s advice to not take down notes&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;1-don-t-trust-your-intuition&quot;&gt;1. Don&#x27;t trust your intuition&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Startups are counter intuition. It&#x27;s one of the areas where you can&#x27;t always trust your intuition.&lt;&#x2F;li&gt;
&lt;li&gt;Founders generally ignored YC partners about mistakes they are about to make. Later coming back and saying, doh!
&lt;ul&gt;
&lt;li&gt;Why? Because they seem like they&#x27;re wrong.&lt;&#x2F;li&gt;
&lt;li&gt;Trust your instincts about people.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Pick people for business the way you would pick people as friends.
&lt;ul&gt;
&lt;li&gt;Look for people you genuinely like and respect.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;2-expertise-in-startups&quot;&gt;2. Expertise in startups&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;What you need to succeed in a startup, is not expertise in startups.
&lt;ul&gt;
&lt;li&gt;You take a french class to learn french.&lt;&#x2F;li&gt;
&lt;li&gt;You take a startup class to succeed is to understand your users.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;One of the characteristic mistakes of young founders: going through the motions of starting a startup (SAS).
&lt;ul&gt;
&lt;li&gt;i.e. renting a office, hiring some friends, BUT NOT understanding their users and making something users want.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Motion of starting a startup was termed &quot;playing house&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;College classes are as artificial as running laps.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;Growth hacks&quot; == &quot;Bullshit&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;3-gaming-the-system&quot;&gt;3. Gaming the system&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;SAS is where gamging the system stops working&lt;&#x2F;li&gt;
&lt;li&gt;Gaming the system might work in bigger companies.&lt;&#x2F;li&gt;
&lt;li&gt;In startups, there&#x27;s no boss to trick.&lt;&#x2F;li&gt;
&lt;li&gt;Users only care about, &quot;Does your software work?&quot;&lt;&#x2F;li&gt;
&lt;li&gt;(Dangerous) Faking may work to for investors for a few rounds of funding
&lt;ul&gt;
&lt;li&gt;Inevitably, you&#x27;re going to be wasting your time.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Someone who knows what users want but knows zero about fund raising is better off than someone that knows how to raise money but has a flat usage graph.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;4-startups-are-all-consuming&quot;&gt;4. Startups are all consuming&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Startups will take up your entire life&lt;&#x2F;li&gt;
&lt;li&gt;Larry Page analogy:
&lt;ul&gt;
&lt;li&gt;You may envy him, but his life is all-encompassing around Google.&lt;&#x2F;li&gt;
&lt;li&gt;He can&#x27;t go on holiday because of a backlog of decisions only he can make.&lt;&#x2F;li&gt;
&lt;li&gt;As the &quot;daddy&quot;, he can&#x27;t show fear or weakness&lt;&#x2F;li&gt;
&lt;li&gt;Billionaire&#x27;s can&#x27;t complain about having a difficult life&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;In all successful YC companies, all founders say, &quot;It never gets easier&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;SAS is like having kids?&lt;&#x2F;li&gt;
&lt;li&gt;People seem to think that you should SAS in college.
&lt;ul&gt;
&lt;li&gt;You can&#x27;t do this as a student because it takes up your entire life.&lt;&#x2F;li&gt;
&lt;li&gt;Which one do you do then? (Be a student or SAS?)
&lt;ul&gt;
&lt;li&gt;Hint: Don&#x27;t do it in college. Period.&lt;&#x2F;li&gt;
&lt;li&gt;20 is not an optimal age.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;5-you-can-t-tell-if-you-should-sas&quot;&gt;5. You can&#x27;t tell if you should SAS&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Should you do it at any age?
&lt;ul&gt;
&lt;li&gt;You don&#x27;t know.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re terrified - don&#x27;t do it.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re unsure - the only way to know, is to try.&lt;&#x2F;li&gt;
&lt;li&gt;If you want to do it now (20 year old). You need two things:
&lt;ol&gt;
&lt;li&gt;An idea&lt;&#x2F;li&gt;
&lt;li&gt;Co-founders&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;6-do-not-try-to-think-of-startup-ideas&quot;&gt;6. Do not try to think of Startup ideas&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;(&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;paulgraham.com&#x2F;ds.html&quot;&gt;Read PG&#x27;s article&lt;&#x2F;a&gt;)&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;If you make a coscious effort to think of one, you end up with bad ideas.&lt;&#x2F;li&gt;
&lt;li&gt;The best way, is to step back.&lt;&#x2F;li&gt;
&lt;li&gt;Turn your brain into the type that has startup ideas unconsciously.&lt;&#x2F;li&gt;
&lt;li&gt;Google, Yahoo, Facebook all started as side projects.&lt;&#x2F;li&gt;
&lt;li&gt;How to turn your brain into the type that has startup ideas unconsciously:
&lt;ol&gt;
&lt;li&gt;Learn a lot on things that matter&lt;&#x2F;li&gt;
&lt;li&gt;Work on things that interest you..&lt;&#x2F;li&gt;
&lt;li&gt;..with people you like and respect (this is how you get co-founders eventually)&lt;&#x2F;li&gt;
&lt;li&gt;Get to the leading edge of technology where you &quot;live in the future&quot;. Ideas that seem odd to others, see obvious to you.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Airbnb founders were not techie&#x27;s, they were guys that were good at organizing and got things done.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;You don&#x27;t have to work on technology per se, so long as you work on things that stretch you.&quot;
&lt;ul&gt;
&lt;li&gt;What kind of things are those?&lt;&#x2F;li&gt;
&lt;li&gt;History shows young people working on things people thought weren&#x27;t important. In particular, their parents as well. (Parents are also right sometimes).&lt;&#x2F;li&gt;
&lt;li&gt;Long story short: PG doesn&#x27;t know the answer for you, you have to find out what works for you on your own.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Re-visiting: What can you do as a 20 year old?&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Not the new entrepreneurial part of college of SAS.&lt;&#x2F;li&gt;
&lt;li&gt;Instead, the classical version of learning powerful things.
&lt;ul&gt;
&lt;li&gt;Getting domain expertise. (Larry Page was genuinely interested at Search).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;i.e. Just.Learn.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;How can a non-technical founder most contribute to a startup?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; If the startup is working in a specific domain, the non-technical one would be the doing the main tasks of getting the company to work. The technical one would just be writing the interfaces to use it (i.e. Android or iPhone app).
If it was a technology startup, the non-technical founder does sales &quot;and brings coffee and cheeseburgers to the programmer&quot; (+1).&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;Do you see value in business schools for those who want to pursue entrepreneurship?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Nope. Business Schools (BS) was designed for management. You only have management in an already successful startup. BS are trying to be that, but aren&#x27;t doing it right.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;Management is only a problem if you&#x27;re successful. What about those two or three people?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; The first hires aren&#x27;t people you need to &quot;manage&quot;. You have to treat them are almost like founders. They should be motivated by the same thing as your startup.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;Do you think we&#x27;re currently in a bubble?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; &lt;em&gt;Non-valuable question&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;People start labs that are supposed to start startups. Does this seem like a good idea?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; They quite possibly could, but you don&#x27;t have your own money to start these things.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;What advice do you have for female co-founders when you&#x27;re pursing funding?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Female founders empirically have a harder time at raising funding.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Make your startup do really well.&lt;&#x2F;li&gt;
&lt;li&gt;Growth graphs have no gender, so let VCs fall in love with that.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;What would you (PG) learn in college right now?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Physics.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;What are your recurring systems in your work and personal life that make you efficient?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Having kids: you have no time left, so it forces you to focus because you have no choice.&lt;&#x2F;li&gt;
&lt;li&gt;Being forced to work with deadlines you can&#x27;t avoid (which you have to sometimes create yourself).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Q. &lt;em&gt;When is it a good time to turn a side project into a startup?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; You will know. When it starts to take up your entire life that you don&#x27;t have time for anything else.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;What to do when you have growth, but not very impressive one?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; Read, &quot;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;paulgraham.com&#x2F;ds.html&quot;&gt;Do things that don&#x27;t scale&lt;&#x2F;a&gt;&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;What are your strategies to figure out &quot;what matters&quot;?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; If something (like technology) is spreading, anything on the edge is an interesting idea (i.e. bleeding edge).&lt;&#x2F;p&gt;
&lt;p&gt;Q. &lt;em&gt;If you hire people you like, you start to get a mono-culture. How do you avoid that?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Ans.&lt;&#x2F;strong&gt; The advantages that you know and like are far greater than the disadvantages of having a mono-culture.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to Start a Startup - Lecture 2 Notes</title>
        <published>2014-09-25T00:00:00+00:00</published>
        <updated>2014-09-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/htsas-lec02/"/>
        <id>https://jonalmeida.com/archive/htsas-lec02/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/htsas-lec02/">&lt;p&gt;I&#x27;m taking down notes for Sam Altman&#x27;s class, How to Start a Startup and I figured I&#x27;d start sharing them. This is for the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=CVfnkM44Urs&quot;&gt;second lecture&lt;&#x2F;a&gt; with the following notes:&lt;&#x2F;p&gt;
&lt;h1 id=&quot;choosing-a-co-founder&quot;&gt;Choosing a co-founder&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Don&#x27;t choose a random co-founder&lt;&#x2F;li&gt;
&lt;li&gt;Choose someone you have a long history with&lt;&#x2F;li&gt;
&lt;li&gt;When something goes really wrong, you have a past history that binds us together&lt;&#x2F;li&gt;
&lt;li&gt;Meet a co-founder in college&lt;&#x2F;li&gt;
&lt;li&gt;Meeting co-founder while working in a startup&lt;&#x2F;li&gt;
&lt;li&gt;Starting a startup alone is &lt;strong&gt;STILL&lt;&#x2F;strong&gt; a bad idea&lt;&#x2F;li&gt;
&lt;li&gt;Model for choosing a co-founder:
&lt;ul&gt;
&lt;li&gt;Look for a person that behalves like &quot;&lt;strong&gt;James Bond&lt;&#x2F;strong&gt;&quot; rather than one that&#x27;s an expert in a particular domain&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Tough and calm co-founder IF you aren&#x27;t.&lt;&#x2F;li&gt;
&lt;li&gt;You need a technical co-founder&lt;&#x2F;li&gt;
&lt;li&gt;Average number of co-founders: 2-3&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Q. How about co-founders that aren&#x27;t working in the same location?&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DO NOT DO IT!&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;how-to-hire&quot;&gt;How to Hire&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;don-t-hire&quot;&gt;Don&#x27;t Hire&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;First, try &lt;strong&gt;NOT&lt;&#x2F;strong&gt; to hire
&lt;ul&gt;
&lt;li&gt;The goal is not to hire for as long as possible&lt;&#x2F;li&gt;
&lt;li&gt;E.g. Airbnb hired only two people in the first year, and took 5 months&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Find people who feel that they&#x27;re apart of the founding of the company&lt;&#x2F;li&gt;
&lt;li&gt;Hire slowly and with a high hiring bar&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;how-to-actually-hire&quot;&gt;How to ACTUALLY Hire&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Recruiting is hard, not everyone wants to join. It can take a year sometimes.&lt;&#x2F;li&gt;
&lt;li&gt;It&#x27;s important to get the product right first&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;If you&#x27;re going to join a startup, pick a &quot;rocketship&quot;. Something that &lt;em&gt;you&lt;&#x2F;em&gt; know is going to be huge, but not everyone realizes yet.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Good people wait to see if you&#x27;re going to be a &quot;rocketship&quot;&lt;&#x2F;li&gt;
&lt;li&gt;How much should you spend hiring: 0% or 25%&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;mediocre-engineers-do-not-build-great-companies&quot;&gt;Mediocre engineers do not build great companies&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;This can kill the company&lt;&#x2F;li&gt;
&lt;li&gt;They are needed to build the culture of the company&lt;&#x2F;li&gt;
&lt;li&gt;If you comprise in the first ~10 hires that may just &lt;strong&gt;kill&lt;&#x2F;strong&gt; the company
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Will I bet the future of the company on this single hire?&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;When you&#x27;re bigger, you will eventually comprise..&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;sources-of-candidates&quot;&gt;Sources of Candidates&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Personal referrals for the first 100&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Look outside the SV, it&#x27;s brutally hard to hire in SV&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Experience:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Experience matters for some roles.&lt;&#x2F;li&gt;
&lt;li&gt;Early hires doesn&#x27;t matter much, you need to look for aptitude.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Are they smart? Do they get things done? Do I want to spend a lot of time around them?&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Q. How do you know if their initial in-experience is going to be okay when things scale up?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;People who are smart can almost always find a role in the company.&lt;&#x2F;li&gt;
&lt;li&gt;May need to move to a different role or team.&lt;&#x2F;li&gt;
&lt;li&gt;Great employees can move around easily and it&#x27;s usually an issue.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Best way to hire is to work with them to hire. Sometimes you don&#x27;t need to even interview if you&#x27;ve worked on the same project together.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Call references!&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Is this person in the top 5% of the people you&#x27;ve ever worked with?&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;What specifically did you do?&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Will you hire them again? Why aren&#x27;t you hiring them again?&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;If someone cannot communicate clearly, that&#x27;s a BIG problem in the future that they&#x27;ll work out&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Someone who likes to take a bit of risk.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-animal-test&quot;&gt;The Animal Test&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&quot;You should be able to describe any employee as an animal of what they do.&quot;
&lt;ul&gt;
&lt;li&gt;You need unstoppable people&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Mark Zuckerberg said he likes to hire people:
&lt;ol&gt;
&lt;li&gt;He would spend time socially&lt;&#x2F;li&gt;
&lt;li&gt;He&#x27;d be comfortable reporting to if the roles were reversed (you need to have high respect for them).&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;employee-equity&quot;&gt;Employee Equity&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;10% to the first ten employees.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Don&#x27;t be stingy with equity to employees, investors only write the check.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Fight with investors to reduce the equity they get.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Q. When should co-founders decide on the equity split?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Set this very soon as you get started.&lt;&#x2F;li&gt;
&lt;li&gt;If you&#x27;re not willing to give them equal shares, you should question if this is the right relationship?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;&quot;You shouldn&#x27;t tell your employees they&#x27;re fucking up everyday otherwise they will.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Learn to praise your team, you need to give people more responsibility.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Dan Pink (TED) talk on Autonomy, Mastery and Purpose.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;Use one-on-ones.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;how-to-fire&quot;&gt;How to Fire..&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;Every first-time founder waits too long
&lt;ul&gt;
&lt;li&gt;It&#x27;s better for you, and them&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Fire people who create office politics and always negative
&lt;ul&gt;
&lt;li&gt;These will kill a startup!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Q. How do you balance firing people fast and make early employees feel secure?&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;Anyone will screw up once or twice&lt;&#x2F;li&gt;
&lt;li&gt;If someone is getting every decision wrong, it&#x27;s be blatantly obvious who these people are amongst others.&lt;&#x2F;li&gt;
&lt;li&gt;In practice, there&#x27;s almost never any doubt.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;Q. What if you&#x27;re relationship with a co-founder breaks down?&lt;&#x2F;em&gt;
&lt;ul&gt;
&lt;li&gt;You have to have &quot;vesting&quot;.&lt;&#x2F;li&gt;
&lt;li&gt;Pre-negotiate how this will play out before this ever happens.&lt;&#x2F;li&gt;
&lt;li&gt;In SV, it takes four years to earn all of that.
&lt;ul&gt;
&lt;li&gt;E.g. If you leave after one year, you keep 25% of that, two years; 50%, etc.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;If the company leaves with half the company, getting investments is VERY hard after that.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Talk about it early, don&#x27;t let it fester!&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;execution&quot;&gt;Execution&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;The way to execute well is to execute it yourself.&lt;&#x2F;li&gt;
&lt;li&gt;You need to been executing tasks; creates company culture this way.&lt;&#x2F;li&gt;
&lt;li&gt;Put in the effort&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;jobs-of-a-ceo&quot;&gt;Jobs of a CEO&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Set the vision&lt;&#x2F;li&gt;
&lt;li&gt;Raise money&lt;&#x2F;li&gt;
&lt;li&gt;Evangelize&lt;&#x2F;li&gt;
&lt;li&gt;Hire and manage&lt;&#x2F;li&gt;
&lt;li&gt;Make sure the entire company executes (!)
&lt;ul&gt;
&lt;li&gt;Can you figure out what to do?&lt;&#x2F;li&gt;
&lt;li&gt;Can you get it done?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;can-you-get-it-done-focus&quot;&gt;Can you get it done: Focus&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;There are several things that need your attention.
&lt;ul&gt;
&lt;li&gt;You need to figure which of the two or three tasks are the most important, get those done and differ the rest.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Say no. A Lot.&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t work really hard on the things no one cares about.&lt;&#x2F;li&gt;
&lt;li&gt;Set overreaching goals.
&lt;ul&gt;
&lt;li&gt;This is what the whole company focuses on then.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Communication
&lt;ul&gt;
&lt;li&gt;You can&#x27;t be focused without really good communication.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Maintain growth and momentum
&lt;ul&gt;
&lt;li&gt;Have the right metrics and be focused on growing&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Don&#x27;t get (the company) distracted or excited with other things (PR).&lt;&#x2F;li&gt;
&lt;li&gt;Work together. Again, remote co-founders DO NOT WORK.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;can-you-get-it-done-intensity&quot;&gt;Can you get it done: Intensity&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;Startups can&#x27;t give you a good work&#x2F;life balance - that&#x27;s the reality.
&lt;ul&gt;
&lt;li&gt;They&#x27;re all consuming.&lt;&#x2F;li&gt;
&lt;li&gt;You have to be able to outwork your competitors.&lt;&#x2F;li&gt;
&lt;li&gt;You have to be intense (needs to come from co-founders).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Obsess with quality
&lt;ul&gt;
&lt;li&gt;You need to have a culture where people have high quality standards for everything the company does, but still move quickly.&lt;&#x2F;li&gt;
&lt;li&gt;Move fast and break things.&lt;&#x2F;li&gt;
&lt;li&gt;Be frugal in the right places, but care about quality everywhere.&lt;&#x2F;li&gt;
&lt;li&gt;&quot;&lt;em&gt;Don&#x27;t buy people shitty computers, if you don&#x27;t want them to write shitty code.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Be decisive&#x2F;Quick
&lt;ul&gt;
&lt;li&gt;Talk about grand plans, but be biased towards action.&lt;&#x2F;li&gt;
&lt;li&gt;It lets you done in incremental pieces. In the end, you have a huge project completed.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Show up
&lt;ul&gt;
&lt;li&gt;Get on a plane in marginal situations. &amp;lt;- This is good &lt;em&gt;literal&lt;&#x2F;em&gt; advice&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Momentum and growth are the life-blood of startups
&lt;ul&gt;
&lt;li&gt;Always keep momentum!&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;growth&quot;&gt;Growth&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;When there&#x27;s a disagreement among the team on what to do, you ask your users.
&lt;ul&gt;
&lt;li&gt;Stuff isn&#x27;t working right now, we don&#x27;t actually hate each other, we just need to get back on track.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;Shipping a product&lt;&#x2F;li&gt;
&lt;li&gt;Launching a new feature&lt;&#x2F;li&gt;
&lt;li&gt;Reviewing&#x2F;reporting metrics and milestones&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&#x27;t worry about a competitor at all until they&#x27;re actually beating you with a shipped product. Don&#x27;t get down because of the press.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The competitor to be feared is one who never bothers about you at all, but goes on making his own business better all the time.&quot; - Henry Ford&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Lessons from a remote internship for 4 months</title>
        <published>2014-09-22T00:00:00+00:00</published>
        <updated>2014-09-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/lessons-from-remote-work/"/>
        <id>https://jonalmeida.com/archive/lessons-from-remote-work/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/lessons-from-remote-work/">&lt;p&gt;I finally got down to writing this post after settling down back at university wth a proper schedule. When people ask about my last internship at &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;snowplowanalytics.com&quot;&gt;Snowplow Analytics&lt;&#x2F;a&gt;, they&#x27;re always surprised and asking the same question, &quot;Really? A remote internship? How does that work?&quot;. I wanted to write this down to show others what I&#x27;ve learned from my first remote work experience.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;pyjamas-were-not-my-only-work-clothing&quot;&gt;Pyjamas were not my only work clothing&lt;&#x2F;h3&gt;
&lt;p&gt;Yes, it&#x27;s true at first that since you&#x27;re working from home, you don&#x27;t physcally interact with people much, so you don&#x27;t have to dress up in any specific way. I started my day by waking up and then watch YouTube videos or read some news sites for a bit. Then pivot straight to opening my work environment and begin checking my email. An hour and a half later, I&#x27;d realize I hadn&#x27;t eaten yet, so I&#x27;d go do that then clean up and get back at it until lunch. Some times I&#x27;d go straight from bed to emails until lunch (while snacking) to actually getting myself cleaned up. All of this was fun to do at first, just because I couldn&#x27;t.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140922&#x2F;1.png&quot; alt=&quot;I&amp;#39;m an adult... I guess..&quot; &#x2F;&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I learned the hard way that I started to become sluggish, grumpy and affected my lifestyle. The first few hours of my day I&#x27;d get very little done, I&#x27;d half sleep and use the computer (since my workspace was also my bedroom). Everything done during that time was barely productive that I&#x27;d need to work extra later on to get some value out of the day. The longer hours further worsened my day.&lt;&#x2F;p&gt;
&lt;p&gt;I was lucky enough to notice this early on before it started to become a habt. I fixed my schedule by acting like I was going to leave to go work (i.e. breakfast, shower, dress up) but finally head back to my desk, all propped up, and sit down like I just reached. This was a major change in my current routine. Productivity increased, lifestyle, and general happiness.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;coffee-shops-are-your-friend&quot;&gt;Coffee shops are your friend&lt;&#x2F;h3&gt;
&lt;p&gt;One of the problems with always working remotely is that you spend majority of your time alone. I love working in silence wth just the sound of some musc or TV in the background; loud enough to hear, not loud enough to pay attention to. As humans though, we&#x27;re natually social beings so it&#x27;s necessary to get out and interact with others; even being in a social atmosphere. You&#x27;re working remotely and in most situations (like mine), it meant that you only need a computer and nothing else.&lt;&#x2F;p&gt;
&lt;p&gt;I decided to try out working half a day in a coffee shop, and I found out that I&#x27;m just as productive (and sometimes even more) when at a coffee shop. It seemed like being in a social atmosphere seemed to make me focus on my work since there were fewer distractions there than my house which let me fool around and relax too much. This became into a mini-ritual that I would follow: if I needed carefully designed code, grab my laptop head to a coffee shop. It seems odd to rationalize, but this setup worked probably because I zone out everything around, and begin focusing on the task in from of me.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;travel-in-the-weekends&quot;&gt;Travel in the weekends&lt;&#x2F;h3&gt;
&lt;p&gt;I later realized that I could work &lt;em&gt;ANY WHERE&lt;&#x2F;em&gt; I wanted! So I used this opportunity to travel around Canada to places I hadn&#x27;t been to yet. One weekend that included bank holidays, I hopped on a plane to Vancouver and visited some friends there. We went hiking and visited the city all weekend, then on the next work day, I would work in the evenings in order to be on the same time zone as the rest of the team.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;lh4.googleusercontent.com&#x2F;-LVOJRbtYQQA&#x2F;U4wQjH2J-mI&#x2F;AAAAAAAAIgY&#x2F;hAslDPl0GtU&#x2F;w1278-h340-no&#x2F;PANO_20140601_163008.jpg&quot; alt=&quot;Vancouver!&quot; &#x2F;&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I hit Montreal as well for the Osheaga Music Festival on another weekend!&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;lh6.googleusercontent.com&#x2F;-bqsTloHViuM&#x2F;U-Hdnl93qqI&#x2F;AAAAAAAAJ6o&#x2F;WqgRauhGjLw&#x2F;w945-h699-no&#x2F;IMG_20140801_173442.jpg&quot; alt=&quot;Montreal!&quot; &#x2F;&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h3&gt;
&lt;p&gt;Don&#x27;t be afraid to try to get out and go different places, you&#x27;re not limited to just your desk at home. If you were, there wouldn&#x27;t be much difference from working in an office. Also a shout out to Alex and Yali for giving me this internship in the first place that let me do this. I learned &lt;strong&gt;SO MUCH&lt;&#x2F;strong&gt; in so little time and deployed several versions for a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;snowplow&#x2F;snowplow-java-tracker&quot;&gt;bunch&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;snowplow&#x2F;snowplow-ios-tracker&quot;&gt;of&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;snowplow&#x2F;snowplow-android-tracker&quot;&gt;projects&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to keep all your git remotes up-to-date</title>
        <published>2014-07-19T00:00:00+00:00</published>
        <updated>2014-07-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/keeping-all-git-remotes-updated/"/>
        <id>https://jonalmeida.com/blog/keeping-all-git-remotes-updated/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/keeping-all-git-remotes-updated/">&lt;p&gt;You always want your copy of remote in your local repository up-to-date. Having a bunch of git repos doesn&#x27;t help because now you have to check them all (20+ amiright?!). A small portion of my busy-work goes into fetching and rebasing before I start to work on any project.&lt;&#x2F;p&gt;
&lt;p&gt;So I wrote a small bash script which includes stuff that &lt;a href=&quot;&#x2F;posts&#x2F;2013&#x2F;05&#x2F;26&#x2F;different-ways-to-implement-flags-in-bash&#x2F;&quot;&gt;I learned about bash flags previous&lt;&#x2F;a&gt;, and merged it into one script that does something fairly neat:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It goes through each git repository in &lt;code&gt;~&#x2F;git&lt;&#x2F;code&gt; directory (you can change this to another directory with the &lt;code&gt;-d&lt;&#x2F;code&gt; flag)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;git fetch&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Attempts to do a &lt;code&gt;git rebase origin&#x2F;{current_branch}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;If it fails, it&#x27;ll try a &lt;code&gt;git stash&lt;&#x2F;code&gt; to remove any files that are still a work-in-progress&lt;&#x2F;li&gt;
&lt;li&gt;Attempts a git rebase once again&lt;&#x2F;li&gt;
&lt;li&gt;Executes &lt;code&gt;git stash pop&lt;&#x2F;code&gt; regardless if it was successful or not&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Also note, that you can change your remote from &lt;code&gt;origin&lt;&#x2F;code&gt; to something else with the &lt;code&gt;-r&lt;&#x2F;code&gt; flag. Although, you should note that this will the remote used in all git repos.&lt;&#x2F;p&gt;
&lt;p&gt;You can find the code in the snippet below, but the most up-to-date version can always be found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;snippets&#x2F;blob&#x2F;master&#x2F;git&#x2F;fetch-all.sh&quot;&gt;on GitHub&lt;&#x2F;a&gt;.
&lt;br&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Default git directory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;~&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Default remote&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; helpmenu&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;USAGE EXAMPLE:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    fetch-all.sh ~&#x2F;directory_of_git_repos origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setDir&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;checkDir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Path is passed as first argument&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ls&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;checkDir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&amp;amp;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; [[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; ]]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Path isn&amp;#39;t valid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Cannot access &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;: No such directory&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      git_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;checkDir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;function&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; setRemote&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;checkRemote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Second argument is not empty&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; (Should contain a branch)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;checkRemote&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; getopts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;hd:r:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OPTION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  case&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;OPTION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      helpmenu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      checkDir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;OPTARG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      setDir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      checkRemote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;OPTARG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      setRemote&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;      #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    \?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      helpmenu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Changing directory to &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;git_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;git_dir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;for&lt;&#x2F;span&gt;&lt;span&gt; dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;==========================================&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;dir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  cd&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;dir&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git fetch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git rev-parse --abbrev-ref HEAD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  current_branch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rev-parse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-abbrev-ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; HEAD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;current_branch = &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;current_branch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git rebase &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;current_branch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rebase&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;current_branch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; [[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; ]]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git stash&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; stash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git rebase &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;current_branch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rebase&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;git_remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;current_branch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    second_attempt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;git stash pop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; stash&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  if&lt;&#x2F;span&gt;&lt;span&gt; [[&lt;&#x2F;span&gt;&lt;span&gt; second_attempt &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt; ]]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Your repo (&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;.git) has problems..&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;---&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;cd ..&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;done&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Refs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.bubblefoundry.com&#x2F;blog&#x2F;2011&#x2F;02&#x2F;git-status-from-outside-of-the-working-directory&#x2F;&quot;&gt;Git Status From Outside of the Working Directory&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>JSON object conversion into different types with Objective-C</title>
        <published>2014-06-16T00:00:00+00:00</published>
        <updated>2014-06-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/json-conversion-in-objc/"/>
        <id>https://jonalmeida.com/blog/json-conversion-in-objc/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/json-conversion-in-objc/">&lt;p&gt;When dealing with network APIs that use JSON, I find myself constantly converting objects from one form to another for data manipulation or storage. In Objective-C we&#x27;re lucky to have such rich libraries that make life easier. Although, it does tend to get tedious when you start converting an NSDictionary to an NSData, or NSString to NSData, and so on. I wanted to make it easier so I had a one liner option to do this.&lt;&#x2F;p&gt;
&lt;p&gt;An Objective-C Category is something I just learned about recently. It lets you extend a classes functionality without subclassing or having the source to it (!). It seemed easy enough to solve my problems using this.&lt;&#x2F;p&gt;
&lt;p&gt;I wrote a small class that extends &lt;code&gt;NSData&lt;&#x2F;code&gt;, &lt;code&gt;NSString&lt;&#x2F;code&gt; and &lt;code&gt;NSDictionary&lt;&#x2F;code&gt; giving them class methods to return a JSON object from one type to another.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---------------------------------------------------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|     Type     | NSData | NSString | NSDictionary |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|--------------|--------|----------|--------------|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|    NSData    |  n&#x2F;a   |          |              |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|   NSString   |        |   n&#x2F;a    |              |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| NSDictionary |        |          |     n&#x2F;a      |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;---------------------------------------------------&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;usage&quot;&gt;Usage&lt;&#x2F;h2&gt;
&lt;p&gt;Using the category class is trivial. Simply drop the &lt;code&gt;JsonEncoder.h&lt;&#x2F;code&gt; and &lt;code&gt;JsonEncoder.m&lt;&#x2F;code&gt; into your project. And use it similar to the examples below.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;converting-nsstring&quot;&gt;Converting NSString&lt;&#x2F;h3&gt;
&lt;p&gt;A string that is correctly escaped and in the right syntax:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; A string that we want to convert to a dictionary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; json_str &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Using the extended class..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; dict &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; dictionaryFromString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;json_str&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; OR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; data &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; dataWithString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;json_str&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;converting-nsdictionary&quot;&gt;Converting NSDictionary&lt;&#x2F;h3&gt;
&lt;p&gt;We can take a dictionary and convert that easily:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; A simple initialized dictionary&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; dict &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; dictionaryWithObjectsAndKeys&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;							@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; nil&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Using the extended class..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; json_str &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; stringFromDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;dict&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; OR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; data &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; dataFromDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;dict&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;converting-nsdata&quot;&gt;Converting NSData&lt;&#x2F;h3&gt;
&lt;p&gt;NSData also works:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Let&amp;#39;s assume we already have an NSData object!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; We can convert it using the extended class..&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; dict &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSDictionary&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; dictionaryFromData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; OR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt; json_str &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; stringFromData&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;data&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can find the source &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;JsonConverter&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>How to verify if a UUID follows the IETF specification</title>
        <published>2014-05-20T00:00:00+00:00</published>
        <updated>2014-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/testing-for-a-correct-uuid/"/>
        <id>https://jonalmeida.com/blog/testing-for-a-correct-uuid/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/testing-for-a-correct-uuid/">&lt;p&gt;I was playing around with creating UUIDs for adding uniqueness in a project, so I started reading the spec for creating one in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tools.ietf.org&#x2F;html&#x2F;rfc4122&quot;&gt;RFC 4122&lt;&#x2F;a&gt;. Also as a side note, the spec sheets there are really interesting and finely detailed for almost anyone to understand. I don&#x27;t know why I spent so much time on this, I was just having fun and time seemed to pass by..&lt;&#x2F;p&gt;
&lt;h2 id=&quot;understanding-the-spec&quot;&gt;Understanding the spec&lt;&#x2F;h2&gt;
&lt;p&gt;The one I was after was a type 4 UUID which is randomly generated consisting of hex values under &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tools.ietf.org&#x2F;html&#x2F;rfc4122#section-4.4&quot;&gt;section 4.4&lt;&#x2F;a&gt;. Luckily, from everything explained, this was the smallest algorithm required to implement:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4.4.  Algorithms for Creating a UUID from Truly Random or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      Pseudo-Random Numbers&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   The version 4 UUID is meant for generating UUIDs from truly-random or&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   pseudo-random numbers.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   The algorithm is as follows:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   o  Set the two most significant bits (bits 6 and 7) of the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      clock_seq_hi_and_reserved to zero and one, respectively.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   o  Set the four most significant bits (bits 12 through 15) of the&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      time_hi_and_version field to the 4-bit version number from&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      Section 4.1.3.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   o  Set all the other bits to randomly (or pseudo-randomly) chosen&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      values.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So maybe that&#x27;s easier to understand if you read it from the top, but what it essentially says is that you can generate a random set of hex values for 30 of the 32 values, but the 13th bit must be &lt;em&gt;4&lt;&#x2F;em&gt;, which is a way of identifying what type of UUID it is (i.e. type 4), and the 17th bit can be of &lt;em&gt;8&lt;&#x2F;em&gt;, &lt;em&gt;9&lt;&#x2F;em&gt;, &lt;em&gt;a&lt;&#x2F;em&gt; or &lt;em&gt;b&lt;&#x2F;em&gt;. Here&#x27;s an example:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a0424604-03c6-4468-963b-002e5fbe2812&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              ^    ^&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              |    |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;           always 4|&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                   |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               either 8,9,a,b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The code for writing this was fairly simple and can be found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;UUIDGenerator&quot;&gt;on GitHub&lt;&#x2F;a&gt;, but I wanted a way to verify it was created correctly.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;verifying-the-correct-form&quot;&gt;Verifying the correct form&lt;&#x2F;h2&gt;
&lt;p&gt;After asking around and a few StackOverflow questions later, it seemed easiest to use a regex expression to solve this. I came up with a regex expression that tests for all four possible formats it could be expressed in. They look like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Lower case without hypens: 7185f40e722c4cfa8de5daedf048ea12&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Upper case without hypens: 21A338B30A57462780450D4B6AF7A3EE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Lower case with hypens: 7e0b2da6-38c3-4873-83f7-aab0cacb7603&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Upper case with hypens: FDFC7265-BA5E-4A63-9A51-AC661107EB37&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is the regex expression I finally ended up using:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[0-9a-fA-F]{8}-?[0-9a-fA-F]{4}-?4[0-9a-fA-F]{3}-?[89abAB][0-9a-fA-F]{3}-?[0-9a-fA-F]{12}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;To break down what the regex says:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;First 8 characters can be anything from 0-9, a-f, A-F: &lt;code&gt;[0-9a-fA-F]{8}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;A single hypen may follow: &lt;code&gt;-?&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Next 4 characters can be anything from 0-9, a-f, A-F: &lt;code&gt;[0-9a-fA-F]{4}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;A single hypen may follow: &lt;code&gt;-?&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;A single &#x27;4&#x27; must follow&lt;&#x2F;li&gt;
&lt;li&gt;Next 3 characters can be anything from 0-9, a-f, A-F: &lt;code&gt;[0-9a-fA-F]{3}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;A single hypen may follow: &lt;code&gt;-?&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;The next character must be either 8, 9, a, b: &lt;code&gt;[89abAB]&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Next 3 characters can be anything from 0-9, a-f, A-F: &lt;code&gt;[0-9a-fA-F]{3}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;A single hypen may follow: &lt;code&gt;-?&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Next 12 characters can be anything from 0-9, a-f, A-F: &lt;code&gt;[0-9a-fA-F]{12}&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;Spec sheets explain everything you need about said thing even though they look ugly and seem too monotinous to read. You can find a couple of tests I wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;UUIDGenerator&#x2F;blob&#x2F;master&#x2F;UUIDGeneratorTests&#x2F;UUIDGeneratorTests.m&quot;&gt;on GitHub&lt;&#x2F;a&gt; as well in an objective-c implementation. This is what one of the tests look like:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;objective-c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;void&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;testCorrectUUIDFormat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  UUIDGenerator &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;u_generator &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;UUIDGenerator &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;alloc&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; init&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;u_generator &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;uuid4WithCaps&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;false&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; hypenated&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;true&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSRange&lt;&#x2F;span&gt;&lt;span&gt; searchRange &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; NSMakeRange&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSError&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;error &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; NULL&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  NSRegularExpression &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;regex &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;NSRegularExpression &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;regularExpressionWithPattern&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;pattern &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; error&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;amp;&lt;&#x2F;span&gt;&lt;span&gt;error&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSArray&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;matches &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;regex &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;matchesInString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; range&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;searchRange&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  [&lt;&#x2F;span&gt;&lt;span&gt;matches &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;NSTextCheckingResult&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; match &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;in&lt;&#x2F;span&gt;&lt;span&gt; matches&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    NSString&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt; matchText &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;substringWithRange&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;match &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;range&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    NSLog&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;match: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;%@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; matchText&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    NSRange&lt;&#x2F;span&gt;&lt;span&gt; group1 &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;match &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;rangeAtIndex&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    NSLog&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;group1: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;%@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;substringWithRange&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;group1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSLog&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Our UUID, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;%@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; sample_uuid&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  NSLog&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Our UUID length, &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;%lu&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;unsigned&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; long&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;sample_uuid &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;length&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  XCTAssertEqual&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span&gt;matches &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;UUID generated doesn&amp;#39;t match the type 4 UUID RFC&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Refs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;11384589&#x2F;what-is-the-correct-regex-for-matching-values-generated-by-uuid-uuid4-hex&quot;&gt;What is the correct regex for matching values generated by uuid.uuid4().hex?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Ubuntu 14.04 without Unity launcher</title>
        <published>2014-05-08T00:00:00+00:00</published>
        <updated>2014-05-08T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/ubuntu-14-04-without-unity-launcher/"/>
        <id>https://jonalmeida.com/archive/ubuntu-14-04-without-unity-launcher/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/ubuntu-14-04-without-unity-launcher/">&lt;p&gt;Ubuntu 14.04 LTS recently launched so I decided to give it a spin on a spare SSD I had (I&#x27;m not a fan of desktop VMs). So far I&#x27;m really happy with everything, especially the polish that comes with it. On my T420s I get optimal battery performance and a level of speed I&#x27;m able to live with. The only thing I didn&#x27;t want was the Unity launcher - it&#x27;s a neat idea and I&#x27;m not a crazy rager who is out to kill everything new, but I just don&#x27;t find myself using it &lt;em&gt;at all&lt;&#x2F;em&gt; since Ubuntu 11.04.&lt;&#x2F;p&gt;
&lt;p&gt;There isn&#x27;t any way to disable it entirely, but you can make it go away and never show up.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;unity-tweak-tool&quot;&gt;Unity Tweak Tool&lt;&#x2F;h2&gt;
&lt;p&gt;You&#x27;re going to need Unity Tweak Tool which should be in Trusty third party repos:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-tweak-tool&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There are a couple of things you need to disable to stop the launcher from showing up when you mouse-over certain areas or certain key combinations:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Unity -&amp;gt; Launcher&lt;&#x2F;li&gt;
&lt;li&gt;Auto-Hide: &lt;em&gt;ON&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reveal Location: &lt;em&gt;Top Left Corner&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Reveal Sensitivity: &lt;em&gt;0%&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Unity -&amp;gt; Web Apps&lt;&#x2F;li&gt;
&lt;li&gt;Integration prompts: &lt;em&gt;OFF&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Amazon: &lt;em&gt;UNCHECK&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Ubuntu One: &lt;em&gt;UNCHECK&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140508&#x2F;1.png&quot; alt=&quot;image&quot; &#x2F;&gt;
&lt;br&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Disable the launcher from appearing when you press and hold the super key:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Unity -&amp;gt; Additional&lt;&#x2F;li&gt;
&lt;li&gt;Show Launcher: &lt;em&gt;Disabled&lt;&#x2F;em&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140508&#x2F;2.png&quot; alt=&quot;image&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;removing-unity-lens-optional&quot;&gt;Removing Unity Lens (Optional)&lt;&#x2F;h2&gt;
&lt;p&gt;I didn&#x27;t really see the point of keeping a bunch of Unity lenses. Even if I was going to re-enable the launcher, I was never going to use them. These are just a few of them that I had particularly no interest in them.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; purge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-lens-video&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-lens-music&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-audacious&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-clementine&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-colourlovers&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-gdrive&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-gmusicbrowser&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-gourmet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-guayadeque&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-manpages&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-musique&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-openclipart&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-tomboy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-yelp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-zotero&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; unity-scope-musicstores&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up my private server on DigitalOcean</title>
        <published>2014-03-21T00:00:00+00:00</published>
        <updated>2014-03-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/setting-up-private-server-digital-ocean/"/>
        <id>https://jonalmeida.com/archive/setting-up-private-server-digital-ocean/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/setting-up-private-server-digital-ocean/">&lt;p&gt;Today I joined DigitalOcean and created my host server which they refer to as &quot;Droplets&quot;. Within a few hours I had set-up my host server &lt;em&gt;exactly&lt;&#x2F;em&gt; how I wanted it faster than I would have ever imagined with the set-up process from DigitalOcean that made so simple.&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s nothing to really say or explain about their set-up process. It&#x27;s just easy and simple - choose a host name, host size, server location, base OS image and optional SSH keys if you don&#x27;t want to use a password.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EDIT:&lt;&#x2F;strong&gt;
I decided to install Gitlab after all, so I manually installed gitlab to my server but it seemed to severly slow it down. Instead, I created a new Droplet with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.digitalocean.com&#x2F;community&#x2F;articles&#x2F;how-to-use-the-gitlab-one-click-install-image-to-manage-git-repositories&quot;&gt;One-Click Install Image for Gitlab&lt;&#x2F;a&gt; (for some reason this version is less memory intensive), and then moved all my configuration&#x2F;setup to the new Droplet.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Also I moved the gitlab instance from running at &#x27;&#x2F;&#x27; to &#x27;&#x2F;gitlab&#x27; instead.
With v6.6 it was pretty easy with the documentation within the configuration. You basically have to make four changes:&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;In your application.rb file: &lt;code&gt;config.relative_url_root = &quot;&#x2F;gitlab&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In your gitlab.yml file: &lt;code&gt;relative_url_root: &#x2F;gitlab&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In your unicorn.rb: &lt;code&gt;ENV[&#x27;RAILS_RELATIVE_URL_ROOT&#x27;] = &quot;&#x2F;gitlab&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In ..&#x2F;gitlab-shell&#x2F;config.yml: &lt;code&gt;gitlab_url: &quot;http:&#x2F;&#x2F;127.0.0.1&#x2F;gitlab&quot;&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;In lib&#x2F;support&#x2F;nginx&#x2F;gitlab : do not use asset gzipping, remove block starting with &quot;location ~ ^&#x2F;(assets)&#x2F;&quot;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;blockquote&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;update-first&quot;&gt;Update First&lt;&#x2F;h3&gt;
&lt;p&gt;I chose my base image as Ubuntu 12.04 x64 being an LTS, I find it much nicer to use. First things first, I SSH&#x27;d in and &lt;code&gt;apt-get update &amp;amp;&amp;amp; apt-get upgrade&lt;&#x2F;code&gt; to make sure everything was up-to-date.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;docker&quot;&gt;Docker&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m learning more about deployment using docker so I had that installed as well. It&#x27;s worth mentioning that DO has a BETA feature when creating your Droplet with pre-installing applications like Docker, Ghost or GitLab. However, I prefer doing this myself so I know exactly what is installed. I followed the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;docs.docker.io&#x2F;en&#x2F;latest&#x2F;installation&#x2F;ubuntulinux&#x2F;&quot;&gt;Docker installation guide for Ubuntu 12.04&lt;&#x2F;a&gt;, but I skipped updating the kernel since the base image was already using kernel 3.8.x.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;private-vpn&quot;&gt;Private VPN&lt;&#x2F;h3&gt;
&lt;p&gt;I always wanted to have access to all my boxes at all times, and DO has a nice simple guide to setting up a PPTP VPN on your server to allow connected clients to communicate with each other. You can find the article &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.digitalocean.com&#x2F;community&#x2F;articles&#x2F;how-to-setup-your-own-vpn-with-pptp&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you want to run your traffic through any one of your other clients (and they also have an SSH server running on them), I&#x27;ve found using sshuttle really easy for that.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;When connected via VPN you can use &lt;code&gt;sshuttle --dns -r [PPTP_IP_ADDRESS] 0&#x2F;0&lt;&#x2F;code&gt; to have your traffic including your DNS go through the client of your choice. It&#x27;s helpful if you have clients in different countries and need local web access for whatever reason.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;sub-domain&quot;&gt;Sub-domain&lt;&#x2F;h3&gt;
&lt;p&gt;When you create your droplet, you&#x27;re given an external IP that you can use to remote in, but no one wants to remember that. Since I have my domains managed with &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;namecheap.com&quot;&gt;namecheap.com&lt;&#x2F;a&gt; I chose to manage this server as a domain through that instead of DO&#x27;s own nameservers.&lt;&#x2F;p&gt;
&lt;p&gt;The blurred out bit in the image below, is where you would enter your external IP address and the sub domain is up to you.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140321&#x2F;1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git&quot;&gt;Git&lt;&#x2F;h3&gt;
&lt;p&gt;This was probably the easiest bit, just install git: &lt;code&gt;apt-get install git git-core&lt;&#x2F;code&gt;.
Everything was going to do be done as a private repo for now so it would be behind SSH and I didn&#x27;t care for having a web interface for it. You can find more details on &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.git-scm.com&#x2F;book&#x2F;en&#x2F;Git-on-the-Server-Setting-Up-the-Server&quot;&gt;settings up a git server correctly&lt;&#x2F;a&gt;, but essentially all you need to do is:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-repo.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; my-repo.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-bare&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; init&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
Clients would add the remote as:
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ssh:&#x2F;&#x2F;jonathan@atlas.somedomain.com&#x2F;location&#x2F;of&#x2F;my-repo.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;configuring-clients&quot;&gt;Configuring clients&lt;&#x2F;h3&gt;
&lt;p&gt;Most Linux OSes come with a PPTP client installed so setting that up is quite trivial.
I created a few SSH configurations so I can type less:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Host&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; atlas&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    HostName&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; atlas.somedomain.com&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    User&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jonathan&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
As well as a few aliases in my `.bashrc` that looked something like this:
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;alias&lt;&#x2F;span&gt;&lt;span&gt; atlas-connect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;sshuttle --dns -vvr jonathan@atlas.somedomain.com 0&#x2F;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;swap-file&quot;&gt;Swap File&lt;&#x2F;h3&gt;
&lt;p&gt;If you&#x27;re using the 512MB RAM configuration, it&#x27;s also wise to setup a swap file since you will inevitably run into low memory issues &lt;em&gt;very&lt;&#x2F;em&gt; soon. DO have yet another very &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.digitalocean.com&#x2F;community&#x2F;articles&#x2F;how-to-add-swap-on-ubuntu-12-04&quot;&gt;handy tutorial on how to do exactly that&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;If you found any of this useful and you&#x27;re going to join DigitalOcean as well, why not use &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.digitalocean.com&#x2F;?refcode=8492838d309e&quot;&gt;my referral link&lt;&#x2F;a&gt; instead. :)&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Android HTTP GET requests stored in JSON</title>
        <published>2014-03-17T00:00:00+00:00</published>
        <updated>2014-03-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/http-android-post-get/"/>
        <id>https://jonalmeida.com/archive/http-android-post-get/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/http-android-post-get/">&lt;p&gt;In my current project, I&#x27;m currently working on making an Android client send simple HTTP GET requests for data to a web API. I finally managed to get it working using the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;developer.android.com&#x2F;reference&#x2F;org&#x2F;apache&#x2F;http&#x2F;package-summary.html&quot;&gt;HTTP Apache library&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;&#x2F;strong&gt; I un-indented the code so it would fit better on the page even though it looks a bit ugly. You might be better off copying it to your text editor to read it better.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;java&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HttpClient&lt;&#x2F;span&gt;&lt;span&gt; httpclient&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; DefaultHttpClient&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HttpPost&lt;&#x2F;span&gt;&lt;span&gt; httppost&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; HttpPost&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;http:&#x2F;&#x2F;dogecoin.com&#x2F;api&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;HttpResponse&lt;&#x2F;span&gt;&lt;span&gt; httpresponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;final&lt;&#x2F;span&gt;&lt;span&gt; Thread&lt;&#x2F;span&gt;&lt;span&gt; t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; Thread&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    public&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; void&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Looper&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;prepare&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ArrayList&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NameValuePair&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; postParameters&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    postParameters &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span&gt; ArrayList&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NameValuePair&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    postParameters&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BasicNameValuePair&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;value&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    postParameters&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BasicNameValuePair&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;double&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Double&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;123&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    postParameters&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;add&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BasicNameValuePair&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;float&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; Float&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;123.04&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        httppost&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;setEntity&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; UrlEncodedFormEntity&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;postParameters&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; reset to null before making a new post if it&amp;#39;s being reused&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        httpresponse &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        httpresponse &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; httpclient&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;execute&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;httppost&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;IOException&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt; e1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        e1&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;printStackTrace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Checking response&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;httpresponse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;!=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;null&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    try&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;        &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; Get the data in the entity&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        BufferedReader&lt;&#x2F;span&gt;&lt;span&gt; reader&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; BufferedReader&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;            new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; InputStreamReader&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                httpresponse&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getEntity&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;getContent&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;UTF-8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        )&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        StringBuilder&lt;&#x2F;span&gt;&lt;span&gt; builder&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; StringBuilder&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;        for&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;String&lt;&#x2F;span&gt;&lt;span&gt; line&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;line &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt; reader&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;readLine&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; null&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            builder&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;line&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;append&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        JSONTokener&lt;&#x2F;span&gt;&lt;span&gt; tokener&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; JSONTokener&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;builder&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        JSONObject&lt;&#x2F;span&gt;&lt;span&gt; finaljson&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; JSONObject&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;tokener&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Log&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;JSON OUTPUT: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; finaljson&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;toString&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;IOException&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt; e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;printStackTrace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; catch&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;JSONException&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#E36209, #FFAB70);&quot;&gt; e&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        e&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;printStackTrace&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Looper&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;loop&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;Loop in the message queue&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;t&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;start&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
&lt;p&gt;To explain some parts that might not seem obvious, we use &lt;code&gt;new UrlEncodedFormEntity()&lt;&#x2F;code&gt; to URL encode the name-value pairs to be &lt;code&gt;http:&#x2F;&#x2F;dogecoin.com&#x2F;api?key=value&lt;&#x2F;code&gt;. The encoder handles the character conversion so you can enter it in it&#x27;s original ASCII form.&lt;&#x2F;p&gt;
&lt;p&gt;Any non-string type needs to be converted into a string in order to be encoded. This is mainly because &lt;code&gt;BasicNameValuePair&lt;&#x2F;code&gt; handles only strings.&lt;&#x2F;p&gt;
&lt;p&gt;After executing the HttpPost, if our response is going to be JSON encoded, we can loop through the response to hold within a string, and then use the &lt;code&gt;JSONTokener&lt;&#x2F;code&gt; to build a &lt;code&gt;JSONObject&lt;&#x2F;code&gt;. You ought to output the response into the logs the first few times just to verify it is correct.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Side Note:&lt;&#x2F;strong&gt; To remain consistent you could always store your GET message in JSON as well and create a &lt;code&gt;getNameValueArrayList()&lt;&#x2F;code&gt; to easily output the object. However, that solely depends on your needs.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Setting up ownCloud on Mac OS Mountain Lion to use via SSH</title>
        <published>2014-01-05T00:00:00+00:00</published>
        <updated>2014-01-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/setting-up-owncloud/"/>
        <id>https://jonalmeida.com/archive/setting-up-owncloud/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/setting-up-owncloud/">&lt;p&gt;I&#x27;ve been looking for a way to remotely access my media securely using ownCloud but I could never get myself to sit down and do it. Turns out that it&#x27;s a bit of a hurdle on Mac OS because it &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.owncloud.org&#x2F;server&#x2F;5.0&#x2F;admin_manual&#x2F;installation&#x2F;installation_macos.html&quot;&gt;isn&#x27;t officially supported&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setting-up-the-web-server&quot;&gt;Setting up the web server&lt;&#x2F;h2&gt;
&lt;p&gt;In Mountain Lion, Apple remove the option to easily start a web server from System Preferences -&amp;gt; Sharing. So instead we have to do it via Terminal.app, which if fine since we can setup a few more things from there as well.&lt;&#x2F;p&gt;
&lt;p&gt;First check where the server&#x27;s root directory starts in:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;jonathan$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;DocumentRoot &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;etc&#x2F;apache2&#x2F;httpd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;DocumentRoot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;Library&#x2F;WebServer&#x2F;Documents&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
I preferred to change this to `&#x2F;Library&#x2F;WebServer&#x2F;Sites` to make it more consistent, but I&#x27;ll only refer to the default one in this post.
&lt;p&gt;Uncomment the line &lt;code&gt;php5_module&lt;&#x2F;code&gt; in the &lt;code&gt;&#x2F;etc&#x2F;apache2&#x2F;httpd.conf&lt;&#x2F;code&gt; to enable php5 since ownCloud requires it. It should look something like this:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140105&#x2F;1.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Create a configuration that allows your user to access the web server.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vim&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;etc&#x2F;apache2&#x2F;users&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;whoami&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;`&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
Add this configuration into the file:
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;Directory&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt; &amp;quot;&#x2F;Library&#x2F;WebServer&#x2F;Documents&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     Options Indexes MultiViews&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     AllowOverride All&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     Order allow,deny&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     Allow from all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;Directory&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
Then start the server with:
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apachectl&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; start&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
If you didn&#x27;t modify your DocumentRoot, going to `localhost` in your web browser will show &quot;It Works!&quot;, otherwise, create a simple `index.html` file in your DocumentRoot directory just to verify it works.
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140105&#x2F;2.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;installing-owncloud-server&quot;&gt;Installing ownCloud server&lt;&#x2F;h2&gt;
&lt;p&gt;Go to the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;owncloud.org&#x2F;install&#x2F;&quot;&gt;ownCloud download page&lt;&#x2F;a&gt; and download the latest server as a tar file and extract the contents. You want to move the &#x27;&#x2F;owncloud&#x27; directory to your DocumentRoot location &lt;code&gt;&#x2F;Library&#x2F;WebServer&#x2F;Documents&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Give the apache webserver the right ownership to the owncloud directory:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;R&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; _www:_www&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;Library&#x2F;WebServer&#x2F;Documents&#x2F;owncloud&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
You also need to create a `.htaccess` file at the DocumentRoot location with:
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Options&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; FollowSymLinks&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
If all went well, you should now be able to setup an administrator account in ownCloud from your browser with `http:&#x2F;&#x2F;localhost&#x2F;owncloud`. &lt;br&gt;
*Note: During the setup, you should change the data folder to another location under Advanced for security. I chose mine to be* `&#x2F;Library&#x2F;WebServer&#x2F;owncloud&#x2F;data`.
&lt;p&gt;If you do change the data directory, remember to give that directory the same ownership so that it can be accessed as well:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;R&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; _www:_www&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;Library&#x2F;WebServer&#x2F;owncloud&#x2F;data&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;adding-local-server-directories&quot;&gt;Adding local server directories&lt;&#x2F;h2&gt;
&lt;p&gt;I wanted to be able to add local directories that were part of my user files on my Mac. I found out that you can do that by installing the ownCloud app &lt;strong&gt;External storage support&lt;&#x2F;strong&gt;.
Then in the admin settings, setup a folder from there with the &#x27;Configuration&#x27; field as the absolute path to the directory you want. When done, a green circle will show up, to confirm if the folder is accessible.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140105&#x2F;3.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;accessing-via-ssh&quot;&gt;Accessing via SSH&lt;&#x2F;h2&gt;
&lt;p&gt;If you&#x27;re behind a firewall or a local network, this web server won&#x27;t be accessible past your LAN (which is how I wanted it). For those instances where I &lt;em&gt;did&lt;&#x2F;em&gt; want to access it remotely, I wanted to do so over SSH which makes me feel a bit safer.&lt;&#x2F;p&gt;
&lt;p&gt;You can enable SSH from System Preferences -&amp;gt; Sharing -&amp;gt; Check &quot;Remote Login&quot; and port forward that from your router if needed. If you need help port forwarding, &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;lmgtfy.com&#x2F;?q=how+to+port+forward&quot;&gt;this is a generic solution that should work for most&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Also, consider changing the default SSH port to something other that port 22 to avoid random attacks at your IP address. &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;serverfault.com&#x2F;questions&#x2F;18761&#x2F;how-to-change-sshd-port-on-mac-os-x&quot;&gt;Check out this serverfault question on how to do that.&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Open an SSH tunnel to your remote ownCloud server like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;L&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 5900:localhost:80&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; user@your_host_ip&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
This tunnels all traffic from your remote port 80 to your local port 5900. Once you&#x27;ve authenticated that connection, you can go to your web browser on this computer and access your ownCloud with `http:&#x2F;&#x2F;localhost:5900&#x2F;owncloud`
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20140105&#x2F;4.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;br&gt;
Refs: 
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ranjith.info&#x2F;p&#x2F;owncloud.html&quot;&gt;Adding an internal directory or external hard drive to Owncloud server&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;9720325&#x2F;wordpress-options-followsymlinks-error&quot;&gt;Wordpress Options FollowSymLinks error&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.cyberciti.biz&#x2F;faq&#x2F;enable-apache2-2-php5-on-apple-os-x-10-8-mountain-lion&#x2F;&quot;&gt;OS X Mountain Lion 10.8 Set Apache and PHP Web-Server&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;blog.macminicolo.net&#x2F;post&#x2F;30393400851&#x2F;install-owncloud-on-a-mac-mini-server&quot;&gt;Install Owncloud on a Mac mini server&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;doc.owncloud.org&#x2F;server&#x2F;5.0&#x2F;admin_manual&#x2F;installation.html&quot;&gt;ownCloud Administrators Manual&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>BlackBerry Picture Password is more secure than you think</title>
        <published>2013-12-27T00:00:00+00:00</published>
        <updated>2013-12-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/blackberry-picture-password/"/>
        <id>https://jonalmeida.com/archive/blackberry-picture-password/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/blackberry-picture-password/">&lt;br&gt;
*Warning: My opinion is quite biased since I own a BlackBerry and having interned there as well.*
&lt;p&gt;With the BlackBerry 10.2.1 release a new security feature called Picture Password was added. It works by lining up a chosen number with a specific (also chosen) point on a picture. This is a vague description because it isn&#x27;t as easy to explain in words as it is to show.&lt;&#x2F;p&gt;
&lt;p&gt;N4BB.com has a nice video showing how it works:&lt;&#x2F;p&gt;
&lt;iframe 
  src=&quot;http:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;ucpQ_0iHrWg&quot; 
  frameborder=&quot;0&quot; 
  allowfullscreen&gt;
&lt;&#x2F;iframe&gt;
&lt;p&gt;What is really neat about this is, unlike other picture or pattern password locks on other platforms, you can&#x27;t as easily figure out the password the old fashioned way -  sneaking a look over the other person&#x27;s shoulder.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;i-m-not-crazy-honest&quot;&gt;I&#x27;m not crazy, honest&lt;&#x2F;h3&gt;
&lt;p&gt;You&#x27;re going to think I&#x27;m a bit of a whack job when I try to explain the value of this, but bare with me. Some of my points might seem unlikely, but if a sleep-deprived manic like me can figure out the security pattern on your device by simple observation, I&#x27;m sure anyone can.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;where-other-platforms-fall-short&quot;&gt;Where other platforms fall short&lt;&#x2F;h3&gt;
&lt;p&gt;If we look at the Android pattern method, it seems like a neat idea - create a complicated pattern from a 3x3 matrix. I&#x27;m not willing to do the math, but you can tell there are plenty enough combinations available to make it uniquely secure enough for an average user. Let&#x27;s just assume you can&#x27;t have a large matrix for now.&lt;&#x2F;p&gt;
&lt;p&gt;Where the Android device fails, is it requires you to re-create the same pattern every time at the same location on your screen. This might seem nonsensical to some, but it&#x27;s fairly easy to figure out someone&#x27;s pattern when they&#x27;ve unlocked their phone. Having a quick peek, will show the green line trace of the pattern while its being drawn out.&lt;&#x2F;p&gt;
&lt;p&gt;Alright, so you have a custom ROM which let&#x27;s you turn off the tracing so that others around you can&#x27;t see it. Another way, assuming you&#x27;ve got a hold of the person&#x27;s device by now, is by the smudge marks from the person&#x27;s finger that shows the path of the unlock pattern. In fact, I&#x27;ve even figured out a friend&#x27;s Android unlock pattern using this method just to prove this point to them.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20131227&#x2F;unlock.png&quot; alt=&quot;comparison&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I tried to take a picture of what I&#x27;m struggling to explain; you can see in the image on the right that there is a faint smudge of my finger from my last attempt to unlock my device. However, it&#x27;s much more evident than what you can see from the image and I&#x27;ve kept my pattern simple to make it easy to show.&lt;&#x2F;p&gt;
&lt;p&gt;If I remember correctly, Windows 8 implemented the same feature, but with a larger matrix. That&#x27;s great and all, but now the password get&#x27;s complicated and destroys the ease that initially came with it.&lt;&#x2F;p&gt;
&lt;p&gt;Windows 8 had also tried another take on this - instead of using set points to draw your personal security pattern, you get to make your own pattern across a picture of your choice. But once again, they too fall short because you&#x27;re left with the same problem. You can connect the dots, but you can potentially leave behind a fingerprint trace.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-way-it-should-work&quot;&gt;The way it should work&lt;&#x2F;h3&gt;
&lt;p&gt;Enter BlackBerry&#x27;s Picture Password.&lt;&#x2F;p&gt;
&lt;p&gt;It just needs you line up a number to a set point on a picture- this doesn&#x27;t seem too trivial. Surely you can figure it out some way? The catch is, a grid of numbers is placed above the picture in a random order (with repetitions) like an overlay between two pictures. Now you have to line up your number (which is randomly placed) to that point and you don&#x27;t even have to place your finger over that number as well. You move the grid, like your scrolling on a mobile touchscreen browser.&lt;&#x2F;p&gt;
&lt;p&gt;With this method of security, you aren&#x27;t giving up your number or the selected picture point since the overlooker won&#x27;t be able to match one with the other.&lt;&#x2F;p&gt;
&lt;p&gt;I jokingly bet with another friend that I could unlock my phone in front of him a hundred times and he still wouldn&#x27;t manage to figure the combination. Some time later, I found myself repeatedly re-locking my phone and holding a zombie finger above to unlock the device while he closely looked on. I wasn&#x27;t keeping a score, but *cough* &lt;em&gt;65 tries&lt;&#x2F;em&gt; *cough* later he gave up.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Working in a post-waterfall development company</title>
        <published>2013-12-25T00:00:00+00:00</published>
        <updated>2013-12-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/working-in-a-post-waterfall-company/"/>
        <id>https://jonalmeida.com/archive/working-in-a-post-waterfall-company/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/working-in-a-post-waterfall-company/">&lt;p&gt;I&#x27;m an avid &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;news.ycombinator.com&#x2F;news&quot;&gt;Hacker News&lt;&#x2F;a&gt; reader, and in doing so I came across one of Aaron Swartz&#x27;s old blog posts called &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.aaronsw.com&#x2F;weblog&#x2F;officespace&quot;&gt;Office Spaces&lt;&#x2F;a&gt;. In essence, he talks about how we have a terrible routine where we are always surrounded by &quot;grey noise&quot; which blocks us for actually doing work.
This puts me in an odd place because I feel &lt;em&gt;exactly&lt;&#x2F;em&gt; as how he described the office space, a place where you go to not get work done because we&#x27;re constantly travelling there, bothered by others at work, or distracted by a broad range of things.&lt;&#x2F;p&gt;
&lt;p&gt;I recently finished an internship at BlackBerry and I&#x27;m fairly pleased with what I&#x27;ve accomplished in the past 8 months. A background of the work culture needs to be understood before I can go any further. &lt;br&gt;
At this time, the company isn&#x27;t in the best financial standing as it was only a few years ago having lost massive amounts of the North American ecosystem to competitors. One of the reasons this may have been, because of the slow release cycle that was followed all these years that come to getting a major release out the door. Since then, they&#x27;ve moved to an agile work flow, i.e. fewer meetings, more development. &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;readwrite.com&#x2F;2013&#x2F;11&#x2F;27&#x2F;agile-development-software&quot;&gt;ReadWrite has a nice article about enterprise needing to change to this model.&lt;&#x2F;a&gt; This change is still a work in progress so it&#x27;s a half implemented development process which leaves you wanting more. You still get the feeling there are places in the company that don&#x27;t like the idea of working how you please as long as you get the job done. Maybe it&#x27;s years of having developed the habit of working from 9 to 5. This may work in some companies, but software development is definitely not one of them. &lt;br&gt;
Keeping this in mind, I tried to follow as little as possible of the norm, with the sole idea of getting things done even if it meant bothering people daily. I&#x27;m not a moron, I wouldn&#x27;t be pushy if I knew someone was working on something more important. You can easily see over time who those people are, and who aren&#x27;t. Even through the short time of my internship I felt the pattern settling in where I would slow down and follow a laid back schedule. This may have been because I started realizing my internship was coming to an end, but there was more to it than that, since I was fully aware of this being an issue, I chose to forget the days and not focus on the time left. Luckily, I was in one of the teams that were open to a flexible work timings and giving you, the developer, more control on what to do. This made a huge difference as well on how I would work. Instead of working on what others thought were more important, I was able to fix bugs that I felt required more time.&lt;&#x2F;p&gt;
&lt;p&gt;Another interesting observation I came across was while I was sick. I was too sickly to get to work (which takes about a hour just going there), so I decided to work at home. I was staying at my parent&#x27;s place and the entire house was empty since everyone else had gone to work. I sent the occasional email from my phone while still in bed with one eye barely open and then went back to sleep. Later on, I cleaned myself up and since there wasn&#x27;t anything urgent I launched Steam and started an early afternoon DotA game while my work laptop was starting up and settings up my environment. I was amazed at how many bug fixes and early feature implementations I was able to accomplish at such an extraordinary speed. Having no one around, gave me a pressure-free work environment. I screwed around for some time, grabbed a snack every now and then without annoying others with my &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;youtu.be&#x2F;yPBNx6eB18w?t=2m43s&quot;&gt;Cookie Monster styled eating habits&lt;&#x2F;a&gt;. The point I&#x27;m trying to get at, is that I wouldn&#x27;t be able to get half of what I accomplished that day than I would have if I was at work. I would constantly need to get up for something or the other, which breaks your entire focus. It just all feels like a waste of time. I&#x27;m not trying to say that everyone should work at home and we&#x27;d all be better off, but the work environment should be similar to one that doesn&#x27;t come with the extra baggage and stress.&lt;&#x2F;p&gt;
&lt;p&gt;You start to think of the what your ideal work place would be, and I don&#x27;t even have anything concrete thought up yet. What I do know is it shouldn&#x27;t be a hassle to get there, work timings and mandatory meetings shouldn&#x27;t exist, and what ever else management can think up should be ignored. &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.ted.com&#x2F;talks&#x2F;dan_pink_on_motivation.html&quot;&gt;Dan Pink mentioned in a TED Talk&lt;&#x2F;a&gt; that Atlassian started a program called Fedex Days (renamed to ShipIt Days) to help their employees motivate themselves and come up with something new. He has a similar take on this as well.&lt;&#x2F;p&gt;
&lt;p&gt;Coming out of this, I still feel I could have accomplished more with the right mindset. BlackBerry was an amazing work experience and I would definitely consider going back there. This post is mainly a reminder for myself that I can always do better, and that the feeling of lazy satisfaction is what will slow me down. Also, like Aaron mentioned, I should start blogging more, just to keep myself in check - a reminder to learn something new and then confirm it, but writing down what I learned.&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ll be going back to university again come January and there&#x27;ll be a time where I try realize that I&#x27;d prefer this work schedule rather than what I&#x27;ll have then.&lt;&#x2F;p&gt;
&lt;p&gt;Related link: &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;ryancarson.com&#x2F;post&#x2F;61562761297&#x2F;no-managers-why-we-removed-bosses-at-treehouse&quot;&gt;No Managers: Why We Removed Bosses at Treehouse&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Moving from Android to BlackBerry 10</title>
        <published>2013-07-30T00:00:00+00:00</published>
        <updated>2013-07-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/archive/moving-from-android-to-blackberry-10/"/>
        <id>https://jonalmeida.com/archive/moving-from-android-to-blackberry-10/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/archive/moving-from-android-to-blackberry-10/">&lt;p&gt;This is going to be a ongoing post that&#x27;s updated over time since I&#x27;m sure I&#x27;ll run into things I need to add later.&lt;&#x2F;p&gt;
&lt;p&gt;First, it&#x27;s worth mentioning that I hated BlackBerry - I didn&#x27;t understand why people even used them when they were popular, and I didn&#x27;t understand why people used them when they were not. Ironically, I had to use one at work and though I despised it at first, I tried to keep an open mind about it. Which seems to have made all the difference because I can&#x27;t seem to not use one. I&#x27;m not even talking about what BlackBerry 10 is now, I mean during the BBOS times.&lt;&#x2F;p&gt;
&lt;p&gt;Now the other side of that coin is that during the period of hate, I loved the idea of Android (and still do to some extent) being open, easy to use, free to develop on, etc. What&#x27;s there to hate?
My recent annoyance with it, is that it isn&#x27;t dependable. It&#x27;s fragmented, the OS is still left to manufacturers to update (Nexus devices excluded), and if the updates don&#x27;t make it, you&#x27;re pretty much left on your own. I&#x27;ve gone through an HTC Desire to a Galaxy Nexus and they were both great phones in their day and age, but I couldn&#x27;t help but notice how quickly they degraded to being slow and useless within a time frame of a year at most.
Anywho, the point being: I wanted speed, support and spoons (because I can&#x27;t think of another word starting with &#x27;S&#x27;).&lt;&#x2F;p&gt;
&lt;p&gt;In order to make my switch, I took a good look at my Q10 and Galaxy Nexus to weigh them out equally to see if it was even remotely possible to make the switch over.&lt;&#x2F;p&gt;
&lt;p&gt;I started off by comprising a list of apps that I had on my Galaxy Nexus that I couldn&#x27;t live without:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Evernote&lt;&#x2F;li&gt;
&lt;li&gt;Email account support&lt;&#x2F;li&gt;
&lt;li&gt;WhatsApp&lt;&#x2F;li&gt;
&lt;li&gt;Google Authenticator&lt;&#x2F;li&gt;
&lt;li&gt;Ingress&lt;&#x2F;li&gt;
&lt;li&gt;Text messaging backups to Gmail&lt;&#x2F;li&gt;
&lt;li&gt;Camera picture sync&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Evernote and email account&lt;&#x2F;strong&gt; support was easy since Evernote support is built into the notes application that comes with the phone and email support... do I really need to explain this part? It&#x27;s a BlackBerry, it was made for email.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;WhatsApp&lt;&#x2F;strong&gt;: I don&#x27;t really use as much, but it&#x27;s available in the BlackBerry app store.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Google Authenticator&lt;&#x2F;strong&gt; is an app I use almost religiously for two-factor authentication of my Google account, SSH login, Evernote, anything else you fancy that needs that level of authentication. The problem was that once you have your account setup on Google Authenticator for your Android, you can&#x27;t get that setup code again.&lt;br&gt;
Fair enough, but I was sure I could figure this out. First I needed the application to begin with. I was able to get that from apk2bar.org and sideload it onto my device fairly easily.&lt;br&gt;
On my Galaxy Nexus, I logged into an adb shell and swooped around for the application data files. After perusing the internet as well, I found that the secret key is stored in a sqlite file in &lt;code&gt;&#x2F;data&#x2F;data&#x2F;com.google.android.apps.authenticator2&#x2F;databases&#x2F;databases&lt;&#x2F;code&gt; &lt;br&gt;
I downloaded the file to my computer and opened it up in sqlite3 to retrieve the key:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; .&#x2F;databases&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; *&lt;&#x2F;span&gt;&lt;span&gt; from accounts&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
&lt;p&gt;You can now use that secret key that you can add on your other Google Authenticator. You can also use the &#x27;Move to a different phone&#x27; option in your Google Account settings to move your account, but I wasn&#x27;t too happy with that option when I found out that it would break all your existing applications specific passwords that you had given access.&lt;&#x2F;p&gt;
&lt;p&gt;For &lt;strong&gt;camera picture syncing&lt;&#x2F;strong&gt; that wasn&#x27;t too hard as well since this features seems to be supported using Box (which also gives you 50GB of online storage while signing up), but what I really wanted was to have it sync Dropbox. Once again, I went the help of the built-in Android Player and I was able to use the Android version of Dropbox to sync all those cat pictures from my phone to a (safe?) remote location.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Text Message sync&lt;&#x2F;strong&gt; took a bit more googling, but I eventually came across an application called &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;appworld.blackberry.com&#x2F;webstore&#x2F;content&#x2F;20384391&#x2F;&quot;&gt;SyncLion&lt;&#x2F;a&gt; which has almost all the features SMS Backup+ currently has. Since not all apps can run as a service, it lacks the fine feature of auto-sync which I adore oh-so-much. When this comes, it will be well worth the $2.99 it currently costs on BB World.&lt;&#x2F;p&gt;
&lt;p&gt;Alas, &lt;strong&gt;Ingress&lt;&#x2F;strong&gt; is the only application I can&#x27;t get on my Q10! Ingress is an augmented reality, location based game created by Google. It&#x27;s more interesting to play it than to explain so I&#x27;ll leave that up to you to research.
The problems with trying to sideload the android app is that the Android Player doesn&#x27;t support Google account APIs, for legal reasons I pressume. Authenticating using your Google account is the only way to go about it, so for now I&#x27;m stuck..&lt;&#x2F;p&gt;
&lt;p&gt;Refs: &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.howtogeek.com&#x2F;130755&#x2F;how-to-move-your-google-authenticator-credentials-to-a-new-android-phone-or-tablet&#x2F;&quot;&gt;How-To Geek&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Cleaning up a messy master branch</title>
        <published>2013-07-28T00:00:00+00:00</published>
        <updated>2013-07-28T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/cleaning-up-a-messy-master-branch/"/>
        <id>https://jonalmeida.com/blog/cleaning-up-a-messy-master-branch/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/cleaning-up-a-messy-master-branch/">&lt;p&gt;Note: This is for the foolish and lazy side of you&lt;&#x2F;p&gt;
&lt;p&gt;Twice I&#x27;ve come across a situation where I&#x27;ve messed up local master branch before I merge my topic branch. I&#x27;ve pushed commits to my local master that are now lost in the abyss so when I pull down the latest changes to the master branch I have to do a merge commit. Let&#x27;s fix that with a bit of frustration..&lt;&#x2F;p&gt;
&lt;p&gt;Create a orphan branch with any branch name (we&#x27;ll rename it later):&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; checkout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-orphan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; any_branch_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Pull the lastest changes:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pull&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rename the branch back to master if you fancy it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git branch -m any_branch_name master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If you&#x27;re working on a topic branch, that you&#x27;ve previously created over your old master, you should be able to rebase it with your new branch, before you push it your remote:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; checkout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; topic_branch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rebase&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; checkout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; merge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; topic_branch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A shorter way (but still somewhat untidy) to do this would be to cherry-pick your change(s) from your topic branch to your newly created local master and then push them. While this works just a well. There are changes you turn into a walking-talking-moron and screw up again if those changes aren&#x27;t merged with your remote:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; checkout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cherry-pick&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; SHA_VALUE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;em&gt;For the not-so-foolish...&lt;&#x2F;em&gt;&lt;br&gt;
How about a third option? I prefer this one to most though since it&#x27;s the only way you &lt;em&gt;should&lt;&#x2F;em&gt; be doing it.
Let&#x27;s say you were working on a commit on your topic branch for a while, and your remote master has been updated a fair bit since then.
First, fetch the latest changes from upstream, rebase your topic branch to your remote&#x27;s master and then push it:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; rebase&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&#x2F;master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; push&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This way, you get your changes pushed to the top of the tree based of the remote&#x27;s master (which should be the most up-to-date version you want). You don&#x27;t need to maintain your local master, because hey, why the hell should you? AND.. you should be able to push to the remote repo without any errors.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Different ways to implement flags in bash</title>
        <published>2013-05-26T00:00:00+00:00</published>
        <updated>2013-05-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/different-ways-to-implement-flags-in-bash/"/>
        <id>https://jonalmeida.com/blog/different-ways-to-implement-flags-in-bash/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/different-ways-to-implement-flags-in-bash/">&lt;p&gt;I had to write a couple of shell script which required me to execute a part of the script by passing a flag. Should be easy enough?&lt;&#x2F;p&gt;
&lt;p&gt;Writing the part for capturing flags wasn&#x27;t that hard, but there were many options available so it took a while to ponder on what I needed and while purpose suit me. I&#x27;ve seen implementations where people use simple if statements for dot files as so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; ==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;quack&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; QUACK!&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Sure, that works, but not exactly for my needs since I have multiple flags to handle. Which lead me to getopts. Using getopts was a bit fancy, but when you realize how easy it is to implement you&#x27;ll learn to love it. I&#x27;m not going to repeat what Ricardo Salveti has done quite well in his blog here, but after reading it, this was my implementation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; getopts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bf:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OPTION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  case&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;OPTION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;You set flag -b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;The value of -f is &lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;OPTARG&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      MYOPTF&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;OPTARG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;MYOPTF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    \?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Used for the help menu&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In a nutshell, it&#x27;s a while statement with cases. The &quot;bf:&quot; says that only a flag &#x27;-b&#x27; needs to be entered by the user, &#x27;-f&#x27; has a semicolon after it to indicate that it&#x27;s expecting a value with the flag, similar to writing &lt;code&gt;foo.sh -f my_value_here&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The beauty of getopts is that it can handle the same flag multiple times. If you would do that with the current code about it wouldn&#x27;t spit out any errors, but it wouldn&#x27;t work as expected. Lets say you wanted to use the &#x27;-f&#x27; flag twice. The value of MYOPTF would be &lt;em&gt;the value of last -f value used and no other&lt;&#x2F;em&gt;. This can be solved with a small modification:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; getopts&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;f:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; OPTION&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  case&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;OPTION&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      MYOPTF&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;MYOPTF&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;OPTARG&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; MYOPTF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That should work fine since you have a list of all the values, you can easily iterate through it with a for loop.&lt;&#x2F;p&gt;
&lt;p&gt;The disadvantage (as far as my use case is concerned) with getopts is that it only accepts single character flags so you couldn&#x27;t use flags like &lt;code&gt;--help&lt;&#x2F;code&gt; which the gnu styled arguments and is a bit unfortunate.&lt;&#x2F;p&gt;
&lt;p&gt;I finally decided to use a hybrid of all the information I put together since I ran into the case where I needed to accept either option &#x27;-h&#x27; or &lt;code&gt;--help&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;while&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; !&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -eq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  case&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      helpmenu&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;k&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;w&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #DBEDFF);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;      secretopt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;      exit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;  shift&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You would have noticed I threw in a bunch of stuff that I didn&#x27;t mention previously, and that&#x27;s sort of the assumption I made.
What I&#x27;ve essentially done in &lt;code&gt;while [ ! $# -eq 0 ]&lt;&#x2F;code&gt; is I&#x27;ve said, while the number of arguments are not zero, do so and so.
The $1 is the first argument that&#x27;s passed the script at execution, to avoid having to write cases for $2, $3, etc. I &quot;shift&quot; the argument off my list once I&#x27;m done processing it through my case statements, and then repeat while arguments exist.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git on Mac OS persistently uses HTTP proxy</title>
        <published>2013-04-10T00:00:00+00:00</published>
        <updated>2013-04-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/git-on-mac-os-persistently-uses-http-proxy/"/>
        <id>https://jonalmeida.com/blog/git-on-mac-os-persistently-uses-http-proxy/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/git-on-mac-os-persistently-uses-http-proxy/">&lt;p&gt;So I&#x27;ve been running into the problem off late on Mac OS when using an HTTPS proxy and then using git over https. After removing the proxy from Preferences, the http proxy still persists giving an error as seen below:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Cloning into &amp;#39;Foo&amp;#39;...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;error: Failed connect to github.com:5222; Connection refused while accessing https:&#x2F;&#x2F;github.com&#x2F;jonalmeida&#x2F;Foo.git&#x2F;info&#x2F;refs&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fatal: HTTP request failed&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It took me a while to figure this out since I figured this was a Mac OS problem where the proxy settings weren&#x27;t being removed. The quick fix is to remove the HTTP proxy globally through git:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; config&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-global&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-unset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http.proxy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Alas! That&#x27;s all it took!&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Pushing to multiple existing git repositories</title>
        <published>2013-04-09T00:00:00+00:00</published>
        <updated>2013-04-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/pushing-to-multiple-existing-git-repositories/"/>
        <id>https://jonalmeida.com/blog/pushing-to-multiple-existing-git-repositories/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/pushing-to-multiple-existing-git-repositories/">&lt;p&gt;I&#x27;ve come across this situation where I start a project and push it to a personal git server, but eventually change my mind and decide to push those changes to another git server like Github or the university servers.&lt;&#x2F;p&gt;
&lt;p&gt;To push those existing changes, first make sure that you&#x27;re local copy of your repository is up-to-date with a simple &lt;code&gt;git pull&lt;&#x2F;code&gt;. You want to edit the existing &lt;code&gt;.git&#x2F;config&lt;&#x2F;code&gt; file that originally looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  repositoryformatversion&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  filemode&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  bare&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  logallrefupdates&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;remote &amp;quot;origin&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; git@github.com:User&#x2F;MyProject.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fetch&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; +refs&#x2F;heads&#x2F;*:refs&#x2F;remotes&#x2F;origin&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
&lt;p&gt;By adding another remote, like so: &lt;code&gt;git remote add foobar git_address_here&lt;&#x2F;code&gt;. You should notice your git config file will now like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;core&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  repositoryformatversion&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  filemode&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  bare&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; false&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  logallrefupdates&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;remote &amp;quot;origin&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; git@github.com:User&#x2F;MyProject.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fetch&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; +refs&#x2F;heads&#x2F;*:refs&#x2F;remotes&#x2F;origin&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;remote &amp;quot;foobar&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ssh:&#x2F;&#x2F;my_server&#x2F;~&#x2F;Repo&#x2F;UberWriter.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  fetch&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; +refs&#x2F;heads&#x2F;*:refs&#x2F;remotes&#x2F;foobar&#x2F;*&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now you have two remote repositories setup in your configuration. Simply run a git push with the new remote and that should push all the changes from your local repo, to your new remote: &lt;code&gt;git push foobar master&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If you want to take it a further step and push to both remotes at the same time (nothing wrong with a backup of a backup), manually edit your &lt;code&gt;.git&#x2F;config&lt;&#x2F;code&gt; file to add both your repositories as a separate remote, but DO NOT add a &#x27;fetch&#x27; variable in there, like so:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;remote &amp;quot;all&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; git@github.com:User&#x2F;MyProject.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;  url&lt;&#x2F;span&gt;&lt;span&gt; =&lt;&#x2F;span&gt;&lt;span&gt; ssh:&#x2F;&#x2F;my_server&#x2F;~&#x2F;Repo&#x2F;UberWriter.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now before you push to both the repositories at the same time, make sure both of them are at the same HEAD otherwise it&#x27;ll not work:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git push all&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should be enough to push to the default branch for both of the two repositories.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>C++11 in XCode 4.5</title>
        <published>2013-03-26T00:00:00+00:00</published>
        <updated>2013-03-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/c-11-in-xcode-4-5/"/>
        <id>https://jonalmeida.com/blog/c-11-in-xcode-4-5/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/c-11-in-xcode-4-5/">&lt;p&gt;I was messing around with XCode today, and found out clang++ that&#x27;s available with XCode 4.5.2, already has the C++11 standard available even though g++ still doesn&#x27;t.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;jupiter:tmp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; jonathan&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; clang++&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-version&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; clang&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; version&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 4.1&lt;&#x2F;span&gt;&lt;span&gt; (tags&#x2F;Apple&#x2F;clang-421.11.66&lt;&#x2F;span&gt;&lt;span&gt;) (&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;based&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; on&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; LLVM&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 3.1svn&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Target:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; x86_64-apple-darwin12.3.0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Thread&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; model:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; posix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You can compile with it using &lt;code&gt;clang++ --std=c++11 -stdlib=libc++ foo.cxx&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;That said, it&#x27;s probably best to get the latest version of XCode.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Embedding video in Jekyll</title>
        <published>2013-03-25T00:00:00+00:00</published>
        <updated>2013-03-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/embedding-video-in-jekyll/"/>
        <id>https://jonalmeida.com/blog/embedding-video-in-jekyll/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/embedding-video-in-jekyll/">&lt;h3 id=&quot;the-code&quot;&gt;The code:&lt;&#x2F;h3&gt;
&lt;p&gt;Youtube embedded code works just as fine in Markdown.&lt;br&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  width&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;560&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  height&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;315&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  src&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;http:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;prX3--rtqXk&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  frameborder&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;  allowfullscreen&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;iframe&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;br&gt;
&lt;iframe
  width=&quot;560&quot;
  height=&quot;315&quot;
  src=&quot;http:&#x2F;&#x2F;www.youtube.com&#x2F;embed&#x2F;prX3--rtqXk&quot;
  frameborder=&quot;0&quot;
  allowfullscreen&gt;
&lt;&#x2F;iframe&gt;&lt;br&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CrunchBang Linux Initial Setup</title>
        <published>2013-03-24T00:00:00+00:00</published>
        <updated>2013-03-24T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Jonathan Almeida
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://jonalmeida.com/blog/crunchbang-linux-initial-setup/"/>
        <id>https://jonalmeida.com/blog/crunchbang-linux-initial-setup/</id>
        
        <content type="html" xml:base="https://jonalmeida.com/blog/crunchbang-linux-initial-setup/">&lt;p&gt;I recently bought a ThinkPad T420s since the battery of my Dell Studio started to slowly die on me. Hence, I decided to start afresh with the ThinkPad and move away from Ubuntu to &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;crunchbang.org&quot;&gt;CrunchBang Linux&lt;&#x2F;a&gt; (abrev: #!) which was the first linux OS I ever used.  It&#x27;s a minimalistic Debian Wheezy based distribution that doesn&#x27;t waste any of your time setting up your computer and lets you get to what you want to do.
It&#x27;s hardly resource hungry as well. From a cold a boot it uses ~400MB of RAM.&lt;&#x2F;p&gt;
&lt;p&gt;I spent the best part the day setting up everything to be the way I like it. So I thought I&#x27;d at least put it somewhere for reference later on.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;conky&quot;&gt;Conky&lt;&#x2F;h3&gt;
&lt;p&gt;The first thing I saw when I booted my laptop was conky - time to get a neat looking conky script to show off those stats. I settled for a conky script that I found on the #! forums. There are plenty more on the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;crunchbang.org&#x2F;forums&#x2F;viewtopic.php?pid=556&quot;&gt;forum&lt;&#x2F;a&gt;, but I found this one more to my liking. You can download the conkyrc file &lt;a href=&quot;&#x2F;assets&#x2F;code&#x2F;conkyrc&quot;&gt;here&lt;&#x2F;a&gt; and the lua file &lt;a href=&quot;&#x2F;assets&#x2F;code&#x2F;conky_lua.lua&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;&#x2F;images&#x2F;20130324&#x2F;conky.png&quot; alt=&quot;alt text&quot; &#x2F;&gt;&lt;br&gt;&lt;&#x2F;p&gt;
&lt;p&gt;My T420s needed a special fan controller with a configuration which is handled by &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;thinkfan.sourceforge.net&quot;&gt;thinkfan&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;adaptive-screen-colour-correction&quot;&gt;Adaptive screen colour correction&lt;&#x2F;h3&gt;
&lt;p&gt;I came across a nifty application called &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;stereopsis.com&#x2F;flux&quot;&gt;f.lux&lt;&#x2F;a&gt; that essentially corrects the colours of your screen to be &#x27;warmer&#x27; as the day moves towards the end. The idea behind it is to not allow you get tired from staring at your screen all day. Which in turn, would cause irregular sleep patterns. While flux works perfectly on CrunchBang, I prefer to use it&#x27;s alternative &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;jonls.dk&#x2F;redshift&quot;&gt;Redshift&lt;&#x2F;a&gt; for linux OSes and f.lux for Windows&#x2F;Mac. To be honest, the only reason I do this is because I think the f.lux icon looks out-of-place on most linux window managers - personal preference really. Not to mention that redshift already exists in the repositories, so a simple &lt;code&gt;sudo apt-get install redshift&lt;&#x2F;code&gt; solves all your problems. The help pages explain how to use it, but I set redshift to 5000 in ~&#x2F;.config&#x2F;openbox&#x2F;autostart so that it&#x27;s enabled on boot: &lt;code&gt;redshift -O 5000&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;sublime-text-2-text-editor&quot;&gt;Sublime Text 2 (Text Editor)&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m a big fan of Sublime Text, so this is a must on any computer I use. The linux builds are available as a tar ball so it doesn&#x27;t integrate well out-of-the-box. Below are the terminal commands to extract it to &#x2F;opt&#x2F; and create a desktop link that can be found with any application launcher you use:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;tar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; xf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Sublime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;x64.tar.bz2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; Sublime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;opt&#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ln&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;opt&#x2F;Sublime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;\ &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;2&#x2F;sublime_text&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;bin&#x2F;sublime&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; http:&#x2F;&#x2F;jonalmeida.com&#x2F;assets&#x2F;misc&#x2F;sublime.desktop&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;share&#x2F;applications&#x2F;sublime.desktop&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This last part is optional if you want all your text files to open with Sublime Text.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; sublime&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;share&#x2F;applications&#x2F;defaults.list&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Replace all occurrences of geany.desktop with sublime.desktop&lt;&#x2F;p&gt;
&lt;h3 id=&quot;application-launcher&quot;&gt;Application launcher&lt;&#x2F;h3&gt;
&lt;p&gt;CrunchBang comes with a neat, minimalistic (like everything else) app launcher that lives on the bottom of your screen that you can access with Alt + F3. I like using app launchers, but the current keyboard short-cut just doesn&#x27;t feel comfortable.&lt;&#x2F;p&gt;
&lt;p&gt;You can change it by going to Settings &amp;gt; Openbox &amp;gt; Edit rc.xml, or open ~&#x2F;.config&#x2F;openbox&#x2F;rc.xml with any text editor and add the configuration below to activate the app launcher with Ctrl + Space:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;keybind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; key&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;C-space&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; name&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Execute&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;startupnotify&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;true&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;enabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;dmenu-bind&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;name&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;startupnotify&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;~&#x2F;.config&#x2F;dmenu&#x2F;dmenu-bind.sh&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;command&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;action&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#B31D28, #FDAEB7);font-style: italic;&quot;&gt;keybind&lt;&#x2F;span&gt;&lt;span&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;java&quot;&gt;Java&lt;&#x2F;h3&gt;
&lt;p&gt;Unfortunately, Java isn&#x27;t going away any time soon:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; install&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; openjdk-7-jre&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;muti-arch-support&quot;&gt;Muti-arch support&lt;&#x2F;h3&gt;
&lt;p&gt;On most debian distributions I&#x27;ve tried, enabling multi-arch support was as easy as installing the ia32-libs, however there&#x27;s more to it here.&lt;&#x2F;p&gt;
&lt;p&gt;I found the solution from biggenaugust on the #! forums. First run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;dpkg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;-add-architecture&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; i386&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Then add &lt;code&gt;[arch=amd64,i386]&lt;&#x2F;code&gt; to each line of &lt;code&gt;&#x2F;etc&#x2F;apt&#x2F;sources.list&lt;&#x2F;code&gt;&lt;br&gt;
It should look something like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# CRUNCHBANG&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# Compatible with Debian Wheezy, but use at your own risk.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;deb&lt;&#x2F;span&gt;&lt;span&gt; [arch=amd64,i386&lt;&#x2F;span&gt;&lt;span&gt;] http:&#x2F;&#x2F;packages.crunchbang.org&#x2F;waldorf waldorf main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; deb-src [arch=amd64,i386] http:&#x2F;&#x2F;packages.crunchbang.org&#x2F;waldorf waldorf main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# DEBIAN&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;deb&lt;&#x2F;span&gt;&lt;span&gt; [arch=amd64,i386&lt;&#x2F;span&gt;&lt;span&gt;] http:&#x2F;&#x2F;http.debian.net&#x2F;debian wheezy main contrib non-free&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; deb-src [arch=amd64,i386] http:&#x2F;&#x2F;http.debian.net&#x2F;debian wheezy main contrib non-free&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;# DEBIAN SECURITY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;deb&lt;&#x2F;span&gt;&lt;span&gt; [arch=amd64,i386&lt;&#x2F;span&gt;&lt;span&gt;] http:&#x2F;&#x2F;security.debian.org&#x2F; wheezy&#x2F;updates main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; deb-src [arch=amd64,i386] http:&#x2F;&#x2F;security.debian.org&#x2F; wheezy&#x2F;updates main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;After that, run:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; update&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; apt-get&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dist-upgrade&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This is going to install all the relevant i386 library packages. It varies in size, but it&#x27;s usually around ~100-200MB and requires a reboot after this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;overview&quot;&gt;Overview&lt;&#x2F;h3&gt;
&lt;p&gt;I&#x27;m quite content with my current set-up and I haven&#x27;t had the need to make any changes to anything so far. Send me a message if there&#x27;s anything that needs updating or if you might need to clarify something.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
