<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Computer Science &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/computer-science/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Sat, 04 Apr 2026 08:53:17 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>Computer Science &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[It is 1939 and you want to use public-key cryptography]]></title>
		<link>https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/</link>
					<comments>https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 13 Jul 2025 11:34:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[encryption]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61738</guid>

					<description><![CDATA[Imagine, just for a moment, that a mathematical breakthrough had occurred on the eve of the second World War. Perhaps Turing or Rejewski or Driscoll realised that prime number theory held the key to unbreakable encryption. This blog post attempts to answer the question &#34;could public-key cryptography have been used in 1939?&#34;  Let&#039;s briefly step back into history.  The Enigma machine represented…]]></description>
										<content:encoded><![CDATA[<p>Imagine, just for a moment, that a mathematical breakthrough had occurred on the eve of the second World War. Perhaps Turing or Rejewski or Driscoll realised that prime number theory held the key to unbreakable encryption. This blog post attempts to answer the question "could public-key cryptography have been used in 1939?"</p>

<p>Let's briefly step back into history.</p>

<p>The Enigma machine represented the most powerful form of convenient cryptography available in the early 20th century.  There were only two practical ways to crack its encryption.</p>

<ol>
<li>Capture a codebook with the encryption keys printed in it<sup id="fnref:u571"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:u571" class="footnote-ref" title="As seen in the historically &quot;accurate&quot; film &quot;U571&quot;." role="doc-noteref">0</a></sup>.</li>
<li>Literally invent the computer<sup id="fnref:game"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:game" class="footnote-ref" title="As seen in the historically &quot;accurate&quot; film &quot;The Imitation Game&quot;." role="doc-noteref">1</a></sup>.</li>
</ol>

<p>The basis of Enigma is <em>conceptually</em> simple. You want to write a character. You follow a complex sequence of instructions and get the resulting encrypted character. You want to write the next character, so you follow the same instructions for the first which then <em>changes the sequence of instructions</em> for the next character. And so on. Every character you type changes the algorithm for the next character.  Fiendish!</p>

<p>You <em>could</em> encrypt an Enigma message by hand. But it would be tiresome, error-prone, and take ages. So a machine was invented to do the hard work. A series of cogs and wheels and wires and lights.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Enigma_crittografia_-_Museo_scienza_e_tecnologia_Milano.jpg" alt="The Enigma machine. A typewriter with a complex mechanical set of rotors and electrical wiring. Photo by Museo Nazionale Scienza e Tecnologia Leonardo da Vinci. CC BY-SA." width="960" height="1047" class="aligncenter size-full wp-image-61757">

<p>One of the weaknesses of Enigma is that it used <em>symmetric</em> encryption. The password used to scramble the message was the same as the one used to descramble it.  Each day the codes changed, so they were printed in a handy codebook which was distributed to each operator.  If someone captured the codebook, they could decrypt all sent and received messages.</p>

<p>Decades after the war, <em>asymmetric</em> cryptography was invented<sup id="fnref:history"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:history" class="footnote-ref" title="As seen in the historically &quot;accurate&quot; film By either the Brits or the Americans depending on whose history you think is accurate." role="doc-noteref">2</a></sup>.  The magic of asymmetric encryption is that it allows you to have one password to scramble the message and a <em>totally different</em> one to unscramble it.  This completely obliterates the risk of your codebooks being discovered; you can have a "public key" for encryption.  Anyone with that key can encrypt a message, but not decrypt it.  You have a private key for decryption which you guard with your life.</p>

<p>Asymmetric encryption powers the modern world. It is made possible by high-speed computer chips which can precisely perform mind-boggling calculations in microseconds.</p>

<p>Let us slip into an <em>alternate</em> timeline. The mathematics behind asymmetric encryption are conceptually simple - even if they are exceedingly difficult to execute without a computer.  If the mathematicians of the day had made the necessary intellectual breakthroughs, could public-key encryption have worked in WW2?</p>

<p>I'm going to work through the following problem to prove that it was <em>just about</em> possible<sup id="fnref:ed"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:ed" class="footnote-ref" title="With huge thanks to my gang of unpaid editors, including Colin and Liz. Any mistakes, errors, and typos are my responsibility." role="doc-noteref">3</a></sup>.</p>

<ol start="0">
<li>Could a public / private keypair have been calculated in the 1930s?</li>
<li>Is it possible to use paper-and-pencil to encrypt a message using a very short public key?</li>
<li>Would it have been possible to build a machine to encrypt using longer public keys?</li>
<li>What key length would have prevented the private key being cracked by brute-force?</li>
</ol>

<p>Let's take a look at the last question first.</p>

<p></p><nav role="doc-toc"><menu><li><h2 id="table-of-contents"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#table-of-contents">Table of Contents</a></h2><menu><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#why-brute-force">Why brute force?</a></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#generating-a-keypair">Generating a Keypair</a><menu><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#what-is-a-keypair">What is a keypair?</a></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#calculating-a-keypair">Calculating a keypair</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#lets-encrypt">Let's Encrypt!</a></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#lets-decrypt">Let's Decrypt!</a></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#the-land-of-big-numbers">The Land of Big Numbers</a><menu><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#manual-decryption">Manual decryption</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#the-benefits-of-symmetric-encryption">The Benefits of Symmetric Encryption</a><menu><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#a-brief-look-into-key-exchange">A brief look into key exchange</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#would-a-machine-have-helped">Would a machine have helped?</a></li><li><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#so-it-is-possible">So it is possible?</a></li></menu></li></menu></nav><p></p>

<h2 id="why-brute-force"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#why-brute-force">Why brute force?</a></h2>

<p>The original machines used to crack Enigma used brute-force; trying every possible combination until they discovered the right one. That's not <em>strictly</em> true - a large part of cryptanalysis was understanding the statistics behind the encryption algorithm, the likely content of messages, and common phrases that they contained.</p>

<p>Modern encryption algorithms are resistant to most of those statistical attacks. So the only feasible method of cracking a private key is by trying each combination sequentially.</p>

<p>Let's suppose there's a very short private key - for example just 4 bits long. There are 2<sup>4</sup> possible combinations; 16 in total. It seems reasonable to suppose that, if the message can be easily decrypted by the intended recipient, it could easily be cracked by someone able to try 16 different key combinations.</p>

<p>For every bit of length added to the key, the number of combinations doubles. 2<sup>4</sup>=16. 2<sup>5</sup>=32. 2<sup>6</sup>=64.  Once you get the 2<sup>32</sup>, you're at 4 <em>billion</em> combinations<sup id="fnref:bits"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:bits" class="footnote-ref" title="By contrast, the Enigma had about 67 bits of complexity, resulting in approximately 158 quintillion combinations. Hence the need for cryptanalysis rather than just brute force!" role="doc-noteref">4</a></sup>. Trying one combination per second would take over 120 years to complete.</p>

<p>Of course, manually using a 32 bit key might be too complex for the technology of the day. So a shorter key might be easier to use while still retaining sufficient strength.  How difficult is it to manually encipher and decipher messages with short keys?</p>

<p>Let's go back to question 0.</p>

<h2 id="generating-a-keypair"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#generating-a-keypair">Generating a Keypair</a></h2>

<p>How do we generate an asymmetric keypair? Remember, no computers allowed<sup id="fnref:computers"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:computers" class="footnote-ref" title="Well, OK, you could have a staff of several women who were called computers." role="doc-noteref">5</a></sup>!</p>

<h3 id="what-is-a-keypair"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#what-is-a-keypair">What is a keypair?</a></h3>

<p>Briefly and incorrectly put, keys are based on prime factors.</p>

<p>Multiply these two prime numbers: 29 and 113.</p>

<p>You can easily do that on paper or on a pocket calculator. It is trivial.  But suppose I asked you to reverse the equation? Find out which two prime numbers are multiplied to give the number 40,133.  That's much harder. For larger numbers, it is <a href="https://en.wikipedia.org/wiki/Integer_factorization">even harder than you think</a>.</p>

<h3 id="calculating-a-keypair"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#calculating-a-keypair">Calculating a keypair</a></h3>

<p>Mathematically, it is relatively simple. You need to know the following concepts:</p>

<ul>
<li>What is a prime number? (A number divisible by nothing other than itself and 1. For example, 13.)</li>
<li>What is a coprime? (Another number with no common factors to the first<sup id="fnref:coprime"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:coprime" class="footnote-ref" title="Confusingly, a co-prime doesn't have to be a prime number." role="doc-noteref">6</a></sup>. For example, the number 13 has a coprime of 9.)</li>
<li>What is a modular inverse? (When the Prime is multiplied by Coprime, then divided by the modular inverse, the remainder is 1.)</li>
</ul>

<p>You can <a href="https://www.teach.cs.toronto.edu/~csc110y/fall/notes/08-cryptography/05-rsa-cryptosystem-implementation.html">follow along with this Python example</a>, but the steps are simple enough to do by hand using sufficiently small numbers.</p>

<p><a href="https://www.baeldung.com/cs/prime-numbers-cryptography">Here's the algorithm</a>:</p>

<ul>
<li>Pick two prime numbers, 𝒑 and 𝒒</li>
<li>Multiply them to get 𝒏</li>
<li>Calculate  (𝒑-1) × (𝒒-1) to get ϕ(𝒏)</li>
<li>Pick a coprime of ϕ(𝒏) to get 𝒆

<ul>
<li>Any coprime can be randomly selected, although <a href="https://eprint.iacr.org/2020/1059.pdf">there are some choices which are bad</a>.</li>
</ul></li>
<li>Calculate 𝒅 where 𝒅 × 𝒆 = 1 (mod ϕ(𝒏))</li>
<li>The private key consists of 𝒏 and 𝒅</li>
<li>The public key consists of 𝒏 and 𝒆</li>
</ul>

<p>Let's do that with two small prime numbers 17 and 61. They are sufficiently small to be calculated by hand<sup id="fnref:small"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:small" class="footnote-ref" title="By the end of the 19th century, all prime numbers up to 1 billion had been discovered - that's around 50 million different primes. Far fewer combinations than the Enigma, but still a formidable…" role="doc-noteref">7</a></sup>.</p>

<ul>
<li>𝒏 = 17 × 61 = 1037</li>
<li>ϕ(𝒏) = 16 × 60 = 960</li>
<li>𝒆 = 77 (Chosen randomly)</li>
<li>𝒅 = 773 (Calculated using the Extended Euclidean Algorithm, which was <a href="https://rjlipton.com/2016/08/28/descending-proofs-into-algorithms/">first described in 1740</a>)</li>
</ul>

<p>Here's how calculating 𝒅 works. This isn't intended to be a complete explanation of how the algorithm works, but it is sufficient to show that generating keypairs would have been well within the grasp of mathematicians of the 1930s. Feel free to <a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#lets-encrypt">skip to the next section</a>.</p>

<table>
<thead>
<tr>
  <th align="center">Step</th>
  <th align="center">ri−2</th>
  <th align="center">ri−1</th>
  <th align="center">qi=⌊(ri−2)÷(ri−1)⌋</th>
  <th align="center">ri=(ri−2_−qi×(ri−1)</th>
  <th align="center">xi=(xi−2)−qi×(xi−1)</th>
  <th align="center">yi=(yi−2)−qi×(yi−1)</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="center">0</td>
  <td align="center">960</td>
  <td align="center"></td>
  <td align="center"></td>
  <td align="center"></td>
  <td align="center">1</td>
  <td align="center">0</td>
</tr>
<tr>
  <td align="center">1</td>
  <td align="center">77</td>
  <td align="center"></td>
  <td align="center"></td>
  <td align="center"></td>
  <td align="center">0</td>
  <td align="center">1</td>
</tr>
<tr>
  <td align="center">2</td>
  <td align="center">960</td>
  <td align="center">77</td>
  <td align="center">960÷77=12</td>
  <td align="center">960−12×77=960−924=36</td>
  <td align="center">1−12×0=1</td>
  <td align="center">0−12×1=−12</td>
</tr>
<tr>
  <td align="center">3</td>
  <td align="center">77</td>
  <td align="center">36</td>
  <td align="center">77÷36=2</td>
  <td align="center">77−2×36=77−72=5</td>
  <td align="center">0−2×1=−2</td>
  <td align="center">1−2×(−12)=1+24=25</td>
</tr>
<tr>
  <td align="center">4</td>
  <td align="center">36</td>
  <td align="center">5</td>
  <td align="center">36÷5=7</td>
  <td align="center">36−7×5=36−35=1</td>
  <td align="center">1−7×(−2)=1+14=15</td>
  <td align="center">−12−7×25=−12−175=−187</td>
</tr>
<tr>
  <td align="center">5</td>
  <td align="center">5</td>
  <td align="center">1</td>
  <td align="center">5÷1=5</td>
  <td align="center">5−5×1=0</td>
  <td align="center">−2−5×15=−2−75=−77</td>
  <td align="center">25−5×(−187)=25+935=960</td>
</tr>
</tbody>
</table>

<p>From Step 4, we have: 1 = 15 × 960 + (−187) × 77</p>

<p>We are interested in the coefficient of 77, which is −187. This means −187 × 77 ≡ 1 (mod 960)</p>

<p>We need a positive value for d, we add ϕ(𝒏) to −187.</p>

<p>𝒅 = −187 + 960 = 773</p>

<h2 id="lets-encrypt"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#lets-encrypt">Let's Encrypt!</a></h2>

<p>We have a plaintext message (𝒎), we calculate the encrypted version (𝒄) with the formula 𝒄&nbsp;=&nbsp;𝒎<sup>𝒆</sup>&nbsp;%&nbsp;𝒏</p>

<p>Let's suppose our message starts "HELLO".  We'll give every letter a number. Our message starts with H - the eighth number of the alphabet.</p>

<p>8<sup>77</sup> % 1037  = 638</p>

<p>You can do that today on any pocket calculator. But could a competent mathematician calculate that by hand?</p>

<p>Exponentials get very large very quickly. There are some shortcuts, like <a href="https://crypto.stanford.edu/pbc/notes/numbertheory/exp.html">Modular Exponentiation</a>, but it is a fairly manual process. Doable, but not pleasant.</p>

<p>With enough time, you could manually encrypt a message like HELLO from <code>8 5 12 12 15</code> to <code>638 768 388 388 835</code>.</p>

<h2 id="lets-decrypt"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#lets-decrypt">Let's Decrypt!</a></h2>

<p>We have an encrypted version (𝒄), we calculate the plaintext message (𝒎) using the formula 𝒎&nbsp;=&nbsp;𝒄<sup>𝒅</sup>&nbsp;%&nbsp;𝒏</p>

<p>638<sup>773</sup> % 1037 = 8</p>

<p>Again, piece of cake today, but an almost insurmountable a manual grind for a pencil and paper computer.</p>

<h2 id="the-land-of-big-numbers"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#the-land-of-big-numbers">The Land of Big Numbers</a></h2>

<p>In the toy example above, we turned <code>8 5 12 12 15</code> into <code>638 768 388 388 835</code>. That's a <em>very bad</em> way of encrypting text. Working on individual letters allows for fairly trivial attacks in the form of frequency analysis.  You might not know what prime numbers were used, but you know what the most common letter in English is and which letters often come in pairs.</p>

<p>Let's pretend that a binary code like ASCII had been invented by the 1930s, giving each letter its own number<sup id="fnref:baudot"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:baudot" class="footnote-ref" title="This isn't too much of a stretch. The Baudot code was invented in the late 1800s. It is the binary code from which ASCII descends." role="doc-noteref">8</a></sup>. So the text translates to <code>1001000 1000101 1001100 1001100 1001111</code>  7 bits is sufficient to store 128 characters, which is good enough for text, numbers, and punctuation.</p>

<p>Smooshing those bits together gives <code>10010001000101100110010011001001111</code>, which is 19,473,311,311 in decimal.</p>

<p>But here we hit a snag! And rather an important one. Our message 𝒎 <em>must</em> be less than the key 𝒏 otherwise the maths doesn't work.  So each "chunk" that is encrypted must be less than, in this case, 1037.  In binary, 1037 is an 11 bit number - <code>10000001101</code> so let's chop the long binary string into groups of ten bit numbers<sup id="fnref:ten"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:ten" class="footnote-ref" title="In this example, we might still be subject to some frequency analysis issues. There are common ways to start a message which could be pre-computed." role="doc-noteref">9</a></sup>.</p>

<p><code>1001000100 0101100110 0100110010 01111</code> which, in decimal is <code>580 358 306 15</code>.</p>

<p>How easy is it to calculate 580<sup>77</sup> % 1037?</p>

<p>Well, 580<sup>77</sup> is this 213 digit number:</p>

<pre><code class="language-_">608072697981095702436950488113933187346914897948969284857902654293722732546509642998889930612690327222151182305275310987597838669368524800000000000000000000000000000000000000000000000000000000000000000000000000000
</code></pre>

<p>Erk!</p>

<p>But, using Modular Exponents as mentioned above, it is just about doable to calculate it modulo 1037, to give the answer of 287.</p>

<h3 id="manual-decryption"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#manual-decryption">Manual decryption</a></h3>

<p>The reverse starts with 287<sup>773</sup> - which is a 1,900 digit monster:</p>

<pre><code class="language-_">8764076814703289747574882682976372218202744117677541506077211396661935894880088329104690573410169261407987339892509470735016770231680618285939631509696980819464283401576517028048058993738338212389624747625283501942530083096110122657663164247353946331224458655354563571410933387843518380823303070498533169970946532897148031815166130665099650412982697122333628263892989475993249398481489331587762699843745762158170438822856768199827373555952739238985122598013870248178442111493156638843557234189706340583484083198539928533412908164601212156510176835050241254357263891198022046581958723118373933025616238122851775785374806117735760339884871872459839891658484324244684568308566814363900160248669794871064158507228968139134265889106231940693454825286506694141354013548608249280312471711991110620182847512187270642477617113287609180070026599666866308043914633111575444534093596344978016090107810671208184558268833063049379828413374691670084694302906835473338305746126263384285289946318656379558672414106052389234651640556324925755102419977400705380530065200979454412655589210213499344464257545650144053951331232875248144510526902329651434948453811412299881757959472385612984529276884875992403776906120156323972516615974836750108651889727547635267691073017967972912857552981641062535868781437285961802657794299581952590634427029261618023579258415033039194531248890027241354305598494848058858007937053616885726584609180601099791624229397351704959975692231801353195625613188074479028803108341519961929058549691769420863241680253570449204941176209229012471375228095132443055306202854239923235089133210534407289759826457721708012298751583195590595588629155245907825766955419953439709562536473174022072079161000252263007473231270835574140865544015688184196904473193955950050289022786886850214941882872222159427413174019940977015728353647777297220099220515546638682392602897440872932518693189627668062600415788447
</code></pre>

<p>There is no sensible way for a human to calculate that without mechanical or algorithmic assistance.</p>

<p>So our 1939 cryptographers are ready to pack up and go home, right?</p>

<p>Wrong! Remember, the plaintext message 𝒎 = 𝒄<sup>𝒅</sup> % 𝒏</p>

<p>For this operation, that's 287<sup>773</sup> % 1037</p>

<p>Let's turn 𝒅 into binary - decimal <code>773</code> is <code>1100000101</code> - we can now use the <a href="https://en.wikipedia.org/wiki/Exponentiation_by_squaring">"square-and-multiply" algorithm</a> to calculate the plaintext.</p>

<p>Again, you don't need to read this table and can <a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#the-benefits-of-symmetric-encryption">skip to the next section</a> - this is just to show that the calculations are possible (if somewhat convoluted).</p>

<table>
<thead>
<tr>
  <th align="center">Exponent Bit</th>
  <th align="center">base<sup>2</sup> % modulus</th>
  <th align="center">If bit is 1, result = (result * base) % modulus</th>
  <th align="right">Current base</th>
  <th align="right">Current result</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="center">1</td>
  <td align="center"></td>
  <td align="center">result = (1 * 287) % 1037 = 287</td>
  <td align="right">287</td>
  <td align="right">287</td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 287<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">287<sup>2</sup> = 82369</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">82369÷1037=79, remainder 486</td>
  <td align="center"></td>
  <td align="right">486</td>
  <td align="right">287</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 486<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">486<sup>2</sup>=236196</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">236196÷1037=227, remainder 177</td>
  <td align="center"></td>
  <td align="right">177</td>
  <td align="right">287</td>
</tr>
<tr>
  <td align="center">1</td>
  <td align="center"></td>
  <td align="center">result = (287 * 177) % 1037</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">287×177=50799</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">50799÷1037=49, remainder 36</td>
  <td align="center">36</td>
  <td align="right"></td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 177<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">177<sup>2</sup>=31329</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">31329÷1037=30, remainder 219</td>
  <td align="center"></td>
  <td align="right">219</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 219<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">219<sup>2</sup>=47961</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">47961÷1037=46, remainder 239</td>
  <td align="center"></td>
  <td align="right">239</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 239<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">239<sup>2</sup>=57121</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">57121÷1037=55, remainder 036</td>
  <td align="center"></td>
  <td align="right">36</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 36<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">36<sup>2</sup>=1296</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">1296÷1037=1, remainder 259</td>
  <td align="center"></td>
  <td align="right">259</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 259<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">259<sup>2</sup>=67081</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">67081÷1037=64, remainder 789</td>
  <td align="center"></td>
  <td align="right">789</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">0</td>
  <td align="center"></td>
  <td align="center">(No change to result)</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 789<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">789<sup>2</sup>=622521</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">622521÷1037=600, remainder 321</td>
  <td align="center"></td>
  <td align="right">321</td>
  <td align="right">36</td>
</tr>
<tr>
  <td align="center">1</td>
  <td align="center"></td>
  <td align="center">result = (36 * 321) % 1037</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">36×321=11556</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">11556÷1037=11, remainder 119</td>
  <td align="center">119</td>
  <td align="right"></td>
  <td align="right">119</td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">base = 321<sup>2</sup> % 1037</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">321<sup>2</sup>=103041</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">103041÷1037=99, remainder 450</td>
  <td align="center"></td>
  <td align="right">450</td>
  <td align="right">119</td>
</tr>
<tr>
  <td align="center">1</td>
  <td align="center"></td>
  <td align="center">result = (119 * 450) % 1037</td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">119×450=53550</td>
  <td align="center"></td>
  <td align="right"></td>
  <td align="right"></td>
</tr>
<tr>
  <td align="center"></td>
  <td align="center">53550÷1037=51, remainder 580</td>
  <td align="center">580</td>
  <td align="right"></td>
  <td align="right">580</td>
</tr>
</tbody>
</table>

<p>Yeeeesh! Tedious, but absolutely doable by hand. As long as you don't make mistakes and don't fall asleep.</p>

<p>Could this be made easier? Perhaps - but let's consider whether this effort would be worth it.</p>

<h2 id="the-benefits-of-symmetric-encryption"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#the-benefits-of-symmetric-encryption">The Benefits of Symmetric Encryption</a></h2>

<p>As discussed earlier, Enigma's password let you encrypt and decrypt using the same password. That means if the password leaks, you have lost the secrecy of both your outgoing <em>and</em> incoming messages.</p>

<p>The key advantage of symmetric encryption is that it is <em>much</em> easier to use. You set today's secret, then you can send and receive with ease. You do not need to manage two separate codes.</p>

<p>Let's imagine that there is a theoretical machine which can mechanically or electronically code and decode messages. You have the public key for sending messages back to base - but what about if you want to <em>receive</em> a message?</p>

<p>You will need a private key. A key which has to be protected in exactly the same way as Enigma's codebooks.  If your private key is captured, all the messages previously sent to you can be decrypted.</p>

<p>OK, perhaps the solution is to give every machine its own unique keypair?  Well, to quote the sages, <a href="https://regex.info/blog/2006-09-15/247">now you have two problems</a>.</p>

<p>First is the complexity of managing all the public keys. You have to remember which one to use when sending information.</p>

<p>Secondly, it means that you cannot broadcast a <em>general</em> message to all recipients. If HQ wants to send a message, they need to encrypt it separately for each receiver and also broadcast it separately. That also means the receivers have to know which message is intended for them<sup id="fnref:listening"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:listening" class="footnote-ref" title="Yes, there are ways round this. You could start each message with a plaintext callsign, or broadcast on different frequencies, or some other differentiator. The point is that it adds complexity." role="doc-noteref">10</a></sup>.  Similarly, if a single user wants to send an encrypted message to all nearby units, they need to know who they are and separately encrypt messages to them<sup id="fnref:separate"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fn:separate" class="footnote-ref" title="Again, there are ways round this. But they mostly involve generating even more shared keys. At which point, you're almost back to symmetric encryption!" role="doc-noteref">11</a></sup>.</p>

<p>Simplicity is the main factor in making usable security <a href="https://shkspr.mobi/blog/2014/01/the-hardest-problem-in-encryption-usability/">as I've written about before</a>. Regardless of whether a machine could have done the calculations, key management is a tough problem.</p>

<h3 id="a-brief-look-into-key-exchange"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#a-brief-look-into-key-exchange">A brief look into key exchange</a></h3>

<p><a href="https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange">Diffie-Hellman key exchange</a> is a cryptographic technique which allows two or more parties to use an insecure channel to exchange enough information to create a unique public/private keypair for themselves. As with all the other maths talked about, it is conceptually simple - but rather difficult to do by hand.</p>

<p>Given the limitations of the speed of 1930s technology, it might be easier just to broadcast in plaintext "Hello! I'm station 123 and my public key is ..."  That would be a simple way of distributing your keys but has two disadvantages:</p>

<ul>
<li>The enemy can flood you with encrypted messages. You have no way to verify that they come from a legitimate source.</li>
<li>There's no way to verify who the public key is from.</li>
</ul>

<p>I'm not going to get into cryptographic signature verification because this blog post is already too long!</p>

<h2 id="would-a-machine-have-helped"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#would-a-machine-have-helped">Would a machine have helped?</a></h2>

<p>This, alas, is approaching the limits of my ignorance. I know it is possible to <a href="https://www.cs.princeton.edu/~chazelle/courses/BIB/BabbageEngine.html">build a Difference Engine out of Lego</a>.  Similarly, in the late 1930s it was possible to build a <a href="https://en.wikipedia.org/wiki/Curta">mechanical calculator</a> which was small, lightweight, and accurate.</p>

<p>There were <a href="https://arstechnica.com/information-technology/2020/05/gears-of-war-when-mechanical-analog-computers-ruled-the-waves/">massive analogue computers on battleships</a>, able to solve "20-plus variable calculus problems in real-time". At around 1,400Kg these weren't as portable as the typewriter sized Enigma - but do go some way to showing it <em>might</em> have been possible to design a mechanical computer for these equations.</p>

<h2 id="so-it-is-possible"><a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#so-it-is-possible">So it <em>is</em> possible?</a></h2>

<p>The mathematics behind public key cryptography are simple and, in my estimation, could easily have been understood by people nearly a century ago.</p>

<p>The various algorithms for simplifying the necessary calculations were neither obscure nor difficult to implement.</p>

<p>With smaller keys, it is possible to hand-calculate encryption and decryption</p>

<p>But, could it work in practice? If you had suitably trained battlefield mathematicians, it would be <em>just about</em> feasible to encrypt a message for transmission and decrypt something you've received.  You wouldn't want to do it while under fire or for any long messages or while using large prime numbers. But, <em>technically</em> it is possible to hand-calculate the encryption and decryption of public key cryptography!</p>

<p>Let's look through the steps again.</p>

<ul>
<li>Generate a public / private keypair.

<ul>
<li>Yes! Tedious for larger primes, but well within the abilities of skilled mathematicians.</li>
</ul></li>
<li>Converting a plaintext message to binary.

<ul>
<li>Yes! Baudot codes were well known, as were things like Morse code.</li>
</ul></li>
<li>Splitting a binary message into smaller chunks.

<ul>
<li>Yes! A trivial exercise on paper, but might be difficult mechanically.</li>
</ul></li>
<li>Encrypting a chunk.

<ul>
<li>Possible but difficult - especially with larger keys.</li>
</ul></li>
<li>Decrypting a chunk.

<ul>
<li>Possible but difficult - especially with larger keys.</li>
</ul></li>
<li>Creating a machine to do the difficult work.

<ul>
<li>A very cautious maybe. Large battlefield mechanical-computers existed and were precise. Given the effort that went on in Bletchley Park, I don't doubt <em>something</em> could have been created.</li>
<li>However, given the complexity of the calculations, I don't think a portable machine would have been possible.</li>
</ul></li>
<li>Key management.

<ul>
<li>A nightmare, as always.</li>
</ul></li>
</ul>

<p>Aside from the conceptual leaps required and the lack of computational power, the major problem with successfully deploying public key cryptography in 1939 is… usability!</p>

<p>The usability of security systems is often hidden from us. Managing a complex key infrastructure is a problem which <em>still</em> plagues the security industry. Despite decades of advances, we still regularly read stories about <a href="https://blog.stackademic.com/breaking-rsa-encryption-on-hardware-devices-with-side-channel-power-analysis-leaking-the-private-201374858545">"secure" microchips getting hacked for their keys</a> - I imagine it would be trivial to extract them from a mechanical computer.</p>

<p>Could public-key cryptography have been used in 1939? Possibly, but the complexity of mechanical computation would have made it impractical.</p>

<p>If you happen across a time machine with access to the mid-20th century, please pop back and let me know if I am right.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:u571">
<p>As seen in the historically "accurate" film "<a href="https://www.imdb.com/title/tt0141926/">U571</a>".&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:u571" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:game">
<p>As seen in the historically "accurate" film "<a href="https://www.imdb.com/title/tt2084970">The Imitation Game</a>".&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:game" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:history">
<p><del>As seen in the historically "accurate" film</del> By either the Brits or the Americans <a href="https://en.wikipedia.org/wiki/Public_key_infrastructure#History">depending on whose history you think is accurate</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:history" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:ed">
<p>With huge thanks to my gang of unpaid editors, including <a href="https://solipsys.co.uk/">Colin</a> and Liz. Any mistakes, errors, and typos are my responsibility.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:ed" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:bits">
<p>By contrast, <a href="https://en.wikipedia.org/wiki/Enigma_machine#Mathematical_analysis">the Enigma had about 67 bits of complexity</a>, resulting in approximately 158 quintillion combinations. Hence the need for cryptanalysis rather than just brute force!&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:bits" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:computers">
<p>Well, OK, you could have a staff of several <a href="https://www.sciencemuseum.org.uk/objects-and-stories/women-computing">women who were called computers</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:computers" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:coprime">
<p>Confusingly, a co-prime doesn't have to be a prime number.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:coprime" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:small">
<p>By the end of the 19th century, <a href="https://arxiv.org/pdf/1810.05244">all prime numbers up to 1 billion</a> had been discovered - that's around 50 million different primes. Far fewer combinations than the Enigma, but still a formidable challenge to try and randomly guess which two had been used.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:small" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:baudot">
<p>This isn't too much of a stretch. The <a href="https://en.wikipedia.org/wiki/Baudot_code">Baudot code</a> was invented in the late 1800s. It is the binary code from which ASCII descends.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:baudot" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:ten">
<p>In this example, we might still be subject to <em>some</em> frequency analysis issues. There are common ways to start a message which could be pre-computed.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:ten" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:listening">
<p>Yes, there are ways round this. You could start each message with a plaintext callsign, or broadcast on different frequencies, or some other differentiator. The point is that it adds complexity.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:listening" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:separate">
<p>Again, there are ways round this. But they mostly involve generating even more shared keys. At which point, you're almost back to symmetric encryption!&nbsp;<a href="https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/#fnref:separate" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61738&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/07/it-is-1939-and-you-want-to-use-public-key-cryptography/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Some esoteric versioning schemes (monotonic moronity)]]></title>
		<link>https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/</link>
					<comments>https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 12:34:33 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[shitpost]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=58043</guid>

					<description><![CDATA[Since time immemorial, software has had version numbers.  A developer releases V1 of their product. Some time later, they add new features or fix bugs, and release the next version.  What should that next version be called? Modern software broadly bifurcates into two competing standards; SemVer and CalVer.  SemVer  Semantic Versioning is usually in the form 1.2.3, the last digit is usually for…]]></description>
										<content:encoded><![CDATA[<p>Since time immemorial, software has had version numbers.  A developer releases V1 of their product. Some time later, they add new features or fix bugs, and release the next version.</p>

<p>What should that next version be called? Modern software broadly bifurcates into two competing standards; <code>SemVer</code> and <code>CalVer</code>.</p>

<h2 id="semver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#semver">SemVer</a></h2>

<p><strong>Sem</strong>antic <strong>Ver</strong>sioning is usually in the form <code>1.2.3</code>, the last digit is usually for minor bug fixes, the second digit for new functionality, and the primary digit for big and/or breaking changes.</p>

<p>The semantics are <em>pretty</em> loose. There's no real consensus on when a new "primary" number should be issued. There are two main weaknesses:</p>

<ol>
<li>The numbers might not be decimals. Is <code>V1.29</code> newer or older than <code>V1.3</code>?</li>
<li>There's no semantic information about <em>when</em> the software was released.</li>
</ol>

<p>Which leads us to…</p>

<h2 id="calver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#calver">CalVer</a></h2>

<p><strong>Cal</strong>endar <strong>Ver</strong>sioning is, ironically, more semantic than SemVer. The version number is the date when the software was released.  For example, Ubuntu releases are in the form of <code>YY.MM</code> - the latest stable release at the time of writing is <code>24.04</code> - so we can tell that it was released in April 2024.</p>

<p>There are three main problems with this approach.</p>

<ol>
<li>ISO8601 or GTFO! Surely these should use <code>YYYY-MM</code> to make it obvious this is a date?</li>
<li>Minor bug fixes are often given a release number like <code>24.04.1</code> - is that still obvious it is date-based? Was it really released on the 1st of April?</li>
<li>No information about big and/or breaking changes. Software released several years apart may be functionally identical whereas software released days apart may be incompatible.</li>
</ol>

<h2 id="alternatives"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#alternatives">Alternatives</a></h2>

<p>So, what other ways can we number software versions?</p>

<h3 id="effver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#effver">EffVer</a></h3>

<p><a href="https://jacobtomlinson.dev/effver/"><strong>Eff</strong>ort <strong>Ver</strong>sioning</a> is, I think, a sensible way to standardise SemVer. It attempts to show how much effort it takes to move between versions.</p>

<h2 id="pridever"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#pridever">PrideVer</a></h2>

<p><a href="https://mastodon.online/@nikitonsky/113691789641950263">How much Pride</a> do you have in your software release?</p>

<p>This is SemVer for people with an ego and the coding chops to match.</p>

<h3 id="ruffver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#ruffver">RuffVer</a></h3>

<p><a href="https://docs.astral.sh/ruff/versioning/">Ruff</a> is a sort of bastard child between SemVer and CalVer, but adds this delightful complication:</p>

<blockquote><p>Stable releases use even numbers in minor version component: <code>2024.30.0</code>, <code>2024.32.0</code>, <code>2024.34.0</code>, … Preview releases use odd numbers in minor version component: <code>2024.31.0</code>, <code>2024.33.0</code>, <code>2024.35.0</code>, …</p></blockquote>

<p>It's the versioning equivalent of setting up a fully scalable cloud database and hand-chiselling HTML out of stone for the cookery blog you update twice per year.</p>

<h3 id="0ver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#0ver">0Ver</a></h3>

<p><a href="https://0ver.org/"><strong>Zero</strong>-based <strong>Ver</strong>sioning</a> tells us that it is forbidden to ask and a sin to know when a piece of software will be completed.</p>

<p>Essentially, it is SemVer for cowards who are afraid to commit.  The opposite of <a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#PrideVer">PrideVer</a>.</p>

<h3 id="piver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#piver">PiVer</a></h3>

<p>The venerable TeX uses <a href="https://www.preethamrn.com/posts/piver"><strong>Pi</strong> <strong>Ver</strong>sioning</a>.  The current version is <code>3.141592653</code>, the next version will be <code>3.1415926535</code>.</p>

<p>As the software gets refined, it gradually reaches a state of perfection. This is a charming versioning scheme which shouldn't be used by anyone other than Knuth lest hubris overtake you!</p>

<h3 id="namever"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#namever">NameVer</a></h3>

<p>Sometimes marketing takes the reins and insists that consumers need a <strong>Name</strong>d <strong>Ver</strong>sion to help prevent confusion.</p>

<p>Ubuntu uses things like <code>Bionic Beaver</code>, <code>Distinct Dropbear</code>, and <code>Mantic Minotaur</code>. By convention, names increase alphabetically, so you should know that <code>Jaundiced Jackdaw</code> is before <code>Killer Kangaroo</code> - until you've released 26 version and have to wrap around the alphabet again.</p>

<p>NameVer is helpful for <em>distinct</em> products which aren't related, but probably more confusing than necessary.</p>

<h3 id="winver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#winver">WinVer</a></h3>

<p>Microsoft Windows uses this <em>very</em> logical scheme - 1, 2, 3, 3.11, 98, 2000, Me, XP, Vista, 7, 8, 10, 11.</p>

<p>It starts with more-or-less SemVer, then jumps to CalVer, then 4 digit CalVer, then to NameVer, then back to SemVer - <a href="https://www.engadget.com/2014-10-01-windows-10-9-naming-rumor.html">skipping 9 because of alleged technical reasons</a>.</p>

<p>Do not attempt to use this versioning unless you want to anger <em>both</em> gods and mortals.</p>

<h3 id="kelver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#kelver">KelVer</a></h3>

<p>Absolute Zero is defined as 0K. And so, <a href="https://rybl.net/software-engineering/2022/06/08/kelvin-versioning.html#kelver"><strong>Kel</strong>vin <strong>Ver</strong>sioning</a> counts <em>down</em> to stability.</p>

<p>Almost the opposite of <a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#PiVer">PiVer</a> - the closer this gets to zero, the closer the code is to being complete.</p>

<p>This versioning scheme is affront to most sane people. But here's to the crazy ones.</p>

<h2 id="non-monotonic"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#non-monotonic">Non-Monotonic</a></h2>

<p>You will notice that all of the above are <em>monotonic</em>. That is, they all proceed in one direction and never reverse. Any subsequent version was <em>definitely</em> released later than a previous version.  So, in a sense, they all contain <em>some</em> level of semantics.</p>

<p>But they don't have to.</p>

<h3 id="hashver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#hashver">HashVer</a></h3>

<p>Taking the Cryptographic Hash of the code, or a commit, allows one to create  <strong>Hash</strong> <strong>Ver</strong>sioning. For example <a href="https://github.com/termux/termux-app/commit/43317b78c920a48254f8846f5e14b5f873faa271"><code>43317b7</code></a> is a HashVer for something which would otherwise have the dull and unworthy name of v0.118.1</p>

<p>But, of course, a hash does have a <em>modicum</em> of semantic information - even if it is only loosely related to the content of the code.  What if there were something with <em>no</em> semantics and <em>no</em> monotonic behaviour!?!?</p>

<h3 id="randver"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#randver">RandVer</a></h3>

<p>Embrace the weird with <strong>Rand</strong>om <strong>Ver</strong>sioning!  It its heart, <a href="https://nedbatchelder.com/blog/202305/scriv_on_test_code.html">RandVer</a> says pick any number that hasn't been used before.</p>

<p>Perhaps <code>V7</code> is followed by <code>V2.5</code>, which is overtaken by <code>V0xDEADBEEF</code></p>

<p>Absolutely guaranteed to have zero semantic content.</p>

<h2 id="what-have-we-learned-today"><a href="https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/#what-have-we-learned-today">What have we learned today?</a></h2>

<p>The square-root of bugger-all.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=58043&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/02/some-esoteric-versioning-schemes-monotonic-moronity/feed/</wfw:commentRss>
			<slash:comments>11</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Can time-travellers use TOTP codes?]]></title>
		<link>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/</link>
					<comments>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 04 Jul 2024 11:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51034</guid>

					<description><![CDATA[Imagine, just for a moment, you and your friends decide to travel in time. In order to make sure you can authenticate your communications with each other, you set up a shared Time-based One Time Password (TOTP).  The TOTP algorithm uses a Hash-based Message Authentication Code (HMAC). The hash is calculated from a shared key and a time-based component.  The key is a short string of characters.…]]></description>
										<content:encoded><![CDATA[<p>Imagine, just for a moment, you and your friends decide to travel in time. In order to make sure you can authenticate your communications with each other, you set up a shared Time-based One Time Password (<a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOTP</a>).</p>

<p>The TOTP algorithm uses a Hash-based Message Authentication Code (<a href="https://en.wikipedia.org/wiki/HMAC">HMAC</a>). The hash is calculated from a shared key <em>and</em> a time-based component.</p>

<p>The key is a short string of characters. The time-based component is calculated as the number of seconds between now and the Unix Epoch. When is the Unix Epoch? 00:00:00 UTC on Thursday, 1 January 1970<sup id="fnref:uk"><a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fn:uk" class="footnote-ref" title="As an aside, in 1970, the UK was on BST - British Standard Time rather than GMT / UTC." role="doc-noteref">0</a></sup>. It has been roughly 1.7 billion seconds since then. 64 bit computer systems can count up for another 290 billion <em>years</em><sup id="fnref:2038"><a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fn:2038" class="footnote-ref" title="Or, if you're stuck using 32 bit time, until the year 2038." role="doc-noteref">1</a></sup>. So chrononauts journeying to the future should be fine.</p>

<p>But what about people travelling <em>backwards</em>?  You and your friends want to go and see The Beatles perform in 1966.  That's before 1970.  So the time-based component will be a <strong>negative</strong> number.</p>

<p>I've tried a bunch of different TOTP generators and fed them a variety of negative numbers. They all crashed.</p>

<p>So, no. TOTP doesn't work for anyone travelling backwards in the 4th dimension. Pity.</p>

<p>Is there a serious point to this?  Well, sort of.</p>

<p>Negative time is an unexpected input and leads to unusual behaviours.  Could a crash in HMAC generation lead to an exploit?</p>

<p>Standards get used in all sorts of places - including retrospectively. Should standards writers specifically account for inputs which occur in the past?</p>

<p>How should computers deal with <a href="https://mastodon.social/@tubetime/110811949233318077">"preposterous" times</a>?</p>

<p>What other common security tools fail if they're subjected to time-travel?</p>

<p>Which Beatles concert would you go to in 1966?</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:uk">
<p>As an aside, in 1970, the UK was on BST - <a href="https://en.wikipedia.org/wiki/British_Summer_Time#Periods_of_deviation">British <em>Standard</em> Time</a> rather than GMT / UTC.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fnref:uk" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:2038">
<p>Or, if you're stuck using 32 bit time, <a href="https://en.wikipedia.org/wiki/Year_2038_problem">until the year 2038</a>.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fnref:2038" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51034&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[There should only ever be one way to express yourself]]></title>
		<link>https://shkspr.mobi/blog/2024/02/there-should-only-ever-be-one-way-to-express-yourself/</link>
					<comments>https://shkspr.mobi/blog/2024/02/there-should-only-ever-be-one-way-to-express-yourself/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 11 Feb 2024 12:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45224</guid>

					<description><![CDATA[I&#039;ve been thinking about programming languages and their design.  In her book about the divergence of the English and American languages, Lynne Murphy asks this question:  wouldn’t it be great if language were logical and maximally efficient? If sentences had only as many syllables as strictly needed? If each word had a single, unique meaning? If there were no homophones, so we’d not be able to mi…]]></description>
										<content:encoded><![CDATA[<p>I've been thinking about programming languages and their design.</p>

<p>In her book about the divergence of the English and American languages, Lynne Murphy asks this question:</p>

<blockquote><p>wouldn’t it be great if language were logical and maximally efficient? If sentences had only as many syllables as strictly needed? If each word had a single, unique meaning? If there were no homophones, so we’d not be able to mix up dear and deer or two and too?</p></blockquote>

<p>That got me thinking about the creativity which can be expressed in code - and whether its a good thing.</p>

<p>Let's take an incredibly simple and common operation - incrementing an integer variable by one.  How would you do that? You've probably see these variations:</p>

<pre><code class="language-_">$i = $i + 1;
</code></pre>

<p>or</p>

<pre><code class="language-_">$i = $i++;
</code></pre>

<p>or</p>

<pre><code class="language-_">$i = 1 + $i;
</code></pre>

<p>or</p>

<pre><code class="language-_">$i = int( float_adder( float($i), 1.00 ) );
</code></pre>

<p>or</p>

<pre><code class="language-_">i1, i2 = i1^i2, (i1&amp;i2) &lt;&lt; 1 
</code></pre>

<p>I'm sure you can come up with a few more esoteric methods.</p>

<p>The Python programming language has a <a href="https://legacy.python.org/dev/peps/pep-0020/">list of aphorisms for good programming practice</a>. One of which is:</p>

<blockquote><p>There should be one-- and preferably only one --obvious way to do it.</p></blockquote>

<p>Is that right? As described in <a href="https://blog.startifact.com/posts/older/what-is-pythonic.html">What is Pythonic?</a>, the Python language itself has multiple ways to accomplish one thing.</p>

<p>But, is it a good idea?</p>

<p>Back to Lynne Murphy again:</p>

<blockquote><p>No, absolutely not. No way. Quit even thinking that. What are you, some kind of philistine? If Shakespeare hadn’t played with the number of syllables in his sentences, he would not have been able to communicate in iambic pentameter.</p></blockquote>

<p>Shakespeare wasn't writing Python though, was he?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45224&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/there-should-only-ever-be-one-way-to-express-yourself/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The Seven Levels of Open Source]]></title>
		<link>https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/</link>
					<comments>https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 08 Feb 2024 12:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=48953</guid>

					<description><![CDATA[This isn&#039;t an original idea, but I needed to get it out of my brain.  There are many different definitions of what &#34;Open Source&#34;. We can have a lovely argument over a pint as to whether GPLv3 is too open or if a licence which hasn&#039;t been validated by the OSI counts. But, more fundamentally, I think Open Source roughly falls into seven levels.  These aren&#039;t in any particular order of importance.…]]></description>
										<content:encoded><![CDATA[<p>This isn't an original idea, but I needed to get it out of my brain.</p>

<p>There are many different definitions of what "Open Source". We can have a lovely argument over a pint as to whether GPLv3 is <em>too</em> open or if a licence which hasn't been validated by the OSI counts. But, more fundamentally, I think Open Source roughly falls into <a href="https://www.nme.com/news/music/paul-mccartney-12-1188735">seven levels</a>.</p>

<p>These aren't in any particular order of importance. And feel free to argue in the comments if you think I've radically misunderstood something.</p>

<h2 id="1-look-but-dont-touch"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#1-look-but-dont-touch">1. Look but don't touch</a></h2>

<p>This is the bare minimum. The source is "open" in that you can look at it, examine it, and possibly even learn from it. But that' is <em>it</em>.</p>

<p>You can't redistribute it. You can't edit it. You can't build on it.  But you can see it.</p>

<h2 id="2-do-what-thou-wilt"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#2-do-what-thou-wilt">2. Do What Thou Wilt</a></h2>

<p>The source is yours to do with as you please.  You can distribute it, build on it, print it out, eat it, use it in a weapons system.  There are no restriction.</p>

<p>Have fun!</p>

<h2 id="3-do-as-you-would-be-done-by"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#3-do-as-you-would-be-done-by">3. Do As You Would Be Done By</a></h2>

<p>There is ponderous legal language, but it all adds up to one thing - you have to comply with our requirements.</p>

<p>Perhaps they say "only redistribute with this licence" or maybe "you must make everything this touches open".  Either way, you aren't quite as free to do what you want.</p>

<p>Have fun - but don't piss off anyone.</p>

<h2 id="4-id-rather-you-didnt"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#4-id-rather-you-didnt">4. I'd rather you didn't</a></h2>

<p>These are less often seen, but becoming more common.  You are free to do anything you want with this code... unless you're someone we don't like.</p>

<p>Some code says you can't use it for military purposes, others restrict its usage if you're going to be racist with it, and some say it can only be used by a particular class of people.</p>

<p>These licences are controversial. Openness means this is for everybody.  Sure, no one likes the thought of their code being in a bomb. But your agents of imperial oppression are my freedom fighters.</p>

<h2 id="5-contributors-welcome"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#5-contributors-welcome">5. Contributors Welcome</a></h2>

<p>We're on GitHub! We actively want you to participate!  Not only is the code open - but so is the community!  Anyone with an IDE and an idea is welcome to pitch in!</p>

<p>Come play!</p>

<h2 id="6-blessed-contributors"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#6-blessed-contributors">6. Blessed Contributors</a></h2>

<p>We're open! But only certain people are allowed to contribute.  All others will be shunned.</p>

<p>This is the model Google takes with Android - fully open, but good luck getting even a comma changed.  There's also a popular open source project which requires its contributors to be religious!</p>

<p>This is open; but only for the chosen few.</p>

<h2 id="7-the-future"><a href="https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/#7-the-future">7. The Future</a></h2>

<p>There is something coming that you and I cannot understand. Deep in the darkest trenches of the Internet comes a new breed of hacker. Their social norms diverge from ours. They aren't beholden to the old ways and care not for our pettifogging traditions.</p>

<p>The are building a new form of Open Source. Something that reflects the needs and concerns of their generation, rather than the tired problems of ours. Old farts will harrumph and grumble about how it isn't <em>proper</em> Open Source - and moan that the youngling don't fear their elders any more.</p>

<p>But, make no mistake, the future is coming and it doesn't need your old-fashioned opinions.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=48953&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/02/the-seven-levels-of-open-source/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Compressing Text into Images]]></title>
		<link>https://shkspr.mobi/blog/2024/01/compressing-text-into-images/</link>
					<comments>https://shkspr.mobi/blog/2024/01/compressing-text-into-images/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 13 Jan 2024 12:34:11 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49184</guid>

					<description><![CDATA[(This is, I think, a silly idea. But sometimes the silliest things lead to unexpected results.)  The text of Shakespeare&#039;s Romeo and Juliet is about 146,000 characters long. Thanks to the English language, each character can be represented by a single byte.  So a plain Unicode text file of the play is about 142KB.  In Adventures With Compression, JamesG discusses a competition to compress text…]]></description>
										<content:encoded><![CDATA[<p>(This is, I think, a silly idea. But sometimes the silliest things lead to unexpected results.)</p>

<p>The text of Shakespeare's Romeo and Juliet is about 146,000 characters long. Thanks to the English language, each character can be represented by a single byte.  So a plain Unicode text file of the play is about 142KB.</p>

<p>In <a href="https://jamesg.blog/2023/12/29/compression-adventures/">Adventures With Compression</a>, JamesG discusses a competition to compress text and poses an interesting thought:</p>

<blockquote><p>Encoding the text as an image and compressing the image. I would need to use a lossless image compressor, and using RGB would increase the number of values associated with each word. Perhaps if I changed the image to greyscale? Or perhaps that is not worth exploring.
</p></blockquote>

<p>Image compression algorithms are, generally, pretty good at finding patterns in images and squashing them down. So if we convert text to an image, will image compression help?</p>

<p>The English language and its punctuation are not very complicated, so the play only contains 77 unique symbols. The ASCII value of each character spans from 0 - 127. So let's create a greyscale image which each pixel has the same greyness as the ASCII value of the character.</p>

<p>Here's what it looks like when losslessly compressed to a PNG:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/01/ascii_grey.png" alt="Random grey noise." width="512" height="277" class="aligncenter size-full wp-image-49360">

<p>That's down to 55KB! About 40% of the size of the original file. It is slightly <em>smaller</em> than ZIP, and about 9 bytes larger than Brotli compression.</p>

<p>The file can be read with the following Python:</p>

<pre><code class="language-python">from PIL import Image
image  = Image.open("ascii_grey.png")
pixels = list(image.getdata())
ascii  = "".join([chr(pixel) for pixel in pixels])
with open("rj.txt", "w") as file:
    file.write(ascii)
</code></pre>

<p>But, even with the latest image compression algorithms, it is unlikely to compress much further; the image looks like random noise.  Yes, you and I know there is data in there. And a statistician looking for entropy would probably determine that the file contains readable data. But image compressors work in a different realm. They look for solid blocks, or predictable gradients, or other statistical features.</p>

<p>But there you go! A lossless image is a pretty efficient way to compress ASCII text.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49184&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/01/compressing-text-into-images/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Selectively Compressed Images - A Hybrid Format]]></title>
		<link>https://shkspr.mobi/blog/2023/06/selectively-compressed-images-a-hybrid-format/</link>
					<comments>https://shkspr.mobi/blog/2023/06/selectively-compressed-images-a-hybrid-format/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 01 Jun 2023 11:34:53 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[compression]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[images]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45892</guid>

					<description><![CDATA[I have a screenshot of my phone&#039;s screen. It shows an app&#039;s user interface and a photo in the middle. Something like this:    If I set the compression to be lossy - the photo looks good but the UI looks bad. If I set the compression to be lossless - the UI looks good but the filesize is huge.  Is there a way to selectively compress different parts of an image? I know WebP and AVIF are pretty…]]></description>
										<content:encoded><![CDATA[<p>I have a screenshot of my phone's screen. It shows an app's user interface and a photo in the middle. Something like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/05/Camera-screenshot-40.jpg" alt="Screenshot of a camera app on a phone. The middle is a photo, the sides show the user interface." width="1024" height="512" class="aligncenter size-full wp-image-45893">

<p>If I set the compression to be lossy - the photo looks good but the UI looks bad.
If I set the compression to be lossless - the UI looks good but the filesize is huge.</p>

<p>Is there a way to selectively compress different parts of an image? I know WebP and AVIF are pretty magical but, as I understand it, the whole image is compressed with the same algorithm and the same settings.</p>

<p>There are two ways to do this. The impossible way and the cheating way.</p>

<h2 id="selective-compression"><a href="https://shkspr.mobi/blog/2023/06/selectively-compressed-images-a-hybrid-format/#selective-compression">Selective Compression</a></h2>

<p>In <em>theory</em> it should be possible to tell an image format to compress some chunks of an image with a different compression algorithm.</p>

<p>And yet... <em>none</em> of the documentation I've found shows that's possible.</p>

<p>GiMP's native XCF and Photoshop's PSD files work; they store different layers each of which can have a different filetype. I understand that TIFF and .djvu also have that capability.</p>

<p>But those sorts of files don't display in web browsers.</p>

<p>So...</p>

<h2 id="lets-cheat"><a href="https://shkspr.mobi/blog/2023/06/selectively-compressed-images-a-hybrid-format/#lets-cheat">Let's Cheat!</a></h2>

<p>It's possible to use an SVG to embed multiple images of different formats. SVG is used as, effectively, a layout engine.</p>

<p>The syntax is relatively straightforward:</p>

<pre><code class="language-svg">&lt;svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1080 512"&gt;
   &lt;image width="1080" height="512" x="0" y="0"
      xlink:href="data:image/jpeg;base64,..........."
   /&gt;
   &lt;image width="1080" height="512" x="0" y="0"
      xlink:href="data:image/png;base64,..........."
   /&gt;
&lt;/svg&gt;
</code></pre>

<p>That draws the JPG then draws the PNG on top of it. If the PNG has a transparent section, the JPG will show through. The JPG can be set to as low a quality as you like and the PNG remains lossless.</p>

<p>Here's what it looks like - click for full size:</p>

<p><a href="https://shkspr.mobi/blog/wp-content/uploads/2023/06/Mixed-Compression.svg"><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/06/Mixed-Compression.svg" alt="Screenshot of a phone's camera app with a heavily compressed photo inside it." class="aligncenter size-full wp-image-45906" width="1080" height="512"></a></p>

<p>Embedded images are Base 64 encoded, which does lose some of the compression advantages. But, overall, it's smaller than a full PNG and better quality than a full JPG.</p>

<p>Look, if it's stupid but it works it's not stupid.</p>

<p>But surely there must be a way of doing this natively?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45892&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/06/selectively-compressed-images-a-hybrid-format/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Some thoughts on "Hacking the Cis-tem"]]></title>
		<link>https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/</link>
					<comments>https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 04 Apr 2023 11:34:49 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[gender]]></category>
		<category><![CDATA[trans]]></category>
		<category><![CDATA[🏳️‍⚧️]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45240</guid>

					<description><![CDATA[I recently read a wonderful paper by Mar Hicks called &#34;Hacking the Cis-tem&#34; which is about database design in the 1960s and the nascent digital state&#039;s approach to transgender individuals.  It&#039;s a short and readable paper with some jaw-dropping anecdotes. Like the man who immediately got a pay rise after his transition, despite working in exactly the same job as before; women were on a lower pay…]]></description>
										<content:encoded><![CDATA[<p>I recently read a wonderful paper by <a href="https://marhicks.com/profile.html">Mar Hicks</a> called "Hacking the Cis-tem" which is about database design in the 1960s and the nascent digital state's approach to transgender individuals.</p>

<p>It's a short and readable paper with some jaw-dropping anecdotes. Like the man who immediately got a pay rise after his transition, despite working in exactly the same job as before; women were on a lower pay scale...</p>

<p>At a basic level you can see why, when computer memory was measured in tens of kilobytes, it made sense to say <code>male==0</code> and <code>female==1</code>. Why waste precious bits on something which could only ever be binary? Why create an option to change a data field which is immutable? Why design a schema which would allow a woman to be married to another woman?</p>

<p>And yet, even with those constraints, people were able to change their "official" gender within the database. Oh, sure, there were all sorts of cludges (both technical and political) - but it <em>was</em> possible.</p>

<p>The paper sparked four main thoughts for me.</p>

<h2 id="theres-no-such-thing-as-immutable"><a href="https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#theres-no-such-thing-as-immutable">There's No Such Thing As Immutable</a></h2>

<p>For all the talk of Blockchain solving the world's issues (🤣) sometimes it is necessary to "rewrite history". People make mistakes. Assumptions change. Knowledge improves. Lots of facts, it turns out, are matters of perspective.</p>

<p>A really good example of this is time.  I don't mean pesky things like timezones and leap seconds. I mean that, due to general relativity, <a href="https://www.bbc.co.uk/newsround/64801599">one second on the moon is not equal to one second on Earth</a>.  How does your time-ordered database cope with that?</p>

<p>You might very well live in a culture where divorce is impossible, or where <a href="https://www.gov.uk/government/publications/criminal-law-rape-within-marriage">sexual consent cannot ever be revoked</a>, or where a person can only be married to one other person at a time. But these are all societal conventions which are liable - and indeed likely - to change.</p>

<p>I'm <em>almost</em> tempted to say that the <code>boolean</code> type shouldn't exist in modern databases!</p>

<h2 id="diverse-teams-build-better-products"><a href="https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#diverse-teams-build-better-products">Diverse Teams Build Better Products</a></h2>

<p>I don't know how many computer programmers in the 1960s were part of the LGBTQ+ community. And I don't know how accepting their colleagues would have been of them.</p>

<p>Perhaps you have read and memorised every single one of the <a href="https://github.com/kdeldycke/awesome-falsehood">Falsehoods Programmers Believe About...</a> lessons. But surely it is more efficient to build a team who are empowered enough to confidently correct their colleagues' incorrect assumptions about how the world is arranged?</p>

<p>We bake rigid assumptions into our designs not out of malign intent (usually) but because we're ignorant.  That's only shameful if we refuse to listen to other people's experiences.</p>

<h2 id="computers-serve-humans-not-the-other-way-around"><a href="https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#computers-serve-humans-not-the-other-way-around">Computers Serve Humans - not the other way around</a></h2>

<p>Most of us have been forced to lie to a computer at one time or another. Perhaps it is a system which insists that you <em>must</em> have a US-style ZIP code. Or that your name <em>must</em> be longer that three characters. Or that you don't have an apostrophe in your email address. Or that your wife is Mrs, not Ms.</p>

<p>I know for sure that you've filled in a paper form where the boxes were too small and you've had to decide how to truncate your data.</p>

<p>Why? Because people have designed a schema which doesn't account for the variety in the world.</p>

<h2 id="todays-constraints-arent-tomorrows"><a href="https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#todays-constraints-arent-tomorrows">Today's constraints aren't tomorrow's</a></h2>

<p>As I said at the start, it's understandable that designers designed around the constraints they faced. But these days, we have an awareness of the likely progress of technology.</p>

<p>It's said that the Apollo Moon landings were only possible because the designers <a href="https://web.archive.org/web/20230326154258/https://archive.canadianbusiness.com/blogs-and-comment/stop-using-gretzky-where-the-puck-is-quote/">skated to where the puck was <em>going</em> to be</a>. They made reasonable assumptions about what technology was going to be developed in the future.</p>

<p>Yes, we should try and build things which perform well on existing and historic hardware. But we can't ignore the fact that tomorrow's computers will be smaller, faster, cheaper, and more efficient.</p>

<p>Does it make sense to store a human's name as:</p>

<pre><code class="language-sql">CREATE TABLE people (
  name VARCHAR(32) CHARACTER SET latin1
);
</code></pre>

<p>Probably not. Disk space is cheap and getting cheaper. Perhaps people of the future will have names consisting of 500 emoji? Or perhaps people with "exotic" Unicode characters will want to use our services.</p>

<p>Oh, I'm sure there will be a performance hit if every column is essentially unlimited. But that's an argument to design better database engines - not to limit human expression.</p>

<h2 id="read-more"><a href="https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/#read-more">Read More</a></h2>

<p>You can <a href="https://doi.org/10.1109/MAHC.2019.2897667">read "Hacking the Cis-tem" in the IEEE</a> or, if that's not available to you, <a href="https://marhicks.com/writing/hicks-hackingthecistempreprint.pdf">read the pre-print</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45240&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/04/some-thoughts-on-hacking-the-cis-tem/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review: "You Are Not Expected to Understand This" How 26 Lines of Code Changed the World - Torie Bosch ★★★★⯪]]></title>
		<link>https://shkspr.mobi/blog/2023/03/book-review-you-are-not-expected-to-understand-this-how-26-lines-of-code-changed-the-world-torie-bosch/</link>
					<comments>https://shkspr.mobi/blog/2023/03/book-review-you-are-not-expected-to-understand-this-how-26-lines-of-code-changed-the-world-torie-bosch/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 31 Mar 2023 11:34:50 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45213</guid>

					<description><![CDATA[A superb book! It traces the origins of 26 facets of modern life so that you can understand the code which underpins them.  There&#039;s only a smattering of actual code you need to read - most of it is constrained to gorgeous hand-drawn illustrations. Although I got a bit of a shock in the 2nd essay when I was confronted by ξ3 &#60; exp(ΔE/τ)! Thankfully the rest of the chapter does a good job of ex…]]></description>
										<content:encoded><![CDATA[<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/03/9780691208480.jpg" alt="Book cover. Lines of code hover on a blue background." width="200" class="alignleft size-full wp-image-45216">A superb book! It traces the origins of 26 facets of modern life so that you can understand the code which underpins them.</p>

<p>There's only a smattering of <em>actual</em> code you need to read - most of it is constrained to gorgeous hand-drawn illustrations. Although I got a bit of a shock in the 2nd essay when I was confronted by <code>ξ3 &lt; exp(ΔE/τ)</code>! Thankfully the rest of the chapter does a good job of explaining it and why it is important.</p>

<p>There are some amazing confessionals from people who, arguably, made the world a little worse with their creations. It is a pity the author of the Morris worm refuses to discuss his creation though.</p>

<p>A few of the essays are a little credulous when it comes to grand claims - the BitCoin essay is laughably naïve - but these are relatively short sketches which will hopefully drive you to read more about their subject.</p>

<p>It does do a good job of pointing to papers I'd never heard of, like "<a href="https://doi.org/10.1109/MAHC.2019.2897667">Hacking the Cis-team: Transgender Citizens and the Early Digital State</a>" which describes how the binary of machines was used to rigidly enforce the gender binary. Sadly, it suffers a little from constantly using Wikipedia and Britannica for references - I'd much rather see source material.</p>

<p>There's an excellent range of information in here. It perfectly demonstrates that, of course, it isn't the lines of code which change the world - it's the people who dare to dream about a new paradigm.  Not everyone emerges from the book a hero, but they all made an impact.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45213&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/03/book-review-you-are-not-expected-to-understand-this-how-26-lines-of-code-changed-the-world-torie-bosch/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Touring TNMOC with a living legend]]></title>
		<link>https://shkspr.mobi/blog/2023/03/touring-tnmoc-with-a-living-legend/</link>
					<comments>https://shkspr.mobi/blog/2023/03/touring-tnmoc-with-a-living-legend/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 07 Mar 2023 12:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[history]]></category>
		<category><![CDATA[openuk]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43116</guid>

					<description><![CDATA[This is a retropost. It was written in 2022, but published later.  Well, that was the most bizarre day. A few days ago, Amanda Brock - the CEO of OpenUK - asked if I&#039;d be on a podcast. I agreed, and offered up my office&#039;s media studio for the recording. Then she asked if it was OK if Bruce Perens came to record an episode.  Errr... OMG, yes!  So I got to spend 10 minutes showing Bruce around the…]]></description>
										<content:encoded><![CDATA[<p><ins datetime="2022-07-02T21:26:20+00:00">This is a retropost. It was written in 2022, but published later.</ins></p>

<p>Well, that was the most bizarre day. A few days ago, Amanda Brock - the CEO of OpenUK - asked if I'd be on a podcast. I agreed, and offered up my office's media studio for the recording. Then she asked if it was OK if <a href="https://en.wikipedia.org/wiki/Bruce_Perens">Bruce Perens</a> came to record an episode.</p>

<p>Errr... OMG, yes!</p>

<p>So I got to spend 10 minutes showing Bruce around the GDS office, gushing about how much open source stuff we did - then got to watch him record a podcast.</p>

<p>Amanda - who has has a canny eye for when people are slightly star-struck - asked if I'd like to interview Bruce at the weekend. At the National Museum of Computing. For a new exhibition.</p>

<p>Errr... OMG, yes!</p>

<p>So me and <a href="https://www.linkedin.com/in/lowena-hull/">Lowena Hull</a> got to spend some time chatting to Bruce on camera about his involvement in open source, the early days of Debian, and why OSS is still relevant today.</p>

<blockquote class="social-embed" id="social-embed-1543241484274700288" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Doing some filming with <a href="https://twitter.com/BrucePerens">@BrucePerens</a> &amp; <a href="https://twitter.com/LowenaHull">@LowenaHull</a> for <a href="https://twitter.com/openuk_uk">@openuk_uk</a>. Thanks to <a href="https://twitter.com/tnmoc">@tnmoc</a> for the great location! <a href="https://x.com/edent/status/1543241484274700288/photo/1">pic.x.com/nK4ihOhH0T</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/FWqx4g5XwAAfORI.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="Me, Bruce, Lowena are all smiling and sat in a library full of old computer books." src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1543241484274700288"><span aria-label="13 likes" class="social-embed-meta">❤️ 13</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-07-02T14:33:36.000Z" itemprop="datePublished">14:33 - Sat 02 July 2022</time></a></footer></blockquote>

<p>We had a good rambling chat - the majority of which never made it off the cutting room flaw. He was such an eloquent speaker - always taking a moment to marshal his thoughts and knowing exactly when to finish his soliloquy.</p>

<p>It was a fairly long and tiring afternoon. But we had just enough time to take a wander through TNMOC. Bruce - like lots of elder-statesgeeks - seemed to be in 7th heaven. I got a running commentary of "Wow! You know, I had an early one of these..." and "I think I've still got the original one in my attic..." and "When I worked at Pixar, I was chatting to Steve [Jobs] about this and we both thought it was pretty nifty..." along with the obligatory "Why is a slide-rule in a museum?"</p>

<p>I watched him go toe-to-toe with the geeks who maintain <a href="https://en.wikipedia.org/wiki/Colossus_computer">Colossus</a> - discussing the intricacies of synchronising tape speeds, various Baudot codes, and where valves / tubes could still be acquired from.</p>

<p>I saw him in a spirited discussion about various flavours of <a href="https://en.wikipedia.org/wiki/ALGOL">ALGOL</a> and the mechanics of repairing a filesystem on hard-drives the same height as a man.</p>

<p>We had an interesting chat about IBM and their complicity in the Nazi regime's use of Hollerith cards.  And I got to give him a précis of the BBC Micro's impact on the UK.</p>

<p>He asked me to take a few photos of him standing by ancient monuments of technology</p>

<blockquote class="social-embed" id="social-embed-1543628810423345152" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/BrucePerens" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRoYCAABXRUJQVlA4IHoCAAAQDACdASowADAAPrVGn0ynIyKiLjQLMOAWiWMAr4uqPmJ4D1XLRe1OW7pXGlBm0/cMu5Enc91Qpx8+TgXb4TSab0K90Dqps/RFKeBAyA/XpmzxZcz/CH0whlHthjlmavDB9MLJ82t2cSAA/vHhLV67RCjLBdu3Ki4Ib4pXMQlf0cShnpSvyyoDbL3Z59h/pPO1DlTVRplNav0P4eGrUg8i4azzdubjUMWkIBE4zafJr6RWE4dDmQOSEBs8DHEcHh57to4VwKKUYW/uUVb7e1HaKt3bd3dP0D7Vmbooct44wzPrRGXdngwEqQpo7QlX6WY+YDRqTqgc7TjZNrjV27C5IGL7XJOwp0AiQKoGq44ymIPFBg+9/QzM0JRBvf8fA0bM3sgXXD8mj7RdeVFe44RRtApdlIFrwQn14kH4ZPNaOLW9ls+6/9C0j9qLbCQ/3hx6cfJ5m/5tP51M2I986zdKVhZqeqrTGFrxCiDD17haSwpFtSff7p16qLmyG8Hwzb6Jojqsg1UrigGMIrEHLfjwc8v/+DLGOp3rb2mCQmHfH9/CuhnHQilfrY3/eNWK7De9TpPHiWspCGdQurEGucIZq/Vtp9HaKt8psGxxsRQ/LddwAxT8/8Ulm3pPpFsnZUSKER5cApdRSgxh1EAVdD7vaGXpvVcB9rh5KsmaCLbLut6iy5PR+fTGW2e9awmRgpRA6RTWG3M/ZQo1xq6E2xbGiKypjlx+3xWfKQWxHcDtdalV35SVFQtr7byBvnLDyTKuJa908nOOQmpttbDwLFkGsWK+6Mg000+xwz45T2vVkrEqdBgekWJCmZdi/b29mOZ02cZTBWE2EAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Bruce Perens K6BP - I Stand with Ukraine</p>@BrucePerens</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">1/2 Somehow I walked all of the way through <a href="https://twitter.com/bletchleypark">@bletchleypark</a> today without noticing any mention that the machines they talk about are actually operating next door at <a href="https://twitter.com/tnmoc">@tnmoc</a>, due to the effort of incredibly skilled volunteers. And there is no flow between the two museums. Please ... <a href="https://x.com/BrucePerens/status/1543628810423345152/photo/1">pic.x.com/w11orsCof9</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/FWwSNslXEAINF30.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/BrucePerens/status/1543628810423345152"><span aria-label="17 likes" class="social-embed-meta">❤️ 17</span><span aria-label="2 replies" class="social-embed-meta">💬 2</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2022-07-03T16:12:42.000Z" itemprop="datePublished">16:12 - Sun 03 July 2022</time></a></footer></blockquote>

<p>And, at the end of the day, he shook my hand and <em>thanked me</em> for showing him such a great time.</p>

<p>What a delightful person.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43116&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/03/touring-tnmoc-with-a-living-legend/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Get Chartered!]]></title>
		<link>https://shkspr.mobi/blog/2023/02/get-chartered/</link>
					<comments>https://shkspr.mobi/blog/2023/02/get-chartered/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 10 Feb 2023 12:34:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bcs]]></category>
		<category><![CDATA[CITP]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44732</guid>

					<description><![CDATA[Computing is a comparatively young industry.  We don&#039;t have hundreds of years of history, or secret societies jealously guarding our knowledge, or much love for hierarchy. This makes it difficult to progress in a world which values strict demarcations between people.  There&#039;s an obvious and well documented path from Army Private to Sergeant. If you&#039;re an architect (the kind that designs…]]></description>
										<content:encoded><![CDATA[<p>Computing is a comparatively young industry.  We don't have hundreds of years of history, or secret societies jealously guarding our knowledge, or much love for hierarchy. This makes it difficult to progress in a world which values strict demarcations between people.  There's an obvious and well documented path from Army Private to Sergeant. If you're an architect (the kind that designs buildings) there are various qualifications and bodies to assess your knowledge and seniority.</p>

<p>But computerists? Some of us have academic qualifications - which may or may not be as useful as a bootcamp qualification - and some of us learn from MineCraft mods.  There aren't many external bodies which assess or validate our knowledge.</p>

<p>I'm not sure if I'm happy with that situation or not. I do, occasionally, need to prove to an employer that I'm as good as I say I am. Take-home-tests and whiteboard interviews only get you so far, I've found.</p>

<p>So I was curious to see that BCS - the Chartered Institute for IT<sup id="fnref:bcs"><a href="https://shkspr.mobi/blog/2023/02/get-chartered/#fn:bcs" class="footnote-ref" title="Formerly the &quot;British Computer Society&quot;" role="doc-noteref">0</a></sup> - was offering a discount on its chartering process. This was a chance to have my skills and achievements accredited by someone external. I figured I'd give it a go.</p>

<p><a href="https://www.bcs.org/membership-and-registrations/get-registered/chartered-it-professional/">The process and requirements</a> were pretty simple. Mostly filling in some forms explaining what I'd done in my career, how I'd met certain criteria, and evidence of professional development. My self-promotion had to be signed off by someone who knew me professionally and belonged to an organisation which followed a code of conduct. Luckily my boss<sup>2</sup> was just such a person. Thanks Martin!</p>

<p>After a bit of waiting, I was delighted to find this in my inbox:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/Youve-achieved-CITP-registration-fs8.png" alt="Screenshot of an email congratulating me on becoming registered." width="777" height="609" class="aligncenter size-full wp-image-44735">

<p>And, just like that, <a href="https://www.bcs.org/membership-and-registrations/get-registered/chartered-it-professional/register-of-chartered-it-professionals/">I was listed on their register</a><sup id="fnref:num"><a href="https://shkspr.mobi/blog/2023/02/get-chartered/#fn:num" class="footnote-ref" title="Amusingly, my registration number also comes up when searching for a Stephen King book" role="doc-noteref">1</a></sup></p>

<p><a href="https://www.bcs.org/membership-and-registrations/get-registered/chartered-it-professional/register-of-chartered-it-professionals/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/Register-of-Chartered-IT-Professionals-BCS-fs8.png" alt="Screenshot showing my registration number." width="1023" height="189" class="aligncenter size-full wp-image-44734"></a></p>

<h2 id="what-does-this-mean"><a href="https://shkspr.mobi/blog/2023/02/get-chartered/#what-does-this-mean">What does this mean?</a></h2>

<p>For me, there are two distinct advantages. Primarily, when applying for jobs which list membership of a professional body, or want evidence of my competence, it will be a strong signifier that I have those things. It shows my commitment to Continuing Professional Development, and that I have achieved some level of distinction in my career.</p>

<p>A secondary benefit is getting to use the <a href="https://bcscustomerservice.bcs.org/hc/en-us/articles/207575299-What-postnominal-letters-can-I-use-as-a-member-of-BCS">post nominals</a> <i>CITP MBCS</i>. ✨Fancy!✨</p>

<p>What can I say? It appeals to my vanity.</p>

<h2 id="semantic-data"><a href="https://shkspr.mobi/blog/2023/02/get-chartered/#semantic-data">Semantic Data</a></h2>

<p>I <em>think</em> the correct way to represent this in Schema.org is using <a href="https://schema.org/hasCredential"><code>hasCredential</code></a></p>

<pre><code class="language-html">&lt;script type="application/ld+json"&gt;
    {
        "@context": "https://schema.org",
        "@type": "Person",
        "name": "Terence Eden",
        "hasCredential": {
            "@type": "EducationalOccupationalCredential",
            "credentialCategory": "CITP",
            "recognizedBy": {
                "@type": "Organization",
                "url": "https://www.bcs.org/"
            }
        }
    }
&lt;/script&gt;
</code></pre>

<p>Do correct me if I'm wrong.</p>

<h2 id="and-finally"><a href="https://shkspr.mobi/blog/2023/02/get-chartered/#and-finally">And finally</a></h2>

<iframe title="Accountancy Shanty" width="620" height="465" src="https://www.youtube.com/embed/kn9SMnr55Dk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:bcs">
<p>Formerly the "British Computer Society"&nbsp;<a href="https://shkspr.mobi/blog/2023/02/get-chartered/#fnref:bcs" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:num">
<p>Amusingly, my registration number also comes up when searching for a <a href="https://www.worldcat.org/title/990509732">Stephen King book</a>&nbsp;<a href="https://shkspr.mobi/blog/2023/02/get-chartered/#fnref:num" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44732&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/02/get-chartered/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Regular Expressions make me feel like a powerful wizard - and that's not a good thing]]></title>
		<link>https://shkspr.mobi/blog/2023/02/regular-expressions-make-me-feel-like-a-powerful-wizard-and-thats-not-a-good-thing/</link>
					<comments>https://shkspr.mobi/blog/2023/02/regular-expressions-make-me-feel-like-a-powerful-wizard-and-thats-not-a-good-thing/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 06 Feb 2023 12:34:19 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[regex]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44537</guid>

					<description><![CDATA[(This is a rant because I&#039;m exhausted after debugging something. If you&#039;ve made RegEx your whole personality, I&#039;m sorry.)  The other day I had to fix a multi-line Regular Expression (RegEx). After a few hours of peering at it with a variety of tools, I finally understood the problem. Getting that deep into the esoteric mysteries made me feel like a powerful wizard with complete mastery of my…]]></description>
										<content:encoded><![CDATA[<p>(This is a rant because I'm exhausted after debugging something. If you've made RegEx your whole personality, I'm sorry.)</p>

<p>The other day I had to fix a multi-line Regular Expression (RegEx). After a few hours of peering at it with a variety of tools, I finally understood the problem. Getting that deep into the esoteric mysteries made me feel like a powerful wizard with complete mastery of my domain. And I think that's dangerous.</p>

<p>I'm sure we've all read a story about a witch or wizard who distractedly substitutes eye-of-newt with iron-ute with disastrous consequences.  Humans are easily confused.  And confusion leads to unexpected mistakes.</p>

<p>Look, most humans are very bad at reading compiled code. Without any external tools - can you tell me what the following code does?</p>

<pre><code class="language-bin">0000000 c031 d88e c08e 15be b47c ac0e 003c 0474
0000010 10cd f7eb 48f4 6c65 6f6c 202c 6f57 6c72
0000020 2164 0a0d 0000 0000 0000 0000 0000 0000
0000030 0000 0000 0000 0000 0000 0000 0000 0000
*
00001f0 0000 0000 0000 0000 0000 0000 0000 aa55
0000200
</code></pre>

<p>No. Of course not<sup id="fnref:not"><a href="https://shkspr.mobi/blog/2023/02/regular-expressions-make-me-feel-like-a-powerful-wizard-and-thats-not-a-good-thing/#fn:not" class="footnote-ref" title="You can read the original code which is MIT Licenced." role="doc-noteref">0</a></sup>. That's why we write code in a more human readable language and then compile it to computer readable instructions.</p>

<p>Regular Expressions are a sort-of halfway house. They're <em>slightly</em> readable by humans - but written in such a terse vocabulary as to be mostly unintelligible without concentration. There's no space for comments. Different engines have variable support for all their functions. They are a symbolic language with unhelpfully indecipherable and inconsistent symbols.</p>

<p>As a result, once the RegEx becomes more than trivially complex they're hard for most humans to understand. That makes them difficult to debug. It also makes it difficult to add or remove functionality.</p>

<p>I genuinely - and possibly misguidedly - believe that even something like <code>^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$</code> might just as well be written in <a href="https://esolangs.org/wiki/Brainfuck">BrainFuck</a>.</p>

<p>My contention is that <em>almost all</em> RegExs would be better served by more human readable code and that the very existence of <a href="https://regex101.com/">RegEx101.com</a> ought to bring shame on our industry.</p>

<p>Here are some positive use-cases for RegEx:</p>

<ul>
<li>You want to show off how smart you are.</li>
<li>You need maximum efficiency when combing through a billion lines of text.</li>
<li>You have a desire to build something hard to debug.</li>
<li>You don't have lots of printer paper and need to make your code as terse as possible.</li>
<li>You think if/else and switch/case statements are the mark of a diseased mind.</li>
<li>You don't trust compilers.</li>
</ul>

<p>I know what you're thinking: "This guy's too stupid to get regular expressions!"  Yes. Yes I am. So are most people.</p>

<p>What I'm getting at is that source code is designed to be read and edited by busy and distracted humans.  We should be writing intelligible code for each other and letting computers do the boring work of making it more efficient.</p>

<p>You don't have to agree with me. That's fine. But, perhaps you'll take note of the famous maxim from <a href="https://archive.org/details/newhackersdictio00raym/page/385/mode/1up?q=%22wizard+book%22">the "Wizard" book</a>:</p>

<blockquote><p>a computer language is not just a way of getting a computer to perform operations but rather that it is a novel formal medium for expressing ideas about methodology. Thus, programs must be written for people to read, and only incidentally for machines to execute.</p>

<p><a href="https://web.mit.edu/6.001/6.037/sicp.pdf">Structure and Interpretation of Computer Programs</a></p></blockquote>

<p>We are not wizards. Nor should we strive to be. The alchemists fell.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:not">
<p>You can <a href="https://github.com/AyrA/x86-hello-world">read the original code which is MIT Licenced</a>.&nbsp;<a href="https://shkspr.mobi/blog/2023/02/regular-expressions-make-me-feel-like-a-powerful-wizard-and-thats-not-a-good-thing/#fnref:not" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44537&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/02/regular-expressions-make-me-feel-like-a-powerful-wizard-and-thats-not-a-good-thing/feed/</wfw:commentRss>
			<slash:comments>28</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The absurdity of technocracy]]></title>
		<link>https://shkspr.mobi/blog/2023/01/the-absurdity-of-technocracy/</link>
					<comments>https://shkspr.mobi/blog/2023/01/the-absurdity-of-technocracy/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 28 Jan 2023 12:34:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Babbage]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44403</guid>

					<description><![CDATA[Punch was a satirical magazine first published in Victorian London.  It had a long and noble history of poking fun at... well, just about every fashionable idea of the day.  Anyone who pricked the public&#039;s conscious probably found themselves lampooned within its pages.  Charles Babbage - inventor of the first mechanical computer - found himself starring in a few articles.  Here&#039;s a scan of one…]]></description>
										<content:encoded><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Punch_(magazine)">Punch</a> was a satirical magazine first published in Victorian London.  It had a long and noble history of poking fun at... well, just about every fashionable idea of the day.  Anyone who pricked the public's conscious probably found themselves lampooned within its pages.</p>

<p>Charles Babbage - inventor of the first mechanical computer - found himself starring in a few articles.  Here's <a href="https://www.google.co.uk/books/edition/_/OXAJAAAAQAAJ?hl=en&amp;gbpv=0">a scan of one from 1844</a> (extracted text follows)</p>

<p><a href="https://shkspr.mobi/blog/wp-content/uploads/2022/12/punch.jpg"><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/punch.jpg" alt="Screenshot of a scan of newsprint." width="512" class="aligncenter size-full wp-image-44404"></a></p>

<blockquote><p>Returning to the new Houses of Parliament, we must again protest against the money lavished upon them.</p>

<p>For what business, we ask, has been effected in the present session that might not have been as efficiently transacted in a sentry - box? Wherefore, then, these costly buildings for men to do nothing in? Why, indeed, should we have Members of Parliament at all, when sure we are that MR. BABBAGE would construct a legislating machine, which, in the hands of SIR ROBERT PEEL, would fully answer all the purposes of living senators?</p>

<p>We are serious. We therefore propose that, at the next election, every gentleman desirous of affixing M.P. to his name should, on his election, send his proxy machine to the House of Commons, setting the instrument at "Aye" and "No," as MR. BABBAGE will instruct him, on certain questions, and suffering the Ministry to take their divisions accordingly. The result of the present session convinces us that the "business of the country" will be got through quite as well as by the present mode; with this advantage, that the machines may be put anywhere.</p></blockquote>

<p>While it is mildly amusing that people have <em>always</em> been complaining about the cost of the Houses of Parliament, I think there's a deeper and more interesting story here.</p>

<p>Firstly is the nature of distributed work.  As we saw during lockdown - it's perfectly possible for people to work remotely. MPs were able to debate and vote from home. You can argue whether that's a <em>good</em> thing. <a href="https://commonslibrary.parliament.uk/coronavirus-mps-use-of-virtual-participation-and-proxy-voting-by-gender/">But it is undoubtedly a thing which happened</a>.  There were infrastructure costs - buying laptops, broadband, teaching people how to use equipment - but that is surely nothing compared to <a href="https://www.constructionnews.co.uk/news/parliament-restoration-could-take-76-years-and-cost-22bn-24-02-2022/">the cost of physically maintaining the crumbling building</a>.</p>

<p>But, more interesting, is that over a hundred-and-fifty years ago people were taking the piss out of the idea of a Technocracy. The idea that one man could build a machine which would always give the correct answer to any political question was as laughable then as it is now.</p>

<p>Wouldn't it be <em>amazing</em> if we could compute the correct answers to complex policy questions?</p>

<p>Sadly, we have the small matter of the messy nature of reality to deal with.</p>

<p>There is bias in the way we collect data. There are biases in the way we store, process, and validate data. The algorithms we use are flawed. And even the questions we ask of data reveal the limitations of our imaginations.</p>

<p>Babbage himself had this to say on the subject:</p>

<blockquote><p>On two occasions I have been asked, — "Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?" In one case a member of the Upper, and in the other a member of the Lower, House put this question. I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.</p>

<p><a href="https://archive.org/details/passagesfromlif01babbgoog/page/66/mode/2up">Passages from the Life of a Philosopher (1864), ch. 5 "Difference Engine No. 1"</a></p></blockquote>

<p>It doesn't matter how perfect our computer code is - it will always have to deal with imperfect inputs made by imperfect people.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44403&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/01/the-absurdity-of-technocracy/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Fitting 1 dimensional data into 2 dimensional space]]></title>
		<link>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/</link>
					<comments>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 22 Jul 2022 11:34:22 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[algorithms]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43061</guid>

					<description><![CDATA[A few notes to myself.  Let&#039;s consider a set of 1 dimensional data. For example, the alphabet:  ABCDEFGHIJKLMNOPQRSTUVWXYZ   What do we mean by &#34;1 dimensional&#34;?  Consider the element &#34;B&#34;. From there you can go left to &#34;A&#34; or right to &#34;C&#34;. Left and right are the only directions you can move. You cannot go up or down from &#34;B&#34;. There&#039;s no way to go in or out. You&#039;re trapped in a single dimension. …]]></description>
										<content:encoded><![CDATA[<p>A few notes to myself.</p>

<p>Let's consider a set of 1 dimensional data. For example, the alphabet:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFGHIJKLMNOPQRSTUVWXYZ
</pre>

<p>What do we mean by "1 dimensional"?</p>

<p>Consider the element "B". From there you can go left to "A" or right to "C". Left and right are the only directions you can move. You cannot go up or down from "B". There's no way to go in or out. You're trapped in a single dimension.</p>

<p>What if we want to write the data onto a 2 dimensional space - like a bit of paper or a website.</p>

<p>Well, if the space is big enough, we can write it as we have above. A single line. Job done, go home.</p>

<p>But what if the space is too small in the horizontal direction to contain it all? Well, we could write it in the <em>vertical</em> direction:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">A
B
C
D
…
</pre>

<p>OK, but what if the 2D space is too small in <em>both</em> the horizontal and the vertical directions to contain the 1D data? Now we get into the "exciting" world of space-filling algorithms.</p>

<p>Here's the approach that you're probably most used to. It's certainly the one which springs to most people's minds:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFG
HIJKLMN
OPQRSTU
VWXYX
</pre>

<p>The algorithm is simple. Write horizontally from left to right until you run out of space, then move down one line, return to the left-most side, and continue writing. Repeat.</p>

<p>Except! That's <em>not</em> necessarily the simplest or most obvious way of writing!</p>

<p>There is a different algorithm - <a href="https://en.wikipedia.org/wiki/Boustrophedon">Boustrophedon</a>:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">ABCDEFG
NMLKJIH
OPQRSTU
  ZYXWV
</pre>

<p>Start at the left, when you run out of space, move down a line and continue writing <em>in the opposite direction!</em></p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">→ABCDEFG
        ↓
 NMLKJIH←
↓
→OPQRSTU
        ↓
   ZYXWV←
</pre>

<p>If you haven't spent years learning to read "properly" this form of bi-direction writing may well be easier. You don't need to move your finger or eyes back in a perfectly straight line.</p>

<p>We can go a little further. What if we started at the <em>centre</em> of the page, and wrote out in a spiral?</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">Z
YJKLM
XIBCN
WHADO
VGFEP
UTSRQ
</pre>

<p>As pretty as this looks, there are some obvious drawbacks. Unless you know exactly how long the 1D data is, you won't know where to start on the page. It also might not fill the space in the most efficient manner.</p>

<p>Here's a different algorithm. It starts in the top left corner of the space and gradually spreads out. Growing to fit the data in the space:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;"> ABIJYZ 
 DCHKX  
 EFGLW  
 PONMV  
 QRSTU  
</pre>

<p>If you're having trouble following that, here it is in diagram form:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;"> →↓→↓→ 
 ↓←↑↓↑ 
 →→↑↓↑ 
 ↓←←←↑ 
 →→→→↑ 
</pre>

<p>That's quite a nice algorithm. It starts in a predictable place and it fills up both horizontal and vertical space in equal amounts.</p>

<h2 id="introducing-hilbert-curves"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#introducing-hilbert-curves">Introducing Hilbert Curves!!</a></h2>

<p>Let's start with a simple curve:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">D__C
   |
A__B
</pre>

<p>Where do we go from here? The Hilbert Curve is a fractal algorithm which starts like this:</p>

<pre style="font-size:2em;color:#fff;line-height:1em;overflow:hidden;padding: 1em;">F__G  J__K
|  |  |  |
E  H__I  L
|        |
D__C  N__M
   |  |
A__B  O__P
</pre>

<p>And ends up doing this:</p>

<video poster="//upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Hilbert_Curve_-_6.webm/360px--Hilbert_Curve_-_6.webm.jpg" style="aspect-ratio: 360 / 360;" width="360" height="360" controls="" muted="">
<source src="https://upload.wikimedia.org/wikipedia/commons/transcoded/f/fc/Hilbert_Curve_-_6.webm/Hilbert_Curve_-_6.webm.360p.vp9.webm" type="video/webm">
</video>

<p>Lovely!</p>

<h2 id="non-rectangular-curves"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#non-rectangular-curves">Non-rectangular curves</a></h2>

<p>Not every 2D space is a rectangle. Some have the audacity to be hexagons!</p>

<iframe title="Construction of the Gosper curve" width="620" height="465" src="https://www.youtube.com/embed/KU5Q56wD5Uk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<h2 id="3d"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#3d">3D!</a></h2>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-43061-2" width="620" height="349" preload="metadata" controls="controls"><source type="video/webm" src="https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm">https://shkspr.mobi/blog/wp-content/uploads/2022/07/hilbert3d.webm</a></video></div><p></p>

<h2 id="and-then"><a href="https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/#and-then">And then...</a></h2>

<p>I wonder what interesting things I can do with this new knowledge?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43061&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/07/fitting-1-dimensional-data-into-2-dimensional-space/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[⩵ != ==]]></title>
		<link>https://shkspr.mobi/blog/2021/06/%e2%a9%b5/</link>
					<comments>https://shkspr.mobi/blog/2021/06/%e2%a9%b5/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 07 Jun 2021 11:04:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39195</guid>

					<description><![CDATA[One of the frustrating things about computers is their limited input options. A &#34;standard&#34; PC keyboard only has about 100 keys.  Sure, some have some bonus buttons for controlling the machine, but it is becoming clear that there simply aren&#039;t enough buttons to efficiently program computers.  Most programming languages have the concept of relational operators. How does variable X compare to…]]></description>
										<content:encoded><![CDATA[<p>One of the frustrating things about computers is their limited input options. A "standard" PC keyboard only has about 100 keys.  Sure, some have some bonus buttons for controlling the machine, but it is becoming clear that there simply aren't enough buttons to efficiently program computers.</p>

<p>Most programming languages have the concept of relational operators. How does variable <code>X</code> compare to variable <code>Y</code>?</p>

<p>If we want to ask if <code>X</code> is less than or equal to <code>Y</code>, we write <code>X &lt;= Y</code>.  Which is a bit weird, because Unicode has a "less-than-or-equal-to" character: <code>≤</code>. But because there's no button for that on a standard keyboard, we use a hacky solution of jamming two characters together.</p>

<p>In the R language, the assignment operator is <code>&lt;-</code> this is <a href="https://colinfay.me/r-assignment/">because programming keyboards used to have a <code>←</code> button on them</a>. That button has gone from modern machines, so we make do and mend.</p>

<p>There are some <a href="https://betterwebtype.com/articles/2020/02/13/5-monospaced-fonts-with-cool-coding-ligatures/">programming fonts which contain ligatures to automatically convert these characters</a> (although <a href="https://practicaltypography.com/ligatures-in-programming-fonts-hell-no.html">this makes some people very grumpy</a>).</p>

<p>Unicode includes <code>⩶</code> (<code>U+2A76</code>) and <code>⩵</code> (<code>U+2A75</code>) as distinct glyphs. So why are we still hitting the <code>=</code> key multiple times like <em>savages?</em></p>

<p>This leads to the <em>deeply</em> weird situation where <code>"⩵" ≠ "=="</code> and absolutely no programming language that I know of will let you use the <strong>correct</strong> Unicode characters!</p>

<p>(Except, of course, <a href="https://github.com/rakudo/rakudo/pull/4392">Raku</a> - which made this change <a href="https://twitter.com/liztormato/status/1400781849169965065">based on my suggestion</a>.)</p>

<p>Ideally, we need programming languages which support Unicode symbols as first class characters, and keyboards with a hundred more buttons.</p>

<video muted="true" autoplay="true" loop="true">
 <source src="https://shkspr.mobi/blog/wp-content/uploads/2021/06/fingers.mp4" type="video/mp4">
</video>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39195&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/06/%e2%a9%b5/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Everything is a string. Everything is an object. Everything is bits.]]></title>
		<link>https://shkspr.mobi/blog/2021/03/everything-is-a-string-everything-is-an-object-everything-is-bits/</link>
					<comments>https://shkspr.mobi/blog/2021/03/everything-is-a-string-everything-is-an-object-everything-is-bits/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 28 Mar 2021 11:29:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=38263</guid>

					<description><![CDATA[In response to Tom MacWright&#039;s &#34;One way to represent things&#34; - which I broadly agree with.  When you are a child, the whole world is complicated. By the time you&#039;re a teenager, the whole world is simple. Once you grow up, you realise just how complicated everything is. As you obtain mastery, you find a way to simplify everything.  I expect that by the time I&#039;m old(er) and grey(er) I&#039;ll have gone…]]></description>
										<content:encoded><![CDATA[<p>In response to Tom MacWright's <a href="https://macwright.com/2021/02/23/one-way-to-represent-things.html">"One way to represent things"</a> - which I broadly agree with.</p>

<p>When you are a child, the whole world is complicated. By the time you're a teenager, the whole world is simple. Once you grow up, you realise just how complicated everything is. As you obtain mastery, you find a way to simplify everything.</p>

<p>I expect that by the time I'm old(er) and grey(er) I'll have gone through several more cycles of this process.</p>

<p>When we write code in a traditional programming language, we write strings of characters.  In more sophisticated visual programming languages, <a href="https://scratch.mit.edu/projects/155713202/">like Scratch</a>, we manipulate objects.</p>

<p>But, whatever the programming paradigm, all our data are stored and transmitted as bits.</p>

<p>No one wants to write binary. It is almost impossible for a human to read or write anything with a moderate level of complexity. That's why we have debuggers and decompilers to use when we're forced to deeply examine a truculent piece of code.  And that's why we have moved away from the binary language <del>of moisture vaporators</del> and on to higher languages.</p>

<p>Humans are pattern matching machines. We <em>love</em> categorising things. So much so that occasionally wars break out over whether something is Type X or Type Y.  Our love of categorising comes with other problems.</p>

<blockquote class="social-embed" id="social-embed-1373576953329020928" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Oats + Water = Porridge.<br>Oats + Milk = Porridge.<br>Oats + Plant Milk = Porridge.<br><br>Oats + Water + Salt = Porridge.<br>Oats + Water + Sugar = Porridge.<br><br>Oats + Coca Cola = ...<hr class="social-embed-hr"><label for="poll_1_count">Porridge: (90)</label><br><meter class="social-embed-meter" id="poll_1_count" min="0" max="100" low="33" high="66" value="32.7">90</meter><br><label for="poll_2_count">Not Porridge: (185)</label><br><meter class="social-embed-meter" id="poll_2_count" min="0" max="100" low="33" high="66" value="67.3">185</meter><br></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1373576953329020928"><span aria-label="3 likes" class="social-embed-meta">❤️ 3</span><span aria-label="9 replies" class="social-embed-meta">💬 9</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-03-21T10:07:20.000Z" itemprop="datePublished">10:07 - Sun 21 March 2021</time></a></footer></blockquote>

<p>Taxonomy is hard, as this video adequately explains:</p>

<iframe title="What Makes Soup, Soup? | Short Stuff | Comedy" width="620" height="349" src="https://www.youtube.com/embed/Y1HVTNxwt7w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>The philosophy of numbers plagues programming. Integers, Floats, Fraction, Booleans, Strings - all valid ways to represent numbers, all with complex subtleties and peculiar interactions.</p>

<p>But, in the end, they're all just stored as bytes in memory.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=38263&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/03/everything-is-a-string-everything-is-an-object-everything-is-bits/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What would happen if computers never got any faster?]]></title>
		<link>https://shkspr.mobi/blog/2020/11/what-would-happen-if-computers-never-got-any-faster/</link>
					<comments>https://shkspr.mobi/blog/2020/11/what-would-happen-if-computers-never-got-any-faster/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 26 Nov 2020 12:13:37 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[computers]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37166</guid>

					<description><![CDATA[My first computer was a BBC Micro. It could do basic graphics at a resolution of 640×256 - with 8 different colours. Not a typo. Eight!  The mono speaker produced bleeps and bloops. It was basic, in all senses of the word.  Eventually, talented hackers found a way for it to do simplistic 3D graphics and even speech synthesis.  Recently, people have worked out a way to perform ray-tracing on it!   …]]></description>
										<content:encoded><![CDATA[<p>My first computer was a BBC Micro. It could do basic graphics at a resolution of 640×256 - with 8 different colours. Not a typo. <em>Eight!</em>  The mono speaker produced bleeps and bloops. It was basic, in all senses of the word.</p>

<p>Eventually, talented hackers found a way for it to do simplistic 3D graphics and even <a href="https://youtu.be/Hu5vu9SgGZI?t=43">speech synthesis</a>.</p>

<p>Recently, people have worked out a way to perform ray-tracing on it!</p>

<blockquote class="social-embed" id="social-embed-1322988586828849152" lang="">        <header class="social-embed-header">        <a href="https://twitter.com/bbcmicrobot" class="social-embed-user">            <img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRigCAABXRUJQVlA4IBwCAADQDACdASowADAAPrVQoUwnJKMiJzgMkOAWiWwAyB3Auz/lfFP7qGIPVJia9QG2A8xn8A/rv7b9g7/Ob4B6AHSw+UonsE9EAZyO2EAJxNJ0n1xA//oJkBsg+/uAFdm1Yp5fnbWCuGnHiCsnHMzfhggA/v7Mr4zq4yeBJtnm6VNrSoRLDGma8mkWQjBTmaptXOFknXP8S97Ss5Q7B5OdpjtTIKIxy6DdzbjQKa5/Cv1zp4iqQvA0gCG/syQtDPkRJhBZ9YBO7QOUbmv5mWps/9WLn0nL8L0iPaIGxujJkLb8f/jTn/fmSfdpTBZbKSRE3tQZr49k0QABT1MYUvzeiJD07/Gthwo3mawEmViOiqcrlc4dCGIxc1sR3u6HY/suvIEHAmVkBJiw37X2QyweBxi1aWB5djgfjKBMpvOtq+5x5oVE3REcWebIjc+xGhZUXmTnMVdVWXenocBHyM+OQcx0PA/hB+mUvOA/Nw5vof7+JRTIxUV1SzoCQmvvB4s59Gvci4bnoMKhb/j8Mug0hF/N5rqOsjoMof/NVzSTtnIeU2YJv6xS+xaDjkOq/3jx4TRNQglknpy1qURKfIl29uIab+TnFAkVvPADhMbXtmRpqNtUzqjhbT64RdjFTjCVdX3mLvB+7B38nSsYw5/iRPomn8cPH+s5Wc7uMn4u/WpkKe5e9YNpIV02Sb/CPSbfuAxeMSabZiv3ZoL0AAA=" alt="">            <div class="social-embed-user-names">                <p class="social-embed-user-names-name">@bbcmicrobot@mastodon.me.uk                </p>                @bbcmicrobot<br><img src="data:image/webp;base64,UklGRuICAABXRUJQVlA4WAoAAAAQAAAAWQAAWQAAQUxQSOEBAAABkFXbbt1agmAIhmAIYtAyiBnEDBIGDYOEQQ+CawiHQcWgZlB9NPVD+76/ImIC6P9mf43z+h45/Ex4y0Xr88Y/Bd6KdpU9oHHWgXlC4qyDs0dxNzV4cxBB1KR4gKmo0ZLMLWp4Mbao6cXUosYXQ7Oan8z4Yq94K6KA4mwsCnkz4RU0WLijZAOssDwu4+RhXoHDqANpHSVIZVBQaB6TsNKYjPU1pmCVIU7B3QhGCyOuaJcevO3TW0SLROTmffMVk6qquB5ln+Oa++Q1zof0cKKqmj44edO1w+ro3UtbZjpdOyR9L+6M9fSrjenz0XLQ52tbPtHQkJsSVTqpE6pNvXiMUDXXTVUkCKmOSo1Q/YrADfea3HDFO2r2Bka4NNxrvvDWBqkpDQnhu461musEQVOV1H27mlkhSqjYtXGvCIqhupz5rM3Zn7hFYVT2Oc5Zu+Y1xq0okPn/4MJP5d5AcjL9HOLJgz4GUdWDfg50e71ez/CJ/DUy/SyIY3TUEe7y1jug8QiH5kaQYAkN3bD2MYx1GUMFSWjwipRGuYLz8KMo4Uw0PqP8IINeMB7eAoWC8AxkMxR7z0BWg1h7BLLrs6nXD0+mo9h5JjIfxcTruTpC5OO73+v0cWPCdcyx+zU4+ucNAFZQOCDaAAAAEAkAnQEqWgBaAD6xQJZJpyOhoTHfKgDgFglnAMsJn9f5RA9neHFaHPCHQSI1eR9V12wtRy3QA5cP9kU/SRnvQvGNNjncx9YB6Kuo7e/ddDIQAP71a7X9lf//7inBZ9+1bUYtAD/+4H/+ze//7twx0VpJlQAP9a4v5WQ+ueBp9Y03AfiquNTvm13Evju2XcfY+o3HMiK3+95AniJwk3Adjj40hAQ6EHIBHw2AMqn3esgxQUf+wJVshLIRjKbpOQ+On/6AC4/u/dSILuynNzErp6Eq/7wN58bpgAA=" alt="" class="social-embed-badge"> Automated            </div>        </a>        <img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E">    </header>    <section class="social-embed-text">                FEATURE ANNOUNCEMENT! <a href="https://twitter.com/bbcmicrobot">@bbcmicrobot</a> is at warp speed thanks to beebjit from <a href="https://twitter.com/scarybeasts">@scarybeasts</a> ! <br><br>Include a 🚀 in your tweet run for 3 HOURS emulation time - 21 billion emulated 6502 cycles - and you'll get a screenshot reply in around a minute. <br><br>NB GXR ROM is disabled in this mode <a href="https://x.com/bbcmicrobot/status/1322988586828849152/photo/1">pic.x.com/XZut4o2RpO</a>        <div class="social-embed-media-grid">            <a href="https://pbs.twimg.com/media/ElwxFBPUYAEM1we.png" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a>            </div>                    </section>    <hr class="social-embed-hr">    <footer class="social-embed-footer">        <a href="">            <span aria-label="168 likes" class="social-embed-meta">❤️ 168</span>            <span aria-label="10 replies" class="social-embed-meta">💬 10</span>            <span aria-label="0 reposts" class="social-embed-meta">🔁 0</span>            <time datetime="{tweet_date}">19:47 - Sun 01 November 2020</time>        </a>    </footer></blockquote>

<p>The next computer our house got was the Sega Megadrive.  The first game that console saw was, I think, Alex Kidd. A basic 2D platformer. 
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Alex-Kidd-fs8.png" alt="The crappy 2D graphics of Alex Kidd." width="911" height="683" class="aligncenter size-full wp-image-37227"></p>

<p>Sure, it was streets ahead of the Beeb, but the graphics weren't <em>amazing</em>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Altered-Beast-fs8.png" alt="Simplistic graphics of Altered Beast." width="976" height="683" class="aligncenter size-full wp-image-37228">

<p>But, over the years, they got better. By the time the MegaDrive stopped getting new games in 1997, the graphics and audio available were utterly transformed. In eight years, we'd gone from a limited pallet 2D screen to this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Batman-and-Robin-fs8.png" alt="A mix of 2D and 3D graphics on Batman and Robin." width="939" height="683" class="aligncenter size-full wp-image-37230">

<p>Stunning music, and liquid smooth 2D graphics with parallax and complex transformations.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Zero-Tolerance-fs8.png" alt="Primitive but impressive 3D graphics from Zero Tolerance." width="923" height="683" class="aligncenter size-full wp-image-37229">

<p>3D! Three-friken-Dee!</p>

<p>Some enterprising hackers managed to get Wolfenstein 3D running on hardware which was originally intended for cheap side-scrollers.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Wolfenstein-3D-fs8.png" alt="An amazing 3D graphics from Wolfenstein 3D. " width="919" height="683" class="aligncenter size-full wp-image-37231">

<p>And <em>nothing</em> about the console had changed. The tools used to create games had improved. The maths and algorithms had leapt ahead. And the ingenuity of the designers had increased. But the physical hardware was identical.</p>

<p>Once you understand a system - deeply understand - it can do things that its designers never thought possible. You can push hardware beyond its apparent limits.</p>

<p>We're so spoiled today. Every week a newer, faster processor is released. Hardware gets cheaper and we can just throw more chips at the problem.</p>

<p>What would the world be like if that wasn't the case? What if our progress in computer speed suddenly came to a stop?  I think history shows us that we would be able to work around the restrictions to do things which seem impossible.</p>

<p>Even when machines break down, they can still be made to perform unexpected miracles. A billion-and-a-half kilometres away, the <a href="https://www.nasa.gov/history/SP-4219/Chapter11.html">Voyager 2 probe broke down</a>. Software instructions were sent which told the craft to do something it wasn't intended to do. The craft was instructed to <a href="https://www.thespacereview.com/article/2586/1">cycle its heating system in order to correct the flow of lubrication</a>.  All of a sudden its capabilities were upgraded and it was able to continue its mission for another half-century.</p>

<p>Mars is the only planet in the solar system which is entirely populated by robots from Planet Earth. Those robots aren't receiving any hardware upgrades any time soon. But <a href="https://www.nature.com/news/2006/060313/full/060313-11.html">their software gets upgraded to allow their hardware to perform new tasks</a>.</p>

<p>We don't necessarily need faster, better hardware. We need more thoughtful, and more creative humans.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37166&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/11/what-would-happen-if-computers-never-got-any-faster/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Rituals and Milestones in Developer Life]]></title>
		<link>https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/</link>
					<comments>https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 19 Sep 2020 11:29:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33094</guid>

					<description><![CDATA[Most human societies have rituals. One popular ceremony is of the young person being made a member of the tribe.  For some, it is at the start of life - a Baptism or Christening. For others, it is when the child becomes an adult - Bar Mitzvah or Ritusuddhi.  Most societies have marriage ceremonies - to mark the transition into a new stage of life.  Houses are blessed, leaving for university…]]></description>
										<content:encoded><![CDATA[<p>Most human societies have rituals. One popular ceremony is of the young person being made a member of the tribe.  For some, it is at the start of life - a Baptism or Christening. For others, it is when the child becomes an adult - Bar Mitzvah or Ritusuddhi.  Most societies have marriage ceremonies - to mark the transition into a new stage of life.</p>

<p>Houses are blessed, leaving for university requires a party, graduates get a silly gown and certificate. Finally, Death demands a wake.</p>

<p>Rituals are powerful and a seemingly ubiquitous part of human life.  So why don't we have them for developers?</p>

<p>The first program you write will, inevitably, spew out "<a href="https://stackoverflow.com/questions/602237/where-does-hello-world-come-from">Hello, World!</a>" - that seems to be the last time we consciously engage in ritual performance.</p>

<p>When I returned to my old secondary school, I saw a huge wooden board filled with names of former head-boys and -girls.  Nestled amongst them was my old mate Richard. An unbroken line of upstanding young people, from before the war to the present day.</p>

<p>Head Boy and Head Girl - milestones so important that they were <em>carved into wood</em> and put on display.</p>

<p>The military awards medals, and there is a clear hierarchy of ranks through which one can progress.</p>

<p>Academics get recognition and prizes and tenure.</p>

<p>An apprentice becomes a journeyman becomes a master.</p>

<p>Part of the problem is that computer science is a young discipline. We don't have hundreds of years of august bodies and a good understanding of how people progress.</p>

<p>So, here are my questions to you. What are the milestones that every developer should pass? How should we mark them? <em>Should</em> we mark them? Is it helpful to show exactly where a computerist is on their journey?</p>

<p>Here are a few lazy suggestions. Feel free to add your own.</p>

<h3 id="medal-ceremonies"><a href="https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#medal-ceremonies">Medal Ceremonies</a></h3>

<blockquote class="social-embed" id="social-embed-726109994567917568" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/vkmc" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRj4DAABXRUJQVlA4IDIDAABwDQCdASowADAAPqVAmEmmI6IhNVqtUMAUiWIAuzLA8bkD5+RmAjQTTESUZH2KpmvejWNsCjIisb6HIcidzsY9URzIuZox5CVG+0KgdIz3tDmL5duHVGr/elNFYozeXn76UP9JvMSkjxl21ppVwcclLqOAAAD++sBdDUW2RX4lF43ta2SuNwjZd1DDt/6kqo/bIbW611nGrtrT+eXftwJzhmNhj5oVICkvMjZLoB03C7f4IIcHcycPWZxmBubh0fDltEl9brfqtPxUbQIRHrESExhK0QitZ8reYT49M0iAfiIFTzBZqzhUCJMzdw/iF17Ercsyq8o58cib4gBXQbDvovaZDflHepI4ACXMq5Iy2FdTBMDU6Ao9TCRf21JLsDbh0Bjv36rnTA1mVw8aHYn29Q9Srbyjhmqdn7DrqrU3WhLU6sr69FA/EqDS5Q9SKx/LLX1HGmzCNg8oVFsBe+7EBMEjZBZ5fn12X4N28VzVxmzAadaQfYuyu2nNFXhbDbyX+Nl5fLHXROwwBgl+qfK70aELcCTZr9FYPKWATPpuJd4s9napsdmp0Z97tulUsCKcHY/UPHa786bP6V15rFYfrQeA8qy0R8Rm7uNaeBkk0OWssPqY01ZWR2wPnBvykWQTvEO0TQklM2Pi4x8MAfHvZ6RY9JXCTfShJWc6eRFvxn3sC3BMYog6C33hIzgbvtydzcN4hGG8rqze6ocg/IZmB14XDID2Zb1rOXnSQqQa18QRrde78mv/RcjkI8HmCs72M3+Vw+Ni0IaDlZdkl092knyApH7b/i/FyGxJ9C4DVeefBZ4YsH/v1/aA0RuE0aTIbYrOJyvOksk3ErXn3MxNQel1PeYmypNwHphZg4azjni24nrs1K+HZVgnAMyBi5C5qrGfbmS0BVBYht4dgxNonmghru0zxBF249POpvo3bXaO0Buv4Vf+5JPHgeXFOpDnBddEmBm3QR/wVGZGqpyzGH/lilTwY49nBQeaKK8M5T69LzIM7xHIpzOp98bPjGA5kjN6AjKmKHwF6PJNmyy5WjA1ybgi5MIGYfo2fAGrfsTQzmPQ3peg0Z2uGaxrotX8AA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">vkmc</p>@vkmc</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Thanks <a href="https://twitter.com/OpenStack">@OpenStack</a> community for the mentor of mentors award :) I feel honored! <a href="https://twitter.com/hashtag/WeAreOpenStack">#WeAreOpenStack</a> <a href="https://twitter.com/vkmc/status/726109994567917568/photo/1">pic.x.com/lzy1prkgze</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/ChOpLy9UoAA8zfc.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/vkmc/status/726109994567917568"><span aria-label="96 likes" class="social-embed-meta">❤️ 96</span><span aria-label="10 replies" class="social-embed-meta">💬 10</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2016-04-29T18:04:47.000Z" itemprop="datePublished">18:04 - Fri 29 April 2016</time></a></footer></blockquote>

<p>Feels a bit like it is appropriating the military's culture.</p>

<h3 id="community-awards"><a href="https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#community-awards">Community Awards</a></h3>

<p>I <em>love</em> the idea of the <a href="https://superuser.openstack.org/articles/openstack-contributor-awards-nominations/">OpenStack Community Awards</a>. But deciding who gets an award is fraught with bias.</p>

<h3 id="immortalise"><a href="https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#immortalise">Immortalise</a></h3>

<p>Projects like the <a href="http://www.facesofopensource.com/">Faces of Open Source</a> seek to create a permanent memorial of those who do good. But it falls into the same problem as other awards - who chooses?</p>

<h3 id="formal-qualifications"><a href="https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#formal-qualifications">Formal Qualifications</a></h3>

<p>I gave kids certificates, and they bloody loved them.</p>

<blockquote class="social-embed" id="social-embed-848830364793569280" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">I was amazed by how happy the kids were to receive certificates.<br>Such a pleasant rite of passage. <a href="https://twitter.com/CodeClubWorld/status/848829965172953088">x.com/codeclubworld/…</a><blockquote class="social-embed" id="social-embed-848829965172953088" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/CodeClubGlobal" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRrQBAABXRUJQVlA4IKgBAAAwCQCdASowADAAPrVQn0wnJKKiJyyQ4BaJZgDD3AhPeQAjgVxGqB7tOPa0EIsYHglHujB/SAVUfi13PC+zjaewQfVwZ2mX4hnHasExMYM62xIAAP7+k6qPxRwbF8D6ZjSlgWdarpCiNwqGqmm8ZP9vdL70xlv4bVGsOpEFCe5OcOk1zysJ6eELmTd71AEUhozNWNOKZev3leMjpt0MULWGdTzDKcoSO34eL/t77Z6rw0MGq6G0coZqFtKZORO89j0xckbwA7t7jm8l1D91Z/kfT2kVkfglt+YUw5pV76g7PwqYw6cl6TItcZFuFtnd3ab+A3fQcvr65U4xNuAcGuJlfhcfz4nWW9TCbj2k2M1lA3U/2UcYTdz7DsgkU3LCmhSuC+9tSjG1bI7m2m2raIbwBF/Y91xHc++a9P/tlmiCyxVlT057LUqm8aOqo0xzX0Ia9l/EH2ADVCAIZZcJLHiD4t77w1mcxFpHhOFumlNe/HTbyD7zKY0/Hn6+aR51jNVyralC+bUudFN/2bdowzD/yV6XfkGestu+zC6Q8E7MyWPKCWlyAAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Code Club Global</p>@CodeClubGlobal</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Coming to the end of term with your Code Club? Celebrate success by giving out certificates! Sign in to download: <a href="https://www.codeclubworld.org/sign-in/">codeclubworld.org/sign-in/</a> <a href="https://twitter.com/CodeClubWorld/status/848829965172953088/photo/1">pic.x.com/s7uxzoyt88</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/C8emWqwW0AARm4o.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/CodeClubGlobal/status/848829965172953088"><span aria-label="2 likes" class="social-embed-meta">❤️ 2</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="1 reposts" class="social-embed-meta">🔁 1</span><time datetime="2017-04-03T09:30:08.000Z" itemprop="datePublished">09:30 - Mon 03 April 2017</time></a></footer></blockquote></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/848830364793569280"><span aria-label="4 likes" class="social-embed-meta">❤️ 4</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-04-03T09:31:44.000Z" itemprop="datePublished">09:31 - Mon 03 April 2017</time></a></footer></blockquote>

<p>The hacker mentality seems to eschew formal qualifications. And, to be fair, many are just pay-to-play, or exercises in gatekeeping.</p>

<h2 id="is-this-necessary"><a href="https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/#is-this-necessary">Is this necessary?</a></h2>

<p>It isn't necessary - but there's constant undercurrent of who is - and isn't - a "real" developer. People get beleaguered with imposter syndrome because there are no real metrics to judge themselves against. We have no way of celebrating achievement - and no way to welcome people into our tribe.</p>

<p>And a part of me finds that a little sad.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33094&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/09/rituals-and-milestones-in-developer-life/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[There's nothing I hate more than text config files]]></title>
		<link>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/</link>
					<comments>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 11:02:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=35162</guid>

					<description><![CDATA[I&#039;m going to revisit an argument I had in… Ooooh… 2001ish? I wanted to make some edits to my university&#039;s fledging student union website. In order to do this, I needed to learn the arcane art of SSH. This was one of my first introductions to text based config files. I was horrified! A single typo, or a stray comma could break everything. The instructions our WebMaster provided were laughably unc…]]></description>
										<content:encoded><![CDATA[<p>I'm going to revisit an argument I had in… Ooooh… 2001ish? I wanted to make some edits to my university's fledging student union website. In order to do this, I needed to learn the arcane art of SSH. This was one of my first introductions to text based config files. I was horrified! A single typo, or a stray comma could break <em>everything</em>. The instructions our WebMaster provided were laughably unclear. Manually creating a config file - and getting it right - was a chore.</p>

<p>So I downloaded <a href="https://www.chiark.greenend.org.uk/~sgtatham/putty/releases/0.51.html">PuTTY</a> and never looked back.  It had a simple GUI. Well… simple enough. It was impossible to type an IP address into a box designed for a port number, it could tell that username was unlikely to contain a non-ASCII symbol, and that made it slightly easier to configure a connection.</p>

<p>The job of the computer is to do the hard work for us.  Computers shouldn't recognise that we've made a mistake - they should stop us making mistakes in the first place!</p>

<p>Flash forward to today. I wanted to release an update to my <a href="https://www.npmjs.com/package/super-tiny-icons">NPM package of SuperTinyIcons</a> - which are hosted on GitHub.</p>

<p>I figured that I'd have to click a link on GitHub, do the OAuth dance, click on a few GUI elements, and hit a big save button.</p>

<p>Nope!</p>

<p><a href="https://help.github.com/en/actions/language-and-framework-guides/publishing-nodejs-packages">I have to create YAML text files</a>. Manually. Because it is the Year of <a href="https://www.nadiyahussain.com/">Our Lord</a> 2020 and computer engineering hasn't evolved since the earliest days of UNIX.</p>

<p>Don't get me wrong - I love the utility and versatility of the command line. I'll happily manually edit a JSON file in nano and use <code>sed</code> to update a bunch of documents. I rely on <code>diff</code> and <code>grep</code> daily.  But when it comes to configuring things - I am undone.  I don't want to learn <a href="https://yaml.org/spec/1.2/spec.html#id2777534">whitespace rules</a> just to get something working.</p>

<p>Let's take a simple example.  Here's a snippet of YAML from the official guide to releasing NPM packages via GitHub:</p>

<pre><code class="language-yaml">jobs:
  build:
    runs-on: ubuntu-latest
</code></pre>

<p>What are valid options for "runs-on"?  Where would I find them? What are the differences between them? What happens if I spell something wrong?</p>

<p>Luckily, the GUI was invented to save us from ourselves:</p>

<p><select>
    <option value="">--Please choose an option--</option>
    <option value="stop">Ubuntu Latest (This is the most common option)</option>
    <option value="reading">Grarch 3.5 (Useful if you need flargon support)</option>
    <option value="my">Plan9 (Choose this if you require Python 1)</option>
    <option value="code">Windows 3.11 (Only works on older, 16 bit projects) </option>
</select></p>

<p>M A G I C !</p>

<p>This goes for almost every element of the config file. If there are a set list of choices, present them to the user. If there is only one option, hide it. If there are two options, give them a checkbox.</p>

<p>The thing is, GitHub gets <em>part</em> of the way there. If you want to setup a webhook - you get a GUI.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/05/Screenshot_2020-05-26-edent-SuperTinyIcons1.png" alt="A GUI for creating webhooks." width="908" height="810" class="aligncenter size-full wp-image-35165">
Why does one part of GitHub offer a user-friendly way to manage configuration, and another part only provide a user-hostile environment?</p>

<p>To make it worse… <a href="https://github.blog/2020-04-15-npm-has-joined-github/">NPM IS OWNED BY GITHUB</a>!</p>

<p>I'm not saying you <em>can't</em> have a text file. I'm not trying to take your toys away from you. Have a <code>sudo</code> mode which lets user hand-stitch a config together with butterflies and a binary keyboard. Go nuts!
Want to store the config in git so you can see what changes have been made? Brilliant!
To be <em>explicitly</em> clear - <strong>store</strong> the config in a text file. But have a GUI first, and expose the text file to any masochists who want to manually replace all the tabs with spaces.</p>

<p>I just can't be bothered reading 22 thousands words of YAML spec, a further two thousands words of GitHub instructions, and - no doubt - a hundred different StackOverflow questions, just to send data from one computer to another.</p>

<p>I heard someone say that part of Amazon's success was its relentless focus on convenience.  How is manually creating fragile text files convenient for me?</p>

<p>We have to stop this fetishization of the text file as the primary method for configuring computers.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=35162&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/06/theres-nothing-i-hate-more-than-text-config-files/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[No software licence will save you from hyperbolic doubt]]></title>
		<link>https://shkspr.mobi/blog/2020/05/no-software-licence-will-save-you-from-hyperbolic-doubt/</link>
					<comments>https://shkspr.mobi/blog/2020/05/no-software-licence-will-save-you-from-hyperbolic-doubt/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 25 May 2020 11:49:18 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=35056</guid>

					<description><![CDATA[Imagine that you&#039;re a spotty 16 year-old. You&#039;ve just discovered philosophy. You will almost certainly have a conversation like this...  Dude... DUDE! What if... What if, like, we&#039;re all just brains in a jar and, like, a machine is projecting reality around us...? Whoa...!  I bet you&#039;ve had that conversation with someone. Probably after you first watched The Matrix.  As a philosophy, it is a lot…]]></description>
										<content:encoded><![CDATA[<p>Imagine that you're a spotty 16 year-old. You've just discovered philosophy. You will almost certainly have a conversation like this...</p>

<blockquote><p>Dude... DUDE! What if... What if, like, we're all just brains in a jar and, like, a machine is projecting reality around us...? Whoa...!</p></blockquote>

<p>I bet you've had that conversation with someone. Probably after you first watched The Matrix.  As a philosophy, it is a lot less modern than you might think:</p>

<blockquote><p>I shall suppose that some malicious, powerful, cunning demon has done all he can to deceive me [...] I shall think that the sky, the air, the earth, colours, shapes, sounds and all external things are merely dreams that the demon has contrived as traps for my judgment.</p>

<p><a href="https://en.wikipedia.org/wiki/Meditations_on_First_Philosophy">René Descartes in <strong>1641</strong></a></p></blockquote>

<p>How far does your doubt extend? Hyperbolic doubt is, simplified, a philosophy which insists you should question everything - including your own senses.</p>

<p>Philosophy, naturally, leads us on to Computer Science.</p>

<p>How do you know your computer isn't lying to you?  Open source code means that you can see the code your computer runs. Of course, the compiled code may be different from what's published.</p>

<p>Do we trust verifiable build? Perhaps not.</p>

<p>OK, so we compiler our own code.</p>

<p>But do we trust our compiler? Same problem as above.</p>

<p>Let's write our own compiler!</p>

<p>But what if there's a secret chip in our computer inserting malicious code? Argh!</p>

<p>It's malicious demons all the way down. But, at least, we can see the code and compare it against the binary code and compare that to the output of the computer. That's a fairly reasonable way to dispel doubt.</p>

<p>Hurrah for open source licences!</p>

<p>But what about code that runs on someone else's server?</p>

<p>How can you tell what a distant computer is doing with your data? There are some Open Source Licences which are specifically for servers:</p>

<blockquote><p>The GNU Affero General Public License is a modified version of the ordinary GNU GPL version 3. It has one added requirement: if you run a modified program on a server and let other users communicate with it there, your server must also allow them to download the source code corresponding to the modified version running there.</p>

<p><a href="https://www.gnu.org/licenses/why-affero-gpl.html">Why the Affero GPL</a></p></blockquote>

<p>So someone can give you the code. But that doesn't really help, does it?</p>

<p>How do you know they're running the exact same code on their server?</p>

<p>How do you know that their server hasn't been hacked?</p>

<p>How do you know if, halfway through your session, the software is replaced?</p>

<p>How do you know?</p>

<p>This isn't an argument <em>against</em> open source. More transparency is always good.  But it's important to know its limits.  There are some computational tasks which are too intense for a home machine. If you want to communicate with another person, you have to trust the code running on <em>their</em> machine.</p>

<p>Computo Ergo Sum.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=35056&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/05/no-software-licence-will-save-you-from-hyperbolic-doubt/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
