<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/atom-style.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-GB"
	>
	<title type="text">Terence Eden’s Blog</title>
	<subtitle type="text">Regular nonsense about tech and its effects 🙃</subtitle>

	<updated>2025-06-03T07:04:18Z</updated>

	<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog" />
	<id>https://shkspr.mobi/blog/feed/atom/</id>
	<link rel="self" type="application/atom+xml" href="https://shkspr.mobi/blog/feed/atom/" />

	<generator uri="https://wordpress.org/" version="6.8.1">WordPress</generator>
<icon>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</icon>
	<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[The NHS shouldn't outsource its QR codes]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/" />

		<id>https://shkspr.mobi/blog/?p=60954</id>
		<updated>2025-06-03T07:04:18Z</updated>
		<published>2025-06-03T11:34:04Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="gdpr" /><category scheme="https://shkspr.mobi/blog" term="nhs" /><category scheme="https://shkspr.mobi/blog" term="privacy" /><category scheme="https://shkspr.mobi/blog" term="qr" />
		<summary type="html"><![CDATA[QR codes are brilliant. They&#039;re a simple way to allow users to easily and quickly go to the right URl - no matter how complex. No more worrying about typing in long addresses or figuring out if that&#039;s a letter O or the number O. Scan and go!  The best thing about QR codes is that they&#039;re free. It doesn&#039;t cost any money to generate one. They&#039;re an open standard with no middle-men. Users can go…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/"><![CDATA[
				<html><head></head><body><p>QR codes are brilliant. They're a simple way to allow users to easily and quickly go to the right URl - no matter how complex. No more worrying about typing in long addresses or figuring out if that's a letter O or the number O. Scan and go!</p>

<p>The best thing about QR codes is that they're free. It doesn't cost any money to generate one. They're an open standard with no middle-men. Users can go direct to your site!</p>

<p>Except… Some people want to insert themselves into your conversation. Sometimes it is for malicious reasons, sometimes it is greed for user data, and sometimes it is just incompetence.</p>

<p>Let's take this example - a health centre wants people to register. Scan the QR and get started. Fab!</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/registerQR.webp" alt="QR code on an NHS branded poster." width="982" height="1220" class="aligncenter size-full wp-image-60956">
<small>Photo shamelessly stolen from a LinkedIn contact.</small></p>

<p>But what happens when you scan the QR code?  Rather than taking you directly to an authoritative and trusted NHS.UK domain name, it sends you through <code>https://register-with-gp.ht1.uk/</code>.</p>

<h2 id="who-on-earth-are-ht1-uk"><a href="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/#who-on-earth-are-ht1-uk" class="heading-link">Who on earth are HT1.UK?</a></h2>

<p>According to <a href="https://www.healthtech1.uk/">their website</a>, they're an automation company who are "on a mission to make the NHS the most advanced healthcare system in the world."</p>

<p>Good for them. But what information are they collecting about users who traverse through their QR codes? If you take a look at <a href="https://docs.healthtech1.uk/general-privacy-policy">their privacy policy</a> you won't find anything specific.  Never mind, let's email their friendly privacy team. What's their email address?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/emailthem.webp" alt="Screenshot of terms and conditions with an hello email address." width="1024" height="406" class="aligncenter size-full wp-image-60957">

<p>Of course, emailing that gets you back this error:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/ht1email.webp" alt="Hey there &#x1f44b; This email inbox is not monitored. Please get in touch with us at support@healthtech1.uk Thanks, Team at Healthtech-1" width="529" class="aligncenter size-full wp-image-60955">

<p>Emoji! How fun!!</p>

<p>So I emailed the new address to see what information they were collecting. Their response wasn't particularly informative.</p>

<blockquote><p>because Healthtech-1 is a processor of information and the GP practice is the data controller any requests about how your data is handled should be made to the GP practice who can inform you of the information you requested.</p>

<p>…</p>

<p>I can confirm that there is no information stored about users who scan the QR codes and no cookies placed.</p></blockquote>

<p>But, of course, users have no way of verifying what this company is storing about them. There's simply no reason to use an untrusted 3rd party like this to provide either a QR code or an intermediary website.</p>

<h2 id="why-this-is-a-problem"><a href="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/#why-this-is-a-problem" class="heading-link">Why this is a problem</a></h2>

<p>Trust is everything. People are <em>constantly</em> being scammed. One of the great things that GOV.UK did was to say "This here is our trusted brand. If you don't see GOV.UK in the URl bar - don't trust it!"</p>

<p>The NHS should be doing the same. Every hospital, surgery, and clinic should have an NHS.UK domain name. When a user sees a link to a healthcare service which <em>doesn't</em> go through NHS.UK, they should feel suspicious and not click on it.</p>

<p>There is no way as a regular user to know that HT1.UK is a trusted domain. What about HT1.biz? HT2.UK? NHS.info.ly?  What happens if HT1 go bust or have their domain name hijacked?</p>

<p>The NHS must stop the proliferation of these 3rd party domain names. They need to reinforce users' understanding that NHS.UK is the <em>only</em> trusted domain name for official NHS services.</p>

<p>I'm sure HT1.UK aren't doing anything nefarious with the data of people who visit their QR codes. I'm sure they're not inserting tracking cookies or selling my data. But I shouldn't have to be sure. All users should be pointed <em>directly</em> to an NHS.UK domain without having to risk whether their details are going via a dodgy site.</p>

<p>Here endeth the rant.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/#comments" thr:count="7" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/the-nhs-shouldnt-outsource-its-qr-codes/feed/atom/" thr:count="7" />
			<thr:total>7</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Mobile Phones of Doctor Who - Season 15]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/" />

		<id>https://shkspr.mobi/blog/?p=60989</id>
		<updated>2025-05-31T20:45:38Z</updated>
		<published>2025-06-01T11:34:29Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Doctor Who Phones" /><category scheme="https://shkspr.mobi/blog" term="DoctorWho" />
		<summary type="html"><![CDATA[Is it Season 15 of New Who? Series 2 of Ncuti Gatwa&#039;s Who? Series 1875 of the UNIT dating controversy? Either way, welcome back to this increasingly silly series of blog posts where I try to identify all the mobile phones used by The Doctor and their companions.  This weird and wonderful series has, sadly, a paucity of phones. The only time they appear is in the phonetastic and bone-chilling…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/"><![CDATA[
				<html><head></head><body><p>Is it Season 15 of New Who? Series 2 of Ncuti Gatwa's Who? Series 1875 of the UNIT dating controversy? Either way, welcome back to this <a href="https://shkspr.mobi/blog/tag/doctor-who-phones/">increasingly silly series of blog posts</a> where I try to identify all the mobile phones used by The Doctor and their companions.</p>

<p>This weird and wonderful series has, sadly, a paucity of phones. The only time they appear is in the phonetastic and bone-chilling <a href="https://www.bbc.co.uk/iplayer/episode/m002bw41/doctor-who-season-2-4-lucky-day">Lucky Day</a>…</p>

<h2 id="lucky-day"><a href="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/#lucky-day" class="heading-link">Lucky Day</a></h2>

<p>Hunky heart-throb, and all-round nice guy Conrad Clark has this device:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/Conrad1.webp" alt="Man writing text on a phone." width="852" height="639" class="aligncenter size-full wp-image-61002">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/Conrad2.webp" alt="Man holding a phone." width="855" height="641" class="aligncenter size-full wp-image-61001">

<p>Not much to go on. Looks like an Android. The vertical camera cluster, buttons on the right, and inset front camera means it is <em>probably</em> a Samsung - but you'd be hard pressed to tell which!</p>

<p>Ruby Sunday has the same yellow clad phone from <a href="https://shkspr.mobi/blog/2024/12/mobile-phones-of-doctor-who-joy-to-the-world/">Joy To The World</a>.</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/Ruby1.webp" alt="Woman holding a phone in a yellow case." width="853" height="640" class="aligncenter size-full wp-image-61000">
A few closeups as well.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/RubySide.webp" alt="Phone in a yellow case. View of buttons." width="598" height="448" class="aligncenter size-full wp-image-60998">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/RubyFront.webp" alt="Phone in a yellow case. View of screen." width="855" height="642" class="aligncenter size-full wp-image-60999">

<p>I'm pretty sure that's the <a href="https://www.gsmarena.com/google_pixel_5-pictures-10386.php">Google Pixel 5</a>.</p>

<p>Carla's phone is wrapped in an anonymous case.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/Carla.webp" alt="Woman holding a phone in a red case." width="848" height="635" class="aligncenter size-full wp-image-60997">

<p>That's <a href="https://shkspr.mobi/blog/2024/06/mobile-phones-of-doctor-who-season-14/#space-babies">the same case as last year's episodes</a>. But there's not much to go on. That tiny camera cluster could be from anything other than an iPhone. Think you know what it is? Leave a note in the comments.</p>

<p>Most of &lt;Think_Tank&gt;'s phones are blurry and in the background, so it's hard to say what they are.  One goon has this device:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/ThinkTankGoon1.webp" alt="Cackling goon holding a phone." width="395" height="296" class="aligncenter size-full wp-image-60996">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/ThinkTankGoon1Side.webp" alt="Side on view of a phone." width="336" height="252" class="aligncenter size-full wp-image-60995">

<p>Given the bevel around the camera lenses, and the flash near the top, I think it's the <a href="https://www.gsmarena.com/samsung_galaxy_s21_5g-10626.php">Samsung S21 5G</a></p>

<p>Another has this model:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/ThinkTankGoon2Side.webp" alt="Goon holding a phone." width="657" height="493" class="aligncenter size-full wp-image-60993">

<p>Again, not much detail there. It looks like it has a fingerprint sensor on the rear. Any clues?</p>

<p>Shirley Bingham, UNIT's technical marvel, has this foldable phone.</p>

<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/Shirley.webp" alt="Woman in a wheelchair holding a foldable phone." width="590" height="443" class="aligncenter size-full wp-image-60994">
Although the scene is quite dark, I reckon it is the <a href="https://shkspr.mobi/blog/2023/12/the-mobile-phones-of-doctor-who-60th-anniversary-specials/">same phone she was rocking in The Star Beast</a>.</p>

<h2 id="up-next"><a href="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/#up-next" class="heading-link">Up next!</a></h2>

<p>Will there be more phones in "The War Between the Land and the Sea"? <a href="https://shkspr.mobi/blog/tag/doctor-who-phones/">Stay tuned</a>!</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/mobile-phones-of-doctor-who-season-15/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[What's up with this "Please add me on WhatsApp" robocall spam?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/whats-up-with-this-please-add-me-on-whatsapp-robocall-spam/" />

		<id>https://shkspr.mobi/blog/?p=60938</id>
		<updated>2025-05-30T15:52:29Z</updated>
		<published>2025-05-31T11:34:18Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="phishing" /><category scheme="https://shkspr.mobi/blog" term="scam" /><category scheme="https://shkspr.mobi/blog" term="spam" /><category scheme="https://shkspr.mobi/blog" term="WhatsApp" />
		<summary type="html"><![CDATA[Over the last few weeks, I&#039;ve received several calls which all have the same modus operandi.  A disembodied robotic voice tries to get me to connect on WhatsApp.   https://shkspr.mobi/blog/wp-content/uploads/2025/05/add-me-on-whatsapp.mp4  Some of the voices are reasonable facsimiles of human voices (like the above) and some are just garbage.   	🔊 	 	 		💾 Download this audio file. 	   The voice cl…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/whats-up-with-this-please-add-me-on-whatsapp-robocall-spam/"><![CDATA[
				<html><head></head><body><p>Over the last few weeks, I've received several calls which all have the same <i lang="la" title="Mode of operation.">modus operandi</i>.  A disembodied robotic voice tries to get me to connect on WhatsApp.</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-60938-2" width="620" height="348" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/add-me-on-whatsapp.mp4?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/add-me-on-whatsapp.mp4">https://shkspr.mobi/blog/wp-content/uploads/2025/05/add-me-on-whatsapp.mp4</a></video></div><p></p>

<p>Some of the voices are reasonable facsimiles of human voices (like the above) and some are just garbage.</p>

<p></p><figure class="audio">
	<figcaption class="audio"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50a.png" alt="🔊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></figcaption>
	
	<audio class="audio-player" controls="" src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/WhatsAppSpam.mp3">
		<p><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4be.png" alt="💾" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <a href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/WhatsAppSpam.mp3">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>The voice clip plays and the call immediately terminates.</p>

<p>What I can't understand is how this can possibly be effective from the scammers' point of view.  On receiving the call the victim must…</p>

<ol>
<li>Decided to answer from an unknown number.</li>
<li>Listen to the message and decide it is legitimate.</li>
<li>Go the their phone's dialler app.</li>
<li>Copy the caller's phone number.</li>
<li>Open WhatsApp.

<ul>
<li>Install WhatsApp if they don't have it already</li>
</ul></li>
<li>Create a new contact - giving a name - and pasting the number.</li>
<li>Engage with the contact.</li>
</ol>

<p>That's a <em>lot</em> of effort based on… what? A vague offer? There's a little bit of a <a href="https://copyhackers.com/2014/04/curiosity-gap/">curiosity gap</a> but not much. It's hardly "add me on WhatsApp or we'll release the photos we have of you" or "you've won the lottery, add me on WhatsApp to get the funds", or "This is the CEO of your company, urgently add me…".</p>

<p>I <em>guess</em> that if a spammer is able to send out thousands of these messages then they <em>might</em> be able to attract a couple of people to engage with them. There's no easy way to <a href="https://faq.whatsapp.com/1142481766359885/?cms_platform=web">report a spam account to WhatsApp</a> unless you've engaged with it.</p>

<p>I also assume that WhatsApp will see that <em>you</em> were the person who initiated WhatsApp contact - which makes them less likely to think the scammer is the problem.</p>

<p>I am just fascinated to see if this scam can possibly be effective. Generating fake voices is free, as is placing short calls. WhatsApp accounts are also free and easy to automate. But are there really that many people willing to go to the effort of adding a new contact based on so little information?</p>

<p>Obviously, all spam is a numbers game. If the message reaches someone receptive to a robocall, they're less likely to query the scam. And, yes, I know that you're a very clever boy and don't answer unknown numbers - but in the real world people get calls from hospitals, recruiters, and friends with new numbers.</p>

<p>If you're a spammer and have found this approach effective - please leave a comment!</p>
</body></html>]]></content>
		
		<link href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/add-me-on-whatsapp.mp4" rel="enclosure" length="198313" type="video/mp4" />
<link href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/WhatsAppSpam.mp3" rel="enclosure" length="13077" type="audio/mpeg" />
			<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/whats-up-with-this-please-add-me-on-whatsapp-robocall-spam/#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/whats-up-with-this-please-add-me-on-whatsapp-robocall-spam/feed/atom/" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: The Haunting of Tram Car 015 by P. Djèlí Clark ★★★⯪☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-the-haunting-of-tram-car-015-by-p-djeli-clark/" />

		<id>https://shkspr.mobi/blog/?p=60512</id>
		<updated>2025-04-29T08:49:57Z</updated>
		<published>2025-05-29T11:34:54Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[After reading the short story A Dead Djinn in Cairo, I decided to grab the first book in the &#34;Dead Djinn&#34; series.  It is a delightfully realised universe although reminiscent of both Saladin Ahmed&#039;s work - a Middle-East populated with ghuls, djinn, and sword-wielding magicians - and also Annalee Newitz&#039;s Terraformers with its sentient trains and unionised robots.  Unfortunately, it is rather…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-the-haunting-of-tram-car-015-by-p-djeli-clark/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/9781250294807.jpg" alt="Book cover showing aerial trams in a modern city." width="200" class="alignleft size-full wp-image-60515"> After reading the short story <a href="https://torpublishinggroup.com/a-dead-djinn-in-cairo/">A Dead Djinn in Cairo</a>, I decided to grab the first book in the "Dead Djinn" series.</p>

<p>It is a delightfully realised universe although reminiscent of both <a href="https://shkspr.mobi/blog/2023/06/book-review-engraved-on-the-eye-saladin-ahmed/">Saladin Ahmed</a>'s work - a Middle-East populated with ghuls, djinn, and sword-wielding magicians - and also <a href="https://shkspr.mobi/blog/2024/03/book-review-the-terraformers-annalee-newitz/">Annalee Newitz's Terraformers</a> with its sentient trains and unionised robots.</p>

<p>Unfortunately, it is rather brief. The short story and book together make for a decent novella. Because of that, some of the exposition is rather abrupt. Rather than gradually introduce us into the gender politics of the city, one character turns to another to clumsily explain it.</p>

<p>It's a good book, I just wish there was a lot more of it.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-the-haunting-of-tram-car-015-by-p-djeli-clark/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-the-haunting-of-tram-car-015-by-p-djeli-clark/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Whatever happened to cheap eReaders?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/" />

		<id>https://shkspr.mobi/blog/?p=60457</id>
		<updated>2025-05-22T06:44:40Z</updated>
		<published>2025-05-27T11:34:04Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="ebooks" /><category scheme="https://shkspr.mobi/blog" term="eink" /><category scheme="https://shkspr.mobi/blog" term="reading" />
		<summary type="html"><![CDATA[Way back in 2012, The Guardian reviewed an eInk reader which cost a mere £8.  The txtr beagle was designed to be a stripped-down and simplified eReader.  As far as I can tell, it never shipped. There were a few review units sent out but I can&#039;t find any evidence of consumers getting their hands on one. Also, that £8 price was the subsidised price when purchased with a mobile contract.  Their w…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/"><![CDATA[
				<html><head></head><body><p>Way back in 2012, The Guardian reviewed <a href="https://www.theguardian.com/technology/2012/nov/08/beagle-e-reader-review">an eInk reader which cost a mere £8</a>.</p>

<p>The <a href="https://wiki.mobileread.com/wiki/Txtr_beagle">txtr beagle</a> was designed to be a stripped-down and simplified eReader<sup id="fnref:txtr"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#fn:txtr" class="footnote-ref" title="You can see some internal photos on this Mastodon thread." role="doc-noteref">0</a></sup>.</p>

<p>As far as I can tell, it never shipped. There were a few <a href="https://wiki.mobileread.com/wiki/Txtr_beagle">review units sent out</a> but I can't find any evidence of consumers getting their hands on one. Also, that £8 price was the <em>subsidised</em> price when purchased with a mobile contract.  Their <a href="https://web.archive.org/web/20130828235409/http://gb.txtr.com/beagle/">website ceased working long ago</a>.</p>

<p>But it got me intrigued. Moore's law is supposed to drive down the cost of electronics. So where are all the dirt-cheap eReaders?</p>

<p>The cheapest Kindle for sale on Amazon UK right now is about £100.  Back in 2012, it was about £70. Taking <a href="https://www.bankofengland.co.uk/monetary-policy/inflation/inflation-calculator">inflation into account</a>, that price has stayed static.  Brands like Kobo are also in the £100 to £150 range.</p>

<p>About the cheapest retail eReader is the <a href="https://www.laptopsdirect.co.uk/pocketbook-basic-lux-4-ink-black-6-8gb-wi-fi-e-reader-pb618-p-ww/version.asp">PocketBook Lux 4</a> for £85 or the (terribly reviewed) <a href="https://amzn.to/44dgZ9Y">Woxter Scriba</a> for £70.</p>

<p>AliExpress has loads of second-hand and obsolete models at cheap-ish prices. But a surprising dearth of new eReaders.</p>

<p>Going wholesale, <a href="https://www.alibaba.com">Alibaba</a> has a range of models, some of which clock in at around £30.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/30-quid-eReaders.webp" alt="Range of eReaders in a store. Each around £30." width="1280" height="603" class="alignleft size-full wp-image-60459">

<p>But, of course, that's before shipping and tax. They won't come with any manufacturer's warranty and don't expect any software updates. Also, good luck getting accessories!</p>

<p>So what's stopping new eReaders being released at a cheap(er) price?  I think it comes down to four main things.</p>

<h2 id="reading-is-a-niche-hobby"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#reading-is-a-niche-hobby" class="heading-link">Reading is a niche hobby</a></h2>

<p><a href="https://yougov.co.uk/entertainment/articles/51730-40-of-britons-havent-read-a-single-book-in-the-last-12-months">Around 40% of UK adults didn't read a single book last year</a>.  That survey combines reading books and listening to audiobooks. Of the 60% who do read/listen, about 14% primarily listen. Of those that read, around 60% do so on paper books.</p>

<p>If reading is niche, reading electronically is a tiny niche! This is somewhat of a chicken-and-egg argument. If an eReader were the same cost as a mass-market paperback, I'm sure many more paper-book readers would become converts.</p>

<p>The whole point of an eInk reader is that it is a distraction-free environment. Yeah, you <em>could</em> scroll TikTok on one, but it isn't a pleasant experience. An eReader is designed for one thing only, unlike a phone or tablet. Do enough people want to carry yet-another-bloody-device just for reading?</p>

<h2 id="eink-is-expensive"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#eink-is-expensive" class="heading-link">eInk is expensive</a></h2>

<p>The company which makes eInk hold several patents on the process. They're not a patent troll; they're building a business and selling mega-hectares of the stuff. Understandably, they have an interest in keeping prices high.  They don't want to cannibalise their own market.</p>

<p>A basic 6 inch screen with wiring costs around £20 wholesale - that's from Alibaba, so doesn't include tax and shipping.  That's before you've added any electronics or a operating system.</p>

<p>Speaking of which…</p>

<h2 id="android-is-a-bottleneck"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#android-is-a-bottleneck" class="heading-link">Android is a bottleneck</a></h2>

<p>The promise of the Android Open Source Project was a free Operating System for anyone to use. The reality has been a little different.  Most people want to be able to use basic Android functionality - like download operating system updates or reading apps.  But Google doesn't allow that for eInk devices.</p>

<p>As I understand it, <a href="https://source.android.com/docs/compatibility/9/android-9-cdd#7_1_6_screen_technology">Google requires Android devices to have colour screens</a> and, so I've read, won't certify eInk eReaders for newer versions of Android.</p>

<p>So manufacturers have to source parts which have drivers for older versions of Android. Or they have to develop their own OSes.</p>

<h2 id="books-are-fungible"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#books-are-fungible" class="heading-link">Books are fungible</a></h2>

<p>Back when Apple sold iPods, they knew that the majority of purchasers would buy MP3s direct from Apple. The perfect symbiotic relationship! But the walled-gardens cracked and now people can buy their music from anywhere.</p>

<p>Amazon keeps this model for its eBooks. Unless you're prepared to get technical, you can only read Amazon books on your Amazon Kindle paid for with your Amazon wallet.</p>

<p>Games consoles are often sold at a loss because the manufacturer knows they'll make it up in game sales and subscriptions.</p>

<p>A low-price manufacturer is unlikely to also run a book store and wouldn't be able to cross-subsidise their hardware with content sales.</p>

<h2 id="alternatives"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#alternatives" class="heading-link">Alternatives</a></h2>

<p>Some people have tried <a href="https://hackaday.com/2019/10/31/building-an-open-hardware-ebook-reader/">building open source eReaders</a> but they're either abandoned, <a href="https://www.crowdsupply.com/soldered/inkplate-6plus#products">not suitable for production</a>, or <a href="https://pine64eu.com/product/pinenote-community-edition/">ridiculously expensive</a>.</p>

<p>Buying second hand is relatively cheap - often under £50. But eInk screens can be brittle, and older ones may have scratches or cracks which are effectively unrepairable.</p>

<h2 id="how-cheap-is-cheap"><a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#how-cheap-is-cheap" class="heading-link">How cheap is cheap?</a></h2>

<p>I'd love a £8 eReader. Something I could throw in a pocket and not worry about damaging. An eReader which was the same price as a hardback book - around £20 - would be amazing.</p>

<p>But I don't think we'll get there soon. The monopoly on screen technologies sets a retail floor of around £30, before the rest of the hardware is taken into account. Niche hardware is viable - but only with decent OS support. Other than Kobo and Amazon, no book retailer wants to stray outside their core competency to develop and subsidise hardware.</p>

<p>So I guess it's buy second-hand, or wait for the patents to expire.</p>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:txtr" role="doc-endnote">
<p>You can <a href="https://chaos.social/@henryk/114433370736288910">see some internal photos on this Mastodon thread</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#fnref:txtr" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>

</ol>
</div>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/#comments" thr:count="24" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/whatever-happened-to-cheap-ereaders/feed/atom/" thr:count="24" />
			<thr:total>24</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Decorative text within HTML]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/" />

		<id>https://shkspr.mobi/blog/?p=60444</id>
		<updated>2025-05-24T11:09:12Z</updated>
		<published>2025-05-25T11:34:29Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="css" /><category scheme="https://shkspr.mobi/blog" term="HTML" />
		<summary type="html"><![CDATA[Back in 2020, Andy Bell introduced me to the idea of grouping attribute values.  You&#039;ve probably seen something like this before:  &#60;article   class=&#34;card-section-background1-colorRed&#34; &#62;&#60;/article&#62;   A single class over-encumbered by all sorts of things.  The more modular way to write this would be:  &#60;article   class=&#34;card section box bg-base color-primary&#34; &#62;&#60;/article&#62;   That&#039;s pretty good! Each…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/"><![CDATA[
				<html><head></head><body><p>Back in 2020, Andy Bell introduced me to the idea of <a href="https://piccalil.li/blog/cube-css/#grouping">grouping attribute values</a>.</p>

<p>You've probably seen something like this before:</p>

<pre><code class="language-html">&lt;article
  class="card-section-background1-colorRed"
&gt;&lt;/article&gt;
</code></pre>

<p>A single class over-encumbered by all sorts of things.  The more modular way to write this would be:</p>

<pre><code class="language-html">&lt;article
  class="card section box bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>That's pretty good! Each one of those classes can have its own bit of CSS and everyone is happy. But… sometimes it is hard to spot the gaps. Is that a - or a spec of dirt on your screen?  Is there a way to make it more visually obvious what the groupings are?</p>

<p>Andy proposed this:</p>

<pre><code class="language-html">&lt;article
  class="[ card ] [ section box ] [ bg-base color-primary ]"
&gt;&lt;/article&gt;
</code></pre>

<p>Or, if you don't like brackets, this:</p>

<pre><code class="language-html">&lt;article
  class="card | section box | bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>The nice thing about attributes values is that they can contain <em>any</em> character. <a href="https://html.spec.whatwg.org/multipage/dom.html#attribute-text">The spec says</a>:</p>

<blockquote><p>An attribute value is a string. Except where otherwise specified, attribute values on HTML elements may be any string value, including the empty string, and there is no restriction on what text can be specified in such attribute values.</p></blockquote>

<p>Obviously there are some little gotchas. Quotes may need to be encoded, and some attributes only take specific variables. For the <code>class</code> attribute, however, <a href="https://html.spec.whatwg.org/multipage/common-microsyntaxes.html#set-of-space-separated-tokens">the spec says</a> they can have:</p>

<blockquote><p>A set of space-separated tokens is a string containing zero or more words (known as tokens) separated by one or more ASCII whitespace, where words consist of any string of one or more characters, none of which are ASCII whitespace.</p></blockquote>

<p>If a string isn't referenced within the CSS, it is simply ignored. So let's get creative!</p>

<h2 id="space-cowboy"><a href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#space-cowboy" class="heading-link">Space Cowboy</a></h2>

<p>You can space your variables however you like. These are all perfectly valid and (might) be easier for a human to read.</p>

<p>Separating out primary and secondary classes:</p>

<pre><code class="language-html">&lt;article
  class="card             section box  bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>Newline classes:</p>

<pre><code class="language-html">&lt;article
  class="card
         section
         box
         bg-base
         color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>Vertically aligned classes:</p>

<pre><code class="language-html">&lt;article
  class="card 
            section
            box
         bg-base 
            color-primary"
&gt;&lt;/article&gt;
</code></pre>

<h2 id="specific-call-outs"><a href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#specific-call-outs" class="heading-link">Specific call-outs</a></h2>

<p>Remember, you can have <em>any</em> text in your class names. If you need to highlight something specific to a human, you could use emoji:</p>

<pre><code class="language-html">&lt;article
  class="card &#x27a1; section box &#x2b05; bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>Or</p>

<pre><code class="language-html">&lt;article
  class="card &#x1f449; section box &#x1f448; bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<h2 id="unicode-abuses"><a href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#unicode-abuses" class="heading-link">Unicode Abuses</a></h2>

<p>Unicode contains lots of <a href="https://en.wikipedia.org/wiki/Mathematical_Alphanumeric_Symbols">mathematical symbols which <em>look</em> like letters</a> but aren't. You <em>could</em> write something like:</p>

<pre><code class="language-html">&lt;article
  class="𝐜𝐚𝐫𝐝 𝑠𝑒𝑐𝑡𝑖𝑜𝑛 𝒃𝒐𝒙 𝘣𝘨-𝘣𝘢𝘴𝘦 c𝐨l𝐨r-p𝐫i𝐦a𝐫y"
&gt;&lt;/article&gt;
</code></pre>

<p>But I wouldn't recommend it; you would need to change your CSS to target those particular values.</p>

<h2 id="commenting"><a href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#commenting" class="heading-link">Commenting</a></h2>

<p>All code should be self commenting. HTML allows <code>&lt;!-- comments in code --&gt;</code> but there's nothing stopping you from adding comments <em>inside</em> values.</p>

<pre><code class="language-html">&lt;article
  class="
    'Cards_updated_with_2025_setting'
     card
    //section_box_to_be_deprecated_next_year
     section box
    #Colours_set_in_primary.css
     bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>I'd suggesting using underscore spacing to keep things readable and avoid having words which are accidentally class names.</p>

<p>Or, go artstic:</p>

<pre><code class="language-html">&lt;article
  class="
     / \
    / _ \
   | / \ |
   ||   || _______
   ||   || |\     \
   ||   || ||\     \
   ||   || || \    |
   ||   || ||  \__/
   ||   || ||   ||
    \\_/ \_/ \_//
   /   _     _   \
  /               \  Don't change this
  |    0     0    |  code without first
  |   \  ___  /   |  speaking to Sam 
 /     \ \_/ /     \ in front-end.
/  -----  |  --\    \
|     \__/|\__/ \   |
\       |_|_|       /
 \_____       _____/
       \     /
       |     |
     card section box bg-base color-primary"
&gt;&lt;/article&gt;
</code></pre>

<p>Yes. That is perfectly valid HTML. It may not be <em>sensible</em>, but it won't cause any problems in the browser. <a href="https://mastodon.social/@Edent/114410839719196560">It might make people grumpy though</a>.</p>

<h2 id="caveats"><a href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#caveats" class="heading-link">Caveats</a></h2>

<p>There are a few things to be aware of here:</p>

<ul>
<li>Optimisers might strip spaces.</li>
<li>Pre-processes might re-order values.</li>
<li>This is unusual and humans might get confused.</li>
</ul>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/#comments" thr:count="9" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/decorative-text-within-html/feed/atom/" thr:count="9" />
			<thr:total>9</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: How to Land a Plane by Mark Vanhoenacker ★★★★☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-how-to-land-a-plane-by-mark-vanhoenacker/" />

		<id>https://shkspr.mobi/blog/?p=59448</id>
		<updated>2025-04-27T15:00:03Z</updated>
		<published>2025-05-23T11:34:44Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[I was lounging by the pool while on holiday, desperately hoping that I would never need to use the knowledge contained within this book.  &#34;How to Land a Plane&#34; is not a metaphor. This isn&#039;t a book which teaches you life-lessons via the exciting world of aeronautics. It is a charming and practical guide to landing plane. What the various instruments say, how the controls work, and the basics of…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-how-to-land-a-plane-by-mark-vanhoenacker/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/cover-2.jpg" alt="Bright green book cover featuring a landing plane." width="200" class="alignleft size-full wp-image-59449">I was lounging by the pool while on holiday, desperately hoping that I would never need to use the knowledge contained within this book.</p>

<p>"How to Land a Plane" is <em>not</em> a metaphor. This isn't a book which teaches you life-lessons via the exciting world of aeronautics. It is a charming and practical guide to landing plane. What the various instruments say, how the controls work, and the basics of navigation.</p>

<p>The author strikes an irreverent but relaxing tone, the sort which might sooth a nervous flyer, as he gently bombards the reader with facts. There are some excellent illustrations and lots of rabbit-holes for the curious adventurer to wander through.  The writing is pure poetry about motion.</p>

<p>It is one of those books which makes you feel clever without effort. For an over-confident man like me, it is utter catnip. I'm now convinced I could mansplain landing a 747 and take a reasonable crack at it if the pilot were incapacitated.</p>

<p>Our flight home was - sadly - uneventful.</p>

<p>I am indebted to my former colleagues at CDDO for getting me this fine leaving present - and regretful that it took me so long to read!</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-how-to-land-a-plane-by-mark-vanhoenacker/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-how-to-land-a-plane-by-mark-vanhoenacker/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: Throne of the Crescent Moon by Saladin Ahmed ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-throne-of-the-crescent-moon-by-saladin-ahmed/" />

		<id>https://shkspr.mobi/blog/?p=59414</id>
		<updated>2025-05-05T08:32:31Z</updated>
		<published>2025-05-21T11:34:41Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[After reading Saladin Ahmed&#039;s collection of short stories, I was keen to read more.  This book is fantastic! Fantasy books usually seem to be swords and dragons, set in a generic European country. Crescent Moon is scimitars and sorcery, and set in a mythical Middle-Eastern country.  The writing is sublime. It feels like an ancient epic, translated a hundred years ago with archaic language left…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-throne-of-the-crescent-moon-by-saladin-ahmed/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/cover-1.jpg" alt="Book cover featuring a throne drenched in blood." width="200" class="alignleft size-full wp-image-59415">After reading <a href="https://shkspr.mobi/blog/2023/06/book-review-engraved-on-the-eye-saladin-ahmed/">Saladin Ahmed's collection of short stories</a>, I was keen to read more.  This book is fantastic! Fantasy books usually seem to be swords and dragons, set in a generic European country. Crescent Moon is scimitars and sorcery, and set in a mythical Middle-Eastern country.</p>

<p>The writing is sublime. It feels like an ancient epic, translated a hundred years ago with archaic language left intact. It'll make good use of your eReader's dictionary to discover words like "ensorcelled".</p>

<p>Amongst all the blood and magic, are literary gems like:</p>

<blockquote><p>Zamia’s little laugh cut through him like a sword poisoned with pure happiness.</p></blockquote>

<p>But, perhaps the best thing about this, is that it reads like the <em>end</em> of a trilogy. The characters are all established, there's little exposition about the fantasy-word, the environment is richly textured. Above all, the characters are <em>tired</em>!</p>

<p>It is a fast-paced, exciting, and entertaining book. Perfect for fantasy-lovers who fancy something a bit different from endless Game-of-Thrones rip-offs.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-throne-of-the-crescent-moon-by-saladin-ahmed/#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-throne-of-the-crescent-moon-by-saladin-ahmed/feed/atom/" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Can you meaningfully measure how environmentally friendly a website is?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/" />

		<id>https://shkspr.mobi/blog/?p=59612</id>
		<updated>2025-05-04T08:10:22Z</updated>
		<published>2025-05-19T11:34:26Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Energy Saving" /><category scheme="https://shkspr.mobi/blog" term="EnergyCrisis" /><category scheme="https://shkspr.mobi/blog" term="environment" /><category scheme="https://shkspr.mobi/blog" term="green" /><category scheme="https://shkspr.mobi/blog" term="websites" />
		<summary type="html"><![CDATA[Think global; act local. That&#039;s the mantra, right? I can&#039;t stop coal plants belching out suffocating pollutants, but can I ensure my website is as environmentally friendly as possible?  There are several services which claim to be able to detect just how lean, green, and clean your website is. But, in my opinion, they&#039;re all a bit inadequate.  WebsiteCarbon  The WebsiteCarbon.com service gives me …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/"><![CDATA[
				<html><head></head><body><p>Think global; act local. That's the mantra, right? I can't stop coal plants belching out suffocating pollutants, but can I ensure my website is as environmentally friendly as possible?</p>

<p>There are several services which <em>claim</em> to be able to detect just how lean, green, and clean your website is. But, in my opinion, they're all a bit inadequate.</p>

<h2 id="websitecarbon"><a href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/#websitecarbon" class="heading-link">WebsiteCarbon</a></h2>

<p>The WebsiteCarbon.com service <a href="https://www.websitecarbon.com/website/shkspr-mobi-blog/">gives me this <em>very</em> pleasing report</a></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/websitecarbon.webp" alt="Website carbon results for: shkspr.mobi/blog
Hurrah! This web page achieves a carbon rating of A. This is cleaner than 82 % of all web pages globally" width="1180" height="649" class="aligncenter size-full wp-image-59729">

<p>But what does that actually mean? There's an almost content-free <a href="https://www.websitecarbon.com/introducing-the-website-carbon-rating-system/">description of their rating system</a>.  It boils down to <a href="https://www.websitecarbon.com/how-does-it-work/">how large your web pages are</a> and whether your <a href="https://www.websitecarbon.com/how-does-it-work/#green-energy">data centre runs on green energy</a>.</p>

<p>I specifically chose <a href="https://krystal.io/green">Krystal as my host because of their green energy credentials</a>. So it got that right.</p>

<p>WebsiteCarbon seems to just be an advertising pitch for their paid-for auditing services:</p>

<blockquote><p>You can get a comprehensive view of a website’s emissions and potential improvements by carrying out a Website Carbon Audit.</p></blockquote>

<p>Let's try another service.</p>

<h2 id="ecograder"><a href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/#ecograder" class="heading-link">EcoGrader</a></h2>

<p><a href="https://ecograder.com/report/1yLXszsX2DpOmRPIZyu0NKhz">EcoGrader gives me a lower score</a> but provides a lot more detail about <em>why</em>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Impact-Report.webp" alt="Your Impact Report

Report for:
https://shkspr.mobi/blog/
Performance Impact
Ecograder Score 86 Out of 100.

Emissions per Pageload 0.28 grams of carbon dioxide.

This page scores better than 78% of all URLs crawled by Ecograder.

Ecograder scores pages based on a variety of performance, efficiency, and user experience factors as well as emissions estimates and green hosting powered by renewable energy.

    Page Weight
    84
    UX Design
    86
    Green Hosting
    100" width="1496" height="623" class="aligncenter size-full wp-image-59730">

<p>They also give tips on how I can improve things.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/cwv.webp" alt="Tips like optimise media, remove unused code, properly size images, reduce 3rd party code." width="405" height="786" class="aligncenter size-full wp-image-59732">

<p>Do you notice anything about those tips? They're basically the same as <a href="https://web.dev/explore/learn-core-web-vitals">Core Web Vitals</a>! A set of useful, if generic, tips to optimise your website.</p>

<h2 id="others"><a href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/#others" class="heading-link">Others</a></h2>

<p>There are <a href="https://rootwebdesign.studio/articles/tools-for-calculating-your-websites-co2-emissions/">several other services</a> which claim to measure your site's eco-credentials. But, as far as I can tell, they're all doing the same thing; reskinning Core Web Vitals or similar products.</p>

<p>Some, like, <a href="https://themarkup.org/blacklight">Blacklight</a> are promoted on the claim that <a href="https://rootwebdesign.studio/articles/the-environmental-benefits-of-privacy-focussed-web-design/">excessive tracking scripts are an environmental disaster</a>. In the end, the message is the same - clean up your website to make it <del>faster</del> more efficient.</p>

<h2 id="what-does-this-mean"><a href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/#what-does-this-mean" class="heading-link">What Does This Mean?</a></h2>

<p>The <a href="https://shkspr.mobi/blog/2021/12/energy-efficiency-of-modern-codecs/">energy efficiency of modern codecs</a> is often asymmetric. It might be energy intensive to encode a movie - but that's paid back a thousand-fold by having to store and stream less data and by the efficiency of the decode process at the user's end.</p>

<p>If you operating at planetary scale then, yes, a small saving affecting a billion users will have a huge impact. If you're optimising a single hero image on your recipe blog, probably not so much.</p>

<p>Much like the discredited idea that <a href="https://shkspr.mobi/blog/2021/10/no-you-cant-save-30-per-year-by-switching-off-your-standby-devices/">by switching off your "standby" devices you can save £££</a>, most of these website changes are marginal at best.</p>

<p>Yes, we should strive for svelte and performant websites - as much for usability as for environmentalism. It makes ecological sense to choose a hosting provider who is at least somewhat responsible in their energy usage - as much for cost as for anything else.</p>

<p>If these websites help convince your boss that you can remove horrific amounts of JS, upgrade images to WebP, and set sensible caching policies - great! Sell them the shiny accreditation badge while you go about making the site better.</p>

<p>Finally, a word of caution to anyone implicitly trusting these services - there's no way to know what's going on in the background of a website. An ultra efficient looking website served from a green data-centre, might be spinning up a dozen LLMs just to churn out the page content. A slow website <a href="https://solar.lowtechmagazine.com/">might be solar powered</a>.  All those ultra-compressed images might be adverts for fossil fuels.</p>

<p>And every time you leave a comment on my blog, I shoot a panda.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/#comments" thr:count="5" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/can-you-meaningfully-measure-how-environmentally-friendly-a-website-is/feed/atom/" thr:count="5" />
			<thr:total>5</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: Death Glitch - How Techno-Solutionism Fails Us in This Life and Beyond by Tamara Kneese ★★★★⯪]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-death-glitch-how-techno-solutionism-fails-us-in-this-life-and-beyond-by-tamara-kneese/" />

		<id>https://shkspr.mobi/blog/?p=59458</id>
		<updated>2025-05-14T16:50:10Z</updated>
		<published>2025-05-17T11:34:30Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" /><category scheme="https://shkspr.mobi/blog" term="death" />
		<summary type="html"><![CDATA[What happens after we die? All dogs go to heaven, but all data eventually gets corrupted.  Most online services are designed for the &#34;happy path&#34;. Users never change name, gender remains fixed, spouses never divorce, and customers live forever. The real world is a tad more complicated.  As the book puts it:  When death occurs for users and platforms, it becomes a kind of glitch that reveals needs …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-death-glitch-how-techno-solutionism-fails-us-in-this-life-and-beyond-by-tamara-kneese/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/cover-5.jpg" alt="Glitch art book cover." width="200" class="alignleft size-full wp-image-59459">What happens after we die? All dogs go to heaven, but all data eventually gets corrupted.</p>

<p>Most online services are designed for the "happy path". Users never change name, gender remains fixed, spouses never divorce, and customers live forever. The real world is a tad more complicated.  As the book puts it:</p>

<blockquote><p>When death occurs for users and platforms, it becomes a kind of glitch that reveals needs that designers did not originally consider.</p></blockquote>

<p>This is an exploration of what happens to our digital remains after we have shuffled off this mortal coil.</p>

<p>Did you know that graves are regularly re-used? The plot your dear old granny is buried in, will one day make room for someone else's beloved. The same is true on the Internet.</p>

<blockquote><p>When Paul created a memorial website for Julie, julieslife.com, he found that two other women named Julie had used that domain before; he was building on top of their digital traces.</p></blockquote>

<p>It is worth noting that this is an academic book. It is rather heavy on the (Marxist) theory and a little unforgiving to the casual reader.</p>

<blockquote><p>In Chun’s estimation, digital information is itself “undead,” having ghostly qualities that she likens to Karl Marx’s commodity fetishism: “if a commodity is, as Marx famously argued, a ‘sensible supersensible thing,’ information would seem to be its complement: a supersensible sensible thing.”</p></blockquote>

<p>Death is hard work for all involved. Do you want your loved ones to be burdened with the admin of keeping your domain active? Do they really want the hassle of sorting through your MP3s? Does anyone care about your custom Netflix algorithm?</p>

<p>One of the hardest things I had to do recently was "unfriend" someone who had died. The platform didn't have a "memorial" option, and I kept being suggested to reconnect with someone who was uncontactable without a Ouija Board.  The book points out how Facebook and other platforms evolved to support the death of their users - even though the platforms were sometimes reluctant in the face of hostility from the living.</p>

<blockquote><p>Instead of trusting religious entities with their immortal souls, users should put their faith in the tech industry. Rather than employing established institutions or kinship networks to manage digital belongings, ordinary users are expected to outsource that labor to a host of relatively new web-based companies that might very well dissolve within a decade.</p></blockquote>

<p>These are secular problems which remain unsolved. They cannot be solved by the current cultural hegemon:</p>

<blockquote><p>Digital remains are dependent on the global reach and future existence of successful platforms, but they are also mostly located in the United States, particularly in the San Francisco Bay area and along the West Coast.</p></blockquote>

<p>The author also <em>directly</em> attacks me:</p>

<blockquote><p>Smart homes are designed according to the specifications of those who build them and do not take into account the desires of those who inherit them. They are fundamentally incompatible with the collective care work needed to keep them running.</p></blockquote>

<p>Harsh but fair!</p>

<p>I could quote endlessly from this book. It points out how digital devices become haunted objects, as our last wishes cascade through endless algorithms, how we don't control digital products in the same way as we do the physical, and how it is our duty to die responsibly.</p>

<p>It is a little heavy on the Marxist discourse but, to be fair, the right-wing are incapable of writing anything academic - so the free market has prevailed and delivers us Socialist dreams.</p>

<p>The only question I have left to ask is: who gets my ringtones when I die?</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-death-glitch-how-techno-solutionism-fails-us-in-this-life-and-beyond-by-tamara-kneese/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-death-glitch-how-techno-solutionism-fails-us-in-this-life-and-beyond-by-tamara-kneese/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: Protective Practices - A History of the London Rubber Company and the Condom Business by Jessica Borge ★★★★☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-protective-practices-a-history-of-the-london-rubber-company-and-the-condom-business-by-jessica-borge/" />

		<id>https://shkspr.mobi/blog/?p=59410</id>
		<updated>2025-04-26T10:29:46Z</updated>
		<published>2025-05-15T11:34:35Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[Did you know that there was a virtual monopoly on condom production in the UK? I certainly didn&#039;t! This book is a detailed dive into how and why one company came to dominate the &#34;French Letter&#34; business and the ways in which British culture shaped them.  This is a sober and detailed look through the lifespan of a fascinating British company. It is, in part, corporate biography, marketing…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-protective-practices-a-history-of-the-london-rubber-company-and-the-condom-business-by-jessica-borge/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/cover.jpg" alt="Book Cover." width="200" class="alignleft size-full wp-image-59411">Did you know that there was a virtual monopoly on condom production in the UK? I certainly didn't! This book is a detailed dive into how and why one company came to dominate the "French Letter" business and the ways in which British culture shaped them.</p>

<p>This is a sober and detailed look through the lifespan of a fascinating British company. It is, in part, corporate biography, marketing textbook, business thriller, and social history.  Dr Borge has an eye for the interesting story buried deep within the manilla folders of corporate drudgery.</p>

<p>It starts with a little pre-history of the condom, how it came to be, and how it was marketed. Of interest me was just how attitudes about sex waxed and waned throughout the years:</p>

<blockquote><p>Both in London and in provincial towns, retailers presented contraceptive supplies blatantly and without embarrassment, so much so that the commercialization of contraceptives was well established by the interwar period. Women and men of any class might purchase them on high streets</p></blockquote>

<p>There are amazing titbits of historical shenanigans - with the eugenicist Marie Stopes coming in for some well-deserved criticism.</p>

<blockquote><p>Stopes, who broke away from the NBCA/FPA, believed in the “highly stimulating” (by which we can infer sexually arousing) power of semen absorption through vaginal walls, and vetoed the condom on that basis.</p></blockquote>

<p>Considering the secrecy surrounding the London Rubber Company, there are a good number of archival photos which enliven the text.  In fact, more than secret, at time the company seems to have become a cult - under thrall to its purported founder while whitewashing dissenting heretics.</p>

<p>It is weird to see just how much and little has changed when it comes to attitudes around health and birth control.</p>

<blockquote><p>Comparable to the later Point of Display law for cigarettes, which came into force under the 2009 Health Act and saw tobacco products covered by opaque shutters in shops, 1930s campaigners felt that attractive packaging enticed consumers into patterns of behaviour in which they would not otherwise engage.</p></blockquote>

<p>Imagine telling someone from the 1940s that tobacco adverts would be banned in the future but contraceptives and sex aids would be on full display!</p>

<p>At times, it does stray slightly into textbook territory. Each chapter has an introductory summary and an ending recap. I suspect part of the target audience may be marketing students who are assigned to read one specific chapter, or business studies students tearing through it in a hurry.</p>

<p>What amazed me was just how underhand and duplicitous the London Rubber Company appeared to be. They abused their monopoly, tried to force clinics to carry their advertising, and even engaged in astroturfing:</p>

<blockquote><p>To this end, the ‘Genetic Studies Unit’ was invented by London Rubber’s PR agent, Marc Quinn Associates, in 1964.</p></blockquote>

<p>We go through politics, changes in attitudes, and the geo-politics of rubber supplies. To say it is varied is an understatement!</p>

<p>For a company obsessed with making money, it is downright strange how their internalised bigotry almost broke the company.</p>

<blockquote><p>the transition to a new customer base was culturally problematic for the company. Its dependence on addressing its consumer base through normative stereotypes was well established, and it was reluctant to publicly acknowledge the use of its product outside of the normative heterosexual family.</p></blockquote>

<p>The ending is a little abrupt, covering several decades in a single chapter - it could easily have been twice the length.</p>

<p>Ultimately, if you're interested in the intersection of commerce and the politics of sex, this is the book for you.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-protective-practices-a-history-of-the-london-rubber-company-and-the-condom-business-by-jessica-borge/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-protective-practices-a-history-of-the-london-rubber-company-and-the-condom-business-by-jessica-borge/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: The Canterbury Tales - Geoffrey Chaucer (Standard Ebooks version)]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-the-canterbury-tales-geoffrey-chaucer-standard-ebooks-version/" />

		<id>https://shkspr.mobi/blog/?p=59779</id>
		<updated>2025-04-26T10:29:43Z</updated>
		<published>2025-05-13T11:34:11Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[I am flying through the sky with a magic glass on my lap. As I hurtle at terrifying speeds to lands undreamed of, Chaucer&#039;s words arrange themselves on the slate. With the merest flick of my fingers another tale appears. In a few hours I will have covered more distance than he ever did in his lifetime. The parchment evidence of his life is now compiled for all to read.  I can&#039;t remember when I…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-the-canterbury-tales-geoffrey-chaucer-standard-ebooks-version/"><![CDATA[
				<html><head></head><body><p>I am flying through the sky with a magic glass on my lap. As I hurtle at terrifying speeds to lands undreamed of, Chaucer's words arrange themselves on the slate. With the merest flick of my fingers another tale appears. In a few hours I will have covered more distance than he ever did in his lifetime. The parchment evidence of his life is now compiled for all to read.</p>

<p>I can't remember when I last read a book aloud. With Chaucer, I found myself mouthing along to the lines - it was the only way to make sense of the rhythms and rhymes.  The <a href="https://standardebooks.org/ebooks/geoffrey-chaucer/the-canterbury-tales">Standard Ebooks version</a> is a copy of the mid-1800s translation so while the language is <em>somewhat</em> more accessible, there are still lots of explanatory footnotes and a fair bit of dictionary look-ups.</p>

<p>What's fascinating is how the tropes and stereotypes echo down through the ages.  The COVID profiteers are no different to the plague doctors:</p>

<blockquote><p>He kept that he won in the pestilence.<br>
For gold in physic is a cordial;<br>
Therefore he loved gold in special.</p></blockquote>

<p>It is also delightful to use rhymes to see how language has changed:</p>

<blockquote><p><em>Translation</em><br>
And weakë be the oxen in my plough;<br>
The remnant of my tale is long enow.<br><br>
<em>Original</em><br>
And wayke been the oxen in my plough.<br>
The remenant of the tale is long ynough.</p></blockquote>

<p>I was impressed by just how <em>silly</em> Chaucer is - it really feels like he's making up the story casually as he goes along:</p>

<blockquote><p>Her yellow hair was braided in a tress,<br>
Behind her back, a yardë long I guess.</p></blockquote>

<p>Which also brings forth some genuine laughs:</p>

<blockquote><p>Who couldë rhyme in English properly<br>
His martyrdom? forsooth, it is not I;</p></blockquote>

<p>The Knight's Tale goes on a bit, and is <em>desperately</em> melodramatic. But the pace is good and the story compelling.</p>

<p>The Miller's Tale is <strong>rude</strong></p>

<blockquote><p>And at the window she put out her hole,<br>
And Absolon him fell ne bet ne werse,<br>
But with his mouth he kiss’d her naked erse<br>
Full savourly. When he was ware of this,<br>
Aback he start, and thought it was amiss,<br>
For well he wist a woman hath no beard.<br>
He felt a thing all rough, and long y-hair’d,<br>
And saidë; “Fy, alas! what have I do?”<br>
“Te he!” quoth she, and clapt the window to;</p></blockquote>

<p>It gets even more scatalogical:</p>

<blockquote><p>“Speak, sweetë bird, I know not where thou art.”<br>
This Nicholas anon let fly a fart,<br>
As great as it had been a thunder dent;<br>
That with the stroke he was well nigh y-blent;</p></blockquote>

<p>Although - content warning - it does have a fair bit of rape and sexual assault in it.</p>

<p>I was fascinated with how much scientific knowledge there was in it. Along with the talk of "infinity" there's a marvellous passage about calculating the time from the sun:</p>

<blockquote><p>And saw well that the shadow of every tree<br>
Was in its length of the same quantity<br>
That was the body erect that caused it;<br>
And therefore by the shadow he took his wit,<br>
That Phoebus, which that shone so clear and bright,<br>
Degrees was five-and-forty clomb on height;<br>
And for that day, as in that latitude,<br>
It was ten of the clock, he gan conclude;</p></blockquote>

<p>He also displays a surprisingly amount of knowledge of Islam and some of its central theses.</p>

<p>The Wife of Bath is amazing! A total feminist icon. With her five husbands that she's outlived after gaining their great big tracts of land. She rails against the patriarchy, the fetishisation of chastity, and the hypocrisy of men</p>

<blockquote><p>But well I wot, express without a lie,<br>
God bade us for to wax and multiply;<br>
That gentle text can I well understand.<br>
Eke well I wot, he said, that mine husbánd<br>
Should leave father and mother, and take to me;<br>
But of no number mentión made he,<br>
Of bigamy or of octogamy;<br>
Why then should men speak of it villainy?</p></blockquote>

<p>Once you can get past the language barrier and get into the rhythm, the stories are bawdy and jolly.</p>

<p>Sadly, I had to give up reading the <a href="https://standardebooks.org/ebooks/geoffrey-chaucer/the-canterbury-tales">Standard Ebooks version</a> halfway through. Although it is perfectly formatted and beautifully typeset, it has numerous typographical errors.  It appears most of those typos appear in the Gutenberg version which it is adapted from. I <a href="https://github.com/standardebooks/geoffrey-chaucer_the-canterbury-tales/pulls?q=is%3Apr+is%3Aclosed+author%3Aedent">sent a few pull requests to fix the ones I found</a> but it became increasingly frustrating not knowing whether a spelling was archaic or merely transcribed incorrectly.</p>

<p>The other issue is that this is the Purves translation from the mid-1800s. Although it does a reasonable job with explanatory footnotes, it also is <em>weirdly</em> censored in places. For example, in The Wife of Bath, the titular character says:</p>

<blockquote><p>Is it for ye would have my [love] alone?</p></blockquote>

<p>What word has been elided? The original is:</p>

<blockquote><p>Is it for ye wolde have my queynte allone?</p></blockquote>

<p>Yes kids! Chaucer used <em>very</em> naughty words!</p>

<p>So I stopped reading that version and will restart with a more modern and less Bowdlerised version. Any recommendations?</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-the-canterbury-tales-geoffrey-chaucer-standard-ebooks-version/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-the-canterbury-tales-geoffrey-chaucer-standard-ebooks-version/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Book Review: Learning to Think by Tracy King ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-learning-to-think-by-tracy-king/" />

		<id>https://shkspr.mobi/blog/?p=60426</id>
		<updated>2025-05-10T20:38:43Z</updated>
		<published>2025-05-11T11:34:19Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="autobiography" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[What does it mean to write an autobiography?  For most people, their autobiography is a series of well-worn stories that they&#039;ve told themselves. I remember reading Peter Mandelson&#039;s autobiography and being staggered at how he won every argument he ever had and was proved completely right by history. I&#039;m sure you&#039;ve read a dozen autobiographies where the subject has gleefully recounted something …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/book-review-learning-to-think-by-tracy-king/"><![CDATA[
				<html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/9781473583764-jacket-large.jpg" alt="Book cover. A smiling young girl sat on a sofa." width="200" class="alignleft size-full wp-image-60427"> What does it mean to write an autobiography?</p>

<p>For most people, their autobiography is a series of well-worn stories that they've told themselves. I remember reading Peter Mandelson's autobiography and being staggered at how he won every argument he ever had and was proved completely right by history. I'm sure you've read a dozen autobiographies where the subject has gleefully recounted something which <em>sounds</em> true, but with no fact checking.</p>

<p>Tracy King's autobiography is different. There is a story that she has told herself about her father's death. The event is a pivotal point in the life of her and her family. Their world is shattered by the tragedy and the events surround it become mythologised. Rather than just retelling the story, she asks the important question - <strong>is this true?</strong></p>

<p>That's what Learning To Think is about.</p>

<p>Do you have the courage to revisit a distressing moment from your past and interrogate it?  We all have totemic stories about our history but very few of us go back to check whether our memories are accurate.  I hesitate to describe the revelations as a "plot-twist", because this is real life, but it is astounding.</p>

<p>The writing is beautiful and portentous. It also spends a fair amount of time seeking to understand why people (like the author) get drawn to religion, mysticism, and conspiracy theories:</p>

<blockquote><p>Solving problems you’ve invented is a good facsimile of empowerment when you’ve never had the real thing.</p></blockquote>

<p>It would be tempting to lump this in with the "misery memoir" genre - but I think it is something else. It isn't about revelling in the pain and inviting the reader to share it, instead it is a hopeful look at how the truth sets us free. It is bleakly hilarious at times with its blunt assessment of some shocking events.</p>

<p>I sometimes worry that science and "new rationalism" is a cult. It can attract people who are desperate for answers and want to surrender to a system which will teach them the secret truths of the world.  But, as this book points out, rationality gives us the power to say "but I could be wrong".</p>

<p>Science should teach us to be humble. Not humble in front of a god; humble in front of our own fallibilities and vulnerabilities.</p>

<p>This is a thought-provoking and wonderful book.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/book-review-learning-to-think-by-tracy-king/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/book-review-learning-to-think-by-tracy-king/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Stop using preg_* on HTML and start using \Dom\HTMLDocument instead]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/" />

		<id>https://shkspr.mobi/blog/?p=60375</id>
		<updated>2025-05-05T10:53:40Z</updated>
		<published>2025-05-09T11:34:56Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="HTML" /><category scheme="https://shkspr.mobi/blog" term="HTML5" /><category scheme="https://shkspr.mobi/blog" term="php" />
		<summary type="html"><![CDATA[It is a truth universally acknowledged that a programmer in possession of some HTML will eventually try to parse it with a regular expression.  This makes many people very angry and is widely regarded as a bad move.  In the bad old days, it was somewhat understandable for a PHP coder to run a quick-and-dirty preg_replace() on a scrap of code. They probably could control the input and there wasn&#039;t …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/"><![CDATA[
				<html><head></head><body><p>It is a truth universally acknowledged that a programmer in possession of some HTML will eventually try to parse it with a regular expression.</p>

<p><a href="https://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454">This makes many people very angry and is widely regarded as a bad move</a>.</p>

<p>In the bad old days, it was somewhat understandable for a PHP coder to run a quick-and-dirty <code>preg_replace()</code> on a scrap of code. They probably could control the input and there wasn't a great way to manipulate an HTML5 DOM.</p>

<p>Rejoice sinners! PHP 8.4 is here to save your wicked souls. There's a new <a href="https://wiki.php.net/rfc/domdocument_html5_parser">HTML5 Parser</a> which makes <em>everything</em> better and stops you having to write brittle regexen.</p>

<p>Here are a few tips - mostly notes to myself - but I hope you'll find useful.</p>

<h2 id="sanitise-html"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#sanitise-html" class="heading-link">Sanitise HTML</a></h2>

<p>This is the most basic example. This loads HTML into a DOM, tries to fix all the mistakes it finds, and then spits out the result.</p>

<pre><code class="language-php">$html = '&lt;p id="yes" id="no"&gt;&lt;em&gt;Hi&lt;/div&gt;&lt;h2&gt;Test&lt;/h3&gt;&lt;img /&gt;';
$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED , "UTF-8" );
echo $dom-&gt;saveHTML();
</code></pre>

<p>It uses <code>LIBXML_HTML_NOIMPLIED</code> because we don't want a full HTML document with a doctype, head, body, etc.</p>

<p>If you want <a href="https://shkspr.mobi/blog/2025/04/introducing-pretty-print-html-for-php-8-4/">Pretty Printing, you can use my library</a>.</p>

<h2 id="get-the-plain-text"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#get-the-plain-text" class="heading-link">Get the plain text</a></h2>

<p>OK, so you've got the DOM, how do you get the text of the body without any of the surrounding HTML</p>

<pre><code class="language-php">$html = '&lt;p&gt;&lt;em&gt;Hello&lt;/em&gt; World!&lt;/p&gt;';
$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR , "UTF-8" );
echo $dom-&gt;body-&gt;textContent;
</code></pre>

<p>Note, this doesn't replace images with their alt text.</p>

<h2 id="get-a-single-element"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#get-a-single-element" class="heading-link">Get a single element</a></h2>

<p>You can use <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelector">the same <code>querySelector()</code> function as you do in JavaScript</a>!</p>

<pre><code class="language-php">$element = $dom-&gt;querySelector( "h2" );
</code></pre>

<p>That returns a <em>pointer</em> to the element. Which means you can run:</p>

<pre><code class="language-php">$element-&gt;setAttribute( "id", "interesting" );
echo $dom-&gt;querySelector( "h2" )-&gt;attributes["id"]-&gt;value;
</code></pre>

<p>And you will see that the DOM has been manipulated!</p>

<h2 id="search-for-multiple-elements"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#search-for-multiple-elements" class="heading-link">Search for multiple elements</a></h2>

<p>Suppose you have a bunch of headings and you want to get all of them. You can use <a href="https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll">the same <code>querySelectorAll()</code> function as you do in JavaScript</a>!</p>

<p>To get all headings, in the order they appear:</p>

<pre><code class="language-php">$headings = $dom-&gt;querySelectorAll( "h1, h2, h3, h4, h5, h6" );
foreach ( $headings as $heading ) {
   // Do something
}
</code></pre>

<h2 id="advanced-search"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#advanced-search" class="heading-link">Advanced Search</a></h2>

<p>Suppose you have a bunch of links and you want to find only those which point to "example.com/test/". Again, you can use <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors">the same attribute selectors</a> as you would elsewhere</p>

<pre><code class="language-php">$dom-&gt;querySelectorAll( "a[href^=https\:\/\/example\.com\/test\/]" );
</code></pre>

<h2 id="replacing-content"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#replacing-content" class="heading-link">Replacing content</a></h2>

<p>Sadly, it isn't quite as simple as setting the <code>innerHTML</code>.  Each search returns a node. That node may have <em>children</em>. Those children will also be node which, themselves, may have children, and so on.</p>

<p>Let's take a simple example:</p>

<pre><code class="language-php">$html = '&lt;h2&gt;Hello&lt;/h2&gt;';
$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
$element = $dom-&gt;querySelector( "h2" );
$element-&gt;childNodes[0]-&gt;textContent = "Goodbye";
echo $dom-&gt;saveHTML();
</code></pre>

<p>That changes "Hello" to "Goodbye".</p>

<p>But what if the element has child nodes?</p>

<pre><code class="language-php">$html = '&lt;h2&gt;Hello &lt;em&gt;friend&lt;/em&gt;&lt;/h2&gt;';
$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
$element = $dom-&gt;querySelector( "h2" );
$element-&gt;childNodes[0]-&gt;textContent = "Goodbye";
echo $dom-&gt;saveHTML();
</code></pre>

<p>That outputs <code>&lt;h2&gt;Goodbye&lt;em&gt;friend&lt;/em&gt;&lt;/h2&gt;</code> - so think carefully about the structure of the DOM and what you want to replace.</p>

<h2 id="adding-a-new-node"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#adding-a-new-node" class="heading-link">Adding a new node</a></h2>

<p>This one is tricky!  Let's suppose you have this:</p>

<pre><code class="language-html">&lt;div id="page"&gt;
   &lt;main&gt;
      &lt;h2&gt;Hello&lt;/h2&gt;
</code></pre>

<p>You want to add an <code>&lt;h1&gt;</code> <em>before</em> the <code>&lt;h2&gt;</code>. Here's how to do this.</p>

<p>First, you need to construct the DOM:</p>

<pre><code class="language-php">$html = '&lt;div id="page"&gt;&lt;main&gt;&lt;h2&gt;Hello&lt;/h2&gt;';
$dom = \Dom\HTMLDocument::createFromString( $html, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
</code></pre>

<p>Next, you need to construct <em>an entirely new</em> DOM for your new node.</p>

<pre><code class="language-php">$newHTML = "&lt;h1&gt;Title&lt;/h1&gt;";
$newDom = \Dom\HTMLDocument::createFromString( $newHTML, LIBXML_NOERROR | LIBXML_HTML_NOIMPLIED, "UTF-8" );
</code></pre>

<p>Next, extract the new element from the new DOM, and import it into the original DOM:</p>

<pre><code class="language-php">$element = $dom-&gt;importNode( $newDom-&gt;firstChild, true ); 
</code></pre>

<p>The element now needs to be inserted <em>somewhere</em> in the original DOM. In this case, get the <code>h2</code>, tell its parent node to insert the new node <em>before</em> the <code>h2</code>:</p>

<pre><code class="language-php">$h2 = $dom-&gt;querySelector( "h2" );
$h2-&gt;parentNode-&gt;insertBefore( $element, $h2 );
echo $dom-&gt;saveHTML();
</code></pre>

<p>Out pops:</p>

<pre><code class="language-html">&lt;div id="page"&gt;
   &lt;main&gt;
      &lt;h1&gt;Title&lt;/h1&gt;
      &lt;h2&gt;Hello&lt;/h2&gt;
   &lt;/main&gt;
&lt;/div&gt;
</code></pre>

<p>An alternative is to use <a href="https://www.php.net/manual/en/domnode.appendchild.php">the <code>appendChild()</code> method</a>. Note that it appends it to the <em>end</em> of the children. For example:</p>

<pre><code class="language-php">$div = $dom-&gt;querySelector( "#page" );
$div-&gt;appendChild( $element );
echo $dom-&gt;saveHTML();
</code></pre>

<p>Produces:</p>

<pre><code class="language-html">&lt;div id="page"&gt;
   &lt;main&gt;
      &lt;h2&gt;Hello&lt;/h2&gt;
   &lt;/main&gt;
   &lt;h1&gt;Title&lt;/h1&gt;
&lt;/div&gt;
</code></pre>

<h2 id="and-more"><a href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#and-more" class="heading-link">And more?</a></h2>

<p>I've only scratched the surface of what the new 8.4 HTML Parser can do. I've already rewritten lots of my yucky old <code>preg_</code> code to something which (hopefully) is less likely to break in catastrophic ways.</p>

<p>If you have any other tips, please leave a comment.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/#comments" thr:count="5" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/stop-using-preg_-on-html-and-use-domhtmldocument/feed/atom/" thr:count="5" />
			<thr:total>5</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Gadget Review: AsiceSound Bluetooth Earbuds S23 ★⯪☆☆☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/" />

		<id>https://shkspr.mobi/blog/?p=60947</id>
		<updated>2025-05-08T18:16:25Z</updated>
		<published>2025-05-07T11:34:56Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="bluetooth" /><category scheme="https://shkspr.mobi/blog" term="gadget" /><category scheme="https://shkspr.mobi/blog" term="headphones" /><category scheme="https://shkspr.mobi/blog" term="review" />
		<summary type="html"><![CDATA[The good folks at AsiceSound sent me their latest Bluetooth Earbuds. They&#039;re yet another no brand company which rebadge various Chinese gadgetry.    The S23 are £50, which is a reasonable price compared to AirPods, and expensive compared to bargain basement earbuds. So what do these have going for them?          The charging case shows the battery level of each bud      You get a few different si…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/"><![CDATA[
				<html><head></head><body><p>The good folks at AsiceSound sent me their latest Bluetooth Earbuds. They're yet another <a href="https://uspto.report/TM/98243629">no brand company</a> which rebadge various Chinese gadgetry.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/HeadphonesInCase.webp" alt="Black headphones in a black case. An LCD shows the charging level." width="1024" height="768" class="aligncenter size-full wp-image-61009">

<p>The S23 are £50, which is a reasonable price compared to AirPods, and expensive compared to bargain basement earbuds. So what do these have going for them?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/headphones.webp" alt="Earbuds with flashing lights." width="1024" height="576" class="aligncenter size-full wp-image-61010">

<ul style="list-style-type: &quot;&#x2705;&quot;;">
    <li>&nbsp;The charging case shows the battery level of each bud</li>
    <li>&nbsp;You get a few different sized tips for the earbuds.</li>
</ul>

<p>But, on the flipside…</p>

<ul style="list-style-type: &quot;&#x274c;&quot;;">
    <li>&nbsp;Lack of Qi / Wireless charging of the case.</li>
    <li>&nbsp;Charging display flashes constantly.</li>
    <li>&nbsp;Touch controls are a nightmare.</li>
</ul>

<p>*<em>sigh</em>* Let's talk about controls. If your phone is in your pocket, you want an easy way to change the volume, play/pause, skip tracks, and summon your digital assistant.</p>

<p>On the Pixel Buds you can tap, hold, and swipe for those controls on either ear. On these, not so much. You need to remember a precise sequence of taps if you want to do <em>anything</em>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/controls.webp" alt="List of controls and how many taps they take." width="1200" height="560" class="aligncenter size-full wp-image-61008">

<p>Oh, you also need to remember which ear to use.  Here's the list of controls.</p>

<ul>
<li>Tap once

<ul>
<li>Either ear: Play / Pause</li>
<li>Either ear: Answer / Hang-up call</li>
</ul></li>
<li>Tap twice

<ul>
<li>Left ear: Previous Track</li>
<li>Right ear: Next Track</li>
</ul></li>
<li>Tap three times

<ul>
<li>Left ear: Volume Down</li>
<li>Right ear: Volume Up</li>
</ul></li>
<li>Hold 2 seconds

<ul>
<li>Launch assistant.</li>
<li>Reject call.</li>
</ul></li>
<li>Hold 3 seconds

<ul>
<li>Left ear: Turn off left headphone</li>
<li>Right ear: Turn off right headphone</li>
</ul></li>
</ul>

<p>Yup! There's no way to switch both off with one gesture. And if you hold down for Siri for too long, you one of your buds switches off. And if you're too slow with your volume changes, the track either pauses or skips.  It really is frustrating to use.</p>

<p>Volume control worked, as did play/pause. I couldn't get double-tapping to skip track to work on Android or Linux.</p>

<h2 id="charging"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/#charging" class="heading-link">Charging</a></h2>

<p>The buds recharge inside a case. It takes a standard USB-C cable - albeit only at 5V. It also seems to discharge into the headphones disturbingly rapidly.</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-60947-4" width="620" height="349" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/output.mp4?_=4"><a href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/output.mp4">https://shkspr.mobi/blog/wp-content/uploads/2025/05/output.mp4</a></video></div><p></p>

<p>You do get to see how charged each side is, which is helpful. But, when charging, the display on the case flashes constantly which is a bit annoying.</p>

<p>There's no wireless charging in the case, no rapid charging, or anything like that.</p>

<h2 id="audio"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/#audio" class="heading-link">Audio</a></h2>

<p>They claim that codec support includes <a href="https://www.whathifi.com/advice/ldac-what-is-it-how-can-you-get-it">LDAC</a> - but my Android only showed AAC or SBC for audio.  My other headphones will work with LDAC, so I don't think my phone is the problem.</p>

<p>Audio playback quality was fine. Voice quality was a little muffled.</p>

<p>Their Amazon advert claims "Active Noise Cancellation" but I couldn't find any evidence of that. There was certainly no way to turn it on or off. The snug fit of the rubber tips did keep our a fair bit of noise though.</p>

<h2 id="linux"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/#linux" class="heading-link">Linux</a></h2>

<p>They paired just fine with Linux - showing as both a headset (with microphone) and headphones.</p>

<p>The only codecs it advertised were:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/05/codecs.webp" alt="AAC, SBC, SBC-XQ." width="730" height="201" class="aligncenter size-full wp-image-61005">

<p>You can read about <a href="https://www.pcmag.com/how-to/what-are-bluetooth-codecs-a-guide-to-everything-from-aac-to-sbc">the difference between the codecs</a> - they're all basically fine for listening to music, but none are LDAC.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/#verdict" class="heading-link">Verdict</a></h2>

<p>I can't really recommend these. The sound quality is good - although not as advertised. A range of tips means they fit well enough and won't fall out while you're exercising. Voice quality is adequate.</p>

<p>But the interface is <em>so</em> frustrating.</p>

<p>The touch-target on the headphones is fairly small, so it is pretty easy to miss it entirely. If you miss one of your triple-taps it becomes a double-tap, which might not be what you want at all.</p>

<p>You have to remember a bewildering array of taps - and they differ between ears.</p>

<p>There's a horrible tinny voice to announce when a device is paired or the buds are powered off. It sounds cheap and nasty.</p>

<p>If you're prepared to memorise and put up with the interface, I'd still say they were overpriced.</p>
</body></html>]]></content>
		
		<link href="https://shkspr.mobi/blog/wp-content/uploads/2025/05/output.mp4" rel="enclosure" length="1244953" type="video/mp4" />
			<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/gadget-review-asicesound-bluetooth-earbuds-s23/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Gadget Review: DisplayPort to HDMI Showdown]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/" />

		<id>https://shkspr.mobi/blog/?p=59829</id>
		<updated>2025-04-23T13:59:29Z</updated>
		<published>2025-05-05T11:34:38Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="DisplayPort" /><category scheme="https://shkspr.mobi/blog" term="gadget" /><category scheme="https://shkspr.mobi/blog" term="hdmi" /><category scheme="https://shkspr.mobi/blog" term="review" />
		<summary type="html"><![CDATA[From crummy old S-Video, through SCART, VGA, and HDMI - the world of video connectors has never been entirely cross compatible. Oh, sure, with enough boxes and adapters you can usually get an old device to talk to a new one. But results are never guaranteed and quality can take a hit.  HDMI was supposed to be our saviour, but now DisplayPort threatens its dominance. What&#039;s the difference? For the …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/"><![CDATA[
				<html><head></head><body><p>From crummy old S-Video, through SCART, VGA, and HDMI - the world of video connectors has never been entirely cross compatible. Oh, sure, with enough boxes and adapters you can usually get an old device to talk to a new one. But results are never guaranteed and quality can take a hit.</p>

<p>HDMI was supposed to be our saviour, but now DisplayPort threatens its dominance. What's the difference? For the average user - nothing. They both carry high-fidelity video and audio at resolutions higher than the human brain can interpret.  Unless you are trying to pump 8K streams 5cm from your eyeballs at 200Hz, you're not going to notice the difference between the standards. They both do surround sound which your home cinema speakers are woefully under-specced for.</p>

<p>The main differences boil down to:</p>

<ul>
<li>DisplayPort has a spring-loaded latching mechanism which prevents cables coming loose.</li>
<li>Lots of laptops and phones support DisplayPort via USB-C's DP Alt Mode.</li>
<li>DisplayPort monitors can be "daisy chained" to each other.</li>
<li>HDMI supports ARC (Audio Return Channel) which means your screen's sound can be sent back down the HDMI cable to an amp.</li>
<li>DisplayPort uses <a href="https://www.extremetech.com/computing/84094-an-inside-look-at-displayport-v12">Packetized Data Transmission</a> which, in theory, is more efficient than HDMI.</li>
</ul>

<p>But, in the end, it all comes down to this:</p>

<ul>
<li>What port your screen has.</li>
</ul>

<p>My <a href="https://shkspr.mobi/blog/2023/08/gadget-review-mokin-usb-c-docking-station-linux-information/"> USB-C Docking Station</a> has two DisplayPort outputs and a single HDMI socket. My <a href="https://shkspr.mobi/blog/2024/01/review-iiyama-28-inch-4k-vertical-monitor/">4K Vertical Monitor</a> has DP, but my <a href="https://shkspr.mobi/blog/2020/04/review-iiyama-prolite-b2482hs-b1-24-vertical-monitor/">older monitor</a> is stuck with HDMI.  Is there anything I can do to convert the DisplayPort signal from my USB-C hub into an HDMI signal the monitor will understand?</p>

<p>Yes!</p>

<p>The good folks at <a href="https://www.benfei.com/">Benfei</a> have chucked me a couple of their adapters to test out. Let's put them through their paces.</p>

<p>Here's their 4K one:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Braided.webp" alt="Short braided cable." width="1024" height="771" class="aligncenter size-full wp-image-59854">

<p>And their 1080p one:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Latch.webp" alt="Short cable with a latching mechanism at one end." width="1024" height="771" class="aligncenter size-full wp-image-59853">

<p>Rather handily, there are little instructions on the dongle to tell you which end is which.</p>

<p>The important thing to note is that they are both "plug and play", no drivers needed.</p>

<table>
<thead>
<tr>
  <th align="right">Feature</th>
  <th align="center">Regular</th>
  <th align="center">4K</th>
</tr>
</thead>
<tbody>
<tr>
  <td align="right">Max resolution</td>
  <td align="center">1080p</td>
  <td align="center">4K</td>
</tr>
<tr>
  <td align="right">Max refresh</td>
  <td align="center">60Hz</td>
  <td align="center">60Hz (4K)<br>120Hz (2K)</td>
</tr>
<tr>
  <td align="right">Features</td>
  <td align="center">Latch on DisplayPort</td>
  <td align="center">Nylon braided cable</td>
</tr>
<tr>
  <td align="right">Cost</td>
  <td align="center"><a href="https://amzn.to/3Gn92F8">£10</a></td>
  <td align="center"><a href="https://amzn.to/4iyVKD1">£12</a></td>
</tr>
</tbody>
</table>

<p>The main difference between the cables is that the lower-resolution one has a locking latch on the DisplayPort end.</p>

<p>I just couldn't get the lower-resolution one to work. My laptop saw it, it identified the monitor and its available resolutions, my sound output could be routed to it - but no video appeared. Yes, I tried rebooting and updating, and unplugging, and sacrificing a chicken - no dice.</p>

<p>The other one worked perfectly. Video came through crisp and clear. Instant detection.  Like any modern electronics, it did get a little warm with constant use - but nothing too serious.</p>

<h2 id="bonus-flipmo-selekta"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/#bonus-flipmo-selekta" class="heading-link">Bonus Flipmo Selekta!</a></h2>

<p>What if you want to go the other way? Converting HDMI to DP? Let's go!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/USB.webp" alt="HDMI to DP with a USB cable." width="1024" height="576" class="aligncenter size-full wp-image-59852">

<p>Wait? Why is there a USB plug on this thing?</p>

<p>The standard DisplayPort can supply <a href="https://en.wikipedia.org/wiki/DisplayPort#DP_PWR_(pin_20)">3.3V @ 0.5A</a>. That's usually enough to power a converter chip.  However HDMI can only do <a href="https://electronics.stackexchange.com/questions/28575/could-hdmi-be-potentially-used-as-a-power-supply-alternative-for-smartphones">5V @ 0.05A</a> which is insufficient to power anything useful<sup id="fnref:hdmi"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/#fn:hdmi" class="footnote-ref" title="HDMI 2.1b will support higher power - but those are pretty rare. So a USB plug is needed to power the converter." role="doc-noteref">0</a></sup>.</p>

<p>Does it work? Yes! The USB plug is only used for power - it doesn't require any drivers or configuration.  Plug it into your laptop or hub, plug the HDMI jack into your port, run a DisplayPort cable from it to your monitor.  Done.</p>

<h2 id="buy"><a href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/#buy" class="heading-link">Buy</a></h2>

<p>Please click the affiliate links so that I can feed my crippling technology addiction.</p>

<ul>
<li><a href="https://amzn.to/3Gn92F8">DisplayPort to HDMI (HD &amp; latching)</a></li>
<li><a href="https://amzn.to/4iyVKD1">DisplayPort to HDMI (4K non-latching)</a></li>
<li><a href="https://amzn.to/44BajCs">HDMI to DisplayPort adapter</a></li>
</ul>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:hdmi" role="doc-endnote">
<p><a href="https://www.hdmi.org/spec21sub/cablepower">HDMI 2.1b <em>will</em> support higher power</a> - but those are pretty rare. So a USB plug is needed to power the converter.&nbsp;<a href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/#fnref:hdmi" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>

</ol>
</div>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/gadget-review-displayport-to-hdmi-showdown/feed/atom/" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Too many overflows reporting Gmail spam]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/" />

		<id>https://shkspr.mobi/blog/?p=59814</id>
		<updated>2025-04-26T10:29:17Z</updated>
		<published>2025-05-03T11:34:30Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="gmail" /><category scheme="https://shkspr.mobi/blog" term="google" /><category scheme="https://shkspr.mobi/blog" term="ui" /><category scheme="https://shkspr.mobi/blog" term="users" /><category scheme="https://shkspr.mobi/blog" term="ux" />
		<summary type="html"><![CDATA[What does the humble ⋮ symbol mean to you?  To geeks, it is a compelling attraction. Something cool and esoteric lives in there! All sorts of goodies to explore and configure.  To normal people, it is invisible. Normal people don&#039;t go pushing random icons on their apps because computers are fragile and may break if you do the wrong thing.  To me, it is a sign that product managers are a menace a…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/"><![CDATA[
				<html><head></head><body><p>What does the humble <kbd>⋮</kbd> symbol mean to you?</p>

<p>To geeks, it is a compelling attraction. Something cool and esoteric lives in there! All sorts of goodies to explore and configure.</p>

<p>To normal people, it is invisible. Normal people don't go pushing random icons on their apps because computers are fragile and may break if you do the wrong thing.</p>

<p>To me, it is a sign that product managers are a menace and must be stopped. A hundred thousand icons vying for your attention have been stuffed away because no one has the authority to prioritise user needs.</p>

<blockquote><p>As a | user who has received some spam</p>

<p>I want to | easily report it as spam</p>

<p>So that | <del>Google's AI can become ever stronger</del> my inbox is easier to manage</p></blockquote>

<p>How do you report spam?  On the web, it is possible if you're prepared to enter the forbidden lair of <kbd>⋮</kbd>. Click the one nearest the message and you'll see:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-Web-2nd.webp" alt="Web version of Gmail. The second overflow menu has a report spam option." width="771" height="623" class="aligncenter size-full wp-image-59816">

<p>But there is no "report spam" button in the Gmail app. Try to find it. I promise you it isn't there.</p>

<p>No, not even behind the door of mysteries which is <kbd>⋮</kbd>.  See:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-App-2nd.webp" alt="App version of Gmail. The second overflow menu has no report spam option." width="504" height="710" class="aligncenter size-full wp-image-59818">

<p>Ah ha! <strong>FOOLISH USER!!</strong> You thought that you could transfer a mastered skill from one environment to another? You are an idiot. A buffoon. The Eloi at Google mock your Morlock ways.</p>

<p>Here is the report spam button in the Gmail app - hidden in the <em>top</em> <kbd>⋮</kbd> menu!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-App-1st.webp" alt="App version of Gmail. The first overflow menu has a report spam option." width="504" height="710" class="aligncenter size-full wp-image-59819">

<p>And, just for completeness, here's what the top <kbd>⋮</kbd> on the web has.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Gmail-Web-1st.webp" alt="Web version of Gmail. The first overflow menu has no report spam option." width="771" height="623" class="aligncenter size-full wp-image-59817">

<h2 id="why"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#why" class="heading-link">Why?!</a></h2>

<p>Why do the Monkey-Punchers at Google have such scorn for its users?  Is it because their illegal monopoly means they don't have to compete for users? Do their perverse internal politics only reward employees for adding features, not removing them? Perhaps the web team and the app team are engaged in holy war around a doctrinal schism over icon placement?</p>

<p>We may never know.</p>

<h2 id="ok-but-why"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#ok-but-why" class="heading-link">OK, but why?</a></h2>

<p>Why do the overflows on the web have icons but on the Android app they're barren?</p>

<p>Why is the order of the options completely different on both?</p>

<p>Why are the names different for the same functions?</p>

<p>We can only assume that the web team are Montagues and the app team Capulets.</p>

<h2 id="what-is-going-on"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#what-is-going-on" class="heading-link">What is going on?</a></h2>

<p>Moving a UI from the big screen to the small screen is difficult. Some options aren't relevant in either context. Some labels are too big. Some prioritisation needs to happen. I accept that.</p>

<p>But users only have limited cognitive plasticity. They have a mental model of how a UI works and they expect it to be <em>reasonably</em> consistent.</p>

<p>I keep making the same mistake. Whether I'm on the web or app, I <em>always go to the wrong option!</em> This makes me feel like an idiot. I have a hundred apps to use, each with subtly different UIs - I can't be expected to keep them all straight.  But I do expect the a common set of paradigms if the services are under the auspices of a single company.</p>

<p>Why are there two <kbd>⋮</kbd> menu options? I <em>think</em> the top relates to the conversation whereas the second relates to the specific message? But maybe I'm wrong.</p>

<h2 id="two-out-of-three-aint-bad"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#two-out-of-three-aint-bad" class="heading-link">Two out of three ain't bad</a></h2>

<p>I lied earlier. There's a <strong>third</strong> way to report spam.</p>

<p>On the web, hover over one of the mysterious small icons - the ones with ridiculously thin lines and low contrast - and you'll be rewarded with this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/Report-Spam.webp" alt="Icon bar with report spam." width="507" height="264" class="aligncenter size-full wp-image-59824">

<h3 id="make-it-make-sense"><a href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#make-it-make-sense" class="heading-link">Make it make sense!!</a></h3>

<iframe title="‘Spamalot’ promete carcajadas con Adal Ramones, Omar Chaparro y un reparto espectacular | Hoy" width="620" height="349" src="https://www.youtube.com/embed/z9Qu137_4As?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>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/too-many-overflows-reporting-gmail-spam/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Get alerted when your Kobo wishlist books drop in price]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/" />

		<id>https://shkspr.mobi/blog/?p=59768</id>
		<updated>2025-04-29T08:58:10Z</updated>
		<published>2025-05-01T11:34:06Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="ebooks" /><category scheme="https://shkspr.mobi/blog" term="python" /><category scheme="https://shkspr.mobi/blog" term="reading" />
		<summary type="html"><![CDATA[The brilliant kobodl Python package allows you to interact with your Kobo account programmatically.  You can list all the books you&#039;ve purchased, download them, and - as of version 0.12.0 - view your wishlist.  Here&#039;s a rough and ready Python script which will tell you when any the books on your wishlist have dropped below a certain amount.  Table of ContentsPrerequisitesGet your wishlistSort the …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/"><![CDATA[
				<html><head></head><body><p>The brilliant <a href="https://github.com/subdavis/kobo-book-downloader/">kobodl Python package</a> allows you to interact with your Kobo account programmatically.  You can list all the books you've purchased, download them, and - as of version 0.12.0 - view your wishlist.</p>

<p>Here's a rough and ready Python script which will tell you when any the books on your wishlist have dropped below a certain amount.</p>

<p></p><nav id="toc"><menu id="toc-start"><li id="toc-title"><h2 id="table-of-contents"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#table-of-contents" class="heading-link">Table of Contents</a></h2><menu><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#prerequisites">Prerequisites</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#get-your-wishlist">Get your wishlist</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#sort-the-wishlist">Sort the wishlist</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#create-the-message">Create the Message</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#send-an-email">Send an Email</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#setting-the-settings">Setting the settings</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#the-end-result">The End Result</a></li><li><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#next-steps">Next Steps</a></li></menu></li></menu></nav><p></p>

<h2 id="prerequisites"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#prerequisites" class="heading-link">Prerequisites</a></h2>

<ol>
<li><a href="https://pypi.org/project/kobodl/">Install kobodl</a> following their guide.</li>
<li>Log in with your account by running <code>kobodl user add</code></li>
<li>Check that the configuration file is saved in the default location <code>/home/YOURUSERNAME/.config/kobodl.json</code></li>
</ol>

<h2 id="get-your-wishlist"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#get-your-wishlist" class="heading-link">Get your wishlist</a></h2>

<p>The kobodl function <code>GetWishList()</code> takes a list of users and returns a generator. The generator contains the book's name and author. The price is a string (for example <code>5.99 GBP</code>) so needs to be split at the space.</p>

<p>Here's a quick proof of concept:</p>

<pre><code class="language-python">import kobodl
wishlist = kobodl.book.actions.GetWishList( kobodl.globals.Settings().UserList.users )
for book in wishlist:
    print( book.Title + " - "  + book.Author + " " + book.Price.split()[0] )
</code></pre>

<h2 id="sort-the-wishlist"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#sort-the-wishlist" class="heading-link">Sort the wishlist</a></h2>

<p>Using Pandas, the data can be added to a dataframe and then sorted by price:</p>

<pre><code class="language-python">import kobodl
import pandas as pd

#   Set up the lists
items  = []
prices = []
ids    = []

wishlist = kobodl.book.actions.GetWishList( kobodl.globals.Settings().UserList.users )

for book in wishlist:
    items.append( book.Title + " - "  + book.Author )
    prices.append( float( book.Price.split()[0] ) )
    ids.append( book.RevisionId )

#   Place into a DataFrame
all_items = zip( ids, items, prices )
book_prices = pd.DataFrame( list(all_items), columns = ["ID", "Name", "Price"])
book_prices = book_prices.reset_index()  

#   Get books cheaper than three quid
cheap_df = book_prices[ book_prices["Price"] &lt; 3 ]
</code></pre>

<h2 id="create-the-message"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#create-the-message" class="heading-link">Create the Message</a></h2>

<p>This will write the body text of the email. It gives you the price, book details, and a search link to buy the book.</p>

<pre><code class="language-python">from urllib.parse import quote_plus

#   Search Prefix
website = "https://www.kobo.com/gb/en/search?query="

#   Email Body
message = ""

for index, row in cheap_df.sort_values("Price").iterrows():
    name  = row["Name"]
    price = str(row["Price"])
    link = website + quote_plus( name )
    message += "£" + price + " - " + name + "\n" + link + "\n\n"
</code></pre>

<h2 id="send-an-email"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#send-an-email" class="heading-link">Send an Email</a></h2>

<p>Python makes it fairly easy to send an email - assuming you have a co-operative mailhost.</p>

<pre><code class="language-python">import smtplib
from email.message import EmailMessage

#   Send Email
def send_email(message):
    email_user = 'you@example.com'
    email_password = 'P@55w0rd'
    to = 'destination@example.com'
    msg = EmailMessage()
    msg.set_content(message)
    msg['Subject'] = "Kobo price drops"
    msg['From'] = email_user
    msg['To'] = to
    server = smtplib.SMTP_SSL('example.com', 465)
    server.ehlo()
    server.login(email_user, email_password)
    server.send_message(msg)
    server.quit()

send_email( message )
</code></pre>

<h2 id="setting-the-settings"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#setting-the-settings" class="heading-link">Setting the settings</a></h2>

<p>When running as a script, it is necessary to <a href="https://github.com/subdavis/kobo-book-downloader/issues/159">ensure the settings are correctly initialised</a>.</p>

<pre><code class="language-python">from kobodl.settings import Settings

my_settings = Settings()
kobodl.Globals.Settings = my_settings
</code></pre>

<h2 id="the-end-result"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#the-end-result" class="heading-link">The End Result</a></h2>

<p>I have a cron job which runs this every morning.  It sends an email like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/books-fs8.png" alt="Screenshot of an email showing cheap books." width="370" class="aligncenter size-full wp-image-59769">

<h2 id="next-steps"><a href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#next-steps" class="heading-link">Next Steps</a></h2>

<p>Some possible ideas. If you can code these, let me know!</p>

<ul>
<li>Save the prices so it sees if there's been a drop since yesterday.</li>
<li>Compare prices to Amazon for <a href="https://shkspr.mobi/blog/2025/02/automatic-kobo-and-kindle-ebook-arbitrage/">eBook Arbitrage</a>.</li>
<li>Automatically buy any book that hits 99p.</li>
</ul>

<p>Happy reading!</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/05/get-alerted-when-your-kobo-wishlist-books-drop-in-price/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Is enhancement the same as manipulation?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/" />

		<id>https://shkspr.mobi/blog/?p=60538</id>
		<updated>2025-04-30T12:33:29Z</updated>
		<published>2025-04-30T11:34:34Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="AI" /><category scheme="https://shkspr.mobi/blog" term="law" /><category scheme="https://shkspr.mobi/blog" term="legal" />
		<summary type="html"><![CDATA[How far can you enhance an image or video before you cross the line into manipulation?  The UK is currently prosecuting two men accused of a crime. Part of the prosecution&#039;s evidence is a video. In showing it to the jury, the prosecution have said:  the two minute and 41 second-long video is &#34;extremely dark&#34; but the &#34;unmistakeable&#34; noise of a chainsaw can be heard followed by the sound of a tree…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/"><![CDATA[
				<html><head></head><body><p>How far can you enhance an image or video before you cross the line into manipulation?</p>

<p>The UK is currently prosecuting two men accused of a crime. Part of the prosecution's evidence is a video<sup id="fnref:not"><a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fn:not" class="footnote-ref" title="To be clear, I'm not at the trial." role="doc-noteref">0</a></sup>. In showing it to the jury, the prosecution have said:</p>

<blockquote><p>the two minute and 41 second-long video is "extremely dark" but the "unmistakeable" noise of a chainsaw can be heard followed by the sound of a tree falling.</p><br>
<p>Police experts have "enhanced" the video as much as possible but it has "not been interfered with", Mr Wright tells the jury.</p><br>
<p><a href="https://www.bbc.co.uk/news/live/cvg93k0950pt?post=asset%3A54970a3b-ae9f-4299-832a-4ebe813dd756#post">BBC News</a>
</p></blockquote>

<p>I think most reasonable people would agree that creating an AI "Deep Fake" by inserting the faces of the pair into the video, would be unacceptable.</p>

<p>What about boosting the brightness on the video? That seems pretty unobjectionable to me and, I suspect, most neutral parties.</p>

<p>Suppose the prosecutors used AI to enhance the image? Perhaps <a href="https://www.slrlounge.com/photoshop-tips-how-to-use-content-aware-scale-to-extend-backgrounds/">adding a background which wasn't there</a>  up maybe <a href="https://www.theverge.com/news/625904/netflix-a-different-world-ai-upscaling-nightmare">upscaling the video resolution</a> and introducing elements which didn't exist before? I think that's a step too far. Algorithmic enhancement strays into manipulation territory.</p>

<p>But what if the police ran a face detection algorithm on the video and only boosted the visibility of those parts, rather than the rest of the video?  Now I think we're <a href="https://quoteinvestigator.com/2012/03/07/haggling/">haggling over price</a>.</p>

<p>The photographer <a href="https://paulclarke.com/photography/mother-of-all-photoshoots/">Paul Clarke has a wonderful blog post about enhancing photographs of MPs</a> - take a look at those photos. Are they enhanced or manipulated? Do you feel differently if it is a photo of an MP from "your" side?</p>

<p>But just brightening and colour correcting is fine, right?</p>

<p>This is a well-known problem in legal circles<sup id="fnref:friends"><a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fn:friends" class="footnote-ref" title="With thanks to several anonymous legal friends for pointing me in the right direction." role="doc-noteref">1</a></sup>. <a href="https://www.lawgazette.co.uk/practice-points/photographic-evidence-acceptable-manipulation/5040793.article">Boosting the colouring of a photo may make an injury seem more severe</a>.  Zooming or cropping an image may make someone seem closer to the action than they were.</p>

<p>The Crown Prosecution Service has this to say about video<sup id="fnref:vids"><a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fn:vids" class="footnote-ref" title="There's a good discussion about the admissibility of video evidence in [2002] EWCA Crim 2373" role="doc-noteref">2</a></sup> evidence:</p>

<blockquote><p>In terms of proving the authenticity of the video recording, the Prosecution must be able to show that the video film produced in evidence is the original video recording or an authentic copy of the original and show that it has not been tampered with.</p>

<p><a href="https://www.cps.gov.uk/legal-guidance/exhibits#video">CPS Legal Guidance - Exhibits</a></p></blockquote>

<p>I suppose it's pretty easy to show that the produced evidence can be derived by taking the original and twisting the brightness and contrast knobs. I also guess that the defence could bring in an image manipulation specialist to show that the enhanced version introduces unacceptable changes.</p>

<p>Although that brings with it some problems about whether <a href="https://assets.publishing.service.gov.uk/media/5eb177bd86650c435fa620e4/Regulatory_notice_2019.01_-_Imaging__2_.pdf">an expert in manipulation can say they're an expert about the <em>contents</em> of the media</a>. (No, basically.)</p>

<p>I'll leave you with these words from a House of Lords report in <strong>1998</strong>:</p>

<blockquote><p>The existence of a technology that can be used to modify images in this way need in itself be of no great concern; even the widespread availability of the technology at low cost might not cause concern.</p>

<p>But an apparent lack of understanding of the implications of both these facts should cause concern and warrants further study. The public and all those in the legal profession should be made more aware of the technology, what it can do, and what its limitations are.</p>

<p>It was suggested that criminal convictions that were dependent on evidence captured by digital cameras could be at risk if defence lawyers began to realise how vulnerable such images are to manipulation.</p>

<p><a href="https://publications.parliament.uk/pa/ld199798/ldselect/ldsctech/064v/st0503.htm#n11">Select Committee on Science and Technology Fifth Report</a></p></blockquote>

<p>The trial continues.</p>

<p><ins datetime="2025-04-30T12:28:57+00:00">Update!</ins></p>

<p><a href="https://www.bbc.co.uk/news/live/cvg93k0950pt?post=asset%3A6a86c349-4267-4cbb-bd9b-24eb8ec95e17#post">The BBC reports</a>:</p>

<blockquote><p>The initial video was totally dark, with just the sound of wind and a chainsaw leading up to a giant crash.</p>

<p>A second version has now been shown to the jury, which has been enhanced by a Northumbria Police digital media examiner.</p>

<p>The contrast has been changed, a white border has been put around it and the image has been made brighter.</p></blockquote>

<p>Here's a clip of the enhanced version:</p>

<p></p><div style="width: 620px;" class="wp-video"><video class="wp-video-shortcode" id="video-60538-6" width="620" height="349" preload="metadata" controls="controls"><source type="video/mp4" src="https://shkspr.mobi/blog/wp-content/uploads/2025/04/bbc.mp4?_=6"><a href="https://shkspr.mobi/blog/wp-content/uploads/2025/04/bbc.mp4">https://shkspr.mobi/blog/wp-content/uploads/2025/04/bbc.mp4</a></video></div><p></p>

<p>If you were presented evidence of a completely dark video, how could you be sure that subsequent "brighter" version was derived from the original?</p>

<div class="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:not" role="doc-endnote">
<p>To be clear, I'm not at the trial.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fnref:not" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>

<li id="fn:friends" role="doc-endnote">
<p>With thanks to several anonymous legal friends for pointing me in the right direction.&nbsp;<a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fnref:friends" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>

<li id="fn:vids" role="doc-endnote">
<p>There's a good discussion about the admissibility of video evidence in <a href="https://www.bailii.org/ew/cases/EWCA/Crim/2002/2373.html">[2002] EWCA Crim 2373</a>&nbsp;<a href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#fnref:vids" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
</li>

</ol>
</div>
</body></html>]]></content>
		
		<link href="https://shkspr.mobi/blog/wp-content/uploads/2025/04/bbc.mp4" rel="enclosure" length="6445777" type="video/mp4" />
			<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/04/is-enhancement-the-same-as-manipulation/feed/atom/" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
					</author>

		<title type="html"><![CDATA[Who is responsible for missing money?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/" />

		<id>https://shkspr.mobi/blog/?p=60433</id>
		<updated>2025-04-27T14:59:53Z</updated>
		<published>2025-04-29T11:34:02Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="banking" /><category scheme="https://shkspr.mobi/blog" term="banks" /><category scheme="https://shkspr.mobi/blog" term="money" /><category scheme="https://shkspr.mobi/blog" term="new zealand" />
		<summary type="html"><![CDATA[I have a simple rule of thumb when it comes to news reports. The real story is always in the penultimate paragraph.  Let&#039;s look at this inflammatory headline:  Woman’s &#039;spree&#039; after $158k banking error, refuses to return pensioner’s life savings An Auckland beneficiary is under investigation for an alleged “spending spree” after $158,000 was mistakenly transferred to her account.  […] pensioner lo…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/"><![CDATA[
				<html><head></head><body><p>I have a simple rule of thumb when it comes to news reports. The <em>real</em> story is always in the penultimate paragraph.</p>

<p>Let's look at this inflammatory headline:</p>

<blockquote><h2 id="womans-spree-after-158k-banking-error-refuses-to-return-pensioners-life-savings"><a href="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/#womans-spree-after-158k-banking-error-refuses-to-return-pensioners-life-savings" class="heading-link">Woman’s 'spree' after $158k banking error, refuses to return pensioner’s life savings</a></h2>
<p>An Auckland beneficiary is under investigation for an alleged “spending spree” after $158,000 was mistakenly transferred to her account.
</p><p> […] pensioner lost his life savings due to an account number error.
</p><p>The account number provided to Westpac had only 15 digits, not the intended 16, so Westpac added a zero to the suffice [sic] as per its usual protocols.
</p><p><a href="https://www.newstalkzb.co.nz/news/national/auckland-pensioner-loses-158k-after-accidentally-sending-life-savings-to-wrong-account/">Newstalk ZB</a>
</p></blockquote>

<p>Wow! That seems pretty bad. Obviously the woman who allegedly received the money and then spent it shouldn't have done that. Spending money that doesn't belong to you is a crime in most parts of the world.  But let's focus on the <em>real</em> villain here - the evil bank!!</p>

<p>Why did the bank make the decision to add an extra digit to the recipient's account number?</p>

<p>An <a href="https://en.wikipedia.org/wiki/New_Zealand_bank_account_number">NZ bank account number</a> looks like <code>BB-bbbb-AAAAAAA-SSS</code>.</p>

<p>The <a href="https://www.paymentsnz.co.nz/resources/industry-registers/bank-branch-register/">first two digits are the banking institution and the next four are the specific branch</a>. The seven digit account number relates to the <em>specific</em> account. The three digit suffix is for the <em>type</em> of account. For example, your spending account might have suffix <code>001</code> and your savings account might have suffix <code>099</code>.</p>

<p>However, because all suffices have a leading zero, <a href="https://www.kiwibank.co.nz/help/accounts/open-manage/account-numbers/">it is often only displayed as two</a>.</p>

<p>So, adding an extra zero to the suffix itself shouldn't have caused a problem. It would have gone to the correct recipient although it might have either gone to the wrong sub-account.  Indeed, WestPac's help page on international transfers says "<a href="https://www.westpac.co.nz/foreign-exchange/send-money-to-or-from-overseas/#sending-money-from-overseas">if your account suffix is 12, enter 012</a>".  It sounds like the journalist hasn't quite understood where the insertion happened.</p>

<p>It seems likely to me that the victim meant to type <code>1234567-001</code> but missed a digit, causing WestPac to shift things to <code>1235670-01</code>. That's poorly formatted but technically valid.</p>

<p>But, wait! Don't bank account numbers have checksums? Yes!  According to NZ's internal revenue, all bank account numbers have a check-digit. However, when checking an account number's validity:</p>

<blockquote><p>If less than the maximum number of digits is supplied, then values are right justified and the fields padded with zeroes</p>

<p><a href="https://web.archive.org/web/20181009211542/https://www.ird.govt.nz/resources/9/d/9d739cde-ad76-4c49-ae08-522c62d94dd6/rwt-nrwt-spec-2016.pdf">Bank account number validation</a></p></blockquote>

<p>Having played around with the algorithm, the first few digits of the account number aren't included in the checksum validation. For example, the account number <code>1234567</code> and <code>0234567</code> both pass checksumming. So it is possible that padding the <em>start</em> of the string wouldn't have been picked up.</p>

<p>Whatever the underlying issue, it is distressing to hear of someone losing a significant amount of money.</p>

<h2 id="what-could-have-stopped-this"><a href="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/#what-could-have-stopped-this" class="heading-link">What could have stopped this?</a></h2>

<p>Humans make mistakes. As an industry, we know this. It's our job to prevent, rectify, and neutralise those mistake.  We need systems in place which reduce the likelihood of errors causing catastrophic failures.</p>

<p>Here are some systemic changes which could have prevented this:</p>

<ol>
<li>New Zealand could adopt the IBAN standard for international transfers.

<ul>
<li><a href="https://www.bnz.co.nz/support/international/payments/made-to-new-zealand">They don't seem keen on doing this</a>.</li>
<li>It wouldn't prevent mistyping, but a standardised length makes transferring to the wrong account less likely.</li>
</ul></li>
<li>Confirmation of Payee asks the user to type in the name of the intended recipient. If it doesn't match the bank account, the payment is rejected or cautioned against.

<ul>
<li><a href="https://www.getverified.co.nz/">NZ <em>is</em> rolling out CoP</a> but it doesn't yet apply to international transfers.</li>
<li>Multi-lingual CoP is complex. I don't know if any cross-border payments do this yet.</li>
</ul></li>
<li>WestPac should have noticed the name discrepancy.

<ul>
<li>This is the argument I have the most sympathy with.</li>
<li>Of course, returning the money (especially to a closed account) may be difficult.</li>
</ul></li>
</ol>

<p>Large systems changes are expensive and time consuming.</p>

<p>What else could have been done? Let's go to the final few sentences of the story:</p>

<blockquote><p>Unfortunately, the incorrect bank account number <em>provided by Che</em> was a valid account number for another customer, Westpac said.
</p><p>“As soon as Mr Che alerted us to the issue, we traced the payment and froze the remaining funds.”
</p><p>But Westpac was unable to recover the rest of Che’s money due to the <em>seven-week delay in reporting his error</em> to the banks.
</p><p><small>Emphasis added</small></p></blockquote>

<p>I'm not trying to victim blame here, but WestPac seem to have done what was asked for them. The sender provided an ambiguous bank account number which was, nevertheless, valid.</p>

<p>The sender didn't raise an issue for <strong>seven weeks</strong>. Once notified, the bank froze the recipient account and notified the police.</p>

<p>Yes, big evil banks should be less evil. But they're in a tough spot. People want protection, <a href="https://shkspr.mobi/blog/2023/03/who-can-tell-you-what-to-do-with-your-money/">but they resent banks telling them what they can and can't do with their own money</a>. Big systemic change is difficult but it seems crushingly unfair when an innocent party is caught in the middle.</p>

<p>I don't think anyone comes out of this covered in glory. Banks need to invest in technology which keeps their customers safe. Customers need to take some responsibility for checking whether a bank has done the right thing.</p>

<p>The only tips I can give is that you must always copy &amp; paste financial details from a trusted source, rather than manually type them in. Always send a small amount first to check it is received. If you suspect a mistake, contact your bank immediately.</p>

<p>Stay safe out there.</p>
</body></html>]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/04/who-is-responsible-for-missing-money/feed/atom/" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
	</feed>
