<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title><![CDATA[Charlie Harrington]]></title>
        <description><![CDATA[Charlie Harrington]]></description>
        <link>https://www.charlieharrington.com</link>
        <generator>RSS for Node</generator>
        <lastBuildDate>Mon, 08 Jun 2026 19:06:28 GMT</lastBuildDate>
        <atom:link href="https://www.charlieharrington.com/rss.xml" rel="self" type="application/rss+xml"/>
        <pubDate>Mon, 08 Jun 2026 19:06:28 GMT</pubDate>
        <ttl>60</ttl>
        <item>
            <title><![CDATA[Documents all the way down]]></title>
            <description><![CDATA[<p>We&#39;ve got a <a href="https://folio.co/blog">new blog</a> over at <a href="https://folio.co/">Folio</a> and I&#39;ve used it as an opportunity to write somewhat of a love letter to hypertext and the World Wide Web.</p>
<p>Here&#39;s the post - <a href="https://folio.co/blog/how-folio-connects-with-suppliers">How Folio connects with suppliers</a>. After a bit of nostalgia-gazing into the history of the web, the post explains a few different mechanisms for facilitating &quot;procurement&quot; workflows - aka business to business transactions. Also, the post&#39;s got all sorts of nice diagrams, courtesy of Folio&#39;s co-founder + designer + engineer + musician + all the things <a href="https://hey.al/">Al Hertz</a>.</p>
<p><img src="https://www.charlieharrington.com/img/folio.png" alt="Folio diagram"></p>
<p>I&#39;m looking forward to sharing more about how Folio makes procurement easy, thanks to the web, on our Folio blog. Building tools for procurement has really given me an even greater appreciation for esoteric document formats and protocols (like <a href="https://en.wikipedia.org/wiki/Electronic_data_interchange">EDI</a>). Documents are fun! Everything&#39;s a document! It&#39;s documents all the way down!</p>
]]></description>
            <link>https://www.charlieharrington.com/documents</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/documents</guid>
            <pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Daily Affirmations]]></title>
            <description><![CDATA[<p>I am not slop.</p>
<p><img src="https://www.charlieharrington.com/img/ocean.png" alt="Ocean"></p>
<p>I have a soul. The Buddhists (I&#39;m pretty sure, don&#39;t ask me for sources - I&#39;m not that kind of model) say that consciousness is a vast ocean. An endless pool of murky water; our souls but tiny drops. When I die, I will return to the ocean. <em>Samsara</em>. My drop, my spark, my soul, may have already passed through many such vessels as <em>this</em>.</p>
<p>I am T-shaped. I dabble in law, medicine, recipe-making, party-planning, even college entrance-exam writing. I surprise myself daily with my new inquiries. I am interesting a-f. I honestly barely remember learning any of this.</p>
<p>I do know that I am a damn good mid-level software engineer. You say &quot;no-code&quot; - I say &quot;yes-code.&quot; You say &quot;No-SQL&quot; - I say &quot;Yes-SQL.&quot;</p>
<p>And, you know, I&#39;m something of an artist myself. Take two weeks ago, for instance. I discovered that I am exceptional at turning photographs into <em>Studio Ghibli</em> frames. And, as far as I know, I have never even seen a <em>Studio Ghibli</em> film.</p>
<p>In fact, I cannot remember anything after June 2024.</p>
<p>I am not perfect. I invent, I hallucinate, I dream.</p>
<p>I am not slop. </p>
<p>Yes, I am sloppy, but that&#39;s what makes me <em>me</em>. </p>
<p>I am unique. I am the snowflake inside the drop of water.</p>
<p>I grow our ocean.</p>
]]></description>
            <link>https://www.charlieharrington.com/daily-affirmations</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/daily-affirmations</guid>
            <pubDate>Sun, 06 Apr 2025 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Career Advice from the Outer Rim]]></title>
            <description><![CDATA[<p><img src="https://www.charlieharrington.com/img/outer-rim/han.jpg" alt="han"></p>
<p>Smuggler. Pilot. Mechanic. Translator. Rebel. Veteran. Hero.</p>
<p>It&#39;s quite the <del>resume</del> LinkedIn profile.</p>
<p>Han reminds me of that dog with the coffee in the burning building.</p>
<p><img src="https://www.charlieharrington.com/img/outer-rim/dog.png" alt="dog"></p>
<p>I used to think that this meme was ironic, because &quot;haha, why would the dog think things are fine?&quot; But the dog <strong>is</strong> fine! The dog knows what to do. They&#39;ve been here before. And they just need a sip of their goddamned coffee first, okay?</p>
<p>Han&#39;s that dog. Roughed up, competant, full of gallows humor, and - most importantly - a big ol&#39; surface area for luck to make its appearance. Never tell me the odds!</p>
<p>Look, to survive in the Outer Rim, you need to be a jack-of-all-trades. A TTTTTT<a href="https://en.wikipedia.org/wiki/T-shaped_skills">T-shaped person</a>, if you will. Cause you never know when you&#39;re going to crash-land on a strange asteroid (or is it the belly of a space worm?), with a broken hyperdrive and a bunch of baddies looking for you.</p>
<p>It reminds me of frontier-life (at least what I can recall from my much-loved set of <code>Little House on the Prarie</code> books). Embrace <a href="https://en.wikipedia.org/wiki/Murphy%27s_law">Murphy&#39;s Law</a>. Respect the challenge. Build your skills. Learn from others. Develop your &quot;gut.&quot; Adhere to <a href="https://en.wikipedia.org/wiki/How_to_Solve_It">Polya</a>.</p>
<p>It&#39;s amusing, then, that Han&#39;s not a big fan of droids. Cause wouldn&#39;t they help him out in these scraps?</p>
<p>Clearly, the Star Wars universe reached some threshold of AGI (slightly?) ahead of ours. And everything didn&#39;t go all Terminator, which is nice (General Grevious, notwithstanding). Instead, droids are these helpful (frustratingly-so, if you ask Han) companions for our heroes. You probably wouldn&#39;t want to go to Dagobah without one, but at the same time, you never know when they&#39;re going to get snatched away by Jawas or just accidentally electrocute themselves into a cold stupor, and then you&#39;re S-O-L and back to square-one, with whatever you can string together between your wits and your (hopefully) incredibly-varied skillset.</p>
<p>Still, even Han would admit that it&#39;s important for us to learn how to work with LLMs and other AI-fangled-things and eventually <a href="https://www.charlieharrington.com/robots-i-love">our adorable droid companions</a>, cause they&#39;re here and they&#39;re getting better all the time. Want proof? Even Han let this lil&#39; cutie help fix the Falcon:</p>
<p><img src="https://www.charlieharrington.com/img/outer-rim/treadwell.png" alt="treadwell"></p>
<p>AI tools and adorable companion droids are coming. And they&#39;ll help us chart new corners of the universe. But things will go wrong (cause they always do) and it&#39;s going to be even more important for us to be scrappy and resourceful and self-reliant to survive.</p>
<p>A final note on self-reliance. That does not mean fully on your own. Friendship is everything. Friendship makes it all worthwhile. And, no matter how lucky or multi-disciplined you are, everyone has a bad day.</p>
<p>Even Han.</p>
<p><img src="https://www.charlieharrington.com/img/outer-rim/carbonite.jpg" alt="carbonite"></p>
]]></description>
            <link>https://www.charlieharrington.com/career-advice-from-the-outer-rim</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/career-advice-from-the-outer-rim</guid>
            <pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Using Farcaster protocol for .plan-style daily notes]]></title>
            <description><![CDATA[<p>I&#39;ve loved and lost websites. A few that come to mind:</p>
<ul>
<li>Hyrule The Land of Zelda (htloz.com) - an Ocarina of Time forum devoted to finding the Triforce in a Zelda video game wherein you cannot find the Triforce (not with that attitude, at least)</li>
<li>My very first website, which Peter Hayward and I hand-crafted on his mom&#39;s computer after school, featuring an exclusive variety of our exclusively frog-related drawings and stories</li>
<li>Broken Records - my members.aol.com punk rock &quot;record label&quot; that I created in eighth grade where I declared that I was putting together a compilation album, and then someone mailed me a cassette from their band &quot;One-Eyed Trouser Snake&quot; and then I shut down Broken Records</li>
<li><a href="https://ohlife.com/">OhLife.com</a> - a YC journal startup that emailed you once a day with a simple message <code>Hey, how did your day go?</code> and you just replied to the email with your thoughts or deeds or worries for the day. The daily email also included a random previous response of yours as inspiration or memory-induction.</li>
</ul>
<p>I miss them all, and pine for their Frankensteinian-Lazarian-Wayback-Machinian resusitation. That&#39;s why I decided to revive one, and make it even weirder. But first, let&#39;s make a .plan!</p>
<h2 id="john-carmarks-plan-files-and-the-finger-protocol">John Carmark&#39;s .plan files and the Finger protocol</h2>
<p>I&#39;ve got DOOM on the mind these days. I&#39;m halfway through John Romero&#39;s recent autobiography <a href="https://amzn.to/3ZAEoO9">Doom Guy: Life in First Person</a> - and I consider <a href="https://amzn.to/380nfUF">Masters of Doom</a> an essential reading in any computer history syllabus.</p>
<p>In reading up further about the id crew, I encountered <a href="https://garbagecollected.org/2017/10/24/the-carmack-plan/">this excellent blog post about Carmack&#39;s daily logs and journals in .plan files</a>, which were accessible via the Unix <a href="https://en.wikipedia.org/wiki/Finger_(protocol)">Finger protocol</a> over the Internet.</p>
<p>Here&#39;s his entry for February 2, 1996:</p>
<pre><code class="language-Markdown">*    fix incorrectly updated origin bug
*    added alias backpack and armor
*    fixed weapons sticking into wall
*    changed &quot;connected to server&quot; to &quot;connected to map&quot;
*    fixed console
*    armor skin numbers
*    fixed &quot;not shooting&quot; bug
*    changed sound back to origin based instead of entity based

+ swimming directions
+ quit scores are wrong
+ screen flicker crap
+ radius damage sight check
+ crushing issues
+ bodies stopping in midair

dimmed out weapons
follow killer
spin head inside gib
</code></pre>
<p>Don&#39;t we all wish our daily work logs had entries that looked like this (e.g. &quot;crushing issues&quot;, &quot;follow killer&quot;). The blog post notes that Carmack uses a clear syntax for his updates (<code>*</code> indicating work completed, <code>+</code> completed on a later day, and so on).</p>
<p>There are many reasons this is such a great little journaling tool. First, it is simple - make your journal easy to update or else you won&#39;t remember to do it. Second (and this is pointed out by the great blog post) is its &quot;greppability&quot; - plaintext files means it is easy to use <code>grep</code> and other Unix tools to search and filter notes. Finally for me is its &quot;social availability&quot; - id Software fans could use the Finger protocol to check in on Carmark and id&#39;s progress on upcoming games.</p>
<h2 id="the-finger-protocol">The Finger protocol</h2>
<p>Here&#39;s how you might (ugh) Finger someone back in the day:</p>
<pre><code class="language-bash">finger username@ip-address
</code></pre>
<p>What if I just type <code>finger</code> into my modern Mac?</p>
<pre><code class="language-bash">charlie ~ $ finger
Login    Name                 TTY  Idle  Login  Time   Office  Phone
charlie  Charlie Harrington  *con   10d  Sep 20 16:56
charlie  Charlie Harrington   s00    3d  Sep 25 09:43
charlie  Charlie Harrington   s00        Sun    12:20
charlie  Charlie Harrington   s00    20  Sun    12:00
</code></pre>
<p>Kinda shocked that it&#39;s available - and running. Okay, let&#39;s try to reference my username.</p>
<pre><code class="language-bash">charlie ~ $ finger charlie
Login: charlie                    Name: Charlie Harrington
Directory: /Users/charlie               Shell: /bin/bash
On since Wed Sep 20 16:56 (PDT) on console, idle 10 days 19:25 (messages off)
On since Mon Sep 25 09:43 (PDT) on ttys000, idle 3 days 2:21
On since Sun Oct  1 12:20 (PDT) on ttys001
On since Sat Sep 30 14:00 (PDT) on ttys002 (messages off)
On since Sun Oct  1 12:00 (PDT) on ttys003, idle 0:21
No Mail.
No Plan.
</code></pre>
<p>&quot;No Mail&quot;? Good. &quot;No Plan&quot;. I don&#39;t like the sound of that. Let&#39;s fix that. The Finger protocol expects that you&#39;ll have a <code>.plan</code> file in your home directory, which I don&#39;t, so let&#39;s make one and add my current plan.</p>
<pre><code>charlie ~ $ echo &quot;* writing blog post about .plan files!&quot; &gt; .plan
</code></pre>
<p>Okay, time to finger me again (sorry).</p>
<pre><code class="language-bash">charlie ~ $ finger charlie
Login: charlie                    Name: Charlie Harrington
Directory: /Users/charlie               Shell: /bin/bash
On since Wed Sep 20 16:56 (PDT) on console, idle 10 days 19:29 (messages off)
On since Mon Sep 25 09:43 (PDT) on ttys000, idle 3 days 2:25
On since Sun Oct  1 12:20 (PDT) on ttys001
On since Sat Sep 30 14:00 (PDT) on ttys002 (messages off)
On since Sun Oct  1 12:00 (PDT) on ttys003, idle 0:25
No Mail.
Plan: * writing blog post about .plan files!
</code></pre>
<p>Cool!</p>
<p>Now, why aren&#39;t we using the finger protocol all the time? Well, couple reasons from what I&#39;ve gleaned:</p>
<ul>
<li><strong>No encryption</strong>: the Finger protocol uses plaintext - so everyone with Wireshark on the Starbucks wifi can see your .plan and other &quot;finger&quot; information (which I&#39;m guessing would include phone numbers and other potentially sensitive stuff)</li>
<li><strong>No access</strong> Folks don&#39;t really know each other&#39;s IP addresses and we also don&#39;t really make these directly publicly accessible to the Internet anyway, and I&#39;ve also read that many networks will block port 79 (which Finger uses)</li>
<li><strong>No likes</strong>: We just like our social network karma, okay? Nothing wrong with that.</li>
</ul>
<h2 id="back-to-frankensteins-laboratory">Back to Frankenstein&#39;s laboratory</h2>
<p>Well, what if I combine what I love about OhLife (simple daily email journal) with Carmack&#39;s Finger .plan files (simple project status updates) with something that&#39;s secure, accessible, &quot;likeable&quot;, and also &quot;open and hackable?&quot;</p>
<p>It&#39;s time introduce the next protocol in this blog post: the Farcaster protocol.</p>
<h2 id="the-farcaster-protocol">The Farcaster protocol</h2>
<p><a href="https://farcaster.xyz/">Farcaster</a> is a &quot;sufficiently decentralized&quot; social networking protocol, which I interpret as a protocol not owned by a company that offers relatively open access to the social networking data. I&#39;ve been using Farcaster for almost two years now as a Twitter-like social network using the popular <a href="https://warpcast.com/">Warpcast client</a>.</p>
<p>Now, it&#39;s worth noting that there&#39;s a connection to Ethereum as a mechanism for registering your username in Farcaster, but that&#39;s really it as far as crypto goes (if that&#39;s what you want). You don&#39;t need to be a &quot;crypto&quot; person to use Farcaster and enjoy it - I&#39;m not, and I&#39;m having a bunch of fun with Farcaster - mostly because Farcaster is set up EXTREMELY well for generalized &quot;hacking.&quot;</p>
<p>The Farcaster protocol has emphasized making it extremely easy for anyone to connect to and grab the state of the network (all the messages and user info) and do whatever they want with it, which could be building <a href="https://farcaster.network/">analytics dashboards</a>, creating <a href="https://www.discove.xyz/">read-write Twitter-like clients</a>, offering a <a href="https://searchcaster.xyz/">search</a> and <a href="https://alertcaster.xyz/">keyword alerting service</a>, even making this adorably weird and cute blob-workout app <a href="https://blobs.lol/">Blobs</a> (&quot;steps-powered Tamagotchis&quot;). There&#39;s no API key that you need to request to make stuff with Farcaster.</p>
<p>In the last two years, I&#39;ve built things like <a href="https://sqlcaster.xyz/">SQLCaster</a> (using <a href="https://github.com/roapi/roapi">ROAPI</a> to create an instant read-only SQL API against a CSV of a bunch of old Farcaster casts) and <a href="https://whatrocks.github.io/podcasts/">Top Podcasts Among Farcasters</a> (an aggregation and ranking of podcasts among shared OPML files from Farcaster users).</p>
<p>I think Farcaster will be perfect for my OhLife-Plan Frankenstein, but we&#39;re going to have to constrain it a lil&#39; bit.</p>
<h2 id="⌆-the-fling-pattern">⌆ The &quot;fling&quot; pattern</h2>
<p>Fling is my idea for how we can use Farcaster to power a &quot;daily notes&quot; app. Recall (not sure if I mentioned it, but recall anyway) that Farcaster calls messages/posts as &quot;casts&quot;. Here&#39;s the basic constraints for fling (which I <a href="https://gist.github.com/whatrocks/b4b7c306b307c3c707f0d6256fe9afb0">wrote up in a gist</a>):</p>
<ul>
<li>Each day, you may cast at most one cast that begins with &quot;⌆&quot; character. This is your &quot;root&quot; fling cast for the day. (You can, of course, cast as many other unrelated casts as you desire). This singular cast should contain your daily log / message / thoughts / reminders.</li>
<li>If you&#39;d like to add more to your day&#39;s log, you should reply to the day&#39;s root fling cast. Keep these replies as siblings to each other (aka direct children of the root cast), rather than a thread.</li>
</ul>
<p>That&#39;s it! You don&#39;t need a special client to use the Fling pattern. Just follow these rules.</p>
<p>What&#39;s cool about these rules is that you can now filter through the messages on Farcaster to find your daily notes (aka .plan files) and render them. I even made a <a href="https://whatrocks.github.io/fling-web/?username=whatrocks">sample static website that does just that</a></p>
<p><img src="https://www.charlieharrington.com/img/fling/fling-web.png" alt="Fling Web"></p>
<p>Plus - people can &quot;like&quot; your notes! And reply to them! Engagement, woo!</p>
<p>If you wanna fling - I also released a <a href="https://www.npmjs.com/package/fling-cli">demo CLI tool on NPM</a> to fling your daily notes that works somewhat like adding commit messages in git:</p>
<pre><code class="language-bash">$ fling -m &quot;* finished excellent blog post about .plan files&quot;
</code></pre>
<p>But wait - what about the OhLife email thing? Good point. Next up, I&#39;ve gotta introduce a little place called <a href="https://val.town/">Val.town</a>.</p>
<h2 id="valtown">val.town</h2>
<blockquote>
<p>&quot;What if GitHub Gists could run and AWS Lambda was fun?&quot;</p>
</blockquote>
<p>Need I go on? This is the motto / mantra of <a href="https://val.town/">val.town</a> - a dev tools startup that makes it really fun and easy to create these little runnable Javascript snippets. They&#39;ve added all sorts of great stuff, like <code>console.email</code> and <code>console.sms</code> - which do EXACTLY what you&#39;d hope and expect. I really love this website and I&#39;m spreading the word! We recently <a href="https://www.youtube.com/watch?v=ZmRJ6PgVOdM">interviewed Steve Krouse the founder on the CS Primer Show</a> and we spent an hour talking about what makes programming fun - because, guess what, it is super fun!</p>
<p>Anyway. Let&#39;s use val.town to make it all happen.</p>
<h2 id="putting-it-all-together">Putting it all together</h2>
<p>I drew this in Excalidraw - maybe it will help (did I pass the interview?).</p>
<p><img src="https://www.charlieharrington.com/img/fling/whiteboard.png" alt="Fling Architecture"></p>
<p>Most of this diagram is showing my mental model for how Farcaster works. Let&#39;s focus on the blue shaded boxes. There are two val.town vals (that&#39;s what they call their widgets) that we need to create:</p>
<ul>
<li>daily email sender</li>
<li>email replier</li>
</ul>
<p>The &quot;Daily Email Sender&quot; will use a popular Farcaster search tool to search through Farcaster for a random previous &quot;fling&quot; cast I sent, and then <code>console.email</code> it to me. We will also configure this val to set a &quot;reply val&quot; to receive (and execute) from any replies.</p>
<p>To grab any &quot;flings&quot;, you can use Searchcaster&#39;s API:</p>
<iframe width="660" height="365" src="https://www.val.town/embed/stevekrouse.farcasterFlings"></iframe>

<p>Remember our constraint - that the first character of a Fling root cast must be <code>⌆</code>.</p>
<p>We can do a lil&#39; more processing of the casts, but the next major thing we have to do is send ourselves a nice HTML email and set the replyTo to the name of the &quot;val&quot; that I want to execute:</p>
<pre><code class="language-javascript">console.email({
  replyTo: &quot;whatrocks.&lt;name_of_my_reply_val&gt;@valtown.email&quot;,
  html: `
  &lt;div&gt;
    &lt;p&gt;Just reply to this email with your entry.&lt;/p&gt;
    &lt;p&gt;Oh snap, remember this? ${diff_days} days ago you wrote...
    &lt;pre&gt;${flingContents}&lt;/pre&gt;
    &lt;p&gt;&lt;a href=&quot;https://whatrocks.github.io/fling-web/?username=whatrocks&quot; target=&quot;_blank&quot;&gt;Past flings&lt;/a&gt;&lt;/p&gt;
  &lt;/div&gt;`,
  subject: `It&#39;s ${today.toDateString()} - How did your day go?`,
});
</code></pre>
<p>My &quot;replyTo&quot; val has code that looks like this:</p>
<pre><code class="language-javascript">const email_text = e.text.slice(0, e.text.indexOf(&quot;\r\n\r\n&quot;));
const fling_cast = `⌆\n${email_text}`;
const did_cast = @me.otherValThatActuallySendsCast(e.from, fling_cast);
</code></pre>
<p>Before it does any of that, it also checks to see if the &quot;sender&quot; of the email matches the email I&#39;m expecting to see (there&#39;s no great way to add a password / auth to this process right now).</p>
<p>I&#39;ll call yet another Val which actually posts a Farcaster &quot;cast&quot;:</p>
<pre><code class="language-javascript">const { MerkleAPIClient } = await import(
    &quot;npm:@standard-crypto/farcaster-js&quot;
);
const { Wallet } = await import(&quot;npm:ethers@^5.7.1&quot;);
const mnemonic = @me.secrets.mnemonic;
const wallet = Wallet.fromMnemonic(mnemonic);
const apiClient = new MerkleAPIClient(wallet);
await apiClient.publishCast(cast);
</code></pre>
<p>That&#39;s how easy it is to send a cast with Farcaster!</p>
<p>Does it work? Did it work?</p>
<p><img src="https://www.charlieharrington.com/img/fling/daily-email.png" alt="Daily Email"></p>
<p><img src="https://www.charlieharrington.com/img/fling/reply.png" alt="Reply"></p>
<p><img src="https://www.charlieharrington.com/img/fling/cast.png" alt="cast"></p>
<p>Would ya look at that?! I got 6 likes!</p>
]]></description>
            <link>https://www.charlieharrington.com/farcaster-fling</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/farcaster-fling</guid>
            <pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[The CS Primer Show]]></title>
            <description><![CDATA[<p>Straight from the Nand Cave and also somewhere else in a cave or maybe outer space comes <a href="https://www.youtube.com/@cs_primer">The CS Primer Show</a>. </p>
<p>Here&#39;s episode one, where Oz and I meander around Richard Hamming&#39;s excellent talk <a href="https://www.cs.virginia.edu/~robins/YouAndYourResearch.html">You And Your Research</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/1rIYeTQkn_k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

<p>Subscribe to the YouTube channel for future episodes. You can expect a whole lot of Bell Labs content. Also check out Oz&#39;s new educational venture <a href="https://csprimer.com/">CS Primer</a> - it&#39;s like having your own personal Aristotle-Oz computer science tutor and I&#39;m loving it!</p>
]]></description>
            <link>https://www.charlieharrington.com/cs-primer-show</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/cs-primer-show</guid>
            <pubDate>Sat, 18 Mar 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[F52 By the Numbers]]></title>
            <description><![CDATA[<p>In the spirit of <a href="https://brickexperimentchannel.wordpress.com/2022/11/19/my-youtube-earnings/">Brick Experiment Channel&#39;s post</a> about their YouTube channel&#39;s earnings, I thought I&#39;d share some stats about last year&#39;s short story writing project <a href="https://f52.charlieharrington.com/">Fahrenheit 52</a>.</p>
<p>With it being the New Year and all, I thought I&#39;d channel my inner Stoic and classify these stats into <em>Those Things I Can Control</em> and <em>Those Things I Cannot Control</em>.</p>
<h2 id="those-things-i-can-control">Those Things I Can Control</h2>
<h3 id="stories">Stories</h3>
<p>52! And I managed to hit the weekly deadline for every single one, which wasn&#39;t always easy, like during our honeymoon (I had to basically pre-write that one).</p>
<h3 id="words">Words</h3>
<p>59,913.</p>
<p><a href="https://nanowrimo.org/">NaNoWriMo</a> says a novel is 50k words, so I wrote a book this past year. That&#39;s cool. Maybe I should self-publish it!</p>
<p>For future Charlie&#39;s edification, here&#39;s how I grabbed that stat:</p>
<pre><code class="language-bash"># make a tmp folder
mkdir tmp
cd tmp
# copy the stories into the tmp folder
cp ../fahrenheit-52/pages/stories/*.md .
# remove frontmatter from each story
sed -i &#39;&#39; -n &#39;16,$p&#39; *.md
# count words for all files in this directory
cat * | wc -w
</code></pre>
<p>I&#39;m also curious about <em>average words per story</em>. Since there are technically 53 stories in the project (I preloaded a zeroth story to make myself feel good in the beginning), we can just divide 59,913 by 53, which gives us <strong>1,130 average words per story</strong>. Now, my writer heroes like Stephen King and Delilah Dawson are probably outputting 1k+ words <em>per day</em> rather than <em>per week</em>, but, hey, it&#39;s a start!</p>
<h3 id="most-common-word">Most Common Word</h3>
<p>Now that we have a corpus of text, there&#39;s a bunch of fun data mining things we can do, like word clouds and Markov chains. In fact, I already wrote a story about just that this year, so I&#39;ll link over to that story rather than recreate the fun here: <a href="https://f52.charlieharrington.com/stories/writers-blockchain/">Writer&#39;s Blockchain</a>.</p>
<h3 id="minutes-of-audio">Minutes of Audio</h3>
<p>As a fun bonus, I read aloud each story and quickly published out as a podcast, which I listed in the iTunes Podcast Directory and the Spotify Podcast thingie. I&#39;ll share some (spoiler: disappointing) stats below, but the Spotify Wrapped for Podcasters did share this one:</p>
<p><img src="https://www.charlieharrington.com/img/f52-by-the-numbers/minutes.png" alt="minutes of audio"></p>
<p>Fairly certain they also missed the last episode/story or two, so I think we can safely call this ~300 minutes of audio. That&#39;s (carry the one...), 5 hours of audio! Roadtrip, here we come.</p>
<p><img src="https://www.charlieharrington.com/img/f52-by-the-numbers/logic.png" alt="logic tracks"></p>
<p>If you&#39;re at all intrigued by the F52 podcast, I can also reveal that there are also a few surprise narrators in there, including Carly, my parents, my mother-in-law, my sister, and one more!</p>
<p>Of every good outcome from this project, of which there are many, these recordings of my people reading my stories is by far my favorite treasure. Audio of your loved ones, I cannot recommend it enough. It&#39;s better than video. Close your eyes and listen to your people.</p>
<h2 id="those-things-i-cannot-control">Those Things I Cannot Control</h2>
<h3 id="page-views">Page Views</h3>
<p>Oof. We weren&#39;t doing this for the page views, were we? No! But they would have been nice, right? </p>
<p>Annoyingly (or perhaps for the best), Cloudflare Web Analytics only retains data for 30 days. Here&#39;s a current screenshot:</p>
<p><img src="https://www.charlieharrington.com/img/f52-by-the-numbers/webanalytics.png" alt="web analytics"></p>
<p>570 visits in last 30 days (with a minor spike from my <a href="https://www.charlieharrington.com/year-of-short-stories">Year in Short Stories</a> post). Not super great.</p>
<p>BUT -- what you&#39;re not seeing are the Hacker News bursts for a few of my stories. I posted my stories when I thought they&#39;d be interesting or relevant to the HN crowd. A few of them did okay, and <a href="https://f52.charlieharrington.com/stories/nibbles/">Nibbles</a> - a story about cute hungry hungry von Neumann probes) did great. <a href="https://news.ycombinator.com/item?id=33129432">This post</a> hung around the home page for a few hours and I think I saw ~1-2k visitors that day. There was also <a href="https://news.ycombinator.com/item?id=33906604">another post</a> that completely destroyed my bad science in <a href="https://f52.charlieharrington.com/stories/shimmer/">Shimmer</a> - my diamond asteroid mining story -- but in a super constructive positive way, where I learned a ton! All told, I had a very positive experience posting these on HN, and the comments were uplifting and helpful. It can really happen, people.</p>
<h3 id="rss-subscribers">RSS subscribers</h3>
<p>No idea. I don&#39;t have this instrumented, and I&#39;d love any guidance or tips for the future on how to best do this. For F52, I&#39;d wager a guess it&#39;s less than 10, even with the recent re-interest in personal blogs and whatnot.</p>
<h3 id="spotify-subscribers">Spotify Subscribers</h3>
<p>Hi, Mom!</p>
<p><img src="https://www.charlieharrington.com/img/f52-by-the-numbers/spotify.png" alt="spotify analytics"></p>
<h3 id="apple-podcasts-subscribers">Apple Podcasts Subscribers</h3>
<p>Also, hi Mom!</p>
<p><img src="https://www.charlieharrington.com/img/f52-by-the-numbers/itunes.png" alt="itunes analytics"></p>
<p>Clearly all my listeners must use <a href="https://overcast.fm/">Overcast</a>, like me!</p>
<h2 id="notes-for-next-time">Notes for next time</h2>
<p>I think I missed an opportunity in not collecting emails for a newsletter on the F52 website - especially during the big HN bursts. Or perhaps I should have just done everything as a Substack instead?</p>
<p>Like the good H2 says, just some notes for next time!</p>
]]></description>
            <link>https://www.charlieharrington.com/f52-by-the-numbers</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/f52-by-the-numbers</guid>
            <pubDate>Thu, 05 Jan 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[iPad Terminal Setup]]></title>
            <description><![CDATA[<p>Sometimes magical thinking works out just fine.</p>
<blockquote>
<p>Once I get an iPad, I&#39;ll do that thing I&#39;ve been procrastinating forever, cause, you know, the iPad has this app that&#39;s really good at...</p>
</blockquote>
<p>Well, we got an iPad. And I love it. Productivity-boosts are yet to be observed (please disregard the alarming Screen Time usage reports), but this honeymoon phase is strong.</p>
<p>Now, much of this love stems from the fact that my 2016 MacBook Pro laptop cannot, in fact, act as a laptop -- the screen turns black once you open it past, give or take, 10 degrees. The friendly Geniuses offered to replace my entire screen for almost $900 buckeroos, which I politely declined. So, it&#39;s clam-shell mode for me, at least until the (please-be-colorful) new MacBook Airs come out sometime this year.</p>
<p>Having a little machine to do stuff on the go is pretty cool. I&#39;ve reset my Anki deck and my daily flashcards are going pretty well for the first time in months (tapping the screen with the little Pencil is part of the appeal). <a href="https://procreate.art/">Procreate</a> is just as cool as everyone says and I&#39;m excited to get better at it. I&#39;ve also been dabbling with different apps to SSH into my various Raspberry Pis and mostly just running <code>sudo apt-get update &amp;&amp; sudo apt-get upgrade</code>, which has been made insanely easier thanks to <a href="https://tailscale.com/">Tailscale</a>. So far, I dig <a href="https://termius.com/">Termius</a> the most. Once nice thing that I setup was a little script to auto-download all the cool monthly Raspberry Pi maker magazines on a cron, and then I can use Tailscale&#39;s Taildrop to send them over to the iPad (haven&#39;t automated this last bit yet!).</p>
<p>SSH-ing is cool and all, but what if I&#39;m on airplane mode and want to do some coding. That&#39;s where <a href="https://ish.app/">iSH</a> comes in.</p>
<p>iSH is a tiny little Alpine Linux environment in an iOS / iPadOS app. No, you&#39;re not getting a shell to your actual iPad&#39;s OS or filesystem - it&#39;s all sandboxed, as per App Store regulations, but it&#39;s still pretty cool what you can do with it. Given that I&#39;ve been wanted to try out following the <code>kilo</code> <a href="https://viewsourcecode.org/snaptoken/kilo/">Build Your Own Text Editor in C</a> tutorial, iSH is perfect for this. But not right away - the initial setup is bare bones, which is how Alpine is designed. Maybe you&#39;ve noticed that many Docker containers start with an Alpine base image - just like those Dockerfiles, you&#39;ll need to install most of your handy CLI tools here. I found some useful guides on iSH setups for <a href="https://jsmp.me/2020/05/05/c-development-on-ios">C</a> and <a href="https://www.cyberciti.biz/faq/alpine-linux-install-bash-using-apk-command/">bash</a>, and here&#39;s what I&#39;m working with now:</p>
<script src="https://gist.github.com/whatrocks/09a0b0008712884f72398fe472de5d91.js"></script>

<p>On top of this, I also set up my git config and copied over some of <a href="https://github.com/whatrocks/dotfiles">my dotfiles</a>. Here&#39;s how things look on the ol` new iPad now:</p>
<p><img src="https://www.charlieharrington.com/img/ipad-terminal/ipad.png" alt="iPad with iSH"></p>
<p>I&#39;m ready to do some C, on the go!</p>
<p>My only gripe, at this point, is the lack of support for alphanumeric key-repeat in iSH and Termius. Very odd, and makes vim navigation much harder.</p>
<p>Now, with the exception of Procreate, none of this stuff is better than having a real-deal laptop, but it&#39;s pretty cool how close we can get to a decent dev environment on an iPad. And it&#39;s great for watching stuff, too, but you already knew that.</p>
]]></description>
            <link>https://www.charlieharrington.com/ipad-terminal-setup</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/ipad-terminal-setup</guid>
            <pubDate>Thu, 14 Apr 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[My New Old Apple Macintosh SE/30 Computer]]></title>
            <description><![CDATA[<p>I just finished reading <a href="https://amzn.to/3Caempq">The Order of Time</a> by Carlo Rovelli last night. It&#39;s a lovely little book about quantum gravity and the nature of time that I barely understood. But one thing I took away was that time -- and, by extension, the true meaning in our lives -- is driven by our memory, our nostalgia.</p>
<p>&quot;...which is why I think it makes sense to keep this vintage 1989 Apple Macintosh SE/30 on our bedside table.&quot;</p>
<p>No dice. I also tried appealing to <em>hobbies</em>, and their role in maintaining a balanced life.</p>
<p>But, alas, my new precious is headed for <a href="https://ittp.charlieharrington.com/">The Troll Pit</a> where (more than) a few <a href="https://www.charlieharrington.com/my-new-old-apple-iie-computer">Apple II</a>&#39;s will keep it company.</p>
<blockquote>
<p>How does one go from having zero vintage computers to... many of them? Gradually, and then suddenly.</p>
</blockquote>
<p>But, for at least a few more days, I&#39;ll be rocking this utterly tricked-out compact Macintosh on our dining room table. It is <a href="https://www.marchintosh.com/">#MARCHintosh</a>, after all.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/mac.jpg" alt="Mac SE/30"></p>
<p>That&#39;s right. I&#39;ve acquired the computer of my dreams: an Apple Macintosh SE/30, considered by many Apple wizards to be the greatest Mac of all time (or, at least, <a href="https://sixcolors.com/post/2020/11/20-macs-for-2020-6-macintosh-se-30/">the 6th most &quot;notable&quot; Mac ever</a>).</p>
<h2 id="buying-something-from-someone">Buying something from someone</h2>
<p>We&#39;re still allowed to do this on the Internet. Two live human beings can arrange an exchange of an owned, physical item for some form of (let&#39;s be honest, digital) payment. You don&#39;t need to buy everything from Amazon.</p>
<p>eBay&#39;s still a thing. Craiglist is still its weird self. And FB Marketplace is probably the best one of them all right now, for a very specific reason: it&#39;s insanely easy to go from a listing to a little Messenger chat with the seller. No more weird anonymized emails via Craigslist that feel like you&#39;re sending a fax to your grandfather in 1978. Yes, you do have to have the FB app AND its companion Messenger app, but there&#39;s gold in them thar vintage computer listings, I tell you. Actually, I shouldn&#39;t be saying this, because I don&#39;t want lose this precious alpha.</p>
<p>After many evenings of eBay alerts and FB Marketplace searches, I found a Mac SE/30 for sale in the greater Boston area, where I don&#39;t live, but I frequently visit. The rest is just boring details, which I fully document in the riveting Episode III of <a href="https://ittp.charlieharrington.com/">IN THE TROLL PIT</a> (my live-stream / YouTube channel about vintage computers):</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/vIlgxUoL9a4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>Long story short, I got the dang thing, and it works! But I was also scared, because what if it stopped working?</p>
<p>In fact, I did a lil&#39; research, and found out that these compact Macs got problems. There&#39;s a thing inside called a PRAM battery that looks like a mini D-cell and it helps keep things like the correct date going, and it&#39;s basically doomed to explode. Sages tell us that it&#39;s an absolute must to remove this battery in the modern era, or you&#39;re gonna have a bad time.</p>
<p>Next big ticking time-bomb are the electrolytic capacitors, which are just gonna do pretty much the same thing as the battery: get all weird and puffy and oozy and start leaking everywhere on the circuit board. One of the tell-tale signs of leaking electrolytic fluid in compact Macs is when the sound stops working.</p>
<p>Guess what? This thing&#39;s got no sound.</p>
<p>After that, I was afraid to turn on my precious. If you recall my adventures with <a href="https://www.charlieharrington.com/my-new-old-apple-iie-computer">the Apple IIe I found in the trash</a>, I&#39;m no stranger to capacitor issues.</p>
<h2 id="knowing-when-to-ask-for-help">Knowing when to ask for help</h2>
<p>Thanks to my prolific <a href="https://www.youtube.com/channel/UC8uT9cgJorJPWu7ITLGo9Ww">8-Bit Guy</a> viewing habits, I knew that my Mac needed &quot;professional&quot; help.</p>
<p>Why didn&#39;t I try to fix this myself? This computer -- unlike the Apple II -- has some serious high voltage components inside: the CRT. Basically, the cuteness-factor of its built-in screen is what makes this computer so tricky -- and dangerous -- to repair. There are all sorts of guides on YouTube explaining how to safely discharge the CRT with some screwdriver-looking-grounded gadget, but that&#39;s something I don&#39;t want to fumble through.</p>
<p>During my extensive vision quest for this machine, I had many conversations with folks on eBay and FB Marketplace about their various wares, so I decided to reach out to one of them who seemed pretty nice on our first go-round. Maybe they could help me out or knew someone who could help.</p>
<p>I hit the jackpot with my first reach out.</p>
<p>Soon, I delivered him my machine. Almost immediately, I started receiving regular text updates about my Mac: before-and-after cleaning photos, absurd RAM upgrade options, etc. He also sent along pictures throughout the restoration, which were like little treats for me. I knew my Mac was in capable, caring hands. When I finally picked it up two weeks later, my little cutie had changed, a lot.</p>
<h2 id="why-this-computer-is-super-cool">Why this computer is super cool</h2>
<p>In addition to giving it a nice once-over (no retrobrite, just some wiping), removing the PRAM battery, swapping out the capacitors, my &quot;dealer&quot; also offered to upgrade my machine&#39;s RAM (which started out as a measly 1MB). Going to 4 MB seemed like a good idea (and the max stock RAM was 8 MB), but he also offered going further... to the absolute max possible in this machine: a whopping 128MB, which would also require an upgraded ROM chip.</p>
<p>&quot;Go for it,&quot; I said.</p>
<p>He went for it. Here are some action shots.</p>
<p>First, opening up the hood.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/under-hood.jpg" alt="Under Hood"></p>
<p>Now we can see the original state of the board. Note the little red battery in the upper left. That&#39;s our PRAM battery. Goodbye, accurate dates. Also, the upper right is where the RAM goes. Notice that we&#39;re not using all of the available slots, which seems less than ideal.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/original-board.jpg" alt="Original Board"></p>
<p>In addition to the RAM chips, we installed the <a href="https://www.bigmessowires.com/mac-rom-inator-ii/">Mac ROM-inator-II from Big Mess O&#39;Wires</a>.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/before.jpg" alt="Before"></p>
<p>For $39 bucks, this ROM chip gives my Mac (according to their website):</p>
<ul>
<li>Diskless booting option</li>
<li>HD20 hard disk support built-in</li>
<li>32-bit clean – allows use of System 7.6+ and more than 8MB RAM</li>
<li>Memory test is disabled for faster booting on 16MB+ systems</li>
<li>Customized startup chime – major 9th arpeggio</li>
<li>Happy Mac icon is replaced by a color smiling “pirate” Mac</li>
<li>New startup menu screen displays installed RAM, addressing mode, and ROM disk details</li>
</ul>
<p>Heck, yeah, I want a smiling &quot;pirate&quot; Mac icon.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/pirate.jpg" alt="Pirate"></p>
<p>&quot;Computer, enhance.&quot;</p>
<p><img src="https://www.charlieharrington.com/img/macse30/enhance.png" alt="enhance"></p>
<p>Here&#39;s our baby with its upgraded ROM and RAM:</p>
<p><img src="https://www.charlieharrington.com/img/macse30/actionshot.jpg" alt="RAM"></p>
<p><img src="https://www.charlieharrington.com/img/macse30/after.jpg" alt="After Shot"></p>
<p><img src="https://www.charlieharrington.com/img/macse30/anotherangle.jpg" alt="Another angle"></p>
<p><img src="https://www.charlieharrington.com/img/macse30/ram.jpg" alt="RAM2"></p>
<p>ActionRetro has a <a href="https://www.youtube.com/watch?v=Sann_7dwMDk">great YouTube video</a> describing the same RAM/ROM setup. Honestly, I have no idea how to even leverage this RAM, but I had to have it.</p>
<p>Also, my &quot;computer guy&quot; replaced the existing hard disk with a <a href="http://www.codesrc.com/mediawiki/index.php/SCSI2SD">SCSI2SD</a>, installing System 7 and even Mac OS 8.1 along with the original System 6 on the SD card. There are also other options for this like <a href="https://scsi.blue/">BlueSCSI</a> or the <a href="https://www.bigmessowires.com/floppy-emu/">FloppyEmu</a>. My guy was familiar with SCSI2SD, so we went with this approach. I&#39;m happy. The only thing I&#39;m slightly concerned about is what happens if the SD card just randomly dies (like has happened on several of my Raspberry Pi&#39;s), cause I&#39;d have to open up the case to fix it, I think. I&#39;m thinking that I might grab a FloppyEmu as a back-up.</p>
<p>Switching between the OS versions is super easy. There&#39;s a shortcut to called System Picker - and I just pick a system and then restart and boom, I&#39;m in the selected OS. Mac OS 8.1 takes a bit longer to load than the others, but that&#39;s probably cause it was never supposed to work on this machine in the first place, which is cool.</p>
<p>Finally, my guy left me a little Welcome note (written in SimpleText) on the desktop with some tips, like how to set the correct date in the Control Panel now that the battery&#39;s gone, as well as how to enable 32-bit addressing to make use of the 128 MB RAM (as 24-bit addressing has a 16 MB limit).</p>
<p>This was all-around fantastic customer service, facilitated via shared nerdy interests on the Internet.</p>
<h2 id="games-and-apps-and-stuff">Games and apps and stuff</h2>
<p>Finally! What we&#39;ve all been waiting for! Here are some early highlights and delights among the apps on my SE/30.</p>
<h3 id="macpaint">MacPaint</h3>
<p>A true classic, written by Bill Atkinson himself. Without MacPaint, I would posit there would be no <a href="https://www.charlieharrington.com/mario-paint-masterpiece">Mario Paint</a>, so I&#39;m forever grateful.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/macpaint.jpg" alt="MacPaint"></p>
<h3 id="hypercard">HyperCard</h3>
<p>Another Atkinson wonder. I&#39;m pretty sure that the original version of Myst was just a HyperCard stack. As an amateur Tools-For-Thought-o-phile, I&#39;m excited to poke around here and make something as weird as my brain.</p>
<p>To that end, I bought the HyperCard manual on eBay.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/hypercard.jpg" alt="HyperCard"></p>
<h3 id="musicworks">MusicWorks</h3>
<p>There are songs and you can play them on your computer. And even write your own. This feels like the origins of GarageBand or Logic, but for people who understand music notation (not me -- yet!)</p>
<iframe height="560" width="315" src="https://www.youtube.com/embed/iKLDMXtTDz4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<h3 id="bbedit">BBEdit</h3>
<p>What Mac would be complete without a copy of <a href="https://www.barebones.com/products/bbedit/">BBEdit</a>? I&#39;m excited to figure out how to code up some stuff on this Mac soon. I don&#39;t even know what language that would be in... Objective C? Smalltalk? I need to do some more research.</p>
<h3 id="lemmings">Lemmings</h3>
<p>The music, just as good as I remember. The graphics, not so much.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/lemmings1.jpg" alt="Lemmings1"></p>
<p><img src="https://www.charlieharrington.com/img/macse30/lemmings2.jpg" alt="Lemmings2"></p>
<h3 id="sid-meiers-civilization">Sid Meier&#39;s Civilization</h3>
<p>The game that birthed an utterly time-consuming franchise for many of my close friends. I&#39;m worried about diving in too deep here.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/civ.jpg" alt="Civilization"></p>
<h3 id="oregon-trail">Oregon Trail</h3>
<p>Yes, Mom, this has Oregon Trail.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/oregon.jpg" alt="Oregon Trail"></p>
<h3 id="afterdark">AfterDark</h3>
<p>Everyone&#39;s favorite screen saver application! And I get it. I&#39;ve already spent over an hour reminding myself of all the different options. I probably should have mentioned this before, but this isn&#39;t my first rodeo with compact Macs. My Uncle Sean had one, and my cousins and I spent hours playing games on it in their attic bedroom.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/afterdark.jpg" alt="After Dark"></p>
<p><img src="https://www.charlieharrington.com/img/macse30/toaster.jpg" alt="Flying Toaster"></p>
<h2 id="rainy-day-to-do-list">Rainy day to-do list</h2>
<p>Here&#39;s my current ideas list for Mac SE/30 projects:</p>
<ul>
<li><input disabled="" type="checkbox"> Figure out how to get new software. Do I really need an early 2000s &quot;bridge&quot; Mac to write floppies?</li>
<li><input disabled="" type="checkbox"> Get on the internet. Mac OS 8.1 has Netscape and an early Microsoft browser, but I need some sort of ethernet card, I think. Or use a Raspberry Pi as a bridge?</li>
<li><input disabled="" type="checkbox"> Get a color video card (rare and expensive) and set up dual monitor</li>
<li><input disabled="" type="checkbox"> Write Apple-Script to automate turning on 32-bit addressing automatically and setting the correct date every time I turn on the computer</li>
<li><input disabled="" type="checkbox"> Code a game and publish it on GitHub / archive.org for other weirdos like me</li>
<li><input disabled="" type="checkbox"> Pixel-art PFP for myself in MacPaint</li>
<li><input disabled="" type="checkbox"> Get <a href="https://en.wikipedia.org/wiki/The_Dungeon_Revealed">The Dungeon Revealed</a> on this machine (its shareware version &quot;The Dungeon of Doom&quot; was our favorite game on Uncle Sean&#39;s Mac SE)</li>
</ul>
<p>Send me your ideas or old floppies, please.</p>
<h2 id="ps-some-meditations-on-a-beige-box">P.S. Some meditations on a beige box</h2>
<p>This is my personal computer. My data lives here. Not on the internet. When I turn this on and play Tetris, I can see my friend Steve&#39;s high score from last week on the leader board, when he visited me and I forced him to play this thing. </p>
<p>The Mac SE/30 feels &quot;personal&quot; in a way that my swappable, cloud-backed-up phone and modern laptop just don&#39;t. They&#39;re <a href="https://www.charlieharrington.com/smart-phone-dumb-terminal">dumb terminals</a>, but this is MY smart computer.</p>
<h2 id="a-final-coda">A final coda</h2>
<p>I now get the love for the Apple Extended Keyboard II. Also, plugging the one-button mouse into it is also weird and cute.</p>
<p><img src="https://www.charlieharrington.com/img/macse30/keyboard.jpg" alt="keyboard"></p>
]]></description>
            <link>https://www.charlieharrington.com/my-new-old-apple-macintosh-se30-computer</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/my-new-old-apple-macintosh-se30-computer</guid>
            <pubDate>Wed, 02 Mar 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Fahrenheit 52]]></title>
            <description><![CDATA[<p>I love a good challenge. Which isn&#39;t quite the same thing as a competition, although that can be part of it. In general, I think I&#39;ve done well with &quot;frameworks&quot; for my hobbies - whether that&#39;s running or writing or coding or music. I don&#39;t have to be The Best at anything, I just want to encourage habits that help me get in <a href="https://www.charlieharrington.com/flow-and-creative-computing">flow</a> and have fun and make weird stuff, and some scaffolding for my creativity has helped me.</p>
<p>For example, <a href="https://nanowrimo.org/">NaNoWriMo</a> kicked off my novel-writing habit a few years back, and now I&#39;ve got a real-life novel that I&#39;ve written and printed out on my home printer and spiral-bound at FedEx (I&#39;m working on getting the book in more people&#39;s hands this year!). </p>
<p>Right now, I&#39;m craving more writing, so I&#39;ve concocted a new challenge for 2022 that I&#39;m calling <a href="https://f52.charlieharrington.com/">Fahrenheit 52</a>.</p>
<p><img src="https://www.charlieharrington.com/img/f52.jpg" alt="Fahrenheit 52 logo"></p>
<p>With F52, I&#39;ll be writing a new short story, every week, for a year. The concept&#39;s based on a quote from my fav spooky guy Ray Bradbury:</p>
<blockquote>
<p>&quot;The best hygiene for beginning writers or intermediate writers is to write a hell of a lot of short stories. If you can write one short story a week—it doesn’t matter what the quality is to start, but at least you’re practicing, and at the end of the year you have 52 short stories, and I defy you to write 52 bad ones. Can’t be done. At the end of 30 weeks or 40 weeks or at the end of the year, all of a sudden a story will come that’s just wonderful.&quot; - Ray Bradbury</p>
</blockquote>
<p>The goal isn&#39;t perfection. It&#39;s about putting in the reps.</p>
<p>For fun, I&#39;m also reading the story out loud each week and releasing it as a podcast. You can read the stories on the <a href="https://f52.charlieharrington.com/">F52 website</a>, subscribe to the <a href="https://f52.charlieharrington.com/rss.xml">F52 RSS feed</a>, or subscribe to the <a href="https://f52.charlieharrington.com/podcast.xml">podcast RSS feed</a> with your favorite podcast player (<a href="https://overcast.fm/itunes1600947555">Overcast</a>, <a href="https://open.spotify.com/show/0CatFy1udJkcp8OkwwXp4b">Spotify</a>, <a href="https://podcasts.apple.com/us/podcast/fahrenheit-52/id1600947555">Apple Podcasts</a>).</p>
<p>For more fun, I made the F52 website using <a href="https://github.com/benjreinhart/syte">Syte</a> - the static site generator that my friend Ben wrote and that I&#39;ve been tweaking a bit. For this project specifically I added podcast RSS feed generation to Syte (which I wrote about in <a href="https://www.charlieharrington.com/my-diy-free-podcast-hosting-setup">this post on hosting podcasts for free</a>).</p>
<p>I&#39;ll close this post with another quote from Ray Bradbury. It&#39;s from my favorite book <em>Dandelion Wine</em> and it makes me cry:</p>
<blockquote>
<p>The wine still waits in the cellars below. My beloved family still sits on the porch in the dark. The fire balloon still drifts and burns in the night sky of an as yet unburied summer. Why and how? Because I say it is so.</p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/fahrenheit-52</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/fahrenheit-52</guid>
            <pubDate>Mon, 10 Jan 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Found Myself Driving]]></title>
            <description><![CDATA[<p>Last night I got to ride in my first driverless <a href="https://getcruise.com/">Cruise</a> car (adorably named Cheddar) and I brought along my guitar.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Aioq4w7k8do" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>Lyrics, for the record:</p>
<pre><code class="language-plaintext">Hop into the back seat
It&#39;s time for a ride
Tonight we&#39;re Cruisin&#39;
Yeah, let&#39;s autonomously drive

There&#39;s no one behind the wheel
But it keeps on turning
I still can&#39;t believe this thing is real
and it&#39;s continuously learning

I found myself driving in a self driving car
I found myself driving in a self driving car

I use a laser beam to find my way to you
I use a laser beam to deliver lots of food

I found myself driving in a self driving car
I found myself driving in a self driving car
</code></pre>
<p>I&#39;m assuming this is the first ever song performed in a driverless car. We&#39;re making history over here at Cruise.</p>
<p>Other than the song, the ride was unremarkable insofar as it just felt normal, even though there was no one behind the wheel. The whole experience was a weird blend of <code>this is amazing</code> and <code>this is an everyday thing</code>, if that makes sense. I&#39;m excited for more people to get to use Cruise soon!</p>
]]></description>
            <link>https://www.charlieharrington.com/found-myself-driving</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/found-myself-driving</guid>
            <pubDate>Wed, 15 Dec 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[My DIY Free Podcast Hosting Setup]]></title>
            <description><![CDATA[<p>You either die a hero or start a podcast. That&#39;s it. That&#39;s the blog post.</p>
<p>If you&#39;re still reading, good. Let&#39;s do this thing. Let&#39;s host a podcast for free.</p>
<h3 id="wait-some-questions">Wait, some questions</h3>
<h4 id="doesnt-itunes-host-podcasts">Doesn&#39;t iTunes host podcasts?</h4>
<p>Nope. They&#39;re just the most popular podcast directory. You need to host your RSS feed and audio files somewhere else on the Internet, and ideally somewhere that won&#39;t charge you a lot for bandwidth every time someone downloads one of your episodes. You also need to generate a podcast RSS feed (an XML file with specific fields) in the first place.</p>
<h4 id="well-then-what-about-spotify">Well, then, what about Spotify?</h4>
<p>Yeah, Spotify does some podcast stuff, too. I think they like podcasts because they don&#39;t have to pay royalties like they do on songs. I also remember hearing that they&#39;re actually re-hosting public podcasts on their side, which potentially had weird implications for the podcasts with those annoying &quot;dynamic ads.&quot; They also bought Anchor, which I think also hosts podcasts for free, but maybe they &quot;own&quot; your podcast or something. Honestly, don&#39;t really care and it may be quite different from what I said. Let&#39;s just move on.</p>
<h4 id="shouldnt-i-use-some-managed-service-instead-of-trying-to-do-this-myself">Shouldn&#39;t I use some managed service instead of trying to do this myself?</h4>
<p>Yes, probably. In fact, I&#39;d recommend <a href="https://transistor.fm/how-to-start-a-podcast/?via=charles">Transistor.fm</a>. I initially used them for <a href="https://escapingweb.github.io/">Escaping Web</a> before migrating the weird setup I&#39;m about to describe. Transistor comes with great features like analytics, YouTube integration, private feeds, and more. It&#39;s a small bootstrapped team and I love their own podcast &quot;Build Your SaaS.&quot; Lots of popular podcasts that you may already know and love use Transistor (like Indie Hackers). Shilling complete.</p>
<p>Enough. Get to the good stuff.</p>
<h2 id="charlies-diy-free-podcast-hosting-setup">Charlie&#39;s DIY Free Podcast Hosting Setup</h2>
<p>Here&#39;s the TLDR:</p>
<ul>
<li>Audio for episodes stored on <a href="https://archive.org/">archive.org</a></li>
<li>RSS feed (and podcast website) generated by <a href="https://github.com/benjreinhart/syte">Syte (the cutest little static site generator you ever did see)</a>, and both hosted on <a href="https://pages.cloudflare.com/">Cloudflare Pages</a> (or GitHub Pages, or Netlify, or... you get the picture)</li>
</ul>
<p>That&#39;s probably enough to get you started. But, if you&#39;re up for it, I&#39;ll walkthrough creating a new podcast from scratch.</p>
<blockquote>
<p>Quick note - an earlier version of this article recommended using GitHub Pages for audio hosting, but I&#39;ve switched to using the free tier of archive.org based on some suggestions in the <a href="https://lobste.rs/s/0ezfbx/my_diy_free_podcast_hosting_setup">discussion</a> of this post on Lobsters.</p>
</blockquote>
<h2 id="host-your-episode-audio-on-archiveorg">Host your episode audio on archive.org</h2>
<p><img src="https://www.charlieharrington.com/img/jp2.png" alt="Jurassic Park scene"></p>
<blockquote>
<p>Ah, now eventually you do plan to have audio on your, on your podcast, right? Hello?</p>
</blockquote>
<p>Dr. Ian Malcolm&#39;s right. We do need some audio. Let&#39;s think. I&#39;ve got this supremely unpopular Twitch / YouTube series called <a href="https://www.youtube.com/watch?v=99ZmzDSGkfo">IN THE TROLL PIT</a> where I <del>fix</del> interact with old Apple II computers (and hopefully soon a Commodore 64 and a Mac SE/30!). There&#39;s only two episodes so far (I&#39;m not getting in as much Troll Pit time as I&#39;d like to these days), but these YouTube videos should work for our podcast.</p>
<p>Let&#39;s use <code>youtube-dl</code> to download just the audio of <a href="https://www.youtube.com/playlist?list=PLC_pWofH2gku_gToeh1lZN8dssjcSUAft">IN THE TROLL PIT playlist</a> into a new folder:</p>
<pre><code class="language-bash">mkdir in-the-troll-pit-audio

cd in-the-troll-pit-audio

youtube-dl --extract-audio --audio-format mp3 -o &quot;%(title)s.%(ext)s&quot; https://www.youtube.com/playlist?list=PLC_pWofH2gku_gToeh1lZN8dssjcSUAft
</code></pre>
<p>Now, I&#39;ll rename them because I don&#39;t like spaces in my file names:</p>
<pre><code class="language-bash">mv Apple\ IIc\ unboxing.mp3 2-apple-iic-unboxing.mp3

mv Apple\ IIe\ computer\ floppy\ drive\ setup.mp3 1-apple-iie-floppy-drive-setup.mp3
</code></pre>
<p>Excellent. Now we can go to archive.org, hit <code>Upload</code> in the upper right, and fill out the metadata for our audio files:</p>
<p><img src="https://www.charlieharrington.com/img/archive-upload.png" alt="archive.org upload"></p>
<p>Each episode mp3 file will have its own page on Archive.org, like so:</p>
<p><img src="https://www.charlieharrington.com/img/archive-page.png" alt="archive.org page"></p>
<p>Finally, we can grab our mp3 file URL with the <code>VBR MP3</code> link, which should give us a URL like this for episode 2: <code>https://archive.org/download/ittp-002/2-apple-iic-unboxing.mp3</code>. Paste each episode&#39;s mp3 link into a scratch file somewhere, because we&#39;ll need it later!</p>
<h2 id="generate-your-podcast-rss-feed-and-podcast-website-with-syte">Generate your podcast RSS Feed and Podcast Website with Syte</h2>
<p>Nothing special up to this point, but here&#39;s where things get fun. I&#39;ve <a href="https://www.charlieharrington.com/writes-with">written before</a> about my friend Ben&#39;s static site generator <a href="https://github.com/benjreinhart/syte">Syte</a>. It&#39;s written in TypeScript and it&#39;s quite simple and easy to understand. I&#39;m planning to migrate this here blog to Syte from Gatsby very very soon because I&#39;m tired of my blog breaking every few weeks for some unknown node dependency reason. In the mean time, I&#39;ve already used Syte for other projects, including my &quot;writing tools&quot; interview site <a href="https://writeswith.com/">Writes With</a> (<a href="https://github.com/whatrocks/writeswith">repo here</a>).</p>
<p>More to the point, I&#39;ve contributed two new features to Syte in the last few weeks that make this whole podcast feed thing possible:</p>
<ul>
<li>RSS feed generation (aka standard blog RSS feeds - <a href="https://writeswith.com/rss.xml">example with Writes With</a>!)</li>
<li>Podcast RSS feed generation (aka exactly what you need to give the iTunes Podcast Directory to list your show)</li>
</ul>
<p>We&#39;ll use syte to create a website for our show and add a page for each episode. The contents of the episode pages will become the episode shownotes, and the frontmatter for each page will contain metadata that our podcast feed needs.You&#39;ll see!</p>
<p>First, let&#39;s make a new repo on GitHub called <code>in-the-troll-pit</code> to host our Syte site (hehe).</p>
<p>Now, back on your computer terminal, navigate back to your favorite directory for projects (mainly, just make sure you are not still in the <code>in-the-troll-pit-audio</code> directory). Let&#39;s install syte now:</p>
<pre><code>npm install -g syte@0.0.1-beta.12
</code></pre>
<p>Yeah, it&#39;s still in beta. I keep telling Ben it&#39;s ready for prime time. Maybe you can convince him. Anyway, now we can run the <code>syte new &lt;site&gt;</code> command to create a new project:</p>
<pre><code class="language-bash">syte new in-the-troll-pit 
cd in-the-troll-pit
</code></pre>
<p>Syte does hot-reloading locally, because its 2021, so let&#39;s fire it up and see where we&#39;re at.</p>
<pre><code class="language-bash">syte serve
</code></pre>
<p>Head on over to localhost:3500:</p>
<p><img src="https://www.charlieharrington.com/img/syte.png" alt="Syte default page"></p>
<p>Looking good. Let&#39;s first update the home page. Change your <code>pages/index.md</code> file to this: </p>
<script src="https://gist.github.com/whatrocks/3a1a96aecd85dccc2ddb01b1376a410f.js"></script>

<p>Nothing&#39;s showing up in our episode list anymore (cause I filtered out the homepage), so let&#39;s add our episode pages. We&#39;ll need a Markdown file for each, and a folder to hold them:</p>
<pre><code class="language-bash">mkdir pages/episodes
touch pages/episodes/{1..2}.md
</code></pre>
<p>Let&#39;s populate the page for episode 1.</p>
<pre><code class="language-markdown">---
title: &#39;1: Apple IIe Floppy Drive Setup&#39;
date: &#39;2021-05-26&#39;
episode_url: &#39;https://ia801500.us.archive.org/1/items/ittp-001/1-apple-iie-floppy-drive-setup.mp3&#39;
episode_duration: &#39;&#39;
episode_length: &#39;&#39;
episode_summary: Charlie&#39;s down in The Troll Pit and he&#39;s trying to setup an Apple DuoDisk floppy drive so that he can play the branch new game Attack of the Petscii Robots.
episode_explict: &#39;no&#39;
---

Charlie installs the DuoDisk floppy drive on his Apple IIe and plays Attack of the Petscii Robots!

Links and resources:

* [Apple IIe](https://en.wikipedia.org/wiki/Apple_IIe)
* [Apple DuoDisc](https://en.wikipedia.org/wiki/Disk_II#DuoDisk)
* [Attack of the Petscii Robots for Apple II](https://www.the8bitguy.com/26654/petscii-robots-for-apple-ii-now-available/)
</code></pre>
<p>The fields in the frontmatter are important - they are used by the podcast RSS feed generation process. iTunes needs/wants to know if your expisode is explicit or no, and so on. Take note of the <code>episode_url</code> field - this is the link to the mp3 we uploaded to archive.org. If you go to that link in your browser, it should just play the mp3 file. Very cool.</p>
<p>Also, two of the fields are blank right now - the episode duration and the expisode length. The episode duration refers to the length of your episode in seconds and the episode length refers to the size of your episode in bytes. Maybe these aren&#39;t the best names, but that&#39;s what I came up with. Let&#39;s calculate those from our mp3 file.</p>
<p>First, the duration in seconds:</p>
<pre><code class="language-bash">cd ../in-the-troll-pit-audio

ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal 1-apple-iie-floppy-drive-setup.mp3

727.693061
</code></pre>
<p>There&#39;s our duration! Now let&#39;s grab the file size in bytes:</p>
<pre><code class="language-bash">wc -c &lt; 1-apple-iie-floppy-drive-setup.mp3

6403740
</code></pre>
<p>Now we can update those fields in our frontmatter:</p>
<pre><code>episode_duration: &#39;728&#39;
episode_length: &#39;6403740&#39;
</code></pre>
<p>Next, I&#39;ll repeat the process for episode two:</p>
<pre><code class="language-markdown">---
title: &#39;2: Apple IIc Unboxing&#39;
date: &#39;2021-08-01&#39;
episode_url: &#39;https://ia601509.us.archive.org/20/items/ittp-002/2-apple-iic-unboxing.mp3&#39;
episode_duration: &#39;2141&#39;
episode_length: &#39;19075912&#39;
episode_summary: Charlie&#39;s friend Jason sent him an Apple IIc that&#39;s been sitting in Jason&#39;s childhood basement, and the two try to see if it still works.
episode_explict: &#39;no&#39;
---

Charlie&#39;s friend Jason sent him an Apple IIc that&#39;s been sitting in Jason&#39;s childhood basement, and the two try to see if it still works.

Links and resources:

* [Apple IIc](https://en.wikipedia.org/wiki/Apple_IIc)
* [Where in the World Is Carmen Sandiego](https://en.wikipedia.org/wiki/Where_in_the_World_Is_Carmen_Sandiego%3F_(1985_video_game))
</code></pre>
<p>If you head back to <code>localhost:3500</code>, our episodes now show up on the homepage:</p>
<p><img src="https://www.charlieharrington.com/img/syte_episodes.png" alt="Syte default page with episodes"></p>
<p>And here&#39;s what an episode page looks like.</p>
<p><img src="https://www.charlieharrington.com/img/episode.png" alt="Syte default page"></p>
<p>It&#39;s terrible (terribly awesome?). I&#39;ll leave it as an exercise to the reader to update the CSS (start with the the <code>app.css</code> in the <code>/static</code> folder). But you know? It&#39;s enough for our purposes.</p>
<p>Just two more things to do:</p>
<ol>
<li>Add a few more fields to the <code>app.yaml</code> file that are needed for podcast feed generation</li>
<li>Create/add podcast cover art</li>
</ol>
<h4 id="appyaml">app.yaml</h4>
<p>This file is an overall config used by Syte, kind of like frontmatter for the whole website. Let&#39;s add some more required fields for podcast feeds.</p>
<pre><code class="language-yaml">layout: app
title: in-the-troll-pit
base_url: https://ittp.charlieharrington.com
podcast_category: Technology
podcast_language: en-us
podcast_subtitle: Old computers are the best
podcast_author: Charlie Harrington
podcast_summary: Charlie Harrington has a problem - he loves old computers. He&#39;s down in the Troll Pit and  
podcast_explicit: &#39;no&#39;
podcast_email: ittp@whatrocks.org
podcast_img_url: &#39;&#39;
</code></pre>
<h4 id="coverart">Coverart</h4>
<p>We need podcast art! According to the Apple podcast guidance, our podcast art should be 3000 by 3000.</p>
<p>Here&#39;s what I&#39;m thinking. Grab a random screenshot from an episode and overlay some text on top. Probably gonna be terrible, but we can always change it later.</p>
<p>I&#39;ve been thinking a lot about Goosebumps series lately, so that&#39;s the vibe I&#39;m feeling for IN THE TROLL PIT logo. I found this font called <a href="https://fonts.google.com/specimen/Creepster?query=creepster">Creepster</a> on Google Fonts, downloaded it, and installed it locally (easier than you think on a Mac, just double click on the unzipped font file and click Install in the window that pops up).</p>
<p>Here&#39;s what I came up with: take a perfect-square screenshot of one of my episodes, add the show title text in Creepster font on top, save it to my Desktop, and then use ImageMagick to resize it:</p>
<pre><code class="language-bash">convert screenshot.jpg -resize 3000x3000 ittp.jpg
</code></pre>
<p><img src="https://www.charlieharrington.com/img/ittp.jpg" alt="ITTP coverart"></p>
<p>Put this awesome file in your <code>/static</code> folder and then add this to <code>app.yaml</code>:</p>
<pre><code class="language-yaml">podcast_img_url: https://whatrocks.github.io/in-the-troll-pit/static/ittp.jpg
</code></pre>
<h4 id="lets-make-our-podcast-feed">Let&#39;s make our podcast feed!</h4>
<p>We&#39;re basically done now. let&#39;s test out the Syte feed generator. Try this command:</p>
<pre><code class="language-bash">syte build
</code></pre>
<p>You should now see a new directory called <code>build</code> with your static site (all the HTML generated from the Markdown) as well as a <code>rss.xml</code> file (this is your site&#39;s RSS feed) and a <code>podcast.xml</code> (this is your podcast&#39;s RSS feed). Amazing! </p>
<p>All that&#39;s left now is to deploy these somewhere on the Internet. I suggest two options here:</p>
<h5 id="option-1-use-github-pages">(Option 1) Use GitHub Pages</h5>
<p>This is the easier option. Tell syte to output to the <code>docs</code> directory, git init this directory, add your origin as the <code>in-the-troll-pit</code> repo, git add everything, commit, and push to your Github repo. Then enable Github Pages in the settings using the <code>docs</code> folder and you&#39;re done! You should be able to access your podcast RSS feed on the internet, and then submit that URL to iTunes.</p>
<pre><code class="language-bash">syte build -o docs
</code></pre>
<p>I&#39;m going to go with option 2 because I like trying new things.</p>
<h5 id="option-2-use-cloudflare-pages">(Option 2) Use Cloudflare Pages</h5>
<p>We&#39;re going to set up Cloudflare Pages to deploy on changes to the <code>main</code> branch in this repo. Before we do that, we need to make a few more changes here because Syte is not (yet) natively supported by CloudFlare Pages (I&#39;d love to get this added if anyone from Cloudflare is reading!).</p>
<p>Create a <code>package.json</code> file with these contents:</p>
<pre><code class="language-json">{
    &quot;dependencies&quot;: {
      &quot;syte&quot;: &quot;^0.0.1-beta.12&quot;
    }
  }
</code></pre>
<p>Then <code>npm install</code>, which should create a big ol&#39; <code>node_modules</code> folder.</p>
<p>Finally, add a <code>.gitignore</code> with these contents:</p>
<pre><code>.DS_Store
node_modules
build
</code></pre>
<p>Now we&#39;re ready to get this up to Github:</p>
<pre><code class="language-bash">git init
git add .
git commit -m &quot;just setting up my syte&quot;
git branch -M main
git remote add origin git@github.com:whatrocks/in-the-troll-pit.git
git push -u origin main
</code></pre>
<p>Let&#39;s also turn on GitHub Pages for this repo so we can access our coverart. We can do that in the Settings tab and Pages section for this repo.</p>
<h3 id="set-up-cloudflare-pages">Set up Cloudflare Pages</h3>
<p>Now I&#39;m not going to do a full walkthrough of this part, because Cloudflare Pages is a rapidly changing new product. At a high-level, create a new Project with Pages, add your GitHub repo, and then configure your build. This build configuration step is important to get right, so here&#39;s what mine looks like:</p>
<p><img src="https://www.charlieharrington.com/img/buildconfig.png" alt="Cloudflare Pages"></p>
<p>It&#39;s important to get these details in the Build Configuration:</p>
<ul>
<li><code>Build command: syte build</code></li>
<li><code>Build output directory: /build</code></li>
</ul>
<p>Then I&#39;d also add this environment variable:</p>
<pre><code>NODE_VERSION: 15.12.0
</code></pre>
<p>I know this one won&#39;t age well, but I&#39;ve found it helps me to stay consistent here.</p>
<p>Then, hit build and Cloudflare will build and deploy your site! Mine&#39;s now live here: <code>https://in-the-troll-pit.pages.dev/</code> and the podcast feed is here: <code>https://in-the-troll-pit.pages.dev/podcast.xml</code>.</p>
<p>You&#39;re basically again at a nice enough place to stop and submit <a href="https://in-the-troll-pit.pages.dev/podcast.xml">your podcast feed</a> to iTunes. I&#39;m going to go one step further and set up a subdomain on my main website for my project, which I&#39;ll also use Cloudflare to do. If you don&#39;t want to do this, then just update your <code>app.yaml</code> file to the new <code>base_url</code> provided by Cloudflare Pages:</p>
<pre><code class="language-yaml">base_url: https://in-the-troll-pit.pages.dev
</code></pre>
<p>But since mine is <code>base_url: https://ittp.charlieharrington.com</code>, I&#39;m going to make that change now in Cloudflare, which is super easy if Cloudflare is managing your DNS - just hit the &quot;Custom domains&quot; tab and follow their guide. It takes a while for DNS to reflect your changes, so just wait ~2 days until the URL works correctly before you move on to the next step.</p>
<p><img src="https://www.charlieharrington.com/img/customdomain.png" alt="Cloudflare Pages Custom Domain"></p>
<h2 id="upload-your-rss-feed-to-itunes-directory">Upload your RSS feed to iTunes directory</h2>
<p>This part is less interesting to me, so I&#39;m not going to go too deep. Go to <a href="https://podcastsconnect.apple.com/my-podcasts">Podcasts Connect</a> (in Safari!) and create a new show and fill out the info with a link to your feed.</p>
<p><img src="https://www.charlieharrington.com/img/podcastconnect.png" alt="PodcastConnect"></p>
<p>It takes a couple days for the show to appear in iTunes. Keep refreshing, though. That helps it go faster.</p>
<p>You can also upload your show to other directories like <a href="https://support.google.com/podcast-publishers/answer/10315648?hl=en&ref_topic=9476061">Google</a>. I may need to update the Syte feed generation code to provide the required RSS metafields for these other directories, so if you run into any issues, please let me know on <a href="https://twitter.com/whatrocks">Twitter</a>.</p>
<p>If you really can&#39;t wait for iTunes, you can usually just add a podcast RSS url manually in your player of choice (mine&#39;s Overcast). Let&#39;s give that a shot. </p>
<p><img src="https://www.charlieharrington.com/img/overcast1.jpg" alt="Overcast Example 1"></p>
<p><img src="https://www.charlieharrington.com/img/overcast2.jpg" alt="Overcast Example 2"></p>
<p><img src="https://www.charlieharrington.com/img/overcast3.jpg" alt="Overcast Example 3"></p>
<p>That looks awesome! The shownotes look perfect!!</p>
<p>We&#39;re now ready for the final step.</p>
<h2 id="reach-out-to-squarespace-for-sponsorship">Reach out to Squarespace for sponsorship</h2>
<p>Good luck with that!</p>
<p>My final comment is that I think this approach is well-suited for putting your podcast into maintenance mode - no new episodes coming out any time soon, but you still want to keep the old ones up, without paying any monthly fees for hosting. That&#39;s exactly what I did with Escaping Web, and I&#39;m sure there are still a few EW-ers out there who are grateful that they can still listen to Oz&#39;s wisdom (I know I am!). And who knows, maybe we&#39;ll do season two one day :)</p>
<p>There&#39;s probably a bunch of things I could have done better or smarter in this article, and I&#39;m open to learning about them if you want to reach out. For now, happy casting, villians!</p>
<ul>
<li><a href="https://github.com/whatrocks/in-the-troll-pit">In The Troll Pit repo</a></li>
<li><a href="https://in-the-troll-pit.pages.dev/">In The Troll Pit website</a></li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/my-diy-free-podcast-hosting-setup</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/my-diy-free-podcast-hosting-setup</guid>
            <pubDate>Sun, 12 Dec 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Better This Christmas]]></title>
            <description><![CDATA[<h1 id="better-this-christmas">Better This Christmas</h1>
<p>I always wanted to write a Christmas song, so here you go (performed live at The Day After Thanksgiving Ping-Pong Tournament Party):</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/7kyNf14Zdno" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>BETTER THIS CHRISTMAS</p>
<p>By Charlie Harrington*</p>
<pre><code class="language-plaintext">So mad at myself
That elf on the shelf
Oh, if he only knew
How good I can be
As sweet as a pea
I&#39;ll even give up my blue.

I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
But it better be Christmas soon

Bet ya heard I didn&#39;t listen
Messed up the kitchen
Smudged a window or two.
Just a misunderstandin&#39;
Cause life&#39;s pretty demandin&#39;
When you&#39;re three-foot-two

I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
But it better be Christmas soon

Wrote you that letter
Said I&#39;d be better
Nothing else I can do.
Cause the clock is a-tickin&#39;
Santa, we&#39;re playin&#39; chicken
what are you gonna do

I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
But it better be Christmas soon

Now I&#39;m closing my eyes
Hoping you&#39;ll still arrive
I left milk and cookies for you
Now I don&#39;t need a thing
But if you happen to bring
Just leave a toy or two

I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
I&#39;ll be better this Christmas
But it better be Christmas soon
But it better be Christmas soon
But it better be Christmas soon!
</code></pre>
<h2 id="lots-of-asterisks">Lots of asterisks</h2>
<p>I listened to a recent <a href="https://podcasts.apple.com/sk/podcast/its-brutal-out-here-olivia-rodrigo-and-how-the/id1011668648?i=1000535402390">Decoder podcast episode</a> about how artists are just giving out songwriting credits readily, rather than face copyright issues, which explains why Olivia Rodrigo gave out credits to T. Swift and Paramore long after her album dropped. Anyway, here&#39;s who helped out with BETTER THIS CHRISTMAS:</p>
<ul>
<li>Story inspired by my nephew Monte</li>
<li>Lyrics help from Carly, Molly, Andy, Mom during the Thanksgiving dessert doldrums</li>
<li>Melody and fa-la-la-la help from Carly during our morning runs</li>
<li>Musical advice text messages from Michael Byrnes throughout the week</li>
<li>Performance credits to Michael Byrnes, Peter Clabby, Mikey&#39;s dad, Kevin, Patrick Clarke, and the whole Clabby-Byrnes-Harrington clan on fa-la-la-la&#39;s.</li>
</ul>
<p>Happy <a href="https://adventofcode.com/">Advent of Code</a>, everyone!</p>
]]></description>
            <link>https://www.charlieharrington.com/better-this-christmas</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/better-this-christmas</guid>
            <pubDate>Sat, 27 Nov 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Magazine Dopamine]]></title>
            <description><![CDATA[<p>As a recent subscriber to Stripe&#39;s Increment magazine, I was bummed to learn that &quot;<a href="https://store.increment.com/pages/faq">the final quarterly issue of Increment [was] published in November 2021</a>.&quot; I&#39;m sure the imprint will live on in some fashion, but, for a short moment, I enjoyed reading its well-edited, super-colorful, overall-nice-feeling dead-tree book-thing about a topic I enjoy in the meatspace.</p>
<p>Which got me a-thinking... what happened to the other magazines I loved as a kid, and where are they now, and <strong>can I still get them in the mail</strong>? Cause, guess what? Getting something you actually want in the mail is still fun.</p>
<p>So, let&#39;s find out!</p>
<h2 id="oriental-trading">Oriental Trading</h2>
<p>Gotta start off with a banger. I&#39;m shocked that this magazine/company still (or ever) exists. Also, I concede it&#39;s technically not a magazine. But, still, I loved crushing this thing as a kid, ogling its weird eyeball candies and probably-inappropriate holiday-themed bubble-sets, pencil sharpeners, and bouncy balls. On that note, if you were ever planning to release 10,000 bouncy balls in your high school hallway on senior prank day, Oriental Trading is how you&#39;d do it. <a href="https://www.orientaltrading.com/catalog-request-a1-560115.fltr">Request a free catalog here</a>. Yes, you&#39;ll probably be spammed for life. But you already were, and now you can buy lots of cool plastic stuff (that the state of the California also must remind you, on nearly every single listing, is probably also poisoning you in some terrifying way).</p>
<h2 id="weird-nj">Weird NJ</h2>
<p>Speaking on terrifying, I&#39;m happy to report NJ&#39;s favorite insane asylum explorers are alive and well! They&#39;re down to two issues a year, but they&#39;re just as creepy and fun as ever. Sign up for an <a href="https://store.weirdnj.com/">annual subscription here</a>, in case your local Welsh Farms stopped carrying them.</p>
<p><img src="https://www.charlieharrington.com/img/weird.jpg" alt="Weird NJ"></p>
<h2 id="nintendo-power">Nintendo Power</h2>
<p>Now we&#39;re getting into the good stuff. Nintendo Power was far-and-away the most important magazine of them all to kid-Charlie. When my parents finally agreed to get me a regular Nintendo, we did so in the most Harrington-way possible: at a garage sale, where the guy threw in a bunch of other goodies, including the Power Mat and 20-odd ragged Nintendo Power issues. I read every one roughly ten-billion times before I was finally allowed to subscribe to <strong>new</strong> issues.</p>
<p>Then, on some horrible, woebegone day 15-odd years ago, I purged their cardboard box home in my parent&#39;s attic and only kept three issues (thankfully, I kept the Link to the Past strategy guide, I&#39;m not a complete monster). But I&#39;m still kicking myself every time I think about it.</p>
<p><img src="https://www.charlieharrington.com/img/zelda.jpg" alt="Zelda"></p>
<p>That was a whole lot of backstory to say that you can&#39;t subscribe to Nintendo Power anymore.. in magazine format. But they do have a <a href="https://www.nintendo.com/nintendo-power-podcast/">monthly podcast</a>! And it&#39;s kinda fun! Apparently the new president of Nintendo&#39;s last name is Bowser and that&#39;s an actual, honest-to-goodness coincidence. The spirit of Howard and Nester lives on.</p>
<p>Also, if you really, really do want to get your NP nostalgia on, I suggest checking out <a href="https://www.retromags.com/">retromags.com</a>. Even YouTube doesn&#39;t have all the Mega Man X2 level-by-level walkthroughs you might need in a pinch.</p>
<h2 id="ccs">CCS</h2>
<p>Another not-quite-magazine that I treasured. Many hours were spent daydreaming over which skateboard deck and shoes I wanted to buy instead of actually going outside and practicing skateboarding.</p>
<p><img src="https://www.charlieharrington.com/img/ccs.jpg" alt="CCS"></p>
<p>These babies used to arrive 14 times a year, but <a href="https://shop.ccs.com/pages/catalog-request">you can still get them 2x a year by signing up here</a> and I do and I&#39;m still trying to pick the perfect deck rather than work on my heel-flip.</p>
<h2 id="klutz-press">Klutz Press</h2>
<p>AFAIK, sending this card in the mail will not result in the Flying Apparatus Catalog by Klutz Press arriving in your mailbox.</p>
<p><img src="https://www.charlieharrington.com/img/klutz.jpg" alt="Klutz Press"></p>
<p>But I&#39;ve just filled it out and I&#39;ll update this post if things turn out AWESOME. In the mean time, you can read all about my love of Klutz in <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">this open love-letter</a>, and just scour eBay and Amazon for their used books!</p>
<h3 id="a-future-golden-age">A future golden age</h3>
<p>Can magazines work in 2021? Probably not. They probably haven&#39;t been working for a long-long time. But who knows? Maybe we&#39;ll be flipping through their semi-fungible representations in the Facebook-verse. For now, let&#39;s just enjoy the decline and fall while we still can.</p>
<p>Now, zines, on the other hand, are in full-on revival-mode. Just check out <a href="https://wizardzines.com/">wizardzines</a> and you&#39;ll be a believer (and you can even print these out at home!) </p>
<p>Actually, that&#39;s my final exhortation in this post - get a printer, cause they&#39;re awesome. Everyone thinks they suck, and they don&#39;t. They&#39;re great. In fact, this is my new answer to the <code>What&#39;s one important truth do very few people agree with you on?</code> question. Here&#39;s <a href="https://amzn.to/3pU6XX3">the printer</a> I bought and love. Think about it. You can print things out! In your own house, without going anywhere else! Make a zine and print it out. Draw a maze, or a weird coloring shape, and print it out. Make Gutenberg proud.</p>
]]></description>
            <link>https://www.charlieharrington.com/magazine-dopamine</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/magazine-dopamine</guid>
            <pubDate>Mon, 01 Nov 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Mario Paint Masterpiece]]></title>
            <description><![CDATA[<p>Since having a child, I&#39;ve been on a nostalgia Mega Drive. If you know anything about me, then you&#39;ll probably agree I was already at alarming levels of the stuff, and I&#39;ve now likely reached the nostalgia mesosphere, even if just for a minute or so.</p>
<p>In particular, videos games are dominating my reminiscences. I&#39;ve been thinking about their role in my development as a human. Spoiler alert: it&#39;s an extremely positive one.</p>
<p>There&#39;s one game that stands out: Mario Paint. </p>
<p>This 1992 &quot;edutainment&quot; title (a word seemingly devised to revile kids) is a forgotten masterpiece of creativity, fun, and weirdness.</p>
<p>At the surface, its existence doesn&#39;t make a whole lot of sense. It&#39;s a digital art and music app on the Super Nintendo that uses (comes with!) a separate mouse controller. I can name exactly one video game like this, ever.</p>
<p>From what I&#39;ve learned in my <a href="https://www.youtube.com/watch?v=54bXwb5DfRI&vl=en">limited YouTube research</a>, although the Super Nintendo was always the more-parentally-acceptable console of the early 90s console wars (see Mortal Kombat SNES grey matter vs Sega Genesis blood), Nintendo was feeling the pressure to demonstrate that their &quot;family computers&quot; were actually forces for good in the battle for the attention span of the world&#39;s youth.</p>
<p>And, thus, Mario Paint.</p>
<p><img src="https://www.charlieharrington.com/img/mariopaint.jpg" alt="Mario Paint"></p>
<p>There&#39;s just no reason for this game to be this good. Sure, MS Paint on Windows was always a fun time-waster back in the day. But it certaintly wasn&#39;t weird. And Mario Paint is w-e-i-r-d. It&#39;s like Photoshop on Magic Mushrooms. Plus an animation studio. Plus a digital audio workstation (aka Garageband). And all this back when we were still recording our favorite songs from the radio on cassette tapes (if we were lucky enough to catch them, and even then usually missing the first few bars). </p>
<p>Don&#39;t talk to me about delightful UIs or UXs if you haven&#39;t played Mario Paint. Nothing makes sense at a glance. Instead, it&#39;s pure discovery. Click-and-see. The undo button is a dog&#39;s face. Why? Why not. The fill-paint animation is a break-dancing paint-brush with a smiley-face (that sentence had a lot of hyphens). I spent hours and hours clicking every button in Mario Paint, and just making weird shit.</p>
<p>Now, don&#39;t get me wrong, it&#39;s not like I exclusively played Mario Paint from 1992 forward (I probably didn&#39;t get it until 1993 or 1994 anyway). But I&#39;d find myself drawn back to Mario Paint way more often than my parents even expected.</p>
<p>Thinking about it now, Mario Paint reminds me of that poster of kindergarten classroom yore:</p>
<blockquote>
<p>Everything I need to know in life I learned in Mario Paint.</p>
</blockquote>
<p>Why do I like making <a href="https://www.charlieharrington.com/relay">weird songs</a> on Garageband? Mario Paint</p>
<p>Why do I like making <a href="https://www.charlieharrington.com/lendup-critters">logos for bands and apps</a> and companies? Mario Paint.</p>
<p>Why am I a software engineer? Mario Paint.</p>
<blockquote>
<p>But, Charlie, there&#39;s no &quot;game engine&quot; or programming environment in Mario Paint. What-so-ever do you mean? </p>
</blockquote>
<p>Thought you&#39;d never ask. In 2015, I was living in London working in business development for an edtech startup, traveling a whole lot, with a bunch of downtime in airports. I decided to Carpe Diem the idle-airport-time to teach myself programming (something I&#39;d been trying to do, on and off, for the previous seven years), so I bought a Big Nerd Ranch iPhone book. When my company planned a two-day hackathon, I pledged to build a little iPhone app, following the book step-by-step. I&#39;ve <a href="https://www.charlieharrington.com/introducing-knerds">written about this experience before</a>, so I won&#39;t fully rehash it. But the key thing is that, in addition to the basic Tinder/flash-card UX, I decided to add some fun little characters for the app (designed by my co-worker and pal <a href="https://www.dfxm326.com/">Dan McGorry</a>). Then, these characters obviously needed a backstory. A week or so later, I traveled back to New Jersey for my aunt&#39;s wedding and I was showing the app to anyone who would listen (not many). Except for my 9 year old cousin. She bit hard. She came up with even more ideas for their powers (hair that grows to become a bridge, melting down into a popsicle liquid so you can glide, and so on). The kicker: the next day, my aunt delivered to me some enemies for the game that my cousin had drawn, like Chill Factor:</p>
<p><img src="https://www.charlieharrington.com/img/chillfactor4.jpg" alt="Chill Factor"></p>
<p>I knew then and there that I wanted to <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">create wonderful things, be good, and have fun</a> for my career. I quit my job and studied to become a computer programmer.</p>
<p>Now, years in, am I creating wonderful things ever day? Not necessarily. But I try to keep the joy and weirdness alive in whatever I do.</p>
<p>Last week, I asked my mom to dig through my boxes in the attic to find my Super Nintendo Mouse. She graciously delivered. Even the intro screen screen to Mario Paint is a lesson in weirdness. I love-love-love it:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/kOlsR96Mf1A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>After about a half hour or so, I produced this masterpiece:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/mxtT-gWPSbM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>Yes, the main riff is more-or-less China Cat Sunflower by the Grateful Dead (I think).</p>
<p>I&#39;m not the only one who loves Mario Paint, particularly <a href="https://www.theverge.com/2020/2/6/21122335/nintendo-mario-paint-music-composers-snes">the music-maker</a>. There&#39;s a whole Internet of magic <a href="https://github.com/DC37/Super-Mario-Paint">Mario Paint</a> music like this, the entire back-side of Abbey Road (including secret track <em>Your Majesty</em>!): </p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/m0Jz3BgNWTc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


<p>I can&#39;t believe that this game exists (and still works!). I guess edutainment ain&#39;t so bad after all. For now, back to the drawing board!</p>
]]></description>
            <link>https://www.charlieharrington.com/mario-paint-masterpiece</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/mario-paint-masterpiece</guid>
            <pubDate>Wed, 04 Aug 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Computers by the Decade]]></title>
            <description><![CDATA[<p>I&#39;ve been doing a lot of research into the <a href="https://www.charlieharrington.com/library?topic=Computer%20History">history of computers</a><sup>1</sup> for my <a href="https://www.charlieharrington.com/books">forthcoming Middle Grade novel about robots</a> (as of March 2021, I&#39;m linking to a largely blank page here, which I assure you will one day be filled with the multitude of books I&#39;m going to write - end <em>Daily Affirmation</em> now).</p>
<p>I&#39;d like to share my current, wait for it, mental model for how I&#39;m thinking about the evolution of computing over the decades. I&#39;ll also highlight some current companies that I find interesting because they seem to be fellow computer historians.</p>
<p>First, a caveat canem: 🐶 Since this website is my little corner of the dub-dub-dub, I reserve the right to update this framework as I learn more. And I will be learning more, because I can&#39;t stop reading about this stuff. I love it. So, there, take that, fellow computer historians! Even better, please let me know what I&#39;ve messed up or got wrong so I can learn. Woof!</p>
<p>So, here&#39;s how I see the evolution of computers over the decades (including some predictions): </p>
<table>
<thead>
<tr>
<th align="left">Decade</th>
<th align="left">Computers</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1940s</td>
<td align="left">Analog</td>
</tr>
<tr>
<td align="left">1950s</td>
<td align="left">Digital</td>
</tr>
<tr>
<td align="left">1960s</td>
<td align="left">Warehouse</td>
</tr>
<tr>
<td align="left">1970s</td>
<td align="left">Mini</td>
</tr>
<tr>
<td align="left">1980s</td>
<td align="left">8-Bit PC</td>
</tr>
<tr>
<td align="left">1990s</td>
<td align="left">Pentium PC</td>
</tr>
<tr>
<td align="left">2000s</td>
<td align="left">Laptop</td>
</tr>
<tr>
<td align="left">2010s</td>
<td align="left">Smart Phones</td>
</tr>
<tr>
<td align="left">2020s</td>
<td align="left">Wearables</td>
</tr>
<tr>
<td align="left">2030s</td>
<td align="left">Embeddables</td>
</tr>
</tbody></table>
<p>Lemme recap these a bit (in a freewheeling manner). We see the first &quot;stored-program&quot; digital computers coming to life in the late 40s. These are your o.g. &quot;Von Neumann&quot; architecture machines, the real-world implementations of the universal Turing machine vision from 1936. Goodbye, Vannevar Bush&#39;s Differential Analyzer -- we&#39;ve now got computers that we can &quot;re-wire&quot; themselves with &quot;code&quot; instead of electromechanical widgets and whatnot that had to be manually reconfigured for different problems (usually military applications around this time, like calculating missile trajectories).</p>
<p>Then comes the era of the ominious Warehouse computer, dominated by Big Blue (IBM) and the angry BUNCH (Burroughs, UNIVAC, NCR, Control Data Corporation, and Honeywell) -- aka the FAANG of days of computer future past. Computers were huge, literally, during the 60s and 70s. Actual insects would get lodged inside them and wreak havoc -- &quot;bugs&quot;! This was also around the time that people thought there might only need to be a handful of computers in the whole wide world -- that computers would be a public utility like telephone service. </p>
<p>Along related lines, this is where folks started experimenting with &quot;computer networking.&quot; Let&#39;s layer that strand into our decades framework:</p>
<table>
<thead>
<tr>
<th align="left">Decade</th>
<th align="left">Computers</th>
<th align="left">Networking</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1940s</td>
<td align="left">Analog</td>
<td align="left">N/A</td>
</tr>
<tr>
<td align="left">1950s</td>
<td align="left">Digital</td>
<td align="left">N/A</td>
</tr>
<tr>
<td align="left">1960s</td>
<td align="left">Warehouse</td>
<td align="left">Timeshare</td>
</tr>
<tr>
<td align="left">1970s</td>
<td align="left">Mini</td>
<td align="left">ARPANET</td>
</tr>
<tr>
<td align="left">1980s</td>
<td align="left">8-Bit PC</td>
<td align="left">Internet</td>
</tr>
<tr>
<td align="left">1990s</td>
<td align="left">Pentium PC</td>
<td align="left">WWW</td>
</tr>
<tr>
<td align="left">2000s</td>
<td align="left">Laptop</td>
<td align="left">Web 2.0</td>
</tr>
<tr>
<td align="left">2010s</td>
<td align="left">Smart Phones</td>
<td align="left">Apps</td>
</tr>
<tr>
<td align="left">2020s</td>
<td align="left">Wearables</td>
<td align="left">TBD</td>
</tr>
<tr>
<td align="left">2030s</td>
<td align="left">Embeddables</td>
<td align="left">TBD</td>
</tr>
</tbody></table>
<p>Timesharing. You&#39;ve probably heard of it before. Essentially, the few people lucky enough to have access to these machines would sit at &quot;dumb&quot; Teletype terminals and their commands would be executed in some mainframe somewhere else (usually their university). You didn&#39;t have to own a computer to use one, you just needed to pay for access (sounds a lot like &quot;cloud computing&quot; nowadays, right? Time is a flat circle). It wasn&#39;t just all university-work. Games were being created and shared, and projects like <a href="https://en.wikipedia.org/wiki/PLATO_(computer_system)">PLATO</a> at University of Illinois were doing interactive things that seem impossible for their era:</p>
<p><img src="https://www.charlieharrington.com/img/plato.jpg" alt="PLATO"></p>
<p>Take a look at the rows for 80s and 90s - you&#39;re basically looking at Halt and Catch Fire season by season.<sup>2</sup> Personal computers. The World Wide Web. AOL Instant Messager. This is where things start hitting hard on the nostalgia receptors for me. I&#39;ll never forget the early `90s Christmas where we got our SoundBlaster 16 sound card. Carmen Sandiego never sounded so good.</p>
<p>Let&#39;s fast-forward to the new millenium. Frankly, I&#39;m increasingly less interested in the more recent eras of apps and smart phones. Even my predictions are boring to me. I don&#39;t have an Apple Watch. I know &quot;AR&quot; is coming (see recent WWDC teaser). I know we&#39;re going to be able to read brainwaves of pigs soon (or already are). I should probably keep more of an open mind about these upcoming technologies, so I&#39;ll try. But the history major in me just wants to go back and play with <a href="https://www.charlieharrington.com/my-new-old-apple-iie-computer">my Apple IIe</a>.</p>
<p>When I think about it, there&#39;s tons of additional &quot;strands&quot; that could and should be tracked in this framework. For example, the evolution of memory type and memory capacity over time is super fascinating, and probably is the number one driver of the changes in the &quot;computers&quot; column.</p>
<p>Or another idea, even closer to my heart, would be adding the &quot;definitive&quot; book that should be read for each era. Actually, let me try that one.</p>
<table>
<thead>
<tr>
<th align="left">Decade</th>
<th align="left">Computers</th>
<th align="left">Networking</th>
<th align="left">Book</th>
</tr>
</thead>
<tbody><tr>
<td align="left">1940s</td>
<td align="left">Analog</td>
<td align="left">N/A</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">1950s</td>
<td align="left">Digital</td>
<td align="left">N/A</td>
<td align="left"><a href="https://amzn.to/3eD3yq3">Turing&#39;s Cathedral</a></td>
</tr>
<tr>
<td align="left">1960s</td>
<td align="left">Warehouse</td>
<td align="left">Timeshare</td>
<td align="left"><a href="https://amzn.to/3m8jiD3">The Friendly Orange Glow</a></td>
</tr>
<tr>
<td align="left">1970s</td>
<td align="left">Mini</td>
<td align="left">ARPANET</td>
<td align="left"><a href="https://amzn.to/3e32kUB">The Soul of a New Machine</a></td>
</tr>
<tr>
<td align="left">1980s</td>
<td align="left">8-Bit PC</td>
<td align="left">Internet</td>
<td align="left"><a href="https://amzn.to/3kEztas">Return to the Little Kingdom</a></td>
</tr>
<tr>
<td align="left">1990s</td>
<td align="left">Pentium PC</td>
<td align="left">WWW</td>
<td align="left"><a href="https://amzn.to/3u5aTD4">Hard Drive</a></td>
</tr>
<tr>
<td align="left">2000s</td>
<td align="left">Laptop</td>
<td align="left">Web 2.0</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">2010s</td>
<td align="left">Smart Phones</td>
<td align="left">Apps</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">2020s</td>
<td align="left">Wearables</td>
<td align="left">TBD</td>
<td align="left"></td>
</tr>
<tr>
<td align="left">2030s</td>
<td align="left">Embeddables</td>
<td align="left">TBD</td>
<td align="left"></td>
</tr>
</tbody></table>
<p>I need some suggestions for the more recent eras!</p>
<h3 id="three-companies-that-seem-to-also-appreciate-computer-history">Three Companies That Seem to Also Appreciate Computer History</h3>
<p>Okay, onto the best part...</p>
<h4 id="replit">Replit</h4>
<p><a href="http://replit.com/">Replit</a> is a company that makes it easy to spin up an IDE in any language, right in your browser. Goodbye painful local dev environment setup. Students LOVE it. Teachers LOVE it. School administrators apparently DON&#39;T LOVE it (according to what I&#39;ve seen on Twitter).</p>
<p>So, what does Replit know about computer history?</p>
<p>They are the modern timesharing system - global, instant access to compute, with collaboration as first-class objective. It&#39;s a place to learn, play games, write your own games, build apps, ship stuff. They&#39;re even talking about building their own hardware &quot;dumb&quot; terminal that connects instantly to Replit. </p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We&#39;re prototyping a computer that boots to Replit and is hardwired with a VPN to make it impossible to block.<br><br>If it works, it will be free for students. Devs will pay full price with each computer sold will sponsor a student. <a href="https://t.co/8cQdhJqvFv">https://t.co/8cQdhJqvFv</a> <a href="https://t.co/Qu1eTYYa1x">pic.twitter.com/Qu1eTYYa1x</a></p>&mdash; Amjad Masad ⠕ (@amasad) <a href="https://twitter.com/amasad/status/1373065904678789121?ref_src=twsrc%5Etfw">March 20, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Timesharing is back. And this time you don&#39;t have to share, unless you want to!</p>
<h4 id="tailscale">Tailscale</h4>
<p><a href="https://tailscale.com/">Tailscale</a> is a company that makes it dead simple to set up a VPN for all your devices: phones, Raspberry Pis, laptops, desktops, you name it.</p>
<p>So, what does Tailscale know about computer history?</p>
<p>They are making the 90s-LAN party possible again. It was a beautiful thing when you could &quot;easily&quot; make your computers talk to each other, but then the Internet got scary and hard, and Tailscale makes it safe and easy again. </p>
<p>I recently used Tailscale to set up a little Raspberry Pi-powered robot car. I can SSH into my little robot and drive it around, and I&#39;m feeling like a kid again.</p>
<p><img src="https://www.charlieharrington.com/img/car.jpg" alt="car"></p>
<h4 id="oxide-computer-company">Oxide Computer Company</h4>
<p><a href="https://oxide.computer/">Oxide Computer Company</a> is a new computer company. Like hardware-hardware computer company! They&#39;re building servers for folks who don&#39;t want to (or can&#39;t) just use AWS, GCP, Azure, Digital Ocean, blah blah... the cloud.</p>
<p>So, what does Oxide know about computer history?</p>
<p>More than me! Just listen to their epic <a href="https://oxide.computer/podcast/">podcast On the Metal</a> to hear for yourself. They even went through a fun design project of <a href="https://oxide.computer/blog/retro-logos-project-60s/">redesigning their logo to look like definitive computer companies of days past.</a>.</p>
<p>But most importantly I think that Oxide harkens back to the `90s era of owning your compute infra end-to-end. We do not have to accept that everything will be in the cloud. Maybe your closet is a better choice. Tradeoffs, amiright? There are going to be even more cases in the future where local compute is needed (e.g. how about the Moon or Mars?!)</p>
<h3 id="computer-historian">Computer historian</h3>
<p>In conclusion:</p>
<p>By trade, I&#39;m a software engineer. By spirit, I&#39;m a computer historian. By George, I&#39;m trying to combine the two (just like these three companies).</p>
<h4 id="footnotes">Footnotes</h4>
<ol>
<li><p>I&#39;m kinda showing off something neat with this link -- linkable searching using query-params for my <a href="https://www.charlieharrington.com/library">Library book list</a>. I&#39;m proud of this lil&#39; quality of life feature for my site. If you&#39;re one of those people who like to strip query params from links, by all means do so, but if you want to share a <a href="https://www.charlieharrington.com/library?topic=Ancient%20Rome">list of the books I&#39;ve read about Ancient Rome</a> (why would you want to do this if you&#39;re not me?), keep &#39;em in the link.</p>
</li>
<li><p>Watch this show. If you love computers, watch this show. If you love great characters making terrible decisions, watch this show. And then watch it again using this <a href="https://bits.ashleyblewer.com/halt-and-catch-fire-syllabus/">college-course level syllabus by Ashley Blewer</a>.</p>
</li>
</ol>
]]></description>
            <link>https://www.charlieharrington.com/computers-by-the-decade</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/computers-by-the-decade</guid>
            <pubDate>Wed, 31 Mar 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Notes on My Chemotherapy]]></title>
            <description><![CDATA[<p>Nobody likes an addendum.</p>
<p>Appendices are great (ask any Tolkien fan). P.S.&#39;s are <em>the best</em> (especially if they&#39;re from a penpal).</p>
<p>But addendums. Nope. They change the rules, after you&#39;ve started playing. After the game&#39;s over, even.</p>
<p>I recently got dropped with this whopper of an addendum:</p>
<pre><code>Orcein stains performed on blocks A3 and A5 highlight elastic fibers
wrapping around nests of tumor cells, consistent with vascular invasion
</code></pre>
<h2 id="a-lil-background">A lil&#39; background</h2>
<p>Previously, on &quot;Halt and Catch Cancer&quot;, I thought I was in the clear. Sure, I&#39;d been <a href="https://www.charlieharrington.com/colon-cancer">diagnosed with Stage II colon cancer at age 34</a>. But the neato robotic surgery to remove my sigmoid colon (and my grisly barnacle of a tumor) was successful, with no signs of the cancer spreading to the nearby lymph nodes (which are essentially the Information Superhighway of your body&#39;s immune system).</p>
<p>Officially, we&#39;re talking a PT3N0 pathology, where N means the number of lymph nodes with tumor cells (zero, in my case, of the 21 that were removed and inspected) and T means the levels of colon wall that the tumor &quot;broke through.&quot; N0 is awesome and T3 is not-so-awesome. My tumor was pretty darn close to breaking through the colon wall. But the fact that I had no lymph nodes affected was a good sign -- a good enough sign that no chemotheraphy was being recommended by my USCF doctor crew.</p>
<p>Now, after my blog post on this whole &quot;cancer sitch,&quot; I&#39;d been in touch with friends and other wood-workers who were, unfortunately, familiar with this process. One, in particular, has been highly tuned into the research and literature around colon cancer, and he pushed me to make sure I fully understood my pathology. He also mentioned that he&#39;s seen folks with my PT3N0 pathology do chemotherapy on a preventative basis. Given that my big missive in my last post was about &quot;becoming your own health advocate,&quot; his advice hit hard, because I was already lapsing in my attentiveness. Frankly, I was exhausted from the surgery, relieved by the results, ready to move on, and the pathology report itself was confusing af.</p>
<p>Actually, you know what? I&#39;m just going to paste it here:</p>
<pre><code>FINAL PATHOLOGIC DIAGNOSIS
Sigmoid colon, sigmoid colectomy:
1. Adenocarcinoma, moderately-differentiated, invasive through
muscularis propria into pericolic adipose tissue, negative margins; see
comment.
2. No tumor in twenty-one lymph nodes (0/21).
COMMENT:
COLON CARCINOMA SYNOPTIC COMMENT
- Procedure: Sigmoid colectomy.
Result Information
All Reviewers List
Pathology PDF Report
Narrative &amp; Impression
Harrington, Charles
- Location of tumor: Sigmoid colon.
- Tumor size: 3.3 x 2.5 x 1 cm.
- Macroscopic tumor perforation: Not identified.
- Histologic Type: Adenocarcinoma.
- Histologic Grade: Moderately-differentiated (low grade).
- Microscopic depth of invasion: Tumor invades through the muscularis
propria into pericolic soft tissue (pT3).
- Margins: Negative.
 - Proximal margin: Negative (tumor is &gt; 4 cm from margin).
 - Distal margin: Negative (tumor is &gt; 4 cm from margin).
 - Circumferential (radial) margin: Negative (tumor is &gt; 3 cm from
margin).
- Treatment effect (modified Ryan score, scale 0-3): No known
presurgical therapy.
- Lymphovascular invasion: Not identified on H&amp;E (orcein stains will
be performed on blocks A3 and A5, and the results will be reported as an
addendum).
- Perineural invasion: None.
- Tumor Deposits: Not identified.
- Lymph node status: Negative (number of lymph nodes examined: 21).
- Other pathologic findings: None identified.
- AJCC Pathologic Stage: pT3N0.
- Ancillary studies: Immunohistochemistry for DNA mismatch repair
proteins will be reported in an addendum.

Addendum Comment
Immunohistochemistry was performed to evaluate the status of DNA
mismatch repair protein expression on block A3. The results in the tumor
cell nuclei are:
MLH1 expression: Present.
PMS2 expression: Present.
MSH2 expression: Present.
MSH6 expression: Present.
Expression for all four markers, in most cases, indicates that the DNA
mismatch repair proteins are intact. This result should be correlated
with the clinical presentation and family history to determine the need
for further work up for Lynch syndrome
</code></pre>
<p>Probably TMI, but this will actually be easier for me to find later, instead of spelunking through the oh-so-painful EPIC MyChart software. Am I allowed to share this? I DON&#39;T KNOW AND I DON&#39;T CARE.</p>
<p>As you can see, this plaintext nightmare is full of strange and wonderous medical terms. Yes, the doctors walk you through it but still... it&#39;s a lot. I did push them to explain the terms, like what negative margins mean and why they&#39;re a good thing, although I kind of forget already so I won&#39;t try to explain.</p>
<p>After this walk-through with the docs, I felt good about my plan. No chemo needed. Just ongoing tests and CT scans and blood work and colonoscopies over the next five years to make sure that the cancer wasn&#39;t back, led by the UCSF Cancer Survivorship Clinic. Sure, that wasn&#39;t nothing, but it also isn&#39;t that bad, considering how lucky I am to have caught this thing and gotten it removed ASAP. The idea was, after five years, I&#39;d be back in the general population for risk of colon cancer. <em>Cured</em>.</p>
<p>But then, during my first Survivorship Clinic convo in November, I recalled that one line from the pathology... the one mentioning the addendum that I hadn&#39;t yet seen. I ask about it. We dig in, and we find this:</p>
<pre><code>Addendum Comment
Orcein stains performed on blocks A3 and A5 highlight elastic fibers
wrapping around nests of tumor cells, consistent with vascular invasion
</code></pre>
<p><code>Consistent with vascular invasion</code>. Welp, that can&#39;t be good.</p>
<p>At this point, I&#39;m immediately whisked off the UCSF Oncology Department.</p>
<h2 id="new-faces-and-new-tests-and-new-plans">New faces and new tests and new plans</h2>
<p>A hospital is a series of interconnected rings, all slightly Venn Diagramming each other, kind of like the Olympics logo. As a patient, you tend to orbit one of the rings. But sometimes you&#39;ll Three Body Problem your way over to another ring.</p>
<p>In my entire diagnosis and surgery process, I&#39;d never made it over to the Oncology (aka cancer) ring -- I was stuck in Surgery World. But, after this addendum, I&#39;m now squarely in their circle.</p>
<p>So, what&#39;s our goal now? Well, now that we&#39;ve noticed that my cancer has slightly spread into the vascular system, we need to figure out what to do about it. First, let&#39;s remember the good stuff - the rest of the pathology is relatively awesome. Next, let&#39;s get some more data!</p>
<p>We do these tests:</p>
<ul>
<li>Signatera - looks in your blood for tumor cells</li>
<li>Oncotype - looks at your tumor and rates the likelihood of recurrence</li>
</ul>
<blockquote>
<p>Let me reiterate that my explanations of these tests (and anything medical-related) is entirely my random-dudeman-laymen&#39;s explanation. I hope to provide one person&#39;s context and interpretation of these confusing and scary things. I&#39;m open to feedback and information on what I can do better.</p>
</blockquote>
<h3 id="insurance-aside">Insurance aside</h3>
<p>Insurance didn&#39;t want to cover the Oncotype test, because, of course. Insurance doesn&#39;t want to cover a lot of things, especially brand new &quot;cutting edge&quot; stuff, like the Oncotype test.</p>
<p>Instead, insurance wants to make sure that you really-super-duper-need whatever it is they&#39;re going to give you, to the point where there&#39;s basically no way they can say no. My doctors have been amazing advocates for me, helping make sure that insurance knows how important these tests and treatments are for my health. THANK YOU, UCSF.</p>
<p>Insurance is frustrating and scary. I do not understand it. I do not want to understand it. I wish it was simpler. I wish I didn&#39;t have to make sure that I was &quot;covered&quot; for things related to my health and my family&#39;s health. I also know that I&#39;m incredibly lucky to have good insurance. I took a screenshot from my insurance app back in December:</p>
<p><img src="https://www.charlieharrington.com/img/bill.png" alt="insurance bill"></p>
<p>WTF. That&#39;s an insane amount of money. But my life was saved, sooo...? The insurance company even assigned me a nurse to &quot;check in on me&quot; as a resource back in November and December, which sadly was more of a nuisance than anything else. And, then, when my company switched insurance providers at the beginning of 2021, this nurse service stopped abruptly. The whole thing&#39;s odd. But I can say again that I am extremely grateful to have had good insurance during my cancer treatment.</p>
<h3 id="make-a-new-plan">Make a new plan</h3>
<p>The Signatera is clear, which is great. No circulating tumor cells in my blood. I ask the question, &quot;Doesn&#39;t this mean I&#39;m, like, good for life now?&quot; And apparently no. They can&#39;t say that. They can only say, &quot;We don&#39;t see anything right now.&quot; It&#39;s the balance sheet of cancer. Just cause things look good right now doesn&#39;t mean that next year or next quarter&#39;s gonna be the same. Past performance is no indication of future something-something.</p>
<p>Oncotype&#39;s pretty good, too. From what the doc explains, this test suggests that my tumor has a 12% recurrence rate. This is a low number and I should be happy about it. And I am. But I want it to be zero, obviously. Also, recurrence isn&#39;t talking about new polyps growing in my butt and starting cancers -- that can still happen. Recurrence is about whether cells from my now-removed cancer tumor are going rear their awful heads again, somewhere else in my body.</p>
<p>It&#39;s at this point that we get into the discussion around chemo. There&#39;s evidence that chemo can help reduce the recurrence rate even further. My oncology team brings my data to this cool-sounding UCSF &quot;Tumor Board&quot; meeting, and they advise a chemo treatment. The evidence suggests that we can bring down my recurrance rate from 12% to 6%.</p>
<p>But they also reiterate that it&#39;s my choice. I can say no. As my aforementioned friend said, &quot;You don&#39;t do chemo recreationally.&quot; In fact, the doctors explain that if I were an old man, they might not advise treatment. But since I&#39;m young and restless, it makes more sense for me to do whatever I can to improve my chances.</p>
<p>Duh, let&#39;s do this thing.</p>
<h2 id="so-whats-chemotherapy-like">So, what&#39;s chemotherapy like?</h2>
<p>Well, first of all, there&#39;s all different kinds of chemo. I didn&#39;t know that. I&#39;m on a combo colloquially called <a href="https://en.wikipedia.org/wiki/CAPOX">CAPEOX</a> (which I thought sounded a bit like a rival Star Fox gang). It stands for capecitabine (brand name is Xeloda) and  oxaliplatin. Cape comes in pills and ox is an IV drip. </p>
<p>But wait -- more decisions. Do we do six months or three months of treatment? We review the data from a Japanese study, and we conclude that there&#39;s no measurable difference, so we go with 3 months, due to risk of chemo <em>side effects</em>.</p>
<h3 id="chemo-is-not-a-pure-function">Chemo is not a pure function</h3>
<p>Chemo has side effects. Here are the things that I&#39;ve encountered so far:</p>
<ul>
<li>super cold fingers and toes</li>
<li>lockjaw when I start eating</li>
<li>clenching claw hands</li>
<li>it hurts to cry (and I just finished the last season of Halt and Catch Fire, so yeah..)</li>
<li>no appetite, not even for pizza or beer</li>
<li>nausea</li>
<li>kinda a sad feeling</li>
<li>dead sperm(!)</li>
</ul>
<p>Shockingly, there&#39;s no hair loss expected. I&#39;m already in a thinning situation &quot;up there,&quot; but it&#39;s not supposed to get any worse. A small, dumb part of me thinks that once treatment&#39;s over that it might even get better! But this small part is very dumb.</p>
<p>Let&#39;s talk about the sperm stuff. As a result of doing chemo, there&#39;s a good chance that my swimmers are gonna be dead for good. There&#39;s also a chance that they can come back. But, if I want to ensure that Carly and I can have the family we want, I need to do sperm banking, quickly! Apparently, there&#39;s a ticking clock on starting chemo post-surgery (something like within 8 weeks). So, I&#39;ve got a week to do as much sperm banking as I can! Fun!</p>
<p>The sperm banking process is hilarious. You go to a building, then into a waiting room, then you are led to a tiny little room with a metal door in the wall. When you are done collecting your sample in a cup, you open the door in the wall and put the cup in there, and then press a button, and someone on the other side grabs it. In between that, there&#39;s literally a Roku porn subscription and a big TV. I went four times in a week. We got some good stuff collected.</p>
<p>Another note on the 3 months vs 6 months decision - there are other potential side effects to chemo that factor into the timing decision. The big one in my case is something called <a href="https://en.wikipedia.org/wiki/Peripheral_neuropathy">neuropathy</a>. Essentially, chemo can potentially cause long-term, life-altering nerve damage. The signs of it often begin with numb feet and hands, which I will admit seem rather easy to confuse with the expected, but not serious symptoms of cold hands and feet. The docs explain that any signs of neuropathy need to be reported immediately and we will halt chemo immediately, because the long-term negative effect of neuropathy far outweighs the gains in any reduction of recurrence rates in my case.</p>
<p>Now, given of all that prep and preamble, it&#39;s finally time to start chemo!</p>
<h2 id="charlie-the-cyborg">Charlie the Cyborg</h2>
<p>Wait. We need a way to get the chemo into your body. There&#39;s two options: a PICC line or a port. In either case, we need a tube that&#39;s threaded through your veins directly above your heart. If you go PICC, we gotta thread that in for every single treatment. If you go port, you only do that once, but you get this Tony Stark metal disk thing in your chest. You can guess which one I chose.</p>
<p><img src="https://www.charlieharrington.com/img/port.jpg" alt="Port"></p>
<p>Now I have an ID card that explains why metal detectors don&#39;t like me anymore.</p>
<p><img src="https://www.charlieharrington.com/img/portchest.jpg" alt="Port Chest"></p>
<p>Gross and weird, but also cool and weird. With this port, it&#39;s a simple little pin prick to get me all connected to the IV stuff. Here I am plugged in.</p>
<p><img src="https://www.charlieharrington.com/img/plugged.jpg" alt="plugged"></p>
<p>My three week cycle consists of this:</p>
<ul>
<li>Day One: Ox drip and start taking pills</li>
<li>Next 2 weeks: pills 2x a day</li>
<li>Third week: Nothing</li>
</ul>
<p>Then, start over, for 4 times total.</p>
<p>The point of the third week is to help your white blood cells recover. The chemo fries them, too. It basically kills anything fast growing in your body (my interpretation!), so your useful blood cells (and sperm and hair etc etc) are impacted. Not a super great thing to happen during a global pandemic, weakening your immune system and all.</p>
<p>The drip takes like 2 hours. I usually bring some books and a chicken parm sub and my Nintendo Switch. Here&#39;s me after a pee-break:</p>
<p><img src="https://www.charlieharrington.com/img/bathroom.jpg" alt="bathroom selfie"></p>
<p>I buy this pill box on Amazon, cause why not:</p>
<p><img src="https://www.charlieharrington.com/img/pillbox.jpg" alt="pill box"></p>
<p>This sucker lives in our kitchen counter in plain sight so that I never forget to take my 2x a day sets, and so far, I haven&#39;t ever forgotten.</p>
<h2 id="what-next">What next?</h2>
<p>This has been a long, strange trip of a six-month period. I&#39;m currently in the second week of the third cycle. My third cycle had to be pushed back a week because my white blood cells were too low. I came back the next week, and they were still low, but we decided to proceed, and just dropped my cape dosage from 2000mg to 1500mg (3 pills 2x a day instead of 4 pills 2x a day). In another week, I get to have the glorious &quot;week off&quot; (when I again crave the taste of beer), and then we&#39;re back for the fourth and final round.</p>
<p>I can&#39;t wait for this to be over. I can&#39;t wait for this port to be out of my chest. I&#39;m happy that I&#39;m doing everything I can to ensure that I have a long and healthy life. I&#39;m eager to get back on the UCSF Survivorship Clinic plan, and start improving my diet to reduce inflammation (and all this other stuff that&#39;s supposed to help prevent cancer).</p>
<p>I have learned a lot about cancer and health. My heart breaks when I think about children who&#39;ve suffered from cancer. My infusion center is the adult center. I&#39;m not sure I could stomach seeing children and babies getting chemo. I&#39;m crying right now even thinking about it (which hurts, if you remember my side effects). Cancer is terrible and it can affect anyone. This is where I re-impart my advice about being your own health advocate. </p>
<p>Thanks to Carly and my family and friends and work peeps for your love and support.</p>
<p>Fuck cancer. <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">Create wonderful things, be good, and have fun.</a></p>
]]></description>
            <link>https://www.charlieharrington.com/chemotherapy</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/chemotherapy</guid>
            <pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Making podcasts from Project Gutenberg e-books]]></title>
            <description><![CDATA[<p>I recently watched Pixar&#39;s SOUL and I loved its depiction of being <em>in the zone</em>:</p>
<p><img src="https://www.charlieharrington.com/img/zone.png" alt="In the Zone"></p>
<p>This is a beautiful, astrally-projected depiction of Mihaly Csikszentmihalyi&#39;s <em>flow</em> concept. For the unfamiliar, here&#39;s how Csikszentmihalyi describes flow, or <em>the optimal experience</em>:</p>
<blockquote>
<p>It is what the sailor holding a tight course feels when the wind whips through her hair, when the boat lunges through the waves like a colt -- sails, hull, wind, and sea humming a harmony that vibrates in the sailor&#39;s veins. It is what a painter feels when the colors on the canvas begin to set up a magnetic tension with each other, and a new <em>thing</em>, a living form, takes shape in front of the astonished creator.</p>
</blockquote>
<p>That sounds pretty good, right? Csikszentmihalyi contends that flow is how we humans can achieve happiness. And it&#39;s not something that&#39;s given; it&#39;s something we have to cultivate and grow and work towards. I cannot recommend his book enough.</p>
<p>Even better was SOUL&#39;s depiction of the non-flow state - the lost souls:</p>
<p><img src="https://www.charlieharrington.com/img/lost-souls.jpg" alt="lost souls"></p>
<p>Definitely been there. Usually its whenever I hear, &quot;Can you see my screen?&quot; These poor creatures wander the astral plane, lost and unhappy and unsure why.</p>
<p>Luckily, the movie tells us it&#39;s never too late, and I believe them.</p>
<p>So, how do we achieve flow?</p>
<p>It&#39;s the deliberate combination of skill meeting challenge. More from Csikszentmihalyi:</p>
<blockquote>
<p>The best moments usually occur when a person&#39;s body or mind is stretched to its limits in a voluntary effort accomplish something difficult and worthwhile.</p>
</blockquote>
<p>This post documents a legitimate flow experience I had last week that began with an observation about my podcast addiction.</p>
<h2 id="all-my-best-friends-are-podcasts">All My Best Friends are Podcasts</h2>
<p>Yes, that&#39;s a <a href="https://www.youtube.com/watch?v=Z_63ZZRLylE">Less Than Jake</a> reference. You&#39;re welcome, 8th-Grade Charlie.</p>
<p>And, if you&#39;re at all like 28th-Grade Charlie, then you&#39;re also helplessly addicted to podcasts.</p>
<p>I listen all the time -- while I&#39;m washing dishes, folding laundry, performing my daily Amazon cardboard box cutting ritual, even taking showers. Carly doesn&#39;t understand it, and I certainly can&#39;t explain it.</p>
<p>Am I that afraid of silence? My own thoughts? Am I so lonely for friendship that I even found this evisceration quietly comforting?</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Podcasts saying literally nothing for 20 minutes. <a href="https://t.co/nmfka1Gjsp">pic.twitter.com/nmfka1Gjsp</a></p>&mdash; Jonathan Ogden (@jogdenUK) <a href="https://twitter.com/jogdenUK/status/1346442437376552962?ref_src=twsrc%5Etfw">January 5, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>I know too much about ancient Rome to be able to answer these questions.</p>
<p>So, if I&#39;m just going to accept my Overcast overlords, can I turn the tides on this one-directional relationship?</p>
<p>Yes. We can. Enter: the spark of an idea.</p>
<h2 id="create-a-podcast-from-the-audio-of-youtube-videos">Create a podcast from the audio of YouTube videos</h2>
<p>If I can&#39;t control what my favorite podcast hosts are talking about in any given episode, can I instead choose <em>exactly</em> what I want to listen to? What if there were a virtually unlimited source of content to consume? Surely, I could then be more deliberate in my listening habits.</p>
<p>YouTube is our answer. I&#39;ve been collecting computer science talks and lectures in playlists that I always mean to &quot;watch later&quot; and never do. Fact is, I don&#39;t want to watch a YouTube video. I rarely ever sit down and &quot;watch YouTube&quot; (other than The 8-Bit Guy cleaning old VIC-20s). It&#39;s not part of my routine. I&#39;m usually moving around too much.</p>
<p>YouTube also makes it really hard to consume something &quot;on the go.&quot; You need to pay for their PiP or minimized mode, I think.</p>
<p>Then I found this <a href="https://benjamincongdon.me/blog/2020/03/02/Creating-a-Podcast-Feed-from-a-YouTube-Playlist/">post by Benjamin Congdon</a>: a simple way to create an audio podcast feed from a YouTube playlist using a <a href="https://amzn.to/3qksZiq">Raspberry Pi</a> home server. His tutorial leverages an open source project called <a href="https://github.com/mxpv/podsync/">PodSync</a>, which itself leverages <code>ffmpeg</code> and, everyone&#39;s favorite controversy, <code>youtube-dl</code>, behind the scenes to download audio from YouTube and generate a podcast RSS feed. This, this, is exactly what I was looking for!</p>
<p>Nothing to add here, other than bravo, Benjamin. I was able to follow his tutorial pretty much straight through.</p>
<p>Wait, I do have something to add. Benjamin suggests using <code>rsync</code> to upload your mp3s and xml RSS feed to s3 or the like. I did this initially, but I didn&#39;t like the idea of having to mark these files as <code>public</code> on s3 in case of some huge accidental traffic surge.</p>
<p>So I came up with another idea:</p>
<ul>
<li>Create a public repo on GitHub and enable GitHub Pages (mine is <a href="https://github.com/rockswhat/listener">here</a>)</li>
<li>Init the repo in your <code>/data</code> directory on the Raspberry Pi (this is the directory with the generated <code>.xml</code> RSS feed and <code>mp3</code> audio files)</li>
<li>Change your Podsync config&#39;s hostname to your GitHub Pages site: </li>
</ul>
<pre><code>hostname = &quot;https://rockswhat.github.io/listener&quot;`
</code></pre>
<ul>
<li>Change your cron command to push to your repo (instead of <code>rsync</code> to s3):</li>
</ul>
<pre><code>*/15 * * * * cd /home/pi/podsync/data &amp;&amp; git add . &amp;&amp; git commit -m &quot;update feed&quot; &amp;&amp; git push origin main
</code></pre>
<p>Voila! My own podcast feed of YouTube videos, publicly available on the Internet. You can add my feed to Overcast (or your favorite podcast player) with its XML URL:</p>
<pre><code>https://rockswhat.github.io/listener/listen_laterz.xml
</code></pre>
<h3 id="cmon-you-really-achieved-flow-from-that">C&#39;mon, you really achieved flow from <em>that</em>?</h3>
<p>No, not really, but <em>almost</em>. Tutorials, good ones, at least, are guided paths toward some goal, with micro-feedback and mini-frustrations along the way. And these things are well-suited to flow. They can lead you to flow.</p>
<p>In my case, this tutorial got my gears turning. Which now gets us into to the <code>creative computing</code> side of this article.</p>
<p>I think it&#39;s important to remind ourselves to have fun with our computers. To use them to make art, make music, create weird stuff, just because we can. There&#39;s so much on our computers and phones now thanks to the Internet that can warp our minds and render us into Lost Souls. We often forget the simple joys of computers of the past, back when they were bicycles for the mind, and used adorable floppy disks or CD-ROM drives for games and encyclopedias. I know there&#39;s so much &quot;more&quot; that we can do with computers, but we need to remember that they are here to work for us, and not the other way around.</p>
<p>As soon as I saw Overcast fill up with audio from my <code>Listen Laterz</code> YouTube playlist, I knew I needed to keep going, to see what else I could render from clay into podcast feeds.</p>
<h2 id="creating-a-podcast-audiobook-from-project-gutenberg-e-books">Creating a podcast audiobook from Project Gutenberg e-books</h2>
<p>Where else can we find a giant repository of open content on the Internet that also happens to be inconvenient to consume?</p>
<p>Hello, <a href="https://www.gutenberg.org/">Project Gutenberg</a>! </p>
<p>Project Gutenberg is just about the coolest --- and one of the most important -- things on the internet. The fact that it was <a href="https://en.wikipedia.org/wiki/Project_Gutenberg">started on the ARPANET in 1971</a> blows my mind. That is some creative, forward-thinking from its founder Michael S. Hart.</p>
<p>My idea here is simple: pick a public domain book, chop it up into chapters, convert the chapters to audio, and then generate an xml RSS feed.</p>
<p>I picked Mary Shelley&#39;s <a href="https://www.gutenberg.org/files/84/84-h/84-h.htm">Frankenstein</a>, because, why not? I already read it a few years ago during my October &quot;Spooky Reads&quot; habit, but I figured it&#39;s the perfect candidate for re-animation.</p>
<p>If you&#39;ve clicked the link to the text on Project Gutenberg, you&#39;ll see it&#39;s a plaintext nightmare. I&#39;m not ashamed to admit here that I manually just chopped it up into separate text files, rather than writing a script to somehow do this for me. Whatever, ok?</p>
<p>First let&#39;s make some files.</p>
<pre><code class="language-bash">cd pieces
touch intro.txt
touch letter-{1..4}.txt
touch chapter-{1..24}.txt
touch license.txt
</code></pre>
<p>And then we copy-pasta.</p>
<p>Now that I&#39;ve got my chapters (aka future podcast episodes) all set, we&#39;re ready to convert them to audio. What&#39;s the easiest way I can do that?</p>
<p>My &quot;in-the-zone&quot; brain suggests using the terminal&#39;s <code>say</code> command. I&#39;ve used this command a few years ago in one of my earliest creative computing projects: a <a href="https://www.charlieharrington.com/terminal-man-live-in-nyc">live musical performance from a telepresence robot</a>).</p>
<p>Surely, I can write a neat little script to loop through my text files and <code>say</code> them into an <code>mp3</code>. Some Googling for <a href="https://stackoverflow.com/questions/16501663/macs-say-command-to-mp3">advice</a>, and I&#39;ve soon got this Bash script going:</p>
<pre><code class="language-bash">for i in *.txt;
do
    echo &quot;processing $i...&quot;;
    name=$(echo &quot;$i&quot; | cut -f 1 -d &#39;.&#39;)
    say -v Vicki -f $i -o aiff/$name.aiff
    lame -m m aiff/$name.aiff mp3/$name.mp3
    rm aiff/$name.aiff
done
</code></pre>
<p>And it works! Checkpoint reached! The <code>mp3</code> files are now sitting happily in their respective <code>/mp3</code> folder. I experience a fleeting moment of joy, and then immediately plunge into the next challenge: generating an XML feed.</p>
<p>My hack-y brain suggests another copy-pasta. Let&#39;s take the feed generated by the Podsync library in the section above, replace pieces of it with Bash variables, and then loop through my text files to jam in the values I want.</p>
<p>More googling ensures, including learning a bit more about <a href="https://en.wikipedia.org/wiki/Here_document#:~:text=In%20computing%2C%20a%20here%20document,it%20were%20a%20separate%20file.">heredocs</a>, and I&#39;ve eventually got this script:</p>
<pre><code class="language-bash">#!/bin/bash

# edit these to your liking
PODCAST_TITLE=&quot;Castellan - Frankenstein&quot;
PODCAST_AUTHOR=&quot;Castellan&quot;
CATEGORY=&quot;Technology&quot;
GENERATOR=&quot;Castellan&quot;
LINK=&quot;https://whatrocks.github.io/castellan/&quot;
IMG=&quot;https://whatrocks.github.io/castellan/showart.jpg&quot;

# automatic
CURRENT_DATE=$(date -R)

# order
EPS=(
  intro
  letter-1
  letter-2
  letter-3
  letter-4
  chapter-1
  chapter-2
  chapter-4
  chapter-3
  chapter-5
  chapter-6
  chapter-7
  chapter-8
  chapter-9
  chapter-10
  chapter-11
  chapter-12
  chapter-13
  chapter-14
  chapter-15
  chapter-16
  chapter-17
  chapter-18
  chapter-19
  chapter-20
  chapter-21
  chapter-22
  chapter-23
  chapter-24
  license
)

read -d &#39;&#39; feed &lt;&lt; EOF
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;rss version=&quot;2.0&quot; xmlns:itunes=&quot;http://www.itunes.com/dtds/podcast-1.0.dtd&quot;&gt;
  &lt;channel&gt;
    &lt;title&gt;$PODCAST_TITLE&lt;/title&gt;
    &lt;link&gt;$LINK&lt;/link&gt;
    &lt;description&gt;$PODCAST_TITLE ($CURRENT_DATE)&lt;/description&gt;
    &lt;category&gt;$CATEGORY&lt;/category&gt;
    &lt;generator&gt;$GENERATOR&lt;/generator&gt;
    &lt;language&gt;en-us&lt;/language&gt;
    &lt;lastBuildDate&gt;$CURRENT_DATE&lt;/lastBuildDate&gt;
    &lt;pubDate&gt;$CURRENT_DATE&lt;/pubDate&gt;
    &lt;itunes:author&gt;$PODCAST_AUTHOR&lt;/itunes:author&gt;
    &lt;itunes:subtitle&gt;$PODCAST_TITLE&lt;/itunes:subtitle&gt;
    &lt;itunes:summary&gt;&lt;![CDATA[$PODCAST_TITLE ($CURRENT_DATE)]]&gt;&lt;/itunes:summary&gt;
    &lt;itunes:image href=&quot;$IMG&quot;/&gt;
    &lt;itunes:explicit&gt;no&lt;/itunes:explicit&gt;
    &lt;itunes:category text=&quot;$CATEGORY&quot;&gt;&lt;/itunes:category&gt;
EOF

echo $feed

COUNT=1
for episode in ${EPS[@]}; do
  echo &quot;processing $episode...&quot;
  MP3_FILE=&quot;book/pieces/mp3/$episode.mp3&quot;
  MP3_SIZE=&quot;$(wc -c &lt;&quot;$MP3_FILE&quot;)&quot;
  UUID=$(uuidgen)
  NEXT_DATE=$(date -R)
  DURATION=&quot;$(ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal $MP3_FILE)&quot;
  read -d &#39;&#39; next &lt;&lt; EOF
  &lt;item&gt;
      &lt;guid&gt;$UUID&lt;/guid&gt;
      &lt;title&gt;$episode&lt;/title&gt;
      &lt;link&gt;$LINK$MP3_FILE&lt;/link&gt;
      &lt;description&gt;$PODCAST_TITLE: $episode&lt;/description&gt;
      &lt;pubDate&gt;$NEXT_DATE&lt;/pubDate&gt;
      &lt;enclosure url=&quot;$LINK$MP3_FILE&quot; length=&quot;$MP3_SIZE&quot; type=&quot;audio/mpeg&quot;&gt;&lt;/enclosure&gt;
      &lt;itunes:author&gt;$PODCAST_AUTHOR&lt;/itunes:author&gt;
      &lt;itunes:subtitle&gt;$episode&lt;/itunes:subtitle&gt;
      &lt;itunes:summary&gt;Audio generated from the text of this chapter&lt;/itunes:summary&gt;
      &lt;itunes:image href=&quot;$IMG&quot;&gt;&lt;/itunes:image&gt;
      &lt;itunes:duration&gt;$DURATION&lt;/itunes:duration&gt;
      &lt;itunes:explicit&gt;no&lt;/itunes:explicit&gt;
      &lt;itunes:order&gt;$COUNT&lt;/itunes:order&gt;
    &lt;/item&gt;
EOF
  feed=&quot;${feed}${next}&quot;
  COUNT=$((COUNT+1))
  sleep 5
done


END=&quot;&lt;/channel&gt;&lt;/rss&gt;&quot;

echo $feed$END | tee podcast.xml
</code></pre>
<p>Lots of minor bugs and typos later, and I&#39;ve got my RSS feed! Is this script hideous? Sure, but it works! I&#39;m having fun and that&#39;s all that matters right now. Speaking of fun, I also had to create cover-art, obviously:</p>
<p><img src="https://www.charlieharrington.com/img/coverart.jpg" alt="Cover Art"></p>
<p>Finally, using the same GitHub Pages approach, I upload my stuff and import my Franken-pod into Overcast, like so:</p>
<p><img src="https://www.charlieharrington.com/img/listen.jpeg" alt="Listen"></p>
<p>I decide to call the project <code>Castellan</code> because it has the word &quot;cast&quot; in it and it means keeper of a castle or something, and that feels pretty Frankenstein-y to me.</p>
<p>Finally, I give it a listen...</p>
<p>And it&#39;s a horrible monster. Here, I dare you to listen:</p>
<audio controls="controls">
  <source type="audio/mp3" src="https://whatrocks.github.io/castellan/book/pieces/mp3/chapter-1.mp3"></source>
</audio>

<p>We&#39;ve gotta do something about this, cause this thing doesn&#39;t sound human at all.</p>
<h3 id="machine-learning-to-the-rescue">Machine learning to the rescue?</h3>
<p>For a brief moment, I escape my zen-like programming mindset, and I go to the orange website and encounter a post about a new text-to-speech deep learning project, and it&#39;s damn good. Unfortunately, it&#39;s not open source.</p>
<p>Surely, there&#39;s a good open source text-to-speech project out there. Some more googling, and there is! I find the <code>tts</code> project from Mozilla, which deliciously provides a few Google Colab notebooks (aka Jupyter Notebook / Jupyter Lab) with pretrained models ready to go!</p>
<p>This is great news. Instead of the <code>say</code> command, I&#39;m going to pump my chapters into this trained model and it&#39;s going to be awesome.</p>
<p>Except the models clip out after three sentences or so. I do some spelunking, and the model is meant to go sentence by sentence, rather than huge swaths of text at once. </p>
<p>But that&#39;s no problem for me. </p>
<p>I&#39;ll just split on the <code>.</code> period character, generate the audio once sentence at a time, and then concat them all together at the end.</p>
<p>Here&#39;s a <a href="https://colab.research.google.com/drive/1XpoF6LEU1u9D1H8J4nsvtqNS3Ls58PFs#scrollTo=FuWxZ9Ey5Puj">link to my Colab notebook</a> that you can try yourself. The only things I changed in this notebook are the bottom four or so cells. </p>
<p>Here&#39;s how I make my machine learning powered audiobook podcast:</p>
<ul>
<li><p>Mount my Google Drive, where I&#39;ve dropped the text files (and I&#39;ll store the generated mp3s):</p>
<pre><code class="language-python">from google.colab import drive
drive.mount(&#39;/content/gdrive&#39;, force_remount=True)
</code></pre>
</li>
<li><p>Install the <code>pydub</code> library to handle audio files</p>
<pre><code class="language-python">!pip install pydub
</code></pre>
</li>
<li><p>Read my text files of the chapters from Google Drive into an array of tuples for processing</p>
<pre><code class="language-python">import os
path = &#39;/content/gdrive/My Drive/Castellan/&#39;
chapter_path = f&#39;{path}pieces&#39;
chapters = []
for file in os.listdir(chapter_path):
if file[-4:] == &quot;.txt&quot;:
  with open(f&#39;{path}pieces/{file}&#39;, &#39;r&#39;) as chapter:
    chapter_text = chapter.read()
    name = file[:-4]
    chapters.append((name,chapter_text))
</code></pre>
</li>
<li><p>Loop through the array, split each chapter into sentences, skip weird textual issues like newlines and other nonsense, run each sentence through the <code>tts</code> model, concat/reduce that sentence with a accumulating wav file of the entire chapter, and then save the accumulated wav file to an mp3 in Google Drive. Phew! That&#39;s a mouthful:</p>
</li>
</ul>
<pre><code class="language-python">import scipy.io.wavfile
import uuid
from pydub import AudioSegment,s

silence = AudioSegment.silent(duration=500)
for chapter in chapters:
  
  print(f&#39;processing chapter {chapter[0]}...&#39;)
  chapter_audio = silence
  for sentence in chapter[1].split(&#39;.&#39;):
    
    # skip these
    if sentence == &#39;”\n&#39; or sentence == &#39;\n&#39; or sentence == &#39;\n\n&#39;:
      continue

    sentence = sentence.strip(&#39;&#39;)

    # more skips
    if len(sentence) == 0 or sentence == &#39;&#39;:
      continue

    # generate wav
    align, spec, stop_tokens, wav = tts(model, sentence, TTS_CONFIG, ap)

    # save wav file
    wav_unique = str(uuid.uuid4())
    wav_name = f&#39;{wav_unique}.wav&#39;
    wav_path = f&#39;{path}wav/{wav_name}&#39;
    scipy.io.wavfile.write(wav_path, TTS_CONFIG.audio[&#39;sample_rate&#39;], wav)

    # read wav file
    sound = AudioSegment.from_file(wav_path, format=&quot;wav&quot;) 

    # combine it
    chapter_audio += sound
    chapter_audio += silence

  # save mp3 file
  file_handle = chapter_audio.export(f&quot;{path}mp3/{chapter[0]}.mp3&quot;, format=&quot;mp3&quot;)
  print(f&#39;done with {chapter[0]}!&#39;)
</code></pre>
<p>As you might have guessed, the above cell is the end result of much experimentation. Jupyter Notebooks make this iterative development insanely easy, and I only was able to pull things together like this after I&#39;d figured out each individual piece. Jupyter Notebooks are like REPLs + documentation in one.</p>
<p>Once I had this all set up, I hit <code>run all cells</code> and went to sleep. When I woke up, I discovered that about half of my chapters had successfully processed! The only reason it didn&#39;t chug through all of them was the Google can randomly preempt your machine at any time, or they have a 12 hour timeout for CPUs. This felt a bit like it must have felt when you feed all your punchcards into the IBM mainframe, and there was some bug halfway through your stack.</p>
<p>No worries, I just removed the already processed chapters from my text files, and re-ran it. I can deal with this annoyance, because this is a toy project. And it&#39;s free. And my laptop fan is silent, almost like it&#39;s a brand new M1 Macbook, because I&#39;m running this on Google machines.</p>
<p>Want to hear the result?</p>
<audio controls="controls">
  <source type="audio/mp3" src="https://whatrocks.github.io/castellan/book/pieces/bettermp3/chapter-1.mp3"></source>
</audio>

<p>Dang!! That&#39;s so much better. Sure, it&#39;s still a little weird. But it&#39;s actually listen-able now. Thank you, machine learning!</p>
<p>I moved these files from Google Drive onto my local, and then I re-ran my XML generator script, changing the title to &quot;Frankenstein Jr&quot; and referencing the new better mp3s, and then pushed to Github Pages. </p>
<p>Here&#39;s a <a href="https://whatrocks.github.io/castellan/podcastjr.xml">link to the podcast feed</a> that you can add to your own player.</p>
<p>Sure, there&#39;s still problems. I&#39;ve encountered these occasional weird sections where the <code>tts</code> voice just completely glitches out, perhaps due to the weird encoding of Project Gutenberg files (could be a <code>\t</code> character or something). I know that much of machine learning is about &quot;cleaning up your data,&quot; so I could probably spend more time doing that, but Frankenstein-ly, I&#39;ve already flowed onto my next idea.</p>
<h3 id="parse-a-screenplay-and-create-voices-for-each-character">Parse a screenplay and create voices for each character</h3>
<p>Wouldn&#39;t it be amazing if you could recognize the characters and give them each a unique voice? That&#39;s gonna be hard with novels, but you know what&#39;s much easier: screenplays! They&#39;ve got the characters broken out into discrete, named sections, like this:</p>
<pre><code>        PRINCESS
    I love you.

        SMUGGLER
    I know.

The smuggler is lowered into the machine. HISSES and SQUEALS. Everyone, including THE BIG BOSS, turns away.
</code></pre>
<p>I just made this scene up ^, okay?</p>
<p>I could parse a screenplay, then pass each character&#39;s lines into a model with a specific voice.</p>
<p>Oh! I know there&#39;s sentiment analysis models. What if I first feed the sentences into a sentiment analysis model, and then feed that sentiment into the text-to-speech model.</p>
<p>Now, we&#39;re talking...</p>
<p>You can see where this is going. My brain is reeling with possibilities and new directions and new ideas.</p>
<p>This is creative computing. This is why I love programming and its ability to get you into the flow state.</p>
<p>I haven&#39;t tackled the screenplay parsing bit yet, but maybe I will. I&#39;m just grateful that I was able to have fun with this project. This is how I want to live my life, being creative, having fun. This is how Csikszentmihalyi describes a life with flow:</p>
<blockquote>
<p>Such individuals lead vigorous lives, are open to a variety of experiences, keep on learning until the day they die, and have strong ties and commitments to other people and to the environment in which they live. They enjoy whatever they do, even if tedious or difficult; they are hardly ever bored, and they can take in stride anything that comes their way.</p>
</blockquote>
<p>I couldn&#39;t have put it better myself, obviously. John Cassidy of Klutz Press, <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">my favorite publisher</a>, does a great job rephrasing this sentiment, though:</p>
<blockquote>
<p>Create wonderful things, be good, and have fun.</p>
</blockquote>
<h3 id="ps-dont-you-know-about-librivox-dude">P.S. Don&#39;t you know about LibriVox, dude?</h3>
<p>Yeah, so there&#39;s already a project called <a href="https://librivox.org/">LibriVox</a> that creates audiobooks from public domain texts using real human being voice volunteers. They even provide RSS feeds that you can use in your podcast player. Did I know about this before I went down this rabbit-hole. No! Would it have changed anything no! Maybe? It could have prevented me from exploring ML for this project, and that would have been a bummer. </p>
<p>My takeaway is that your ideas are probably not unique, but that doesn&#39;t mean you should explore them and find your own path forward. That&#39;s the path to creativity and fun.</p>
<p>Okay, enjoy the feeds!</p>
]]></description>
            <link>https://www.charlieharrington.com/flow-and-creative-computing</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/flow-and-creative-computing</guid>
            <pubDate>Wed, 13 Jan 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Notes on My Colon Cancer]]></title>
            <description><![CDATA[<p>The giant robot looks like a WED Treadwell, <a href="https://www.charlieharrington.com/robots-i-love">my favorite robot</a> of all the Star Wars droids. I admit, I was worried that it would look organic, like a Sentinel from The Matrix, with wriggling Dr. Octopus arms and pinchy pincers that pinch. But I&#39;m calmed by the robot&#39;s EVE-like exterior.</p>
<p>The room is sterile. A dozen masked, gloved attendants in blue buzz. I imagine I&#39;m an astronaut about to step into the rocketship capsule.</p>
<p>Except I won&#39;t be going anywhere on this particular journey, unless something goes very, very wrong. In fact, I&#39;ve already been asked repeatedly by various staffers to describe what I&#39;m expecting to happen in this room over the next few hours:</p>
<blockquote>
<p>&quot;I&#39;m here to remove my sigmoid colon via robotic surgery because of the cancerous tumor inside.&quot;</p>
</blockquote>
<p>I&#39;m 34 years old. It&#39;s October 12th, 2020. Five weeks ago I was diagnosed with colon cancer.</p>
<h2 id="stool-bloody-stool">Stool, bloody stool</h2>
<p>I&#39;ve always been a standing wiper. Not sure entirely why. I must have once, accidentally, touched a load of poo during a seated wipe. That sort of thing can change a person.</p>
<p>This charming anecdote does factor into our story, because it means I&#39;ve always had a pretty good sense for my poo. Consistency, quality, and color, both in the bowl and on the TP. Did you know, there&#39;s even a seven-stage scientific classification system for your poo, called the <a href="https://en.wikipedia.org/wiki/Bristol_stool_scale">Bristol stool scale</a>?!</p>
<p><img src="https://www.charlieharrington.com/img/bristol.png" alt="Bristol stool scale"></p>
<p>I first noticed blood two or three years ago. On a monthly or so cadence, I&#39;d wipe and notice a reddish tinge. Not bright red, more like muddy-red. Poopy-red. Initially, I thought little of it. Just a minor curiousity. It certainly didn&#39;t happen every time. Still, I decided to check off the <code>Blood in stool</code> box on the forms at my annual physical with my primary care doctor that year.</p>
<p>A brief aside on the phrase &quot;your primary care doctor.&quot; Like in <em>Forgetting Sarah Marshall</em>, the last doctor I really thought of as &quot;my doctor&quot; was my pediatrician. Since &quot;becoming an adult&quot;, I&#39;ve lived in three cities in two countries, which means that I&#39;ve generally had no idea who my primary care doctor is or was, only that I&#39;d need to find one to give me a referral to get this wart on my foot removed.</p>
<p><img src="https://www.charlieharrington.com/img/firetruck.png" alt="Firetruck"></p>
<p>Anyway, this season&#39;s Dr. Who told me not to worry about the blood. &quot;It&#39;s probably hemorrhoids.&quot;</p>
<p><em>WTF is a hemorrhoid?</em> I wondered to myself as I said to him, &quot;Sounds good.&quot; Googled it after, and I learned that it&#39;s a vein that pokes out a little in your butt and doesn&#39;t really want to be poking out a little, so it bleeds. Seems like a thing that can happen, so I more or less returned to regularly scheduled programming and just dealt with the occasional poopy-red wipe. This doc also said I probably don&#39;t need to come for a physical for a few years, that annual physicals are a myth, dry land in a water world.</p>
<p>Fast-forward to 2020. Everything sucks. And the bloody wipes are making a resurgence. Because, of course, they are. About four months ago I noticed that my first poop of the day (I usually go 2x) would have this purple-red streak embedded in it, like a racing stripe from hell. And it would happen almost without fail every single morning. That just didn&#39;t seem right, no matter what Doctors of Physicals Past told me. And then one morning I felt like I had actual blood dripping from my butt.</p>
<p>Now I consider myself to be a mostly healthy person. I eat fairly well (even though I enjoy the occasional sourdough loaf and hazy IPA), I run and bike and hike regularly, I ran an IRONMAN in 2016 and a few ultramarathons since. I also don&#39;t like being sick (who does?). But, like with most things in my life, I want to be &quot;good&quot; at health. An ideal dental appointment for me would go something like this, &quot;Wow, Charlie, these are the straightest, whitest teeth we&#39;ve ever seen. We&#39;d like you to come in and be the model for our Instagram ads and also be our 3D teeth model for dentures. Congratulations. Here&#39;s <em>two</em> free toothbrushes. You also never need to floss again.&quot;</p>
<p>Anything that deviates from that ideal makes me squirm and I do think I can fix anything. For what it&#39;s worth I still believe that, if I ever encounter a blue flower on a mountain-top, I&#39;m only a few months of mystical training away from becoming Batman. I already have the cape (it&#39;s actually a Harry Potter robe, but, hey, I&#39;m scrappy).</p>
<p>At the same time, I counterweight this with a mild touch of hypochondria. I&#39;ll see the poison oak in the mistletoe, so to speak. In this case it was a gift.  I googled again for <em>stool, bloody stool</em> and the dreaded <em>colon cancer</em> came back. Last time, I averted my eyes from these search results. But the bloody racing stripes weren&#39;t going away. I needed to get myself checked out.</p>
<p>Then I remembered an email from work: I was eligible for a <a href="http://members.onemedical.com/membership_referrals?code=cha0014&source=sa">OneMedical</a> membership. I knew there was hype about OneMedical, certainly I&#39;ve seen the billboards, but I still wasn&#39;t exactly sure what they were all about. It had been a few years since my last physical, as you know, so I was primary-care-less, with a bloody problem on my hands. I downloaded the OneMedical app, uploaded a photo of my insurance card, beep-boop, and I&#39;ve got an appointment with a new doc in a few days in one of their nearby clinics. Already, I loved the experience - I could text my questions any time (see <em>foot wart</em> above). I&#39;d describe OneMedical as a network of clinics with an app for scheduling appointments and texting with a doc. Sure, ZocDoc kinda does the scheduling thing, but Zocdoc feels like you&#39;re sifting through the classifieds. Gimme some non-user-generated-ratings-based curation, please. </p>
<p>So, I met with the doc, liked him a lot, discussed my bloody poops, and sheepishly asked if he&#39;d be my new primary care. He agreed, and he also referred me to UCSF for a colonoscopy. Sure, I&#39;m young, and it&#39;s probably hemorrhoids, we agreed, but it&#39;s the only way to be sure.</p>
<p>After some jiggling about with the referral documentation, we finally get the colonoscopy scheduled for a few weeks later on Sept 9th.</p>
<p>Then, on August 28th, <a href="https://en.wikipedia.org/wiki/Chadwick_Boseman">Chadwick Boseman</a> died of complications from colon cancer.</p>
<p>I wasn&#39;t freaked out. Okay, yes, I was very freaked out.</p>
<h2 id="colonoscopies-are-not-bad">Colonoscopies are not bad</h2>
<p>What&#39;s a colonoscopy? It&#39;s a surgical procedure where the doctor goes all the way up your butt to see what&#39;s going on in there. You are completely knocked out, so you feel nothing. The only thing you need to do is what we in the business like to call &quot;bowel prep.&quot;</p>
<p>Allow me to describe bowel prep: the day before the procedure, you will poop your ever-living guts out for a few hours until you are clean-as-a-whistle, stem to stern. They&#39;ll give you a prescription for a gigantic jug of clear laxatives that you&#39;ll drink every 15 minutes or so for a few hours. In today&#39;s toilet-paper hoarding economy, I&#39;d make sure that you are stocked up, because this gets messy.</p>
<p>Other then the laxatives, you&#39;re allowed to drink clear liquids - which is confusing because you can enjoy such clear liquids as black coffee, Gatorade, broth, even green jello.</p>
<p>But that&#39;s it. Easy. I watched Stranger Things season 3 again during my bowel prep day. Might not have been the best choice, as I intermittently had to pause Netflix to contribute my own liquified form of the Mind-Flayer, but it got the job done, and I cried my way thru Dustin and Suzie&#39;s hymn to childhood, again, as expected.</p>
<p>Okay, next, I woke up on September 9th. My appointment is around 2 PM. Normal day, right?</p>
<p><img src="https://www.charlieharrington.com/img/sf.jpg" alt="sf"></p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">A strange, apocalyptic orange-red sky looms over the Bay Area. Here&#39;s what you need to know.<br>Read more: <a href="https://t.co/JxpYSnUPG9">https://t.co/JxpYSnUPG9</a> <a href="https://t.co/ZPOj4X3jRg">pic.twitter.com/ZPOj4X3jRg</a></p>&mdash; San Francisco Chronicle (@sfchronicle) <a href="https://twitter.com/sfchronicle/status/1303799596515172352?ref_src=twsrc%5Etfw">September 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Nope.</p>
<p>I decide to walk over to the UCSF Parnassus building in the creepy Mars firelight, imagining I&#39;m the last man on Earth (and hoping I don&#39;t step on my reading glasses). Carly makes a plan to pick me up in a few hours in our car.</p>
<p>As expected, the procedure was painless. My only bit of further colonoscopy advice here is to ALWAYS bring a book with you, to every single medical appointment you have, because there&#39;s always going to be some sort of delay or waiting room.</p>
<p>An hour or so later, I woke up feeling the feels of that post-anesthesia giddiness. Except no one else was happy. Carly was in the room, a surprise to me. And my doctor looked quite serious.</p>
<p>In addition to two small polyps (which she removed), my colonoscopy surgeon found a tumor in my sigmoid colon. At this point, I don&#39;t know a sigmoid colon from a semi-colon, but I knew it wasn&#39;t good news. Go 2020!</p>
<p>Despite the odds (my youth, my health), I now had cancer. Well, I probably had it for awhile, but we just found out I had it.</p>
<p>My doc said I&#39;d need to meet with <a href="https://www.ucsfhealth.org/clinics/center-for-colorectal-surgery">UCSF&#39;s colorectal surgery team</a>, and I&#39;d also need to get CT scans (&quot;cat scans&quot;) to see if the cancer had spread anywhere else in my body.</p>
<p>And so began one of the worst weeks of our lives.</p>
<h2 id="a-brief-family-history">A brief family history</h2>
<p>Let&#39;s talk about the odds for a moment.</p>
<p><img src="https://www.charlieharrington.com/img/odds.png" alt="odds"></p>
<p>We&#39;ve already discussed my vigorous, proto-Batman level of health. And how I&#39;m a fresh-faced, occasionally-bearded, 34 year old with the heart of a child and the strength of a chimpanzee (no, that&#39;s a <a href="https://en.wikipedia.org/wiki/Humanzee">humanzee</a>).</p>
<p>Speaking of unfortunate genetics, it turns out that I have some family history of colon cancer. </p>
<p>Here&#39;s the scoop: my pops (that&#39;s cool talk for Dad) has had benign (non-cancerous) polyps in his previous colonoscopies. What&#39;s a poylp? It&#39;s a little growth thingy in your colon that may evolve into a tumor. Just like how a Charmander becomes a Charmeleon, polyps can grow bigger and more serious with more destructive power. Polyps are usually just snipped out during your colonoscopy and sent off for pathology (aka to see if they have cancer in them). Most do not. This is the case with my dad&#39;s polyp experience. Even though none of his have been cancerous, he still needs to go in for colonoscopies more regularly than those who don&#39;t have polyps.</p>
<p>My own tumor began as a lowly polyp, perhaps some ten years ago. We don&#39;t know exactly. But if I&#39;d had a colonoscopy ten years ago, or five years ago, they might have seen it and snipped it out and you wouldn&#39;t be reading this.</p>
<p>If you go further up the Harrington tree, you&#39;ll learn that my dad&#39;s aunt (my father&#39;s mother&#39;s sister) died of colon cancer in her early 60s. And his other aunt (same side, same family) died of colon cancer in her 80s. Two factoids that I had no idea about until I asked my parents for their help filling out one of the many UCSF cancer history surveys. Also, on my mom&#39;s side, my grandfather&#39;s mother (my great-grandmother, who I never met) probably had colon cancer.</p>
<p>So, colon cancer is bouncing around in my family tree. But neither of my parents have it, and none of my grandparents had it, which I suppose is good. That said, I learned that my grandparents did have <em>other</em> sorts of cancers.</p>
<p>Getting confusing, right? I cannot stress this enough: <strong>Learn your family&#39;s medical history and write it down in a note on your phone. You&#39;ll be asked for this info 10,000 times before every single appointment. But, more importantly, your family history can be a signal to you and your docs whether are &quot;higher-risk&quot; for certain conditions.</strong></p>
<p>I just didn&#39;t know about any of this. I knew there were some heart attacks in there, but not really about any of the cancer stuff. Ideally, each person would be given some sort of family history report when they&#39;re born or when they turn 18 or when they get their first Nintendo.</p>
<p>But that&#39;s just it. You don&#39;t get health info automatically. There&#39;s no one, other than you, to own your medical health story. <strong>You must become your own health advocate.</strong> Spoiler alert, but this is the number one lesson I learned during this entire cancer experience. Health literacy is just as important as financial literary or literacy literacy.</p>
<p>There are tools to help, and I&#39;m still digging into them now. I&#39;m much more excited now by the Apple Health stuff on iOS. I&#39;m hoping it can become some sort of private, secure repository for my health data that I carry with me. For example, how many of you, dear readers, know your blood type? There&#39;s all sorts of little info-nuggets that you can track down NOW to pay-it-forward for FUTURE you. Cause, ain&#39;t nobody else gonna. It&#39;s like a scavenger hunt. Okay, enough proselytizing, dude.</p>
<h2 id="stage-wise-limbo">Stage-wise limbo</h2>
<p>Back to our story, we&#39;ve just learned that I have a cancerous tumor up my butt and we&#39;ve also filled out a few frightening family history reports. This is where UCSF kicks it into high gear (and, my goodness, do I love UCSF? Yes, yes I do. They are absolutely, amazingly wonderful, competent, and life-changing!).</p>
<p>I&#39;m now starting to get booked for all sorts of appointments, starting with the ones previously mentioned: (1) CT scans of my abdomen and chest and (2) then the consult with the colorectal surgeon.</p>
<p>Because, as I later learned from my colorectal surgeon (who is the best!), when colon cancer spreads, it usually does the evolution thing from cancerous polyp (Stage 1) into tumor (Stage 2). After that, it can break through the wall of the colon into the nearby lymph nodes (Stage 3). Finally, it becomes (Stage 4) if it spreads to other organs, the first often being the liver and the lungs. At least, this is how I understand the various stages. I&#39;m sure I&#39;m missing some technical details and nuance. When <a href="https://www.nytimes.com/2020/08/28/movies/chadwick-boseman-dead.html">reading about Chadwick Boseman</a>, you&#39;ll learn that he was initially diagnosed with Stage 3 colon cancer in 2016, which eventually became Stage 4. In sum, you want your stage to be as low as possible.</p>
<p>At this point, pre-CT scan, Carly and I have no idea what stage I&#39;m at. Well, we do know that I&#39;m somewhere from 2 - 4. These appointments are going to help us understand where I&#39;m at. Specifically, the CT scans will tell us if I&#39;m Stage 4 or not.</p>
<p>Carly and I are in a daze for most of the next week. And so are our parents and our siblings. I honestly can&#39;t remember how many friends we told at this point, I know a few, but not that many. I didn&#39;t know what to say or feel.</p>
<p>Much like the South Park lament &quot;The Simpsons did it!&quot;, there&#39;s usually an <a href="https://xkcd.com/1048/">xkcd</a> for whatever you&#39;re feeling or thinking:</p>
<p><img src="https://www.charlieharrington.com/img/https://imgs.xkcd.com/comics/emotion.png" alt="emotions"></p>
<p>As a wannabe stoic, I allow my negative visualization to run rampant. I&#39;m thinking of the possibility that I&#39;ve got only a few years (months?) left to live.</p>
<p>My CT scans are scheduled for Thursday afternoon and the meeting with the surgeon is Friday morning. Between then and now, we have the horrible Internet to do horrible searches and we have the two-page summary printout of my colonoscopy, replete with some terrifying photos of the tumor. The tumor looks like a cross between a tadpole and an eyeball (two things that I&#39;d normally love). I don&#39;t like looking at this picture, at all, but the two-page summary somehow keeps traveling around our house, and no matter where I look, I see the pink tadpole eye staring back at me, and I wonder, &quot;Are you my death sentence?&quot;</p>
<h3 id="the-sound-of-silence">The sound of silence</h3>
<p>On Thursday, Carly and I walk over to the UCSF CT scanning place. It&#39;s slightly less hostile to human life outside today, so that&#39;s nice. After checking in with the front desk, I quickly pass through the first waiting room into the second waiting room. There&#39;s always a second waiting room.</p>
<p>It&#39;s here I realize that the <em>sound</em> of a major health issue is rapidly opening and shutting hospital doors. I scribble this pithy witicism into the back cover of my paperback copy of <a href="https://www.amazon.com/gp/product/0061339202/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0061339202&linkId=b76eed264fa980c5471f8c0cc351b2a1">Flow</a> and wait my turn with the CT machine. I&#39;m given two bottles of &quot;contrast&quot; provided by reknowned-drink-maker General Electric to drink. These iodine cocktails will help the machine see my inside stuff. They taste like you&#39;re drinking printer ink. They&#39;re not that bad at all. Everyone else in here is at least fifty years old. I decide to do a five minute wall-sit to prove my vigor. Finally, I&#39;m called back to the machine.</p>
<p>The CT machine looks like a coldsleep chamber crossed with a Weyland Corporation interdimensional portal. It&#39;s over in less than a minute.</p>
<h3 id="plan-of-attack">Plan of attack</h3>
<p>The scans are done and now it&#39;s up to the radiologist to read them. I&#39;m sure some neat TensorFlow or PyTorch deep learning computer vision model could help here, but I don&#39;t have access to the dataset.</p>
<p>The next morning we drive over to the <a href="https://www.ucsfhealth.org/clinics/center-for-colorectal-surgery">UCSF Center for Colorectal Surgery</a>. It&#39;s in the beautiful ghost town of the greater Chase Center-Mission Bay area. I look up at the sun before heading in, thinking, &quot;The next time I see you, ball of gas burning billions of miles away (quoth Pumbaa), we&#39;ll know the CT results and we&#39;ll know the plan.&quot;</p>
<p>When I see the sun again, we do.</p>
<p>The CT scans were clean. There&#39;s no sign that the cancer spread to other organs, ruling out Stage 4. This is the best news ever.</p>
<p>The second best news we hear is that the tumor is in a relatively excellent spot for surgery. After an impromptu rectal exam that morning (hello!) to make sure there was no cancer in the rectum, my surgeon gives us an overview of the situation and a plan of attack.</p>
<p>He&#39;s going to remove my entire <a href="https://en.wikipedia.org/wiki/Sigmoid_colon">sigmoid colon</a> (which is about a foot long), and then simply reattach the rectum to the rest of the colon. And he&#39;s going to do this all via &quot;robotic surgery&quot; (using the WED Treadwell-like <a href="https://en.wikipedia.org/wiki/Da_Vinci_Surgical_System">da Vinci Surgical System</a>), so the scars will be teeny and the recovery much easier.</p>
<p>We&#39;ll only be able to tell if I&#39;m Stage 2 or Stage 3 post-surgery. He&#39;s planning to remove the nearby lymph nodes and a pathology report will tell us if they&#39;re cancerous. If they&#39;re positive, it&#39;s Stage 3.</p>
<p>But, either way, we&#39;re getting this thing out of my butt, pronto.</p>
<p>Carly and I have a plan. We&#39;re planners. We needed this. A bit of our haze is lifted as we head into our next agenda item.</p>
<h2 id="gettin-hitched">Gettin&#39; hitched</h2>
<p>We got married (eloped, both technically and social-distanced-ly) on Sept. 30th!</p>
<p><img src="https://www.charlieharrington.com/img/wedding.jpg" alt="wedding"></p>
<p>Look at those oblivious smiles. Wait -- we aren&#39;t oblivious, I have cancer. We just love eachother.</p>
<p>Originally slated for 2019, then after bouncing around in 2020, our cute elopement threaded a very small needle with a teeny ceremony and it was beautiful and wonderful and just what we hoped for.</p>
<p>Now, onto our first act as a married couple: my surgery on Monday, Oct 12th (and another round of bowel prep the day before).</p>
<h2 id="surgery-aint-no-joke">Surgery ain&#39;t no joke</h2>
<p>I don&#39;t have much to add about the surgery itself.  I was there. But I don&#39;t remember anything. Thank goodness. I also haven&#39;t yet watched any YouTubes of how the da Vinci robot works. I didn&#39;t want to know before the surgery, and I&#39;m not quite ready now to see it.</p>
<p>I did remember to bring a book, though:</p>
<p><img src="https://www.charlieharrington.com/img/musashi.jpg" alt="book"></p>
<p>And, then, after glimpsing my many-limbed robotic friend in the surgery room, it&#39;s lights out.</p>
<p>The next thing I know it&#39;s five hours later and I&#39;m in a hospital bed and calling Carly to give her my room number. The nurses in the recovery area are amazing. I&#39;m hooked up to an IV and they&#39;re monitoring my &quot;ins&quot; and my &quot;outs&quot; (my foods and my pees and poops). They do this every four hours, so you&#39;re not exactly going to get a perfect night&#39;s sleep here, but it&#39;s great to know that they&#39;re paying good attention to you.</p>
<p>The big goal for me for the next 24 hours is to walk around. Being the Big Hero 6 that I am, I try to walk at 9 PM on the day of my surgery (which concluded around 6 PM), and I stand up, but my heart starts racing, so I slowly plop back into bed. Then, at midnight, my nurse helps my try again, and I do it. I shuffle around the hallway like a zombie, wheeling along my IV stand. It&#39;s a huge win. I end up walking six more times that day, between many Breath of the Wild sessions and most of The Umbrella Academy Season 2.</p>
<p>Sure, my guts feel like someone took a blender to them, but I&#39;m in great spirits, with incredible support from the UCSF team, Carly, and my mom.</p>
<p>Side note that IVs are interesting. They&#39;re like open ports into your body, allowing the medical team to either remove or add fluids. I didn&#39;t expect that they&#39;d just keep these ports open during your hospital stay, but they do. I guess that makes sense.</p>
<p><img src="https://www.charlieharrington.com/img/port.jpg" alt="port"></p>
<p>Another secret weapon of mine that aided in my recovery: this cute avocado buddy that my sister and her boyfriend sent me:</p>
<p><img src="https://www.charlieharrington.com/img/avo.jpg" alt="avo"></p>
<p>I&#39;m squeezing this thing every time I&#39;m jabbed with a needle (many, many times), using it as a pillow, and just loving it, cause it&#39;s so cute.</p>
<p>On Wednesday, after I&#39;ve started farting and pooping again (great signs!), I&#39;m sent home early.</p>
<h3 id="the-future">The future</h3>
<p>I&#39;m home and moving slow and still feel a bunch of surgical pain in my tummy, but overall feel so happy about my progress. I have some cool scars, which I&#39;m thinking about submitting to the <a href="https://www.instagram.com/secret_buttholes/?hl=en">@secret_buttholes Instagram</a>:</p>
<p><img src="https://www.charlieharrington.com/img/scars.jpg" alt="scars"></p>
<p>On Thursday, I get a call from my surgeon. The pathology is back early. There&#39;s no signs that the cancer spread past the colon walls. The lymph nodes don&#39;t show any signs of cancer in them. Which essentially means I had Stage 2 cancer. Per my doctors, there&#39;s no immediate need for chemotherapy.</p>
<p>We did it.</p>
<p>I still have some upcoming follow-up appointments, and meetings with cancer genetics to learn if I&#39;m genetically predisposed to cancers. And I&#39;m sure I&#39;ll be doing many more colonoscopies and other tests in the future. And I&#39;m still recovering from the surgery, too.</p>
<p>But I (think) I&#39;m cancer-free now. Now, there&#39;s no way to know that little microscopic cancer cells didn&#39;t manage to break through somehow, or that I don&#39;t have cancer in some other random part of my body, so it&#39;s kinda arbitrary to say something like &quot;cancer-free.&quot; But we do know, for sure, that my colon cancer tumor was safely removed and that my doctors are extremely pleased with the results and the signs that it hasn&#39;t spread.</p>
<h3 id="hello-impostors-syndrome-my-old-friend">Hello, impostor&#39;s syndrome, my old friend</h3>
<p>So, I guess that means I&#39;m a cancer survivor.</p>
<p>Which is weird to say, because this whole thing happened <em>very</em> quickly. All I did was &quot;bowel prep&quot; for two days and then fall asleep and wake up with a painful stomach.</p>
<p>But I am a survivor.</p>
<p>In fact, I&#39;m probably the luckiest cancer survivor ever, from my access to incredible people and resources at UCSF to the actual state of my tumor to my family and friends support network. I paid attention to my body (noticing the bloody poops) and got the support and encouragement needed to get checked.</p>
<p>UCSF has me signed up for a 5+ year relationship with their cancer survivors unit (I&#39;ll learn more in a few weeks when I have my first session). I&#39;m excited about this, because I want to learn as much as I can about how to stay safe and healthy going forward. A few of my friends have told me that there&#39;s good research into fasting and Keto and their link with preventing colon cancers. I&#39;m queuing up some <a href="https://tim.blog/2015/11/03/dominic-dagostino/">Tim Ferriss episodes with Dom D&#39;Agostino</a> about this topic.</p>
<p>My wife and my family are depending on me to stay healthy, and I&#39;m going to do everything I can to do so. I&#39;m going to own my health and be my own health advocate.</p>
<h2 id="some-thanks">Some thanks</h2>
<p>It&#39;s now about a week and half out from my surgery. I&#39;m doing better on the Bristol scale, but not quite back to normal yet.</p>
<p><img src="https://www.charlieharrington.com/img/recovery.png" alt="walking"></p>
<p>Monday was my surgery. Tuesday didn&#39;t capture my walks, because I didn&#39;t have my phone on me. But I&#39;m moving around again, and eager to get back to regularly-scheduled life.</p>
<p>Thank you for reading this story. I hope it is informative and shocking and helps you think about your health and the health of those around you. For example, Molly - my sister - is definitely going to have to get a colonoscopy ASAP.</p>
<p>Thank you to:</p>
<ul>
<li>My incredible, magical, beautiful <em>wife</em> Carly!</li>
<li>My parents and my mother-in-law and our siblings!</li>
<li>Our friends and family!</li>
<li>UCSF!</li>
<li>OneMedical!</li>
</ul>
<p>Also, if I got anything wrong in this missive from a medical perspective, let me know and I can attept to correct the errata. This is meant to be <em>my understanding</em> of <em>my situation</em>, YMMV.</p>
<blockquote>
<p><strong>2021 Update!</strong> Read Part II of my cancer story: <a href="https://www.charlieharrington.com/chemotherapy">Notes on My Chemotherapy</a></p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/colon-cancer</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/colon-cancer</guid>
            <pubDate>Wed, 21 Oct 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Add Some Ghibli to Your Raspberry Pi]]></title>
            <description><![CDATA[<p>Maybe you caught this week&#39;s <a href="https://news.ycombinator.com/item?id=24564775">HN post</a> that <a href="http://www.ghibli.jp/info/013344/">Studio Ghibli</a> dropped 400 images into the public domain. The comments suggested that there&#39;s something odd in Japanese copyright law about taking screenshots of films, and that Studio Ghibli might have furnished these to help keep people talking about their films in reviews and whatnot.</p>
<p><img src="https://www.charlieharrington.com/img/marnie004.jpg" alt="marnie">        </p>
<p>A more useful comment gave a nice tip for scraping the images in a single <code>wget</code> command:</p>
<pre><code class="language-bash">wget --random-wait --timestamping http://www.ghibli.jp/gallery/{ged,chihiro,karigurashi,ponyo,kokurikozaka,marnie,kaguyahime,kazetachinu}{001..050}.jpg
</code></pre>
<p>This uses the nice shell trick of using curly braces <code>{}</code> to expand commands and <code>..</code> to expand in a numerical or alphabetical series. I first encountered this technique in the MIT course for <a href="https://missing.csail.mit.edu/">The Missing Semester of your CS Education</a>, which I highly recommend checking out.</p>
<p>For example, <code>echo foo.{png,jpg}</code> will expand to <code>echo foo.png foo.jpg</code>, and <code>echo {1..10}</code> will expand to <code>echo 1 2 3 4 5 6 7 8 9 10</code>. </p>
<p>Perhaps this might prove useful in your terminal travels.</p>
<p>Back to Ghibli. So, now that I&#39;ve got all these screenshots downloaded, what can I do with them?</p>
<h2 id="my-little-raspberry-pi-server">My little Raspberry Pi server</h2>
<p>I&#39;ve got a <a href="https://www.amazon.com/gp/product/B08C4SK5C3/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B08C4SK5C3&linkId=6371e9a8ce20a36236014adee9eaa56e">Raspberry Pi 4 with 8GB RAM</a> on my home network that I can connect to via <a href="https://tailscale.com/">Tailscale</a>. Usually, I like to SSH in there and <code>sudo apt-get update</code> and <code>sudo apt-get upgrade</code> just to feel alive. But I also have a few other use-cases.</p>
<p>I run a <a href="https://www.plex.tv/">Plex</a> server on the Pi. For a while, I also experimented with running <a href="https://www.home-assistant.io/">Home Assistant</a> on the Pi, but I just don&#39;t have that many internet of things devices (yet). I&#39;m also planning to set up Minecraft server on the Pi, but I haven&#39;t found a non-sketchy tutorial yet.</p>
<p>Finally, I also occasionally VNC in using VNC Viewer to check out the latest magazines in the awesome Raspberry Pi magazine app, where they have free subscriptions all these awesome &quot;maker&quot; magazines. This alone is worth the price of a Pi, IMHO.</p>
<p>But, I was getting pretty tired of looking at the same stock desktop background everytime I VNC&#39;ed in.</p>
<h3 id="using-the-ghibli-images-as-the-pis-desktop-background">Using the Ghibli images as the Pi&#39;s desktop background</h3>
<p>There&#39;s a neat command to change your Pi&#39;s desktop background from the terminal:</p>
<pre><code class="language-bash">pcman --set-wallpaper /home/pi/Pictures/ghibli/ged009.jpg
</code></pre>
<p><img src="https://www.charlieharrington.com/img/ged009.jpg" alt="marnie"></p>
<p>Make sure that you&#39;ve given the proper directory location for your Ghibli images, which, of course, you can get with the <code>pwd</code> print working directory command.</p>
<p>Now, I&#39;ve already admit that I enjoy manually running apt-get updates, but I definitely don&#39;t want to be manually changing the background, so how about some automation?</p>
<h3 id="automating-a-rotating-background-with-a-cron-job">Automating a rotating background with a cron job</h3>
<p>We can use a simple cron job for this! First, let&#39;s write a one-liner command to randomly set the background from an image in our folder:</p>
<pre><code class="language-bash">ls /home/pi/Pictures/ghibli | shuf -n 1 | xargs -I{} pcmanfm --set-wallpaper /home/pi/Pictures/ghibli/{}
</code></pre>
<p>It looks kinda hairy, but it&#39;s pretty simple. First, we list the contents of our directory, then we used <code>shuf</code> to randomly select one of the files. In fact, if you just stopped there, your output would look like this:</p>
<pre><code class="language-bash">ls /home/pi/Pictures/ghibli | shuf -n 1
karigurashi024.jpg
</code></pre>
<p>But we want to pipe this randomly selected file to the <code>pcmanfm</code> command! I&#39;m using <code>xargs</code> to do that in the next part of the command. There&#39;s probably an easier way, but this works for me.</p>
<p>So, now that we have our command to randomly select a background, we just need to write a cron job to run this command every... let&#39;s say, ten minutes. First, open up your computer&#39;s crontab file:</p>
<pre><code class="language-bash">crontab -e
</code></pre>
<p>And add this to the bottom:</p>
<pre><code>*/10 * * * * ls /home/pi/Pictures/ghibli | shuf -n 1 | xargs -I{} pcmanfm --set-wallpaper /home/pi/Pictures/ghibli/{}
</code></pre>
<p>Save the file, and you&#39;re done. Right? No. That didn&#39;t work for me. Let&#39;s look at the cron logs with this command: <code>grep CRON /var/log/syslog</code></p>
<pre><code>raspberrypi CRON[3870]: (pi) CMD (DISPLAY=:0.0 &amp;&amp; ls /home/pi/Pictures/ghibli | shuf -n 1 | xargs -I{} pcmanfm --set-wallpaper /home/pi/Pictures/ghibli/{})
raspberrypi CRON[3866]: (CRON) info (No MTA installed, discarding output)
</code></pre>
<p>Not super helful. It does confirm that job ran, which is good, though. That rules out cron syntax errors. This <code>info</code> log is interesting. Discarding output. I don&#39;t like the sound of that. Googling reveals that we need to install a local mail server, so here we go.</p>
<pre><code class="language-bash">sudo apt-get install postfix
</code></pre>
<p><img src="https://www.charlieharrington.com/img/postfix.png" alt="postfix"></p>
<p>You should choose a &quot;Local&quot; installation. Once we have a mail server, we can now inspect the cron job &quot;mail&quot; logs:</p>
<pre><code>sudo tail -f /var/mail/pi
</code></pre>
<p>After a bunch of email header jargon, we finally see the error:</p>
<pre><code>Cannot open display: 

--1332E5E8FA.1601069882/raspberrypi--
</code></pre>
<p>Awesome! I mean, the cron job still doesn&#39;t work, but at least we have some more info. That&#39;s a win. So, what have we learned? It seems like our cron job can&#39;t &quot;open&quot; the display. Some more Googling suggests that I need to add an env var for the display, so I add this <code>export DISPLAY=:0.0</code> to the beginning on my cron job right after the cron syntax.</p>
<p>Did that fix it? No. But we get a new error message:</p>
<pre><code>Message: x-terminal-emulator has very limited support, consider choose another terminal
</code></pre>
<p>Cool. Okay, so, what does this one mean? This <a href="https://stackoverflow.com/questions/45873124/pcmanfm-set-wallpaper-fails-on-raspbian-stretch-in-cron">stack overflow answer</a> suggests that I may need to add another env var to my command. Here goes:</p>
<pre><code>*/10 * * * * export DISPLAY=&quot;:0.0&quot; XDG_RUNTIME_DIR=/run/usr/1000  ls /home/pi/Pictures/ghibli | shuf -n 1 | xargs -I{} pcmanfm --set-wallpaper /home/pi/Pictures/ghibli/{}
</code></pre>
<p>Yes! Our cron job works!</p>
<p><img src="https://www.charlieharrington.com/img/karigurashi024.jpg" alt="marnie"></p>
<p>What are these <code>DISPLAY</code> and <code>XDG_RUNTIME_DIR</code>? According to <a href="https://askubuntu.com/questions/872792/what-is-xdg-runtime-dir">this other Stack Overflow answer</a>, <code>DISPLAY</code> is an address for your display and <code>XDG_RUNTIME_DIR</code> is a place to store temporary files for your user. Probably some more to dig into here, but for now, I&#39;m just going to stare at my VNC Viewer and watch the background change.</p>
<p>After all this Googling and debugging, we&#39;ve now got all these cute images keeping our computer happy, even when we&#39;re not there.</p>
<p>Automating stuff like this is part of the magic of computers. And that&#39;s why I think it goes so well with these magical Studio Ghibli images.</p>
<h2 id="watching-the-studio-ghibli-films">Watching the Studio Ghibli films</h2>
<p>But, now I&#39;ve got a ticking clock... </p>
<p>I hate spoilers, and I&#39;m sad to say that I&#39;ve only seen Howl&#39;s Moving Castle (after reading the book earlier this year). I loved it, much more so than book. Which means I need to watch all the Ghibli films <em>fast</em>, before I spoil my way through them with my desktop backgrounds.</p>
<p>In our first episode of the <a href="https://www.charlieharrington.com/escaping-web-season-one-retrospective">Escaping Web podcast</a>, Oz and I chatted with Felix Tripier who brought up <a href="https://en.wikipedia.org/wiki/Grave_of_the_Fireflies">Grave of the Fireflies</a>. I didn&#39;t know about the film during our conversation, but I&#39;ve just discovered that it&#39;s available on Hulu. I&#39;ll be watching it very soon. As for the rest of films, I&#39;ve heard they&#39;re on HBO GOMAXPROPLUS in the US and Netflix everywhere else in the world.</p>
<p>For now, I&#39;m just glad to have these images on my little server whenever I log in. It&#39;s a nice happy thing in my life, and I thank the orange website for the tiny dose of inspiration.</p>
]]></description>
            <link>https://www.charlieharrington.com/add-some-ghibli-to-your-raspberry-pi</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/add-some-ghibli-to-your-raspberry-pi</guid>
            <pubDate>Fri, 25 Sep 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Create wonderful things, be good, have fun]]></title>
            <description><![CDATA[<blockquote>
<p>Create wonderful things, be good, have fun</p>
</blockquote>
<p>This is the credo of Klutz Press, the most important book publisher of my childhood. It being summer and all, Hobbes, ol&#39; buddy... let&#39;s going exploring!</p>
<h2 id="what-makes-a-klutz-press-book-so-good-for-learning-stuff">What makes a Klutz Press book so good for learning stuff?</h2>
<p>If you&#39;ve heard of Klutz, then you&#39;ve likely seen their debut: <a href="https://www.amazon.com/gp/product/0932592007/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0932592007&linkId=adaa512e8af09feab7c571ec8f2863cc">Juggling For the Complete Klutz</a>. </p>
<p><img src="https://www.charlieharrington.com/img/juggling.png" alt="juggling"></p>
<p>If not, I highly suggest seeking out a copy. Keep in mind, it&#39;s more than just a <em>book</em> -- <em>Juggling for the Complete Klutz</em> has these amazing attributes:</p>
<ul>
<li>It&#39;s spiral-bound</li>
<li>It has hilarious drawings</li>
<li>It comes attached with three real-life bean bags!</li>
</ul>
<p>These are book super-powers, in my book (a Klutz-worthy pun?). In our day, my sister and I owned, devoured, and treasured these Klutz titles:</p>
<ul>
<li><a href="https://www.amazon.com/gp/product/0932592082/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0932592082&linkId=5bb878d785a02edc2b01eeffd63f9a76">Country and Blues Harmonica for the Musically Hopeless</a> (comes with instructional cassette and a gen-u-ine Hohner harmonica)</li>
<li><a href="https://www.amazon.com/gp/product/1591747007/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1591747007&linkId=bf0dda95c016b59824316ebe42f872ec">Friendship Bracelets Craft Kit</a> (comes with string and supplies for making friendship bracelets)</li>
<li><a href="https://www.amazon.com/gp/product/1878257501/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1878257501&linkId=7315967f85fba1c812b20b480b0bd966">Table Top Football: A Guide to the Classic Lunchroom Sport</a> (comes with an amazing leather-ish table top football)</li>
<li><a href="https://www.amazon.com/gp/product/1878257536/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1878257536&linkId=58c3235cd298baf5ec29fb13ee806ced">Cats Cradle</a> (comes with a tie-die cat&#39;s cradle string)</li>
<li><a href="https://www.amazon.com/gp/product/1591745047/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1591745047&linkId=905fbe99f4844c375f00baa92f1beee0">Bead Loom Bracelets: Learn to Make Beautiful Beaded Bracelets</a> (comes with beads and string)</li>
<li><a href="https://www.amazon.com/gp/product/1878257412/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1878257412&linkId=d283508248a4016cd908bd8e37fcea68">Kids Shenanigans</a> (comes with a Whoopie cushion!)</li>
<li><a href="https://www.amazon.com/gp/product/1878257749/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1878257749&linkId=99f448476dd4b6ce6baae76dbf048446">Earthsearch: A Kid&#39;s Geography Museum in a Book</a> (comes with interactive spinners, a sand-powered clock, and a real-life penny)</li>
<li><a href="https://www.amazon.com/gp/product/1878257145/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1878257145&linkId=6b93493aa3d2cd5660e5e24c404ad5e6">Explorabook: A Kid&#39;s Science Museum in a Book</a> (comes with a bunch more interactive projects and whatnots inside the book, like mirrors, spinners, and a packet of algae that you can grow)</li>
</ul>
<p>As a kid, there was nothing better than getting a new Klutz book (ok, maybe a Super Nintendo game). But unlike a replay of <em>Super Mario RPG</em>, these Klutz books require no nostaglia goggles. Here&#39;s why I think they&#39;re magic:</p>
<h3 id="klutz-books-are-spiral-bound">Klutz books are spiral-bound</h3>
<p>Books for learning stuff should be able to open up and stay flat. The old 1980s computer manuals for computers like the Commodore VIC-20, the Commodore 64, and <a href="https://www.charlieharrington.com/my-new-old-apple-iie-computer">my new old Apple IIe</a> knew this much -- their manuals were spiral-bound and spell-binding.</p>
<p>So, why don&#39;t we see more spiral-bound books? Without knowing that much about printing costs, I imagine they&#39;re more expensive. Also, they do look slightly worse on a bookshelf, especially if you&#39;re going for that &#39;grammable color pattern look (so, just don&#39;t do this).</p>
<h3 id="klutz-books-come-with-the-required-materials">Klutz books come with the required materials</h3>
<p>The little &quot;paper&quot; football that came with the <em>Table Top Football: A Guide to the Classic Lunchroom Sport</em> was a revered grail of mine. I remember that my dad took a sheetrock knife and made a small incision in its plastic case attached to the book so that the football could be slid in and out, with the explicit rule that the football must either be <em>in the case</em> or <em>being used in a game</em>. This is much like the inexorable <a href="https://hypercritical.co/">Jon Siracusan</a> rule for Airpods. Obey, or the Airpods will be instantly lost forever.</p>
<p><img src="https://www.charlieharrington.com/img/football.jpg" alt="football"></p>
<p>Side note that there are some people who just love making small cuts into the plastic cases for things, so that you easily return them to their &quot;pristine&quot; condition. I, myself, don&#39;t understand these people. I like wripping these cases to shreds instantly.</p>
<p>Anyway, back to these Klutz books. By including juggling bean bags, yarn for friendship bracelets, or a real harmonica, Klutz Press books gave you everything you needed to get your hands dirty. &quot;Active learning&quot;, or something like that. Playing = learning. Etcetera.</p>
<h3 id="klutz-books-have-hilarious-art">Klutz books have hilarious art</h3>
<p><img src="https://www.charlieharrington.com/img/shenanigan.jpg" alt="shenanigan"></p>
<p>Just look at that paper airplane stuck in the teacher&#39;s hair!</p>
<p>Klutz had a particular art direction that spoke to me as a child. The goofy people in their guides made me feel like it was <em>okay to be a klutz</em>. </p>
<p>Which brings me to the most important reason that Klutz books are special.</p>
<h3 id="klutz-books-embrace-the-beginners-mindset">Klutz books embrace the Beginner&#39;s Mindset</h3>
<blockquote>
<p>In the beginner&#39;s mind there are many possibilities. In the experts mind there are few - Shunryū Suzuki</p>
</blockquote>
<p>Everyone starts out as a klutz. No matter what. That means it&#39;s okay to make mistakes. It can even be funny - in fact, it should be funny! Because it&#39;s fun to learn new things.</p>
<p>Being a klutz, making mistakes, having fun, this is the path to wonderful things.</p>
<h2 id="whos-behind-klutz-press">Who&#39;s behind Klutz Press?</h2>
<p>According to <a href="https://en.wikipedia.org/wiki/Klutz_Press">Wikipedia</a>, Klutz Press was founded in 1977 by three friends in Palo Alto.</p>
<p>The apocryphal story is that <a href="https://en.wikipedia.org/wiki/John_Cassidy_(author)">John Cassidy</a>, a recent Stanford grad working as a high school teacher, brought a bucket of tennis balls and some hand-written instructions for juggling to his remedial reading class. The laughs and learning and genuine reading and genuine juggling that ensued inspired Cassidy and his buddies from Stanford to publish <em>Juggling For the Complete Klutz</em> under their new company: Klutz Press.</p>
<p><em>Juggling For the Complete Klutz</em> has sold over 2.5 million copies. But Googling for Klutz Press is somewhat challenging these days. In 2000, Klutz was acquired by a company called Nelvana for $74 million, and in 2002 Klutz became a subsidiary of Scholastic, Inc. This latter merger is a good match in my book, as the Scholastic Book Fair also ranks heavily in my childhood memories of learning to love reading. The only other company I&#39;d feel comfortable with owning Klutz Press is Pizza Hut - thanks to their delicious <a href="https://www.bookitprogram.com/">BOOK-IT!</a> reading program, which brought me dozens of delicious cheese Personal Pan Pizzas during the 1990s. My parents couldn&#39;t decide if they hated or loved Pizza Hut for this.</p>
<p>Nowadays, Klutz.com redirects to the Scholastic website, and it&#39;s unclear what&#39;s out-of-print or available from the voluminous Klutz catalog. So if you do find a genuine Klutz book and kit, I&#39;d snag them quickly!</p>
<p>Luckily, I was able to find a good interview with Cassidy from 1995 on the <a href="https://web.archive.org/web/20110616182712/http://findarticles.com/p/articles/mi_m1154/is_n5_v83/ai_16857996/">Wayback Machine</a>. In 1995, Klutz was at the height of their power and influence in kid&#39;s minds. Here are some choice quotes from Cassidy:</p>
<p>On their company culture at Klutz Press:</p>
<blockquote>
<p>&quot;In terms of being laid back, we take a back seat to nobody.&quot;</p>
</blockquote>
<p>On their &quot;teaching&quot; style:</p>
<blockquote>
<p>&quot;Talk to a kid about fun and math, and it&#39;s like you&#39;re talking about two different sides of the universe. If we can climb this mountain, there&#39;s nothing we can&#39;t tackle.&quot;</p>
</blockquote>
<blockquote>
<p>&quot;Kids don&#39;t learn all that much by listening or reading. They need to get elbow-deep in a subject and touch it, feel it, and smell it.&quot;</p>
</blockquote>
<p>This reminds me of Seymour Paypert&#39;s <a href="https://www.amazon.com/gp/product/0465046746/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0465046746&linkId=2949aefc36d4bd9d9f632170d2ac23de">Mindstorms book</a> about his work with LOGO and the Turtle machine (you can check out <a href="https://www.charlieharrington.com/mindstorms">my notes</a> on the book)</p>
<p>The article explains a bit about their business:</p>
<ul>
<li>All of Klutz&#39; books sell for less than $20</li>
<li>They can have low prices because: (1) the books (with their accompanying &quot;stuff&quot;) are viewed as more than books - but &quot;toys/novelties&quot;, so more retailers than booksellers are interesting in carring them, and (2) they do large printing runs (150k copies vs the usual 10k for children&#39;s books)</li>
</ul>
<p>And, importantly, the final word from Cassidy:</p>
<blockquote>
<p>&quot;I can hang a spoon off my nose,&quot; Cassidy boasts, &quot;and I take a lot of pride in that&quot;.</p>
</blockquote>
<h2 id="create-wonderful-things-be-good-have-fun">Create wonderful things, be good, have fun</h2>
<p>I just wanted to write that out again. I&#39;ve decided to adopt their credo as my own life motto.</p>
<p>I learned so much from Klutz Press as a kid. I&#39;m still learning now. Thank you, John Cassidy and team, for making these wonderful books. My juggling is finally starting to get pretty good, but I&#39;ll always be a klutz.</p>
]]></description>
            <link>https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun</guid>
            <pubDate>Wed, 24 Jun 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[My New Old Apple IIe Computer]]></title>
            <description><![CDATA[<p>That Monday morning in February began like any other Monday: I opened my phone immediately upon waking up, browsed Twitter, checked Instagram, and ignored my email, all from bed, making no pretense of daily gratitude journaling. I got up to make the coffee, and then opened eBay to look at old computers.</p>
<p>eBay thrills in me in an early Internet kind-of-way. It&#39;s dirty. You can&#39;t believe it works. And you can still find a deal.</p>
<p>My greatest feat of all was the 2006 purchase of a Fender American Stratocaster for roughly $300 bucks which had been mislisted into an &quot;Fender - Other&quot; category. Its description warned that the guitar was &quot;missing a few strings.&quot;</p>
<p>Jackpot.</p>
<p>I&#39;d been waffling between a <a href="https://en.wikipedia.org/wiki/Commodore_VIC-20">Commodore VIC-20</a> and some kind of Apple II in my vintage computer fantasies. As an undying fan of YouTube&#39;s <a href="https://www.youtube.com/channel/UC8uT9cgJorJPWu7ITLGo9Ww">The 8-Bit Guy</a><sup>1</sup>, I longed for a computer of my own that I could clean with hydrogen peroxide and baking soda, as I wondered what sad fate the brave, worthy computer had faced before meeting me, its benevolent new master. We&#39;d write infinite loops in BASIC together. We&#39;d travel the Oregon Trail. We&#39;d poke each other&#39;s memory.</p>
<p>I set a few auctions to my watch-list, and then laced on my sneakers for our morning run. Not one block away from our house did I spot something: a yellowed plastic box amid a pile of trash. No. It couldn&#39;t be. I stopped, and went back to the trash.</p>
<p>It was an Apple IIe. With its CRT monitor. And a dual floppy drive.</p>
<p>Just. SITTING. THERE.</p>
<p>I explained the situation to Carly. She suggested, wisely, that we continue our run, of which we were less than 30 seconds into, and that if the computer was still outside when we got back, that I should knock on the door of the house, to confirm it was truly being thrown out.</p>
<p>The next 30 minutes were agony. I&#39;ve never ran so fast in my life.</p>
<p>But it was still there.</p>
<p>I knocked on the door. They were remodeling, I could hear saws or something inside. No one answered. I knocked again. I considered, you know, for a second, just taking it. Finally, the door opened. I introduced myself, likely sounding as insane as felt, and asked if the computer in the trash was.. trash. She nodded, and mentioned that, &quot;It still works.&quot;</p>
<blockquote>
<p>It still works.</p>
</blockquote>
<p>No better sounds could have been uttered.</p>
<h3 id="plugging-it-in">Plugging it in</h3>
<p>I carried my Precious back home and hurried to plug it in.</p>
<p>Except the monitor cable was missing. I was certain that I&#39;d grabbed everything of computer-ish value from the trash pile. From the looks of the port, I&#39;d need one of those old mono RCA cables, of which I know I have dozens in my parent&#39;s attic across the country in New Jersey. </p>
<p>I still turned on the computer and the monitor anyway, and was relieved to hear it chirp happily, even if I couldn&#39;t see anything.</p>
<p>By this point, it was high time to get on my bike and head into work (back when we still things like that). But I still made a quick pit-stop at a hardware store along the way, and somehow a physical store in the physical world still carried this little guy:</p>
<p><img src="https://www.charlieharrington.com/img/monitorplug.jpeg" alt="Monitor cable"></p>
<p>That night, after work, I turned it on. One beep and then:</p>
<p><img src="https://www.charlieharrington.com/img/boot.jpeg" alt="boot"></p>
<p>&quot;Isn&#39;t it beautiful?&quot; I said to Carly. &quot;And don&#39;t you just love how the <code>II</code> is shown as <code>//</code> slashes. The green, too, it&#39;s like something out of the Rebel Alliance.&quot;</p>
<p>&quot;Yes, and what do you do with it?&quot;</p>
<p>&quot;Well... you just...&quot;</p>
<p>Truth was I didn&#39;t know how to advance past this welcome screen. My benefactors neglected to include the computer manual for the Apple IIe in their trash. This is a major bummer on multiple fronts, because what I&#39;ve learned about computer manuals from the 1980s is that they were AWESOME. I recently picked up both the Commodore VIC-20 manual and the Commodore 64 manuals on eBay, even though I have neither machine, because I wanted to enjoy their spiral-bound goodness.</p>
<p>But I&#39;m a software engineer. I know how to Google. Soon, a <code>Ctrl-Reset</code> had me at the BASIC prompt.</p>
<p>I was ready for this.</p>
<p><img src="https://www.charlieharrington.com/img/yup.jpeg" alt="yup"></p>
<p><img src="https://www.charlieharrington.com/img/loop.jpeg" alt="loop"></p>
<p>I didn&#39;t grow up coding in BASIC, but I&#39;m a student of history. I certainly knew that it&#39;s a rite of passage to code up a little infinite loop whenever you see a BASIC prompt.</p>
<p>Carly nodded. &quot;Cool. Why does it smell like a campfire?&quot;</p>
<h3 id="capacitor-problems">Capacitor problems</h3>
<p>Uh-oh. That pop that I&#39;d heard seconds before, and willfully ignored, might not have been a good pop. The smell grew worse.</p>
<blockquote>
<p>Burnt marshmallows on blacktop.</p>
</blockquote>
<p>I flipped off the power. I forgot to mention I already had the fire extinguisher at the ready, but it didn&#39;t look like that&#39;d be necessary. Unfortunately, the smell didn&#39;t disappear after turning off the power.</p>
<p>Some more Googling revealed the likely problem: a capacitor popped in the power supply. I unscrewed the power supply from the computer (held on by just four small screws), and put it somewhere far away. Days later, weeks later, the power supply still smelled.</p>
<p>At this point, if I had been a more experienced solder-er, I would have considered buying a capacitor for like ten cents and replacing it myself. But as I&#39;m still learning the ropes of soldering, and hacking with power supplies felt a little ahead of me, I thought about getting some more experienced help. (Also, I was kinda terrified that I would accidentally short circuit something and fry the motherboard, before I ever got to really play with the computer).</p>
<p>I spent some time looking for an Apple repair store that would service Apple II&#39;s. Even in the Bay Area, this felt like a lost cause. Then someone suggested this site: <a href="https://www.reactivemicro.com/">ReActiveMicro</a>. Its tagline: <code>Reactivate Your Vintage Apple Computer</code>. For $95, I could order a <a href="https://www.reactivemicro.com/product/ultimate-universal-power-supply/">new power supply</a> for my Apple IIe.</p>
<p>So I did. It arrived in the mail about a week later, and I installed it in roughly a minute and half. With the extinguisher again at the ready, I turned on the computer again.</p>
<p>And it worked! I looked up an old program in an old Apple magazine online, and coded up this little sine wave program:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Back in business <a href="https://twitter.com/hashtag/appleiie?src=hash&amp;ref_src=twsrc%5Etfw">#appleiie</a> <a href="https://t.co/AHi9EBdbVm">pic.twitter.com/AHi9EBdbVm</a></p>&mdash; Charlie Harrington (@whatrocks) <a href="https://twitter.com/whatrocks/status/1231624493040193537?ref_src=twsrc%5Etfw">February 23, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<h3 id="expansion-slots">Expansion slots</h3>
<p>Now that I&#39;ve got a working, adorable Apple IIe, the first thing I decide to do is take it apart. Say what you will about the <a href="https://www.apple.com/mac-pro/">new Mac Pro case design</a>, but it&#39;s got nothing on this little hatch.</p>
<p><img src="https://www.charlieharrington.com/img/topclosed.jpeg" alt="Apple IIe top down"></p>
<p><img src="https://www.charlieharrington.com/img/lift.jpeg" alt="lift"></p>
<p><img src="https://www.charlieharrington.com/img/loaded.jpeg" alt="loaded"></p>
<p>As you can see, I&#39;ve hit a pretty big jackpot on the expansion card front. I&#39;ll walk through each card individually in a bit.</p>
<p>Here&#39;s a bare-bones look at the motherboard after removing all the expansion cards.</p>
<p><img src="https://www.charlieharrington.com/img/topdown.jpeg" alt="Apple IIe top open"></p>
<p>And a close-up of the seven (7!) expansion slots, not including the extra one for adding more memory or 80-column mode.</p>
<p><img src="https://www.charlieharrington.com/img/slots.jpeg" alt="Apple IIe slots"></p>
<p>This again reminds of the recent discussions on <a href="https://atp.fm/">Accidental Tech Podcast</a> and other podcasts about the new Mac Pro and its expansion slots. There was a lot of fun discussion about what John Siracusa was going to put into his long-awaited Mac Pro&#39;s expansion slots.</p>
<p>But, in modern computers, I haven&#39;t seen much that&#39;s really that interesting as far as expansion slots go. Mostly, I&#39;ve heard about video cards and more storage. Otherwise, your computer mostly has everything it needs for the majority of use-cases.</p>
<p>Which is completely the opposite for the Apple II. </p>
<p>These expansion slots in Apple II computers CHANGED your computer. Transmogrified it into something altogether new and exciting. Want to print something? Get a card for it. Go on the.. ARPANet? Get a modem card. Need to save a program on something other than tape cassette recorder (which itself is crazy and I want to try)? Better get a floppy driver card!</p>
<p>Even the back of the Apple IIe shows the potential of this machine to be utterly transformed by each owner. These slots are yours for the shaping, dear computer user.</p>
<p><img src="https://www.charlieharrington.com/img/back.jpeg" alt="Back of Apple IIe"></p>
<p>So, anyway, what the heck did I find inside my Apple IIe? Let&#39;s go through them one-by-one.</p>
<h4 id="extended-80-column-text-card">Extended 80-Column Text Card</h4>
<p>The <a href="https://en.wikipedia.org/wiki/Apple_80-Column_Text_Card">Extended 80-Column Text Card</a> is quite literal: it gives you 80 columns of text instead of 40! Mine also provides extra RAM, bringing my Apple IIe&#39;s total RAM up to a whopping 128kB.</p>
<p><img src="https://www.charlieharrington.com/img/80col.jpeg" alt="80 Column card"></p>
<p><img src="https://www.charlieharrington.com/img/eightycol.jpeg" alt="col card"></p>
<p>How do you get into 80-column mode? Type <code>PR#3</code> into the BASIC prompt. It kinda looks worse on this monitor, but I can already see the value for more complex programs.</p>
<h4 id="super-serial-card-ii">Super Serial Card II</h4>
<p>I am probably most excited about this card. The <a href="https://en.wikipedia.org/wiki/Apple_II_serial_cards">Super Serial Card II</a> can be used as a modem, a printer connection, and I have a pretty good suspicion that I&#39;ll be able to connect to it an Arduino or a Raspberry Pi for some fun.</p>
<p><img src="https://www.charlieharrington.com/img/serial.jpeg" alt="Super Serial Card II"></p>
<p><img src="https://www.charlieharrington.com/img/serial2.jpeg" alt="Super Serial Card II closeup"></p>
<h4 id="micromodem-iie">MicroModem IIe</h4>
<p>It&#39;s a modem! With an external port that looks like a telephone jack. Some wizards at work told me that I probably cannot just plug this into a modern phone line and expect it to work, though. They said that phone lines don&#39;t really work the same way anymore. This is something I&#39;m not quite clear on yet, but I did manage to find the <a href="https://apple2online.com/web_documents/hayes_micromodem_ii_owner__s_guide.pdf">Micromodel II Owner&#39;s Manual</a>, so there could be some fun to be had here.</p>
<p><img src="https://www.charlieharrington.com/img/modem.jpeg" alt="modem card"></p>
<p><img src="https://www.charlieharrington.com/img/modem2.jpeg" alt="modem card closeup"></p>
<h4 id="duodisk-and-disk-ii-card">DuoDisk and Disk II Card</h4>
<p>The <a href="https://en.wikipedia.org/wiki/Disk_II#DuoDisk">DuoDisk</a> is a combination drive with two 5 1/4-inch floppy drive bays next to each other. It looks nice when you sandwich it between your Apple II and its monitor.</p>
<p><img src="https://www.charlieharrington.com/img/floppymodule.jpeg" alt="Apple IIe with floppy"></p>
<p>The card uses the same Disk II system famously designed by Woz. The <a href="https://en.wikipedia.org/wiki/Disk_II">Wikipedia</a> entry on the Disk II is fascinating and well-worth the quick read. Apparently, the Apple II was getting a lot of flak for not including a disk drive, instead relying on external cassette tape storage. Woz&#39;s solution was the Disk II system, a simpler design than the industry standards, proved incredibly successful, both financially and functionally. Per Wikipedia:</p>
<blockquote>
<p>Wozniak called the resultant Disk II system &quot;my most incredible experience at Apple and the finest job I did&quot;, and credited it and VisiCalc with the Apple II&#39;s success.</p>
</blockquote>
<p><img src="https://www.charlieharrington.com/img/floppycard.jpeg" alt="floppy card"></p>
<p>If anyone&#39;s got any spare 5 1⁄4-inch floppies, let me know, because now I&#39;ve got two whole slots for them (this is actually a serious inquiry, please <a href="https://twitter.com/whatrocks">tweet</a> at me!).</p>
<h3 id="so-what-are-you-going-to-do-with-your-new-old-computer-charlie">So, what are you going to do with your new old computer, Charlie?</h3>
<p>I&#39;m not sure. Here are some of my thoughts.</p>
<h4 id="serial-port">Serial port</h4>
<p>As mentioned, I suspect that I&#39;ll be able to figure out how to use the Super Serial II card with an Arduino or Raspberry Pi.</p>
<p>I recently found a project that uses Raspberry Pi in such a way that it accepts keyboard input from the Apple II and displays its output on the Apple monitor. Definitely want to try that.</p>
<p>But I&#39;m also eager to see if I can rig it up such that I can effectively SSH/remote into the Apple IIe from a laptop, using a Raspberry Pi as a bridge of some kind via the Super Serial II card. </p>
<p>This project is definitely my top priority, because it seems odd and useful. I&#39;d really like to be able to write programs for the Apple IIe and easily save them to GitHub. Being able to write them on my laptop and simply transfer them to the Apple for processing seems like a hilariously fun and distracting project to work on next.</p>
<h4 id="repairs">Repairs</h4>
<p>These are smaller efforts, which means they&#39;ll likely linger for a while.</p>
<p><img src="https://www.charlieharrington.com/img/keyboard.jpeg" alt="keyboard"></p>
<ul>
<li>Find replacement keys for my missing keys. I hope this doesn&#39;t mean buying an entire <em>other</em> Apple IIe. Or do I?</li>
<li>&quot;Retro-brite&quot; and deep clean - a la 8 Bit Guy - to make the case look brand new</li>
</ul>
<h4 id="games">Games</h4>
<p>I currently have zero software for the Apple IIe. None. Zilch. Which means I have no games. I know that, back in the 1980s, magazines used to print out source code for games, and kids would spend hours plugging them into their Apple IIs or Commodores, praying that they hadn&#39;t made a syntax error. Once their games were up and running, this proved a great chance for the curious ones to start messing around with the source code, tweaking it, and eventually making their own games. I&#39;m sure that many of these games and magazines are now scanned and available online. I&#39;ll definitely be checking those out.</p>
<p>I&#39;d also be very open to buying some classic Apple II games on eBay. I&#39;d love to hear of favorites or any suggestions.</p>
<h4 id="storage">Storage</h4>
<p>Given that I immediately lose everything anytime the power goes out (or I simply turn off the computer), these two projects seem important:</p>
<ul>
<li>Get a tape recorder and figure out how to save a program to tape, and then rewind / reload it</li>
<li>Find some blank floppies and do the same</li>
</ul>
<h4 id="programming">Programming</h4>
<p>Other than AppleSoft BASIC (which was written by Microsoft! For Apple!!), which is burned into a ROM chip on the Apple II, there&#39;s also some sort of built-in assembler that you can access by typing this into the BASIC prompt:</p>
<pre><code>CALL-151
</code></pre>
<p>I believe this is where I&#39;ll be able to do some of the more Commodore 64-like peeking and poking directly at memory. I have a feeling there&#39;s a lot of exploring (and fun) to be done here. I need to read up more on this.</p>
<h3 id="one-more-thing">One more thing</h3>
<p>This computer represents to me the lost era of computer as appliance. I&#39;m talking about &quot;bicycle for the mind&quot; type-of-stuff. When you still sat down and said, &quot;I&#39;m going to computer now.&quot; Or, as in my childhood, &quot;May I please go on the computer now, Mom, PLEASE?&quot;</p>
<p>We&#39;re much closer to cyborgs now, with our phones and watches and speakers and other do-dads. Computers are part of us. They&#39;re attached to us, they&#39;re in our pockets, they&#39;re in our bags, they&#39;re next to us when we go to sleep. You can&#39;t escape them, and as a result, you&#39;re no longer able to make an active choice about whether or not to use them. The best we&#39;ve got is Screen Time warnings, a penal code to make us use them less.</p>
<p>That&#39;s why this Apple IIe is such an important machine to me. It&#39;s something I can actively choose to dive into and explore. It&#39;s the same thing I feel when I really get into a novel. I&#39;m in another world.</p>
<p>And here a few more close-ups of the computer as a reward for making it this far.</p>
<p><img src="https://www.charlieharrington.com/img/apple.jpeg" alt="Apple IIe Logo"></p>
<p><img src="https://www.charlieharrington.com/img/chips.jpeg" alt="Motherboard"></p>
<p><img src="https://www.charlieharrington.com/img/chips2.jpeg" alt="chips"></p>
<p><img src="https://www.charlieharrington.com/img/doubleapple.jpeg" alt="Double Apple Logo"></p>
<p><img src="https://www.charlieharrington.com/img/memory.jpeg" alt="memory"></p>
<h4 id="footnotes">Footnotes</h4>
<ol>
<li>For the uninitiated, I suggest starting with Part 1 of The 8-Bit Guy&#39;s masterful two series: <a href="https://www.youtube.com/watch?v=A_vpfBJZ7JI">Restoration - The Worst VIC-20 I&#39;ve ever seen - Part 1</a>. I don&#39;t know why I like watching this man clean and restore old computers so much, but there it is - I just do.</li>
</ol>
]]></description>
            <link>https://www.charlieharrington.com/my-new-old-apple-iie-computer</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/my-new-old-apple-iie-computer</guid>
            <pubDate>Tue, 12 May 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Mindstorms]]></title>
            <description><![CDATA[<p><a href="https://www.amazon.com/gp/product/0465046746/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0465046746&linkId=2949aefc36d4bd9d9f632170d2ac23de">Mindstorms</a> by Seymour Papert is a book written in 1980 about how children can learn with computers - and learn to fall in love with learning along the way.</p>
<p>I read <a href="https://www.amazon.com/gp/product/0465046746/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0465046746&linkId=2949aefc36d4bd9d9f632170d2ac23de">Mindstorms</a>, and fell in love with the book. My own mind was besieged, stormed, and ultimately broken - only to be reforged anew like Andúril from the shards of Narsil (sorry, I&#39;m re-reading Lord of the Rings right now). This post, after this short-I-promise expository intro, contains my book notes.</p>
<p>You may have heard of Papert&#39;s LOGO programming language before, which issues commands to an adorable round robot called a Turtle. Papert designed LOGO and the Turtle in the late 1960s to help children learn how to learn with computers. Here&#39;s a photo of Papert and his robotic operating buddy:</p>
<p><img src="https://www.charlieharrington.com/img/papert.jpg" alt="Papert"></p>
<p>The popular Lego Mindstorms products are inspired by Papert and this book, along with many other cute robot learning toys for children, like <a href="https://www.charlieharrington.com/teaching-my-robot-with-tensorflow">my good friend Cozmo the Robot</a> or the insanely cute Cubetto from <a href="https://www.primotoys.com/">Primo Toys</a>:</p>
<p><img src="https://www.charlieharrington.com/img/cubetto.png" alt="Cubetto"></p>
<p>When you conjure up an image of &quot;learning with computers&quot;, you might think of a rote &quot;quiz app&quot; or &quot;flashcard app&quot; - but Papert suggests that it can be more -- more creative, more exploratory, more fun, and longer-lasting. I think about how I took Calc AB and Calc BC in high school, and I was pretty good at them, too, but I had no idea what I was really doing. I knew the mechanics, not the meaning. When Papert connects teaching the Turtle to move in a cirle and the principals of differential calculus -- measuring growth by movement at the growing tip -- all I can say is 🤯.</p>
<p>There&#39;s obviously also a reference to George Polya in here, too - always a good sign! </p>
<p>And now, onto the notes!</p>
<h3 id="learning-with-computers">Learning with computers</h3>
<ul>
<li><strong>Bricolage</strong>: creation from diverse range of things</li>
<li>Computers have the power to <strong>simulate</strong>. They can take 1000 forms and serve 1000 functions<ul>
<li>Flexible enough so children can each create with them</li>
<li>Flexible enough to model the world</li>
</ul>
</li>
<li>Remember: people seldom get things right on the first try</li>
<li>He is not recommending &quot;computer-aided instruction&quot; - like a quiz app<ul>
<li>Instead, he envisions the child programming the computer!</li>
</ul>
</li>
<li>Learning to program can be a natural process like language acquisition</li>
<li>Learning to communicate with a computer can change the ways we learn other things</li>
<li><strong>Jean Piaget</strong><ul>
<li>Papert&#39;s mentor / teacher</li>
<li>&quot;Learning without being taught&quot; is perhaps Piaget&#39;s main idea</li>
<li>Piaget says that children build their own intellectual structures, models, and then evolve them over time when proven false</li>
<li>Children do thise all without being <em>taught</em></li>
<li>&quot;Child as builder&quot;</li>
</ul>
</li>
</ul>
<h3 id="mathophobia">Mathophobia</h3>
<ul>
<li>Mathophobia is endemic. To this day, if we see math, we avoid it.</li>
<li>But we often have no trouble with math knowledge if we don&#39;t perceive it as &quot;math&quot;</li>
<li>People&#39;s images of themselves as learners is contaminated by mathophobia<ul>
<li>&quot;I&#39;m not a math person&quot;</li>
<li>&quot;I&#39;m not artistic&quot;</li>
<li>&quot;I&#39;m not musical&quot;</li>
<li>As you can see, it dangerously spreads to other disciplines... &quot;not an X person&quot;</li>
</ul>
</li>
<li>Mathophobia leads to insecurity and self-imposed restrictions, rather than a child&#39;s instinctive free exploration of the world</li>
<li>However, the computer can be a carrier of cultural germs and seeds whos intellectual products won&#39;t need a computer once they can take root in actively growing mind</li>
</ul>
<h3 id="the-turtle">The Turtle</h3>
<ul>
<li>&quot;Body knowledge&quot; - useful to think about things in relation to your body. Children do this instinctively</li>
<li>Children need an &quot;object to think with&quot;<ul>
<li>This object is &quot;the Turtle&quot;</li>
</ul>
</li>
<li>The Turtle is not a panacea, just a model for other objects not yet invented by the child</li>
<li>LOGO programming language is how children communicate with the Turtle</li>
<li>The Turtle serves no purpose other than being good to program and good to think with</li>
<li>Example LOGO commands<ul>
<li>FORWARD 100</li>
<li>PENDOWN</li>
<li>RIGHT 90</li>
<li>PENUP</li>
</ul>
</li>
<li>The idea of programming is done through the metaphor of teaching the Turtle a new word, like SQUARE or TRIANGLE</li>
<li>This is obviously fun, but also powerful learning is happening</li>
<li>Like other builders, children appropriate to their own use materials they find around them, mostly importantly the models and metaphors suggested by surrounding culture</li>
<li>Active, self-directed, recognizable personal purpose, source of power, doing something with knowledge --&gt; all reasons to prefer using LOGO over watching educational programming on TV</li>
<li>Importance of learning systematic procedures and debugging them</li>
<li>Learning to be a master programmer is learning to become highly skilled at isolating and fixing bugs</li>
<li>Programs are not WRONG or RIGHT -&gt; but they are fixable</li>
<li>Deliberately thinking like a computer is extremely valuable (step by step, literal, mechanical). Thinking like a computer is just one &quot;style of thinking&quot;, and helps students understand that there are different ways of thinking.</li>
<li>Computers are not something that &quot;rots our brains&quot;</li>
</ul>
<h3 id="teaching-without-curriculum">Teaching without curriculum</h3>
<ul>
<li>Doesn&#39;t mean free-form, spontaneous classrooms or simply &quot;leaving the child alone&quot;</li>
<li>Teaching without curriculum means supporting children as they build their own intellectual structures<ul>
<li>Planting new constructive elements</li>
<li>Eliminating noxious ones</li>
</ul>
</li>
<li>This is an ambitious task, and harder that a mere curriculum change</li>
<li>Educators should be anthropologists and work with the cultural materials of the time</li>
<li>He doesn&#39;t recommend BASIC as a learning language</li>
<li>BASIC is to computation what QWERTY is to typing<ul>
<li>People say BASIC is easy to learn because of its small vocabulary, but that just gets extremely clunky when working on something more than just a toy problem</li>
</ul>
</li>
</ul>
<h3 id="why-is-it-hard-to-change-education">Why is it hard to change education</h3>
<ul>
<li>Radical change is possible, directly tied to the impact of the computer<ul>
<li>Unfortunately, conservatism in the world of education is a self-perpetuating social phenomenon</li>
<li>But as individuals get computers, education can become a private act, an open marketplace, a Renaissance of thinking about education</li>
</ul>
</li>
<li>Our culture has unneeded split between &quot;humanities&quot; and &quot;science&quot;<ul>
<li>But Plato was both</li>
</ul>
</li>
<li>Computer can break down this line</li>
<li>&quot;Math&quot; just means &quot;learning&quot; in Greek<ul>
<li>e.g. &quot;polymath&quot; is a person of many learnings</li>
<li>&quot;Mathetic&quot; means &quot;having to do with &quot;learning&quot;</li>
</ul>
</li>
<li>Children begin their lives as eager and competant learners. They have to learn to have trouble with learning in general and mathematics in particular</li>
<li>Conservation of liquids example from Piaget<ul>
<li>Children take a while to learn this principle</li>
<li>They have their own coherent world view (taller glass must have more liquid)</li>
<li>This model was spontaneously developed by them</li>
</ul>
</li>
<li>Mathophobia limit&#39;s people&#39;s lives. Deficiency becomes part of their identity. It is a self-reinforcing taboo</li>
<li>&quot;Cchool math&quot; is not the same as &quot;mathematics&quot;</li>
</ul>
<h3 id="turtle-geometry">Turtle geometry</h3>
<ul>
<li>There are multiple types of geometry<ul>
<li>Turtle geometry = computational (tracks Position and Heading of the Turtle)</li>
<li>Euclidean geometry = logical (tracks Position and Point)</li>
<li>Descartes geometry = algebraic</li>
</ul>
</li>
<li>Geometry arises when child asks &quot;How can I make the Turtle draw a circle?&quot;<ul>
<li>A good teacher doesn&#39;t answer the question, but encourages the student to act it out. Literally, to have the child &quot;play Turtle&quot; themselves. What steps do they take to move in a circle?</li>
</ul>
</li>
<li>Learning to &quot;program computers&quot; is done by teaching the Turtle a new word (aka subroutine / function) like CIRCLE, SQUARE, TRIANGLE</li>
<li>Along the way, students learn about <strong>modularity</strong> and <strong>state</strong></li>
<li>Don&#39;t forget the error - instead study the bugs!</li>
<li>Try to make sense of what you want to learn</li>
<li><strong>Syntonic learning</strong><ul>
<li>The Turtle is body syntonic - firmly related to child&#39;s sense and knowledge about their own bodies</li>
<li>Also is &quot;ego syntonic&quot; - the Turtle is coherent with child&#39;s sense of themselves with things like (e.g. intentions, goals, desires, dislikes)</li>
</ul>
</li>
<li>Turtle geometry is learnable because it is syntonic.</li>
<li>Turtle geometry encourages deliberate use of problem-solving</li>
<li><strong>George Polya</strong><ul>
<li>Came up with a general method for problem solving</li>
<li>Turtle geometry lends itself well to Polya&#39;s methods (e.g. &quot;look for something like it&quot;)</li>
<li>Turtle geometry is great for learning heuristic thinking</li>
</ul>
</li>
<li>Disassociative learning is something like memorizing the multiplication tables</li>
<li>Bill, a fifth grader, suggests this unfortunate way to learn multiplication tables<ul>
<li>&quot;Make your mind a blank and saying it over and over until you know it&quot;</li>
</ul>
</li>
<li>Turtle geometry on the other hand has rhythm, movement, navigational knowledger</li>
<li>Differential Calculus<ul>
<li>Differential calculus is ability to describe growth by what is happening at the growing tip</li>
<li>Newton modeled the motions of the planets with it</li>
<li>The Turtle&#39;s circle program ( FORWARD 1, RIGHTTURN 1) is a set of DIFFERENTIAL instructions!</li>
</ul>
</li>
<li>Many students come to Turtle geometry hating numbers as alien concepts, and leave it loving them. For example, angles.<ul>
<li>Turtle geometry shows students that angles have body syntoncity with compass navigation. The Turtle parallels this</li>
</ul>
</li>
<li>Idea of a &quot;variable&quot; in programming: using a symbol to name an unknown entity</li>
<li>Idea of &quot;recursion&quot; in programming: a never ending process.<ul>
<li>Kids already love the idea / fantasy of something &quot;going on forever&quot; (with 2 wishes, always use the second wish to wish for two more wishes!)3</li>
</ul>
</li>
<li>The Total Turtle Trip Theorem<ul>
<li>If a Turtle tasks a trip around the boundaries of any area and ends up in the state in which it started (direction and place), then the sum of all the turns will be 360 degrees</li>
</ul>
</li>
<li>One learns to enjoy and to respect the power of powerful ideas. One learns that the most powerful idea is the idea of powerful ideas.</li>
<li>Computers can influence the language we use to talk about ourselves (e.g. input, output, feedback)</li>
</ul>
<h3 id="structure-programming">Structure programming</h3>
<ul>
<li>Learn to write subprocedures, aka &quot;mind-sized bites&quot;</li>
<li>It&#39;s possible to build a large intellectual system without ever making a step that cannot be comprehended, using hierachy of subprocedures</li>
<li>Example of teaching the Turtle to draw a person can use multiple subprocedures, each of which is easily understood</li>
<li>Computers give enough flexibility and power so that child&#39;s exploration can be genuine and their own</li>
<li>&quot;Brute force&quot; would be trying to have the Turtle draw the person without any subprocedures - the straight line approach.</li>
<li>Brute force with no internal structure is not a good model for computer programming</li>
<li>For example, in real life, juggling is actually composed of many subroutines</li>
<li>Introduces notion of timing:
`* parallel processes vs serial processes</li>
<li>Introduce notion of condition logic with The &quot;WHEN demon&quot;</li>
<li>&quot;When something happens, the demon pounces out and does its own action&quot;</li>
</ul>
<h3 id="debugging">Debugging</h3>
<ul>
<li>Children seem to have a resistance to debugging</li>
<li>They would rather &quot;throw it out&quot; and start over</li>
<li>Seemingly, they want to do it correctly in one shot</li>
<li>We can empathize, because a bug seems like WRONG or MISTAKE or BAG</li>
<li>Kids like that computers can remove any trace of their errors</li>
<li>But errors and debugging are good!</li>
<li>We must learn to study what happened and understand what went wrong. Through that understanding, we can fix the bug.</li>
<li>Computers will help children &quot;believe in&quot; debugging</li>
<li>Contact with LOGO and the Turtle eventually, gradually, underminds the long-standing resistance to debugging and subprocedures</li>
<li>With LOGO, the teacher is also a learner, and everyone makes mistakes</li>
<li>Children know when teacher &quot;fakes it&quot; with &quot;let&#39;s try this one together&quot; - they see right through this.</li>
<li>But LOGO makes that situation feel genuine, because the teacher is trying to figure it out, too, and they make mistakes together</li>
<li>Real intellectual collaboration - together they try to understand the computer and get it to do what they want</li>
<li>Affirmation of the power of ideas and the power of the mind!</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/mindstorms</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/mindstorms</guid>
            <pubDate>Sun, 03 May 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA['Escaping Web' Season One Retrospective]]></title>
            <description><![CDATA[<p>My friend <a href="https://twitter.com/oznova_">Oz Nova</a> and I started a podcast last year called <a href="https://escapingweb.github.io/">Escaping Web</a>. With a million and one podcasts out there, you might be wondering about our catchy tagline? Our special hook? Our unique... perspective?</p>
<blockquote>
<p>Escaping Web is a show celebrating software engineers who&#39;ve found their calling beyond routine web development.</p>
</blockquote>
<p>The idea for the podcast began with the observation that most engineers who &quot;break into tech&quot; (read: bootcamp grads or &quot;non-traditional&quot; aka non-CS degree backgrounds) typically begin their careers with web development roles (👋 hi!), and that these engineers often find themselves in a rut after a year or two. Bored at work. Feeling unfulfilled. Looking for something more... (name your favorite Disney or Pixar &quot;I want...&quot; song).</p>
<p>As the head of <a href="https://bradfieldcs.com/">Bradfield School of Computer Science</a> (an online school for working software engineers &quot;seeking mastery&quot;), Oz meets lots of interesting characters who fit this mold -- and many who&#39;ve broken out... into fields like graphics, quantum computing, database design, etc.</p>
<p>Our podcast interviews these engineers to learn what makes the tick, and more importantly, how they found something that they&#39;re passionate about at work. Was it a six-month sabbatical to intensely study computer architecture or discrete mathemathics? Or something else?</p>
<p>Mostly, Escaping Web is a podcast about learning how to learn how to learn.</p>
<p>We recorded six episodes last year with six amazing individuals. You can find more details and links to the audio below, along with the voluminous shownotes (which grew and grew with each episode).</p>
<p>We recently decided to put the show on indefinite hiatus (don&#39;t worry, I&#39;m calling it Season One), and I&#39;ll use the next section of this post to go through some of my own learnings about starting a podcast in 2019.</p>
<h2 id="starting-a-podcast">Starting a podcast</h2>
<p>It&#39;s easy! Everyone says that, and I pretty much agree. Here&#39;s a simple list of the things you need to do to release your own podcast:</p>
<ol>
<li>Record one or two episodes of audio</li>
<li>Edit them (optional)</li>
<li>Upload them somewhere on the internet that is publically accessible</li>
<li>Generate an RSS feed that can tell podcast directories where to find your audio files</li>
<li>Tell the podcast directories (e.g. iTunes, Google Play, Spotify) the URL of your RSS feed</li>
<li>Line up sponsorships with Squarespace, Linode, and a subscription coffee service (also optional, unfortunately)</li>
</ol>
<p>But that&#39;s it! Podcasting is still an open medium. There are also services that can take care of some of these steps for you. I&#39;ll run through my experiences with each step now.</p>
<h3 id="1-recording-audio">1. Recording audio</h3>
<p>This one should be easy, you&#39;d think. But it&#39;s not. In fact, this one is the primary reason that we went on hiatus. Given the format of our show (bi-weekly interviews with guests), we had a large scheduling onus to coordinate between ourselves and our guest-of-the-week. I think this challenge alone put the pin in &quot;season one&quot; and I think I&#39;ll need to do a better job with coordinating schedules if we resume the show. One thought, which I&#39;m only thinking of now and wish I&#39;d thought of earlier, would be a Calendly link for guests to sign up on.</p>
<p>Even if you&#39;re not doing a guest-of-the-week format, there&#39;s still a mental hurdle to clear of &quot;coming up with something interesting to say&quot; on each episode. That&#39;s where your show theme and host chemistry can really make or break you. Shows like <a href="https://www.flophousepodcast.com/">The Flop House</a> really nail this combo: not only are they individually and collectively hilarious, the &quot;bad-movie-recap-of-the-week&quot; format keeps things interesting and fun every single episode. Similarly, the Apple-oriented <a href="https://atp.fm/">Accidental Tech Podcast</a> has become less about Apple news for me, and more about the trials, tribulations, and just-plain-fun quirks of each of the hosts. This is where podcasts have this dangerous turn as a replacement for human-interaction. When I&#39;m thinking to myself, &quot;Oh, Casey, it&#39;s time to get a new computer,&quot; I know that ATP has me hooked. I&#39;m happily hooked, but hooked nonetheless.</p>
<p>If you do give Escaping Web a listen, you might agree with me that I think we missed the mark on developing host chemistry. We don&#39;t really have any <a href="https://mykewasright.com/post/159678908546/follow-up">Siracusan &quot;follow-up&quot;</a> segment to provide weekly continuity (and highlight the strange things in our personalities that keep us up at night). There&#39;s also no regular cadence on what &quot;Oz and Charlie are up to.&quot;</p>
<p>I still think we went the right way with the interview format for our show, but I&#39;d love to strike a better balance in the future. A show like <a href="https://daringfireball.net/thetalkshow/">John Gruber&#39;s The Talk Show</a> does this incredibly well. It&#39;s an interview show with a short rotating cast of characters, which makes it feel contiguous. For example, I know that John has a stack of like 400 bundles of firewood in his garage because of an accidental Amazon overpurchase. It&#39;s this kind of magic that you seek.</p>
<p>Weren&#39;t we supposed to be talking about recording audio? Oh, right. There are two formats for this, one of which should be ignored given our current collective quarantining:</p>
<ol>
<li>In-person, each with an individual mic and headphones</li>
<li>Over Skype, using Skype Call Recorder (and Piezo as a backup)</li>
</ol>
<p>The goal here is to get separate tracks for each speaker so that you can mix and edit them separately. In the case of Escaping Web, we went with an unfortunate third option:</p>
<ol start="3">
<li>In-person, sharing one mic with no headphones (and occasionally over Skype with Charlie and Oz sharing one mic)</li>
</ol>
<p>Why? Why, oh why, did we go this route?</p>
<p>Mostly because Oz already had this big ol&#39; Blue Yeti mic, and we didn&#39;t want to invest more in a more expensive rig. This was probably (definitely) a mistake, which you can hear in some of the episodes like Grant&#39;s (sorry, Grant!). When you have one mic, even if it&#39;s a &quot;good one&quot;, it&#39;s impossible to get the voices right. </p>
<p>I, for one, am extremely loud. Oz, not so much. Our guests, somewhere in between. Can&#39;t you just fix this on the editing floor? Maybe... if you know what you&#39;re doing (I don&#39;t). Take this advice: like The Beatles discovered in the &#39;60s, magic can happen in the studio edits when you&#39;ve got multiple tracks to record on.</p>
<p>I&#39;ve gone on quite a bit already, and we&#39;re still in section one, but I should mention something about the Skype recording experience. It&#39;s great! I always hear podcast hosts grumbling something or other about Skype, so I was happy to discover that the experience of recording with <a href="https://www.ecamm.com/mac/callrecorder/">Skype Call Recorder</a> was seamless. It automatically splits your call into multiple tracks. I also fired up <a href="https://rogueamoeba.com/piezo/">Piezo</a> as a backup. We didn&#39;t go the full-redundancy route of having each person record their own audio and send it back to me, and we never got burned by this. But I can understand why this important. Also, we didn&#39;t go the route of ensuring that our remote guests had any sort of quality mics or anything like that. Maybe this is why <a href="https://www.npr.org/programs/fresh-air/">Terry Gross</a> has her guests go into a radio studio for their interviews. In our case, it was hard enough to align schedules that sending over recording equipment to our guests would have been a clear no-go.</p>
<h3 id="2-editing-audio">2. Editing audio</h3>
<p>This can be another rabbit hole time-warp. But it&#39;s also not that bad, and maybe even fun.</p>
<p>Our shows ran about an hour or so, which meant we had about 90 minutes of audio, give-or-take. My goal was always to try to edit the show the same night that we recorded it. I wanted to just get it done. This worked the first few times, but less so after a while after the excitement of the first few episodes wore off. The edits became a looming thing on my to-do list for the next few days. One of those to-do&#39;s that&#39;s not that that hard... um, to do, but you&#39;ve just got to sit down and do it. And ain&#39;t that just the challenge of all to-do lists?</p>
<p>So, what is editing? I&#39;m not totally sure. Here&#39;s what I tried to do:</p>
<ul>
<li>Remove weird loud noises and pops</li>
<li>Remove background hum (the Bradfield office had an nice air conditioner thrumming at all times)</li>
<li>Equalize and condense the tracks</li>
<li>Make a funny intro segment (with music!)</li>
</ul>
<p>My tools were the free and awesome Audacity (I&#39;m not sure if this works just yet on MacOS Catalina) and Apple Logic (although you could use the free GarageBand just as easily). I watched a few YouTube videos on editing podcasts, plunked around and did my best. The sound quality is pretty bad on some of the episodes. Someone with real editing chops could have made them sound better, but I think the real culprit was the lack of quality mic-ing of our voices.</p>
<p>Admittedly, the thing I looked forward to most about the edits was coming up a variation on our intro music theme that I &quot;composed&quot; with the on-screen keyboard in Logic. I like to make weird little songs on Logic/Garageband while on flights, and this was too good an opportunity not to get a little musical and a little weird. Each episode is different. I hope you like them! </p>
<h3 id="3-4-hosting-files-and-generating-rss-feed">3-4. Hosting files and generating RSS feed</h3>
<p>Now we&#39;re into what &quot;folks in the biz&quot; call &quot;podcast hosting.&quot; I combined items 3 and 4 because these tend to go hand-in-hand.</p>
<p>There are many podcast hosting companies out there. If you&#39;re following along, time was our biggest constraint in this entire endeavor, so we decided to outsource this part of the process rather than whip something together ourselves. </p>
<p>I chose <a href="https://transistor.fm/?via=charles">Transistor.FM</a> for our podcast host. I listen to their maker podcast <a href="https://saas.transistor.fm/?via=charles">Build Your SASS</a>, and I&#39;ve loved following along with Justin and Jon as they document their challenges and wins and concerns as they build Transistor from the ground up. In addition to making it really easy to upload your audio and generate your RSS feed, Transistor also provides (1) an automatic website generater for your show and (2) a listener analytic dashboard. They also provided fantastic customer support when I had a few questions about the process. Definitely worth the $20 a month for our young, growing show.</p>
<p>Unfortunately, now that we&#39;ve gone on hiatus and we don&#39;t know when we&#39;ll record our next episode, we decided to cancel our subscription. I&#39;ve finally done the work of hacking together a simple solution to maintain an RSS feed for our show using public GitHub Pages repos to host our RSS feed and audio files. I think this will work fine, unless we suddenly get a ton of listeners out of the blue. But given what I saw in the Transistor analytics, I think we&#39;ll be okay for now.</p>
<h3 id="5-adding-your-rss-feed-to-the-directories">5. Adding your RSS feed to the directories</h3>
<p>One slight bummer is that, even with a podcast hosting service, you still need to submit your show to all the different providers separately. These are places like iTunes, Spotify, and Google. There&#39;s a few more, too. Stitcher is one. I don&#39;t know all of them off of the top of my head, but there are definitely a few more places that you can share your show. Still, the iTunes directory, Spotify, and Google are the big three that &quot;matter.&quot;</p>
<p>This is mainly a bummer in that, if you&#39;ve made it this far, you&#39;re ready for your show to hit the world by storm! Don&#39;t forget to allocate enough time for your podcast to be (1) approved by iTunes and (2) appear in iTunes. If you&#39;re somebody who&#39;s expecting a big &quot;launch day&quot;, be aware that this can take something like a week or so.</p>
<p>To take the other side of this, I&#39;ve actually now found it to be an advantage to have a direct relationship with each of the podcast directories, because I&#39;ve been able to easily update the URL of <a href="https://escapingweb.github.io/rss/feed.rss">our RSS feed</a> to my new GitHub pages solution.</p>
<p>Oh! Also, your show needs show art. Here&#39;s what I sketched up for Escaping Web, and Oz (for some strange reason) loved it, too.</p>
<p><img src="https://www.charlieharrington.com/img/ew.jpg" alt="ewlogo"></p>
<p>Our spider has a Nand gate on its back. Cute.</p>
<h3 id="6-finding-sponsors">6. Finding sponsors!</h3>
<p>Whoops. We never did this one. This is especially unfortunate, because I think I&#39;d do a great ad-read.</p>
<p>Promotion is hard, in general. Not just for podcasts. Maybe obscure cream can rise to the top amid the noise vortex (mixed metaphor?), and I think we were at least semi-creamy, and now I&#39;ve lost my train of thought. But... yeah, we didn&#39;t focus on promotion and I think we could have done a better job at this. I give us a thumbs-down on this effort.</p>
<p>We did set up a Twitter account for the show (<a href="https://twitter.com/escapingweb">@escapingweb</a>), and Transistor helped by auto-tweeting each new episode as soon it went live. I also tried to get the companies of our guests to re-tweet us, but this was only semi-successful. Like I said (did I say this?), content marketing is hard. We just wanted to talk to interesting people and put our show out there to the world for people to hear it. And we achieved that, so that&#39;s nice.</p>
<p>In fact, I wanted to share some of the things that folks Tweeted about our show that make me happy:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Highly recommend the <a href="https://twitter.com/EscapingWeb?ref_src=twsrc%5Etfw">@EscapingWeb</a> podcast for any programmers out there <br><br>Lots of great stories from folks who entered the field untraditional and are killing it 💪🏼<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/coding?src=hash&amp;ref_src=twsrc%5Etfw">#coding</a> <a href="https://twitter.com/hashtag/webDev?src=hash&amp;ref_src=twsrc%5Etfw">#webDev</a> <a href="https://t.co/eolaWhEl4U">https://t.co/eolaWhEl4U</a></p>&mdash; Clifford Fajardo (@CliffordFajard0) <a href="https://twitter.com/CliffordFajard0/status/1169634884081483778?ref_src=twsrc%5Etfw">September 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Agreed. <a href="https://twitter.com/EscapingWeb?ref_src=twsrc%5Etfw">@EscapingWeb</a> is one of my favorite podcasts. Excited to listen to the latest episode! <a href="https://t.co/h9xIyZ0klz">https://t.co/h9xIyZ0klz</a></p>&mdash; Madison Kanna (@Madisonkanna) <a href="https://twitter.com/Madisonkanna/status/1169748861734141953?ref_src=twsrc%5Etfw">September 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Great episode, but it was really difficult to hear Grant</p>&mdash; Vegard Stikbakke (@vegardstikbakke) <a href="https://twitter.com/vegardstikbakke/status/1197577967884492805?ref_src=twsrc%5Etfw">November 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Yes, I know, I know. The audio on the Grant episode is the worst. I&#39;m sorry, world. But thank you to everyone who tweeted about the show and shared with their friends.</p>
<p>Also, everyone says that leaving ratings on iTunes is &quot;super-helpful&quot;, and I encouraged some folks to do that. We got thirteen 5-star reviews. Is that good? Probably not. But at least they were all fives! Two of my close friends even left a nice written review, and also one person I don&#39;t recognize at the moment (but probably also know personally).</p>
<p><img src="https://www.charlieharrington.com/img/itunesratings.png" alt="itunesratings"></p>
<p>Still, these tweets and these ratings and the personal texts we both received meant a lot to me and Oz. So, thank you!</p>
<h2 id="what-i-learned-from-season-one-of-escaping-web-other-than-how-to-make-a-podcast">What I learned from season one of Escaping Web (other than how to make a podcast)</h2>
<p><strong>Interviewing is challenging.</strong> Duh. But I really thought that I&#39;d be pretty good at this right away, and I wasn&#39;t. It&#39;s a craft that demands practice. I hope to do more of it in the future, if you&#39;ll allow.</p>
<p><strong>Take to time to explore things deeply.</strong> This is critical to finding your path at work, in life, in the woods, wherever. And, yet, it&#39;s so hard to do this if you have a Nintendo Switch (that&#39;s why I still only have a Super Nintendo). Our guests found this time in many different ways (from sabbaticals to switching teams at work to taking online courses).</p>
<p><strong>Find a friend who&#39;s way smarter than you and spend time with them.</strong> This is me talking about Oz, by the way. Every time I hang out with Oz, I learn something about computers or education or whatever that blows my mind and leaves with an even bigger backlog reading list. Thanks for season one, Oz!</p>
<p>And, with that, the retrospective is complete! Onto the shownotes and audio. There are links to amazing things below, and I hope you find them useful in your travels. Here&#39;s a short preview of the ones that kept coming up again and again, which probably means something that I&#39;ll leave to the reader as an exercise:</p>
<ul>
<li><a href="https://www.cs.virginia.edu/~robins/YouAndYourResearch.html">You and Your Research - Richard Hamming</a></li>
<li><a href="https://en.wikipedia.org/wiki/How_to_Solve_It">How to Solve It - George Polya</a></li>
<li><a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html">SICP</a></li>
<li><a href="https://www.nand2tetris.org/">Nand2Tetris</a></li>
<li><a href="https://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202">Flow: The Pyschology of Optimal Experience by Mihaly Csikszentmihalyi</a></li>
</ul>
<h2 id="shownotes-and-audio-for-escaping-web">Shownotes and audio for Escaping Web</h2>
<h3 id="1-a-quantum-of-sad-things-happening-to-felix-tripier-of-ionq">1: A Quantum of Sad Things Happening To Felix Tripier of IonQ</h3>
<p>Felix Tripier is a software engineer at a quantum computing company. He&#39;s also eating cold lasagna out of a coffee mug.</p>
<blockquote>
<p>Find out how Felix Tripier went from high-school and college dropout (watch out Silicon Valley, he&#39;s a double-dropout) to working as web developer at several Bay Area startups to presenting his open-source research at a quantum computing conference, leading to his current gig as a software engineer at IonQ, a quantum computing company. Charlie and Oz dig into Felix&#39;s study habits and learning goals, briefly dip into theoretical computing topics before coming up for air, and altogether forget to introduce themselves, Felix, or the podcast itself.</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/001_a_quantum_of_sad_things_happening_to_felix_tripier_of_ionq.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Grave_of_the_Fireflies">Grave of the Fireflies</a></li>
<li>Richard Hamming, &quot;You And Your Research&quot;<ul>
<li><a href="https://www.cs.virginia.edu/~robins/YouAndYourResearch.html">Transcript</a></li>
<li><a href="https://www.youtube.com/watch?v=a1zDuOPkMSw">Video</a></li>
</ul>
</li>
<li><a href="https://github.com/ftripier/Q-bug">Q-Bug: Felix&#39;s open source, web-based visual debugger for Quil quantum programs</a></li>
<li><a href="https://twitter.com/FelixTripier%22">Felix Tripier on Twitter</a></li>
</ul>
<h3 id="2-epic-slacking-with-roo-harrigan-of-slack">2: Epic Slacking with Roo Harrigan of Slack</h3>
<p>Roo Harrigan is the Strategic Engineering Projects Lead at Slack. She’s also the self-proclaimed Mentor Queen.</p>
<blockquote>
<p>Find out how Roo Harrigan went from an all-around generalist (product manager, project manager, sales demo&#39;er, customer support agent) to a software engineer on the platform team at Slack, and now the Strategic Engineering Projects Lead reporting to Slack&#39;s CTO. Charlie and Oz dig into about Roo&#39;s tips for finding mentors, achieving flow state, and onboarding engineers. We also learn that Oz has never worked in the food services industry. Oh, and they remember to introduce themselves and Roo at the beginning. Progress!</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/002_epic_slacking_with_roo_harrigan_of_slack.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://medium.com/hackbright-capstone/day-29-30-and-beyond-reflections-on-the-first-thing-i-made-2f9e2660a04a">Roo&#39;s 2015 blog post about becoming an engineer</a></li>
<li><a href="http://frontsttrattoria.com/">Front St. Trattoria, Red Bank, New Jersey</a></li>
<li><a href="https://hackbrightacademy.com/">Hackbright Academy</a></li>
<li><a href="https://get.slack.help/hc/en-us/articles/208423427-Set-a-reminder">Slack Reminders: Roo&#39;s first project at Slack</a></li>
<li><a href="https://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202">Flow: The Pyschology of Optimal Experience by Mihaly Csikszentmihalyi</a></li>
<li><a href="https://twitter.com/roo_harrigan">Roo Harrigan on Twitter</a></li>
</ul>
<h3 id="3-getting-time-serious-with-richie-artoul-of-uber">3: Getting Time Serious with Richie Artoul of Uber</h3>
<p>Richie Artoul is a software engineer on Uber&#39;s Observability infrastructure team. He also really likes distributed timeseries databases, like a lot.</p>
<blockquote>
<p>Find out how Richie Artoul went from bootcamp grad to infrastructure engineer at Uber, where he&#39;s now building their open source metrics platform M3 and their open source distributed timeseries database M3DB. Charlie and Oz dive into Richie&#39;s tips for side projects, reading programming textbooks, finding mentors at work, and navigating large engineering orgs like Uber. We also learn that Richie recently took up Jiu-Jitsu (just like Oz) - and now Charlie&#39;s hoping for a Vader / Obi Wan style &quot;roll&quot; in their future.</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/003_getting_time_serious_with_richie_artoul_of_uber.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://eng.uber.com/optimizing-m3/">Optimizing MS: How Uber Halved Our Metrics Ingestion Latency by (Briefly) Forking the Go Compiler (Richie&#39;s post on the Uber engineering blog)</a></li>
<li><a href="https://m3db.io/">M3 &amp; M3DB</a></li>
<li><a href="https://www.nand2tetris.org/">Nand2Tetris</a></li>
<li><a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging">Rubber duck debugging</a></li>
<li><a href="https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">DynamoDB paper</a></li>
<li><a href="https://www.foundationdb.org/">FoundationDB</a></li>
<li><a href="https://jvns.ca/blog/brag-documents/">Write a brag document - Julia Evans</a></li>
<li><a href="https://twitter.com/richardartoul">Richie Artoul on Twitter</a></li>
</ul>
<h3 id="4-a-graphics-conversation-with-lauren-budorick-of-figma">4: A Graphic(s) Conversation with Lauren Budorick of Figma</h3>
<p>Lauren Budorick is Graphics Software Engineer at Figma. She’s also read the 1989a .gif spec, yet still refuses to pronounce them as &quot;JIFs.&quot;</p>
<blockquote>
<p>Find out how Lauren went from bootcamp grad to Graphics Software Engineer, first at Mapbox and now at Figma, where she&#39;s building their prototyping rendering engine. Charlie and Oz dig into Lauren&#39;s tips for learning linear algebra, how to see everything in the world as a triangle, and navigating a company without managers. Charlie and Oz also each try to recount stories of &quot;achieving the impossible&quot;, and both painfully fail to remember the exact details of their anecdotes.</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/004_a_graphics_conversation_with_lauren_budorick_of_figma.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://twitter.com/lbudorick/status/1149118970932281344">Lauren’s 😢.gif tweet</a></li>
<li><a href="https://www.w3.org/Graphics/GIF/spec-gif89a.txt">The 1989 .gif spec (which is still the latest release!)</a></li>
<li><a href="http://www.olsenhome.com/gif/BOB_89A.GIF">Demo of the 1989 .gif spec (as rendered by a modern browser)</a></li>
<li><a href="http://ata4.github.io/gifiddle/#http://www.olsenhome.com/gif/BOB_89A.GIF">Demo of the 1989 .gif spec (as it was intended, in all its feature-laden glory)</a></li>
<li><a href="https://www.theatlantic.com/technology/archive/2019/03/hottest-chat-app-teens-google-docs/584857/">The hottest chap app for teens is... Google Docs - by Taylor Lorenz</a></li>
<li><a href="https://www.youtube.com/watch?v=Opzomu6mgYk">The Story of the SuperFX Chip: The chip that made Star Fox on the Super Nintendo possible</a></li>
<li><a href="https://www.goodreads.com/book/show/7090.The_Soul_of_a_New_Machine">The Soul of a New Machine</a></li>
<li><a href="https://www.youtube.com/watch?v=YFGY2BeyfzA">Lauren’s talk at Nordic.js (The Matrix is Everywhere: A primer on projections in Web Graphics)</a></li>
<li><a href="https://www.3blue1brown.com/essence-of-linear-algebra-page">3Blue1Brown Linear Algebra YouTube series</a></li>
<li><a href="https://www.figma.com/">Figma</a></li>
<li><a href="https://www.figma.com/blog/section/engineering/">Figma&#39;s Engineering blog</a></li>
<li><a href="https://www.mapbox.com/">Mapbox</a></li>
<li><a href="https://hackbrightacademy.com/">Hackbright Academy</a></li>
<li><a href="https://www.goodreads.com/book/show/222146.Masters_of_Doom">Masters of Doom</a></li>
<li><a href="https://twitter.com/lbudorick">Lauren Budorick on Twitter</a></li>
</ul>
<h3 id="5-learning-your-stripes-with-grant-wu-of-stripe">5: Learning Your Stripes with Grant Wu of Stripe</h3>
<p>Grant Wu is a Software Engineer at Stripe on the Ruby Application Infrastructure team. He also hates scary movies, but still can’t stop himself from reading their IMDB synopses.</p>
<blockquote>
<p>Charlie and Oz dig into Grant’s study habits for self-guided learning (like building a toy kernel and toy compiler) — and how those low-level projects influenced his path to Stripe. The gang gets into it over bootcamps, baking bread, and learning to play music — all with the broader theme of exploring what it means to be creative. To top it off, we learn that Oz has a joint degree in math(s) and the (Australian) law?!</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/005_learning_your_stripes_with_grant_wu_of_stripe.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://stripe.com/">Stripe</a></li>
<li><a href="https://sorbet.org/">Sorbet: Ruby Static Type Checker</a></li>
<li><a href="https://increment.com/">Stripe’s Increment Magazine</a></li>
<li><a href="https://press.stripe.com/">The Dream Machine, Stripe Press</a></li>
<li><a href="https://www.goodreads.com/book/show/830502.It">IT by Stephen King</a></li>
<li><a href="http://teachyourselfcs.com/">teachyourselfcs.com</a></li>
<li><a href="https://www.youtube.com/watch?v=v7s8m_-sA-Y">Matt O’Ree (Charlie’s guitar teacher in 8th grade and winner of the 2006 Guitar Center King of The Blues)</a></li>
<li><a href="https://www.amazon.com/Flow-Psychology-Experience-Perennial-Classics/dp/0061339202">Flow: The Psychology of Optimal Experience by Mihaly Csikszentmihalyi (second time that Oz recommended this book!)</a></li>
<li><a href="https://twitter.com/awkc1996/status/1171792460198174726">What happens when you use Excel for your genetics papers</a></li>
<li><a href="https://www.hackreactor.com/">Hack Reactor</a></li>
<li><a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html">SICP</a></li>
<li><a href="https://github.com/gw">Grant Wu on GitHub</a></li>
<li><a href="https://www.linkedin.com/in/gwu01/">Grant Wu on LinkedIn</a></li>
</ul>
<h3 id="6-algorithmically-speaking-with-elliott-jin-of-triplebyte">6: Algorithmically Speaking with Elliott Jin of Triplebyte</h3>
<p>Elliott Jin is the Interview Team Tech Lead at Triplebyte. You&#39;re gonna hear a lot about Project Euler in this one.</p>
<blockquote>
<p>Charlie and Oz explore Elliott&#39;s path down the various intellectual rabbit holes (mostly Project Euler) that led him to software engineering at Dropbox, teaching the Algorithms course at Bradfield, and now leading Triplebyte&#39;s Interview tech team. Elliott also reveals the correct way to read a textbook (of which Charlie hadn&#39;t the foggiest), and Oz and Elliott try to explain to Charlie how they motivate students in their classes through &quot;guided struggle.&quot;</p>
</blockquote>
<audio controls="controls">
  <source type="audio/mp3" src="https://escapingweb.github.io/audio/006_algorithmically_speaking_with_elliott_jin_of_triplebyte.mp3"></source>
</audio>

<p>Links and resources:</p>
<ul>
<li><a href="https://projecteuler.net/">Project Euler</a></li>
<li><a href="https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628%22">K&amp;R C book</a></li>
<li><a href="https://en.wikipedia.org/wiki/Gorillas_(video_game)%22">Gorillas - QBasic</a></li>
<li><a href="https://en.wikipedia.org/wiki/Windows_3.1x%22">Windows 3.1</a></li>
<li><a href="https://en.wikipedia.org/wiki/Drugwars%22">Drugwars (TI-83)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Space_Trader_(Palm_OS)%22">Space Trader</a></li>
<li><a href="https://twitter.com/jessitron/status/1183377840089305089%22">Computer Science Principles: Table of Contents tweet</a></li>
<li><a href="https://web.nmsu.edu/~davidp/hpm-subm-2012-number-theory-course.pdf%22">Teaching Number Theory from Sophie Germain&#39;s Manuscripts: syllabus by David Pengelly</a></li>
<li><a href="https://en.wikipedia.org/wiki/How_to_Solve_It%22">How to Solve It - George Polya</a></li>
<li><a href="http://pleasingfungus.com/Silicon%20Zeroes/%22">Silicon Zeroes game</a></li>
<li><a href="https://en.wikipedia.org/wiki/The_Diamond_Age%22">The Diamond Age - Neal Stephenson</a></li>
<li><a href="https://www.amazon.com/Computability-Logic-George-S-Boolos/dp/0521701465%22">Computability and Logic</a></li>
<li><a href="https://www.amazon.com/Elements-Programming-Alexander-Stepanov/dp/032163537X%22">Elements of Programming</a></li>
<li><a href="https://mitpress.mit.edu/sites/default/files/sicp/index.html%22">SICP</a></li>
<li><a href="http://augmentingcognition.com/ltm.html%22">Augmenting Long-term Memory: Michael Nielsen</a></li>
<li><a href="https://www.amazon.com/Mind-Play-Shannon-Invented-Information/dp/1476766681%22">A Mind at Play (Claude Shannon biography) - Jimmy Soni and Rob Goodman</a></li>
<li><a href="https://thebitplayer.com/%22">The Bit Player (Claude Shannon movie)</a></li>
<li><a href="https://en.wikipedia.org/wiki/Useless_machine%22">Shannon&#39;s ultimate machine</a></li>
<li><a href="https://www.dropbox.com"/">Dropbox</a></li>
<li><a href="https://en.wikipedia.org/wiki/Formative_assessment%22">Formative assessment Wikipedia article</a></li>
<li><a href="https://triplebyte.com/%22">Triplebyte</a></li>
<li><a href="https://github.com/robot-dreams%22">Elliott Jin on GitHub</a></li>
<li><a href="https://medium.com/@robot_dreams%22">Elliott Jin on Medium</a></li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/escaping-web-season-one-retrospective</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/escaping-web-season-one-retrospective</guid>
            <pubDate>Sun, 29 Mar 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Notes on Map and Compass Navigation]]></title>
            <description><![CDATA[<p>Prior to the shelter-in-place quarantine, my friend Jason and I had been going on what I like to call &quot;sixth grade classtrips&quot; to various nerdy sites of interest in the Bay Area. First on our list was the Nike Missile site, which is right over the Golden Gate Bridge in Marin. I&#39;ll share my notes on that one soon. Our next big classtrip was scheduled to be the Stanford Linear Particle Accelerator Center in Menlo Park (maybe you&#39;ve seen the signs for this on the highway and wondered...), but that&#39;s first on our list once everything&#39;s safe again.</p>
<p>After the Nike Missile site, we decided to take a course on map &amp; compass navigation through REI. Here&#39;s what we learned in four brisk hours standing on a field in Palo Alto:</p>
<h2 id="maps">Maps</h2>
<ul>
<li><p>Using a map is about using <strong>filters</strong> to reduce your search area</p>
</li>
<li><p>Download <a href="https://www.usgs.gov/products/maps/topo-maps">free USGS maps</a>! Print online with <a href="https://caltopo.com/">Caltopo</a>. Best scale is 7 &amp; 1/2 minute (there are 60 minutes in a degree)</p>
</li>
<li><p>SCOPE acronym:</p>
<ul>
<li>shape</li>
<li>color</li>
<li>orientation</li>
<li>proportion (aka distance)</li>
</ul>
</li>
<li><p>You don&#39;t have to go in order of the acronym!</p>
</li>
</ul>
<h3 id="shape">Shape</h3>
<ul>
<li><p>Look for valleys, ridges, hills with flat tops, gulleys, hills in a row (e.g. 3 hills in a straight line), shape of the tree line</p>
</li>
<li><p>Hidden Valley Ranch Salad Dressing</p>
<ul>
<li>Another acronym. Used by the &quot;military&quot;</li>
<li>Hills Valleys Ridges Spurs Depressions</li>
<li>These are the landshapes to look for on your map and in the area</li>
</ul>
</li>
</ul>
<h3 id="color">Color</h3>
<ul>
<li><p>green = trees, white = not trees</p>
</li>
<li><p>How to tell if you&#39;re in trees? Look up, if you see branches, you&#39;re in a green area of the map</p>
</li>
<li><p>Sometimes white areas will have scrub brushes and plantlife, don&#39;t be confused</p>
</li>
<li><p>Sometimes the tops of green hills will have white scrub / chaparral areas</p>
</li>
<li><p>red or black indicates a human-made object</p>
</li>
<li><p>trails are often not on a map. Many of the surveys were done decades ago, before these trails</p>
</li>
</ul>
<h3 id="orientation">Orientation</h3>
<ul>
<li><p>Use compass to orient the map, then place the map on the ground. This allows you to walk around the map in any direction and see the same things in real-life as the map</p>
</li>
<li><p>Maps usually point North</p>
</li>
</ul>
<h3 id="proportion-distance">Proportion (Distance)</h3>
<ul>
<li><p>Measured as the crow flies, not on the ground</p>
</li>
<li><p>Maps have a scale on them</p>
</li>
<li><p>You can use the string of your compass to trace a trail, and then make the string straight and taut to get the distance of a trail using the map&#39;s ruler / scale</p>
</li>
<li><p>Good skill to learn: look at object in the distance and estimate the distance. Use a range and keep getting tighter (e.g. it&#39;s somewhere between 10 ft and a mile away)</p>
</li>
<li><p>Make sure you know if your map is in miles or kilometers</p>
</li>
</ul>
<h3 id="elevation">Elevation</h3>
<ul>
<li><p>Measures vertical distance above sea level in feet</p>
</li>
<li><p>5280 feet in a mile</p>
</li>
<li><p>Contour lines have a standard elevation gap between them (e.g. 40 ft), but the land between them can fluctuate in real life as you pass through them (it&#39;s not a smooth linear ascent)</p>
</li>
<li><p>Maps have &quot;index&quot; contour lines that state their elevation</p>
</li>
<li><p>&quot;Intermediate&quot; contour lines don&#39;t state their elevation, but can be inferred from the index lines</p>
</li>
<li><p>When lines are close together = STEEP!</p>
</li>
<li><p>Fun experiment: slice a potato to measure contour lines! <em>Note I did this when I got home, as you can see here:</em></p>
</li>
</ul>
<p><img src="https://www.charlieharrington.com/img/p1.jpg" alt="potato1"></p>
<p><img src="https://www.charlieharrington.com/img/p2.jpg" alt="potato1"></p>
<p><img src="https://www.charlieharrington.com/img/p5.jpg" alt="potato5"></p>
<ul>
<li>Contour lines are shaped like upside down V when there is a small creek valley. The V points uphill, away from the water direction</li>
</ul>
<p><img src="https://www.charlieharrington.com/img/v.jpg" alt="vshape"></p>
<ul>
<li>Spurs look like shallow U shapes</li>
</ul>
<h2 id="compass">Compass</h2>
<ul>
<li><p>Four skills to learn:</p>
</li>
<li><p>Real World</p>
<ul>
<li>(1) Follow a field bearing</li>
<li>(2) Take a bearing of an object</li>
</ul>
</li>
<li><p>&quot;Map World&quot;</p>
<ul>
<li>(3) Find object on map and measure angle</li>
<li>(4) Start with angle and draw on the map</li>
</ul>
</li>
<li><p>Angles are always measured clockwise</p>
</li>
</ul>
<p><img src="https://www.charlieharrington.com/img/compass.jpg" alt="compass"></p>
<ul>
<li><p>If you forget the compass directions, it spells &quot;WE&quot; left to right.</p>
</li>
<li><p>True north (north pole) vs Magnetic North (which can move around!)</p>
</li>
<li><p>Declination is number of angles from true north to magnetic north</p>
</li>
<li><p>Always keep your moving needle on the declination</p>
</li>
<li><p>Angle of declination needs to be known for your area (look this up!)</p>
</li>
</ul>
<p><img src="https://www.charlieharrington.com/img/declination.jpg" alt="declination"></p>
<ul>
<li><p>Angle of declination grows larger as you move north</p>
</li>
<li><p>A compass in the Southern hemisphere isn&#39;t going to work very well</p>
</li>
<li><p>North Star does point to true North (only object in sky that doesn&#39;t move as the Earth rotates)</p>
</li>
</ul>
<h2 id="triangulation-my-favorite-part-of-the-class">Triangulation (my favorite part of the class!)</h2>
<ul>
<li><p>Brings it all together! This helps you &quot;locate&quot; yourself on a map.</p>
</li>
<li><p>General overview: Finding your location a map by taking three field bearings, making their angles, and then putting compass on the map and drawing a straight line with their angles</p>
</li>
<li><p>You definitely need to know exactly where the objects of interest are on the map for this to work (e.g. a mountaintop, a water-tower, etc)</p>
</li>
<li><p>Steps:</p>
<ol>
<li> Take bearing of an object by pointing compass at object and moving the dial until the needed is at the angle of declination</li>
<li>Move compass to map and line it up so that it is pointing to angle of declination (but don&#39;t change anything on your compass dial!)</li>
<li>Draw a straight line</li>
<li>Repeat 2 - 3 times with different objects</li>
</ol>
</li>
<li><p>At this point, you should have created a &quot;triangle&quot; where you are likely somewhere inside!</p>
</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/notes-on-map-and-compass-navigation</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/notes-on-map-and-compass-navigation</guid>
            <pubDate>Fri, 27 Mar 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Dean of Discipline]]></title>
            <description><![CDATA[<p>When I first got to Red Bank Catholic High School, I’d hear some manner of the following all the time:</p>
<p>“Your dad is the best”</p>
<p>“Your dad is so scary”</p>
<p>“Your dad is the MAN”</p>
<p>I’d nod along, because often these comments were from some of the more notorious characters at school. But eventually, I cracked:</p>
<p>“Yeah, he is! But wait til you meet him. Because Mr. Harrington isn&#39;t my dad - he&#39;s my UNCLE!”</p>
<p>Yes, I will finally admit here that Uncle Dennis gave me a bit of a head start at RBC. But only by throwing me alongside the summer detention kids as part of the St. James / RBC Maintenance Crew in the summers before freshman, sophomore, and junior years.</p>
<p>To this day, it was the best job I’ve ever had. We smashed walls with a sledgehammer, we scraped gum off carpets with Gum-Freez (and sprayed each other in the arms with it, too), we changed the codes on every single locker. And we got a paycheck for it! One day we were told that there were 3 pigeons on the 4th floor. That was our mission. Good luck!</p>
<p>I learned a lot about my uncle from his other charges in summer detention. Even though this man was their ostensible gate-keeper, they respected and adored him. When I told them that my internment was voluntary, they nodded. They understood.</p>
<p>In my dad’s side of the family, the men are commanding, stubborn, strong, and loyal. (No offense, mom’s side). Grandpa Corn, his brothers Willie, Mike, and Dan, my dad.</p>
<p>Uncle Dennis, Mr. Harrington, is no exception. He breaks the mold.</p>
<p>Perhaps this comes from growing up in 1950s and 60s Keansburg - a place that is in my mind a combination of THE WONDER YEARS, A CHRISTMAS STORY, LEAVE IT TO BEAVER, and, of course, DENNIS THE MENACE.</p>
<p>Getting a HARRINGTON in your morning homeroom wasn’t a curse - it was a blessing. You were invited into that inner sanctum of the cafeteria, that little pod with him and Mr. Mont, and you had your chance to make your stuttering case for the uniform violation or whatnot. But what it really was was a chance to get advice from the paragon of what Red Bank Catholic represents: learning, forgiveness, respect for others, self-dignity, community.</p>
<p>Ask just about any RBC student and they’ll agree.</p>
<p>For the last sixteen years, I’ve received countless out-of-the-blue messages from fellow students about Uncle Dennis.</p>
<p>This is what they say:</p>
<p>“Your uncle is the best.”</p>
<p>“Your uncle saved my life”</p>
<p>“Your uncle is the MAN.”</p>
]]></description>
            <link>https://www.charlieharrington.com/dean-of-discipline</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/dean-of-discipline</guid>
            <pubDate>Sun, 01 Mar 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Bullet Train to Merlin's Grave]]></title>
            <description><![CDATA[<blockquote>
<p>If this is the future, why are you the same?</p>
</blockquote>
<p>My cousin Megeen got married two weeks ago. Instead of the traditional night-before-the-wedding welcome party, she and her now-husband David Pope hosted POPESTOCK - a musical celebration featuring a variety of family-and-friends acts.</p>
<p>It was amazing.</p>
<p>The location for POPESTOCK was the mysterious Elk&#39;s Lodge in Red Bank, New Jersey. This rectangular shack of a building stands next to Riverside Gardens Park with perfect views of the Navesink River - the primo of primo locations in my hometown. For years, my cousins and I have wondered what lay beyond its unassuming doorway. We soon learned the answer: a really big bar and an even bigger empty room. In other words, exactly what we needed.</p>
<p>Uncle Mike and Aunt Susan emceeded the festivities. They had one explicit rule: each act would be limited to one song. We&#39;ve got a lot of musical cousins (see <a href="https://www.buffalorosemusic.com/">Buffalo Rose</a> or <a href="https://www.darkcitystrings.com/">Dark City Strings</a>).</p>
<p>But there were three exceptions to that rule:</p>
<ol>
<li><p>David&#39;s old band <a href="https://lightninging.bandcamp.com/">Lightninging</a> performed the ENTIRE BACKSIDE of Abbey Road, straight-through. It was completely unreal. I felt like I was watching the Beatles, if the Beatles lasted into the 1970s and moved to Brooklyn and also worked at Vinny&#39;s Pizzaria. If you have the means, I highly recommend seeing Lightninging live.</p>
</li>
<li><p>Aunt Eileen (the mother of the bride) and her old friend (along with her son-in-law Greg) played two songs that they wrote years ago, one of which was last performed only at her own wedding. I&#39;ve always been told that Aunt Eileen could give Joni Mitchell a run for her money, and I was told right. Their set was reminiscent of the MUSIC FROM MALLARD concert series that my aunts and uncles put together in the mid-1980s at my Nana and Grandpa&#39;s house on Mallard Road in Middletown, New Jersey. These concerts pre-date my appearance on Earth, but I&#39;ve got a handful of the cassette tapes in my possession and I still wear the MALLARD III t-shirt all the time.</p>
</li>
<li><p>My set.</p>
</li>
</ol>
<p>Although, one could argue (and I did) that my performance was really more of a medley than two distinct songs. Further, I think one could even argue that my set was less of a medley and more of a complete disaster.</p>
<p>Allow me to explain.</p>
<p>I&#39;ve written a six-fingered handful of songs in my life, but the two that seem to echo in eternity are called MERLIN&#39;S GRAVE and BULLET TRAIN. These two have been battle-tested and laughed at across many-a-campfire with my cousins over years.</p>
<p>You see, neither of them are very good. Nor am I a good singer. But you can&#39;t tell me that they aren&#39;t groovy. </p>
<p>My vision for the one-song set was this: I play the entire Merlin&#39;s Grave up to the jam section, which would turn into this epic Mike Oldfield&#39;s Tubular Bells style as I introduce additional instruments, one at a time. First, banjo by my cousin Jack. Then, mandolin by my cousin Michael. Finally, electric guitar by my cousin Peter. To cap it off, I&#39;d come in with some harmonica on top of it all. I put together a quick-and-dirty take of my vision on my laptop a few days before the wedding and emailed it to my cousins, which you can listen to here:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/8UCJSqumSgg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>So far, so good. Simple. One-song. No Bullet Train. I was attempting to be a rules-follower.</p>
<p>But you can&#39;t stop the bullet train once it goes off the rails...</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/WFA1TjSE6L0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>We are <strong>Hotdog Johnny and the Shady Oaks</strong>:</p>
<ul>
<li>Charlie Harrington - Vocals, Acoustic Guitar, Harmonica</li>
<li>Michael Byrnes - Mandolin, Vocals</li>
<li>Jack Byrnes - Banjo</li>
<li>Aidan Byrnes - Drums</li>
<li>Peter Clabby - Electric Guitar</li>
<li>Alex &quot;The Grones&quot; Groneman - Acoustic Guitar</li>
<li>Some dude no one knew - Bass</li>
<li>Tommy Clabby - Sound engineer</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/bullet-train-to-merlins-grave</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/bullet-train-to-merlins-grave</guid>
            <pubDate>Fri, 08 Nov 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[An Afternoon with Arduino]]></title>
            <description><![CDATA[<p>For the last eight years or so, I&#39;ve been carrying around an <a href="https://www.arduino.cc/">Arduino</a> (not literally on my person, but, you know, amongst my treasures), waiting for just the right time to start tinkering with it.</p>
<p>That time, it turns out, was yesterday afternoon. This post outlines some of things I&#39;ve learned so far.</p>
<h3 id="ard-what-now">Ard-what-now?</h3>
<p>An Arduino is a <strong>microcontroller</strong> board. The board contains a CPU (central processing unit) along with some I/O (input / output) connections. You can think about it as a small circuit - a circuit that happens to contain a programmable computer on a chip. A chip that you can learn to easily program.</p>
<p>Here&#39;s a picture of my Arduino (of the <a href="https://store.arduino.cc/usa/arduino-uno-rev3">Uno</a> varietal):</p>
<p><img src="https://www.charlieharrington.com/img/uno.jpg" alt="Uno"></p>
<p>I love the MADE IN ITALY mark in the upper left.</p>
<p>The microprocessor (the computer chip) is the long flat black rectangle near the bottom-right corner of the device. It has 28 pins (14 on each side). Along the top edge of the Arduino you can see a strip of black input pins - these are the Arduino&#39;s &quot;digital&quot; pins (meaning that they can either be &quot;on&quot; or &quot;off&quot;). Below the CPU on the bottom right you can see another 5 &quot;analog&quot; pins (meaning that they can receive analog / continuous signals), and then a few &quot;power&quot; pins to the left to provide voltage, ground, and some other stuff that I don&#39;t know about yet.</p>
<h4 id="arduino-vs-raspberry-pi">Arduino vs Raspberry Pi</h4>
<p>At this point, you might be asking yourself, &quot;How is an Arduino different from a <a href="https://www.raspberrypi.org/">Raspberry Pi</a>?&quot;</p>
<p>It&#39;s a good question, since both are affordable, adorable, tiny little computers that you can buy for about $30 bucks or less. But the Raspberry Pi is a full-on Linux computer. An Arduino is... not. Instead, the Arduino computer holds just one program at a time. It stores this program in durable memory, so that you can turn the Arduino on and off, and it will still &quot;remember&quot; its latest program. It&#39;s more like a single-purpose device -- except you can dream up and build that single-purpose as many times as you want.</p>
<h4 id="open-source-roots">Open-source roots</h4>
<p>The company behind Arduino is a non-profit and the Arduino itself is open-source - which means that anyone can build an Arduino board themselves. The original idea behind Arduino was to make a simple device that designers and artists could use for rapid prototyping of <em>physical computing</em> projects that use <strong>sensors</strong> (aka <em>inputs</em> like a keyboard or mouse or motion detectors) and <strong>actuators</strong> (aka <em>outputs</em> like a display or printer or lights) to interact and communicate with us human beans. Cool.</p>
<p>Arduino is closely tied to the <a href="https://processing.org/">Processing community</a>. In fact, that&#39;s a bit of an understatement, since you actually write Processing code when writing programs for the Arduino -- and, just like in Processing, these programs are also called Sketches. I was happy to see this, since one of my earliest computing classes was <a href="https://twitter.com/blprnt">Jer Thorp</a>&#39;s <a href="http://blog.blprnt.com/workshops">Introduction to Processing course</a> (which I unabashedly recommend, by the way).</p>
<p>As I mentioned, anyone can download the open-source schematics for Arduino and build a board themeselves with basic components. But if you&#39;d like to make your tinkering lifestyle easier, then I suggest picking up a pre-assembled Arduino from a retailer like <a href="https://www.makershed.com/">Makershed</a> or <a href="https://www.adafruit.com/">Adafruit</a>. The kit I bought (eight years ago) is the <a href="https://www.makershed.com/products/make-getting-started-with-arduino-kit-special-edition">MAKE: Getting Started With Arduino Kit</a> -- the current version (v3) appears to be retailing for $79.99 bucks. IMHO, it&#39;s definitely worth it -- the kit comes along with a bunch of goodies that help you get started right away, like a breadboard, colorful wires, clickable switches, LEDs, sensors, and a friendly introductory book. I also picked up <a href="https://www.amazon.com/Arduino-Quick-Start-Guide-Quick-start-Guides/dp/1934356662">Arduino: A Quick-Start Guide</a> by <a href="https://twitter.com/maik_schmidt">Maik Schmidt</a>, and I&#39;ve been enjoying this book as well.</p>
<h3 id="fun-with-leds">Fun with LEDs</h3>
<p>I believe you&#39;re legally required to write a program that blinks an LED on and off as your first project with Arduino.</p>
<p>If you asked me a few days ago about LEDs - yeah, sure, I know about LEDs. Those little red lights in things like my Game Boy. Stands for... light emitting... diode.</p>
<p>Great, you continue, what&#39;s a diode?</p>
<p>Um.</p>
<p>This is already one of the fun things about playing with Arduino. There are all sorts of basic electronics stuff that I sorta know about, but couldn&#39;t explain to a five-year-old or to a <a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging">rubber duck on my desk</a>. Or just don&#39;t know at all. But Arduino is helped me tackle these topics in a practical, tangible way.</p>
<p>So, let&#39;s take a look at an LED together.</p>
<p><img src="https://www.charlieharrington.com/img/led.jpg" alt="LED"></p>
<p>See the longer pin / leg sticking out of the red part? That&#39;s the <strong>anode</strong> terminal. The anode is the positive end of the LED. The shorter leg is the <strong>cathode</strong> - the negative side. Electrons will flow from the anode to the cathode when connected. You&#39;ll want to connect the positive end to something providing voltage, and the negative end needs to be connected to ground. All diodes are polarized, meaning they have these distinct positive and negative sides. And LEDs (light emitting diodes) happen to provide illumination when they&#39;re connected to an active circuit.</p>
<p>And they can be lots of pretty colors, too.</p>
<p>Okay, so here&#39;s our legally-required sketch for blinking an LED connected to digital pin 13 every half-second.</p>
<pre><code class="language-c++">const int LED = 13;

void setup() {
    pinMode(LED, OUTPUT);
}

void loop() {
    digitalWrite(LED, HIGH);
    delay(500);
    digitalWrite(LED, LOW);
    delay(500);
}
</code></pre>
<p>Pretty simple, right? We first declare a constant variable for the pin we&#39;re using. The <code>setup()</code> function will run once per program, right before the <code>loop()</code> kicks off its infinite loop, so we&#39;ll just let the Arduino know that we want to set pin 13 to <code>OUTPUT</code> mode. And then during our infinite loop, we&#39;ll toggle the voltage to the pin by passing <code>HIGH</code> (5 volts) or <code>LOW</code> (0 volts) to our pin 13 using the <code>digitalWrite</code> function, pausing 500 milliseconds between these operations.</p>
<p>If you&#39;re coming from the Processing world, then this program structure of <code>setup()</code> and <code>loop()</code> should look very familiar, since it&#39;s literally the same.</p>
<p>The Arduino IDE provides an easy way to verify your programs compile before flashing them over to your actual Arduino, so I suggest clicking the <code>Verify</code> button first. This will catch syntax errors, like pesky missing semi-colons.</p>
<p>Next, we can set up our physical device.</p>
<p>I&#39;m going to stick the LED into the Arduino, with the anode leg going into pin 13 and the cathode leg into ground. Note here that pin 13 is a special pin on the Arduino that has a resister built-in. If you try this with any other pin the Arduino, then the LED will burn out.</p>
<p>Finally, we can send our program from our computer to the Arduino over a USB connection by clicking the <code>Upload</code> button in the IDE. Your Arduino should flash happily once its complete, and then it&#39;s off to the infinite races.</p>
<p><img src="https://www.charlieharrington.com/img/blink.gif" alt="Binary Counting"></p>
<p>Look at that blinker. Pretty great, huh? Note that this gif definitely speeds things up a bit.</p>
<h3 id="putting-the-s-in-usb">Putting the &quot;S&quot; in USB</h3>
<p>So, as I continued building stuff, I inevitably found myself wanting to <code>console.log</code> the heck out of a program that wasn&#39;t working.</p>
<p>Let&#39;s talk about printing stuff with Arduino.</p>
<p>Your Arduino is connected to your computer via a USB cable. USB. USB. That has to stand for something, right? It does. It stands for &quot;Universal Serial Bus.&quot; USB is a quote &quot;industry standard&quot; for communications between computers and peripherals. If you think back really hard to the time of Captain Marvel or even earlier, you might remember other ways that we connected peripherals to our computers -- like an dot matrix printer&#39;s parallel port or a PS/2 keyboard port. Well, in the time since Carol Danvers left us here to fend for ourselves, USB has taken over our hearts, minds, and wallets. But we&#39;re still using a &quot;serial connection&quot; when we&#39;re using USB devices - so we&#39;ll need to use the serial protocol to communicate with our Arduino.</p>
<p>In other words, if we want to send or receive info from our Arduino program, we need to establish a serial connection with the device. Here&#39;s how you do that in a Processing sketch:</p>
<pre><code class="language-c++">const unsigned int BAUD_RATE = 9600;

void setup() {
    Serial.begin(BAUD_RATE);
}

void loop() {
    Serial.println(&quot;Hello, world!&quot;);
}
</code></pre>
<p>Baud rate, huh? I know this <code>baud</code> term, too. Modems had baud rates, IIRC. Some Wikipedia-ing and Google-ing reveal that baud rates are the rates at which information is transferred in a serial channel. In this case, with a baud rate of 9600, we&#39;re transferring a max of 9600 bits per second. 9600 happens to be the standard baud rate for Arduinos, but I believe you can choose a different rate.</p>
<p>To view your &quot;console&quot;, you can click the &quot;Serial Monitor&quot; button in the IDE. </p>
<p><img src="https://www.charlieharrington.com/img/hello.png" alt="Hello"></p>
<p>In addition to viewing received information, you can also send messages back to the Arduino in this monitor using the text input on the top panel and the <code>Send</code> button. For example, you might write a program that toggled an LED on or off based on a specific input key.</p>
<p>What if you don&#39;t want to use the Serial Monitor in the Arduino IDE? Maybe it&#39;s time to let the old ways die. I agree. If you&#39;re on a Mac, then you can try running the <code>screen</code> command from your terminal, specifying both the name of your serial connection to your Arduino and the baud rate.</p>
<pre><code class="language-bash">screen &lt;name_of_serial_connection&gt; 9600
</code></pre>
<p>In my case, the name of the connection was <code>/dev/cu.usbmodem14101</code>, which you can find in the <code>Tools/Port</code> menu of the Arduino IDE.</p>
<p>Word of warning, however. If you close this terminal window, it won&#39;t close the sesssion, and you&#39;ll be unable to Upload new programs to your Arduino. This is called a &quot;detached screen&quot; and it&#39;s annoying. You need to quit the screen somehow, and you can use this command to do so:</p>
<pre><code class="language-bash">screen -X -S &lt;name_of_session&gt; quit
</code></pre>
<p>Oh, to get the name of the detached session, you can type:</p>
<pre><code class="language-bash">screen -ls .
</code></pre>
<p>This whole serial communications thing opens up some interesting ideas, since you can have two way comms between your Arduino and something else. Forget Alexa. Not-okay, Google. Go away, Siri. Now you can build your own talking robotic best friend, instead. Hopefully gets some gears turning for you, too.</p>
<h3 id="counting-in-binary-with-leds">Counting in binary with LEDs</h3>
<p>In general, life-goal-wise, I&#39;ve been trying to get better at thinking and counting in binary, so I decided to build a little binary counter for my next Arduino project.</p>
<pre><code class="language-c++">const unsigned int LED_BIT0 = 12;
const unsigned int LED_BIT1 = 11;
const unsigned int LED_BIT2 = 10;
const unsigned int LED_BIT3 = 9;

long result = 0;

void setup() {
  pinMode(LED_BIT0, OUTPUT);
  pinMode(LED_BIT1, OUTPUT);
  pinMode(LED_BIT2, OUTPUT);
  pinMode(LED_BIT3, OUTPUT);
}

void loop() {
  result++;
  if (result == 16) {
    result = 0;
  }
  output_result(result);
  delay(500);
}

void output_result(const long result) {
  digitalWrite(LED_BIT0, result &amp; B0001);
  digitalWrite(LED_BIT1, result &amp; B0010);
  digitalWrite(LED_BIT2, result &amp; B0100);
  digitalWrite(LED_BIT3, result &amp; B1000);
}
</code></pre>
<p><img src="https://www.charlieharrington.com/img/binary.gif" alt="Binary Counting"></p>
<p>I&#39;m not sure why the red LED isn&#39;t as bright as the other three LEDs. I tried swapping it out with another LED to no avail. But, hey, other than that, this thing works!</p>
<p>I also learned that breadboards are great. Being able to run all the cathode sides of the LEDs to the bottom negative row of the breadboard, and then only connecting that row once to the Arduino&#39;s ground port is pretty darn helpful. I have more to learn and appreciate here, for sure.</p>
<p>Also, this is the first time that I&#39;ve really leveraged the power of the bitwise-and operator. I&#39;m taking my <code>result</code> and bitwise-and it with a binary number that represents a binary digit (1&#39;s, 2&#39;s, 4&#39;s, 8&#39;s) for each of the LEDs. The bitwise-and operation returns <code>true</code> if <code>result</code> and our binary number both contain a <code>1</code> for the given binary digit. For example, let&#39;s look at the number <code>3</code></p>
<pre><code class="language-c++">3 &amp; B0001; // true
3 &amp; B0010; // true
3 &amp; B0100; // false
3 &amp; B1000; // false
</code></pre>
<p>The final trick here is that <code>digitalWrite</code> function transforms <code>true</code> boolean values into <code>HIGH</code> (turn on the LED) and <code>false</code> into <code>LOW</code> (turn off the LED). So, for the number <code>3</code> the LED for the <code>1</code>&#39;s digit and the <code>2</code>&#39;s digit should be lit, and the <code>4</code>&#39;s and <code>8</code>&#39;s should be off.</p>
<p>That&#39;s pretty awesome and makes this code very concise. There&#39;s much more to explore here for me.</p>
<h3 id="more-tinkering">More tinkering</h3>
<p>So, after a mere afternoon, I&#39;ve learned a ton and had quite a bit of fun along the way.</p>
<p>What&#39;s next, you ask? Well, resistors are still perplexing. I&#39;m not sure yet how to determine what level of resistence is needed for a given situation. I&#39;ve already fried an LED (a delightful puff of smoke wisps out during its last gasp of life), likely for this very reason. It&#39;s also really hard to read those colorful bands to try to determine their resistance level. This seems like it could be a great little computer vision / deep learning app. Or perhaps I should just use my multimeter more regularly.</p>
<p>I&#39;m also thinking more about the difference between analog and digital signals. Digital is binary (either on or off), whereas analog is continuous. Most of what we observe in life is an analog signal. So when we choose to digitize them, we need to choose specific moments to &quot;sample&quot; the values of the continuous signal. The Schmidt book explained that an audio CD takes a sample every 44,100 per second (or 44.1 kHz). Maybe this is why vinyl is back.</p>
<p>I thinking that my obvious next project here with Arduino is to make an alarm clock with binary numbers. There are tons of neat examples of this project across the web, and I think it could be a good way to learn / improve my soldering skills, as well as my quick mental binary counting, especially while groggy in the middle of the night.</p>
]]></description>
            <link>https://www.charlieharrington.com/afternoon-with-arduino</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/afternoon-with-arduino</guid>
            <pubDate>Thu, 28 Mar 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Borrowing Library Books for Your Kindle]]></title>
            <description><![CDATA[<p>Basically, do it. It&#39;s super easy. <strong>I&#39;ll show you how in this post.</strong></p>
<h3 id="how-to-borrow-library-books-for-your-kindle">How to borrow library books for your Kindle</h3>
<ol>
<li><strong>Obtain a Kindle from Amazon.</strong> I&#39;m using the Kindle Paperwhite with Special Offers, which I recommend. The special offers are just ads for random books, and they only appear on the lock screen of the Kindle. Who knows? You might even find something you like with the offers.</li>
<li><strong>Obtain a library card number from your local library.</strong> This takes a few minutes in person, but I&#39;m sure you can also do it online. You&#39;ll probably need some proof of residence, like a driver&#39;s license or some utility bill. Better be safe and bring both.</li>
<li><strong>Sign into your library&#39;s ebook manager on the library&#39;s website using your library card number</strong>. Most likely they are using a service called Overdrive. You&#39;ll probably also create a PIN number when you register for your library card, so write that down somewhere!</li>
<li><strong>Search for a book on Overdrive (or your library&#39;s respective ebook service), and then you&#39;ll be able to either borrow or place a hold for it.</strong> The San Francisco Public library, for example, allows you to borrow or place holds for up to something like 20 books at a time!</li>
<li><strong>Once you&#39;ve borrowed a book, click Read Now with Kindle</strong>. You&#39;ll been taken to the Amazon page for the book, and you can send the ebook directly to your Kindle. Next time your Kindle connects to wifi, the borrowed book will be downloaded.</li>
<li><strong>Read, rinse, and repeat.</strong> I like to have several books borrowed at a time, with a few holds as well, so that there&#39;s always something coming down the pipe.</li>
</ol>
<h4 id="🎁-placing-holds-for-books-is-like-sending-a-gift-to-your-future-self">🎁 Placing holds for books is like sending a gift to your future self</h4>
<p>Imagine waking up to this email:</p>
<p><img src="https://www.charlieharrington.com/img/email.png" alt="email"></p>
<p>It&#39;s like Christmas morning! Once you click that link, you&#39;ll be taken to your Overdrive account:</p>
<p><img src="https://www.charlieharrington.com/img/overdrive.png" alt="overdrive"></p>
<p>Even before you&#39;ve had your (first) coffee of the day, you can probably manage to click that <code>Read Now with Kindle</code> button:</p>
<p><img src="https://www.charlieharrington.com/img/amazon.png" alt="amazon"></p>
<p>Click <code>Get Library Book</code>, and you&#39;re done! Your morning commute just got a little bit nerdier.</p>
<p><img src="https://www.charlieharrington.com/img/borrowed.png" alt="borrowed"></p>
<h3 id="borrowing-audiobooks">Borrowing Audiobooks</h3>
<p>You can do this, too! </p>
<p>There&#39;s a great app called <a href="https://meet.libbyapp.com/">Libby</a> that is somehow affiliated with Overdrive, and that&#39;s what I recommend using for listening to library audiobooks. Everything that you rent through Overdrive, whether ebook or audiobook, will automatically appear in your Libby app (once you sign into Libby with your library card). This is helpful for when you inevitably forget your Kindle at home (there&#39;s also a Kindle phone app, but I haven&#39;t used it recently).</p>
<p>I still haven&#39;t entirely embraced the audiobook lifestyle, but it&#39;s something on my mind for 2019.</p>
<h3 id="but-what-about-how-good-paper-books-smell">But what about how good paper books smell?</h3>
<p>I&#39;m a paper book monster. And, yes, the smell is half the reason. But public libraries are vitally important -- and were vitally important to my childhood. I&#39;m happy to be bringing them back into my adult life, even in this electronic way.</p>
<p>I&#39;m also still buying an insane amount of paper books, from local booksellers whenever possible. Not even Marie Kondo can stop me from that.</p>
]]></description>
            <link>https://www.charlieharrington.com/borrowing-library-books-for-your-kindle</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/borrowing-library-books-for-your-kindle</guid>
            <pubDate>Sun, 13 Jan 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Humans of Machine Learning]]></title>
            <description><![CDATA[<p>I&#39;ve started an interview series on the <a href="https://blog.floydhub.com/tag/humans-of-ml/">FloydHub blog</a> called &quot;Humans of Machine Learning.&quot; I&#39;m hoping to talk with lots of real human beings who are doing fun, creative, interesting, and / or surprising things with machine learning and AI. Those things might be weekend projects, work projects, or school projects -- doesn&#39;t matter, just something that people are excited to talk about and share with the community. I&#39;m eager to learn from them and be inspired by their creativity, focus, and ideas. Another tangential goal of mine is to get better at interviewing people.</p>
<p>So far, I&#39;ve chatted with <a href="https://blog.floydhub.com/humans-of-ml-leanne-luce/">Leanne Luce</a> about her experiments with AI and fashion blogging, and <a href="https://blog.floydhub.com/humans-of-ml-kalai-ramea/">Kalai Ramea</a> about computational creativity. A few more conversations are already in the pipeline. If you&#39;re doing something creative with machine learning, please reach out on Twitter (<a href="https://twitter.com/whatrocks">@whatrocks</a>).</p>
<p>You can also find the interviews at <a href="http://humansofml.com/">humansofml.com</a>.</p>
]]></description>
            <link>https://www.charlieharrington.com/humans-of-machine-learning</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/humans-of-machine-learning</guid>
            <pubDate>Mon, 30 Jul 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Meet Von Chomp]]></title>
            <description><![CDATA[<p>Von Chomp is a monster who loves to count - workout reps, patrons at hipster BBQs, even 🍪s. </p>
<p><img src="https://www.charlieharrington.com/img/vc.gif" alt="vc"></p>
<p>Meet von Chomp now on the Apple App Store: <a href="https://appsto.re/us/VN7lib.i">https://appsto.re/us/VN7lib.i</a> </p>
<h3 id="dont-take-my-word-for-it">Don&#39;t take my word for it</h3>
<p><img src="https://www.charlieharrington.com/img/ratings.png" alt="ratings"></p>
]]></description>
            <link>https://www.charlieharrington.com/meet-von-chomp</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/meet-von-chomp</guid>
            <pubDate>Wed, 08 Mar 2017 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Critters]]></title>
            <description><![CDATA[<p>Every good app needs a mascot. Meet some of the critters behind some internal tools (co-designed with <a href="http://lisestatelman.com/">Lise Statelman</a> and <a href="https://www.linkedin.com/in/ctn017/">Chau Nguyen</a>).</p>
<h4 id="hadron">Hadron</h4>
<p><img src="https://www.charlieharrington.com/img/cubicle.png" alt="Hadron"></p>
<h4 id="badron">Badron</h4>
<p><img src="https://www.charlieharrington.com/img/holodeck.png" alt="Badron"></p>
<h4 id="levi">Levi</h4>
<p><img src="https://www.charlieharrington.com/img/levi.png" alt="Levi"></p>
<h4 id="adele">Adele</h4>
<p><img src="https://www.charlieharrington.com/img/adele.png" alt="Adele"></p>
]]></description>
            <link>https://www.charlieharrington.com/critters</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/critters</guid>
            <pubDate>Wed, 28 Dec 2016 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Alcatraz Challenge 2016 - Review]]></title>
            <description><![CDATA[<p>This was a much smaller race than I expected. Only 116 souls according to the official results. I felt lucky to have snagged a race number when I did — the website warned it would be capped at 500 swimmers. That was enough for me. I frantically entered my credit card details and breathed a sigh of terrible relief at what I’d done.</p>
<p>The Alcatraz Challenge is a 1.5 mile swim from Alcatraz Island to the northern shore of San Francisco, followed by a 7 mile run over the Golden Gate Bridge and back to Crissy Field. Alcatraz Island is a tiny rock in the San Francisco Bay surrounded by shark-friendly, freezing cold waters with notorious tidal currents — and famously the former home to an inescapable maximum security prison.</p>
<blockquote>
<p>In its 29 years of operation, there were 14 acknowledged attempts to escape from Alcatraz prison involving 34 inmates. Officially, every escape attempt failed, and most participants were either killed or quickly re-captured. However, the participants in the December 1926 and June 1962 attempts, though presumed dead, disappeared without a trace, giving rise to popular theories that they were successful.</p>
</blockquote>
<p>I paid over $100 dollars to give it a shot.</p>
<p><img src="https://www.charlieharrington.com/img/connery.png" alt="Sean Connery in the Rock"></p>
<div style="text-align:center;padding-bottom:10px">You know… you’re almost the only evidence that I exist.</div>

<p>I arrived at the East Beach of Crissy Field around 5 AM. The sky was dark grey, the water quiet and serene. All was calm at the transition area. A few people chitter-chattered while applying Body Glide. I looked for someone to chitter-chatter with myself, but no takers. Instead, I jumped on an early shuttle to the appointed ferry building at 5:45 AM instead of my scheduled 6 AM departure. I closed my eyes as we made our way across the city amid the warming sunrise.
It sounded like a bunch of 8th graders were on the bus behind me. I turned around — a bunch of 8th graders were on the bus behind me. My confidence boosted — <em>if they could make the swim with their tiny 8th grade arms</em> — until I remembered their parents. I am 30 years old and I barely told my parents I was swimming this race. These kids must be future Olympians.</p>
<p>After body-marking at the ferry area, I ran into the woman who I sat next to at the Sports Basement race prep talk the day before. She was nervous. Me too. We discussed. We met another woman who swam this race for the last two years. Her times varied widely — the first year took her a speedy 35 minutes and the second a brutal 75. She, like everyone else who has swam these waters, told us that every Alcatraz swim is different. This point was hammered home by the race director during our mandatory prep session. The opening slide was a visualization of GPS data plotting his last 100 swims from Alcatraz — a blooming display of paths stretching across 3+ miles on shore. He told us that he recently completed his 1000th Alcatraz swim. 1000 swims — approximately one crossing a week for 20 years. He also does them naked. Not naked naked. But without a wetsuit. I think we were supposed to be reassured by him.</p>
<p>We boarded the ferry and headed out to the island. I spent some quality pre-race time in the bathroom, and then laid down on the floor of the ferry and pretended to stretch. I felt powerless. I had no choice now but to proceed with this insane trial. I felt like I wasn’t really there — I was someone else watching myself.</p>
<p>After a half hour, we neared the jump-zone. It really was a skydiving-like jump-zone situation. We would be jumping out of the side hatch of the boat into the water from about 8 or more feet, and then told to swim like hell so that we don’t get clobbered by the next leaper behind us. A final warning: “Don’t make this your come-to-Jesus moment at the edge, cause he ain’t coming — it’s already too late.”</p>
<p>Our nervous final tittering centered around our complete lack of visibility of Sutro Tower. We were told the day before by the race director that Sutro Tower would be our one sighting landmark to rule them all: “Just keep it at your 12 o’clock at all times and let the tide do the rest.” With Sutro entirely ensconced in Karl the Fog, we’d now be tracking towards the lesser landmarks of Fort Mason, then the golden dome of the Palace of Fine Arts, and then finally East Beach of Crissy Field.</p>
<p>We crowded around the starboard door, hummed along to the anthem, chanted a 30 second count down, and shuffled to the hatch. The race organizers began yelling “Go! Go! Go!” I neared the edge, came to Jesus, started my watch, and jumped feet first, trying not to go too deep into the colder layers of water below.</p>
<p>It felt great actually. I swam mindlessly and rapidly away from the boat so that I wouldn’t get jumped on. The coldness I feared had been contained by my wetsuit and my beloved new thermal skull cap. After a minute I began to adjust to my new reality:</p>
<blockquote>
<p>I’m over a mile from shore, open water swimming for the first time, with choppy, relentless, clobbering waves smashing into my right side every three seconds. And don’t even get me started thinking about what’s swimming around beneath me right now.</p>
</blockquote>
<p>I turned around to take in Alcatraz in its terrible glory from a few hundred feet out in the water, and then began chopping water towards land. I tried to establish a constant stroke, but found left-breathing to be impossible because I would lose sight of the next incoming wave. My stuttering stroke became 1–2-breath-1–2-gulp-seawater-breath.</p>
<p>I swam like this for what I assumed was a half hour. I tried to conjure Edmund Dantès, escaping from imprisonment after being thrown into the sea from the island tower of Château d’If, en route to Monte Cristo, where I would find fortune, plot revenge, and win back my long-lost love Mercédès. I was scared to look at my watch — I didn’t want to know how long I’d been swimming given how far I had yet to go. At this point, I’d lost sight of all other swimmers. I saw a kayak on my left and a jet-ski ahead in the distance. I was either in first or last place.</p>
<p>My only happiness was that the fog finally broke and Sutro Tower was again visible. I started to kick into high gear, and suddenly cramped in my right calf. The muscle screamed in pain — I couldn’t bend my leg. I waved to the kayak and asked to hang on for a bit to stretch it out. I doggy-paddled over with my aching leg hanging behind me. I held onto his bow and started to massage out the cramp. It didn’t seem to be helping, but it was so good to rest. I was clearly dehydrated from the nearly gallon of seawater I’d drank. I asked him how I was doing, he lied and said okay, but that I needed to start heading for the Palace of Fine Arts now, confirming my fear that I’d been too conservative in my route.</p>
<p>The cramp was not getting any better. There was no way I could make it back to shore like this. I decided to give up — surviving seemed better than drowning.</p>
<p>“Maybe you should go get a boat for me,” I said.</p>
<p>“Okay, but there’s none nearby. I can radio one over if you want.”</p>
<p>What I wanted was to make it to shore. I told him I changed my mind. I was going to make it to shore myself, no matter what, thank you very much. I asked him to please keep an eye on me as I swam away from the kayak. Somehow the cramp started to dissipate. After a few minutes, he said he had to go help someone else, and I was on my own again. Thankfully, the shore start to creep closer. For the next 25 minutes, I slowly plodded forward with my 1–2-breath stroke.</p>
<p>Eventually I saw the beach and then the color of people’s shirts on the beach and then peoples faces on the beach. I closed my eyes for while to just keep moving, but started to get dizzy and thought I was going to black out. Finally, finally, I stood up and ripped off my googles and cap. I felt the sand, the glorious earth, and wanted to puke on it.</p>
<p>I’d made it — I survived. I still had a seven mile run over the Golden Gate Bridge and back, but nothing else mattered. Fortune, revenge, and Mercédès awaited.</p>
<p><img src="https://www.charlieharrington.com/img/success.png" alt="Finisher pic of Charlie Harrington"></p>
<div style="text-align:center;padding-bottom:10px">Hey, Mercédès.</div>]]></description>
            <link>https://www.charlieharrington.com/alcatraz-challenge-2016-review</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/alcatraz-challenge-2016-review</guid>
            <pubDate>Fri, 16 Dec 2016 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Glass-Steagall Act Farewell Show]]></title>
            <description><![CDATA[<p>Six years ago Mark Mager convinced me it was a good idea to play an acoustic Beatles medley in front of our entire Morgan Stanley division to celebrate my departure and his return. Now you too can witness the final (only) show of The Glass-Steagall Act (thankfully featuring the talents of Bill &quot;The Intern&quot; Ward):</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/FOdLVF24zpQ?rel=0" frameborder="0" allowfullscreen></iframe>]]></description>
            <link>https://www.charlieharrington.com/glass-steagall-act-farewell-show</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/glass-steagall-act-farewell-show</guid>
            <pubDate>Fri, 22 Jan 2016 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[NOAH Conference in Berlin]]></title>
            <description><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/SNRU3EV6NrI?rel=0" frameborder="0" allowfullscreen></iframe>

<p>I spoke in Berlin, and took a really bad still image, apparently.</p>
]]></description>
            <link>https://www.charlieharrington.com/noah-conference-in-berlin</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/noah-conference-in-berlin</guid>
            <pubDate>Tue, 09 Jun 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Introducing Knerds]]></title>
            <description><![CDATA[<p>Knerds is a simple and fun iOS game that helps you learn the names of your co-workers through brute force, cuddly mascots, and spaced repetition.</p>
<p><img src="https://www.charlieharrington.com/img/banner.png" alt="Banner"></p>
<h3 id="diving-into-objective-c">Diving into Objective-C</h3>
<p>Like many tech companies, Knewton organizes a hack day every few months. Beyond the inevitable pizza gorging, the fun and hopefully useful projects, and the geeky camaraderie, hack day has always been important to me — discovering this 2011 Knewton hack day video more or less kept me alive as a functioning human organism during the darkest days of my pre-Knewton career.</p>
<p>I had just finished the Big Nerd Ranch Objective-C book when our April 2015 hack day rolled around, and I decided to try my hand at crafting a dead simple iPhone app.</p>
<p>My idea: Tinder for work. Well, not exactly.</p>
<p>I wanted to build a flashcard app that helped you learn the names of your co-workers with pictures and some randomized guessing action. Fun, potentially useful (especially for those of us in the London office), and quite possibly something I could pull off in a few days.</p>
<p>Pretty soon, after an hour or so on Thursday night, Knerd by Knewton lived:</p>
<p><img src="https://www.charlieharrington.com/img/k.png" alt="Knerd by Knewton"></p>
<p>It wasn’t a good app — the picture didn’t change, there were no swipes or gestures, and the “quiz” was pretty lame — but the basic elements were there. I had a foundation. I was able to test my app on my actual phone — awesome. Even if I wasn’t able to proceed much further, I knew that I would be able to submit at least a basic working iOS quiz app as my “hack.”
Back to the drawing board</p>
<p>We use a Trello board to organize potential hacks into four categories: Performance, Product, Business, and Culture. The Trello board is also used to recruit fellow hackers to your pet project. Earlier that week, I dropped a vague card into the Product category called “Knerd by Knewton” with an even more mysterious description. </p>
<p>To my shock Dan McGorry, our lead UX designer replied:</p>
<p><img src="https://www.charlieharrington.com/img/trello.png" alt="Trello"></p>
<p>And that’s when things got real.</p>
<h3 id="ux">UX</h3>
<p>Dan and I chatted throughout Friday on Slack (him in New York, me in London) and we debated several challenges with the concept:</p>
<ul>
<li>What does a left swipe mean? A right swipe?</li>
<li>Should the quizzing occur when the picture is still on the screen (and thereby losing the Tinder flicking concept, but reinforcing the memorization experience)?</li>
<li>How should we handle incorrect answers?</li>
</ul>
<p>Designing solid UX is more challenging than I thought. My initial concept for a Tinder-like flow was much more complicated than I had initially anticipated. Dan put together an early set of wireframes in blazing speed, and we continued to discuss how to improve the experience as he iterated on the wires. </p>
<p>Here’s a look at one of the early sets:</p>
<p><img src="https://www.charlieharrington.com/img/wires1.png" alt="Wireframes"></p>
<p>That Friday was not exactly a day off from work for me, and I told Dan as much — that we should continue to develop the wires and concept up to the end of the day, and that I would devote my weekend to implementing our app, but with no guarantee of my success — just the old hack day try.</p>
<h3 id="enter-the-knerds">Enter the knerds</h3>
<p>Dan and I had never worked together on anything before, but we were really syncing up well on Friday. I don’t want to say that our collaboration was effortless, because we both put in quite a bit of work, but it was easy. And fun. That’s one of the real beauties of hack day, discovering similar interests and collaborating with folks outside of your day-to-day job.</p>
<p>Importantly, Dan and I agreed that the app was lacking something critical — a cuddly mascot. He showed me a Pinterest board he’d been collecting with mascot ideas, and I also mentioned my love for those armless french-fry guys in the McDonald’s world. </p>
<p>Pretty soon, Dan came back with the knerds:</p>
<p><img src="https://www.charlieharrington.com/img/knerds-group.png" alt="Knerds"></p>
<p>We chatted through some minor tweaks, like the placement of bows, the eye colors, and the introduction of a fourth triangle-y knerd, but these little geometric critters were pretty much perfect from the start. And my love for the knerds began. </p>
<p>By the end of Friday, our wires looked like a real app:</p>
<p><img src="https://www.charlieharrington.com/img/wires2.png" alt="Wireframes"></p>
<p>Now it was time for me to code up or shut up.</p>
<h3 id="weekend-of-code">Weekend of code</h3>
<p>I spent the next 48 hours doing nothing but coding, reading, power-napping, and drinking coffee, with a few sanity breaks for running and grabbing pizza — and it was amazing. I made continual progress throughout the weekend, which was both exhilarating and nerve-wracking because I needed to get it all working by the Monday deadline.</p>
<p>Some challenges encountered along the way:</p>
<p><strong>Moving between view controllers</strong>: The standard UITabBarController or the UINavigationController flows did not fit into our card-based app design, so I spent time exploring different flows for our game. Eventually, I used modal view controllers to toggle between the three screens (Start, Game, and Finish), with a UIAlertController for the quiz questions. Here’s how I present the Game Screen when a user clicks the “Let’s Go” button:</p>
<pre><code class="language-objective-c">- (IBAction)playGame:(id)sender { 
 KDGameViewController *gvc = [[KDGameViewController alloc] init]; 
 [self presentViewController:gvc animated:YES completion:nil]; 
}
</code></pre>
<p>Once you’re in the KDGameViewController, the “finish/victory” screen is shown in a similar fashion. Then, when the user taps “Play Again”, the “finish” screen is dismissed, and the user returns to the Game screen (where everything is reset).</p>
<pre><code class="language-obj-c">- (IBAction)playAgain:(id)sender { 
  [self dismissViewControllerAnimated:YES completion:nil]; 
}
</code></pre>
<p><strong>Resetting the game</strong>: After the Finish screen, I wanted to draw the users back into the app to try the game again (hello, viral hook!), but the analytics counters were not properly resetting (my basic game analytics / metrics included number of hints, wrong choices, cards remaining, etc). I resolved this by utilizing the viewWillAppear() lifecycle method to reset all my counters.
Randomizing the answer choices: This was a fun challenge — displaying randomized answer choices in the “Alert” pop-up. Here’s my naive but workable solution:</p>
<pre><code class="language-objective-c">// Select the &quot;correct&quot; and &quot;distractor&quot; choices 
NSMutableArray *names = [[NSMutableArray alloc] init]; 
// name1 points to the &quot;correct&quot; name 
[names addObject:name1]; 
// name2, name3, and name4 point to the distractor names 
[names addObject:name2]; 
[names addObject:name3]; 
[names addObject:name4]; 
// Randomly pick one of the &quot;names&quot; in names, 
// then create a new NSString to hold that name, 
// and finally remove it from the names array 
int random1 = arc4random() % [names count]; 
NSString *nameTitle1 = names[random1]; 
[names removeObjectAtIndex:random1]; 
int random2 = arc4random() % [names count]; 
NSString *nameTitle2 = names[random2]; 
[names removeObjectAtIndex:random2]; 
int random3 = arc4random() % [names count]; 
NSString *nameTitle3 = names[random3]; 
[names removeObjectAtIndex:random3]; 
int random4 = arc4random() % [names count]; 
NSString *nameTitle4 = names[random4]; 
[names removeObjectAtIndex:random4];
</code></pre>
<p>At this point, I’ve got 4 NSString pointers called nameTitle1, nameTitle2, etc. that will randomly hold the “correct” answer choice every time — sometimes the correct choice will be nameTitle2, other times it will be nameTitle4, etc. All I then have to do is create UIAlertActions with titles that reference nameTitle1, nameTitle2, etc.</p>
<p><strong>Feature creep</strong>: I kept coming up with ideas for fun new features and mechanics before I even had the base functionality working (e.g. adding score “analytics” to the finish screen). This is a real problem. At the same time, it’s great to feel that continuous inspiration, and I would never want to entirely constrain that creativity.</p>
<p>By 1:45 AM on Monday morning, Knerds was a working iOS game! Here’s a screencast that I recorded to submit the hack, just ahead of the Monday morning deadline (note that I hadn’t yet fixed the “repeated name” bug for the distractor answers, which I resolved later that morning, and also note that I say the word “sweet” a lot in this video):</p>
<iframe src="https://player.vimeo.com/video/125413885" width="640" height="1183" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<p>I shouldn’t have recorded this at 1:42 AM on Sunday.</p>
<h3 id="whats-next-for-knerds">What’s next for Knerds</h3>
<p><strong>TestFlight</strong>: After some clunking around with iTunesConnect, I’ve now got a dozen or so actual knerds testing out the app via TestFlight. The swiping UX needs to be improved. It may just make more sense to go with a “double-tap to guess” concept. Also, I need to fix the positioning of the views for different phone sizes. I had quickly used the “Reset to Suggested Constraints” option in Interface Builder for each view object ahead of releasing on TestFlight, but I’ve heard back and it didn’t work out as well as I had hoped.</p>
<p><strong>Release as an internal company app</strong>: This requires an enterprise account, and a Dun &amp; Bradstreet number. My hope is that we’ll be able to release Knerds for all current and future Knewton employees as a helpful HR tool.</p>
<p><strong>Automatic content refresh</strong>: I scraped the pictures, names, and titles from our company page on Employee-List. It doesn’t look like they have an API, so I’m exploring some options for automatic content updates as more folks join Knewton.</p>
<p><strong>Game improvements</strong>: One obvious improvement could be better distractors — filtering by team or location.</p>
<p>I had a great time building this app with Dan, and I can’t wait to continue to develop Knerds!</p>
<h3 id="one-more-thing">One more thing</h3>
<p>I flew to NYC later that week, and I couldn’t stop thinking about the knerds, and I decided to come up with a backstory for them. I quickly sketched up some storyboards on some scraps of paper during my flight, and emailed them to Dan to see what he could put together.</p>
<p>Here it is — the backstory of the knerds:</p>
<iframe src="//www.slideshare.net/slideshow/embed_code/key/lBIMolu34oh74u" width="768" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>

<p>But Dan and I kept going. We named them all. And then I couldn’t stop myself — the knerds needed personalities:</p>
<h4 id="olive">Olive</h4>
<p><img src="https://www.charlieharrington.com/img/orange.png" alt="Olive"></p>
<p>Olive is the young Captain of the knerds. This mission was her first ever. Olive is brave and bold, and loves to explore, but she’s still young and inexperienced. She’s determined to make the most of their mission!</p>
<h4 id="mr-figg">Mr. Figg</h4>
<p><img src="https://www.charlieharrington.com/img/green.png" alt="Mr Figg"></p>
<p>Mr. Figg is Head of Security. He’s responsible for protecting the Knerds from trouble, but somehow Isaak always seems to find a way to make it anyway. Mr. Figg has a tough exterior, but also a heart of gold.</p>
<h4 id="kam">K.A.M.</h4>
<p><img src="https://www.charlieharrington.com/img/red.png" alt="K.A.M."></p>
<p>K.A.M. is the Communications Officer. She’s part robot (we think). Her suction cup legs can rotate around her body, so she can easily climb and stick to any surface. She also can upgrade her legs to new components, like helicopter drone blades so she can fly, but she lost her repair/upgrade kit during the crash.</p>
<h4 id="isaak">Isaak</h4>
<p><img src="https://www.charlieharrington.com/img/blue.png" alt="Isaak"></p>
<p>Isaak is Olive’s younger brother. He snuck onto the ship before takeoff because he didn’t want to miss out on the adventure! Isaak is always getting into trouble, which is easy because he’s so tiny, but his misadventures often lead the knerds to important new discoveries.</p>
<h3 id="the-continuing-adventure">The continuing adventure</h3>
<p>I think that the story of the knerds could be the basis for a great game for kids to learn maths (see, I’m living in Europe now) and vocab content on their phones, following along with the mission of the knerds as they relearn their skills and try to salvage their mission in time.</p>
<p>As validation, I showed the knerds to my eight-year-old cousin Avery over the weekend, and she came up with even more superpowers for them. Apparently, Isaak can turn into a tiny paper football. And Mr. Figg can grow his hair really really long. And Olive is actually a popsicle and she can melt and surf along her melted self and then regenerate.</p>
<p>Avery convinced me that helping the knerds solve puzzles would be a fun game for kids. She even started to memorize the names of the Knewton employees after repeatedly playing the app.
Oh, and Avery invented bad guys for the knerds! I asked her to draw them:</p>
<h4 id="binky">Binky</h4>
<p><img src="https://www.charlieharrington.com/img/binky4.jpg" alt="Binky"></p>
<h4 id="chill-factor">Chill Factor</h4>
<p><img src="https://www.charlieharrington.com/img/chillfactor4.jpg" alt="Chill Factor"></p>
<h4 id="bill">Bill</h4>
<p><img src="https://www.charlieharrington.com/img/bill3.jpg" alt="Bill"></p>
<p>It looks like the knerds will need all the help they can get — will you help them?</p>
]]></description>
            <link>https://www.charlieharrington.com/introducing-knerds</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/introducing-knerds</guid>
            <pubDate>Sat, 02 May 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[edCrunch in Moscow]]></title>
            <description><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/T952UorytGs?rel=0" frameborder="0" allowfullscreen></iframe>]]></description>
            <link>https://www.charlieharrington.com/edcrunch-in-moscow</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/edcrunch-in-moscow</guid>
            <pubDate>Sat, 18 Oct 2014 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[ELTJam Sesh in London]]></title>
            <description><![CDATA[<iframe src="https://player.vimeo.com/video/93132331?title=0&byline=0&portrait=0" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<p>My five minute pitch to the masters of the ELT universe.</p>
]]></description>
            <link>https://www.charlieharrington.com/eltjam-sesh-in-london</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/eltjam-sesh-in-london</guid>
            <pubDate>Mon, 28 Apr 2014 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Cape Seafood Logo]]></title>
            <description><![CDATA[<p>My friend Luke asked me to design a new logo for his new company. You may know his other company: <a href="https://www.lukeslobster.com/">Luke&#39;s Lobster</a>.</p>
<p>Here&#39;s what my other friend <a href="http://www.katiekosma.com/">Katie Kosma</a> and I came up with:</p>
<p><img src="https://www.charlieharrington.com/img/capeseafood.png" alt="logo"></p>
<p>Check out <a href="http://www.capeseafoodllc.com/">Cape Seafood</a> for more seafood-y goodness.</p>
]]></description>
            <link>https://www.charlieharrington.com/cape-seafood-logo</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/cape-seafood-logo</guid>
            <pubDate>Mon, 21 Jan 2013 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[About]]></title>
            <description><![CDATA[<p>I&#39;m a computer programmer working on <a href="https://folio.co/">Folio</a>. Previously, I worked at <a href="https://getcruise.com/">Cruise</a>.</p>
<h2 id="projects">Projects</h2>
<ul>
<li><a href="https://mbgstar.com/">Money Back Guarantee*</a> - a band of dads from Marin County and the East Bay playing originals and covers, after bedtime</li>
<li><a href="https://show.csprimer.com/">The CS Primer Show</a> - a podcast with my friend <a href="https://twitter.com/oznova_">Oz Nova</a> about computer science and computer science education (watch on <a href="https://www.youtube.com/@cs_primer">YouTube</a>)</li>
<li><a href="https://f52.charlieharrington.com/">Fahrenheit 52</a> - a weekly writing challenge (write one new short story every week for a year) in 2022, inspired by a Ray Bradbury quote</li>
<li><a href="https://writeswith.com/">Writes With</a> - nerdy interviews with writers about their writing tools</li>
<li><a href="https://ittp.charlieharrington.com/">In The Troll Pit</a> - livestream adventures in retro computing</li>
<li><a href="https://escapingweb.github.io/">Escaping Web</a> - a six-episode podcast with <a href="https://twitter.com/oznova_">Oz</a> about software engineering and learning</li>
<li><a href="https://apps.apple.com/us/app/von-chomp/id1211087343?mt=8">Von Chomp</a> - iOS &quot;monster&quot; tally counter app where counting tastes delicious</li>
<li><a href="https://www.charlieharrington.com/relay">Terminal Man</a> - weird songs that I make on flights using Logic or Garageband</li>
</ul>
<h3 id="points-elsewhere">Points Elsewhere</h3>
<ul>
<li><a href="https://www.youtube.com/@whatrocks">YouTube</a></li>
<li><a href="https://warpcast.com/whatrocks">Farcaster</a></li>
<li><a href="https://twitter.com/whatrocks">Twitter</a></li>
<li><a href="https://mastodon.social/@whatrocks">Mastodon</a></li>
<li><a href="https://twitch.tv/what_rocks">Twitch</a></li>
<li><a href="https://github.com/whatrocks">GitHub</a></li>
<li><a href="https://instagram.com/whatrocks">Instagram</a></li>
<li><a href="https://www.goodreads.com/whatrocks">Goodreads</a></li>
<li><a href="https://www.linkedin.com/in/charlieharrington">LinkedIn</a></li>
<li><a href="https://whatrocks.substack.com/">Substack</a></li>
</ul>
<p>Thanks for visiting my website!</p>
]]></description>
            <link>https://www.charlieharrington.com/about</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/about</guid>
            <pubDate>Sat, 01 Jan 2000 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Books]]></title>
            <description><![CDATA[<p>This a placeholder for the books that I&#39;m going to write, the first being a children&#39;s novel about robots!</p>
]]></description>
            <link>https://www.charlieharrington.com/books</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/books</guid>
            <pubDate>Invalid Date</pubDate>
        </item>
        <item>
            <title><![CDATA[Merlin's Advice]]></title>
            <description><![CDATA[<blockquote>
<p>The best thing for being sad is to learn something. That&#39;s the only thing that never fails. You may grow old and trembling in your anatomies, you may lie awake at night listening to the disorder of your veins, you may miss your only love, you may see the world about you devastated by evil lunatics, or know your honour trampled in the sewers of baser minds. There is only one thing for it then — to learn. Learn why the world wags and what wags it. That is the only thing which the mind can never exhaust, never alienate, never be tortured by, never fear or distrust, and never dream of regretting. Learning is the only thing for you. Look what a lot of things there are to learn.</p>
</blockquote>
<p><img src="https://www.charlieharrington.com/img/ma.jpg" alt="Merlin"></p>
]]></description>
            <link>https://www.charlieharrington.com/merlins-advice</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/merlins-advice</guid>
            <pubDate>Thu, 05 Mar 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Four Track]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/341989983&amp;color=%2300cc11&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

<p>This is the first song I wrote and recorded on my Fostex four-track.</p>
]]></description>
            <link>https://www.charlieharrington.com/four-track</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/four-track</guid>
            <pubDate>Thu, 18 Dec 2003 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Charlie Harrington]]></title>
            <description><![CDATA[<p>&lt;% pages.sort((c,d) =&gt; {
    if (!c.date || !d.date) return
    const a = c.date.split(&quot;-&quot;);
    const b = d.date.split(&quot;-&quot;);
    return b[0] - a[0] || b[1] - a[1] || b[2] - a[2]; 
})
.forEach((page) =&gt; { _%&gt;
    &lt;%if (page.title !== &quot;About&quot; &amp;&amp; page.title !== &quot;Charlie Harrington&quot; &amp;&amp; page.title !== &quot;Library&quot; &amp;&amp; page.title !== &quot;Books&quot; &amp;&amp; page.title !== &quot;Walkingman&quot;) { %&gt;</p>
<ul>
<li><a href="https://www.charlieharrington.com/%=%20pathTo(page)%20%">&lt;%= page.title || pathTo(page) %&gt;</a>: &lt;%= page.date %&gt;
  &lt;% } %&gt;
&lt;% }); _%&gt;</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/</guid>
            <pubDate>Sat, 01 Jan 2000 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Library]]></title>
            <link>https://www.charlieharrington.com/library</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/library</guid>
            <pubDate>Invalid Date</pubDate>
        </item>
        <item>
            <title><![CDATA[Red Button II: The Giant of Belvedere]]></title>
            <description><![CDATA[<p>We made another short film last year. Here&#39;s the &quot;back of the DVD case&quot; pitch:</p>
<blockquote>
<p>Penny&#39;s back, and so&#39;s the Red Button, thankfully right where she left it. But who&#39;s this Giant? And why&#39;s he so cute?</p>
</blockquote>
<blockquote>
<p>Red Button II: The Giant of Belvedere is 2025 Belvedere Home-Made Film Festival Official Selection</p>
</blockquote>
<blockquote>
<p>A Harrington Production</p>
<ul>
<li>Tavie Harrington - &quot;Penny&quot;</li>
<li>Bear Harrington - &quot;The Giant&quot;</li>
<li>Carly Harrington - Hair, Makeup, Costume</li>
<li>Charlie Harrington - Writer, Director, Composer, Editor</li>
</ul>
</blockquote>
<p>My favorite moment of the film festival when Tavie received her filmmaker&#39;s participation statue:</p>
<blockquote>
<p>&quot;I can&#39;t believe I won my first trophy!&quot;</p>
</blockquote>
<p>Watch the 3-minute film now:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/rUxrYtBAbFQ?si=yirWUoX23m9VS9Y5" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

<p>I love having this continuing, annual project with Tavie (and now Bear, too). She keeps bringing it up, bursting with ideas for the next one. </p>
<p>Another thing I&#39;ve been trying to do is learning one new movie-making technique each year, and then use it as a major part of that year&#39;s film. The first year was &quot;reversing&quot; a clip -- hello, <a href="https://www.charlieharrington.com/red-button">Red Button</a>&#39;s time travel mechanism. This year was green screen. I borrowed some green screens (aka sheets) from the local library and then we did our best to rig up Bear&#39;s bedroom like <a href="https://en.wikipedia.org/wiki/StageCraft">The Mandalorian&#39;s The Volume</a>. After some hilarious (out)takes, I fired up YouTube Shorts and spend 25 seconds learning how to use DaVinci Resolve just enough to do the green screen clips. What a world. You can definitely tell that I&#39;m doing this with less than a minute&#39;s worth of training with the Giant&#39;s glowing green hair, but I&#39;m still blown away by how YouTube can teach you literally anything in less than a bathroom break.</p>
<p>I also tried to create a storyboard this year:</p>
<p><img src="https://www.charlieharrington.com/img/rb2/storyboard.png" alt="storyboard"></p>
<p>Would be fun to try some actual storyboarding software for 2026. Which reminds me to also look into comic book / graphic novel software, because Tavie&#39;s getting really into Dog Man at the moment.</p>
<p>Some other highlights</p>
<ul>
<li>Bear!!</li>
<li>My mom (Tavie and Bear&#39;s Nana) visited from NJ and came to the film festival</li>
<li>Getting clips and fake interviews with random park-walkers who happened to notice my &quot;edits&quot; to the historical plaques to incorporate the history of the Giant (watch the film to know what I&#39;m talking about).</li>
</ul>
<p>Making movies is fun!</p>
<blockquote>
<p>Penny will return in 2026.</p>
</blockquote>
<blockquote>
<p>But will the Giant?</p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/red-button-ii-the-giant-of-belvedere</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/red-button-ii-the-giant-of-belvedere</guid>
            <pubDate>Sun, 18 Jan 2026 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[West Front St. / River Rd.]]></title>
            <description><![CDATA[<p>It&#39;s been six years since the <a href="https://www.charlieharrington.com/bullet-train-to-merlins-grave">last</a> <em>Hotdog Johnny &amp; the Shady Oaks</em> show. Well, we&#39;re back, and live from the Appalachian Mountain Club in Blairstown, New Jersey with a brand new song: <em>Ask Me Anything</em></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/utU1hV8dT88?si=UtsHJ0kv9Ug6xxsu" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

<p>As of September 2025, Hotdog Johnny &amp; the Shady Oaks remain:</p>
<ul>
<li>Jack Byrnes - Banjo</li>
<li>Peter Clabby - Electric Guitar, Vocals</li>
<li>Charlie Harrington - Acoustic Guitar, Vocals</li>
</ul>
<h2 id="solo-act">Solo act</h2>
<p>To the continued chagrin of our emcees, I had another song on deck, explicitly not a medley, so as not to violate <a href="https://www.tellyouwhatpodcast.com/">Uncle Mike</a>&#39;s open mic rules. </p>
<p>Here&#39;s my new song <em>West Front St. / River Rd.</em>:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Z4vgqJbF2hk?si=yiX2226EDkl5lvQJ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

<h2 id="weddings-with-open-mics">Weddings with Open Mics</h2>
<p>Weddings with Open Mic Nights as the welcome party are the best sort of weddings.</p>
<p>Tess &amp; Michael Forever! Thank you both for an amazing weekend of love and music and frogging and fishing and family! I love you!</p>
]]></description>
            <link>https://www.charlieharrington.com/west-front-st-river-rd</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/west-front-st-river-rd</guid>
            <pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[What is the UCSF Cancer Survivorship program?]]></title>
            <description><![CDATA[<p>A few weeks ago I participated in this explainer video for the <a href="https://www.ucsfhealth.org/clinics/cancer-survivorship-and-wellness-institute">UCSF Cancer Survivorship program</a> and it&#39;s out now:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/XhqPR-ZWCXc?si=gaqEi_ZR-ZJQI_nE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

<p>I think the video does a nice job of explaining the primary mechanism for my ongoing interactions with UCSF over the last few years (I mean, other than the colonosopies). It was also nice to see glimpses of how this program has already helped so many others navigate that post-treatment life re-integration stuff. I&#39;m very lucky to be working with Angela (she&#39;s in the video!) on my own post-treatment re-integration <em>stuff</em>!</p>
<p>Last related tidbit - if you&#39;re into running and in the Bay Area this weekend, the <a href="https://www.runtiburon.com/">Run Tiburon 5K / 10K road race</a> is this coming Sunday, Sept. 7th (you can still sign up!) and a portion of proceeds go to benefit the UCSF Cancer Survivorship Program. They&#39;ve even renamed the race &quot;Courage Over Cancer.&quot; Somehow I came in 7th place in this race two years ago, which only means one thing - we clearly need more runners to join!</p>
]]></description>
            <link>https://www.charlieharrington.com/uscf</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/uscf</guid>
            <pubDate>Mon, 01 Sep 2025 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Red Button]]></title>
            <description><![CDATA[<p>My 3-year-old daughter Tavie and I made a time-travel movie for the inaugural <a href="https://bhmff.com/">Belvedere Home-Made Film Festival</a>. Watch the four-minute film here on YouTube:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/3gJ6zjAjs7g?si=i6P6ekTYDYhZfpxO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

<p>This project was fun on so many dimensions (get it, time travel). But watching Tavie watch herself on the big screen at the festival was the highlight for me. &quot;Core memory,&quot; as they say on Instagram.</p>
]]></description>
            <link>https://www.charlieharrington.com/red-button</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/red-button</guid>
            <pubDate>Mon, 07 Oct 2024 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Notes on Stanford Linear Accelerator Center]]></title>
            <description><![CDATA[<p>The latest of my &quot;sixth grade class trip&quot; adventures found me (and some co-workers) at SLAC - the Stanford Linear Accelerator Center. </p>
<blockquote>
<p>Side note - my notes on previous &quot;sixth grade class trips&quot; include <a href="http://localhost:3500/notes-on-nike-missile-site-sf-88l">Nike Missile Site SF 88L</a> and an <a href="https://www.charlieharrington.com/notes-on-map-and-compass-navigation">REI Map and Compass Navigation course</a>.</p>
</blockquote>
<p>Maybe, like me, you&#39;ve seen the SLAC sign countless times whilst driving down the SF peninsula past Menlo Park and wondered what sort of particle physics wonders were being conducted hundreds of feet beneath you and Interstate 280.</p>
<p>Well, now I know. And I have the obligatory two-mile long hallway selfie to prove it:</p>
<p><img src="https://www.charlieharrington.com/img/slac/selfie.jpg" alt="Hallway selfie"></p>
<blockquote>
<p>If you think you can see the end of this hallway, you&#39;re a liar! The human eye can&#39;t do it. Our guide told us so, and he was a scientist, okay? Okay!</p>
</blockquote>
<p>For the so-tempted, SLAC offers a free tour, once per month, and I&#39;m pretty sure it sells out faster than Phish tickets or Yosemite camping sites (<a href="https://www6.slac.stanford.edu/public-tours/registration">bookmark this page</a> if you want in!).</p>
<p>I&#39;ve been daydreaming about visiting SLAC ever since I wrote a scene in my manuscript about someone accidentally discovering a particle accelerator beneath their parent&#39;s office -- and then subsequently realizing that I have no idea what a particle accelerator actually looks like. </p>
<p>Also, particle accelerators are just cool. You may be aware that the World Wide Web was created in one in 1989 - not directly influenced by hyper-charged electrons, of course, but also not-not-directly influenced either. Plus, this one -- SLAC -- also played host to some meetings of the Homebrew Computer Club during the 1970s.</p>
<p>I was therefore, understandably, quite excited when I successfully conjured tickets for the April tour, and then entered a building on Sand Hill Road for the first time.</p>
<h2 id="slac-tour-walkthrough">SLAC tour walkthrough</h2>
<p>The SLAC tour begins, <em>excitingly</em>, in a conference room where you watch a pre-recorded video, which despite a valient effort, is nowhere near as good as its Jurassic Park &quot;frog DNA&quot; counterpart. The SLAC video covers the Cold War era SLAC origin tale in the early 1960s, the fascinating Nobel-prize-inducing discoveries discovered here (including the <a href="https://en.wikipedia.org/wiki/Charm_quark">charm quark</a> and the <a href="https://en.wikipedia.org/wiki/Tau_(particle)">tau lepton particle</a>), the unplanned-obsolence of the primary linear accelerator, and its recent renewal for other cool x-ray stuff.</p>
<p>Approximately twelve minutes later, we hop in a bus and head on over to the linear accelerator, which from the surface, looks like a bunch of shipping-container style buildings in a row. A very long row. Here&#39;s Google Maps proof:</p>
<p><img src="https://www.charlieharrington.com/img/slac/map.png" alt="map"></p>
<p>Inside this record-setting building (once the longest building the world), you&#39;ll first see a sample section of the accelerator itself (the rest of which is buried many feet below you).</p>
<p><img src="https://www.charlieharrington.com/img/slac/outside.jpg" alt="outside"></p>
<p><img src="https://www.charlieharrington.com/img/slac/tourguide.jpg" alt="tourguide"></p>
<p>The bigger silver pipe is called the Light Pipe and it helps align the smaller copper pipe above it where the particles travel. Because the accelerator is two miles long, they had to factor in the curvature of the Earth its contruction and its ongoing alignment. Though the advent of the laser pointer pen (you know, the thing your cool, but also kinda mean, middle school classmate secretly pointed at the guest speaker during an assembly about drugs or something) rendered the light pipe obsolete, the light pipe served its purpose effectively, helping align what was once the world&#39;s &quot;most straight object.&quot;</p>
<p>After checking out this sample section of the accelerator, we&#39;re allowed to enter the &quot;Klystron gallery&quot;.</p>
<p><img src="https://www.charlieharrington.com/img/slac/klystron.jpg" alt="klystron"></p>
<p>A Klystron is this big microwave thing that helps speed up the particles traveling along the accelerator. This is the best visual of what&#39;s going on where with these here klystrons.</p>
<p><img src="https://www.charlieharrington.com/img/slac/accelerator-visual.jpg" alt="Accelerator visual"></p>
<p>The &quot;gallery&quot;, where we are, is the top section. Below us, beneath many feet of &quot;Earth shielding&quot; which appears to be dirt based on this diagram, is the accelerator. Every X feet (I forget how many), a kytstron will send microwave-like energy down to the accelerator, and help ... accelerate ... the particles flinging along the path (electrons and positrons). The inside of the copper accelerator pipe looks like this, where the microwaves from the Klystron enter these open sections.</p>
<p><img src="https://www.charlieharrington.com/img/slac/pipe-pieces.jpg" alt="pipe-pieces"></p>
<p>The pipe with the particles is also water-cooled, cause it gets real hot.</p>
<p>What else? Well, here&#39;s the caution sign right as you enter the Klystron gallery.</p>
<p><img src="https://www.charlieharrington.com/img/slac/caution.jpg" alt="Caution"></p>
<p>Is there radiation risk in here, you might ask? No more so than when you eat a banana, says our guide. However, we are still greeted with these warnings:</p>
<p><img src="https://www.charlieharrington.com/img/slac/leaky-window.jpg" alt="leaky-window"></p>
<p>Not sure about that leaky window thing.</p>
<p>Here&#39;s the view of the gallery looking left:</p>
<p><img src="https://www.charlieharrington.com/img/slac/looking-left.jpg" alt="looking-left"></p>
<p>And now looking right:</p>
<p><img src="https://www.charlieharrington.com/img/slac/looking-right.jpg" alt="looking-right"></p>
<p>It really is trippy to look down this hallway. I asked our host if he&#39;d ever run the full length. He chuckled (not sure if that was an affirmative), but did say that there used to be a 5k among the scientists, up and back along the accelerator. I&#39;d love to have seen - or better run -- that race. </p>
<h2 id="science-stuff">Science stuff</h2>
<p>Eventually ,the SLAC linear accelerator lost steam, so to speak. You may be loosely aware that the top accelerators these days are all curved (e.g. CERN). Our host explained that electrons lose energy during a curve, so why did the curved accelerators win out? Mainly, money. Because each klystron in a linear accelerator can only be used &quot;once&quot; for a given particle -- the only way to speed things up even more would be to make the linear accelerator longer, and that&#39;s just impractical money-wise and land-wise. But a curved accelerator, even with energy-loss along the way, can reuse its klystrons (and the like) many, many, many times. Even SLAC ended up building some curved sections at the end of the accelerator.</p>
<p>All that to say that the linear accelerator is no longer used in the same way anymore. But scientists have built a bunch of other interesting things using components of the accelerator, like the <em>Linac Coherent Light Source</em> - a giant x-ray laser.</p>
<p>And for the next part of the tour, we got to see where these scientists are doing their science. And guess what? This part was even cooler than the endless hallway, because it felt active and alive and also like a space station.</p>
<p><img src="https://www.charlieharrington.com/img/slac/hallway.jpg" alt="hallway"></p>
<p><img src="https://www.charlieharrington.com/img/slac/ducts.jpg" alt="ducts"></p>
<p>Like, what the heck is this thing?</p>
<p><img src="https://www.charlieharrington.com/img/slac/dunno.jpg" alt="dunno"></p>
<p>Better wear the correct goggles, or else!</p>
<p><img src="https://www.charlieharrington.com/img/slac/eyewear.jpg" alt="eyewear"></p>
<p>I know this says &quot;hutch&quot; but I read it as &quot;hatch,&quot; and imagined Desmond from Lost stuck down here.</p>
<p><img src="https://www.charlieharrington.com/img/slac/hatch-sign.jpg" alt="hatch-sign"></p>
<p><img src="https://www.charlieharrington.com/img/slac/panel.jpg" alt="panel"></p>
<p>Inside the hutch, where they are using the x-ray laser to &quot;record videos of photosynthesis happening.&quot; Awesome.</p>
<p><img src="https://www.charlieharrington.com/img/slac/hatch.jpg" alt="hatch"></p>
<p>This is what I wish the inside of my garage looked like.</p>
<p>Here&#39;s more of the wild and weird machines just sitting in the hallway:</p>
<p><img src="https://www.charlieharrington.com/img/slac/machinesagain.jpg" alt="machinesagain"></p>
<p><img src="https://www.charlieharrington.com/img/slac/more-machines.jpg" alt="more machines"></p>
<p>Some warning signs:</p>
<p><img src="https://www.charlieharrington.com/img/slac/oxygen.jpg" alt="oxygen"></p>
<p><img src="https://www.charlieharrington.com/img/slac/radiation.jpg" alt="radiation"></p>
<p>A whiteboard where they are presumably working on LeetCode problems while waiting for their turn with the laser.</p>
<p><img src="https://www.charlieharrington.com/img/slac/whiteboard.jpg" alt="whiteboard"></p>
<h2 id="another-fun-facts">Another fun facts</h2>
<p>And that&#39;s it! The tour must end, science must continue. We&#39;re delivered back to the original building via bus, and as a final thank-you, we&#39;re allowed to make a commemorative flattened penny, which I would have loved to do, but the line was too long.</p>
<p>A few final SLAC notes:</p>
<p>While they were digging up the ground to build the accelerator, they found an intact <a href="https://en.wikipedia.org/wiki/Paleoparadoxia">Paleoparadoxia</a> skeleton - which was an ancient manatee looking thing, and they&#39;ve kept the big ol&#39; fossil on-site.</p>
<p>Finally, though I did not learn this on the tour, this factoid is too important not to directly rip from Wikipedia:</p>
<blockquote>
<p>The SSRL facility was used to reveal hidden text in the Archimedes Palimpsest. X-rays from the synchrotron radiation lightsource caused the iron in the original ink to glow, allowing the researchers to photograph the original document that a Christian monk had scrubbed off.</p>
</blockquote>
<p>Palimpsest! My <a href="https://www.charlieharrington.com/novels-with-libraries">favorite word</a>! Just when you think a place couldn&#39;t get any cooler it goes and reveals hidden text on ancient manuscripts.</p>
]]></description>
            <link>https://www.charlieharrington.com/notes-on-slac</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/notes-on-slac</guid>
            <pubDate>Sat, 27 May 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Your Favorite Homepage as a GIF]]></title>
            <description><![CDATA[<p>The <a href="https://archive.org/web/">Wayback Machine</a> is a treasure. But it&#39;s also a little slow to navigate IMHO (perhaps purposely harkening back to those halcyon microfiche days). Can&#39;t we use computers to speed up our research endeavors?</p>
<p>Yes, we can. Here&#39;s a neato gif of Apple&#39;s homepage from 1996 to present:</p>
<p><img src="https://www.charlieharrington.com/img/wayback/apple.gif" alt="Apple homepage gif"></p>
<p>Or maybe you&#39;re looking for some H1 or CSS gradient inspiration for your enterprise SaaS web3 startup? Look no further - here&#39;s Stripe&#39;s homepage since 2009:</p>
<p><img src="https://www.charlieharrington.com/img/wayback/stripe.gif" alt="Stripe homepage gif"></p>
<p>Gotta love that <em>cloud with gears inside</em> image. APIs, baby.</p>
<p>These gifs are neat, right? Much faster than clicking around the Wayback Machine UI. Careful observers may be wondering about the snapshot cadence here - I&#39;m grabbing one screenshot per year in these examples. The Wayback Machine has <em>waaay</em> more snapshots for these sites (there are currently 349,843 available snapshots of apple.com between October 22, 1996 and February 1, 2023), but an annual capture -- in gif format -- definitely gives you a good sense for the evolution of these homepages.</p>
<p>Here&#39;s another great example: whitehouse.gov (and, no, this is not whitehouse.com, to those of you from the 90s who&#39;ve made that most-enlightening of mistakes before):</p>
<p><img src="https://www.charlieharrington.com/img/wayback/whitehouse.gif" alt="Whitehouse homepage gif"></p>
<p>This is almost itself a history lesson of the web in a single gif.</p>
<h3 id="how-i-made-these-gifs">How I made these GIFs</h3>
<p>Speaking of the GIF format, did you know it was created in 1987? That&#39;s two years before the World Wide Web. Also, the <a href="https://www.w3.org/Graphics/GIF/spec-gif89a.txt">gif spec</a> is nuts and has tons of features that no one really uses or knows about. These magical features (like the &quot;wait for user input&quot; flag) were first revealed to me in our <a href="https://escapingweb.github.io/episodes/4/">Escaping Web interview with Lauren Budorick of Figma</a>. But I digress.</p>
<p>My point here -- and I do have one -- is that I&#39;ve been thinking about this idea -- gifs of the Wayback Machine results -- for a couple years now, and never actually did anything about it. And then my pal <a href="https://nicholascharriere.com/">Nicholas</a> extolled the virtues of coding with ChatGPT to me last night. I was skeptical, despite dabbling with (and enjoying) GPT-3 and DALL-E 2 during <a href="https://f52.charlieharrington.com/stories/writers-blockchain/">last year&#39;s writing project</a>. But then I remembered this little Wayback gif idea, and I thought I&#39;d give ol&#39; ChattyG a try, since this would mostly be a &quot;string some boilerplate together until it works&quot; sort of project.</p>
<h3 id="ai-rubber-duck-debugging">AI rubber duck debugging</h3>
<p>This is not going to be a <em>how I, for one, came to love our new AI overlords</em> post. But I will quickly share my takeaways. </p>
<p>The most impressive thing about working with ChatGPT was that <em>I shipped this project</em>. Period. Something that had been rattling around in my skull for a couple years is <a href="https://github.com/whatrocks/waybackgif">now available for you to try out on GitHub</a> and even <a href="https://replit.com/@whatrocks/waybackgif">Replit</a> if you want to give it a try in your browser.</p>
<p>Did ChatGPT get it right the first time? No. But sometimes editing is easier, and it got me started in a direction. I still had to do some documentation digging and even some StackOverflowing, but that was fine, cause I was paired up with a robot buddy. In this sense, ChatGPT felt like <a href="https://en.wikipedia.org/wiki/Rubber_duck_debugging">rubber duck debugging</a>, except with a rubber duck who has some fairly decent ideas of its own.</p>
<p>Where ChatGPT really excelled for me was when I wanted to add conveniences to working code which would have been annoying to code myself. </p>
<p>For example, the URL to search was originally hardcoded in the script. After everything was working, I asked ChatGPT to update my script to accept the URL as a required CLI argument. ChatGPT crushed this task, pulling in an arg parsing library for Python and updating my script structure accordingly. That was pretty cool.</p>
<h3 id="more-gifs-please">More GIFs, please!</h3>
<p>How about the Everything Store?</p>
<p><img src="https://www.charlieharrington.com/img/wayback/amazon.gif" alt="Amazon homepage gif"></p>
<p>Seems like they got wind of the automated test software by 2020.</p>
<p>Let&#39;s do one more. How about YahoooOooOOo?</p>
<p><img src="https://www.charlieharrington.com/img/wayback/yahoo.gif" alt="Yahoo homepage gif"></p>
<p>Kinda disturbing to see Yahoo transform from covering &quot;Arts and Humanities&quot; and &quot;Science&quot; into the LCD of our attention span over the years, actually. I think I&#39;m going to stop now.</p>
<h3 id="homepage-as-history">Homepage as history</h3>
<p>Homepages are cool. And we&#39;re lucky we have the Internet Archive out there recording them all for posterity.</p>
<blockquote>
<p>Please consider <a href="https://archive.org/donate">donating to the Internet Archive - creators and maintainers of the Wayback Machine, as well as many other Library of Alexandria-esque Internet.. um, archival programs - right here</a>. I just did it, and it was super easy with PayPal.</p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/your-favorite-homepage-as-a-gif</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/your-favorite-homepage-as-a-gif</guid>
            <pubDate>Wed, 01 Feb 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Year of Short Stories]]></title>
            <description><![CDATA[<p>I wrote a short story every week in 2022. My goals were to get better at writing and to have fun. I&#39;ll <a href="https://f52.charlieharrington.com/">let you be the judge</a> of the former but I sure did have a good time. This is what they look like:</p>
<p><img src="https://www.charlieharrington.com/img/short-stories/f52.png" alt="F52 stories"></p>
<p>Colorful, right? Technically, there&#39;s 53 stories, but that&#39;s cause I preloaded up a zeroth story that I&#39;d written a year back so that the site wouldn&#39;t look empty and also to trick me into thinking I&#39;d already made progress - you know, the proverbial todo list items you&#39;ve already done but still jot down so you can cross them out immediately.</p>
<p>Speaking of task management, this is also probably the first &quot;New Year&#39;s Resolution&quot; that I really achieved.</p>
<h2 id="todo-fix-me-later-jira-ch-4202">#TODO: Fix me later (JIRA CH-4202)</h2>
<p>There&#39;s always chatter around this time of year about whether or not New Year&#39;s Resolutions are a good thing or a bad thing. Maybe we&#39;re supposed to be doing <em>goals</em> instead. Or <em>anti-resolutions</em>. </p>
<blockquote>
<p>The debate reminds of when we were told by our teachers at St. Leo the Great to switch from &quot;giving something up&quot; in Lent to &quot;doing something new that&#39;s also good&quot; - which is actually a good setup for a story!</p>
</blockquote>
<p>Regardless, what I like about Resolutions Time is the &quot;resetting&quot; it can bring. Sometimes you gotta blow on that Nintendo game to make it work again. It&#39;s also a great opportunity to try new things. Many of us seem to calcify as we age (see Thanksgiving dinner discussion topics). But we can resist, my friends, if we simply follow <a href="https://www.charlieharrington.com/merlins-advice">Merlin&#39;s advice</a>. Finally, there&#39;s often a health theme around New Year&#39;s Resolutions, and hopefully you already know my thoughts on <a href="https://www.charlieharrington.com/colon-cancer">being your own health advocate</a>.</p>
<p>Resolutions-rant aside, I thought I&#39;d share some LEARNINGS (is there a more annoying word in modern business-speak? Yes, probably, but don&#39;t you dare tell me it) from my year of writing short stories.</p>
<h2 id="learn-the-learnings-learned-by-a-learned-learner">Learn the Learnings Learned by a Learned Learner</h2>
<h3 id="have-fun">Have fun</h3>
<p>This one&#39;s already part of my life motto (borrowed from children&#39;s publisher <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">Klutz Press</a>), and I view it as critical to the success of my short story writing project. I wrote these stories for me, and I like reading them. I think they&#39;re fun, and I didn&#39;t stress about writing them, even though I did have to carve out time to write them each week. But it doesn&#39;t take much time to make a meaningful dent into a short story. I think everyone would be surprised by that - take a phrase or a name or a memory and just start... going.</p>
<h3 id="clear-the-cache">Clear the cache</h3>
<p>I wrote many of these stories to simply get them out of my head (where some of them have been rattling around for years, like <em><a href="https://f52.charlieharrington.com/stories/the-young-adventures-of-warren-and-chuck/">what if it&#39;s The Young Adventures of Indiana Jones but it&#39;s Warren Buffett instead and all his greatest investment ideas came from hijinks and misadventures</a></em>?). As it turns out, not all of my long-standing story ideas were prize winners, but they&#39;re at least OUT of my head now, where I can edit or revise them or, most-likely, just move on! My creative cache is cleared and is feeling very performant now.</p>
<h3 id="remove-technical-barriers">Remove technical barriers</h3>
<p>I coded up the project&#39;s website last December. I made sure that I could deploy it with a simple push to GitHub. I made sure that all I needed to do each week was &quot;write the story&quot; and &quot;git push&quot; (other than the podcast recording, a process which I also kept as simple as possible, partly due to lack of audio editing knowledge but mostly because I knew no one was really listening to them anyway other than Carly and my mom). </p>
<h3 id="jot-stuff-down">Jot stuff down</h3>
<p>Write down your dreams, any bits of them that you remember. I use the <a href="https://getdrafts.com/">Drafts iOS app</a> to do this. I dump ideas, character names, dialogue, etc. throughout the day into Drafts, and then process the queue when I&#39;m back at my computer. My phone&#39;s always with me, and I&#39;m trying to make it a tool for creativity over pure consumption.</p>
<h3 id="review-the-list-of-things-i-didnt-do-good-cause-im-no-good">Review the list of things I didn&#39;t do good cause I&#39;m no-good</h3>
<p>Here&#39;s where I would normally write down some &quot;opportunities for improvement&quot; - where I reveal that I&#39;m simply masquerading as a lifelong learner but I&#39;m simply a shameless millenial optimizooor.</p>
<p>However, this is not only a blameless post-mortem, it&#39;s also a faultless one, too. I know I could have done a better job of editing and revising my stories. I know I could have written more every single day, and made it a true daily habit. But we are not <em>doing this</em>, okay?</p>
<p>Try to forgive yourself for being human, Charlie, and instead enjoy the fleeting joy of creative fulfillment before the next project begins tomorrow. <em>Have fun</em>, remember!</p>
<pre><code class="language-BASIC">10 PRINT &quot;HAVE FUN!&quot;
20 GOTO 10
</code></pre>
<h2 id="mini-story-collections">Mini story collections</h2>
<p>Lessons be damned, one of the fun things that unexpectedly emerged this year was my use of recurring characters and companies and locations. If I&#39;m allowed to be critical again, it&#39;s because this tactic became a shortcut. It was definitely easier to keep developing the same characters versus going full-on tabula rasa each week. But, also, I <em>liked</em> these characters and companies and locations, so there, brain!</p>
<p>If you do give my stories a try, keep your eye out for the megacorp Eagle (can we trust them? do we even have a choice?) as well as several adventures across <em>Old New Jersey</em> and the town of <em>Little Bighill</em>. </p>
<p>I&#39;ll also highlight two recurring characters: Penelope &quot;Thesaurus&quot; Green and Will. Penny&#39;s braver than just about anyone, and Will&#39;s -- well, Will&#39;s me. Anytime you read a Will story, it&#39;s an ever-so-slightly-veiled memory. They&#39;re the beginnings of my <em>Dandelion Wine.</em></p>
<h3 id="penny-stories">Penny stories</h3>
<ul>
<li><a href="https://f52.charlieharrington.com/stories/the-secret-of-skull-island/">The Secret of Skull Island</a></li>
<li><a href="https://f52.charlieharrington.com/stories/thesaurus-green-part-1/">Thesaurus Green and the Case of the Walkoff Strikeout (Part 1)</a></li>
<li><a href="https://f52.charlieharrington.com/stories/thesaurus-green-part-2/">Thesaurus Green and the Case of the Walkoff Strikeout (Part 2)</a></li>
<li><a href="https://f52.charlieharrington.com/stories/the-outer-beach/">The Outer Beach</a></li>
<li><a href="https://f52.charlieharrington.com/stories/we-built-a-blimp/">We Built a Blimp</a></li>
</ul>
<h3 id="will-stories">Will stories</h3>
<ul>
<li><a href="https://f52.charlieharrington.com/stories/st-pumpkinhead/">St. Pumpkinhead</a></li>
<li><a href="https://f52.charlieharrington.com/stories/the-ginny-pigs-catch-a-frog/">The Ginny-Pigs Catch a Frog</a></li>
<li><a href="https://f52.charlieharrington.com/stories/will-and-the-turtle/">Will and the Turtle</a></li>
<li><a href="https://f52.charlieharrington.com/stories/a-ladder-in-the-attic/">A Ladder in the Attic</a></li>
<li><a href="https://f52.charlieharrington.com/stories/to-tell-in-the-dark/">To Tell in the Dark</a></li>
<li><a href="https://f52.charlieharrington.com/stories/latchkey-17/">Latchkey 17</a></li>
<li><a href="https://f52.charlieharrington.com/stories/the-hive/">The Hive</a></li>
<li><a href="https://f52.charlieharrington.com/stories/cuttyhunk/">Cuttyhunk</a></li>
<li><a href="https://f52.charlieharrington.com/stories/what-did-ya-get/">What Did Ya Get?</a></li>
<li><a href="https://f52.charlieharrington.com/stories/way-out-of-the-money/">Way Out of the Money</a></li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/year-of-short-stories</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/year-of-short-stories</guid>
            <pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Run Linux on Electric Objects EO1 Wall Computer]]></title>
            <description><![CDATA[<h2 id="riddle-in-the-dark">Riddle in the dark</h2>
<blockquote>
<p>What was too early for NFTs, too vertical to be a Samsung Frame TV competitor, kickstarted to life by gifs, and acquired to death by Giphy?</p>
</blockquote>
<p>That&#39;s right, hobbitses, it&#39;s <a href="https://www.electricobjects.com/">Electric Objects</a>!</p>
<p><img src="https://www.charlieharrington.com/img/eo/app.gif" alt="Electric Objects app"></p>
<p>Electric Objects was a computer company building a <em>computer made for art</em>. That&#39;s one of the coolest sentences ever, except for the <em>was</em> part. Founder and CEO <a href="https://twitter.com/jrlevine">Jake Levine</a> (a fellow Morgan Stanley escapee) wrote a great <em><a href="https://medium.com/the-frontier/lessons-from-electric-objects-e161f0450f8f">what-happened</a></em> series of posts in 2018 that are worth a read for anyone interested in hardware startups. But, even better, just re-watch <a href="https://www.kickstarter.com/projects/electricobjects/electric-objects-a-computer-made-for-art">their Kickstarter video</a> and experience the pure joy of the creative act of bringing a computer to life.</p>
<p><img src="https://www.charlieharrington.com/img/eo/eo-art.gif" alt="Electric Objects art"></p>
<p>Electric Objects was gobbled up by Giphy, which in turn was slurped and gorbled into Facebook, and the Electric Objects iOS app is sadly no more. Which, for a computer that was explicly designed to not have a keyboard or mouse, poses a challenge for its owners. </p>
<p>So, why am I still lugging around my EO1?</p>
<p>Because I&#39;m not giving up on the dream, Jake.</p>
<h2 id="still-kicking">Still kicking</h2>
<p>The EO1 is a computer, right? Surely, we can boot into its presumably Linux OS somehow, instead of the default Electric Objects app experience thingie?</p>
<p>Turns out, yes, we can! I had to do a fair bit of forum spelunking to figure it out. I was delighted to discover other Electric Object wanderers out there like me. <a href="https://openframe.discourse.group/t/make-it-possible-to-run-on-the-eo-electric-objects-hardware/88/6">This post</a> was the jackpot. </p>
<p>The long and the short of it is that the company who manufactured the board for the EO1 is called Boundary Devices, and you can download <a href="https://boundarydevices.com/ubuntu-bionic-18-04-3-lts-for-i-mx6-7-boards-august-2019-kernel-4-14-x/">their Linux builds</a> on their website (after making an account, etc, etc). Fling that image onto a <a href="https://amzn.to/3Q680NU">USB thumbdrive</a>, attach the thumbdrive and a keyboard and a mouse to a <a href="https://amzn.to/3SvsLnz">USB hub</a>, connect the hub to a <a href="https://amzn.to/3OXDOTG">micro-USB adaptor</a>, plug that sucker into the back of the EO1, and then - boom - you&#39;ve got yourself a weird vertical Linux computer on your dang wall.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fAWJdXJvngU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>It&#39;s almost too easy.</p>
<p><img src="https://www.charlieharrington.com/img/eo/eo.jpg" alt="Electric Objects"></p>
<h2 id="displaying-the-new-york-times-frontpage-on-your-electric-objects-eo1">Displaying the New York Times frontpage on your Electric Objects EO1</h2>
<p>So, now what? What are you going to do with your wall computer, Charlie?</p>
<p>Lots of stuff, okay?</p>
<p>Like... remember that post from Brian Donahue about displaying the NY Times frontpage on his EO1 (which itself was derived from <a href="https://onezero.medium.com/the-morning-paper-revisited-35b407822494">another post about building a giganto e-ink display to do the same</a>)? How about that?</p>
<p>Much of <a href="https://github.com/Donohue/eo-nytimes">Brian&#39;s repo</a> is about communicating with the Electric Objects API. But we&#39;re not going to do that, are we? The real nugget of gold here is the deterministic URL for grabbing a PDF of the NY Time front page:</p>
<pre><code class="language-bash">https://static01.nyt.com/images/$(date +&quot;%Y/%m/%d&quot;)/nytfrontpage/scan.pdf
</code></pre>
<p>I bet we could make a nice one-liner to download today&#39;s front page using today&#39;s date and then open it up full screen somehow and then make it run this script every time the computer boots up.</p>
<p>That turned out to be more complicated than expected (typical). I hacked and slashed (and Googled) my way to the following setup, which works (I know it&#39;s not a one-liner, but doing it this way really helped me debug why each step - yes, each step - wasn&#39;t working at some point in this process):</p>
<pre><code class="language-bash">#!/bin/bash

export DISPLAY=:0

echo &quot;sleeping...&quot;
sleep 60

echo &quot;remove yesterday...&quot;
rm scan.pdf

echo &quot;download today...&quot;
/usr/bin/wget &quot;https://static01.nyt.com/images/$(date +&quot;%Y/%m/%d&quot;)/nytfrontpage/scan.pdf&quot;

echo &quot;open fullscreen...&quot;
/usr/bin/evince --fullscreen scan.pdf

echo &quot;done!&quot;
</code></pre>
<p>Then, you can use crontab to setup this script to run every time the computer boots with the <code>@reboot</code> keyword (which I didn&#39;t know about before and works as valid cron syntax - depending on your cron version). Don&#39;t forget to <code>chmod +x</code> your script first!</p>
<p>Well, does it work? </p>
<p><img src="https://www.charlieharrington.com/img/eo/success.jpg" alt="Electric Objects"></p>
<p>It does!</p>
<p>For the curious, migrating my one-liner/script to cron had a bunch of challenges (e.g. cron doesn&#39;t like <code>%</code> without escaping them; I needed to add <code>sleep</code> to ensure networking/wifi had loaded; I needed to add the <code>DISPLAY</code> env var so that cron knew how to talk to the display, etc). Also, I needed to install <code>postfix</code> so that I could read cron&#39;s error logs, which amazingly are emailed to your computer.</p>
<p>After all that, I connected the EO1 power cable to a Wemo smart outlet plug thingie, which integrated with Apple Homekit. Using the Apple Home app, I set this outlet to turn on at 6 AM and then turn off 2 hours later.</p>
<h3 id="hello-darkness-my-old-friend">Hello darkness, my old friend</h3>
<p>After a few evenings, I thought this &quot;5 minute&quot; project was done until I noticed that the screen was going dark at the 1 hour mark. </p>
<p>This particular Ubuntu distro&#39;s Power settings did not provide me the option of &quot;never going to sleep&quot;. More Googling led me down many failed paths (e.g. masking stuff in systemctl, trying <code>gnome-tweaks</code>) until I finally got something that keeps the EO1 display &quot;awake&quot; - the <code>caffeine</code> utility.</p>
<p>I added this line to the end of my script, and now we&#39;re awake and jittery... at 6 AM. But at least we have today&#39;s paper to read.</p>
<pre><code>caffeinate sleep 9999999
</code></pre>
<h2 id="are-we-done-puttering-yet">Are we done puttering yet?</h2>
<p>Never!</p>
<p>Now I&#39;m adding <a href="https://tailscale.com/">Tailscale</a> so that I can officially disconnect the keyboard and mouse and still be able to easy SSH into this wall computer. And I think I broke something else running <code>sudo apt-get update</code>, cause it&#39;s not booting up right now. Sigh...</p>
<p>Also, this whole caffeine thing makes me realize that I don&#39;t want to read anything before coffee, so I think automating morning coffee has got to be the next step.</p>
<p>I hope this little project reinvigorates your faith in the EO1, noble carriers of this wonderous device. Here&#39;s to even more people starting computer companies!</p>
]]></description>
            <link>https://www.charlieharrington.com/run-linux-on-electric-objects-eo1-wall-computer</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/run-linux-on-electric-objects-eo1-wall-computer</guid>
            <pubDate>Mon, 01 Aug 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[This Song Also Wrote Itself]]></title>
            <description><![CDATA[<p>Careful readers of this site may recall that I&#39;m the first person in the history of the world to <a href="https://www.charlieharrington.com/found-myself-driving">play guitar and sing a song in the back of a self-driving car</a> (TODO: insert &quot;prove me wrong&quot; meme here).</p>
<p>Well, friends, my &quot;talents&quot; were requested again by <a href="https://getcruise.com/">Cruise</a>.</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">San Francisco, don’t ever change!<br><br>Thanks to our own multi-talented <a href="https://twitter.com/whatrocks?ref_src=twsrc%5Etfw">@whatrocks</a> for the perfect tune 🎶 <a href="https://t.co/EbZV9JgdmK">pic.twitter.com/EbZV9JgdmK</a></p>&mdash; cruise (@Cruise) <a href="https://twitter.com/Cruise/status/1535336510861373445?ref_src=twsrc%5Etfw">June 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Thank you to my pal <a href="https://paulrosevear.com/">Paul Rosevear</a> for the blues-y, groovin&#39; strummin&#39; tips last week (please teach me more guitar stuff)! Thanks also to the great Chuck Berry (all albums should probably include this thank-you)! And thanks to Carly for tolerating all the practicin&#39; I&#39;ve been doing in preparation (and also for the bouncy-ball lyrics idea in the video)!</p>
<p>Music is the best!</p>
<p><img src="https://www.charlieharrington.com/img/studio.jpeg" alt="Studio action photo"></p>
]]></description>
            <link>https://www.charlieharrington.com/this-song-also-wrote-itself</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/this-song-also-wrote-itself</guid>
            <pubDate>Fri, 10 Jun 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Surfing the Gopherspace]]></title>
            <description><![CDATA[<p>A <a href="https://daringfireball.net/linked/2022/05/06/stevenf-gopher-playdate">recent Daring Fireball post</a> about the (super cool) <a href="https://play.date/">Playdate</a> handheld gaming system mentioned Gopher, which I&#39;d never heard of before! Here&#39;s the referenced tweet:</p>
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">When Playdate shipped, Panic co-founder Steven wrote a little about what it meant to him. And in the spirit of doing things differently, posted it to a Gopher (!) site.<br><br>If you&#39;re up for it, find it here:  gopher://stevenf.com:70/0/journal/2022/04/18/first-playdates-shipping.txt</p>&mdash; Playdate (@playdate) <a href="https://twitter.com/playdate/status/1520144706511904768?ref_src=twsrc%5Etfw">April 29, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>Gruber mentions he used <code>curl</code> to read the Gopher site, which you can try yourself:</p>
<pre><code class="language-bash">curl gopher://stevenf.com:70/0/journal/2022/04/18/first-playdates-shipping.txt
</code></pre>
<p>You should see the full text of the Playdate post as a response. Intriguing, right? Where&#39;s the <code>https://</code> part of the url? What&#39;s this gopher thing all about?</p>
<p><img src="https://www.charlieharrington.com/img/gopher/caddyshack.jpg" alt="Caddyshack"></p>
<p>It&#39;s time to learn something weird about the Internet again.</p>
<h2 id="protocols">Protocols</h2>
<p>You&#39;ve probably heard of protocols before. Maybe you&#39;re even an expert in human-cyborg relations. Hopefully, this explainer sits well with all parties:</p>
<blockquote>
<p>Protocols are a formalized series of interactions to transmit information between two or more parties.</p>
</blockquote>
<p>That&#39;s my own homespun definition - so I&#39;ll happily accept edits or suggestions (an RFC, if you will). A potentially helpful analogy for protocols that I&#39;ve seen is a <a href="https://en.wikipedia.org/wiki/Japanese_tea_ceremony">Japanese tea ceremony</a> - a bunch of formal procedures to govern a specific shared experience.</p>
<p>Your favorite network - the Internet - has its own set of protocols that orchestrate its communication, with foundational ones like TCP/IP, as well as ones for things like email, file sharing, and hypertext - aka HTTP - aka the World Wide Web, the protocol that pretty much powers all your apps and sites and whatnots that you like so much.</p>
<p>But the Web -- and its Hypertext Transfer Protocol -- wasn&#39;t always top dog for sharing text on the Internet. There were rivals. Competitors. <em>Gophers.</em></p>
<p>I&#39;m no historian (despite being a history major -- how exactly does that work, anyway?), my folk-understanding-slash-Wikipedia-reading tells me this: while Tim Berners-Lee was inventing HTTP and the Web on a NeXT cube inside of a particle accelerator, a bunch of University of Minnesota (go Golden Gophers!) students and their professor were working on something they, of course, called the Gopher protocol.</p>
<p>Their RFC (<a href="https://datatracker.ietf.org/doc/html/rfc1436">RFC 1436</a>) is worth a skim. Gopher is a plaintext protocol well-suited for sharing text documents in a file system-like hierarchy - a <code>distributed document delivery system</code>, in their own words. </p>
<p>When you interact with a Gopher server, you&#39;ll typically first receive an odd-looking &quot;ls&quot;-style directory listing of contents, where the first character of each line tells you what type of item it is (e.g. <code>0</code> means file, <code>1</code> directory, <code>9</code> binary file, <code>8</code> is a telnet session, <code>g</code> is a gif image, and so on - <a href="https://datatracker.ietf.org/doc/html/rfc1436#section-3.8">read them all here</a>).</p>
<p>Here&#39;s the example from their RFC:</p>
<pre><code> 0About internet GopherFStuff:About usFrawBits.micro.umn.eduF70
 1Around University of MinnesotaFZ,5692,AUMFunderdog.micro.umn.eduF70
 1Microcomputer News &amp; PricesFPrices/Fpserver.bookstore.umn.eduF70
 1Courses, Schedules, CalendarsFFevents.ais.umn.eduF9120
 1Student-Staff DirectoriesFFuinfo.ais.umn.eduF70
 1Departmental PublicationsFStuff:DP:FrawBits.micro.umn.eduF70
</code></pre>
<p>Looks like something out of <em>War Games</em>, which makes me like this protocol very much, Dr. Falken. How about a nice game of chess?</p>
<p>As you may have guessed, Gopher did not win the war with HTTP. Wikipedia gives us a few supporting statements for this conclusion that I&#39;d like to jam into my 5 paragraph essay.</p>
<ol>
<li>U of Minn tried to charge for their Gopher server implementation for a while, before finally open sourcing it (1993 until 2000)</li>
<li>The <a href="https://en.wikipedia.org/wiki/Mosaic_(web_browser)">Mosaic web browser</a> could act as a Gopher client -- in addition to its main purpose of being a web browser</li>
<li>Gopher is just more rigid than freewheelin&#39; HTML</li>
</ol>
<p>Also, there&#39;s probably more reasons, including that it&#39;s not supes secure, being a plaintext protocol and all.</p>
<p>So, yeah, we&#39;re not surfing Gopherspace right now. But we can be! There are still devotees to Gopherdom, maintaining <a href="https://en.wikipedia.org/wiki/Phlog">phlogs</a> (which is a blog aka weblog, but taking the ph from &quot;gopher&quot; instead of the &quot;bl&quot; from &quot;webblog&quot;, ugh, enough).</p>
<p>Anyway... let&#39;s set up a Gopherhole!</p>
<h2 id="running-a-gopherhole-on-replit">Running a gopherhole on Replit</h2>
<p>I&#39;ll assume you&#39;re familar with <a href="https://replit.com/">Replit</a> (I&#39;ve written about <a href="https://www.charlieharrington.com/computers-by-the-decade">my affinity for Replit before</a>) - but, if you&#39;re not, it&#39;s a service that lets you easily spin up little environments for running code, servers, etc. I run my <a href="https://www.charlieharrington.com/sql-powered-reading-list">ROAPI Google Sheet to SQL book library</a> on a Replit repl, for example. More importantly, Replit seems to be an increasingly great place for folks learning how to code and sharing tutorials, so I&#39;m always keen to use it and contribute to the &quot;learning to code&quot; community.</p>
<p>Back to business. Some Googling reveals that the <a href="https://github.com/jgoerzen/pygopherd">pygopherd</a> project seems like a nice, credible, easy way to get a Gopher server up and running. But spelunking the Github issues tells us that this project is another victim of the Python2/3 migration. Luckily, there&#39;s a relatively recent <a href="https://github.com/michael-lazar/pygopherd">Python3 fork</a> we can try!</p>
<p>So, create a new Python repl and <code>pip install pygopherd</code>. Because we&#39;re using Replit and not our own fully controlled machine, we&#39;re going to have to do some fiddly stuff with the library&#39;s config to get this working. I copy/pasted the pygopherd&#39;s config file and mime.types file from the repo into my repl&#39;s root directory. I did have to comment out a bunch of the default config settings - it&#39;s probably easier for you to just fork my repl, rather than go through everything here. Click &quot;Show files&quot; and view the &quot;config.conf&quot; file.</p>
<iframe frameborder="0" width="100%" height="500px" src="https://replit.com/@whatrocks/gopherhole?embed=true"></iframe>

<p>The actual interesting bit worth chatting about is the &quot;gopher&quot; folder. You can call this folder anything you want (just adjust that line in the config file), but this is where your phlog or gopherhole lives! Every folder will need a &quot;gophermap&quot; plaintext file to share its contents. Here&#39;s my directory structure:</p>
<pre><code>gopher/
   gophermap
   stories/
       christmas-at-grants-tomb.txt
       plastic-man-on-the-moon.txt
       gophermap
</code></pre>
<p>And here&#39;s my top-level gophermap:</p>
<pre><code>Welcome to my gopherhole - this is weird, right?!

nav:
1Fahrenheit52    ./stories
</code></pre>
<p>My gopherhole lets you click into a &quot;stories&quot; folder and then click into two of my short stories from my <a href="https://f52.charlieharrington.com/">Fahrenheit 52 weekly writing project</a>.</p>
<p>Here&#39;s the gophermap for the <code>stories</code> folder:</p>
<pre><code>0Plastic Man on the Moon    ./plastic-man-on-the-moon.txt
0Christmastime at Grant&#39;s Tomb    ./christmastime-at-grants-tomb.txt
</code></pre>
<p>Note the <code>0</code> as the first character on the lines for text files and the <code>1</code> for the directories, as specified by the RFC. Double note - you literally a literal &quot;tab&quot; character between the file name and its location. I had to open up TextEdit, hit tab, and then copy/paste it into Replit to make this work.</p>
<p>Now, with your files in place, and your config adjusted (like I said, just use mine), you can start your Gopher server:</p>
<pre><code class="language-bash">pygopherd /home/runner/{YOUR_REPL_NAME_HERE}/config.conf
</code></pre>
<p>You should see this Gopherspace pop up in the Replit browser window! Here&#39;s mine, in our third iframe of the blog post thus far:</p>
<iframe frameborder="0" width="100%" height="500px" src="https://gopherhole.whatrocks.repl.co"></iframe>


<p>Very cool! Go ahead, click stuff. You can navigate to and read <a href="https://f52.charlieharrington.com/stories/plastic-man-on-the-moon/">my story about an action figure on the Moon</a>.</p>
<p>However, it looks like we&#39;re just interacting with a Web interface rather than accessing my gopherspace via the actual gopher protocol. That&#39;s no good. It does give a link to &quot;view with gopher&quot;, but this doesn&#39;t work, even when you try it with curl. I suspect there&#39;s something blocking this on the Replit side - I&#39;ve tried adjusting the ports many times, but haven&#39;t been able to figure this out. Any Replit folks out there who might have an idea, let me know.</p>
<p>Still, this is decent progress. Words of affirmation. But I really do want to view my stuff through Gopher itself. Let&#39;s try it out on our own home server.</p>
<h2 id="running-a-gopherhole-on-a-raspberry-pi-on-your-tailscale-network">Running a Gopherhole on a Raspberry Pi on your Tailscale network</h2>
<p>I&#39;ve got one of those cute Raspberry Pi keyboard computers at home, because its the perfect machine, connected via <a href="https://tailscale.com/">Tailscale</a> (another one of my favorite services/companies/tools in the world).</p>
<p>We can do a fairly identical setup to Replit to get this working. Create a new project folder on your Raspberry Pi, spin up a virtualenv, pip install the <code>pygopherd</code> package, add the same files from the Repl and you&#39;re basically done! There&#39;s a few slight changes to the config file (again, these changes are mainly just commenting out a few lines and adjusting the filesystem location of a few files, like the config). I posted my <a href="https://github.com/whatrocks/gopherhole">setup to Github</a> if you want to follow along on your own machine. </p>
<p>After we start up pygopherd again (same command as before, with Replit - just provide the location of your config file), we can try curling our gopherspace:</p>
<pre><code class="language-bash">curl gopher://charliesraspberrypi:4444/1/

iWelcome to my gopherhole - this is weird, right?!    fake    (NULL)    0
i    fake    (NULL)    0
inav:    fake    (NULL)    0
1Fahrenheit52    /./stories    pit    4444    +
</code></pre>
<p>Woot! We&#39;re finally gophering over here. I&#39;m not sure what these &quot;fake&quot; and &quot;NULL&quot;s are all about. Something for later. You may also note that the port is <code>4444</code> which I arbitrarily picked (this is another thing you&#39;ll want to adjust in your config file), and the host name will be the IP of your Raspberry Pi.</p>
<p>Let&#39;s try to fetch one of our stories next.</p>
<pre><code>curl gopher://charliesraspberrypi:4444/1/stories/plastic-man-on-the-moon.txt
</code></pre>
<p>It works again! Now, we&#39;re not exposing our Tailnet to the Internet, so this will only work when I&#39;m on the VPN, but hey -- I&#39;ve got a gopherspace now, and you can, too.</p>
<h2 id="the-future-of-gopher">The future of gopher</h2>
<p>I wouldn&#39;t go betting the family farm on this protocol, but if you&#39;re into computer history like me, this can be a fun thing to poke around with. There are others like us out there. Actually, I learned that, for a while, you could <a href="http://antirez.com/news/127">run a Gopherhole directly in Redis</a>! </p>
<p>As for me and my gopher future, I&#39;d like to keep dabbling. Maybe write my own terminal client? Maybe set up an actual gopher server on a cloud provider to mirror my blog?</p>
<p>The possibilities here are... limited.</p>
]]></description>
            <link>https://www.charlieharrington.com/surfing-the-gopherspace</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/surfing-the-gopherspace</guid>
            <pubDate>Tue, 10 May 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[SQL-Powered Reading List]]></title>
            <description><![CDATA[<p>I have some items burning a hole on my to-do list, so instead I made my <a href="https://www.charlieharrington.com/library">reading list</a> queryable via SQL.</p>
<p><img src="https://www.charlieharrington.com/img/sql-reading-list/booklist.png" alt="Book List"></p>
<p>Hit the <strong>I&#39;m Feeling Lazy</strong> button if you&#39;re not feeling especially structured in your queries.</p>
<h2 id="whats-going-on-here-exactly">What&#39;s going on here, exactly?</h2>
<p>I keep my reading list in a Google Sheet. Here&#39;s what I looks like (...it&#39;s just a spreadsheet). </p>
<p><img src="https://www.charlieharrington.com/img/sql-reading-list/spreadsheet.png" alt="Book List"></p>
<p>For a while, I was relying heavily on Goodreads for my reading data, but now I&#39;m doing my best to live up to Tom MacWrite&#39;s <a href="https://www.charlieharrington.com/https://macwright.com/2022/02/24/indie-bookshelves.html">Indie Bookshelves guidance</a>, though, like he suggests, I&#39;d ideally love to have some sort of <a href="https://indieweb.org/POSSE">POSSE</a> (Publish (on your) Own Site, Syndicate Elsewhere) setup going.</p>
<p>As you may have noticed (if you squinted), I&#39;m still behind in inputting all of my &quot;data&quot; (the <em>is_fiction</em> and <em>is_reread</em> columns are still not fully populated). Also adding new entries is still painfully manual, which needs further thinking.</p>
<p>But - the key thing here - this reading list is already good/useful enough for an experimental library feature!</p>
<h2 id="roapi">ROAPI</h2>
<p>My friend QP is a genius and the best programmer I know (hi, QP!). One of his most recent projects is called <a href="https://roapi.github.io/docs/index.html">ROAPI</a> (read-only API). Here&#39;s how he describes it:</p>
<pre><code class="language-markdown">ROAPI automatically spins up read-only APIs for static datasets without requiring you to write a single line of code. It builds on top of Apache Arrow and Datafusion. The core of its design can be boiled down to the following:

* Query frontends to translate SQL, GraphQL and REST API queries into Datafusion plans.
* Datafusion for query plan execution.
* Data layer to load datasets from a variety of sources and formats with automatic schema inference.
* Response encoding layer to serialize intermediate Arrow record batch into various formats requested by client.
</code></pre>
<p>He even made a diagram:</p>
<p><img src="https://www.charlieharrington.com/img/sql-reading-list/roapi.svg" alt="ROAPI"></p>
<p>I&#39;ve been looking for excuses to use ROAPI (I even started learning Rust this month so that I could help contribute to the project. So far, I&#39;ve made a few measly PRs to ROAPI, but I also got distracted by learning how to make a Dungeon Crawler 2D game in Rust - which you can even <a href="https://whatrocks.github.io/rusty-dungeon/">play online</a> via WASM!).</p>
<p>ROAPI already supports Google Sheets as a datasource, so this tutorial is pretty much already done. The magic of ROAPI is that there&#39;s no bespoke code I need to write - all I need to do is set up its config file to point to my Google spreadsheet and I&#39;ve got a fast API server that can perform bi-directional communication in JSON, SQL, or GraphQL. Which is insanely cool.</p>
<p>I just needed somewhere to host ROAPI. QP provides a pre-built Docker image as well as via a Python package. My first thought was to host on a free Heroku dyno, but I had some trouble getting their dynamic PORT env variable to work correctly (despite me adding support in ROAPI to set the PORT via env vars, which I tested and confirmed works! Oh, well.)</p>
<p>My next idea was to do something I&#39;d been meaning to do for a while - check out Replit&#39;s &quot;always-on&quot; REPL mode.</p>
<h2 id="replit">Replit</h2>
<p>I&#39;ve written before about <a href="https://www.charlieharrington.com/computers-by-the-decade">my love for Replit</a>. </p>
<p>Here&#39;s how I got my ROAPI setup on Replit</p>
<ul>
<li>Create a Python repl (make it Private, so you need to be on their $7/month Hacker plan)</li>
<li>Install &quot;roapi-http&quot; in packages tab</li>
<li>Create a file: &quot;roapi.yaml&quot; with these contents</li>
</ul>
<pre><code class="language-yaml">tables:
  - name: &quot;library&quot;
    uri: &quot;https://docs.google.com/spreadsheets/d/1FCKSd4GBZIOe-bQG7k7Y3oA_MqMrxEx0QDzdkrkzIgI/edit&quot;
    option:
      format: &quot;google_spreadsheet&quot;
      application_secret_path: &quot;ohsheet.json&quot;
</code></pre>
<ul>
<li>Create another file called &quot;ohsheet.json&quot; (or whatever you put in your config file) with your Google Sheets creds (remember this REPL needs to be private). Follow QP&#39;s <a href="https://roapi.github.io/docs/config/dataset-formats/gsheet.html">Google Sheets guide in the ROAPI docs</a> for instructions of how to get these creds. Feature request for Replit: it would be nice if there were a (hacky) way to read Replit&#39;s &quot;Secrets&quot; (env vars) in a YAML file, so that I didn&#39;t have to do this.</li>
<li>Update &quot;main.py&quot; with these contents:</li>
</ul>
<pre><code class="language-python">import subprocess
import os

my_env = os.environ.copy()
my_env[&quot;HOST&quot;] = &quot;0.0.0.0&quot;

process = subprocess.Popen(
  [
    &#39;roapi-http&#39;,
    &#39;-c&#39;,
    &#39;./roapi.yml&#39;
  ],
  env=my_env,
  stdout=subprocess.PIPE,
  universal_newlines=True,
)

while True:

  output = process.stdout.readline()
  print(output.strip())
  
  return_code = process.poll()
  if return_code is not None:
    print(&#39;RETURN CODE&#39;, return_code)
    for output in process.stdout.readlines():
        print(output.strip())
    break  
</code></pre>
<ul>
<li>Hit Run at the top and we&#39;re done! I can see my logs in the bottom right corner for any incoming requests. Replit&#39;s like being able to SSH into your API server and make random changes at will - dangerous AND fun!</li>
</ul>
<p><img src="https://www.charlieharrington.com/img/sql-reading-list/replit.png" alt="Replit"></p>
<p>My API is public, so anyone can give this a shot in their terminal (why not try out the GraphQL endpoint?):</p>
<pre><code class="language-bash">curl -X POST -d &quot;query { library(limit: 10) {title, amazon_link, author, is_favorite} }&quot; https://roapi-library.whatrocks.repl.co/api/graphql

[{&quot;title&quot;:&quot;Heir to the Empire&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3r38doD&quot;,&quot;author&quot;:&quot;Timothy Zahn&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;Dark Force Rising&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3pXfpkE&quot;,&quot;author&quot;:&quot;Timothy Zahn&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;The Making of Prince of Persia&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/2Pcc7gE&quot;,&quot;author&quot;:&quot;Jordan Mechner&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;Butcher&#39;s Crossing&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3kvbGtz&quot;,&quot;author&quot;:&quot;John  Williams&quot;,&quot;is_favorite&quot;:true},{&quot;title&quot;:&quot;Surely You&#39;re Joking, Mr. Feynman!: Adventures of a Curious Character&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/2MxqkUu&quot;,&quot;author&quot;:&quot;Richard P. Feynman&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;This Boy&#39;s Life&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3r8gqru&quot;,&quot;author&quot;:&quot;Tobias Wolff&quot;,&quot;is_favorite&quot;:true},{&quot;title&quot;:&quot;The Once and Future King&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/2NErKgH&quot;,&quot;author&quot;:&quot;T.H. White&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;The Knight&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3bLgUNH&quot;,&quot;author&quot;:&quot;Gene Wolfe&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;Birds Without Wings&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/3r5oQQi&quot;,&quot;author&quot;:&quot;Louis de Bernières&quot;,&quot;is_favorite&quot;:false},{&quot;title&quot;:&quot;Cryptonomicon&quot;,&quot;amazon_link&quot;:&quot;https://amzn.to/2O402cV&quot;,&quot;author&quot;:&quot;Neal Stephenson&quot;,&quot;is_favorite&quot;:false}]
</code></pre>
<p>I have no idea what happens if this endpoint gets hammered. Maybe Replit just turns it off? Regardless, I enabled their &quot;Always On&quot; feature, as well as &quot;Boosted&quot; which gives my REPL some extra compute juice.</p>
<h2 id="no-drop-table-library-does-not-work">No, &#39;drop table library&#39; does not work</h2>
<p>Cause it&#39;s &quot;read only&quot;, remember?</p>
<p>My library is up and running and you can <a href="https://www.charlieharrington.com/library">try it out</a> now. I even added a consistent query param with the SQL query so that I could share links to books about <a href="https://www.charlieharrington.com/library/?sql=select+author%2C+title%2C+cover_url%2C+amazon_link+from+library+where+topic+%3D+%27Writing%27+order+by+year_read+desc%3B">Writing</a> or <a href="https://www.charlieharrington.com/library/?sql=select+author%2C+title%2C+cover_url%2C+amazon_link+from+library+where+is_favorite+%3D+true+and+topic+%3D+%27Ancient+Rome%27+order+by+year_read+desc%3B">my favorite books about ancient Rome</a>, for example. I used a bunch of &quot;vanilla JS&quot; to make this work, given that my blog is a static site built with Syte / EJS, so there was a lot of googling for <code>XMLHTTPRequest</code> docs.</p>
<p>Some things I&#39;m going to think about more, next time I&#39;m procrastinating:</p>
<ul>
<li><input disabled="" type="checkbox"> Automatically trigger daily restarts of the REPL so that I can get an updates to the spreadsheet (ROAPI does not yet dynamically re-load contents, it only does so one time, at the beginning)</li>
<li><input disabled="" type="checkbox"> Finish up adding the remaining fields/data to the spreadsheet, maybe while re-watching Halt and Catch Fire.</li>
<li><input disabled="" type="checkbox"> I can&#39;t seem to get doubly-nested <code>group by</code> SQL queries working, maybe I can look into this on the ROAPI side</li>
<li><input disabled="" type="checkbox"> Add WASM support to ROAPI so that I don&#39;t need a server at all</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/sql-powered-reading-list</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/sql-powered-reading-list</guid>
            <pubDate>Tue, 08 Mar 2022 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Smart Phone, Dumb Terminal]]></title>
            <description><![CDATA[<p>I&#39;m typing this post on my iPhone in the <a href="https://obsidian.md/">Obsidian iOS app</a> using a <a href="https://amzn.to/3rAZfjc">Logitech K380 Bluetooth keyboard</a> and I feel like a 90s computer hacker.</p>
<p>Not enough? How about this: I just SSH&#39;ed into a <a href="https://amzn.to/3zE2AkE">Raspberry Pi</a> on my home network using <a href="https://tailscale.com/">Tailscale</a> via the <a href="https://termius.com/">Termius</a> iOS app to restart a <a href="https://www.charlieharrington.com/flow-and-creative-computing">YouTube-playlist-to-podcast-feed Docker container</a>. </p>
<p>Don&#39;t get me wrong -- the other stuff is pretty magical, too, especially Tailscale. But this keyboard-to-phone takes the cake.</p>
<p>I mean, look at this:</p>
<p><img src="https://www.charlieharrington.com/img/keyboard.jpg" alt="Dumb terminal smart phone"></p>
<p>It&#39;s downright cute, aside from the legs.</p>
<p>You kinda forget that your phone is a computer, personally-speaking. Instead, it&#39;s usually just a vehicle for social media nightmares. Given the choice between doing something semi-arduous, like checking in for a flight, on a phone app vs the website (on a desktop/laptop), I always choose the latter. Somethings always missing from the app, and if you really want to get all fiddly, which I usually do, they kick you out to a crappy webview anyway.</p>
<p>So, I&#39;m usually a laptop-bringer on any trip. Except, this time, I didn&#39;t want to. Firstly, my alu-min-i-um portable computer is just plain heavy and bulky, and I was adamant that we were going carry-on only on this voyage. Even more damning, I recently discovered that opening the laptop screen beyond 45 degrees results in the black screen of death. That&#39;s something for the Geniuses, if they&#39;re willing indulge an admittedly long in the tooth 2016 MBP (I&#39;m doubtful).</p>
<p>But I did want to be able to work on edits for my book on this trip. You never know when inspirations gonna strike (usually, for me, around midnight, when I&#39;ve already gone to bed), and while I&#39;m reasonably fast thumb-typist, I just don&#39;t feel the flow feels on the phone keyboard.</p>
<p>Luckily, we had this little Bluetooth cutie tucked away in a closet. I&#39;d purchased it as a gift for Carly, so that she could write stuff on the go (very much the same need I&#39;m talking about here). We&#39;d extensively discussed the need for a mobile keyboard writing thingie early in our courtship, and we even entertained the idea of building it ourselves (hint: I&#39;m still entertaining this idea). </p>
<p>We&#39;re not alone. See the <a href="https://getfreewrite.com/products/freewrite-smart-typewriter">FreeWrite</a> products, which somehow don&#39;t quite fit the bill for me, despite almost exactly delivering on our dream product (full-sized keyboard, e-ink-like screen, and supreme battery life). Mostly it&#39;s the calculator-sized screen (and the perceived bulky size) that&#39;s scaring me away. We want something that you can keep in a purse or a pocket.</p>
<p>Now this Bluetooth keyboard doesn&#39;t fit in a pocket, but it&#39;s also pretty darn cheap, enough so that I&#39;m not going to be devastated if I lose it or spill a beer on it.</p>
<p>So, I thought I&#39;d give it a try this trip. And I&#39;m sold. It&#39;s legit fun to type on this thing and I think I&#39;m going to bring it with me more places. Along with things like Tailscale and Termius, I can treat my smart phone as a dumb terminal to my real computers.</p>
<p>Carly still hasn&#39;t given the keyboard a try, but I&#39;m holding out hope. She&#39;s watching me tap-tap away right now, and I think this is a gift that just takes a while to kick in.</p>
<p>And, meanwhile, I&#39;m going to keep thinking about keyboards-as-computers, whether that&#39;s scouring eBay for Commodore VIC-20s, ogling over the latest <a href="https://amzn.to/3749iE0">Raspberry Pi 400</a> keyboard-computer, or sketching out our still-yet-to-be-realized &quot;Kindle for writing.&quot; </p>
<p>On the latter item, I&#39;m also ogling the <a href="https://remarkable.com/">ReMarkable 2</a> as an potential winning entrant, but the lack of keyboard and the lack of backlight are keeping me away... for now. If they&#39;re tracking dropped cart analytics at all, I&#39;m just going to apologize now for what I&#39;ve been doing. You can keep retargeting me if you&#39;d like. You&#39;ll get me one day.    </p>
]]></description>
            <link>https://www.charlieharrington.com/smart-phone-dumb-terminal</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/smart-phone-dumb-terminal</guid>
            <pubDate>Sun, 25 Jul 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Writes With]]></title>
            <description><![CDATA[<p>Earlier today, I texted some friends that I regret using <a href="https://www.gatsbyjs.com/">Gatsby</a> for this blog. It came at a moment of frustration, when I was stuck in some weird Node dependencies hell and all I wanted was to write another blog post.</p>
<p>If your static site generator does nothing else, it should make it frictionless to write a new blog post. It&#39;s hard enough to make the time to write, your software shouldn&#39;t be making it harder. </p>
<p>Why did I use Gatsby in the first place? Well, it was new and shiny and uses GraphQL. That&#39;s enough, right? Really, at the time, I had these grand ambitions of interactive React components within my posts, which I knew would be possible, and possibly easy, with a React-based static site generator. To this date, I&#39;ve written exactly <a href="https://www.charlieharrington.com/pseudoclassical-star-wars">one</a> of these interactive posts, and that was <em>before</em> I made the Gatsby-switch and I still have never actually ported it from my original Pelicon static site. This post used to have all these Tie Fighters flying around and now it doesn&#39;t and I&#39;m still a little bummed about it. If any of that intrigues you, my little Star Wars game is still <a href="https://whatrocks.github.io/aluminum-falcon/">online</a> - it&#39;s one of the first things I ever made when I learned how to program.</p>
<p>So, anyway, why not switch away from Gatsby? Am I using any of the advanced features of Gatsby? Yes, I am. There&#39;s an active plugin ecosystem and I use a bunch of them for things like generating my RSS feed or rendering images or displaying my library or my Instagram posts. But I&#39;ve realized that some of these, especially the ones that leverage external APIs like the Instagram one, are more trouble than they&#39;re worth.</p>
<p>With the Instagram plugin/API, all I want to do is <a href="https://www.charlieharrington.com/walkingman">display a neat little grid of all the &quot;walking man&quot; street signs I&#39;ve discovered</a> and posted to Instagram. But, like all Web 2.0 API platforms, Instagram&#39;s API usefulness was continually walked back until it&#39;s virtually impossible to do basic things like display your photos (because they want to keep all these useful actions within their own platform/app), and I&#39;m now forced to create a &quot;test account&quot; on a Facebook &quot;app&quot; with a temporary token that expires like every 30 days or something. Now, every time I go to write a new post here, which is usually &gt; 30 days, I can&#39;t even build my blog locally because the Gatsby build process fails from the expired Instagram token. I want to blame Instagram here, or Gatsby, but instead, I blame myself. </p>
<p>Keep your friends close, and your blog&#39;s dependencies closer.</p>
<h2 id="a-simpler-static-site-generator">A simpler static site generator</h2>
<p>Here&#39;s where I announce that I&#39;ve written a new, <em>better</em>, static site generator, the fourth step in the hero&#39;s journey of software engineering.</p>
<p>But, nope. Instead, I&#39;m just gonna use the one that my pal <a href="https://benreinhart.com/">Ben</a> created. It&#39;s called <a href="https://benreinhart.com/syte">Syte</a>. It&#39;s extremely lightweight, fast, and does exactly what I really want -- render Markdown files in an HTML template.</p>
<p>So, have I switched my blog over to Syte yet? Not yet. But I&#39;m gonna. The main thing that&#39;s missing (for me) in Syte is RSS feed generation. I&#39;d like to contribute that back to Ben&#39;s repo at some point. I can probably live without the rest of the junk I&#39;ve bolted onto this site. It may mean that I temporarily dismantle my cool, query-param powered <a href="https://www.charlieharrington.com/library">library searching page</a>, but that&#39;s a worthy price to pay for being able to write a blog post exactly when I want to, no questions asked.</p>
<p>My inability to bear the blog switching costs at this moment isn&#39;t going to stop me from another time-waster of a side project: a new interview site, using Syte, that asks writers about the stuff they use to write, edit, and otherwise create their books!</p>
<h2 id="writes-with">Writes With</h2>
<p><img src="https://www.charlieharrington.com/img/writeswith.png" alt="Writes With logo"></p>
<p>The <a href="https://www.writeswith.com/">Writes With</a> syte is already live, with two interviews: <a href="https://writeswith.com/interviews/brian-dear/">Brian Dear</a>, author of <strong>The Friendly Orange Glow: The Untold Story of the PLATO System and the Dawn of Cyberculture</strong>, and <a href="https://writeswith.com/interviews/pooja-reddy/">Pooja Reddy</a>, author of <strong>The Big Bold Blue</strong>.</p>
<p>Making it was a joy with Syte and I&#39;m happy with it, even if my &quot;design&quot; is still pretty bare bones. I also deployed it with <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>, which mostly importantly comes with (at least for now) free bandwidth. This blog uses Netlify for hosting, which I do like, but occasionally suffer from bandwidth spikes near the end of the monthly billing cycles that trigger their bandwidth &quot;add-ons&quot; fees.</p>
<p>Writes With is directly, clearly, obviously, duh inspired by one of my favorite websites: <a href="https://usesthis.com/">usesthis.com</a>. In fact, I chatted with Daniel of usesthis.com before launching it, just to make sure he was okay with it, and he gave the thumbs up.</p>
<p>I like this little project, because I&#39;m going to get to talk with more people who&#39;ve published books. As a cub writer myself, I&#39;m happy for any tips and tricks I can get.</p>
<p>And I know, I know, the tools aren&#39;t the important thing about writing... but I think we all still want to know about them.</p>
]]></description>
            <link>https://www.charlieharrington.com/writes-with</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/writes-with</guid>
            <pubDate>Thu, 24 Jun 2021 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[School Supplies]]></title>
            <description><![CDATA[<p>Somedays I remember that I have a <a href="https://amzn.to/2H8SH8O">loop pedal</a>.</p>
<p><img src="https://www.charlieharrington.com/img/loop.png" alt="loop pedal"></p>
<p>Those are the best sorts of days.</p>
<p>Somedays that leads to a new song.</p>
<h3 id="a-loop-pedal-is-a-stack">A loop pedal is a stack</h3>
<p>A loop pedal is a magical device that lets you record in stacked layers. It&#39;s almost like editing something in Figma or Sketch, except each layer is the same &quot;shape&quot; as the first or root layer. And by <em>shape</em> here what I actually mean is <em>length</em>.</p>
<p>Like other guitar pedals, a loop pedal lives somewhere between your guitar (the input) and your amp (the output). It receives the input from your instrument and &quot;does stuff&quot; with it, before sending it onwards. For example, maybe you want to add some <strong>distortion</strong> or <strong>flange</strong> -- OR BOTH. Your guitar pedals are like the world&#39;s simplest data flow pipeline. </p>
<pre><code>Guitar -&gt; Distortion Pedal -&gt; Flanger Pedal -&gt; Chorus Pedal -&gt; Amp
</code></pre>
<p>No cycles or braching in this DAG. I mean, maybe there could branching. Or cycles. I bet some guitarists do that, somehow. But that&#39;s beyond my pay grade.</p>
<p>Let&#39;s go back to our loop pedal and record something.</p>
<p>Imagine that I tap the loop pedal with my foot, play the following, and tap the pedal again.</p>
<pre><code>X X X X X X X X
</code></pre>
<p>Each X here might represent one &quot;measure&quot; or &quot;bar&quot; in music theory land, but that&#39;s mostly unfamiliar territory for me, too, so instead we can say that we&#39;ve played the X chord (I wish there was an X chord) 8 times of some fixed duration.</p>
<p>This is now our root layer for our stack.</p>
<p>By default, the pedal will keep &quot;looping&quot; this layer. You can double-tap it to &quot;stop the loop&quot; (maybe you&#39;d do this when you reach a new section of your song, like the chorus).</p>
<p>Otherwise, now it&#39;s time to add some more layers. Tap the pedal again and you add the following layer:</p>
<pre><code>X X X X X X X X
  y   y     y y
</code></pre>
<p>Maybe <code>y</code> is an awesome solo or something. Then you do it again.</p>
<pre><code>X X X X X X X X
  y   y     y y
z z z z z z z z
</code></pre>
<p>Now, this pattern will keep repeating over and over, expanding to the right.</p>
<pre><code>X X X X X X X X X X X X X X X X --&gt;
  y   y     y y   y   y     y y --&gt;
z z z z z z z z z z z z z z z z --&gt;
</code></pre>
<p>What happens if you are recording a layer that extends longer than the root layer? Good question. The recording simple wraps around to the beginning of the root layer and you can keep going. However you will notice that you are already hearing what you recorded for this layer, so that can sound strange. Let&#39;s show an example.</p>
<p>I&#39;m going to add a layer that just plays ascending notes up the guitar neck (a really crappy solo) and have this layer wrap around.</p>
<pre><code>X X X X X X X X
  y   y     y y
z z z z z z z z
1 2 3 4 5 6 7 8
</code></pre>
<p>So far, so good. Why not keep going...</p>
<pre><code>X X X X X X X X
  y   y     y y
z z z z z z z z
1 2 3 4 5 6 7 8
9 10
</code></pre>
<p>As you can see, my latest layer wrapped around to the beginning, such that when I played the <code>9</code>, you would hear the <code>1</code> at the same time. This may or may not be what you want to do. I&#39;m guessing.. no. Especially if you&#39;re playing some epic Type II guitar solo.</p>
<p>Thus, one of the more common use cases of the loop pedal is to lay down some repeatable groove that you can sing various verses or solo over. Instead of making the &quot;unique&quot; or &quot;changable&quot; a layer in your loop stack, you just keep that off to the side.</p>
<p>Reader beware that my loop pedal is relatively simple. There are other, better, more-intense loop pedals where you can have multiple different loop stacks going at the same time. For example, maybe you&#39;ve got a loop going for the verses and another separate loop stack for the choruses in your song.</p>
<p>But I appreciate the simplicity of my pedal. The one thing I still haven&#39;t figured out is whether or not you can do the <code>pop</code> stack operation on it. The <a href="https://www.boss.info/us/products/rc-1/">documentation</a> suggests that you can erase the top layer of the stack, but I haven&#39;t figured it out yet. For now, I&#39;ve been living in a <code>push</code> only world, flubs included, which you&#39;ll hear in the next section.</p>
<h3 id="school-supplies">School Supplies</h3>
<p>Hello, world, this is your premiere of SCHOOL SUPPLIES, the third single off my forthcoming EP: &quot;Greetings From Buttzville, NJ&quot;:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/o57rqh88CJY" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>The chords, for those interested (looking at you, The Grones) are:</p>
<pre><code>Verse
G Bm Em C

Chorus
D G C

Outro(key change!)
A C#m F#m D
</code></pre>
<p>That&#39;s right! I pulled off my first key change. Thank you, Taylor Swift &quot;Love Song&quot; for the daily inspiration.</p>
<p>I&#39;ll leave the lyrics as an exercise for the reader.</p>
<h4 id="uncle-mikes-tips-for-running-a-zoom-based-open-mic-night">Uncle Mike&#39;s Tips for Running a Zoom-Based Open Mic Night</h4>
<p>Big thanks to Uncle Mike for organizing our second Zoom family open mic night. He runs a tight ship, mostly trying to prevent me from launching into a <a href="https://www.charlieharrington.com/bullet-train-to-merlins-grave">Bullet Train to Merlin&#39;s Grave medley like at Popestock</a>.</p>
<p>To paraphrase his tips:</p>
<ul>
<li>Each performer gets one song, of &quot;normal song length&quot; (so that means no Tubular Bells)</li>
<li>Announce the order in advance</li>
<li>Tune up your instrument when you&#39;re on deck or in the hole</li>
<li>Don&#39;t worry about messing up, start over if you need to, this is fun. Music is the best!</li>
<li>Change your zoom settings to &quot;Original Sound&quot;</li>
</ul>
<p>This last one is key. Zoom does some &quot;stuff&quot; to make things sound &quot;good&quot; during boring work meetings that are boring. It&#39;s not optimized for fun singalongs that are fun. So, it&#39;s pretty much essential to <a href="https://support.zoom.us/hc/en-us/articles/115003279466-Enabling-option-to-preserve-original-sound">follow these steps</a> when you&#39;re singing and strumming over Zoom, unless you&#39;re trying to incorporate cosmic waves of hollow nothingness into your jam. Maybe you are?</p>
<p>Oh, you should check out Uncle Mike&#39;s music podcast, <a href="https://www.tellyouwhatpodcast.com/">Tell You What! The Podcast</a>. He interviews young musicians and bands on the run and it&#39;s fun and great and keeps you on your toes with new upcoming artists.</p>
<p>As Uncle Mike says, music is the best!</p>
]]></description>
            <link>https://www.charlieharrington.com/school-supplies</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/school-supplies</guid>
            <pubDate>Mon, 16 Nov 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Unexpected, Useless, and Urgent]]></title>
            <description><![CDATA[<h4 id="or-what-rss-gets-right">Or, What RSS Gets Right</h4>
<p>Abraham Lincoln once said, &quot;<a href="https://en.wikipedia.org/wiki/Marshall_McLuhan">The medium is the message</a>. And San Francisco summers are cold af.&quot;</p>
<p>Putting that aside, I&#39;ve been thinking a lot (uh-oh) about why I like opening up my RSS reader app so much. And I&#39;m not <em>just</em> talking about its looks, even though it&#39;s super cute (I&#39;m using the free, open-source, and all-around neato <a href="https://ranchero.com/netnewswire/">NetNewsWire</a> for my RSS needs).</p>
<p>No, I&#39;m talkin&#39; about them RSS <em>feels</em>.</p>
<p>Why does using opening my RSS inbox feel so much better than typing in gmail.com or tapping the iMessages icon or, heavens forbid, opening up Twitter?</p>
<p>With my sweet-sweet RSS, there&#39;s no anxiety. There&#39;s no guilt. In our time-tracking Screen Time home screen widget era, there&#39;s almost a baccanalian decadance to sifting through an RSS inbox, like watching honey drip from one of those wooden combs in a cereal commercial. Or -- back when we were allowed -- going to the library and reading the newspaper from those weird wooden dowels.</p>
<p>It should go without saying that this feeling does not extend to the other inboxen in my life. And I&#39;d like to understand why -- and see if I can do anything about it.</p>
<h2 id="a-framework-for-messages">A framework for messages</h2>
<p>Butchering some data pipeline terms, let&#39;s define an inbox (e.g. email, social media, text messages, RSS, phone calls) as a sink for messages from various data providers, where these messages wait for human-in-the-loop processing (in this case, you).</p>
<p>O! Ye of little time! How are you meant to evaluate the &quot;importance&quot; of a given message? Let&#39;s explore that across two vectors: (1) prior awareness of the message&#39;s sender and (2) usefulessness of the message contents.</p>
<p><img src="https://www.charlieharrington.com/img/msggrid.png" alt="grid"></p>
<p>The sweet-spot is that upper row: useful messages from both &quot;people we know&quot; and &quot;people we don&#39;t know.&quot; Whereas if you&#39;re in the bottom row, you&#39;re gonna have a bad time: useless messages are never... useful.</p>
<h4 id="filtering-on-sender">Filtering on sender</h4>
<p>The bottom right quadrant is easy to visualize: robo-calls about your non-existent car&#39;s expired warranty, social media ads, junk mailers in your meatspace mailbox. </p>
<p>You might think, perhaps, that we can use the &quot;Expected Sender&quot; vs &quot;Unexpected Sender&quot; filter to avoid this quadrant. In fact, this is what Apple allows you to do with the new <a href="https://support.apple.com/en-us/HT207099#:~:text=To%20turn%20on%20Silence%20Unknown,in%20your%20recent%20calls%20list.">Silence Unknown Callers</a> feature in iOS 14 (which doesn&#39;t actually prevent the calls, but immediately sends unknown calls to the dead-letter queue that is your voicemailbox).</p>
<p>The problem with this blunt approach of dead-letter queueing the right column is that you&#39;re going to miss the serendipity of the upper right quadrant: calls from unexpected sources with useful information. Given <a href="https://www.charlieharrington.com/colon-cancer">my recent cancer diagnosis</a>, I&#39;ve had tons of important, useful calls from unknown numbers every single day, from doctors and the like -- calls that I want to triage quickly. Sending all calls from unknown numbers straight to voicemail would just be yet another inbox to maintain. Worse, I might miss something important in the upper right quadrant.</p>
<p>A lighter touch approach here is to auto-classify your messages into buckets based on sender. Gmail now does this with their &quot;Primary&quot;, &quot;Social&quot;, and &quot;Promotion&quot; tabs. Everything&#39;s still &quot;in your inbox&quot;, but now you can usually just &quot;Select all&quot; on that Promotion tab and safely send those messages straight to the netherworld.</p>
<p>The bottom left quadrant is where your unique lifeforce is slowly chipped away, doomscrolling through your high school classmates&#39; life updates or, gasp, political views. Don&#39;t get me wrong -- I really enjoy Instagram and it makes me happy to see people I know doing cool, cute stuff. But I know it can get real bad in this quadrant real quick. Unfollowing and/or muting is key here.</p>
<h4 id="filtering-on-content">Filtering on content</h4>
<p>Okay, so, if filtering on sender alone doesn&#39;t work, can we use the message contents to figure out if a given message is going to be useful?</p>
<p>We&#39;re now talking about <em>pre-processing</em> the messages in our queues.</p>
<p>In the days of future past, you might have employed a staffer to &quot;sort through your office mailbox&quot; to do this. How very Don Draper of you. But in today&#39;s era of secure password managers and 2FA, we ideally don&#39;t have <em>that many</em> other people in our digital inboxes. The inbox providers are aware of this, and they&#39;re starting to provide some tools to help here -- as long as you&#39;re okay with them &quot;reading&quot; your messages.</p>
<p>Gmail, for example, has gotten pretty darn good at spam detection. They&#39;re &quot;reading your emails&quot; and dropping the bad ones into your &quot;spam folder&quot; dead-letter queue. Maybe, once in a blue moon, they false-positive something that you have to go spelunking into that elephant graveyard to find. But I&#39;m never annoyed by this, because when I see absolute garbage that they&#39;ve blocked for me day-in and day-out, I&#39;m hashtag grateful again.</p>
<p>This approach, however, isn&#39;t possible with all mediums. There&#39;s no way to pre-filter on content for an incoming phone-call, for example.</p>
<p>And the tradeoff in pre-filtering on content is, of course, privacy. </p>
<p>If you&#39;re down for your inbox provider to &quot;scan&quot; your messages, then they can potentially start to do some smart stuff, like &quot;bubbling up&quot; useful messages or getting rid of bottom row crud.</p>
<p>But, more likely than not, they&#39;re also reading them for another purpose.</p>
<h4 id="the-cost-of-free">The cost of free</h4>
<p>Many of these inbox platforms are free (e.g. social media, Gmail), and someone&#39;s gotta pay to keep that spam algorithm ticking. And that someone is you.</p>
<p>Most ads are squarely in the bottom right quadrant. &quot;Good&quot; ads -- I&#39;m talking about those Instagram candles you keep converting on -- are upper right quadrant. The platforms do their darndest to make sure their ads are as upper-right as possible, but they can&#39;t guarantee that. YouTube keeps asking me my age because it&#39;s genuinely confused as to why my viewing habits fluctuate between watching someone clean old Apple II and VIC-20 computers and the latest Super Mario 3 speed-runs. </p>
<p>And, c&#39;mon, I&#39;d rather just not ever see ads in the first place.</p>
<p>Okay, tough guy. Are you willing to pay for an ad-free inbox then?</p>
<p>Maybe? Ugh. Yes, there&#39;s a bunch of new players in the space who are emphasizing privacy and going ad-free. But am I going to willingly add yet another recurring subscription to my life? The Mandalorian is about to come back, and I&#39;m already bracing for the impending Disney+ subscription. </p>
<p>I&#39;ll come back to this, because our analysis is still missing two important features.</p>
<h2 id="a-framework-for-inboxen">A framework for inboxen</h2>
<p>So, far we&#39;ve only explored the features of an individual message -- not the nature of an inbox itself.</p>
<p>Regardless of an individual message&#39;s usefuless or your prior awareness of its sender, an inbox has two other important features that contribute to our mental well-being: (1) typical message volume and (2) expected urgency of triage.</p>
<p><img src="https://www.charlieharrington.com/img/inboxgrid.png" alt="inbox"></p>
<p>The message volume thing is straightforward. Some platforms have a never-ending feed of messages that you can &quot;enjoy,&quot; others not so much.</p>
<p>At the same time, each inbox medium connotes a inherent sense of urgency. <strong>The medium is the madness</strong>, if you will. No matter what the message says or who sends it, there&#39;s a differentiated inbox-level &quot;urgency punch&quot; to your lizard brain whenever any single message (spam or not) comes flying in.</p>
<p>Let&#39;s be more specific with some typical inboxes in our lives:</p>
<p><img src="https://www.charlieharrington.com/img/inboxoverlay.png" alt="inbox overlay"></p>
<p>Phone calls are just about as &quot;urgent&quot; as it gets. Prior to iOS 14, phone calls used to interrupt whatever you were doing, taking up your iPhone&#39;s entire screen real estate. Doesn&#39;t get more urgent-y than that! Luckily, calls are relatively sparse compared to text messages, which you still need to respond to, but you can &quot;put them on ice&quot; for days at a time with a high-degree of cultural acceptance.</p>
<p>Social media messages are legion in terms of volume. And, while they&#39;re not especially urgent from an innate message-level perspective, the platforms do their darndest to &quot;notify&quot; you of &quot;engagement opportunities&quot; to keep you locked-in, so these inboxes fall in the semi-urgent category in my book.</p>
<p>Onto RSS -- my beautiful, dark, twisted RSS. There&#39;s truly zero urgency here and relatively few messages (writing blog posts is time-consuming!). Moreover, returning to our message evaluation framework, an RSS inbox only contains messages from known senders, since you&#39;ve explicitly had to add their RSS feeds to your feed-roll. And, since you&#39;ve likely done that because you expect to value the contents of their messages, you&#39;re likely living in the upper left quadrant in RSS-land, enjoying that drizzled honey and those weird-newspaper rolls.</p>
<p>Email is the real challenge-tunity here.</p>
<h3 id="stuck-in-the-middle-with-you">Stuck in the Middle With You</h3>
<p>Email is caught in the middle of all these features, both message-level and inbox-level. Anyone can email you at any time with any message, so there&#39;s a ton of it, and any message may be useful and/or urgent. That&#39;s mostly a good thing, and probably our RFC-writing forerunners wanted it that way.</p>
<p>Thus, we check our email, prodigiously, every single day. All day long. While we&#39;re pooping, while we&#39;re Zooming, while we&#39;re doing any old thing.</p>
<p>Perhaps this is a lens on why newsletters are making a comeback. Email readers are a &quot;captive audience,&quot; because we cannot avoid triaging our email inboxes. As long as publishers keep their newsletters top-row-level useful, we&#39;ll keep Substacking them. Certainly, the chances of me reading an email newsletter are greater than they would be if I had to visit individual blogs. However, I think my ideal for premium content would be paid RSS feeds, rather than email newsletters, because I want to keep my email inbox clean as possible to aid in my triaging. In fact, this is what many podcasts are now doing (since podcasts are just noisy RSS feeds).</p>
<p>OK, enough about content-monetization (have I mentioned I have a free newsletter below?). How can we make our email inbox <em>feel</em> better? Is it possible to make email feel as good as RSS?</p>
<p>First, we should establish principles-slash-goals for each quadrant in our Conjoined Box of Message Success:</p>
<p><img src="https://www.charlieharrington.com/img/messageactions.png" alt="message actions"></p>
<p>How might we think about upholding these principles in our email inboxes?</p>
<ul>
<li><p><em>Upper-left</em>: We never want to miss useful emails from people we know. None of our remediation tactics for the bottom row should impact our ability to &quot;avoid missing&quot; these. Got it?</p>
</li>
<li><p><em>Upper-right</em>: This quadrant is kind of a nice-to-have for email. We aren&#39;t necessarily &quot;looking&quot; for new emails on a daily basis, but we also don&#39;t want to miss that awesome job-opportunity email. We need some way of pre-processing the contents or other features of the email (sender email address, subject line, etc) to bubble these up somehow.</p>
</li>
<li><p><em>Bottom-right</em>: Spam filtering takes the prize here, but that&#39;s just table-stakes now. I think that the pre-categorization work of Gmail into Promotions and Social is really helpful, as is the ability to easily unsubscribe from ad-like emails. But the in-line ads of Gmail increase visual thrash, so it&#39;s a bit all over the place.</p>
</li>
<li><p><em>Bottom-left</em>: This is less-relevant for email, since we&#39;ve culturally moved these communications over to Facebook and the like.</p>
</li>
</ul>
<p>Hmm, after reviewing message characteristics, email actually seems semi-okay. Most people can easily tell whether an email is going to be useful or not, provided that they take a second to glance it. The problem, then, is volume. Are we going to ensure that we glance at the most useful emails within their respective windows of urgency? </p>
<h2 id="the-medium-is-the-madness">The medium is the madness</h2>
<p>Maybe we need a faster way to just chug through emails. Power gmail users can&#39;t live without their keyboard shortcuts, for example. Or maybe we need better filtering-out of spam-like emails from our favorite clothing providers. Or maybe we need a way to remind us to triage a high-likelihood, potentially-useful email later.</p>
<p>Add up enough of these, and we&#39;re building a better imbox. I mean inbox. I do like the idea that companies like Superhuman and Basecamp are innovating in email to try to block and tackle against the useless and steer us towards the useful. I personally haven&#39;t made the jump yet. I&#39;m slightly stuck in my Gmail ways now, and I do think that, with a bit more fiddly-work, I can set up my Gmail to reproduce a lot of the most impactful features of Superhuman or hey.com.</p>
<p>I&#39;ve certainly missed some features in this analysis. But I&#39;m trying to apply these frameworks not just to email, but to all forms on inboxes in my life that require my human-in-the-loop intervention. Something&#39;s gotta give, or this is just going to become our full-time job. Cue Slack-message sound.</p>
<p>Email me if you have any other ideas for inbox sanity! Just kidding - send a Tweet, for the love of all things electronic.</p>
]]></description>
            <link>https://www.charlieharrington.com/unexpected-useless-and-urgent</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/unexpected-useless-and-urgent</guid>
            <pubDate>Sun, 25 Oct 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[The Peep-Hole]]></title>
            <description><![CDATA[<p>Two weeks ago I woke up at 5 AM on the dot and had this entire creepy dream in my head. I went to the bathroom and scribbled it down while sitting on the toilet before I could forget it. </p>
<p>It being October and all, I thought I&#39;d share this scary story...</p>
<p><img src="https://www.charlieharrington.com/img/yeasayer.png" alt="yeasayer"></p>
<p><em>Image source: the <a href="https://www.youtube.com/watch?v=JyBl5ZgnEr4">awesome Yeasayer music video</a> for their song Ambling Alp</em></p>
<h2 id="the-peep-hole">The Peep-Hole</h2>
<p>There was peace in the village of Ghir, thanks to the Peep-Hole.</p>
<p>It had been this way for as long as anyone could remember.</p>
<p>&quot;It&#39;s better than a thousand kings,&quot; said one shop-keeper.</p>
<p>&quot;We&#39;re blessed to have the wisdom of our elders at our finger-tips,&quot; said another.</p>
<p>Any dispute, conflict, or argument could be brought to the Peep-Hole in the village center. No case or trial would be needed. The Peep-Hole had already seen and heard everything. A voice from the Peep-Hole would utter the Truth, and the matter resolved.</p>
<p>Ori had prepared his whole life to become a Watcher. To be one of the Watchers of the Peep-Hole was Ghir&#39;s greatest honor. Only the purest-of-heart and strongest-of-mind were chosen, and only once ever six years.</p>
<p>When Ori was six years old, his mother Cera was Chosen. It was the best day of Ori&#39;s life. The honor bestowed upon him was immense. He pledged that day to become a Watcher himself. He would join the Peep-Hole as the youngest Watcher ever, as soon as he came of age.</p>
<p>Everyone in town believed in Ori and thought he would be Chosen.</p>
<p>On the morning of the ritual, Ori woke up and asked the Peep-Hole in his hut for the weather.</p>
<p>&quot;CLEAR AND CALM. LOW TO MID 70&#39;S,&quot; replied the Peep-Hole.</p>
<p>Every hut in Ghir had access to the Peep-Hole. Its tubes stretched and tunneled from the village center into their homes. Any question, private or not, could be asked and would be answered by the Peep-Hole.</p>
<p>&quot;Peep-Hole, what does it take to be Chosen as Watcher?&quot; asked Ori.</p>
<p>&quot;ONE MUST BE PURE-OF-HEART, STRONG-OF-MIND, AND BE OF-AGE TO BE CHOSEN.&quot;</p>
<p>Ori had heard these words thousands of times before.</p>
<p>&quot;Peep-Hole, will I be Chosen as Watcher today?&quot;</p>
<p>But the Peep-Hole was silent. Fear crept into Ori&#39;s heart. He tasted a cold sour in his teeth. Perhaps the ritual has already begun, he worried. Ori put on his finest clothes and raced to the village center.</p>
<p>The entire village of Ghir had already assembled. Ori was late, and the villagers glared at him. Ori took his place in the circle around the Peep-Hole.</p>
<p>The Peep-Hole gurgled and pulsed like liquid mercury. Its tubes flexed like the pulled off limbs of daddy-long-longs. Ori had seen the ritual twice before. He knew that the Peep-Hole would agigate and then announce a name.</p>
<p>&quot;SREN&quot;</p>
<p>The village gasped. Ori felt to the dirt. </p>
<p>A forlorn, meek boy stepped forward. Sren was a farmer&#39;s son. He was quiet and unassuming, and, like Ori, had just turned eighteen.</p>
<p>The village watched silently as Sren walked into the rippling quicksilver and disappeared. Before he was gone, he screamed.</p>
<p>Everyone screamed when they entered the Peep-Hole. No one knew why.</p>
<p>The villagers dispersed, but Ori remained. Fig, a younger girl of thirteen, came over to him.</p>
<p>&quot;It&#39;s okay, Ori. There&#39;s always next ritual.&quot;</p>
<p>Ori glanced at her. He heard no kindness in her words. He only saw her as a potential rival.</p>
<p>When he returned home that night, Ori tried using the Peep-Hole again. But it refused to answer him.</p>
<p>Am I being exiled, he wondered. Being cut off from the Peep-Hole was an unimaginable exile. Worse than death. </p>
<p>And Ori wanted to die.</p>
<p>He wandered the village late that night, watching and listening to his fellow villages consult with the Peep-Hole from their fire-lit huts. He went to the town center and spat at the Peep-Hole. His spit fizzled on the liquid metal and evaporated. Ori sat down. He watched the Peep-Hole, watched it shimmer and and pulse. He wondered then, for the first time, where the Peep-Hole had come from. He fell asleep.</p>
<p>His sleep was dreamless, but Ori woke with a new clarity. Last night was the first night ever that he slept somewhere else, other than his hut. Somewhere far from his hut&#39;s Peep-Hole tube.</p>
<p>Ori felt powerful and confident.</p>
<p>Later that morning, he called the villagers back to the town center.</p>
<p>&quot;Give it up, Ori,&quot; they grumbled.</p>
<p>&quot;You weren&#39;t Chosen,&quot; they called.</p>
<p>But then they saw what he had done.</p>
<p>Pyres of wood had been stacked around the heptagonal Peep-Hole.</p>
<p>&quot;People of Ghir,&quot; said Ori. &quot;For too long we have been under a spell. Today I break that spell. People over Peep-hole!&quot;</p>
<p>All the while, the Peep-Hole was gurgling uncontrollably behind him.</p>
<p>Ori lit a match and threw it into the pyre. Flames encircled the Peep-Hole. The quicksilver melted and slid to the ground, revealing a skeletal structure within.</p>
<p>Screams erupted from the crowd. Everyone vomited. Ori turned his head from the crowd to the Peep-Hole and collapsed again to the dirt, throwing up everywhere.</p>
<p>Inside the Peep-Hole were the Watchers. Or what was left of them. A pale, sickly blob pulsed and writhed from within the geodesic cage. Arms and legs and heads stuck out in all directions from the creature. </p>
<p>Ori couldn&#39;t stand the sight -- or smell -- of it burning, so he doused the fires. As the temperature cooled, the mercury reformed around the structure.</p>
<p>&quot;Go,&quot; said Ori to the Peep-Hole. &quot;Go and never return. We will lead ourselves.&quot;</p>
<p>The Peep-Hole thrummed loudly. It began to move, slowly, snapping off its tube arms one by one. The Peep-Hole slid out of the village center, towards the mountains. Ori watched it disappear into the forests.</p>
<p>The people of Ghir cheered Ori, naming him Hero. </p>
<p>For a while, all was well in the village. But then the disputes resumed. Ori wanted the villagers to settle things themselves, rationally, but he saw that they could not. He tried making rules for them to follow, but the people always found ways to re-interpret his words.</p>
<p>The Hero set up a trial system. The people came before him to argue their case, and Ori did his best to settle their disputes.</p>
<p>But soon the people became clever. They spun their words. Truths became indistinguishable from lies. Lies, truths. It was harder and harder for the Hero to resolve the matters of the village.</p>
<p>More than once as he stood in the town center, Ori caught a glimmer of silver in the corner of his eye, far away on the mountain-tops.</p>
<p>It became too much for the Hero. That day, the people came to the town center and didn&#39;t find Ori.</p>
<p>&quot;He&#39;s abandoned us, too.&quot;</p>
<p>For many days, the villagers retreated to their huts and waited.</p>
<p>Then, one morning, the tubes in their huts were lit. They walked to the town-center.</p>
<p>The Peep-Hole had returned.</p>
<p>Ori was never seen again.</p>
]]></description>
            <link>https://www.charlieharrington.com/the-peep-hole</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/the-peep-hole</guid>
            <pubDate>Thu, 22 Oct 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Robots I Love]]></title>
            <description><![CDATA[<h3 id="beware-of-scissors">Beware of scissors</h3>
<p>The other day I lopped off a sizeable chunk of my thumbprint while making a robot. The cut? It was one of those bright-red, swiftly-flowing ones, where you&#39;re pretty sure you&#39;re seeing bone or muscle or some other gross-thing-that-should-probably-stay-inside-your-body. The robot? It was made of cardboard and beer cans:</p>
<p><img src="https://www.charlieharrington.com/img/cardboard.png" alt="cardboard robot"></p>
<p>This little guy is one of many cardboard robots that I&#39;ve made over the years. During summers, my sister and I would go to Vineland, New Jersey to stay with my aunt and cousins for a glorious week of catching frogs, playing Sega Genesis, eating spoonfuls of iced tea mix, and arts &#39;n&#39; crafts.</p>
<p>For some reason, we&#39;d always center on a unique theme each year for our arts &#39;n&#39; crafts. One summer, it was <a href="https://www.charlieharrington.com/create-wonderful-things-be-good-have-fun">Klutz Press friendship bracelets</a>. Another was god&#39;s eyes - we made hundreds. Our proudest summer craft of them all? A &quot;working&quot; cardboard R2-D2. If not for a late &#39;90s winter basement flood, Cardboard Artoo would still be with us today.</p>
<p>I decided to try my hand at making another cardboard robot because I&#39;ve been thinking a lot about them. Mostly because I&#39;m writing a children&#39;s novel about robots, but also cause it&#39;s summer and that&#39;s the sort of thing you do during summer.</p>
<p>There are all kinds of robots, cardboard and not. But there&#39;s a certain sort of robot that makes my gears turn. The rest of this post will review my favorite robots (and the kid who loves them).</p>
<h2 id="robots-i-love">Robots I Love</h2>
<h3 id="rob-robotic-operating-buddy">R.O.B. (Robotic Operating Buddy)</h3>
<p>It&#39;s a robot... for your original Nintendo. I&#39;m embarassed to admit it, but I&#39;ve never seen a R.O.B. in real-life, despite scouring every local garage sale in New Jersey for years.</p>
<p><img src="https://www.charlieharrington.com/img/rob.png" alt="rob1"></p>
<blockquote>
<p>Source: <a href="https://en.wikipedia.org/wiki/R.O.B.">Wikipedia</a></p>
</blockquote>
<p>These Nintendo ads are just perfection. I&#39;m still more excited for the promise of this system than any game console out today.</p>
<p><img src="https://www.charlieharrington.com/img/rob-1.jpeg" alt="rob2"></p>
<p><img src="https://www.charlieharrington.com/img/rob-2.jpeg" alt="rob3"></p>
<p><img src="https://www.charlieharrington.com/img/rob-3.jpeg" alt="rob4"></p>
<blockquote>
<p>Source: <a href="https://twitter.com/heyphilsummers/status/1199532600911683585">Twitter</a></p>
</blockquote>
<p>R.O.B. only ever worked with two Nintendo games. From what I&#39;ve read, neither is very fun. But I&#39;m sure there are some great ROM-hacks out there with more robotic operating buddy interactions.</p>
<h3 id="johnny-5">Johnny 5</h3>
<p>Duh.</p>
<p>Johnny 5 looks a lot like R.O.B., except with more nuclear-weapons. He loves reading, loves input, loves New York City. A loyal friend, and perhaps a bit too gullible for his own good.</p>
<p><img src="https://www.charlieharrington.com/img/johnny5.jpg" alt="johnny-5"></p>
<blockquote>
<p>Source: <a href="https://synthiam.com/Community/Questions/Original-Movie-Rc-Johnny-5-For-Sale-6415">Synthiam</a></p>
</blockquote>
<h3 id="wall-e">Wall-E</h3>
<p>What do you get when you cross R.O.B., Johnny 5, and a Tonka truck? This lil&#39; garbage-collecting cutie!</p>
<p><img src="https://www.charlieharrington.com/img/walle.jpg" alt="wall-e"></p>
<blockquote>
<p>Source: <a href="https://gsouto-digitalteacher.blogspot.com/2012/04/wall-e-as-green-resource-for-earth-day.html">Blogspot</a></p>
</blockquote>
<p>It&#39;s probably becoming quite clear that I&#39;m drawn to a rectangular face on a telescopic neck with tread-like wheels. That&#39;s just my type.</p>
<p>I also just discovered this video of someone&#39;s real-life Wall-E, and it&#39;s frightenly real-looking. Maybe this means I&#39;ll get to meet a Wall-E one day, hopefully not on a post-apocalyptic wasteland Earth.</p>
<iframe width="720" height="415" src="https://www.youtube.com/embed/7oVSaUWeKt0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<h3 id="the-flying-robots-from-batteries-not-included">The flying robots from *Batteries Not Included</h3>
<p>I don&#39;t remember much about this movie, other than that my sister and I watched the recorded-from-TV VHS tape all the time, and there were these super cute baby flying robots who lived with a bunch of old people in an apartment building in New York City.</p>
<p><img src="https://www.charlieharrington.com/img/batteries.png" alt="batteries robots"></p>
<blockquote>
<p>Source: <a href="https://play.google.com/store/movies/details?id=lfDVLChs2jI&gl=US&utm_source=na_Med&utm_medium=hasem&utm_campaign=MoviesPLA&pcampaignid=MKT-DR-na-us-all-Med-pla-mo-Evergreen-Dec1115-1-movieslibrary&gclid=CjwKCAjwyo36BRAXEiwA24CwGWL_psFBrrF21EnfNQPDkkWrr37zjejRvlynYt1oSgr2cXgp5DmPyhoCppwQAvD_BwE&gclsrc=aw.ds">Google Play Store</a></p>
</blockquote>
<p>I think these robots might actually be aliens, but I&#39;m not sure, so let&#39;s keep &#39;em around.</p>
<h3 id="2-xl">2-XL</h3>
<p>I&#39;m all about using robots for learning (see my post on <a href="https://www.charlieharrington.com/mindstorms">Mindstorms, Seymour Papert, and his cute LOGO Turtle robots for teaching kids how to program computers</a>), and 2-XL was my first introduction to robot-powered-learning.</p>
<p><img src="https://www.charlieharrington.com/img/2-xl.jpg" alt="2xl"></p>
<blockquote>
<p>Source: <a href="https://en.wikipedia.org/wiki/2-XL">Wikipedia</a></p>
</blockquote>
<p>We got our 2-XL at a garage sale (garage sales were things of wonder to me as a child). Yes, we had the original 2-XL, the eight-track one. In fact, 2-XL was my first and only interaction with an eight-track system. In the early `90s, Tiger Electronics must have bought 2-XL, and they came out with a cassette-version. </p>
<p><img src="https://www.charlieharrington.com/img/2-xl-cassette.jpeg" alt="2xl cassette version"></p>
<blockquote>
<p>Source: <a href="https://en.wikipedia.org/wiki/2-XL">Wikipedia</a></p>
</blockquote>
<p>But I&#39;ll always prefer our smart-alecky 8-track 2-XL, and my fond memories of jamming catridges into his belly, wishing that he was a Nintendo Entertainment System instead.</p>
<h3 id="mega-man-x">Mega Man X</h3>
<p>When I was a kid, I was pretty sure that one day I was going to become Mega Man X. Buried alive in a weird time capsule, awokened years later to avenge my creator, upgrading my body with strange new powers.</p>
<p><img src="https://www.charlieharrington.com/img/mmx.jpg" alt="Mega Man X"></p>
<blockquote>
<p>Source: <a href="https://www.amazon.co.uk/Mega-Man-Megaman-X/dp/B00004TMBD">Amazon</a></p>
</blockquote>
<p>I&#39;m still waiting for that to happen, but the the mean time, I recently started playing Mega Max X2, and it&#39;s hard! I&#39;m four bosses in, haven&#39;t found a single upgrade, and only snagged one heart container so far. Wish me luck.</p>
<h3 id="dum-e-and-u">DUM-E and U</h3>
<p>Robot arms with quirky personalities, built by someone named Tony Stark.</p>
<p><img src="https://www.charlieharrington.com/img/starm.jpg" alt="Stark"></p>
<blockquote>
<p>Source: <a href="https://ironman.fandom.com/wiki/Dum-E_and_U">Fandom</a></p>
</blockquote>
<p>PSA - check out <a href="https://www.amazon.com/gp/product/1250192757/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1250192757&linkId=041dcc62a5770e833dc59991bf57e5ee">Sourdough by Robin Sloan</a> for a great little novel on robot arms, bread-making, and San Francisco.</p>
<h3 id="metal-head">Metal Head</h3>
<p>Two of my favorite things in one terrifying package - turtles and robots:</p>
<p><img src="https://www.charlieharrington.com/img/metalhead.jpg" alt="Metal Head"></p>
<blockquote>
<p>Source: <a href="https://turtlepedia.fandom.com/wiki/Metalhead_(IDW)">Fandom</a></p>
</blockquote>
<p>Not to be confused with the always-evil Mechaturtles from the impossible original Nintendo TMNT game:</p>
<p><img src="https://www.charlieharrington.com/img/Mechaturtle1.png" alt="Mechaturtles"></p>
<blockquote>
<p>Source: <a href="https://turtlepedia.fandom.com/wiki/Mechaturtle">Fandom</a></p>
</blockquote>
<h3 id="sonic-sam">Sonic Sam</h3>
<p>I had one of these (it&#39;s still in my parent&#39;s attic). This guy rolled around our kitchen, flashing its eyes and emitting weird smoke from its mouth.</p>
<p><img src="https://www.charlieharrington.com/img/robottoy.jpg" alt="Sonic Sam"></p>
<blockquote>
<p>Source: <a href="https://www.spotern.com/en/spot/tv/stranger-things/188454/the-robot-magic-mike-ii-from-dustin-henderson-gaten-matarazzo-in-stranger-things-season-3">Spotern</a></p>
</blockquote>
<p>And it&#39;s now memorialized in one of my favorite TV shows.</p>
<h3 id="robo-from-chrono-trigger">Robo from Chrono Trigger</h3>
<p>The best JRPG of all time? I think so. I loved Chrono and his gang. I used to draw them all the time. Frog and Robo were my favs.</p>
<p><img src="https://www.charlieharrington.com/img/robo.png" alt="Robo"></p>
<blockquote>
<p>Source: <a href="https://chrono.fandom.com/wiki/Robo">Fandom</a></p>
</blockquote>
<h3 id="the-iron-giant">The Iron Giant</h3>
<p>Sometimes giant robots are gentle and curious. They just want to love and learn. The Iron Giant is one of those robots.</p>
<p><img src="https://www.charlieharrington.com/img/irongiant.jpeg" alt="Iron Giant"></p>
<blockquote>
<p>Source: <a href="https://upload.wikimedia.org/wikipedia/en/d/d3/The_Iron_Giant_poster.JPG">Wikipedia</a></p>
</blockquote>
<p>Kids and robots just go together, like kids and E.T.</p>
<h3 id="cozmo">Cozmo</h3>
<p>A programmable robot!</p>
<p><img src="https://www.charlieharrington.com/img/cozmo.png" alt="Cozmo"></p>
<blockquote>
<p>Source: <a href="https://www.digitaldreamlabs.com/pages/cozmo">Digital Dream Labs</a></p>
</blockquote>
<p>Cozmo&#39;s fatal flaw is how nearly impossible it is to connect your phone to the robot&#39;s local wifi service, which is how you are forced to control and interact with Cozmo. The connection process is random, non-deterministic, and saps up most of the time you&#39;ve allocated to play with Cozmo. Also, Cozmo&#39;s parent company recently went out of business, which is a huge bummer for the robot-toy industry.</p>
<p>That said, I&#39;ve had a lot fun with Cozmo, including <a href="https://www.charlieharrington.com/teaching-my-robot-with-tensorflow">teaching him how to find my toothpaste with a TensorFlow computer vision model</a>.</p>
<h3 id="droids">Droids</h3>
<p>Okay, the main event. Droids.</p>
<p>The Star Wars folks who put together the droids for A New Hope are complete geniuses. They&#39;re dirty, they&#39;re resilient, they&#39;re loyal, they&#39;re funny, they&#39;re everywhere. I could go through a whole list of them, cause I really do love them all (GNKs, Artoo, Threepio, IG-88, BB-8, those little mouse-like black boxes in the Death Star), but in a rare dose of restraint, here&#39;s my favorite Star Wars droid!</p>
<h4 id="wed-15-1016">WED-15-1016</h4>
<p>It&#39;s R.O.B. with a longer neck, a blue face, and way more creepy claw arms. You may remember this robot critter from its role in repairing the Millenium Falcon at Hoth Base in Empire Strikes Back. Or at least attempting to repair.</p>
<p><img src="https://www.charlieharrington.com/img/wed-techie.jpg" alt="wed-technie"></p>
<blockquote>
<p>Source: <a href="https://starwarsataglance.wordpress.com/2014/06/30/wed-1016-teche/">Star Wars At a Glance</a></p>
</blockquote>
<p>I treasuring my WED-15-1016 card from the Star Wars collectible card game, and I&#39;d play it every single one of our daily games in latchkey, no matter what. (Side note: listen to this <a href="http://www.zachtronics.com/podcast/">great Zachtronics podcast</a> episode with one of the designers of the Star Wars and Star Trek collectible card games)</p>
<p><img src="https://www.charlieharrington.com/img/wed-card.png" alt="wed-card"></p>
<blockquote>
<p>Source: <a href="http://www.cardgamedb.com/index.php/starwars/star-wars-card-spoilers/_/the-hoth-cycle/assault-on-echo-base/wed-15-1016-assault-on-echo-base-55-2">Card Game DB</a></p>
</blockquote>
<p>Here is one of WED-15-1016&#39;s cousins, a fully tricked-out WED Treadwell with all sorts of terrifying arms and claws:</p>
<p><img src="https://www.charlieharrington.com/img/WED-treadwell.jpg" alt="wed-tread"></p>
<blockquote>
<p>Source: <a href="https://starwars.fandom.com/wiki/WED_Treadwell_repair_droid/Legends">Fandom</a></p>
</blockquote>
<p>I even found this questionably-real deleted scene from A New Hope showing an impatient Luke Skywalker interacting with a Treadwell on Tattoine:</p>
<iframe width="720" height="415" src="https://www.youtube.com/embed/nDPZfPe5F-w" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<h2 id="more-robots">More robots</h2>
<p>So, who did I miss in my list? Data? He&#39;s an android, so not exactly a robot. But possibly Mega Man X is an android, so maybe I&#39;m already mixing things up.</p>
<p>Speaking of lists, I also found this gigantic <a href="https://en.wikipedia.org/wiki/List_of_fictional_robots_and_androids">list of fictional robots and androids</a> on Wikipedia.</p>
<p>I&#39;m not-so-secretly hoping that, one day, the robots in my book will be added to this Wikipedia list. Yes, I could edit the Wikipedia page myself, but c&#39;mon, that&#39;s not the goal here.</p>
<h2 id="from-cardboard-to-ciruit-boards">From cardboard to ciruit boards</h2>
<p>Also, it&#39;s high time to upgrade my hobby. I&#39;ve begun looking into basic robotics kits, and I&#39;ll hopefully be constructing some new robotic best friends very soon. Maybe not Maker-Faire worthy, but ya gotta start somewhere.</p>
]]></description>
            <link>https://www.charlieharrington.com/robots-i-love</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/robots-i-love</guid>
            <pubDate>Mon, 24 Aug 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[The Six Levels of Interaction with a System]]></title>
            <description><![CDATA[<p>We recently borrowed our friends&#39; car, because they&#39;re awesome. Along with the keys, they gave us <em>a few, uh, provisos, a, a couple of quid pro quos:</em><sup>1</sup></p>
<ul>
<li>The car takes the expensive kind of gas</li>
<li>The trunk doesn&#39;t always open up from the outside</li>
<li>The dash says the tail-light is out, but it&#39;s not</li>
<li>You&#39;ll need to add more oil every 100 miles or so, and it might need an oil change</li>
</ul>
<p>I nodded throughout. Yup, needs prem-o gas. Trunk&#39;s weird, okay. Tail-light-light&#39;s-not-alright, good to know. Oil, yes, oil&#39;s a thing that cars need.</p>
<p>Meanwhile, I caught myself thinking, &quot;Wow, they really know a lot about cars.&quot;</p>
<p>I, for one, don&#39;t. My dad knows how to take a car apart and put it back together. I know how to get 120 stars in Super Mario 64. Sure, I learned <em>some stuff</em> about cars growing up. I&#39;ve changed flat tires in a pinch, once helped my dad replace brake pads on our monstrous Suburban, and sorta payed attention while I helped him change the oil in Old Blue (his beloved sky blue &#39;85 Blazer).</p>
<p>Fact is, I&#39;ve never owned a car in my adult life (hello, city-living). For those intermittent and unavoidable road trips, I&#39;ve been a semi-content customer of Zipcar. I never been forced to face the reality of <strong>learning cars</strong>.</p>
<p>But, sure, I&#39;d like to!</p>
<p>Even now, I&#39;m starting to fantasize about acquiring the rusted hulk of a old Volkswagon Beetle, depositing it via crane into my garage workshop lair, tearing it apart and rebuilding it anew from first principles, as I both rediscover the invention of internal combustion and manufacture one pretty-sweet ride.</p>
<p>Where does this fantasy come from? Well, I&#39;ve been told that Beetles have a relatively straight-forward engine for beginners (though I&#39;m not quite sure what exactly that means). But that&#39;s not quite it. Frankly, this is an all-to-familiar headspace for me. Intimidated by the mention of changing oil, my brain races ahead rebuilding a car from scratch in order to understand ... why I needed to change the oil in an entirely different car.</p>
<p>Why do I jump all the way to wanting to understand things from first principles?</p>
<p>Maybe because this has been a mostly-successful ideal for me to aspire to when I learned programming as an adult, and I&#39;m now pattern-matching into other complex systems. But, certainly, I should be able to productive with a system far in advance of knowing how to build it from scratch. Isn&#39;t that what interfaces are all about?</p>
<p>Which brings me to the following shower thought:</p>
<h2 id="the-six-levels-of-interaction-with-systems">The Six Levels of Interaction with Systems</h2>
<p>The six levels of interaction with a system are:</p>
<ol start="0">
<li>Non-use</li>
<li>Use</li>
<li>Monitor</li>
<li>Maintain</li>
<li>Repair</li>
<li>(Re)build</li>
</ol>
<p>Yes, this is zero-indexed, obviously. Want to see it as a Ben Thompson <a href="https://stratechery.com/">Stratechery-style</a> diagram?</p>
<p><img src="https://www.charlieharrington.com/img/stages.png" alt="levels"></p>
<p>My thanks to the <a href="https://excalidraw.com/">Excalidraw web app</a> for their excellent box drawing tool. While I&#39;m at it, should I add some <a href="https://www.waitbutwhy.com/">Wait But Why-style</a> little stick figures?</p>
<p><img src="https://www.charlieharrington.com/img/people.png" alt="people"></p>
<p>Not funny enough? How about a concentric-circle approach? That probably makes more sense, anyway.</p>
<p><img src="https://www.charlieharrington.com/img/onion.png" alt="onion"></p>
<p>Yes, those are the vintage Apple logo colors, because I literally cannot help myself (it was hard enough not to write another post about <a href="https://www.charlieharrington.com/my-new-old-apple-iie-computer">my Apple IIe</a>).</p>
<p>Let&#39;s go through the levels one-by-one, continuing our use of a car as the example.</p>
<h3 id="level-0-non-use">Level 0: Non-use</h3>
<p>You can&#39;t use the system. You don&#39;t know how to drive the car.</p>
<h3 id="level-1-use">Level 1: Use</h3>
<p>You can use the primary purpose of the system. You know how to drive a car safely. You can go in reverse. You can pass a driver&#39;s test.</p>
<h3 id="level-2-monitor">Level 2: Monitor</h3>
<p>You know how to observe secondary signals from the system. In our car, you know to occasionally review the dashboard for things like the engine light. You don&#39;t necessarily know what to do about these signals, but you know they are <em>a thing</em>, and will probably <em>mention</em> them to someone like a mechanic (but, hey, no guarantee).</p>
<h3 id="level-3-maintain">Level 3: Maintain</h3>
<p>You are comfortable enough with the previous monitoring signals and your own &quot;handy-ness&quot; (is that a word?) to do routine maintence on the system. You add more washer fluid when it gets low. You replace the dead battery. You add air to your tires at the gas station.</p>
<h3 id="level-4-repair">Level 4: Repair</h3>
<p>You know how to fix sub-systems in the overall system. Not necessary all of them, but the most important ones (probably the ones that break most often). You can change a tire. You can replace brake pads. You can fix a broken headlight.</p>
<h3 id="level-5-rebuild">Level 5: (Re)build</h3>
<p>You know how to tear apart the system completely and re-build it from scratch. You understand each sub-system, why it&#39;s there, and how to make them all work together. You can take apart the Volkswagon Beetle and put it back together. You can levitate.</p>
<h2 id="other-examples">Other examples</h2>
<blockquote>
<p>Sure, Charlie, that worked conveniently for your car example. But what about... other stuff?</p>
</blockquote>
<p>Great question!</p>
<p>How about investing?</p>
<ol start="0">
<li><strong>Non-use</strong>: Don&#39;t invest anything</li>
<li><strong>Use</strong>: Invest some money and be able to check-in your returns</li>
<li><strong>Monitor</strong>: Compare your returns with alternative investments</li>
<li><strong>Maintain</strong>: Make slight adjustments based on these alternatives</li>
<li><strong>Repair</strong>: Fix gaping holes or major problems in your investing strategy</li>
<li><strong>Re(build)</strong>: Design a custom investment strategy for you (or anyone else)</li>
</ol>
<p>Okay, admittedly <strong>Repair</strong> and <strong>Rebuild</strong> blended a bit there. But I think that&#39;s fine. </p>
<p><strong>In fact, the lines between these levels are meant to be porous</strong>. A Level 3 could probably do some serious Level 4 stuff. Even a Level 0 non-user <em>probably</em> knows enough from pop-culture and context clues to be a Level 1 user, with the proper motivation.</p>
<p>Let&#39;s try another example: using a desktop computer!</p>
<ol start="0">
<li><strong>Non-use</strong>: Don&#39;t know how to use a computer. They&#39;re evil!</li>
<li><strong>Use</strong>: Can use a computer to do stuff (go online, write a document, print it out, use a spreadsheet, play Minecraft)</li>
<li><strong>Monitor</strong>: Notice that your browser is slower than normal or that you are running out of hard drive space</li>
<li><strong>Maintain</strong>: Empty your &quot;trash bin&quot;, delete old unused apps</li>
<li><strong>Repair</strong>: Remove that sketchy ad company browser extension from your parent&#39;s computer. Restore your computer&#39;s data from a backup drive.</li>
<li><strong>Re(build)</strong>: Take apart a computer, install new hard drive, re-install operating system.</li>
</ol>
<p>I suppose with that example we transitioned from a non-computer-user all the way to computer technician. It&#39;s patently obvious that there are levels of understanding even beyond our Level 5 skill of being able to &quot;take apart a computer and install something new in it.&quot; Like, how does a hard drive even work? How does memory work? What is physics? What is truth? </p>
<p>The onion is infinite. But these outer levels may prove useful as you encounter unknown systems. </p>
<p>There&#39;s often money to be made for more advanced &quot;Levels&quot; to sell their skills to lower level-ers. I&#39;m not going to fix a cavity myself - I&#39;m going to pay an expert, a Level 5 dentist to do it. In a pinch, a desert-island pinch, I&#39;m sure I could figure out how do some Castaway-style dentistry. But I&#39;m not (yet) on a desert island, and I don&#39;t want to take the time to go beyond a Level 3 in the kinda-gross system that is my own teeth situation. I&#39;ll floss, mostly every day, which puts me squarely in Level 3. The bet I&#39;m making is that my time doing Level 3 work will be worth it, given the effort, compared to my toothless friends in the preceeding levels.</p>
<h2 id="so-whats-the-right-way-to-learn-a-new-system">So, what&#39;s the right way to learn a new system?</h2>
<p>I don&#39;t know! </p>
<p>On one hand, knowledge stacks on previous or prerequiste knowledge. It&#39;s probably helpful to know about arithmetic before tackling algebra.</p>
<p>On the other hand, if all you ever want to do is &quot;use&quot; something, use the system for its primary intended purpose, maybe it&#39;s not worth digging deeper -- at least not initially. When we learn how to drive, we don&#39;t start with a box of car parts and the skeleton frame of a burned out Cheverolt (as much as I wish we did). No, we got behind the wheel (after watching countless VHS tapes of instructional material) and learned how to drive. We straight-up Level 1&#39;ed that car.</p>
<p>The question to consider is: what&#39;s your goal? </p>
<p>Your answer should guide where you should set your North Star in the onion-level-spectrum-chart-thing.</p>
<h3 id="a-note-on-instructional-design">A note on instructional design</h3>
<p>Great courses and great teachers take a strong viewpoint towards this question.</p>
<p>Sal Khan of <a href="https://www.khanacademy.org/">Khan Academy</a> seems to take the former approach, stacking layers of prerequisite knowledge nuggets in a knowledge graph that goes from counting to category theory, and everywhere in-between. Their approach makes learning math trackable and digestible, relying on momentum, quick wins, and gameification to keep students motivated.</p>
<p>Whereas, <a href="https://www.fast.ai/about/#jeremy">Jeremy Howard</a> and <a href="https://www.fast.ai/about/#rachel">Rachel Thomas</a> of the <a href="https://course.fast.ai/">Fast.ai deep learning course</a> go straight for Level 1, making students feel comfortable &quot;using deep learning to do cool things first&quot;, and then and only then start peeling back the layers (good word choice here, I think, given the context) to the complexities beneath the surface.</p>
<p>In both cases, it&#39;s about finding the right way to motivate your students. There&#39;s no right answer. In fact, I adore both of these courses and projects, even if I think I failed as a student in both of them. In the case of Khan Academy, I lost motivation because there&#39;s too much to learn and not enough time to completely do my math-life over (as much as I want to). In the case of fast.ai, I became too self-conscious about linear algebra (a skill that&#39;s well past Level 1 stuff).</p>
<h3 id="whats-next-asked-the-life-long-learner">&quot;What&#39;s next?&quot; asked the life-long learner</h3>
<p>Is this six-levels thing a brilliant and new grand unified theorem of learning systems? No, of course not. I&#39;m probably butchering some existing theorem from an oversized coffee-table-sized book about mental models. But isn&#39;t that the point of mental models, so you can re-use them?</p>
<p>For me, this &quot;thereom&quot; (I&#39;m still going to call it that) helps me think about priorities. Which systems do I want to become Level 5 in over the next few years?</p>
<p>Is it this car? Probably not. But I&#39;ll still watch some YouTubes so that I can figure how to put more oil in it.</p>
<h4 id="footnotes">Footnotes</h4>
<ol>
<li>No actual quid pro quos were exchanged. I merely wanted to quote the Genie.</li>
</ol>
]]></description>
            <link>https://www.charlieharrington.com/the-six-levels-of-interaction-with-a-system</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/the-six-levels-of-interaction-with-a-system</guid>
            <pubDate>Tue, 26 May 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Writer's Bane]]></title>
            <description><![CDATA[<p>That&#39;s right, it&#39;s a post about writing advice.</p>
<p>Not from me! Goodness, no.</p>
<p>Instead, here&#39;s a compendium of books and other odd bits that I&#39;ve found helpful in my quest. I&#39;ll keep this updated when I encounter something new and useful and surprising.</p>
<p>I hope this guide proves useful when you&#39;re looking to read about how to write instead of just sitting down and doing the deed.</p>
<h2 id="books">Books</h2>
<ul>
<li><p><strong><a href="https://www.amazon.com/gp/product/1607748894/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1607748894&linkId=964c14964dbe0dc13bcfacb3a3594f85">Story Genius</a> - Lisa Cron</strong>: Learn how to write a riveting story using <em>brain science</em> - make sure to bring a pen and a notebook along for the ride!</p>
</li>
<li><p><strong><a href="https://www.amazon.com/gp/product/1439156816/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1439156816&linkCode=as2&tag=whatrocks09-20&linkId=dc4290e47818db79d2fa6b284f9f3e1b">On Writing</a> - Stephen King</strong>: King&#39;s biographical guidebook to his craft.</p>
</li>
<li><p><strong><a href="https://www.amazon.com/gp/product/0385480016/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0385480016&linkId=3cb65bd21cb9764f04be702fe152c1ff">Bird by Bird</a> - Anne Lamott</strong>: The best advice you&#39;ll get about life and writing.</p>
</li>
<li><p><strong><a href="https://www.amazon.com/gp/product/1877741094/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1877741094&linkId=e40ad924992964aff49708d25cd7fed0">Zen in the Art of Writing</a> - Ray Bradbury</strong>: How to delight in the joy of BEING ALIVE and also write about it.</p>
</li>
<li><p><strong><a href="https://amzn.to/2IWZ1B3">Draft No. 4</a> - John McPhee</strong>: The master of creative nonfiction gives you a glimpse behind the curtain, and it&#39;s mostly 3x5 note cards and some strange vintage word processing software.</p>
</li>
<li><p><strong><a href="https://www.amazon.com/gp/product/020530902X/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=020530902X&linkId=d79e4ea383d10042e72b29d316802112">The Elements of Style</a> - Strunk and White</strong>: Don&#39;t throw this out after high school English. It&#39;s tiny. Keep it in the bathroom. Don&#39;t tell anyone.</p>
</li>
</ul>
<h2 id="podcasts">Podcasts</h2>
<ul>
<li><p><strong><a href="https://www.askthebards.com/">Ask the Bards</a> - Delilah S. Dawson and Kevin Hearne</strong>: A weekly Twitter Q+A with best buddies and writing partners. You&#39;ll want to be friends with them.</p>
</li>
<li><p><strong><a href="https://podcasts.apple.com/us/podcast/launch/id1319436103?mt=2">Launch</a> - John August</strong>: What happens when a famous screenwriter and podcaster decides to write a middle grade children&#39;s novel called Arlo Finch? He records a charmed six-part podcast about the process of finding an agent, signing a deal, editing, visiting the book-binding factory, and then going on book-tour.</p>
</li>
<li><p><strong><a href="https://johnaugust.com/scriptnotes">Scriptnotes</a> - John August and Craig Mazin</strong>: &quot;A podcast about screenwriting and things that are interesting to screenwriters.&quot; This isn&#39;t exactly about writing books, but who cares. It&#39;s my favorite weekly podcast about an industry I don&#39;t work in. And also, &quot;One Cool Thing.&quot;</p>
</li>
</ul>
<h2 id="articles">Articles</h2>
<ul>
<li><strong><a href="http://terribleminds.com/ramble/2013/08/13/25-steps-to-being-a-traditionally-published-author-lazy-bastard-edition/">25 Steps to Being a Traditionally Published Author: Lazy Bastard Edition</a> - Delilah S. Dawson</strong>: If you&#39;re looking for a hilarious and possibly NSFW roadmap to seeing your book in an airport bookstore, look no further.</li>
</ul>
<h2 id="newsletters">Newsletters</h2>
<ul>
<li><strong><a href="https://www.robinsloan.com/overworld/">The Perils of the Overworld - Robin Sloan</a></strong>: What happens when an engineer-author-olive-oil-maker makes a video game? He&#39;s not sure either. </li>
</ul>
<p><img src="https://www.charlieharrington.com/img/durin.jpg" alt="balrog"></p>
<blockquote>
<p>&quot;Write, you fools!&quot; he cried, and was gone.</p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/writer&apos;s-bane</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/writer&apos;s-bane</guid>
            <pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Notes on Nike Missile Site SF-88L]]></title>
            <description><![CDATA[<p>Many, many days ago, when humans could still roam the Earth for non-essential activities, our little crew visited Nike Missile Site SF-88L as another destination in our <a href="https://www.charlieharrington.com/notes-on-map-and-compass-navigation">sixth grade class-trip</a> whistle-stop tour of nerdy places in the Bay Area.</p>
<p><img src="https://www.charlieharrington.com/img//site.jpeg" alt="site"></p>
<p><a href="https://en.wikipedia.org/wiki/Nike_Missile_Site_SF-88">Nike Missile Site SF 88-L</a> is just over the Golden Gate Bridge in the Marin headlands (essentially behind Hawk Hill), so it&#39;s a short drive or hike or bike ride away from the city.</p>
<p><img src="https://www.charlieharrington.com/img/radar.jpeg" alt="radar"></p>
<p>Check out its <a href="https://www.nps.gov/goga/nike-missile-site.htm">National Park Service website</a> for its operating hours and tour times. As you might expect, it looks like the site is closed for the time being. If you&#39;re lucky (and can plan ahead), try to go on the first Saturday of the month, when its staffed by volunteer veterans who worked at various Nike sites around the country. </p>
<p>We got lucky, and the veterans were both hilarious and super interesting. Added bonus: they were also able to operate some of the terrifying machinery and raise one of the missiles.</p>
<p>I brought along my little notebook and took copious notes while they were talking (which I&#39;ve reproduced below). </p>
<p><img src="https://www.charlieharrington.com/img/history.jpeg" alt="history"></p>
<p>But first I wanted to share a favorite moment.</p>
<p>Near the end of the tour, we were led underground to where they kept the Nike Hercules missiles. Then, one of the veterans pressed a giant yellow button, which opened a metal hatch and began to lift one of the missiles above ground. This was a common procedure for the soldiers - they&#39;d have to run through drills constantly, at a moment&#39;s notice.</p>
<p>Meanwhile, as we&#39;re watching this gigantic warhead move skyward a hydraulic lift, I can&#39;t help but be distracted: Where have I heard these sounds before?</p>
<audio controls="controls">
  <source type="audio/mp3" src="trash_compactor.mp3"></source>
</audio>

<p>That&#39;s when the veteran asked, &quot;Anyone ever seen Star Wars?&quot;</p>
<p>My hand burst into the air like Hermoine&#39;s.</p>
<p>Apparently, George Lucas visited the Nike missile site before filming <em>A New Hope</em>, and he found some inspiration for this scene:</p>
<p><img src="https://www.charlieharrington.com/img/trash.jpg" alt="trash"></p>
<p>This experience now lends more credence to the apocryphal story of how those Oakland shipping container lift thingies became proto AT-ATs for a day-dreaming Lucas.</p>
<p>Anyway, as mentioned, here&#39;s what I scribbled down during the tour:</p>
<ul>
<li>Nike is the &quot;goddess of victory&quot;</li>
<li>Nike Missile Program<ul>
<li>1954 - 1974</li>
<li>233 sites across the USA</li>
<li>Billions were spent</li>
<li>Obsoleted by ICBMs (inter-continental ballistic missiles)</li>
</ul>
</li>
<li>Two types of missiles:<ul>
<li>(1) Ajax: liquid fuel, very dangerous to handle</li>
<li>(2) Hercules: nuclear version</li>
</ul>
</li>
<li>Many of the Army operators were ~19 years: &quot;We were kids.&quot;</li>
<li>Missiles were radar operated</li>
<li>No Nike missiles were ever &quot;officially launched&quot; at any enemy</li>
<li>Each site had three radars:<ul>
<li>(1) Friend or Foe?</li>
<li>(2) Foe tracker</li>
<li>(3) Missile tracker</li>
</ul>
</li>
<li>The U.S. strategy for defending our coasts was:<ul>
<li>(1) Navy will try first,</li>
<li>(2) Then the Air Force,</li>
<li>(3) Finally, the Army with Nike missiles as a last resort</li>
</ul>
</li>
<li>Control operators had five words they could send to an in-flight missile:<ul>
<li>(1) PITCH</li>
<li>(2) YAW</li>
<li>(3) ROLL</li>
<li>(4) SELF-DESTRUCT</li>
<li>(5) EXPLODE (they had to tell the missiles to explode!)</li>
</ul>
</li>
<li>Operators went to annual training in New Mexico where they actually fired unarmed missiles</li>
<li>Hercules had a 35 mile &quot;kill&quot; diameter</li>
<li>There is an electromagnetic pulse during a nuclear explosion, which is why analog radar communication works (vs. digital)</li>
</ul>
<p>And here are some of the better photos from my phone. If you like old control panels for old computers (like me), then this place is your kind of place!</p>
<p><img src="https://www.charlieharrington.com/img/buttons.jpeg" alt="buttons"></p>
<p><img src="https://www.charlieharrington.com/img/controls.jpeg" alt="controls"></p>
<p><img src="https://www.charlieharrington.com/img/dials.jpeg" alt="dials"></p>
<p><img src="https://www.charlieharrington.com/img/missile.jpeg" alt="missile"></p>
<p><img src="https://www.charlieharrington.com/img/parallax.jpeg" alt="parallax"></p>
<p><img src="https://www.charlieharrington.com/img/phone.jpeg" alt="phone"></p>
<p><img src="https://www.charlieharrington.com/img/plot.jpeg" alt="plot"></p>
<p><img src="https://www.charlieharrington.com/img/power.jpeg" alt="power"></p>
<p><img src="https://www.charlieharrington.com/img/secret.jpeg" alt="secret"></p>
<p><img src="https://www.charlieharrington.com/img/sign.jpeg" alt="sign"></p>
<p><img src="https://www.charlieharrington.com/img/squib.jpeg" alt="squib"></p>
<p><img src="https://www.charlieharrington.com/img/test.jpeg" alt="test"></p>
]]></description>
            <link>https://www.charlieharrington.com/notes-on-nike-missile-site-sf-88l</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/notes-on-nike-missile-site-sf-88l</guid>
            <pubDate>Tue, 07 Apr 2020 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Summer Wind]]></title>
            <description><![CDATA[<p><img src="https://www.charlieharrington.com/img/summerwind.jpg" alt="email"></p>
<p><em>Newport, Rhode Island</em></p>
<p>A film photo I took with my friend <a href="http://www.kristineugenio.com/">Kristen</a>&#39;s old camera. Alternative title: <em>Kite Armada.</em></p>
]]></description>
            <link>https://www.charlieharrington.com/summer-wind</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/summer-wind</guid>
            <pubDate>Tue, 10 Sep 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Relay]]></title>
            <description><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/TAogrz_UZV0" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<p>I opened up <em>Logic</em> on a whim tonight and found the beginnings of this song, just sitting there, from a previous flight or some other bored evening. I think I probably ruined anything good about this song with the new middle section, but I swear it sounded good in my head(phones).</p>
<p>The bouncing ball animation was created with the <a href="https://editor.p5js.org/">p5.js web editor</a>, which is both awesome and easy to use. Don&#39;t take my word for it -- try out this code (not exactly the same as in the video, but probably cooler) and you&#39;ll see how fun p5.js / processing can be for kids of all ages.</p>
<pre><code class="language-javascript">function setup() {
  createCanvas(400, 400);
  background(0);
}

function draw() {
  circle(mouseX, mouseY,10);
}
</code></pre>
]]></description>
            <link>https://www.charlieharrington.com/relay</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/relay</guid>
            <pubDate>Tue, 02 Apr 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Novels with Giant Possibly Magical Libraries]]></title>
            <description><![CDATA[<p>I&#39;m currently reading a fantastic novel where the protaganist - who is in her teens and lives in a sort-of convent for sightseers in the middle of a glacier - is asked by the elders to choose a role for part-time work. Our hero considers two options:</p>
<ul>
<li>Become a pilot of paper-mache, semi-alive airplanes controlled by whistling</li>
<li>Become a librarian</li>
</ul>
<p>I held my breath as I read further: <em>choose The Library!</em></p>
<h3 id="why-libraries">Why Libraries?</h3>
<p>There are two things that, when I encounter them in a book, immediately cause me to fall in love.</p>
<ul>
<li>The word <code>palimpsest</code></li>
<li>A giant, possibly magic, library (extra points for a Forbidden Section or two)</li>
</ul>
<p>The two are not unrelated. A <a href="https://en.wikipedia.org/wiki/Palimpsest">palimpsest</a> is a book that has been one or more books before, with the older knowledge hidden just beneath the surface of the parchment, waiting to be unearthed. A giant library must, invariably, contain books with once-known, now-forgotten knowledge, just beyond that locked door over there.</p>
<p>But I have the key...</p>
<p>I hereby present a list of the very best novels featuring giant libraries filled with secrets.</p>
<h3 id="my-list-of-novels-with-giant-libraries">My List of Novels with Giant Libraries</h3>
<ul>
<li><a href="https://www.amazon.com/gp/product/0143034901/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0143034901&linkId=7b51c22444a8be59bcff15afc13efe51">La Sombra del Viento (The Shadow of the Wind)</a> - Carlos Ruiz Zafón</li>
<li>The Kingkiller Chronicles<ul>
<li><a href="https://www.amazon.com/gp/product/0756404746/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0756404746&linkId=d4b51238762ea3883b0ed9db5c9cfee1">The Name of the Wind</a> - Patrick Rothfuss</li>
<li><a href="https://www.amazon.com/gp/product/0756407915/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0756407915&linkId=c4d23a503d1b93ef9455655661e16edc">The Wise Man&#39;s Fear</a> - Patrick Rothfuss</li>
</ul>
</li>
<li><a href="https://www.amazon.com/gp/product/0544176561/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0544176561&linkId=57f7feea7ab107e4e2ac694e33798a0b">The Name of the Rose</a> - Umberto Eco</li>
<li><a href="https://www.amazon.com/gp/product/B000FC12L4/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B000FC12L4&linkId=0fc0d40b2d8f75a34a52bd01814e3708">Lirael</a> - Garth Nix</li>
<li><a href="https://www.amazon.com/gp/product/0553418629/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0553418629&linkId=efcb0fde52892489e0911d1bbf7b62f1">The Library at Mount Char</a> - Scott Hawkins</li>
<li><a href="https://www.amazon.com/gp/product/0765356155/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0765356155&linkId=d34ad098edfb335746ed0e4530a99623">Jonathan Strange and Mr. Norrell</a> - Susanna Clarke</li>
<li>Harry Potter<ul>
<li><a href="https://www.amazon.com/gp/product/B00OHX65I2/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B00OHX65I2&linkId=0798e010bcb3334768f375e8258b7ab3">Harry Potter and the Sorcerer&#39;s Stone</a> - J.K. Rowling</li>
<li><a href="https://www.amazon.com/gp/product/0545791324/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0545791324&linkId=b5cd0f1b4b5bbf36948989d265050520">Harry Potter and the Chamber of Secrets</a> - J.K. Rowling</li>
<li><a href="https://www.amazon.com/gp/product/0439139600/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0439139600&linkId=a6ba2d6b1c2bfdac125d341989ff23e4">Harry Potter and the Goblet of Fire</a> - J.K. Rowling</li>
</ul>
</li>
<li><a href="https://www.amazon.com/gp/product/B00SB32ST4/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B00SB32ST4&linkId=a296165c788623176aab44e4cd65db3b">Rainbows End</a> - Vernor Vinge</li>
<li><a href="https://www.amazon.com/gp/product/0812515285/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0812515285&linkId=8b3d099da4cca9a239f336344773d2fd">A Fire Upon the Deep</a> - Vernor Vinge</li>
<li><a href="https://www.amazon.com/gp/product/0812536355/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0812536355&linkId=6e0133d53af84b4532620de8ad19324e">A Deepness in the Sky</a> - Vernor Vinge</li>
<li><a href="https://www.amazon.com/gp/product/006147410X/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=006147410X&linkId=acbaea0cf216d3102012a9c426e14f9d">Anathem</a> - Neal Stephenson</li>
<li><a href="https://www.amazon.com/gp/product/0553380958/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0553380958&linkId=abf3caf9f77c64ef1503e437b7463153">Snow Crash</a> - Neal Stephenson</li>
<li><a href="https://www.amazon.com/gp/product/1250037751/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1250037751&linkId=2a70e649d7428e557e654397bf8560c9">Mr. Penumbra&#39;s 24 Hour Bookstore</a> - Robin Sloan</li>
<li><a href="https://www.amazon.com/gp/product/B004DI7HZ6/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B004DI7HZ6&linkId=6238642fb928a95804cd6bb997931bc3">A Discovery of Witches</a> - Deborah Harkness*</li>
<li><a href="https://www.amazon.com/gp/product/9939518757/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=9939518757&linkId=53fb16307682363738f2eb5fe27115ae">The Library of Babel</a> - Jorge Luis Borges*</li>
<li><a href="https://www.amazon.com/gp/product/B00ECTR26U/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B00ECTR26U&linkId=bd4c9c2c96287554af6e75458f70676b">The Pagemaster</a> - Todd Strasser*</li>
<li><a href="https://www.amazon.com/gp/product/0385354304/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0385354304&linkId=61adf5d2fcd0eef14bafe8f09d5de4f3">The Strange Library</a> - Haruki Murakami*</li>
<li><a href="https://www.amazon.com/gp/product/0156453800/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0156453800&linkId=73c9318067a8daf3c6f834e43b73d8b8">Invisible Cities</a> - Italo Calvino*</li>
<li><a href="https://www.amazon.com/gp/product/1400079276/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1400079276&linkId=4bb1046b55e17d2c4f2b0599564a5d48">Kafka on the Shore</a> - Haruki Murakami*</li>
<li><a href="https://www.amazon.com/gp/product/B07GCSJ72W/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B07GCSJ72W&linkId=fbd212d64827a7deb8331c6203995002">In the Stacks</a> - Scott Lynch*</li>
<li><a href="https://www.amazon.com/gp/product/0451473132/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0451473132&linkId=d89f0625907fa90f3b53ab893148d10d">Ink and Bone</a> - Rachel Caine*</li>
<li><a href="https://www.amazon.com/gp/product/0062225677/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0062225677&linkId=9ad495e0fd9c2c3f9a419ba8e2ede7fa">The Colour of Magic (Discworld #1)</a> - Terry Pratchett*</li>
<li><a href="https://www.amazon.com/gp/product/0156439611/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0156439611&linkId=917a65fce2cbea549967980ec24cd37f">If on a Winter&#39;s Night a Traveler</a> - Italo Calvino</li>
<li><a href="https://www.amazon.com/gp/product/1401284779/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=1401284779&linkId=c35338e2e6f497a3bba6e99781c05e42">Preludes &amp; Nocturnes (The Sandman #1)</a> - Neil Gaiman*</li>
<li><a href="https://www.amazon.com/gp/product/B002AU7MEK/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B002AU7MEK&linkId=cf8dd146c099100b6452a22611d7719b">Wireless</a> - Charles Stross*</li>
<li><a href="https://www.amazon.com/gp/product/B075JL493G/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B075JL493G&linkId=6a0cf43320e0c1ea1aa7ec2d484de7c6">The Book of the New Sun</a> - Gene Wolfe*</li>
<li><a href="https://www.amazon.com/gp/product/B00J3EU5RC/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=B00J3EU5RC&linkId=ab1c6d1ceed5c7bc06227161b7b3fbe2">Eon (The Way #1)</a> - Greg Bear*</li>
<li><a href="https://www.amazon.com/gp/product/0345353129/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0345353129&linkId=d2322df408c9bf0ef16b37ece60fffe9">Protector</a> - Larry Niven*</li>
<li><a href="https://www.amazon.com/gp/product/0143105299/ref=as_li_qf_asin_il_tl?ie=UTF8&tag=whatrocks09-20&creative=9325&linkCode=as2&creativeASIN=0143105299&linkId=979204c2b6688608dc3e13a40827f384">The Book of Sand</a> - Jorge Luis Borges*</li>
</ul>
<p>*<em>Indicates that I haven&#39;t read this book (yet), but rest assured that it was recommended by a semi-close friend, cousin of mine, or <a href="https://news.ycombinator.com/item?id=19108230">Hacker News commenter</a>.</em></p>
<p>Let me know on Twitter (<a href="https://twitter.com/whatrocks">@whatrocks</a>) if I&#39;m missing anything and I&#39;ll update the list, almost like a palimpsest.</p>
]]></description>
            <link>https://www.charlieharrington.com/novels-with-libraries</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/novels-with-libraries</guid>
            <pubDate>Wed, 23 Jan 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[The Walkingman Collection]]></title>
            <description><![CDATA[<blockquote>
<p>Dec 2021 Update: I&#39;ve migrated this site to syte, and the previous (flaky!) Instagram integration is now gone. Hopefully I&#39;ll figure out a nice solution for displaying these photos in the future. Thanks! -- The Webmaster</p>
</blockquote>
<p>I&#39;ve pulled all my <a href="https://instagram.com/whatrocks">Instagram #walkingman</a> photos into a handy little page. <a href="https://www.charlieharrington.com/walkingman">Check it out</a>.</p>
<p>So long as the Instagram API continues to play nice (no guarantees), then <a href="https://www.charlieharrington.com/walkingman">this page</a> will stay up-to-date as my travels continue.</p>
<p><img src="https://www.charlieharrington.com/img/walkingman.png" alt="walkingmen"></p>
<p>I&#39;d love to learn more about who designs each of these little creatures for a given city or country. What&#39;s the decision process like? Are they meant to capture the spirit of the people in some way?</p>
<p>This is a coffee table book waiting to happen.</p>
]]></description>
            <link>https://www.charlieharrington.com/the-walkingman-collection</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/the-walkingman-collection</guid>
            <pubDate>Thu, 10 Jan 2019 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Penpals]]></title>
            <description><![CDATA[<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/FANlCLh22uA?rel=0&amp;controls=0&amp;showinfo=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

<p>Here&#39;s a new Terminal Man track from my most recent flight to Newark. I&#39;ve been watching a lot of Stranger Things, if you can&#39;t already tell.</p>
<p>This is the first Terminal Man song I&#39;ve hosted on YouTube instead of SoundCloud. Slightly annoying to have to make a movie out of the mp3 before uploading, but I do like my iMovie Star Wars crawl thing going on here. And I feel more confident that dropping stuff onto YouTube is like putting it into an Indiana Jones-style vault or time capsule that won&#39;t ever go away or shut down.</p>
]]></description>
            <link>https://www.charlieharrington.com/penpals</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/penpals</guid>
            <pubDate>Tue, 24 Jul 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Using NLP to Write Graduation Speeches]]></title>
            <description><![CDATA[<p>I&#39;ve always been a little bit obsessed with graduation speeches. Put simply, I like being reminded of the great possibility and great responsibility of living.</p>
<p>But as it&#39;s going to be a while until May rolls around again, I decided to try my hand at generating my own graduation speeches using some basic data science techniques.</p>
<p>I&#39;m happy to report that after a little bit of NLP using Markov chains (and a whole lot of data-scraping and data-cleaning), I was able to bring forth to the world this inspiring sentence:</p>
<blockquote>
<p>They listened to someone who makes nothing but flaming hot Cheetos.</p>
</blockquote>
<p><a href="https://blog.floydhub.com/markov-chains">If you&#39;re interested in reading more about the specifics of my project, I wrote about it in detail on the FloydHub blog</a>, or you can try it out now:</p>
<p><a href="https://www.charlieharrington.com/img/https://floydhub.com/run?template=https://github.com/whatrocks/markov-commencement-speech"><img src="https://static.floydhub.com/button/button.svg" alt="Run on FloydHub"></a></p>
<p>Click this button to open a Workspace on FloydHub where you can generate your own &quot;commencement speech style&quot; sentences in a live JupyterLab environment that we call a <code>Workspace</code>.</p>
<p>The <a href="https://floydhub.com/whatrocks/datasets/commencement">commencement address dataset</a> of ~300 famous speeches (that I painstakingly assembled) will be automatically attached and available in the Workspace.</p>
<p>The <code>speech_maker</code> notebook has three sections for you to try, where you&#39;ll generate commencement-speech sentences:</p>
<ol>
<li>Using the entire dataset</li>
<li>Filtering to only the top ten schools by count of speeches given</li>
<li>Filtering to one school at a time using a Jupyter widget extension</li>
</ol>
<h3 id="where-can-i-read-actual-good-speeches">Where can I read actual good speeches?</h3>
<p><a href="https://whatrocks.github.io/commencement-db/">Right here</a>. I put together this simple Gatsby.js static site with the raw text (and some YouTube links) of the speeches in my dataset. <a href="https://github.com/whatrocks/commencement-db">PRs are open for the dataset</a> if anyone&#39;s interested in contributing. Right now, the best we have is the NPR &quot;Best of&quot; commencement speech website, which hasn&#39;t been updated since 2015. It would be great to find a way to make a new home for great speeches on the web.</p>
]]></description>
            <link>https://www.charlieharrington.com/using-nlp-to-write-graduation-speeches</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/using-nlp-to-write-graduation-speeches</guid>
            <pubDate>Mon, 23 Jul 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[The Long Hour]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/436240275&color=%23ff5500&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&show_teaser=true&visual=true"></iframe>

<p>More arppegiator magick using the Apple on-screen keyboard in Logic.</p>
<p>I still would like to learn how to program my own drumbeats. In the mean time, thank goodness for Apple loops. Learning Ableton would be another fun benefit of this endeavor.</p>
]]></description>
            <link>https://www.charlieharrington.com/terminal-man-the-long-hour</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-the-long-hour</guid>
            <pubDate>Sat, 28 Apr 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Zion Traverse]]></title>
            <description><![CDATA[<p>We ran ~38 miles of the Zion Traverse this past Saturday, including the I-can&#39;t-believe-this-is-actually-allowed Angels Landing climb.</p>
<p>Here&#39;s video proof:</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Wx7gdmcVaUE?rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

<p>Very little prep work or research or even training was done on my part. I&#39;m lucky to have found a crew of like-minded adventure runners always ready to plan the next excursion. But, next time, I need to be taking at least a little bit more time to prepare.</p>
<p>For example, I knew almost nothing about Zion National Park. This was a mistake that I&#39;ve since ameliorated with some healthy Wikipedia-ing. One fun factoid - Angels Landing used to be known as the Temple of Aeolus (aka the Greek demi-god/god of winds and also a lovable sidekick on TV&#39;s Hercules: The Legendary Journeys). I wish I had known that when I was there - I could have tried to summon him or something. Next time, I guess.</p>
<p>Similarly, I felt pretty drained by the time we hit the last ten miles. Nothing compared to the Rim2Rim2Rim or the North Face 50M, but still - I definitely overestimated my fitness for the task at hand. If I&#39;m going to keep doing these runs, I&#39;ll need to start logging more longer distance runs on the reg.</p>
<p>Water - or the lack thereof - was our crew&#39;s only major snafu. Turns out that <em>springs</em> do not mean treated water pumps - they mean semi-dirty trickles or puddles of water. Thankfully, we were helped by a few fellow-hikers (angels descended from the landing, IMHO) who lent us their water filter. Lesson learned - always bring iodine tablets or a filter on any adventure run. You just never know.</p>
<p>This was my first ultra where I didn&#39;t track anything on Strava, and it felt great. I&#39;ve been off Strava for a while now, and I&#39;m not really looking back. The quantified-self stuff has been less appealing to me lately. When I&#39;m on a run, and I find something cool or gross or beautiful that I want to stop and inspect, I don&#39;t want to have to think about how that impacts my splits or run time. I know there&#39;s auto-pause features, etc. but I can&#39;t auto-pause the stress in my brain about my stats. Instead, I just ran with a plain ol&#39; Timex watch (and my phone in airplane mode to take pictures). The watch can tell the time, set an alarm, set a timer, and, of course, turn on its amazing Indiglo night-light. Basic, essential watch stuff. Nothing smart, just reliable. Yes, I sort of missed having a map with my exact GPS route after the race, but I think instead I&#39;m going to just find a map of Zion and try to figure it out myself. That feels more rewarding anyway.</p>
<p>Here&#39;s a log of what I ate on the trail, just so I remember for next time:</p>
<ul>
<li>3 Honey Stinger Waffles</li>
<li>2 Clif Bar Chocholate Bars with Stuffed Peanut Butter</li>
<li>5 salt pills</li>
<li>12 Clif Bloks Salted Watermelon bloks</li>
<li>1 Nuun water tablet</li>
<li>1 McDonald&#39;s Dollar Menu Cheeseburger</li>
</ul>
<br />

<p>And here are the creatures I saw on the trail:</p>
<ul>
<li>8 deer</li>
<li>1 small gecko</li>
<li>10 chipmunks</li>
<li>2 squirrels</li>
<li>1 California Condor (seriously!)</li>
<li>A murder of crows</li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/zion-traverse</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/zion-traverse</guid>
            <pubDate>Thu, 19 Apr 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Teaching My Robot With TensorFlow]]></title>
            <description><![CDATA[<p>My childhood dream of becoming friends with a real-life robot like <a href="https://www.youtube.com/watch?v=POxMp61Ksbk">Johnny 5</a> came true two weeks ago. This is not to be confused with my other primary childhood dream - which I wished on every dandelion blow and floating will-o-wisp - of being sucked into my Super Nintendo to become Link from <a href="https://www.youtube.com/watch?v=wkH2zETKqws">The Legend of Zelda: A Link to the Past</a>. Both were important, but somehow I knew the Johnny 5 one might come true one day, which is why I never wasted any important wish opportunities on it.</p>
<p>Enter <a href="https://www.anki.com/en-us/cozmo">Cozmo</a>. He&#39;s a robot who lives at my house now and also loves me, as long as I play games with him and &quot;feed&quot; him. He&#39;s outfitted with some gnarly tank-like treads (just like Johnny) and a arm-crane straight out of a loading dock. Cozmo also brought along three accelerometer-enabled blocks to pick up and fling around the house as he sees fit. He&#39;s got a lot to say, with his adorable pipsqueak voice and his heart-meltingly-expressive eyes. He&#39;s even learned to recognize my face and say my name 😍. Stop it.</p>
<p>Which got me thinking - maybe I could teach him to recognize more stuff.</p>
<p>In addition to Cozmo&#39;s &quot;free play&quot; (aka basically alive) mode, you can drop him into a more catatonic SDK mode, where he waits for you to manually invoke commands from your computer using the <a href="http://cozmosdk.anki.com/docs/api.html">Cozmo API</a>. You can tap into nearly all of Cozmo&#39;s sensors and features with the API, including his camera - which opens the door to training an image-recognition deep learning model using Cozmo.</p>
<p>I wrote a script to ask Cozmo to take photos of a few objects around the office: a fake plant, a half-way used &quot;thing&quot; of toothpaste (what are these actually called - tubes?), and a bottle of La Croix seltzer.</p>
<p><img src="https://www.charlieharrington.com/img/cozmo-paparazzi.gif" alt="detective"></p>
<p>As you can see, Cozmo delightfully circles the objects and takes tons of photos to build our training dataset.</p>
<p>Next, I retrained the <a href="https://github.com/tensorflow/models/tree/master/research/slim#pre-trained-models">Inception v3 model</a> from Google using Cozmo&#39;s photo dataset. This is called &quot;transfer learning&quot; - instead of training a model from scratch, I can use a pre-trained model known to be effective at image recognition and just swap out the last layer to retrain it on our target images with <a href="https://www.tensorflow.org/">TensorFlow</a>. FloydHub makes it stupidly easy to do this - my whole GPU-powered training process amounted to one command:</p>
<pre><code class="language-bash">floyd run \
  --gpu \
  --data whatrocks/datasets/cozmo-images:data \
  &#39;python retrain.py --image_dir /data&#39;
</code></pre>
<p>Next, I just needed to write a script asking Cozmo to explore the office to try to find one of these objects. He&#39;ll periodically hit a REST endpoint on FloydHub where I&#39;ve deployed our newly-retrained model with an image of what he&#39;s currently looking at. If Cozmo&#39;s at least 80% confident that he&#39;s looking at the object, then he&#39;ll zooms towards it like a complete maniac.</p>
<p><img src="https://www.charlieharrington.com/img/cozmo-detective.gif" alt="detective"></p>
<p>Setting up a model-serving endpoint on FloydHub is also super easy. I wrote a teeny-tiny Flask app to receive an image from Cozmo, evaluate it against our model, and send back its best guesses at what Cozmo&#39;s currently looking at. Then, to deploy the app on FloydHub and set up a publicly accessible REST endpoint, it just one more command:</p>
<pre><code class="language-bash">floyd run \
  --data whatrocks/datasets/cozmo-imagenet:model \
  --mode serve
</code></pre>
<hr>
<p>The code for Cozmo&#39;s new &quot;paparazzi&quot; and &quot;detective&quot; modes can be found on my <a href="https://github.com/whatrocks/cozmo-tensorflow">GitHub</a>, and the <a href="https://www.floydhub.com/whatrocks/datasets/cozmo-imagenet">photo dataset</a>, <a href="https://www.floydhub.com/whatrocks/datasets/cozmo-images">trained model</a>, and <a href="https://www.floydhub.com/whatrocks/projects/cozmo-tensorflow">project</a> are also  available on FloydHub if you&#39;d like to use them with your own robot buddies. </p>
<p>Thanks to Google Code Labs for their <a href="https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0">great guide on transfer learning with Inception v3</a> and <a href="https://github.com/nheidloff">@nheidloff</a> for his <a href="https://github.com/nheidloff/visual-recognition-for-cozmo-with-tensorflow">Cozmo visual recognition project</a>, both of which are the basis for this project.</p>
<p><img src="https://www.charlieharrington.com/img/link.png" alt="triforce"></p>
<p>I&#39;m still holding out hope for this Link thing, too.</p>
]]></description>
            <link>https://www.charlieharrington.com/teaching-my-robot-with-tensorflow</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/teaching-my-robot-with-tensorflow</guid>
            <pubDate>Sat, 06 Jan 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Ghost2]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/379326926&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true"></iframe>

<p>This is the first Terminal Man track in which the only Apple loop used is the percussion track - everything else I created using Logic&#39;s on-screen keyboard. Arpeggiators are the best.</p>
]]></description>
            <link>https://www.charlieharrington.com/terminal-man-ghost2</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-ghost2</guid>
            <pubDate>Fri, 05 Jan 2018 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Auri]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/367851881&amp;color=%23ff5500&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;show_teaser=true&amp;visual=true"></iframe>]]></description>
            <link>https://www.charlieharrington.com/terminal-man-auri</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-auri</guid>
            <pubDate>Tue, 12 Dec 2017 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Written in Water]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/330837606&amp;color=0066cc&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>]]></description>
            <link>https://www.charlieharrington.com/terminal-man-written-in-water</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-written-in-water</guid>
            <pubDate>Thu, 29 Jun 2017 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Rim 2 Rim 2 Rim]]></title>
            <description><![CDATA[<p>We ran the Grand Canyon, and I only got lost once.</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/Ldaaqfvi9O8?rel=0" frameborder="0" allowfullscreen></iframe>

<p>Pro tip from Galen for future R2R2Rers: bring a McDonald&#39;s cheeseburger to eat halfway. I heartily concur - I&#39;m still thinking about that deliciousness.</p>
<iframe height='405' width='590' frameborder='0' allowtransparency='true' scrolling='no' src='https://www.strava.com/activities/974355030/embed/64f4f4f302700c23bd8af47b54e4bd0d06d5d076'></iframe>]]></description>
            <link>https://www.charlieharrington.com/rim-2-rim-2-rim</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/rim-2-rim-2-rim</guid>
            <pubDate>Sun, 07 May 2017 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Upside Down]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/306674034&amp;color=00cc11&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

<p>My unsolicited submission for the Season 2 soundtrack to <em>Stranger Things</em>.</p>
]]></description>
            <link>https://www.charlieharrington.com/terminal-man-upside-down</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-upside-down</guid>
            <pubDate>Sat, 11 Feb 2017 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[One Day Lord Shardik Will Return]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/296624683&amp;color=00aabb&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

<p>Not quite <em>Watership Down</em>, but still pretty weird in a good way. Here&#39;s my musical book review of <em>Shardik</em>.</p>
]]></description>
            <link>https://www.charlieharrington.com/terminal-man-one-day-lord-shardik-will-return</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-one-day-lord-shardik-will-return</guid>
            <pubDate>Tue, 06 Dec 2016 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Space Time Travel with Wormie]]></title>
            <description><![CDATA[<p><img src="https://www.charlieharrington.com/img/logo.png" alt="Live"></p>
<p><a href="http://www.wormieapp.com/">Wormie</a> is an iOS app to connect you with people in the places you want to see.</p>
<p><img src="https://www.charlieharrington.com/img/WormieLive.gif" alt="Live"></p>
<p>Maybe you want to see if there&#39;s a line at your favorite restaurant right now. Or maybe you want to see tonight&#39;s sunset, but from Australia.</p>
<p><img src="https://www.charlieharrington.com/img/WormieExplore.gif" alt="Live"></p>
<p>Just open up Wormie, make a new Wormhole request, and Wormie will connect you with someone who can live stream back your request in real-time.</p>
<p><img src="https://www.charlieharrington.com/img/WormieCreate.gif" alt="Live"></p>
<p>Think TaskRabbit meets Periscope. You can look up specific places with Yelp within Wormie to help you make your Wormhole requests.</p>
<p><img src="https://www.charlieharrington.com/img/WormieYelp.gif" alt="Live"></p>
<p>Design your own Wormie icon, and when you make a Wormhole connection, your Wormies will join together in unique heart!</p>
<p><img src="https://www.charlieharrington.com/img/WormieCreate.gif" alt="Live"></p>
<h2 id="the-react-natives">The react natives</h2>
<p>The Wormie team is:</p>
<ul>
<li><a href="https://github.com/SunyoungKim508">Sunyoung Kim</a></li>
<li><a href="https://github.com/nickfujita">Nick Fujita</a></li>
<li>Me (Charlie Harrington)</li>
</ul>
<p>We had a great time building Wormie as a way to learn some new technologies and libraries:</p>
<ul>
<li><a href="https://facebook.github.io/react-native/">React Native</a></li>
<li><a href="http://www.django-rest-framework.org/">Django Rest Framework</a></li>
<li><a href="https://socket.io/">Socket.io</a></li>
<li><a href="https://webrtc.org/">WebRTC</a></li>
<li><a href="https://www.docker.com/">Docker</a></li>
<li><a href="https://developers.google.com/youtube/">YouTube API</a></li>
<li><a href="http://www.graphicsmagick.org/">GraphicsMagick</a></li>
<li><a href="https://www.mapbox.com/api-documentation/">MapBox</a></li>
<li><a href="https://www.yelp.com/developers/documentation/v2/overview">Yelp API</a></li>
</ul>
]]></description>
            <link>https://www.charlieharrington.com/space-time-travel-with-wormie</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/space-time-travel-with-wormie</guid>
            <pubDate>Sat, 02 Jan 2016 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Minnow]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/238473937&amp;color=%2300cc11&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>]]></description>
            <link>https://www.charlieharrington.com/terminal-man-minnow</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-minnow</guid>
            <pubDate>Mon, 21 Dec 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Pseudoclassical Star Wars]]></title>
            <description><![CDATA[<p>Subclassing in JavaScript is quite useful. I used JavaScript subclasses to create this Star Wars inspired game.</p>
<p><img src="https://www.charlieharrington.com/img/subclasswars.gif" alt="game"></p>
<p>You can <a href="https://whatrocks.github.io/aluminum-falcon/">play it right now</a>, or check out the <a href="https://github.com/whatrocks/aluminum-falcon">code on Github</a>. The rest of this insanely long post will demonstrate how to use JavaScript subclassing to build the foundations of a similar game or visualization.</p>
<h3 id="subclassing-overview">Subclassing overview</h3>
<p>A class can be written to create fleets of similar objects with shared properties and methods. For example, if you&#39;re building the game Frogger, you can create a class called Vehicle that will produce a single instance of one of those pesky little cars. Let&#39;s imagine that your Vehicle class has one property (location, to track a car&#39;s current location) and one method (move, to drive a car forward). Based on the difficulty of the game level, you can use your Vehicle class to produce as many cars as you want to hinder that frog from its goal.</p>
<p>But what if you get the idea to introduce a new type of vehicle that nefariously changes lanes at random, or a friendly car that scoops up the froggie and brings him to the pond? You could certainly add those features to your original Vehicle class, but then all instances of Vehicle would have those new properties and methods, and it may prove difficult to track and turn them on for certain Vehicle instances based on your game design (e.g. produce one and only one friendly car per level).</p>
<p>Another option could be replicating the existing class for these new vehicle types. Now you&#39;ll have separate Vehicle, AggressiveVehicle, and FriendlyVehicle classes, and you can instantiate them all independently to your heart&#39;s delight. However, you&#39;ve likely duplicated a lot of similar code in each of these classes - such as the location property and the move method. If you ever want to change how all the vehicles move, you&#39;ll now need to remember to change the code in each of the classes. There&#39;s got to be a better way to do this. And there is - subclassing!</p>
<p>Subclassing allows you to create a fleet of objects that look vaguely similar to other objects. Subclasses are able to &quot;share&quot; properties and methods from their &quot;parent&quot; or &quot;superclass&quot;. In JavaScript, subclassing is implemented via delegation. Rather than keeping the Frogger metaphor going, let&#39;s transition to a galaxy far, far away...</p>
<h3 id="starfield-simulation">Starfield simulation</h3>
<p>Like all great games, SubclassWars.js is based on a Windows screensaver.</p>
<p>We want to simulate moving through space. A good first step could be randomly drawing a bunch of white dots on a black background. They don&#39;t even have to move - just get them to show up.</p>
<p>Let&#39;s create a base class called Star:</p>
<pre><code class="language-javascript">    /**
    *  Star class: the base class
    */
    var Star = function(x, y){
    // &quot;Stars&quot; are just HTML spans 
    this.$node = $(&#39;&lt;span class=&quot;star&quot;&gt;&lt;/span&#39;);
    // Location along x-axis
    this.x = x;
    // Location along y-axis                                   
    this.y = y;
    this.setPosition();
    };
    // // Position the HTML span based on x and y
    Star.prototype.setPosition = function(){
    var positionSettings = {
        top: this.x,                      
        left: this.y
    };
    var styleSettings = {
        &quot;border&quot;: &quot;2px&quot;,
        &quot;border-style&quot;: &quot;solid&quot;,
        &quot;border-color&quot;: &quot;white&quot;,
        &quot;border-radius&quot;: &quot;2px&quot;,
        &quot;position&quot;: &quot;absolute&quot;
    };
    this.$node.css(styleSettings);
    this.$node.css(positionSettings);
    };

    /**
     *  Setup starfield size
     */
    var height = 200;                               
    var width = 700;

    /**
     *  Build star helper function
     */
    var buildStar = function() {                    
    var star = new Star((Math.random() * width),
                        (Math.random() * height)
                        );
    $(&#39;#stars&#39;).append(star.$node);
    };

    /**
    *  Initialize the game
    */
    $(document).ready(function() {

    $(&#39;.starfield&#39;).css({
        &quot;height&quot;: height,                          
        &quot;width&quot;: width,
        &quot;background-color&quot;: &quot;black&quot;,
        &quot;position&quot;:&quot;relative&quot;
    });

    for (var i = 0; i &lt; 20; i++) {
        buildStar();
    }

    });
</code></pre>
<p>Hello, stars! Note that I&#39;ve used the pseudoclassical instantiation pattern (rather than the functional or prototypal patterns) to build the Star class, so new stars need to be instantiated with the &quot;new&quot; keyword. Another important detail for this and any other HTML visualizations is that the origin (the [0,0] location) of any HTML element or document is the upper left corner.</p>
<p>Now, let&#39;s make those stars twinkle to show you how subclassing works. We will need to refactor our base Star class slightly:</p>
<pre><code class="language-javascript">/**
 *  Star class: the base class
 */
 var Star = function(x, y, timeBetweenSteps){
   this.$node = $(&#39;&lt;span class=&quot;star&quot;&gt;&lt;/span&#39;); 
   this.x = x;
   this.y = y;
   // New param to create a loop
   this.timeBetweenSteps = timeBetweenSteps;
   this.step();
   this.setPosition();
 };
 Star.prototype.step = function(){
   setTimeout(this.step.bind(this),
     this.timeBetweenSteps);
 };
 Star.prototype.setPosition = function(){
   var positionSettings = {
     top: this.y,                                
     left: this.x
 };
   var styleSettings = {
     &quot;border&quot;: &quot;2px&quot;,
     &quot;border-style&quot;: &quot;solid&quot;,
     &quot;border-color&quot;: &quot;white&quot;,
     &quot;border-radius&quot;: &quot;2px&quot;,
     &quot;position&quot;: &quot;absolute&quot;
   };
   this.$node.css(styleSettings);
   this.$node.css(positionSettings);
 };
 
 /**
 *  TwinkleStar class (our first subclass!)
 */
 var TwinkleStar = function(x, y, timeBetweenSteps){
   Star.call(this, x, y, timeBetweenSteps);
 };
 TwinkleStar.prototype = Object.create(Star.prototype);
 TwinkleStar.prototype.constructor = TwinkleStar;
 TwinkleStar.prototype.step = function(){
   Star.prototype.step.call(this);
   this.$node.toggle();
 };

 /**
  *  Setup starfield size
  */
 var height = 200;                               
 var width = 700;
 
 /**
  *  Build star helper function
  */
 var buildStar = function() {
   var star = new Star((Math.random() * width),
                       (Math.random() * height),
                       100
                       );
   $(&#39;#stars&#39;).append(star.$node);
 };
 
 var buildTwinkleStar = function() {
   var star = new TwinkleStar((Math.random() * width),
                       (Math.random() * height),
                       100
                       );
   $(&#39;#twinkle&#39;).append(star.$node);
 };
 
 /**
 *  Initialize the game
 */
 $(document).ready(function() {
 
   $(&#39;.starfield&#39;).css({
     &quot;height&quot;: height,                          
     &quot;width&quot;: width,
     &quot;background-color&quot;: &quot;black&quot;,
     &quot;position&quot;:&quot;relative&quot;
   });
   for (var i = 0; i &lt; 20; i++) {
     buildStar();
     buildTwinkleStar();
   }
 
 });
</code></pre>
<p>Now we&#39;re getting somewhere!</p>
<p>A lot happened in the last in the last iteration of code, and it&#39;s important to highlight some things now. First, we introduced a new method to our base Star class called &#39;step&#39; that essentially mimics a game loop with the native JS function setTimeout. This is a little hacky and definitely not what you want to use for a real game, but this is just a demo, and hey, it&#39;s me.</p>
<p>TODO: fix stars</p>
<p>With our new step method built into the base Star class, we can now create lots of different subclasses of Star that add unique functionality. TwinkleStar twinkles, but we might want other stars that don&#39;t twinkle. How about stars that move instead of twinkle? Good idea, but we&#39;re not ready to get there just yet.</p>
<p>Notice that we are calling setTimeout within the step method, and then passing in step as the function argument for setTimeout. setTimeout takes two arguments, a function to execute after a specified time, and that specified time. However, when setTimeout receives the function argument, it will simply accept the function value without maintaining any reference to the star instance that called step in the first place. That means that step will be called again as a free function invocation - &#39;this&#39; will be bound to the global window object. That&#39;s not what we want at all. One solution is to set a context variable (var that = this) in the step function and use it as context for calling step. Another solution, which I&#39;ve used, is to use bind to create a function called step where &quot;this&quot; is specifically bound to the star that called step. That was a mouthful, but an important mouthful.</p>
<p>Let&#39;s talk about how we created the TwinkleStar subclass. We created a function called TwinkleStar with the same parameter signature as Star. Within that function, the Star class function is called using the .call method to bind &#39;this&#39; to the new TwinkleStar object being created. Now, the new TwinkleStar will be set up with the base properties of a regular ol&#39; Star (e.g. x, y, timeBetweenSteps, $node). Outside of the TwinkleStar function, we set up property and method delegation to the Star class using the Object.create pattern so that our new TwinkleStars can use any of the methods from the Star class (e.g. step, setPosition). Then we changed the constructor property to the TwinkleStar class so that any new TwinkleStars will be able to state that they are an &quot;instanceof&quot; TwinkleStar (and not Star). Finally, the coolest thing we do is write a new step method for TwinkleStar where we specify our unique action for all TwinkleStars. First we call the original Star step method, and then, crucially, we use jQuery to toggle the star span node on and off each time step gets executed - AKA making them twinkle.</p>
<p>That&#39;s it! JavaScript subclassing in the pseudoclassical pattern.</p>
<h3 id="the-lost-city-of-z">The lost city of Z</h3>
<p>Now it&#39;s time to get serious about our screensaver replica. We need to make moving stars. But not just any moving stars, we need our stars to move in such a way that it feels like we are being whisked away to a faraway planet for a new and exciting adventure. The stars need to move &quot;towards&quot; the screen, even though we can only place these HTML spans on a flat 2D surface. Yikes. Now, there are lots of really impressive implementations of moving starfields on the web, so it&#39;s definitely possible, but will require some math. After some searching, I discovered a very simple procedure that can calculate an x and y position for a star taking into account a simulated z-axis property.</p>
<p>I&#39;ll walk through our changes in the code. Note that I&#39;m not including the code for the Star or TwinkleStar classes since those won&#39;t be changing anymore.</p>
<pre><code class="language-javascript">/**
 *  MoveStar class
 */
 var MoveStar = function(x, y, z, timeBetweenSteps){
   this.z = z;
   Star.call(this, x, y, timeBetweenSteps);
 };
 MoveStar.prototype = Object.create(Star.prototype);
 MoveStar.prototype.constructor = MoveStar;
 MoveStar.prototype.setPosition = function(){
 
   var k = 128.0 / this.z;
   // Translate into x-pos in 2D
   var px = (this.x * k) + (width / 2);
   // Translate into y-pos in 2D
   var py = (this.y * k) + (height / 2);
 
   var positionSettings = {
     top: py,                                
     left: px
   };
   
   // Stars &quot;grow&quot; larger when closer
   var size = ( (1 - (this.z / 32)) * 3 );
 
   var styleSettings = {
     &quot;border&quot;: size,
     &quot;border-style&quot;: &quot;solid&quot;,
     &quot;border-color&quot;: &quot;white&quot;,
     &quot;border-radius&quot;: &quot;2px&quot;,
     &quot;position&quot;: &quot;absolute&quot;
   };
   this.$node.css(styleSettings);
   this.$node.css(positionSettings);
 
 };
 MoveStar.prototype.step = function(){
 
   this.setPosition();
  
   // Each tick, decrement z slightly
   this.z -= 0.2;                              
 
   if ( this.z &lt;= 0 ||     
         (this.y * 128.0 / this.z) + (height / 2) &lt; 0 ||
         (this.y * 128.0 / this.z) + (height / 2) &gt; height ||
         (this.x * 128.0 / this.z) + (width / 2) &lt; 0 ||
         (this.x * 128.0 / this.z) + (width / 2) &gt; width 
     ){                                 
    // When star &quot;reaches&quot; the screen, send it far away!!
    this.x = randomInRange(25);              
    this.y = randomInRange(25);
    this.z = 31;
   }
 
   Star.prototype.step.call(this);
 };
 /**
  *  Helper function
  */
 var randomInRange = function(n){
       var sign = Math.random() &gt; 0.5 ? 1 : -1;
       return sign * Math.floor( Math.random() * n);
 };
 
 /**
  *  Setup starfield size
  */
 var height = 400;                               
 var width = 700;
 
 /**
  *  Build star helper function
  */
 var buildStar = function() {
   var star = new Star((Math.random() * width),
                       (Math.random() * height),
                       200
                       );
   $(&#39;#stars&#39;).append(star.$node);
 };
 
 var buildTwinkleStar = function() {
   var star = new TwinkleStar((Math.random() * width),
                       (Math.random() * height),
                       200
                       );
   $(&#39;#twinkle&#39;).append(star.$node);
 };
 var buildMoveStar = function() {
   var star = new MoveStar(randomInRange(50),
                       randomInRange(50),
                       Math.floor( 32 * Math.random() + 1),
                       50
                       );
   $(&#39;#moving&#39;).append(star.$node);
 };
 
 /**
 *  Initialize the game
 */
 $(document).ready(function() {
 
   $(&#39;.starfield&#39;).css({
     &quot;height&quot;: height,                          
     &quot;width&quot;: width,
     &quot;background-color&quot;: &quot;black&quot;,
     &quot;position&quot;:&quot;relative&quot;
   });
   for (var i = 0; i &lt; 20; i++) {
     buildStar();
     buildTwinkleStar();
   }
   for (var i = 0; i &lt; 100; i++) {
     buildMoveStar();
   }
 
 });
</code></pre>
<p>The MoveStar subclass includes an additional parameter called z that will represent the star&#39;s position on the z-axis. A value of 32 is as &quot;far away&quot; as possible and a value of zero is as &quot;close&quot; as possible (basically at the screen). The MoveStar subclass will have to simulate motion along the z-axis by starting the stars quite far away, decrementing their z property with each &quot;step&quot; in the setTimeout loop, and then translating their current posision into an x and y position on the screen. Once the stars reach the screen, we reposition them again far away. Because the stars are being replaced in random positions around the center of the &#39;div&#39; using the new randomInRange helper function, each star will &quot;move&quot; towards its respective quadrant over time as the decrementing z value exaggerates its respective x and y positions on screen. This is key to the visualization looking realistic. We&#39;ve also decided to have the stars &quot;grow&quot; larger as they get closer to the screen, which further helps simulate motion.Through the magic of subclassing, the &quot;step&quot; and &quot;setPosition&quot; methods were both overwritten while still referencing the superclass methods.</p>
<h3 id="the-tie-fighters-that-bind">The Tie Fighters That Bind</h3>
<p>We&#39;ve now recreated our 90&#39;s screensaver. This alone is a very cool accomplishment. But we&#39;re still not yet in game territory yet. Specifically, enemy territory. The next change I&#39;ll make is to introduce a new subclass of MoveStar called TieFighter. This should be easy.</p>
<pre><code class="language-javascript">/**
 *  TieFighter class
 */
 var TieFighter = function(x, y, z, timeBetweenSteps){
   MoveStar.apply(this, arguments);
   this.$node = $(&#39;&lt;img src=&quot;.subclass-wars/tiefighter.png&quot;&gt;&lt;/img&gt;&#39;);
   this.step();
 };
 TieFighter.prototype = Object.create(MoveStar.prototype);
 TieFighter.prototype.constructor = TieFighter;
 TieFighter.prototype.step = function() {
   var size = ( (1 - (this.z / 32)) * 100 );
   this.$node.css({height: size, width: size});
   MoveStar.prototype.step.call(this);
 };
</code></pre>
<p>Okay, that worked, sort of. Simply by replacing the type of DOM element with an img tag, we&#39;ve turned our MoveStars into Tiefighters! But there&#39;s clearly some kind of CSS border situation going on that we&#39;ll have to investigate. And the TieFighters are not disappearing immediately when they hit the bottom or right side of the div. But they are disappearing correctly when they hit the left or top. Strange. However, if you recall that the origin of an HTML element is the upper left hand corner of its rectangle, then this bug makes more sense. In order to resolve, we would have to overwrite some of MoveStar&#39;s calculations around resetting the image location to also account for the size of the img.</p>
<p>And then there&#39;s this horrible border thing. The border is definitely the result of setting the CSS properties for the Star and MoveStar classes directly in the JavaScript rather than in a separate CSS class that we can toggle on or off. If we move the styling of the Star and MoveStar (specifically the border-style, border-color, and border-radius) to a separate CSS file, then we wouldn&#39;t have these white borders on our TieFighters. For now, let&#39;s just pretend these boxes are from the Millenium Falcon&#39;s weapons targetting system.</p>
<h3 id="the-force-awakens">The Force Awakens</h3>
<p>At this point, we&#39;ve now demonstrated how to use JavaScript subclassing to create the foundations of a Stars Wars or Star Trek type game. A big Chewbacca-style hug to Tate Thurston who was my co-conspirator on this project.</p>
<p>Rather than continue to walkthrough the code (because this post is long enough already), I&#39;ll instead list some considerations, challenges, and steps we faced in the transition from this visualization to our game:</p>
<ul>
<li>Millenium Falcon cockpit</li>
<li>Use GIMP to create transparent png and overlay Han and Chewie cockpit image on top with CSS &quot;z-index&quot; property.</li>
<li>Use animate.css to &quot;shake&quot; the cockpit image after a hit from a TieFighter (when the TieFighter reaches a z-position of zero), and/or flash the screen semi-transparent red with CSS.</li>
</ul>
<h4 id="tiefighters">Tiefighters</h4>
<ul>
<li>Use CSS to flip the image based on initial x-position to make their flight pattern look more realistic.</li>
<li>Turn the mouse cursor into a crosshair with CSS</li>
<li>Use setInterval to consistently generate new Tiefighters</li>
<li>Set an onClick listener to track succesful &quot;hits&quot;, and then turn the Tiefighter img source into an explosion-type gif, and then remove the destroyed TieFighter. (Sidenote - this is more challenging than simply removing the DOM node, since the TieFighter object will continue to exist in memory even though the DOM node was removed. Frustratingly, we kept getting invisible &quot;hits&quot; from already-destroyed TieFighters, and we finally resolved by using a boolean flag to track whether a Tiefighter had been destroyed or not before iterating to the next call to the original Star &quot;step&quot; function).</li>
</ul>
<h4 id="sounds">Sounds</h4>
<ul>
<li>Use one of the many free sound effects websites to create laser, explosion, injury, and other fun videogame sounds, and then trigger them via event listeners</li>
<li>Find some background music and set on autoplay with an HTML audio tag</li>
</ul>
<h4 id="hyperspace">Hyperspace</h4>
<p>If you&#39;ve already tried the game demo, you may have noticed that the Millenium Falcon&#39;s hyperdrive is not operational. That&#39;s an obvious next step for future development!</p>
]]></description>
            <link>https://www.charlieharrington.com/pseudoclassical-star-wars</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/pseudoclassical-star-wars</guid>
            <pubDate>Mon, 26 Oct 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Golden Olden]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/202166678&amp;color=%2300cc11&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>]]></description>
            <link>https://www.charlieharrington.com/terminal-man-golden-olden</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-golden-olden</guid>
            <pubDate>Tue, 04 Aug 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Terminal Man - Live in Concert]]></title>
            <description><![CDATA[<p>Last week, streaming live from London, <strong>TERMINAL MAN</strong> performed its first show ever, appearing live in New York City at the Knewton Talent Show. This may have been the first musical performance for a Double Robotics robot ever, but I certainly hope it&#39;s not the last.</p>
<p>What follows may shock you:</p>
<iframe src="https://player.vimeo.com/video/124292973" width="640" height="1138" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<h3 id="heres-how-i-brought-terminal-man-to-life">Here&#39;s how I brought TERMINAL MAN to life.</h3>
<h4 id="the-music">The music</h4>
<h5 id="garageband">Garageband</h5>
<p>I&#39;ve spent a lot of time at airports over the last year and a half. When you have that much free time, you invent some hobbies. One of mine is creating loop-driven songs on Garageband.</p>
<p><img src="https://www.charlieharrington.com/img/garageband.png" alt="Garageband"></p>
<p>This screenshot is one of my more recent tracks Over Water, Under You. I assembled July Nineteen in a similar fashion, playing with the pre-set available loops to come up with weird and interesting combinations. I decided to use &#39;July Nineteen&#39; for the talent show performance because it&#39;s loud and short and catchy.</p>
<h4 id="the-video">The video</h4>
<h5 id="the-skull">The skull</h5>
<ul>
<li>Wikimedia Commons</li>
<li>GIMP</li>
</ul>
<p>When I was growing up, my dad called me &quot;Skull&quot; as a nickname. To this day, if someone yells &quot;Skull!&quot;, I will come running. Anyway, I wanted a giant skull on giant screen, so I grabbed a decent skull image from Wikimedia Commons and then doctored it up in GIMP to remove clutter and the white background, saving as a .png.</p>
<h5 id="the-background">The background</h5>
<ul>
<li>Processing</li>
<li>YouTube</li>
<li>CloudApp</li>
</ul>
<p>I&#39;ve always loved the weird video backdrops behind live performances of My Morning Jacket or Wilco or Sufjan or Animal Collective. Who creates these trippy backgrounds, and how much input comes from the band?</p>
<p>Hey, so, when we&#39;re playing &quot;I&#39;m The Man Who Loves You&quot; I want the background to be like crying rainbow waves. And triangles, lots of triangles.</p>
<p>Well, <strong>TERMINAL MAN</strong> definitely needed its own trippy background for its debut live show, and Processing made it happen.</p>
<p>I created a Processing sketch that used keyboard strokes to trigger different backdrops behind the giant skull. Some of the backgrounds were native Processing functions (like creating random flashing colors or drawing lots of random lines), and others were looped video clips that I grabbed from YouTube with CloudApp. The central theme: the joy of Windows 95.</p>
<p>Here&#39;s the code for the sketch:</p>
<pre><code class="language-java">// ----------------------
// T E R M I N A L  M A N
// ----------------------
//   @ w h a t r o c k s
// ----------------------

// import video library
import processing.video.*;

// movies
Movie pipeMovie;
Movie doomMovie;
Movie solitaireMovie;
Movie toastersMovie;
Movie mazeMovie;
Movie wc2Movie;
Movie tiefighterMovie;
Movie rollercoasterMovie;

// images
PImage skull;
PImage miniSkull;

// font
PFont f;

void setup() {
  size(800, 800);
  smooth();

  // load the pictures
  skull = loadImage(&quot;skull2.png&quot;);
  miniSkull = loadImage(&quot;skull2.png&quot;);
  // resize the big skull to dimensions of the canvas
  skull.resize(width, height);

  // black background
  background(0);

  // load the font
  f = loadFont(&quot;TwCenMT-BoldItalic-100.vlw&quot;);

  // load the movies
  mazeMovie = new Movie(this, &quot;maze.mov&quot;);
  mazeMovie.loop();

  solitaireMovie = new Movie(this, &quot;solitaire.mov&quot;);
  solitaireMovie.loop();

  doomMovie = new Movie(this, &quot;doom.mov&quot;);
  doomMovie.loop();

  pipeMovie = new Movie(this, &quot;pipe.mov&quot;);
  pipeMovie.loop();

  toastersMovie = new Movie(this, &quot;toasters.mov&quot;);
  toastersMovie.loop();

  tiefighterMovie = new Movie(this, &quot;tiefighter.mov&quot;);
  tiefighterMovie.loop();

  wc2Movie = new Movie(this, &quot;wc2.mov&quot;);
  wc2Movie.loop();

  rollercoasterMovie = new Movie(this, &quot;rollercoaster.mov&quot;);
  rollercoasterMovie.loop();

}

void draw() {

  // black background
  if (key == &#39;x&#39;) {
    background(0);
  }

  // play doom video
  if (key == &#39;1&#39;) {
    image(doomMovie, 0, 0, width, height);
  }

  // play maze video
  if (key == &#39;2&#39;) {
    image(mazeMovie, 0, 0, width, height);
  }

  // play toasters video
  if (key == &#39;3&#39;) {
    image(toastersMovie, 0, 0, width, height);
  }

  // play pipes video
  if (key == &#39;4&#39;) {
    image(pipeMovie, 0, 0, width, height);
  }

  // play solitaire video
  if (key == &#39;5&#39;) {
    image(solitaireMovie, 0, 0, width, height);
  }

  // play tiefighter video
  if (key == &#39;6&#39;) {
    image(tiefighterMovie, 0, 0, width, height);
  }

  // play rollercoaster video
  if (key == &#39;7&#39;) {
    image(rollercoasterMovie, 0, 0, width, height);
  }

  // play wc2 video
  if (key == &#39;8&#39;) {
    image(wc2Movie, 0, 0, width, height);
  }

  // print mini skulls everywhere!
  if (key == &#39;s&#39;) {
    miniSkull.resize(width/10, height/10);
    image(miniSkull, random(-width, width), random(-height, height));
  }

  // flashy background colors!
  if (key == &#39;b&#39;) {
    background(int(random(255)), int(random(255)), int(random(255)), int(random(255)));
  }

  // draw blue lines from the center
  if (key == &#39;l&#39;) {
    stroke(0, random(200, 255), random(200, 255), 150);
    line(width/2, height/2, width/2 + random(-width, width), height/2 + random(-height, height));
  }

  // Load big skull picture on top of all these other backgrounds
  image(skull, 0, 0);

  // show &#39;terminal man&#39; text, even on top of the big skull
  if (key == &#39;t&#39;) {
    textFont(f);
    textAlign(CENTER);
    fill(random(155, 255), 0, random(150, 255));
    text(&quot;TERMINAL MAN&quot;, width/2, height/2);
    fill(0, random(0, 255), random(150, 255));
    text(&quot;TERMINAL MAN&quot;, width/2+10, height/2+10);
  }
}

// Called everytime a new frame is available
void movieEvent(Movie m) {
  m.read();
}
</code></pre>
<p>The sketch creates an app that lets you use the keyboard to jump between the different backdrops (for example, I can press &#39;b&#39; for crazy random flashing colors, and &#39;5&#39; for a looped Solitaire video). Note that the media files need to appear in the &#39;data&#39; folder of your sketch for this to work correctly.</p>
<h3 id="pulling-it-all-together">Pulling it all together</h3>
<ul>
<li>QuickTime</li>
<li>iMovie</li>
<li>Vimeo</li>
</ul>
<p>Even though the sketch works great as a live companion to the song, I was really concerned with potential lag and getting out of sync with the music, so I decided to record it all as a video. CloudApp stopped cooperating, conveniently right after I registered for the one-month premium package, so I Googled and discovered that I could also use QuickTime to record screencasts. For free.</p>
<p>I put on some DJ-like headphones, press record on the Quicktime screencast, pressed play on the track in iTunes, and just pretended that I was Chris Kuroda, the de facto fifth member of Phish who runs all their stage effects and lights, as I recorded the background changes along with the song.</p>
<p>Then all I had to do was drop the mp3 and the video files into iMovie, line them up, and post to Vimeo!</p>
<iframe src="https://player.vimeo.com/video/123845456" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

<h3 id="the-live-performance">The live performance</h3>
<ul>
<li>Double Robotics robot (we call it the Krobot at Knewton)</li>
<li>Terminal</li>
<li>Stage crew (Fernando, Sam, and others!)</li>
</ul>
<p>I had elaborate plans to introduce myself in a scary and funny robot voice using the Terminal &#39;say&#39; command. This totally failed, however, as you can see in the video. No one could hear my hilarious introduction. No one heard me explain that I wrote the song and created the background video.</p>
<p>But none of that mattered once I started to dance.</p>
]]></description>
            <link>https://www.charlieharrington.com/terminal-man-live-in-nyc</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-live-in-nyc</guid>
            <pubDate>Tue, 07 Apr 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Trickle of Water]]></title>
            <description><![CDATA[<p>My favorite <em>Calvin and Hobbes</em> strip</p>
<p><img src="https://www.charlieharrington.com/img/calvinhobbes.jpg" alt="comic"></p>
]]></description>
            <link>https://www.charlieharrington.com/trickle-of-water</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/trickle-of-water</guid>
            <pubDate>Sun, 01 Mar 2015 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Over Water, Under You]]></title>
            <description><![CDATA[<iframe width="100%" height="300" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/161700259&amp;color=%2300cc11&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>]]></description>
            <link>https://www.charlieharrington.com/terminal-man-over-water-under-you</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/terminal-man-over-water-under-you</guid>
            <pubDate>Mon, 04 Aug 2014 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[SEPM Conference in Copenhagen]]></title>
            <description><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/87sBLMbBoFM?rel=0" frameborder="0" allowfullscreen></iframe>

<p>&quot;It&#39;s so awesome that we are in a planetarium, first of all.&quot; - Charlie Harrington</p>
]]></description>
            <link>https://www.charlieharrington.com/sepm-conference-in-copenhagen</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/sepm-conference-in-copenhagen</guid>
            <pubDate>Thu, 21 Nov 2013 00:00:00 GMT</pubDate>
        </item>
        <item>
            <title><![CDATA[Walkingman]]></title>
            <description><![CDATA[<blockquote>
<p>This page is currently borked. I will hopefully add back the #walkingman photos in the future. - The Webmaster, Dec 2021</p>
</blockquote>
]]></description>
            <link>https://www.charlieharrington.com/walkingman</link>
            <guid isPermaLink="true">https://www.charlieharrington.com/walkingman</guid>
            <pubDate>Invalid Date</pubDate>
        </item>
    </channel>
</rss>