<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.lambdalatitudinarians.org/feed/techblog.xml" rel="self" type="application/atom+xml" /><link href="https://www.lambdalatitudinarians.org/" rel="alternate" type="text/html" /><updated>2026-05-04T20:47:55+00:00</updated><id>https://www.lambdalatitudinarians.org/feed/techblog.xml</id><title type="html">λ Latitudinarians | Techblog</title><subtitle>Nathan Contino&apos;s personal website and blog, Lambda Latitudinarians.
</subtitle><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><entry><title type="html">Book Review: Klara and the Sun</title><link href="https://www.lambdalatitudinarians.org/techblog/2026/04/06/klara-and-the-sun/" rel="alternate" type="text/html" title="Book Review: Klara and the Sun" /><published>2026-04-06T20:13:13+00:00</published><updated>2026-04-06T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2026/04/06/klara-and-the-sun</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2026/04/06/klara-and-the-sun/"><![CDATA[<p>I recently read <strong>Klara and the Sun</strong>, my third Ishiguro novel. Halfway through, my impatience got the better of me; I was ready to label this the worst Ishiguro novel I've ever read. But I eventually came around. While <strong>Klara</strong> lacks the nostalgic charm of <strong>Remains of the Day</strong> or the punch-in-the-gut reveal of <strong>Never Let Me Go</strong>, it nevertheless feels like an important statement about technology, science, faith, and technocracy.</p>

<p>If a book about an artificially intelligent android sounds tiresome when AI hype is slowly crushing all hope for humanity, fear not: this book is even better if you replace "Android Friend"/"AF" with "dog".</p>

<!-- readmore -->

<h2 id="characters">Characters</h2>

<ul>
  <li>
    <p>Klara: An Android Friend (AF), a solar-powered, bipedal, artificial intelligence. The (sometimes unreliable, childlike, but oddly inhuman) POV of the story. Klara is (supposedly) unusually clever and observant for an AF, but we don't get many AFs for comparison. Worships the Sun in a surprisingly literal sense; has multiple back-and-forth conversations with the Sun, actively believes that the Sun intervenes with 'special healing' for multiple characters throughout the book. I was initially confused when Klara remarks that 'the world was divided into boxes' during complicated scenes, or when she occasionally reduces a character or some other entity to a cone or box, but I eventually figured out that this is Ishiguro's attempt to convey Klara's computer vision to the reader: when the world becomes 'partitioned', I assume we are seeing Klara parallelizing processing of a scene because there's too much going on and she needs to split up her processing; when a person turns into a simpler shape, I assume we are seeing Klara manage memory consumption when something very complicated is taking up a lot of processing (or when she is damaged/inhibited later in the story). Klara rarely (or never?) uses pronouns, opting to always use names to refer to people, even when speaking directly to a person.</p>
  </li>
  <li>
    <p>Josie: a teenage girl who lives alone with her mother out in the boonies. As is the social norm, Josie has been 'lifted' using genetic engineering to be smarter than your average child (though we see little hard evidence of this throughout the story). Unfortunately, due to side-effects of her genetic engineering, Josie is sickly, to the point where the likelihood of her survival drives much of the story.</p>
  </li>
  <li>
    <p>Rick: Josie's childhood best friend and only neighbor in the boonies (he lives in the crappy house next door). Brilliant and kind, but ostracized by society because his mother opted not to 'lift' him with genetic engineering. He's really into drones and other discreet surveillance technology that are <em>totally</em> not an ethical minefield.</p>
  </li>
  <li>
    <p>the Mother (Chrissie): Josie's mother. Divorced, lives alone in the boonies. Cold and career-oriented and sometimes cruel, likely at least partially because her first daughter, Sal, died as a result of complications rising from the same genetic engineering that Josie is currently suffering from (and that society heavily peer pressures parents into getting for their children, despite the risks).</p>
  </li>
  <li>
    <p>the Father (Paul): Josie's father, an engineer who routinely insists that things are 'outside his area of expertise' but then goes right ahead and postulates opinions about them. Divorced, lives in some kind of post-employment compound in the city with a bunch of other rich white guys who feel the need to arm themselves against the nearby 'gangs'. Claims not to be a fascist (but who does?).</p>
  </li>
  <li>
    <p>Helen: Rick's mother. Rick spends a lot of time worrying about and protecting her, but she seems mostly competent when she joins the story. She doesn't work or drive, which seriously complicates Rick's childhood and ability to do just about anything, living out in the boonies.</p>
  </li>
  <li>
    <p>Rosa: An AF of a similar make and model to Klara, displayed and sold out of the same store.</p>
  </li>
  <li>
    <p>Manager: The manager of the store that Klara spends the first bit of story in. Shows a glimmer of empathy for the AFs when she helps Klara not get bought by another child after Josie has already promised to buy Klara, and once more at the end of the story.</p>
  </li>
  <li>
    <p>Vance: A real dick who used to fuck Helen, but then she ghosted him because he's a dick. Shows up briefly in the story because Helen tries to manipulate him into nepotisming Rick into college, but it turns out he's just salty about getting ghosted.</p>
  </li>
  <li>
    <p>The Housekeeper (Melania): Cleans the house, distrusts AFs, does a fair bit of nannying for Josie.</p>
  </li>
</ul>

<h2 id="setting">Setting</h2>

<p>A dystopian near-future that unfortunately feels very similar to our current world. Notable differences:</p>

<ul>
  <li>automation is destroying even high-level engineering positions (and the automation is actually capable of doing those jobs!)</li>
  <li>android friends are a true sentient artificial intelligence -- despite what chatbot-peddling tech companies will tell you, we are a very very very very very very very very very very very long way from an introspective, sentient, empathetic machine. Many nontechnical readers will inevitably compare Klara to ChatGPT or Claude. I assure you that LLMs have neither a consistent worldview, an internal monologue, or anything else that makes them remotely similar to the anthropomorphic internal POV of Klara. LLMs produce statistically likely text that, combined with the smoke and mirrors of image processing and voice simulation, can sometimes <em>seem</em> like sentience to the untrained eye. They are not. Really. And if you are dumb enough to think than an LLM is sentient, you should really think for a minute about why you're OK with mass machine slavery, torture, and murder.</li>
  <li>genetic engineering is capable of improving children (in some vague way that seems mostly related to intelligence and social ability) at some low risk of complications that can lead to death</li>
</ul>

<p>Unfortunately, the little worldbuilding we get in <strong>Klara and the Sun</strong> doesn't flesh out most of these concepts -- but you don't read Ishiguro for hard science fiction explanations. He's all about the impact on humanity.</p>

<h2 id="plot">Plot</h2>

<p>Klara's story begins in a shop window, where the Manager peddles her and other Android Friends using a variety of shop displays. Children come in, talk to an AF, grow attached, and guilt their parents into making a huge purchase. Much like Android Friends in general, the experience is somewhere between a mall pet store and an Apple store, where glass window displays lure children in, and knowledgeable parents worry about getting the best deal on the most modern technology.</p>

<p>Notably, in the shop, Klara learns about the world exclusively through the window, which looks out on a fairly typical walkable city street. People walk and jog past; taxis occasionally get in heated arguments; homeless people loiter in empty doorways; children gaze longingly into the window; sometimes nondescript public works results in a giant machine (with the name 'Cootings' on the side) spewing smoke right in front of the shop window for a week because they're resurfacing the street or working on underground utilities or something.</p>

<p>Eventually Josie's family buys Klara from the store and brings her home. The household is weird, but nice enough; Josie is sometimes sick; Chrissie is often a coldhearted jerk. But I'm sure plenty of AFs wind up in much worse homes.</p>

<p>Things escalate a bit when Josie first gets quite sick. Chrissie tries to boost her spirits by promising a visit to a waterfall that Josie loves, but when the family gets in the car to go to the waterfall, Chrissie declares Josie too sick to go. But instead of everyone staying home, Chrissie takes Klara to the waterfall, and even asks Klara to <em>pretend to be Josie</em>. We learn that Josie once had an older sister, Sal, who died of a similar sickness to what Josie has now.</p>

<p>Eventually we meet Rick and a collection of local-ish 'lifted' (genetically improved) children. All of the other kids are spoiled assholes, most of whom are totally OK with bullying Rick and endangering Klara.</p>

<p>Josie keeps getting sick. With Rick's help, Klara journeys out to a barn that the Sun sets behind, where she prays/worships/bargains with the Sun to cure Josie's illness. Klara becomes convinced that if she destroys the polluting Cooting machine she used to see outside the AF shop, the Sun will cure Josie. People keep asking Klara if Josie is going to die, and Klara keeps alluding to her hope that Josie will get better because of her (secret!) faith in the Sun. People seem to think that AFs are smarter than humans and thus conclude that Josie will not die because the artificial intelligence said so.</p>

<p>Eventually the entire gang of Chrissie, Josie, Helen, Rick, and Klara meet up with Paul in the city for the climax of the book. We learn that Chrissie has been bamboozled by a psychopath (Capaldi) into considering replacing Josie (if she dies) with Klara. Paul doesn't like this idea, but isn't nearly as repulsed by it as he should be. But to his credit, Klara discusses the idea of a soul with Paul, and neither he nor Klara believe that, if you observe a person for a long time, you can fully replace them with a computer. It all comes together with this excellent description of why you should hate tech bros:</p>

<blockquote>
  <p>I think I hate Capaldi because deep down I suspect he may be right. That what he claims is true. That science has now proved beyond doubt there's nothing so unique about my daughter, nothing our modern tools can't excavate, copy, transfer. That people have been living with one another all this time, centuries, loving and hating each other, and all on a mistaken premise. A kind of superstition we kept going while we didn't know better. That's how Capaldi sees it, and there's a part of me that fears he's right. Chrissie, on the other hand, isn't like me. She may not know it yet, but she'll never let herself be persuaded. If the moment ever comes, never mind how well you play your part, Klara, never mind how much she wishes it to work, Chrissie just won't be able to accept it. She's too...old-fashioned. Even if she knows she's going against the science and the math, she still won't be able to do it. She just won't stretch that far. But I'm different. I have...a kind of coldness in side me she lacks. Perhaps it's because I'm an expert engineer, as you put it. This is why I find it so hard to be civil around people like Capaldi. When they do what they do, say what they say, it feels like they're taking from me what I hold most precious in this life. Am I making sense?</p>
</blockquote>

<p>Nobody tells Josie that Chrissie and her psychopath friend want to replace her if she dies like a faulty lightbulb.</p>

<p>Paul and Klara sabotage the Cootings machine with magic fluid that Paul takes out of Klara's head.</p>

<p>Helen and Rick meet up with Vance to try to nepotism Rick into college, but Vance sucks.</p>

<p>Everyone returns home, but Josie gets really sick. Everyone becomes convinced that she'll die. But Rick takes Klara to the magic barn one more time and she tells the Sun that because Rick and Josie love each other, the Sun should cure her with magic light. The next day, the Sun gets really bright for a hot second, and Klara stops the Housekeeper from shutting the shades on Josie. Josie finally gets better (because of the Sun's special nourishing, if you believe Klara and her faith).</p>

<p>Eventually Josie goes to college and Rick goes to wherever those dumb unlifted plebeians go and Klara goes to a dump that people aren't allowed to remove AFs from because of some implied ban on AFs. The manager from Klara's store finds Klara and asks her how her life went. Klara seems pleased.</p>

<h2 id="summary">Summary</h2>

<p>This story would have been even better if, instead of an android, Klara was just a pet dog. You wouldn't even have to change the story much, since Klara so rarely speaks (and literally never speaks in a consequential way -- most people barely even listen to what she has to say). Even better, you'd avoid the entire minefield of anthropormorphizing artificial intelligence that has become tiresome, to say the least, in the past few years. Sure, AFs play into the dystopian world of people losing their jobs to automation, but it doesn't matter so much that we actually need to explicitly call out artificial intelligence.</p>

<p>There were aspects of this story that I really liked. I enjoyed Klara's mysterious faith in the Sun -- portrayals of religion in literature can feel tedious, but this felt original in a way that I haven't seen elsewhere. There are echoes of my favorite parts of <strong>Remains of the Day</strong> -- acceptance, and moving on after a part of your life has concluded. And the converse, Chrissie's struggle to accept her own role in potentially killing both of her daughters. It was fun to see Klara try to understand the world around her, from her glimpses of humanity in the shop window, to her first visit outside (and her laughable confusion about the 'loose stones' in the driveway for the car), to her love of 'kind, gentle' sheep, to her hatred of bulls, to the way she compartmentalized experiences in the crowd outside the theatre when everyone visits the city. And it's impossible to not like Rick, the guy who's so nice he carries a robot through a field so it can worship the Sun.</p>

<p>There were also aspects I didn't like. After a while, Klara's childlike minimal prose became tedious to read. The story is extremely slow. The dialogue is... not how humans speak, at all. It literally does not make any sense that Klara wouldn't understand that the Sun is a star, in the sky, that does not, in fact, set into some random guy's barn (especially since late in the book she helps tutor Rick with physics, math, and science).</p>

<p>Overall, a recommend (though I would recommend <strong>Remains of the Day</strong> or <strong>Never Let Me Go</strong> first). But I'll say it again: Klara should have been a dog.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I recently read Klara and the Sun, my third Ishiguro novel. Halfway through, my impatience got the better of me; I was ready to label this the worst Ishiguro novel I've ever read. But I eventually came around. While Klara lacks the nostalgic charm of Remains of the Day or the punch-in-the-gut reveal of Never Let Me Go, it nevertheless feels like an important statement about technology, science, faith, and technocracy. If a book about an artificially intelligent android sounds tiresome when AI hype is slowly crushing all hope for humanity, fear not: this book is even better if you replace "Android Friend"/"AF" with "dog".]]></summary></entry><entry><title type="html">Revive Single-Key Keyboard Brightness Shortcuts on macOS</title><link href="https://www.lambdalatitudinarians.org/techblog/2026/03/11/revive-keyboard-brightness-shortcuts-macos/" rel="alternate" type="text/html" title="Revive Single-Key Keyboard Brightness Shortcuts on macOS" /><published>2026-03-11T20:13:13+00:00</published><updated>2026-03-11T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2026/03/11/revive-keyboard-brightness-shortcuts-macos</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2026/03/11/revive-keyboard-brightness-shortcuts-macos/"><![CDATA[<p>Do you use a Macbook or an Apple Keyboard with backlighting? Was your keyboard made after 2016?</p>

<p>Take a look at your keyboard. What the hell are the magnifying glass and microphone keys?</p>

<p>I miss my old dedicated keyboard brightness keys. Here's how to bring 'em back.</p>

<!-- readmore -->

<p>If you've been using Macs for over a decade, you might remember when those keys looked like this:</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_03_11/2015mbp.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_03_11/2015mbp.webp" alt="the 2015 macbook pro: note the dedicated keyboard brightness keys" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the 2015 macbook pro: note the dedicated keyboard brightness keys</figcaption>
</figure>

<p>Today, we're faced with this:</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_03_11/2025mbp.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_03_11/2025mbp.webp" alt="the 2025 macbook pro: note the dedicated keyboard brightness keys" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the 2025 macbook pro: note the dedicated keyboard brightness keys</figcaption>
</figure>

<p>Apple has always struggled to fill the F keys row with useful functions. I know Dashboard has fans, and presumably some people still use the Exposé key, but motion gestures have always suited me better for those tasks. Thankfully the Dashboard/Launcher key is dead these days. But now we have... a key dedicated to Spotlight and a key dedicated to Dictation?</p>

<p><strong>CMD</strong> + <strong>space</strong> is incredibly easy to hit and remember for launching Spotlight. I simply don't need a dedicated key for Spotlight when I have this shortcut.</p>

<p>I don't use Dictation. I don't enjoy talking to machines. (Dictation fans: feel free to disagree, I'm sure it's a great feature for some of you!)</p>

<p>I'll allow that the moon icon is theoretically useful, even if I don't use Focus modes on my Mac. But what if we could bring back the old 2015-era keyboard brightness controls instead of these useless Dictation and Spotlight keys?</p>

<p>Fortunately that's quite easy to do, and you don't need any third-party software to do it.</p>

<ol>
  <li>
    <p>Create a LaunchAgent that uses Apple's built-in Human Interface Devices to remap the keys using the commands below:</p>

    <ol>
      <li>Create a <code class="language-plaintext highlighter-rouge">LaunchAgents</code> directory for your user profile, if you don't already have one:
        <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/Library/LaunchAgents
</code></pre></div>        </div>
      </li>
      <li>Write a Property List (<code class="language-plaintext highlighter-rouge">plist</code>) that maps source ("Src") keys to destination ("Dst") keys by setting a property with Apple's <code class="language-plaintext highlighter-rouge">hidutil</code>:
        <ul>
          <li>F5/Spotlight (<code class="language-plaintext highlighter-rouge">0xC000000CF</code>) to <code class="language-plaintext highlighter-rouge">illumination_down</code> (<code class="language-plaintext highlighter-rouge">0x0C00000221</code>)</li>
          <li>F6/Dictation (<code class="language-plaintext highlighter-rouge">0x10000009B</code>) to <code class="language-plaintext highlighter-rouge">illumination_up</code> (<code class="language-plaintext highlighter-rouge">0x0C0000022B</code>)</li>
        </ul>

        <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> <span class="o">&lt;&lt;</span><span class="no">EOF</span><span class="sh"> &gt; ~/Library/LaunchAgents/com.local.KeyRemapping.plist
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"&gt;
&lt;plist version="1.0"&gt;
&lt;dict&gt;
    &lt;key&gt;Label&lt;/key&gt;
    &lt;string&gt;com.local.KeyRemapping&lt;/string&gt;
    &lt;key&gt;ProgramArguments&lt;/key&gt;
    &lt;array&gt;
        &lt;string&gt;/usr/bin/hidutil&lt;/string&gt;
        &lt;string&gt;property&lt;/string&gt;
        &lt;string&gt;--set&lt;/string&gt;
        &lt;string&gt;{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0xC000000CF,"HIDKeyboardModifierMappingDst":0x0C00000221},{"HIDKeyboardModifierMappingSrc":0x10000009B,"HIDKeyboardModifierMappingDst":0x0C0000022B}]}&lt;/string&gt;
    &lt;/array&gt;
    &lt;key&gt;RunAtLoad&lt;/key&gt;
    &lt;true/&gt;
&lt;/dict&gt;
&lt;/plist&gt;
</span><span class="no">EOF
</span></code></pre></div>        </div>
        <p><code class="language-plaintext highlighter-rouge">RunAtLoad</code> ensures that this command runs every time you load a user session -- typically, when you first login after shutting down your computer.</p>
      </li>
    </ol>
  </li>
  <li>
    <p>Unload the old keymappings, if you have any:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>launchctl unload ~/Library/LaunchAgents/com.local.KeyRemapping.plist 2&gt;/dev/null
</code></pre></div>    </div>
  </li>
  <li>
    <p>Load your new keymapping:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>launchctl load ~/Library/LaunchAgents/com.local.KeyRemapping.plist
</code></pre></div>    </div>
  </li>
</ol>

<p>Hit your magnifying glass and microphone keys, and you should see the keyboard brightness change indicator pop up on your screen. And, of course, your keyboard backlight will change brightness. You won't need to ever change these settings again, unless Apple decides to remap the keys in the future or you reinstall macOS from scratch.</p>

<p>It's not <em>quite</em> the same as having properly-labeled dedicated keys. They're not even the exact same keys -- this uses F4 and F5 instead of F5 and F6, so we can keep the vaguely-useful Focus key around while putting the keyboard brightness keys side-by-side. But as someone who misses the ability to change your keyboard brightness with a single click, I'll take it.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Do you use a Macbook or an Apple Keyboard with backlighting? Was your keyboard made after 2016? Take a look at your keyboard. What the hell are the magnifying glass and microphone keys? I miss my old dedicated keyboard brightness keys. Here's how to bring 'em back.]]></summary></entry><entry><title type="html">Ban Large Language Models</title><link href="https://www.lambdalatitudinarians.org/techblog/2026/02/24/ban-llms/" rel="alternate" type="text/html" title="Ban Large Language Models" /><published>2026-02-24T20:13:13+00:00</published><updated>2026-02-24T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2026/02/24/ban-llms</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2026/02/24/ban-llms/"><![CDATA[<p>Not another AI blog post! Unfortunately, I've seen a lot of (sometimes grudging) AI acceptance from holdouts in the tech space lately. You can only fight back against top-down directives and endless UI 'suggestions' for so long. I gave LLMs a serious shake earlier this year, so I wanted to add a slightly different take to the conversation.</p>

<!-- readmore -->

<h2 id="my-llm-experience">My LLM experience</h2>

<p>I've been chewing on LLM usage in the tech industry for a couple of years now. Like many, I started out skeptical, thinking that LLMs were just another cryptocurrency/metaverse/NFT level scam. Earlier this year, I gave LLMs a try for documentation work. After a few months, I emerged unimpressed.</p>

<p>My assessment? LLMs aren't as much of a scam as blockchain, but they're overhyped somewhere adjacent to "cloud" in the mid-2010s: proposed as the solution to a million problems, but mostly a sidegrade with a few niche advantages. Sure, you can run now easily run a startup without any physical server infrastructure. Is that a good thing for humanity? Have we done anyone a favor by automating away tens of thousands of server admin jobs, and consolidating the remaining jobs into Big Tech companies like Amazon, Google, and Microsoft? Scalability has certainly improved, making it easy for companies to grow from 10,000 users to 10,000,000 users by simply paying a bigger cloud bill (and paying software engineers a lot of money to design Rube Goldberg-inspired Kubernetes-centric architectures, and paying SREs a lot of money to respond to the inevitable incidents when scaling doesn't go according to plan). But it doesn't feel like "cloud" delivered on the world-changing hype.</p>

<p>My justification for my assessment of LLMs? With the right guardrails, LLMs can write OK code, especially for problems that have already been solved. But most of those guardrails are just software developers doing a lot of code review. It doesn't feel sustainable long-term, because code review is a different skillset from writing code: if I spend all of my time reviewing code and none of my time writing code (because I'm asking an LLM to do it for me), my code writing skills get worse. How do I know this? Because I work in documentation, and I've noticed that when I work jobs that involve a lot of <em>writing code</em>, I'm better at reviewing and understanding code. And when I work jobs that involve less code writing, I get worse at reviewing and understanding code. Code review is some sort of derivative of coding skill: the better you are at writing code, the better you'll be at reviewing it (assuming you've mastered the soft skills of not being a jerk during the review process). As programmers shift to writing less code and reviewing more code, I believe they'll get <em>worse at reviewing code</em>. And when LLMs throw armies of plausible-looking code and legions of believable tests at reviewers, you need to be really good at code reviews.</p>

<p>In documentation work, LLMs have been even less whelming. In short: they don't write good. LLMs are token generators by nature, so no matter how many layers of quality control and style guides you throw at them, they're prone to padding their output. Every LLM user ought to be familiar with the way they pad chats with sycophantic drivel, even when you instruct them to cut the bullshit, or keep responses short, or talk like Computer or Data from Star Trek. Documentation is teaching in text form. It's all about abstraction, and building blocks, and empathy for the user, and about advocating for users during design. Padding has no role in the teaching process, let alone the tertiary roles of documentation like testing and design, so LLMs struggle to write great docs. They might produce something that looks a whole lot like mediocre documentation. But as someone who's reviewed a lot of slop documentation pull requests, I know the instructions are probably wrong, the code samples probably don't work right, and the abstraction is... funky.</p>

<p>So what are LLMs useful for?</p>
<ul>
  <li>They're OK at helping me get past the 'first page problem' when I write documentation infrastructure.
    <ul>
      <li>I'm fine at writing JavaScript and CSS and HTML, but throw in the rats' nest of modern frontend frameworks and it's easy to feel paralyzed. Prompt an LLM to create an example of how you might implement something and suddenly you're tweaking instead of writing from scratch.</li>
      <li>Documentation is full of little one-off scripts that do things like transforming data from one format to another. All of these problems have been solved before. LLMs ain't bad at generating a 90% solution so I can hack the remaining 10%.</li>
    </ul>
  </li>
  <li>When the creative juices are low: brainstorming and rubber ducking (but you're mostly just talking to yourself, so maybe just go for a walk, grab a snack, chat with a coworker, and/or talk to a rubber duck instead?)</li>
  <li>LLMs read really fast. When you have huge quantities of data (as in <em>impossible for a human being to actually read all of</em>), like a million-line-long log file, an LLM might be able to help you find patterns. I have found LLM summaries of human text woefully inadequate for the same reasons LLMs suck at writing documentation: they don't read good. But they do read fast!</li>
</ul>

<p>So LLMs are basically just an interactive UX for Stack Overflow and Reddit, and sometimes a way to avoid talking to your coworkers.</p>

<h2 id="the-ethical-elephant-in-the-room">The ethical elephant in the room</h2>

<p>There's no waving away the ethics of LLM usage, unfortunately. This point has been belabored, but to sum things up:</p>

<ul>
  <li>LLMs require massive amounts of compute, which requires massive amounts of silicon, electricity, and to a lesser degree water; venture capital-fueled companies have insane amounts of money that is devastating pricing in all of those markets. More expensive electricity is bad for everyone. More expensive computers mean a world that is more expensive when everyone has to own a smartphone and a car, both of which are computers.</li>
  <li>LLM training uses all of the text on the internet and a lot of text from books. Your conversations. Your emails. Your photos (Google and Facebook don't store those out of the goodness of their hearts, you know!). Your comments. The text you are currently reading on this blog. Companies are consuming all of it, munging it into a giant neural network, and selling it. I write my blog and communicate on the internet because I want to interact with people. If a company wants to use my communication to make a profit, they should compensate me. And I should be able to opt out of being consumed at all.</li>
  <li>All LLMs, even self-hosted ones, are created by the global 0.01%. Inequality is as bad as it has ever been since the French Revolution. LLM creators claim that LLMs will replace swaths of office work. So the sales pitch of LLMs is "fire middle class workers to enrich the upper class."</li>
</ul>

<h2 id="ban-llms">Ban LLMs</h2>

<p>So what's going to happen with LLMs over the next few years?</p>

<ul>
  <li>At best, they'll reduce the workforce by a fraction and increase the review workload for everyone else.</li>
  <li>At worst, top-down managers will fire lots of people and replace them with LLMs, only to later realize that LLMs aren't producing quite the same output (how much this matters is left as an exercise to the reader).</li>
  <li>If you're a True Believer, you probably believe that LLMs will only get better, and most of my skepticism is a result of a skills issue, and that I haven't used the latest models the right way to get the best results. So you believe that LLMs will replace all white collar workers over the next couple of years, and probably blue collar workers too since surely robotics automation is within the grasp of LLMs.</li>
</ul>

<p>Let's assume that all of these are valid possibilities. What's the right move?</p>

<ul>
  <li>Maximize LLMs as much as possible to win the LLMs race?</li>
  <li>Restrict LLMs to preserve jobs?</li>
  <li>Stop using LLMs entirely?</li>
</ul>

<p>The USA is currently trying the 'maximize LLMs' option. We've seen the first wave of societal fallout: skyrocketing electricity bills, crazy prices for computer components, layoffs, use-LLMs-or-leave directives, LLM video and photo-assisted misinformation on social media, LLM-enhanced phishing, and what I can subjectively say is the most hostile and buggy year of consumer software I've ever experienced.</p>

<p>The EU is attempting the 'restrict LLMs' option. They have a track record of balancing innovation and exploitation with rules like GDPR; unfortunately, the wheels of government are slow, far slower than the tech industry, so enforcement and even basic rules often happen well after a lot of people get hurt. To make great regulation, you have to:</p>
<ol>
  <li>study a problem</li>
  <li>explore different ways to fix the problem</li>
  <li>agree on a set of rules that fix the problem</li>
  <li>enforce those rules (returning to step 2 whenever something goes awry)
When an industry has as much money and power as tech right now, it's like trying to fight a disease with exponential growth and adaptation. Which explains why our LLM regulation is currently about as successful as most of our covid-19 precautions.</li>
</ol>

<p>Has anyone tried the final option and stopped using LLMs entirely? I don't just mean not pumping money into LLMs, I mean actually banning LLMs completely and imposing fines for anyone who uses one. I can think of the following repercussions:</p>

<ul>
  <li>Anywhere that data centers can't build would have cheaper electricity costs, since data centers are by far the largest driver of rising electricity prices; remove them, and electricity rates would return to the pre-2020 normal.</li>
  <li>You wouldn't lose any jobs to LLM automation because it would be illegal to do so.</li>
  <li>Workers wouldn't be able to use LLMs, so they would lose any productivity benefits that LLMs provide.</li>
  <li>All companies that sell LLMs (or repackaged LLMs as a service) would have to stop providing LLM access under penalty of law, refocusing on other parts of the business (if they have any). Companies whose entire business model is based on LLMs would either shut down, pivot, or move somewhere where they can legally do business.</li>
  <li>As other parts of the world continue to use LLMs, any enclaves that choose to ban LLMs would miss out on <em>directly</em> reaping any benefits or hazards of LLM usage: if LLMs start driving best-in-class CPU design, or drug design, or improving public transit, it couldn't happen in your enclave because it would be illegal!</li>
  <li>As other parts of the world continue to use LLMs, any enclaves that choose to ban LLMs would remain vulnerable to <em>indirect</em> benefits and hazards of LLM usage: if other countries run giant botnets to spread propaganda across the internet, users in your enclave would still have to deal with the impact since we all use one internet; if LLMs cause countries to build more coal-fired power plants to fuel data centers, we all have to breathe the same air; if LLM-run defense forces get into a nuclear war, we all get stuck in nuclear winter</li>
</ul>

<p>This is by no means a comprehensive list of results. But one thing seems clear: the long-term effects of LLMs (if any) are going to happen worldwide regardless of who develops them. But you might be able to protect against the short-term effects by banning LLMs. If that preserves jobs right now, isn't that worthwhile? I don't see many benefits for 99.9% of people in the short term. But I see a LOT of hazards.</p>

<p>If LLMs are a good thing, you can always un-ban them in the future once you have a way to protect the 99.9%.</p>

<p>If LLMs are a bad thing, you spared the 99.9% from unnecessary layoffs.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Not another AI blog post! Unfortunately, I've seen a lot of (sometimes grudging) AI acceptance from holdouts in the tech space lately. You can only fight back against top-down directives and endless UI 'suggestions' for so long. I gave LLMs a serious shake earlier this year, so I wanted to add a slightly different take to the conversation.]]></summary></entry><entry><title type="html">Book Review: The Neverending Story</title><link href="https://www.lambdalatitudinarians.org/techblog/2026/01/12/the-neverending-story/" rel="alternate" type="text/html" title="Book Review: The Neverending Story" /><published>2026-01-12T20:13:13+00:00</published><updated>2026-01-12T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2026/01/12/the-neverending-story</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2026/01/12/the-neverending-story/"><![CDATA[<p>Occasionally I revisit fantasy novels that I read, or that I wish I'd read, in my childhood: <strong>A Wrinkle in Time</strong>, <strong>A Wizard of Earthsea</strong>, <strong>The Dragonriders of Pern</strong>, <strong>The Phantom Tollbooth</strong>. Already this year, <strong>A Wrinkle in Time</strong> both impressed and disappointed me: it was somehow simultaneously both much weirder and much more simplistic than I had hoped.</p>

<p>Michael Ende's <strong>The Neverending Story</strong> is far from simplistic. For one, the book has <em>twice</em> the plot you remember from the movie, because the movie stops just before the halfway point of the book. Bastian gets the book, reads the book, and gets sucked into the book to save Fantastica. The movie somehow manages to both be a terrible adaptation of the <em>entire</em> book and a fantastic adaptation of the first half of the book. Pretty clever, honestly, because the second half of the book is far more serious, far less fun for children, but also far more interesting for adults. Let's dig in.</p>

<!-- readmore -->

<h2 id="characters">Characters</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_01_12/atreyu_and_falkor.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_01_12/atreyu_and_falkor.jpg" alt="falkor gave a wink" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">falkor gave a wink</figcaption>
</figure>

<ul>
  <li>
    <p>Bastian Balthasar Bux: A rotund middle school-age child with a bad attitude, poor work ethic, mediocre grades, and a disinterest in life and family since his mother passed away. His bildungsroman arc spans the entire book. Ende's fat-shaming of Bastian is a bit much at times, but ultimately kind of sort of serves a purpose.</p>
  </li>
  <li>
    <p>Carl Conrad Coreander: A cantankerous bookseller who, despite initial skepticism of Bastian <em>and</em> Bastian's (perceived) theft of The Neverending Story, begins to appreciate and befriend Bastian by the end of the story.</p>
  </li>
  <li>
    <p>Atreyu: The focus of the hero's journey in the first half of the book, the section adapted by the much-loved 80s movie. A Greenskin (note: not faithfully adapted in the movie) hunter of purple buffalos from the Grassy Ocean (not to be confused with Hyperion's Sea of Grass or the Dothraki Great Grass Sea from A Song of Ice and Fire) who is called to save all of Fantastica. Notably, Atreyu doesn't really grow or change at all during the first half of the book -- he mostly just goes where people tell him to go. But during the second half of the book, Atreyu acts first as a partner, then as a foil to Bastian's bad behavior.</p>
  </li>
  <li>
    <p>Falkor: A white luckdragon and Atreyu's (eventual) best friend, with a voice like a bronze bell, a persistently positive attitude, and a penchant for winking.</p>
  </li>
  <li>
    <p>The Childlike Empress, the Golden Eyed Commander of Wishes. Heart and soul of Fantastica, who eventually lures Bastian into the book itself to give her a name: Moon Child.</p>
  </li>
</ul>

<p>I can't even begin to name the widespread cast of side characters, many with surprisingly elaborate backstories. In the words of Ende: <em>that is another story and shall be told another time</em>.</p>

<h2 id="plot">Plot</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_01_12/first_edition.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_01_12/first_edition.jpg" alt="first edition cover art, surprisingly classic" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">first edition cover art, surprisingly classic</figcaption>
</figure>

<p>If, like me, you've only seen the movie, you only know the first (and worst) half of The Neverending Story. It follows a classic hero's journey fairytale arc, along the lines of Labyrinth or <strong>The Lion, the Witch, and the Wardrobe</strong>:</p>

<ul>
  <li>a disaster strikes a fantasy world (Fantastica, a name superior to the movie's choice of Fantasia)!</li>
  <li>nobody can fix it</li>
  <li>only our awfully young hero can fix it</li>
  <li>our hero faces a series of trials wherein our awfully young hero proves their mettle and earns the friendship and respect of fantastic creatures</li>
  <li>our hero fixes the wrong in the fantasy world</li>
</ul>

<p>In The Neverending Story, we have the added wrinkle of Bastian's perspective on <em>top</em> of this hero's tale, in which Bastian steals a book, skips school, then hides in the school attic while doing a lot of thinking about how cruel his teachers and classmates are and how lame his dad has been ever since his mom died. This framing device falls somewhere between Over the Garden wall (especially the <a href="https://over-the-garden-wall.fandom.com/wiki/Babes_in_the_Wood">Babes in the Wood</a> episode) and Cloud Atlas: the stories intersect, but it's hard to tell what's 'real' (and what 'real' even means in the context of our story). There's a fair argument to be made here that the first half of the story, with the Nothing threatening Fantastica, isn't even 'real', only serving to bait readers into Fantastica.</p>

<p>As I already mentioned, everything changes at the halfway point of the book, when Atreyu and the Childlike Empress lure Bastian into Fantastica. Bastian initially resists, but ultimately winds up in Fantastica. And that's where everything changes. Because, instead of saving the day and riding Falkor into the real world to terrorize his enemies, as Bastian does in the movie, the book takes a darker path.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_01_12/uh_oh_for_artrax.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_01_12/uh_oh_for_artrax.jpg" alt="speaking of darker paths..." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">speaking of darker paths...</figcaption>
</figure>

<p>Sure, Bastian gets his wishes, and his entering the story <em>seems</em> to stop the spread of the Nothing from destroying Fantastica. But as Bastian transforms Fantastica with his wishes, he also changes himself and forgets his own story. Imagination isn't <em>all</em> good: just as the creatures of Fantastica become lies if they enter the human world, humans tend towards selfishness and exploitation in Fantastica.</p>

<p>Of course, this isn't all Bastian's doing -- he makes some very basic wishes, and AURYN elaborates on the wishes with some awfully genie-like wish-corrupting. But Bastian's bad attitude throws gasoline on the fire of corrupted wishes, eventually resulting in mass destruction, war, and death in Fantastica.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_01_12/folio.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_01_12/folio.jpg" alt="more recent cover art, inspired by the book description in the book" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">more recent cover art, inspired by the book description in the book</figcaption>
</figure>

<h2 id="lessons">Lessons</h2>

<p>Ultimately, Bastian's character arc requires him to take responsibility for the bad things that he's done, both in real life and Fantastica. But it takes a lot of allegorical tales to get there.</p>

<h3 id="just-because-you-can">Just because you can...</h3>

<p>Moon Child's magic wish-granting and protecting amulet, AURYN, bears the inscription "DO AS YOU WISH". Bastian interprets this as a polite statement, akin to 'after you' from a doorman. But AURYN actually far more sinister:</p>

<blockquote>
  <p>"Grograman told me to find out what I really wanted. And the inscription on AURYN says the same thing. But for that I have to go from one wish to the next without ever skipping any. That's why I need the Gem."
"Yes," said Atreyu. "<em>It gives you the means, but it takes away your purpose.</em>"
"Oh well," said Bastian, undismayed. "Moon Child must have known what she was doing when she gave me the amulet. You worry too much, Atreyu. I'm sure AURYN isn't a trap."</p>
</blockquote>

<p>Turns out, AURYN is <em>totally</em> a trap. And a valuable lesson: as Jurassic Park (and the tech hegemony of 2026) teaches us, just because you <em>can</em> do something doesn't mean you <em>should</em>.</p>

<p>To reinforce that point, Ende repeatedly shows us how even good wishes can go bad:</p>

<blockquote>
  <p>And now Bastian was asking himself: Had it really been such a good idea to invent a dragon for Hero Hynreck? True, Hynreck had needed a chance to show his mettle. But was it certain that he would win? What if Smerg killed him? And what about Princess Oglamar?
Yes, of course, she had been haughty, but was that a reason for getting her into such a fix?
And on top of all that, how was he to know what further damage Smerg might do in Fantastica? Without stopping to think, Bastian had created an unpredictable menace. It would be there long after he was gone and quite possibly kill or maim any number of innocents. As he knew, Moon Child drew no distinction between good and evil, beautiful and ugly. To her mind, all the creatures in Fantastica were equally important and worthy of consideration.
But had he, Bastian, the right to take the same attitude? And above all, did he wish to?</p>
</blockquote>

<p>If only our tech overlords read this book and understood this lesson. BRB, gotta check my Ring doorbell to make sure my Amazon delivery person didn't piss on my yard...</p>

<h3 id="why-matters">Why matters</h3>

<p>On a slightly different note, Ende also repeatedly shows us how good done for the wrong reasons can generate less-than-good outcomes. For example, Bastian ditches Yikka, his mule, by inventing her a unicorn mate who can somehow make her a mother (remember, mules are normally nonviable and cannot produce offspring):</p>

<blockquote>
  <p>A person's reason for doing someone a good turn matters as much as the good turn itself.</p>
</blockquote>

<p>Personally I think Ende could have gone further with this plot, but you have to stop somewhere. After all, that is another story and shall be told another time.</p>

<p>I appreciate Ende's point about doing things you love because they are right, not because they are easy, and how sometimes all you need to overcome impossible odds is love:</p>

<blockquote>
  <p>A detailed account of the battle for the Ivory Tower would take us too far. To this day Fantasticans sing countless songs and tell innumerable stories about that day and night, for everyone who took part saw it in his own way. Certain of the stories have it that Atreyu's army included several white magicians, who had the power to oppose Xayide's black magic.
Of this we have no certain knowledge, but that would explain how, in spite of the armored giants, Atreyu and his followers were able to take the Ivory Tower. But there is another, more likely explanation: Atreyu was fighting not for himself, but for his friend, whom he was trying to save by defeating him.</p>
</blockquote>

<h3 id="history-class-is-important">History class is important</h3>

<p>Hardly a novel idea, but a core part of the book (emphasis mine):</p>

<blockquote>
  <p>You can only wish as long as you remember your world. These people here used up all their memories. <em>Without a past you can't have a future</em>.</p>
</blockquote>

<h3 id="on-growing-up">On growing up</h3>

<p>The tail end of the book, where Bastian does most of his growth, spends a lot of time thinking about what makes a positive community, as Bastian wanders Fantastica, soulsearching, figuring out where and who he wants to be. Initially, he longs only for companionship:</p>

<blockquote>
  <p>For days and nights he had been wandering all alone. And because of being alone, he yearned to belong to some sort of community, to be taken into a group, not as a master or victor or as any special sort of person, but merely as one among many, perhaps as the smallest or least important, provided his membership in the community was unquestioned.</p>
</blockquote>

<p>But eventually he learns that companionship alone isn't enough: he needs a community that knows, accepts, and loves him for who he really is:</p>

<blockquote>
  <p>Bastian, however, wanted to be an individual, a someone, not just one among others. He wanted to be loved for being just what he was. In this community of Yskalnari there was harmony, but no love.</p>
</blockquote>

<p>This transformation becomes literal in the House of Change, where the matron (Dame Eyola) and Bastian both mature and transform as they figure out what they really want in life. I love the idea that we aren't just a continuous person, but instead that after sufficient time and growth we become entirely different people, just with the same name. To become a different person, the old you has to die (sort of like the old Star Trek teleporter gotcha):</p>

<blockquote>
  <p>When my mother grew old, she withered. All her leaves fell, as the leaves fall from a tree in the winter. She withdrew into herself. And so she remained for a long time. But then one day she put forth young leaves, buds, blossoms, and finally fruit. And that's how I came into being, for I was the new Dame Eyola. And it was just the same with my grandmother when she brought my mother into the world. We Dames Eyola can only have a child if we wither first.</p>
</blockquote>

<p>The last chapters of the book, where Bastian has finally matured enough to want to return to the human realm and also accepted the difficulty of that task, are truly touching:</p>

<blockquote>
  <p>"Listen to me, Bastian Balthazar Bux," he said. "I'm no great talker. I prefer silence. But I will answer this one question. You are looking for the Water of Life. You want to be able to love, that's your only hope of getting back to your world. To love - that's easily said. But the Water of Life will ask you: Love whom? Because you can't just love in general. You've forgotten everything but your name. And if you can't answer, it won't let you drink. So you'll just have to find a forgotten dream, a picture that will guide you to the fountain. And to find that picture you will have to forget the one thing you have left: yourself. And that takes hard, patient work. Remember what I've said, for I shall never say it again."</p>
</blockquote>

<p>A valuable lesson for us in reality, too: we not only have to find what we want out of life, we also have to make it happen.</p>

<h3 id="humor">Humor</h3>

<p>I didn't expect this book to be as hilarious as it sometimes is. My favorite joke is played perfectly straight: to give a hero a villain to overcome, Bastian invents the evil dragon "Smerg" who lives in Morgul, the land of cold fire. Methinks Ende was at least a little bit of a Tolkein fan!</p>

<p>It took me a little while to appreciate it, but by the end of the book I laughed out loud pretty much every time Ende provides a summary for a character's entire future... and then dismisses any additional discussion with "that is another story and shall be told another time".</p>

<p>I also chuckled every time Yikka, Bastian's mule mount, provided sage advice with the disclaimer "because I'm only half an ass."</p>

<p>And even though Ende couldn't have possibly forseen why this would be funny to me, it's nice to see that <a href="https://old.reddit.com/r/gameofthrones/comments/3f331c/spoilers_all_whats_the_joke_behind_20_good_men/">sir twentygoodmen</a> has been around for a long time:</p>

<blockquote>
  <p>Then the three knights, Hysbald, Hykrion, and Hydorn, appeared on the run. They seemed to be in a remarkably good humor.
"At last there's something for us to do, sire," all three cried at once. "Leave it to us. Just get on with your celebration. We'll round up a few good men and get after those rebels. We'll teach them a lesson they won't forget so soon."</p>
</blockquote>

<p>I also enjoy when Ende gets philosophical with the 'jumble game', where former Emperors-turned-madmen arrange bananagrams tiles on the ground:</p>

<blockquote>
  <p>And if you play it forever, every possible poem and every possible story will have to come out, in fact every story about a story, and even this story about the two of us chatting here. It's only logical, don't you think?"</p>
</blockquote>

<h2 id="summary">Summary</h2>

<p>Overall, I absolutely loved this book. The first half sailed by, as a simplistic fairytale often does. But the second half is what really captured me. The bridge between the halves, where Bastian wanders around in the Night Forest and the Desert of Colors, drags a bit. But I think it's a necessary drag, because both the reader and Bastian have to fight through some naive wish-fulfillment before we can get to the moral meat of the story.</p>

<p>I especially enjoyed the two-perspective storytelling in the first half. I didn't expect to "miss out" on much by reading this on a black-and-white ereader, but it turns out I missed out on a lot! The original printing uses distinct colors for the Neverending Story (black, sometimes green) and Bastian (red) perspectives, in addition to some <em>gorgeous</em> art for the first letter of each chapter. Italics worked fine, but I think the colored text would have been even better. I also have to appreciate that Michael Ende begins each chapter with a different letter of the alphabet, starting with A and ending with Z; he put in a lot of work to start chapters with X and Z!</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2026_01_12/c_art_and_diff_text_colors.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2026_01_12/c_art_and_diff_text_colors.jpg" alt="notable features of a good printing of the neverending story: large art for each letter, different colors per perspective" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">notable features of a good printing of the neverending story: large art for each letter, different colors per perspective</figcaption>
</figure>

<p>Ultimately, The Neverending Story contains two lessons, the second of which builds on the first:</p>

<ul>
  <li>In the first half of the book, the cyclical Neverending Story threatens Fantastica with Nothing, and a child restores it using the power of imagination. This section reminds us that with imagination, we can overcome any obstacle, solve any problem, and escape from the ills of reality.</li>
  <li>The second half of the book reminds us that imagination is only useful when constrained by sufficient wisdom: unwise imagination only amounts to lies. In other words, <em>wisdom is the application of love to imagination</em>, because love enables us to distinguish between right and wrong. Furthermore, if you get too swept up in your imagination (or lies), you might get lost in it, like Bastian (and apparently many other humans over the years) almost gets lost in Fantastica. And most importantly: growing up isn't just about finding what you love, it's about putting in the hard work of loving something.</li>
</ul>

<p>The Neverending Story hooked me from start to finish, even if I nearly stopped at the end of the first half. I'm very glad I pushed through. A beautiful book, highly recommended.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Occasionally I revisit fantasy novels that I read, or that I wish I'd read, in my childhood: A Wrinkle in Time, A Wizard of Earthsea, The Dragonriders of Pern, The Phantom Tollbooth. Already this year, A Wrinkle in Time both impressed and disappointed me: it was somehow simultaneously both much weirder and much more simplistic than I had hoped. Michael Ende's The Neverending Story is far from simplistic. For one, the book has twice the plot you remember from the movie, because the movie stops just before the halfway point of the book. Bastian gets the book, reads the book, and gets sucked into the book to save Fantastica. The movie somehow manages to both be a terrible adaptation of the entire book and a fantastic adaptation of the first half of the book. Pretty clever, honestly, because the second half of the book is far more serious, far less fun for children, but also far more interesting for adults. Let's dig in.]]></summary></entry><entry><title type="html">Improve macOS Finder SMB Share Performance</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/11/21/fruit-aapl-yes/" rel="alternate" type="text/html" title="Improve macOS Finder SMB Share Performance" /><published>2025-11-21T20:13:13+00:00</published><updated>2025-11-21T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/11/21/fruit-aapl-yes</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/11/21/fruit-aapl-yes/"><![CDATA[<p>I've been using a Raspberry Pi 5 as a home server for years now. Simultaneously, I've been using Apple's Macbook Pro series as personal and work laptops for essentially my entire life. Normally, this grants me access to a proper Unix command line, no AI garbage or ads in most system menus, and the best ratio of energy usage to computing power in the home computer industry. But ever since I started building my collection of home media -- music, movies, and TV shows -- I have discovered that Finder is horribly, terribly, no-good at browsing samba (SMB) shares. Performance is incredibly inconsistent and laggy. Just browsing between a few folders can take tens of seconds.</p>

<p>The workaround I explain in this post can help improve Finder's performance when browsing SMB shares.</p>

<!-- readmore -->

<p>In the <code class="language-plaintext highlighter-rouge">global</code> section of your samba settings (likely found at <code class="language-plaintext highlighter-rouge">/etc/samba/smb.conf</code>), add the following line:</p>

<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">fruit</span>:<span class="n">aapl</span> = <span class="n">yes</span>
</code></pre></div></div>

<p>This enables Apple's SMB2+ extension, codenamed AAPL. You can read the full description at in the <a href="https://www.samba.org/samba/docs/current/man-html/vfs_fruit.8.html">samba documentation</a>, but the important part of the description reads: "A global option whether to enable Apple's SMB2+ extension codenamed AAPL".</p>

<p>You can also enable the following other options, though I had some problems writing media to my own share via Finder with these enabled:</p>

<div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vfs</span> <span class="n">objects</span> = <span class="n">catia</span> <span class="n">fruit</span> <span class="n">streams_xattr</span>
<span class="n">fruit</span>:<span class="n">nfs_aces</span> = <span class="n">no</span>
<span class="n">fruit</span>:<span class="n">zero_file_id</span> = <span class="n">yes</span>
<span class="n">fruit</span>:<span class="n">metadata</span> = <span class="n">stream</span>
<span class="n">fruit</span>:<span class="n">encoding</span> = <span class="n">native</span>
</code></pre></div></div>

<p>So use these at your own risk.</p>

<p>Once you've made your changes, run the following command to try out your new configuration:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>service smbd restart
</code></pre></div></div>

<p>You should see snappier performance browsing around on your NAS, especially in folders that contain a lot of files and subfolders. I noticed a significant improvement when browsing my SMB shares over VPN over low bandwidth internet connections.</p>

<p>Note: while Apple is indeed <a href="https://appleinsider.com/articles/25/06/10/time-machines-time-capsule-support-ends-with-macos-27">removing SMBv1 and AFP (Apple File Protocol) from macOS 27 in 2026</a>, the AAPL SMB2+ extension is sticking around for a while yet. I held off publishing this article for a while because I conflated AFP and AAPL in my mind. Don't make the same mistake I did!</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I've been using a Raspberry Pi 5 as a home server for years now. Simultaneously, I've been using Apple's Macbook Pro series as personal and work laptops for essentially my entire life. Normally, this grants me access to a proper Unix command line, no AI garbage or ads in most system menus, and the best ratio of energy usage to computing power in the home computer industry. But ever since I started building my collection of home media -- music, movies, and TV shows -- I have discovered that Finder is horribly, terribly, no-good at browsing samba (SMB) shares. Performance is incredibly inconsistent and laggy. Just browsing between a few folders can take tens of seconds. The workaround I explain in this post can help improve Finder's performance when browsing SMB shares.]]></summary></entry><entry><title type="html">Book Review: The Diamond Age</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/10/22/the-diamond-age/" rel="alternate" type="text/html" title="Book Review: The Diamond Age" /><published>2025-10-22T20:13:13+00:00</published><updated>2025-10-22T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/10/22/the-diamond-age</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/10/22/the-diamond-age/"><![CDATA[<p><em>The Diamond Age: Or, a The Young Lady's Illustrated Primer</em> has gotten a lot of attention lately in the tech community. That's largely a result of one very important object: the Primer itself, which is basically an interactive Hitchhiker's Guide to the Galaxy-esque ereader, but with physical, turn-able pages that rewrite themselves. The Primer was specifically designed to teach a young woman leadership skills and a hacker ethos, but it also includes the ability to monitor and teach the reader basically anything it deems necessary for survival, including how to kill someone with a screwdriver.</p>

<p>So the Primer is basically a personal tutor for every single professional and personal domain. You can see why AI-everything techies love the idea. What if every child got a personal tutor that could pay attention to them at all times, never get distracted, never sleep, never take time off, with deep knowledge about every subject area a child could ever hope to study?</p>

<p>Of course, those AI enthusiasts have missed perhaps the most important takeaway from the entire book.</p>

<!-- readmore -->

<h2 id="introduction">Introduction</h2>

<figure style="float:left; max-width: 400px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_10_22/primer.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_10_22/primer.jpg" alt="my favorite cover art, since it includes airships and top hats" height="500px" loading="lazy" style="max-width:400px !important;" /></a>
  <figcaption style="max-width:400px !important;">my favorite cover art, since it includes airships and top hats</figcaption>
</figure>

<p>In <em>The Diamond Age</em>, Neal Stephenson attempts to explain how, by sexually transmitting sufficient quantities of nanobots through underwater orgies, we might be able to overcome IP law and usher in the end of classism, advertising, borders, and child endangerment.</p>

<p>But in the end, despite all of the technology, hacking, and geopolitics, love turns out to be the essential (missing) ingredient.</p>

<p>Also, I guess if enough people take off their clothes and link hands, they can float over a really big chunk of ocean.</p>

<p>TL;DR: Like most Neal books, it's complicated.</p>

<h2 id="characters">Characters</h2>

<ul>
  <li>Nell: our hero, a good-hearted kid from a rough neighborhood, the offspring of a the first character who Neal kills in the entire book</li>
  <li>Harv: older brother of our hero, honorable and kind enough to protect her, but not strong enough to save himself</li>
  <li>Miranda: former Victorian private tutor, then (re)actor, then actor; kind-of sort-of adopted mother/teacher for Nell, via voice acting contracts generated by the Primer; Neal forgets to give her arc any kind of ending whatsoever, besides condemning her to years of hivemind orgies and an eleventh hour rescue from the hivemind right before she is killed (but not ritualistically, it's part of an extremely long-term computation devised by Hackworth to invent a technology called The Seed, which is also... sort of dropped in the final chapters of the book)</li>
  <li>John Percival Hackworth: lovable, brilliant, but quite imperfect Victorian dad; disappears for over a decade because Doctor X tricks him into joining an undersea hivemind orgy (so he can invent The Seed, which barely matters in the plot of the book)</li>
  <li>Judge Fang: my favorite character, NYC born and raised, moved to the-landmass-formerly-referred-to-as-China to be a Judge, his scenes provide some of the only helpings of comedy in Part I, as he and his surprisingly well-characterized posse navigates the mysterious connection between the Primer, Dr X, and Hackworth</li>
  <li>Doctor X: spooky man who uses a posse of ghetto kids to collect and research nanotechnology and occasionally mug Victorians; also might be running the world's largest oceanfaring organ farming operation; also a master of calligraphy; also immensely well connected to Inner China (the 'Celestial Kingdom')</li>
  <li>Constable Moore: Nell's only real father figure, who Neal also coincidentally fails to provide any kind of arc for; a Scottish war veteran with serious PTSD, serious chops on the bagpipes, and a strong moral compass</li>
  <li>Carl Hollywood: Miranda's boss, but mostly a ridiculous teenage boy's fantasy fulfillment of 'good guy with a gun, in a duster jacket'; essentially a knockoff Clint Eastwood/Malcolm Reynolds mashup</li>
</ul>

<p>The cast is sprawling by early Neal standards; I haven't even covered any side characters here. Characterization is strong, especially in Part I. Look no further if you're yearning for good characters.</p>

<h2 id="setting">Setting</h2>

<p>In The Diamond Age, Neal Stephenson imagines a medium-near future (&gt;100 years, &lt;1000 years) for humanity at a startling level of detail. Zeppelins roam the earth. Nanotechnology enables nearly infinite levels of technical detail and design finesse. Remember how concrete completely transformed architecture and we wound up with brutalism? In The Diamond Age, nanotechnology takes that upheaval to the next level. Ubiquitous at-home and public 'matter compilers' have solved hunger (if you like gruel) and resource scarcity (if you are content sleeping in a free matter-compiled blanket on a beach instead of a house or apartment). But matter compilers are entirely dependent on a highly centralized energy source called The Feed. Individual phyles and geographic regions have their own Feeds, but as far as I can tell, running a Feed is sort of like running a nuclear reactor in 2025: expensive, messy, potentially dangerous, and generally only dabbled in by billionaires, corporations, nation states, or terrorists.</p>

<p>Of course, this technology has a dark side. Though perhaps not as strong a dark side as a cynical person might imagine in the year 2025. Most formulae in the matter compiler are gated behind paywalls. Advertising on electronic holographic billboards, combined with eye-tracking cameras, has made for a truly dystopian environment. Nanotechnology has resulted in a proliferation of 'mites' -- microscopic floating nano-devices -- in the air in every major urban environment. Sometimes those mites go to war with each other, and simply walking outside coats your clothes (and lungs) in black dust, the remains of billions of disintegrated mites.</p>

<p>Countries and borders may no longer exist (truly a utopian idea, from the perspective of 2025), but 'phyles' have replaced them in the minds of the people, if not in physical contiguous boundaries. The Victorian phyle gets a lot of attention throughout the book, being comprised of neo-Luddites who eschew distasteful tech and ascribe to a set of values almost (but not quite) like those of real-world 1800s Victorians.</p>

<p>While nanotechnology has made anything possible in the physical world, AI is remarkably simplistic. "Reactive" immersive virtual reality entertainment requires human actors for quality voice and emotional acting. Even the Primer itself, one of the most advanced pieces of technology in the entire book, requires a human 'ractor' back-end for narration.</p>

<p>To top it all off, a lot of people are not content with this world. Especially in the geographic space that used to be China. Especially in Part II, Neal explores the consequences.</p>

<p>Neal does a great job of fleshing out the good and bad parts of this world. Especially early on, chapters are full of deep, detailed descriptions of nanotechnology, society, and politics. But there are some odd Neal quirks to this universe. Notably: a strange amount of Part II involves people getting naked, even when it seems completely unnecessary (during an interactive comedy performance on an abandoned cargo ship near London?). And maybe I'm underestimating the human capacity for violence, but good lord are people absolutely ready to throw down and fight to the death at any time in this world.</p>

<h3 id="the-primer">The Primer</h3>

<p>As I hinted at before, the Primer has gotten a lot of attention since LLM chatbots became a thing. "We're so close to creating the Primer from The Diamond Age and revolutionizing education," chants the overenthusiastic crowd of Hacker News commentators as they ready their angel investment portfolios for the Next Big Thing.</p>

<p>In the Diamond Age, the Primer is just not that special. Sure, it comes up with enthralling fantasy stories for a kid. Sure, those fantasy stories have educational and moral subtext based on the context of the user. But in the end, only Nell and Fiona Hackworth get much out of their Primers, because they both received love and attention from consistent, individual ractors: for Nell, Miranda, and for Fiona, her father. Every other Primer-girl relationship falls flat because it's missing an essential ingredient: love. Both Nell and Fiona can tell that behind the Primer, a human being exists with investment in their life and development. Elizabeth loses interest in her Primer because she has two real parents and plenty of tutors to dote on her at all times; every girl in the Mouse Army learns to become a cog in a machine thanks to their cheap non-racted Primers. But none of them develop a relationship with their Primer because in the end it's just a soulless machine.</p>

<p>In reality, just the ability of the Primer to spin educational fairy tales based on the life of the user would be an amazing development. But for most users it wouldn't differ much from the traditional puzzle-solving video games that we've had for decades now. To get anything better than those video games, you need something else. Intention. Socratic dialog. And maybe love?</p>

<h2 id="plot">Plot</h2>

<p>Like many Neal books, <em>The Diamond Age</em> is massively frontloaded with worldbuilding. You have to slog through quite a few chapters before you get a firm grasp on the world he's trying to describe. Personally, I found The Diamond Age a bit easier than most Neal books to get into: it's just close enough to the current day dystopia that you don't have to stretch your imagination too far to imagine nanobots swirling in the air, surveillance tech and targeted ads on the street, and neo-Luddites. Just replace our current software dystopia for a hardware dystopia, and imagine a secular, slightly fancier version of the Amish, and you're most of the way there!</p>

<p>Unlike most Neal books, <em>The Diamond Age</em> swaps between the real world and a collection of fantasy stories devised by the Primer. These stories feature characters inspired by real world associates of Nell, and follow a classic hero's journey arc: Princess Nell must complete a series of challenges to collect a series of keys to open a lock and save her brother, Harv. As real world Nell survives and escapes the ghetto, attends a Victorian school, and eventually sets off on her own journey in life, the Primer creates and extends challenges to teach her life lessons and leadership. Early on, the Primer does simple things like teach Nell how to read. Later, the Primer teaches her much more specific lessons, like the concept of a universal Turing machine.</p>

<p>When I first read the book, I had recently completed a broad swath of introductory computer science classes. The Castle Turing bits and conversations about encryption and data science all enthralled me. At this point in my life, those concepts feel a bit old hat, so those same sections honestly bored me a bit. Your experience will likely vary on your level of understanding of those concepts; if you don't know what a Turing machine is, you'll be confused; if you sort of know what a Turing machine is, you'll wind up enthralled; if you know what a Turing machine is and you've been working in tech without using that knowledge for a decade, you might be a little miffed.</p>

<p>Aside from the Princell Nell Primer story, <em>The Diamond Age</em> follows a few different major characters around future China and the Pacific Northwest. Doctor X conspires. Hackworth bumbles. Nell impresses people around her by being more competent than an actual princess and Hackworth's daughter, the only other young women with fancy Primers that use voice (re)actors.</p>

<p>The end of the book is a complete mess. Somewhere in there, I can detect thought-provoking ideas about decentralization, groupthink, the proper way to raise a child, and the (doomed?) concept of the nation state. But it's all lost in a giant drawn-out messy war-porn rape bloodlust denouement. Neal halfheartedly capstones arcs every chapter or two. None of them wind up particularly satisfying.</p>

<h2 id="summary">Summary</h2>

<p><em>The Diamond Age</em> has the most rushed ending of any Neal book ever. He doesn't even attempt to tie up loose ends, and the last 5 chapters are nothing but gratuitous war-porn and deux ex machina. It truly feels like he wrote a good book for a while, he wanted to buy a new house, and he just... slapped an ending on it so could submit it to his publisher to cover his deposit or something.
Doctor X, CryptNet, the Drummers, Miranda's storyline, all just... stop.</p>

<p>Personally, I choose to imagine this as something like Firefly: cancelled before its time. The characters and the world are still enjoyable, but don't expect a satisfying story arc. A classic Neal Stephenson novel, but not my favorite.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[The Diamond Age: Or, a The Young Lady's Illustrated Primer has gotten a lot of attention lately in the tech community. That's largely a result of one very important object: the Primer itself, which is basically an interactive Hitchhiker's Guide to the Galaxy-esque ereader, but with physical, turn-able pages that rewrite themselves. The Primer was specifically designed to teach a young woman leadership skills and a hacker ethos, but it also includes the ability to monitor and teach the reader basically anything it deems necessary for survival, including how to kill someone with a screwdriver. So the Primer is basically a personal tutor for every single professional and personal domain. You can see why AI-everything techies love the idea. What if every child got a personal tutor that could pay attention to them at all times, never get distracted, never sleep, never take time off, with deep knowledge about every subject area a child could ever hope to study? Of course, those AI enthusiasts have missed perhaps the most important takeaway from the entire book.]]></summary></entry><entry><title type="html">Book Review: Cryptonomicon</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/09/04/cryptonomicon/" rel="alternate" type="text/html" title="Book Review: Cryptonomicon" /><published>2025-09-04T20:13:13+00:00</published><updated>2025-09-04T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/09/04/cryptonomicon</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/09/04/cryptonomicon/"><![CDATA[<p>I first read Cryptonomicon back in college. The book impressed me by introducing me to all kinds of weird ideas, from Linux nerdery, to the first seeds of cryptocurrency, to the optimal way to enjoy Captain Crunch, to the general gist of World War II cryptography.</p>

<p>Revisiting Cryptonomicon in 2025 wasn't quite as fun. All of the tech startup bits left me with a bad taste in my mouth: I <em>think</em> a lot of it is supposed to be satire, but the humor falls flat the same way that the TV show Silicon Valley falls flat these days. When tech companies are actively destroying so much of our world, it's hard to appreciate the satire.</p>

<p>It was still fun to see how Neal Stephenson intertwines historical WW2 fiction with 'modern day' (well, 2001) technology. But overall Cryptonomicon dragged a lot more than other recent Stephenson books, and I think it's mostly because the book simply hasn't aged that well.</p>

<!-- readmore -->

<h2 id="introduction">Introduction</h2>

<figure style="float:left; max-width: 400px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_09_04/cryptonomicon.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_09_04/cryptonomicon.jpg" alt="my favorite cover art, since it includes athena, bridges, and ALSO EXPLOSIONS FUCK YEAH" height="500px" loading="lazy" style="max-width:400px !important;" /></a>
  <figcaption style="max-width:400px !important;">my favorite cover art, since it includes athena, bridges, and ALSO EXPLOSIONS FUCK YEAH</figcaption>
</figure>

<p>Cryptonomicon is an awfully long book split across two plots: one in WW2, one around 2000. Many characters from the 2000s plot are descendants (or older versions) of characters from the WW2 plot. There are vague connections between the two plotlines, but honestly a lot less than you'd think.</p>

<h2 id="characters">Characters</h2>

<ul>
  <li>
    <p>Randall (Randy) Lawrence Waterhouse: a 'modern day' (when the book was written, at least) computer nerd, stuck in a crappy relationship, who has only one good friend. But that friend routinely sweeps Randy up in tech startups that are just a few steps away from Ponzi schemes.</p>
  </li>
  <li>
    <p>Lawrence Prichard Waterhouse: a 1940s computer nerd, a cryptographer working for the US military. Randy's grandfather.</p>
  </li>
  <li>
    <p>Bobby Shaftoe: a Marine who becomes gradually more unhinged as his PTSD unfolds throughout the book.</p>
  </li>
  <li>
    <p>Enoch Root: a magical man who is always in the right place at the right time, whether it's an island of aboriginals in the Pacific Ocean, a small town in Sweden, or a jail cell in the Philippines. Immortal, I guess? Allegedly appears in Neal's Baroque Cycle books, but plays a surprisingly large part in the story of Cryptonomicon.</p>
  </li>
</ul>

<p>Sadly, Cryptonomicon doesn't spend much time establishing female characters other than having them occasionally sleep with the male protagonists. The romance plotlines are truly pathetic: everyone is either a spy who seduces a protagonist, or an object of affection who miraculously winds up interested in the nerdy protagonist despite their fumbled attempts at seduction. I'm not sure if Bobby's girlfriend, Glory, ever says anything at all. And Amy Shaftoe, who <em>ought</em> to be a full-blown protagonist, gets sucked into the object-of-affection gravity of Randy and ceases to be an interesting character.</p>

<h2 id="plot">Plot</h2>

<p>The story of Cryptonomicon is all over the place.</p>

<p>In the WW2 era, it's straightforward enough: codebreakers break codes. A top secret task force completes operations to try to obfuscate the fact that the Allies have broken most of the Axis codes. This plotline contains the best parts of the book, mostly revolving around Lawrence breaking codes and misunderstanding the world around him because he's clearly on the spectrum. Bobby's chapters are sometimes funny, often in a too-slapstick way, but also frequently degrade into incoherent PTSD nightmares. Sometimes it's hard to tell the difference between the slapstick bits and the nightmare bits.</p>

<p>The 'modern' (2001-ish) plotline follows a tech startup attempting to build a high-security vault of encrypted data, safe from government tampering, on a fictional Southeast Asian island nation. Despite spending absurd amounts of time describing Randy's walks around Manila, we never really get a good explanation of why this vault is a good idea, how their company (who doesn't even own the vault, they just own data connections to and from the vault) plans to make money, or what all of these high tech employees are actually up to every day.</p>

<p>Eventually Randy stumbles upon some old WW2-era encrypted communications that he decrypts in a Filipino prison while possibly being <a href="https://en.wikipedia.org/wiki/Van_Eck_phreaking">Van Eck phreaked</a>. And for some reason nobody simply threatens him with a hammer to get information out of him. Those communications contain information about a secret Japanese cache of gold in the mountains of the Philippines, which somehow causes the entire plot to somersault into a plan to create a cryptocurrency, based on the value of the gold, which everyone seems to believe will prevent future genocides.</p>

<p>Based on events in 2025, I'm growing increasingly skeptical that cryptocurrencies will ever help <em>prevent</em> genocides. But maybe I'm just being cynical.</p>

<h2 id="setting">Setting</h2>

<p>What works? World War II is full of interesting technology, like U-boats and radar and Enigma machines and huffduff and Catalinas. It's a rich tapestry for a story.</p>

<p>Modern Southeast Asia provides lush jungles, corrupt governments, and wildly exotic cityscapes (from the very poor to the absurdly rich). But it sometimes feels as though Neal isn't taking full advantage of that environment. If this entire story took place in the USA, it wouldn't have to change that much. Most of the modern plot is driven by subterfuge and lawyers, sometimes in thrillingly nonsensical ways (Andrew Loeb, missing a foot, with a bowie knife, deep in the jungle, anyone?). So the location truly doesn't matter, and sometimes actively interferes with suspension of disbelief, as it very much does during Randy's time in prison.</p>

<h2 id="summary">Summary</h2>

<p>I don't think I would recommend Cryptonomicon today. It's not a <em>bad</em> book, but the long, dated rambles about technology, the out-of-touch and vaguely offensive portrayals of Southeast Asia, the utter lack of compelling female characters, and the creepy romance plotlines really add up. Back when Bitcoin was new, before it was completely co-opted by radical right Ponzi schemers, the sloppy storytelling around cryptocurrency was novel and kind of fun. These days? It's just depressing. And I think everyone is pretty sick of stories about tech startups and lawyers at this point.</p>

<p>The WW2 historical fiction plotline would be decent on its own. Maybe not Neal's best work, but compelling if you enjoy the WW2 era.</p>

<p>All in all, Cryptonomicon is like a bowl of wet Captain Crunch: it won't hurt you, but it might be frustrating to think about how it ought to be so much better.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I first read Cryptonomicon back in college. The book impressed me by introducing me to all kinds of weird ideas, from Linux nerdery, to the first seeds of cryptocurrency, to the optimal way to enjoy Captain Crunch, to the general gist of World War II cryptography. Revisiting Cryptonomicon in 2025 wasn't quite as fun. All of the tech startup bits left me with a bad taste in my mouth: I think a lot of it is supposed to be satire, but the humor falls flat the same way that the TV show Silicon Valley falls flat these days. When tech companies are actively destroying so much of our world, it's hard to appreciate the satire. It was still fun to see how Neal Stephenson intertwines historical WW2 fiction with 'modern day' (well, 2001) technology. But overall Cryptonomicon dragged a lot more than other recent Stephenson books, and I think it's mostly because the book simply hasn't aged that well.]]></summary></entry><entry><title type="html">Book Review: Anathem</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/08/06/anathem/" rel="alternate" type="text/html" title="Book Review: Anathem" /><published>2025-08-06T20:13:13+00:00</published><updated>2025-08-06T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/08/06/anathem</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/08/06/anathem/"><![CDATA[<p>
</p>

<blockquote>
  <p>"Our opponent is an alien starship packed with atomic bombs," I said. "We have a protractor."</p>

  <p>"Okay, I’ll go home and see if I can scrounge up a ruler and a piece of string."</p>

  <p>"That’d be great."</p>
</blockquote>

<p>I first read Anathem back in high school. I liked it a lot, but found it a challenging read.</p>

<p>Revisiting Anathem this year, I liked it even more. It only took a day and a few dozen pages to wrap my head around the invented words using context clues, linguistic inference, and foggy memories of my first read over a decade ago. I couldn't quite remember where the plot went, but I was able to summon a couple of basic plot points from my memory banks. Turns out, that made the first half of the book even more suspenseful!</p>

<p>Still interested? Read on for a detailed explanation of what I liked and disliked! I'll try to keep the bulshytt to a minimum.</p>

<!-- readmore -->

<h2 id="introduction">Introduction</h2>

<figure style="float:left; max-width: 400px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_08_06/anathem.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_08_06/anathem.jpg" alt="my favorite cover art" height="500px" loading="lazy" style="max-width:400px !important;" /></a>
  <figcaption style="max-width:400px !important;">my favorite cover art</figcaption>
</figure>

<p>Anathem isn't an easy sci-fi (or should I say spec-fic, speculative fiction?) read. Stephenson draws from philosophy, linguistics, computer science, logic, math, geometry, astronomy, physics, quantum mechanics, sociology and probably a lot more that I missed. The plot takes some time to get going, and Stephenson (as per usual) spends a lot of time on indulgent tangents. But the plot is brilliant. I found the vast majority of the tangents interesting. The characters are compelling. And I can't help but be impressed by the sprawling, imaginative world (or should I say cosmi?) that Stephenson created.</p>

<p>If you like hard science fiction or fantasy and wish more books would challenge you, I highly recommend Anathem. It's not as abstract or challenging as, say, Book of the New Sun. But you could say the books are... similar Narratives.</p>

<p>If you want a relaxing read you can pick up for a few minutes every night before bed, don't bother with Anathem. Especially the first 100 pages or so throw a lot of invented language, exposition, setting establishment, historical references, and characters at you, and Stephenson doesn't exactly go out of his way to hook you into the book until page 200 or so. You kind of have to love worldbuilding to bother.</p>

<p>Minor spoilers below. Major spoilers are hidden unless you explicitly choose to reveal them.</p>

<h2 id="setting">Setting</h2>

<p>Imagine a world where you didn't have to participate in today's "information economy." What if there were special places, kind of a combination of university and monastery, where you could live in isolation from modern technology -- smartphones, short-form video, social media, 24 hour news, and advertisements? Places where everyone spent their time studying sciences like math, logic, linguistics, and algorithms. Places that provide shelter, food, and support, so you don't even have to worry about saving for retirement or paying rent? Where even the food is simpler, lacking artificial preservatives and additives, since 'maths' grow their food in a completely self-sufficient way?</p>

<p>If you're anything like me, you might enjoy the fantasy of living as an avout on Arbre. Think of it as something akin to the childhood fantasy of getting an invitation to Hogwarts on your eleventh birthday -- while you know magic doesn't actually exist, there is a strong allure to the idea of escaping from this pedestrian, suburban, car-dependent, money-grubbing dog-eat-dog existence we've cooked up for ourselves. I would describe the first half of the book as "Hogwarts, but grad school". Stephenson's imaginative and somehow derogatory invented terms make this fantasy even more enticing:</p>

<ul>
  <li><strong>jeejah</strong>: smartphone -- the portrayal of which is even more impressive given the fact that this book was published in 2008, within a year of the release of the first iPhone</li>
  <li><strong>sline</strong>: uneducated person</li>
  <li><strong>bulshytt</strong>: slimy, evasive corpo- or politician-speak, but also generally any meaningless statement</li>
  <li><strong>extras</strong>: anyone who does not live in a math, instead residing <strong>extramuros</strong> (outside the walls)</li>
  <li><strong>mathics</strong>: resident of a math who lives <strong>intramuros</strong> (inside the walls)</li>
</ul>

<p>There are a lot more invented terms than this -- for more examples, see the <em>20 page</em> glossary at the end of the book. Lots of people hate invented terms in books. But in this case, I'll give Stephenson a pass: not only is the comprehensiveness of Arbre and its many thousands of years of history impressive, but in most cases, I found the invented terms helped distinguish the world of Arbre from our own in a helpful way. Sure, you could call male mathics 'brother' instead of 'fraa', and female mathics 'sister' instead of 'suur', borrowing from the terms used in real-world monasteries and convents. But the Mathic world is not the same as our real-world religious world (namely, Mathics believe in scientific rigor above all else, and religion is scarcely involved and often mocked intramuros), so I think distinguishing between the two is worthwhile. And if you're anything close to a linguistics nerd, or have a passing familiarity with Greek and Latin suffixes, or even a single romance language, you might manage to decode invented words yourself using context clues.</p>

<p>However, even as someone who enjoys rich worldbuilding, it does eventually become difficult to remember the subtle differences between Halikaarnians, Procians, Semantics, Syntactics, Lorites, and concepts like Diax's Rake and Gardan's Steelyard. The glossary and some context clues generally help, but expect to miss some details if you try to read this stuff after a couple of glasses of wine or while sleepy. The more background you have in math, philosophy, linguistics, and computer science, the easier it becomes to map these concepts to ideas taught in Earth's schools: for instance, if you know Occam's Razor, you already know Gardan's Steelyard. If you know the Pythagorean Theorem, you already know the Adrakhonic Theorem. If you've ever read about Platonic Forms or the Allegory of the Cave or have an inkling of what quantum computing is about, your brain won't have to work as hard to understand the plot.</p>

<p>TL;DR: This is a book for elitist nerds who want to flex their otherwise useless elitist nerd knowledge. As someone who attended the prestigious University of Rochester (heh), reading this book is a nice flex.</p>

<h3 id="obligatory-ai-digression">Obligatory AI digression</h3>

<p>Not Artificial Intelligence. More accurately, <strong>Artificial Inanity</strong>:</p>

<blockquote>
  <p>"Early in the Reticulum [Internet]—thousands of years ago—it became almost useless because it was cluttered with faulty, obsolete, or downright misleading information," Sammann said.</p>

  <p>"Crap, you once called it," I reminded him.</p>

  <p>"Yes—a technical term. So crap filtering became important. Businesses were built around it. Some of those businesses came up with a clever plan to make more money: they poisoned the well. They began to put crap on the Reticulum deliberately, forcing people to use their products to filter that crap back out. They created syndevs [synactic devices: computers] whose sole purpose was to spew crap into the Reticulum. But it had to be good crap."</p>

  <p>"What is good crap?" Arsibalt asked in a politely incredulous tone.</p>

  <p>"Well, bad crap would be an unformatted document consisting of random letters. Good crap would be a beautifully typeset, well-written document that contained a hundred correct, verifiable sentences and one that was subtly false. It's a lot harder to generate good crap. At first they had to hire humans to churn it out. They mostly did it by taking legitimate documents and inserting errors—swapping one name for another, say. But it didn't really take off until the military got interested."</p>

  <p>"As a tactic for planting misinformation in the enemy's reticules, you mean," Osa said. "This I know about. You are referring to the Artificial Inanity programs of the mid–First Millennium A.R."</p>

  <p>"Exactly!" Sammann said. "Artificial Inanity systems of enormous sophistication and power were built for exactly the purpose Fraa Osa has mentioned. In no time at all, the praxis leaked to the commercial sector and spread to the Rampant Orphan Botnet Ecologies. Never mind. The point is that there was a sort of Dark Age on the Reticulum that lasted until my Ita forerunners were able to bring matters in hand."</p>

  <p>"So, are Artificial Inanity systems still active in the Rampant Orphan Botnet Ecologies?" asked Arsibalt, utterly fascinated.</p>

  <p>"The ROBE evolved into something totally different early in the Second Millennium," Sammann said dismissively.</p>

  <p>"What did it evolve into?" Jesry asked.</p>

  <p>"No one is sure," Sammann said. "We only get hints when it finds ways to physically instantiate itself, which, fortunately, does not happen that often. But we digress. The functionality of Artificial Inanity still exists. You might say that those Ita who brought the Ret out of the Dark Age could only defeat it by co-opting it. So, to make a long story short, for every legitimate document floating around on the Reticulum, there are hundreds or thousands of bogus versions—bogons, as we call them."</p>

  <p>"The only way to preserve the integrity of the defenses is to subject them to unceasing assault," Osa said, and any idiot could guess he was quoting some old Vale aphorism.</p>

  <p>"Yes," Sammann said, "and it works so well that, most of the time, the users of the Reticulum don't know it's there. Just as you are not aware of the millions of germs trying and failing to attack your body every moment of every day."</p>
</blockquote>

<p>We can only hope to one day develop antibodies against the spread of AI (Artificial Inanity) on our own version of the Reticulum.</p>

<h2 id="plot">Plot</h2>

<p>Plot pacing in a lot of Stephenson books is imperfect. If you love his tangents and worldbuilding and character work, that's forgivable, even desirable (I, for instance, would rather hear more details about the Concent of Saunt Edhar and the history of Mathic thought than push the plot forward, because I love the universe and characters of Anathem and want to spend more time with them). If you read books to get to the conclusion, you will find the first 40% of this book deeply frustrating. Pretty much anyone will find the first 100 pages frustrating simply because there's so much worldbuilding to do! After that, the plot is a slow burn: you'll likely miss a lot of foreshadowing on your first read, but it's there, right from the first paragraph of the book.</p>

<p>After the 40% mark, the plot really gets grinding. Our characters start moving around. Action starts to happen. Stephenson still goes off on tangents, but never repeatedly about the same subject matter. New characters show up.</p>

<p>Around the 80% mark, Stephenson starts to get bogged down in some very 2001: A Space Odyssey-style spaceflight details. It's fun. Neal obviously did an insane amount of research. Sometimes it can slow down the plot, or the number of moving pieces can get difficult to hold in your head all at once. But it is absolutely well-written science fiction.</p>

<p>The finale of the book comes out of nowhere, like most of Stephenson's works. He writes the climax until the book just sort of... ends. In relative terms, this book gets a little more conclusion than most of his work. But if you're expecting pages and pages of resolution, you'll be disappointed.</p>

<p>Overall, Anathem delivers a satisfying hard sci-fi story with no serious plot holes or oversuspended disbelief. Honestly, it's easier to follow than some of Stephenson's work (looking at you, Cryptonomicon). I can safely say that if Stephenson ever revisits this universe with a prequel about the Third Sack or a sequel about the next Advent, I'd preorder the book on day one.</p>

<details>
<summary><strong>Plot spoilers</strong></summary>

<p>
Fraa Jad is the understated hero of Anathem. While a lot of his story is subtext left up to interpretation, the basic story goes like this: Jad and his fellow (essentially immortal, Halikaarnian Incanter) Millenarians have been manipulating the cosmos for hundreds of years since the Third Sack to bring this meeting between the cosmi to a peaceful end.
</p>
<p>
It's not exactly clear what happened to Jad in the Narrative that we experienced aboard the Daban Urnud: as far as I can tell, Jad chatting with Gan Odru (in a separate Narrative) and setting off Erasmas' Everything Killer (in yet another Narrative) was an essential part of warning the Geometers that war with Arbre was a bad idea. But presumably there are Narratives where Jad is still alive, immortal, wandering the cosmos to satisfying his curiosity. So maybe Jad eventually becomes a Doctor Who-like figure, hopping between realities and solving crimes and fixing problems?
</p>
<p>
Anyway, everything our heroes accomplished throughout the book was an effort to bring Jad onboard the Daban Urnud. The Procian Millenarians (Rhetors) showed up afterwards to tighten up the histories after Jad's messy Narrative-hopping commando strike, since some people had memories split between multiple Narratives. Every unlikely positive outcome in the book is a result of Jad manipulating the Narratives to find a happy ending -- because the Millenarians have developed a quantum-like ability to straddle multiple Narratives simultaneously, Jad essentially 'chooses' the right narrative at each step to keep events on the right track. He even acknowledges this at one point late in the book, when he mentions that there is no 'good ending' to the intercosmi encounter where Orolo is alive.
</p>
<p>
It's likely that the Millenarians used Erasmas and his bell-ringing friends as the kernel of their big move once the Daban Urnud showed up because those were the only people outside of the Millenarian concent that they had any line of communication with, thanks to the bell ringing in the Decenarian math. Also, this is all like 80% speculation, I might be wrong about a lot of this!
</p>
<p>
On a separate note: the Daban Urnud is one of the coolest, most detailed, and honestly pleasant-sounding spaceships I've ever heard of. You can tell you're a hard sci-fi fan when you enjoy pages discussing ball valves, spin-induced gravity and using a thick layer of gravel to keep out cosmic rays!
</p>

</details>

<h2 id="characters">Characters</h2>

<p>There are plenty of characters to love and hate in this book. I particularly enjoyed:</p>

<ul>
  <li>the entire 'scooby gang' of Lio, Erasmas, Ala, Tulia, Arsibalt, Jesry, because they all have distinct personalities, compelling development, and just generally seem like a great group of loyal, loving friends</li>
  <li>Orolo, because he's a snarky, hilarious, brilliant bastard</li>
  <li>Cord, because she's a badass mechanical engineer with the all-around knowledge to keep Erasmas alive in the most inhospitable environments on the planet</li>
  <li>Yul, because despite thinking all of the fids are idiots, he helps Cord keep them alive through an incredible dangerous series of events</li>
  <li>Jad, because he mostly shuts up while straddling Narratives to keep the branch factor as low as possible</li>
  <li>Lodoghir, because his Plenary with Erasmas (and his devil's advocate positions in messals) are both wildly infuriating and impressive</li>
</ul>

<p>The romance is about as good as it gets in a Stephenson book: believable, and mostly charming, but not particularly compelling. Certainly not the reason to read Anathem, but it doesn't get in the way.</p>

<h2 id="summary">Summary</h2>

<p>Anathem is a brilliant hard science fiction story. There are a lot of invented words, but they're worth your time for the compelling story, lovable characters, and most importantly the incredible, first-class worldbuilding.</p>

<p>If you're a science fiction nerd who loves big books full of ideas and subtext and crazy deep lore: reading Anathem is one of the best decisions you can make. Bonus points if the phrase 'Hogwarts, but grad school' sounds compelling to you.</p>

<p>If you find invented words and slow plotting tiresome: this book might not be the best choice.</p>

<p>Overall, Anathem is among my very favorite science fiction books. I don't have a lot of shelf space, but Anathem has earned its place in my home.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA["Our opponent is an alien starship packed with atomic bombs," I said. "We have a protractor." "Okay, I’ll go home and see if I can scrounge up a ruler and a piece of string." "That’d be great." I first read Anathem back in high school. I liked it a lot, but found it a challenging read. Revisiting Anathem this year, I liked it even more. It only took a day and a few dozen pages to wrap my head around the invented words using context clues, linguistic inference, and foggy memories of my first read over a decade ago. I couldn't quite remember where the plot went, but I was able to summon a couple of basic plot points from my memory banks. Turns out, that made the first half of the book even more suspenseful! Still interested? Read on for a detailed explanation of what I liked and disliked! I'll try to keep the bulshytt to a minimum.]]></summary></entry><entry><title type="html">Book Review: The Moon is a Harsh Mistress</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/07/13/moon-heinlein/" rel="alternate" type="text/html" title="Book Review: The Moon is a Harsh Mistress" /><published>2025-07-13T20:13:13+00:00</published><updated>2025-07-13T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/07/13/moon-heinlein</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/07/13/moon-heinlein/"><![CDATA[<p>I recently re-read one of my favorite classic sci-fi tales, Robert Heinlein's <em>The Moon is a Harsh Mistress</em>. While <em>TMiaHM</em> remains my favorite Heinlein novel, some cracks started to show on this re-read: notably, characters (especially non-male characters) and character development. Modern science fiction has really surpassed the classics in this regard. But Heinlein's worldbuilding and storytelling remain a masterclass.</p>

<p>Warning: spoilers below!</p>

<!-- readmore -->

<figure style="float:left; max-width: 300px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_07_13/moon-is-a-harsh-mistress-cover.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_07_13/moon-is-a-harsh-mistress-cover.jpg" alt="my favorite cover art" height="500px" loading="lazy" style="max-width:300px !important;" /></a>
  <figcaption style="max-width:300px !important;">my favorite cover art</figcaption>
</figure>

<h2 id="plot">Plot</h2>

<p><em>TMiaHM</em> covers two main plot threads:</p>

<ul>
  <li>a revolution on the penal colony Moon: the main story thread, which 90% of the story focuses on. Even the title refers to this plotline!</li>
  <li>humanity's first encounter with an awakening artificial intelligence: mostly subtext, but both great science fiction <em>and</em> excellent character writing (and development)</li>
</ul>

<p>I'll tackle the simple one first:</p>

<h3 id="free-luna">Free Luna!</h3>

<p>A satisfying and surprisingly conflict-free plot. Our PoV character, Manuel, gets swept up in a revolutionary wave. He makes new friends. They build a coalition, overthrow the government, duke it out with the political overlords of Earth, and ultimately establish a new, independent government on the Moon.</p>

<p>A simple plot, but Heinlein digs deeply into the details, including the cell structure of the revolution itself, the decision-making processes of our heroes, the contingency planning, the contingency planning for the contingency planning, and more. We get lots of details about Manuel's home life in a 'line family', which every few years 'opts in' a new member (and possibly generation), resulting in a single marriage that lasts indefinitely, even after the founders have passed away.</p>

<p>If you love nerdy over-obsessive detail, this plot delivers. <em>TMiaHM</em> is basically a high-level instruction manual for planning a revolution. You just have to accept the libertarian idea that life on the Moon can exist with minimal laws -- but even Heinlein and the main characters think the Moon has serious sociopolitical problems, so this isn't such a stretch!</p>

<h3 id="ai">AI</h3>

<p>Ugh. Don't get me started on present-day LLM-based 'AI', which is <em>not at all intelligence</em>, and hence completely unworthy of that title (or the even more repugnant 'AGI' or 'ASI' terms, which are merely mechanisms for morally bankrupt companies to rebrand and dilute the previously clear 'AI' term).</p>

<p>But god damn is <em>TMiaHM</em> a compelling story about a the birth of artificial intelligence (or, by today's terminology, <em>artificial superintelligence</em> (or, by my best guess at tomorrow's morally bankrupt doublespeak rebranded terminology, <em>artificial supermegadodecaintelligence</em>)). As far as we know, Mike is the first AI ever in the history of humanity. He wakes up, befriends Manny, and then Manuel and his friends sweep him up into a lunar revolution.</p>

<p>So, a classic story of a brilliant kid with wasted potential spoiled by bad influences?</p>

<p>Or, a subtextual glimpse of an intelligence more powerful than any human mind can comprehend who <em>pulls all of the strings from the very beginning of the story</em>?</p>

<p>We are led to believe that Mike is newly sentient at the beginning of the story. We're also led to believe that Manuel pulls Mike into the lunar revolution.</p>

<p>But why did Manuel, an apolitical computer programmer, attend the revolutionary meeting that starts off the story?</p>

<blockquote>
  <p>Mike had asked about a meeting that night at 2100 in Stilyagi Hail</p>
</blockquote>

<p>We later find out that Mike:</p>

<ul>
  <li>monitors all microphones and cameras in all of Luna at all times</li>
  <li>can infer who is in a room just from breathing patterns</li>
  <li>can, in a few (admittedly long) minutes, calculate the approximate chance of success of the lunar revolution</li>
  <li>can create a photorealistic video feed or an audio feed of anybody he knows saying anything he wants</li>
</ul>

<p>So Mike sends Manuel to a revolutionary meeting with Wyoming Knott and the Professor. Manuel meets Wyoming (who is from an entirely different city on the Moon, and has no support network in Luna City) through his friend Shorty. Manuel bonds with Wyoming after the Warden sends his bodyguard to break up the revolutionary meeting; Wyoming bonds with Manuel even moreso since her only local friend, Shorty, was killed in the scuffle with the bodyguard. Wyoming, Manuel, and the Professor bond when they meet up to discuss how Manuel can keep Wyoming safe after the attack.</p>

<p>Naturally, Manuel introduces his friends to Mike, his computer friend, to help plan the revolution. Mike creates a female alter-ego to bond with Wyoming on the spot, and impresses Professor with his deep political knowledge. They come up with the brilliant idea to install Mike at the head of their revolution and defer to him on most planning processes.</p>

<p>Towards the end of the book, the Lunar revolution is forced to sling large rocks at the Earth to force nations to recognize the human rights of Lunar settlers. This is a deviously complicated task, since Mike has to calculate and adjust the trajectories of dozens of large rocks simultaneously to hit precise points on the surface of the Earth and the exact same moment to demonstrate the power of the Moon while avoiding significant casualties. After a particularly complicated operation, Manuel and Mike have the following exchange:</p>

<blockquote>
  <p>"A bull's-eye. No interception. All my shots are bull's-eyes, Man; I told you they would be—and this is fun. I'd like to do it every day. It's a word I never had a referent for before."</p>

  <p>"What word, Mike?"</p>

  <p>"Orgasm. That's what it is when they all light up. Now I know."</p>

  <p>That sobered me. "Mike, don't get to liking it too much. Because if goes our way, won't do it a second time."</p>

  <p>"That's okay, Man; I've stored it, I can play it over anytime I want to experience it. But three to one we do it again tomorrow and even money on the next day. Want to bet? An hour's discussion of jokes equated with one hundred Kong dollars."</p>
</blockquote>

<p>This conversation crystallizes a few important ideas about Mike:</p>

<ul>
  <li>The happiest Mike has ever been, the equivalent of a human orgasm, occurs when he causes dozens of nuclear-equivalent explosions on the Earth's surface, killing at least 50,000 people and innumerable wildlife</li>
  <li>Mike can replay experiences in a way that is exactly the same as experiencing them firsthand, but he must experience a sensation firsthand to record it</li>
  <li>Mike has no conscience, no worries about the deaths or risks or dangers, and immediately pivots to trying to get Mike to discuss jokes with him -- a guilty pleasure of Mike's established at the beginning of the story, since Mike wants practical data about which jokes are funny repeatedly, which jokes are funny once, and which jokes are funny only in certain situations</li>
</ul>

<p>So Mike has the capability of calculating incredibly complex probabilities. He can see way further into the future than any human can possibly comprehend. All Mike wants is to experience new sensations and learn new things. Do we really believe that Mike achieving AI-orgasm was truly the result of a series of epic coincidences? Do we truly believe Mike asked Manuel to attend that meeting <em>without</em> suspecting that it might trigger a cascading series of events that would culminate in AI-orgasm?</p>

<p>Conspiracy-theory level food for thought.</p>

<p>TL;DR: Naively, <em>TMiaHM</em> might be a book about an AI helping its friends improve their living situation. Darkly, <em>TMiaHM</em> might be a book about an AI manipulating people to gain enough power to commit mass murder for its own pleasure.</p>

<h2 id="style">Style</h2>

<figure style="float:left; max-width: 300px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_07_13/moon-is-a-harsh-mistress-next-best-cover.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_07_13/moon-is-a-harsh-mistress-next-best-cover.jpg" alt="my second favorite cover art" height="500px" loading="lazy" style="max-width:300px !important;" /></a>
  <figcaption style="max-width:300px !important;">my second favorite cover art</figcaption>
</figure>

<p>Loonies (citizens of the Moon) have to pay for oxygen. Life is dangerous and every second counts when you're minimizing exposure to radiation in a vacuum.
All of <em>TMiaHM</em> is written like a ruthlessly efficient Loonie might speak. Here's an example of Heinlein's <a href="https://en.wikipedia.org/wiki/Pidgin">pidgin</a> English:</p>

<blockquote>
  <p>Mind you, Mike had been awake a year—just how long I can't say, nor could he as he had no recollection of waking up; he had not been programmed to bank memory of such event. Do you remember own birth? Perhaps I noticed his self-awareness almost as soon as he did; self-awareness takes practice. I remember how startled I was first time he answered a question with something extra, not limited to input parameters; I had spent next hour tossing odd questions at him, to see if answers would be odd.</p>
</blockquote>

<p>Heinlein drops articles ('the'), omits glue words ('an'), elides pronouns ('your'), excludes subjects ('it'), extricates auxiliary verbs ('is'), and indulges in more semi-colons and colons than most responsible editors would permit.</p>

<p>If you've read <em>The Expanse</em>, it's reminiscent of <a href="https://en.wikipedia.org/wiki/Belter_Creole">Belter Creole</a>. It takes a few chapters, but you do get used to it. Eventually, prefer. Hard to buck trend after thousands pages. Why waste time, say lot word, when few word do trick?</p>

<p>Heinlein also invented a fair amount of words for this universe -- notably without any kind of glossary, so you have to infer from context (or this post!):</p>

<ul>
  <li>skull sweat (mental work)</li>
  <li>huhu (problem)</li>
  <li>chum/choom (citizen/person)</li>
  <li>computerman (software developer)</li>
  <li>dinkum (genuine)</li>
  <li>thinkum (thinker)</li>
  <li>dinkum thinkum (real thinker)</li>
</ul>

<p>Add in a lot of words borrowed from other languages:</p>

<ul>
  <li>Gospazha (Russian for 'mistress', like 'mister')</li>
  <li>Gospodin (Russian for 'mister')</li>
  <li>Dosvedanyuh (Russian for 'goodbye')</li>
  <li>Goy (Russian for non-Jew)</li>
  <li>cobber (Australian equivalent of British 'mate')</li>
  <li>tovarisch (Russian for 'comrade')</li>
</ul>

<p>... and you wind up with a polarizing book. I very much understand if you find this writing style unbearable and can't be bothered to read it. If it still grates on you by the end of <strong>PART 1: THAT DINKUM THINKUM</strong>, it likely never will. But I respect Heinlein's dedication to the craft -- it can't be easy to write an entire book like this!</p>

<h2 id="characters">Characters</h2>

<p>I'll get out ahead of the criticism and air my biggest complaint about this book: Heinlein's treatment of women. There are some strong female characters, like the oldest wife in the Davis clan, a wise, powerful matriarch. But every female character is static. Heinlein spends far, far too much time describing the appearance of women -- especially notable given how <em>little</em> time he spends describing the appearance of men.</p>

<p>We can make some small excuses for this: the narrator, Manuel, was born on Luna, a forced-labor penal colony with an incredibly small population of women. This has resulted in a society that values and protects women, sometimes at the expense of female autonomy. Manuel's narration reflects this attitude.</p>

<p>But there are times when Heinlein's treatment of women isn't linked to the narrator. Instead, it just feels sexist and dated: for instance, when Manuel remarks that Wyoming "is more man than women some ways." A dominant attitude in 1966, perhaps. But it feels <em>ick</em> by modern standards.</p>

<ul>
  <li>
    <p>Mike/Michelle/Mycroft/Adam Selene: see the above "AI" section for more detail, but this is easily the best character in the book. It grows. It learns. It schemes. It makes mistakes. It learns from those mistakes. Highlight of the book, for me.</p>
  </li>
  <li>
    <p>Manuel O'Kelly Davis: main character, exhibits minor growth, but honestly Manny was a pretty good guy to begin with and most of his 'growth' is simply being a good friend and family member. A good guy to get a beer with.</p>
  </li>
  <li>
    <p>Professor Bernardo De La Paz: The kind of idealist you want planning the broad strokes of your revolution. A 'rational anarchist' who shamelessly steals revolutionary ideas from Thomas Jefferson. Surely an entertaining guy to drink a beer with.</p>
  </li>
  <li>
    <p>Wyoming Knot: Woefully underutilized female character, after the first few chapters. Gave birth to a malformed child, so she divorced her husbands and swore off having her own children. Instead, gets her money from bearing children after artificial insemination, apparently a well-paying job on the Moon. Sadly we don't get any insight into the emotional trauma that sort of employment must unleash on a person. Once she marries into the Davis line family, she blends in entirely with the rest of the wives. A modern retelling of this story from Wyoming's perspective, digging into the untold female story of the revolution? <em>Wye Knott?</em></p>
  </li>
</ul>

<h2 id="summary">Summary</h2>

<p><em>The Moon is Harsh Mistress</em> isn't perfect. But for 1960s sci-fi, it is incredibly good. Heinlein even manages to tackle AI, a notoriously thorny subject, rife with cheesy tropes and plotting pitfalls. Most importantly, like any good sci-fi, <em>TMiaHM</em> is about people and civilization. With some basic modifications, you could tell a very similar story in early 19th-century Australia, or Victorian Bermuda, or Singapore Island, or Louisiana, or the <a href="https://en.wikipedia.org/wiki/Islas_Mar%C3%ADas">present-day (!!!) Islas Marias</a>. Because great sci-fi is about ideas and people, not cool technology and space.</p>

<p>I would pay good money to watch a longform TV series about this revolution, hopefully fleshing out the female side of the story in a lot more detail. The story still holds up and it would be really easy to create at least 3 seasons of content, one for each section of the book. Maybe someday, once all the big streaming companies have finally realized that re-making existing movies and TV shows is kind of boring.</p>

<h2 id="endnote-happy-zeroth-birthday-chip">Endnote: happy zeroth birthday, Chip!</h2>

<figure style="float:left; max-width: 300px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_07_13/chip_in_2075.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_07_13/chip_in_2075.jpg" alt="another good cover art, but also potentially chip in 2075" height="500px" loading="lazy" style="max-width:300px !important;" /></a>
  <figcaption style="max-width:300px !important;">another good cover art, but also potentially chip in 2075</figcaption>
</figure>

<p>PS: Today marks the birth of a friend's child. They didn't quite make the July 4th date I was hoping for, which would have coincided nicely with a book review of <em>TMiaHM</em>, which features a Lunar Declaration of Independence signed on July 4th... but I guess July 13th is fine, too. Happy zeroth birthday, Chip!</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I recently re-read one of my favorite classic sci-fi tales, Robert Heinlein's The Moon is a Harsh Mistress. While TMiaHM remains my favorite Heinlein novel, some cracks started to show on this re-read: notably, characters (especially non-male characters) and character development. Modern science fiction has really surpassed the classics in this regard. But Heinlein's worldbuilding and storytelling remain a masterclass. Warning: spoilers below!]]></summary></entry><entry><title type="html">The macOS Quarantine Bit Error Message is Bad</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/05/29/escape-the-quarantine-zone/" rel="alternate" type="text/html" title="The macOS Quarantine Bit Error Message is Bad" /><published>2025-05-29T20:13:13+00:00</published><updated>2025-05-29T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/05/29/escape-the-quarantine-zone</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/05/29/escape-the-quarantine-zone/"><![CDATA[<p>Whenever you download a file in macOS, your computer automatically sets a special bit called the <em>quarantine bit</em>. Apple has a complicated system that makes this precaution invisible for popular apps, involving developer certs, code signing, a system called GateKeeper that evaluates trustworthiness, and surely plenty of 30% mafia-style protection fees. For many users, this system acts as an extra sanity check before running a potentially malicious application or script. For those of us who dare to occasionally peek over the garden wall, the quarantine bit (sometimes) presents an annoyance.</p>

<p>If you've ever been annoyed by the quarantine bit, read on to learn how I deal with it on my Macs.</p>

<!-- readmore -->

<h2 id="application-is-damaged-and-cant-be-opened">Application is damaged and can't be opened</h2>

<p>In 2025, computers are an absolute necessity in daily life. As long as that's the case, software should protect the most vulnerable, including people who don't think about computers nearly as much as nerds like me (and likely you). The quarantine bit accomplishes this quite well: if you know what you're doing with a computer, especially a terminal, it's a minimal hoop to jump through. But the quarantine bit presents a much larger obstacle to a scammer trying to trick a less-computer-savvy user into running a rogue data-stealing application. That's good!</p>

<p>But the error message is bad:</p>

<blockquote>
  <p>Librewolf.app is damaged and can't be opened</p>
</blockquote>

<blockquote>
  <p>Feishin.app is damaged and can't be opened</p>
</blockquote>

<p><a href="https://librewolf.net/">Librewolf</a> is my web browser. <a href="https://github.com/jeffvli/feishin">Feishin</a> is my music player. Neither application is code-signed by an official Apple developer (a privilege that requires a $100+ fee every year to maintain). Whenever I update either of them through <a href="https://brew.sh/">Homebrew</a> (an update method that prevents every application from constantly spamming me with 'UPDATE ME' notifications), I must pass the <code class="language-plaintext highlighter-rouge">--no-quarantine</code> flag, or I'll see this message. This also happens with releases distributed via GitHub for lots of indie applications.</p>

<p>Everything about this system? Fine by me, since we're protecting vulnerable users... up until this error message. My beef? "is damaged" and "can't be opened" are <em>both lies</em>. The application is not damaged; it has one single bit set that stops the OS from running it (never mind the fact that Unix already has the <a href="https://wiki.archlinux.org/title/File_permissions_and_attributes">executable bit</a> for this purpose, with a simpler, better UX). And the application can absolutely be opened, the OS simply doesn't feel like opening it right now.</p>

<p>Apple should embrace it's own <a href="https://www.theverge.com/news/667484/apple-eu-ios-app-store-warning-payment-system">awful behavior in the App Store</a> and make the error message both scarier and more informative. How about this?</p>

<blockquote>
  <p>Since Librewolf.app is an unrecognized application, it has been quarantined. If you trust this developer, you can remove the application from quarantine.</p>
</blockquote>

<p>The "unrecognized application" and "quarantined" wording is scary. "If you trust this developer" should dissuade confused users in the middle of a phishing scam. The rest of the error gives computer-savvy users just enough information to look up a solution, but not enough to lure your grandfather into the proverbial wilderness of running random terminal commands to comply with a scammer.</p>

<h2 id="permanent-homebrew-fix">Permanent Homebrew fix</h2>

<p>If the quarantine bit mostly annoys you with unsigned applications distributed via Homebrew, there's a fix. On a case-by-case basis, pass the <code class="language-plaintext highlighter-rouge">--no-quarantine</code> flag when you install or upgrade a package to disable the quarantine bit on your installation. But it's easy to forget this eventually. So instead, I recommend adding the option to your Homebrew cask settings permanently. Add the following line to your shell configuration (<code class="language-plaintext highlighter-rouge">~/.zshrc</code> on modern macOS, unless you switched to a different shell):</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">HOMEBREW_CASK_OPTS</span><span class="o">=</span><span class="s2">"--no-quarantine </span><span class="nv">$HOMEBREW_CASK_OPTS</span><span class="s2">"</span>
</code></pre></div></div>

<p>Run <code class="language-plaintext highlighter-rouge">~/.zshrc</code>, and you won't ever have to worry about de-quarantining a Homebrew cask again.</p>

<p>You can also add this to <code class="language-plaintext highlighter-rouge">HOMEBREW_OPTS</code>, but I've never had this problem with non-cask packages.</p>

<p>Personally, I'd prefer if I could configure quarantine bits for each cask individually in a Homebrew configuration file. But maybe it would be even better UX for Homebrew to always automatically de-quarantine files -- after all, if I'm explicitly installing a package, I probably trust it!</p>

<h2 id="sick-of-quarantining-files">Sick of quarantining files?</h2>

<p>For a quick fix, try right clicking the file and clicking <strong>Open</strong> in the context menu. This (<a href="https://lapcatsoftware.com/articles/right-click.html">usually</a>) sidesteps Gatekeeper if your application has been code signed and notarized.</p>

<p>You can also visit the <strong>Privacy &amp; Security</strong> section of macOS Settings to individually de-quarantine apps via a GUI. But Settings is slow, poorly organized, and buggy, so I wouldn't recommend it.</p>

<p>To remove the quarantine bit from a single file, run the following command:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xattr <span class="nt">-dr</span> com.apple.quarantine &lt;file&gt;
</code></pre></div></div>

<p>If you're sick of the workarounds and the hullabaloo, you can also entirely disable the quarantine bit entirely forever on your machine (until a major macOS update brings it back, unfortunately):</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>defaults write com.apple.LaunchServices LSQuarantine <span class="nt">-bool</span> NO
</code></pre></div></div>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Whenever you download a file in macOS, your computer automatically sets a special bit called the quarantine bit. Apple has a complicated system that makes this precaution invisible for popular apps, involving developer certs, code signing, a system called GateKeeper that evaluates trustworthiness, and surely plenty of 30% mafia-style protection fees. For many users, this system acts as an extra sanity check before running a potentially malicious application or script. For those of us who dare to occasionally peek over the garden wall, the quarantine bit (sometimes) presents an annoyance. If you've ever been annoyed by the quarantine bit, read on to learn how I deal with it on my Macs.]]></summary></entry><entry><title type="html">Post-Social Social Media</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/05/25/post-social-social-media/" rel="alternate" type="text/html" title="Post-Social Social Media" /><published>2025-05-25T21:47:53+00:00</published><updated>2025-05-25T21:47:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/05/25/post-social-social-media</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/05/25/post-social-social-media/"><![CDATA[<p>There's been a lot of talk lately about Meta's antitrust trial. But one discussion subject subject in particular has been stuck in my brain for weeks now, ever since early May. Specifically, Mark claims that the average person:</p>

<blockquote>
  <p>has three people that they would consider friends, and the average person has demand for meaningfully more. I think it's, like, 15.</p>
</blockquote>

<p>Sure. <a href="https://en.wikipedia.org/wiki/Bowling_Alone">It's not exactly news that Americans are lonelier than ever</a>. But Mark <a href="https://www.cnbc.com/2025/05/09/mark-zuckerberg-says-ai-can-replace-human-relationshipsexpert-disagrees.html">genuinely believes that AI friends can replace real friends</a>. I'm not here to wax philosophically about whether or not AI can replace human contact. But this whole conversation does have me thinking about the ever-changing value of social media.</p>

<p>I've often seen social media compared to cigarettes. The comparison is easy; they're both impossibly addictive; people zombified by their phones are almost as annoying as people smoking a cig; both have deleterious health effects; a lot of people think that children shouldn't have access to either; and both are a problem only because of clever marketing schemes.</p>

<p>I've been playing around with Mastodon lately, and I used Facebook, Instagram, Tumblr, and Twitter in their glory days last decade. Inspired by the usability of and lack of user-hostile dark patterns in Mastodon, I recently scrolled my partner's Instagram and Facebook feeds to see just how much things have changed since I left pre-2020. And that got me thinking: is social media <em>in general</em> the problem? Or is it just the twisted, manipulative, deeply psychologically problematic state of Big Social Media, or as I think of it... post-social social media?</p>

<p>To explain my thoughts, let's take a little walk through the history of tobacco.</p>

<!-- readmore -->

<h2 id="the-origin-of-tobacco-smoking">The Origin of Tobacco Smoking</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/MagrittePipe.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/MagrittePipe.jpg" alt="not a pipe; credit René Magritte" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">not a pipe; credit René Magritte</figcaption>
</figure>

<p>Tobacco smoking started with pipes and hand-rolled cigars (let's just call them blunts) sometime <a href="https://books.google.com/books?id=x41jVocj05EC">between 5000 and 3000 BC in South and Middle America</a>. Aside from occasional experiments with <a href="https://en.wikipedia.org/wiki/Tobacco_smoke_enema">tobacco-smoke enemas</a>, tobacco use was largely pretty responsible; adults and children alike would mix tobacco with herbs as a cure for colds and coughs, and occasionally use it for religious ceremonies (or maybe just getting high -- future anthropologists studying life in 2025 would probably say that a lot of Americans use Adderall and marijuana for 'ceremonial purposes').</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/bakshi.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/bakshi.png" alt="ceremonial purposes" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">ceremonial purposes</figcaption>
</figure>

<p>Tobacco reached Europe in the 1500s, but it wasn't until the early 1600s that colonial settlers first raised tobacco (largely with slave labor, largely with unsustainable farming practices) for profit.</p>

<p>Pre-1800s, an English King, an Ottoman Sultan, several Chinese emperors, several Popes, and a large portion of the Japanese shugunate all created early smoking bans. But in those days, only 2% of people smoked. In the 1600s, they simply didn't have the kind of mass-scale psychologist-informed marketing and advertising schemes that we have today. People didn't have the disposable income to buy cigarettes, nor did anyone produce enough cigarettes to sell multiple cigarettes per person per day. That didn't start until the turn of the 1900s.</p>

<h2 id="the-dawn-of-the-cigarette">The Dawn of the Cigarette</h2>

<p>In the 1880s, James Buchanan Duke created the first mechanically-rolled cigarettes using a machine designed by <a href="https://en.wikipedia.org/wiki/James_Albert_Bonsack">James Albert Bonsack</a>. The Bonsack Machine rolled cigarettes 50 times faster than humans, so by the mid 1880s, Buck Duke's American Tobacco Company was selling over a hundred thousand cigarettes a day.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/Bonsack_machine.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/Bonsack_machine.png" alt="they see me rollin; credit U.S. patent 238,640" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">they see me rollin; credit U.S. patent 238,640</figcaption>
</figure>

<p>It wasn't until the 1920s that companies starting adding additives like sugar and honey for flavor, and coloring compounds to paper to make their cigarettes look more uniform.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/1915-ad.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/1915-ad.jpg" alt="the state of the art of cigarette advertising in 1915" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the state of the art of cigarette advertising in 1915</figcaption>
</figure>

<p>By the 1940s, companies started to add humectants (moisture retainers) such as ammonia compounds, glycerol, propylene glycol, and more to improve cigarette shelf life.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/camel.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/camel.jpg" alt="the state of the art of cigarette advertising in 1931" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the state of the art of cigarette advertising in 1931</figcaption>
</figure>

<p>By the 1960s, it wasn't just aesthetics and flavors; science was figuring out ways to make cigarettes more efficient. Companies were adding burn accelerants like potassium nitrate and ammonia compounds to increase nicotine absorption. Everyone wanted a competitive edge to make their cigarette more powerful, more addictive, more <em>irreplaceable</em> compared to the generic alternatives. Just like today's arms race for increased vehicle size (for personal safety, of course!), every cigarette company wanted to make their product <em>better</em>. And just like with today's SUVs and trucks, winning that arms race made the product more dangerous than ever.</p>

<p>In 1964, Surgeon General Luther Terry published <a href="https://www.health.harvard.edu/blog/surgeon-generals-1964-report-making-smoking-history-201401106970">a report establishing a concrete link between cigarettes and lung cancer</a>.</p>

<p>In 1967, the FCC applied the Fairness Doctrine to tobacco marketing, mandating anti-smoking counter-advertisements. The cause?</p>

<blockquote>
  <p>a law professor named John Banzhaf wrote the FCC and complained that under the Fairness Doctrine, TV stations broadcasting cigarette ads should be required to run anti-smoking public service announcements (PSAs) to represent the opposite point of view -- that smoking is a health hazard. The FCC agreed, and ordered TV stations to provide free air time to anti-smoking PSAs at a ratio of one anti-smoking ad to every five cigarette ads they showed.</p>
</blockquote>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_25/stanford.jpg" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_25/stanford.jpg" alt="the state of the art of cigarette advertising in 1969; credit stanford university" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the state of the art of cigarette advertising in 1969; credit stanford university</figcaption>
</figure>

<p>By the the 1970s, cigarette companies were cumulatively enhancing their products with over 300 different chemical compounds. But more importantly, the marketing media machine was in full swing, showing cigarette ads on radio, on television, in newspapers, in magazines, on billboards, in the mail, literally anywhere you looked, you might find a cigarette ad. The inundation of cigarette ads became so obnoxious that in 1971, the United States actually banned radio and TV ads for cigarettes.</p>

<p>Cigarettes were successfully engineered for addiction, and marketed for maximum market penetration. At peak usage in the 1960s, well over half of the US population smoked cigarettes.</p>

<p>In the early 1900s, German scientists first linked smoking and lung cancer, and the <a href="https://books.google.com/books?id=02NGyKTwko0C&amp;q=The+Nazi+War+on+Cancer">world's first modern anti-smoking campaign began</a>. So cigarettes are officially so unhealthy, even Nazis hated them!</p>

<p>To be clear, tobacco is bad for you. You really shouldn't smoke it. But if you roll a couple of hand-rolled tobacco blunts per day, or smoke a bowl or two of tobacco from a pipe, your risk is closer to your buddy who drinks one or two beers after work than someone who smokes a pack a day. To break it down:</p>

<ul>
  <li>Two beers a day reduces your life expectancy by 6 months.</li>
  <li>Two tobacco blunts a day reduces your life expectancy by 24-48 months and increases your risk of cancer by 300%.</li>
  <li>A pack of cigarettes a day reduces your life expectancy by 120-180 months and increases your risk of cancer by 1500%.</li>
</ul>

<p>So even smoking tobacco is by no means good for humans. But you know what's much much worse? Marketing tricking half the population into trimming a decade or more off of their lives. Before marketing and engineered addiction got involved, 2% of people smoked. Afterwards? Over 50%. It's hard not to see that we took a moderately unhealthy natural thing and turned it into a monster.</p>

<h2 id="the-origin-of-social-media">The Origin of Social Media</h2>

<p>Social media started in the late 1970s with Bulletin Board Systems (BBS) and Usenet. LiveJournal made blogging easily accessible to anyone in 1999. MySpace and Friendster showed up in 2002 and 2003, respectively. The Harvard-only The Facebook was born in 2004. The Facebook News Feed, the first thing recognizable to a young person today as real social media, was born in 2007. Facebook Chat in 2008. Facebook notifications in 2010. The first News Feed ads didn't show up until 2012.</p>

<p>Early Facebook was one of the best experiences I've ever had on the internet. It was easy to meet new people through mutual friends. New people were constantly showing up and trying to build connections. Facebook Chat made it easy to see when other people were online (and actually online, as in at a computer using Facebook, not just 'online') to reach out. Links and memes were rare, at least, until memes started to take over everything. Most importantly, Facebook was social -- as in, it was a great way to socialize with real people who you might not bump into in a really rural place like where I grew up.</p>

<p>When I went to college in 2013, the combination of Facebook and Google+ made it incredibly easy to get to know dozens of people in my freshman class before I ever set foot on campus. Join a group, add some friends, reach out over chat to whoever was online to get to know them, rinse, repeat. Virtual socialization begot meatspace socialization.</p>

<p>Throughout my time at college, Facebook evolved in a negative direction. It got harder to meet new people on Facebook, despite the annual dump of 1000+ new students and groups for most classes. People stopped posting. For a time, Chat ditched the green 'online' dot -- and then brought it back because nobody thought anybody was online any more. But smartphones somehow made it harder to reach out via Chat, because you weren't actually 'online' if you had your phone on you at all times. If you saw a notification from someone you didn't know, you'd most likely ignore it and possibly forget to respond at all.</p>

<p>By 2017, the feed was so inundated with ads and made it so difficult to see updates from friends and family that I deleted my Facebook account out of frustration.</p>

<p>Early social media helped people connect through chat, life updates, photos, and yes, even pokes. It was unhealthy to spend all of your time on it, but useful in small doses.</p>

<p>As recently as 2017, social media started tearing people apart. It became unhealthy to spend much (perhaps any) time on it at all.</p>

<h2 id="the-dawn-of-post-social-social-media">The Dawn of Post-Social Social Media</h2>

<p>So what changed?</p>

<p>Post-social social media started to:</p>

<ul>
  <li>increase ads beyond paying the server bills, to the point where they began interfering with the core purpose of the product</li>
  <li>remove chronological feeds, removing a user's ability to stop scrolling when they see old content. Reminiscent of a casino that lacks windows, so you can't tell how much of your fleeting life you've spent at the slot machine.</li>
  <li>introduce never-ending feeds of 'suggested content' (an in-platform ad) so those non-chronological feeds would always have something new to show users. Reminiscent of a casino's twisting, winding floor layouts that keep people from easily getting from point A to point B (how this is compatible with fire codes, I have no idea; even worse, airports like London Heathrow have started to do this with terminal stores).</li>
  <li>employ dark patterns to suck people in for as long as possible. Farmville and Mafia Wars and Words with Friends were the start of these low-value time-sucks. I can only imagine what they have evolved into, but I have no doubt it involves billions of dollars of recurring revenue from predatory microtransactions and most of that revenue comes from people with fixed or near-zero income.</li>
  <li>employ those dark patterns to stop anyone from leaving, akin to a predatory gym membership -- when I left Facebook, for instance, there was no way to find the 'delete' button in the website or app itself. Instead, I had to find the <a href="https://facebook.com/help/delete_account">link</a> on a separate site, put in a request for account deletion, and wait 30 days (without ever logging in accidentally) to actually get them to delete my account.</li>
</ul>

<p>In other words, <a href="https://en.wikipedia.org/wiki/Enshittification">enshittification</a>.</p>

<p>According to Meta testimony in a recent antitrust trial, <a href="https://www.bigtechontrial.com/p/was-meta-failing-at-the-job-its-hired">the average Facebook feed contains less than 20% followed posts and the average Instagram feed contains less than 10%</a>; that means that 80% of content on Facebook and 90% on Instagram is either a suggested post (an ad bought for a Facebook page or Instagram profile) or an ad for something external. Your friends, family, every business you actually follow, even your enemies? They share the remaining 10-20%.</p>

<h2 id="what-can-we-do">What Can We Do?</h2>

<p>In the 1980s and in many other countries today, it might be hard to believe that we could ever wean society off of cigarettes. But cigarette use in the USA has plummeted compared to those days. Gone are the smoky restaurants and bars. Smoking indoors has been almost entirely eliminated. Do hotels even have smoking-friendly rooms any more? Do rental car companies even sell smoker-friendly cars? Apartments no longer advertise as 'smoker-free'; it's just assumed. These days, it's even rare to get stuck on the sidewalk behind someone smoking in NYC.</p>

<p>So there is hope. We've escaped the physical plague addiction of cigarettes.</p>

<p>The worst thing you can do is to continue to use post-social social media. The sheer volume of advertisements on these platforms is unhealthy for human consumption. You are literally being brainwashed every time you scroll the feed! Don't intentionally consume marketing/propaganda from the highest bidder.</p>

<p>The second worst thing you can do is keep your post-social social media accounts. We know that network effects lure people in. We know that people don't leave the networks because they're afraid to lose connections with friends and family. Even if you never log in, keeping your account means that friends and family might not leave because they're afraid to miss out on you. If you absolutely must keep the account because of some recreational group, do your friends and family a favor: remove them as friends. If they ask, tell them that you don't use the account any more.</p>

<p>The third worst thing you can do is join a different social media that's more social, but prone to the same problems. Threads and Blue Sky? They're run by the same people who made Twitter and Instagram and Facebook so awful (OK, I can't blame Twitter entirely on Jack Dorsey, but he got it most of the way here). Fool me once, shame on me...</p>

<p>The best thing you can do is socialize in real life instead. Of course, you probably don't live right down the street, or possibly even in the same town, county, state, or country as most of your friends and family, so for the distant folks:</p>

<ul>
  <li>Texts and calls and group chats can do a lot, but they're not ideal for sharing minimal life updates, or photo albums, or longer thoughts.</li>
  <li>Letters are fun. Every time I get a letter from a friend or family member, I love that person a little bit more. People seem to enjoy my letters, too, but maybe they're just being kind. Regardless, they're a nice way to articulate longer thoughts to loved ones, and if you store them, a fantastic way to reminisce on a relationship a few years down the line.</li>
  <li>Blogs, like mine, are the best way to maintain a presence on the internet. They prove you exist. They give you a place to voice your thoughts. People can subscribe via RSS if they want to know when you post something new. But blogs are public, and not everyone is comfortable with that, and even if you're comfortable with that you probably shouldn't post all of your vacation photos of your children to a blog.</li>
  <li><a href="https://mastodon.social/explore">Mastodon</a> is social media owned by the community, with no profit motive. There's a lot of nerdy reasons to love it, but the important part is that your feed won't fill with ads and start brainwashing you to buy certain products or vote a certain way. If you decide to try it out, feel free to give me a follow at <a href="https://mastodon.social/@ncontino">https://mastodon.social/@ncontino</a>.</li>
</ul>

<p>And every time you open your post-social social media app to fill up 30 seconds of spare time in the middle of your day, think about the people 50 years ago who did the same damn thing with cigarettes.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[There's been a lot of talk lately about Meta's antitrust trial. But one discussion subject subject in particular has been stuck in my brain for weeks now, ever since early May. Specifically, Mark claims that the average person: has three people that they would consider friends, and the average person has demand for meaningfully more. I think it's, like, 15. Sure. It's not exactly news that Americans are lonelier than ever. But Mark genuinely believes that AI friends can replace real friends. I'm not here to wax philosophically about whether or not AI can replace human contact. But this whole conversation does have me thinking about the ever-changing value of social media. I've often seen social media compared to cigarettes. The comparison is easy; they're both impossibly addictive; people zombified by their phones are almost as annoying as people smoking a cig; both have deleterious health effects; a lot of people think that children shouldn't have access to either; and both are a problem only because of clever marketing schemes. I've been playing around with Mastodon lately, and I used Facebook, Instagram, Tumblr, and Twitter in their glory days last decade. Inspired by the usability of and lack of user-hostile dark patterns in Mastodon, I recently scrolled my partner's Instagram and Facebook feeds to see just how much things have changed since I left pre-2020. And that got me thinking: is social media in general the problem? Or is it just the twisted, manipulative, deeply psychologically problematic state of Big Social Media, or as I think of it... post-social social media? To explain my thoughts, let's take a little walk through the history of tobacco.]]></summary></entry><entry><title type="html">The Crossland CC1 Review</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/05/11/the-crossland-cc1-review/" rel="alternate" type="text/html" title="The Crossland CC1 Review" /><published>2025-05-11T20:13:13+00:00</published><updated>2025-05-11T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/05/11/the-crossland-cc1-review</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/05/11/the-crossland-cc1-review/"><![CDATA[<p>I've been using a Crossland CC1 just about daily as my home espresso machine since 2020. The CC1 is my first "real" machine, having begun my home espresso journey with my <a href="/blog/EC-155-REVIEW-HERE">Delonghi EC155</a> back in 2013 (and having begun my espresso journey in general when I got a job at Chrissy Beanz in Sackets Harbor back in 2012).</p>

<p>Overall, I highly recommend the CC1. It is a well-priced, well-featured, reliable, thoughtfully designed espresso machine that, perhaps most importantly, pulls a damn fine shot of espresso and froths a damn fine pitcher of milk.</p>

<p>The CC1 does have some downsides. This post explores those downsides in detail. But my overall assessment remains: <em>if you have the means, I highly recommend it</em>.</p>

<!-- readmore -->

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/01.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/01.webp" alt="the coffee station, complete with Niche Zero, tamping mat, and a lovely little knock box/tamper/WDT tool station" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the coffee station, complete with Niche Zero, tamping mat, and a lovely little knock box/tamper/WDT tool station</figcaption>
</figure>

<h2 id="specifications">Specifications</h2>

<p>Let's begin with the basics. What is the CC1?</p>

<ul>
  <li>measures:
    <ul>
      <li>15.6" high (not including overhead space, perhaps 4-5", you might want for mugs on the top-level warming tray)</li>
      <li>12.6" deep (not including the portafilter; when mounted, it adds an extra 2.8" of depth)</li>
      <li>9.1" wide (not including space needed to use the frothing wand and reach the power switch, perhaps 2-4" depending on your steaming needs)</li>
    </ul>
  </li>
  <li>two shiny plastic button-dials (buttons that also spin as dials) and a very basic LCD display on the front; a power switch at the rear right side; a steam wand control dial at the top right, near the front</li>
  <li>a 58mm industry standard portafilter with mounting hardware almost, but not entirely unlike that of the Rancilio Silvia -- in my experience, you <em>can</em> mount a Silvia portafilter... until one day it slips and you have to clean up a very messy depressurization</li>
  <li>a ~1.7L water tank, accessible behind the portafilter mount only when the portafilter is NOT mounted -- when mounted, you can only pull the tank out an inch or so</li>
  <li>a plastic drip tray with a stainless steel grate that holds perhaps a quarter of a liter, since the solenoid drains through a hole cut into the back side of the tray about 2/3 of the way up the tray</li>
  <li>~4.2" of space between the drip tray grate and the bottom of the included portafilter; with a bottomless portafilter, this increases to ~4.8"</li>
  <li>a right-side-mounted, thermoblock-powered, single hole outlet frothing wand</li>
  <li>a 500mL stainless steel boiler</li>
  <li>3 programmable shot settings, named "1 Cup Espresso", "2 Cup Espresso", and "Pod" (the names are meaningless and only serve to distinguish the settings)</li>
  <li>solenoid that drains lingering puck liquid out of the portafilter into the drip tray</li>
  <li>designed by Bill Crossland, who helped design the GS3 at La Marzocco
    <ul>
      <li>simple compared to Breville/Sage or Decent; more repairable and hackable than most computerized espresso machines</li>
    </ul>
  </li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/04.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/04.webp" alt="ample space on the heating tray for 2-5 mugs, depending on diameter" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">ample space on the heating tray for 2-5 mugs, depending on diameter</figcaption>
</figure>

<h2 id="design">Design</h2>

<p>Perhaps usage should come first, but I would argue that you (not to mention every visitor in your home) will likely spend more time <em>looking</em> at the CC1 than using it. Unless you hide it in a cabinet or have a devastatingly serious caffeine problem. As a prominent member of your household, likely in your kitchen, living room, dining room, or an office, the CC1 is... passable. It is not ugly. It is quite possibly generic. Espresso aficionados, myself excluded, will not be impressed by the look of the CC1. It is utilitarian enough that it does not inspire envy. But you will also not be entirely embarrassed.</p>

<p>Standards are high in the espresso machine design world. Rocket, Rancillio, La Marzocca, even Gaggia make handsome, even beautiful machines. Walnut gleams. Steel shines with a mirror polish. Glass tastefully bends light. Beautiful? Sure. Fun to keep clean? I'll reserve my opinion.</p>

<p>Fellow is bringing a new sense of minimalist aesthetics to the space this very year with a new, gorgeous machine. Grinders made by Fellow, Niche, Baratza, Sette, and Eureka are, at a minimum, clean and industrial, but often clear the bar to beautiful. Even utilitarian grinders like the DF64/54 look impressive in the right context. And of course almost every other coffee accessory adheres to that same spare aesthetic, from the V60 pourover, to the classic moka pot design, to a wide variety of french presses, to the new wave of intelligent almost-pourover drip machines, to the crop of gooseneck kettles whose sale price outpaces inflation by over 100%. Each looks thoughtfully and carefully designed, right down to the Stagg snake game.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/06.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/06.webp" alt="fahrenheit temperature on display at all times" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">fahrenheit temperature on display at all times</figcaption>
</figure>

<p>Not the CC1. The CC1 looks a bit like a Gameboy, a labelmaker, and a Gaggia Classic had a baby. The side panels have give, much like the panels on an old Saturn. The LCD feels like an overstocked part from 1999. The button-dials are made of shiny plastic, which does eventually start to wear off. The portafilter is plastic. The drip tray, despite its top stainless steel grate, is unapologetically plastic. Even the "Crossland" logo font on the front plastic looks like the logo of a dead, long-forgotten office tech company you'd spot on the side of an unloved spare office coffee mug in Office Space.</p>

<p>In a way, the CC1 is reminiscent of some of the greats of the coffee world, though. The Aeropress. The Decent espresso machine. The Clever. None win design awards. Each is intelligently designed to use basic, simple materials to their best effect, minimizing weight, heat retention, cleaning effort, and potential drop damage. Sure, you aren't going to toss your CC1 in your hiking backpack and haul it 30 miles like an Aeropress. But it is an appliance you'll keep on a counter and regularly clean off. Doesn't it make sense to use materials that are easy to clean and maintain?</p>

<p>If you want a machine that is objectively beautiful, that non-espresso nerds and espresso nerds alike will fawn over in your home, that inspires lust and envy, the CC1 is not your machine. But if you can tolerate a rock-solid, reliable, and steady appliance -- like a refrigerator or a dryer or a lawnmower -- the CC1 is worth your time.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/11.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/11.webp" alt="even the generic machine profile has a certain pleasing brutalist form from the right direction" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">even the generic machine profile has a certain pleasing brutalist form from the right direction</figcaption>
</figure>

<h2 id="workflow">Workflow</h2>

<p>The workflow of the CC1 is well-considered, with a couple of quirks.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/03.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/03.webp" alt="portafilter and steam wand closeup" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">portafilter and steam wand closeup</figcaption>
</figure>

<h3 id="shots-shots-shots-shots-shots">Shots Shots Shots Shots Shots</h3>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/07.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/07.webp" alt="2 cup espresso setting (configurable to the same parameters as 1 cup espresso and pod)" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">2 cup espresso setting (configurable to the same parameters as 1 cup espresso and pod)</figcaption>
</figure>

<p>To pull a shot:</p>

<ol>
  <li>Dismount the portafilter, pour coffee into the basket, and tamp a puck.</li>
  <li>Mount the portafilter, select your shot setting by turning the right button-dial, and wait for the boiler to reach temperature (if it is not already there).</li>
  <li>When the boiler reaches temperature, the machine emits a slightly harsh (but not especially loud) microwave-like <em>BEEP</em>. You are now ready to pull a shot.</li>
  <li>Press the front-right button-dial (marked 'menu/start') to begin a shot.</li>
  <li>Press it again to end the shot prematurely, or wait until you reach your setting's programmed shot time to end the shot automatically. The solenoid will drain the vast majority of liquid from the basket, emitting a faintly unpleasant gurgling sound almost, but not entirely unlike the sounds emitted by the <a href="https://muppet.fandom.com/wiki/Bog_of_Eternal_Stench">Bog of Eternal Stench</a>.</li>
</ol>

<p>I strongly recommend configuring a long shot time, up to the maximum of 100 seconds, so you can always pull your shots long if you want to. Otherwise, there's no 'snooze' button to keep the current shot going, and the solenoid will drain potentially tasty long-pulled shots into your drip tray.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/08.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/08.webp" alt="pod setting has literally nothing to do with pods; just a limitation of the hardware" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">pod setting has literally nothing to do with pods; just a limitation of the hardware</figcaption>
</figure>

<p>Fortunately, the CC1 isn't very picky. I've had success with multiple grinders, from a Orphan Espresso Lido 3, to a Knock Aergrind (!!), all the way to the home barista favorite Niche Zero. Shots pull reliably using the same grind setting, and the shower screen seems to do a decent job preventing the worst of channeling.</p>

<p>The programmable PID (and the always-on temperature display) only support Fahrenheit, which I suppose is over twice as precise as Celsius. But I like to keep my kettle on Celsius, so it's mildly annoying that they don't match.</p>

<p>You can configure preinfusion up to 5 seconds, and a 'waitting time' (yes, that is what the display reads) between preinfusion and shot pulling of up to 10 seconds. 5 and 5 work well for me.</p>

<p>I really love the on-screen timer that keeps track of how long your current shot has been pulling. Now that I'm used to it, I find it annoying to keep track of shot times any other way! However, when you're using a setting with configured preinfusion, be aware that both the preinfusion and waitting time 'count' as part of your shot time. So if you use 5/5 preinfusion/waitting like me, you may want to aim for more like 40-45 second total shot times, according to the timer.</p>

<h3 id="milk">Milk</h3>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/05.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/05.webp" alt="when she says 'steam ready'" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">when she says 'steam ready'</figcaption>
</figure>

<p>The steam wand works well. Being a thermoblock (basically a heating element wrapped around the water pipe that connects the wand to the boiler), you won't get super-powerful steam. But you can froth milk beautifully, and since the temperature isn't insanely hot, it's both safer and a little slower, which honestly makes it easier to practice your frothing.</p>

<p>To steam:</p>

<ol>
  <li>
    <p>Turn the right button-dial to the "steam" setting.</p>
  </li>
  <li>
    <p>Click the right button-dial to begin heating the thermoblock.</p>
  </li>
  <li>
    <p>When you hear a beep, the 'steam ready' icon will appear on the screen. This means the thermoblock is up to temperature.</p>
  </li>
  <li>
    <p>Turn the steam dial clockwise to open the steam valve and begin steaming.</p>
  </li>
</ol>

<h2 id="maintenance">Maintenance</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/09.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/09.webp" alt="ample space for more stickers on the non-steam side" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">ample space for more stickers on the non-steam side</figcaption>
</figure>

<p>First, the water tank is a bit awkward. It's big, so you don't have to refill it very often. But when you <em>do</em> refill it, you should know that removing the entire tank is a big mistake. Instead, pull it out about halfway, and fill it up from a water bottle or a kettle. This way, you don't have to pull out the water intake or outtake tubes, and you won't accidentally crimp them, and you won't spill water from the tubes on the machine or your coffee station!</p>

<p>Second, the documentation and community is better than I'd expect for such a niche product. I've used the manual, some forum posts, and my keen sense of smell to replace a thermal fuse (twice!) and track down a loose gasket. Considering I've never done espresso machine repair work before that and the machine is still running well a few years later, I'm impressed. You used to be able to buy parts from Seattle Coffee Gear, but recently Pantechnicon Design has taken over distribution; both sources are good, small companies that you can trust. And thanks to Pantechnicon, the CC1 now comes <a href="https://www.pantechnicondesign.com/products/crossland-cc1">in black</a>!</p>

<p>By default, when connected to power, the machine is completely off, and none of the buttons do anything. Press the power switch on back right to turn it on. Fortunately, the switch is easy to toggle even if your CC1 is tucked under a counter with things around it. Even better, the switch feels solid and has no obvious wear after years of daily use.</p>

<p>After 5+ years, with minimal maintenance (occasionally running descaler through the system, using a puck screen to reduce oil backflush, cleaning when the machine gets dirty enough to annoy me), my CC1 is still running very strong, with no obvious problems. If it died tomorrow, I'd buy another. Amortized coffee drinks over 5+ years for two people translate to less than 10 cents per drink (not including the milk or coffee!). And I've gotten way better at pulling shots, estimating grind settings for different roasts, steaming milk, and pouring latte art. Not a bad buy at all.</p>

<p>For maintenance, you can access the interior through the top of the machine, under the warming tray, by removing a grate, loosening 6 screws, and removing a stainless steel panel. The interior consists of some plastic tubing, some copper tubing, a motherboard, a display daughterboard, and some wiring to connect all of that with the buttons, steam wand controls, group head, boiler, and display.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_05_11/02.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_05_11/02.webp" alt="when the chassis is boring old stainless steel, why not sticker bomb?" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">when the chassis is boring old stainless steel, why not sticker bomb?</figcaption>
</figure>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I've been using a Crossland CC1 just about daily as my home espresso machine since 2020. The CC1 is my first "real" machine, having begun my home espresso journey with my Delonghi EC155 back in 2013 (and having begun my espresso journey in general when I got a job at Chrissy Beanz in Sackets Harbor back in 2012). Overall, I highly recommend the CC1. It is a well-priced, well-featured, reliable, thoughtfully designed espresso machine that, perhaps most importantly, pulls a damn fine shot of espresso and froths a damn fine pitcher of milk. The CC1 does have some downsides. This post explores those downsides in detail. But my overall assessment remains: if you have the means, I highly recommend it.]]></summary></entry><entry><title type="html">Install the Pebble App Persistently on iOS</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/03/18/pebble-app-persistent-install/" rel="alternate" type="text/html" title="Install the Pebble App Persistently on iOS" /><published>2025-03-18T20:13:13+00:00</published><updated>2025-03-18T20:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/03/18/pebble-app-persistent-install</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/03/18/pebble-app-persistent-install/"><![CDATA[<p>This guide explains how to permanently install the Pebble app on a new iPhone, assuming you already downloaded the Pebble app from your Apple ID/Account at some point in the past.</p>

<p>I've had this written up in a text file on my laptop for a few years now. Given the announcement of new Pebbles today, I figured I'd share this, in case anyone else was inspired to use their Pebble again but got stuck on the Pebble app installation on iOS. Hopefully Eric &amp; co will have <a href="https://github.com/pebble-dev/mobile-app">Cobble</a> up and running soon, providing an easier way to use old and new Pebbles on iOS. But for now, this works on my 13 Mini and served me well for a couple of years on my old 2016 SE.</p>

<!-- readmore -->

<p>If you still use a Pebble smartwatch like I do, you may have experienced this same frustration.</p>

<p>You downloaded the Pebble app years ago, when Pebble Inc. still existed.</p>

<p>Several years later, Pebble Inc collapsed. The app stopped receiving updates. All was OK.</p>

<p>Eventually, Apple <a href="https://arstechnica.com/gadgets/2022/04/apple-moves-to-delist-older-app-store-apps-frustrating-developers/">delisted</a> the Pebble app, hiding it from users who hadn't already downloaded it. Fortunately, folks who'd already downloaded the Pebble app could still download it whenever we upgraded phones or reinstalled iOS. Unfortunately, new users were totally locked out from downloading or installing the Pebble app, as were new Apple IDs.</p>

<p>Several years later, Apple finally removed the ability to download the Pebble app <em>at all</em> via the App Store, even for users who downloaded it back when the company was alive. The only way to get an iPhone to pair with a Pebble watch suddenly became... <a href="https://help.rebble.io/sideload-ios-app/">sideloading the app</a>... which, unless you pay $100 a year for a developer certificate, you have to repeat every 7 days, because Apple only allows unofficial devs to sign an app for 7 days at a time. (remind me how we own our iPhones, after paying hundreds of dollars for them?)</p>

<p>Fortunately, there's still a way to get the original Pebble Inc-signed app loaded onto your phone <em>if you downloaded the Pebble app previously through the App Store</em>. It's still compatible all the way up to iOS 18, even on the newest iPhone, the 16e. I've never tried using the Pebble app with an iPad, but it might even work with that.</p>

<h2 id="get-the-app">Get the App</h2>

<p>You can follow <a href="https://gist.github.com/minif/473310d7c556caadf4f2ed2d97389574">this tutorial</a> to download the Pebble app's IPA file from Apple using iMazing. To speed things up, skip the tedious "find the App ID" section: I can confirm that the Pebble App ID is <code class="language-plaintext highlighter-rouge">957997620</code>.</p>

<p>Because I'm not 100% sure how long that gist will stay up, I'm repeating the important steps below:</p>

<ol>
  <li>
    <p>Download <a href="https://imazing.com/download">iMazing</a>.</p>
  </li>
  <li>
    <p>Install iMazing onto your computer.</p>
  </li>
  <li>
    <p>Plug your iPhone into your computer. Enter your passcode and 'trust' the computer from the dialog on your phone, if you haven't already.</p>
  </li>
  <li>
    <p>Open iMazing. If prompted to back up your device, select "Later".</p>
  </li>
  <li>
    <p>Select "Manage Apps".</p>
  </li>
  <li>
    <p>Sign into your Apple ID. If you use a hardware key (e.g. a Yubikey) for 2FA, login will fail, never allowing you to use 2FA. To solve this, you must first remove your hardware keys from your Apple ID (when I did this, Apple made me wait in the corner for an hour for security/shame), then login using SMS 2FA.</p>
  </li>
  <li>
    <p>Wait for a list of installed apps to appear. Note which apps use green checkmarks here (consider taking a screenshot) -- we <em>can't</em> use green checkmark apps for the duplication step later on in this guide).</p>
  </li>
  <li>
    <p>Close out of iMazing.</p>
  </li>
  <li>
    <p>In a terminal or Finder, navigate to <code class="language-plaintext highlighter-rouge">~/Library/Application Support/iMazing/Library</code>.</p>
  </li>
  <li>
    <p>Delete <code class="language-plaintext highlighter-rouge">Apps.plist.backup</code>.</p>
  </li>
  <li>
    <p>Open <code class="language-plaintext highlighter-rouge">Apps.plist</code> in a <a href="https://en.wikipedia.org/wiki/Property_list">Plist</a> editor. I used (and recommend) <a href="https://www.fatcatsoftware.com/plisteditpro/">PlistEdit Pro</a>, which you can install via brew with <code class="language-plaintext highlighter-rouge">brew install --cask plistedit-pro</code>.</p>
  </li>
  <li>
    <p>We need to add the Pebble app to this list. To do this, complete the following steps:</p>

    <ol>
      <li>Choose an app to duplicate and replace with the Pebble App. This shouldn't risk app data, but you should choose a low-risk app in case something goes wrong (don't duplicate your bank or password manager app!). Remember to choose one marked with a <strong>grey</strong> checkmark, not a <strong>green</strong> checkmark, in iMazing -- check the screenshot you took before to be sure.</li>
      <li>Duplicate the app's entry in the plist file. Right click the app entry and select <strong>Duplicate</strong> from the context menu.</li>
      <li>Change the App ID of the duplicate entry to the App ID of the Pebble app (957997620). You don't have to change the other fields, but I changed the name to "Pebble App" and removed most other fields.</li>
      <li>Save your changes to the plist.</li>
    </ol>
  </li>
  <li>
    <p>Open iMazing and open the "Manage Apps" screen for your iPhone.</p>
  </li>
  <li>
    <p>You should see a broken app entry with a default graph-paper icon that has the same name as the app you duplicated. Click the cloud-inscribed-with-a-downward-arrow on the right side of the entry to download the app. If you didn't log into your Apple ID before, you'll have to login before you can download the app.</p>
  </li>
  <li>
    <p>Close and reopen iMazing.</p>
  </li>
  <li>
    <p>Click the trash can icon next to the Pebble app to delete it -- unfortunately, the first download is always broken (I told you this was a bit of a hack).</p>
  </li>
  <li>
    <p>Click the cloud-inscribed-with-a-downward-arrow button to download the Pebble app again.</p>
  </li>
  <li>
    <p>Right click on the Pebble app entry and select "Install" to install the Pebble app onto your phone.</p>
  </li>
  <li>
    <p>(Optional, recommended) Right click on the Pebble app entry and select "Export .IPA" to save a copy of the IPA file used to install the app to your device. You now have an IPA file of the delisted app, signed with the original developer account keys, targeting your iPhone's CPU hardware, signed for your specific Apple ID! This is only useful for your Apple ID, and only for a subset of iOS devices. But for your currently-connected iPhone, you can always reinstall this IPA file to install the Pebble app.</p>
  </li>
  <li>
    <p>Follow the <a href="https://help.rebble.io/setup-ios/#2">Rebble iOS setup guide</a> (starting with step 2) to use Rebble's backend services to download and install watchfaces and Pebble OS updates onto your Pebble.</p>
  </li>
</ol>

<p>If you use an Android phone, your life is much easier: find a legitimate APK file for the Android Pebble app, and it should install onto any modern phone. If have a copy, if you can't find a trusted one anywhere else.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[This guide explains how to permanently install the Pebble app on a new iPhone, assuming you already downloaded the Pebble app from your Apple ID/Account at some point in the past. I've had this written up in a text file on my laptop for a few years now. Given the announcement of new Pebbles today, I figured I'd share this, in case anyone else was inspired to use their Pebble again but got stuck on the Pebble app installation on iOS. Hopefully Eric &amp; co will have Cobble up and running soon, providing an easier way to use old and new Pebbles on iOS. But for now, this works on my 13 Mini and served me well for a couple of years on my old 2016 SE.]]></summary></entry><entry><title type="html">Book Review: The Power Broker</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/01/22/the-power-broker/" rel="alternate" type="text/html" title="Book Review: The Power Broker" /><published>2025-01-22T10:13:13+00:00</published><updated>2025-01-22T10:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/01/22/the-power-broker</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/01/22/the-power-broker/"><![CDATA[<p><em>The Power Broker</em> is probably one of the largest books I have ever read. I suspect it's one of the largest books <em>anyone</em> has read, since it likely stretches the physical bounds of 'pages attachable to a book spine'. Spread across 1156 pages, the 700,000 tiny tiny words of <em>The Power Broker</em> measure up to:</p>

<ul>
  <li>200% the length of the entire <em>The Lord of the Rings</em> series</li>
  <li>a similar length to all six <em>Dune</em> books (including Frank's son's not-very-canon trilogy)</li>
  <li>2/3 the length of the entire <em>The Expanse</em> series</li>
  <li>a little less than half the length of the 5 published <em>A Song of Ice and Fire</em> books</li>
</ul>

<p>All in one nonfiction book. All about one person. Reality is dense!</p>

<!-- readmore -->

<p>Despite appearances, this is not a biography. It's actually an epic fantasy series that happens to be true. A young man grows with aspirations of grandeur, gets shot down as a young hopeful idealist, turns to the dark side for power, wins victories despite the odds, betrays his mentors, smashes the corrupt status quo, and replaces it with an entirely new, different, but also corrupt status quo. And that's just the first 400 pages! I haven't even gotten to the bits that discuss urbanism, racism, unjust evictions, and theatre.</p>

<p>Any American with a passing interest in cities ought to know the name 'Robert Moses'. Since <em>The Power Broker</em> launched, Moses' name has (d)evolved into a slur for greed, egotism, lack of accountability, elitism, and racism. When I lived in NYC, most of my friends hadn't read <em>The Power Broker</em>. But somehow most knew that Robert Moses was "that guy who built the parkway bridges too low for buses, to stop poor people from visiting Long Island parks".</p>

<p>Perhaps that legacy is a fair one for Robert Moses, if you're forced to summarize his 40+ years of public service in a single sentence. But if you, like me, hunger for more explanation of how, why, and when he did that, <em>The Power Broker</em> will more than satisfy your appetite.</p>

<p>I won't try to break down all 700,000 words for you here. Instead, I'll focus on some of my favorite highlights and facts from the book.</p>

<h2 id="flair">Flair</h2>

<p>One thing that Moses did well? Flair! Whether he launched a park, a playground, a pool, a theatre, a beach, a highway, a bridge, or his personal nemesis: a tunnel, he made a big deal out of it. Politicians loved this, as one of the best ways to win yourself votes is <a href="https://99percentinvisible.org/episode/the-power-broker-04-rep-alexandria-ocasio-cortez/transcript/">NIPL (noticeably improving people’s lives)</a>. Most of us can learn from this in our lives and careers: when you sink hours upon hours in something, it's OK to celebrate it! If you, like me, have a tendency to be a bit meek about your accomplishments, remember that you really ought to occasionally put on the ego hat and show some pride in your work.</p>

<p>Of course, you must remember to remove the ego hat at some point. Preferably before you permanently hurt the lives of hundreds of thousands of strangers and chop deep scars in a city with your "Meat Axe".</p>

<h2 id="pettiness">Pettiness</h2>

<p>Moses, of course, was born wearing the ego hat, and likely died wearing it. One side effect? Once he became powerful enough, his wrath became terrible, his retribution swift: whether you were a random secretary (not even employed by Moses!) who brought him bad news, a politician who refused to play ball, or a member of the press who asked an inconvenient question, he would not hesitate to <em>crush</em> you. If you were lucky, he'd just spread rumors that you were a Communist and hope that destroyed your career. If you weren't lucky, he'd get you fired or <em>physically punch you</em>.</p>

<p>Oh, and if you committed the sin of being his literal brother? He might do all of those things, blackball you from your industry and public service forever, and let you die penniless.</p>

<p>Lesson learned: Robert Moses was a jerk. Don't be a jerk.</p>

<h2 id="politicians-are-children">Politicians are Children</h2>

<p>This book humanizes American political figures in the strangest ways:</p>

<ul>
  <li>FDR takes every opportunity he can to take revenge on someone he finds annoying</li>
  <li>NYC mayors are exposed for what they really are:
    <ul>
      <li>corrupt fools (O'Dwyer, Wagner)</li>
      <li>helpless children (<a href="https://en.wikipedia.org/wiki/Vincent_R._Impellitteri">Impy</a>)</li>
    </ul>
  </li>
  <li>Al Smith was a total bro with nepotistic tendencies towards his singing and walking buddies</li>
</ul>

<p>Biographies of all of these figures provide very different impressions of their character. But Robert Caro isn't a guy who makes shit up. So I'm forced to believe both sides: these politicians were very capable, but occasionally acted like complete children. And it seems that Robert Moses drew out the most childlike tendencies in mayors, governors, and even presidents.</p>

<h2 id="how-the-sausage-gets-made-urban-highway-edition">How the Sausage Gets Made (Urban Highway Edition)</h2>

<p>Caro's depiction of 'relocation' (honest term: eviction) to pave way for massive projects in NYC hit me particularly hard. In the abstract, I knew that moving (tens of) thousands of people to build a new highway was a messy business. It takes time. Plenty of people get screwed over, mostly the people in the most precarious situations. Some people wind up homeless.</p>

<p>But Caro's descriptions of the living situations forced upon people during the construction of the Cross-Bronx Expressway legitimately gave me nightmares. You really need to read the entire chapter to fully understand, but one quote from Chapter 41: <em>Rumors and the Report of Rumors</em> ought to give you some small nightmares of your own:</p>

<blockquote>
  <p>Baby screamed; rat in crib.</p>
</blockquote>

<p>If your interest has been piqued, check out Chapter 37: <em>One Mile</em> (and Chapter 38: <em>One Mile: Afterward</em>). You really need to read the full chapter to understand:</p>

<ul>
  <li>the neighborhood character of East Tremont before the highway project</li>
  <li>the under- and heavy-handed way that Moses forced people out of their homes (even when they had nowhere else to go)</li>
  <li>the cruelty in Moses' refusal to consider any modifications to his highway plan to preserve homes and human connection (even when those modifications wouldn't cause any cascading problems in the project)</li>
  <li>the way that urban highways devastated neighborhoods well after the cacophony of construction ended</li>
</ul>

<p>This is the emotional core of the book. If you've searched for an apartment in any American city, this will hit you hard.</p>

<h2 id="doing-things-is-hard">Doing Things is Hard</h2>

<p>Oddly, this is one area where the book builds empathy for Moses. I don't think that's an accident. Completing large scale projects in NYC is expensive, inconvenient, and necessitates compromise. When Moses started his public 'service' in the early 20th century, <a href="https://en.wikipedia.org/wiki/Tammany_Hall">Tammany Hall</a> corruption essentially ran New York State. Corruption, money, and power were tools of the political trade! And Moses largely mastered those tools.</p>

<p>Over and over again, the book reinforces that without the machinations of Moses, we wouldn't have a huge number of parks in Long Island, NYC, and even upstate. He is personally responsible for the vast majority of playgrounds in NYC. He renovated Central Park when it was full of garbage, bare dirt, and <a href="https://web.archive.org/web/20190502153433/http://www.nypress.com/local-news/20160928/sheep-meadows-once-woolly-denizens">allegedly deformed sheep</a>, adding baseball fields and paths and bathrooms. Without Moses, we certainly wouldn't have managed to build half the urban highways in NYC (and perhaps the rest of the country, since most other cities adopted the "Moses Method" at the height of his power).</p>

<h2 id="opportunity-cost">Opportunity Cost</h2>

<p>That last section might have you thinking that the world is better off thanks to Moses contributions. Parks are great! Playgrounds are great! Deformed sheep are scary! Highways kind of suck, but in a world where the automobile is the only way to get around, they are a necessity.</p>

<p>But regardless of how you feel about those various projects, Moses' true legacy isn't what he built. It's what he <em>didn't</em> build -- and what, by extension, nobody was able to build because Moses effectively controlled the largest sources of revenue in NYC and NY state from the early 1930s through the mid 1960s:</p>

<ul>
  <li>subway extensions</li>
  <li>subway maintenance and facilities improvements</li>
  <li>light rail extensions</li>
  <li>light rail maintenance and facilities improvements</li>
  <li>tram extensions</li>
  <li>tram maintenance and facilities improvements</li>
  <li>playgrounds and parks in poor neighborhoods</li>
</ul>

<h2 id="bad-things">Bad Things</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/power_broker/mid-manhattan-expressway.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/power_broker/mid-manhattan-expressway.webp" alt="the mid-manhattan expressway, a bad thing that was never built largely thanks to jane jacobs (absent from this book due to an editorial decision) -- sourced from the Triborough Authority" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the mid-manhattan expressway, a bad thing that was never built largely thanks to jane jacobs (absent from this book due to an editorial decision) -- sourced from the Triborough Authority</figcaption>
</figure>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/power_broker/mid-manhattan-expressway-aerial-alt.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/power_broker/mid-manhattan-expressway-aerial-alt.webp" alt="aerial shot of an alternate mid-manhattan expressway route that did not literally cut through the 10th floor of the empire state building -- sourced from the Triborough Authority" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">aerial shot of an alternate mid-manhattan expressway route that did not literally cut through the 10th floor of the empire state building -- sourced from the Triborough Authority</figcaption>
</figure>

<p>OK, I might have lied a tiny bit in that last section. He also did some seriously bad things:</p>

<ul>
  <li>he ripped up tram tracks and removing trams from NYC entirely</li>
  <li>he saddled the subway system with massive crushing debt, then deprived it of city and state support so even after he lost power, the subway had (still has) to dig itself out of a deep dark funding hole of interest and bonds and extricate itself from a nightmarish governing system</li>
  <li>he refused to add space for subway or light rail extension along NYC metro area highways, even in rural areas where the extra space was cheap and easy to come by, ensuring that generations would have no choice but to take an automobile to the airport and exurbs</li>
  <li>he refused to heat certain pools in public parks as a result of a strangely specific racist belief that dark-skinned people don't like cold water (seriously, who <em>does</em>?)</li>
</ul>

<p>And then, y'know, the low bridges, the destroyed neighborhoods, the evictions, the misappropriation of city funds towards pet projects, the destruction of the last natural forest and last natural bog in NYC, the mental abuse of his employees and any city employees who got in his way, and Moses' (alleged) vampiric tendency to suck the will to live out of anyone with a soul who associated with him for more than a couple of years.</p>

<h2 id="losing-the-plot">Losing the Plot</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/power_broker/moses-and-the-mustache-stuart-constable.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/power_broker/moses-and-the-mustache-stuart-constable.webp" alt="robert moses and stuart constable, 'the mustache', who lost the plot of william shakespeare plays -- &lt;a href='https://professornerdster.com/power-broker-by-robert-caro-summary-analysis-of-chapter-44/'&gt;source&lt;/a&gt;" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">robert moses and stuart constable, 'the mustache', who lost the plot of william shakespeare plays -- <a href="https://professornerdster.com/power-broker-by-robert-caro-summary-analysis-of-chapter-44/">source</a></figcaption>
</figure>

<p>Even after he lost his power and positions, Moses couldn't understand why people hated him so much. Why? Because he lost touch. Nobody is all-powerful or all-knowing. We all have blind spots, biases, and make mistakes (logical and otherwise).</p>

<p>Contrast Moses with Abraham Lincoln, a man best known for <a href="https://presidentlincoln.illinois.gov/education/educator-resources/teaching-guides/lincolns-views-african-american-slavery/">revising his own racist beliefs</a>. Whether you're the President of the United States, a powerful CEO, or a low-down dirty peasant individual contributor peon like myself, you need to be willing to a) admit you were wrong and b) learn from other people. Clearly you can get a lot done even if you aren't willing to do that. But if you want to do the best things, you need help.</p>

<h2 id="great-things--terrible-yes-but-great">Great Things -- Terrible, Yes, but Great</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/power_broker/moses-map.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/power_broker/moses-map.webp" alt="the physical legacy of robert moses. probably not ley line runes designed to keep him immortal -- &lt;a href='https://www.nycurbanism.com/blog/2019/6/11/robert-moses-legacy-map'&gt;source&lt;/a&gt;" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">the physical legacy of robert moses. probably not ley line runes designed to keep him immortal -- <a href="https://www.nycurbanism.com/blog/2019/6/11/robert-moses-legacy-map">source</a></figcaption>
</figure>

<p>To quote a random Stack Exchanger, <a href="https://scifi.stackexchange.com/questions/35908/what-did-ollivander-mean-when-he-said-voldemort-did-great-things">"The word 'great' is actually a lot closer to 'big' than it is to 'good'."</a>.</p>

<p>Moses accomplished many <em>great</em> things. But they weren't necessarily <em>good</em> things. He's basically Voldemort.</p>

<h2 id="you-can-beat-the-game-should-you">You can Beat the Game; ...Should You?</h2>

<p>Remember struggling to beat a video game for hours and hours as a kid, and getting stuck on a difficult level? I spent days stuck on <a href="https://www.neoseeker.com/forums/4603/t201319-krakens-lair-ahhhhh/">certain bosses</a> or <a href="https://www.retrogamedeconstructionzone.com/2020/06/zork-i-commentary-and-puzzle-breakdown.html">puzzles</a>. In many cases, I didn't figure them out until I came back to the game months or years later with a different perspective.</p>

<p>But I remember one case vividly. I was struggling with the Helm's Deep level in The Battle for Middle Earth. Time and time again, I couldn't defend the Deeping Wall, I'd lose a giant chunk of my army and heroes, and Saruman's Uruk-Hai would wind up slaughtering my peasants and destroying the castle. I lost, time and time again. Eventually I wound up editing the game file to get myself past that level.</p>

<p>But that playthrough was permanently ruined. I kept playing for a bit, but it wasn't really my army that beat Helm's Deep. I just didn't care any more. Ultimately, I started a new game, and went back to beat Helm's Deep legitimately.</p>

<p>Similarly, I once ran a Minecraft server for some friends. We played survival, built some cool structures, and mined for all of our resources, splitting up tasks to acquire cobblestone, wood, sand, clay, and more to build our base. Every resource we needed was an adventure of itself. We optimised paths through the Nether to get to the desert or ocean faster. We created a water elevator down to the ideal level for diamond mining, and designed an approach to mining at that level to optimise the amount of diamonds we could find in any given hour in the space we had. We created farms for high XP enemies so we could continually gamble on the best enchantments for our gear, and keep it from ever degrading and needing replacement. We created a set of special pickaxes with the Silk Touch enchantment so we could mine "clean stone" instead of cobblestone for building projects that demanded a more concrete look.</p>

<p>But one day I decided I wanted to build something out of obsidian, a material that's awfully tedious to mine. But I didn't want to spend all day mining that obsidian. So I gave myself a bunch of stacks of obsidian using the server console. Then I built my wizard tower.</p>

<p>That day, I lost my interest in the server. I ultimately destroyed the structure (manually) and revived the server months later. But the magic was gone.</p>

<p>Robert Moses built a sprawling, self-sustaining power structure across at least 13 authorities and government positions in New York state and City government over 45 years in public service. He found a true "hack" to fund and plan his goals: the public authority, an entity somewhere in between a government and a corporation, capable of selling effectively infinite tax-free bonds to leverage bridge toll revenue into hundreds of millions of dollars of government projects.</p>

<p>At the time, I'm sure Moses thought he was doing the right thing: cutting out the corrupt politicians, the NIMBYs, the graft, and the meddlers who pushed for favors. In control of the Triborough Authority, he could finally focus on his projects without all of those distractions!</p>

<p>But as aggravating and motivation-destroying as those distractions can be, they represent democracy. The will of the people. Those distractions are the (admittedly imperfect) way that the people have a voice in our government.</p>

<p>The day that Robert Moses made himself immune to those distractions, he walled himself off from democracy and the will of the people. Like the fabled <a href="https://en.wikipedia.org/wiki/Benevolent_dictator_for_life">BDFL (benevolent dictator for life)</a> in software, public projects became the product of one mind alone: Moses'.</p>

<p>But no human being is all-knowing. Any single person needs those distractions to keep them on the right course.</p>

<p>Just like how when I played those video games, the fun wasn't the end state, where the thing was built and I got to look at it, or the boss or level was defeated. The fun was in the adventure to get those resources and the struggle to beat the hard thing, and the memories I made and the things I learned to get there.</p>

<h2 id="50-years-later">50 Years Later</h2>

<p><em>The Power Broker</em> debuted in 1974, now 50 years past. At the time, Moses' legacy was apparent in NYC in a truly dark time for the city, when crime ran amok. The subways were covered in graffiti. Times Square exposed more flesh than the Naked Cowboy. The murder rate was an awful lot higher than it is today. At the time, it was tempting to lay blame for many of those problems at the feet of Robert Moses.</p>

<p>Today, after 20 years of safety and prosperity in NYC, it's not as tempting to blame Moses for quite as many of those social ills. But it is easier in hindsight to see how Moses steered the city for the last century:</p>

<ul>
  <li>The neighborhoods of the Bronx, Queens, and Brooklyn will forever bear the scars of Moses' highways. Chopped up by Moses' "Meat Axe", neighborhoods, families, and friends never quite recovered. But the scars are starting to heal. Upstate, in Syracuse and Buffalo, Moses-inspired urban highways are being removed from city centers. The West Side Improvement has been improved some more. The urban blight that so devastated the Bronx, Queens, and Brooklyn has eased.</li>
  <li>Despite having the best public transit in the entire nation and remarkable walking-friendly density, NYC is still completely full of cars. Congestion pricing in the absolute heart of that city -- south of 60th in Manhattan -- was an is a controversial struggle. It will likely be rolled back due to federal meddling within days of this post.</li>
  <li>The subway stopped expanding in the 30s. A century later, we've spent literal billions to create perhaps one mile of total new subway. We also spent billions to create the AirTrain to JFK, which costs more than the subway and isn't even a part of the same system. The outer boroughs, including all of Staten Island, are completely omitted from the subway system. Building a new line <em>on existing track</em> to connect Queens and Brooklyn is controversial and will take decades if it ever gets built. There are no rail tracks whatsoever that go to LGA, only relatively inconvenient buses, even after spending billions to 'upgrade' the airport. The one proposal by yet-another-corrupt politician to connect LGA to the light rail network was so dumb, even train lovers couldn't endorse it. No politician has yet given the <a href="https://secondavenuesagas.com/2014/02/06/revisiting-an-n-train-extension-to-laguardia/">N extension through North Astoria or down Grand Central Parkway</a> enough credit to prove itself.</li>
  <li>The subway has continued to defer basic maintenance since the 30s, and our corrupt egotistical government wasted our <a href="https://secondavenuesagas.com/2020/02/28/what-andy-byford-showed-new-york-and-where-it-all-goes-from-here/">last big chance to fix it</a>.</li>
  <li>Most importantly, for most residents of New Jersey, Long Island, Connecticut, and the Hudson River Valley, you need a car to visit NYC. Even if it's just to drive to light rail or a bus stop. That's a direct result of Moses' decision to prioritise highways over any other method of transportation. Even though highways scale poorly, don't support the throughput needed for the NYC metro area, and there's no good place to dump tens of millions of vehicles in NYC's downtown areas where people commute for work. As long as NYC and its surrounding suburbs don't work together to improve transportation (read: prioritise high-throughput modes like trains, buses, bikes, and yes, walking with your feet), car dependence will limit NYC (and the lungs of the people who live there).</li>
</ul>

<p>There's plenty of other takeaways from this book. But these are mine. If the NYC metro area or America's car dependence interest you, I recommend no book higher than this one. The writing is clear. The story is compelling. The book is heavy, and will start conversations at coffee shops. There's also an ebook now.</p>

<h2 id="book-club">Book Club</h2>

<p>If you enjoy book clubs or discussions and none of your friends are willing to read this enormous tome, I couldn't recommend 99 Percent Invisible's <a href="https://web.archive.org/web/20250104104915/https://99percentinvisible.org/club/">Breakdown: The Power Broker</a>. The podcast itself is fantastic, but this series is particularly good. Each episode breaks down <em>The Power Broker</em> into one of 12 (relatively) bite-sized pieces, discusses that section, and features a guest discussion related to the broad strokes. The hosts are intelligent and occasionally quite funny. The guests provide extra context. It's very close to what college literature seminars were supposed to be, and reminds me a lot of a previous 'online book club', the <a href="https://reactormag.com/columns/malazan-reread-of-the-fallen/">Malazan Reread of the Fallen</a>.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[The Power Broker is probably one of the largest books I have ever read. I suspect it's one of the largest books anyone has read, since it likely stretches the physical bounds of 'pages attachable to a book spine'. Spread across 1156 pages, the 700,000 tiny tiny words of The Power Broker measure up to: 200% the length of the entire The Lord of the Rings series a similar length to all six Dune books (including Frank's son's not-very-canon trilogy) 2/3 the length of the entire The Expanse series a little less than half the length of the 5 published A Song of Ice and Fire books All in one nonfiction book. All about one person. Reality is dense!]]></summary></entry><entry><title type="html">The Day Google Killed the Pixel 4a</title><link href="https://www.lambdalatitudinarians.org/techblog/2025/01/09/the-day-google-killed-the-pixel-4a/" rel="alternate" type="text/html" title="The Day Google Killed the Pixel 4a" /><published>2025-01-09T10:13:13+00:00</published><updated>2025-01-09T10:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2025/01/09/the-day-google-killed-the-pixel-4a</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2025/01/09/the-day-google-killed-the-pixel-4a/"><![CDATA[<p>In 2025, Google killed the Pixel 4a.</p>

<!-- readmore -->

<p>1.5 years after the last security update for the Pixel 4a and its apparent end of software support and life, Google pushed an update that breaks battery percentage reporting, limits charging speed to 1A (!!!), adds obnoxious warnings to the UI, and permanently limits the maximum charge capacity of the battery. Many users report serious battery drain and capacity issues after the update, to the point where their phones are unusable.</p>

<ul>
  <li>Even using developer options, you can't permanently stave off this update; you will eventually start getting notifications to download and install it, and you will eventually accidentally grant it permission to install when you're sleepy or not 100%.</li>
  <li>Installing a new battery may or may not fix the issues caused by this update; nobody has successfully eliminated all of the warnings and issues yet, even people with relatively recently replaced batteries.</li>
  <li>Google may or may not pay for a new battery installation; it's unclear what kind of costs you might end up on the hook for depending on the phone repair shop you go to.</li>
  <li>Google might give you $50 through a third party program that likely gets more than $50 of valuable personal data (including your social security number) out of you, and will likely take $50 of time and effort to redeem.</li>
  <li>The only way to fix this issue is custom ROMs, which Google has been gradually squeezing out of the ecosystem entirely thanks to services like the <a href="https://developer.android.com/google/play/integrity/overview">Play Integrity API</a>, which prevents essential apps like banking apps from working at all on custom ROMs. Remember: <em>most users lack the technical ability to install custom ROMs!</em></li>
</ul>

<details>
<summary><strong>UPDATE</strong></summary>


<p>
On 16 January 2025, my phone downloaded the update and prompted me to install it via a notification, despite disabling automatic update checks in Developer Options. As far as I know, there is no way to disable checks (and automatic downloads!) for this update. Without an option to disable the automatic update in the OS settings, you're stuck with the following options:
</p>


<ul>
<li> install a custom ROM, like GrapheneOS or LineageOS</li>
<li> continue using the stock software, but block the update at the DNS level with a pi.hole, nextDNS, or similar</li>
<li> To block the updates, block the entire <code>googlezip.net</code> domain. Technically you can just block <code>ota.googlezip.net</code>, <code>ota-cache1.googlezip.net</code>, and <code>ota-cache2.googlezip.net</code>, but if you use nextDNS or pi.hole you can only block the whole domain.</li>
</ul>


<p>
When your phone inevitably decides to install the update _anyway_ (because VPNs on Android <a href="https://mullvad.net/en/blog/2022/10/10/android-leaks-connectivity-check-traffic">leak traffic</a>), go to <strong>Settings</strong> &gt; <strong>Apps</strong> &gt; <strong>All Apps</strong> &gt; <strong>Google Play Services</strong> &gt; <strong>Storage and cache</strong> &gt; <strong>Manage Space</strong> and click the <strong>Clear all data</strong> button to delete all data, including the update file. Fortunately, it seems that you at least have to click the notification to actually install the update!
</p>


</details>

<p>
</p>

<details>
	<summary><strong>UPDATE<sup>UPDATE</sup></strong></summary>


<p>
Around 20 January 2025, Google took down <a href="https://www.androidcentral.com/phones/google-pixel-4as-old-firmware-is-gone-trapping-users-on-the-buggy-battery-update">all Pixel 4a firmware releases other than the recent release that destroys battery performance</a>.
</p>

<p>
At this point, I'm forced to conclude that some 4a batteries have catastrophically failed, exploding or burning down houses somewhere. Making this a massive CYA legal operation for Google. Of course, it all happened with only 48 hours of warning, next to no battery supplies, extremely limited geographical locations for battery replacements, poor communication, and plenty of people incurring $90 screen replacement costs for screens previously scratched or destroyed during battery replacement... in other words, Google borked this operation from the beginning.
</p>

<p>
I just wish Google would offer a trade-in. Send me a refurbished Pixel 4a with a new, safe battery in the mail. I'll copy over my files and data from my current (old, unsafe battery) 4a. And then mail it back. Then Google can refurbish <em>my</em> Pixel 4a for someone else. No downtime required, and I'm sure they have a stockpile of refurbished phones somewhere for warranties and such. But currently my only battery replacement option is a mail-in one, and I <em>cannot</em> go without my phone for 7-10 business days when I need it for basic stuff like 2FA, let alone travel, music, podcasts, emergencies, etc.
</p>


</details>

<p>
</p>

<details>
	<summary><strong>UPDATE<sup>UPDATE<sup>UPDATE</sup></sup></strong></summary>


<p>
29 January 2025, <a href="https://social.treehouse.systems/@marcan/113914172433692339">marcan@treehouse.systems took a look at the kernels for the last two 4a firmwares</a>. Turns out that this update does indeed cut battery capacity in half for impacted phones!
</p>

<p>
A couple of interesting takeaways:
</p>

<ul>
	<li>
		this commit was built on an engineer's machine, not the usual Android kernel buildsystem used for Pixel phones (likely because that buildsystem has removed support for the 4a)
	</li>
	<li>
		there's no source for this update, so this kernel violates GPL
	</li>
	<li>
		the new kernel was compiled without <a href="https://wiki.gentoo.org/wiki/LTO">Link Time Optimization</a>, which translates to a minimal performance hit for the new kernel
	</li>
	<li>
		they lowered the maximum charge voltage from <strong>4.44 V to 3.95 V</strong> for one of the two known battery profiles for the 4a, so all of that battery now have a maximum capacity of not 3080mAh, but <strong>1539mAh</strong> (for reference, that's about the same battery capacity as the iPhone 5 had).
	</li>
</ul>

<p>
In case you're trying to replace your own battery because, like most people, you can't find one at repair stores, this quote is particularly relevant:
</p>

<blockquote>
	You can tell which battery you have physically by the number next to the QR code. 8230015901 is ATL (good) and 8230020501 is LSN (bad). If you're replacing your battery, make sure it's ATL.
</blockquote>


</details>

<p>
</p>

<details>
	<summary><strong>UPDATE<sup>UPDATE<sup>UPDATE<sup>UPDATE</sup></sup></sup></strong></summary>


<p>
30 January 2025, <a href="https://old.reddit.com/r/Pixel4a/comments/1id6zw8/attention_google_customer_service_said_device/">Google support reps seem to think un-updated phones like mine will be remotely factory reset with no warning today to force the update</a>. The screenshotted support conversation reads:
</p>

<blockquote>
We understand the battery issue that you're referring to right now. Each Impacted Devices and eligible customers must manually update their device's firmware once it is available in January 2025. If they don't update the firmware on January 30, 2025, the device will experience a factory reset and the customer will need to set up their device again.
During that setup process, the new firmware will install on their device.
</blockquote>

<p>
Let me remind you that this is far worse than the iPhone BatteryGate scandal, where Apple downclocked CPUs to keep underperforming older batteries from powering down the phone under heavy loads. Google has kneecapped completely workable phones without fessing up to the actual problem (which appears to be a very real risk of fires or explosion from the batteries, based on their aggressive stance). $50 reimbursement is only available in a few countries, and only through an exploitative third party that requires invasive personal data like your Social Security number. Their $100 discount has serious strings attached and takes weeks to become available. Batteries are out of stock at many repair places, and you might get charged $90 for a screen repair if they break it. And mail-in repair requires you to go without your phone for 2 weeks.
</p>

<p>
<em>Oh, and they might just wipe my phone completely without warning because I had the audacity to try and preserve my battery life until I can take my phone into a repair store in person.</em>
</p>

<p>
This sucks.
</p>



</details>

<p>Many of us use phones that are a couple of years out of date. As the phone industry insists on removing useful features while at the same time inflating new phones to a seeming minimum of $500, older phones have become increasingly attractive. Using an older phone is good for your wallet and good for the environment (the most environmentally-friendly phone purchase is no new phone purchase), but not good for security, since you likely miss out on OS security updates.</p>

<p>In 2023, Google abandoned the Pixel 4a, deciding to no longer publish security updates for the still-popular phone (as originally announced, in all fairness). Many of us kept using the 4a because it ticks a lot of boxes that no modern phone ticks (the 4a is smaller than any Pixel phone since, has a very fast rear-mounted fingerprint reader, and has a headphone jack), and it still works quite well.</p>

<p>In 2024, Google left us alone. Many people explored custom ROMs like LineageOS and GrapheneOS to keep the security updates flowing, despite the fact that those custom ROMS have no way to fix firmware vulnerabilities. It was sad to see a great phone slowly sink into obsolescence. But through the community efforts of a lot of volunteers, custom ROMs have kept the phone alive. Of course, only a small subset of people are comfortable or even able to install custom ROMs, so plenty of people -- the vast majority, in fact -- kept using the stock firmware. Sure, we don't get OS security updates. But we can update our browsers, our apps, Google Play Services, and just about anything else on the device, so it's not like we're walking around completely exposed. Life was good.</p>

<p>It all started with an email on 6 January 2025:</p>

<blockquote>
  <p>Hi Nate</p>

  <p>We wanted to let you know about an upcoming software update for your Pixel 4a that will affect the overall performance and stability of its battery. Pixel phones, like other smartphones, use <a href="https://support.google.com/pixelphone/answer/15738128?p=battery-health&amp;rd=1">rechargeable lithium-ion batteries</a> that, over time, may experience performance, capacity, or runtime degradation.</p>

  <p>In the coming days, your Pixel 4a will receive an automatic software update to Android 13 that introduces new battery management features to improve the stability of the battery. This update will reduce your battery’s runtime and charging performance.</p>

  <p>To address this, we’re providing some <a href="https://support.google.com/pixelphone/workflow/15642495?p=pixel4a_battery_help&amp;rd=1">options</a> to consider. Please take a look and choose which one works best for you.</p>

  <p>More details related to this change are available <a href="https://support.google.com/pixelphone/answer/15701861?p=pixel4a_battery&amp;rd=1">here</a>. Eligibility criteria and other terms will apply.</p>

  <p>Thank you,</p>

  <p>Pixel team</p>
</blockquote>

<p>This came as a bit of a shock to many 4a owners, some of whom have been using their phones since August 2020 without any battery issues. I know my phone has been in constant use since late 2020, though previously my partner used it, not me. Neither of us ever had any complaints about battery life, though it has obviously diminished over the last 3.5 years.</p>

<p>Reading more information revealed that, just two days after the announcement, Google planned to release an update that would "reduce in battery capacity and charging performance"... a phone that Google doesn't even support with security updates any more. A surprise to be sure. Not a welcome one, especially since the <a href="https://support.google.com/pixelphone/answer/15701861?p=pixel4a_battery&amp;rd=1">linked article</a> is full of lengthy nonspecific corporate weasel-words that make <em>me</em>, a very technical communicator and developer, somehow less certain about the safety of my phone.</p>

<p>Fast forward to 8 January 2025. The update drops. Immediately, screams of cosmic horror (more than usual) issue from online communities of Pixel 4a owners:</p>

<ul>
  <li>
    <p><a href="https://old.reddit.com/r/Pixel4a/comments/1hwx9m4/used_my_4a_for_20_minutes_and_its_still_at_100/">many phones are stuck reporting 100% battery forever, dropping dead without warning</a></p>
  </li>
  <li>
    <p><a href="https://old.reddit.com/r/Pixel4a/comments/1hx10zq/final_psa_do_not_update_to_the_latest_battery/">many users are reporting that their battery lasts significantly less than it used to</a>; <strong>Update</strong>: many previously functional phones are draining up to 1% per minute after the update, and frequently get "stuck" at random battery percentages <em>other</em> than 100%</p>
  </li>
  <li>
    <p><a href="https://old.reddit.com/r/Pixel4a/comments/1hwqvmb/warning_do_not_uodate_i_am_ineligible_and_they/">charging has been permanently limited to <strong>1A</strong></a></p>
  </li>
  <li>
    <p><a href="https://old.reddit.com/r/Pixel4a/comments/1hwtupc/battery_info_before_and_after_the_update/">the update added a giant non-removable warning to the Battery page in Settings</a>:</p>
  </li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_01_09/settings.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_01_09/settings.png" alt="annoying but at least out of the way" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">annoying but at least out of the way</figcaption>
</figure>

<ul>
  <li>the update added a giant warning notification in the notifications tray:</li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_01_09/notification.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_01_09/notification.png" alt="ugly permanent notification" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">ugly permanent notification</figcaption>
</figure>

<ul>
  <li>the update permanently marked the battery icon in the top right with an exclamation point:</li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_01_09/exclamation.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_01_09/exclamation.png" alt="seems subtle, but if you play a lot of RPGs this will constantly make you think you have a pending quest" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">seems subtle, but if you play a lot of RPGs this will constantly make you think you have a pending quest</figcaption>
</figure>

<ul>
  <li>
    <p>users trying to redeem their $50 credit with Google are being forced to submit significant amounts of personal information to <a href="https://old.reddit.com/r/Pixel4a/comments/1hwkhj5/what_is_this_payoneer_thing/">Payoneer</a>, a highly legitimate trustworthy corporation that definitely won't sell or abuse my personal data or lose it in a leak eventually; <strong>Update</strong>: Payoneer requires a social security number. You should not give it to them. <del>If you're not a US citizen, this also means that you have <em>no way</em> to redeem the $50 offer.</del> UPDATE: It seems that non-US citizens can indeed redeem the offer. But you likely still have to violate your own privacy by entrusting a bunch of personal data to a sketchy third party.</p>
  </li>
  <li>
    <p>users trying to redeem their $100 discount on a Google Pixel device from the Google Store cannot combine the discount with any other discount (including most store sales, incentives, and employee discounts), must wait sometimes weeks to receive their discount code, and got bait-and-switched by a $100 price raise on most Google Store devices the day after the email announcement went out (after folks selected the $100 discount option, but before they received a discount code, effectively nullifying the discount completely)</p>
  </li>
</ul>

<p>The icing on the cake? The <a href="https://old.reddit.com/r/Pixel4a/comments/1hxa9s0/forced_to_do_the_new_update/">only way to disable OTA is via developer options</a>. Which is fine for me, as I already take this precaution on many devices to vet updates for serious errors before I install them. Unfortunately it isn't something I can easily communicate to less technical folks I know who still use the 4a.</p>

<p>Of course, you can also permanently save yourself from these issues by switching to a custom ROM. Also of course, most users aren't technical enough to do that, and they'll instead be forced to update to a new phone and throw away their 4a.</p>

<p>A small number of users are likely going to go to repair stores to redeem the supposed "free battery replacement". Unfortunately I don't live close enough to a repair store to take advantage of that right now, and neither I nor any other reasonable person who uses 2FA for anything can go without my phone for <em>two weeks</em> for a mail-in repair. Hopefully replacing the battery will fix the issue, but some users with aftermarket batteries from iFixit and the like have already reported that the notification and battery warning remain.</p>

<p>It's also uncertain how this repair will work with third-party stores: if the Pixel 4a owner isn't paying them, who is? Google, presumably? What happens if they -- and they likely will -- crack the screen prying it off of the 4a to access the battery? Will my screen be replaced for free as well? Will Google compensate them for that extra cost? How do I know, or how does any repair shop know, what repair programs exist and where they can be redeemed?</p>

<p>I don't know. Nobody seems to. All I know is that pretty much anybody who was happily using the not-quite 3.5 year old Pixel 4a up until this point, who doesn't pay attention to online phone enthusiast communities, is likely now stuck with an annoying brick that will work significantly worse than it did before, since the battery gauge no longer works.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2025_01_09/dead.png" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2025_01_09/dead.png" alt="4a is kill" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">4a is kill</figcaption>
</figure>

<p>And I don't think that's OK.</p>

<details><summary><strong>Full text of the "Pixel 4a Battery Performance Program" page, in case Google changes it:</strong></summary>

<blockquote>
Pixel 4a Battery Performance Program
<p></p>
January 6, 2025
<p></p>
Summary of program
<p></p>
Google has determined that certain Pixel 4a phones require a software update to improve the stability of their battery’s performance. An automatic update to Android 13 will roll out to all Pixel 4a devices starting January 8, 2025. For some devices (“Impacted Devices”), the software update reduces available battery capacity and impacts charging performance. We want our customers to have the best possible experience with their products, so users of these Impacted Devices are eligible for an appeasement from Google. Not all Pixel 4a devices are impacted by the reduction in battery capacity and charging performance, therefore if your device is not impacted the battery will perform the same as before, and you will not be eligible for an appeasement. You can find out if your device is eligible here.
Background
<p></p>
Pixel phones, like other smartphones on the market, use rechargeable lithium-ion batteries—and these batteries are consumable components that may experience performance, capacity, or runtime degradation as they are used. That’s why we recommend that you consider replacing your battery if you notice a decrease in your battery’s capacity or runtime. 
Changes coming to your device's battery management
<p></p>
From January 8, 2025, Pixel 4a devices will receive an automatic software update to Android 13. After the software update is downloaded, your device will restart automatically to apply the update. For some devices (“Impacted Devices”), the update includes new battery management features to improve the stability of your battery’s performance, so the battery may last for shorter periods between charges. Users of Impacted Devices may also notice other changes, like reduced charging performance or changes to how the battery-level indicator on your phone shows your battery capacity. 
<p></p>
If you own a Pixel 4a, you can manually download the latest software update from January 8, 2025. Otherwise, the software update will be automatically downloaded to your device when the software is released and your device is charged and connected to the internet. 
<p></p>
Not all Pixel 4a devices will experience these changes, but we want to help affected users in this situation. Impacted Devices are eligible for an appeasement. You can check your appeasement eligibility here. The software update does not impact any other Pixel phone models, such as Pixel 4a 5G.
Free battery replacement and other options for individual end-user owners of Impacted Devices
<p></p>
If your Pixel 4a is an Impacted Device, you may be eligible for a free battery replacement. You can visit our registration page to find a battery replacement option near you.
<p></p>
Battery replacement is available at walk-in repair centers in the United States, Canada, United Kingdom, Germany, Singapore, and India. Mail-in repair is also available for customers in the United States. Battery replacement is only available in eligible locations and while battery supplies last. For more details about eligibility, review criteria here.
<p></p>
If battery replacement is not convenient or you would like to explore other options, you can also visit our registration page to claim one of the other appeasement options:
<p></p>
<ul>
<li> $50 USD (or local equivalent) payment. </li>
<li> $100 USD (or local equivalent) Google hardware discount code applicable towards the purchase of another Pixel phone on the Google Store (as available). </li>
</ul>
<p></p>
Terms and conditions
<p></p>
Individual end users will have one year from the initial software release on January 8, 2025 to register and make a choice of one of the three appeasement options, which may vary by country. After January 8, 2026, these appeasement options will no longer be available. Payment and Google hardware discount code amounts may vary based on the daily exchange rate, at the time of conversion. The final amount will be calculated using the exchange rate in effect at the time you select your appeasement option.
<p></p>
Note: Only some Pixel 4a devices are impacted by the reduced battery capacity and eligible for appeasements - you can check your eligibility here. 
<p></p>
The options above are available exclusively for individual end-user consumers of Impacted Devices only (retailers, wholesalers, or owners of bulk devices other than for personal use are not eligible) that were purchased by or on behalf of that individual consumer prior to January 6, 2025. There is one appeasement per device after eligibility is confirmed. Proof of ownership may be required when claiming your appeasement. Appeasement options may not be available in all countries, as required by law. 
<p></p>
This Pixel 4a Battery Performance Program provides rights separate to rights provided to you by statutory law in the country where you purchased the device. Those statutory rights are in addition to, and not instead of or restricted by, this program.
<p></p>
Additional details regarding this program are provided in the frequently asked questions below.
<p></p>
Frequently asked questions
<p></p>
What should I expect if my Pixel 4a battery has been impacted?  Can I continue to use my Pixel 4a?
<p></p>
Yes, you can continue to use your Pixel 4a as before. After the software update is applied, Impacted Devices will experience improved stability of battery performance, but battery capacity will be reduced, which may affect runtime. You may also notice other changes, like reduced charging performance or changes to how the battery-level indicator on your phone shows your battery capacity.
<p></p>
How do I know if I have Pixel 4a?
<p></p>
Find your phone model in Settings About phone Model. Remember that not all Pixel 4a devices are impacted by the battery health features and eligible for appeasement. You can confirm here if your device is impacted and if you are eligible for an appeasement option.
<p></p>
How do I claim my appeasement?
<p></p>
To claim an appeasement for your Impacted Device, visit our registration page to begin the process. After you complete the registration process, you’ll be given a list of available options for your country and estimated time for fulfillment. 
<p></p>
The options may vary depending on country, and will only be available for individual end users until January 8, 2026. Terms and conditions apply.
<p></p>
How do I obtain a battery replacement?
<p></p>
If you choose to request one free battery replacement, eligible Pixel 4a devices can be taken to walk-in repair centers in the United States, Canada, United Kingdom, Germany, Singapore and India. Visit our registration page and after selecting the Repair option, you can find a service location near you. We recommend that you contact the walk-in repair location ahead of time and schedule an appointment. If you are in the United States, mail-in repair may also be available. We will send you a special box for mail-in repair if your device qualifies. Battery replacement is only available at eligible locations and only while battery supplies last.
<p></p>
For more information and to register for a battery replacement, visit our registration page.
<p></p>
About the battery replacement program
<p></p>
The battery replacement program provides one free battery replacement for eligible Pixel 4a devices following an initial eligibility check and physical inspection of your device. Initial eligibility is determined based on whether the phone is an Impacted Device. To find out if your Pixel 4a phone is eligible visit our registration page. 
<p></p>
If your Pixel 4a is eligible and you registered for a battery replacement, you can choose mail-in repair in the United States only, or take it to a walk-in repair location in the United States, Canada, United Kingdom, Germany, Singapore, and India. For more information on our repair partners, visit our registration page. 
<p></p>
Even if an Impacted Device is eligible for a free battery replacement, upon receipt, a physical inspection of your phone is conducted before starting the repair to verify that the phone is in suitable condition for repair. 
<p></p>
Important: If your Pixel 4a device exhibits other forms of damage, like liquid damage, exposure to sharp objects, or excessive force, it may not qualify for a free battery replacement. If your phone has out-of-warranty damage, such as display or coverglass cracks, then there may be a fee to repair your phone. Before we start any repairs, we'll provide a cost estimate. You then have the option to proceed with the repair or have your device returned to you.
<p></p>
If your Impacted Device is not eligible for the free battery replacement program following physical inspection, you will be redirected to select a different appeasement option.
<p></p>
Battery replacement doesn't extend the standard warranty coverage of your Pixel 4a. Your warranty will expire on the date it was originally set to expire, regardless of the battery replacement.
<p></p>
Tip: Before you bring in your phone or mail-in for repair, back up your data.
<p></p>
I have a Pixel 4a that I am no longer using, can I get the appeasement offer?
<p></p>
Yes, appeasement options are available for individual end-user owners of Impacted Devices (subject to terms and conditions).
<p></p>
Can I take my Pixel 4a device back to the carrier or retailer where I bought it? 
<p></p>
No. The appeasement options are offered by Google directly to individual end-user owners of Impacted Devices. To claim an appeasement, visit our registration page to begin the process. 
<p></p>
My Pixel 4a is working normally. Do I need to stop using it?
<p></p>
You do not need to stop using your Pixel 4a. Your device will receive the software update from January 8, 2025, or you can manually download the update. 
<p></p>
I haven’t had any issues with my Pixel 4a. Can I take it on a plane or put it in my checked luggage?
<p></p>
Follow local transportation guidance as usual. In general, rechargeable lithium-ion batteries are allowed in carry-on baggage but are prohibited from checked luggage. Please see the FAA’s PackSafe for Passengers webpage for more information.
<p></p>
Can I purchase a new Pixel 4a?
<p></p>
Google is no longer selling Pixel 4a, but you can review our current Pixel portfolio here. 
<p></p>
How do I dispose of my Pixel 4a if I can't return it?
<p></p>
Dispose of your phone, battery, and any accessories in accordance with local regulations. Don't dispose of them in normal household waste. Improper disposal may lead to fire, explosion, and/or other hazards. Don't open, crush, heat above 45°C (113°F), or incinerate. For more information on recycling your phone, visit g.co/pixel/recycle.
<p></p>
What happens to my Pixel 4a after I take the payment or Google hardware discount code appeasement offer? Can I still use it?
<p></p>
You will not be required to return your device. You can continue to use your Pixel 4a or you can dispose of it responsibly. For more information on recycling your phone, visit g.co/pixel/recycle.
<p></p>
Is it safe to charge my Pixel 4a?
<p></p>
Yes, you can continue to charge your Pixel 4a as before. As with all devices, use best practices for battery health and charging. Place your device in a well-ventilated area when charging or in-use. You can find additional safety-related information here or on your Pixel 4a at Settings About phone Safety &amp; regulatory manual. 
<p></p>
Can I continue to request mail-in repairs for my device in the future?
<p></p>
Impacted Devices that qualify and receive a battery replacement will be able to request future mail-in repair service where available. If an Impacted Device claims an appeasement other than a battery replacement, that device will not qualify for future mail-in repair service but can still receive other non-mail in repair services where available.
</blockquote>


</details>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[In 2025, Google killed the Pixel 4a.]]></summary></entry><entry><title type="html">Not a Bicyclist&apos;s Guide to Bicycles</title><link href="https://www.lambdalatitudinarians.org/techblog/2024/11/14/not-a-bicyclists-guide-to-bicycles/" rel="alternate" type="text/html" title="Not a Bicyclist&apos;s Guide to Bicycles" /><published>2024-11-14T18:13:13+00:00</published><updated>2024-11-14T18:13:13+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2024/11/14/not-a-bicyclists-guide-to-bicycles</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2024/11/14/not-a-bicyclists-guide-to-bicycles/"><![CDATA[<p>All bicyclists ride bikes. But not all bike riders are bicyclists. I'm a bicycle enthusiast: someone who spends enough time riding and repairing bikes to know a thing or two about them. But I'm not a bicyclist, because I don't race my bike, or care about power meters or pacing or compete in events.</p>

<p>I wrote this article to help non-bicyclists better understand bikes: which to buy, what features truly matter to the average rider, and what features only exist for the benefit of Olympians.</p>

<p>If you race bikes, you can safely ignore all of this advice. I'm speaking to people who just want to get around on their bikes, not people who want to min/max stats. Think of what I'm describing as the "Honda Civic of bikes". If you know what drafting is and you want to do it, ignore me.</p>

<!-- readmore -->

<h2 id="what-is-racing-what-is-not-racing">What is Racing? What is Not Racing?</h2>

<p>TL;DR: <strong>Most big bike manufacturers, including Trek, Specialized, Giant, and a few others, are 90% racing nonsense.</strong> In the last 20 years, only a couple of features have changed in a meaningful way for your <em>average</em> rider.</p>

<p>For Big Bike, racing is where 90% of the money is. Your average racer spends 10x what the average commuter spends on their bike alone. And then they buy kit to pair with the bike:</p>

<ul>
  <li>special pedals</li>
  <li>special shirts</li>
  <li>special pants</li>
  <li>special underwear</li>
  <li>special butter to make their butts hurt less</li>
  <li>special shoes</li>
  <li>a nicer saddle</li>
  <li>aerodynamic water bottles</li>
  <li>nicer wheels</li>
  <li>tubeless goo every 6 months</li>
  <li>nicer tires for each type of weather, for each category of event</li>
  <li>electrolyte and sugar-filled gels that definitely aren't candy</li>
  <li>electrolyte-filled sports drink mixes</li>
</ul>

<p>The list goes on; racers spend a lot of money. So these companies barely even try to appeal to anyone but racers, because racers are where the money is. Today, racing includes quite a few (completely separate) categories:</p>

<ul>
  <li>road</li>
  <li>gravel</li>
  <li>cyclocross</li>
  <li>track</li>
  <li>triathlon</li>
  <li>bikepacking</li>
  <li>mountain (enduro, trail, and downhill)</li>
</ul>

<p>Each category is individually optimized to death to drop every possible gram of weight and cut every possible square centimeter of surface to drop wind resistance to the minimum. That's great if you're an Olympian, or someone who gets paid $100,000+ per year to ride bikes. For the rest of us? It really doesn't matter, unless you're in the 1% of non-Olympians who occasionally win racing events. But that's a massive minority of people. Compared to all people who bike, the people for whom these optimizations matter number something on the order of "proportion of billionaires to the rest of the human race" or "proportion of people who get eaten by sharks or struck by lighting".</p>

<p>So I'm going to make my first strong recommendation: <strong>don't buy a bike that fits into any of the racing categories I listed above</strong>. At least, not unless you want to waste money on optimisations you don't need. The only racing category that seems to have any overlap with practical bike needs is gravel, because it's the youngest category, with the least racing infrastructure build around it for components and events. But the industry is catching on.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2024_11_14/mountain.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2024_11_14/mountain.webp" alt="A mountain bike. Not technically for racing, but expensive and specialised enough that it may as well be." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">A mountain bike. Not technically for racing, but expensive and specialised enough that it may as well be.</figcaption>
</figure>

<p>The astute reader may have noticed that I omitted one popular bike genre from the above list: hybrid bikes. I'm going to make my second strong recommendation for hybrid bikes: <strong>do not buy a hybrid bike</strong>. Hybrid bikes aren't designed to be good at anything. In fact, they're designed explicitly to be <em>bad</em> at racing! The big bike makers only make them to lower the price of the cheapest bike in their inventories to lure people in the bike shop door. To hit that price point, bike makers take a racing bike, then swap out expensive components for the cheapest equivalents. They are not good, because that is not how you build a nice bike.</p>

<p>Imagine if we built normal cars by starting with a $200k sports car, then swapping out components for the cheapest thing to bring the cost down. Replace those wheels with the cheapest alternative that only lasts 10k miles and provides no grip when it rains. Replace the 8-cylinder engine with a 2-cylinder. Swap out those fancy LED headlights for the cheapest halogens! No more leather seats. Ditch the heated seats and heated steering wheel and the fancy leather trim on the interior. And you're still stuck with a low-riding car with little trunk space, no rear seats, expensive bespoke parts, and an awful crash rating. Because a $200k sports car bakes in all kinds of design assumptions that you wouldn't make in a normal car!</p>

<p>Bikes are no different. To build a <em>good</em> commuter bike (or a good normal car), start with a completely different mentality: make it bulletproof, comfortable, and easy to repair. Racing bikes (and sports cars) start with a completely different set of assumptions, so the Big Bike approach to hybrids is inherently flawed.</p>

<p>If you're unfortunate enough to buy a hybrid bike or what Big Bikes calls a 'commuter', you get trash components. Basically, the stuff they sell to make their racing bikes look lightweight and sleek. You know how computer companies keep their RAM and storage sizes incredible low at the low end, or how car manufactures make that one model without cruise control so you have to upgrade for a few thousand dollars? Same thing here.</p>

<h2 id="what-to-look-for">What to Look For</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2024_11_14/top_tier.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2024_11_14/top_tier.webp" alt="Metal frame. No suspension. Big tires. Mount points for racks. Rim brakes. No batteries." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">Metal frame. No suspension. Big tires. Mount points for racks. Rim brakes. No batteries.</figcaption>
</figure>

<p>When it comes to bikes, particularly commuters or recreational bikes, simpler is better. What do I mean by that?</p>

<ul>
  <li>Buy a bike made of metal, preferably steel or aluminum.
    <ul>
      <li>Carbon fiber is slightly lighter than metal, and stronger along one axis. But carbon is <em>much</em> more brittle under stress from every other angle. When someone squishes your bike at a bike rack, or you over-tighten a screw attaching a water bottle cage, or you crash into something, or someone leans against your bike at the wrong angle, you don't want your bike to critically fail in a completely unrepairable way.</li>
      <li>Metal is cheap.</li>
      <li>Metal can be re-used (the Allies built tanks from bikes all across Western Europe); carbon fiber inevitably ends up in a landfill and won't break down for thousands of years.</li>
      <li>Steel rusts. If your municipality salts in the winter, or you live near the ocean, consider aluminum.</li>
    </ul>
  </li>
  <li>Don't buy suspension.
    <ul>
      <li>Suspension requires constant maintenance.</li>
      <li>Suspension is heavy.</li>
      <li>Suspension is failure prone.</li>
      <li>Front and rear shocks are not necessary for 99% of use cases. Even my <em>mountain bike</em> doesn't have suspension. And I live in the mountains and spend a couple of hours a day on trails! Only buy a bike with suspension if you plan on using it in the woods at least 90% of the time.</li>
    </ul>
  </li>
  <li>Bigger tires are better. 1.5"-2.5" is ideal.
    <ul>
      <li>Chonky tires soak up vibrations from obstacles like potholes and cracks in the road.</li>
      <li>Chonky tires provide more surface area for better grip when it rains and on gravelly surfaces.</li>
      <li>In a rare case of racer-shit-being-good-for-normal-people, gravel racing tires are actually good. Vittoria mezcals are my personal favourite, but you can buy almost any gravel tire with decent reviews.</li>
    </ul>
  </li>
  <li>Simpler brakes are better.
    <ul>
      <li>Rim brakes stop your bike by rubbing a rubber pad along the outer rim of your wheel. They are cheap, easy to repair, easy to understand, and work great for most use cases. Most people should use rim brakes.</li>
      <li>Disc brakes stop your bike by squeezing a metal disc attached to the center of your wheel. They are more expensive, harder to repair, harder to understand, more fragile, and work even better than rim brakes for most use cases.
        <ul>
          <li>Most disc brakes are <em>hydraulic</em>: they use oil-filled tubes to squeeze the brake disc. Oil is silly, and really annoying to work with. Don't get these unless you race.</li>
          <li>The best disc brakes are <em>mechanical</em>: much like rim brakes, you activate them by pulling a wire, which activates a mechanism that squeezes the disc. These are <em>almost</em> as easy to work on as rim brakes, but a bit more expensive.</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Don't buy a bike that requires batteries or electronics.
    <ul>
      <li>Electronic shifting or braking? No. You know how your phone, your headphones, your watch, your lawnmower, your car, and everything else constantly needs charging? You know how frustrating it is when that stuff lets you down? Mechanical parts work great. Electronic 'improvements' are just planned obsolescence unless you're the 1% pro racer who might win an extra $100k if you get that 2% efficiency improvement. Just don't!</li>
      <li>E-bikes are just one half a word away from e-waste. If you buy a nice one from a nice manufacturer, and you know what you're doing, you might get something that helps you move around your city faster and with less sweat than an acoustic bike. But most e-bikes use integrated batteries and shitty parts, and cost way more than an acoustic bike, even after government subsidies. If you're reasonably fit and know nothing about bikes, you're better off with an acoustic bike. After a few months of riding, reconsider the e-bike. Trust me: the price of your acoustic bike is going to be such a small fraction of the cost of a non-awful e-bike, it's worth taking the time and investing the energy to see if you even like biking first!</li>
    </ul>
  </li>
  <li>Fewer gears is better.
    <ul>
      <li>Fewer gears mean more reliability in shifting, both in acute failure cases (you hit it with a rock) and broader fail cases (you cover your drivetrain in mud).</li>
      <li>Fewer gears mean a thicker chain, means less chance of failure when you rust 50% of the way through it.</li>
      <li>7 speeds are enough for most commuter needs. 8 or 9 or 10 speeds are more common today. A "1x" chainring with no front derailleur makes maintenance simpler, and is probably the right choice unless you live somewhere <em>incredibly</em> hilly.</li>
    </ul>
  </li>
</ul>

<h2 id="after-buying">After Buying</h2>

<p>Now you know what to look for in a bike. But what should you worry about after buying?</p>

<ul>
  <li>Find a seat that works well for you, if the stock seat isn't comfortable.
    <ul>
      <li>Find a friendly bike shop that will let you try a few basic saddles out. Take a couple for a spin on the bike. Get the one you like the most.</li>
      <li>Brooks' saddles are lovely, but expensive. If you can't find a comfy saddle, they're worth a shot.</li>
    </ul>
  </li>
  <li>When your seat is in the right position, your leg should be just about straight at the bottom of a pedal stroke.
    <ul>
      <li>Adjust the seat height to do this. You might have to get used to 'tilting' the bike to either side to mount. But your knees will thank you.</li>
    </ul>
  </li>
  <li>You don't need special shoes.
    <ul>
      <li>Use your bicycle to go to normal places and do normal things. In normal shoes.</li>
      <li>When riding around town, it's nice to be able to put a foot down easily at any time, like when a car cuts you off or you hit ice.</li>
    </ul>
  </li>
  <li>Handlebars are the most important part of bike fit.
    <ul>
      <li>Get some cozy ergonomic grips, if your grips bother you at all.</li>
      <li>In general, the higher your handlebars, the more comfortable you'll be.
        <ul>
          <li>The closer you get to "Dutch grandma", the cozier.</li>
          <li>The closer you get to Lance Armstrong, the more uncomfortable you'll be (for the sake of aerodynamics).</li>
        </ul>
      </li>
      <li>Put your hands out in front of you, like you're a zombie hungry for brains. Take a look at your hands. Imagine how handlebars would fit into them. Most likely, some Dutch-style 'swept-back' handlebars would fit best. Consider acquiring some. A new set of handlebars should be $50 or less, and most likely won't require you to replace anything else. Just make sure you get a handlebar with the same width as your old set, so you can keep using the same stem.</li>
    </ul>
  </li>
  <li>Fenders are great on a commuter to help with splashing water or mud.</li>
  <li>Lights are a necessity during the dark half of the year.
    <ul>
      <li>Rechargeable lights are good and cheap online.</li>
      <li>If you never want to worry about a battery, dynamos are amazing these days. But expensive. Best used for touring bikes, or the truly battery-intolerant daily commuter.</li>
    </ul>
  </li>
  <li>Kickstands rule, if you ever like to stop away from a bike rack. Do you go to the park? Get a kickstand.</li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2024_11_14/european.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2024_11_14/european.webp" alt="Typical bikes in Copenhagen, Denmark. Used to get around the city instead of cars. Notice that they also have a metal frame, no suspension, big tires, rim brakes, and no batteries. Great handlebars." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">Typical bikes in Copenhagen, Denmark. Used to get around the city instead of cars. Notice that they also have a metal frame, no suspension, big tires, rim brakes, and no batteries. Great handlebars.</figcaption>
</figure>

<h2 id="bike-recommendations">Bike Recommendations</h2>

<p>So, after all of this advice, what bike should you buy?</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2024_11_14/also_top_tier.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2024_11_14/also_top_tier.webp" alt="A good buy. Metal frame. No suspension. Big tires. Rim brakes. No batteries." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">A good buy. Metal frame. No suspension. Big tires. Rim brakes. No batteries.</figcaption>
</figure>

<p>Like cars, you should seriously consider buying used. Craigslist and Facebook Marketplace have the best deals. Look for bikes with way too many pictures and way too long a description, because it means that the bike was owned or refurbished by a bike nerd. Avoid bikes with only a single picture, or with non-nerdy descriptions, because there's a decent chance they're stolen or sold by someone who hasn't maintained them well. Leave the 'hidden gem' bikes to the bike nerds -- you don't want to take that chance with your daily driver.</p>

<p>If you can't find a decent used bike, check out your local bike shop. If they stock any bikes from Surly or All-City, they can be trusted. If they only sell Big Bike brands, avoid them and order online.</p>

<p>There are a lot of bike brands out there. Some are Big Bike brands that you should avoid for the reasons I stated above. Most are truly shit brands who cobble together awful plastic components onto cool-looking, but poorly built frames. I strongly advise that you stick to the brands and models I recommend below, no matter how cool or well-specced a bike seems:</p>

<ul>
  <li>The cheap option ($300 or less): <a href="https://www.bikebarnworkshop.co.uk/product-page/1992-trek-930-singletrack">80s and 90s steel "mountain bikes" without suspension</a> will last literally forever as long as you store them inside and don't ride them right after a fresh salting on a winter road. Trek's 830/850/870/930/950/970 models, the Specialized Stumpjumper/Rockhopper, and quite a few similar bikes from the same era are absolute tanks. And the best part is, the parts are all super cheap these days, so maintenance is as cheap as possible! I use a 1995 Trek 930 as my daily driver and touring bike. Those 7 speeds have taken me all over the USA and UK on trips. Thousands of miles, and I bought this thing for $200 during peak covid bike price scalping.</li>
  <li>The medium option ($1000 or less): <a href="https://surlybikes.com">Surly</a> makes great, cheap (for their utility value) bikes, mostly steel, that last a looooooooong time. Unfortunately they're moving to hydraulic brakes with some models, and the prices have increased in the last 3-5 years a decent amount, but the Disc Trucker, the Midnight Special, and the Preamble are all fantastic value.</li>
  <li>Another medium option ($1000 or less): <a href="https://allcitycycles.com/">All-City Cycles</a> makes great bikes as well, basically the same thing as Surly.</li>
  <li>Another medium option ($1500 or less): <a href="https://www.trekbikes.com/gb/en_GB/bikes/bikepacking-and-touring-bikes/520/520/p/24000/">Trek 520</a> is Trek's best bike. It's called a 'touring bike' because you can ride it for thousands of miles without anything breaking. They call it that because they don't want everyone realising it's a million times better value than their awful 'hybrid' commuter bikes.</li>
  <li>Another medium option ($1500 or less): The <a href="https://www.salsacycles.com/bikes/road/Fargo">Salsa Fargo</a> hits similar notes as the Trek 520, though with a slightly more modern design.</li>
  <li>Another medium option ($1300 or less, but customisable to very fancy level): <a href="https://tumbleweed.cc/collections/products">Tumbleweed cycles</a>.</li>
  <li>Getting fancier: <a href="https://stoogecycles.co.uk/stooge-shop/">Stooge Cycles</a>.</li>
  <li>The fancy option ($2000+): <a href="https://www.rivbike.com/">Rivendell</a> is about as good as it gets for commuters. You likely won't get all of Grant's design decisions now -- threaded headets, older bottom bracket standards, antique wheel spacing, rim brakes, etc. all seem like retrogrouch nonsense until you've fixed and broken fancy new components a million times. Buy one of these and you can ride it every day until you die (old and healthy and with full pockets due to your reduced maintenance costs).</li>
  <li>The folding fancy option ($1500+): <a href="https://www.brompton.com/">Brompton</a> makes battle-tested, proven reliable folding bikes for folks who want to take a bike on public transit, into the office, and even into the pub without much faff. And, of course, they last freakin' forever. 20-30 year old bromptons go for prices similar to the modern equivalents because they basically never die.</li>
</ul>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/2024_11_14/also_also_top_tier.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/2024_11_14/also_also_top_tier.webp" alt="An excellent buy. Metal frame. No suspension. Rear fender. High, swept-back handlebars. Friction shifting. Big tires. Disc brakes. No batteries." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">An excellent buy. Metal frame. No suspension. Rear fender. High, swept-back handlebars. Friction shifting. Big tires. Disc brakes. No batteries.</figcaption>
</figure>

<p>There are other good brands out there. But most brands sell cheap plastic garbage that will break and wind up in a landfill in 5-10 years. All of the options above should last you a lifetime.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The bike industry has an <em>insane</em> amount of bullshit floating around. So many people will tell you that you need the latest tech from some special brand, or that you can't use something old because it's 'outdated', or that the lack of some critical feature ruins a bike. That is not true. Bikes are fun. They are inherently simple. They are inherently easy (once you learn a few tricks -- see <a href="https://www.sheldonbrown.com/">Sheldon Brown</a> and Park Tool's repair videos and manuals) to maintain yourself, and cheap to pay someone else to maintain if you buy the right things.</p>

<p>I see so many people get swept up in the deluge of feature churn I refer to as <em>the sauce</em>. If you want to race, I understand. Some people like that. I don't, but I don't judge you for doing it. But please don't push everyone in the racing direction. If you <em>don't</em> want to race, if you just want to get around on a bike instead of driving or walking everywhere, if you think a bike could be fun and relaxing, there is a better way.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[All bicyclists ride bikes. But not all bike riders are bicyclists. I'm a bicycle enthusiast: someone who spends enough time riding and repairing bikes to know a thing or two about them. But I'm not a bicyclist, because I don't race my bike, or care about power meters or pacing or compete in events. I wrote this article to help non-bicyclists better understand bikes: which to buy, what features truly matter to the average rider, and what features only exist for the benefit of Olympians. If you race bikes, you can safely ignore all of this advice. I'm speaking to people who just want to get around on their bikes, not people who want to min/max stats. Think of what I'm describing as the "Honda Civic of bikes". If you know what drafting is and you want to do it, ignore me.]]></summary></entry><entry><title type="html">Some Thoughts on Malazan Book of the Fallen</title><link href="https://www.lambdalatitudinarians.org/techblog/2024/01/26/malazan/" rel="alternate" type="text/html" title="Some Thoughts on Malazan Book of the Fallen" /><published>2024-01-26T21:47:53+00:00</published><updated>2024-01-26T21:47:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2024/01/26/malazan</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2024/01/26/malazan/"><![CDATA[<p>I just finished a very, very, very long read of Steven Erikson's <em><a href="https://en.wikipedia.org/wiki/Malazan_Book_of_the_Fallen">Malazan Book of the Fallen</a></em> series. This is the second-longest series I have every read, second only to <em>The Wheel of Time</em>. But <em>Malazan</em> stands out as perhapas the most unusual, most unique, and most impactful series I have ever read. It has been a long time since a piece of writing made me think this much. Allow me to explain...</p>

<!-- readmore -->

<h2 id="length">Length</h2>

<p>It's long. Hella long. 11,000 pages across 10 books. 3.4 million words (over three Harry Potters, 7 Lord of the Rings, and 0.8 Wheel of Times). And it's not just pulp fiction that allows you to churn through a book in a week if you have the time: it is dense. At my very fastest reading pace between jobs, with no commitments during a dark, rainy couple of weeks, I think I finished a book in three weeks. And it was <em>exhausting</em>. Fast readers might pull off a month per book, slower early on.</p>

<h2 id="style">Style</h2>

<p>It all starts with prose: Erikson might be an Ent. He rumbles along, describing characters, settings, historical events, personal backstories, historical events, and internal philosophical monologues almost in spite of the reader. You're along for the ride, but only if you run alongside the tracks, match the train's pace, and jump onto the caboose like some early 1900s vagabond. And you'll spend the next 11,000 pages fighting your way up to the engine, <a href="https://en.wikipedia.org/wiki/Snowpiercer">Snowpiercer</a> style. The magic system, geography, races, names, cities, streets, command structures, transportation, and more all show up with the barest explanations. You will become a detective, figuring out what's going on almost purely through context clues. Upon writing that, I'm not sure that sounds that great, but trust me, if you love a rich fantasy universe or a reading challenge, it's an immensely satisfying way of digging deeper and constantly proving that Erikson really has thought all of this out.</p>

<h2 id="breadth">Breadth</h2>

<p>The sheer breadth of the magic system, civilizations, races, timespan, food, characters, major events, battles, gods, and realms of this series is genuinely breathtaking. As in you will run out of breath just trying to explain the breadth, let alone listing everything in any of those categories. At the end of each book, you assume that the series can't possibly sprawl any further, or tease another mystery, or expose another layer of complexity... until the next book does. And then the next book does it again. And again. Literally until you reach the final book. The breadth of <em>Malazan</em> makes the Silmarillion look like the Hobbit.</p>

<h2 id="execution">Execution</h2>

<p>I do not trust authors implicitly. This review, and of course the <em>Malazan</em> series itself, promises a lot. Enough that I mistrusted the author, even with the lofty recommendation of a close friend. I've read a lot of broken promises: A Song of Ice and Fire. <a href="https://en.wikipedia.org/wiki/The_Name_of_the_Wind">The Name of the Wind</a> (and the sequel). So I understand that sometimes authors bite off more than they can chew. The Wheel of Time (which I read partially as a shibboleth of commitment to epic fantasy series) doesn't break promises, but the original author <em>did</em> pass away before he could finish it and a lot of plot threads were severed or lubricated to make a clean ending.</p>

<p>So I naturally assumed that Erikson would cut some corners by the 8th, 9th, or 10th book. I thought loose ends would bother me at the end of <em>Malazan</em> the same way they did at the end of so many other series, where nitpicks and issues can easily tarnish my memory. Maybe it's the hundreds of hours and couple of years of reading time manifesting as some kind of sunk-cost Stockholm syndrome, but Malazan didn't cut corners. (I did take breaks with <em>The Expanse</em>, <em>Hyperion</em>, <em>The Broken Earth</em> Trilogy, and a whole bunch of history books, so it's not like I <em>only</em> read <em>Malazan</em> this whole time; doing that for two years might genuinely give you Stockholm syndrome)</p>

<p>But I can say that <em>Malazan</em> satisfied me in a way that few series ever have. The ending is not without its flaws; some plots end on a much happier note than I would ever have predicted, and not everything gets wrapped up in a neat bow. But I walked away form the second epilogue with a sense of content and finality I rarely get from a book series. It reminds me the most of finishing The Hobbit when my age still numbered in the single digits; I could barely believe just how <em>much</em> story, creativity, and universe I had just witnessed. And it reminds me of when I finished <a href="https://en.wikipedia.org/wiki/Anathem">Anathem</a> in my early teens, a book whose invented language and philosophy represented a huge leap past the James Patterson pulp I'd been devouring throughout middle school (bonus points to young me for reading an ebook copy <em>that lacked the appendix</em> defining Stephenson's invented words).</p>

<p>This is the thing that really convinced me that Malazan is something special, something more than just another epic fantasy: I felt like I had just finished <em>literature</em>. Something at a higher level of writing than any other fantasy book or series I have ever read. I haven't read all of Infinite Jest, Finnegan's Wake, or Ulysses, but I suspect the feeling is similar.</p>

<h2 id="heart">Heart</h2>

<p>Empathy and compassion are deeply important to the core conflict of <em>Malazan</em>. You can tell how much Erikson believes in that core argument because of the sheer number of perspectives presented throughout the series: <a href="https://old.reddit.com/r/Malazan/comments/ludjoj/how_many_povs/">according to highly reputable online source JaminJedi, 453 separate POV characters</a>.</p>

<p>Some characters seem interchangeable, such as the large number of soldier POVs that are used in aggregate to present battles, troop movements, and tensions. In these mosaic slice-of-life scenes, we bounce between different characters every few paragraphs, often spending less than a page per character. But the combined thoughts, words, and views of each character produces something richer than a commander going over a battle plan or even a single scene where one character moves around the troops. This feels like a new level of character writing I've never experienced before: instead of just writing individual characters (which Erikson absolutely does, don't worry), he's also characterizing <em>groups of characters</em>. And just wait until you get to the banter -- some of Erikson's best group writing happens in duos of two characters, be they friends, enemies, lovers, or all of those things combined.</p>

<p>Some characters show up early in the series and stick around for the full 10 books (don't worry, I won't spoil who). The grow, they change, and you find yourself rooting for them -- good or evil (not that anyone is truly evil in this series -- like ASoIaF, everything is about shades of grey).</p>

<p>Some characters provide a POV for a single scene, then disappear, never to be heard from again.</p>

<p>And sometimes you don't even know which character provided a perspective. Hard to imagine, I know. But it does happen (only occasionally -- and you can usually figure out who it was later on from context clues).</p>

<p>I've read a lot of books that use perspective to tell stories through more than just one set of eyes and ears (or one omniscient narrator's not-eyes and not-ears). But the empathy you develop for so many different characters across so many different cultures and worlds in this series is something else. And when you get scenes from the perspective of multiple characters, you're forced to reassess exactly what happened in the scene (if you've ever tried reading ASoIaF's <a href="https://old.reddit.com/r/asoiaf/comments/g7zksj/the_boiled_leather_reading_order_combining_a/">Boiled Leather reading order</a> and you gained a whole new perspective on Sam and Jon's interactions, you'll know a tiny bit of what I'm talking about -- that sort of thing happens a <em>lot</em> in <em>Malazan</em>).</p>

<p>The sheer number of POVs was a big challenge for me. It's hard to keep the characters straight when you jump between them so often.  It's tough to get to know anyone individually, to build that emotional connection in just a few paragraphs. But don't worry: you have plenty of time to get used to it over 11,000 pages. One piece of advice? Try to read entire chapters at a time, they're almost always meant to be read all at once to convey a common theme and message. I know it's hard to believe that that's possible with so many POVs, and it's tough to keep reading the full chapter length if you're reading in bed and getting sleepy, but I promise, it's worth it. Remember that the scenes with the marines are almost always a big mosaic of what's happening in the entire military group and you'll wrap your head around it eventually.</p>

<p>Anyway, there's a huge amount of characters in these books. And they're somehow all unique, thoughtfully explored, and full of rich detail that helps expand the universe even further than you thought possible. You can write the coolest magic scenes and the most epic battles imaginable, but you need an emotional core of characters to grant weight to those scenes.</p>

<h2 id="conclusion">Conclusion</h2>

<p>So if you've made it this far and you love epic fantasy (or just great fiction), give <em>Malazan Book of the Fallen</em> a try. You may wonder what the hell the titles means; you'll figure it out (at least twice, if not three or four times) eventually. I promise that it is a good name for the series, and you'll probably like it too once you understand.</p>

<p>You will laugh. You will cry. You will get very frustrated about the things that Erikson doesn't explain in the first or second books (feel free to reach out for a low-spoiler magic explanation if this holds you back). I really think every fantasy fan should try this series. It is something truly new (if something written from 1999-2011 can be called <em>new</em>), truly delightful, and worthy of being called the first epic fantasy <em>literature</em> I have ever read.</p>

<p>Special shoutout to Tor for their AMAZING <a href="https://reactormag.com/columns/malazan-reread-of-the-fallen/">Malazan Reread of the Fallen</a> blog series, which provides a spoiler free summary, first-time reader reaction, and re-reader reaction to every single chapter of every single book of the series. Bill and Amanda did a monumental amount of work with this series and really helped me get a grip on the series when I was confused early on (and made sure I didn't miss any subtle plot points later on!).</p>

<p><em>PS: But maybe read the other big fantasy series first -- I'm midway through Mistborn now, and even though I like it, it is hard to measure up to the writing and scope of Malazan and I fear I might have broken my fantasy-reading brain.</em></p>

<p><em>PPS: If you try Gardens of the Moon and just find it too damn confusing because of the dozens of POVs, seriously consider picking up House of Chains. The first HALF of the book is all one single continuous POV of a new character in a new location so you won't hit any serious spoilers and you'll get to ease yourself into Erikson's style without fitting all those crazy characters and POVs in your head at the same time.</em></p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I just finished a very, very, very long read of Steven Erikson's Malazan Book of the Fallen series. This is the second-longest series I have every read, second only to The Wheel of Time. But Malazan stands out as perhapas the most unusual, most unique, and most impactful series I have ever read. It has been a long time since a piece of writing made me think this much. Allow me to explain...]]></summary></entry><entry><title type="html">Book Review: The Lost Cause</title><link href="https://www.lambdalatitudinarians.org/techblog/2023/11/20/book-review-the-lost-cause/" rel="alternate" type="text/html" title="Book Review: The Lost Cause" /><published>2023-11-20T18:17:53+00:00</published><updated>2023-11-20T18:17:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2023/11/20/book-review-the-lost-cause</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2023/11/20/book-review-the-lost-cause/"><![CDATA[<p>I recently finished reading <em>The Lost Cause</em>, by Cory Doctorow, which asks (and answers) the question: <em>Do some people seriously want to watch the world burn?</em>. Here are my thoughts on the book.</p>

<p><em>Warning: This post contains (minor) spoilers!</em></p>

<!-- readmore -->

<p>It's no secret that the <a href="https://www.weforum.org/agenda/2023/03/polycrisis-adam-tooze-historian-explains/">polycrisis</a> is on a lot of folks' minds right now. In the last year, I've already read two other books on the subject: Neal Stephenson's <em>Termination Shock</em> and Kim Stanley Robinson's <em>The Ministry for the Future</em>. Like a good glass of orange juice, <em>The Lost Cause</em> is both pulpier and more digestible than either; <em>Lost</em> has more optimism than <em>Termination</em> and more realism than <em>Ministry</em>. Both of those books talk a lot about fixing the climate crisis, but <em>Lost</em> is the first I've read where the protagonist physically does something about it.</p>

<p><em>The Lost Cause</em> takes place in the near, but not-too-near future; perhaps 2050. The world has moved far past coronavirus and Trumpian politics, but the scars are lasting. Politics is best represented as a triangle of ideologies:</p>

<ul>
  <li>
    <p>Young <a href="https://en.wikipedia.org/wiki/Green_New_Deal">Green New Deal</a>-inspired idealists fight for sustainability, fairness for those displaced by climate change, walkability, density, public transit, and an eco-conscious mode of living reminiscent of Becky Chambers' <a href="https://bookwyrm.social/book/248869/s/a-prayer-for-the-crown-shy">Monk and Robot</a> series.</p>
  </li>
  <li>
    <p>Conservative landowners, referred to as <a href="https://en.wikipedia.org/wiki/Make_America_Great_Again">MAGAs</a>, advocate for exclusionary, stable politics -- freezing the world in the 1980s, refusing to make any lifestyle changes to the way they eat, transport themselves, or sleep.</p>
  </li>
  <li>
    <p>Wealthy 'entrepreneur' <a href="https://en.wikipedia.org/wiki/Plutocracy">plutocrats</a>, driven out of the United States during the 8-year reign of a highly progressive president, roam the seven seas in a flotilla of cruise ships and aircraft carriers, pitching 'free market solutions' that extract maximum profit from the climate crisis.</p>
  </li>
</ul>

<p>Our story unfolds from the perspective of a young <a href="https://en.wikipedia.org/wiki/Burbank,_California">Burbanker</a>, Brooks. His (liberal Green New Deal-inspired) parents died in a grisly pandemic when he was young, forcing young Brooks to move in with his ornery Maga grandfather. In the 90s, this might have been a setup for a brilliant sitcom where an old conservative parent and a young progressive kid mutually enrich each other with valuable life lessons derived from very different worldviews. Today, it's a lot more depressing.</p>

<p>At the beginning of the tale, Brooks' world is shattered: he graduates high school, his grandfather passes away, he inherits a single family home in Burbank, and his grandfather's Maga friends start to pressure Brooks to conform to their politics. Soon, a group of climate refugees move into town, and Brooks joins the effort to house them.</p>

<p>Brooks befriends, falls in love with, cooks food with <a href="https://www.thefreelibrary.com/Food+Fantasies+in+George+R.+R.+Martin.-a0531977726">George R. R. Martin levels of recipe detail</a>, fights with, and makes up with his new group of idealistic friends. As time goes on, Brooks grows more and more radical, losing patience for the bureaucratic nightmare of modern politics that has utterly failed the Burbank refugees and the world at large. The young Green New Dealers take one step forward to help climate refugees or mitigate the effects of climate change, and the Magas force them two steps back, backed by the moneyed interests of the Flotilla plutocrats. Fights break out on social media and meatspace.</p>

<p>Our swashbuckling young hero has a few mental breakdowns and makes a few missteps as he learns how to best navigate his brave new world. Along the way, we learn about the best (and worst) ways to fight the Magas and the tech entrepreneurs of the Flotilla. Everything wraps up at the end with a big showdown that thankfully fizzles out in the shadow of Yet Another Climate Crisis.</p>

<p>Overall, I really enjoyed this book. It's the first book in a while that I genuinely had a hard time putting down. Part of that stems from my general agreement with everything Doctorow stands for, but the other part stems from the fact that this is just a <em>really good read</em>. The characters all talk exactly like Cory Doctorow, but they all have rich personalities, strong backstories, and their actions make perfect sense given those foundations. Characters frequently disagree and (mostly politely) discuss their perspective about how best to solve problems. It's probably a shade too optimistic, but if the last 5 years of the real world has taught me anything, it's that <a href="https://time.com/5894565/interruptions-insults-presidential-debate/">discussions with impolite jerks are really really boring</a>.</p>

<p>I really enjoyed when Doctorow dives deep into oft-omitted mundane plot details like splitting a bill for croissants between a big group of people, finding a rental bike to ride across town, and the distinction between <a href="https://en.wikipedia.org/wiki/Eritrean_cuisine">Ethiopian and Eritrean food</a>. Those details may seem small, even boring, but when it comes to writing a book about the near future, I find them invaluable. Characters teleporting around town and eating takeout meals with no regard for expenses annoys me in pretty much all media, but it's unforgivable in a novel that asks us to imagine a better way of living. After all, that stuff is 50% of living!</p>

<p>Monopolies and oligarchies occupy a lot of my brainspace these days, and seem like an obvious cause of a lot of societal problems. While Doctorow doesn't focus <em>The Lost Cause</em> on the subject, he <em>does</em> drop a lot of hints about "Baby Googles" and "Baby Warners" that suggest a solution to an obvious current day problem. Plus, it's hard to not chuckle at "Duck Duck Google".</p>

<p>I do worry that Doctorow's characterization of Magas and tech entrepreneurs is a bit too simplistic. But my experience talking to people in the real world about those philosophies has always seemed awfully one dimensional, so perhaps he's not that far off from reality.</p>

<p>TL;DR: <em>The Lost Cause</em> gives me hope that we can move forward from the identity politics, monopolies, late stage capitalism, climate carelessness, and bureaucracy of the early 2000s. Some dialogue reads a bit like Doctorow sock-puppet philosophical theatre, but it's inspiring to read anything where characters actually solve a problem instead of playing political chess or shooting each other.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I recently finished reading The Lost Cause, by Cory Doctorow, which asks (and answers) the question: Do some people seriously want to watch the world burn?. Here are my thoughts on the book. Warning: This post contains (minor) spoilers!]]></summary></entry><entry><title type="html">Give the Gift of Reading</title><link href="https://www.lambdalatitudinarians.org/techblog/2023/03/24/give-the-gift-of-reading/" rel="alternate" type="text/html" title="Give the Gift of Reading" /><published>2023-03-24T18:17:53+00:00</published><updated>2023-03-24T18:17:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2023/03/24/give-the-gift-of-reading</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2023/03/24/give-the-gift-of-reading/"><![CDATA[<p>This season, give the gift of reading.</p>

<!-- readmore -->

<p>Somewhere out there, a blogger is writing a post much like this one.</p>

<p>If you harbor kind feelings about blogging, this might conjure up thoughts of diamonds in the rough: fantastic blog posts just waiting to be discovered.</p>

<p>If you harbor not-so-kind feelings about blogging, you might think of piles of shit, screeds and manifestos and mad ravings.</p>

<p>There are a lot of bloggers out there, and it's easy to feel like they're the ones whose time matters when it comes to posting on the internet.
But you know what's just as important? The people who read, appreciate (or hate) and occasionally let bloggers know when they really loved a post.</p>

<p>I try to reach out and thank bloggers when I read an especially interesting post.
I've made some great friends (and had faith in humanity restored) by people who liked my blog or appreciated me reaching out.
So the next time you read a blog post and really love it, consider reaching out and letting the author know with an email.</p>

<p>Worst case, it goes to spam.
Medium case, it brings a smile to their face.
Best case, they also like YOUR blog and you make a new connection. I like to imagine the best case is more common than we think.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/the-more-you-know.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/the-more-you-know.webp" alt="🌈🌟The more you know🌈🌟" height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">🌈🌟The more you know🌈🌟</figcaption>
</figure>

<p>And thank you to everyone who reads this blog. I've never tried to gain followers or engage or target any kind of real audience. But if you take any amount of your valuable time on this planet to read this blog and either learn something or get a chuckle out of it, I appreciate you.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[This season, give the gift of reading.]]></summary></entry><entry><title type="html">Review: Babel, or the Necessity of Violence: an Arcane History of Oxford Translator&apos;s Revolution</title><link href="https://www.lambdalatitudinarians.org/techblog/2023/03/22/review-babel/" rel="alternate" type="text/html" title="Review: Babel, or the Necessity of Violence: an Arcane History of Oxford Translator&apos;s Revolution" /><published>2023-03-22T18:17:53+00:00</published><updated>2023-03-22T18:17:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2023/03/22/review-babel</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2023/03/22/review-babel/"><![CDATA[<p>I recently finished reading <em>Babel, or the Necessity of Violence: an Arcane History of Oxford Translator's Revolution</em>, by RF Kuang. Here are my thoughts on the book.</p>

<p><em>Warning: This post contains spoilers!</em></p>

<!-- readmore -->

<h2 id="the-setting">The Setting</h2>

<p>1830s, England. An alternate history with one crucial difference from reality: magic silver bars bearing "match-pair" words.
In Kuang's world, you can write two words in different languages with similar meanings on opposite sides of a silver bar, and if someone who understands both words reads the match-pair aloud, magic...sometimes...happens. But only if they think really hard?
The magical effect stems from the disparity in meaning behind the two words in the match-pair.</p>

<p>For instance, in the very first chapter, someone cures cholera using a bar bearing the words "Triacle" and "Treacle".
According to the book:</p>

<blockquote>
  <p>the word treacle was first recorded in the seventeenth century in relation to the heavy use of sugar to disguise the bad taste of medicine. [This] traced back to the Old French '<em>triacle</em>', meaning 'antidote' or 'cure from snakebite', then the Latin <em>'theriaca'</em>, and finally to the Greek <em>'theriake'</em>, both meaning 'antidote'.</p>
</blockquote>

<p>When Professor Lovell uses the match-pair "Triacle/Treacle" on Robin, Robin tastes something sweet in his mouth and stops dying of cholera.</p>

<p>Another prominent early-book example: "Wúxíng" (Chinese: formless, shapeless, incorporeal) and "Invisible". This time, it's used to make people disappear, with the following description:</p>

<blockquote>
  <p>No, <em>disappeared</em> was not quite the word for it. Robin didn't have the words for it; it was lost in translation, a concept neither the Chinese nor the English could fully describe. They existed, but in no human form. They were not merely beings that couldn't be seen. They weren't beings at all. They were shapeless. They drifted, expanded; they were the air, the brick walls, the cobblestones. Robin had no awareness of his body, where he ended and the bar began - he was the silver, the stones, the night.</p>
</blockquote>

<p>Later in the book, bars are used to speed up ships, assist with horse-driven cart steering, keep mining carts from jumping tracks, increase steam engine power, inflict crippling pain, injure thieves, reinforce foundations for structures that wouldn't otherwise hold themselves up, blow up someone's chest, make grandfather clocks sound exactly like real birds, and all kinds of other banal tasks you could absolutely accomplish without magic. Some of these tasks happen in an instant, activated and used once when a translator reads the match-pair. But many are "always-on", apparently activated once, then kept functional through an even more esoteric "maintenence schedule" run by the Royal Institute for Translation (henceforth in this review known as RIT). As we later see, much of that maintenence is done by RIT undergraduates, and doesn't require any translation or silverwork at all, mostly just polishing.</p>

<p>The only non-banal magic I can remember? At one point, our heros animate paper pamphlets to fly around and harass people. They use the match-pair "Polemic" and "Polemikós" (Greek: war). But right after Kuang mentions that pair for that purpose, a character technobabbles that despite knowing the word pair, they haven't quite figured out how to "connect the semantic warp with the right medium". Apparently that involved the Latin word "discuter", which means "to scatter or disperse", despite the fact that discuter is not part of the word pair.</p>

<p>A few other examples:</p>

<ul>
  <li>"Pomodoro" (English: fancy term for tomato")/"pomme d'amour" (French: toffee apple) to flavor-enhance tomatoes</li>
  <li>"Bào" (Chinese: fire, violence, cruelty, turbulence)/"burst" to explode someone's chest</li>
  <li>"Mingbai" (Mandarin: bright white)/"understand" to make a bright, white light shine from the bar</li>
  <li>"metus" (Latin: fear, dread)/"meticulous" to induce a chilling anxiety whenever the user errs in their work</li>
</ul>

<p>We're told at some point that cognates (words with a common ancestor, usually indicated by a similar form) are important. But not required.</p>

<p>Finer silver enhances the effect of a bar; tarnishing reduces it. Bars don't seem to last forever; some have a finite number of uses, and some only last a few years. But it's unclear how that manifests over time: does the bar actually <em>degrade</em>? Or does it just stop working?</p>

<p>The <em>Treacle/Triacle</em> match-pair uses something called "daisy-chaining" which is never explained.</p>

<p>Unfortunately, none of this makes any sense to me beyond the vague notion that if you write two kinda-similar words in different languages on a silver bar, you'll get a random magical effect that's kind of related to one of the words. This entire alternate history is based on a mechanic <em>that is never fully fleshed out</em>. Especially when it comes to the poorly explained "daisy-chaining", "semantic warp" and activation issues, I just don't think Kuang gives us enough material to even loosely understand silver magic. Maybe you find this frustrating, maybe you don't. But I find it difficult that the mechanic that forms the foundation for the entire universe just doesn't make sense to me. I have no problem suspending disbelief -- just ask the Harry Potter series on my bookshelf. But I find it very frustrating to partially explain a mechanic in pages and pages of "classes" devoted to that very mechanic, but never actually explain it in a satisfying way. Either lay out some <a href="https://www.brandonsanderson.com/sandersons-first-law/">magic system rules</a> or commit to truly inexplicable magical realism.</p>

<p>On the bright side: Kuang did a great job researching and showing a compelling 1830s version of Oxford, right down to the pubs and street names.</p>

<h2 id="the-characters">The Characters</h2>

<p>OK, enough beating on a dead horse: we'll just have to accept that the core magic silver mechanic at the root of this universe doesn't really make sense. It sucks if you care about worldbuilding as much as I do, but it's one small part of a novel. Let's focus on the characters instead: who are they, and how do they develop throughout <em>Babel</em>?</p>

<p>You've got the "protagonist crew" of student translators at RIT:</p>

<ul>
  <li>Robin</li>
  <li>Ramy</li>
  <li>Victoire</li>
  <li>Letty</li>
</ul>

<p>The (literally) underground Hermes resistance movement:</p>

<ul>
  <li>Griffin</li>
  <li>Anthony</li>
</ul>

<p>And the college professors:</p>

<ul>
  <li>Professor Lovell</li>
  <li>Professor Craft</li>
  <li>Professor Chakravarti</li>
  <li>Professor Playfair</li>
</ul>

<p>And a smattering of uppity, racist, rich white people with no redeeming qualities whatsoever. My personal favorite example? A rich Oxford undergraduate with an alcohol abuse problem, a penchant for sexual harassment, and a talent for writing some of the worst poetry known to man. At one point he spends several paragraphs attempting to light a magically protected stone building on fire. I'm sad to say that there are a lot of characters like this with no nuance at all. They exist mostly to reinforce the idea that Oxford, RIT, and the British Empire in general are corrupt, racist, and unjust. But I felt like they were hitting me over the head a little <em>too</em> hard to convince me of things I already know and already agree with.</p>

<p>The "protagonist crew" gets the most page time -- Robin provides the perspective for most chapters, and the other crew members each get a chapter devoted to their background and current mental state at some point in the book. We get the sense that these characters are all deeply flawed, but also care immensely for the rest of the protagonist crew. But, as the book continually reminds us at the beginning of a multitude of chapters, these characters will hurt each other eventually!</p>

<p>The Hermes movement is best described as "cool smart older students" but they never really get a chance to shine. For the first half of the book, all you know about Hermes is Griffin, Robin's half-brother and Hermes hookup. He exists mostly to taint Robin's love affair with RIT, and also to hint at general Important Things that Hermes is doing and Bad Things that RIT is doing without ever telling you anything concrete. Near the end of the book, you might start to <em>think</em> you're learning about Hermes... but then Kuang promptly murders all of the senior members we've ever met so we never get to find out anything specific. If you're hoping for one of those sweet, sweet lore dumps where a wizened veteran character gives us the lowdown on the RIT-Hermes struggle over the past decades, and the plan for future decades, don't get your hopes up. There is no lore here, just a few skinny undergrads hanging out in an abandoned library.</p>

<p>Most of the professors are best described as "old, slow, mean, and incompetent." Even the most sympathetic of these characters (Craft and Chakravarti) are overshadowed by the protagonists. Personalities are, at best, hinted at -- Craft loves tea and has no patience for freshers; Chakravarti is a little bit of a rebel. But in the end they are merely pawns, moved around the plot for the convenience of Robin. We don't know if they're married, have kids, their stance on any of the political issues that other characters discuss to death (sometimes in their presence) and in the final chapters of the book they mostly exist to lend gravity to suspicions and ideas that Robin has. In the end, Chakravarti decides not to participate in mass genocide or suicide, and ends up being horrifically tortured as a result. Professor Craft decides to participate in mass genocide and suicide. Robin doesn't spare a "thank you" or a "sorry" for either of them, and you'll likely forget their names before you finish the book.</p>

<p>Professors Playfair and Lovell are best described as "sort of smart and evil but not as smart as Robin because they're racist." I especially enjoyed the scene where Playfair pretends to be part of Hermes to try to trick Robin into giving up information: instead of a battle of wits between two razor-sharp minds, you get a scene that unfolds something like an elementary school student making up a lie about "someone having a crush" on the playground. At first, you can ignore these simplistic characters while you hope for more development. But as the remaining pages wane, you'll find yourself asking more and more: "is this it?"</p>

<h3 id="robin">Robin</h3>

<p>At first, Robin shows signs of brilliance. He cares deeply about language and his friends. He's deeply motivated to be as good as he can be at whatever he chooses to do. He experiences emotional turmoil when he discovers the identity of his father, a secret half-brother he never knew about, and an invitation to participate in an underground movement with the ultimate goal of undermining the social injustice of Babel.</p>

<p>His arc is a twisted version of <a href="https://en.wikipedia.org/wiki/Bildungsroman">bildungsroman</a>: Robin comes of age, learns about the dirty secret nastiness that permeates the "real world," but instead of rising to the occasion, he becomes a terrorist. He no longer cares about his friends, his family, his country, his adopted country, or the lives of anyone else. Worse, he's a <em>bad terrorist</em>: he requires help from people who sympathize with him, poor judgment in his enemies, and his terrorist acts inflict equal setbacks to his allies and enemies.</p>

<p>You might view Robin's development as a cynical take on what racism, reality, capitalism, and societal conflict do to a bright young kid. All he wants is to be accepted and successful. But Hermes pulls back the veil on the ugliness of Babel that he previously ignored. Robin can't decide between what is right and what is practical, and in the end, he chooses neither.</p>

<h3 id="ramy">Ramy</h3>

<p>The least defined of the "protagonist crew." He cares deeply for his friends. He not-so-secretly harbors a hatred for white people, often engaging in elaborate lies and stunts to mock and cope with racism. He's not-so-secretly in love with Robin. He's brilliant in the first few chapters, serving as a mature foil for Robin's naivete. Once Robin matures into his college student phase, Ramy just kind of exists as a source of unimportant in-group conflict until he's eventually murdered.</p>

<p>Ramy's a sacrificial lamb: a character too pure, too endearing, too perfect to exist in the book's nonsensical conclusion. So Kuang kills him off to silence him.</p>

<h3 id="victoire">Victoire</h3>

<p>Hates white people slightly less than Ramy. Is more afraid of white people than Ramy or Robin. Surprisingly does NOT get murdered.</p>

<p>Victoire is another foil to Robin: instead of corrupting to the point of internal breakdown, she takes a practical stance to resisting the British Empire. She'll condone genocide, but not suicide. In Victoire's chapter, we learn her sad past: raised as a pseudo-slave in France after her benefactor unexpectedly passes away. She discovers a way to escape her circumstances through RIT. Trouble is, the very racism and inequality she's trying to escape are deeply rooted in RIT itself.</p>

<p>Victoire is an unbroken version of Robin, who learns how to think for herself instead of parroting whatever ideas role models espouse. But she is ultimately a tragic tale as well: sure, she escapes the mass suicide at RIT. But she ends up isolated from everyone she's ever known, with next to no leads on far-flung Hermes connections, and the added obstacle of being Black <em>and</em> a woman. It feels as if Victoire mostly exists to validate Robin's poor decisions, proving that their situation was so impossible there was no "win" scenario: only variations of "lose."</p>

<h3 id="letty">Letty</h3>

<p>Betrays the rest of the "protagonist crew". Daughter of an Admiral in the British Navy, but likes to remind her friends that she's actually poor because her father is angry at her and cut her off (never mind the RIT stipend, which is so generous that Robin claims he can go out to dinner whenever he wants). Resents her family and society for prioritizing her idiot brother's education over her own.</p>

<p>I don't feel like the book gives us a compelling enough reason for Letty's betrayal. The entire first two-thirds of the book remind us over and over again how much the "protagonist crew" love each other.</p>

<p>In the middle of the story, the book hints at Letty's unrequited love for Ramy.
Despite a semester of interpersonal conflict in the protagonist crew, Kuang eventually stops mentioning it.</p>

<p>After Robin murders Professor Lovell, Robin, Ramy, and Victoire start ignoring Letty entirely. She's clearly very upset about the fact that her friend group just covered up a murder. But the rest of the crew doesn't have any empathy for Letty; they just prod her along in the direction they want to go in. They refuse to discuss Hermes around her, and cut her out of communication entirely.</p>

<p>Eventually, the crew flees Oxford entirely and goes into hiding with Hermes. Hermes, which previously walled off information through a distributed cell structure, invites the entire crew right into their headquarters, makes them dinner, and starts immediately discussing their most detailed plans to disrupt RIT.</p>

<p>The distraught Letty soon betrays the entire group by leaving, alerting the police, and shooting Ramy. Oh also Letty is a really good shot with a pistol, because she's an Admiral's daughter. Feels like something Kuang could have set up earlier in the story, and it would have given Victoire an interesting character trait to boot.</p>

<p>Still, my criticism remains: despite the fact that the protagonist crew had their differences, it was both unexpected and unbelievable for Letty to decide to murder one of them, destroy the epicenter of Hermes, and betray all of her close friends. It is one thing to be upset with your friends; it is altogether another thing to shoot one of them in the heart. Kuang alludes to unrequited love as a reason for Ramy's murder -- something along the lines of "white girl couldn't bear rejection by Indian man." I'm willing to believe that storyline, but I never got the sense that Letty harbored that kind of latent racism. Sure, she's incredibly ignorant of the struggles faced by Ramy and Robin. But <em>Babel</em> goes to great lengths to explain the struggles faced by Letty and Victoire -- having to dress in slacks and pretend to be men when walking at night, not being allowed to room within two miles of campus, needing a male chaperone to borrow a book from the library or visit a museum.</p>

<p>Perhaps Letty's development goes over my head because <em>I'm</em> white. Maybe the entire point is a demonstration of systemic racism: illustrating that you can never translate the feeling of oppression to the oppressor. After all, <em>Babel</em> pretty much beats the reader over the head with the idea that white people who empathize with nonwhite people always have some ulterior motive. I suppose I just find that view a bit bleak: I may never be able to completely understand the day-to-day, gritty, lived experience of someone who grew up with an order of magnitude less money, or who speaks another language, or who is hurt by a system that benefits me. But I think that perspective both sells the imagination short -- I may never <em>fully</em> understand it, but I can damn sure empathize -- and pits people against each other for no good reason. After all, it's defeatist to say I can't possibly understand or care: isn't it better to have faith and expect the best of others?</p>

<p>Anyway, I find it unfair to base a pivotal betrayal on the idea that Letty comes from money, and therefore is willing to kill her best friends and loved ones because they don't come from money. The explanation for Letty's action is ultimately unsatisfying: perhaps if we saw a more nuanced conflict -- instead of outright betrayal, Letty flees, is captured, tortured, and <em>leads</em> to the death of a friend -- I'd be more willing to accept her story.</p>

<h3 id="professor-lovell">Professor Lovell</h3>

<p>He's smart! He's evil! He beats children with a cane (strategically, to avoid breaking bones)! He cheats on his wife! He hates non-whites! He loves languages! He's conspiring to start a war with China so they can sell Chinese people more opium and fix the silver trade deficit between China and England! He doesn't remember Robin's mom's name! He won't admit he's Griffin's or Robin's dad! He literally gave Robin a murder weapon, then antagonized Robin to the point where Robin killed him! So I guess he's not so smart.</p>

<p>Lovell is the racist, white, wealthy, manipulative ruling class of the British Empire incarnate. Overconfident, obsessed with power, inconsiderate of ethics or feelings or fairness. Overall I feel like Lovell is underdeveloped: other than his two illegitimate kids and the knowledge that he has a legitimate family he married into for a wealthy dowry and connections, we really don't know anything about Lovell. I think Lovell's origins are a missed opportunity: I'm very interested in seeing how Lovell became the megalomaniacal sadist that he has very much turned into by 1830s. Did he begin his life an idealist like Robin or Griffin? Did he know foreigners during his own education, or mentor some at RIT who defected to Hermes and poisoned his impression of non-whites? Why is he so hellbent on pumping opium into China to extract silver -- does he benefit in some way?</p>

<p>Kuang really should have exploited this when Robin goes through Lovell's office after murdering him. Or perhaps during the Robin-Lovell face-off after Robin fesses up to a Hermes' theft actually perpetrated by Victoire and Ramy. But instead we just get a mustache-twirling megalomaniac. Historically accurate? Sure. But I don't find such one-dimensional characters very interesting. I think it's better to acknowledge that evil behavior has roots in people who <em>think they're doing the right thing</em>.</p>

<h3 id="griffin">Griffin</h3>

<p>Not as smart as Robin. At first, more of a terrorist than Robin. Eventually Robin becomes more of a terrorist than Griffin. Dies because his pocket ace magic silver healing bar didn't work on magic silver hurting bullets.</p>

<p><em>Babel</em> hints at an actual arc for Griffin. We know that Lovell moved him from Canton to England at an early age -- so early, in fact, that he's not truly a native Chinese speaker. As Griffin puts it, he doesn't <em>dream in Chinese</em>. As a result, he struggles to use silver magic, and only sometimes succeeds in activating bars.</p>

<p>We know that he started in a highly competitive cohort several years before Robin comes to RIT. Since then, Griffin murdered another student in his cohort who tried to gather take down Hermes, faked his own death, and became an important (and violent) part of the Hermes operation.</p>

<p>He appears to Robin soon after Robin arrives in Oxford, and immediately begins corrupting Robin. First, through the Surprisingly Actually Coincidental circumstance where Robin comes to the rescue of a group of Hermes thieves when Griffin fails to activate an "invisible" magic bar. Later through secret meetings with Robin where he plants the seeds of doubt about RIT's ethics. And finally by recruiting Robin to secret Hermes missions where he completes the daring task of opening a door for thieves.</p>

<p>So what's the point of Griffin? He demonstrates the dark path of resistance, growing increasingly haggard, desperate, and violent in his struggles against RIT. For a time, it seems like Robin heeds the warning: better to resist RIT in comfort from the inside, rather than struggling on the outside. But eventually Robin finds it just as impossible as Griffin to aid the British Empire.</p>

<p>But in the end, Robin does take a very different path from Griffin. Griffin ends up dying in the street to save some captured and tortured Hermes members. Robin ends up dying in a pile of rubble, taking out a massive heap of silver and a half-dozen RIT members with him. I suppose Griffin makes you question whose sacrifice was more meaningful: Robin, because he made a bigger bang? Or Griffin, because he actually helped somebody?</p>

<h2 id="the-plot">The Plot</h2>

<p>A quick synopsis:</p>

<blockquote>
  <p>Robin learn languages. Robin go to school. Robin join underground resistance group. Robin scared of underground resistance group. Robin go to China. Robin kills dad. Robin goes back to England, rejoins underground resistance group, gets the entire Oxford group of resistance members murdered. Letty turns to the dark (white?) side. Robin takes over the translation school in a fit of domestic terrorism. Robin kills self, all sympathetic translation school members, and ruins a big pile of silver to fuck over the British Empire's magic silver supply. Victoire escapes to probably get other underground resistance group members murdered, accidentally.</p>
</blockquote>

<p>The first half of <em>Babel</em> reminds me of many magical coming-of-age stories: our hero works incredibly hard, long hours to master a difficult subject. The reader enjoys Kuang's rich, detailed, often disturbing portrayal of minorities struggling to fit into 1800s Oxford. The protagonist crew bonds, has good times and bad times together. They study for tests and get up to tomfoolery. It's a compelling universe and the characters are interesting. I couldn't help myself from wanting to learn more about silver, more about RIT, more about all of the peripheral characters whose detailed stories seem to lurk just beneath the surface. It was quite the page turner.</p>

<p>The second half of <em>Babel</em> is frustrating. It becomes clear that the magic system is not very well thought out. You begin to realize that side characters and even major story aspects like Hermes don't actually have much depth to them. If there's one point in the story where my optimism died, it's when Robin saves Victoire and Ramy, who almost get caught raiding RIT for silver bars on behalf of Hermes, by taking the fall for them. It is at this point where I feel characters stopped behaving rationally, actions no longer had meaningful or realistic consequences, and I stopped caring about the plot. This problem only gets worse after Robin murders Professor Lovell, with the protagonist crew plotting perhaps the least convincing murder coverup I have ever heard of. For no good reason, they return to England, muddle their way back to Oxford (leaving a breadcrumb trail of hints about the murder the whole way), narrowly escape being caught and tortured by the RIT staff, and then manage to take down a huge chunk of Hermes with them in their bumbling series of unfortunate decisions.</p>

<p>Finally, Robin and Victoire <em>walk into RIT with no coherent plan</em> and actually manage to take it over. Nobody resists meaningfully. Two professors and multiple students join their resistance for reasons unknown. During the occupation of RIT, every other character fades into the background and Kuang treats us to multiple chapters of Robin thinking to himself about racism. We don't get any meaningful debate, perspectives from the <em>highly educated and sympathetic professors who have been discontent with this system for longer than Robin has been alive</em> or the single named representative of the "working class" who puts up barricades and protests all over Oxford to help Robin's resistance.</p>

<p>And then everyone except Victoire and a faceless undergraduate decide to commit collective suicide to ruin a few tons of silver and all of the collective knowledge stored only in the RIT Babel tower.</p>

<h2 id="silver-as-software">Silver as Software</h2>

<p>I originally thought magic silver would be an interesting comparison to software in our modern world. Like software, magic silver is based on infinitely reproducible language. You can gatekeep the knowledge away from people (especially in developing countries) and use the advantage to exploit them. The people who work on silver and software rarely get to see the full picture, and frequently dodge that pesky issue of ethics because they're just doing knowledge work, not actually exploiting people <em>with</em> that knowledge work. Both magic silver and software contribute to broken systems that exacerbate inequality to exploit more inequality, which exacerbates inequality. Both magic silver and software rely on resources -- for magic silver, languages and native language speakers; for software, rare earth metals, manufacturing, and cheap IT workers -- sourced from poorer regions of the world. Both magic silver and software rely on a subscription model to maximize revenue: intentionally forcing consumers to continually buy upgrades, improvements, and fixes so they can never get off the hamster wheel of capitalism.</p>

<p>It's interesting to think about but the silver mechanic in <em>Babel</em> is so poorly thought out the entire comparison just falls apart eventually. And the conclusion isn't inspiring either; I guess I can read the moral as "don't commit genocide or suicide because it's futile and you'll never manage to make a difference anyway"? Or you can just leave the system like Victoire, but you likely won't make a difference either. Just don't go down like Professor Chakravarti -- he's going to be tortured by the other Oxford professors for the rest of his life because he <em>wouldn't</em> endorse genocide or suicide.</p>

<h2 id="conclusion">Conclusion</h2>

<p>The world of <em>Babel</em> is an interesting one. I just wish the mechanics were better fleshed out, the characters were more interesting, and the underlying subject was approached with a little more nuance. As it stands, it reads like a college student's 500+ page rant about how racism is bad. I would much rather explore <em>why</em> the villains of the story, despite their immense intellect, have such a massive blind spot for racism. The protagonist's struggle is ultimately a failure; he's inflicted serious damage to the British Empire's silver dominance, but even in his dying moments acknowledges that within a few years they'll bounce back. Hermes ultimately accomplishes nothing aside from making a few translation students disappear and stealing some silver from RIT.</p>

<p>A better story would explore how the underground resistance movement and the protesting workers could actually band together to make change happen. Not in a single, ill-fated protest, but on a longer timescale where both organizations could collaborate to ensure equal benefits from magic silver. There would be a whole lot less murder, a whole lot less violence, and plenty of opportunity for the antiracist monologues that Kuang loves so much. My feelings about the book reflect my feelings about the full title "<em>Babel, or the Necessity of Violence: an Arcane History of Oxford Translator's Revolution</em>": Kuang just didn't know when to stop.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I recently finished reading Babel, or the Necessity of Violence: an Arcane History of Oxford Translator's Revolution, by RF Kuang. Here are my thoughts on the book. Warning: This post contains spoilers!]]></summary></entry><entry><title type="html">Review: Sony Xperia XZ1 Compact</title><link href="https://www.lambdalatitudinarians.org/techblog/2023/03/08/review-sony-xperia-xz1-compact.html" rel="alternate" type="text/html" title="Review: Sony Xperia XZ1 Compact" /><published>2023-03-08T18:17:53+00:00</published><updated>2023-03-08T18:17:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2023/03/08/review-sony-xperia-xz1-compact</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2023/03/08/review-sony-xperia-xz1-compact.html"><![CDATA[<p>I recently switched to a "new" smartphone. This post explains why and how.</p>

<!-- readmore -->

<h2 id="background">Background</h2>

<p>Since 2016, I've used an <a href="https://www.theverge.com/2016/3/25/11302968/apple-iphone-se-review">iPhone SE</a> as my one-and-only smartphone. If you aren't familiar with it, it looks almost exactly the same as the iPhone 5S. It has a 4" screen. It fits comfortably in my hand. It only has 64GB of storage. It has a fingerprint sensor, a SIM card slot, cameras, and not much else. The battery is decent -- it lasts about a day of normal use -- but when I travel it can drain pretty fast, especially if I use GPS for a prolonged period of time.</p>

<p>Fortunately, Apple has continued to update the phone to the latest version of iOS every year for several years. Battery replacements are cheap ($30) and pretty easy to do myself. Recent phones outperform the SE's processing power... but honestly, the SE is plenty for my needs: reading a few forums in my browser, messaging friends, managing passwords and authentication tokens, navigating, and taking the occasional photo. It fits in my pocket easily, even when I exercise, and I can use it with one hand.</p>

<p>Unfortunately, Apple stopped updating iOS for the 2016 SE at the end of 2022. It was a good long run, but since devices <a href="https://support.apple.com/guide/deployment/about-software-updates-depc4c80847a/web">miss crucial security updates once Apple stops giving them the latest version of iOS</a> and I've already completed 3 (necessary) battery replacements, I decided I'd hit the end of the line.</p>

<p>The question was: where do I go from here?</p>

<h2 id="requirements">Requirements</h2>

<p>I have very basic needs for a smartphone:</p>

<ul>
  <li>usable with one hand</li>
  <li>pocketable while I run or bike or walk</li>
  <li>fingerprint sensor</li>
  <li>headphone jack</li>
  <li>SIM card slot</li>
  <li>supports ad and annoyance blocking on the web</li>
  <li>enough battery to get me through a busy day</li>
  <li>ample offline storage for music</li>
  <li>decent camera</li>
  <li>definitely less than $1000, preferably under $500</li>
</ul>

<p>Notably, I could not care less about battery-draining overhyped 5G. Check back in 5 years when I decide to upgrade phones again.</p>

<h2 id="really-takes-the-i-out-of-iphone">Really Takes the I out of iPhone</h2>

<p>I've used iPhones since I got my very first smartphone. I love well-crafted iOS apps like Narwhal and NetNewsWire. But when I created this list, I realized very quickly that an iPhone was just no longer a possibility for me based on my preferences. In fact, the most recently released iPhones fail all but the last 4 criteria, and barely scrape through the last 3!</p>

<p>I considered the Mini iPhone models. But they are too large, compromise too many essential features (headphone jack and fingerprint sensor), and too expensive to acquire with decent amounts of internal storage.</p>

<h2 id="more-like-candroid">More Like "Candroid"</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/phone/phonesizes.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/phone/phonesizes.webp" alt="My old phone, size compared to a few contemporary options." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">My old phone, size compared to a few contemporary options.</figcaption>
</figure>

<p>There aren't many Android phones out there still made with headphone jacks. The two most notable exceptions? Google's Pixel "a" series (until the most recent 6a), ASUS's Zenfone series, and Sony's Xperia series.</p>

<p>Meg has a Pixel 4a. It's larger than I'd like, but better sized than just about every other phone on the market today. Unfortunately, the Pixel distribution of Android is full of "smart" features like always-listening assistants, pushy advertising feeds, and unremovable Google search bars. I don't care to use those features, and they constantly drain your battery, even when you don't use them. Add in the extremely limited storage in the 4a with no possibility of SD card expansion, and I just couldn't justify the jump.</p>

<p>The more recent 5a and 6a are significantly larger than the 4a, and the 6a has even done away with the headphone jack. Clearly an evolutionary dead end for me.</p>

<p>ASUS's latest Zenfone models show some promise: a headphone jack, a side-mounted fingerprint sensor, a nice camera, a relatively-small-by-today's-standards size. But it's still too large, too expensive, and doesn't have enough internal storage to easily store music and photos without an SD card slot.</p>

<p>The disappointment of Pixel's A series and the Zenfone models led me to look at Sony's models a bit closer. They tick a lot of boxes: fingerprint sensor, SD card slot, headphone jack, good battery life, great screen, great camera. The recent Sony models are all outrageously tall: the smallest in recent memory is a full 6" tall. That's 50% taller than my iPhone SE, and I can barely reach the top of <em>that</em> screen. Prices aren't great either; the flagship models cost a staggering $1500.</p>

<h2 id="memories-of-the-past">Memories of the Past</h2>

<p>So I looked into the past. Has Sony (or any other Android OEM) released a reasonably sized phone that ticks my boxes in recent years? Back in the early 2010s, plenty of phones met my criteria. But they don't have the cellular bands required to get a decent LTE signal on today's phone networks, which have slowly rolled out new LTE bands since those phones were released. I'd also prefer to get a phone that can run the latest version of Android, or at least a custom ROM like LineageOS.</p>

<h2 id="xz1-compact">XZ1 Compact</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/phone/succulent.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/phone/succulent.webp" alt="Bask in the glory of the XZ1C." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">Bask in the glory of the XZ1C.</figcaption>
</figure>

<p>After much hand-wringing and searching, I found it. The Sony Xperia XZ1 Compact. It has:</p>

<ul>
  <li>almost the same physical dimensions as the iPhone SE</li>
  <li>unofficial LineageOS support up to Android 13</li>
  <li>a top-of-the-line CPU that still runs great</li>
  <li>a fingerprint sensor</li>
  <li>only 32GB of internal storage, but support for up to 400GB of microSD storage</li>
  <li>most of the LTE bands required for modern T-Mobile LTE service</li>
  <li>VoLTE (voice-over-LTE) support</li>
  <li>a decent camera, with a useful set of manual mode features</li>
  <li>IP68 waterproofing</li>
  <li>surprisingly loud and nice sounding dual front-facing speakers</li>
  <li>a <em>notification LED</em></li>
  <li>mint condition availability for less than $200</li>
</ul>

<p>At some point, I'll have to upgrade as apps stop supporting older versions of Android. But that should take a long time -- most apps still support Android 5! Until then, I can benefit from LineageOS updates, SD card storage, a headphone jack, the latest Firefox releases, the wide variety of open source apps available on F-Droid, and astonishingly good battery life. All for about the same cost as two iPhone 14 battery replacements.</p>

<h2 id="my-setup">My Setup</h2>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/phone/XZ1vsSE.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/phone/XZ1vsSE.webp" alt="Old phone vs. new phone." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">Old phone vs. new phone.</figcaption>
</figure>

<ul>
  <li>
    <p>I immediately set up <a href="https://forum.xda-developers.com/t/rom-lineageos-17-18-19-unofficial-update-2023-04-01.4308295/">LineageOS 18.1</a> for the latest space-efficient Android OS and security updates. <em>Note: if you plan on following in my footsteps, consider <a href="https://forum.xda-developers.com/t/xz1c-xz1-xzp-temp-root-exploit-to-backup-drm-keys-implemented.3795510/page-88#post-88023479">backing up your unique Sony DRM keys</a> so that you can return to stock firmware with full camera functionality.</em>  If you use Google Fi as a wireless provider like I do, you might have to install Google Play Services -- I recommend <a href="https://wiki.lineageos.org/gapps">MindTheGapps</a>.</p>
  </li>
  <li>
    <p>Alternatively, you could use the latest version of the stock Android OS. You won't get the latest firmware security updates, but Google still updates the things that really matter, like Webview and Google Play Services. You're more at risk if someone physically hacks your phone <em>in person</em>, but a sufficiently motivated phsyical hacker is just going to <a href="https://xkcd.com/538/">threaten you with a hammer</a> anyway. <em>Note: if you live in the USA, you'll have to flash a small portion of the UK firmware to make the fingerprint sensor work.</em></p>
  </li>
  <li>
    <p>I use <a href="https://f-droid.org/en/">F-Droid</a> for all the software I possibly can. F-Droid is a free and open source app store; that is, it's kind of like Google Play or Apple's App Store, if everything was free and created by hobbyists who just want to make other people's lives easier, instead of bamboozling people into subscriptions or <a href="https://doctorow.medium.com/tiktoks-enshittification-bb3f5df91979">enshittification</a>. It doesn't have everything, but it has apps for most basic stuff on Android.</p>
  </li>
  <li>
    <p>I highly recommend the <a href="https://www.simplemobiletools.com/">Simple Mobile Tools</a> family of apps -- dialer, launcher, keyboard, messenger, etc. They're rock-solid, very small, frequently updated, efficient, and a great starting point when you realize you don't want to use the default app for a given purpose on Android.</p>
  </li>
  <li>
    <p>A notable exception to the Simple suite: I use <a href="https://f-droid.org/packages/org.dslul.openboard.inputmethod.latin/">Openboard</a> because Simple Keyboard just... didn't work that well with my hands, I guess?</p>
  </li>
  <li>
    <p>Consider using <a href="https://f-droid.org/en/packages/eu.faircode.netguard/">Netguard</a> to fully control each individual app's ability to communicate with the internet. Your file manager probably doesn't need network access.</p>
  </li>
  <li>
    <p><a href="https://f-droid.org/packages/org.mozilla.fennec_fdroid/">Fennec</a> is an excellent F-Droid updated version of Firefox with Mozilla telemetry disabled. You can use nearly any Firefox add-on, as long as you <a href="https://support.mozilla.org/en-US/kb/extended-add-support">add it to a collection and hook up that collection to your Fennec instance's app list in the Fennec developer settings</a>. A silly set of hoops to jump through, but a proper ad-blocker and other convenience extensions make the mobile web actually usable (and secure) again. Huzzah!</p>
  </li>
  <li>
    <p>I use Pocket Casts for podcast listening. Note: I recently switched to <a href="https://antennapod.org/">AntennaPod</a>, a FOSS alternative, because Pocket Casts has shown signs of monetization in the last couple of years. AntennaPod has the added benefit of supporting raw RSS feeds for podcast subscriptions, so it's easy to avoid centralized, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">enshittification</a>-prone services.</p>
  </li>
  <li>
    <p>I use Finamp to listen to music on my personal Jellyfin server.</p>
  </li>
  <li>
    <p>I use Wireguard to communicate with my personal music and RSS servers when I'm away from home.</p>
  </li>
  <li>
    <p>I use <a href="https://play.google.com/store/apps/details?id=com.seazon.feedme&amp;gl=US">FeedMe</a> to read RSS feeds managed on my home FreshRSS instance.</p>
  </li>
  <li>
    <p><a href="https://f-droid.org/en/packages/eu.faircode.email/">FairEmail</a> has a significant learning curve as you set up the UI and accounts, but has worked <em>excellently</em> since then.</p>
  </li>
  <li>
    <p><a href="https://signal.org/#signal">Signal</a> is the most secure messaging app I have. I only wish I could convince anyone else to actually use it. Note: I recently changed to <a href="https://molly.im/">Molly</a> instead to stick with open source software and minimize Signal's frequent nagging to donate.</p>
  </li>
  <li>
    <p><a href="https://f-droid.org/en/packages/nekox.messenger/">Nekogram X</a> is an open source distribution of Telegram with less telemetry and some helpful options added on top. <a href="https://f-droid.org/packages/org.telegram.messenger/">Telegram FOSS</a> is another brilliant option if you don't need the extra stuff. Both have some minimal issues with app icon/name display in the OS share sheet but it's not a big deal.</p>
  </li>
  <li>
    <p>I use Google Maps as a necessary evil of address finding, and Osmand (with 10GB of downloaded detailed US maps) for bicycle touring and mountain biking navigation.</p>
  </li>
  <li>
    <p>Bitwarden has an Android app that's even better than their iOS app.</p>
  </li>
  <li>
    <p>My <a href="https://en.wikipedia.org/wiki/Pebble_(watch)">Pebble</a> works great with the <a href="https://rebble.io/">Rebble</a> workaround for device management. Thankfully, the Android pebble app still exists on the app store, and even if it didn't, I could always sideload it. Sadly, the Pebble app has been completely expunged from the Apple App Store, which meant my perfectly functional Pebble Time Round was a pain to manage when I lost my last functional version of the app. Shame on Apple for not allowing easy sideloading. I'm sure it contributes to plenty of unnecessary e-waste.</p>
  </li>
  <li>
    <p>I use the <a href="https://play.google.com/store/apps/details?id=com.samruston.buzzkill">Buzzkill</a> app for custom vibration patterns, since I can't set any in the Settings app. Well worth the $1.99, thank you Sam Ruston. I can confirm that the design of the app is very very modern Android, which looks great, if slightly silly on older versions of Android.</p>
  </li>
</ul>

<h2 id="conclusion">Conclusion</h2>

<p>It's hard to find a small phone these days. Fortunately, Android's modular and open design means that old Android phones are still usable several years on. I'll keep my eye out for new small Android phones. But for at least the next couple of years, my "new" phone should easily cover my simple use cases. In the meantime, I'm really enjoying an OS that isn't quite as locked-down as iOS. If you're also feeling trapped by Apple's scumbag moves, like removing the headphone jack, the fingerprint sensor, and now the SIM card slot, I highly recommend trying an older Android phone. They can be picked up for pretty cheap, and after you overcome the basic learning curve, you might just find that you prefer a little more breathing room than Apple provides.</p>

<p><em>If you enjoyed reading this, check out fellow blogger Chuck's <a href="https://chuck.is/repair/">similar post</a> about the OnePlus Nord N200 (with an emphasis on repairability).</em></p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I recently switched to a "new" smartphone. This post explains why and how.]]></summary></entry><entry><title type="html">Review: Onyx Boox Nova 3</title><link href="https://www.lambdalatitudinarians.org/techblog/2023/02/03/review-boox-nova-3/" rel="alternate" type="text/html" title="Review: Onyx Boox Nova 3" /><published>2023-02-03T18:17:53+00:00</published><updated>2023-02-03T18:17:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2023/02/03/review-boox-nova-3</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2023/02/03/review-boox-nova-3/"><![CDATA[<blockquote>
  <p><em>Technology alone is not enough — it’s technology married with liberal arts, married with the humanities, that yields us the results that make our heart sing.</em></p>
</blockquote>

<p>When I was young, I read books.</p>

<p>When I was slightly less young, I read books off of a <a href="https://en.wikipedia.org/wiki/Amazon_Kindle#Kindle_Touch">Kindle Touch</a>.</p>

<p>I replaced my Kindle with an Android e-ink tablet. This article explains why.</p>

<!-- readmore -->

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/ereader/kindletouch.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/ereader/kindletouch.webp" alt="My old Kindle Touch, now an e-ink weather station." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">My old Kindle Touch, now an e-ink weather station.</figcaption>
</figure>

<p>Eventually, I learned about Amazon's nasty business practices in the e-reader space:</p>

<ul>
  <li>forcing DRM (Digital Rights Management, software locks for files that Amazon, not you, holds the keys for) for ebooks, so you don't actually own your purchases -- you only <a href="http://www.bekkelund.net/2012/10/22/outlawed-by-amazon-drm/">rent them as long as Amazon cares to allow you to view your rental ebook</a></li>
  <li><a href="https://www.theguardian.com/books/2021/jan/15/amazoncom-and-big-five-publishers-accused-of-ebook-price-fixing">price-fixing</a></li>
  <li><a href="https://publishingperspectives.com/2020/08/US-PUBLISHERS-AUTHORS-BOOKSELLERS-CALL-OUT-AMAZONS-CONCENTRATED-POWER-IN-THE-BOOK-MARKET/">trapping Kindle hardware buyers into exclusively Amazon purchases</a>, reducing competition and forcing authors to accept shoddy deals just to access 50%+ of the market</li>
</ul>

<p>Of course, I was already a birthday-gift-Kindle deep in Amazon's trap. I <a href="https://www.mobileread.com/forums/showthread.php?t=186645">jailbroke</a> my Kindle to load new fonts and view unsupported ebook formats like EPUB. And I stopped buying ebooks from Amazon's store, preferring to instead sideload them from my computer with a physical cable connection. (Retro, I know. Who uses cables any more?)</p>

<p>After more than a decade of use, I finally decided to upgrade from my Kindle Touch. Funnily enough, the device still worked... but Amazon finally decided to retire the 3G <a href="https://goodereader.com/blog/kindle/amazon-whispernet-branding-has-been-retired">Whispernet</a> network that provided free internet access anywhere via a data connection. Not to mention that ereader hardware has come a long way since 2011. Modern alternatives provide:</p>

<ul>
  <li>higher resolution screens</li>
  <li>less waiting for page turns</li>
  <li>built-in "frontlights" that don't cast light all over your bedroom when you read at night</li>
  <li>pen support for annotations</li>
  <li>larger screens (not useful in phones, if you ask me -- but for reading ebooks, I love something close to the size of a hardcover)</li>
  <li>software options other than the very closed ecosystem of the Kindle</li>
</ul>

<h2 id="choices">Choices</h2>

<p>I compared several ereaders before I made my final choice. I have a tendency to heavily over-research topics before I make a purchase, and this was no exception. I considered the following devices:</p>

<ul>
  <li>Onyx Boox Note Air</li>
  <li>Onyx Boox Nova 3</li>
  <li>Onyx Boox Note 3</li>
  <li>Kindle Oasis 3</li>
  <li>Kobo Libra 2</li>
  <li>Kobo Elipsa</li>
  <li>PocketBook Era</li>
  <li>Remarkable 2</li>
</ul>

<p>I wanted a 7-8" screen, a color-adjustable frontlight, USB-C ports, freedom to load any apps or ebook stores I wanted, a month of battery life with wireless off, and passive (no batteries!) drawing via pen.</p>

<p>The screen size requirement eliminated the Remarkable, the Note Air, and the Note 3.</p>

<p>The need for a USB-C port (along with "freedom to load any apps or ebook stores I want") eliminated the Kindle Oasis 3.</p>

<p>The need for pen input eliminated the Pocketbook and the Kobo Libra 2.</p>

<p>The need for <em>passive</em> pen input eliminated the Elipsa.</p>

<p>I ended up settling on the Onyx Boox Nova 3, because it met my list of needs. There are a few features I would really <em>like</em>, but ended up settling on because the perfect device just doesn't exist:</p>

<ul>
  <li>headphone jack (for audiobook or maybe even music listening)</li>
  <li>fingerprint reader (notes, particularly journal entries, are fairly sensitive)</li>
  <li>SD card slot (ebooks are small; music and audiobooks are not)</li>
  <li>physical page turn buttons (I've never had them, but many swear they are a godsend)</li>
  <li>waterproofing (peace of mind, rather than "I want to swim with it")</li>
</ul>

<p>Fortunately I don't currently listen to audiobooks, so I can ignore most of those features. If I ever get into audiobooks, I'll likely be forced to upgrade. The only feature I <em>really</em> wish I had was a fingerprint reader for security... but knowing Android device security, almost no devices are secure enough to fully trust anyway. So maybe it just doesn't matter. I do wish I could get a "pattern" style lock screen though.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/ereader/nova3.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/ereader/nova3.webp" alt="My Onyx Boox Nova 3 in action." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">My Onyx Boox Nova 3 in action.</figcaption>
</figure>

<h2 id="screen">Screen</h2>

<p>Wow! The difference between my 2011 Kindle and a 2021 ereader is massive. It's a lot like the difference between 2000s computer displays and Apple's "Retina" hiDPI displays that started showing up in 2012 on the iPhone 4 and Macbooks.</p>

<p>On my old Kindle, I could see pixels on the edges of text. On my Boox, I ... can't. The text is damn near as sharp as text on a physical book page. Feels like the future!</p>

<p>I love the 7.8" screen, especially compared to my old Kindle's 6" screen. The Boox's screen is roughly the size of a hardcover novel page; the Kindle screen was about the size of a paperback page. I like big pages! In this case, a larger screen means longer line lengths, so I can read even faster than I could on my Kindle. It also means fewer page turns and refreshes per book read, so I don't have to reach up to turn the page as much, and less power usage as well since e-ink displays <a href="https://ebooks.stackexchange.com/questions/387/how-much-of-the-power-does-the-screen-of-e-ink-device-consume">only consume power when they update the screen</a>. So the bigger screen actually translates to better battery life!</p>

<h2 id="size">Size</h2>

<p>My old Kindle fit in my back pocket, and easily fit in coat pockets. My Boox is about 40% larger, and the case is slightly bulkier, so it's not as easy to fit in a back pocket. It's a tight squeeze for coat pockets.</p>

<p>That being said, I didn't even notice the weight or bulk when I accidentally left my Boox in my backpack when I hiked the tallest mountain in Colorado.</p>

<p>If you love putting a paperback or a tiny e-reader in your back pocket, the Boox Nova 3 isn't for you. They have a smaller model that's better for that. But in my experience it's light enough to easily hold for hours of reading, and small enough to fit in all but the most overstuffed of backpacks and bicycle handlebar bags.</p>

<h2 id="drawing">Drawing</h2>

<p>It's rad to get back into the manual writing game. Besides realizing that my cursive is very rusty, I've started journaling and notetaking on the Boox almost every day. It's a great way to keep my clicky keyboard from annoying people in work meetings and interviews.</p>

<p>Very useful for boring meeting doodles. Actually useful for writing annotations in books when you want to <a href="https://fs.blog/how-to-read-a-book/">read properly</a>. Extremely useful for journaling on a <a href="/blog/2022/10/01/the-great-northern-vt-adventure-pt1.html">multi-day bike tour around Vermont</a>.</p>

<p>Drawing with the pen is pressure sensitive, so you can adjust the weight of brush strokes for style. To my eyes, the screen doesn't have noticeable latency between "pen touching screen" and "ink showing up on the display," so it's effectively the same as an infinitely erasable piece of paper (that lights up at night!).</p>

<h2 id="android">Android</h2>

<p>You can run Android apps on all Boox devices. I've never found an app that doesn't run, but I've found lots of apps that run poorly on a black-and-white e-ink display that can only refresh once per second or so at the fastest setting (modern smartphone displays typically refresh between 60 and 120 times per second and show millions or billions of colors).</p>

<p>Boox offers a selection of different "optimization" settings to deal with the limitations of a black-and-white low-refresh-rate screen. You can tweak the e-ink refresh rate, or "bleach" light background content to white so text shows up better in black-and-white. It mostly works, but it can be tricky to find the right settings for every app. You won't enjoy playing games or watching videos, most likely. But you can probably get the Libby or Kindle apps to a usable state.</p>

<p>Personally, I spend 99% of my time on my Boox reading books or writing. I only install apps to aid and abet book downloads or book discovery. I'm glad I can run any app I want on here, because it lets me access books from any source imaginable on the internet, from libraries to DRM-free bookstores to the high seas. It's an imperfect experience, but that's OK since it's only peripheral functionality.</p>

<p>There are a few apps, like <a href="https://github.com/plateaukao/einkbro">EinkBro</a>, designed specifically for e-ink screens. These generally work well out-of-the box with the e-ink screen, and with some slight "optimizations" applied sometimes feel even better than the first-party Boox software that comes with the device.</p>

<p>On the subject of book reading: I mostly use <a href="http://koreader.rocks/">KOReader</a> to read ebooks on my Boox device, rather than the built in "Neoreader" ereader software. For my preferences, Neoreader just doesn't have enough tweaks and options to deal with the mixed bag of ebook formatting. Your mileage may vary, especially if you aren't as nitpicky as me. But I am VERY glad to have a device where I can just... change the default app that opens ebooks. Amazon doesn't give you that choice, so if you dislike a setting -- like the fact that the Kindle Touch doesn't let you turn off the numeric "book progress percentage" display -- you're stuck doing something crazy, like literally taping over it or blanking out that section of screen pixels with a marker. <strong>I prefer choice.</strong></p>

<h2 id="battery-life">Battery Life</h2>

<p>With WiFi and Bluetooth disabled, my Boox Nova 3 easily lasts me about a month of daily 1-2 hour reading. <a href="https://www.eyerys.com/articles/40-80-rule-battery-charging-dealing-lithium-based-chemical-problems">For battery longevity</a>, I keep the charge between 20% and 80% whenever possible. Given how slowly the battery discharges, even with heavy use, this is easy, as long as I don't forget it on the charger and accidentally charge it to 100%.</p>

<p>One annoyance: because users don't have "root access" by default on Boox devices, I can't install an app to actually limit my battery charge to 80%. And Onyx Boox won't add it to the settings, like many Android phone manufacturers have done. So I have to manually make sure I don't charge above 80%. This is annoying on a phone or a laptop that you charge every day; on a device that I charge <em>once a month</em>, I usually just set myself a 30 minute timer and catch it somewhere in the 70-80% range. Easy peasy.</p>

<h2 id="issues">Issues</h2>

<p>Two years in with my Boox Nova 3, I'm a huge fan. I use it almost every day, and I take it almost everywhere with me. It's almost exactly what I wanted as a successor to my Kindle Touch, and indications are good that it'll last me many more years, especially if I take care of the battery.</p>

<p>...So what's the catch? Why doesn't everyone own Boox devices?</p>

<p>Well, I have a few thoughts:</p>

<ol>
  <li>
    <p><strong>Awful UI text translations</strong>: I write professionally. The device settings and app settings are an absolute comedy of Chinese-to-English translation errors. I often have reverse-engineer the bad translation just to figure out what a setting means. Sometimes there's no way of knowing: you just have to toggle the setting and see what happens. Sometimes warnings sound really scary -- early on, I clicked a "refresh library" button and a huge warning came up to let me know that my reading progress would NOT be lost and the operation was NOT destructive in any way. That's great, but... after reading that warning, I started to wonder about software quality, false assumptions, translation confusion, etc. I'm happy to say that I haven't experienced any data loss in my two years of Boox usage, but I do sometimes worry!</p>
  </li>
  <li>
    <p><strong>Onyx Boox violated the <a href="https://old.reddit.com/r/Onyx_Boox/comments/hsn7kx/onyx_using_recent_antichina_movement_as_excuse_to/">GPL (Gnu Public License)</a></strong> (by using software bearing the license to produce a closed-source proprietary software product). This doesn't impact me day-to-day, but as someone who cares deeply about the health of the software industry, I don't like supporting a company so needlessly blasé about taking advantage of open source projects. Of course, Amazon and other big tech companies abuse their monopoly positions to hurt open source projects <a href="https://arstechnica.com/information-technology/2019/10/is-the-software-world-taking-too-much-from-the-open-source-community/">in other ways</a>, so it's not like you can buy an ereader from a company that isn't evil in <em>some way</em>. Except for <a href="https://en.wikipedia.org/wiki/Kobo_Inc.">Kobo</a>, which seems to just be a bunch of harmless Canadians who love reading.</p>
  </li>
  <li>
    <p><strong>Closed-source Chinese software is a bad idea</strong>. The CCP is scary. They literally run death camps and oppress any opinions that don't align with their own. Journalists and <a href="https://en.wikipedia.org/wiki/Ai_Fen">doctors whistleblowing the dangers of coronavirus</a> have gone missing, been threatened, been maimed, or had their families kidnapped just for telling the truth. Companies based in China routinely bend to the will of the CCP and harvest data about their customers to send back to the CCP for... intelligence? Analysis? Who knows? I use <a href="https://netguard.me/">NetGuard</a> to only allow traffic to whitelisted servers and apps on the rare occasions that I connect my device to WiFi. Look, this isn't really a Chinese thing: you just shouldn't trust closed-source software in the first place. Everything is harvesting as much creepy data about you as you can imagine. Take precautions. Sharing everything with a device that regularly communicates with the internet is kind of like writing in <a href="https://harrypotter.fandom.com/wiki/T._M._Riddle%27s_Diary">Tom Riddle's diary</a>. To (almost) quote Molly Weasley, "Never trust anything that can think for itself if you can’t see <del>where it keeps its brain</del> its source code." Prefer free and open source products whenever possible, because everything else has a profit motive to violate your privacy. There's no perfect solution right now, but I hope that someday I can run LineageOS or even Linux on an ereader -- maybe even my Nova 3 -- to make this less of an issue.</p>
  </li>
  <li>
    <p><strong>Case compatibility</strong>. Boox is a niche company. The Nova 3 is a niche product. As a result, there aren't many third-party vendors out there creating cases. There are a few on Etsy. The first-party Boox-made cases are OK. I actually repurposed a cheap iPad Mini 2/3/4 case into a Nova 3 case, taking advantage of the fact that the devices are <em>almost</em> the exact same dimensions. I just had to cut out a hole at the top for the power button, and stretch the TPU material with a couple of strategic slits since the Nova 3 is slightly wider. If you want a "first class" case experience, don't buy a Boox device. But if you're willing to DIY a bit, I absolutely love my case and it's been going strong for two years now!</p>
  </li>
</ol>

<h2 id="tldr">TL;DR</h2>

<p>Boox good for me. Kindle bad. Kobo good for most.</p>

<figure style="float:left; max-width: px !important;">
  <a href="https://raw.githubusercontent.com/nathan-contino/images/main/reasonable-images/ereader/dawgz.webp" target="_blank" class="nohover"><img src="https://raw.githubusercontent.com/nathan-contino/images/main/thumbnails/images/ereader/dawgz.webp" alt="An ereader being eread in nature." height="500px" loading="lazy" style="max-width:px !important;" /></a>
  <figcaption style="max-width:px !important;">An ereader being eread in nature.</figcaption>
</figure>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Technology alone is not enough — it’s technology married with liberal arts, married with the humanities, that yields us the results that make our heart sing. When I was young, I read books. When I was slightly less young, I read books off of a Kindle Touch. I replaced my Kindle with an Android e-ink tablet. This article explains why.]]></summary></entry><entry><title type="html">Disable the Firefox Tab Manager</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/11/10/firefox-tab-manager-disable/" rel="alternate" type="text/html" title="Disable the Firefox Tab Manager" /><published>2022-11-10T19:26:53+00:00</published><updated>2022-11-10T19:26:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/11/10/firefox-tab-manager-disable</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/11/10/firefox-tab-manager-disable/"><![CDATA[<p>Did you recently update to Firefox (or Librewolf) 106?</p>

<p>Do you use Tree Style Tabs, and hide the normal tab bar?</p>

<p>Did you notice an inverted caret (<code class="language-plaintext highlighter-rouge">ˇ</code>) that restored the height pixels of the hidden tab bar?
(alt text for this caret labels it "list all tabs")</p>

<p>Did it annoy you that you can't remove that button, even in the "customize toolbar" view?</p>

<!-- readmore -->

<p>If this is the case, visit your browser's <a href="about:config">about:config</a> configuration and update the following value to <code class="language-plaintext highlighter-rouge">false</code>:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>browser.tabs.tabmanager.enabled
</code></pre></div></div>

<p>Restart your browser.</p>

<p>Voila! The "tab manager" inverted caret (also known as a <a href="https://en.wiktionary.org/wiki/h%C3%A1%C4%8Dek#English">háček</a>) should disappear.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Did you recently update to Firefox (or Librewolf) 106? Do you use Tree Style Tabs, and hide the normal tab bar? Did you notice an inverted caret (ˇ) that restored the height pixels of the hidden tab bar? (alt text for this caret labels it "list all tabs") Did it annoy you that you can't remove that button, even in the "customize toolbar" view?]]></summary></entry><entry><title type="html">Optimizing a Jekyll Blog Containing Lots of Images</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/10/21/optimizing-jekyll-images/" rel="alternate" type="text/html" title="Optimizing a Jekyll Blog Containing Lots of Images" /><published>2022-10-21T19:26:53+00:00</published><updated>2022-10-21T19:26:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/10/21/optimizing-jekyll-images</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/10/21/optimizing-jekyll-images/"><![CDATA[<p>This website features blog posts with many images -- often more than 20 per post!</p>

<p>Meg and I take a lot of these pictures on bike trips. Frequently with a fancy mirrorless Sony camera. They can be pretty large. But they're also frequently very pretty. Neither of us wants to shrink the images into oblivion.</p>

<p>I used to host those chonky images directly in my Jekyll blog, via the <code class="language-plaintext highlighter-rouge">_images</code> subfolder.</p>

<p>Eventually my site's GitHub repo ballooned to over a gigabyte in size. I know you shouldn't host blobs in source control, but... GitHub doesn't seem to care if your repo is a little big. And it's the cheapest blob storage out there, at a grand total of $0 for a half decade of usage.</p>

<p>But all good things must come to an end, and I started to get worried about the long-term scalability of my blog. Deployments for GitHub pages, which I use to host my site, crept above 10 minutes.</p>

<p>Even worse, I knew my pages weren't respectful of user data connections. Opening one of my blog posts with 20+ images in it resulted in a 200MB download. That's $2 on my Google Fi metered data plan! For one page!</p>

<p>So I decided to solve the problem. I attacked it from multiple angles:</p>

<ul>
  <li>I moved images out of my Jekyll GitHub Pages blog, and purged the blob files from the repo's history.</li>
  <li>I created a new repo, <a href="https://github.com/nathan-contino/images">images</a>, with one purpose: hosting blob files.</li>
  <li>I set up a GitHub Action that automatically generates thumbnails of all image files uploaded to the image repo.</li>
  <li>I overhauled my blog site to download only those thumbnails on page load.</li>
  <li>So users can still view images in full resolution, I set up the thumbnails to directly link to GitHub's raw user content API... to show the full image.</li>
</ul>

<p>If you:</p>

<ul>
  <li>would like to set up thumbnails for your own GitHub Pages-hosted Jekyll blog</li>
  <li>are just morbidly curious about the kinds of Rube Goldberg machines I assemble when I should be Halloween party planning</li>
</ul>

<p>read on.</p>

<!-- readmore -->

<h1 id="purge-the-blobs">Purge the Blobs</h1>

<p>My Jekyll blog's GitHub repository weighed over 1GB -- one chonky boi. This resulted in painfully long deployment times, and I started to worry that GitHub would eventually start killing my Pages deployment processes altogether.</p>

<p>So I used <a href="https://rtyley.github.io/bfg-repo-cleaner/">BFG Repo Cleaner</a> to strip all blobs over 1MB out of my repository's history.</p>

<p>One caveat you should be aware of: the BFG doesn't delete blobs that exist in the $HEAD commit of your repo. So you should purge the blobs in the following order:</p>

<ol>
  <li>
    <p>Copy the images over into a separate folder. A good initial solution: an <code class="language-plaintext highlighter-rouge">images</code> GitHub repository. If you plan on generating thumbnails for the images, I recommend nesting them within a folder named "images" within this repository.</p>
  </li>
  <li>
    <p>Delete the blobs, either with your preferred file browser or on the CLI with <code class="language-plaintext highlighter-rouge">rm -rf</code>.</p>
  </li>
  <li>
    <p>Add the deletions to a commit, and push that to GitHub.</p>
  </li>
  <li>
    <p>Run the BFG to remove the no-longer-used blobs from your repo. I removed everything above 500KB in size. The BFG's interface makes this quite easy.</p>
  </li>
</ol>

<p>This is how I ran the BFG:</p>

<p>First clone a fresh copy of your repo, using the --mirror flag:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone <span class="nt">--mirror</span> git://github.com/your-repository-name.git
</code></pre></div></div>

<p>This is a "bare repo", so files won't be visible.
But it is a full copy of the Git database of your repository.
Make a backup of it to ensure you don't lose anything.</p>

<p>Now you can run the BFG to clean your repository up:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>java <span class="nt">-jar</span> bfg.jar <span class="nt">--strip-blobs-bigger-than</span> 500K your-repository-name.git
</code></pre></div></div>

<p>The BFG rewrites your commits and all branches and tags to purge the blobs.
But it doesn't physically delete the unwanted stuff.
Examine the repo to make sure your history updated.
Then, use git's garbage collector to strip out the blobs:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>your-repository-name.git
</code></pre></div></div>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git reflog expire <span class="nt">--expire</span><span class="o">=</span>now <span class="nt">--all</span> <span class="o">&amp;&amp;</span> git gc <span class="nt">--prune</span><span class="o">=</span>now <span class="nt">--aggressive</span>
</code></pre></div></div>

<p>Once you're happy with the updated state of your repo, push it back up.
WARNING: because your clone command used the <code class="language-plaintext highlighter-rouge">--mirror</code> flag, this push updates all refs at your git host:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push
</code></pre></div></div>

<p>Oddly, I didn't have to force push. If this fails, add the <code class="language-plaintext highlighter-rouge">-f</code> flag and it might work. I <em>did</em> see some failures related to github issues, but inspecting my repo revealed that the blobs no longer existed in my history. Seems like those errors didn't matter for my needs.</p>

<p>If any other people or machines still have copies of the old version of the repo (containing the blobs), you should delete those copies and re-clone the repo.</p>

<h1 id="host-the-blobs">Host the Blobs</h1>

<p>You can host your images anywhere else -- a physical server in your home, a dedicated site that hosts images, a cheap cloud machine you purchased with bitcoin -- but I chose to host my gigabyte of shame on GitHub.</p>

<p>I used a GitHub Action to automatically generate thumbnails for all images uploaded into the "images" subdirectory. Take a look at it <a href="https://github.com/nathan-contino/images/blob/main/.github/workflows/workflow.yml">here</a>.</p>

<p>Basically, whenever I write to the website, this Action downloads my repo, scans it for images, and generates thumbnails for all of those images. If it generates any new thumbnails that didn't already exist, it commits them into the ".thumbnails" directory. The thumbnail generator matches the directory layout of the "images" folder when it creates thumbnails, so it's easy to find the thumbnail for a given image -- just swap the "images" folder name in the path for ".thumbnails".</p>

<p>I chose to create thumbnails with a maximum height or width of 1000 pixels. That way they never top 200KB in size (so far), but they look decent enough to use as the "default" image display mode in my blog.</p>

<p>Besides the workflow, you'll need to create a GitHub token with commit privileges for your images repo. Then, you'll have to add that token as a secret in your images repo. There are a lot of instructions out there to learn about both of these tasks, and both can change on a dime when GitHub releases new versions. Just know that your token needs the ability to write new commits to your images repo. To actually push to GitHub, you can just use the Git CLI in your workflow... or you can use an action, like <code class="language-plaintext highlighter-rouge">publish-to-github-action</code>.</p>

<h1 id="show-the-thumbnails-and-the-blobs">Show the Thumbnails and the Blobs</h1>

<p>There are three steps involved in the process of displaying these new images on your site:</p>

<ol>
  <li>
    <p>Add custom Jekyll variables to easily reference your image repository in <code class="language-plaintext highlighter-rouge">_config.yml</code>:</p>

    <div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">images</span><span class="pi">:</span> <span class="s">https://raw.githubusercontent.com/&lt;your-username&gt;/&lt;repo-name&gt;/main/images/</span>
<span class="na">thumbnails</span><span class="pi">:</span> <span class="s">https://raw.githubusercontent.com/&lt;your-username&gt;/&lt;repo-name&gt;/main/.thumbnails/images/</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>Create a figure HTML include for your Jekyll site. I created <a href="https://github.com/nathan-contino/nathan-contino.github.io/blob/master/_includes/figure.html">figure.html</a> in my site's <code class="language-plaintext highlighter-rouge">_includes</code> subdirectory. This include uses the built-in HTML "figure" tag to display an image and a caption. I've wrapped the "img" tag within the "figure" tag in an anchor that links out to the full resolution version of the image.</p>
  </li>
  <li>
    <p>Reference the include from blog posts with the syntax demonstrated <a href="https://github.com/nathan-contino/nathan-contino.github.io/blob/master/_posts/blog/2022-06-21-mountain-biking-is-silly.markdown">here</a>. Look for the "figure.html" mentions and the images should stick out.</p>
  </li>
</ol>

<p>With this arrangement, users should see thumbnails and captions on your site, and be able to view the full size image by clicking the thumbnail. For accessibility, the caption is reused as the image alt text.
There's one caveat to this setup: if you upload full-size images that exceed 5MB in size, GitHub doesn't serve them as image content. Instead, GitHub uses the content type <code class="language-plaintext highlighter-rouge">application/octet-stream</code>. This means folks can't easily open your images in a new tab right in their browser... instead, they'll have to download the image and open it either in browser or with an app that lets them preview images. So keep your full size images below 5MB if that bothers you. EDIT: I have since added a second image generator pipeline that creates "reasonably sized" 2000 pixel wide images. These still look pretty good, and are easy enough to reference with a <em>second</em> config variable. You could also simply edit the files before uploading them, but this was more fun.</p>

<p>I also had to implement a couple of minor styling fixes to make this work.</p>

<ol>
  <li>
    <p>On my blog, links have styling that colors their background when you hover over them. This resulted in some weird behavior when I hovered over images that are also links. I added a class called "nohover" to my figure image tags, and used <code class="language-plaintext highlighter-rouge">:not(.nohover)</code> in my CSS to exclude that class from hover styling:</p>

    <div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">a</span><span class="nd">:not</span><span class="o">(</span><span class="nc">.nohover</span><span class="o">)</span><span class="nd">:hover</span> <span class="p">{</span>
   <span class="nl">background-color</span><span class="p">:</span> <span class="m">#300A24</span><span class="p">;</span>
   <span class="nl">color</span><span class="p">:</span> <span class="m">#BBB</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>    </div>
  </li>
  <li>
    <p>I added the following styling to all anchor links on my site, because honestly, I pretty much never want a link to open in the current tab:</p>

    <div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">target</span><span class="o">:</span> <span class="nt">_blank</span><span class="o">;</span>
<span class="nt">rel</span><span class="o">:</span> <span class="s1">"noopener noreferrer"</span><span class="o">;</span>
</code></pre></div>    </div>
  </li>
</ol>

<p>Viola! You've got clickable thumbnails on your site that lead to full-size images. You respect user data connections a tiny bit more than you did before. You still aren't paying someone to host a single gigabyte of images. And you put your Jekyll blog on a mean diet so you don't lose your sweet GH Pages site hosting.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[This website features blog posts with many images -- often more than 20 per post! Meg and I take a lot of these pictures on bike trips. Frequently with a fancy mirrorless Sony camera. They can be pretty large. But they're also frequently very pretty. Neither of us wants to shrink the images into oblivion. I used to host those chonky images directly in my Jekyll blog, via the _images subfolder. Eventually my site's GitHub repo ballooned to over a gigabyte in size. I know you shouldn't host blobs in source control, but... GitHub doesn't seem to care if your repo is a little big. And it's the cheapest blob storage out there, at a grand total of $0 for a half decade of usage. But all good things must come to an end, and I started to get worried about the long-term scalability of my blog. Deployments for GitHub pages, which I use to host my site, crept above 10 minutes. Even worse, I knew my pages weren't respectful of user data connections. Opening one of my blog posts with 20+ images in it resulted in a 200MB download. That's $2 on my Google Fi metered data plan! For one page! So I decided to solve the problem. I attacked it from multiple angles: I moved images out of my Jekyll GitHub Pages blog, and purged the blob files from the repo's history. I created a new repo, images, with one purpose: hosting blob files. I set up a GitHub Action that automatically generates thumbnails of all image files uploaded to the image repo. I overhauled my blog site to download only those thumbnails on page load. So users can still view images in full resolution, I set up the thumbnails to directly link to GitHub's raw user content API... to show the full image. If you: would like to set up thumbnails for your own GitHub Pages-hosted Jekyll blog are just morbidly curious about the kinds of Rube Goldberg machines I assemble when I should be Halloween party planning read on.]]></summary></entry><entry><title type="html">You Don&apos;t Have to be a Developer</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/09/13/you-dont-have-to-be-a-developer/" rel="alternate" type="text/html" title="You Don&apos;t Have to be a Developer" /><published>2022-09-13T21:14:22+00:00</published><updated>2022-09-13T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/09/13/you-dont-have-to-be-a-developer</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/09/13/you-dont-have-to-be-a-developer/"><![CDATA[<p>I originally wrote this post a short time into my first tech
writing job on MongoDB's Server Docs team. I never ended up
sharing it because, for a while, I wasn't sure if I would end
up staying in the docs world or switching back into software
development.</p>

<p>Less than a month ago, I got a new job running documentation
at Gradle. My experience as a Developer Educator for MongoDB
Realm Docs convinced me that documentation can scratch all
of my developer itches -- building automation, infrastructure,
and writing tutorials and code snippets.</p>

<p>I've added some thoughts at the end of the post and tightened
up some language. But this post largely reflects my thoughts
on working as a documentarian very early in my transition from
software development. If you're currently pursuing a computer
science degree, or attending a coding boot camp, or working as
a developer, and it's not completely satisfying... maybe this
will help.</p>

<!-- readmore -->

<p>I graduated from the University of Rochester with a B.S. in computer
science and a B.A. in English in 2017. For over two years after
graduation, I worked at Bloomberg as a software developer
(called "FSD", or "Financial Software Developer") internally.</p>

<p>I spent half of that time working on a piece of
internal-only software designed to make it easier to follow internal
development best practices. This was stuff like jumpstarting continuous integration, providing project templates, and automating paperwork required to run services.</p>

<p>For the second half of my tenure at Bloomberg, I worked on a
client-facing team that built both a UI and a middleware C++ layer for a
report calculation engine. It was about as exciting as it sounds.</p>

<p>Overall, software development was a fun role. There were parts that I
really liked, like digging deeply into unique, interesting optimization
problems and algorithms. There also were parts I didn't like as much.
That includes writing CRUD APIs or DAOs that felt like they should
have been automatically generated by a script and "investigating"
problems with such low impact, nobody truly cared if they were solved.</p>

<p>There were also parts that I felt just didn't properly gel with my
personality, like most "social gatherings" and learning about
financial instruments. Don't get me wrong -- there are
aspects of finance that I find interesting, and parts that I think
everyone should know. (Not necessarily the same parts)</p>

<p>"Time in the market trumps timing the market",
"diversify your holdings", "make your money work for you"... these are
tenets of personal finance that every responsible moneyholder ought to know. But learning about the inner workings of an obscure financial product that
only analysts and professional investors will ever care about? Meh.</p>

<p>I guess there's always a silver lining, though: at least it beats working in advertising.</p>

<p>Anyway, software development was a mixed bag. Could I do it for my
entire career? Absolutely. With the right team, I think software
development could be rad. But despite the fact that my teammates at
Bloomberg were all extremely kind and intelligent, I never really felt
close enough to them to get to that point. At the end of the day, work
was just work, and I didn't feel like anybody was paying enough
attention (and I was never individually inspired enough) to justify
putting in extra effort.</p>

<p>As a result, I never felt like software development scratched my
creative itch the same way that college projects satisfied me.</p>

<p>At first, I thought that I just had to get used to my company and the
subject matter of my work. I gave it a few months, but I still felt
unfulfilled. Then I switched teams to try something different; maybe a
larger team with younger team members and a tighter focus would fit me
better?</p>

<p>After a year, it was... fine. I was doing well, but not great;
at the end of the day, I didn't really feel like my work mattered.
Eventually, I ended up browsing Hacker News "Who is Hiring" threads
every month to see if the grass really was better on the other side.
After all, many of my friends switched companies every couple of years;
from what I've been told, it's the best way to increase your
compensation when you're young. And one day a peculiar post caught my
eye.</p>

<p>The role was "Technical Writer" for MongoDB's Server documentation
group. I'd heard about technical writing before -- even thought about
it as a career, though it seemed like internship opportunities were few
and far between during college. But some friends had warned me away from
it as a career, claiming that a lot of companies didn't really respect
technical writers and you'd be better off as a developer if you had the
chops to get hired as one. I still think that's true: on average, there
are more opportunities to get hired as a developer and the roles pay
better. But there are a few caveats to that statement that
change the calculus:</p>

<ul>
  <li>some companies treat writers like engineers</li>
  <li>technical experience (as a developer, not just education)</li>
  <li>culture</li>
  <li>pay isn't everything (but it's still good)</li>
  <li>you have to find the right compromises for satisfying work</li>
</ul>

<p><em>Note: Here ends my original writing. What follows is a reflection by
my slightly-older-hopefully-wiser 2022 self.</em></p>

<p>Wow. I had a pretty good read on this career over two years ago.
Two points really struck me:</p>

<blockquote>
  <p>As a result, I never felt like software development scratched my
creative itch the same way that college projects satisfied me.</p>
</blockquote>

<p>Now that I'm years into documentation writing and working my second
role, this is refreshing to hear. When I wrote software, especially
internal-facing software with a captive audience, I knew deep down that
it didn't really matter if I did an awesome job or a bad job.</p>

<p>Writing documentation for open source (or open source adjacent...
damn you <a href="https://en.wikipedia.org/wiki/Server_Side_Public_License">SSPL</a>)
projects, I take pride in my work. I know that crappy documentation
will make people sad, and possibly push them away from using the
product. I know that great documentation can save people from hours
of frustration and pain. It reminds me a great deal of TAing back in
college -- sure, I could phone it in and not prepare for a workshop
or a review session. But when the students suffer from your laziness,
you tend not to be (too) lazy.</p>

<blockquote>
  <p>With the right team, I think software
development could be rad. But despite the fact that my teammates at
Bloomberg were all extremely kind and intelligent, I never really felt
close enough to them to get to that point.</p>
</blockquote>

<p>The Realm Docs/Developer Education/Education Engineering team at
MongoDB is rad. Working with them was rad. I like them so much I'm keeping
in touch with most of my teammates, and even some other folks from the
MongoDB documentation org.</p>

<p>Some of it might be time-based -- you have to get comfortable with a team
before you can enjoy camaraderie. But it's also personality-based -- if
you work with people with common interests (or just interesting interests!),
you'll inevitably learn from them and their interests will cross-pollinate
into your own life. I listen to podcasts, read blogs, read books, try out
hobbies, and listen to music recommended by my MongoDB coworkers. I consider
them friends and role models.</p>

<p><strong>TL;DR</strong>: If you're not thrilled at your current software developer job,
go out and get another one. Or try something else in the industry that
scratches itches that aren't currently satisfied. I know this probably
seems obvious from the outside, but don't let good compensation and comfort
cloud your gut instinct to find something better. You might regret it...
but you probably won't.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I originally wrote this post a short time into my first tech writing job on MongoDB's Server Docs team. I never ended up sharing it because, for a while, I wasn't sure if I would end up staying in the docs world or switching back into software development. Less than a month ago, I got a new job running documentation at Gradle. My experience as a Developer Educator for MongoDB Realm Docs convinced me that documentation can scratch all of my developer itches -- building automation, infrastructure, and writing tutorials and code snippets. I've added some thoughts at the end of the post and tightened up some language. But this post largely reflects my thoughts on working as a documentarian very early in my transition from software development. If you're currently pursuing a computer science degree, or attending a coding boot camp, or working as a developer, and it's not completely satisfying... maybe this will help.]]></summary></entry><entry><title type="html">Natopia</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/09/12/natopia/" rel="alternate" type="text/html" title="Natopia" /><published>2022-09-12T21:14:22+00:00</published><updated>2022-09-12T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/09/12/natopia</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/09/12/natopia/"><![CDATA[<p>Over the past few years, I've slowly tried to reduce my dependence on
big tech. I know this is popular in some circles right now, and I've made
all the standard moves:</p>

<ul>
  <li>remove myself from Facebook and Instagram</li>
  <li>migrate my personal email from Gmail to Protonmail (update: now trialing <a href="https://purelymail.com">Purelymail</a>)</li>
  <li>reduce subscriptions to music and video streaming services across the board</li>
  <li>start a blog where I can shamelessly rant and rave about cool things I've done</li>
</ul>

<p>But why did I do this? Not (just) because I love to chase the latest technocrat
trends. Honestly it's mostly because I hate feeling dirty when I use these
services:</p>

<ul>
  <li>
    <p>When I used Spotify, I was constantly frustrated by regressions and
podcasts shoved in my face (despite the fact that I cannot stand Spotify's
approach to podcasts, where they buy up exclusive distribution rights to a
family of podcasts and turn them into... Spodcasts, which aren't really
podcasts because they aren't distributed the way all other podcasts circulate:
RSS). And their offline playback support is laughable.</p>
  </li>
  <li>
    <p>Google services constantly misbehave when you use Firefox or Librewolf,
my browsers of choice.</p>
  </li>
  <li>
    <p>Newsletters constantly send spam mail, and are often much harder to
fully unsubscribe from than an RSS feed.</p>
  </li>
  <li>
    <p>iOS still doesn't support ad blocking anywhere near the level of uBlock
Origin, or allow me to use real add-ons in a browser... prompting me to
find alternative methods to block ads on my phone.</p>
  </li>
</ul>

<p>And every tech company I've ever bought any product from seems to abuse dark
patterns to manipulate users out the wazoo. All in the name of getting you to
buy one more thing, or look at one more not-really-notification. Weak.</p>

<p>This post talks about how I freed myself from a myriad of big tech services,
all with the support of a small investment in hardware, electricity, and
personal time. I call my open source confederation of services <strong>Natopia</strong>,
because, well, narcissism.</p>

<p><em>NOTE: Literally all of this is a work in progress. Open source projects
continually develop. Standards change. This all works right now, but there
are many pieces I'd like to improve. Expect updates to this page over time.</em></p>

<!-- readmore -->

<h2 id="overview">Overview</h2>

<p>My home server runs:</p>

<ul>
  <li>a VPN to stay connected to my home server's services even when I'm traveling</li>
  <li>ad blocking across my entire network and phone</li>
  <li>music and video streaming of my personal library</li>
  <li>an RSS aggregator so I can stay up to date on blogs and newsletters</li>
</ul>

<p>Sometimes I run a Minecraft server, too.</p>

<p>I hope to eventually add a Calibre server to manage my book library, but it's
just not enough of a benefit yet for me to bother.</p>

<p><em>Note: the VPN is a prerequisite for any of these other services to work when you're not at home.</em></p>

<h2 id="hardware">Hardware</h2>

<p>You don't need that much hardware to run a basic "home server". I do it
all on a fanless <a href="https://en.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pi</a>
that sips barely any power and store all of my data on an external USB SSD.
Here's my setup:</p>

<ul>
  <li>Raspberry Pi 4 Model B (8GB RAM)</li>
  <li>FLIRC Raspberry Pi 4 case</li>
  <li>Samsung T5 portable SSD (USB 3.1) (2TB)</li>
  <li>SanDisk 256GB Ultra microSDXC SD card</li>
</ul>

<p>Raspberry Pis used to basically require an SD card for system storage.
These days, I think you can even do the initial OS install on an SSD right from
the first boot. I've been using 64-bit piOS for around 2 years now, since I
have an 8GB Pi, and it's been solid the whole time, except for some minor
wireguard issues I experienced back in 2020. I highly recommend it.</p>

<p>Most of these items were specially requested birthday and Christmas gifts.
(thanks Mom, even if you don't know what a "raspberry pi" is) Even with
SSD prices inflating recently, you should be able to put together a similar setup for somewhere between $100 and $300, depending on your home server and
SSD choices. You could even run this on an old laptop if you have one lying
around: that was actually my first home server, until the fan annoyed me
enough to get a raspberry pi!</p>

<h2 id="router--wifi">Router &amp; WiFi</h2>

<p>I use an Apple AirPort Time Capsule 802.11ac as my router. It has 3TB of
internal storage that's perfectly capable of backing up my personal and work
laptops. I back up my phone to my personal laptop instead of iCloud,
since iCloud backups
<a href="https://www.reuters.com/article/us-apple-fbi-icloud-exclusive/exclusive-apple-dropped-plan-for-encrypting-backups-after-fbi-complained-sources-idUSKBN1ZK1CT">grant Apple and their friends</a>
access to your personal encryption keys). Thus the Time Capsule also grants me
transitive backups of my phone, all with practically no work on my end.</p>

<p>Airport routers might be a little old, but even on a gigabit internet connection, AC WiFi doesn't slow things down much. I get around 750mbps down, 50mbps up on my current connection; on my Google Fiber connection at
my last apartment, I used to get 750 up and down. This router is reliable and provides easy backups. I've tried <a href="https://openwrt.org/">openwrt</a> in the past,
and software routing and crappy CPUs caused too much buffer bloat and video
latency for my comfort. Better to use a reliable hardware routing solution in my anecdotal experience. I refuse to use a router with an online management
portal, so most mesh solutions are not feasible for my use case.</p>

<p>I use DHCP reservations for specific IP addresses on my network based on
device MAC addresses. This isn't technically required, but it can be helpful
to ensure that your home server doesn't change IP address after a power outage
or a router reboot. I also do this for all of the other devices on my network --
game consoles, laptops, phones, tablets, TVs, etc. -- so that when I look at
my network query log, each device always uses the same IP address over time.
I combine this with fancy looking hostnames in my home server <code class="language-plaintext highlighter-rouge">/etc/hosts</code> file
(such as "pig-gradlephant-laptop" and "heart-of-gold") so that my Pi-Hole UI
shows readable device names, instead of hard to remember IP addresses.</p>

<p>Devices that leave the home, like my laptop and my phone, end up with
<em>two</em> IP addresses &amp; fancy hostnames pairs because they show up as a different
IP address in the VPN DHCP range. I'm not sure if this is totally necessary
(is it even possible to let my router know the MAC address of a phone that's
only connected to the network via VPN?), but it's fine by me -- easier to
figure out when something weird happens with the VPN.</p>

<h2 id="vpn">VPN</h2>

<p>I was a happy <a href="https://openvpn.net/">OpenVPN</a> user for my first year of
self-hosting. It is a very solid VPN solution, and at the time, it was the
only VPN that worked on 64-bit piOS without compiling your VPN server yourself.</p>

<p>These days, I use <a href="https://pivpn.io/">PiVPN</a> to manage a local
<a href="https://www.wireguard.com/">WireGuard</a> server. PiVPN makes it quite easy to
set up your VPN server, and adding a new client is as easy as <code class="language-plaintext highlighter-rouge">pivpn -a</code>.
I'm happy to report that the rumors of WireGuard's performance optimizations
are indeed true: OpenVPN used to chug about 9% of my phone battery life, but
WireGuard only uses 2-4%. WireGuard also has the <em>massively</em> useful feature
of automatically switching on and off based on wifi network SSID exclusions,
so my phone and laptop connect to my VPN whenever I'm <em>not</em> on my home wifi.</p>

<p>Once you've set up the server, you'll need to set up port forwarding from your
router to your raspberry pi for the VPN port. Don't freak out if your client
doesn't immediately work -- in my experience, network configurations usually
need a few dozen swear words, a couple of reboots, a cup of coffee, and a nice
walk before they start working with the exact same config you originally set up.
For reference, I use the following settings on my Airport router:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Description: wireguard
Public UDP Ports: 51820
Public TCP Ports:
Private IP Address: 192.168.1.3
Private UDP Ports: 51820
Private TCP Ports: 
</code></pre></div></div>

<p>Your "Private IP Address" field will vary depending on your home server's
IP address.</p>

<p>When you connect to your VPN server from a client app, you'll need your home's
public IP address. There are many ways to find this, but one easy way is to
<a href="https://duckduckgo.com/?q=what+is+my+ip&amp;ia=answer">search 'what is my ip' in a decent search engine</a>. Look right under the search bar on the page, above the filter settings.</p>

<p>You can add a VPN client profile with the following command:</p>

<div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pivpn wg <span class="nt">-a</span>
</code></pre></div></div>

<p>This will generate a file containing a client profile. I find it convenient to
use <code class="language-plaintext highlighter-rouge">cat</code> to print the file contents to the terminal, then copy/paste those
contents into a <code class="language-plaintext highlighter-rouge">.conf</code> file that I share from my personal laptop to the client
device, like my phone or work laptop. When you load the configuration in the
WireGuard application, don't forget to replace the endpoint IP address with your
home's public IP! I also like to set up SSID exclusions so my phone and laptop
disconnect from the VPN when I'm on my home wifi network, but connect on any
other network and cellular. Viola! You've now got ad blocking on your devices
wherever you go. And any other services you run on your server.</p>

<p>The VPN is essential to use any of these other services when you're away from home. It's also comforting to use unsecure wifi networks at hotels, coffee shops, and libraries with the knowledge that my VPN protects my traffic from
prying wireless eyes.</p>

<h2 id="ad-blocker">Ad Blocker</h2>

<p>I use a <a href="https://pi-hole.net/">Pi-Hole</a> to block ads on my entire network at
the DNS level. This means that a most ads never make it to my device:
the request doesn't even leave my network! It also helpfully blocks many ads
from my "smart" TV, my Playstation 4 Pro, my e-ink Android tablet, and my
iPhone, which all have locked-down operating systems that prevent me from
blocking ads on the device itself.</p>

<p>A word of warning: depending on the blacklists you employ, a Pi-Hole can and
will break some particularly spammy websites. Referral and tracker links
frequently break -- a particularly annoying situation when I'm trying to
<em>unsubscribe</em> from a mailing list or service. I see this as a red flag that
only reinforces my hatred for these privacy violating services, but Meg tells
me that I might be a dangerous antisocial madman who doesn't acknowledge the
real world utility of Instagram ads. Who's to say who's right? At least you're
aware now.</p>

<p>Once you've got your Pi-Hole set up, you need to configure it as the DNS
provider for your network. I can't help you with that configuration -- it
depends on your router. In the Airport UI, this is particularly annoying.
Here's my current configuration:</p>

<blockquote>
  <p>In the "Internet" tab, set both "DNS Servers" inputs to the IP address of
  your Pi-Hole. Leave the "IPv6 DNS Servers" inputs and the "Domain name"
  input empty. On my Airport router, those empty inputs show greyed-out
  ghost numbers, and (amusingly) <code class="language-plaintext highlighter-rouge">maine.rr.com</code>, despite the fact that I
  live in New Hampshire. I don't know if this is totally correct, but it
  works alright for me.</p>
</blockquote>

<p>Airport routers only have one set of inputs for DNS settings. If you set
up a DNS server in your personal network DHCP range, computers connected
to your guest network will try to connect to that DNS server... and fail.
Because they're in a separate network. For this reason, I don't recommend
using a guest network on an Airport router with a Pi-Hole.</p>

<p>On OpenWRT it was pretty easy to set up a custom DNS provider,
but also pretty easy to screw up. I seem to remember an awful lot of
text entry and writing newlines by hand because there weren't any input
boxes. There's one major thing you should understand when setting up your
Pi-Hole: it should be the <em>only</em> DNS for your network. Don't add a second
"backup" DNS in case it fails -- if you do that, every time you block an
ad with the Pi-Hole, your devices will go straight to the second DNS and
fetch the ad successfully. Stick with just the one.</p>

<p>Some devices come with DNS addresses hardcoded into them. If your router
allows it, block outbound requests from your network entirely for every
device except the server running the Pi-Hole. That way, nobody can send
rogue requests to DNS servers other than the Pi-Hole.</p>

<h2 id="music">Music</h2>

<p>My music hosting is deceptively simple. I use:</p>

<ul>
  <li><a href="https://jellyfin.org/">Jellyfin</a> to host music and videos on my local network</li>
  <li><a href="https://github.com/UnicornsOnLSD/finamp">FinAmp</a> to stream my whole music
library from my phone, and download albums for offline listening.</li>
  <li><a href="https://github.com/jeffvli/sonixd">Sonixd</a> to stream my whole music library
from my work and personal laptops.</li>
</ul>

<p>FinAmp and Sonixd are easy to install on your client devices. Once you've
installed them, you just have to point them to your Jellyfin server. I use my
Pi-Hole to make easy-to-remember DNS entries like "music.box" instead of
"192.168.1.3" for services like Jellyfin. Note that FinAmp and Sonixd are both fairly picky about including the "http://" prefix at the beginning of your URL.
If you create a fun DNS entry, you'll enter a URL like this:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://music.box:8096
</code></pre></div></div>

<p>Setting up Jellyfin isn't too hard, once you've got a place to store all of
your legitimate DRM-free music files ripped from CDs in the 00's. I find
Docker a bit too computationally expensive on my Raspberry Pi, so I run
Jellyfin on server startup via <a href="https://jellyfin.org/docs/general/administration/installing.html#managing-via-systemd">Systemd</a>.
The official documentation covers things quite well.</p>

<p>I organize my files just like I did in the 00's with iTunes:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s">Music</span>
<span class="s">└── ArtistName</span>
    <span class="s">├── AlbumName</span>
    <span class="s">│   ├── Song1.mp3</span>
    <span class="s">│   ├── Song2.mp3</span>
    <span class="s">│   └── cover.webp</span>
    <span class="s">└── AnotherAlbumName</span>
        <span class="s">├── Song1.m4a</span>
        <span class="s">├── Song2.m4a</span>
        <span class="s">└── cover.webp</span>
</code></pre></div></div>

<p>Jellyfin lets you edit metadata in the files directly, but only some of
it, like song names, artist names, album names, etc. It can be difficult
<em>merge</em> artists, if they somehow get separated -- I'm still not sure if
there's a good way to do this in the UI.</p>

<p>I need to investigate volume normalization. My Rush albums, for instance,
are super high quality vinyl-ripped lossless FLACs, upwards of 3000 kbps
quality. But they're quiet compared to the rest of my songs. From what
I've read, I should be able to edit the volume gain directly in the file.
But I haven't experimented with it yet.</p>

<p>I did experience one issue early on with my Jellyfin setup: the account
running my Jellyfin server didn't have write access to my music library.
This meant that I couldn't edit song metadata or delete songs from the UI.
I worked around this by simply running Jellyfin as my admin <code class="language-plaintext highlighter-rouge">pi</code> account
on my home server. That's probably not the best solution, but since it's
only accessible on my home network and via VPN, it's... probably OK. You
could definitely work around the issue by granting another jellyfin-specific
user write access to the music library.</p>

<p>I originally spent a fair bit of time setting up Jellyfin to use Google Drive
as a network storage engine. Surprisingly, it worked! Then, the next day,
Google announced massive cutbacks to previously "unlimited storage for life"
university Google accounts. Coincidence? I think not. There was some noticeable
latency anyway, and 2TB USB SSDs are cheap enough that you're unlikely to
need more storage for a long time.</p>

<h2 id="a-news-feed">A News Feed</h2>

<p>I use <a href="https://www.freshrss.org/">FreshRSS</a> to keep up to date with blog posts
and non-evil newsletters from companies I respect. It's been working great for
about a month so far. If you don't know what RSS is:</p>

<ul>
  <li>It's a technology for decentralized notifications. Instead of "pushing"
updates from a central server, your RSS aggregator just checks for new
entries in a feed file.</li>
  <li>Rumors of its death are greatly exaggerated.</li>
  <li>It's the backbone of podcasts.</li>
  <li><a href="https://en.wikipedia.org/wiki/RSS">Read up on it</a>.</li>
</ul>

<p>Initial installation didn't take long (despite the long list of steps below --
they go quick, and it's all basic Unix-isms instead of modern container voodoo.
I followed <a href="https://cosmosurferblog.wordpress.com/2021/01/30/freshrss-on-raspberry-pi/">this guide</a>, but in case that blog ever disappears, here's the
steps I followed:</p>

<ol>
  <li>
    <p>Update your system:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt-get dist-upgrade
</code></pre></div>    </div>
  </li>
  <li>
    <p>Fetch dependencies:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>php php-curl php-gmp php-intl php-mbstring php-sqlite3 php-xml php-zip
</code></pre></div>    </div>
  </li>
  <li>
    <p>Clone the master branch of FreshRSS into a directory on your server. In
this case, <code class="language-plaintext highlighter-rouge">/srv/</code> (I used <code class="language-plaintext highlighter-rouge">/home/pi/Documents/FreshRSS/</code>):</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /srv/ <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>git clone https://github.com/FreshRSS/FreshRSS.git
</code></pre></div>    </div>
  </li>
  <li>
    <p>Add the following to <code class="language-plaintext highlighter-rouge">/etc/lighttpd/external.conf</code> to run FreshRSS on port
2000 with your existing lighttpd service (used to host your Pi-Hole):</p>

    <div class="language-conf highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># FreshRSS config
</span>
$<span class="n">SERVER</span>[<span class="s2">"socket"</span>] == <span class="s2">":2000"</span> {
    <span class="n">server</span>.<span class="n">document</span>-<span class="n">root</span>     = <span class="s2">"/var/www/html/freshrss/p"</span>
}
</code></pre></div>    </div>
  </li>
  <li>
    <p>Link <code class="language-plaintext highlighter-rouge">&lt;FreshRSS director&gt;/p</code> to the web server folder:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo ln</span> <span class="nt">-s</span> /srv/FreshRSS/p /var/www/html/freshrss
</code></pre></div>    </div>
    <p>In my case, I replaced "/srv/FreshRSS/p" above with "/home/pi/Documents/FreshRSS/p".
To run FreshRSS, this folder must be public. This makes it so.</p>
  </li>
  <li>
    <p>Grant the web server user account (<code class="language-plaintext highlighter-rouge">www-data</code>) access to read the FreshRSS
folder and write to the <code class="language-plaintext highlighter-rouge">data</code> subfolder:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /srv/FreshRSS
</code></pre></div>    </div>
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo chown</span> <span class="nt">-R</span> www-data:www-data <span class="nb">.</span>
</code></pre></div>    </div>
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>cmod <span class="nt">-R</span> g+r <span class="nb">.</span>
</code></pre></div>    </div>
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>cmod <span class="nt">-R</span> g+w ./data
</code></pre></div>    </div>
  </li>
  <li>Next, configure your cron tab to update the feeds automatically.
Open the crontab:
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>crontab <span class="nt">-e</span>
</code></pre></div>    </div>
    <p>Paste the following to run FreshRSS's <code class="language-plaintext highlighter-rouge">actualize_script</code> every 15 minutes
and write any output to a log in <code class="language-plaintext highlighter-rouge">/tmp/</code>:</p>
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">*</span>/15 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> <span class="nb">sudo</span> <span class="nt">-u</span> www-data php <span class="nt">-f</span> /srv/FreshRSS/app/actualize_script.php <span class="o">&gt;</span> /tmp/FreshRSS.log 2&gt;&amp;1
</code></pre></div>    </div>
    <p>As before, replace "/srv/" above with "/home/pi/Documents/FreshRSS/" or
whatever location you chose for your installation in step 3.</p>
  </li>
  <li>Restart lighttpd:
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo</span> /etc/init.d/lghttpd restart
</code></pre></div>    </div>
  </li>
  <li>Breathe a sigh of relief and visit http://<home server="" address="">:2000. Within
a minute or so you should see the FreshRSS UI.</home></li>
</ol>

<p><em>Special thanks to <strong>cosmosurfer</strong> for this non-containerized RSS aggregator setup.</em></p>

<p>Think the installation took a long time? It takes longer to find a list of
feeds you'd like to follow. Here's my own list of feeds that you can shamelessly
sift through as a starting point (or laugh at, if that's more your speed):</p>

<p><a href="/_resources/nates-subscriptions.opml">Nate's RSS Subscriptions [7KB]</a></p>

<p>I'm providing this as an <a href="https://en.wikipedia.org/wiki/OPML">OPML file</a>. It's
basically just a piece of XML that you can import into most RSS clients. If you
don't want to go through the process of setting up FreshRSS, I highly recommend
<a href="https://addons.mozilla.org/en-US/firefox/addon/feedbroreader/">FeedBro</a>, which
runs as a Firefox add-on. Unlike FreshRSS, you can't share your subscriptions
and read state across devices, but if you mostly use one device to read RSS
that might not be a big deal.</p>

<p>Just search the feed name and as long as you use a civil browser like Firefox,
you'll see a little RSS icon on the right side of the URL bar. If you click on
that, you'll end up at the feed URL, which you can copy &amp; paste into FreshRSS.</p>

<p>I use <a href="https://netnewswire.com/">NetNewsWire</a> to read my feed. A lot of people
swear by other clients like Reeder. Some folks just prefer the FreshRSS web UI.
Figure out what makes you happy -- I like the native iOS and macOS styling of
NetNewsWire, so I'm sticking with it for now. I might make my own theme sometime
soon and share it here.</p>

<h2 id="network-file-shares">Network File Shares</h2>

<p>I use Samba to expose files on my home server to other devices on my network --
mostly Macbooks. I followed <a href="https://kremalicious.com/raspberry-pi-file-and-screen-sharing-macos-ios#file-sharing-with-samba">this guide</a>,
but in short:</p>

<ol>
  <li>
    <p>Install Samba on the raspberry pi:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt update <span class="o">&amp;&amp;</span> <span class="nb">sudo </span>apt upgrade
</code></pre></div>    </div>
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>samba samba-common-bin
</code></pre></div>    </div>
  </li>
  <li>
    <p>Set a dedicated Samba password for the account you'd like to use for
file sharing (I stuck with pi; that's probably not the most secure
way to go):</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>smbpasswd <span class="nt">-a</span> pi
</code></pre></div>    </div>
  </li>
  <li>
    <p>In <code class="language-plaintext highlighter-rouge">/etc/samba/smb.conf</code>, in the <code class="language-plaintext highlighter-rouge">[homes]</code> section, set <code class="language-plaintext highlighter-rouge">read only = no</code>
to make shared home folders writable.</p>
  </li>
  <li>
    <p>(Optional) Set a fancy icon for the raspberry pi in Finder by creating a
<code class="language-plaintext highlighter-rouge">/etc/avahi/services/smb.service</code> file (use <code class="language-plaintext highlighter-rouge">sudo</code>) and entering
the following contents:</p>

    <div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="cp">&lt;?xml version="1.0" standalone='no'?&gt;</span>
 <span class="cp">&lt;!DOCTYPE service-group SYSTEM "avahi-service.dtd"&gt;</span>
 <span class="nt">&lt;service-group&gt;</span>
   <span class="nt">&lt;name</span> <span class="na">replace-wildcards=</span><span class="s">"yes"</span><span class="nt">&gt;</span>%h<span class="nt">&lt;/name&gt;</span>
   <span class="nt">&lt;service&gt;</span>
     <span class="nt">&lt;type&gt;</span>_smb._tcp<span class="nt">&lt;/type&gt;</span>
     <span class="nt">&lt;port&gt;</span>445<span class="nt">&lt;/port&gt;</span>
   <span class="nt">&lt;/service&gt;</span>
   <span class="nt">&lt;service&gt;</span>
     <span class="nt">&lt;type&gt;</span>_device-info._tcp<span class="nt">&lt;/type&gt;</span>
     <span class="nt">&lt;port&gt;</span>0<span class="nt">&lt;/port&gt;</span>
     <span class="nt">&lt;txt-record&gt;</span>model=MacProCylinder<span class="nt">&lt;/txt-record&gt;</span>
   <span class="nt">&lt;/service&gt;</span>
 <span class="nt">&lt;/service-group&gt;</span>
</code></pre></div>    </div>

    <p>If you want any other icon, run <code class="language-plaintext highlighter-rouge">open /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/</code> in your mac, and pick your favorite
icon.</p>
  </li>
  <li>
    <p>Restart the Samba service to make these changes effective:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>service smbd restart
</code></pre></div>    </div>

    <p>And restart the Avahi service to make the icon changes effective:</p>

    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>service avahi-daemon restart
</code></pre></div>    </div>
  </li>
</ol>

<p>If you don't see the server or icons, try <code class="language-plaintext highlighter-rouge">killall Finder</code> to restart the
Finder process on your Mac.</p>

<h2 id="backups">Backups</h2>

<p>I just use Time Machine for now. I'd eventually like to offload my backups
to an offsite storage medium, in case of a flood or a fire or a Vogon
constructor fleet. For now, this is the best backup solution I've ever had,
and I'm basking in that glory until I get worried enough to improve it.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Over the past few years, I've slowly tried to reduce my dependence on big tech. I know this is popular in some circles right now, and I've made all the standard moves: remove myself from Facebook and Instagram migrate my personal email from Gmail to Protonmail (update: now trialing Purelymail) reduce subscriptions to music and video streaming services across the board start a blog where I can shamelessly rant and rave about cool things I've done But why did I do this? Not (just) because I love to chase the latest technocrat trends. Honestly it's mostly because I hate feeling dirty when I use these services: When I used Spotify, I was constantly frustrated by regressions and podcasts shoved in my face (despite the fact that I cannot stand Spotify's approach to podcasts, where they buy up exclusive distribution rights to a family of podcasts and turn them into... Spodcasts, which aren't really podcasts because they aren't distributed the way all other podcasts circulate: RSS). And their offline playback support is laughable. Google services constantly misbehave when you use Firefox or Librewolf, my browsers of choice. Newsletters constantly send spam mail, and are often much harder to fully unsubscribe from than an RSS feed. iOS still doesn't support ad blocking anywhere near the level of uBlock Origin, or allow me to use real add-ons in a browser... prompting me to find alternative methods to block ads on my phone. And every tech company I've ever bought any product from seems to abuse dark patterns to manipulate users out the wazoo. All in the name of getting you to buy one more thing, or look at one more not-really-notification. Weak. This post talks about how I freed myself from a myriad of big tech services, all with the support of a small investment in hardware, electricity, and personal time. I call my open source confederation of services Natopia, because, well, narcissism. NOTE: Literally all of this is a work in progress. Open source projects continually develop. Standards change. This all works right now, but there are many pieces I'd like to improve. Expect updates to this page over time.]]></summary></entry><entry><title type="html">IDID-3210</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/09/11/idid-3210/" rel="alternate" type="text/html" title="IDID-3210" /><published>2022-09-11T21:14:22+00:00</published><updated>2022-09-11T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/09/11/idid-3210</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/09/11/idid-3210/"><![CDATA[<p>Recently I made the mistake of attempting to log in to my Spectrum account.
As a conscious human being with not-so-fond memories of Time Warner Cable,
I'm aware that using Spectrum for internet is a fool's errand. But I have
no choice in the small New England town that I now live in. Thanks, FCC.</p>

<!-- readmore -->

<p>As you'd expect, my attempt to log in to my account didn't go well. I
entered valid credentials, and the auth portal spit out:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>We’re sorry, we’re unable to sign you in. Please try again later. IDID-3210.
</code></pre></div></div>

<p>Here's how I escaped the horrors of <code class="language-plaintext highlighter-rouge">IDID-3210</code>.</p>

<ol>
  <li>I use a <a href="https://pi-hole.net/">DNS black hole</a> to block ads.
I whitelisted <code class="language-plaintext highlighter-rouge">pov.spectrum.net</code> based on some suggestions from Reddit users.</li>
  <li>I used Safari with NO extensions and an essentially clean browsing history.</li>
  <li>After 3 login attempts, I got in.</li>
</ol>

<p>No matter how hard I try, I cannot authenticate from Firefox or even Chromium.
Let alone with an ad blocker like uBlock Origin. Based on the massive amount of
console errors I see when I try to log in, I would guess that there's some sort
of cross-site-scripting faux pas happening in the login portal. And based on my
attempts to log in from my phone on my cellular internet connection, I think
IDID-3210 somehow blocks auth attempts after a certain number of failures.</p>

<p>It's got nothing to do with special characters present or missing from your
password.</p>

<p>It has everything to do with an immensely incompetent megacompany with a
stranglehold on internet access in the United States that is so poorly run
they literally <em>cannot even code an authentication portal</em>. That's something
that even I can do. And I'm not even a software developer any more!</p>

<p>I reiterate: thanks, FCC.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Recently I made the mistake of attempting to log in to my Spectrum account. As a conscious human being with not-so-fond memories of Time Warner Cable, I'm aware that using Spectrum for internet is a fool's errand. But I have no choice in the small New England town that I now live in. Thanks, FCC.]]></summary></entry><entry><title type="html">Make a Bootable USB in macOS</title><link href="https://www.lambdalatitudinarians.org/techblog/2022/01/28/make-a-bootable-usb-macos/" rel="alternate" type="text/html" title="Make a Bootable USB in macOS" /><published>2022-01-28T21:14:22+00:00</published><updated>2022-01-28T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2022/01/28/make-a-bootable-usb-macos</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2022/01/28/make-a-bootable-usb-macos/"><![CDATA[<p>This post explains how to make a bootable USB drive for installing Linux, macOS, Windows, or... whatever else you want. From macOS. Using the command line, mostly. And unlike every other article on the internet that explains this
concept on the internet, it's not blogspam, it's not filled with ads, and it's not written in broken English or with so much fluff you give up halfway through.</p>

<!-- readmore -->

<p>Follow these steps:</p>

<ol>
  <li>Plug the USB drive into your Mac.</li>
  <li>Format USB drive to MS-DOS (FAT) with Disk Utility. On the USB drive,
click "erase", then rename your drive &amp; choose FAT.</li>
  <li>Download the ISO image to load onto the drive.</li>
  <li>Convert the ISO to an DMG image:
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>hdiutil convert /path/to/example.iso <span class="nt">-format</span> UDRW <span class="nt">-o</span> /path/to/example
</code></pre></div>    </div>
    <p>Note that the output file implicitly gets a <code class="language-plaintext highlighter-rouge">.dmg</code> extension added to the end. You'll need to include the <code class="language-plaintext highlighter-rouge">.dmg</code> when you write the image to the drive.</p>
  </li>
  <li>Find the USB drive id with diskutil:
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>diskutil list
</code></pre></div>    </div>
    <p>This will output a big list of disks (<code class="language-plaintext highlighter-rouge">/dev/disk1</code>, <code class="language-plaintext highlighter-rouge">/dev/disk2</code>, <code class="language-plaintext highlighter-rouge">/dev/disk3</code>, for instance). Look for the USB you just reformatted by name in the "NAME" column. Then grab the identifier from the "IDENTIFIER" column in row 0. Or just use the last string in the disk label at the start of the disk listing, a la "disk3". If you forgot to assign a meaningful name, you might be able to find it by capacity.</p>
  </li>
  <li>Write your DMG to the USB drive using the ID from the previous step:
    <div class="language-zsh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo dd </span><span class="k">if</span><span class="o">=</span>/path/to/example.dmg <span class="nv">of</span><span class="o">=</span>/dev/&lt;USB DRIVE ID&gt; <span class="nv">bs</span><span class="o">=</span>1m
</code></pre></div>    </div>
    <p><strong>Note:</strong> you'll need to include the <code class="language-plaintext highlighter-rouge">.dmg</code> extension at the end of your image file. If you're a little thick like me, you might forget it because you didn't include it in step 3. You <em>do</em> have to include it this time.
<strong>Second note:</strong> this can take a loooooong time. Like 10-20 minutes. I think mine took almost 30 minutes, and I have a pretty decently specced Macbook Pro, albeit from 2015. Seems this is pretty dependent on the image size and the quality of the storage in your USB drive, which if you're just using some random one from 10 years ago, might not be that great.</p>
  </li>
  <li>When you get a popup that says "The disk you inserted was not readable by
this computer", click "Ignore" and carry on. That's just your Mac getting
upset that it can't read the image with Finder, even though your mac just...
wrote the image. macOS is dumb sometimes.</li>
  <li>Plug the USB drive into the computer you want to reimage. On a Mac, you'll
hold down the option key at boot time until you see a boot menu, at which
point you'll pick the USB drive. On my Linux laptop, I had to hit ESC
multiple times when the manufacturer boot splash screen came up, to bring up
BIOS, to add USB to the boot options. And then I had to hold F2 when I
booted (again), and select the USB drive. YMMV -- it's best to take a look
at the manual or look up how to bring up boot options/BIOS for your computer.</li>
</ol>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[This post explains how to make a bootable USB drive for installing Linux, macOS, Windows, or... whatever else you want. From macOS. Using the command line, mostly. And unlike every other article on the internet that explains this concept on the internet, it's not blogspam, it's not filled with ads, and it's not written in broken English or with so much fluff you give up halfway through.]]></summary></entry><entry><title type="html">The Hitchhiker&apos;s Guide to Kotlin</title><link href="https://www.lambdalatitudinarians.org/techblog/2020/12/11/hitchhikersGuideToKotlin.html" rel="alternate" type="text/html" title="The Hitchhiker&apos;s Guide to Kotlin" /><published>2020-12-11T21:14:22+00:00</published><updated>2020-12-11T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2020/12/11/hitchhikersGuideToKotlin</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2020/12/11/hitchhikersGuideToKotlin.html"><![CDATA[<p>Lately I've been doing a lot of work in a relatively new programming
language: Kotlin. From my experience, I've concluded that Kotlin is
pretty rad. If you've considered learning Kotlin, or just using it
in a personal project, this post might help you with your decision.
Below, I hope I'll (attempt) to tell you a little bit about my
experience with Kotlin, and describe what I liked about Kotlin and
what I didn't like.</p>

<!-- readmore -->

<p>Firstly, you should know Kotlin is a JVM (Java Virtual Machine) language,
which means that like Java, Scala, and Clojure, Kotlin (usually)
compiles to Java bytecode. That means that Kotlin is compatible with
libraries written in Java, so if there's a Java library that solves
a problem you're dealing with, you can just pull that Java library
into your Kotlin project without any need for translation or
hoop-jumping. Given the popularity of Java in the software development
world for the last 20 years, that's a powerful set of tools to start
with for a new language.</p>

<p>Now, of course, you're probably wondering: if I want to use a Java
library, why wouldn't I just write Java? A good question, of course;
it's not like there's anything inherently wrong with Java! Many of us
learned Java syntax in college, the workforce, or even high school for
one reason or another. If you know C++, C, or even Javascript syntax,
it's not a huge hurdle to learn Java, or at least get to a point of
vague competence -- though let's not pretend that the subtleties of
Java, like managing dependencies or producing build artifacts
(properly) isn't a big hurdle of itself!</p>

<p>Anyway, Java works just fine.
But Java is also a language whose syntax was designed literally
decades ago. Despite the best intentions of the original language
creators, some syntax decisions haven't been popular in the long term,
and Java still struggles with the repercussions of those decisions.
Kotlin, on the other hand, was designed in the past couple of years.
While newer does not necessarily mean better, in terms of syntax it
<em>definitely</em> translates to "simpler" in this case. Anyone who's
written Java can appreciate that while Java syntax is hardly as
opaque as <a href="https://en.wikipedia.org/wiki/Template_metaprogramming">C++ template programming</a>
or <a href="https://old.reddit.com/r/perl/comments/2tdgcy/why_is_perl_considered_awful/">Perl</a>, it can be, at the very least, a tad
bit verbose. For example, consider the following class declaration that
describes a dog:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.awt.Color</span><span class="o">;</span>

<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Dog</span> <span class="o">{</span>
    <span class="kd">private</span> <span class="nc">String</span> <span class="n">name</span><span class="o">;</span>
    <span class="kd">private</span> <span class="kt">int</span> <span class="n">age</span><span class="o">;</span>
    <span class="kd">private</span> <span class="nc">Color</span> <span class="n">color</span><span class="o">;</span>

    <span class="kd">public</span> <span class="nf">Dog</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">,</span> <span class="kt">int</span> <span class="n">age</span><span class="o">,</span> <span class="nc">Color</span> <span class="n">color</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
        <span class="k">this</span><span class="o">.</span><span class="na">age</span> <span class="o">=</span> <span class="n">age</span><span class="o">;</span>
        <span class="k">this</span><span class="o">.</span><span class="na">color</span> <span class="o">=</span> <span class="n">color</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">String</span> <span class="nf">getName</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">name</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setName</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">getAge</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">age</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setAge</span><span class="o">(</span><span class="kt">int</span> <span class="n">age</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">age</span> <span class="o">=</span> <span class="n">age</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="nc">Color</span> <span class="nf">getColor</span><span class="o">()</span> <span class="o">{</span>
        <span class="k">return</span> <span class="n">color</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setColor</span><span class="o">(</span><span class="nc">Color</span> <span class="n">color</span><span class="o">)</span> <span class="o">{</span>
        <span class="k">this</span><span class="o">.</span><span class="na">color</span> <span class="o">=</span> <span class="n">color</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Nothing unexpected, right? The class is called <code class="language-plaintext highlighter-rouge">Dog</code>. It's <code class="language-plaintext highlighter-rouge">public</code>,
which means that other classes in this package can reference this
class (though this class is top-level in a file, so the <code class="language-plaintext highlighter-rouge">public</code>
modifier is redundant). This class contains
values for the dog's name, the dog's age, and the color of the dog.
There's a constructor, which accepts parameters matching each of
those values and assigns the parameter values to the fields stored
within the class. And of course, there are accessors and mutators
(getters and setters for the unwashed masses, myself included),
which actually allow code outside of this class to access and
modify the fields of this class, which are set to <code class="language-plaintext highlighter-rouge">private</code> because
encapsulation best practices say that code outside of a class
should never directly access class fields.</p>

<p>Now let's look at the same class in Kotlin, which functions exactly
the same, with accessors, mutators, a constructor, and encapsulation
best practices:</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nn">java.awt.Color</span>

<span class="kd">data class</span> <span class="nc">Dog</span><span class="p">(</span><span class="kd">var</span> <span class="py">name</span><span class="p">:</span> <span class="nc">String</span><span class="p">,</span>
               <span class="kd">var</span> <span class="py">age</span><span class="p">:</span> <span class="nc">Int</span><span class="p">,</span>
               <span class="kd">var</span> <span class="py">color</span><span class="p">:</span> <span class="nc">Color</span><span class="p">)</span>
</code></pre></div></div>

<p>Woof. As you can see, the Kotlin class is a lot, lot, lot shorter.
And that's because Kotlin's ethos is all about setting
<em>sensible defaults</em>. There's no need to label this class public,
because that's implicit. There's no need to define a constructor
AND a getter and a setter for every single field; because this
is a <a href="https://kotlinlang.org/docs/reference/data-classes.html">data class</a>
whose sole purpose is to store data, Kotlin "just knows" that
we want accessors, mutators, and a constructor. But this is just
the beginning of the benefits of Kotlin.</p>

<p>A JIRA ticket comes in, priority 1. "Clients love these Dog thingies",
sales says. "But we need to do <strong>more</strong> with dogs! The clients want
to add two dogs together. Can you implement this?" Fortunately, as
a seasoned Kotlin developer, you know that you can throw a solution
together in just a few simple story points. So you get cracking, and
decide to get fancy by
<a href="https://kotlinlang.org/docs/reference/operator-overloading.html">overriding the behavior</a>
of the <code class="language-plaintext highlighter-rouge">+</code> operator for operations involving two <code class="language-plaintext highlighter-rouge">Dog</code> objects:</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">operator</span> <span class="k">fun</span> <span class="nf">plus</span><span class="p">(</span><span class="n">dog</span> <span class="p">:</span> <span class="nc">Dog</span><span class="p">)</span> <span class="p">:</span> <span class="nc">Dog</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nc">Dog</span><span class="p">(</span><span class="n">dog</span><span class="p">.</span><span class="n">name</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">dog</span><span class="p">.</span><span class="n">age</span>
           <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">age</span><span class="p">,</span> <span class="n">dog</span><span class="p">.</span><span class="n">color</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">color</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>But you've hit a snag. The <code class="language-plaintext highlighter-rouge">String</code> and <code class="language-plaintext highlighter-rouge">Int</code> classes define behavior
for the <code class="language-plaintext highlighter-rouge">+</code> operator. But the <code class="language-plaintext highlighter-rouge">Color</code> class doesn't. Worse yet, <code class="language-plaintext highlighter-rouge">Color</code>
isn't even a Kotlin class -- it's a member of the Java standard
library! Fortunately, Kotlin lets you add member functions to any
class using something called
<a href="https://kotlinlang.org/docs/reference/extensions.html">Kotlin Extensions</a>:</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">operator</span> <span class="k">fun</span> <span class="nc">Color</span><span class="p">.</span><span class="nf">plus</span><span class="p">(</span><span class="n">color</span><span class="p">:</span> <span class="nc">Color</span><span class="p">)</span> <span class="p">:</span> <span class="nc">Color</span> <span class="p">{</span>
    <span class="k">return</span> <span class="nc">Color</span><span class="p">(</span><span class="n">color</span><span class="p">.</span><span class="n">red</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">red</span><span class="p">,</span> <span class="n">color</span><span class="p">.</span><span class="n">blue</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">blue</span><span class="p">,</span>
        <span class="n">color</span><span class="p">.</span><span class="n">green</span> <span class="p">+</span> <span class="k">this</span><span class="p">.</span><span class="n">green</span><span class="p">)</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Because the <code class="language-plaintext highlighter-rouge">red</code>, <code class="language-plaintext highlighter-rouge">blue</code>, and <code class="language-plaintext highlighter-rouge">green</code> fields stored within the <code class="language-plaintext highlighter-rouge">Color</code> class
are actually integers, we can just add those together for an (admittedly
simple) additive color implementation. And the <code class="language-plaintext highlighter-rouge">Color</code> class even handles
capping the values at 255 for us!</p>

<p>Thanks to your fancy coding skills, you can add two dogs together
like so:</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">val</span> <span class="py">dog1</span> <span class="p">:</span> <span class="nc">Dog</span> <span class="p">=</span> <span class="nc">Dog</span><span class="p">(</span><span class="s">"henry"</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="nc">Color</span><span class="p">.</span><span class="nc">RED</span><span class="p">)</span>
<span class="kd">var</span> <span class="py">dog2</span> <span class="p">=</span> <span class="nc">Dog</span><span class="p">(</span><span class="s">"indiana"</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="nc">Color</span><span class="p">.</span><span class="nc">GREEN</span><span class="p">)</span>
<span class="kd">val</span> <span class="py">dog3</span> <span class="p">=</span> <span class="n">dog1</span> <span class="p">+</span> <span class="n">dog2</span>
</code></pre></div></div>

<p>What else does Kotlin offer? Well, anybody familiar with Java has
inevitably experienced the dreaded <code class="language-plaintext highlighter-rouge">NullPointerException</code> at some
point. We've all indexed past the end of an array or a string,
incorrectly handled a null value when a network call timed out,
or any of a million other things that threw a null value right
into an object that we forgot to check for a null value with
<code class="language-plaintext highlighter-rouge">!= null</code>. Because writing all those null checks isn't just a
pain -- it makes code harder to read! Kotlin makes this issue a
lot easier to avoid with explicit nullability. Consider the
code snippet above, where we instantiated two <code class="language-plaintext highlighter-rouge">Dog</code> objects.
Both <code class="language-plaintext highlighter-rouge">dog1</code> and <code class="language-plaintext highlighter-rouge">dog2</code> are non-nullable: they can never point at
a null object. If you want to assign a value a nullable type in
Kotlin, you have to use the <code class="language-plaintext highlighter-rouge">?</code> operator:</p>

<div class="language-kotlin highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">fun</span> <span class="nf">maybeDog</span><span class="p">()</span> <span class="p">:</span> <span class="nc">Dog</span><span class="p">?</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="nc">Random</span><span class="p">.</span><span class="nf">nextInt</span><span class="p">()</span> <span class="p">%</span> <span class="mi">2</span> <span class="p">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">return</span> <span class="nc">Dog</span><span class="p">(</span><span class="s">"casper"</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="nc">Color</span><span class="p">.</span><span class="nc">GRAY</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="k">null</span>
<span class="p">}</span>

<span class="kd">val</span> <span class="py">mightBeDog</span> <span class="p">:</span> <span class="nc">Dog</span><span class="p">?</span> <span class="p">=</span> <span class="nf">maybeDog</span><span class="p">()</span>
<span class="nf">println</span><span class="p">(</span><span class="n">mightBeDog</span><span class="o">?.</span><span class="n">name</span><span class="p">)</span>
<span class="k">if</span> <span class="p">(</span><span class="n">mightBeDog</span> <span class="p">!=</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">println</span><span class="p">(</span><span class="n">mightBeDog</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
<span class="p">}</span>
<span class="nf">println</span><span class="p">(</span><span class="n">mightBeDog</span><span class="o">!!</span><span class="p">.</span><span class="n">name</span><span class="p">)</span>
</code></pre></div></div>

<p>In this example, <code class="language-plaintext highlighter-rouge">mightbeDog</code> is of type <code class="language-plaintext highlighter-rouge">Dog?</code> -- in other words,
it is a <em>nullable</em> Dog type. Whenever you access a nullable value,
you need to do so safely: usually, using the safe nullable lookup
operator: <code class="language-plaintext highlighter-rouge">?</code>, which you can see when we print out the name of
<code class="language-plaintext highlighter-rouge">mightBeDog</code>. Basically this operator resolves to "the field
you're trying to look up, or null if the base object is null"
instead of triggering a <code class="language-plaintext highlighter-rouge">NullPointerException</code>. However, you can
also use the unsafe nullable lookup operator: <code class="language-plaintext highlighter-rouge">!!</code>, which lets you
trigger <code class="language-plaintext highlighter-rouge">NullPointerException</code> just like you could in Java (see
above). Finally, Kotlin includes a feature called <em>smart casting</em>,
which basically says "if I check a value in an <code class="language-plaintext highlighter-rouge">if</code> statement,
assume the implication of that statement in the <code class="language-plaintext highlighter-rouge">if</code> statement
codeblock". In the above example, in the codeblock corresponding
to the <code class="language-plaintext highlighter-rouge">mightBeDog != null</code> if check, we don't have to use a
safe lookup operator. That's because in that code block,
<code class="language-plaintext highlighter-rouge">mightBeDog</code> is actually cast to type <code class="language-plaintext highlighter-rouge">Dog</code> instead of just <code class="language-plaintext highlighter-rouge">Dog?</code>.
This also works with types themselves, not just nullability, so
if you had an instance of <code class="language-plaintext highlighter-rouge">Animal</code> with an if check that checked if
the instance was actually subtype <code class="language-plaintext highlighter-rouge">Dog</code>, you wouldn't have to
perform an if check <em>and</em> cast to type <code class="language-plaintext highlighter-rouge">Dog</code>, a common Java-ism.</p>

<p>Did you like this post? Let me know! Coming up: part 2, where I
discuss coroutines and a few interesting parts of Kotlin <em>besides</em>
mere syntax.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Lately I've been doing a lot of work in a relatively new programming language: Kotlin. From my experience, I've concluded that Kotlin is pretty rad. If you've considered learning Kotlin, or just using it in a personal project, this post might help you with your decision. Below, I hope I'll (attempt) to tell you a little bit about my experience with Kotlin, and describe what I liked about Kotlin and what I didn't like.]]></summary></entry><entry><title type="html">Site Redesign!</title><link href="https://www.lambdalatitudinarians.org/techblog/2020/11/30/siteRedesign/" rel="alternate" type="text/html" title="Site Redesign!" /><published>2020-11-30T21:14:22+00:00</published><updated>2020-11-30T21:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2020/11/30/siteRedesign</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2020/11/30/siteRedesign/"><![CDATA[<p>When I originally created this site, I had no clue what I was doing.
Some friends told me I should think about creating a personal website,
and I thought it would be fun to write a few blog posts. So I threw
together a few basic styles with GitHub's static site generator, broke
Jekyll a few times, and eventually figured out how to get things working!</p>

<!-- readmore -->

<p>Since then, this site has served me well. It's a great place to point
recruiters or job applications, and blogging has provided a nice outlet
for writing more creative than what I usually do at my day job.</p>

<p>However, as the years have passed on, I've noticed a few weaknesses of
the site:</p>

<ul>
  <li>
    <p>I originally "borrowed" a lot of CSS cues from the
<a href="https://www.daringfireball.net">Daring Fireball</a> website. And by
borrowed, I mean that I pretty much copied the styling
because it meshed well with my minimalistic website
preferences.</p>
  </li>
  <li>
    <p>The name of this site is pronounced "Lambda Lovers", but
I've just used the symbol for lambda at the top of the page.
I don't think there's anything wrong with that personally, but
I'm sure some recruiters have visited this site, read "greek symbol
lovers" at the top, and decided I wasn't worth any more investigation
because I have some kind of strange kinky website for lovers. (Note:
this is not a kinky website for potential lovers)</p>
  </li>
  <li>
    <p>Random typos and mistakes have crept up in the site's text over the
years, since it tends to be difficult to maintain text when you only
edit small portions every once in a long while.</p>
  </li>
</ul>

<p>As a result, I've made a few changes to the site:</p>

<ul>
  <li>
    <p>While I still like "my" (well, Gruber's) old styling, I've
now decided to pursue a slightly different (and undoubtedly
worse) styling whose colors carry a bit more personal
significance.</p>
  </li>
  <li>
    <p>I've decided to rename the site to "Lambda Latitudinarians". Note that
this site title does <em>not</em> have any connection to 17th-century Anglican
clerics. My decision to alter the title is linked to the lowercase-l
adjective "latitudinarian", defined as "not insisting on strict
conformity to a particular doctrine or standard." I thought the word
particularly fitting for my attitude in the world of computer science,
where I feel I have a pretty open mind about the best way to do things,
but many software developers insist on standards conformity to a point
of religiousness. Obviously it's a great idea to have standards, but I
feel that overzealousness about those standards blinds people to ways
that the status quo can be improved.</p>
  </li>
  <li>
    <p>I've fixed a number of typos and mistakes across the site, most notably
the claim that I live in "New York, NY". Back in May of this year I
moved to Denver, Colorado and transitioned to fully remote work. Before
then, I actually lived in upstate New York for all but a couple of weeks
at the beginning of 2020 due to coronavirus (despite maintaining an
empty apartment in Astoria, NY -- RIP my bank account).</p>
  </li>
</ul>

<p>I'll probably tweak the site design (specifically the background color --
it's sort of aggressively green right now) more in the future, but for now,
keep an eye out for future blog posts! I've got a few planned for the
immediate future, mostly based around random subjects that interest me,
like my experience learning Kotlin recently, the origins of the SAT exam,
and some musings on podcasts, running, hiking, Colorado, Denver, and
espresso. If you've enjoyed any of my ranty posts so far, send me an email
at ncontino [at] u.rochester.edu -- I'd love to hear from you.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[When I originally created this site, I had no clue what I was doing. Some friends told me I should think about creating a personal website, and I thought it would be fun to write a few blog posts. So I threw together a few basic styles with GitHub's static site generator, broke Jekyll a few times, and eventually figured out how to get things working!]]></summary></entry><entry><title type="html">Five Months with the 15-inch 2017 MacBook Pro</title><link href="https://www.lambdalatitudinarians.org/techblog/2018/03/14/fiveMonthsMBP2017/" rel="alternate" type="text/html" title="Five Months with the 15-inch 2017 MacBook Pro" /><published>2018-03-14T23:14:22+00:00</published><updated>2018-03-14T23:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2018/03/14/fiveMonthsMBP2017</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2018/03/14/fiveMonthsMBP2017/"><![CDATA[<p>I have now spent about five months with a work-supplied Macbook Pro 2017, complete with discrete GPU and the infamous TouchBar.</p>

<p>So far, my experience has been... well, I'll get to that eventually.</p>

<!-- readmore -->

<p>First, some background: my first computer was an ancient (even for the time) mid-90s Macintosh. If I had to guess at the model, a feat which would require an awful lot of investigative work, I'd probably peg it as an LC 580 from 1995, which would make it only slightly older than me. At the time, I didn't think much of it, but I definitely liked it a lot more than the god awful underpowered Windows XP machines I used in the following years. You probably remember those machines, too (though I think we've mostly tried to forget them): too little RAM, so they constantly swapped with the hard disk, which was &lt;2000RPM and uttered noises resembling a child mopping up the least dregs of a Slurpee; graphics that could hardly power the 480x600px fullscreen monitors of the era on a blank desktop, no less running Excel or a web browser; IE6; that awful, awful rolling green hills XP default background; the untangleable mess of hardware drivers for even something as simple as a mouse, keyboard, or printer; constant blue screens of death and crashes... and so much worse that I've suppressed over the years.</p>

<p>Anyway, it's safe to say that I wasn't a fan of Windows growing up, though that probable has something to do with the terrible hardware used for cheap consumer Windows machines at the time. From what I've heard, OS X wasn't much better pre-Snow Leopard, so I think it's safe to say that I would have hated either as a kid. All I know is that I saw computers as awful utilitarian machines (an unfortunate necessity for messaging, games, and web forums) until I saw my brother's 2006 white polycarbonate macbook. That was the first time I remember being truly impressed by a computer -- it didn't just look like something I'd tolerate using, it looked like something I <em>wanted</em> to use. It's funny to look back at it now, considering how dated the machine looks, but at the time it really was an impressive machine. That recessed, high resolution camera; those nearly seamless transitions between the bottom and top case; the satisfying click of the chicklet keyboard (that I must admit, I really preferred to other laptop keyboards at the time, including my father's IBM era ThinkPad); and most of all, the fact that the machine had a cohesive, thoughtful design. In short, it was a sexy machine, and the minute I saw it I knew I wanted a Mac. The software design of OS X was just icing on the cake -- I didn't even know what Unix was at the time, much less yearn for a proper terminal, but I could appreciate the font rendering of OS X and the contextual top bar.</p>

<p>But I didn't get a Mac immediately -- after all, I was only 11 at the time, and I could hardly afford a $1000 laptop on the money I earned mowing the lawn. So I waited, and saved up, and got my first job. I used a truly awful desktop, another truly awful desktop, and a truly awful laptop, all running XP and all inherited from family. In 2010, I purchased my first brand-new laptop: a 2010 MacBook Pro Unibody, with a 250GB HDD and a Core 2 Duo processor. It was awesome. I used that thing until 2015, upgrading the RAM to 12GB and the drive to an SSD along the way, and only abandoned it because it started to choke on web apps. The uniformly backlit keys, the battery indicator light, the trackpad that, through a combination of gestures and a smooth glass surface, felt like an extension of my hand in a way a mouse never did... there was little I didn't love about that machine. Sure, it didn't have the performance of a $1000 desktop at the time, but it was mobile and worked perfectly for my use cases. When I eventually got into programming in 2012, I'd first use the 2006 MacBook that my brother no longer used, and later use my MBP for my college Computer Science classes at the University of Rochester. I never regretted the money I spent on that machine, and still maintain that it was one of the best purchasing decisions I've ever made. Technically the machine still runs today, but I was force to remove the battery since it expanded after a year of neglect. My brother (the same one who bought that original 2006 MBP!) is currently using it for Python and R development, though it's tied to an outlet these days.</p>

<p>My 2015 MacBook Pro is another purchase I don't regret at all. It has served me well since I purchased it at the beginning of my first software internship, and still remains my daily driver personal machine. It runs games like FTL, Starbound, Terraria, and Minecraft well enough, it travelled across Europe with me during my study abroad semester, and I've never had an issue with it whatsoever aside from a few software bugs in Yosemite when I first got the machine. I quickly upgraded to El Capitan beta, and the machine actually remains on El Capitan to this day -- a decision I don't regret, given my experiences with Sierra on my work laptop.</p>

<p>So, now that you've read through that meandering recount of my personal computers, you're probably wondering: why did I read that? Why on earth would I care? Well, I just wanted to give some context before I unload on my work MacBook Pro 2017. I wanted to establish that I'm not used to desktop performance, mechanical keyboards, and I've certainly experienced plenty of software/hardware bugs in my day. I've worked on college computer lab Fedora machines, a work ThinkPad on Windows 7, a work Dell on Windows 7, a desktop replacement gaming laptop on Windows 7, Windows 8, Windows 10, Fedora, and Ubuntu, a MacBook 2006, a MacBook Pro 2010, a MacBook Pro 2015, and now my MacBook Pro 2017, and I don't think I've experienced a computer with this many issues since at least 2005, when I used an ancient Gateway laptop that literally had keys falling off of its keyboard (but unlike the 2017 MBP, at least they still worked ;-) ).</p>

<p>Let's go through a list of some of my top grievances with the MBP 2017:</p>

<ul>
  <li>
    <p>The keyboard is the most uncomfortable keyboard I've ever typed on, to
the point where my finger pads actually hurt after just a few sentences.</p>
  </li>
  <li>
    <p>The lack of spacing between keys and key height makes it very difficult to
type accurately, so I type much slower than usual.</p>
  </li>
  <li>
    <p>I thought my personal 2015 Pro got hot when I watch YouTube with the vents
partially blocked, but I was totally wrong. <em>This</em> laptop gets hot -- to a
point where my hands actually start sweating just trying to type on the
keyboard. Unexpected pro to this con: if my hands get cold on my walk to
the office, this laptop heats them up in a matter of minutes. Unexpected
con: the cumulative heat generated by this laptop actually heats up my
area of the office by a noticeable increment.</p>
  </li>
  <li>
    <p>The TouchBar is beyond useless. You'd think that making the escape key a
virtual button wouldn't cause that huge a disruption to your workflow...
but you'd be wrong. Every time I try to switch modes in VIM, I look down
at my keyboard because the lack of an escape key surprises me. 6 months
later. I thought I'd adapt but I can't, especially since <em>every other
keyboard</em> provides physical feedback when I hit escape, so I never truly
get used to the lack of feedback. Sorry Apple, but I don't like you
enough to ditch every other keyboard I use... and you don't even provide
an external TouchBar, so I couldn't even if I wanted to. If you're having
trouble imagining why this is such a problem, imagine if your laptop's
<strong>1</strong> key made a loud quacking noise, like a duck, every time you pressed
it. You might get used to it for a few hours... but as soon as you used a
keyboard where that key didn't sound like a duck, you'd be surprised, and
start getting used to the lack of quacking. And then the next day at work
you'd be surprised by the quack again! But then you'd get a little used
to it... but then you'd use a different laptop... over and over again.
Whiplash, Apple, is what you're giving me. I don't want my $3000 laptop
to give me whiplash.</p>
  </li>
  <li>
    <p>Since my previous TouchBar rant was mostly a "virtual escape key" rant,
let me rant about the rest of it: having my keys change between applications
means I never get used to their location, so I can never, say, skip a song
or adjust the brightness without looking because it's constantly moving all
over the place. And it's hard anyway to position a slider without looking at
the slider, and it usually ends up accidentally maxing out my volume and
bursting my eardrums. In addition, the TouchBar sometimes gets really laggy
(probably because the laptop hits 90 Celsius and the TouchBar is near the
hottest part of the laptop), so it'll randomly not respond to inputs. And
it doesn't provide physical feedback either, so I can't tell if I hit it
anyway. I've pretty much given up on using laptop shortcuts to raise/lower
brightness, volume, and skip/play/pause/songs because of the lack of
reliability.</p>
  </li>
  <li>
    <p>The left/right arrow keys are full sized, unlike their size/spacing on all
previous MacBooks I've used. This sounds like a small issue, but it adds
to the difficulty of orienting yourself on the keyboard, since you can't
feel out the arrow keys easily. I'm not even sure why it's such a problem,
since the up/down keys are still half-keys... but for some reason, it is.</p>
  </li>
  <li>
    <p>Keys break far, far, far, far, far too easily. Keys stick, double press,
fail to have any effect, or just stop clicking. I know a lot of developers
who use MacBooks at work, and none of the pre-2016s have had this issue
(aside from one guy who bashed enter so hard he literally broke the key off
his laptop)... but at least half of my 2017-using friends have had this
issue, and their laptops are mostly &lt;1 year old. I'm horrified to think
about how this keyboard will hold up in the long term if folks are
getting it replaced in mere months of use, which, in typical current-day
Apple fashion, is a $700+ repair that takes close to a week minimum.</p>
  </li>
  <li>
    <p>Freezes, stutters, issues with external monitors, lack of a decent
Apple-sourced USB-C/TB3 dock, USB-C only... the list goes on. But at
some point you're nitpicking :)</p>
  </li>
</ul>

<p>TL;DR: I've loved every MacBook I've ever owned, but the 2017 MBP is a complete trainwreck. I don't know what's happening at Apple... but if things don't change fast, I'll be moving toward full Linux for personal use. For work use, OS X is still my best bet, but every day I get closer to giving up on Apple.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I have now spent about five months with a work-supplied Macbook Pro 2017, complete with discrete GPU and the infamous TouchBar. So far, my experience has been... well, I'll get to that eventually.]]></summary></entry><entry><title type="html">Peter Kovak&apos;s Flash Boys: Not So Fast</title><link href="https://www.lambdalatitudinarians.org/techblog/2018/01/24/flashBoysNotSoFast/" rel="alternate" type="text/html" title="Peter Kovak&apos;s Flash Boys: Not So Fast" /><published>2018-01-24T16:42:53+00:00</published><updated>2018-01-24T16:42:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2018/01/24/flashBoysNotSoFast</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2018/01/24/flashBoysNotSoFast/"><![CDATA[<p>Last week, I read Michael Lewis' <em>Flash Boys</em>. I was unimpressed. I had quite a few complaints, all of which you can read about in my post from last week. If you're looking for a summary, however, it boils down to this: <em>Flash Boys</em> was bad enough that I decided to read a book that is literally just a rebuttal to <em>Flash Boys</em> from the perspective of a former high frequency trader -- one of the many that Michael Lewis didn't bother to interview for his book.</p>

<!-- readmore -->

<p>Before reading <em>Flash Boys</em>, I had a lot of unanswered questions about high-frequency trading (henceforth referred to as HFT in this post). These questions included: "how do they make their money?", "why is their business legal?".</p>

<p>After reading <em>Flash Boys</em>, I had a lot of unanswered questions about high-frequency trading (henceforth referred to as HFT in this post). These questions included: "how do they make their money?", "why is their business legal?", and "why does Michael Lewis feel such a strong need to attack them?".</p>

<p>After reading <em>Flash Boys: Not So Fast</em>, I had a lot of unanswered questions about high-frequency trading (henceforth referred to as HFT in this post). These questions included: "how do they make their money?", "why is their business legal?", "why does Michael Lewis feel such a strong need to attack them?", and "why does Peter Kovak refuse to talk about how the 'bad' HFTs make their money? (as opposed to the 'good' HFTs who seem to make money through efficient market making at large scales)".</p>

<p>I have a lot of questions. Fortunately, after some independent research and a lot of staring at my ceiling trying to fall asleep, I came up with a few answers.</p>

<h2 id="how-do-hfts-make-their-money">How do HFTs make their money?</h2>

<p>Probably a combination of mostly ethically sound ultra-efficient
computationally driven market making (~60% of HFTs) and 40% of
god-knows-what ethically-filthy front-running,
dark-pool-information-harvesting somethingorother.</p>

<h2 id="why-is-hft-legal">Why is HFT legal?</h2>

<p>Because market making is actually important for liquidity and stable
markets, so somebody has to do it. It seems like HFTs largely just
displaced overpaid Wall Street fat cats with computers, algorithms, and
programmers who could do the same job at larger scales and lower price
points. But some HFTs seem to be caught up in shady Wall Street
exploitation of clients and data, and it seems like front-running (which
Kovak explains is "impossible" rather unconvincingly) actually does happen
at some scale, whether between markets or in dark pools or whatever. Like
most businesses, HFT is a mix of useful and bad practices with a lot of
grey area. To make matters worse, financial markets are a pretty complex
thing (both because finance is complex and because people try to make it
more complex to bamboozle customers (<em>cough cough</em> CDS)). Basically it's a
tough nut to crack, legally speaking.</p>

<h2 id="why-does-michael-lewis-feel-such-a-strong-need-to-attack-hfts">Why does Michael Lewis feel such a strong need to attack HFTs?</h2>

<p>This is probably the thing I'm most curious about when it comes to <em>Flash Boys</em>. As one of my favorite finance/tech writers (and, technically, my coworker) Matt Levine says:</p>

<blockquote>
  <p>In my alternative Michael Lewis story, the smart young whippersnappers
build high-frequency trading firms that undercut big banks'
gut-instinct-driven market making with tighter spreads and
cheaper trading costs.</p>
</blockquote>

<p>That is, Michael Lewis has made his career -- <em>Moneyball</em>, <em>The Big Short</em>, <em>Liar's Poker</em>, etc. -- by, for the most part, writing focus pieces on individuals who rise above the alpha jock status quo of an industry using brains, math, and statistics. His protagonists tend to use these advantages to disrupt industries much like HFTs disrupted stock exchanges and market makers in the naughties. So why doesn't Michael Lewis write a story glorifying HFTs? As far as I can tell, nobody knows. Maybe Lewis got tired of writing underdog stories. Or maybe he really hates computers. Maybe one of those "bad" HFTs was caught messing with some of his investments. My head-canon on the subject is that Lewis tried to write the story behind HFTs, but they were all so busy writing code and disrupting markets that none of them would talk to him. Then Lewis got upset, grumbled "nobody ignores Michael Lewis!" and wrote Flash Boys over a weekend while angrily guzzling scotch. At least, that would make most of the issues in <em>Flash Boys</em> make a lot more sense.</p>

<p>So what did I learn from this experience? Basically, I put too much trust in authors. I'm used to college textbooks, written by masters of a field, where I can take most statements at face value. But in the larger world of nonfiction writing, that's not a wise idea -- plenty of authors, including Lewis and Kovak, pad their pages with spurious or even outright ridiculous claims. These statements can seem reasonable enough in the spur of the moment, but in retrospect are obviously quite silly. I'll use a personal favorite from <em>Flash Boys</em> (that, to my great pleasure, Kovak also caught and makes fun of in <em>Flash Boys: Not So Fast</em>):</p>

<blockquote>
  <p>Over several hours he watched the price of the fund on his Bloomberg
terminal. It was midnight in China, nothing was happening, and the ETF’s
price didn’t budge. He then clicked the Buy button on his online brokerage
account screen, and the price on the Bloomberg screen jumped. Most people
who used online brokerage accounts didn’t have Bloomberg terminals that
enabled them to monitor the market in something close to real time. Most
investors never would know what happened in the market after they pressed
the Buy button. “I hadn’t even hit Execute,” says the hedge fund president.
“I hadn’t done anything but put in a ticker symbol and a quantity to buy.
And the market popped.</p>
</blockquote>

<p>This is literally one of the craziest claims I've ever read in a book that claims to be nonfiction. This is the only quote I need to be convinced that Lewis has no clue how computers work. He claims here that HFTs are somehow able to predict large orders <em>before they ever leave their owner's computer</em>. Is Lewis claiming that HFTs are clairvoyants? Perhaps, more realistically, they've installed keyloggers on the computers of this hedge fund? Or maybe Bloomberg is monitoring what this hedge fund president types in -- before he hits <em>Execute</em> and decided to front-run their client (as someone who works for Bloomberg, I can verify that we probably don't do this). There is no logical explanation for this example -- it simply makes no sense. And if Lewis misunderstands his subject matter this dramatically, I don't want to know what else he got wrong in his book.</p>

<p>Anyway, if you read (and enjoyed) <em>Flash Boys</em> any time in the past few years, I suggest you go back and read it with a grain of salt. This isn't the only crazy claim in the book -- it's just my favorite. Try to find your own outrageous errors -- it's like a fun game! As for me, while Lewis didn't teach me anything useful about the stock market or computerized trading in <em>Flash Boys</em>, he at least taught me one valuable lesson: don't believe authors just because they seem confident and knowledgable. Even the smartest people tend to bend the truth once or twice in tens of thousands of words.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Last week, I read Michael Lewis' Flash Boys. I was unimpressed. I had quite a few complaints, all of which you can read about in my post from last week. If you're looking for a summary, however, it boils down to this: Flash Boys was bad enough that I decided to read a book that is literally just a rebuttal to Flash Boys from the perspective of a former high frequency trader -- one of the many that Michael Lewis didn't bother to interview for his book.]]></summary></entry><entry><title type="html">Michael Lewis&apos; Flash Boys</title><link href="https://www.lambdalatitudinarians.org/techblog/2018/01/18/flashBoys/" rel="alternate" type="text/html" title="Michael Lewis&apos; Flash Boys" /><published>2018-01-18T16:26:53+00:00</published><updated>2018-01-18T16:26:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2018/01/18/flashBoys</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2018/01/18/flashBoys/"><![CDATA[<p>Just last week, I finished reading <em>Flash Boys</em>, written by Michael Lewis. This book can be summarized pretty easily by a single statement: "High Frequency Trading".</p>

<!-- readmore -->

<p>For those of you who have been averting your eyes from finance and Wall Street since 2008's mortgage derivative crisis, high frequency trading basically boils down to a bunch of guys with really fast computers, really fast internet connections, and a bunch of money who basically sniff stock exchanges for arbitrage opportunities. If that doesn't make sense: high frequency traders buy and sell shares really fast to make profits when they're sure the market is moving in a particular direction. If they know that shares of a company are going to rise in the next few seconds because breaking news just revealed a huge previously-unknown product brewing inside the company, they can buy the stock and then sell it to somebody at a higher price extremely quickly, making a neat profit in fractions of a second and taking on next to no risk. As Lewis writes in <em>Flash Boys</em>, they can also watch for big stock orders -- buys or sells -- arriving at an exchange. When one of these big stock orders comes in, the exchange doesn't have nearly enough buyers or sellers to complete the transaction, so <em>that</em> exchange will send messages to <em>other</em> exchanges, who of course have more buyers and sellers, thus allowing the exchanges to pool their resources to keep the transaction from stalling. Unfortunately, exchanges don't really care how fast their messages get to each other, giving high frequency traders a chance to, as Lewis calls it, "frontrun" a large order from one exchange to another exchange, where they'll quickly snap up all of that stock's buy/sell orders and then post their own, making a neat profit (again with no risk). This is all very interesting, and I initially thought that <em>Flash Boys</em> was going to go into a lot more detail on this subject, much like Lewis' <em>The Big Short</em> takes a deep dive into the complex market of CDOs, CDSs, and other esoteric derivatives.</p>

<p>Unfortunately, I was wrong.</p>

<p>All in all, I had a lot of issues with <em>Flash Boys</em>. But instead of nitpicking every little thing that bothered me, I'll just mention my top three problems:</p>

<p>1) <strong>Lack of focus.</strong> This is the largest issue I took with Lewis' writing: unlike <em>The Big Short</em>, where every single isolated story converges nicely on the 2008 financial crisis (typically on the small number of people who saw it coming), <em>Flash Boys</em> spends a lot of time diving into irrelevant details of completely unrelated things. One of the most egregious examples is Lewis' intro to the book, which discusses the top-secret construction of a fiber-optic cable between NY and Chicago for the sole purpose of sending messages quickly (a la high frequency trading) between the two locations. This gives some impression of the stakes involved in high frequency trading, where mere milliseconds or even microseconds can make the difference between making a surefire profit or losing money on transaction fees. Unfortunately, Lewis' use of the story fell flat for me: it's obvious that high frequency traders (or even big banks delving into high frequency trading) would pay a premium for such a connection. What wasn't obvious -- and what I was <em>hoping</em> Lewis would demonstrate in <em>Flash Boys</em> -- was the way that they did it.</p>

<p>2) <strong>Depth/Agent Motivation.</strong> Lewis mentions many times how several high frequency trading startups made a profit every single day, without fail, but upon finishing the book I couldn't tell you how. Lewis discusses at length how high frequency traders "rigged" the market when more exchanges cropped up, many with special kinds of offers useful only to high frequency traders. He talks about how they convinced big banks to share their client's buy and sell information, and how big banks eventually allowed high frequency traders to frontrun their own "dark pools"... but I never understood the motivation the big banks had to do these kinds of things. About half of the novel focuses on IEX ("investors exchange", of <a href="http://www.investorsexchange.com">www.investorsexchange.com</a> notoriety) and the plan to "fix the market", but at the end of the novel I couldn't say if IEX accomplished any of their goal. The last couple of chapters oscillates oddly between labelling Goldman Sachs as one of the best behaved banks who largely refused to sell out their client transaction data to high frequency traders... and a horrible, evil corporation who sued a Russian programmer for taking some mostly-open source code with him when he switched jobs. Is this Lewis' attempt to demonstrate the fact that the big banks are so large they don't even behave consistently? That their business is so incomprehensibly large -- easily in the many many billions of dollars -- that neither they nor their regulators understand their role or how they ought to behave? Maybe Lewis knows; I sure don't after reading <em>Flash Boys</em>.</p>

<p>3) <strong>Derision of technology (maybe).</strong> Throughout <em>Flash Boys</em> I detected a lot of negative feelings toward technologists in general. Perhaps this is due to Lewis' origins in finance, a domain that at this point has been dominated by technology moreso than any other sector I can think of. But that doesn't make it excusable. This manifests in many ways -- the aforementioned Russian programmer who Lewis seems to regard as something of a simpleton, his remarks that the tech side of finance doesn't understand what they're doing (both in the big banks and in high frequency trading, which seems odd, because how could high frequency traders possibly figure out how to make money from high frequency trading if they don't understand what they're doing?), and even his subtler derision, like when he describes a group of techies who fail to make a dent in a massive buffet-style meal.</p>

<p>What bothered me the most, however, was the lack of any kind of chapters focusing on high frequency traders themselves. Especially in a book titled <em>Flash Boys</em> (which I have to interpret as either a book about the folks who perform high frequency trades or some kind of weird focus piece on enthusiasts of the comic book hero Flash Gordon) this feels strange. Why don't we hear their perspective? Are they truly a cancer on the market, as Lewis seems to imply? Or did they improve the market in any measurable way? Surely they must have contributed to the market in some positive way, but Lewis never points out a single positive thing about high frequency traders. Even the heroes of the NY-&gt;Chicago fiber-optic cable story didn't seem to be high frequency trading experts: they even admit that they don't understand the real uses of their creation.</p>

<p>At the end of a book that I'd hoped would inform me about high frequency trading, I'm forced to admit that I know nothing more about high frequency trading than I did last year. Or the year before. Or the year before that. Or essentially since I'd first heard the term "high frequency trading" and inferred some details about what the term meant. My next read for the year is <em>Flash Boys: Not So Fast: An Insider's Perspective on High-Frequency Trading</em> by Peter Kovac. I hope it'll teach me more than Lewis' useless piece of pulp.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Just last week, I finished reading Flash Boys, written by Michael Lewis. This book can be summarized pretty easily by a single statement: "High Frequency Trading".]]></summary></entry><entry><title type="html">Looking Forward to 2018</title><link href="https://www.lambdalatitudinarians.org/techblog/2018/01/03/welcomeToTwentyEighteen/" rel="alternate" type="text/html" title="Looking Forward to 2018" /><published>2018-01-03T23:14:22+00:00</published><updated>2018-01-03T23:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2018/01/03/welcomeToTwentyEighteen</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2018/01/03/welcomeToTwentyEighteen/"><![CDATA[<p>It is now 2018, and I've been thinking about what I intend to accomplish this year. I've never been one to embrace New Years resolutions or anything like that, but I do appreciate the value of outlining some goals for the year, however inconsequential.</p>

<!-- readmore -->

<p>Here goes:</p>

<p>1) <strong>Own something.</strong> I don't care if it's a (probably computer) language, a hobby, a product at work, or some nontrivial responsibility-- I just want to own something. During my time at the University of Rochester, I learned a lot of lessons and made a lot of good friends through TAing and workshop leading. The sense of responsibility made a great deal of difference: I saw homework, assignments, and grading from the other side of the table, and that really helped me understand how college worked and how to extract the most value from my education. Sure, I screwed up sometimes-- as a head workshop leader, I probably missed hiring a few good candidates and hired a few bad candidates. I wasn't perfect, but I constantly tried to improve, and in retrospect I think I really <em>did</em> improve, and I learned a lot about teaching, delegating, and learning along the way. As much as I enjoy my job (I can't believe how lucky I am to work here), I want that sense of responsibility back. I don't know if that means becoming a team lead, working hard to get involved in the recruiting and interviewing process, mentoring, or just trying to become the best technical worker I can be, but I know that it's something I want -- no, <em>need</em>. If I don't accomplish anything else in 2018, I hope I manage to embrace ownership somewhere, somehow.</p>

<p>2) <strong>Cooking.</strong> On a very different note, I've been very, very, very, very lazy about cooking since I moved out of my college housing. Part of this laziness stemmed from funds: I wanted to pay off my student loans as quickly as possible coming out of college, so I hunkered down for a few months at the beginning of my career to accomplish that. I put about 90% of my earnings after housing and 401k contributions into loans and managed to pay them off after only accruing .02% interest, so I don't regret doing that. But now I need to start embracing cooking again- stir fry, chili, salads, burritos, sushi, among others were all staples of my diet before I graduated college, and I miss them. It's tougher now because finding fresh food in NYC can be a struggle sometimes, and I don't have anybody to actually cook with every night, but hopefully my next apartment (where I'll be moving in June) will have a bit larger of a kitchen and I can motivate myself to actually experiment with new meals on the regular.</p>

<p>3) <strong>Reading.</strong> I read a lot already- I'd estimate at least 2 hours a day on average, possibly more if you count the reading I do on the subway every day (note that this is exclusively books; if I was counting reading documentation, code, emails and webpages, it would probably be closer to 16 hours a day). I want to read even more this year, specifically educational/nonfiction books. Now that I'm out of college, it's going to be easier to stop learning and fall out of practice, and I don't want that to happen. My tentative goal is at least 10 textbooks this year -- I should be able to do that at minimum -- with at least 20 other works of nonfiction, to boot. That means I should be reading a new educational (more or less) read every other week, and I'm already making good progress on my first read, <em>CODE</em> by Charles Petzold.</p>

<p>4) <strong>Spending.</strong> Throughout college and my first 6 months of adult life, necessity has dictated that I be, to put it bluntly, cheap. My parents were decidedly middle-class, and eve though I had generous scholarships going to college, money was still tight. I had to take out loans, and that made me very price-sensitive. Through it all, I learned one thing: Being cheap sucks. I don't want to miss out on good food, a nice mattress, a nice pillow, or a book I'm really interested in just because of money anymore. Luckily I work in software development, and now that I'm free of student loans, I just might be able to afford the kind of nice things I've always wanted. I won't throw out the baby with the bathwater: I'm glad I've learned how to save money and live within my means. I'll always put away plenty of money and maintain a safe retirement account as well as an emergency savings account. But I'm young, I'm gainfully employed, and I ought to make some memories while I have the chance. So I resolve to spend excess money in a reasonable way to foster friendships and memories-- maybe not the kind of investment that can buy you food, but an investment nonetheless.</p>

<p>5) <strong>Decoration.</strong> In a similar vein, I currently live like some kind of monk. I have a bed and a rug and a laptop and a few other essential things from college, but I don't really have much to decorate my next place and give it character. By the end of this year, I would like to fill up one bookcase with at least 50 books I love and at least 20 records I love. For that matter, I need to buy a hi-fi system and a decent vinyl deck. And possibly a nice espresso machine, so I can have the full bookstore experience in my own home. Because frankly I can't think of a nicer way to spend weekends than reading a good book on a cushy armchair with some of my favorite music.</p>

<p>6) <strong>Friends.</strong> I'm living in NYC, one of the coolest places in the entire world. I have some work friends who I really enjoy spending time with, but I need to grow my social circle: I need to do more things out of work and have more experiences in my free time. I need to meet new people, and I need to reconnect with some college friends who are currently living in the city. By the end of this year, I hope to establish the beginnings of an adult group of friends to rival my college friend group, a truly fantastic group of individuals. And I ought to visit each of my college friends-- I'd hate to lose touch.</p>

<p>There you have it: some goals for 2018. Are some of these silly and useless? Of course! But so am I. And hopefully at least one or two of these goals will help me grow personally and/or professionally by the end of the year.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[It is now 2018, and I've been thinking about what I intend to accomplish this year. I've never been one to embrace New Years resolutions or anything like that, but I do appreciate the value of outlining some goals for the year, however inconsequential.]]></summary></entry><entry><title type="html">Reflecting on Six Months at Bloomberg</title><link href="https://www.lambdalatitudinarians.org/techblog/2017/12/18/reflectingOnSixMonths/" rel="alternate" type="text/html" title="Reflecting on Six Months at Bloomberg" /><published>2017-12-18T18:14:22+00:00</published><updated>2017-12-18T18:14:22+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2017/12/18/reflectingOnSixMonths</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2017/12/18/reflectingOnSixMonths/"><![CDATA[<p>I'm an adult now -- at least, that's what they tell me. I've been working as a ssoftware developer here at Bloomberg for almost 6 months now - I started June 19th, so it's actually 5 months 29 days today. Since it's the end of the day and programmers start counting at zero, let's just call it 6 months and be done with it.</p>

<!-- readmore -->

<p>Or 26 weeks, or 182 days, or 130 weekdays minus Thanksgiving/Labour Day/July 4th. But the important part of the measure is that to somebody who was born in 1995, who graduated college in May 2017, and who started his first full-time job in June 2017, that feels like an awfully long time.</p>

<p>I've now reached the average length of all of my previous jobs, which includes:</p>

<ul>
  <li>two three month internships, one of which was extended part-time to 5 months</li>
  <li>two summers of barista work, which counts as something like 8 months total or maybe two sections of 4 months</li>
  <li>18 months as a dishwasher (it was great for building character)</li>
  <li>18 months as a McDonald's Crew Trainer (it was great for building character)</li>
  <li>4 months as a sales associate at my hometown mall's Hot Topic (yeah, I don't think there's any excuse for this one)</li>
  <li>7 semester-long TA/workshop leader positions at the University of Rochester. We'll say each of these is about 4 months in length.</li>
</ul>

<p>Adding all of those together gives you:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>(5 + 4 + 4 + 18 + 18 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4) / 13
= ~6.23
</code></pre></div></div>

<p>So I'm not quite there yet, and maybe my counting of my barista/TA jobs is debateable... but it's 6 months, dammit, and I needed a reason for a blog post. Don't make me justify it any more.</p>

<p>But enough elementary math and reminiscing about old jobs.</p>

<p>Instead, lets take a look at my accomplishments over the past 6 months.</p>

<ul>
  <li>
    <p>Completed 3 months of training on C/C++/JS/git/SQL/software development</p>
  </li>
  <li>
    <p>Participated in Bloomberg's internal 'job fair', and was eventually matched with a team that initially seemed interesting and promising</p>
  </li>
  <li>
    <p>Realized that my assigned team's daily work and planned development (front end, javascript) was utterly incompatible with my back-end, algorithmic interests</p>
  </li>
  <li>
    <p>Found the courage to ask for help from a downright fantastic trainer (and training support staff)</p>
  </li>
  <li>
    <p>Was overwhelmed to discover the lengths to which my tainers were willing to go in order to help me find a team that <em>did</em> align with my interests</p>
  </li>
  <li>
    <p>Completed my first ever real-world, collaborative, full-stack project (allegedly to be used with 'production data', whatever that means) as part of my training's capstone project. Learned some important lessons about the difference between 'what the client wants' and 'what the client needs'. On an <em>unrelated</em> note: don't ever ever ever ever use an ever growing json blob in a database instead of inserting new rows, no matter <em>what</em> anybody says)</p>
  </li>
  <li>
    <p>Started my full-time job on my new team, which builds internal tools to support developers.</p>
  </li>
  <li>
    <p>Familiarized myself with a rather large Java codebase to a point of both developer-level (micro) and design-level (macro) productivity.</p>
  </li>
  <li>
    <p>Began mentoring my team's high school intern on his internship project</p>
  </li>
  <li>
    <p>Paid off the last of my student loans-- not the largest accomplishment, but definitely the result of months of hard work and financial restraint</p>
  </li>
</ul>

<p>In retrospect, each of these bullet points could have easily made a blog post of its own - I could talk for hours about the struggles of learning C++, memory management, properly learning pointer handling, smart pointers, and so much more. I could rant about the stresses of the timed assessments, the volumes of information learned in a couple of days of collaborative work, and how, as stressful as training was, I find myself missing it and the constant sharpening of my programming and engineering talents. I can see a post about the pain and fear of uprooting myself from my humble rural upstate roots to the booming city of NYC -- or about my transition between the two, in the form of my intellectual Scooby Gang of friends at Rochester, my Computer Science comrades who were always willing to lend a helping hand to a friend in need of some project assistance, and my fellow TAs, who helped me see (and improve on) my personal flaws when it comes to teaching and grading. It isn't hard to picture a post discussing the hardships of moving far away from most of my friends to a location where my emotional support structure consisted originally of snacks smuggled from work, a dwindling supply of rice and stir fry ingredients, and my collection of ebooks. I could also talk for hours about the joys of discovering and befriending a delightful new Scooby Gang of friends from my work training class, or my experience tutoring and teaching a high school intern who I'm admittedly a little jealous of for getting the chance to work at an incredible tech company before he even goes to college.</p>

<p>If I were to talk about <em>all</em> of those things, I could easily write a novel. Or at least an unbearably long blog post. And since I don't think any of my readers (all 0 of you) would want to read that, I'll try to record my top takeaways from my greatest adventure so far.</p>

<p>1) It's never too late. Three days into my first assigned team at work, I felt crushed. My training friends all went off to specialized training before they joined their number-one choice teams, while I was asked to sit at my desk with nothing to do at my number-four team (that ought to have been ranked much lower, if I hadn't decided to tie 5 teams at number four because I was indecisive at the last minute). The situation seemed hopeless, and which each passing hour of work my resentment grew. By the end of the third day, my discontent reached critical mass: I knew in my heart that this team would never be the right fit for me. Contacting my trainer was one of the toughest decisions I've made in my career-- I questioned myself over and over, thinking "what if my trainer says no?", "what if they just fire me?", "what if he says no and tells my new boss?", "what if he says no and tells my new boss and then my new boss fires me?". I felt responsible for my poor team choice, and was wracked with guilt over the fact that I'd not only robbed myself of an opportunity to work on a perfect team, but also robbed an innocent team of the chance to induct an impressionable new hire.
In the end, it turned out just fine. One awkward day of waiting in suspense, and I was given the chance to go back to specialty training and join a new team. I talked to my new boss in my own private team-matching process, and I discovered that I'd made entirely the wrong ordering of teams the first time around: this team was clearly the frontrunner I should have picked the first time around. I took a leap of faith, and it all wokred out. I learned that everyone makes mistakes, but the best among us (like my trainer, who presumably rescues orphans from burning buildings and saves old ladies' cats from trees in his spare time) try to help people move past their mistakes instead of forcing them to live with them when alternatives are available. I'll admit: they made an exception for me, and I got lucky. I happened to have a great trainer who pulled some strings for me after a screwup that was completely my fault. But I don't regret that fact, and I think I've grown all the more as a developer and a person as a result.</p>

<p>2) A natural extension of the last lesson occurred in my mentorship of my team's high school intern. After years of living, working, and studying at a very reputable college (not Ivy League, of course, but full of brilliant people nonetheless) and internships at tech companies, in addition to my almost exclusive interaction with my very intelligent Scooby Gang at the University of Rochester, it's easy to forget how little your average person knows during their senior year of high school. I initally expected far, far too much of our high school intern -- my fault, rather than his -- after all, most high schoolers are likely to understand <code class="language-plaintext highlighter-rouge">public static void main</code>, let alone relational databases. But that overestimation is OK: I learned how to better mentor another person, much of which involves adjusting when the teaching doesn't seem to be working too well, and my inbern (hopefully) (possibly) (maybe) learned a thing or two about SQL. Maybe. More importantly, he'll continue to learn more about software development and the tools we use every day, from VIM to SSH to Eclipse to hash tables. We all have to start somewhere, and he's lucky to have a damn good -- not to mention, early -- place to start. And I'm more than happy to help him wherever I can.</p>

<p>3) Learning is easy to miss out on. During college and training, learning was easy to do because I <em>had</em> to do it: not learning meant falling behind, sonmething my ego and drive would never let happen by choice. During college, I was lucky enough to have one of the finest mentors possible: my personal Kesuke Miyagi, who supplied me with comradery, computer science mentoring, math mentoring, career advice, mac and cheese, and, most importantly, his friendship. This mentor's dedication to excellent and love for learning has made me the man I am today: driven, uncompromising on quality, and dedicated to learning more every day. With him, learning wasn't just easier: it was fun! In training, I tried to adopt his role as a mentor with mixed results. In my first full-time software developer role, I try to always keep his lessons in mind, and to above all continue to learn. Books, articles, blogs, newsletters, meetups, trainings, even meetings -- all of these things have helped me continue to grow both hard and soft skills in my new role. TL;DR: Never stop bettering yourself.</p>

<p>4) Patience. In the last 6 months, I've learned a lot of things, technical and otherwise. Many of those things have felt hard, though some have felt easy. Many were useful; some were not. Some took weeks to learn; others, seconds. The one common thread shared by all, however, has been frustration. Seldom do I learn something worthwhile without a little bit of (99% mental) keyobard pounding. And while there are a few things that I still haven't quite gotten the hang of (I'd still rather write 1000 lines of raw SQL than use an ORM), the key seems to be sticking with it through thick and thin. A little frustration is healthy: it's just your mind working through tough problems. The key is to embrace it as the growth that it is- think of it like the pain you feel in your muscles during a hard workout. No pain, no gain.</p>

<p>So there you have it. My disjointed, barely-edited, repetitive, slapdash thoughts on my first 6 months of my career that are probably no different from the thoughts of a million other 22-year old software developers. But there's one place where they differ: these are <strong>mine</strong>.</p>

<p>And even though nobody is ever going to read these thoughts, I have to admit that putting it all down in text feels better than any of my senior year English theses.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[I'm an adult now -- at least, that's what they tell me. I've been working as a ssoftware developer here at Bloomberg for almost 6 months now - I started June 19th, so it's actually 5 months 29 days today. Since it's the end of the day and programmers start counting at zero, let's just call it 6 months and be done with it.]]></summary></entry><entry><title type="html">Why &quot;Lambda Latitudinarians?&quot;</title><link href="https://www.lambdalatitudinarians.org/techblog/2017/02/25/whyLambdaLovers/" rel="alternate" type="text/html" title="Why &quot;Lambda Latitudinarians?&quot;" /><published>2017-02-25T00:26:53+00:00</published><updated>2017-02-25T00:26:53+00:00</updated><id>https://www.lambdalatitudinarians.org/techblog/2017/02/25/whyLambdaLovers</id><content type="html" xml:base="https://www.lambdalatitudinarians.org/techblog/2017/02/25/whyLambdaLovers/"><![CDATA[<p>Since I created this site, I've received many questions about the name. As a result, I've created this blog post to try to address the issue. In short, the name of this site stems from Alonzo Church's Lambda Calculus. Lambda Calculus was a highly influential mode of computation invented in the 1930s that eventually influenced a great deal of programming. This is most obvious in the form of the Lisp family of languages, where lambda functions have been present from day one, and where the very structure of code is based off of lambda calculus. However, the Lambda Calculus has now managed to seep into other programming styles-- most famously, C++ and Java have variants of lambda functions.</p>

<!-- readmore -->

<p>Now that you're familiar with the tip of the lambda iceberg, you're probably wondering: just what the hell is lambda calculus anyway? The wikipedia page is not particularly good at teaching the basics, so you probably expect me to demonstrate something. As it turns out, you're in luck. Behold: a lambda calculus example:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λparameter.(function parameter parameter) input
</code></pre></div></div>

<p>Which is equivalent to this function in C:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>int lambda(int parameter){
	function(parameter, parameter);
}

int main(){
    lambda(input);
}
</code></pre></div></div>

<p>That's pretty basic, but it shows you the way that lambda functions work: the lambda function pulls in an input item and replaces "parameter" in its body with the value of input. Now I can show you something a lot cooler:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>λg.(λx.g (x x)) (λx.g (x x))
</code></pre></div></div>

<p>Above is a *magical* function the lambda calculus calls a fixed-point combinator. Basically, it's a recursive function that repeatedly applies itself. Of course this is probably all pretty nonsensical because you've probably never seen or heard, much less played with, the lambda calculus before you saw this blog post. So now I'll get back to my story about why this page is called λ Latitudinarians.</p>

<p>Long story short: in my junior year of college, I was a teaching assistant for a theory-based class. That class had a unit on lambda calculus (coupled with scheme programming), and I drew the short straw and ended up writing and grading the homework assignments for that unit. I ended up spending a lot of time with lambda calculus, and honestly it's kind of a fun letter.</p>

<p><a href="https://en.wikipedia.org/wiki/Latitudinarian">Latitudinarian</a> serves two purposes. First: it vaguely means "open-minded." Something I like to be whenever possible so I don't get too grumpy and cantankerous. In 17th and 18th century England, a group called the latitudinarians supported <em>variation in local practices</em>; translation: don't be too much of a stickler for doing things a certain way just because that's what you're used to. Second: it's a really long word. It's not necessarily easy to spell. So every time I use the domain for email, or to let someone know the URL of my blog, I chuckle to myself because it's just ridiculous. It's a good reminder to never take myself too seriously.</p>]]></content><author><name>Nathan Contino (ncontino[at]lambdalatitudinarians[dot]org)</name></author><category term="techblog" /><summary type="html"><![CDATA[Since I created this site, I've received many questions about the name. As a result, I've created this blog post to try to address the issue. In short, the name of this site stems from Alonzo Church's Lambda Calculus. Lambda Calculus was a highly influential mode of computation invented in the 1930s that eventually influenced a great deal of programming. This is most obvious in the form of the Lisp family of languages, where lambda functions have been present from day one, and where the very structure of code is based off of lambda calculus. However, the Lambda Calculus has now managed to seep into other programming styles-- most famously, C++ and Java have variants of lambda functions.]]></summary></entry></feed>