<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jonathan McPherson</title><link>https://jmcphers.github.io/</link><description>Recent content on Jonathan McPherson</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 11 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jmcphers.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>If AI Is So Good, Why Are We Working Harder Than Ever?</title><link>https://jmcphers.github.io/blog/why-are-we-working-harder/</link><pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/why-are-we-working-harder/</guid><description>AI can accomplish engineering tasks in hours that used to take weeks.
And yet, every engineer I know who works with AI, myself included, is actually working harder and longer than ever before.
How can we explain this?
Is it growing pains, or is it the new normal?
One source of this effect is that AI doesn&amp;rsquo;t just do work, it also creates work: code that has to be reviewed, emails you have to read, reports you have to deliver.</description></item><item><title>4 Reasons AI Won't Take Developer Jobs</title><link>https://jmcphers.github.io/blog/ai-and-developer-jobs/</link><pubDate>Thu, 02 Jan 2025 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/ai-and-developer-jobs/</guid><description>As I write this, there is hand-wringing all over the Internet due to the advent of code-writing AI tools like Github Copilot and ChatGPT. Developers everywhere are, understandably, somewhat concerned.
These tools can take requests (&amp;ldquo;prompts&amp;rdquo;) in plain English and produce shockingly accurate computer code, in almost any language you&amp;rsquo;d like, that fulfills the request. If you squint a little, this is uncomfortably close to the daily work of the software engineer; many developers spend a good portion of their days having a task described to them in plain English, then writing code to tell the computer how to perform the task.</description></item><item><title>Kobo and the Kinmates T01</title><link>https://jmcphers.github.io/blog/kobo-and-kinmates/</link><pubDate>Sat, 28 Dec 2024 21:04:43 +0000</pubDate><guid>https://jmcphers.github.io/blog/kobo-and-kinmates/</guid><description>As a Christmas gift a few days ago, I received a Kinmates T01 Bluetooth page-turner, branded in the typical logorrheic Amazon fashion as Tiktok Scrolling Ring, Page Turner for Kindle App, Remote Control for TIK Tok and Kindle App, Bluetooth Connected, for iPhone Series, iPad, Android Phone, and More.
The intent was to to use it with my e-reader, a Kobo Clara BW.
These devices do not work together out of the box; in fact, the marketing material for the Kinmates T01 specifically states that it is not compatible with e-readers, only the Kindle app on phones and tablets.</description></item><item><title>A Tribute to Cynthia the Civic</title><link>https://jmcphers.github.io/blog/cynthias-tribute/</link><pubDate>Wed, 04 Jan 2023 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/cynthias-tribute/</guid><description>Today, I said goodbye to Cynthia, my faithful 1997 Honda Civic.
I purchased her in 2001 on a sunny day at a used-car lot in eastern Washington. The car salesman was almost a caricature of his profession, with greased-back hair, a dingy office, and a clammy handshake, but I liked the car so much I bought it anyway. She was perfect: a gently used, reliable little 2-door coupe with a peppy 5-speed transmission, silver paint, and even a moonroof and CD player.</description></item><item><title>Auto-Downscaling Retina Images with Hugo</title><link>https://jmcphers.github.io/blog/hugo-retina-images/</link><pubDate>Fri, 07 Oct 2022 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/hugo-retina-images/</guid><description>Retina Images Many modern screens are capable of displaying images with so many dots per inch (DPI) that they meet or exceed the resolving power of the human eye. In other words, they produce detail that&amp;rsquo;s so fine that you couldn&amp;rsquo;t see any more even if it were present.
Apple calls these retina displays, and the name often gets used for other high DPI displays.
A &amp;ldquo;retina image&amp;rdquo; is high-resolution image that is designed to be displayed on a high-DPI screen.</description></item><item><title>Favorite Dev Tools, 2022</title><link>https://jmcphers.github.io/blog/dev-tools-2022/</link><pubDate>Mon, 19 Sep 2022 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/dev-tools-2022/</guid><description>There&amp;rsquo;s an overarching theme here, and it&amp;rsquo;s this: don&amp;rsquo;t settle. If you are a software engineer, you&amp;rsquo;re using a lot of tools in your terminal that mostly haven&amp;rsquo;t been updated since the 80s. Modernized alternatives to many of these tools exist; with very little effort, you can remove a great deal of the typing and friction from everyday tasks.
Terminal Tools z z makes changing directories less of a typing chore.</description></item><item><title/><link>https://jmcphers.github.io/about/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/about/</guid><description>About the Site This site is lovingly handcrafted from organic bytes, and is made possible in part by readers like you, and the following technologies:
Static site hosted on Github Pages Site generation by Hugo Some figures generated by GoAT CSS includes numerous contributions from tufte-css, including the et-book font What&amp;rsquo;s That Weird Logo, Though? Oh, this?
It&amp;rsquo;s an r-pentamino.</description></item><item><title>The Case of R's Stack Overflow</title><link>https://jmcphers.github.io/blog/r-stack-threading/</link><pubDate>Tue, 30 Aug 2022 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/r-stack-threading/</guid><description>The Problem So, there I was, working on a project that embeds R in a Rust program using extendr, and everything was going great, until I tried to run the program in an aarch64 Linux environment. R emitted a whole bunch of these errors and wouldn&amp;rsquo;t start up.
Error: C stack usage 1474053204 is too close to the limit Error: C stack usage 1474052564 is too close to the limit Fatal error: unable to initialize the JIT I thought this would be relatively easy to fix.</description></item><item><title>Copying and Pasting Binaries with OpenSSL</title><link>https://jmcphers.github.io/blog/copy-paste-openssl/</link><pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/copy-paste-openssl/</guid><description>Sometimes You Can&amp;rsquo;t scp We&amp;rsquo;ve all been there: you have terminals open on two different remote hosts, and need to copy a file between them. Unfortunately, despite the fact that they are LITERALLY NEXT TO EACH OTHER on your screen, they just can&amp;rsquo;t see each other, because they&amp;rsquo;re each behind so many layers of VPNs and bastion hosts and NATs and different accounts and time zones that a direct connection feels impossible.</description></item><item><title>Is Biking Better for the Environment?</title><link>https://jmcphers.github.io/blog/calories-biked/</link><pubDate>Sat, 30 Dec 2017 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/calories-biked/</guid><description>I&amp;rsquo;ve biked to work almost every day for years, and during most of that time I figured I was doing the climate a big favor by not commuting by car.
Recently, though, I had a worrisome thought. I&amp;rsquo;m not losing any weight, which means that the calories which power my bike are coming entirely from the food I eat. Now, it&amp;rsquo;s true that it takes less energy to power a bicycle than it does to power a car, but it&amp;rsquo;s also true that producing food energy can be more ecologically harmful than burning gasoline, at least from a carbon footprint standpoint.</description></item><item><title>Deploying Hugo with Travis CI</title><link>https://jmcphers.github.io/blog/hugo-and-travis/</link><pubDate>Wed, 09 Nov 2016 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/hugo-and-travis/</guid><description>As an occasional web developer, I used to build sites with Wordpress, but have recently become enamored with static site generators. There&amp;rsquo;s just something ineffably elegant about having the site pre-built.
There&amp;rsquo;s no code on the web server to break, or patch, or hack. There&amp;rsquo;s no server configuration to screw up. Static sites just Exist, in pristine immutability.
Even better, a static site is usually constructed with plain text files, which means you can use version control systems like Git to manage your content.</description></item><item><title>Lessons from 20 Years of Development</title><link>https://jmcphers.github.io/blog/dev-lessons/</link><pubDate>Thu, 29 Sep 2016 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/dev-lessons/</guid><description>I&amp;rsquo;ve been writing software professionally for most of the last two decades. In this time I&amp;rsquo;ve worked just about everywhere: on government contracts, at healthcare companies, in universities, at very big companies (more than 100K employees) and very small ones (fewer than 10 employees). I&amp;rsquo;ve written clients, servers, web applications, utilities, plugins, and frameworks.
Here are some of the things I&amp;rsquo;ve learned over those twenty years. They&amp;rsquo;re my opinions, but they&amp;rsquo;ve served me well.</description></item><item><title>Password Management</title><link>https://jmcphers.github.io/blog/passwords/</link><pubDate>Sun, 08 May 2016 12:32:32 +0000</pubDate><guid>https://jmcphers.github.io/blog/passwords/</guid><description>Introduction Everyone has their own way of managing the dozens of passwords they need to sign on to online services. Some people use the same password everywhere. Others use sticky notes or a notepad shoved into a desk drawer. If you&amp;rsquo;re technically inclined, you might use a password manager. I&amp;rsquo;ve been using the same password management system for almost half a decade now, and I&amp;rsquo;ve been very pleased with it. I&amp;rsquo;m publishing it here in hopes it will be helpful to others.</description></item><item><title>Finding Circular Primes in Go</title><link>https://jmcphers.github.io/blog/go-circular-primes/</link><pubDate>Thu, 03 Sep 2015 12:32:32 +0000</pubDate><guid>https://jmcphers.github.io/blog/go-circular-primes/</guid><description>Recently a friend of mine posted the following programming challenge, which he&amp;rsquo;d received as an interview question.
A number is called a circular prime if it is prime and all of its rotations are primes.
For example the number 197 has two rotations: 971, and 719. Both of them are prime.
There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.</description></item><item><title>Android and Captive Portals</title><link>https://jmcphers.github.io/blog/android-captive-portal/</link><pubDate>Sat, 29 Aug 2015 08:04:43 +0000</pubDate><guid>https://jmcphers.github.io/blog/android-captive-portal/</guid><description>Our family stayed at a hotel that offered free AT&amp;amp;T WiFi with an access code was distributed at the lobby.
&amp;ldquo;Just connect to the network attwifi and enter the code,&amp;rdquo; the brochure said.
The network had a captive portal, a page you had to open to enter your code before your device would be allowed to use the Internet.
Ordinarily, my Android phone (running Lollipop) detects this and shows a notification asking me to sign into the network.</description></item><item><title>Obfuscating IDs</title><link>https://jmcphers.github.io/blog/id-obfuscation/</link><pubDate>Thu, 20 Aug 2015 15:04:43 +0000</pubDate><guid>https://jmcphers.github.io/blog/id-obfuscation/</guid><description>Auto-incrementing IDs are great. When you&amp;rsquo;re picking a method for generating unique IDs in a system, auto-incrementing IDs (1, 2, 3, &amp;hellip;) are often a good choice. These have a number of advantages over more complicated techniques:
They are very fast to generate and require no random number generation or seeding. Their representation is short and simple compared to e.g. GUIDs. There is no need to test for collisions or uniqueness.</description></item><item><title>JavaScript: When an Array isn't an Array</title><link>https://jmcphers.github.io/blog/arrays/</link><pubDate>Tue, 18 Aug 2015 21:04:43 +0000</pubDate><guid>https://jmcphers.github.io/blog/arrays/</guid><description>Recently, I was investigating a JavaScript bug in which an array serialized differently when it was created in another window. Let&amp;rsquo;s say foo is an array created in this window, and bar is an array created in another window.
&amp;gt; var foo = [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] &amp;gt; var bar = window.opener.foo; Now, let&amp;rsquo;s try to serialize them. (serialize is not a real method, but it illustrates the problem.)
&amp;gt; foo [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] &amp;gt; serialize(foo) &amp;quot;['a', 'b', 'c']&amp;quot; &amp;gt; bar [&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;] &amp;gt; serialize(bar) &amp;quot;{'0': 'a', '1': 'b', '2': 'c'}&amp;quot; Wait, what?</description></item><item><title>Efficient Editing with Vim</title><link>https://jmcphers.github.io/blog/efficient-editing/</link><pubDate>Wed, 03 May 2006 00:00:00 +0000</pubDate><guid>https://jmcphers.github.io/blog/efficient-editing/</guid><description>&amp;ldquo;To me, vi is Zen. To use vi is to practice zen. Every command is a koan. Profound to the user, unintelligible to the uninitiated. You discover truth every time you use it.&amp;rdquo;
&amp;ndash;reddy@lion.austin.com
This tutorial assumes a basic knowledge of vim &amp;ndash; insert mode, command mode, loading and saving files, etc. It is intended to help vi novices develop their skills so that they can use vi efficiently.</description></item></channel></rss>