<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>billpg industries™</title><link>https://sage-wave-ring.my.statichost.uk/</link><description>Recent content on billpg industries™</description><generator>Hugo</generator><language>en-us</language><copyright>© Bill Godfrey.</copyright><lastBuildDate>Sat, 05 Sep 2026 14:41:07 +0000</lastBuildDate><atom:link href="https://sage-wave-ring.my.statichost.uk/index.xml" rel="self" type="application/rss+xml"/><item><title>I Wrote a NuGet Package!</title><link>https://sage-wave-ring.my.statichost.uk/i-wrote-a-nuget-package/</link><pubDate>Sat, 05 Sep 2026 14:41:07 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/am-i-worried-ai-will-take-my-job/</link><pubDate>Sat, 18 Jul 2026 08:41:28 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/8086-segmented-memory-was-a-good-idea-almost/</link><pubDate>Sun, 21 Jun 2026 13:41:55 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/on-no-ive-invented-svg-badly/</link><pubDate>Fri, 29 May 2026 05:21:11 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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>Notes from a Helpful Glober — “Stationary”</title><link>https://sage-wave-ring.my.statichost.uk/notes-from-a-helpful-glober-stationary/</link><pubDate>Tue, 12 May 2026 16:50:32 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/notes-from-a-helpful-glober-stationary/</guid><description>&lt;p&gt;Dear flat earthers,&lt;/p&gt;
&lt;p&gt;You might not realise it, but I do genuinely want to help you. I grew up in an environment where you question everything and take no one’s word for it, so I understand the instinct. I am a glober, but I don’t think you’re stupid — I just think you’re wrong. But this isn’t about that.&lt;/p&gt;
&lt;p&gt;I’ve noticed something in your messaging that could use a little clarification.&lt;/p&gt;</description></item><item><title>Hearthfire Part One: Lighting the Flame</title><link>https://sage-wave-ring.my.statichost.uk/hearthfire-part-one-lighting-the-flame/</link><pubDate>Fri, 08 May 2026 18:54:20 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2026/02/Cat_on_Laptop_by_Doug_Woods-300x225.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>Let's Measure Gravity!</title><link>https://sage-wave-ring.my.statichost.uk/lets-measure-gravity/</link><pubDate>Tue, 21 Apr 2026 18:53:09 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/lets-measure-gravity/</guid><description>&lt;p&gt;When I was in high school, we measured Earth’s gravity. This number is known as &amp;ldquo;g&amp;rdquo;, or sometimes &amp;ldquo;little g&amp;rdquo; to distinguish it from &amp;ldquo;big G&amp;rdquo; which is something else.&lt;/p&gt;
&lt;p&gt;This is an &lt;strong&gt;acceleration&lt;/strong&gt;, or the rate of change of speed over time. The number is in units of meters-per-second-per-second, which means starting from rest and going at a constant acceleration, after one second you&amp;rsquo;ll be going at some number of meters-per-second. Another second after that you&amp;rsquo;ll be going twice as fast.&lt;/p&gt;</description></item><item><title>2001: A TV Series</title><link>https://sage-wave-ring.my.statichost.uk/2001-a-tv-series/</link><pubDate>Sat, 04 Apr 2026 17:47:38 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/2001-a-tv-series/</guid><description>&lt;p&gt;What if &lt;strong&gt;2001: A Space Odyssey&lt;/strong&gt; was a TV series?&lt;/p&gt;
&lt;p&gt;(If you&amp;rsquo;ve not seen the movie, Spoilers! Also none of this post will make any sense without knowing the movie. But mostly spoilers.)&lt;/p&gt;
&lt;h2 id="episode-1-the-signal"&gt;Episode 1: The Signal&lt;/h2&gt;
&lt;h3 id="cold-open"&gt;Cold Open&lt;/h3&gt;
&lt;p&gt;A silent, eerie shot of the buried lunar monolith, half‑revealed by excavation lights. No explanation. Cut to black.&lt;/p&gt;
&lt;h3 id="main-plot"&gt;Main Plot&lt;/h3&gt;
&lt;p&gt;Dr. Heywood Floyd travels to Space Station V amid growing secrecy and political tension. His briefing on the lunar discovery hints at something ancient and potentially dangerous.&lt;/p&gt;</description></item><item><title>"All files are numbers"</title><link>https://sage-wave-ring.my.statichost.uk/all-files-are-numbers/</link><pubDate>Fri, 27 Mar 2026 17:46:42 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/all-files-are-numbers/</guid><description>&lt;p&gt;You hear this a lot. Someone wants to make a point about censorship, cryptography, or the futility of banning a particular blob of data. The argument goes like this: a file is just a sequence of 1s and 0s, and numbers are also sequences of 1s and 0s when written in binary. Therefore, banning a file is like banning a number. What next? Will the government outlaw 85?&lt;/p&gt;
&lt;p&gt;It’s a neat rhetorical trick. But every time I see it, I wince just a little, because here’s the awkward truth&amp;hellip;&lt;/p&gt;</description></item><item><title>The Short History of a Very Confused Plant Pot</title><link>https://sage-wave-ring.my.statichost.uk/the-short-history-of-a-very-confused-plant-pot/</link><pubDate>Tue, 17 Mar 2026 20:25:39 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/the-short-history-of-a-very-confused-plant-pot/</guid><description>&lt;p&gt;Years ago, I was watching a feel‑good segment on the local news about a garden centre that had launched a recycling scheme for their used plastic plant pots. Customers were encouraged to bring back the empties once they’d transplanted their new purchases into the garden. A wholesome little initiative, I thought.&lt;/p&gt;
&lt;p&gt;My warm glow lasted about thirty seconds.&lt;/p&gt;
&lt;p&gt;In my head, those pots were being returned to the supplier, washed, de‑labelled, and stacked up ready for another round of seedlings. A simple loop. A sensible loop.&lt;/p&gt;</description></item><item><title>"Too Clever By Half"</title><link>https://sage-wave-ring.my.statichost.uk/too-clever-by-half/</link><pubDate>Tue, 03 Mar 2026 19:29:01 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/too-clever-by-half/</guid><description>&lt;figure class="wp-block-image aligncenter size-full"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2026/03/Too-Clever-By-Half.png" class="wp-image-1429" /&gt;
&lt;figcaption&gt;Wilf's Programmers' Workshop, PC Plus, November, 1991.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This was my first ever publication. Wilf Hey, writer of the &lt;strong&gt;Programmers’ Workshop&lt;/strong&gt; column in PC Plus, had run a contest to write what we’d now call a &lt;em&gt;quine&lt;/em&gt;, but which he described as a “self‑creating program”, one that tells you what it does by producing its own source.&lt;/p&gt;
&lt;p&gt;By coincidence, I had just been experimenting with PKZIP’s ability to create self‑extracting EXE files. ZIP archives fused with the decompressor into a single executable. It occurred to me that if I took a few liberties with the definition of “programming language”, I could use that mechanism to produce a rather cheeky entry.&lt;/p&gt;</description></item><item><title>Let's All Burn Our Waste Paper!</title><link>https://sage-wave-ring.my.statichost.uk/lets-all-burn-our-waste-paper/</link><pubDate>Mon, 02 Mar 2026 17:31:40 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/lets-all-burn-our-waste-paper/</guid><description>&lt;p&gt;In these environmentally conscious times, we are constantly exhorted to recycle. This is a tedious ritual involving coloured bins, soggy cardboard and the faint smell of moral superiority. Yet I submit that recycling is, in fact, the least responsible thing we could do with our waste paper.&lt;/p&gt;
&lt;p&gt;Instead, I propose a bold, innovative, and unquestionably sustainable alternative.&lt;/p&gt;
&lt;p&gt;Burn it. All of it. Immediately. Preferably with gusto.&lt;/p&gt;
&lt;figure class="wp-block-gallery has-nested-images columns-default is-cropped"&gt;
&lt;figure class="wp-block-image aligncenter size-medium"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2026/02/1000001808-300x225.jpg" class="wp-image-1383" /&gt;
&lt;figcaption&gt;"He's kinda sexy and mysterious about it. Hot eyes, all my judgement is clouded. I'm in your city, can you show me round it? You can put your money right where my mouth is."&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;ldquo;But burning paper releases CO₂!&amp;rdquo; you cry. But here is the true genius of the plan.&lt;/p&gt;</description></item><item><title>Gravity on a Flat Earth? Notes from a Helpful Glober.</title><link>https://sage-wave-ring.my.statichost.uk/gravity-on-a-flat-earth-notes-from-a-helpful-glober/</link><pubDate>Tue, 24 Feb 2026 20:52:43 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/gravity-on-a-flat-earth-notes-from-a-helpful-glober/</guid><description>&lt;p&gt;Lately, I&amp;rsquo;ve been posting in flat earth social media, mostly asking why ships appear to sink behind the horizon when they sail away. Why? Because of &lt;a href="https://xkcd.com/386/" target="_blank" rel="noreferrer noopener"&gt;XKCD number 386&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing I’ve noticed is the flat‑earther&amp;rsquo;s need to deny gravity. I’m not sure why because gravity is one of the easiest things to demonstrate. You drop something, it falls towards the ground instead of hanging in mid-air. That’s it.&lt;/p&gt;
&lt;p&gt;Flat earthers seem to tie themselves in knots trying to replace gravity. They&amp;rsquo;ll invoke buoyancy without realising that it depends on gravity to work. They&amp;rsquo;ll invoke electrostatic forces which doesn&amp;rsquo;t depend on gravity but breaks down when you ask where the like-charges-repel effect has gone.&lt;/p&gt;</description></item><item><title>The Road Not Taken: A World Where IPv4 Evolved</title><link>https://sage-wave-ring.my.statichost.uk/ipv4x/</link><pubDate>Tue, 10 Feb 2026 22:14:52 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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 Part Two - A Security Analysis</title><link>https://sage-wave-ring.my.statichost.uk/sixgate-part-two-a-security-analysis/</link><pubDate>Thu, 05 Feb 2026 20:01:40 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/sixgate-part-two-a-security-analysis/</guid><description>&lt;p&gt;&lt;a href="https://owl.billpg.com/sixgate/" data-type="post" data-id="1178"&gt;Part One - What is SixGate?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In brief, if a client with IPv4 only wishes to connect to an IPv6‑only service, SixGate bridges the gap by looking up a special SRV record in the service’s &lt;code&gt;ip6.arpa&lt;/code&gt; zone, normally used for reverse‑DNS. This record points to a gateway service provided by the operator of that IPv6 network. Using that gateway, any machine that only has IPv4 can connect to the world of IPv6 — all working silently, without the user needing to know what’s going on.&lt;/p&gt;</description></item><item><title>Sixgate - IPv6 Without Leaving Anyone Behind</title><link>https://sage-wave-ring.my.statichost.uk/sixgate/</link><pubDate>Thu, 29 Jan 2026 19:14:42 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/pythons-truthiness-a-code-smell-worth-sniffing/</link><pubDate>Mon, 17 Nov 2025 18:20:51 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/the-expanding-universe-of-unicode/</link><pubDate>Mon, 10 Nov 2025 19:40:40 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/rufus-an-adventure-in-downloading/</link><pubDate>Mon, 20 Oct 2025 07:17:17 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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>The UKIP Effect - How to Win by Not Winning</title><link>https://sage-wave-ring.my.statichost.uk/the-ukip-effect/</link><pubDate>Wed, 08 Oct 2025 17:58:44 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/the-ukip-effect/</guid><description>&lt;p&gt;UKIP, the British political party, is a failure.&lt;/p&gt;
&lt;p&gt;Since their launch in the 90s, their peak of power was &lt;strong&gt;two&lt;/strong&gt; members of parliament but now have none. Their most prominent party leader, who you might reasonably expect to be the most successful, ran for election to parliament a total of seven times and won none of them. (He was since elected as an MP in 2024, long after leaving his leadership post.)&lt;/p&gt;</description></item><item><title>Dear string-to-integer parsers...</title><link>https://sage-wave-ring.my.statichost.uk/dear-string-to-integer-parsers/</link><pubDate>Tue, 29 Jul 2025 17:11:17 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2025/07/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://sage-wave-ring.my.statichost.uk/what-type-of-uuid-should-i-use/</link><pubDate>Thu, 17 Apr 2025 17:29:32 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/i-want-a-less-powerful-programming-language-for-christmas/</link><pubDate>Wed, 12 Feb 2025 21:44:24 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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>Why do we repeatedly hash passwords in a loop?</title><link>https://sage-wave-ring.my.statichost.uk/why-do-we-repeatedly-hash-passwords-in-a-loop/</link><pubDate>Tue, 28 Mar 2023 16:49:34 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/why-do-we-repeatedly-hash-passwords-in-a-loop/</guid><description>&lt;p&gt;If you&amp;rsquo;re building a website that allows the pubic to log-in, you need to store your passwords so you can check your users are who they say they are when logging-in. This is my introduction to the current state of the art for storing your users&amp;rsquo; passwords in your database.&lt;/p&gt;
&lt;h2 id="make-it-someone-elses-problem"&gt;Make It Someone Else&amp;rsquo;s Problem&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ll say this right up front, the best way is to get someone else to do it. Use an outsourced service or install a component that deals with the whole thing. You&amp;rsquo;ll have passed responsibility to someone who&amp;rsquo;s very speciality is already knowing everything I&amp;rsquo;ve written here, as well as all the nuances I&amp;rsquo;ve skipped over.&lt;/p&gt;</description></item><item><title>What's a kWh? (And other money-saving tips)</title><link>https://sage-wave-ring.my.statichost.uk/whats-a-kwh-and-other-money-saving-tips/</link><pubDate>Fri, 09 Dec 2022 19:21:30 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/whats-a-kwh-and-other-money-saving-tips/</guid><description>&lt;p&gt;When I was at school, they taught us how electricity works only as part of science lessons. It was something future engineers might need, yet we all use electricity at home every day.&lt;/p&gt;
&lt;p&gt;The problem with electricity is we&amp;rsquo;re a little bit separated from its cost. With cars, we fill up the car with fuel and pay for it right there and then. With electricity, we use many different appliances which all add up to an eye-watering bill at the end of the month.&lt;/p&gt;</description></item><item><title>You don't have to wear a blazer to school on a hot day!</title><link>https://sage-wave-ring.my.statichost.uk/blazer/</link><pubDate>Mon, 18 Jul 2022 16:57:13 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/blazer/</guid><description>&lt;p&gt;Remember, if you&amp;rsquo;re going to school on a hot day, you can leave your blazer at home if it&amp;rsquo;s normally part of your uniform.&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter size-medium"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2022/07/BlazerPocketByKaye-300x225.jpg" class="wp-image-578" /&gt;
&lt;figcaption&gt;"When you say bronze doesn't need to be chipped, my questions is this, doesn't it?"&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Teachers who insist that you wear a blazer on hot days can be ignored. They have a callous disregard for the discomfort caused by excess thick layers in hot weather and such callousness does not deserve respect.&lt;/p&gt;</description></item><item><title>My adventure into self web-hosting (Part 1)</title><link>https://sage-wave-ring.my.statichost.uk/web-hosting-1/</link><pubDate>Fri, 25 Mar 2022 20:20:41 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://billpg.com/incredibly-stupid-diary/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>My Incredibly Stupid Diary</title><link>https://sage-wave-ring.my.statichost.uk/incredibly-stupid-diary/</link><pubDate>Fri, 18 Mar 2022 19:06:05 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/incredibly-stupid-diary/</guid><description>&lt;p&gt;&lt;a href="https://billpg.com/incredibly-stupid-diary/2004/11/lets-try-that-again.html" data-type="URL" data-id="https://owl.billpg.com/incredibly-stupid-diary/2004/11/lets-try-that-again.html" target="_blank" rel="noreferrer noopener"&gt;🥇First Entry&lt;/a&gt;&lt;br&gt;
&lt;a href="https://billpg.com/incredibly-stupid-diary/random" data-type="URL" data-id="https://owl.billpg.com/incredibly-stupid-diary/random" target="_blank" rel="noreferrer noopener"&gt;⚾ Random Entry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Years ago, 2004 to 2007, I had a website. It was mildly popular - I counted the number of readers and found I had eleven regulars. I called it &amp;ldquo;The Incredibly Stupid Diary of Bill&amp;rdquo;, although I added a few friends as writers and &amp;ldquo;of Bill&amp;rdquo; very soon became &amp;ldquo;of Bill et al&amp;rdquo;.&lt;/p&gt;
&lt;figure class="wp-block-image size-large"&gt;
&lt;img src="https://billpg.com/incredibly-stupid-diary/images/banner-sept06-b.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;I occasionally posted long form pieces, but mostly it was quick-and-short stuff that these days I would post to &lt;a href="https://facebook.com/billpg" rel="noreferrer noopener" target="_blank"&gt;Facebook&lt;/a&gt; or &lt;a href="https://twitter.com/billpg" rel="noreferrer noopener" target="_blank"&gt;Twitter&lt;/a&gt;. I used Blogger before it was BlogSpot. Back then, it worked by connecting to my web server and uploading HTML files over FTP. I&amp;rsquo;d leave my password configured with Blogger so that in case anyone commented, they could update the page with the comment without having to wait for me to allow it.&lt;/p&gt;</description></item><item><title>Data-Mining Wikipedia for Fun and Profit</title><link>https://sage-wave-ring.my.statichost.uk/data-mining-wikipedia/</link><pubDate>Tue, 06 Jul 2021 18:59:54 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/pop3-didnt-make-it/</link><pubDate>Thu, 29 Apr 2021 17:09:39 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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-core/" 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>Farewell, Hackensplat Industries!</title><link>https://sage-wave-ring.my.statichost.uk/hackensplat/</link><pubDate>Fri, 23 Apr 2021 16:00:29 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/hackensplat/</guid><description>&lt;p&gt;2009, I registered &amp;ldquo;hackensplat.com&amp;rdquo;. A friend of mine called me &amp;ldquo;Wilhelm von Hackensplat&amp;rdquo; as a joke after my rather loud sneezes. It was about this time I decided to start writing about software development and technology. I liked the idea of having an alter ego. I pictured him as an evil genius, Baron von Hackensplat, and so hackensplat.com was born, an evil genius writing about his evil technologies.&lt;/p&gt;
&lt;p&gt;That was the idea, but it never really took off in my mind. I would have an idea to write about something but it wouldn&amp;rsquo;t really lend itself to the evil genius persona. As time passed I would got bored with the alter ego and gave up writing for the character, instead just writing as myself. I later changed the name of the website to &amp;ldquo;Hackensplat Industries&amp;rdquo;, mainly so I could keep the name.&lt;/p&gt;</description></item><item><title>POP3 - Delete Immediately</title><link>https://sage-wave-ring.my.statichost.uk/pop3-deli/</link><pubDate>Wed, 07 Apr 2021 18:03:51 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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-core/" 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://sage-wave-ring.my.statichost.uk/pop3-write-your-own/</link><pubDate>Fri, 26 Mar 2021 18:31:19 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/pop3-message-ids/</link><pubDate>Mon, 22 Mar 2021 19:57:42 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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-refr/" 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://sage-wave-ring.my.statichost.uk/pop3-commit-refresh/</link><pubDate>Mon, 22 Mar 2021 19:08:48 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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>Why the UK should re-join the EU.</title><link>https://sage-wave-ring.my.statichost.uk/why-the-uk-should-re-join-the-eu/</link><pubDate>Wed, 30 Dec 2020 17:59:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/why-the-uk-should-re-join-the-eu/</guid><description>&lt;p&gt;I advocate for the UK to democratically re-join the EU. &lt;em&gt;Without shame or apology.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="we-cant-re-join-there-was-a-referendum"&gt;&amp;ldquo;We can&amp;rsquo;t re-join, there was a referendum!&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;There was indeed. The referendum said the UK should leave the EU. On the 31st of January 2020, it left.&lt;/p&gt;
&lt;p&gt;The referendum did not say &amp;ldquo;The UK should leave the EU and stay out forever&amp;rdquo;. It didn&amp;rsquo;t even give a minimum number of years. I checked the wording on the ballot paper just to be sure. It prescribed a single action and that action has been done.&lt;/p&gt;</description></item><item><title>POP3 - UIDL is a required command!</title><link>https://sage-wave-ring.my.statichost.uk/pop3-uidl/</link><pubDate>Thu, 17 Dec 2020 20:06:55 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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>The Brexit Chart War</title><link>https://sage-wave-ring.my.statichost.uk/the-brexit-chart-war/</link><pubDate>Thu, 30 Jan 2020 15:23:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/the-brexit-chart-war/</guid><description>&lt;p&gt;There&amp;rsquo;s a movement among remainers to get Ode To Joy to number one in the charts for Brexit day. We know, even if successful, it won&amp;rsquo;t change anything. Johnson isn&amp;rsquo;t going to cancel Brexit because of this. (He totally should, nonetheless.)&lt;/p&gt;
&lt;p&gt;So why is there a similar movement among Brexiters to get their own song “Seventeen Million F&amp;ndash;k Offs” to number one instead?&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;ve won. Despite only getting about half the votes in 2016, Maximum Brexit is going ahead. But once the party&amp;rsquo;s over, they still won&amp;rsquo;t be happy and deep down, they know. Victory feels so much like defeat.&lt;/p&gt;</description></item><item><title>Brexit - Is that it?</title><link>https://sage-wave-ring.my.statichost.uk/brexit-is-that-it/</link><pubDate>Mon, 20 Jan 2020 18:42:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/brexit-is-that-it/</guid><description>&lt;p&gt;So it&amp;rsquo;s finally Brexit Day. After many repeated delays and false starts, &lt;strong&gt;Brexit is here!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s that? You&amp;rsquo;ve just posted that the sun is shining and the birds are singing?&lt;/p&gt;
&lt;p&gt;Oh I see, you&amp;rsquo;re happy that we&amp;rsquo;re not in some apocalyptic doom. Brexit was &lt;em&gt;supposed&lt;/em&gt; to cause the earth to split open and a literal hell on earth was about to envelop us all for a thousand years! Turns out, no, that didn&amp;rsquo;t happen.&lt;/p&gt;</description></item><item><title>Should MPs who "cross the floor" face a by-election?</title><link>https://sage-wave-ring.my.statichost.uk/should-mps-who-cross-the-floor-face-a-by-election/</link><pubDate>Wed, 13 Nov 2019 22:36:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/should-mps-who-cross-the-floor-face-a-by-election/</guid><description>&lt;p&gt;When standing for election a politician will usually run as the member of a political party. The quid-pro-quo of this arrangement is that the party will collectively campaign for all their candidates. In return, the party will expect the successfully elected MPs to support their leader&amp;rsquo;s policies and support that leader in any votes-of-confidence.&lt;/p&gt;
&lt;div align="center"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2019/11/Leaving_Home_by_Hans_Splinter-300x200.jpg" data-original-height="533" data-original-width="799" width="320" height="213" /&gt;
&lt;/div&gt;
&lt;p&gt;Occasionally, an MP will decide to leave their party. This is often called “Crossing The Floor” for rather archaic reasons. Sometimes that MP becomes independent, sometimes they join other parties. Most famously, wartime leader Winston Churchill left the Conservative Party in 1904 to join the Liberal Party, only to return in 1924.&lt;/p&gt;</description></item><item><title>A flag for Milton Keynes</title><link>https://sage-wave-ring.my.statichost.uk/mkflag/</link><pubDate>Thu, 26 Sep 2019 19:19:18 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/mkflag/</guid><description>&lt;p&gt;I wrote this page before I found out that Milton Keynes City Council has held a flag design contest for children and already selected their new flag. This page is for the historic record.&lt;/p&gt;
&lt;div align="center"&gt;&lt;embed type="text/html" src="https://krikienoid.github.io/flagwaver/#?src=https%3A%2F%2Fbillpg.com%2FImages%2FMKFlagForWaver.php&amp;background=blue-sky" width="97%" height="600" /&gt;&lt;/div&gt;
&lt;p&gt;Congratulations &lt;a href="https://www.bbc.co.uk/news/uk-england-beds-bucks-herts-61506835" rel="noreferrer noopener" target="_blank"&gt;Milton Keynes on your new City status&lt;/a&gt;. All self respecting cities need a flag. London, Coventry, St Albans all have really good ones. You should have one too.&lt;/p&gt;
&lt;p&gt;Having worked in Milton Keynes for over a decade, I was surprised to learn that Milton Keynes don&amp;rsquo;t have a flag. I was attending an event organised by a local group and they were using the &amp;ldquo;swan&amp;rdquo; flag of Buckinghamshire. This prompted me to set to work on a design.&lt;/p&gt;</description></item><item><title>Dear WordPress. Please stop using MySQL.</title><link>https://sage-wave-ring.my.statichost.uk/dear-wordpress-please-stop-using-mysql/</link><pubDate>Thu, 20 Jun 2019 18:56:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/dear-wordpress-please-stop-using-mysql/</guid><description>&lt;p&gt;&lt;img src="https://owl.billpg.com/wp-content/uploads/2019/06/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>#DeniedMyVote at the 2019 European Elections</title><link>https://sage-wave-ring.my.statichost.uk/deniedmyvote-at-the-2019-european-elections/</link><pubDate>Fri, 24 May 2019 18:04:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/deniedmyvote-at-the-2019-european-elections/</guid><description>&lt;p&gt;You may have read about the news that many voters have been turned away from voting over here in the UK. I&amp;rsquo;d like to share a little analogy abut what happened, why it is so controversial and how it goes beyond voter suppression.&lt;/p&gt;
&lt;p&gt;Imagine you&amp;rsquo;re in California, and there&amp;rsquo;s a political party whose only policy is to deport anyone born on the other side of the Mississippi. (That and being paid donations through PayPal that are all conveniently under the £500 limit allowed for anonymous donations. Totally not a big donation from one person that would normally need to be declared.)&lt;/p&gt;</description></item><item><title>My Crazy Software Engineer Tattoo (that I didn't get)</title><link>https://sage-wave-ring.my.statichost.uk/my-crazy-software-engineer-tattoo-that-i-didnt-get/</link><pubDate>Thu, 04 Apr 2019 17:19:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/my-crazy-software-engineer-tattoo-that-i-didnt-get/</guid><description>&lt;p&gt;I had an idea for a nerdy tattoo a few years ago. It would represent myself as a software engineer and I thought it was quite clever. I seriously considered having it done but decided against it in the end, despite its cleverness.&lt;/p&gt;
&lt;h2 id="inkd"&gt;Ink&amp;rsquo;d&lt;/h2&gt;
&lt;p&gt;This is my idea, the &amp;ldquo;end comment&amp;rdquo; symbol in many programming languages:&lt;/p&gt;
&lt;div align="center"&gt;&lt;tt style="font-size: 500%;"&gt;*/&lt;/tt&gt;&lt;/div&gt;
&lt;p&gt;In C, and other languages that can trace their lineage to C, comments start with a /* and end with a */. Anything inside is ignored by the language, allowing the programmer to describe what&amp;rsquo;s going on. This is tremendously useful when reading other people&amp;rsquo;s code or even your own code from the past.&lt;/p&gt;</description></item><item><title>What's a gallon?</title><link>https://sage-wave-ring.my.statichost.uk/whats-a-gallon/</link><pubDate>Wed, 06 Feb 2019 23:16:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/whats-a-gallon/</guid><description>&lt;p&gt;A little while ago, I wrote a post on Facebook complaining that my new car&amp;rsquo;s fuel efficiency gauge was expressed in miles per gallon. &amp;ldquo;What&amp;rsquo;s a gallon?&amp;rdquo; I asked.&lt;/p&gt;
&lt;p&gt;Over here in England, fuel has been sold by the litre for decades. Gallons are an archaic unit which no-one under 40 has ever had to deal with.&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2019/02/Damian_Gadal_the_price_you_pay.jpg" /&gt;
&lt;/figure&gt;
&lt;h2 id="unitary-council"&gt;Unitary council&lt;/h2&gt;
&lt;p&gt;Two friends very helpfully commented with conversion rates. &amp;ldquo;&lt;strong&gt;3.78&lt;/strong&gt; litres in a gallon&amp;rdquo; said one friend. &amp;ldquo;&lt;strong&gt;4.54&lt;/strong&gt; litres in a gallon&amp;rdquo; said another. While both answers were significantly different, both my friends were equally quite correct.&lt;/p&gt;</description></item><item><title>GIT isn't perfect. (And other blasphemies.)</title><link>https://sage-wave-ring.my.statichost.uk/git-isnt-perfect-and-other-blasphemies/</link><pubDate>Sun, 09 Dec 2018 11:35:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/git-isnt-perfect-and-other-blasphemies/</guid><description>&lt;p&gt;&lt;img src="https://billpg.com/Images/HeWasSuchAStupid.jpg" style="margin-left: 5px; margin-bottom: 3px;" data-align="right" /&gt; I was embarrassingly late in the game coming to GIT as a version control system. Time has since passed and I&amp;rsquo;m now happily using it. The days when we had to lock files before we worked on them are thankfully a distant memory. My road was a little bumpy&amp;hellip;&lt;/p&gt;
&lt;h2 id="orphan-git"&gt;Orphan git.&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s a new dawn, it&amp;rsquo;s a new day, it&amp;rsquo;s new version control system and I&amp;rsquo;m ready to download a project from a GIT server. The first step was to perform a &lt;strong&gt;clone&lt;/strong&gt; of a project. &amp;ldquo;Clone? That&amp;rsquo;s a strange word for it. Maybe this is just it&amp;rsquo;s own way of saying &lt;em&gt;Download&lt;/em&gt;.&amp;rdquo; Whatever you call it, my &amp;ldquo;clone&amp;rdquo; was ready and I can get to work. Later, I&amp;rsquo;ve done my work, tested it my dev-environment and I&amp;rsquo;m ready to check it in. Before I do that I need to check on any changes the others have done. Looking for a &amp;ldquo;Get Latest&amp;rdquo; option, I find &amp;ldquo;Pull&amp;rdquo;, which seems to do the right thing. Those changes don&amp;rsquo;t conflict with mine so I can continue. How do I get my changes back to the server? There&amp;rsquo;s a &amp;ldquo;push&amp;rdquo; option which sounds like it would be the opposite to pull, but that doesn&amp;rsquo;t do anything. Finally, I find &amp;ldquo;Commit&amp;rdquo; and it shows me all my changes with space to write my comments. Success! I&amp;rsquo;ve committed my changes to the master branch! Sounds final. The red icons next to the modified files have now turned green. There&amp;rsquo;s no indication there&amp;rsquo;s more to do, or at least none that&amp;rsquo;s obvious to this beginner. My job is done so I can now switch my workstation off and disappear on vacation for a week. Not quite. The thing called the &amp;ldquo;master&amp;rdquo; branch isn&amp;rsquo;t &lt;strong&gt;the&lt;/strong&gt; master branch. When I had the &amp;ldquo;clone&amp;rdquo; operation and thought the name was a bit odd, it turned out I had just made a complete copy of the code repository and it was now separate from the original. To finish the job, I needed to also perform a &lt;strong&gt;push&lt;/strong&gt;, but after having done the commit. And this is what annoys me about GIT - we profoundly disagree about what&amp;rsquo;s important. As far as I&amp;rsquo;m concerned, my local hard disk is just a necessary staging point to the way to the central repository where release builds happen. You perform a &lt;em&gt;commit&lt;/em&gt; and that has all the ceremony and pizzazz, but a &lt;em&gt;push&lt;/em&gt; deals with the big picture. Ask most GIT clients what&amp;rsquo;s important an it will answer that its own local repository is the focus of operations. The remote server is basically an after-thought. &amp;ldquo;Huzzah! We&amp;rsquo;ve done a commit! Oh, you want to push too. Okay then. Don&amp;rsquo;t forget to do the push again next time because I won&amp;rsquo;t remind you if you forget!&amp;rdquo; (I have, many times, ran completely pointless builds having committed but forgotten to push. The build server builds without my changes and I end up wondering why nothing I did made any difference.)&lt;/p&gt;</description></item><item><title>Falco T310 - Unleashed</title><link>https://sage-wave-ring.my.statichost.uk/falco-t310-unleashed/</link><pubDate>Thu, 25 Jan 2018 13:10:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/falco-t310-unleashed/</guid><description>&lt;p&gt;&lt;img src="https://owl.billpg.com/wp-content/uploads/2018/01/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://sage-wave-ring.my.statichost.uk/why-i-willingly-bought-a-windows-phone/</link><pubDate>Thu, 26 Oct 2017 19:29:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2021/02/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://sage-wave-ring.my.statichost.uk/is-your-api-broken/</link><pubDate>Wed, 16 Jul 2014 23:54:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2014/07/cat1-161x300.jpg" data-align="right" width="156" height="290" /&gt;&lt;/p&gt;</description></item><item><title>NEVER sanitize your inputs!</title><link>https://sage-wave-ring.my.statichost.uk/never-sanitize-your-inputs/</link><pubDate>Sun, 08 Sep 2013 20:18:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/never-sanitize-your-inputs/</guid><description>&lt;div style="clear: both; text-align: center;"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2013/09/exploits_of_a_mom-300x92.png" title="No!" data-border="0" /&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve seen &lt;a href="http://xkcd.com/327/"&gt;this cartoon&lt;/a&gt; being linked-to in so many comment threads and forums. Anytime its even a little bit applicable, someone will post a link to this cartoon. It has become so pervasive that if you &lt;a href="https://www.google.com/search?q=327"&gt;search Google for &amp;ldquo;327&amp;rdquo;&lt;/a&gt;, it’ll be the third link returned, right after the Wikipedia pages for &lt;a href="http://en.wikipedia.org/wiki/327"&gt;the year&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/BMW_327"&gt;the car&lt;/a&gt;. &lt;a href="https://www.google.com/search?q=328"&gt;Search &amp;ldquo;328&amp;rdquo;&lt;/a&gt; and the &lt;a href="http://xkcd.com/328/"&gt;next XKCD&lt;/a&gt; is no-where to be seen. The lesson, according to this character and so many real people on the internet, is to sanitize your inputs. The school in the cartoon didn&amp;rsquo;t sanitize its inputs - and one of its database tables got deleted! Ask anyone about developing websites and they will tell you the first lesson is always to sanitize your inputs. In this day and age you&amp;rsquo;d have to be crazy not to sanitize your inputs. Trouble is, sanitizing your inputs is very bad advice.&lt;/p&gt;</description></item><item><title>I need a good podcast catcher (and a bit of a rant)</title><link>https://sage-wave-ring.my.statichost.uk/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://sage-wave-ring.my.statichost.uk/i-need-a-good-podcast-catcher-and-a-bit-of-a-rant/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: right;"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2013/06/3675756515_8678cd9d5f_d-300x225.jpg" data-border="0" width="200" height="150" /&gt;
&lt;/div&gt;
&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;</description></item><item><title>PHP - Some strings are more equal than others</title><link>https://sage-wave-ring.my.statichost.uk/php-some-strings-are-more-equal-than-others/</link><pubDate>Sun, 29 Apr 2012 21:33:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2012/04/514751172_d4dba3713d_n-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://sage-wave-ring.my.statichost.uk/clever-and-totally-pointless-my-first-publication/</link><pubDate>Fri, 24 Jun 2011 20:28:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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/wp-content/uploads/2011/06/496323621_84220437bd-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://sage-wave-ring.my.statichost.uk/vinegar-refined-vigenere-can-you-break-my-cipher/</link><pubDate>Sat, 12 Feb 2011 16:32:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="http://1.bp.blogspot.com/_7hEvHSRPMWc/TUy-KyiUgVI/AAAAAAAAAE0/XJClTuj5O18/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://sage-wave-ring.my.statichost.uk/the-cult-of-140/</link><pubDate>Wed, 09 Feb 2011 23:02:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/the-cult-of-140/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="http://3.bp.blogspot.com/_7hEvHSRPMWc/TVMah4aGr8I/AAAAAAAAAE8/P1oUrXjxybw/s200/4721019163_2b82fbf682_b.jpg" data-border="0" width="153" height="200" /&gt;
&lt;/div&gt;
&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;</description></item><item><title>'First Past the Post' isn't.</title><link>https://sage-wave-ring.my.statichost.uk/first-past-the-post-isnt/</link><pubDate>Mon, 10 Jan 2011 22:03:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/first-past-the-post-isnt/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="http://3.bp.blogspot.com/_7hEvHSRPMWc/TSuOvYtBNxI/AAAAAAAAAEo/kIyBHKuVZrc/s200/VoteGoat.jpg" data-border="0" width="150" height="200" /&gt;
&lt;/div&gt;
&lt;p&gt;I’m a bit of a nerd for vote counting systems. So I discovered with delight that in the UK, there will soon be a referendum on changing the way votes are counted. As I write this, most of the UK (and the USA) uses a method we call “First past the post”.&lt;/p&gt;
&lt;p&gt;It’s called “First past the post”, but it isn’t. The name is about as ridiculous as calling North Korea;  “The Democratic People&amp;rsquo;s Republic of Korea”. The country is on the Korean peninsula, so at least that name is a little bit honest.&lt;/p&gt;</description></item><item><title>Digital photography is not rocket science. It just seems that way.</title><link>https://sage-wave-ring.my.statichost.uk/digital-photography-is-not-rocket/</link><pubDate>Sun, 26 Sep 2010 21:03:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="text-align: center;"&gt;
&lt;div class="iframe"&gt;
&lt;div id="player"&gt;
&lt;/div&gt;
&lt;div class="player-unavailable"&gt;
&lt;h1 id="an-error-occurred"&gt;An error occurred.&lt;/h1&gt;
&lt;div class="submessage"&gt;
&lt;p&gt;Unable to execute JavaScript.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="http://4.bp.blogspot.com/_7hEvHSRPMWc/S98q3jrgw_I/AAAAAAAAADU/FP6bf3pcQIo/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="http://1.bp.blogspot.com/_7hEvHSRPMWc/S98mUbba33I/AAAAAAAAADM/hxiBioBnmqQ/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;span class="small"&gt;Picture credits: &lt;a href="http://www.flickr.com/photos/sparkieblues/3972007032/"&gt;&amp;lsquo;Film and SD card&amp;rsquo; by &amp;lsquo;sparkieblues&amp;rsquo; of flickr&lt;/a&gt; &lt;a href="http://www.flickr.com/photos/americanvirus/3393637392/"&gt;&amp;lsquo;Leica&amp;rsquo; by &amp;lsquo;AMERICANVIRUS&amp;rsquo; of flickr&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>reddit'd (Followup to 'Construct Something Else')</title><link>https://sage-wave-ring.my.statichost.uk/redditd-followup-to-construct-something-else/</link><pubDate>Tue, 14 Sep 2010 00:12:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/redditd-followup-to-construct-something-else/</guid><description>&lt;p&gt;&lt;img src="http://3.bp.blogspot.com/_7hEvHSRPMWc/TI6kcoW04rI/AAAAAAAAAEE/XZjh0_2HgeU/s200/2894318763_dc8f349691_o.jpg" data-align="right" width="157" height="200" /&gt;Fame at last! Fame at last! My last piece, &amp;ldquo;&lt;a href="https://owl.billpg.com/construct-something-else-c/" target="_blank" rel="noopener"&gt;Construct something else!&lt;/a&gt;&amp;rdquo; got a bit of attention when someone posted it &lt;a href="http://www.reddit.com/r/programming/comments/dd9sa/construct_something_else_c/"&gt;on reddit&lt;/a&gt;.That was unexpected. Remember the rule; If you publish something that&amp;rsquo;s a bad idea in hindsight, post a &amp;ldquo;clarification&amp;rdquo; article claiming you&amp;rsquo;ve been misunderstood and that you never thought it was a good idea in the first place. Then hide in the shower. You see, I think I&amp;rsquo;ve been misunderstood. I was reading stackoverflow and I found the question asking about c# constructors. There was the comment from Eric Lippert, talking about the possibility of implementing this feature, but they were lacking a good reason to undertake the effort. Then I remembered I had exactly what he was looking for, a real-world use case! So I wrote up my experiences in a blog post and left a comment on the stack overflow question. I thought I was rather clear that I was just providing Mr Lippert with a use case, rather than actually advocating it. Nonetheless, some people mistakenly took my post as advocacy and responded as such. Now if you&amp;rsquo;ll excuse me, I&amp;rsquo;m going to go have a shower.&lt;/p&gt;</description></item><item><title>Construct something else! (C#)</title><link>https://sage-wave-ring.my.statichost.uk/construct-something-else-c/</link><pubDate>Sun, 12 Sep 2010 11:34:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="http://1.bp.blogspot.com/_7hEvHSRPMWc/TIylI10bD_I/AAAAAAAAAD8/cF67NIJmVks/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://sage-wave-ring.my.statichost.uk/google-snooping-wifi-dont-panic-dont-panic/</link><pubDate>Sat, 22 May 2010 21:40:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="http://1.bp.blogspot.com/_7hEvHSRPMWc/S_hIEl3wSaI/AAAAAAAAADc/JUQYYu33ihA/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://sage-wave-ring.my.statichost.uk/wishing-for-a-destructor-c/</link><pubDate>Sun, 28 Mar 2010 16:13:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="http://2.bp.blogspot.com/_7hEvHSRPMWc/S5abUCShNgI/AAAAAAAAACk/gUPVwSchaAo/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>Paying for Power</title><link>https://sage-wave-ring.my.statichost.uk/paying-for-power/</link><pubDate>Sun, 28 Feb 2010 23:31:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/paying-for-power/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="http://1.bp.blogspot.com/_7hEvHSRPMWc/S4r-tAAsvYI/AAAAAAAAACU/Vixbe-Z23B4/s320/1516321778_8f1ba4e277_b.jpg" data-border="0" /&gt;
&lt;/div&gt;
&lt;p&gt;Being an evil genius, I&amp;rsquo;m obsessed with getting as much power as possible. If only I could get power for nothing, but alas, I have to pay for it.&lt;/p&gt;
&lt;p&gt;In England, and most of the western world, we have a well established system of sending electricity from the power stations to me and sending money in the opposite direction. It works, but I think we can improve on it.&lt;/p&gt;</description></item><item><title>The Making of an Evil Genius</title><link>https://sage-wave-ring.my.statichost.uk/the-making-of-an-evil-genius/</link><pubDate>Sat, 23 Jan 2010 16:32:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/the-making-of-an-evil-genius/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="http://2.bp.blogspot.com/_7hEvHSRPMWc/S1sT4-QFw6I/AAAAAAAAAB8/6SKv_IZvTkk/s320/nativity.jpg" data-border="0" /&gt; 
&lt;/div&gt;
&lt;p&gt;When I was around 9 or 10 years old, my school, as they would every year, put on a Christmas show. The younger children would re-enact the birth of Jesus of Nazareth and then the older children would perform a play. That year, we were performing Grimm&amp;rsquo;s &lt;em&gt;Snow White&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t performing on stage though. Instead, I was in charge of the music. We had a cassette of all the music and the children on stage would sing along. I would press play when its time to sing and after, position the cassette for the next song.&lt;/p&gt;</description></item><item><title>is, then as (C#)</title><link>https://sage-wave-ring.my.statichost.uk/is-then-as-c/</link><pubDate>Mon, 07 Dec 2009 21:11:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/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="http://4.bp.blogspot.com/_7hEvHSRPMWc/Sxfq_2XDVRI/AAAAAAAAABY/XQRcqnECAUU/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><item><title>Computers are fast!</title><link>https://sage-wave-ring.my.statichost.uk/computers-are-fast/</link><pubDate>Sun, 29 Nov 2009 18:15:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/computers-are-fast/</guid><description>&lt;div style="clear: both; text-align: center;"&gt;
&lt;img src="https://billpg.com/Images/killer-sudoku-mid-right.PNG" data-border="0" /&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Killer Sudoku&lt;/strong&gt; is a popular variant on the perennial Sudoku game found in British newspapers. The same rules about the numbers 1 to 9 appearing only once in row, column and 3x3 box still apply, but unlike Sudoku, the puzzle doesn&amp;rsquo;t come with any numbers filled in. Instead, cells are groups with dotted lines and the total of all those cells are written in. Here&amp;rsquo;s part of a puzzle. The two cells grouped by a 10 could be 1+9, 2+8, 3+7 or 4+6. (It can&amp;rsquo;t be 5+5 because that would mean two 5s in same box.) Not a lot to work on, but also look at the three cells grouped by a 23 in the same 3x3 box; The only possible fit is 6+8+9. This means the only possible fit for the 10 group is 3+7, as all the possibilities would clash with the 6,8 or 9 required to make the 23. I could go on. If you want to complete the puzzle, its the &lt;a href="http://www.guardian.co.uk/theguardian"&gt;Guardian&lt;/a&gt;&amp;rsquo;s &lt;a href="http://www.guardian.co.uk/lifeandstyle/2009/nov/28/sudoku-166-killer"&gt;puzzle number 166&lt;/a&gt;. The point of this article isn&amp;rsquo;t to solve the puzzle, but something I observed along the way. Am I sure there&amp;rsquo;s no other way to split 23 into three parts, 1 to 9, without duplicates? I confess, mental arithmetic is not my forte. Part of the puzzle solving process for me is going through each dotted group and building a crib sheet on all the possible ways to make the total, so I can cross them off later. This isn&amp;rsquo;t a part of the puzzle I particularly enjoy, so I decided to automate it. (Is that cheating? I don&amp;rsquo;t think so in my circumstances, but that&amp;rsquo;s another topic of conversation.) So I sat down and designed an algorithm&amp;hellip;&lt;/p&gt;</description></item><item><title>About This Blog</title><link>https://sage-wave-ring.my.statichost.uk/about-this-blog/</link><pubDate>Thu, 12 Nov 2009 18:27:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/about-this-blog/</guid><description>&lt;div style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;img src="http://4.bp.blogspot.com/_7hEvHSRPMWc/SviOdAatjCI/AAAAAAAAAA4/alz5uAHqHMU/s320/scientist.jpg" data-border="0" /&gt; 
&lt;/div&gt;
&lt;p&gt;Jawohl! I am Wilhelm von Hackensplat, software developer and evil genius. This is my blog.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be writing on software development, otherwise known as that-which-pays-the-bills. I&amp;rsquo;ve been doing this for most of my life, ever since mother Hackensplat bought a Sinclair ZX81 all those years ago.&lt;/p&gt;
&lt;p&gt;I have tried blogging before, but I found myself really dissatisfied with the structure of a blog, specifically the normal view of showing the most recent posts first. To me, that&amp;rsquo;s not the most important thing. I want a casual visitor to bask in my unaccountable brilliance and see my best stuff.&lt;/p&gt;</description></item><item><title>About Me</title><link>https://sage-wave-ring.my.statichost.uk/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sage-wave-ring.my.statichost.uk/about/</guid><description>&lt;p&gt;I am&amp;hellip;&lt;/p&gt;
&lt;p&gt;An &lt;strong&gt;Earthling&lt;/strong&gt;.
I&amp;rsquo;m committed to cherishing and protecting our shared home, celebrating its wonders, and fostering a deeper connection with the natural world.&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter size-medium is-resized"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2025/08/Flag_of_Planet_Terra.svg_-300x210.png" alt="" style="width:100px" /&gt;
&lt;/figure&gt;
&lt;p&gt;A &lt;strong&gt;European&lt;/strong&gt;.
The cradle of civilisation. Land of philosophy, science, history, engineering. I see a future united &lt;em&gt;Europa&lt;/em&gt;, taking her place as one of the world&amp;rsquo;s super-powers.&lt;/p&gt;
&lt;figure class="wp-block-image aligncenter size-full is-resized"&gt;
&lt;img src="https://owl.billpg.com/wp-content/uploads/2025/08/Flag_of_Europe.svg_.webp" alt="" style="width:100px" /&gt;
&lt;/figure&gt;
&lt;p&gt;An &lt;strong&gt;Englishman&lt;/strong&gt;.
A nation of shop-keepers. Founders of the English Enlightenment. A land of tea drinkers, writers, inventors and radical feminists. I see England as a modern European nation and the centre for business, technology and culture. (I say, jolly good show, pip-pip cheerio.)&lt;/p&gt;</description></item></channel></rss>