<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Nathan Grigg</title>
    <link>https://nathangrigg.com/</link>
    <image><url>https://nathangrigg.com/favicon.png</url><title>Nathan Grigg</title><link>https://nathangrigg.com/</link></image>
    <description>Recent content for Nathan Grigg</description>
    <language>en-us</language>
    <lastBuildDate>Mon, 13 Apr 2026 20:07:39 -0700</lastBuildDate>
    <atom:link href="https://nathangrigg.com/feed.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Building a Computer</title>
      <link>https://nathangrigg.com/2026/04/building-a-computer/</link>
      <pubDate>Mon, 13 Apr 2026 20:07:39 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/04/building-a-computer/</guid>
      <description>&lt;h2 id=&#34;catalyst&#34;&gt;Catalyst&lt;/h2&gt;
&lt;p&gt;I like having network-based storage, so I can have a place to store backups,
large files that I’m not using, copies of media that I’ve purchased,
audiobooks, etc.&lt;/p&gt;
&lt;p&gt;For the last 10 years, I’ve accomplished this with a four-bay Synology, which I
eventually replaced with a second four-bay Synology, keeping the old one as a
backup.&lt;/p&gt;
&lt;p&gt;You can run various programs on the Synology because it is basically a
low-powered server. The UI was helpful for me as a beginner.&lt;/p&gt;
&lt;p&gt;In the long run, however, I wanted more customization than I could get from
Synology, which eventually led me to &lt;a href=&#34;https://nathangrigg.com/2023/12/new-computer/&#34;&gt;buy a mini
PC&lt;/a&gt; to run everything except the
basic file server and backup functions.&lt;/p&gt;
&lt;p&gt;Finally, I decided that I wanted even more customizability, I wanted a way to
put all of my drives in one machine, and I was itching for a fun side project. I
briefly looked into other network storage options and decided that, since I had
never built a computer from scratch before, it would be fun to try a custom
build.&lt;/p&gt;
&lt;h2 id=&#34;parts&#34;&gt;Parts&lt;/h2&gt;
&lt;p&gt;I don’t remember exactly how it all came together. There are a lot of options,
a lot of decision to be made, and I didn’t really know what I was doing.&lt;/p&gt;
&lt;p&gt;I wanted room for a lot of disks and the ability to hot-swap, which led me
to the &lt;a href=&#34;https://www.jonsbo.com/en/products/N5Black.html&#34;&gt;Jonsbo N5 case&lt;/a&gt;,
which holds 12 disks. It was great for a first build because it is quite
spacious.&lt;/p&gt;
&lt;p&gt;I wanted a way to access it without a keyboard or monitor, so my main
requirement for the motherboard was something server-grade with
&lt;a href=&#34;https://en.wikipedia.org/wiki/Intelligent_Platform_Management_Interface&#34;&gt;IPMI&lt;/a&gt;.
The motherboard I bought has a separate ethernet port that presents a web
interface to configure the firmware settings as well as to connect remotely to
a virtual monitor.&lt;/p&gt;
&lt;p&gt;I wanted a CPU with integrated graphics, and I went with a mid-line Intel chip
(“Core Ultra 5”).&lt;/p&gt;
&lt;p&gt;I also needed a &lt;a href=&#34;https://en.wikipedia.org/wiki/Host_adapter&#34;&gt;host bus adapter&lt;/a&gt;
to be able to connect so many hard drives to the motherboard. This goes in a
PCIe slot.&lt;/p&gt;
&lt;p&gt;Finally, I wanted ECC RAM (very expensive thanks to AI), and some SSDs to run
the operating system. Plus a power supply, a bunch of cables, and some fans.&lt;/p&gt;
&lt;h2 id=&#34;build&#34;&gt;Build&lt;/h2&gt;
&lt;p&gt;The build was like an expensive Lego project except I might have bought the
wrong pieces. It really was fun to see all of the different pieces come
together.&lt;/p&gt;
&lt;p&gt;I had a hard time getting the CPU cooler attached and I was worried I had done
it wrong.&lt;/p&gt;
&lt;p&gt;I had some annoying fan issues because I had some giant 14-inch fans for the
front of the case that max out at 800 RPM. If they went below 300 RPM, the
motherboard would think they had failed and start pulsing all of the fans, or
else blowing them all full blast. I eventually solved this by connecting them
to a fan hub so that the motherboard wouldn’t know how fast they were going.
I’m sure there are better ways.&lt;/p&gt;
&lt;p&gt;Those issues notwithstanding, I did manage to boot it up on the first try.
Unfortunately, I had a couple of suspicious crashes in the first few days,
mostly when I was transferring large files to the new computer. I realized that
before I started trying to install anything, I should have done some diagnostic
checks.&lt;/p&gt;
&lt;p&gt;When I ran &lt;a href=&#34;https://www.memtest86.com/&#34;&gt;MemTest86&lt;/a&gt; to check whether there were
RAM issues, it froze four seconds into the first test. It failed so hard that I
figured I must have done something wrong with seating the CPU, or that the
motherboard was faulty.&lt;/p&gt;
&lt;p&gt;I tried reseating the CPU to see if I’d screwed it up, but eventually resigned
myself to buying more RAM. This was a painful choice because RAM was 1/3 the
cost of the full build. But it was the right choice; the new RAM passed
MemTest86, and I got a refund for the first batch of RAM.&lt;/p&gt;
&lt;p&gt;So with that, I had a working computer. It was a really fun way to spend some
of my free time. I wouldn&amp;rsquo;t say it was easy or frustration-free, but I learned
a lot. It was also a good complement to my day job, where I wrangle computers
like they&amp;rsquo;re herds of cattle without ever seeing or touching a single one.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/04/building-a-computer/computer.jpeg&#34; class=&#34;center&#34;
    alt=&#34;The computer sits on a shelf in the garage, with a cable around it for earthquake safety.&#34; width=&#34;500&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;The computer sits on a shelf in the garage, with a cable around it for earthquake safety.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2026/03/ygvghg/</link>
      <pubDate>Mon, 02 Mar 2026 11:37:41 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/03/ygvghg/</guid>
      <description>&lt;p&gt;Writing go code is a thousand paper cuts but then you get that nice beautiful binary and you put it wherever you want and I&amp;rsquo;m still not sure it&amp;rsquo;s worth it.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2026/01/rrjynz/</link>
      <pubDate>Wed, 28 Jan 2026 15:40:46 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/01/rrjynz/</guid>
      <description>&lt;p&gt;Well done &lt;a href=&#34;https://brucespringsteen.net/news/2026/streets-of-minneapolis/&#34;&gt;Bruce Springsteen&lt;/a&gt;. I&amp;rsquo;m touched by the designation &amp;ldquo;Winter of &amp;lsquo;26.&amp;rdquo; Some events are too momentous for a descriptive label. Here&amp;rsquo;s hoping we remember it as a turning point, a wake-up call to the complacent.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title>Taking a Stand</title>
      <link>https://nathangrigg.com/2026/01/renee-and-alex/</link>
      <pubDate>Sun, 25 Jan 2026 17:04:30 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/01/renee-and-alex/</guid>
      <description>&lt;p&gt;US politics are more about identity and power than principles, even though we
like to pretend otherwise. In my high school in conservative, rural Idaho, we
would debate the virtues of small, limited government, second amendment
freedoms, family values candidates, and I was duped into thinking the choice
was between Platform A or Platform B, when it was really a choice between
giving power to a “friend” or an “enemy.”&lt;/p&gt;
&lt;p&gt;It took me an embarrassingly long time to realize that my principles were more
aligned with the Democrats, even though I felt “more at home” among the
Republicans. But I have also changed, trading Idaho for Seattle, then Los
Angeles, to the point where today I feel more at home in a city coffee shop
than a county fair or a church service.&lt;/p&gt;
&lt;p&gt;While I have always voted against Trump, I have supported some candiates that I
now strongly regret. And I try my best to see the humanity in those who did
vote for him, because everyone has their own journey.&lt;/p&gt;
&lt;p&gt;But today, everyone must oppose the Trump administration, with its calculated,
provocative, performative violence, including but not limited to the killing of
Renee Good and Alex Pretti. We cannot accept the lies, obstruction, and
cover-ups that have followed. Anybody involved in or responsible for these
violent acts or their cover-ups should be impeached, removed from office,
and/or put in jail for their crimes. Every person in power who refuses to hold
these offenders to account should be voted out of office and remembered as the
cowards that they are.&lt;/p&gt;
&lt;p&gt;We cannot wait until the next election to take power away from these monsters.
Speak up today, set the record straight if you&amp;rsquo;ve had a change of heart. Call
your representatives and tell them to defend us and enforce our laws.&lt;/p&gt;
&lt;p&gt;ICE is not our friend; Trump and his enablers are our enemy.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title>A GMT Watch</title>
      <link>https://nathangrigg.com/2026/01/gmt-watch/</link>
      <pubDate>Fri, 16 Jan 2026 15:06:14 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/01/gmt-watch/</guid>
      <description>&lt;p&gt;I got a new watch.&lt;/p&gt;
&lt;p&gt;I’ve almost exclusively worn an Apple Watch for the past several years. I still
wear one when exercising and sleeping, and I plan to still wear it on some
other occasions, but I wanted to see what it was like to go back, shall we say,
to a simpler time.&lt;/p&gt;
&lt;p&gt;My initial feelings are a happy dose of nostalgia. Back before all of our
phones and watches and cars were synchronized to NIST time, I would carefully
synchronize my Timex digital watch to the school bell time. It was satisfying
to know exactly how much time was left in class (or passing period) while most
of my classmates just had to wait and wonder when freedom would come (or end).&lt;/p&gt;
&lt;p&gt;With a &amp;ldquo;dumb&amp;rdquo; watch, there is this same sense of satisfaction, that I know the
precise time not through the wonders of the internet, but because I made the
effort to accurately set my watch.&lt;/p&gt;
&lt;h1 id=&#34;a-gmt-complication&#34;&gt;A GMT Complication&lt;/h1&gt;
&lt;p&gt;My new watch is a GMT watch, which is a popular watch style over the last
century or so, because it makes it easy to know the time in a second or even
third location, and can make it easier to change the time as well.&lt;/p&gt;
&lt;p&gt;There are many different styles of GMT watch, but they are usually
distinguished by a separate “GMT hand” that makes one revolution per 24 hours,
compared to a traditional hour hand that revolves once per 12 hours. A GMT
watch typically has the traditional hour hand as well, which most people call
the “local hour hand,” because it tracks the time of your current location.
Both of these hands are typically aligned to the same minute hand.&lt;/p&gt;
&lt;p&gt;Being non-smart watches, they are relatively simple to configure. A &lt;em&gt;true GMT&lt;/em&gt;
or &lt;em&gt;flyer GMT&lt;/em&gt; lets you adjust the time (minutes and hours) on all three
hands simultaneously, and then jump the local hour hand forward or backwards an
hour at a time. On a &lt;em&gt;caller GMT&lt;/em&gt; or &lt;em&gt;office GMT&lt;/em&gt;, the jump function moves the
GMT hand forward or backwards an hour at a time. Either way, you can track both
the local time and a separate reference time, but the caller GMT is more
cumbersome to travel with, because if you change time zones, you have to reset
the watch the same way you would any watch, and then also fix the GMT hand to
point back to whatever reference time you want to track. A flyer GMT lets
you quickly adjust the local time without messing up the GMT hand at all.&lt;/p&gt;
&lt;p&gt;Many GMT watches also feature a rotating bezel labeled on a 24-hour scale. This
gives you a way to quickly change the meaning of the GMT hand by shifting the
labels instead of the hand. Hence you have the ability to track a potentially
third time zone. I say potentially because on most GMT watches with a bezel,
the bezel is the only set of 24-hour labels, so if you rotate it, you might not
know exactly where the GMT hand is pointing on the “natural” set of labels.&lt;/p&gt;
&lt;p&gt;Here are some examples of tracking two or three time zones on a GMT watch:&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock1.svg&#34; class=&#34;center&#34;
    alt=&#34;It is 10:11 a.m. in Central European Summer Time, and the GMT hand is showing 08:11 UTC.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;It is 10:11 a.m. in Central European Summer Time, and the GMT hand is showing 08:11 UTC.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock2.svg&#34; class=&#34;center&#34;
    alt=&#34;By rotating the dial four 15-degree clicks, we can read the New York Daylight Saving Time (UTC−4) as 04:11.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;By rotating the dial four 15-degree clicks, we can read the New York Daylight Saving Time (UTC−4) as 04:11.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In these examples, note that the twelve o&amp;rsquo;clock position represents midnight
UTC, and in the second example, the 20 (which is −4 modulo 24) lines up with
this slot so that we can read UTC−4. And even with the bezel rotated, you get
a sense of the UTC time because you will at least remember where 0, 6, 12, and
18 would be on the unrotated bezel.&lt;/p&gt;
&lt;h1 id=&#34;open-to-interpretation&#34;&gt;Open to interpretation&lt;/h1&gt;
&lt;p&gt;Although a GMT watch only has a few configurable parts (minutes, local hour,
GMT hour, and bezel rotation),  you get to choose what the configuration should
be. If you really wanted to, you could have the “local time” always be your
home time and the “GMT hand” be your current local time.&lt;/p&gt;
&lt;p&gt;I knew I wanted to use the local hour hand the normal way, with the local time
of wherever I happen to be (usually in Los Angeles). At first, I thought that I
would use the GMT hand for UTC, and then rotate the bezel to whatever second
time zone I was actually interested in. But I was quickly annoyed that the
direction of the GMT hand didn’t really have any meaning to me.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock3.svg&#34; class=&#34;center&#34;
    alt=&#34;At 9:29 p.m. Los Angeles winter time, it is 05:29 UTC&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;At 9:29 p.m. Los Angeles winter time, it is 05:29 UTC&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Next, I decided to use my home time (or at least UTC−8, more on that in a bit)
for the GMT hand. This way, no matter where I am in the world, the GMT hand in
the upper half means it is night in Los Angeles, and in the lower half means it
is daytime.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock4.svg&#34; class=&#34;center&#34;
    alt=&#34;Still 9:29 p.m. in Los Angeles, with the local 24-hour time of 21:29 shown on the GMT hand&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Still 9:29 p.m. in Los Angeles, with the local 24-hour time of 21:29 shown on the GMT hand&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then I realized that, because my watch doesn’t have a fixed set of labels, I
could orient the “natural” 24-hour scale with midnight at the bottom and noon
at the top, imitating the path of the sun. I decided to keep the bezel oriented
with the zero marker at 6:00, so that I can read the Los Angeles 24-hour time
off the bezel, if I want.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock5.svg&#34; class=&#34;center&#34;
    alt=&#34;Again 9:29 p.m. in Los Angeles, with the local 24-hour time of 21:29 shown and the bezel rotated so that noon is at the top and midnight at the bottom.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Again 9:29 p.m. in Los Angeles, with the local 24-hour time of 21:29 shown and the bezel rotated so that noon is at the top and midnight at the bottom.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Then when traveling, I can intuitively read my home time off the GMT hand.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock6.svg&#34; class=&#34;center&#34;
    alt=&#34;Jumping the local time to 2:29 p.m. (Tokyo time), the GMT hand and bezel still pointing to Los Angeles time of 21:29.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Jumping the local time to 2:29 p.m. (Tokyo time), the GMT hand and bezel still pointing to Los Angeles time of 21:29.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;And in this configuration, midnight UTC happens when the GMT is at the two
o&amp;rsquo;clock position, which means I can easily spin the bezel to read a third time
zone, for example, putting the 1 at two o&amp;rsquo;clock to read UTC+1.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock7.svg&#34; class=&#34;center&#34;
    alt=&#34;Still 2:29 p.m. in Tokyo, and 06:29 in UTC&amp;#43;1. Evening in Los Angeles.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Still 2:29 p.m. in Tokyo, and 06:29 in UTC+1. Evening in Los Angeles.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&#34;los-angeles-time-zone-vs-utc8&#34;&gt;Los Angeles time zone vs UTC−8&lt;/h1&gt;
&lt;p&gt;Here is where things get a little speculative because I’ve only had the watch
for a month, and haven’t had to transition to summer time. So I have plans but
maybe I will change my mind after some experience.&lt;/p&gt;
&lt;p&gt;The Los Angeles time zone is only UTC−8 on winter time. For the rest of the
year, we observe Daylight Saving Time, which puts us at UTC−7.&lt;/p&gt;
&lt;p&gt;There are a lot of reasons to leave the GMT hand at (noon-on-top) UTC−8. First
of all, it makes adjusting for Daylight Saving Time a simple jump of the local
hour hand. It also preserves the two o&amp;rsquo;clock UTC reference point year round,
making a third time zone a bit easier. It is also somewhat convenient because I
can still track (approximate) astronomical noon and midnight.&lt;/p&gt;
&lt;p&gt;But it also means that during the summer, if I want the 24-hour bezel to track
Los Angeles 24-hour time by default, then it has to be one 15-degree rotation
askew.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock8.svg&#34; class=&#34;center&#34;
    alt=&#34;Local Los Angeles summer time of 6:48 p.m., the bezel rotated to show UTC−7 time of almost 19:00, but the GMT hand also shows the natural solar time of almost 18:00.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Local Los Angeles summer time of 6:48 p.m., the bezel rotated to show UTC−7 time of almost 19:00, but the GMT hand also shows the natural solar time of almost 18:00.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/clock9.svg&#34; class=&#34;center&#34;
    alt=&#34;Quick spin of the bezel, aligning the 9 with the two o&amp;rsquo;clock marker, to check UTC&amp;#43;9 Tokyo time, where it is nearly 11 a.m.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Quick spin of the bezel, aligning the 9 with the two o&amp;rsquo;clock marker, to check UTC+9 Tokyo time, where it is nearly 11 a.m.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h1 id=&#34;the-apple-watch-gmt-face&#34;&gt;The Apple Watch GMT Face&lt;/h1&gt;
&lt;p&gt;Many years ago, I tried to use the Apple Watch GMT Face and didn’t last long. I
looked at it again to remind myself why I don’t like it.&lt;/p&gt;
&lt;p&gt;First of all, you have no choice about any orientations. The local hand has to
match your local time (but at least it automatically adjusts when you travel).
And of course, up has to be midnight because the programmers might die if they
had to add that level of complexity.&lt;/p&gt;
&lt;p&gt;The GMT hand also has to match your local time as well. As I mentioned, I don&amp;rsquo;t
like how this messes with my intuition in the admittedly rare case when I&amp;rsquo;m
in a different time zone.&lt;/p&gt;
&lt;p&gt;You track a second time zone with a software spin of the bezel. Making use of
the flexibility of a digital screen, the bezel is two-toned with the colors
representing night and day, based on the current sunrise and sunset in the
second time zone. Analog GMT watches often have two-toned bezels, with
transitions fixed at 6 and 18. (You could argue that 6 a.m. and 6 p.m. are more
useful markers than sunrise and sunset in a time zone where you aren&amp;rsquo;t
currently located.)&lt;/p&gt;
&lt;p&gt;Unfortunately, the Apple Watch bezel isn’t actually labeled
except for the index closest to the hand, because otherwise the digital face
gets too cluttered. Even worse, if you have your watch set to show 12-hour
time, the index gets labeled with the 12-hour time, with no indication of a.m.
vs p.m. except for the color of the bezel.&lt;/p&gt;
&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;https://nathangrigg.com/2026/01/gmt-watch/apple-watch.png&#34; class=&#34;center&#34;
    alt=&#34;Apple Watch showing 2:44 p.m. in Los Angeles, 10:44 p.m. in London. You infer that pink is night because it is so long, or from the triangle that still marks midnight. Note that the GMT hand tracks Los Angeles time (currently UTC−8), but with midnight on top, so UTC midnight is at the eight o&amp;rsquo;clock marker.&#34; width=&#34;300&#34;&gt;&lt;figcaption&gt;
      &lt;p&gt;Apple Watch showing 2:44 p.m. in Los Angeles, 10:44 p.m. in London. You infer that pink is night because it is so long, or from the triangle that still marks midnight. Note that the GMT hand tracks Los Angeles time (currently UTC−8), but with midnight on top, so UTC midnight is at the eight o&amp;rsquo;clock marker.&lt;/p&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Finally, and this is an ongoing gripe I have against Apple, by default the time
zone label in the middle of the face says CUP for Cupertino (just like in
iPhone Settings). If that annoys you, you can change it to SF for San
Francisco. Neither of those is the correct name of the time zone. Twenty years
ago it was cute to label the Pacific time zone as Cupertino in honor of your
headquarters. It’s not cute anymore.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2026/01/fmvfqp/</link>
      <pubDate>Thu, 08 Jan 2026 17:40:17 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/01/fmvfqp/</guid>
      <description>&lt;p&gt;Many years after starting The Wheel of Time series (I took a few years&amp;rsquo; hiatus between the first 7 and final 7 books), I finished it. Great world, great characters, overall lots of fun.&lt;/p&gt;
&lt;p&gt;Hard to do the series justice, but I guess I would say the first few books are the most exciting, the middle books make for some interesting world building, and Robert Jordan started to pick up steam again before his life was cut short. I don&amp;rsquo;t believe he ever would have ended the series, too many ideas and too many stories.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2026/01/kcnlpv/</link>
      <pubDate>Thu, 08 Jan 2026 17:00:42 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2026/01/kcnlpv/</guid>
      <description>&lt;p&gt;On a single ten-minute ride from the bus stop to my house, two middle-school-aged kids and one preschooler complimented my bike.&lt;/p&gt;
&lt;img src=&#34;https://nathangrigg.com/images/2026/bike.jpeg&#34; class=&#34;centered&#34; alt=&#34;My red Brompton foldable bike&#34;/&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/12/vbcvbb/</link>
      <pubDate>Fri, 12 Dec 2025 18:10:09 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/12/vbcvbb/</guid>
      <description>&lt;p&gt;Proud of my kiddo who raised $200 for the Trevor Project by selling crocheted frogs at a &amp;ldquo;marketplace&amp;rdquo; event put on by the high school.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/12/ckrhnp/</link>
      <pubDate>Wed, 03 Dec 2025 19:38:04 -0800</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/12/ckrhnp/</guid>
      <description>&lt;p&gt;Many years after starting, I finally finished Robert Jordan&amp;rsquo;s Wheel of Time series. I think I did the whole thing by audiobook, which by my calculations (assuming my typical 1.4x speed) is 321 hours of audio. Great series!&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/10/bzhyrt/</link>
      <pubDate>Wed, 29 Oct 2025 16:14:24 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/10/bzhyrt/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m slowly moving to &lt;a href=&#34;https://jj-vcs.github.io&#34;&gt;Jujutsu&lt;/a&gt; for my version control needs. For years, I&amp;rsquo;ve been using Mercurial-based interface to &lt;a href=&#34;https://en.wikipedia.org/wiki/Piper_(source_control_system)&#34;&gt;Piper&lt;/a&gt; at work and Git at home, and switching challenges my muscle memory. Jujutsu provides a common interface that can handle a central repo in either format. I find it easier to work with than Git or Mercurial, but there is a learning curve.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/09/zvyymk/</link>
      <pubDate>Fri, 05 Sep 2025 12:51:18 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/09/zvyymk/</guid>
      <description>&lt;p&gt;It is long past time for a screenshot file type. Pixel-based image format with selectable text and clickable links, annotations, and a context link to view the original source.&lt;/p&gt;
&lt;p&gt;(Most of this you could do with pdf, but you could also do it more simply. Either way, phones and computers should be able to create them properly from apps and web pages.)&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/08/hqtxvb/</link>
      <pubDate>Tue, 26 Aug 2025 07:58:47 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/08/hqtxvb/</guid>
      <description>&lt;p&gt;I feel very powerless to stop the intentional harm and destruction caused by Trump and Republicans in power, but I have absolutely no time for anyone or any organization that is happy about the way things are going, who sees Trump as a means to get something they want, or who sees Republicans as the lesser of two evils.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title></title>
      <link>https://nathangrigg.com/2025/08/ncnwxv/</link>
      <pubDate>Fri, 08 Aug 2025 20:29:00 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/08/ncnwxv/</guid>
      <description>&lt;p&gt;I installed the iPad beta to try the new windowing and I mostly love it. My main complaint is that I sometimes, maybe even always, want a window to go away and come back full screen next time, so much that I find myself maximizing a window before closing it. I would probably be fine if closing a window made it forget its size, and just minimize when you want to preserve the size.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title>Safari Web Apps and Composable Tools</title>
      <link>https://nathangrigg.com/2025/08/safari-web-apps-and-composable-tools/</link>
      <pubDate>Wed, 06 Aug 2025 21:00:14 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/08/safari-web-apps-and-composable-tools/</guid>
      <description>&lt;p&gt;I have two or three web pages that I tend to keep open on my desktop Mac. From
time to time I have experimented with turning these into web apps, which makes
it possible for me to hide them independently of my other web browser
windows, helps them remember the appropriate window size, and helps me to not
accidentally change them to a different page.&lt;/p&gt;
&lt;p&gt;I was happy to discover that Safari makes it easier than ever to convert a page
into a web app. Just select “Add to Dock” in the File menu (or share sheet). It
puts an icon in the Dock, but you don’t have to leave it there because it also
puts an application in &lt;code&gt;~/Applications&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But one of my pages is an HTML dashboard that is just a local file on my
computer. I originally made it this way because it syncs via iCloud Drive,
so that I can also view it on my phone or iPad if necessary. For some reason,
you can’t make a web app to view a local file.&lt;/p&gt;
&lt;h2 id=&#34;simple-http-server&#34;&gt;Simple HTTP server&lt;/h2&gt;
&lt;p&gt;The good thing about the Mac is that you can work around almost anything,
building exactly what you want out of smaller pieces. And in this case, all you
need is a little program that responds to HTTP requests with the content of the
file.&lt;/p&gt;
&lt;p&gt;There are many ways to accomplish this. I think MacOS still comes with Apache
installed by default. It is running on my machine, at least. But I don’t like
configuring Apache, so I didn’t use this method.&lt;/p&gt;
&lt;p&gt;Python can make an HTTP server easily, just run&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m http.server -b localhost -d /path/to/directory &lt;span class=&#34;m&#34;&gt;8203&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;-m&lt;/code&gt;  flag runs the &lt;code&gt;http.server&lt;/code&gt; module as if it were a Python script
(that is, with &lt;code&gt;__name__ == &amp;quot;__main__&amp;quot;&lt;/code&gt;). In this case, it starts up a server
with the given options. The &lt;code&gt;-b&lt;/code&gt; flag tells it to listen on &lt;code&gt;localhost&lt;/code&gt;, so
that other computers on your network can’t access the page. Then you give it a
directory and a port number. After this you can visit
&lt;code&gt;http://localhost:8203/file.html&lt;/code&gt; and view the file.&lt;/p&gt;
&lt;p&gt;But Python technically serves the entire directory, not just the file. You
could write a custom Python script that imported &lt;code&gt;http.server&lt;/code&gt;, and probably
build exactly what you wanted. But when I want a tiny program, I always seem to
gravitate towards Go, even though I tend to hate it for larger programs. I
probably like it because you can compile a binary that has no dependencies,
which reminds me of Turbo Pascal.&lt;/p&gt;
&lt;p&gt;Here is a simple Go program that serves a single file at the port, and
redirects any other requests to the base URL:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;flag&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;log&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;os&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;bind&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;127.0.0.1:8011&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;The address to listen on.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;file&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;The file to serve&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Parse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;flag&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;os&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;HandleFunc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;func&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Request&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;==&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;			&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ServeFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;			&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;StatusMovedPermanently&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;		&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Starting server at %s&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;	&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Fatal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ListenAndServe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bind&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I called it &lt;code&gt;servefile.go&lt;/code&gt;, then you just run &lt;code&gt;go build servefile.go&lt;/code&gt; and it
creates a binary named &lt;code&gt;servefile&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;keep-the-server-alive-in-the-background&#34;&gt;Keep the server alive in the background&lt;/h2&gt;
&lt;p&gt;If you go the Apache route, MacOS will already keep the server alive for you.
If you go the Python or Go route, you need to tell the system to always run
your server.&lt;/p&gt;
&lt;p&gt;The easiest way is to buy
&lt;a href=&#34;http://www.soma-zone.com/LaunchControl/&#34;&gt;LaunchControl&lt;/a&gt; and create a new agent
to run your command, checking &amp;ldquo;Run at load&amp;rdquo; and &amp;ldquo;Keep alive no matter what.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;For more information, check out this 13-year-old article on &lt;a href=&#34;https://nathangrigg.com/2012/07/schedule-jobs-using-launchd/&#34;&gt;scheduling with
launchd&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
    
    <item>
      <title>The best pun</title>
      <link>https://nathangrigg.com/2025/08/moai/</link>
      <pubDate>Sat, 02 Aug 2025 09:20:06 -0700</pubDate>
      <guid isPermaLink='true'>https://nathangrigg.com/2025/08/moai/</guid>
      <description>&lt;p&gt;&lt;em&gt;¿Qué dijo una estatua a la otra?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;¡No te movái!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In English, “What did one statue say to the other? Don’t move!”&lt;/p&gt;
&lt;p&gt;On a kindergarten level, this is already funny, because statues are known for
their ability to not move.&lt;/p&gt;
&lt;p&gt;But what makes it a pun is that, in a Chilean accent, &lt;em&gt;movái&lt;/em&gt; is a homophone of
&lt;em&gt;Moai&lt;/em&gt;, the well-known Easter Island statues.&lt;/p&gt;
&lt;p&gt;In fact, anywhere else in the Spanish-speaking world you would say “&lt;em&gt;No te
muevas&lt;/em&gt;” (or in Argentina “&lt;em&gt;No te movás&lt;/em&gt;”), which would ruin the joke. But in
the Chilean voseo form, this becomes “&lt;em&gt;No te movái&lt;/em&gt;.” And Chileans, who often
drop consonants, especially v’s, and even more so when getting all
voseo-folksy, would say “&lt;em&gt;No te moai.&lt;/em&gt;”&lt;/p&gt;
</description>
    </item>
  </channel>
</rss>
