<?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>2026-04-22T14:31:32Z</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/?cat=-1982" />

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

		<title type="html"><![CDATA[Sneaky spam in conversational replies to blog posts]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/sneaky-spam-in-conversational-replies-to-blog-posts/" />

		<id>https://shkspr.mobi/blog/?p=70528</id>
		<updated>2026-04-22T14:31:32Z</updated>
		<published>2026-04-23T11:34:48Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="blog" /><category scheme="https://shkspr.mobi/blog" term="blogging" /><category scheme="https://shkspr.mobi/blog" term="spam" /><category scheme="https://shkspr.mobi/blog" term="WordPress" />
		<summary type="html"><![CDATA[I&#039;m grateful that my blog posts attract lots of engaged, funny, and challenging comments. But any popular post also attracts spammers. I use Antispam Bee to automatically eradicate a couple of hundred crappy comments per day.    Nevertheless, some get through. Here&#039;s a particularly pernicious one - it appeared as three comments ostensibly in reply to each other.    At first glance these look like …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/sneaky-spam-in-conversational-replies-to-blog-posts/"><![CDATA[<p>I'm grateful that my blog posts attract lots of engaged, funny, and challenging comments. But any popular post also attracts spammers. I use <a href="https://antispambee.pluginkollektiv.org/">Antispam Bee</a> to automatically eradicate a couple of hundred crappy comments <em>per day</em>.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/Antispam-Bee.webp" alt="Graph showing 272 comments blocked in a single day." width="762" height="292" class="aligncenter size-full wp-image-70529">

<p>Nevertheless, some get through. Here's a particularly pernicious one - it appeared as three comments ostensibly in reply to each other.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/spam-comments.webp" alt="First &quot;I read that article about why it’s so hard to passively track friends’ locations, and it actually makes sense. It talks about wanting automatic alerts when friends are nearby, but no app really does it well because of privacy and social awkwardness.&quot; Second &quot;Yeah, and even if the tech exists, people don’t always want to share their location 24/7. It’s like checking promos on spam domain promotions you might see potential, but there’s always uncertainty behind it. You’re kind of taking a chance on incomplete info.&quot; Third &quot;Exactly. Most location features are opt-in for a reason. Apps require consent because constantly tracking someone without them knowing would feel invasive, even if the intention is harmless.&quot;" width="2316" height="1598" class="aligncenter size-full wp-image-70530">

<p>At first glance these look like normal comments. They each address the content of the blog post albeit somewhat superficially. The first comment looks like it was from a social media post sharing my link - I get a lot of those as pingbacks, so it initially didn't trigger any suspicions from me.</p>

<p>The second is ostensibly a reply to the first and continues the conversation. Again, a bit shallow, but seems to be engaging in good faith.</p>

<p>The third looks like yet another reply. They all have unique email addresses, none of them have set their username to anything overly odd, and none of the users have filled out their URl.</p>

<p>But notice, in the second one, there's a link to a dodgy casino! There's no <code>https://</code> so it didn't jump out as a link.</p>

<p>All three came from the same IP address in the Philippines, so easy to block for now.</p>

<p>Each reply is spaced exactly 3 minutes apart which, in retrospect, looks a little odd.</p>

<p>Re-reading them carefully, they all look like AI slop. A plausible sounding summary, written in a casual style, but with very little semantic content. Seeing them as replies to each other primed me to think they were genuine because I'm used to spam coming in individual replies. Having the spam in the middle comment made it easy to glaze over.</p>

<p>Remember, there are no technological solutions to social problems. Sticking more and more barriers in the way of commenting only discourages genuine replies while the profit motive incentivises spammers to work around them.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70528&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/sneaky-spam-in-conversational-replies-to-blog-posts/#comments" thr:count="8" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/sneaky-spam-in-conversational-replies-to-blog-posts/feed/atom/" thr:count="8" />
			<thr:total>8</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Better TTS on Linux]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/better-tts-on-linux/" />

		<id>https://shkspr.mobi/blog/?p=68497</id>
		<updated>2026-03-27T16:10:05Z</updated>
		<published>2026-04-21T11:34:07Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="accessibility" /><category scheme="https://shkspr.mobi/blog" term="firefox" /><category scheme="https://shkspr.mobi/blog" term="linux" /><category scheme="https://shkspr.mobi/blog" term="tts" />
		<summary type="html"><![CDATA[The venerable eSpeak is a mainstay of Linux distributions. It is a clever Text-To-Speech (TTS) program which will read aloud the written word using a phenomenally wide variety of languages and accents.  The only problem is that it sounds robotic. It has the same vocal fidelity as a 1980s Speak &#039;n&#039; Spell toy. Monotonous, clipped, and painful to listen to. For some people, this is a feature, not a…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/better-tts-on-linux/"><![CDATA[<p>The venerable eSpeak is a mainstay of Linux distributions. It is a clever Text-To-Speech (TTS) program which will read aloud the written word using a phenomenally wide variety of languages and accents.</p>

<p>The only problem is that it sounds robotic. It has the same vocal fidelity as a 1980s Speak 'n' Spell toy. Monotonous, clipped, and painful to listen to. For some people, this is a feature, not a bug. I have blind friends who are so used to eSpeak that they can crank it up to hundreds of words per minute and navigate through complex documents with ease.</p>

<p>For the rest of us, it is a steep and unpleasant learning curve.</p>

<p>There are lots of modern TTS programs using all sorts of advanced AI. Many of them are paywalled or require you to post your text to a webserver - with all the privacy and latency problems that causes. Some are restricted to high-powered GPUs or other expensive equipment.</p>

<p><a href="https://github.com/OHF-Voice/piper1-gpl">Piper</a> is different. It is local first, runs quickly on modest hardware, and is open source.</p>

<p>The easiest way to install it on Linux is to use <a href="https://pied.mikeasoft.com/">Pied</a> - a simple GUI which allows you to select languages, listen to accents, and then install them.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/pied.webp" alt="GUI showing various British English languages." width="594" height="695" class="aligncenter size-full wp-image-68498">

<p>It will change your <code>speech-dispatcher</code> to use the new Piper voice. That means it is immediately available to your Linux DE's accessibility service and to apps like Firefox.</p>

<p>I now have a <a href="http://news.bbc.co.uk/1/mobile/scotland/7754111.stm">reassuring Scottish lady</a> speaking out everything on my computer.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68497&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/better-tts-on-linux/#comments" thr:count="2" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/better-tts-on-linux/feed/atom/" thr:count="2" />
			<thr:total>2</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Book Review: Up - A scientist's guide to the magic above us by Dr Lucy Rogers ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-up-a-scientists-guide-to-the-magic-above-us-by-dr-lucy-rogers/" />

		<id>https://shkspr.mobi/blog/?p=70513</id>
		<updated>2026-04-20T10:48:03Z</updated>
		<published>2026-04-20T11:34:38Z</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="science" />
		<summary type="html"><![CDATA[My mate Dr Lucy Rogers has written a book! This is a charming and thought provoking exploration of everything that goes on above our heads. This isn&#039;t an impersonal and imperious manuscript, it&#039;s a deeply personal and joyful book filled with science, anecdotes, and the thrill of discovery.  It&#039;s spectacularly accessible. Written in a relaxed and casual tone, it encourages domestic science. I…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/book-review-up-a-scientists-guide-to-the-magic-above-us-by-dr-lucy-rogers/"><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/9781529930290.webp" alt="Book cover featuring butterflies and clouds." width="200" class="alignleft size-full wp-image-70514">

<p>My mate Dr Lucy Rogers has written a book! This is a charming and thought provoking exploration of everything that goes on above our heads. This isn't an impersonal and imperious manuscript, it's a deeply personal and joyful book filled with science, anecdotes, and the thrill of discovery.</p>

<p>It's spectacularly accessible. Written in a relaxed and casual tone, it encourages <em>domestic</em> science. I don't mean bakery, I mean the sorts of observations you can do at home without access to a multi-million pound laboratory. The afterword of the book contains dozens of resources for people who want to get involved in science. Dr Rogers eloquently makes the case that you don't need to dedicate yourself full time - it's perfectly acceptable to engage with it on your own terms.</p>

<p>What I liked most about it was that she gets her hands dirty. It would have been easy to write a literature review from the comfort of a safe and dry office. Instead we get a travelogue of all the places she's been - each trek through the forest, every laboratory, and all the foreign festivals are brilliantly recounted. It's a proper adventure from America's tornado alley down to the Vatican Archives.</p>

<p>I find it remarkable how slow some modern science is. As she points out, "there have been only eight transits of Venus since the telescope was invented" - our knowledge rests on the shoulders of giants, but they can be slow, lumbering beasts.</p>

<p>If, like me, you only have a hazy memory of the science you learned at school, this book will top up your knowledge (and vocabulary). It will reignite your passion and curiosity about the world around you - and make you want to buy a round the world ticket to chase solar eclipses!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70513&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-up-a-scientists-guide-to-the-magic-above-us-by-dr-lucy-rogers/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/book-review-up-a-scientists-guide-to-the-magic-above-us-by-dr-lucy-rogers/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Reprojecting Dual Fisheye Videos to Equirectangular (LG 360)]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/" />

		<id>https://shkspr.mobi/blog/?p=67087</id>
		<updated>2026-03-09T11:04:45Z</updated>
		<published>2026-04-19T11:34:32Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="ffmpeg" /><category scheme="https://shkspr.mobi/blog" term="HowTo" /><category scheme="https://shkspr.mobi/blog" term="LG360" /><category scheme="https://shkspr.mobi/blog" term="linux" /><category scheme="https://shkspr.mobi/blog" term="video" />
		<summary type="html"><![CDATA[I still use my obsolete LG 360 Camera. When copying MP4 videos from its SD card, they come out in &#34;Dual Fisheye&#34; format - which looks like this:    VLC and YouTube will only play &#34;Equirectangular&#34; videos in spherical mode. So, how to convert a dual fisheye to equirectangualr?  The Simple Way  ffmpeg \   -i original.mp4 \   -vf &#34;v360=input=dfisheye:output=equirect:ih_fov=189:iv_fov=189&#34; \  …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/"><![CDATA[<p>I still use my <a href="https://shkspr.mobi/blog/2021/11/lg-killed-its-360-camera-after-only-4-years-heres-how-to-get-it-back/">obsolete LG 360 Camera</a>. When copying MP4 videos from its SD card, they come out in "Dual Fisheye" format - which looks like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/Original.webp" alt="Dual fisheye photo of us and some elephants." width="2560" height="1280" class="aligncenter size-full wp-image-67108">

<p>VLC and YouTube will only play "Equirectangular" videos in spherical mode. So, how to convert a dual fisheye to equirectangualr?</p>

<h2 id="the-simple-way"><a href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/#the-simple-way">The Simple Way</a></h2>

<pre><code class="language-bash">ffmpeg \
  -i original.mp4 \
  -vf "v360=input=dfisheye:output=equirect:ih_fov=189:iv_fov=189" \
  360.mp4
</code></pre>

<p>However, this has some "quirks".</p>

<p>The first part of the video filter is <code>v360=input=dfisheye:output=equirect</code> - that just says to use the 360 filter on an input which is dual fisheye and then output in equirectangular.</p>

<p>The next part is <code>:ih_fov=189:iv_fov=189</code> which says that the input video has a horizontal and vertical field of view of 189°. That's a <em>weird</em> number, right?</p>

<p>You'd kind of expect each lens to be 180°, right? Here's what happens if <code>:ih_fov=180:iv_fov=180</code> is used:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/360-180.webp" alt="Flattened image, but there are overlaps at the seams." width="2560" height="1280" class="aligncenter size-full wp-image-67109">

<p>The lenses overlaps a little bit. So using 180° means that certain portions are duplicated.</p>

<p>I <em>think</em> the lenses technically offer 200°, but the physical casing prevents all of that from being viewed. I got to the value of 189° by trial and error. Mostly error! Using <code>:ih_fov=189:iv_fov=189</code> get this image which has less overlap:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/360-189.webp" alt="A flattened image which has less overlap at the edges." width="2560" height="1280" class="aligncenter size-full wp-image-67110">

<p>It isn't <em>perfect</em> - but it preserves most of the image coherence.</p>

<h2 id="cut-off-images"><a href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/#cut-off-images">Cut Off Images</a></h2>

<p>There's another thing worth noticing - the top, right, bottom, and left "corners" of the circle are cut off. If the image sensor captured everything, the resultant fisheye would look something like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/02/Repaged.webp" alt="Two circular images with gaps between them." width="2626" height="1313" class="aligncenter size-full wp-image-67111">

<p>I tried repaging the video to include the gaps, but it didn't make any noticeable difference.</p>

<h2 id="making-equirectangular-videos-work-with-vlc"><a href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/#making-equirectangular-videos-work-with-vlc">Making Equirectangular Videos Work With VLC</a></h2>

<p>Sadly, ffmpeg will not write the metadata necessary to let playback devices know the video is spherical. Instead, according to <a href="https://bino3d.org/metadata-for-stereo-3d-and-surround-video.html">Bino3D</a>, you have to use <code>exiftool</code> like so:</p>

<pre><code class="language-bash">exiftool \
        -XMP-GSpherical:Spherical="true" \
        -XMP-GSpherical:Stitched="true" \
        -XMP-GSpherical:ProjectionType="equirectangular" \
        video.mp4
</code></pre>

<h2 id="putting-it-all-together"><a href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/#putting-it-all-together">Putting It All Together</a></h2>

<p>The LG 360 records audio in 5.1 surround using AAC. That's already fairly well compressed, so there's no point squashing it down to Opus.</p>

<p>The default video codec is h264, but the picture is going to be reprojected, so quality is always going to take a bit of a hit. Pick whichever code you like to give the best balance of quality, file size, and encoding time.</p>

<p>Run:</p>

<pre><code class="language-bash">ffmpeg \
  -i original.mp4 \
  -vf "v360=input=dfisheye:output=equirect:ih_fov=189:iv_fov=189" \
  -c:v libx265 -preset fast -crf 28 -c:a copy \
  out.mp4; exiftool \
        -XMP-GSpherical:Spherical="true" \
        -XMP-GSpherical:Stitched="true" \
        -XMP-GSpherical:ProjectionType="equirectangular" \
        out.mp4
</code></pre>

<p>That will produce a reasonable equirectangular file suitable for viewing in VLC or in VR.</p>

<p>If this has been useful to you, please stick a comment in the box!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=67087&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/reprojecting-dual-fisheye-videos-to-equirectangular-lg-360/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Book Review: How To Kill A Witch - A Guide For The Patriarchy by Claire Mitchell and Zoe Venditozzi ★★★⯪☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/" />

		<id>https://shkspr.mobi/blog/?p=70322</id>
		<updated>2026-04-11T08:42:00Z</updated>
		<published>2026-04-17T11:34:26Z</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="feminism" />
		<summary type="html"><![CDATA[After reading The Wicked of the Earth, I wanted to understand some of the history behind the stories. Why were women accused of being witches? What really happened in those trials? What are the modern consequences of those events?  This is the story of the Scottish Witch Trials - with brief forays into England and abroad. It examines the central tension of whether witchcraft was real to the…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/"><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/hbg-title-how-to-kill-a-witch-3-70.webp" alt="Book cover featuring a noose and flames." width="200" height="625" class="alignleft size-full wp-image-70323">

<p>After reading <a href="https://shkspr.mobi/blog/2025/03/book-review-the-wicked-of-the-earth-by-a-d-bergin/">The Wicked of the Earth</a>, I wanted to understand some of the history behind the stories. Why were women<sup id="fnref:women"><a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fn:women" class="footnote-ref" title="And a small number of men. But this is firmly focused on the overwhelming majority." role="doc-noteref">0</a></sup> accused of being witches? What really happened in those trials? What are the modern consequences of those events?</p>

<p>This is the story of the Scottish Witch Trials - with brief forays into England and abroad. It examines the central tension of whether witchcraft was real to the accusers, or just a convenient means to oppress troublesome women. The descriptions of the imprisonment, torture, and state-sanctioned murder is visceral and horrific.</p>

<p>It's also rather stark in its modern assessment of the historic context:</p>

<blockquote><p>Nonetheless, it’s important to remember it was a proper legal trial, with evidence being put forward and the judge assessing it and carrying out legal tests. Some people think that witchcraft trials were carried out by angry peasants waving pitchforks. Perhaps this is a more acceptable way for a modern person to think about it. No one wants to think that a judicial system can get it so wrong. But it did, with catastrophic consequences for those accused.</p></blockquote>

<p>The book is mostly good, it's a spin off from the <a href="https://www.witchesofscotland.com/">Witches Of Scotland</a> podcast and that's reflected in the writing. As with any parasocial<sup id="fnref:para"><a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fn:para" class="footnote-ref" title="As opposed to paranormal." role="doc-noteref">1</a></sup> entertainment, it attempts to centre the authors and bring the audience along for the ride - so there's lots of descriptions of the libraries the authors visit, how things make them feel, how enamoured they are with their podcast guests. I found it a little distracting, but it's obviously right for their main audience.</p>

<p>Similarly, there's an attempt to bring the past to life by imagining a little monologue from various historic figures. I found that a little unconvincing; I dislike putting words in peoples' mouths. But with sparse primary documentation, that may be the best way to bring these characters to life. It's also well illustrated. Too many books eschew pictures - but this has a nice collection of woodcuts and portraits to contextualise what we're reading about.</p>

<p>One little nitpick, the book makes the claims:</p>

<blockquote><p>Life was hard and life expectancy was around 35</p></blockquote>

<p>and</p>

<blockquote><p>Lilias was an old woman, at least 60 years old and possibly as old as 80. At a time when life expectancy was much lower than it is now, even the lower estimate was still a considerable age.</p></blockquote>

<p>That's not quite right. Although the average life expectancy was low, that's the <a href="https://www.ons.gov.uk/peoplepopulationandcommunity/birthsdeathsandmarriages/lifeexpectancies/articles/howhaslifeexpectancychangedovertime/2015-09-09">average <em>at birth</em></a> - with a large number of infant mortalities dragging down the average. When you look at the full data, you'll see <a href="https://www.psychologytoday.com/us/blog/data-for-health/202509/there-were-still-old-people-when-life-expectancy-was-35">people used to live long lives</a> even in the distant past.</p>

<p>In a way, it reminds me of <a href="https://shkspr.mobi/blog/2019/10/book-review-invisible-women-caroline-criado-perez/">Invisible Women</a>. A national tragedy hidden from view.</p>

<p>It builds to a rousing end. There are parts of the world where witchcraft is still taken seriously - with devastating consequences. The febrile atmosphere which led to unfounded accusations against women is still prevalent even in modern societies.</p>

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

<li id="fn:women">
<p>And a small number of men. But this is firmly focused on the overwhelming majority.&nbsp;<a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fnref:women" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:para">
<p>As opposed to paranormal.&nbsp;<a href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#fnref:para" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70322&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/book-review-how-to-kill-a-witch-a-guide-for-the-patriarchy-by-claire-mitchell-and-zoe-venditozzi/feed/atom/" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Why is it so hard to passively stalk my friends' locations?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/" />

		<id>https://shkspr.mobi/blog/?p=68114</id>
		<updated>2026-03-27T16:09:46Z</updated>
		<published>2026-04-15T11:34:45Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="FourSquare" /><category scheme="https://shkspr.mobi/blog" term="geolocation" /><category scheme="https://shkspr.mobi/blog" term="location" />
		<summary type="html"><![CDATA[I feel terribly guilty when I visit a new city, post photos of my travels, only to have a friend say &#34;Hey! Why didn&#039;t you let me know you were in my neck of the woods?&#34;  Similarly, if I bump into an old acquaintance at a conference, we both tend to say &#34;If only I&#039;d known you were here, we could have had dinner together last night!&#34;  I do enjoy the serendipity of events like FOSDEM - randomly…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/"><![CDATA[<p>I feel terribly guilty when I visit a new city, post photos of my travels, only to have a friend say "Hey! Why didn't you let me know you were in my neck of the woods?"</p>

<p>Similarly, if I bump into an old acquaintance at a conference, we both tend to say "If only I'd known you were here, we could have had dinner together last night!"</p>

<p>I do enjoy the serendipity of events like FOSDEM - randomly seeing a mate and expressing the joy of spontaneity. But I also like arranging to meet up in advance.</p>

<p>At the moment, my strategy is sending a blast on social media saying "I'm visiting [this city] next week, anyone fancy a beer and a natter?" I've met friends all over Europe, Australia, and New Zealand that way.  <a href="https://shkspr.mobi/blog/2025/06/meeting-my-fedifriends-afk/">It mostly works</a>.  But I can't help feeling it is inefficient and prone to missing connections.</p>

<p>I even wrote my own code to auto-post FourSquare checkins to my other social media sites.</p>

<p>Here are my ideal scenarios. Imagine something built in to Signal / WhatsApp / Whatever app you already use.</p>

<h2 id="plan-in-advance"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#plan-in-advance">Plan In Advance</a></h2>

<p>I tell my app that I'm going to Barcelona from 14th - 19th February and am happy to meet any of my friends.</p>

<p><em>✨Background Magic✨</em></p>

<p>My friend Alice has also planned a trip to Barcelona around those dates. She gets a ping saying that one of her friends is going to be in the same city. Does she want to know more?</p>

<p>So far, so <a href="https://en.wikipedia.org/wiki/Dopplr">Dopplr</a>.</p>

<p>My friend Bob lives just outside of Barcelona. He's set his "willing to travel" settings to be about 30 minutes, so also receives a ping.</p>

<p>I don't know that either of them have seen the notification until they decide they want to meet.</p>

<h2 id="spontaneous-fun"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#spontaneous-fun">Spontaneous Fun</a></h2>

<p>I step off the train in Manchester, England England.  Perhaps the app notices I'm away from home, or maybe I press the "Anyone Around?" button.</p>

<p>On a map I can see friends who have shared their rough location. I decide to message Chuck to see if he's free for a chat.</p>

<p>Dave notices my location is now within his preferred travel distance. He gives me a ring.</p>

<p>A bit like how FourSquare used to be - but with less precision.</p>

<h2 id="downsides"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#downsides">Downsides</a></h2>

<p>The above is very much the "happy path". It doesn't look at any of the knotty problems or grapple with the UI that would be needed to make this work.  But we know the technology for sharing location is viable - so what are the social issues that make this so difficult?</p>

<h3 id="social-awkwardness"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#social-awkwardness">Social Awkwardness</a></h3>

<p>"Oh, fuck, Edgar's location says he's in town. Can we pretend to be out of the country?"</p>

<p>Alternatively, "Huh, I know at least a dozen people who live in Skegness. Why aren't any of them responding to me?"</p>

<p>Social pressure and awkwardness are hard problems. No one wants to use the app that makes you feel like a friendless loser.</p>

<h3 id="privacy"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#privacy">Privacy</a></h3>

<p>Do you <em>want</em> your friends knowing your every movement? I'm sure some people do, but most probably don't. It's possible to sketch out some vague controls:</p>

<ul>
<li>Only send a notification if I push this button.</li>
<li>Don't send alerts if I am within this radius of my home / work.</li>
<li>Fuzz my location to the city / state / country level.</li>
</ul>

<h3 id="danger"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#danger">Danger</a></h3>

<p>Is it a risk to let people know vaguely where you are? Is meeting up with (semi-) strangers from the Internet a smart life choice? Is having an app stalk you across the globe giving too much data to advertisers?</p>

<p>Does that creep from work abuse the system to keep popping up whenever you're out with friends?</p>

<h2 id="technology"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#technology">Technology</a></h2>

<p>I said the technology exists for this, and that was sort of true. Every device has GPS &amp; an Internet connection. Storing a log of friends and sending them a message is a solved problem.</p>

<p>But is it solved in a decentralised and privacy preserving way?</p>

<p>No one wants to give all this power to one company. Google will build it and kill it. Facebook will sell your secrets to dropshippers. A funky start-up will be acquhired by Apple &amp; restricted to iOS devices.</p>

<p>My location is fuzzed to an acceptable degree of imprecision and then sent… where? To all my friends directly? To a central server? Can <a href="https://en.wikipedia.org/wiki/K-anonymity"><em>k</em>-anonymity</a> help?</p>

<p>Is this a separate app? Everyone seemed to leave FourSquare after they buggered around with it. Perhaps it is just a feature in existing apps?</p>

<h3 id="whats-already-there"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#whats-already-there">What's Already There?</a></h3>

<p>Messaging apps like Signal, Telegram, and WhatsApp allow you to share your location with one or more friends.</p>

<p>To me, it feels a bit weird to manually send a dropped pin to some / all of my contact. It also doesn't let you share "tomorrow I will be in…"</p>

<p>Using "Stories" is the common way to share an update with all contacts - but none of them let you automatically share your location in a story.</p>

<p>FourSquare's Swarm app allows you to check in to a "neighbourhood". But there's no obvious way of saying "London" or "Manchester" - and I'm not sure how close to an area you need to be to get an alert that your friend is there.</p>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#whats-next">What's Next?</a></h2>

<p>I don't want to build this. Trying to get everyone I know to adopt a new app isn't going to happen. With the fragmentation of messaging and the lack of interoperability, this is likely to remain an unsolved problem for some time.</p>

<p>So here's my strategy.</p>

<ul>
<li>Get back in to using FourSquare. Most of my friends seemed to stop using it back in 2017 when it was split into Swarm. But a few are still on there.</li>
<li>Manually post a story on Mastodon, BlueSky, Facebook, WhatsApp, Signal, and Telegram saying "Visiting Hamburg next week. Anyone want a beer?"</li>
<li>Hope that something better comes along.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68114&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/#comments" thr:count="4" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/why-is-it-so-hard-to-passively-stalk-my-friends-locations/feed/atom/" thr:count="4" />
			<thr:total>4</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Android now stops you sharing your location in photos]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/" />

		<id>https://shkspr.mobi/blog/?p=70143</id>
		<updated>2026-04-06T14:28:44Z</updated>
		<published>2026-04-13T11:34:48Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="android" /><category scheme="https://shkspr.mobi/blog" term="geolocation" /><category scheme="https://shkspr.mobi/blog" term="geotagging" /><category scheme="https://shkspr.mobi/blog" term="google" /><category scheme="https://shkspr.mobi/blog" term="OpenBenches" />
		<summary type="html"><![CDATA[My wife and I run OpenBenches. It&#039;s a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo&#039;s metadata, so we use that information to put the photos on a map.  Google&#039;s Android has now broken that.  On the web, we used to use:  &#60;input type=&#34;file&#34; accept=&#34;image/jpeg&#34;&#62;   That opened the phone&#039;s photo picker…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/"><![CDATA[<p>My wife and I run <a href="https://openbenches.org">OpenBenches</a>. It's a niche little site which lets people share photos of memorial benches and their locations. Most modern phones embed a geolocation within the photo's metadata, so we use that information to put the photos on a map.</p>

<p>Google's Android has now broken that.</p>

<p>On the web, we used to use:</p>

<pre><code class="language-html">&lt;input type="file" accept="image/jpeg"&gt;
</code></pre>

<p>That opened the phone's photo picker and let the use upload a geotagged photo. But a while ago Google deliberately broke that.</p>

<p>Instead, we were <a href="https://issuetracker.google.com/issues/243294058#comment27">encourage to use the <em>file</em> picker</a>:</p>

<pre><code class="language-html">&lt;input type="file"&gt;
</code></pre>

<p>That opened the default file manager. This had the unfortunate side-effect of allowing the user to upload <em>any</em> file, rather than just photos. But it did allow the EXIF metadata through unmolested.  <a href="https://issuetracker.google.com/issues/428397711">Then Google broke that as well</a>.</p>

<p>Using a "Progressive Web App" doesn't work either.</p>

<p>So, can users transfer their photos via Bluetooth or QuickShare? No. <a href="https://issuetracker.google.com/issues/485307531">That's now broken as well</a>.</p>

<p>You can't even directly share via email without the location being stripped away.</p>

<p>Literally the <em>only</em> way to get a photo with geolocation intact is to plug in a USB cable, copy the photo to your computer, and then upload it via a desktop web browser?</p>

<h2 id="why"><a href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#why">Why?!?!?</a></h2>

<p><del>Because Google run an anticompetitive monopoly on their dominant mobile operating system.</del></p>

<p>Privacy.</p>

<p>There's a worry that users don't know they're taking photos with geolocation enabled. If you post a cute picture of your kid / jewellery / pint then there's a risk that a ne’er-do-well could find your exact location.</p>

<p>Most social media services are sensible and strip the location automatically. If you try to send a geotagged photo to Facebook / Mastodon / BlueSky / WhatsApp / etc, they default to <em>not</em> showing the location. You can add it in manually if you want, but anyone downloading your photo won't see the geotag.</p>

<p>And, you know, I get it. Google doesn't want the headline "Stalkers found me, kidnapped my baby, and stole my wedding ring - how a little known Android feature puts you in danger!"</p>

<p>But it is just so <em>tiresome</em> that Google never consults their community. There was no advance notice of this change that I could find. Just a bunch of frustrated users in my inbox blaming me for breaking something.</p>

<p>I don't know what the answer is. Perhaps a pop up saying "This website wants to see the location of your photos. Yes / No / Always / Never"? People get tired of constant prompts and the wording will never be clear enough for most users.</p>

<p>It looks like the only option available will be to develop a native Android app (and an iOS one?!) with all the cost, effort, and admin that entails. Android apps have <a href="https://developer.android.com/training/data-storage/shared/media#location-media-captured">a special permission for accessing geolocation in images</a>.</p>

<p>If anyone has a <em>working</em> way to let Android web-browsers access the full geolocation EXIF metadata of photos uploaded on the web, please drop a comment in the box.</p>

<p>In the meantime, please leave a +1 on <a href="https://github.com/whatwg/html/issues/11724#issuecomment-4192228562">this HTML Spec comment</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70143&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/#comments" thr:count="21" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/android-now-stops-you-sharing-your-location-in-photos/feed/atom/" thr:count="21" />
			<thr:total>21</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Cheapest way to keep a UK mobile number using an eSIM]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/cheapest-way-to-keep-a-uk-mobile-number-using-an-esim/" />

		<id>https://shkspr.mobi/blog/?p=69140</id>
		<updated>2026-03-30T07:48:52Z</updated>
		<published>2026-04-11T11:34:38Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="eSIM" /><category scheme="https://shkspr.mobi/blog" term="mobile" /><category scheme="https://shkspr.mobi/blog" term="phone" /><category scheme="https://shkspr.mobi/blog" term="sim" />
		<summary type="html"><![CDATA[I have an old mobile phone number that I&#039;d like to keep. I think it is registered with a bunch of services for 2FA by SMS, but I can&#039;t be sure. So I want to keep it for a couple of years just in case I need it to log on to something.  I don&#039;t want to faff around with physical SIMs, so I went looking for the cheapest way to keep my number for the longest time. There are a whole bunch of providers…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/cheapest-way-to-keep-a-uk-mobile-number-using-an-esim/"><![CDATA[<p>I have an old mobile phone number that I'd like to keep. I <em>think</em> it is registered with a bunch of services for 2FA by SMS, but I can't be sure. So I want to keep it for a couple of years just in case I need it to log on to something.</p>

<p>I don't want to faff around with physical SIMs, so I went looking for the <em>cheapest</em> way to keep my number for the longest time. There are a whole bunch of providers out there who will do low-cost <em>monthly</em> contracts (like Spusu), which I don't want. Similarly, there are some pure PAYG providers who require you to top-up with £10 every few months (like 1pmobile).</p>

<p>In the end, I went with <a href="https://aklam.io/yJrzBWhD">Lyca Mobile</a> (affiliate link). Total cost was £10 which should last indefinitely.</p>

<p>The process isn't particularly straightforward.  Here's how it works:</p>

<p>First, add a PAYG SIM to your basket and select "eSIM"</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/Add-to-basket.webp" alt="Screen with a £6 SIM in the basket." width="1400" height="900" class="aligncenter size-full wp-image-69143">

<p>Next, click the Bin icon (🗑) in the top right. You'll get this pop-up:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/Discard.webp" alt="Screen saying are you sure and offering other choices." width="1400" height="1000" class="aligncenter size-full wp-image-69142">

<p>Select "Discard plan &amp; add credit" - you'll return to this screen:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/Add-top-up.webp" alt="A screen letting you add a top up." width="1400" height="974" class="aligncenter size-full wp-image-69141">

<p>The minimum top-up is a tenner, so select that. From there, you can add details of your old number, its porting code, and when you want the port to take place.  Then pay.</p>

<p>Done! You'll receive your eSIM instantly. Scan it with your phone and you'll be up and running. The phone number porting will take as long as it takes.</p>

<p>OK, but will Lyca let you keep a number indefinitely? Here's what they say:</p>

<blockquote><h2 id="how-long-can-i-keep-my-number-for-if-i-dont-use-any-of-lyca-mobiles-services"><a href="https://shkspr.mobi/blog/2026/04/cheapest-way-to-keep-a-uk-mobile-number-using-an-esim/#how-long-can-i-keep-my-number-for-if-i-dont-use-any-of-lyca-mobiles-services">How long can I keep my number for if I don’t use any of Lyca Mobile’s services?</a></h2>

<p>Normally we will keep your number for 120 days if you do not use our service. However, you may also keep your Lycamobile number for up to 1 year without using our service. Just dial  <code>*139*9999#</code> from your Lycamobile and follow the instructions on the screen. Please be aware that there will be a fixed annual fee of £15 which will be deducted from your balance.</p>

<p><a href="https://www.lycamobile.co.uk/en/general/how-long-can-i-keep-my-number-for-if-i-dont-use-any-of-lycamobiles-services/">Source</a></p></blockquote>

<p>Note, their chatbot says the fixed fee is a fiver. Like all half-baked AI systems, it is wrong.</p>

<p>So, what does "using" consist of? This is hard to find out! I <em>think</em> is any chargeable event.  Based on their <a href="https://www.lycamobile.co.uk/en/rates/national/#prepaid">current PAYG pricing</a> the cheapest options are:</p>

<ul>
<li>Send an SMS for 23p</li>
<li>Use 1MB of data for 15p.</li>
</ul>

<p>If I'm right, you could use 1MB of data every 120 days. That would deplete your credit in about 22 years. More than long enough for me!</p>

<p>There you have it, I'm pretty sure that's the cheapest way to keep a UK mobile number on an eSIM. You can keep it switched off for 119 days, flick it on, send a quick message, then shut it down again.</p>

<p>Click the referral link to <a href="https://aklam.io/yJrzBWhD">join Lyca Mobile</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69140&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/cheapest-way-to-keep-a-uk-mobile-number-using-an-esim/#comments" thr:count="10" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/cheapest-way-to-keep-a-uk-mobile-number-using-an-esim/feed/atom/" thr:count="10" />
			<thr:total>10</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Book Review: Small Comfort by Ia Genberg ★★☆☆☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-small-comfort-by-ia-genberg/" />

		<id>https://shkspr.mobi/blog/?p=70017</id>
		<updated>2026-04-04T13:03:54Z</updated>
		<published>2026-04-09T11:34:59Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Club" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
		<summary type="html"><![CDATA[I was left somewhat unconvinced by this book. I liked the concept - a series of interrelated stories all told in different styles.  Much like the film &#34;Lola RenntRun Lola Run&#34; there&#039;s a briefcase full of cash, a cast of morally ambiguous characters, and a meandering philosophical discussion about the nature of economic salvation.  It slams together the naïve and the cynical into a bunch of …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/book-review-small-comfort-by-ia-genberg/"><![CDATA[<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/hbg-title-small-comfort.webp" alt="Book cover." width="200" class="alignleft size-full wp-image-70019"> I was left somewhat unconvinced by this book. I liked the concept - a series of interrelated stories all told in different styles.</p>

<p>Much like the film "<ruby lang="de">Lola Rennt<rt lang="en">Run Lola Run</rt></ruby>" there's a briefcase full of cash, a cast of morally ambiguous characters, and a meandering philosophical discussion about the nature of economic salvation.</p>

<p>It slams together the naïve and the cynical into a bunch of uneasy conversations.</p>

<p>I loved the slow-burn of the first story - the way it gradually revealed more and more about the characters. But throughout I was left wondering "where is this going?" The answer, disappointingly, was nowhere.</p>

<p>That's the heart of my problem with the book - it was compelling and frustrating in equal measure. The author herself states it best:</p>

<blockquote><p>The reader needs something to hold on to. A glimmer of hope</p></blockquote>

<p>It was stylish, there's no doubt about that. The texture of each story was gorgeous. The plotting was inventive and the morality interesting. I also enjoyed the bluntness of the social politics of economics. I just felt the whole was much less than the sum of its parts.</p>

<p>I read this as part of a new book club I'm attending. Thankfully, everyone else seemed to agree that it was a bit of a let down.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70017&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-small-comfort-by-ia-genberg/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/book-review-small-comfort-by-ia-genberg/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Theatre Review: Avenue Q ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/theatre-review-avenue-q/" />

		<id>https://shkspr.mobi/blog/?p=70160</id>
		<updated>2026-04-08T09:00:22Z</updated>
		<published>2026-04-08T11:34:25Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="comedy" /><category scheme="https://shkspr.mobi/blog" term="Theatre Review" />
		<summary type="html"><![CDATA[I&#039;ll admit, I was a little sceptical about returning to Avenue Q. I saw it on its original West End run back in… OH MY GOD I AM SO OLD! FUCK! Where did the time go?  It&#039;s always hard to know how much to update a show. Does it need constant reinvention to stay in the zeitgeist or can it be pickled forever as a classic?  &#34;I wish I had taken more pictures&#34; was something that utterly resonated with …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/theatre-review-avenue-q/"><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/AVEQ.webp" alt="Colourful puppets surround the letter Q." width="256" height="256" class="alignleft size-full wp-image-70161">

<p>I'll admit, I was a little sceptical about returning to Avenue Q. I saw it on its original West End run back in… OH MY GOD I AM <em>SO</em> OLD! FUCK! Where did the time go?</p>

<p>It's always hard to know how much to update a show. Does it need constant reinvention to stay in the zeitgeist or can it be pickled forever as a classic?</p>

<p>"I wish I had taken more pictures" was something that utterly resonated with me about my university experience. Photos were a rare commodity back when film still cost a couple of quid to develop. Perhaps today's uni students will sing "I wish I had posted less on Instagram"?</p>

<p>The show has been sympathetically updated. Some of the references have been modernised, a transphobic joke given the boot, and the lyrics tweaked to sometimes devastating effect. The song "Everyone's A Little Bit Racist" seems to have the most changes - and all for the better.</p>

<p>Parts of the show are adapted for a UK audience. Barely anyone here knows who Gary Coleman was so his intro is changed (although I guess part of the metajoke is that we all watched foreign celebrities on Sesame Street when we were growing up - so what's one more obscure cultural reference?). In the American show, the Bad Idea Bears proffer Long Island Ice Teas - that was a bit tame for UK audiences, so in the <a href="https://playbill.com/article/diva-talk-catching-up-with-avenue-qs-ann-harada-plus-news-of-buckley-and-york-com-162426">original UK run they guzzled absinthe daiquiris</a> - a change inexplicably reverted for this limited run.</p>

<p>As a piece of pure entertainment it is spectacular. The laughs are genuinely non-stop and the whole auditorium rose to give the performers a well-deserved ovation. It is a tender and beautiful show which shows off the power of live theatre.</p>

<p>The songs are still stuck in my head and the puppetry is still amazing. Absolutely hilarious, genuinely shocking in places, utterly filthy - an excellent night out.</p>

<h2 id="pre-and-post-show"><a href="https://shkspr.mobi/blog/2026/04/theatre-review-avenue-q/#pre-and-post-show">Pre- and Post-Show</a></h2>

<p>I've written before about <a href="https://shkspr.mobi/blog/2024/12/the-art-of-the-pre-show-and-post-show/">The art of the Pre-Show and Post-Show</a>. With West End prices higher than ever, it is incumbent on theatres to make their shows a memorable and spectacular evening out. That can be as simple as a bit of set dressing in the foyer, or as extravagant as they can get away with.</p>

<p>The offering is pretty reasonable here. You can buy the T-shirt, hoodie, and commemorative socks at exorbitant prices. The souvenir programme is £8 and, while lush with photos, is pretty sparse. The original West End programme from the early 2000s had a pin-up calendar of Lucy The Slut, a bunch more funny photos, and fake autographs of the puppets.</p>

<p>There's a photo-booth for taking selfies, but it appeared to be broken.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/broken.webp" alt="A broken photo stand." width="1024" height="771" class="aligncenter size-full wp-image-70215">

<p>It might been nice to have a few puppets placed around for people to take photos with.</p>

<p>One of the simplest things a venue can do is put on a themed cocktail menu. I'm surprised more shows don't do that. Who is going to turn down a glass of "The Internet Is For Pornstar Martini"?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/cocktails.webp" alt="Cocktails include &quot;The Internet is for pornstar martini&quot; a &quot;Chardenfreude&quot; made with green chartreuse, a &quot;fuzzy neighbour&quot;, and a mocktail called &quot;Canadian Girlfriend&quot;." width="1024" height="768" class="aligncenter size-full wp-image-70216">

<p>The Shaftesbury Theatre itself isn't too cramped, even in the cheap seats. Although, at the back of the stalls, the overhang cuts off the top of the set which means you will miss a bit of action in some scenes.</p>

<p>While we were waiting for the show to start, the auditorium was filled with soundscape of subway cars rattling and distorted announcements. Again, fairly cheap and simple, but a nice way to build the mood.</p>

<p>As we exited, we were handed leaflets encouraging us to come back and bring our friends. Even better was the £10 discount on our next booking!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/leaflet.webp" alt="A leaflet offering a discount on Avenue Q." width="1024" height="831" class="aligncenter size-full wp-image-70218">

<p>Considering this is a limited run, the production has done a fair job of getting the audience in the mood and rewarding them for their patronage.</p>

<p>Well done to all involved!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70160&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/theatre-review-avenue-q/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/theatre-review-avenue-q/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Did WordPress VIP leak my phone number?]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/did-wordpress-vip-leak-my-phone-number/" />

		<id>https://shkspr.mobi/blog/?p=69804</id>
		<updated>2026-04-06T14:55:30Z</updated>
		<published>2026-04-07T11:34:43Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="automattic" /><category scheme="https://shkspr.mobi/blog" term="gdpr" /><category scheme="https://shkspr.mobi/blog" term="privacy" /><category scheme="https://shkspr.mobi/blog" term="WordPress" />
		<summary type="html"><![CDATA[As discussed in my last blog post, the scumsuckers at Apollo.io have been giving out my personal details.  Not only did they have my email address, they also had a copy of one of my phone numbers. I asked them where they got it from and they said:  Your phone number came from Parsely, Inc (wpvip.com) one of our customers who participates in our customer contributor network by sharing their…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/did-wordpress-vip-leak-my-phone-number/"><![CDATA[<p>As discussed <a href="https://shkspr.mobi/blog/2026/04/someone-at-browserstack-is-leaking-users-email-address/">in my last blog post</a>, the scumsuckers at Apollo.io have been giving out my personal details.</p>

<p>Not only did they have my email address, they also had a copy of one of my phone numbers. I asked them where they got it from and they said:</p>

<blockquote><p>Your phone number came from Parsely, Inc (wpvip.com) one of our customers who participates in our customer contributor network by sharing their business contacts with the Apollo platform.</p></blockquote>

<p>I've never done any business with <a href="https://www.parse.ly/">Parsely</a>. They have no reason to have my phone number and <em>absolutely</em> no permission to share it with other organisations.</p>

<p>Back in 2021, <a href="https://wpvip.com/blog/parse-ly-is-now-a-core-part-of-wordpress-vips-platform/">Parsely became part of WordPress VIP</a>. Ah yes, our old "friends" at Automattic with their <a href="https://shkspr.mobi/blog/2024/12/is-wordpress-org-gdpr-compliant/">somewhat lax attitude to privacy</a>.</p>

<p>I took advantage of <a href="https://wpvip.com/vip-and-the-gdpr/">WordPress VIP's GDPR policy</a> and sent a terse but polite "Hey, WTAF?" to them. Their response was quick:</p>

<blockquote><p>Thanks for reaching out. We are currently investigating our systems to locate any personal data regarding your request. We appreciate your patience.</p></blockquote>

<p>After a bit of prodding, they eventually replied with:</p>

<blockquote><p>It appears that we obtained your contact information as a result of a meeting you had with a representative for the WPScan service around August 5, 2022. WPScan is owned by our parent company Automattic.</p>

<p>We have no record of Parsely, Inc. (which is no longer in existence) or WPVIP Inc. (the owner of the Parse.ly service) having any relationship with Apollo.io.</p>

<p>We also have no record of Parsely, Inc. or WPVIP Inc. having sold or otherwise provided your information to any third party.</p></blockquote>

<p>I have no memory and no record of meeting anyone from WPScan - although I concede it is possible I did as part of a previous job.</p>

<p>But even if it was in an email signature when I contacted them that still doesn't explain how it made its way to Apollo for them to give to spammers everywhere. Was it a hack? A data leak? A treacherous employee? A deliberate sale? A sneaky app update? Or maybe just Apollo lying to me.</p>

<p>I don't care any more. I'm just so tired of shitty companies treating personal data as a commodity to be traded, sold, repackaged, and abused.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69804&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/did-wordpress-vip-leak-my-phone-number/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/did-wordpress-vip-leak-my-phone-number/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Someone at BrowserStack is Leaking Users' Email Address]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/someone-at-browserstack-is-leaking-users-email-address/" />

		<id>https://shkspr.mobi/blog/?p=68665</id>
		<updated>2026-03-27T16:09:35Z</updated>
		<published>2026-04-05T11:34:03Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="gdpr" /><category scheme="https://shkspr.mobi/blog" term="privacy" />
		<summary type="html"><![CDATA[Like all good nerds, I generate a unique email address for every service I sign up to. This has several advantages - it allows me to see if a message is legitimately from a service, if a service is hacked the hackers can&#039;t go credential stuffing, and I instantly know who leaked my address.  A few weeks ago I signed up for BrowserStack as I wanted to join their Open Source programme. I had a few…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/someone-at-browserstack-is-leaking-users-email-address/"><![CDATA[<p>Like all good nerds, I generate a unique email address for every service I sign up to. This has several advantages - it allows me to see if a message is legitimately from a service, if a service is hacked the hackers can't go credential stuffing, and I instantly know who leaked my address.</p>

<p>A few weeks ago I signed up for <a href="https://www.browserstack.com/">BrowserStack</a> as I wanted to join their Open Source programme. I had a few emails back-and-forth with their support team and finally got set up.</p>

<p>A couple of days later I received an email to that email address from someone other than BrowserStack. After a brief discussion, the emailer told me they got my details from Apollo.io.</p>

<p>Naturally, I reached out to Apollo to ask them where they got my details from.</p>

<p>They replied:</p>

<blockquote><p>Your email address was derived using our proprietary algorithm that leverages publicly accessible information combined with typical corporate email structures (e.g., firstname.lastname@companydomain.com).</p></blockquote>

<p>Wow! A <em>proprietary</em> algorithm, eh? I wonder how much AI it takes to work out "firstname.lastname"????</p>

<p>Obviously, their response was inaccurate. There's no way their magical if-else statement could have derived the specific email I'd used with BrowserStack. I called them out on their bullshit and they replied with:</p>

<blockquote><p>Your email address came from BrowserStack (browserstack.com) one of our customers who participates in our customer contributor network by sharing their business contacts with the Apollo platform.</p>

<p>The date of collection is 2026-02-25.</p></blockquote>

<p>So I emailed BrowserStack a simple "Hey guys, what the fuck?"</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/No-spam.webp" alt="Web contact form. It says &quot;No spam, we promise.&quot;" width="630" height="552" class="aligncenter size-full wp-image-68669">

<p>I love their cheery little "No spam, we promise!"</p>

<p>Despite multiple attempts to contact them, BrowserStack never replied.</p>

<p>Given that this email address was only used with one company, I think there are a few likely possibilities for how Apollo got it.</p>

<ul>
<li>BrowserStack routinely sell or give away their users' data.</li>
<li>A third-party service used by BrowserStack siphons off information to send to others.</li>
<li>An employee or contractor at BrowserStack is exfiltrating user data and transferring it elsewhere.</li>
</ul>

<p>There are other, more nefarious, explanations - but I consider that to be unlikely. I suspect it is just the normalisation of the shabby trade in personal information undertaken by entities with no respect for privacy.</p>

<p>But, it turns out, it gets worse. My next blog post reveals how Apollo got my phone number from from a <em>very</em> big company.</p>

<p>Be seeing you 👌</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68665&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/someone-at-browserstack-is-leaking-users-email-address/#comments" thr:count="5" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/someone-at-browserstack-is-leaking-users-email-address/feed/atom/" thr:count="5" />
			<thr:total>5</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Book Review: Superintelligence - Paths, Dangers, Strategies by Nick Bostrom ★★★★⯪]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-superintelligence-paths-dangers-strategies-by-nick-bostrom/" />

		<id>https://shkspr.mobi/blog/?p=69922</id>
		<updated>2026-03-30T08:37:40Z</updated>
		<published>2026-04-03T11: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="Book Review" />
		<summary type="html"><![CDATA[When I finally invent time-travel, the first thing I&#039;ll do is go back in time and give everyone a copy of this book. Published in 2014, it clearly sets out the likely problems with true Artificial Intelligence (not the LLM crap we have now) and what measures need to be put in place before it is created.  It opens with The Unfinished Fable of the Sparrows:    Which, frankly, should be the end of …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/book-review-superintelligence-paths-dangers-strategies-by-nick-bostrom/"><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/superintelligence.webp" alt="Book cover featuring an owl." width="200" class="alignleft size-full wp-image-69924">

<p>When I finally invent time-travel, the first thing I'll do is go back in time and give everyone a copy of this book. Published in 2014, it clearly sets out the likely problems with <em>true</em> Artificial Intelligence (not the LLM crap we have now) and what measures need to be put in place <em>before</em> it is created.</p>

<p>It opens with The Unfinished Fable of the Sparrows:</p>

<iframe title="The Unfinished Fable of the Sparrows" width="620" height="349" src="https://www.youtube.com/embed/7rRJ9Ep1Wzs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Which, frankly, should be the end of the discussion. Oh Scronkfinkle, why didn't they listen to you?</p>

<p>This book attempts to set out they <em>why</em> and the <em>how</em> of protecting humanity from the (inevitable?) arrival of machines which we would describe as "superintelligent". That is, capable of human-level reasoning and understanding, but unlimited in terms of speed, working memory, and accuracy.</p>

<p>For example, automated trading algorithms caused a "<a href="https://en.wikipedia.org/wiki/2010_flash_crash">Flash Crash</a>" of the stock market in 2010. Unchecked machines very nearly destabilised the financial work. As Bostrom writes:</p>

<blockquote><p>[…] while automation contributed to the incident, it also contributed to its resolution. The pre-preprogrammed stop order logic, which suspended trading when prices moved too far out of whack, was set to execute automatically because it had been correctly anticipated that the triggering events could happen on a timescale too swift for humans to respond. The need for pre-installed and automatically executing safety functionality—as opposed to reliance on runtime human supervision—again foreshadows a theme that will be important in our discussion of machine superintelligence.</p></blockquote>

<p>So where are those safety functions now? Are any of the AI providers building in guardrails to prevent atrocities? We know that <a href="https://shkspr.mobi/blog/2025/03/how-to-dismantle-knowledge-of-an-atomic-bomb/">some LLMs are restricted from sharing details about devastating weapons of mass destruction</a> - but there seems little else put in place.</p>

<p>The book is mostly accessible but veers wildly between casual language, deep philosophical tracts, pointed snark, and the occasional dive into maths and physics. For anyone with even a passing interest in the progression of <em>any</em> technology, it is a worthwhile read.</p>

<p>Many of the predictions are spot on:</p>

<blockquote><p>As of 2012, the Zen series of go-playing programs has reached rank 6 dan in fast games (the level of a very strong amateur player), using Monte Carlo tree search and machine learning techniques. Go-playing programs have been improving at a rate of about 1 dan/year in recent years. If this rate of improvement continues, they might beat the human world champion in about a decade.</p></blockquote>

<p>In fact, <a href="https://en.wikipedia.org/wiki/AlphaGo_versus_Lee_Sedol">AlphaGo achieved mastery at the end of 2016</a>.</p>

<blockquote><p>In the slightly longer term, the cost of acquiring additional hardware may be driven up as a growing portion of the world’s installed capacity is being used to run digital minds […] as investors bid up the price for existing computing infrastructure to match the return they expect from their investment</p></blockquote>

<p>As I wrote about in "<a href="https://shkspr.mobi/blog/2026/02/ai-is-a-nand-maximiser/">AI is a NAND Maximiser</a>" this too has come to pass.</p>

<p>While LLMs weren't yet invented when this was written, there's an excellent prediction about how an AI could become a pernicious psychological adversary:</p>

<blockquote><p>Caution and restraint would be required, however, for us not to ask too many such questions—and not to allow ourselves to partake of too many details of the answers given to the questions we do ask—lest we give the untrustworthy oracle opportunities to work on our psychology (by means of plausible-seeming but subtly manipulative messages). It might not take many bits of communication for an AI with the social manipulation superpower to bend us to its will.</p></blockquote>

<p>Indeed, I think it is clear that this is already happening. While I don't ascribe malice (or any other motivation) to the AIs, it is clear that their makers have a bias towards obsequiousness.</p>

<p>Other predictions are perhaps a little wide of the mark:</p>

<blockquote><p>if somebody were to succeed in creating an AI that could understand natural language as well as a human adult, they would in all likelihood also either already have succeeded in creating an AI that could do everything else that human intelligence can do, or they would be but a very short step from such a general capability.</p></blockquote>

<p>We're a few years in to the LLM revolution and, while we can quibble about what "understand" means, it's clear that natural language can now mostly be interpreted by computers. But that doesn't seem to have made the leap to <em>general</em> intelligence, nor the acceleration of art and science.</p>

<p>Others are hopeful but possibly a bit naïve:</p>

<blockquote><p>A future superintelligence occupies an epistemically superior vantage point: its beliefs are (probably, on most topics) more likely than ours to be true. We should therefore defer to the superintelligence’s opinion whenever feasible.</p></blockquote>

<p>Yes, there probably are modern concepts which have more in common with "phlogiston" than reality. But if a scientist were to time-travel back to the early 1700s, how easy would it be for them to disprove the theory? Perhaps AI ought to exist in the "trust but verify" space?</p>

<p>It is slightly over-footnoted, with no distinction between citation and diverting passage. There's also a tendency to go off in fanciful directions - the stuff on genetically enhancing humans goes on a bit too long for my tastes. Similarly, the philosophy of maximising happiness by emulating brains and virtually doping them seemed unconvincing.</p>

<p>That said, some of the thought experiments are both fun and profound - the seminal "Paperclip Maximiser" was introduced in this book.</p>

<p>There are some downsides. An over-reliance on specific individuals like Eliezer Yudkowsky crowds out some of the other important thinkers.</p>

<p>One of the suggestions made has already fallen:</p>

<blockquote><p>One valuable asset would be a donor network comprising individuals devoted to rational philanthropy, informed about existential risk, and discerning about the means of mitigation. It is especially desirable that the early-day funders be astute and altruistic, because they may have opportunities to shape the field’s culture before the usual venal interests take up position and entrench.</p></blockquote>

<p>The "Effective Altruism" movement is now hopelessly compromised and seemingly in tatters. Similarly, the cult of rationalism has taken an unfortunate turn to the bizarre and dangerous.</p>

<p>Nevertheless, it's hard to argue with the philosophy. Whether or not "superintelligence" is ever achieved, we should have systems in place <em>now</em> to protect us. It's the same as any other technology - the time to set up nuclear non-proliferation agreements and the systems to monitor them was <em>before</em> we invented them.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69922&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/book-review-superintelligence-paths-dangers-strategies-by-nick-bostrom/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/book-review-superintelligence-paths-dangers-strategies-by-nick-bostrom/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Concert Review: London Philharmonic - Pictures at an Exhibition ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/" />

		<id>https://shkspr.mobi/blog/?p=69993</id>
		<updated>2026-04-02T11:05:54Z</updated>
		<published>2026-04-02T11:34:07Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="event" /><category scheme="https://shkspr.mobi/blog" term="review" />
		<summary type="html"><![CDATA[A delightful and emotional rendition of three rather different works.  Mark-Anthony Turnage&#039;s &#34;Three Screaming Popes&#34; was a chaotic cacophony. Wild, bizarre, inventive, and seemingly driven by excess. A fascinating performance, although not one I&#039;ll put on in the background. Turnage himself took to the stage to bask in the applause.  Bartók&#039;s Violin Concerto No. 1. Reading the story behind the …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/"><![CDATA[<p>A delightful and emotional rendition of three rather different works.</p>

<p>Mark-Anthony Turnage's "Three Screaming Popes" was a chaotic cacophony. Wild, bizarre, inventive, and seemingly driven by excess. A fascinating performance, although not one I'll put on in the background. Turnage himself took to the stage to bask in the applause.</p>

<p>Bartók's Violin Concerto No. 1. Reading the story behind the composition made the performance by soloist Alina Ibragimova even more terrifying than it might have otherwise been. The sounds emanating from her violin were somewhere between a tantrum and flirtatious coquette. Stunning to see her tear up the stage.</p>

<p>Mussorgsky's Pictures at an Exhibition. Outstanding. Hearing a 100 piece orchestra power through the score was exhilarating. It is such a vivid piece. There's no other way to describe it - each movement is distinct and full of character. One of those rare pieces where you can feel the music worming its way into your brain.</p>

<p>You can <a href="https://www.bbc.co.uk/sounds/play/m002t01v">listen to the concert on BBC Radio 3</a>.</p>

<h2 id="pre-and-post-show"><a href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/#pre-and-post-show">Pre- and Post-Show</a></h2>

<p>I've written before about <a href="https://shkspr.mobi/blog/2024/12/the-art-of-the-pre-show-and-post-show/">The art of the Pre-Show and Post-Show</a>. Venues and shows have multiple ways to make an event special for an audience.</p>

<p>This concert did some things really well. For a start - the programme was free! I wish the West End was a bit more like Broadway with a free "Playbill" at every show.  Even better, the programme was actually useful! Some nice blurbs about the performers and the pieces.</p>

<p>I particularly liked this little snippet:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/04/Classical.webp" alt="Longer classical pieces are often made up of movements, or shorter sections. Applause is usually saved for after the final movement. May an encore! The soloist might play a little extra surprise piece, if the applause is loud enough!" width="1024" height="768" class="aligncenter size-full wp-image-69994">

<p>How wonderful! It's always someone's first time at an orchestral concert. More programmes should have these little comfort notes.</p>

<p>Other than that, there wasn't much. There was no interaction between the conductor and audience, which felt a little odd. The programme had a QR code to a 31(!) point questionnaire.  I'm not sure how many people would be bothered to complete that.</p>

<p>Royal Festival Hall is a delight - plenty of space, multiple bars, lots of seating areas, and a larger number of spacious &amp; clean toilets. An excellent venue.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69993&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/concert-review-london-philharmonic-pictures-at-an-exhibition/feed/atom/" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Random File Format]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/04/random-file-format/" />

		<id>https://shkspr.mobi/blog/?p=65027</id>
		<updated>2026-04-03T09:24:56Z</updated>
		<published>2026-04-01T11:34:57Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="linux" /><category scheme="https://shkspr.mobi/blog" term="experiment" /><category scheme="https://shkspr.mobi/blog" term="python" />
		<summary type="html"><![CDATA[This was an idea I had back in the days of Naptster.  At the turn of the century, it was common to listen to an &#34;acquired&#34; music file only to find it was missing a few seconds at the end due to a prematurely stopped download.  Some video formats would refuse to play at all if the moov atom at the end of the file was missing.  I wondered if it would be possible to make a file format which was…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/04/random-file-format/"><![CDATA[<p>This was an idea I had back in the days of Naptster.</p>

<p>At the turn of the century, it was common to listen to an "acquired" music file only to find it was missing a few seconds at the end due to a prematurely stopped download.  Some video formats would refuse to play at all if the <a href="https://www.cnwrecovery.com/manual/Fragmented3GPMP4Files.html"><code>moov</code> atom at the end of the file was missing</a>.</p>

<p>I wondered if it would be possible to make a file format which was close to impossible to read unless the <em>entire</em> file was intact. I don't mean including a checksum to detect download errors - I mean a layout which was <strong>intrinsically fragile</strong> to corruption.</p>

<p>While digging through an old backup CD, I found my original notes. I'm rather impressed at what neophyte-me had constructed.  My outline was:</p>

<ul>
<li>The file ends with a 32 bit pointer. This points to the location of the first information block.</li>
<li>The information block describes the length of the data block which follows it.</li>
<li>At the end of the data block is another 32 bit pointer. This points to the location of the next information block.</li>
<li>The start of the file may be a pointer, or it may be padded with random data.</li>
<li>There may be random data padded between the data blocks.</li>
</ul>

<p>This ensures that a file which has been only partially downloaded - whether truncated at the end or missing pieces elsewhere - cannot be successfully read.</p>

<p>Here's a worked example. Start at the end and follow the thread.</p>

<ol start="0">
<li>Random data.</li>
<li>Data block size is 2.</li>
<li>Data</li>
<li>Data</li>
<li>EOF.</li>
<li>Data block size is 1.</li>
<li>Data.</li>
<li>Go to location 1.</li>
<li>Random data.</li>
<li>Go to location 5.</li>
</ol>

<p>There are, of course, a few downsides to this idea.</p>

<p>Most prominently, it bloats file size. If the data block size was a constant 1MB, that would pad the size a negligible amount. But with variable data block size, it could increase it significantly. Random padding also increases the size.</p>

<p>If the block size is consistent and there's no random padding data, the files can be mostly reconstructed.</p>

<p>Depending on which parts of the file are missing, it may be possible to recover the majority of the file.</p>

<p>A location block size of 32 bits restricts the file-size to less than 4GB. A 64 bit pointer might be excessive or might be future-proof!</p>

<p>Highly structured files with predictable patterns, or text files, may be easy to recover large bits of information.</p>

<p>A malformed file could contain an infinite loop of pointers.</p>

<p>Perhaps a <a href="https://en.wikipedia.org/wiki/File_format#Magic_number">magic number</a> should be at the start (or end) of the file?</p>

<p>While reading the file is as simple as following the pointers, <em>constructing</em> the file is more complex, especially if blocks have variable lengths.</p>

<h2 id="code"><a href="https://shkspr.mobi/blog/2026/04/random-file-format/#code">Code</a></h2>

<p>Here's a trivial encoder. It reads a file in consistently sized chunks of 1,024 bytes. It shuffles them up and writes them to a new file. The last 4 bytes contain a pointer to the first block, which says the data length is 1,024. After that, there is a 4 byte pointer to the next block location.</p>

<pre><code class="language-python">import random

#   Size of data, headers, and pointers.
data_length = 1024
header_length  = 4
pointer_length = 4

#   Read the file into a data structure.
original_blocks = list()
with open( "test.jpg", "rb") as file:
    for data in iter( lambda: file.read( data_length ), b"" ):
        #   Add padding if length is less than the desired length.
        padding = data_length - len( data )
        data += b"\0" * padding
        original_blocks.append( data )

#   How many blocks are there?
original_length = len( original_blocks )

#   Create a random order of blocks.
order = list( range( 0, original_length ) )
random.shuffle( order )

#   Where is the start of the file?
first_block_index = order.index( 0 )
first_block_pointer = first_block_index * ( header_length + data_length + pointer_length )

#   Loop through the order and write to a new file.
i = 0
#   Open as binary file to add the pointers correctly.
with open( "output.rff", "wb" ) as output:
    while i &lt; original_length:
        #   Where are we?
        current_block = i
        current_block_value = order[i]
        #   Write length of data in little-endian 32 bytes.
        output.write( data_length.to_bytes( header_length, "little") )
        #   Write data
        output.write( original_blocks[ current_block_value ] )
        i = i+1
        #   Last block. Write an EOF header.
        if ( current_block_value + 1 &gt;= original_length ):
            eof = 4294967295
            output.write( eof.to_bytes( header_length, "little") )
        else:
            next_block = order.index( current_block_value + 1 )
            #   Write pointer to next block
            next_block_location = next_block * ( header_length + data_length + pointer_length )
            output.write( next_block_location.to_bytes( pointer_length, "little" ) )
    #   At the end of the file, write the pointer to block 0.
    output.write( first_block_pointer.to_bytes( pointer_length, "little" ) )
</code></pre>

<p>And here is a similarly trivial decoder. It reads the last 32 bits, moves to that location, reads the block size, reads the data and writes it to a new file, then reads the next pointer.</p>

<pre><code class="language-python">import os
#   Size of data, headers, and pointers.
header_length  = 4
pointer_length = 4
#   File name to write to.
decoded_file = "decoded.bin"

#   Create an empty file.
with open( decoded_file, "w") as file:
    pass

#   Function to loop through the blocks.
def read_block( position, i ):
    #   Move to the position in the file.
    input_file.seek( position, 0 )
    #   Read the data length header.
    data_length = int.from_bytes( input_file.read( header_length ), "little" )
    #   Move to the data block.
    input_file.seek( position + header_length, 0 )
    #   Read the data.
    data = input_file.read( data_length )
    #   Read the pointer header.
    next_position = int.from_bytes( input_file.read( pointer_length ), "little" )
    #   If this is the final block, it may have null padding. Remove it.
    if ( next_position == 4294967295 ) :
        data = data.rstrip(b"\0")
    #   Append the data to the decoded file.
    with open( decoded_file, "ab" ) as file:
        file.write( data )
    #   If this is the final block, finish searching.
    if ( next_position == 4294967295 ) :
         print("File decoded.")
    else:
        #   Move to the next position.
        read_block( next_position, i+1 )

#   Open the file as binary.
input_file = open( "output.rff", "rb" )

#   Read the last 4 bytes.
input_file.seek( -4, 2 )

#   Get position of first block
first_block = int.from_bytes( input_file.read(), "little" )

#   Start reading the file.
seek_to = first_block
read_block( seek_to, 0 )
</code></pre>

<p>As I said, these are both trivial. They are a bit buggy and contain some hardcoded assumptions.</p>

<p>Here are two files encoded as "RFF" - Random File Format - <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.jpg.rff">an image</a> by Maria Sibylla Merian, and the <a href="https://shkspr.mobi/blog/wp-content/uploads/2026/03/output.txt.rff">text of Romeo and Juliet</a>.</p>

<p>Have fun decoding them!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=65027&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/04/random-file-format/#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/04/random-file-format/feed/atom/" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Gig Review: Vitamin String Quartet at The Barbican ★★★★★]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/" />

		<id>https://shkspr.mobi/blog/?p=69952</id>
		<updated>2026-03-30T08:37:29Z</updated>
		<published>2026-03-30T11:34:35Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="gig" /><category scheme="https://shkspr.mobi/blog" term="music" />
		<summary type="html"><![CDATA[There is no such thing as the Vitamin String Quartet. They&#039;re an ever-changing line-up of musicians who have found an excellent schtick; modern songs played like classical music. Somehow they&#039;ve parlayed that into over 300 albums, covering thousands of artists, and dominating the soundtrack of Bridgerton.  The concert is titled &#34;The Music of Billie Eilish, Bridgerton, and Beyond&#34; - it&#039;s all…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/"><![CDATA[<p>There is no such thing as <em>the</em> <a href="https://www.vitaminstringquartet.com/pages/about-us">Vitamin String Quartet</a>. They're an ever-changing line-up of musicians who have found an excellent <i lang="yi">schtick</i>; modern songs played like classical music. Somehow they've parlayed that into over 300 albums, covering thousands of artists, and dominating the soundtrack of Bridgerton.</p>

<p>The concert is titled "The Music of Billie Eilish, Bridgerton, and Beyond" - it's all crowd-pleasers covering everything from "Take On Me" to the earworm from KPOP Demon Hunters. Venues now know they can't stop people pulling out their phones, so there was an announcement politely asking people not to record the whole show or use their flash but, other than that, snap away.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/VSQ.webp" alt="A string quartet playing on stage." width="1024" height="576" class="aligncenter size-full wp-image-69953">

<p>It was a delightfully relaxed performance. The audience were encouraged to sing along which filled the hall with pleasing susurrus of half-remembered lyrics. I'll admit to being ignorant of some of Billie Eilish's work but even if you don't recognise the tunes, there's no escaping the brilliance of the performances.</p>

<p>I'm not sure how adapted the setlist was for a UK audience, but it was nice to hear some Radiohead and Coldplay in there. The encore of Bohemian Rhapsody was, of course, outstanding and had everyone leaping to their feet in applause.</p>

<p>If a permutation of the VSQ visits your neighbourhood, I'd highly recommend basking in their talent.</p>

<h2 id="the-venue"><a href="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/#the-venue">The Venue</a></h2>

<p>We picked up cheap tickets for the show. There's no such thing as a bad seat at the Barbican Hall. We were literally as far back as possible and still had a superb and unobstructed view of the stage. The acoustics were flawless and the seats were comfortable and had leg-room. Basically, every performance space in London should be this good. Of course, the toilets were another matter!</p>

<p>While there are loos scattered about the building, they're clearly inadequate for the number of patrons. The queue out of the ladies minutes before the show started should be an embarrassment to the Barbican.</p>

<h2 id="pre-and-post-show"><a href="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/#pre-and-post-show">Pre- and Post-Show</a></h2>

<p>I've written before about <a href="https://shkspr.mobi/blog/2024/12/the-art-of-the-pre-show-and-post-show/">The art of the Pre-Show and Post-Show</a>. This concert had… nothing! There was no souvenir programme to buy and only a perfunctory pre-show email explaining how to find the venue.</p>

<p>The warm-up act, <a href="https://www.tomspeightmusic.com/">Tom Speight</a> was decent. A half-hour acoustic set to get us going. His music was charming as was his crowd-work getting us to sing along.</p>

<p>There was meant to be a post-show merch stall with the opportunity of a meet-and-greet with VSQ. The Barbican is a maze and we couldn't find it on our trek from the balcony to the exit. Perhaps a little signposting would help?</p>

<p>The post-show email was utterly generic. No encouragement to share the experience or find out more about the performance or look for future tickets. Just a soulless Net Promoter Score exercise.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69952&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/03/gig-review-vitamin-string-quartet-at-the-barbican/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[OpenBenches hits 40k]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/" />

		<id>https://shkspr.mobi/blog/?p=68382</id>
		<updated>2026-03-28T11:33:53Z</updated>
		<published>2026-03-28T12:34:11Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="OpenBenches" />
		<summary type="html"><![CDATA[Back in November 2023, our crowdsourced website of memorial benches reached 30,000 entries. At the start of March this year, I was delighted when long-time contributor jrbray1 added this gorgeous memorial, taking us up to 40,000 benches catalogued:    You can read more about Dr Judy John and her work on biodiversity.  Using the power of advanced machine learning, it is possible to plot the growth …]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/"><![CDATA[<p>Back in November 2023, our crowdsourced website of memorial benches <a href="https://shkspr.mobi/blog/2023/12/30000-crowd-sourced-memorial-benches/">reached 30,000 entries</a>. At the start of March this year, I was delighted when long-time contributor <a href="https://openbenches.org/user/6143">jrbray1</a> added this gorgeous memorial, taking us up to 40,000 benches catalogued:</p>

<p><a href="https://openbenches.org/bench/41445"><img src="https://images.weserv.nl/?url=openbenches.org/image/5314d81bfd373fa32a1483643b7febea54b9e7df/&amp;w=600&amp;q=60&amp;output=webp&amp;il" alt="In fond memory ofDr Judy JohnBotanistEver supportiveAdviser and Friend of these woods" width="600" height="270"></a></p>

<p>You can <a href="https://coneyhallvillagera.org/2026/02/23/in-memory-of-dr-judy-john/">read more about Dr Judy John</a> and her work on biodiversity.</p>

<p>Using the power of advanced machine learning, it is possible to plot the growth on an innovative form of data visualisation known as "a graph"!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/Bench-Graph.webp" alt="A graph with a fairly straight line going up from 0 benches in 2017 to 40000 benches in 2026." width="942" height="502" class="aligncenter size-full wp-image-68386">

<p>That's the sort of "number go up" that investors like to see. I reckon someone will come along to give us a bazillion dollarydoos any minute now.</p>

<p>For those of you who like text rather than graphics, here are our historic milestones:</p>

<ul>
<li>10K - December 2018</li>
<li>20K - August 2021</li>
<li>30K - November 2023</li>
<li>40K - March 2026</li>
<li>50k - ??? Probably September 2027 ???</li>
</ul>

<p>Tell you what, when we get to fifty-thousand, we'll throw a big party and you'll all be invited 🥳</p>

<p>If you spot a lovely memorial bench while you're out and about, please take a geotagged photo and upload it to <a href="https://OpenBenches.org">OpenBenches.org</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=68382&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/03/openbenches-hits-40k/feed/atom/" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Adding human.json to WordPress]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/" />

		<id>https://shkspr.mobi/blog/?p=69190</id>
		<updated>2026-03-24T15:08:35Z</updated>
		<published>2026-03-26T12:34:52Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="AI" /><category scheme="https://shkspr.mobi/blog" term="humans" /><category scheme="https://shkspr.mobi/blog" term="WordPress" />
		<summary type="html"><![CDATA[Every few years, someone reinvents FOAF. The idea behind Friend-Of-A-Friend is that You can say &#34;I, Alice, know and trust Bob&#34;. Bob can say &#34;I know and trust Alice. I also know and trust Carl.&#34; That social graph can be navigated to help understand trust relationships.  Sometimes this is done with complex cryptography and involves key-signing ceremonies. Other times it involves byzantine XML RDF.…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/"><![CDATA[<p>Every few years, someone reinvents <abbr title="Friend of a friend">FOAF</abbr>. The idea behind Friend-Of-A-Friend is that You can say "I, Alice, know and trust Bob". Bob can say "I know and trust Alice. I also know and trust Carl." That social graph can be navigated to help understand trust relationships.</p>

<p>Sometimes this is done with complex cryptography and involves key-signing ceremonies. Other times it involves byzantine <a href="http://ldodds.com/foaf/foaf-a-matic.html">XML RDF</a>. Or you can use the baroque <a href="https://gmpg.org/xfn/">XHTML Friends Network</a>.</p>

<p>None of those have been widely adopted. Perhaps it's because PGP is a usability nightmare, XML is out of fashion, or because these relationships mostly live in silos like Facebook and LinkedIn, or just that people value their privacy and don't want to expose their social graph any more than they have to.</p>

<p>Enter a new contender into the ring - <a href="https://codeberg.org/robida/human.json">human.json</a> - it describes itself as:</p>

<blockquote><p>a lightweight protocol for humans to assert authorship of their site content and vouch for the humanity of others. It uses URL ownership as identity, and trust propagates through a crawlable web of vouches between sites.</p></blockquote>

<p>It looks like this:</p>

<pre><code class="language-json">{
  "version": "0.1.1",
  "url": "https://shkspr.mobi/blog/",
  "vouches": [
    {
      "url": "https://neilzone.co.uk/",
      "vouched_at": "2026-03-20"
    },
    {
      "url": "https://ohhelloana.blog/",
      "vouched_at": "2026-03-20"
    }
  ]
}
</code></pre>

<p>That says that I assert my own blog is written by a human, and that I vouch that my friends Neil and Ana write their own content.</p>

<p>Now, obviously there's no way that I can <em>prove</em> my blog posts are written by an organic, vegan-fed, human. And, while I know and trust the friends I've met AFK, I don't have any special insight into their creative processes. If I suspect them of being synthetic clankers, I can disavow their sites by removing them from my <code>human.json</code> file.</p>

<h2 id="adding-to-wordpress"><a href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/#adding-to-wordpress">Adding to WordPress</a></h2>

<p>There's an easy way and a hard way. The easy way it to just hand-write a JSON file and upload it to your website. BORING!</p>

<p>To start with, you'll need to add some code to your HTML's head. Stick this in your <code>index.php</code></p>

<pre><code class="language-html">&lt;link rel=human-json href=https://example.com/json/human.json&gt;
</code></pre>

<p>Next, add this to your <code>functions.php</code> or wherever you set your weird options:</p>

<pre><code class="language-php">//  Add rewrite rule for /json and /json/{something}
add_action( "init", function () {
    add_rewrite_rule(
        '^json(?:/([^/]+))?/?$',    //  Matches /json and /json/{something}
        'index.php?pagename=json&amp;json_param=$matches[1]',
        "top"
    );
});

//  Register custom query variable
add_filter( "query_vars" , function ($vars) {
    $vars[] = "json_param";
    return $vars;
});
</code></pre>

<p>That creates a rewrite so that <code>/json/whatever</code> will be intercepted. For now, this only deals with human.json - but there may be more weird JSON things you want to support later. Hurrah for over-engineering!</p>

<p>Next, add this:</p>

<pre><code class="language-php">add_action( "template_redirect", function() {
    if ( get_query_var( "json_param" ) &amp;&amp; "human.json" == get_query_var( "json_param" ) ) {
        $data = [
            "version" =&gt; "0.1.1",
                "url" =&gt; esc_url( home_url() ),
            "vouches" =&gt; [
                [
                           "url" =&gt; "https://friend.example.com",
                    "vouched_at" =&gt; "2026-03-20"
                ],
                [
                           "url" =&gt; "https://whatever.example",
                    "vouched_at" =&gt; "2026-03-20"
                ],

            ]
        ];
        //  Headers to make sure it all works.
        header( "Access-Control-Allow-Origin: *" );
        wp_send_json( $data, 200 );
    }
} );
</code></pre>

<p>That intercepts the request, generates some JSON, then serves it with the correct content type and CORS headers.</p>

<p>You may need to refresh your redirects. Easiest way is to go to your blog's admin page and choose Settings → Permalinks, then hit <kbd>Save</kbd></p>

<h2 id="over-over-engineering"><a href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/#over-over-engineering">Over over engineering</a></h2>

<p>This takes a list of your human friends, deduplicates them, sorts them alphabetically, and changes the vouch date to that of when you last updated the files.</p>

<pre><code class="language-php">add_action( "template_redirect", function() {
    if ( get_query_var( "json_param" ) ) {
        // https://codeberg.org/robida/human.json
        if ( strcasecmp( "human.json", get_query_var( "json_param" ) ) == 0 ) {

            //  People who I know to be human.
            $humans = array_unique([
                "https://neilzone.co.uk/",
                "https://ohhelloana.blog/",
                "https://example.com/",
            ]);

            sort( $humans );

            //  When was this file updated?
            //  RFC 3339 date format.
            $modified = date( "Y-m-d", filemtime( __FILE__ ) );

            foreach ( $humans as $human ) {
                $vouches[] = [ "url" =&gt; $human, "vouched_at" =&gt; $modified ];
            }

            $data = [
                "version" =&gt; "0.1.1",
                    "url" =&gt; esc_url( home_url() ),
                "vouches" =&gt; $vouches
            ];

            //  Headers to make sure it all works.
            header( "Access-Control-Allow-Origin: *" );
            wp_send_json( $data, 200, JSON_PRETTY_PRINT );
        } else {
            //  No valid parameter
            wp_send_json( null,  404, JSON_PRETTY_PRINT );
        }
    }
} );
</code></pre>

<h2 id="is-it-worth-it"><a href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/#is-it-worth-it">Is it worth it?</a></h2>

<p>I don't know.</p>

<p>Perhaps no one will use this. Or perhaps all my friends will turn out to be poorly constructed Turing machines. Or maybe a better standard will come along.</p>

<p>Either way, I think it is nifty and am happy to support it.</p>

<p>You can <a href="https://codeberg.org/robida/human.json">read more about human.json on CodeBerg</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69190&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/#comments" thr:count="12" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/03/adding-human-json-to-wordpress/feed/atom/" thr:count="12" />
			<thr:total>12</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Book Review: If We Cannot Go at the Speed of Light by Kim Choyeop ★★☆☆☆]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/03/book-review-if-we-cannot-go-at-the-speed-of-light-by-kim-choyeop/" />

		<id>https://shkspr.mobi/blog/?p=69157</id>
		<updated>2026-03-24T11:12:42Z</updated>
		<published>2026-03-24T12:34:27Z</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="NetGalley" /><category scheme="https://shkspr.mobi/blog" term="Sci Fi" />
		<summary type="html"><![CDATA[Short stories offer you the chance to dip briefly into a world and then skip out so there&#039;s not much time for development; just straight in to the plot and off we go. But this is all exposition and very little action. Rather than let the plots develop naturally, there are just vast passages of infodumping. I&#039;m sad to say this is a rather dreary and insipid collection of stories.  Some of the…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/03/book-review-if-we-cannot-go-at-the-speed-of-light-by-kim-choyeop/"><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2026/03/cover804957-medium.webp" alt="Book cover." width="255" height="408" class="alignleft size-full wp-image-69158">

<p>Short stories offer you the chance to dip briefly into a world and then skip out so there's not much time for development; just straight in to the plot and off we go. But this is all exposition and very little action. Rather than let the plots develop naturally, there are just vast passages of infodumping. I'm sad to say this is a rather dreary and insipid collection of stories.</p>

<p>Some of the stories start out with an interesting premise but then just fizzle out. There's a reasonably good idea in "The Materiality of Emotions" which describes people buying little trinkets which induce emotions in them. Again, emotions as drugs is well-worn stuff, but this builds up momentum nicely before suddenly ending.</p>

<p>The highlight is "Spectrum" which has some delightful world-building but, like the others, it's rather derivative of older stories. A woman's space ship crashes on a strange planet and she tries to befriend the local hominids. You've almost certainly read it before.</p>

<p>Overall I found it underwhelming.</p>

<p>Many thanks to NetGalley for the review copy.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=69157&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
					<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/03/book-review-if-we-cannot-go-at-the-speed-of-light-by-kim-choyeop/#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/03/book-review-if-we-cannot-go-at-the-speed-of-light-by-kim-choyeop/feed/atom/" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>@edent</name>
							<uri>https://edent.tel/</uri>
						</author>

		<title type="html"><![CDATA[Bored of eating your own dogfood? Try smelling your own farts!]]></title>
		<link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/" />

		<id>https://shkspr.mobi/blog/?p=63957</id>
		<updated>2026-03-22T09:44:38Z</updated>
		<published>2026-03-22T12:34:07Z</published>
		<category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="customer service" />
		<summary type="html"><![CDATA[I called a large company the other day. Did I know the information I wanted could be found on their website? And was I aware that I could manage my account online? And would I like to receive a link to chat with their AI assistant via WhatsApp?  Naturally, call volumes were higher than expected. I can only assume that whoever was in charge of predicting call volumes had recent suffered a…]]></summary>

					<content type="html" xml:base="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/"><![CDATA[<p>I called a large company the other day. Did I know the information I wanted could be found on their website?<sup id="fnref:no"><a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fn:no" class="footnote-ref" title="It couldn't!" role="doc-noteref">0</a></sup> And was I aware that I could manage my account online?<sup id="fnref:cancel"><a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fn:cancel" class="footnote-ref" title="Not if I wanted to cancel." role="doc-noteref">1</a></sup> And would I like to receive a link to chat with their AI assistant via WhatsApp?<sup id="fnref:sick"><a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fn:sick" class="footnote-ref" title="I'd rather stick my head in a bucket of lukewarm sick!" role="doc-noteref">2</a></sup></p>

<p>Naturally, call volumes were higher than expected. I can only assume that whoever was in charge of predicting call volumes had recent suffered a traumatic brain injury and was unable to count beyond five without pulling their other hand out of their fundament.</p>

<p>The cheerful woman warbled through her pre-recorded script and was suddenly replaced with a hideous electronic monstrosity. I recorded the call<sup id="fnref:rec"><a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fn:rec" class="footnote-ref" title="For training and monitoring purposes, of course!" role="doc-noteref">3</a></sup> so that you can experience this monument to synthetic glory!</p>

<p></p><figure class="audio">
	<figcaption>🔊</figcaption>
	
	<audio controls="" loading="lazy" src="https://shkspr.mobi/blog/wp-content/uploads/2025/12/3minutes.opus">
		<p>💾 <a href="https://shkspr.mobi/blog/wp-content/uploads/2025/12/3minutes.opus">Download this audio file</a>.</p>
	</audio>
</figure><p></p>

<p>This is from a company whose website gushes about how innovative it is. AI is transforming its business at scale! Dedicated to technological excellence and delivering ISO accredited quality in all its divisions! And yet, somewhere, someone decided that customer experience was good enough.</p>

<p>"<a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">Dogfooding</a>" is a sacred practice in the tech industry. Use your own products. That's it. That's all you have to do. For example, if you work for Slack - you can't use Teams for your messaging solution. You have to show people that you have faith in your own products.</p>

<p>But it goes deeper than that. When I used to work for mobile phone networks, they asked us to spend time in call centres. It isn't enough to receive a quarterly report on customer KPIs. You have to hear the rage in customers' voices as they struggle with your billing system. Perhaps that will convince you to have empathy with the people paying to use your product.</p>

<p>There's an <a href="https://www.youtube.com/watch?v=X23T-HVr0fw">oft told story about Jeff Bezos</a> pausing a meeting to call his own customer service number - and waiting over 10 minutes for an answer. When was the last time the CEO of the above company called their own customer support line?</p>

<p>It's all very well to experience your own product when it is working, but when was the last time <em>anyone</em> in the above organisation went through a "difficult" customer journey.</p>

<p>By contrast, I recently cancelled a subscription to a small start-up's service. Someone from their senior leadership team asked if they could call to chat about why I cancelled. I said sure and had an enjoyable half-hour whinge / chat about their failings.   At almost every complaint, they replied either "Oh, yeah, I also find that annoying" or "Huh, I've not experienced that, but I can see why it would suck."</p>

<p>At no point did they ever say "Our metrics don't show a problem" or "Do people <em>really</em> care about that?"</p>

<p>Maybe I was being flattered. Maybe it's a waste of senior leadership time to start every meeting with a ritual phone call to the call centre. Maybe I'm the only one who gets annoyed when people can't be bothered to put the bare minimum effort into their job.</p>

<p>But, maybe, breathing in the noxious output of barely digested slurry is the only way to get people to improve their diet.</p>

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

<li id="fn:no">
<p>It couldn't!&nbsp;<a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fnref:no" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:cancel">
<p>Not if I wanted to cancel.&nbsp;<a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fnref:cancel" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:sick">
<p>I'd rather stick my head in a bucket of lukewarm sick!&nbsp;<a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fnref:sick" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:rec">
<p>For training and monitoring purposes, of course!&nbsp;<a href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#fnref:rec" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=63957&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager">]]></content>
		
		<link href="https://shkspr.mobi/blog/wp-content/uploads/2025/12/3minutes.opus" rel="enclosure" length="40098" type="audio/opus" />
			<link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2026/03/bored-of-eating-your-own-dogfood-try-smelling-your-own-farts/feed/atom/" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
	</feed>
