<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Technology on billpg industries™</title><link>https://owl.billpg.com/tags/technology/</link><description>Recent content in Technology on billpg industries™</description><generator>Hugo</generator><language>en-us</language><copyright>© William Godfrey.</copyright><lastBuildDate>Sat, 05 Sep 2026 14:41:07 +0000</lastBuildDate><atom:link href="https://owl.billpg.com/tags/technology/index.xml" rel="self" type="application/rss+xml"/><item><title>I Wrote a NuGet Package!</title><link>https://owl.billpg.com/i-wrote-a-nuget-package/</link><pubDate>Sat, 05 Sep 2026 14:41:07 +0000</pubDate><guid>https://owl.billpg.com/i-wrote-a-nuget-package/</guid><description>&lt;p&gt;I’ve been working a little in the world of &lt;strong&gt;HTTP Authentication&lt;/strong&gt;. When you connect a system to another system, there’s usually a set of tokens that get passed around and managed and sometimes accidentally pushed to a public git repo.&lt;/p&gt;
&lt;p&gt;When you try to connect to a website that requires a user login, you’ll be sent back a &lt;strong&gt;&lt;code&gt;401&lt;/code&gt;&lt;/strong&gt; response with a &lt;strong&gt;&lt;code&gt;WWW-Authenticate:&lt;/code&gt;&lt;/strong&gt; header. Except you won’t. You’ll be sent a 302 redirect to a login page.&lt;/p&gt;</description></item><item><title>Am I worried AI will take my job?</title><link>https://owl.billpg.com/am-i-worried-ai-will-take-my-job/</link><pubDate>Sat, 18 Jul 2026 08:41:28 +0000</pubDate><guid>https://owl.billpg.com/am-i-worried-ai-will-take-my-job/</guid><description>&lt;p&gt;People sometimes ask if I’m worried that AI will put me out of a job. My honest answer is &lt;strong&gt;no, not really&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;In fact, I’ve been here before.&lt;/p&gt;
&lt;h2 id="the-first-time-the-machine-out-coded-me"&gt;The first time the machine out-coded me.&lt;/h2&gt;
&lt;p&gt;When I graduated in the 90s, assembly language was still a respectable skill. I wrote most of my code in C, but there was always that one tight loop or fiddly routine where a bit of hand-tuned assembler felt like wizardry. I was working in embedded systems, targeting a single CPU and we wanted every cycle to count.&lt;/p&gt;</description></item><item><title>8086 Segmented Memory Was a Good Idea. (Almost.)</title><link>https://owl.billpg.com/8086-segmented-memory-was-a-good-idea-almost/</link><pubDate>Sun, 21 Jun 2026 13:41:55 +0000</pubDate><guid>https://owl.billpg.com/8086-segmented-memory-was-a-good-idea-almost/</guid><description>&lt;p&gt;How’s that for a click‑bait title. Who in their right mind would defend the monstrosity that is the 8086 segmented memory architecture?&lt;/p&gt;
&lt;p&gt;By the time I got into 8086 assembly, PCs were mostly 80286‑based, but everything still ran under DOS. A “normal” machine only had the canonical 640KB of conventional memory and every assembly book had a dreaded chapter explaining segmentation. I still have the battle scars. Near pointers, far pointers, and the infamous “wherever‑you‑are” pointers.&lt;/p&gt;</description></item><item><title>On no! I've invented SVG badly!</title><link>https://owl.billpg.com/on-no-ive-invented-svg-badly/</link><pubDate>Fri, 29 May 2026 05:21:11 +0000</pubDate><guid>https://owl.billpg.com/on-no-ive-invented-svg-badly/</guid><description>&lt;p&gt;It started, as these things often do, with a tiny spark of inspiration. I was looking at the way Unicode builds those racially diverse family emoji. These use ZWJ sequences to glue together adults, children, and skin‑tone modifiers into a single little glyph. It’s clever, constrained, and surprisingly elegant. It gave me an idea.&lt;/p&gt;
&lt;p&gt;What if you could do the same thing for flags? Unicode already has national flag emojis along with 🏳️‍🌈, 🏳️‍⚧️, 🏴‍☠️, 🏁,🏳️,🏴,🚩 and the countries-in-our-hearts, 🏴󠁧󠁢󠁥󠁮󠁧󠁿, 🏴󠁧󠁢󠁳󠁣󠁴󠁿, 🏴󠁧󠁢󠁷󠁬󠁳󠁿. But no more. The people in charge of assigning codes have decided this is too much of a geopolitical and culture-war nightmare so these are all the flags we&amp;rsquo;re going to get.&lt;/p&gt;</description></item><item><title>Hearthfire Part One: Lighting the Flame</title><link>https://owl.billpg.com/hearthfire-part-one-lighting-the-flame/</link><pubDate>Fri, 08 May 2026 18:54:20 +0000</pubDate><guid>https://owl.billpg.com/hearthfire-part-one-lighting-the-flame/</guid><description>&lt;p&gt;Every so often a project lodges itself in your brain and refuses to leave quietly. This began as a late‑night thought experiment, the kind that keeps circling until you either build it or write it down. For months it’s been pacing around the edges of my mind.&lt;/p&gt;
&lt;p&gt;What if I knew what I know now, but I lived in the 1980s and worked for a plucky home computer maker?&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter size-medium"&gt;
&lt;img src="https://owl.billpg.com/images/Cat_on_Laptop_by_Doug_Woods.jpg" class="wp-image-1335" /&gt;
&lt;figcaption&gt;"The games you get today, well they might be very flash, but they'll never beat the thrill of getting through jetpack."&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The spark came from a familiar place. I’d been following the &lt;strong&gt;Commander X16&lt;/strong&gt; project, a modern reimagining of what might have happened if Commodore had stayed the course with the 6502 instead of leaping to the Amiga. The X16’s operating system keeps the approachable, single‑tasking spirit of the C64 and even followed through to shipping real hardware you can buy today. Watching that project take shape made me wonder about a different branch of the timeline. An 8‑bit machine that embraced pre‑emptive multitasking, shared memory regions, and a more ceremonial sense of system design.&lt;/p&gt;</description></item><item><title>The Road Not Taken: A World Where IPv4 Evolved</title><link>https://owl.billpg.com/ipv4x/</link><pubDate>Tue, 10 Feb 2026 22:14:52 +0000</pubDate><guid>https://owl.billpg.com/ipv4x/</guid><description>&lt;p&gt;IP address exhaustion is still with us. Back in the early 1990s, when the scale of the problem first became obvious, the projections were grim. Some estimates had us running out of IPv4 addresses as early as 2005 and even the optimistic ones didn’t push much beyond the following decade.&lt;/p&gt;
&lt;p&gt;As the years passed, we got clever. Or perhaps, more desperate.&lt;/p&gt;
&lt;p&gt;We managed to put off that imminent exhaustion for decades, breaking the Internet in the process in small, subtle ways. Want multiple home machines behind a single IP? No problem — we invented NAT. ISPs want in on that “multiple devices, one address” trick? Sure, have some Carrier‑Grade NAT. Want to run a server on your home machine? Er… no.&lt;/p&gt;</description></item><item><title>Sixgate - IPv6 Without Leaving Anyone Behind</title><link>https://owl.billpg.com/sixgate/</link><pubDate>Thu, 29 Jan 2026 19:14:42 +0000</pubDate><guid>https://owl.billpg.com/sixgate/</guid><description>&lt;p&gt;The internet is inching toward IPv6, but not nearly fast enough. Server operators are increasingly comfortable running services on IPv6‑only infrastructure, yet a stubborn reality remains: many users are still stuck behind IPv4‑only networks. Legacy ISPs, old routers, and long‑lived hardware keep a surprising number of clients stranded on the old protocol.&lt;/p&gt;
&lt;p&gt;That creates a familiar kind of stalemate. Just as the lack of SNI support in Windows XP once discouraged sites from adopting HTTPS, today’s pockets of IPv4‑only clients discourage operators from going IPv6‑only. No one wants to cut off part of their audience, so IPv4 lingers on long after its sell‑by date.&lt;/p&gt;</description></item><item><title>Python’s Truthiness: A Code Smell Worth Sniffing</title><link>https://owl.billpg.com/pythons-truthiness-a-code-smell-worth-sniffing/</link><pubDate>Mon, 17 Nov 2025 18:20:51 +0000</pubDate><guid>https://owl.billpg.com/pythons-truthiness-a-code-smell-worth-sniffing/</guid><description>&lt;p&gt;Python lets you use any value in &lt;code&gt;if&lt;/code&gt; and &lt;code&gt;while&lt;/code&gt; conditions, not just Booleans. This permissiveness relies on a concept known as “truthiness”. Values like &lt;code&gt;None&lt;/code&gt;, &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;, and empty collections are treated as false and everything else is true.&lt;/p&gt;
&lt;p&gt;It’s convenient. It’s idiomatic. It’s also, I argue, a code smell.&lt;/p&gt;
&lt;h3 id="the-bug-that-changed-my-mind"&gt;The Bug That Changed My Mind&lt;/h3&gt;
&lt;p&gt;Here’s a real example from one of my side projects:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-wp-block-code" data-lang="wp-block-code"&gt;def final_thing_count() -&amp;gt; Optional[int]:
 &amp;#34;&amp;#34;&amp;#34;Returns an integer count of things, but only
 if the number of things is complete. If there may
 yet be things to come, returns None to indicate 
 the count isn&amp;#39;t final.&amp;#34;&amp;#34;&amp;#34;
 # Code Redacted.

current_thing_count: Optional[int] = final_thing_count()
if current_thing_count:
 # Process the final count of things.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Looks fine, right? But it’s broken.&lt;/p&gt;</description></item><item><title>Will We Run Out of Unicodes?</title><link>https://owl.billpg.com/the-expanding-universe-of-unicode/</link><pubDate>Mon, 10 Nov 2025 19:40:40 +0000</pubDate><guid>https://owl.billpg.com/the-expanding-universe-of-unicode/</guid><description>&lt;p&gt;Before Unicode, digital text lived in a fragmented world of 8-bit encodings. ASCII had settled in as the good-enough-for-English core, taking up the first half of codes, but the other half was a mish-mash of regional code pages that mapped characters differently depending on locale. One set for accented Latin letters, another set for Cyrillic.&lt;/p&gt;
&lt;p&gt;Each system carried its own assumptions, collisions, and blind spots. Unicode emerged as a unifying vision. a single character set for all human languages, built on a 16-bit foundation. All developers had to do was swap their 8-bit loops for 16-bit loops. Some bristled that half the bytes were all zeros, but this was for the greater good.&lt;/p&gt;</description></item><item><title>Rufus - An Adventure in Downloading</title><link>https://owl.billpg.com/rufus-an-adventure-in-downloading/</link><pubDate>Mon, 20 Oct 2025 07:17:17 +0000</pubDate><guid>https://owl.billpg.com/rufus-an-adventure-in-downloading/</guid><description>&lt;p&gt;I needed to make a bootable USB. Simple task, right? My aging Windows 10 machine couldn’t upgrade to 11 and Ubuntu seemed like the obvious next step.&lt;/p&gt;
&lt;p&gt;Downloading Rufus, the tiny tool everyone recommends, turned out to be less of a utility and more of a trust exercise. Between misleading ads, ambiguous signatures and the creeping dread of running an EXE as administrator, I found myself wondering how something so basic became so fraught?&lt;/p&gt;</description></item><item><title>Dear string-to-integer parsers...</title><link>https://owl.billpg.com/dear-string-to-integer-parsers/</link><pubDate>Tue, 29 Jul 2025 17:11:17 +0000</pubDate><guid>https://owl.billpg.com/dear-string-to-integer-parsers/</guid><description>&lt;p&gt;These are very useful functions that any language with distinct string and integer types will include in their standard library. Pass in a string with decimal digits and it&amp;rsquo;ll return the equivalent in the binary integer form that you can do mathematics with.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to make a modest proposal that I&amp;rsquo;d find very useful, and maybe you, dear reader, would too.&lt;/p&gt;
&lt;figure class="wp-block-image size-full"&gt;
&lt;img src="https://owl.billpg.com/images/Swift_by_Tristan_Ferne_cropped.jpg" class="wp-image-1080" /&gt;
&lt;figcaption&gt;"The rich man in his castle, the poor man at his gate. He made them, high or lowly, and ordered their estate."&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="who-me"&gt;Who me?&lt;/h2&gt;
&lt;p&gt;Specifically, I&amp;rsquo;m thinking of parser functions that work like this&amp;hellip;&lt;/p&gt;</description></item><item><title>What type of UUID should I use?</title><link>https://owl.billpg.com/what-type-of-uuid-should-i-use/</link><pubDate>Thu, 17 Apr 2025 17:29:32 +0000</pubDate><guid>https://owl.billpg.com/what-type-of-uuid-should-i-use/</guid><description>&lt;p&gt;UUIDs, &lt;strong&gt;Universally Unique IDs&lt;/strong&gt;, are handy 128 bit IDs. Their values are unique, universally, hence the name.&lt;/p&gt;
&lt;p&gt;(If you work with Microsoft, you call them GUIDs. I do primarily think of them as GUIDs, but I&amp;rsquo;m going to stick with calling them UUIDs for this article, as I think that name is more common.)&lt;/p&gt;
&lt;p&gt;These are useful for IDs. Thanks to their universal uniqueness, you could have a distributed set of machines, each producing their own IDs, without any co-ordination necessary, even completely disconnected from each other, without worrying about any of those IDs colliding.&lt;/p&gt;</description></item><item><title>I want a less powerful programming language for Christmas.</title><link>https://owl.billpg.com/i-want-a-less-powerful-programming-language-for-christmas/</link><pubDate>Wed, 12 Feb 2025 21:44:24 +0000</pubDate><guid>https://owl.billpg.com/i-want-a-less-powerful-programming-language-for-christmas/</guid><description>&lt;p&gt;I&amp;rsquo;m writing this because I&amp;rsquo;m hoping someone will respond, telling me that what I want already exists. I have a specific itch and my suspicion is that developing a whole programming language and runtime is the only way to scratch that itch.&lt;/p&gt;
&lt;p&gt;Please tell me I&amp;rsquo;m wrong.&lt;/p&gt;
&lt;h2 id="dear-father-christmas"&gt;Dear Father Christmas&amp;hellip;&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve ever written a web service, you&amp;rsquo;ve almost certainly had situations where you&amp;rsquo;ve taken a bunch of bytes from a completely untrusted stranger and passed those bytes into a JSON parser. What&amp;rsquo;s more you&amp;rsquo;ll have done that without validating the bytes first.&lt;/p&gt;</description></item><item><title>My adventure into self web-hosting (Part 1)</title><link>https://owl.billpg.com/web-hosting-1/</link><pubDate>Fri, 25 Mar 2022 20:20:41 +0000</pubDate><guid>https://owl.billpg.com/web-hosting-1/</guid><description>&lt;p&gt;If you had asked twenty-something me how he thought forty-something me would be hosting his website, he&amp;rsquo;d have predicted I had a rack of small servers in my attic, as part of a grid-computing business. (That&amp;rsquo;s what we called &amp;ldquo;cloud&amp;rdquo; computing back then.)&lt;/p&gt;
&lt;p&gt;He&amp;rsquo;d have been disappointed to find out I&amp;rsquo;m using a shared web-hosting service, but that may change.&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter size-large"&gt;
&lt;img src="https://owl.billpg.com/images/keekahs-717622.jpg" /&gt;
&lt;figcaption&gt;"The end of the day, remember the way, we stayed so close to the end, we'll remember it was me and you 'cause we are gonna be..."&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="over-the-cliff"&gt;Over the Cliff&lt;/h2&gt;
&lt;p&gt;It all started when my article, &lt;a href="https://owl.billpg.com/data-mining-wikipedia/" rel="noreferrer noopener" data-type="post" data-id="401" target="_blank"&gt;Data-Mining Wikipedia for Fun and Profit&lt;/a&gt; made it to the top of Hacker News and stayed there for three hours. I was careful to &lt;em&gt;try&lt;/em&gt; to not overburden the system by switching on an HTML cache. This way, visitors would only be served up static files without the server having to run the PHP code or talk to the database. Despite that, the server went down and I had to post a sheepish comment with a link to a mirror.&lt;/p&gt;</description></item><item><title>Data-Mining Wikipedia for Fun and Profit</title><link>https://owl.billpg.com/data-mining-wikipedia/</link><pubDate>Tue, 06 Jul 2021 18:59:54 +0000</pubDate><guid>https://owl.billpg.com/data-mining-wikipedia/</guid><description>&lt;p&gt;It all started after watching one &lt;a href="https://www.youtube.com/watch?v=jNgP6d9HraI" rel="noreferrer noopener" target="_blank"&gt;too&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=vC6okzIKQvg" rel="noreferrer noopener" target="_blank"&gt;many&lt;/a&gt; videos narrating the English monarchy, all starting from King William Ⅰ in 1066 as if he&amp;rsquo;s the first king of England. This annoys me as it completely disregards the handful of Anglo-Saxon kings of England who reigned before the Normans.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re Kings of England. If you&amp;rsquo;re going to make a list of the Kings of England, then you should include the Kings of England.&lt;/p&gt;</description></item><item><title>POP3 - The ideas that didn't make it.</title><link>https://owl.billpg.com/pop3-didnt-make-it/</link><pubDate>Thu, 29 Apr 2021 17:09:39 +0000</pubDate><guid>https://owl.billpg.com/pop3-didnt-make-it/</guid><description>&lt;p&gt;This is part of series of posts documenting extensions to the POP3 protocol.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://owl.billpg.com/pop3-commit-refresh/" rel="noreferrer noopener" data-type="post" data-id="226" target="_blank"&gt;POP3 – A Commit and Refresh Mechanism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owl.billpg.com/pop3-message-ids/" rel="noreferrer noopener" data-type="post" data-id="261" target="_blank"&gt;POP3 – Goodbye to numeric message IDs!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://owl.billpg.com/pop3-deli/" rel="noreferrer noopener" data-type="post" data-id="335" target="_blank"&gt;POP3 – Delete Immediately&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/billpg/POP3Listener/" rel="noreferrer noopener" target="_blank"&gt;billpg.POP3Listener - A reference implementation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had a few ideas along the way. This post collects some that didn&amp;rsquo;t quite make it. I present these so the time I spent won&amp;rsquo;t have been a &lt;em&gt;complete&lt;/em&gt; waste. 🐘&lt;/p&gt;</description></item><item><title>POP3 - Delete Immediately</title><link>https://owl.billpg.com/pop3-deli/</link><pubDate>Wed, 07 Apr 2021 18:03:51 +0000</pubDate><guid>https://owl.billpg.com/pop3-deli/</guid><description>&lt;p&gt;This post is part of series documenting extensions I&amp;rsquo;ve designed and prototyped for the POP3 protocol. I originally had this idea on the way to designing &lt;a href="https://owl.billpg.com/pop3-commit-refresh/" rel="noreferrer noopener" data-type="post" data-id="226" target="_blank"&gt;a mechanism for keeping connections open&lt;/a&gt; and avoid having to close and reopen them. I had abandoned this specific idea early on in that process but once I started writing up my notes for public discussion, I realised this small update might still be useful to implement.&lt;/p&gt;</description></item><item><title>Write Your Own POP3 Service</title><link>https://owl.billpg.com/pop3-write-your-own/</link><pubDate>Fri, 26 Mar 2021 18:31:19 +0000</pubDate><guid>https://owl.billpg.com/pop3-write-your-own/</guid><description>&lt;p&gt;So, you want to write a POP3 service? That&amp;rsquo;s great. In this post, we&amp;rsquo;ll walk through building a simple POP3 service that uses a folder full of EML files as a mailbox and serves them to anyone logging in.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m assuming you are already set-up to be writing and building C# code. If you have Windows, the free version of Visual Studio 2019 is great. (Or use a more recent version if one exists.) Visual Studio Code is great on Linux too.&lt;/p&gt;</description></item><item><title>POP3 - Goodbye to numeric message IDs!</title><link>https://owl.billpg.com/pop3-message-ids/</link><pubDate>Mon, 22 Mar 2021 19:57:42 +0000</pubDate><guid>https://owl.billpg.com/pop3-message-ids/</guid><description>&lt;p&gt;This is the second post in my series describing a number of extensions to the POP3 protocol. The main one is a mechanism to refresh an already opened connection to allow newly arrived messages to be downloaded, which I&amp;rsquo;ve described on &lt;a href="https://owl.billpg.com/pop3-commit-refresh/" data-type="post" data-id="226" target="_blank" rel="noreferrer noopener"&gt;a separate post&lt;/a&gt;. This one is a lot simpler in scope but if we&amp;rsquo;re doing work in this protocol anyway, this may as well come as a package.&lt;/p&gt;</description></item><item><title>POP3 - A Commit and Refresh Mechanism</title><link>https://owl.billpg.com/pop3-commit-refresh/</link><pubDate>Mon, 22 Mar 2021 19:08:48 +0000</pubDate><guid>https://owl.billpg.com/pop3-commit-refresh/</guid><description>&lt;p&gt;POP3 is a popular protocol for accessing a mailbox full of email messages. While small devices have moved their mail reading apps to IMAP and proprietary protocols, POP3 remains the preferred protocol for moving email messages between big servers where a no-frills, download-and-delete system is preferred.&lt;/p&gt;
&lt;p&gt;A problem with this protocol is embodied in this question: &lt;strong&gt;&amp;ldquo;How often should we poll for new messages?&amp;rdquo;&lt;/strong&gt; There&amp;rsquo;s a non-trivial overhead to connecting. Poll too quickly and you overload the system. Poll too far apart and messages take too long to arrive.&lt;/p&gt;</description></item><item><title>POP3 - UIDL is a required command!</title><link>https://owl.billpg.com/pop3-uidl/</link><pubDate>Thu, 17 Dec 2020 20:06:55 +0000</pubDate><guid>https://owl.billpg.com/pop3-uidl/</guid><description>&lt;p&gt;&lt;a href="https://tools.ietf.org/html/rfc1957" rel="noreferrer noopener" target="_blank"&gt;RFC 1957&lt;/a&gt; observes, discussing mail reading software that implements the popular POP3 protocol: &amp;ldquo;two popular clients require optional parts of the RFC. Netscape requires UIDL, and Eudora requires TOP.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;This reads like a complaint, but this tell me that Netscape&amp;rsquo;s mail reader (which these days is called Thunderbird) is well designed.&lt;/p&gt;
&lt;p&gt;The rot started with  &lt;a href="https://tools.ietf.org/html/rfc1939" rel="noreferrer noopener" target="_blank"&gt;RFC 1939&lt;/a&gt;, the standard for this protocol. This document specifies that &lt;strong&gt;UIDL&lt;/strong&gt; is &lt;em&gt;optional&lt;/em&gt;. This was a mistake. Without UIDL, the protocol is not reliable. I write this in the hope of persuading you that UIDL should not only be considered a requirement for a POP3 server, but that any client software that &lt;em&gt;doesn&amp;rsquo;t&lt;/em&gt; require UIDL should not be trusted. I&amp;rsquo;m looking at you, Eudora!&lt;/p&gt;</description></item><item><title>Dear WordPress. Please stop using MySQL.</title><link>https://owl.billpg.com/dear-wordpress-please-stop-using-mysql/</link><pubDate>Thu, 20 Jun 2019 18:56:00 +0000</pubDate><guid>https://owl.billpg.com/dear-wordpress-please-stop-using-mysql/</guid><description>&lt;p&gt;&lt;img src="https://owl.billpg.com/images/Squirrel.jpg" data-border="0" data-align="right" data-original-width="150" data-original-height="150" width="150" height="150" /&gt; This may very well end up being my last &lt;em&gt;Blogger&lt;/em&gt; based post as I&amp;rsquo;m slowly adopting (self-hosted) WordPress as a publishing platform. I have a set of websites running on a commodity cPanel-based shared host, with a view to moving to a dedicated VM in due course. While setting things up and playing about with WordPress, I kept tripping over an obstacle that just kept getting in the way of doing what I wanted to do. &lt;strong&gt;MySQL&lt;/strong&gt; was that obstacle. Dear WordPress, please have an option to use a file-based database (such as SQLite) instead.&lt;/p&gt;</description></item><item><title>Falco T310 - Unleashed</title><link>https://owl.billpg.com/falco-t310-unleashed/</link><pubDate>Thu, 25 Jan 2018 13:10:00 +0000</pubDate><guid>https://owl.billpg.com/falco-t310-unleashed/</guid><description>&lt;p&gt;&lt;img src="https://owl.billpg.com/images/VT100-in-the-flesh-by-Dana-Sibera.jpg" data-align="right" /&gt; 1993. Computers were desktop PCs running MS-DOS and the Internet was unheard of. My school had a number of PCs with Borland Pascal installed which my friends and I happily learnt. Along the way, we wrote a clever variation of the Minesweeper game. Life was good. That would all change when I started my Computer Science degree course at university that year. Instead of many single-user machines running MS-DOS, we&amp;rsquo;d all be sharing a multi-user machine running UNIX.&lt;/p&gt;</description></item><item><title>Why I willingly bought a Windows Phone</title><link>https://owl.billpg.com/why-i-willingly-bought-a-windows-phone/</link><pubDate>Thu, 26 Oct 2017 19:29:00 +0000</pubDate><guid>https://owl.billpg.com/why-i-willingly-bought-a-windows-phone/</guid><description>&lt;p&gt;Without shame or apology, I use a Windows Phone. A bright orange Lumia 630. I purchased it with my own money. No-one pushed me to it or chose it for me. It was entirely my decision.&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://owl.billpg.com/images/WindowsPhoneRunningPodcastLounge.jpg" class="wp-image-221" /&gt;
&lt;/figure&gt;
&lt;p&gt;But why?!&lt;/p&gt;
&lt;h2 id="phones"&gt;Phones&lt;/h2&gt;
&lt;p&gt;My story starts in 2012 when I had outgrown my aging Symbian phone. After considering a number of options, I purchased an Android based Samsung Galaxy S2.&lt;/p&gt;
&lt;p&gt;I had considered an iPhone at the time, but the main reason I didn&amp;rsquo;t was that I&amp;rsquo;d have to buy into the Apple ecosystem, which just wasn&amp;rsquo;t for me. My primary computer platforms were Windows based and moving to iPhone would be a big culture shock. My Samsung instead fitted into that world quite neatly and I&amp;rsquo;d remain happy with my choice for years.&lt;/p&gt;</description></item><item><title>Is your API broken?</title><link>https://owl.billpg.com/is-your-api-broken/</link><pubDate>Wed, 16 Jul 2014 23:54:00 +0000</pubDate><guid>https://owl.billpg.com/is-your-api-broken/</guid><description>&lt;p&gt;&amp;ldquo;Welcome to the Example Rutabaga Company. We’ve got a simple REST API for all your rutabaga needs!&amp;rdquo; Indeed, it is simple… &lt;code&gt;   POST https://rutabaga.example.com/Order/ HTTP/1.1&lt;/code&gt; &lt;code&gt;   Content-Type: application/json&lt;/code&gt; &lt;code&gt;   {&amp;quot;Quantity&amp;quot;: 5800,&lt;/code&gt; &lt;code&gt;    &amp;quot;Quality&amp;quot;: &amp;quot;Tasty!&amp;quot;,&lt;/code&gt; &lt;code&gt;    &amp;quot;DeliverTo&amp;quot;: &amp;quot;123 Fake Street, New Orleans&amp;quot;}&lt;/code&gt; Send this and you&amp;rsquo;ll either get an error or an &amp;ldquo;OK&amp;rdquo; response with a tracking ID inside. Later, you’ll get several thousand tasty rutabagas in the post. What could go wrong? Everything.&lt;/p&gt;
&lt;h2 id="schrödingers-response"&gt;Schrödinger&amp;rsquo;s Response&lt;/h2&gt;
&lt;p&gt;From the client’s point of view, there’s a clear action to take depending on the response code. &lt;img src="https://owl.billpg.com/images/cat1-161x300.jpg" data-align="right" width="156" height="290" /&gt;&lt;/p&gt;</description></item><item><title>I need a good podcast catcher (and a bit of a rant)</title><link>https://owl.billpg.com/i-need-a-good-podcast-catcher-and-a-bit-of-a-rant/</link><pubDate>Sat, 15 Jun 2013 16:35:00 +0000</pubDate><guid>https://owl.billpg.com/i-need-a-good-podcast-catcher-and-a-bit-of-a-rant/</guid><description>&lt;p&gt;I listen to podcasts on my daily commute. These are radio shows that can be downloaded over the internet and listened to later. However, to keep up with a weekly show, I’d have to - every week - visit the show&amp;rsquo;s website and manually download the latest episode. That would get real tedious real fast. To resolve the tedium for us all, the podcast catcher app was invented.&lt;/p&gt;
&lt;p&gt;Podcast catchers allow me to list all the shows I want to listen to. Every day or so, it automatically checks each show on the list to see there are any new episodes for me. If it finds any, it downloads them and plays them for me.&lt;/p&gt;</description></item><item><title>PHP - Some strings are more equal than others</title><link>https://owl.billpg.com/php-some-strings-are-more-equal-than-others/</link><pubDate>Sun, 29 Apr 2012 21:33:00 +0000</pubDate><guid>https://owl.billpg.com/php-some-strings-are-more-equal-than-others/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;
&lt;img src="https://owl.billpg.com/images/Equal_in_stature_by_Kevin_Dooley-218x300.jpg" data-border="0" width="232" height="320" /&gt;
&lt;/div&gt;
&lt;p&gt;You may have recently read about the PHP programming language, when it was found that if you compare the two strings &lt;code&gt;&amp;quot;922337203685477580&lt;/code&gt;&lt;strong&gt;&lt;code&gt;7&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;922337203685477580&lt;/code&gt;&lt;strong&gt;&lt;code&gt;8&lt;/code&gt;&lt;/strong&gt;&lt;code&gt;&amp;quot;&lt;/code&gt; with the &lt;code&gt;==&lt;/code&gt; operator, PHP will report these as identical. Most of the time PHP does the right thing, but you need to be careful about these exceptions to the rule.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bugs.php.net/bug.php?id=54547"&gt;This was reported as a bug to the people who maintain PHP&lt;/a&gt;, but they responded that regarding these two strings as equal was really the correct thing to do. Programmers who feel these two strings should be treated as different should instead use the &lt;code&gt;===&lt;/code&gt; operator. This operator checks if two strings are equal, but this time, means it!&lt;/p&gt;</description></item><item><title>Clever and totally pointless - my first publication</title><link>https://owl.billpg.com/clever-and-totally-pointless-my-first-publication/</link><pubDate>Fri, 24 Jun 2011 20:28:00 +0000</pubDate><guid>https://owl.billpg.com/clever-and-totally-pointless-my-first-publication/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="https://owl.billpg.com/images/Reading_a_magazine_by_ZaCky-300x200.jpg" data-border="0" width="200" height="133" /&gt;
&lt;/div&gt;
&lt;p&gt;Way back in the early 90s, I subscribed to a magazine (think of it like a big website but printed on paper and sent through the post) called &lt;strong&gt;‘PC Plus’&lt;/strong&gt;. It included a section called “Wilf’s Programmers Workshop” where every month, Mr Wilf Hey would present a project (usually written in GW-Basic) and discuss the principles at work. It was here where I first managed to get something clever into print, except I didn’t do it quite right.&lt;/p&gt;</description></item><item><title>Vinegar - refined Vigenère - can you break my cipher?</title><link>https://owl.billpg.com/vinegar-refined-vigenere-can-you-break-my-cipher/</link><pubDate>Sat, 12 Feb 2011 16:32:00 +0000</pubDate><guid>https://owl.billpg.com/vinegar-refined-vigenere-can-you-break-my-cipher/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;
&lt;img src="https://owl.billpg.com/images/s200_4753829490_07cd82e76d_b.jpg" data-border="0" width="176" height="200" /&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;m idly interested in cryptography, the art of scrambling a message so that it can be transmitted securely, and only someone with the magic key can understand the message.&lt;/p&gt;
&lt;p&gt;When I was young, I designed a cryptographic algorithm. I thought I was so clever, but just because *I* couldn&amp;rsquo;t break it, that doesn&amp;rsquo;t make it secure.&lt;/p&gt;
&lt;p&gt;In this article, I present my naive cryptographic algorithm. It&amp;rsquo;s very flawed, so please don&amp;rsquo;t use it for anything important. Can you find the flaw?&lt;/p&gt;</description></item><item><title>The cult of 140</title><link>https://owl.billpg.com/the-cult-of-140/</link><pubDate>Wed, 09 Feb 2011 23:02:00 +0000</pubDate><guid>https://owl.billpg.com/the-cult-of-140/</guid><description>&lt;p&gt;Apparently, women don&amp;rsquo;t understand the offside rule. At least that&amp;rsquo;s according to some TV sports pundit who lost his job recently.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t really understand the offside rule either, so I wrote this on my facebook page in response to the news.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The key to understanding the offside rule is that it doesn&amp;rsquo;t really matter what the rule is.&lt;/p&gt;
&lt;p&gt;Make up any old rubbish, like &amp;ldquo;Goal keepers must be pipe smokers&amp;rdquo; and call that the offside rule. It is just as meaningful.&lt;/p&gt;</description></item><item><title>Digital photography is not rocket science. It just seems that way.</title><link>https://owl.billpg.com/digital-photography-is-not-rocket/</link><pubDate>Sun, 26 Sep 2010 21:03:00 +0000</pubDate><guid>https://owl.billpg.com/digital-photography-is-not-rocket/</guid><description>&lt;p&gt;Here&amp;rsquo;s a TV advert for a camera touting the benefits of film cameras over digital cameras. I&amp;rsquo;m almost inclined to wonder if this advert is a parody, but even so, it has a point. Let&amp;rsquo;s watch&amp;hellip;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/dvu2QPQLlYA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;p&gt;&lt;img src="https://owl.billpg.com/images/s200_3393637392_fb004b0686_b.jpg" data-align="right" data-border="0" width="200" height="200" /&gt;&lt;strong&gt;Photography for technophobes.&lt;/strong&gt; I&amp;rsquo;m reminded of when I was lending my digital camera to a friend some time ago. She knew how to use a film camera, but the technological revolution had, alas, left her behind. She had no problem with the LCD display on the back. This was why she wanted to borrow &lt;em&gt;my&lt;/em&gt; camera in the first place after she saw me using it. Taking a picture while holding the camera at arms length is a lot easier than holding it up to the eye. Showing her how to browse old pictures took a bit of teaching but she soon picked it up. It helped a lot that this camera had a big switch with only two settings; taking-pictures or looking-at-pictures. The big stumbling point was when I showed her how to use memory cards. I tried to explain how it stores pictures, but I got a lot of blank looks. I finally said &amp;ldquo;This card is like the film.&amp;rdquo; There was a sudden look of understanding on her face. The analogy to traditional film cameras worked perfectly. I told her that the photo shops will develop (print) her pictures, produce negatives (make a CD copy) and clean the film off to be reused again. If she needed more film, she could buy some by asking for a &amp;ldquo;128 MB SD&amp;rdquo; at the shops (which might tell you when this story took place). &lt;img src="https://owl.billpg.com/images/s200_3972007032_fb2c2d9265_b.jpg" data-align="right" data-border="0" width="200" height="131" /&gt;&lt;strong&gt;Embrace the metaphor!&lt;/strong&gt; Film cameras are devices that direct photon particles in order to induce chemical reactions in silver halide particles mounted on sheets of cellulose acetate. Somehow, the camera industry managed to sell us cameras without having to give us chemistry lessons first. And yet, we all need computer science lessons to use digital cameras. People never really cared about the chemical processes of film photography and we shouldn&amp;rsquo;t have to care about bits, megabytes and other pieces of jargon that can be abstracted away. So, here are my suggestions for the digital camera industry. &lt;em&gt;1. Standardise!&lt;/em&gt; Why are there so many memory card formats? As far as I can tell, they&amp;rsquo;re all flash memory chips contained in differently shaped blobs of plastic. The industry needs to pick one shape of blob and stick with it. No inventing new blobs unless there&amp;rsquo;s a really good reason to. &lt;em&gt;2. Call memory cards, &amp;lsquo;digital film&amp;rsquo;.&lt;/em&gt; Embrace all the metaphors. If the world already has a name for something, don&amp;rsquo;t come up with a different name for it. &lt;em&gt;3. Tell me how many pictures it can store, not how many gigabytes.&lt;/em&gt; This one will be tricky, as the size of a picture depends on the number of pixels. So while I don&amp;rsquo;t think we &lt;em&gt;could&lt;/em&gt; realistically get rid of the &amp;ldquo;GB&amp;rdquo;, cameras need to help the user by telling us how many pictures are in a &amp;ldquo;GB&amp;rdquo; at that particular time. &lt;em&gt;4. Cameras should come with a reasonably sized card as standard.&lt;/em&gt; How would you feel if you bought a camera, but later found the lens was extra? Digital film (getting used to the phrase yet?) is reusable and will probably last as long as the camera itself. So why not bundle it with the camera and save your customers the hassle. &lt;em&gt;5. Photo printing shops to provide archival DVDs as a standard part of the service.&lt;/em&gt; People using film cameras expected their negatives as part of the service. Copying a few gigabytes full of pictures to a DVD should be cheap enough that it could be offered free to anyone who wants to print a vacation&amp;rsquo;s worth of snaps. Hang on, did that advert just say &lt;em&gt;two&lt;/em&gt; cameras for &lt;em&gt;ten dollars&lt;/em&gt;? Forget everything I just wrote, that&amp;rsquo;s a bargain!&lt;/p&gt;</description></item><item><title>Construct something else! (C#)</title><link>https://owl.billpg.com/construct-something-else-c/</link><pubDate>Sun, 12 Sep 2010 11:34:00 +0000</pubDate><guid>https://owl.billpg.com/construct-something-else-c/</guid><description>&lt;p&gt;&lt;em&gt;Please read my &lt;a href="https://owl.billpg.com/redditd-followup-to-construct-something-else/"&gt;follow-up post&lt;/a&gt; after reading this one.&lt;/em&gt; &lt;img src="https://owl.billpg.com/images/s200_1052409181_82fefcfd49_b.jpg" data-align="right" data-border="0" width="160" height="200" /&gt;Quoth &lt;a href="http://stackoverflow.com/users/283212/rjw"&gt;rjw&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/2352259/can-constructor-return-a-subclass"&gt;on stackoverflow&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given the following client code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    var obj = new Class1();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Is there any way to modify the constructor of Class1 so that it will actually return a subclass (or some other alternate implementation) instead?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C# compiler guru, &lt;a href="http://blogs.msdn.com/b/ericlippert/"&gt;Eric Lippert&lt;/a&gt; commented&amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We are considering adding a feature &amp;ldquo;extension new&amp;rdquo; which would essentially allow you to make a static factory method that would be called when the &amp;ldquo;new&amp;rdquo; operator is used, much as extension methods are called when the &amp;ldquo;.&amp;rdquo; operator is used. It would be a nice syntactic sugar for the factory. If you have a really awesome scenario where this sort of pattern would be useful, I&amp;rsquo;d love to see an example.&lt;/p&gt;</description></item><item><title>Google snooping WiFi? Don't panic! Don't panic!</title><link>https://owl.billpg.com/google-snooping-wifi-dont-panic-dont-panic/</link><pubDate>Sat, 22 May 2010 21:40:00 +0000</pubDate><guid>https://owl.billpg.com/google-snooping-wifi-dont-panic-dont-panic/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="https://owl.billpg.com/images/s320_4531337932_e7e9a14b4f_b.jpg" data-border="0" width="320" height="240" /&gt;
&lt;/div&gt;
&lt;p&gt;Google have got into a bit of hot water when it emerged that while their cars drove around taking pictures for their &lt;em&gt;Street View&lt;/em&gt; service, they collected and stored people’s private WiFi traffic. People have understandably got angry with Google for doing this, but I think some demystification is in order.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did they collect &lt;em&gt;my&lt;/em&gt; private data?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your WiFi access point uses WPA with a good pass-key, don’t worry. Your network traffic is encrypted and is just noise without that pass-key.&lt;/p&gt;</description></item><item><title>Wishing for a destructor (C#)</title><link>https://owl.billpg.com/wishing-for-a-destructor-c/</link><pubDate>Sun, 28 Mar 2010 16:13:00 +0000</pubDate><guid>https://owl.billpg.com/wishing-for-a-destructor-c/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;
&lt;p&gt;&lt;img src="https://owl.billpg.com/images/s200_3251000099_59e269af6b_b.jpg" data-border="0" width="133" height="200" /&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;I like the C# programming language. It feels like C++ done right, divesting itself of much of the C legacy that complicates matters so much. When I do programming, I prefer to use this language. Having to go back and deal with C++ just doesn&amp;rsquo;t give me that warm feeling like it used to.&lt;/p&gt;
&lt;p&gt;But, I have a pet peeve that I miss from C++.&lt;/p&gt;</description></item><item><title>is, then as (C#)</title><link>https://owl.billpg.com/is-then-as-c/</link><pubDate>Mon, 07 Dec 2009 21:11:00 +0000</pubDate><guid>https://owl.billpg.com/is-then-as-c/</guid><description>&lt;div style="clear: both; text-align: center;"&gt;
&lt;p&gt;&lt;a href="http://www.flickr.com/photos/preef/114158003/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img src="https://owl.billpg.com/images/s200_fruit-stack.jpg" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The C# language has a pair of related operators, &lt;strong&gt;is&lt;/strong&gt; and &lt;strong&gt;as&lt;/strong&gt;. Say you have an object, &lt;em&gt;x&lt;/em&gt;, and you want to know if its really type &lt;em&gt;Form&lt;/em&gt; underneath.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(x is Form)&lt;/strong&gt; will &lt;em&gt;be true&lt;/em&gt; if it is, or &lt;em&gt;false&lt;/em&gt; if it isn&amp;rsquo;t. The &lt;strong&gt;as&lt;/strong&gt; operator will actually perform the conversion, returning &lt;em&gt;null&lt;/em&gt; if it can&amp;rsquo;t be converted to that type.&lt;/p&gt;</description></item></channel></rss>