add shkspr.mobi Atom feed (new Wordpress version) - sfeed_tests - sfeed tests and RSS and Atom files
 (HTM) git clone git://git.codemadness.org/sfeed_tests
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit c4166385ca59f5f4b8cb8e306408a2918f1f124f
 (DIR) parent 235966bbea4038cb8718d996ceabd7359d490410
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 12 Jul 2025 12:42:55 +0200
       
       add shkspr.mobi Atom feed (new Wordpress version)
       
       Diffstat:
         A input/sfeed/realworld/shkspr.mobi.… |    1676 +++++++++++++++++++++++++++++++
       
       1 file changed, 1676 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/input/sfeed/realworld/shkspr.mobi.atom.xml b/input/sfeed/realworld/shkspr.mobi.atom.xml
       @@ -0,0 +1,1676 @@
       +<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/atom-style.xsl" type="text/xsl"?><feed
       +        xmlns="http://www.w3.org/2005/Atom"
       +        xmlns:thr="http://purl.org/syndication/thread/1.0"
       +        xml:lang="en-GB"
       +        >
       +        <title type="text">Terence Eden’s Blog</title>
       +        <subtitle type="text">Regular nonsense about tech and its effects 🙃</subtitle>
       +
       +        <updated>2025-07-09T21:12:31Z</updated>
       +
       +        <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog" />
       +        <id>https://shkspr.mobi/blog/feed/atom/</id>
       +        <link rel="self" type="application/atom+xml" href="https://shkspr.mobi/blog/feed/atom/" />
       +
       +        <generator uri="https://wordpress.org/" version="6.8.1">WordPress</generator>
       +<icon>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</icon>
       +        <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Gadget Review: Thermal Imaging Camera - Topdon TC004 Mini ★★★⯪☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61523</id>
       +                <updated>2025-07-09T21:12:31Z</updated>
       +                <published>2025-07-10T11:34:53Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="gadget" /><category scheme="https://shkspr.mobi/blog" term="infrared" /><category scheme="https://shkspr.mobi/blog" term="review" /><category scheme="https://shkspr.mobi/blog" term="thermal" />
       +                <summary type="html"><![CDATA[I&#039;ve reviewed several thermal imaging products over the years. They range from tiny USB-C add-ons to professional quality hulking great handhelds.  Topdon have sent me a mid-point model to review. It&#039;s relatively cheap for a thermal imaging product - only £140 on Amazon. I think the sensor is made by Raytrontek. But is it any good?    While it has a bunch of useful features, there&#039;s no video …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/"><![CDATA[
       +                                <html><head></head><body><p>I've reviewed <a href="https://shkspr.mobi/blog/tag/thermal/">several thermal imaging products</a> over the years. They range from <a href="https://shkspr.mobi/blog/2023/06/review-infiray-thermal-usb-c-camera-for-android/">tiny USB-C add-ons</a> to professional quality <a href="https://shkspr.mobi/blog/2024/04/gadget-review-kaiweets-kti-w01-thermal-imaging-camera/">hulking great handhelds</a>.</p>
       +
       +<p>Topdon have sent me a mid-point model to review. It's relatively cheap for a thermal imaging product - <a href="https://amzn.to/468ipTY">only £140 on Amazon</a>. I <em>think</em> the sensor is made by <a href="https://en.raytrontek.com/product/infrared.htm">Raytrontek</a>. But is it any good?</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/71IGxD6iDyL._SL750_.jpg" alt="Thermal Imaging Camera." width="600" height="750" class="aligncenter size-full wp-image-61841">
       +
       +<p>While it has a bunch of useful features, there's no video recording and it doesn't work with Linux. Other than that, it's fine.</p>
       +
       +<h2 id="the-good-points"><a href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/#the-good-points" class="heading-link">The Good Points</a></h2>
       +
       +<p>It seems broadly accurate. Point it at a bunch of things and you can see their temperature. Here's my beautiful face:</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/IR20250623073108-rotated.jpeg" alt="Thermal selfie. I have a very cold nose." width="240" height="320" class="aligncenter size-full wp-image-61849">
       +
       +<p>That's the actual size of the file. Their marketing bumph says:</p>
       +
       +<blockquote><p>TISR (Thermal Image Super Resolution) uses AI algorithms to add simulated pixels between existing ones, enhancing low-resolution thermal images into clearer, high-resolution visuals.</p></blockquote>
       +
       +<p>Let's be honest, there's no AI in a device this cheap. There are various complex rules about Infrared cameras and their resolution. These images are fairly low quality - but more than good enough to help you spot a leak or work out if something is too hot.</p>
       +
       +<p>Quick start up is great. It is ready to go a few seconds after pushing the power button.</p>
       +
       +<p>The trigger grip is comfortable and responsive - it makes the whole device very "point-and-shoot".</p>
       +
       +<p>There's a standard tripod screw fitting at the bottom.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/tripod.jpg" alt="A screw fitting and lanyard strap." width="1024" height="771" class="aligncenter size-full wp-image-61843">
       +
       +<p>The camera is at a slight angle from the grip, so you'll need a tripod with a tiltable mount.  You also get an lanyard in the box, which is easily secured to the device.</p>
       +
       +<p>There's a file-browser built in - which also lets you delete photos.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/File-Browser.webp" alt="Photo of a &quot;Delete this pic&quot; screen." width="600" height="450" class="aligncenter size-full wp-image-61844">
       +
       +<p>USB-C for charging and data transfer. Same as all your other gadgets, I hope!</p>
       +
       +<h2 id="but"><a href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/#but" class="heading-link">But…</a></h2>
       +
       +<p>Resolution is low. That's normal for these sorts of cameras, but because the output is only 240x320 it means the on-screen text is cramped and looks pretty poor.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/IR20250622072705-rotated.jpeg" alt="Camera with a thermal view. It shows how hot something is, with maximum and minimum temperatures." width="240" height="320" class="aligncenter size-full wp-image-61848">
       +
       +<p>The interface is basic. It doesn't look brilliant, but it is usable.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Menu.webp" alt="List of menu items." width="600" height="449" class="aligncenter size-full wp-image-61846">
       +
       +<p>Setting the time, for example, is a bit of a pain:</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/date-time-settings.webp" alt="Settings screen with a manual up and down for every setting." width="600" height="450" class="aligncenter size-full wp-image-61845">
       +
       +<p>Once you've gone in to set the time and other basic settings, you'll probably never go back to it.</p>
       +
       +<p>Storage space is low - only 480MB. To be fair, images are under 100KB, so you could store several thousand before you hit a problem.</p>
       +
       +<p>There's no video recording. That's a bit of an arse if you want to see how something heats over time.</p>
       +
       +<p>You can't extract temperature information from the images. There's no EXIF, no standard metadata, just whatever is printed over the photo. Again, good enough for a quick check but, given the small viewable size of the images, it would have been nice to print the information separately.  You can remove some of the on-screen elements from the image. Here's my <a href="https://shkspr.mobi/blog/2025/03/review-wifi-connected-air-conditioner/">air-conditioning unit</a>:</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/IR20250702154023-rotated.jpeg" alt="A thermal image. It shows the temperature at the centre of the image." width="240" height="320" class="aligncenter size-full wp-image-61850">
       +
       +<p>The rubber flap protecting the charging port makes it difficult to insert the cable.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/usb-c.jpg" alt="A USB-C cable with a cover flap pressed tightly against it." width="1024" height="771" class="aligncenter size-full wp-image-61842">
       +
       +<p>Because the port is on the top of the device, it's sensible to protect it from debris, but it is a bit fiddly to use.</p>
       +
       +<h2 id="linux-information"><a href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/#linux-information" class="heading-link">Linux Information</a></h2>
       +
       +<p>This shows up as <code>3474:0020 Raysentek Co.,Ltd Raysentek MTP</code>. In theory, it should just show up as a device in your file explorer. But it doesn't work.</p>
       +
       +<p>I couldn't detect anything with <code>mtp-device</code> - it didn't show up. dmesg showed the dreaded <code>device not accepting address 53, error -71</code> which, I think, indicates a power problem.</p>
       +
       +<p><code>lsusb -v</code> shows it claims to support <a href="https://en.wikipedia.org/wiki/Picture_Transfer_Protocol">Picture Transfer Protocol</a>.</p>
       +
       +<p>I reset the device, formatted its memory, used different cables and ports, restarted everything, I even tried it on my Android phone. Nothing.</p>
       +
       +<p>Which rather puts a damp squib on things. If you can't get the images off the device, you're stuck peering at them on a tiny screen with no way to share them with others.</p>
       +
       +<p>It <em>will</em> work with Windows. I tried it in VirtualBox and it showed up - albeit with the name "Cobra".</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Cobra.webp" alt="Windows setting screen for Cobra by Raysentek." width="581" height="497" class="aligncenter size-full wp-image-61847">
       +
       +<h2 id="verdict"><a href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/#verdict" class="heading-link">Verdict</a></h2>
       +
       +<p>Fora quick and dirty inspection, this is a perfectly fine little device. Point it at a thing and see how hot it is. Squeeze the trigger and capture the image for later viewing.</p>
       +
       +<p>The tripod attachment is handy and there are enough settings hidden away for you to set it up for your own personal needs.</p>
       +
       +<p>The buttons feel a bit crap and flap gets in the way of the USB-C charging port.</p>
       +
       +<p>It doesn't work with Linux or Android - I wasn't able to test it on a Mac - so make sure you have Windows available for getting the images off it.</p>
       +
       +<p>This is one of the cheapest stand-alone thermal cameras you can buy. Necessarily, there are compromises involved with things at this price-point. The camera works (albeit not with Linux) and is a great way to get started with Infrared photography and monitoring.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/#comments" thr:count="1" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/gadget-review-thermal-imaging-camera-topdon-tc004-mini/feed/atom/" thr:count="1" />
       +                        <thr:total>1</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: The World After Amazon - Stories from Amazon Workers by Xenia Benivolski ★★★☆☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-after-amazon-stories-from-amazon-workers-by-xenia-benivolski/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61798</id>
       +                <updated>2025-07-07T15:55:01Z</updated>
       +                <published>2025-07-09T11:34:09Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Amazon" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
       +                <summary type="html"><![CDATA[This is a brilliant idea for a short story collection. Gather a group of non-writers, all of whom have experienced the dystopia of working for Amazon, and support them to write speculative science fiction.  Given how futuristic Amazon is, perhaps they have a unique insight into what its future holds.  Or, as the rather academic intro puts it:  The Worker as Futurist project asks another question: …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/book-review-the-world-after-amazon-stories-from-amazon-workers-by-xenia-benivolski/"><![CDATA[
       +                                <html><head></head><body><p>This is a brilliant idea for a short story collection. Gather a group of non-writers, all of whom have experienced the dystopia of working for Amazon, and support them to write speculative science fiction.  Given how futuristic Amazon is, perhaps they have a unique insight into what its future holds.  Or, as the rather academic intro puts it:</p>
       +
       +<blockquote><p>The Worker as Futurist project asks another question: if SF is so important to the operations of capitalism in the twenty-first century, does it also have a radical potential that might lend itself to the struggles of workers and other oppressed people within, against and beyond that system? (see Jameson 2005; Roke 2020)</p></blockquote>
       +
       +<p>I'll be honest, it feels a <em>little</em> patronising.  The project articulates its theory of change (which only <em>slightly</em> puts me in mind of <a href="https://charles-harris.co.uk/2019/11/does-satire-work/">Peter Cook's famous quote</a>) - hoping that radical fiction might move mountains:</p>
       +
       +<blockquote><p>We at the Worker as Futurist project believe that workers can fruitfully understand, theorize, and plot forms of resistance to capitalism through creative expression, especially through the process of writing, particularly within the genre of SF. If, as we have argued, SF is now active in important ways at the very heart of capitalism, maybe that genre is also somehow the system’s achilles’ heel?</p></blockquote>
       +
       +<p>Still, it makes for a fascinating introduction to a somewhat uneven set of stories.  There is some delightfully weird fiction - I especially enjoyed the idea of the University of the Phoenix using AI to write curses on corporations. In amongst that there's some fairly standard stories of worker exploitation, a few overwritten pieces, and one or two which would make great full length books.</p>
       +
       +<p>The afterword is very clear about the reason for this book existing:</p>
       +
       +<blockquote><p>To me, it never mattered whether or not the stories written by the workers in this project would be considered “good” by the well-read literary elite. To me, it only mattered that those who took up the challenge wrote. And by writing, and by speaking their truths, they exploded the paradigm that would render their subjectivity nonexistent.</p></blockquote>
       +
       +<p>And I heartily agree with that. I'd rather read a new writer explore the problem-space rather than yet-another trilogy about romance magicians.</p>
       +
       +<p>The book is free to download or, if you think the master's tools can dismantle the master's house, you can purchase a copy on Amazon.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-after-amazon-stories-from-amazon-workers-by-xenia-benivolski/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-after-amazon-stories-from-amazon-workers-by-xenia-benivolski/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: Problems Have No Sex - Caroline Haslett (1949)]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-problems-have-no-sex-caroline-haslett-1949/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=58424</id>
       +                <updated>2025-07-06T21:40:44Z</updated>
       +                <published>2025-07-08T11:34:34Z</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[This is the best book on practical feminism that I&#039;ve read. Because it is long out of print, I had to get the British Library to pull this book out of the archives for me.    I&#039;m fascinated by the evolution of feminist discourse in 20th Century UK.  I read Myself When Young (1938) which is a series of mini-autobiographies of prominent women. One of them was Dame Caroline Haslett - an electrical…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/book-review-problems-have-no-sex-caroline-haslett-1949/"><![CDATA[
       +                                <html><head></head><body><p>This is the best book on <em>practical</em> feminism that I've read. Because it is long out of print, I had to get the British Library to pull this book out of the archives for me.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/Book-Cover.webp" alt="A blue book cover with a spine that reads Problems Have No Sex by Caroline Haslett.">
       +
       +<p>I'm fascinated by the evolution of feminist discourse in 20th Century UK.  I read <a href="https://shkspr.mobi/blog/2024/09/book-review-myself-when-young-1938/">Myself When Young</a> (1938) which is a series of mini-autobiographies of prominent women. One of them was Dame Caroline Haslett - an electrical engineer <a href="https://shkspr.mobi/blog/2024/05/book-review-the-doors-of-opportunity/">who led a long and fascinating life</a>. One of her crowning achievements was advocating the use electricity to relieve household drudgery. Technology as a tool of feminist liberation.</p>
       +
       +<p>As part of her battle for equality, she wrote a book called Problems Have No Sex. Sadly, there are no 2nd hand copies for sale, no scans, and very little written about it. There's <a href="https://eresources.nlb.gov.sg/newspapers/digitised/article/freepress19490623-1.2.33">one contemporary review</a> and that's about it.</p>
       +
       +<p>So I made a request to the British Library and, a few days later, sat down in their reading room with the dusty tome.</p>
       +
       +<p>All books writing from 2020 will be in the shadow of Covid19. This book, published in 1949, is written in the shadow of the atomic bomb. It starts with the terrifying realisation that a woman has the same physical capability as a man when it comes to pressing the button which drops a bomb. While men and women may have different levels of strength, technology is the great leveller.</p>
       +
       +<p>The influx of women into traditionally male environments allowed for a <em>practical</em> demonstration of feminism. It's all very well theorising that women are as capable as men but, as every engineer knows, you need to be able to prove it.</p>
       +
       +<blockquote><p>Sir Robert Watson Watt, the discoverer of radiolocation, speaking of the way in which women without previous experience in science had taken up this vital work, said: "The question I asked myself was, if these girls could reach such heights in the comparatively short period during which they had contact with physics, what would they have done with a decent education in technical, scientific and engineering studies?"</p>
       +
       +<p>It is evident, however, that in addition to the revision of the school syllabus there will need to be a change in the attitude held up to boys as the correct one to adopt towards girls and their capacities.</p>
       +
       +<p>There are signs that this is occurring spontaneously. A boy reproached by his father for being beaten in class by a "mere" girl, remarked thoughtfully, "You know, father, I don't think girls are so very mere nowadays."</p></blockquote>
       +
       +<p>The book spends a decent amount of space on pregnancy and its effects on women in the workplace. This was written pre-pill but in an era with <a href="https://shkspr.mobi/blog/2025/05/book-review-protective-practices-a-history-of-the-london-rubber-company-and-the-condom-business-by-jessica-borge/">relatively easy access to contraception</a>.  Haslett talks frankly about the realities of menstruation - which surprised me somewhat - and whether reproduction is compatible with employment (spoiler alert; yes).</p>
       +
       +<p>In amongst some slightly tedious legal matters of the day are some forthright pleas for cheaper electricity so that women can be released from manual labour at home. There's also the <em>realities</em> of what it means to place people in a radically upgraded situation. You can't expect anyone to suddenly know how to operate:</p>
       +
       +<blockquote><p>Women must see that the vast amount of talk which there has been about kitchen planning is translated into action and that properly planned kitchens are included in all the new houses built. In addition to the importance of good design and lay-out and the provision of proper equipment as a <i lang="la">sine qua non</i>, there is much scope for education of the housewife in planning her housework along labour-saving lines; and in the teaching of the principles of motion study in the home so that the maximum benefit can be gained from the use of the equipment provided.</p></blockquote>
       +
       +<p>Haslett is undoubtedly technocratic but, above all, she is realistic. She has an excellent and provable <a href="https://shkspr.mobi/blog/2025/01/book-review-rules-for-radicals-a-pragmatic-primer-for-realistic-radicals-by-saul-alinsky/">theory of change</a>. This isn't a rant nor a call to arms. She is calm, methodical and ruthlessly determined to set out the problems and solutions.</p>
       +
       +<blockquote><p>The sense of having  prove herself equal to a male colleague sometimes makes a woman self-assertive and over-aggressive; while the fear of loss of personal prestige or of social or economic insecurity arising from admitting women to full equality makes some men unco-operative and unjust towards women working outside the home. As Miss Hilda Martindale remarks in her book From One Generation to Another: "I found that opposition to working with women on equal terms seldom came from the man who was first class at his work; it was the man who was not sure of himself who objected."</p>
       +
       +<p>In manual as opposed to professional types of work the fear "If I show her how to do my job, the boss may sack me because he need not pay her so much" is a cogent argument for equal pay.</p></blockquote>
       +
       +<p>Equal pay is a battle which is still being fought, unfortunately.</p>
       +
       +<p>There is also just a <em>hint</em> of radical politics lurking under the sometimes-bland prose. Should tariffs be imposed? Are trade-barriers a good way to promote equality? Should women be more self-assured about entering politics and agitating for change?</p>
       +
       +<p>There's also an undercurrent of rage directed at the women who helped bring about the war.</p>
       +
       +<blockquote><p>The rise of Nazi Germany and Fascist Italy was made possible by the individual man delegating his personal responsibility to a Fuehrer or a Duce —and by the individual woman abandoning her responsibility towards mankind in general and devoting herself entirely and unquestioningly to child-bearing, and the routine work of the home. This wholesale shirking of individual responsibility was the one thing which made possible the creation of the Nazi system with its concomitants of the concentration camp, the mass crematorium and the battlefield.</p></blockquote>
       +
       +<p>Prophetically, she notes that the next 20 years should be one of the most interesting periods of history to live in. I'd certainly say that the change from 1949 to 1969 was just that!</p>
       +
       +<p>Unlike some other books, this is realistic about the timeframes involved in wholesale cultural change. She sets out how many years of vigilance will be needed to ensure that schools are equipping their female students with the knowledge, ambition, and advice to help them survive in the future.  Similar Government, which is lambasted as being far too slow, is shown as needing to embrace radical change. It should be remembered that Churchill, only recently deposed as Prime Minister, was an ardent anti-feminist. He <a href="https://archives.chu.cam.ac.uk/collections/research-guides/womens-suffrage-research-guide/#church">repeatedly stymied the attempts of women to gain the vote</a> - an attitude which is often conspicuously overlooked in the 21st century.  I imagine that left a bitter taste in the mouths of Haslett and her contemporaries.</p>
       +
       +<p>Women's organisations are also the recipient of Haslett's unsentimental gaze. They need to step up their game, raise more money, and set realistic goals. Similarly, women MPs must make sure not to concern themselves <em>only</em> with women's issues. And, for that matter, women have to stop lollygagging and start using their vote.  Finally, she sets out ways in which society has to guard against a backlash to feminism.</p>
       +
       +<p>There is a whole discussion about the structural ephemera which causes resentment. The slow build up of unjust laws and customs hurts everyone.</p>
       +
       +<p>Now, obviously, people are the product of their time. The book is strongly focused on the UK and isn't <em>too</em> dodgy on race. There's an occasional mention of the USA and a brief sceptical look at the USSR's claims of feminist equality.  She does go a little further. Here's a sample from the chapter "Citizens of the World":</p>
       +
       +<blockquote><p>Although in Great Britain and the United States women have achieved not only a considerable measure of “equality” but also a very considerable store of experience in the political, economic, and scientific fields: yet there are still countries where women have no rights at all.</p>
       +
       +<p>Just as different races have reached different stages of civilization so that the primitive tribes of New Guinea co-exist with the highly civilized European races; so different races have reached different stages in their attitude towards women. This latter difference bears no obvious relation to their general level of technical or cultural development. There may in fact be a much greater equality of contribution towards the common life (which is the fundamental basis of equality between the sexes) among some primitive races than among some very highly civilized ones.</p>
       +
       +<p>While these differences and inequalities persist, trained women will have a continuing obligation towards those who are striving to become politically articulate or who, by reason of the inferior status conferred upon them by their own community, are in danger of exploitation.</p>
       +
       +<p>It is necessary also to have a realistic appreciation of the differences that may underlie a superficial equality.</p>
       +
       +<p>The women of Japan were enfranchised almost simultaneously with the women of France, but the women of Switzerland still remain without voting rights.</p>
       +
       +<p>Yet to deduce from the equality of political rights conferred on the women of France and Japan alike that the women of these two countries possessed indeed comparable opportunities and status would be fantastic.</p>
       +
       +<p>The traditional Japanese woman, educated from birth to consider herself of no account and completely subservient to the men of her family, will need many years of education and opportunity before she is capable of political responsibility. To expect her to derive maximum advantage at the present time from her enfranchisement would be as logical as to suppose that a woman from the Middle Ages, could she be miraculously transported through time and placed in a modern labour-saving house, could be expected to know just what would happen if she turned certain knobs and switches; and to understand the part that electrical power plays in the modern community.</p>
       +
       +<p>The adoption of Western democratic machinery by nations of other cultural traditions implies that we have a continuing obligation to these peoples until education has made plain the fundamental principles underlying our way of life.</p>
       +
       +<p>Some of the Eastern nations are tackling their problems themselves with considerable energy. China with its great drive to stamp out illiteracy has done much to remove the burden of ignorance which has held that great country in economic thralldom for so long. It may well be that the imitative genius of Japan, which derived so much from the influence of China upon its art and culture in the past, will draw from Chinese sources more readily than from the West a new concept of the status of women in human society. The work of Mme. Chiang Kai Shek and her sisters may be the keystone of women’s emancipation in the East.</p>
       +
       +<p>In this age we are setting up the pattern for life of succeeding generations. Women must see that the mistakes which our own nations made in their development are not through ignorance or greed perpetuated in other lands.</p></blockquote>
       +
       +<p>She is curiously circumspect on the issue of disability. Post-war, I imagine many people wanted to ignore the horrors which rent bodies asunder. The only mention is:</p>
       +
       +<blockquote><p>Yet even in Britain a very great number of people lead unnecessarily cramped and limited lives, and the social conscience of the country is awakening to their needs. It is being recognized, for example, that it is not sufficient to give disabled people a weekly pension to keep them from actual hunger or to provide institutions in which they can be housed. The disabled person has as much right to a full and useful life, within the limits of his or her disability, as anyone else.</p></blockquote>
       +
       +<p>Ultimately, this book is about what we owe to each other. Women won the war, then they rightly demanded to win the benefits of peace.</p>
       +
       +<p>"Problems Have No Sex" is <em>far</em> better than many other feminist books I've read simply because of its lack of academic pretentiousness.  Other than the occasional Latin phrase, the book is written in plain English - designed to be read and understood as widely as possible. As an engineer, Dame Haslett has an engineer's approach to problem solving - identify the issue, determine the cause, suggest solutions, investigate what works and what doesn't, repeat until fixed.</p>
       +
       +<p>Every feminist should read this book. I'm annoyed that it has never been reprinted and that there's no eBook available. Under UK copyright, it should enter the public domain in 2028.  Hopefully a scan will be released which will allow everyone to read this important work.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-problems-have-no-sex-caroline-haslett-1949/#comments" thr:count="1" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/book-review-problems-have-no-sex-caroline-haslett-1949/feed/atom/" thr:count="1" />
       +                        <thr:total>1</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Grinding down open source maintainers with AI]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61265</id>
       +                <updated>2025-07-02T16:34:08Z</updated>
       +                <published>2025-07-07T11:34:09Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="AI" /><category scheme="https://shkspr.mobi/blog" term="git" /><category scheme="https://shkspr.mobi/blog" term="LLM" /><category scheme="https://shkspr.mobi/blog" term="spam" />
       +                <summary type="html"><![CDATA[Early one morning I received an email notification about a bug report to one of my open source projects. I like to be helpful and I want people who use my stuff to have a good time, so I gave it my attention.  Here&#039;s what it said:   😱 I Can&#039;t Use On This Day 😭 Seriously, What’s Going On?! 🔍 I’ve been trying to use the On This Day feature, but it’s just not working for me! 😩 Every time I input my d…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/"><![CDATA[
       +                                <html><head></head><body><p>Early one morning I received an email notification about a bug report to one of my open source projects. I like to be helpful and I want people who use my stuff to have a good time, so I gave it my attention.  Here's what it said:</p>
       +
       +<blockquote>
       +<h2 id="%f0%9f%98%b1-i-cant-use-on-this-day-%f0%9f%98%ad"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#%f0%9f%98%b1-i-cant-use-on-this-day-%f0%9f%98%ad" class="heading-link"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f631.png" alt="😱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> I Can't Use On This Day <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f62d.png" alt="😭" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h2>
       +Seriously, What’s Going On?! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +I’ve been trying to use the On This Day feature, but it’s just not working for me! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f629.png" alt="😩" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +Every time I input my details, it says I have no posts for today, even though I know I’ve posted stuff! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f9d0.png" alt="🧐" class="wp-smiley" style="height: 1em; max-height: 1em;" />
       +
       +<h3 id="heres-my-setup-%e2%9a%99%ef%b8%8f"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#heres-my-setup-%e2%9a%99%ef%b8%8f" class="heading-link">Here’s My Setup: <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h3>
       +
       +<ul>
       +        <li>Python 3.x <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f40d.png" alt="🐍" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
       +    <li>Access token fully generated (I triple-checked!) <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f511.png" alt="🔑" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
       +        <li>Attempted on multiple instances but still nothing! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f629.png" alt="😩" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f629.png" alt="😩" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
       +</ul>
       +
       +<h3 id="could-it-be-a-bug-%f0%9f%a4%94"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#could-it-be-a-bug-%f0%9f%a4%94" class="heading-link">Could It Be a Bug? <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h3>
       +
       +I’m really starting to doubt my posting history! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f633.png" alt="😳" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +Is it supposed to show only specific types of posts?<br>
       +I’ve made some pretty epic posts before! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4a5.png" alt="💥" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4ac.png" alt="💬" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +
       +<h3 id="documentation-confusion-%f0%9f%93%9a"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#documentation-confusion-%f0%9f%93%9a" class="heading-link">Documentation Confusion <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h3>
       +
       +The README says to register for an access token but doesn’t clarify if it factors into this feature! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f914.png" alt="🤔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2753.png" alt="❓" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +Did I miss something REALLY important?!<br>
       +Help me figure this out, please!!! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f631.png" alt="😱" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +
       +<h3 id="feature-suggestion-%f0%9f%92%ad"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#feature-suggestion-%f0%9f%92%ad" class="heading-link">Feature Suggestion <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4ad.png" alt="💭" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h3>
       +
       +If this is broken, can we at least have a debug mode to log what’s happening! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f62c.png" alt="😬" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +I need to know if it’s truly my fault or the code’s! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +Thanks for looking into this TRAGIC situation!!! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f62d.png" alt="😭" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f494.png" alt="💔" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +<br>
       +P.S. My friends ARE posting on this day and their instances work!! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f624.png" alt="😤" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +I feel so left out!! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f61f.png" alt="😟" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>
       +Let’s get this sorted ASAP! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" />
       +</blockquote>
       +
       +<p>OK, that's a <em>lot</em> of Emoji - too much even for me! But if one of my users needs help, I'm there for them!  As the feature works for me, I decided I'd ask for the output of the app. Maybe there'd be a clue in the minimal debugging output it had.</p>
       +
       +<p>I clicked on the link to the Codeberg repository and was hit be a 404! What? I clicked on the link to the user "simpleseaport2" but that was also broken.</p>
       +
       +<p>"Seriously, What’s Going On?! <img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" />"</p>
       +
       +<p>It looks like Codeberg has been hit by a wave of spam bug reports.  I read through the bug report again, slightly more awake, and saw just how content free it was. Yes, it is superficially well structured, the Emoji are a bit over-the-top but not the worst I've seen, and the emotional manipulation is quite insidious.</p>
       +
       +<p>A few weeks later, I got a bug report to a different repo. This one was also deleted before I could reply to it, see if you can spot that it is AI generated:</p>
       +
       +<blockquote><p>I've been trying to use the Threads tool to visualize some conversations but I'm running into a serious problem, and it's really frustrating!
       +</p><p>When I input the URL for a post with a substantial number of replies, the script seems to hang indefinitely. I've waited more than 15 minutes on a couple of occasions, and nothing seems to happen. This is not what I expected, especially since the README mentions large conversations may take a long time, but doesn’t specify any limits or give guidance on what users should do if it doesn’t respond at all!
       +</p><p>It's unclear what's actually happening here. Is the script failing silently? Is it the API timing out? Why isn’t there any sort of progress notification built into the tool? It feels like a complete dead end.
       +</p><p>Can you please add some kind of error handling or logging feature to the Threads script? It would be helpful if it could at least inform the user when a timeout occurs or if the API response is simply taking too long. Additionally, could you clarify the maximum number of replies that can be handled? It’s really inconvenient to have no idea if the script is still processing or if it’s just broken.
       +</p><p>Thanks for addressing this. I hope to see improvements soon.</p></blockquote>
       +
       +<ul>
       +<li>The emotional manipulation starts in the first line - telling me how frustrated the user is.</li>
       +<li>It turns the blame on me for providing poor guidance.</li>
       +<li>Then the criticism of the tool.</li>
       +<li>Next, a request that I do work.</li>
       +<li>Finally some more emotional baggage for me to carry.</li>
       +</ul>
       +
       +<p>I'm not alone in getting these - <a href="https://merveilles.town/@raboof/114589918314200123">other people have also received similar spam</a></p>
       +
       +<p>To be fair to Codeberg, they are under attack and are trying to stop these specious complaints reaching maintainers.</p>
       +
       +<blockquote class="mastodon-embed" data-embed-url="https://social.anoxinon.de/@Codeberg/114592518436361178/embed" style="background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;"> <a href="https://social.anoxinon.de/@Codeberg/114592518436361178" target="_blank" style="align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32" viewBox="0 0 79 75"><path d="M74.7135 16.6043C73.6199 8.54587 66.5351 2.19527 58.1366 0.964691C56.7196 0.756754 51.351 0 38.9148 0H38.822C26.3824 0 23.7135 0.756754 22.2966 0.964691C14.1319 2.16118 6.67571 7.86752 4.86669 16.0214C3.99657 20.0369 3.90371 24.4888 4.06535 28.5726C4.29578 34.4289 4.34049 40.275 4.877 46.1075C5.24791 49.9817 5.89495 53.8251 6.81328 57.6088C8.53288 64.5968 15.4938 70.4122 22.3138 72.7848C29.6155 75.259 37.468 75.6697 44.9919 73.971C45.8196 73.7801 46.6381 73.5586 47.4475 73.3063C49.2737 72.7302 51.4164 72.086 52.9915 70.9542C53.0131 70.9384 53.0308 70.9178 53.0433 70.8942C53.0558 70.8706 53.0628 70.8445 53.0637 70.8179V65.1661C53.0634 65.1412 53.0574 65.1167 53.0462 65.0944C53.035 65.0721 53.0189 65.0525 52.9992 65.0371C52.9794 65.0218 52.9564 65.011 52.9318 65.0056C52.9073 65.0002 52.8819 65.0003 52.8574 65.0059C48.0369 66.1472 43.0971 66.7193 38.141 66.7103C29.6118 66.7103 27.3178 62.6981 26.6609 61.0278C26.1329 59.5842 25.7976 58.0784 25.6636 56.5486C25.6622 56.5229 25.667 56.4973 25.6775 56.4738C25.688 56.4502 25.7039 56.4295 25.724 56.4132C25.7441 56.397 25.7678 56.3856 25.7931 56.3801C25.8185 56.3746 25.8448 56.3751 25.8699 56.3816C30.6101 57.5151 35.4693 58.0873 40.3455 58.086C41.5183 58.086 42.6876 58.086 43.8604 58.0553C48.7647 57.919 53.9339 57.6701 58.7591 56.7361C58.8794 56.7123 58.9998 56.6918 59.103 56.6611C66.7139 55.2124 73.9569 50.665 74.6929 39.1501C74.7204 38.6967 74.7892 34.4016 74.7892 33.9312C74.7926 32.3325 75.3085 22.5901 74.7135 16.6043ZM62.9996 45.3371H54.9966V25.9069C54.9966 21.8163 53.277 19.7302 49.7793 19.7302C45.9343 19.7302 44.0083 22.1981 44.0083 27.0727V37.7082H36.0534V27.0727C36.0534 22.1981 34.124 19.7302 30.279 19.7302C26.8019 19.7302 25.0651 21.8163 25.0617 25.9069V45.3371H17.0656V25.3172C17.0656 21.2266 18.1191 17.9769 20.2262 15.568C22.3998 13.1648 25.2509 11.9308 28.7898 11.9308C32.8859 11.9308 35.9812 13.492 38.0447 16.6111L40.036 19.9245L42.0308 16.6111C44.0943 13.492 47.1896 11.9308 51.2788 11.9308C54.8143 11.9308 57.6654 13.1648 59.8459 15.568C61.9529 17.9746 63.0065 21.2243 63.0065 25.3172L62.9996 45.3371Z" fill="currentColor"></path></svg> <div style="color: #787588; margin-top: 16px;">Post by @Codeberg@social.anoxinon.de</div> <div style="font-weight: 500;">View on Mastodon</div> </a> </blockquote>
       +
       +<script data-allowed-prefixes="https://social.anoxinon.de/" async="" src="https://social.anoxinon.de/embed.js"></script>
       +
       +<p>But, still, search the socials and you'll find a stream of frustrated developers.</p>
       +
       +<blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:i7qrqashiejmsuo4hbvovw6l/app.bsky.feed.post/3lnkpto5rpdd2" data-bluesky-cid="bafyreigm2vqlybmy5dhawigjqzwhz2p2w3o4gatpykxkurwrzzmtbfif6a" data-bluesky-embed-color-mode="system"><p lang="en">Woke this morning to my first ever AI generated spam issue on a repo. Got it via email. When I went to check it out at Codeberg, it had already been moderated. Wonder how many others were affected.
       +
       +I immediately knew it was AI spam due to the overuse of emojis…<img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br><br><a href="https://bsky.app/profile/did:plc:i7qrqashiejmsuo4hbvovw6l/post/3lnkpto5rpdd2?ref_src=embed">[image or embed]</a></p>— Jeff Sikes (<a href="https://bsky.app/profile/did:plc:i7qrqashiejmsuo4hbvovw6l?ref_src=embed">@bsky.box464.social</a>) <a href="https://bsky.app/profile/did:plc:i7qrqashiejmsuo4hbvovw6l/post/3lnkpto5rpdd2?ref_src=embed">24 April 2025 at 15:07</a></blockquote>
       +
       +<script async="" src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>
       +
       +<h2 id="whats-going-on%e2%81%89%ef%b8%8f"><a href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#whats-going-on%e2%81%89%ef%b8%8f" class="heading-link">What's Going On<img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2049.png" alt="⁉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></a></h2>
       +
       +<p>I can only think of a few possibilities - none of them particularly positive.</p>
       +
       +<ul>
       +<li>Attacking the viability of CodeBerg - make users abandon it for a different platform.</li>
       +<li>Attacking the attention of developers - make them unwilling to give attention where it is actually needed.</li>
       +<li>Attacking the integrity of users - make them less likely to receive help because they are mistaken for AI.</li>
       +<li>Maybe it is just a bored kid or an unethical researcher. Trying to find the limits of what a maintainer will recognise as spam?</li>
       +</ul>
       +
       +<p>Either way, AI bug reports like this are about as welcome as a haemorrhage in a jacuzzi.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/#comments" thr:count="2" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/grinding-down-open-source-maintainers-with-ai/feed/atom/" thr:count="2" />
       +                        <thr:total>2</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Get the location of the ISS using DNS]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61693</id>
       +                <updated>2025-07-06T07:51:14Z</updated>
       +                <published>2025-07-06T11:34:33Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="dns" /><category scheme="https://shkspr.mobi/blog" term="internet" /><category scheme="https://shkspr.mobi/blog" term="trivia" />
       +                <summary type="html"><![CDATA[I love DNS esoterica. Weird little things that you can shove in the global directory to be distributed around the world instantly(ish).  Domain names, like www.example.com usually resolve to servers. As much as we think of &#34;the cloud&#34; as being some intangible morass of ethereal Turing-machines floating in probability space, the more prosaic reality is that they&#039;re just boxen in data centres. They …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/"><![CDATA[
       +                                <html><head></head><body><p>I love DNS esoterica. Weird little things that you can shove in the global directory to be distributed around the world instantly(ish).</p>
       +
       +<p>Domain names, like <code>www.example.com</code> usually resolve to servers. As much as we think of "the cloud" as being some intangible morass of ethereal Turing-machines floating in probability space, the more prosaic reality is that they're just boxen in data centres. They have a physical location.</p>
       +
       +<p>Got a tricky machine which is playing silly-buggers? Wouldn't it be nice to know exactly where it is? That way you can visit and give it some <a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/PercussiveMaintenance">percussive maintenance</a>.</p>
       +
       +<p>Enter the DNS LOC record!</p>
       +
       +<p>The snappily titled <a href="https://www.rfc-editor.org/rfc/rfc1876.html">RFC 1876</a> is an <em>experimental</em> standard. It allows you to create a DNS record which specifies the latitude and longitude of your server. Of course, some data-centres are very tall and some are underground. So it also contains an altitude parameter.</p>
       +
       +<p>The standard allows for a minimum altitude of -100,000 metres - deep enough for any bunker! The maximum altitude is 42,849,672 metres which is high enough to allow it to be used on <a href="https://www.esa.int/Enabling_Support/Space_Transportation/Types_of_orbits#GEO">satellites in geostationary orbit</a>.</p>
       +
       +<p>So, as a bit of fun, I decided to create <code>where-is-the-iss.dedyn.io</code></p>
       +
       +<p>It isn't a website. You can't ping it. There's no way to interact with it <em>except</em> by using DNS.  Yup! You can use a DNS query to get the (approximate) location of the International Space Station!</p>
       +
       +<p>Linux and Mac users<sup id="fnref:win"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fn:win" class="footnote-ref" title="I don't think there's a way for Windows users to look up LOC records using PowerShell or the Command Prompt." role="doc-noteref">0</a></sup> can run:</p>
       +
       +<p><code>dig where-is-the-iss.dedyn.io LOC</code></p>
       +
       +<p>And receive back the latest position of the ISS:</p>
       +
       +<pre><code class="language-_">;; ANSWER SECTION:
       +where-is-the-iss.dedyn.io. 1066 IN  LOC 47 24 53.500 N 66 12 12.070 W 430520m 10000m 10000m 10000m
       +</code></pre>
       +
       +<p>The DNS records are updated every 15 minutes on a best-effort basis<sup id="fnref:nasa"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fn:nasa" class="footnote-ref" title="Look, I'm not NASA, OK? If you're using this to help you dock then I cannot be held responsible." role="doc-noteref">1</a></sup>.</p>
       +
       +<h2 id="how"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#how" class="heading-link">How</a></h2>
       +
       +<p>The lovely people at <a href="https://www.n2yo.com">N2YO</a> have a website which allows you to track <em>loads</em> of objects in orbit.  They also have an <a href="https://www.n2yo.com/api/">easy to use API</a> with a generous free tier.</p>
       +
       +<p>Calling <code>https://api.n2yo.com/rest/v1/satellite/positions/25544/0/0/0/1/&amp;apiKey=_____</code> gets back the latest position:</p>
       +
       +<pre><code class="language-json">{
       +    "info": {
       +        "satname": "SPACE STATION",
       +        "satid": 25544,
       +        "transactionscount": 7
       +    },
       +    "positions": [
       +        {
       +            "satlatitude": -21.25409321,
       +            "satlongitude": 140.3335763,
       +            "sataltitude": 420.09,
       +            "azimuth": 292.92,
       +            "elevation": -70.95,
       +            "ra": 202.69300845,
       +            "dec": -32.16097472,
       +            "timestamp": 1751366048,
       +            "eclipsed": true
       +        }
       +    ]
       +}
       +</code></pre>
       +
       +<p>Note that the altitude is in Km, whereas the LOC format requires m.</p>
       +
       +<p>The latitude and longitude are in decimal format - they need to be converted to Degrees, Minutes, and Seconds.</p>
       +
       +<p>There were only a few free domain name providers who offer an API for updating LOC records.  I went for <a href="https://desec.io/">deSEC</a> a charity from Berlin. They have <a href="https://desec.readthedocs.io/en/latest/">comprehensive API documentation</a>.</p>
       +
       +<p>Adding the initial LOC record is done with:</p>
       +
       +<pre><code class="language-bash">curl https://desec.io/api/v1/domains/where-is-the-iss.dedyn.io/rrsets/ \
       +    --header "Authorization: Token _______" \
       +    --header "Content-Type: application/json" --data @- &lt;&lt;&lt; \
       +    '{"type": "LOC", "records": ["40 16 25.712 S 29 32 36.243 W 427550m 0.00m 10000m 10m"], "ttl": 900}'
       +</code></pre>
       +
       +<p>However, updating the record is a little trickier. it needs to be sent as an <a href="https://desec.readthedocs.io/en/latest/dns/rrsets.html#modifying-an-rrset">HTTP PATCH</a> to a subtly different URl. The PATCH only needs to send the data which have changed.</p>
       +
       +<pre><code class="language-bash">curl -X PATCH https://desec.io/api/v1/domains/where-is-the-iss.dedyn.io/rrsets/@/LOC/ \
       +    --header "Authorization: Token _______" \
       +    --header "Content-Type: application/json" --data @- &lt;&lt;&lt; \
       +    '{"records": ["40 16 25.712 S 29 32 36.243 W 427550m 0.00m 10000m 10m"]}'
       +</code></pre>
       +
       +<p>I set the <a href="https://ttl-calc.com/">Time To Live</a> at 900 seconds. Every 15 minutes my code runs to update the record<sup id="fnref:api"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fn:api" class="footnote-ref" title="I suppose you could build an API with unlimited request limits by distributing data via DNS TXT records. Would best suit static or infrequently updating data. Push it once to DNS and let everyone…" role="doc-noteref">2</a></sup>. That keeps me well within the API limits for both services.  I could add TXT records showing when it was last updated, or other sorts of unstructured data, but I think this is enough for a quick proof-of-concept.</p>
       +
       +<p>There you have it! A complex and silly way to demonstrate how DNS can be used to hold the most unlikely of records<sup id="fnref:naptr"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fn:naptr" class="footnote-ref" title="See if you can find the other interesting record I've added to DNS!" role="doc-noteref">3</a></sup>.  Say, I wonder how you'd represent the co-ordinates of the Mars Rover…?</p>
       +
       +<h2 id="further-reading"><a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#further-reading" class="heading-link">Further Reading</a></h2>
       +
       +<p>For more DNS weirdness, please see my other posts:</p>
       +
       +<ul>
       +<li><a href="https://shkspr.mobi/blog/2022/08/dns-esoterica-bimi-svg-in-dns-txt-wtf/">BIMI - SVG in DNS TXT WTF?!</a></li>
       +<li><a href="https://shkspr.mobi/blog/2022/07/dns-esoterica-why-you-cant-dig-switzerland/">Why you can't dig Switzerland</a></li>
       +</ul>
       +
       +<div class="footnotes" role="doc-endnotes">
       +<hr>
       +<ol start="0">
       +
       +<li id="fn:win" role="doc-endnote">
       +<p>I don't think there's a way for Windows users to look up LOC records using PowerShell or the Command Prompt.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fnref:win" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:nasa" role="doc-endnote">
       +<p>Look, I'm not NASA, OK? If you're using this to help you dock then I cannot be held responsible.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fnref:nasa" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:api" role="doc-endnote">
       +<p>I suppose you could build an API with unlimited request limits by distributing data via DNS TXT records. Would best suit static or infrequently updating data. Push it once to DNS and let everyone query it semi-locally.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fnref:api" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:naptr" role="doc-endnote">
       +<p>See if you can find the other interesting record I've added to DNS!&nbsp;<a href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#fnref:naptr" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +</ol>
       +</div>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/#comments" thr:count="11" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/get-the-location-of-the-iss-using-dns/feed/atom/" thr:count="11" />
       +                        <thr:total>11</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: The Department of Rare Books and Special Collections - Eva Jurczyk ★☆☆☆☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-department-of-rare-books-and-special-collections-eva-jurczyk/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61430</id>
       +                <updated>2025-07-01T09:16:33Z</updated>
       +                <published>2025-07-05T11:34:47Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
       +                <summary type="html"><![CDATA[I did not care for this book at all. It is a dreary crime novel where - shock! horror! - someone has stolen a book. And, yes, it is the obvious suspect.  Much like The Martian Contingency I found the lead character profoundly irritating. A miserable protagonist who is completely ineffectual and refuses to take even the most minor of actions.  Her self-loathing drips off the page and smothers any…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/book-review-the-department-of-rare-books-and-special-collections-eva-jurczyk/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/9781728246598_1.webp" alt="Book cover." width="200" class="alignleft size-full wp-image-61431">I did not care for this book at all. It is a dreary crime novel where - shock! horror! - someone has stolen a book. And, yes, it is the obvious suspect.</p>
       +
       +<p>Much like <a href="https://shkspr.mobi/blog/2025/06/book-review-the-martian-contingency-by-mary-robinette-kowal/">The Martian Contingency</a> I found the lead character profoundly irritating. A miserable protagonist who is completely ineffectual and refuses to take even the most minor of actions.  Her self-loathing drips off the page and smothers any character development.</p>
       +
       +<p>At various points she's "Ashamed, embarrassed, disgusted with herself" or regards anything she does as "the useless action of a helpless woman" and reflects that "She had never been beautiful." It is a chore to be inside her head. I don't expect to empathise with every literary protagonist, but there's hardly anything about this woman which isn't driven by her neuroses - it felt like I was an unwilling voyeur in a psychotherapy session.</p>
       +
       +<p>The prose was plodding and there are some excruciating attempts at exposition. After the whodunnit is revealed (literally the only person who it could be) the book inexplicably carries on for a few more chapters.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-department-of-rare-books-and-special-collections-eva-jurczyk/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/book-review-the-department-of-rare-books-and-special-collections-eva-jurczyk/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Making My Own Hacktoberfest T-Shirts]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61656</id>
       +                <updated>2025-07-04T11:29:23Z</updated>
       +                <published>2025-07-04T11:34:54Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="hacking" /><category scheme="https://shkspr.mobi/blog" term="Hacktoberfest" /><category scheme="https://shkspr.mobi/blog" term="t-shirt" />
       +                <summary type="html"><![CDATA[Between 2014 and 2022, DigitalOcean sent free t-shirts to developers who completed the Hacktoberfest challenge.  For entirely sensible reasons related to sustainability and spammy entrants, they stopped doing physical merchandise in 2023.  I&#039;m the sort of hip fashionista who only wears free conference t-shirts.  GDS@GDSTeamWe support open source. And we’ve got the t-shirts to prove it (thanks @…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/"><![CDATA[
       +                                <html><head></head><body><p>Between 2014 and 2022, DigitalOcean sent free t-shirts to developers who completed the Hacktoberfest challenge.  For entirely sensible reasons related to sustainability and spammy entrants, they stopped doing physical merchandise in 2023.</p>
       +
       +<p>I'm the sort of hip fashionista who <em>only</em> wears free conference t-shirts.</p>
       +
       +<blockquote class="social-embed" id="social-embed-958377102641893376" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/GDSTeam" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRt4BAABXRUJQVlA4INIBAADQCACdASowADAAPrVKn0snJCMhpzgO2OAWiWwAtGOAQADeTUO3VAHt3+mUAa8vVV0OeXOkLkf2mNAwlnwjfbQGeO/oPw0QIE22U14pwqAAAP7tg4IpPv/wQXUHnW8H/7dn/+yAf/ZAP6fcAEAEOr0lN3rLmM+Wk1up6N+kazcl/Abt270AvZTfvE6X1RSsD+z5eBziALv0ORrElnCWCSLc6vPOi3N5FglKAuXQAJ/1e1jT7ZJM4RrWz4wEgm4/y4wDKMv0sEtbYY0anAWPE2MDs7mHpT6aRffkb7fchUdIQ3jUKmSMNXCJ5o6681y5TBHnnbV5MuKUg5//65SApSbC5xnIWFGYATe4t3TsrQRe8zzxFYDXFFpX6Z90BYKkAYpsqlqtMeyJTJqLPbTBIuzYxyyMvxuGyHGOuHzWDB7rPST6uWBuJuV8Asv2q4bplPml3lZ8bIVgydoxCMzGFbGNa1OfWD0c2gA7kXc+vylSPJ8Z04z4qBxi8CWMAfBjarrwQEL2pXq2Jaoy+Z/MoO9geakW1YK9F5+Dth7nHl/mf0o5q3iaS3GWQ2jofNMmfSosmGpxfQYRuDp+kWt3nKiMR93BZNVqULfhgV1+FkmTyAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">GDS</p>@GDSTeam</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">We support open source. And we’ve got the t-shirts to prove it (thanks <a href="https://twitter.com/github">@github</a> <a href="https://twitter.com/digitalocean">@digitalocean</a>). GDS took part in <a href="https://twitter.com/hashtag/Hacktoberfest">#Hacktoberfest</a> this year, contributing to open source projects as part of a global community <a href="https://hacktoberfest.digitalocean.com/">hacktoberfest.digitalocean.com</a> <a href="https://x.com/gdsteam/status/958377102641893376/photo/1">pic.x.com/AkM09LGono</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/DUzWotoW0AAFMmK.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="Terence, Andrea and Anna wearing Hacktoberfest t-shirts" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/GDSTeam/status/958377102641893376"><span aria-label="24 likes" class="social-embed-meta"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2764.png" alt="❤" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 24</span><span aria-label="3 replies" class="social-embed-meta"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f4ac.png" alt="💬" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 3</span><span aria-label="0 reposts" class="social-embed-meta"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/1f501.png" alt="🔁" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 0</span><time datetime="2018-01-30T16:31:21.000Z" itemprop="datePublished">16:31 - Tue 30 January 2018</time></a></footer></blockquote>
       +
       +<p>Sadly, after several years of constant catwalk modelling, my beloved Hacktoberfest shirts are full of holes. I couldn't find any for sale on eBay or Vinted - so I decided to make my own.</p>
       +
       +<p>Note: <a href="https://github.com/Hacktoberfest/hacktoberfest-2022/blob/main/src/assets/brand-guidelines.pdf">DigitalOcean's Brand Guidelines</a> say that you shouldn't create physical merchandise or sell any products featuring the logo. Well, I'm not selling these nor, do I think, they are merchandise. Hacktoberfest aren't using these to incentivise anyone any more. They're just cool t-shirts.</p>
       +
       +<h2 id="the-logos"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#the-logos" class="heading-link">The Logos</a></h2>
       +
       +<p>There are <a href="https://dev.to/fernandezbaptiste/last-10-years-of-hacktoberfest-merch-a-journey-through-time-8od">lots of photos of the t-shirts</a> but it is surprisingly hard to find the original assets.</p>
       +
       +<h3 id="low-resolution"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#low-resolution" class="heading-link">Low Resolution</a></h3>
       +
       +<p>Kotis - a design agency - did the Hacktoberfest swag from 2015-2020.  They have a <a href="https://go.kotisdesign.com/portfolio/digital-ocean-hacktoberfest/">brand portfolio</a> with the t-shirt icons. Sadly, all a bit low resolution for printing, but good for getting accurate background colours for the material.</p>
       +
       +<ul>
       +<li>2020 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-18.png" alt=""></li>
       +<li>2019 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-19.png" alt=""></li>
       +<li>2018 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-20.png" alt=""></li>
       +<li>2017 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-21.png" alt=""></li>
       +<li>2016 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-22.png" alt=""></li>
       +<li>2015 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-23.png" alt=""></li>
       +</ul>
       +
       +<p>Similarly, there are a few low resolution promo shots of the t-shirts or their logos:</p>
       +
       +<ul>
       +<li><a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2f1eggqi7zgs0cj38j2p.jpg">2022</a> (back of t-shirt)</li>
       +<li><a href="https://user-images.githubusercontent.com/99407553/194741467-af241be9-e0df-4f43-88a8-9236a253a555.jpg">2021</a> (t-shirt)</li>
       +<li><a href="https://cerealtree.wordpress.com/wp-content/uploads/2016/11/hacktober.png">2016</a> (more accurate colours)</li>
       +<li><a href="https://github.blog/wp-content/uploads/2015/09/d13f20be-66f9-11e5-8478-992126efc469.png">2015</a> (logo)</li>
       +<li><a href="https://hacktoberfesthowto.github.io/images/2014Logo.webp">2014</a> (logo)</li>
       +</ul>
       +
       +<p>AI upscaling looked typically rubbish.</p>
       +
       +<h3 id="higher-resolution-bitmaps"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#higher-resolution-bitmaps" class="heading-link">Higher Resolution Bitmaps</a></h3>
       +
       +<p>Some designers have their logo designs on Dribbble. Not <em>very</em> high resolution, but good enough for stickers.</p>
       +
       +<ul>
       +<li><a href="https://dribbble.com/shots/8192199-Hacktoberfest-2019-logo">2019</a></li>
       +<li><a href="https://dribbble.com/shots/5333694-Hacktoberfest-2018">2018</a></li>
       +<li><a href="https://dribbble.com/shots/3814307-Hactoberfest-2017">2017</a></li>
       +<li><a href="https://dribbble.com/shots/2988111-Hactoberfest-2016">2016</a></li>
       +</ul>
       +
       +<h3 id="archived-logos"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#archived-logos" class="heading-link">Archived Logos</a></h3>
       +
       +<p>The official Hacktoberfest website had some logos embedded on it:</p>
       +
       +<ul>
       +<li><a href="https://web.archive.org/web/20221001041836/https://hacktoberfest.com/">2022</a> (SVG logo)</li>
       +<li><a href="https://web.archive.org/web/20190930141101im_/https://hacktoberfest.digitalocean.com/assets/logo-hf19-full-10f3c000cea930c76acc1dedc516ea7118b95353220869a3051848e45ff1d656.svg">2019</a> (SVG)</li>
       +<li><a href="https://web.archive.org/web/20181001075142if_/https://hacktoberfest.digitalocean.com/assets/logo-hacktoberfest-658b5aa2bd34e782d29c40bf6afbdff00f20fe1328efa6da17743878ba8db66f.png">2018</a> (PNG with transparent background)</li>
       +<li><a href="https://web.archive.org/web/20170913052813/https://hacktoberfest.digitalocean.com/">2017</a> (SVG)</li>
       +</ul>
       +
       +<h2 id="best-of-the-bunch"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#best-of-the-bunch" class="heading-link">Best of the bunch</a></h2>
       +
       +<p>These are the best available logos. The SVGs are suitable for printing at any size, the PNGs may be harder.</p>
       +
       +<ul>
       +<li><a href="https://static.wikia.nocookie.net/logopedia/images/7/7f/Hacktoberfest_icon_2022.svg">2022</a> (SVG logo)</li>
       +<li><a href="https://github.com/Hacktoberfest/hacktoberfest-2020/blob/master/app/assets/images/HF-full-logo.svg">2020</a> (SVG)</li>
       +<li><a href="//web.archive.org/web/20190930141101im_/https://hacktoberfest.digitalocean.com/assets/logo-hf19-full-10f3c000cea930c76acc1dedc516ea7118b95353220869a3051848e45ff1d656.svg">2019</a> (SVG)</li>
       +<li><a href="https://hacktoberfesthowto.github.io/images/2018Logo.webp">2018</a> (WebP 1155x898)</li>
       +<li><a href="//web.archive.org/web/20170913052813/https://hacktoberfest.digitalocean.com/">2017</a> (SVG embedded in page)</li>
       +<li><a href="//web.archive.org/web/20161022114022im_/https://hacktoberfest.digitalocean.com/assets/h-ceffbf9c09a918a4eda57f3a80f70e71b778ae233ece6f0ce41105316ddd3a64.svg">2016</a> (SVG)</li>
       +</ul>
       +
       +<h2 id="missing"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#missing" class="heading-link">Missing</a></h2>
       +
       +<p>The following are missing  2014, 2015, 2021, 2022 (comic).  There are photos of the shirts, and some low-resolution artwork available, all of which are too low quality to be printed.  If you know how to get high-resolution images of them - please leave a comment!</p>
       +
       +<h3 id="2021"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#2021" class="heading-link">2021</a></h3>
       +
       +<p>There are <em>some</em> elements out there. For example:</p>
       +
       +<ul>
       +<li><a href="https://www.behance.net/gallery/128630281/HacktoberFest-2021">This Behance profile of Hacktoberfest 2021</a></li>
       +<li><a href="https://web.archive.org/web/20210930065625im_/https://hacktoberfest.digitalocean.com/_nuxt/img/logo-hacktoberfest-full.f42e3b1.svg">The official logo</a></li>
       +<li><a href="https://web.archive.org/web/20210928150155im_/https://hacktoberfest.digitalocean.com/_nuxt/img/logo-hacktoberfest-full2.aa1e9d9.svg">The logo with the t-shirt colour scheme</a></li>
       +<li><a href="https://web.archive.org/web/20210928150151/https://hacktoberfest.digitalocean.com/brandguidelines">The brand guidelines</a> for more accurate colour reproduction.</li>
       +</ul>
       +
       +<h3 id="2014"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#2014" class="heading-link">2014</a></h3>
       +
       +<p>There's not much available about the first t-shirt. There's a <a href="https://hacktoberfesthowto.github.io/images/2014Logo.webp">version of the logo used</a> and <a href="https://community.nodebb.org/topic/2948/digital-ocean-free-t-shirts">some photos</a> but that's about it.</p>
       +
       +<h2 id="photos-of-t-shirts"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#photos-of-t-shirts" class="heading-link">Photos of T-Shirts</a></h2>
       +
       +<p>If you want to compare the logos to the originals, and see what colour fabric they used, there are lots of photo online:</p>
       +
       +<ul>
       +<li><a href="https://www.reddit.com/r/hacktoberfest/comments/16vzkes/here_is_my_collection_which_design_is_your/">Reddit collection</a></li>
       +<li><a href="https://hacktoberfesthowto.github.io/history/">History of Hacktoberfest</a></li>
       +</ul>
       +
       +<h2 id="end-result"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#end-result" class="heading-link">End Result</a></h2>
       +
       +<p>If I can't find the missing logos, I'll create my own design for my own personal use. Something like this:</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/double-t.webp" alt="Two t-shirts with the various Hacktoberfest logos stacked on them." width="1024" height="464" class="aligncenter size-full wp-image-61672">
       +
       +<p>If you have a source for vectors of the missing logos, please drop me a comment.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#comments" thr:count="2" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/feed/atom/" thr:count="2" />
       +                        <thr:total>2</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Process Vs Prejudice]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/process-vs-prejudice/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=60985</id>
       +                <updated>2025-07-01T09:16:31Z</updated>
       +                <published>2025-07-03T11:34:05Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="forms" /><category scheme="https://shkspr.mobi/blog" term="politics" />
       +                <summary type="html"><![CDATA[I recently read an interesting article about Accountability Sinks. In it, the author argues that part of the reason for having business processes is that they diffuse accountability.  Every one of us has tried to have an argument with an employee of a big company, and it always goes like this:  the human being you are speaking to is only allowed to follow a set of processes and rules that pass on …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/process-vs-prejudice/"><![CDATA[
       +                                <html><head></head><body><p>I recently read an interesting article about <a href="https://250bpm.substack.com/p/accountability-sinks">Accountability Sinks</a>. In it, the author argues that part of the reason for having business processes is that they diffuse accountability.</p>
       +
       +<p>Every one of us has tried to have an argument with an employee of a big company, and it always goes like this:</p>
       +
       +<blockquote><p>the human being you are speaking to is only allowed to follow a set of processes and rules that pass on decisions made at a higher level of the corporate hierarchy. It’s often a frustrating experience; you want to get angry, but you can’t really blame the person you’re talking to.</p></blockquote>
       +
       +<p>So should we give people more discretion in which processes they follow?</p>
       +
       +<p>In some cases, yes! The article contains some compelling examples of when "breaking the rules" is the preferable outcome.</p>
       +
       +<p>But there are some unacknowledged downsides to letting people decide which rules are applicable - and that's people's personal prejudices.</p>
       +
       +<p>The article say some of the discontent with the modern world can be blamed on over-adherence to rules. For example:</p>
       +
       +<blockquote><p>The skepticism toward judges? It fits. They often seem more devoted to procedure than to justice.</p></blockquote>
       +
       +<p>Imagine a world without <a href="https://www.sentencingcouncil.org.uk/sentencing-and-the-council/about-sentencing-guidelines/">sentencing guidelines</a>. Perhaps the judge is from a different tribe to the accused and punishes them much more harshly than a clan-member. Would that seem fair?</p>
       +
       +<p>The customer service agent just doesn't like people of your gender, and refuses to process your refund.</p>
       +
       +<p>You give the bank manager a firm handshake and he approves your loan - even though you don't <em>technically</em> qualify you look like a decent sort of chap.</p>
       +
       +<p>And on it goes.</p>
       +
       +<p>Look, there's no doubt plenty of bias encoded within processes. All processes should be regularly reviewed and updated. Breaking a process in extremis can be a good idea.  When confronted with an inflexible policy, you may feel like a mere cog in a machine - but at least the machine is prevented from discriminating against your type of cogs.</p>
       +
       +<p>A well-defined process dehumanises <em>both</em> sides.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/process-vs-prejudice/#comments" thr:count="6" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/process-vs-prejudice/feed/atom/" thr:count="6" />
       +                        <thr:total>6</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: The World According to Cunk - An Illustrated History of All World Events Ever, Space Permitting by Philomena Cunk ★★★★★]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-according-to-cunk-an-illustrated-history-of-all-world-events-ever-space-permitting-by-philomena-cunk/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61157</id>
       +                <updated>2025-06-25T08:30:28Z</updated>
       +                <published>2025-07-02T11:34:17Z</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="comedy" />
       +                <summary type="html"><![CDATA[There are some characters whose tone of voice is inimitable. You cannot fail to read this without Diane Morgan&#039;s languid cadence echoing in your big empty head.  The book has been written with a very specific pace - one chuckle per paragraph, a big laugh every page, and a set number of uncontrollable giggles per chapter. Somewhat formulaic, but highly effective.  I kept highlighting bits of it…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/book-review-the-world-according-to-cunk-an-illustrated-history-of-all-world-events-ever-space-permitting-by-philomena-cunk/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/hbg-title-the-world-according-to-cunk-3-5.webp" alt="Book cover with famous people on the front." width="200" class="alignleft size-full wp-image-61158">There are some characters whose tone of voice is inimitable. You cannot fail to read this without Diane Morgan's languid cadence echoing in your big empty head.</p>
       +
       +<p>The book has been written with a very specific pace - one chuckle per paragraph, a big laugh every page, and a set number of uncontrollable giggles per chapter. Somewhat formulaic, but highly effective.</p>
       +
       +<p>I kept highlighting bits of it and showing them to my wife. After the 8th or 9th time she grabbed her own copy and started showing me the bits she found funny.</p>
       +
       +<p>It's just endlessly quotable.  "The emperor eventually died and was buried with a load of clay figures – like Nick Park will be." and "a sort of naughty typewriter called the Enigma machine" still keep me guffawing.</p>
       +
       +<p>The long-running callbacks are perfect, as are the inclusion of a few <a href="https://www.youtube.com/watch?v=zIsc6zirBSw">fan favourite jokes</a>.</p>
       +
       +<p>Even the fucking <em>index</em> of this book is hilarious.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-according-to-cunk-an-illustrated-history-of-all-world-events-ever-space-permitting-by-philomena-cunk/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/book-review-the-world-according-to-cunk-an-illustrated-history-of-all-world-events-ever-space-permitting-by-philomena-cunk/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Are Brother's Insecure Printers Illegal in the UK?]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61677</id>
       +                <updated>2025-07-01T09:16:24Z</updated>
       +                <published>2025-07-01T11:34:15Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="CyberSecurity" /><category scheme="https://shkspr.mobi/blog" term="IoT" /><category scheme="https://shkspr.mobi/blog" term="law" /><category scheme="https://shkspr.mobi/blog" term="legal" /><category scheme="https://shkspr.mobi/blog" term="Legislation" />
       +                <summary type="html"><![CDATA[Another day, another security disaster! This time, multiple printers from Brother have an unfixable security flaw. That&#039;s bad, obviously, but is it illegally bad?  Let&#039;s take a look at details of the vulnerability:  An unauthenticated attacker who knows the target device&#039;s serial number, can generate the default administrator password for the device.  Recently, the UK brought in some laws aimed…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/"><![CDATA[
       +                                <html><head></head><body><p>Another day, another security disaster! This time, <a href="https://www.theverge.com/news/694877/brother-printers-security-flaw-password-vulnerability">multiple printers from Brother have an unfixable security flaw</a>. That's bad, obviously, but is it <em>illegally</em> bad<sup id="fnref:law"><a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fn:law" class="footnote-ref" title="I'm not a lawyer. This is not legal advice. This is just my interpretation of what's going on. If in doubt, consult someone qualified." role="doc-noteref">0</a></sup>?</p>
       +
       +<p>Let's take a look <a href="https://www.cve.org/CVERecord?id=CVE-2024-51978">at details of the vulnerability</a>:</p>
       +
       +<blockquote><p>An unauthenticated attacker who knows the target device's serial number, can generate the default administrator password for the device.</p></blockquote>
       +
       +<p>Recently, the UK brought in some laws aimed at strengthening consumer protection - the Product Security and Telecommunications Infrastructure act (PSTI).  There's <a href="https://www.ncsc.gov.uk/blog-post/smart-devices-law">a readable summary on the National Cyber Security Centre's website</a>.</p>
       +
       +<p>There are three interesting points to note in that blog post. The first is about passwords:</p>
       +
       +<blockquote><p>The law means manufacturers must ensure that all their smart devices meet basic cyber security requirements. Specifically:</p>
       +
       +<ol>
       +<li>The manufacturer must not supply devices that use default passwords, which can be easily discovered online, and shared.</li>
       +</ol></blockquote>
       +
       +<p>Secondly, is a question of jurisdiction:</p>
       +
       +<blockquote><p>Most smart devices are manufactured outside the UK, but the PSTI act also applies to all organisations importing or retailing products for the UK market. Failure to comply with the act is a criminal offence</p></blockquote>
       +
       +<p>Thirdly, what is actually covered:</p>
       +
       +<blockquote><p>The law applies to any ‘consumer smart device’ that connects either to the internet, or to a home network (for example by wifi).</p></blockquote>
       +
       +<p>Is a WiFi enabled printer a "consumer smart device"?  One of the things that techies find confusing is that the law is <em>not</em> code. It usually doesn't enumerate a definitive list of what is and what isn't in scope. It gives a general outline and then allows case-law to develop. This means laws don't need to be updated when someone invents, say, an Internet connected tinfoil dispenser.</p>
       +
       +<p>Let's move beyond the consumer-friendly summary and go to the actual law. <a href="https://www.legislation.gov.uk/uksi/2023/1007/schedule/1/made">The Product Security and Telecommunications Infrastructure (Security Requirements for Relevant Connectable Products) Regulations 2023</a></p>
       +
       +<blockquote><ol start="2">
       +<li><p>Passwords must be—</p>
       +
       +<p>a. unique per product; or</p>
       +
       +<p>b. defined by the user of the product.</p></li>
       +<li><p>Passwords which are unique per product must not be—</p>
       +
       +<p>a. based on incremental counters;</p>
       +
       +<p>b. based on or derived from publicly available information;</p>
       +
       +<p>c. based on or derived from unique product identifiers, such as serial numbers, unless this is done using an encryption method, or keyed hashing algorithm, that is accepted as part of good industry practice;</p>
       +
       +<p>d. otherwise guessable in a manner unacceptable as part of good industry practice.</p></li>
       +</ol></blockquote>
       +
       +<p>How does this apply to the printers? Rapid7, who discovered the vulnerability, <a href="https://www.rapid7.com/blog/post/multiple-brother-devices-multiple-vulnerabilities-fixed/">have this to say about how it works</a>:</p>
       +
       +<blockquote><p>[The vulnerability] allows an attacker to leak a serial number via the target's HTTP, HTTPS, and IPP services. However, should an attacker not be able to leverage [the vulnerability], a remote unauthenticated attacker can still discover a target device's serial number via either a PJL or SNMP query</p></blockquote>
       +
       +<p>So, yes. The default password <em>is</em> unique but it can be automatically derived from the serial number.  That serial number is available to anyone with a network connection to the printer.</p>
       +
       +<p>But, do printers fall under the scope of this act?</p>
       +
       +<p>The <a href="https://www.legislation.gov.uk/ukpga/2022/46/part/1/enacted#section-4">Product Security and Telecommunications Infrastructure Act 2022</a> says:</p>
       +
       +<blockquote><p>4 Relevant connectable products</p>
       +
       +<ol>
       +<li><p>In this Part “relevant connectable product” means a product that meets conditions A and B.</p></li>
       +<li><p>Condition A is that the product is—</p>
       +
       +<p>A. an internet-connectable product, or</p>
       +
       +<p>B. a network-connectable product.</p></li>
       +<li><p>Condition B is that the product is not an excepted product (see section 6).</p></li>
       +</ol></blockquote>
       +
       +<p>It goes on to define what Internet-connectable means, along with some other clarifying details.  But is there a get-out clause here? Are printers an "excepted product"?</p>
       +
       +<blockquote><p>In this Part “excepted product” means a product of a description specified in regulations made by the Secretary of State.</p></blockquote>
       +
       +<p>OK, let's look at <a href="https://www.legislation.gov.uk/uksi/2023/1007/schedule/3">the regulations</a>. I've expanded out the relevant bit:</p>
       +
       +<blockquote><p>Schedule 3 Excepted connectable products</p>
       +
       +<ol start="5">
       +<li><p>Computers</p>
       +
       +<ol>
       +<li><p>Products are excepted under this paragraph if they are computers which are—</p>
       +
       +<p>a. desktop computers;</p>
       +
       +<p>b. laptop computers;</p>
       +
       +<p>c. tablet computers which do not have the capability to connect to cellular networks.</p></li>
       +</ol></li>
       +</ol></blockquote>
       +
       +<p>Nope! The Brother printers don't appear to be exempt<sup id="fnref:neil"><a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fn:neil" class="footnote-ref" title="With thanks to m'learned colleague Neil Brown who came to much the same conclusion" role="doc-noteref">1</a></sup>.  What's <a href="https://www.legislation.gov.uk/ukpga/2022/46/part/1/enacted#section-38">the <em>maximum</em> penalty</a> Brother could be subject to?</p>
       +
       +<p>The greater of £10 million or 4% of worldwide <em>revenue</em>.</p>
       +
       +<p>Ouch!</p>
       +
       +<p>Of course, much like GDPR fines, these are headline grabbing numbers. The prosaic reality is that <a href="https://www.gov.uk/government/publications/safety-and-standards-enforcement-enforcement-policy">the enforcement policy is much more likely to suggest remedial steps</a>. Only the most flagrant transgressors are likely to be punished harshly<sup id="fnref:actions"><a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fn:actions" class="footnote-ref" title="You can see the actions they've previously taken. Because PSTI is so new, there aren't any actions against insecure IoT devices - so we'll have to wait and see how they choose to proceed." role="doc-noteref">2</a></sup>.</p>
       +
       +<p>So, to recap. The law says an Internet-connected device (including printers) must have a password which is not "based on or derived from publicly available information". As I understand it, having a serial-number based password is OK <em>as long as you don't publicise the serial number</em>.  I expect that if it were printed on a sticker that would be fine. But because the serial can be discovered remotely, it fails at this point.</p>
       +
       +<p>In Brother's (slight) defence, unless the user has specifically connected the printer to the Internet this is only a local vulnerability. Someone on the same network would be able to monkey around with the printer but, similarly, they could plug in a USB cable for some illicit printing or break it with a hammer. Any damage is confined to the LAN.</p>
       +
       +<p>Should users change default passwords? Yes. But manufacturers have a legal duty to ensure that people who don't are still protected.</p>
       +
       +<div class="footnotes" role="doc-endnotes">
       +<hr>
       +<ol start="0">
       +
       +<li id="fn:law" role="doc-endnote">
       +<p>I'm not a lawyer. This is not legal advice. This is just my interpretation of what's going on. If in doubt, consult someone qualified.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fnref:law" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:neil" role="doc-endnote">
       +<p>With thanks to m'learned colleague <a href="https://decoded.legal/blog/2023/10/new-rules-for-people-making-importing-or-distributing-internet-connected-or-connectable-products-part-1/">Neil Brown who came to much the same conclusion</a>&nbsp;<a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fnref:neil" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:actions" role="doc-endnote">
       +<p>You can <a href="https://www.gov.uk/government/publications/opss-enforcement-actions">see the actions they've previously taken</a>. Because PSTI is so new, there aren't any actions against insecure IoT devices - so we'll have to wait and see how they choose to proceed.&nbsp;<a href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#fnref:actions" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +</ol>
       +</div>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/#comments" thr:count="4" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/07/are-brothers-insecure-printers-illegal-in-the-uk/feed/atom/" thr:count="4" />
       +                        <thr:total>4</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: The Left Hand of Dog - Si Clarke ★★☆☆☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-the-left-hand-of-dog-si-clarke/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61173</id>
       +                <updated>2025-06-26T07:19:15Z</updated>
       +                <published>2025-06-30T11:34:37Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Book Review" />
       +                <summary type="html"><![CDATA[I have to say, I did not get on with this book. The central conceit is that a sci-fi fan is abducted by aliens and their universal translator converts everything into understandable slang. So we get lots of warp factors, ansibles, dilithium crystals, and Hitchiker’s references. It makes the whole thing feel a bit cheap. OK, maybe it is a little silly when an author comes up with some t…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/book-review-the-left-hand-of-dog-si-clarke/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/left.webp" alt="Book cover featuring a person, their dog, and an interstellar tea-pot." width="200" height="300" class="alignleft size-full wp-image-61175"> I have to say, I did <em>not</em> get on with this book. The central conceit is that a sci-fi fan is abducted by aliens and their universal translator converts everything into understandable slang. So we get lots of warp factors, ansibles, dilithium crystals, and Hitchiker’s references. It makes the whole thing feel a bit cheap. OK, maybe it is a little silly when an author comes up with some technobabble instead of saying "make the jump to light-speed" - but readers appreciate the effort.</p>
       +
       +<p>It's a daft enough story but the chuckles are few and far between.</p>
       +
       +<p>Much like the <a href="https://shkspr.mobi/blog/tag/wayfarers/">Wayfarers books</a>, it wears its heart on its sleeve. I found that a delightful and refreshing aspect which is rarely seen in sci-fi.</p>
       +
       +<p>But, in the end, I found the plot a bit too derivative to enjoy, and the shoe-horned references quickly became tiresome.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-the-left-hand-of-dog-si-clarke/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/book-review-the-left-hand-of-dog-si-clarke/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Contactless Payments with GrapheneOS]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61636</id>
       +                <updated>2025-06-28T20:36:24Z</updated>
       +                <published>2025-06-29T11:34:57Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="android" /><category scheme="https://shkspr.mobi/blog" term="google" /><category scheme="https://shkspr.mobi/blog" term="GrapheneOS" /><category scheme="https://shkspr.mobi/blog" term="nfc" />
       +                <summary type="html"><![CDATA[Google&#039;s monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the de facto way to use NFC payments on Android. There&#039;s one problem though - it only works with Google&#039;s Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure GrapheneOS - …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/"><![CDATA[
       +                                <html><head></head><body><p>Google's monopolistic stranglehold on Android results in poor experience for power-users, and artificially restricts choice for those who have older phones.  For example, Google Wallet is the <i lang="la">de facto</i> way to use NFC payments on Android. There's one problem though - it only works with <em>Google's</em> Android.  If you have the temerity to install a 3rd party Android OS - like the hyper-secure <a href="https://grapheneos.org/">GrapheneOS</a> - you'll be locked out of it.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/GPay-fs8.png" alt="This device can't be set up to pay contactless. Your device doesn't meet pay contactless security standards. It may be rooted or running uncertified software." width="504" class="aligncenter size-full wp-image-61637">
       +
       +<p>First of all, Google is lying. It <em>does</em> meet security standards and it is <em>not</em> rooted.  I get that <a href="https://shkspr.mobi/blog/2023/05/the-limits-of-general-purpose-computation/">I have no right to run someone else's software in an environment they don't like</a>, but this is just misinformation.  3rd party OSes are often <em>more</em> secure that a stock OS which has been left to rot by an unresponsive manufacturer.</p>
       +
       +<p>Anyway, here's how you can use contactless payments on Graphene.</p>
       +
       +<h2 id="prerequisites"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#prerequisites" class="heading-link">Prerequisites</a></h2>
       +
       +<p>I'm going to tell you what I did. If you found another way, leave a comment or write your own blog post.</p>
       +
       +<p>I'm using the latest version of Graphene (2025062000) with Play Services installed. The app is running in my main profile. None of the advanced app protection has been toggled for the app. NFC is on.</p>
       +
       +<p>You will have to agree to <a href="https://www.curve.com/legal/privacy/">Curve's privacy policy</a>. And the privacy policy of your credit card. Look, if you're using Graphene, you're probably overly privacy sensitive. If you're concerned about The Man<img src="https://s.w.org/images/core/emoji/15.1.0/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> knowing that you used your card to buy a breakfast beer and then sharing that with 958 trusted partners, just use cash instead.</p>
       +
       +<h2 id="install-curve"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#install-curve" class="heading-link">Install Curve</a></h2>
       +
       +<p><a href="https://www.curve.com/join#D4MK9ZKN">Here's a referral link to install Curve</a> - join and you get £10.  Or, you can <a href="https://play.google.com/store/apps/details?id=com.imaginecurve.curve.prd">install directly from the Play Store</a>.</p>
       +
       +<p>You'll need to create an account and pass KYC / AML checks. <a href="https://www.fca.org.uk/consumers/fca-firm-checker/firm-10456-925447">Curve are regulated by the FCA</a> so you should feel safe giving your details to them.</p>
       +
       +<h2 id="add-a-card"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#add-a-card" class="heading-link">Add a card</a></h2>
       +
       +<p>Curve is a <em>virtual</em> card provider. So add your existing Visa or MasterCard to the app (no Amex). When you spend on Curve, you're actually spending on the underlying card you've added. Curve promise cheaper foreign exchange fees and a few other perks. But what we're really interested in is NFC payments.</p>
       +
       +<h2 id="set-up-curve-pay"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-up-curve-pay" class="heading-link">Set up Curve Pay</a></h2>
       +
       +<p>On your app's dashboard, you should see a banner saying "Curve Pay is good to go!". If not, head into your account and set it up there.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-to-go-fs8.png" alt="Curve dashboard." width="504" class="aligncenter size-full wp-image-61638">
       +
       +<p>If it has all set up, you should see a welcome tutorial explaining how contactless works.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Good-To-Go-fs8.png" alt="Animation showing how to hold your phone to an NFC payment terminal." width="504" class="aligncenter size-full wp-image-61639">
       +
       +<h2 id="set-your-default-wallet"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#set-your-default-wallet" class="heading-link">Set your default wallet</a></h2>
       +
       +<p>On your phone, go to Settings → Connected devices → Connection Preferences → NFC → Contactless Payments.</p>
       +
       +<p>Or, search your settings for Pay.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Pay-Location-fs8.png" alt="Settings search page." width="504" class="aligncenter size-full wp-image-61640">
       +
       +<p>Select your default wallet app - in this case, Curve.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Default-Wallet-App-fs8.png" alt="List of available wallet apps." width="504" class="aligncenter size-full wp-image-61641">
       +
       +<h2 id="pay-for-something"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#pay-for-something" class="heading-link">Pay for something</a></h2>
       +
       +<p>You need to make sure NFC is turned on before you can use NFC payments. I know that sounds obvious, but I forgot to do it the first time and got very confused.</p>
       +
       +<p>Go to a local shop, pick up something, hand it to the merchant, wave your phone over the payment terminal like you are a technowizard from the future.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Notification-fs8.png" alt="Notification showing I paid £3.95 for a sticky bun." width="504" class="aligncenter size-full wp-image-61642">
       +
       +<p>Enjoy eating whatever you paid for!</p>
       +
       +<h2 id="thats-it"><a href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#thats-it" class="heading-link">That's it!</a></h2>
       +
       +<p>Once you're done, you can turn of NFC if you're paranoid.</p>
       +
       +<p>Apparently, <a href="https://justfollow.me.uk/@sborrill/114761774161342879">Curve also works with Garmin Smart Watches</a> - but I don't have one to test out.</p>
       +
       +<p>If you've found this blog post useful, I'd be grateful if you signed up with <a href="https://www.curve.com/join#D4MK9ZKN">my referral link for Curve</a>.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/#comments" thr:count="6" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/contactless-payments-with-grapheneos/feed/atom/" thr:count="6" />
       +                        <thr:total>6</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: First Contact - The Story of Our Obsession with Aliens by Becky Ferreira ★★★★⯪]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-first-contact-the-story-of-our-obsession-with-aliens-by-becky-ferreira/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61450</id>
       +                <updated>2025-06-26T07:19:06Z</updated>
       +                <published>2025-06-28T11:34:39Z</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" />
       +                <summary type="html"><![CDATA[This is a cheerful and convivial look through the history of humanity&#039;s search for life &#34;out there&#34;.  It isn&#039;t an &#34;ancient aliens&#34; style book of nonsense, but rather a steady walk through what has actually happened - and what we hope might happen.  It is a beautiful PDF which has been gorgeously typeset and lushly illustrated. So many fonts! Sure, it isn&#039;t brilliant for eInk but excellent for a…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/book-review-first-contact-the-story-of-our-obsession-with-aliens-by-becky-ferreira/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/9781523527779_766925.webp" alt="Book cover showing a UFO and digital signals." width="200" class="alignleft size-full wp-image-61451"> This is a cheerful and convivial look through the history of humanity's search for life "out there".  It isn't an "ancient aliens" style book of nonsense, but rather a steady walk through what has actually happened - and what we hope <em>might</em> happen.</p>
       +
       +<p>It is a beautiful PDF which has been gorgeously typeset and lushly illustrated. So many fonts! Sure, it isn't brilliant for eInk but excellent for a tablet or any other full-colour screen.</p>
       +
       +<p>The language is unpretentious and accessible. It's probably aimed towards the space-obsessed teen market, but I found it delightful.</p>
       +
       +<blockquote><p>The authorities were decidedly unchill about all this philosophizing, however, and Anaxagoras was condemned to death for impiety—a charge based on his rejection of religious teachings—after he kept insisting the Sun was a hot and large natural object, not some hunky god driving a chariot across the sky.</p></blockquote>
       +
       +<p>There aren't any inline references or footnotes - and links to images would be nice - but they're all all stuffed at the end if you want to find more.</p>
       +
       +<p>It would have been nice if some of the examples were a <em>little</em> more fleshed out:</p>
       +
       +<blockquote><p>Many cultures have imagined themselves as the descendants of celestial objects, or believed that they will ascend to the skies to join their ancestors after death.</p></blockquote>
       +
       +<p>But it is an excellent jumping off point for anyone who wants to expand their horizons. The book isn't really in any chronological order so jumps around a fair bit.  Full of fascinating titbits - especially radio silence day - and avoids the trap of sticking to just the USA cultural hegemony,</p>
       +
       +<p>A great starting point for anyone who wants to get quickly acquainted with our (so far futile) attempts to discover alien life.</p>
       +
       +<p>Many thanks to <a href="https://www.netgalley.com">NetGalley</a> for the preview copy - the book is on sale 30th September 2025.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-first-contact-the-story-of-our-obsession-with-aliens-by-becky-ferreira/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/book-review-first-contact-the-story-of-our-obsession-with-aliens-by-becky-ferreira/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Review: Octopus Home Mini - Real-Time Smart Meter Monitoring ★★☆☆☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61481</id>
       +                <updated>2025-06-27T08:51:38Z</updated>
       +                <published>2025-06-27T11:34:29Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="electricity" /><category scheme="https://shkspr.mobi/blog" term="energy" /><category scheme="https://shkspr.mobi/blog" term="HomeAssistant" /><category scheme="https://shkspr.mobi/blog" term="IoT" /><category scheme="https://shkspr.mobi/blog" term="Smart Home" />
       +                <summary type="html"><![CDATA[I unashamedly love my smart-meter. Rather than having my energy provider guesstimate my bill, or having to send manual readings each month, it automatically beams them back to its mothership. It also enables interesting things like variable energy tariffs.  By design, the smart-meter is limited in how much data it can send back. You can choose to have readings sent monthly, weekly, daily, or…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/"><![CDATA[
       +                                <html><head></head><body><p>I unashamedly <em>love</em> my smart-meter. Rather than having my energy provider guesstimate my bill, or having to send manual readings each month, it automatically beams them back to its mothership. It also enables interesting things like variable energy tariffs.</p>
       +
       +<p>By design, the smart-meter is limited in how much data it can send back. You can choose to have readings sent monthly, weekly, daily, or half-hourly. There's no option for minute-by-minute precision. That's useful from a privacy perspective - and no doubt makes the network engineering simpler - but slightly annoying from a home-monitoring perspective.</p>
       +
       +<p>The smart-meter has the ability to send real-time information to a local device using the ZigBee network. If you have an in-home display (IHD) then you'll have seen just how accurate it is.</p>
       +
       +<p>As I've discovered, <a href="https://shkspr.mobi/blog/2020/04/hacking-your-smart-meter-part-1-zigbee/">you can't just pair any-old ZigBee device to your meter</a>. Luckily, Octopus have sent me the "Mini". A little device which connects to the smart-meter and your home WiFi, then reports usage every 10 seconds.  Let's put it through its paces.</p>
       +
       +<h2 id="size"><a href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/#size" class="heading-link">Size</a></h2>
       +
       +<p>Mini by name, mini by nature!</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Mini.webp" alt="Tiny pink device." width="2738" height="1541" class="aligncenter size-full wp-image-61492">
       +
       +<p>It's rare to find a device smaller than its plug. I half-wonder if they could have integrated it and just made it into a smartplug.</p>
       +
       +<p>Annoyingly, it is <em>micro</em> USB. I am a USB-C maximalist. There's no reason this device shouldn't use the same cable as everything else I own.</p>
       +
       +<h2 id="installation"><a href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/#installation" class="heading-link">Installation</a></h2>
       +
       +<p>Plug the Mini in - ideally within 5m of your smartmeter - and wait for the blinkenlight. Follow the in-app instructions. Because, like every modern device, it needs an app. You need to install the standard Octopus Android app, and can then add the Mini to your account and to your WiFi.</p>
       +
       +<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/24ghz.webp" alt="Warning about using 2.4GHz WiFi." width="490" height="367" class="aligncenter size-full wp-image-61493">
       +
       +<p>Like all cheap IoT devices, it will only work on 2.4㎓, so you may need to adjust which network your phone is on.</p>
       +
       +<h2 id="and-then"><a href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/#and-then" class="heading-link">And then…</a></h2>
       +
       +<p>That's it. Every 10 seconds it sends an update to Octopus. You can use the app or the website to view your current consumption or to see your last 5 minutes or last 30 minutes usage.</p>
       +
       +<p><a href="https://blog.v-s-f.co.uk/2023/07/near-realtime-energy-consumption-data-with-octopus-home-mini/">If you're a dab-hand with the API, you can poll that</a>. Or you can connect it to HomeAssistant.</p>
       +
       +<h2 id="downside"><a href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/#downside" class="heading-link">Downside</a></h2>
       +
       +<p>In theory this is nifty, but there are a few things I'm not keen on.</p>
       +
       +<ul>
       +<li>Export readings simply don't work for some brands of smart meter. That's an annoyance - my meter can send half-hourly readings for export, but the Mini just shows that I'm using zero Watts.</li>
       +<li>No local connection. It sends the data to Octopus, so I have to use their API to get the data. I'd like the ability to stream it directly from the Mini.</li>
       +<li>USB-micro. We live in the future. USB-C or GTFO!</li>
       +</ul>
       +
       +<p>Honestly, a bit disappointing. If you don't have solar panels - or your meter works correctly - this could be very useful. Even so, the lack of an local API is a bit of a buzzkill.  Sadly, for my purposes, it isn't very useful.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/#comments" thr:count="6" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/review-octopus-home-mini-real-time-smart-meter-monitoring/feed/atom/" thr:count="6" />
       +                        <thr:total>6</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: The Martian Contingency by Mary Robinette Kowal ★★★★☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-the-martian-contingency-by-mary-robinette-kowal/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61166</id>
       +                <updated>2025-06-24T11:46:55Z</updated>
       +                <published>2025-06-26T11:34:19Z</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="Mary Robinette Kowal" />
       +                <summary type="html"><![CDATA[The Lady Astronaut books are an absolute triumph - it&#039;s just a shame that they&#039;ve been somewhat overshadowed by the TV series &#34;For All Mankind&#34;.  They both follow a similar trajectory - what if women were an integral part of the early space race and helped us to colonise off-world? The books, thankfully, don&#039;t pad out as much as the rival show - this latest novel is tightly focussed and takes us …]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/book-review-the-martian-contingency-by-mary-robinette-kowal/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/jpg_rgb_0650h-5-416x636-1.jpg" alt="Book cover featuring Astronauts on Mars." width="200" class="alignleft size-full wp-image-61167"> The Lady Astronaut books are an absolute triumph - it's just a shame that they've been somewhat overshadowed by the TV series "For All Mankind".  They both follow a similar trajectory - what if women were an integral part of the early space race and helped us to colonise off-world? The books, thankfully, don't pad out as much as the rival show - this latest novel is tightly focussed and takes us to the Mars base where <em>shenanigans</em> are afoot.</p>
       +
       +<p>For a sci-fi nerd like me, it is total catnip. A heady mix of brain-tangling "what ifs" and the geeky joy of "<a href="https://tvtropes.org/pmwiki/pmwiki.php/Main/CompetencePorn">competency porn</a>". The language is gorgeous with some beautiful turns of phrase, and the pacing does an excellent job of ratcheting up the tension.</p>
       +
       +<p>My only criticism is that Elma is <em>such</em> an ineffective character. She seems to forget that she's one of the most senior people on the mission and has the right - nay! the duty! - to get answers. Her lack of confidence isn't a quirky character flaw; it is a profoundly irritating co-star.</p>
       +
       +<p>I love the world building, the jokey asides, and the sense of purpose all the characters have. The moral dilemmas and Politics are well articulated and don't feel tacked on. It's worth picking up the whole series.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-the-martian-contingency-by-mary-robinette-kowal/#comments" thr:count="2" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/book-review-the-martian-contingency-by-mary-robinette-kowal/feed/atom/" thr:count="2" />
       +                        <thr:total>2</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Theatre Review: Just For One Day ★★★★⯪]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/theatre-review-just-for-one-day/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61592</id>
       +                <updated>2025-06-25T08:30:23Z</updated>
       +                <published>2025-06-25T11:34:07Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Theatre Review" />
       +                <summary type="html"><![CDATA[Leave your cynicism at the door.  Jukebox musicals usually stick to a single-artist (Mamma Mia, &#38; Juliet, Tommy). As a result, they all start to sound a bit samey after a few numbers. Shows like Return To The Forbidden planet shoe-horn in songs from a dozen artists without much regard to plot, tone, or pacing.  Just For One Day goes down a different route. Rather than just recreate the famous…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/theatre-review-just-for-one-day/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/JFOD.webp" alt="A crowd of singers." width="400" class="alignleft size-full wp-image-61593"> Leave your cynicism at the door.</p>
       +
       +<p>Jukebox musicals usually stick to a single-artist (Mamma Mia, &amp; Juliet, Tommy). As a result, they all start to sound a bit samey after a few numbers. Shows like Return To The Forbidden planet shoe-horn in songs from a dozen artists without much regard to plot, tone, or pacing.</p>
       +
       +<p>Just For One Day goes down a different route. Rather than just recreate the famous Live Aid concert with a procession of soundalikes, it attempts to tell the story <em>behind</em> the concert. In doing so, it chops dozens of songs into thousands of pieces and lets the snippets segue seamlessly into the prose. It entwines the songs into each other beautifully.  A supremely talented cast backed with a superb live band - it is guaranteed to have you screaming and cheering.</p>
       +
       +<p>The central plot device is a <em>little</em> silly - a mother who went to the concert is chiding her teenage daughter about political activism. It is a bit mawkish and gets the show off to a stage-schooly start. Similarly, the daughter's righteous indignation fuels her interrogation of Saint Geldof which, again, becomes a bit preachy.</p>
       +
       +<p>But that's the nature of Live Aid. It <em>is</em> preachy. And for all the arguments about whether it was the <strong>right</strong> thing to do - at least it did <strong>something</strong>. The show doesn't gloss over some the problems - and problem personalities - behind the production. Nor does it shy away from the reality of the limits of the help provided. Albeit backed by joyous music.</p>
       +
       +<p>I felt that it pulls its punches a little bit. Rather than showing any footage from the Ethiopian famine, it <a href="https://www.independent.co.uk/news/uk/bob-geldof-belfast-icc-ethiopia-barack-obama-b2423253.html">recycles a speech Geldof gave a few years ago</a>.</p>
       +
       +<p>Nevertheless, it is a powerful and moving spectacle.</p>
       +
       +<p>Oh, and there's a rap battle between Bob Geldof and Mrs Thatcher.</p>
       +
       +<p>Tickets start at £20. The music is so loud, and the staging so expressive, that you'll get a decent view from the cheap seats.</p>
       +
       +<p>Far better than the average jukebox musical.</p>
       +
       +<h2 id="pre-show-and-post-show"><a href="https://shkspr.mobi/blog/2025/06/theatre-review-just-for-one-day/#pre-show-and-post-show" class="heading-link">Pre-show and Post-show</a></h2>
       +
       +<p>As regular readers of <a href="https://shkspr.mobi/blog/tag/theatre-review/">my theatre reviews</a> know, I'm obsessed with how theatres treat their patrons.</p>
       +
       +<p>Bag searches were conducted quickly, and they were happy to let me bring in a small plastic bottle of water. The Shaftesbury has spacious corridors and bars. There are plenty of toilets which - in a shocking departure from West End tradition - are well maintained.</p>
       +
       +<p>There's a little bit of set dressing inside the theatre to allow the audience to take selfies with famous backdrops. That's cute - but it might have been nice if they'd added a few more, or even put up original posters, press clippings, etc.</p>
       +
       +<p>As we exited the theatre we were handed a commemorative ticket! What a swell idea! I thought it contained a QR code to donate to <a href="https://www.bandaidtrust.co.uk/">the Band Aid Charitable Trust</a> or find out more about their projects. Instead it's a coupon for £20 off your next visit. That feels like a bit of a missed opportunity.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/theatre-review-just-for-one-day/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/theatre-review-just-for-one-day/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Reading NFC Passport Chips in Linux]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61546</id>
       +                <updated>2025-06-24T12:12:53Z</updated>
       +                <published>2025-06-24T11:34:49Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="CyberSecurity" /><category scheme="https://shkspr.mobi/blog" term="hacking" /><category scheme="https://shkspr.mobi/blog" term="linux" /><category scheme="https://shkspr.mobi/blog" term="nfc" /><category scheme="https://shkspr.mobi/blog" term="rfid" />
       +                <summary type="html"><![CDATA[For boring and totally not nefarious reasons, I want to read all the data contained in my passport&#039;s NFC chip using Linux. After a long and annoying search, I settled on roeften&#039;s pypassport.  I can now read all the passport information, including biometrics.  Table of ContentsBackgroundRecreating the MRZPython code to generate an MRZCan you read a cancelled passport?Cryptography and other…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/"><![CDATA[
       +                                <html><head></head><body><p>For boring and totally not nefarious reasons, I want to read all the data contained in my passport's NFC chip using Linux. After a long and annoying search, I settled on <a href="https://github.com/roeften/pypassport">roeften's pypassport</a>.</p>
       +
       +<p>I can now read all the passport information, including biometrics.</p>
       +
       +<p></p><nav id="toc"><menu id="toc-start"><li id="toc-title"><h2 id="table-of-contents"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#table-of-contents" class="heading-link">Table of Contents</a></h2><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#background">Background</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#recreating-the-mrz">Recreating the MRZ</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#python-code-to-generate-an-mrz">Python code to generate an MRZ</a></li></menu></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-read-a-cancelled-passport">Can you read a cancelled passport?</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#cryptography-and-other-security">Cryptography and other security</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-brute-force-a-passport">Can you brute-force a passport?</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-brute-forcing-a-password">Is it worth brute-forcing a password?</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#installing">Installing</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#getting-structured-data">Getting structured data</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#saving-the-image">Saving the image</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#what-didnt-work">What didn't work</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#mrtdreader">mrtdreader</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#jean-francois-houzards-and-olivier-rogers-pypassport">Jean-Francois Houzard's and Olivier Roger's pyPassport</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#beaujeans-pypassport">beaujean's pyPassport</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#d-logic">d-Logic</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#android-reader">Android reader</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-it">Is it worth it?</a></li></menu></li></menu></nav><p></p>
       +
       +<h2 id="background"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#background" class="heading-link">Background</a></h2>
       +
       +<p>The NFC chip in a passport is protected by a password. The password is printed on the inside of the physical passport. As well as needing to be physically close to the passport for NFC to work<sup id="fnref:long"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:long" class="footnote-ref" title="There are some commercially available long range readers - up to 15cm! I've no doubt some clever engineer has made a some high-powered radio device which can read things from a mile away using a…" role="doc-noteref">0</a></sup>, you also need to be able to see the password. The password is printed in the "Machine Readable Zone" (MRZ) - which is why some border guards will swipe your passport through a reader before scanning the chip; they need the password and don't want to type it in.</p>
       +
       +<p>I had a small problem though.  I'm using my old passport<sup id="fnref:old"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:old" class="footnote-ref" title="I'm not dumb enough to do this stuff on a live passport!" role="doc-noteref">1</a></sup> which <a href="https://www.gov.uk/government/publications/cancellation-of-passports/cancelling-british-passports-accessible#cancelling-epassport-version-2">has been cancelled</a>.  Cancelling isn't just about revoking the document. It is also physically altered:</p>
       +
       +<blockquote><p>Cut off the bottom left hand corner of the personal details page, making sure you cut the MRZ on the corner opposite the photo.</p></blockquote>
       +
       +<p>So a chunk of the MRZ is missing! Oh no! Whatever can we do!?</p>
       +
       +<h3 id="recreating-the-mrz"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#recreating-the-mrz" class="heading-link">Recreating the MRZ</a></h3>
       +
       +<p>The password is made up of three pieces of data:</p>
       +
       +<ol>
       +<li>Passport Number (Letters and Numbers)</li>
       +<li>Date of Birth (YYMMDD)</li>
       +<li>Expiry Date (YYMMDD)</li>
       +</ol>
       +
       +<p>Each piece <em>also</em> has a checksum. This calculation is defined in Appendix A to <a href="https://www.icao.int/publications/Documents/9303_p3_cons_en.pdf">Part 3 of Document 9303</a>.</p>
       +
       +<p>Oh, and there's a checksum for the entire string. It's this final checksum which is cut off when the passport cover is snipped.</p>
       +
       +<p>The final password is: <code>Number Number-checksum DOB DOB-checksum Expiry Expiry-checkum checksum-of-previous-digits</code></p>
       +
       +<h4 id="python-code-to-generate-an-mrz"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#python-code-to-generate-an-mrz" class="heading-link">Python code to generate an MRZ</a></h4>
       +
       +<p>If you know the passport number, date of birth, and expiry date, you can generate your own Machine Readable Zone - this acts as the password for the NFC chip.</p>
       +
       +<pre><code class="language-python">def calculateChecksum( value ):
       +    weighting = [7,3,1]
       +    characterWeight = {
       +        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,  
       +        '8': 8, '9': 9, '&lt;': 0, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 
       +        'F':15, 'G':16, 'H':17, 'I':18, 'J':19, 'K':20, 'L':21, 'M':22, 
       +        'N':23, 'O':24, 'P':25, 'Q':26, 'R':27, 'S':28, 'T':29, 'U':30, 
       +        'V':31, 'W':32, 'X':33, 'Y':34, 'Z':35
       +    }
       +    counter = 0
       +    result = 0
       +    for x in value:
       +        result += characterWeight[str(x)] * weighting[counter%3]
       +        counter += 1
       +    return str(result%10)
       +
       +def calculateMRZ( passportNumber, DOB, expiry ):
       +    """
       +    DOB and expiry are formatted as YYMMDD
       +    """
       +    passportCheck = calculateChecksum( passportNumber )
       +    DOBCheck      = calculateChecksum( DOB )
       +    expiryCheck   = calculateChecksum( expiry )
       +    mrzNumber  = passportNumber + passportCheck + DOB + DOBCheck + expiry + expiryCheck
       +    mrzCheck = calculateChecksum( mrzNumber ).zfill(2)
       +    mrz =  passportNumber + passportCheck + "XXX" + DOB + DOBCheck + "X" + expiry + expiryCheck + "&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;" + mrzCheck
       +    return mrz
       +
       +print( calculateMRZ("123456789", "841213", "220229") )
       +</code></pre>
       +
       +<h2 id="can-you-read-a-cancelled-passport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-read-a-cancelled-passport" class="heading-link">Can you read a cancelled passport?</a></h2>
       +
       +<p>I would have thought that cutting the cover of the passport would destroy the antenna inside it. But, going back to <a href="https://www.gov.uk/government/publications/cancellation-of-passports/cancelling-british-passports-accessible#cancelling-epassport-version-2">the UK guidance</a>:</p>
       +
       +<blockquote><p>You must not cut the back cover on the ePassport</p></blockquote>
       +
       +<p>Ah! That's where the NFC chip is. I presume this is so that cancelled passports can still be verified for authenticity.</p>
       +
       +<h2 id="cryptography-and-other-security"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#cryptography-and-other-security" class="heading-link">Cryptography and other security</a></h2>
       +
       +<p>The security is, thankfully, all fairly standard Public Key Cryptography - <a href="https://www.icao.int/publications/Documents/9303_p11_cons_en.pdf">9303 part 11</a> explains it in <em>excruciating</em> levels of detail.</p>
       +
       +<p>One thing I found curious - because the chip has no timer, it cannot know how often it is being read. You could bombard it with thousands of password attempts and not get locked out.  Indeed, the specification says:</p>
       +
       +<blockquote><p>the success probability of the attacker is given by the time the attacker has access to the IC, the duration of a single attempt to guess the password, and the entropy of the passport.</p></blockquote>
       +
       +<h2 id="can-you-brute-force-a-passport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-brute-force-a-passport" class="heading-link">Can you brute-force a passport?</a></h2>
       +
       +<p>Wellllll… maybeeeee…?</p>
       +
       +<p>Passports are generally valid for only 10 years. So that's 36,525 possible expiry dates.</p>
       +
       +<p>Passport holders are generally under 100 years old. So that's 3,652,500 possible dates of birth.</p>
       +
       +<p>That's already 133,407,562,500 attempts - and we haven't even got on to the 1E24 possible passport numbers!</p>
       +
       +<p>In my experiments, sending an incorrect but valid MRZ results in the chip returning "Security status not satisfied (0x6982)" in a very short space of time. Usually less than a second.</p>
       +
       +<p>But sending that incorrect attempt seemed to introduce a delay in the next response - by a few seconds. Sending the correct MRZ seemed to reset this and let the chip be read instantly.</p>
       +
       +<p>So, if you knew the target's passport number and birthday, brute forcing the expiry date would take a couple of days. Not instant, but not impossible.</p>
       +
       +<p>Most <a href="https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf">commercial NFC chips support 100,000 writes</a> with no limit for the number of reads. Some also have a 24 bit read counter which increments after every read attempt. After 16 million reads, the counter doesn't increment. It <em>could</em> be possible for a chip to self-destruct after a specific number of reads - but I've no evidence that passport chips do that.</p>
       +
       +<h3 id="is-it-worth-brute-forcing-a-password"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-brute-forcing-a-password" class="heading-link">Is it <em>worth</em> brute-forcing a password?</a></h3>
       +
       +<p>If you were to brute-force the MRZ, you would discover the passport-holder's date of birth.  You would also get:</p>
       +
       +<ul>
       +<li>A digital copy of their photo,</li>
       +<li>Their full name,</li>
       +<li>Their sex<sup id="fnref:sex"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:sex" class="footnote-ref" title="Sex is complicated. But ICAO allow for &quot;F for female, M for male, or X for unspecified&quot;." role="doc-noteref">2</a></sup>,</li>
       +<li>The country which issued their passport, and</li>
       +<li>Their nationality.</li>
       +</ul>
       +
       +<p>All of that is something which you can see from looking at the passport. So there's little value in attempting to read it electronically.</p>
       +
       +<h2 id="installing"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#installing" class="heading-link">Installing</a></h2>
       +
       +<p>As mentioned, I'm using <a href="https://github.com/roeften/pypassport">https://github.com/roeften/pypassport</a></p>
       +
       +<p>The only library I needed to install was <a href="https://pypi.org/project/pyasn1/">pyasn1</a> using <code>pip3 install pyasn1</code> - your setup may vary.</p>
       +
       +<p>Download PyPassport. In the same directory, you can create a test Python file to see if the passport can be read. Here's what it needs to contain:</p>
       +
       +<pre><code class="language-python">from pypassport import epassport, reader
       +
       +#   Replace this MRZ with the one from your passport
       +MRZ = "1234567897XXX8412139X2202299&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;04"
       +
       +def trace(name, msg):
       +    if name == "EPassport":
       +        print(name + ": " + msg)
       +
       +r = reader.ReaderManager().waitForCard()
       +
       +ep = epassport.EPassport(r, MRZ)
       +ep.register(trace)
       +ep.readPassport()
       +</code></pre>
       +
       +<p>Plug in your NFC reader, place your passport on it, run the above code.  If it works, it will spit out a lot of debug information, including all the data it can find on the passport.</p>
       +
       +<h2 id="getting-structured-data"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#getting-structured-data" class="heading-link">Getting structured data</a></h2>
       +
       +<p>The structure of the passport data is a little convoluted.  <a href="https://www.icao.int/publications/Documents/9303_p10_cons_en.pdf">The specification</a> puts data into different "Data Groups" - each with its own ID.</p>
       +
       +<p>By running:</p>
       +
       +<pre><code class="language-python">ep.keys()
       +</code></pre>
       +
       +<p>You can see which Data Groups are available. In my case, <code>['60', '61', '75', '77']</code></p>
       +
       +<ul>
       +<li><code>60</code> is the common area which contains some metadata. Nothing interesting there.</li>
       +<li><code>61</code> is DG1 - the full MRZ. This contains the holder's name, sex, nationality, etc.</li>
       +<li><code>77</code> is the Document Security Object - this was empty for me.</li>
       +<li><code>75</code> is DG2 to DG4 Biometric Templates - this contains the image and other metadata.</li>
       +</ul>
       +
       +<p>Dumping the biometrics - <code>print( ep["75"] )</code> - gives these interesting pieces of metadata:</p>
       +
       +<pre><code class="language-_">'83': '20190311201345',
       +'meta': {   'Expression': 'Unspecified',
       +            'EyeColour' : 'Unspecified',
       +            'FaceImageBlockLength': 19286,
       +            'FaceImageType': 'Basic',
       +            'FeatureMask': '000000',
       +            'FeaturePoint': {0: {'FeaturePointCode': 'C1',
       +                                'FeatureType': '01',
       +                                'HorizontalPosition': 249,
       +                                'Reserved': '0000',
       +                                'VerticalPosition': 216},
       +                            1: {'FeaturePointCode': 'C2',
       +                                'FeatureType': '01',
       +                                'HorizontalPosition': 141,
       +                                'Reserved': '0000',
       +                                'VerticalPosition': 214}},
       +            'Features': {},
       +            'Gender': 'Unspecified',
       +            'HairColour': 'Unspecified',
       +            'ImageColourSpace': 'RGB24',
       +            'ImageDataType': 'JPEG',
       +            'ImageDeviceType': 0,
       +            'ImageHeight': 481,
       +            'ImageQuality': 'Unspecified',
       +            'ImageSourceType': 'Static Scan',
       +            'ImageWidth': 385,
       +            'LengthOfRecord': 19300,
       +            'NumberOfFacialImages': 1,
       +            'NumberOfFeaturePoint': 2,
       +            'PoseAngle': '0600B5',
       +            'PoseAngleUncertainty': '000000',
       +            'VersionNumber': b'010'
       +        }
       +</code></pre>
       +
       +<p>If I understand <a href="https://www.icao.int/security/mrtd/siteassets/pages/technical-reports/tr%20-%20rf%20and%20protocol%20testing%20part%204%20v2.10.pdf">the testing document</a> - the "Feature Points" are the middle of the eyes.  Interesting to see that gender (not sex!) and hair colour are also able to be recorded. The "PoseAngle" represents the <a href="https://www.icao.int/Security/FAL/TRIP/Documents/TR%20-%20Portrait%20Quality%20v1.0.pdf">pitch, yaw, and roll</a> of the face.</p>
       +
       +<h3 id="saving-the-image"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#saving-the-image" class="heading-link">Saving the image</a></h3>
       +
       +<p>Passport images are saved either with JPEG or with <a href="https://www.icao.int/Security/FAL/TRIP/Documents/TR%20-%20Portrait%20Quality%20v1.0.pdf">JPEG2000 encoding</a>. Given the extremely limited memory available photos are small and highly compressed. Mine was a mere 19KB.</p>
       +
       +<p>To save the image, grab the bytes and plonk them onto disk:</p>
       +
       +<pre><code class="language-python">photo = ep["75"]["A1"]["5F2E"]
       +with open( "photo.jpg", "wb" ) as f:
       +   f.write( photo )
       +</code></pre>
       +
       +<p>As expected, the "FeaturePoints" co-ordinates corresponded roughly to the centre of my eyes. Nifty!</p>
       +
       +<h2 id="what-didnt-work"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#what-didnt-work" class="heading-link">What didn't work</a></h2>
       +
       +<p>I tried a few different tools. Listed here so you don't make the same mistakes as me!</p>
       +
       +<h3 id="mrtdreader"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#mrtdreader" class="heading-link">mrtdreader</a></h3>
       +
       +<p>The venerable <a href="https://github.com/rubund/mrtdreader">mrtdreader</a>. My NFC device beeped, then mrtdreader said "No NFC device found."</p>
       +
       +<p>I think this is because <a href="https://github.com/nfc-tools/libnfc/issues/719">NFC Tools haven't been updated in ages</a>.</p>
       +
       +<h3 id="jean-francois-houzards-and-olivier-rogers-pypassport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#jean-francois-houzards-and-olivier-rogers-pypassport" class="heading-link">Jean-Francois Houzard's and Olivier Roger's pyPassport</a></h3>
       +
       +<p>I looked at <a href="https://code.google.com/archive/p/pypassport/">pyPassport</a> but it is only available for Python 2.</p>
       +
       +<h3 id="beaujeans-pypassport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#beaujeans-pypassport" class="heading-link">beaujean's pyPassport</a></h3>
       +
       +<p>This <a href="https://github.com/beaujeant/pypassport">pypassport</a> only checks if a passport is resistant to specific security vulnerabilities.</p>
       +
       +<h3 id="d-logic"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#d-logic" class="heading-link">d-Logic</a></h3>
       +
       +<p><a href="https://www.d-logic.com/nfc-rfid-reader-sdk/software/epassport-reading/">Digital Logic's ePassport software</a> only works with their hardware readers.</p>
       +
       +<h3 id="android-reader"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#android-reader" class="heading-link">Android reader</a></h3>
       +
       +<p><a href="https://github.com/tananaev/passport-reader">tananaev's passport-reader</a> - works perfectly on Android. So I knew my passport chip was readable - but the app won't run on Linux.</p>
       +
       +<h2 id="is-it-worth-it"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-it" class="heading-link">Is it worth it?</a></h2>
       +
       +<p>Yeah, I reckon so! Realistically, you aren't going to be able to crack the MRZ to read someone's passport. But if you need to gather personal information<sup id="fnref:gdpr"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:gdpr" class="footnote-ref" title="Under the auspices of GDPR, of course!" role="doc-noteref">3</a></sup>, it's perfectly possible to do so quickly from a passport.</p>
       +
       +<p>The MRZ is a <em>Machine Readable</em> Zone - so it is fairly simple to OCR the text and then pass that to your NFC reader.</p>
       +
       +<p>And even if the MRZ is gone, you can reconstruct it from the data printed on the passport.</p>
       +
       +<p>Of course, this won't be able to detect fraudulent passports. It doesn't check against a database to see if it has been revoked<sup id="fnref:interpol"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:interpol" class="footnote-ref" title="Nor does it check if the holder is on some Interpol list." role="doc-noteref">4</a></sup>. I don't think it will detect any cryptographic anomalies.</p>
       +
       +<p>But if you just want to see what's on your travel documents, it works perfectly.</p>
       +
       +<div class="footnotes" role="doc-endnotes">
       +<hr>
       +<ol start="0">
       +
       +<li id="fn:long" role="doc-endnote">
       +<p>There are some <a href="https://www.shopnfc.com/en/nfc-readers-writers/300-nfc-xl-reader-long-range-hf-reader.html">commercially available long range readers</a> - up to 15cm! I've no doubt some clever engineer has made a some high-powered radio device which can read things from a mile away using a <a href="https://www.makeuseof.com/tag/how-to-make-a-wifi-antenna-out-of-a-pringles-can-nb/">Pringle's tube</a>. Of note, the <a href="https://www.icao.int/publications/Documents/9303_p11_cons_en.pdf">ICAO guidance</a> says:</p>
       +
       +<blockquote><p>the unencrypted communication between a contactless IC and a reader can be eavesdropped within a distance of several metres.</p></blockquote>
       +
       +<p><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:long" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:old" role="doc-endnote">
       +<p>I'm not dumb enough to do this stuff on a <em>live</em> passport!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:old" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:sex" role="doc-endnote">
       +<p>Sex is complicated<sup id="fnref:giggle"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:giggle" class="footnote-ref" title="Stop giggling at the back!" role="doc-noteref">5</a></sup>. But ICAO allow for "<a href="https://www.icao.int/publications/Documents/9303_p4_cons_en.pdf">F for female, M for male, or X for unspecified</a>".&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:sex" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:gdpr" role="doc-endnote">
       +<p>Under the auspices of GDPR, of course!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:gdpr" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:interpol" role="doc-endnote">
       +<p>Nor does it check if the holder is on some Interpol list.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:interpol" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:giggle" role="doc-endnote">
       +<p>Stop giggling at the back!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:giggle" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +</ol>
       +</div>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#comments" thr:count="8" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/feed/atom/" thr:count="8" />
       +                        <thr:total>8</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[An annoying SVG animation bug in Chrome]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61537</id>
       +                <updated>2025-06-23T09:03:34Z</updated>
       +                <published>2025-06-23T11:34:12Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="bug" /><category scheme="https://shkspr.mobi/blog" term="chrome" /><category scheme="https://shkspr.mobi/blog" term="chromium" /><category scheme="https://shkspr.mobi/blog" term="svg" />
       +                <summary type="html"><![CDATA[Writing web standards is hard. You have to write a formal specification which is useful for machines, humans, and web developers.  I recently stumbled across what I think is a little bug which might be caused by a misreading of the SVG Animation specification.  Here you should see two overlapping circles gradually appear:                                                  If you&#039;re on Chrome, you…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/"><![CDATA[
       +                                <html><head></head><body><p>Writing web standards is hard<sup id="fnref:experience"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:experience" class="footnote-ref" title="I do have some experience in this matter." role="doc-noteref">0</a></sup>. You have to write a formal specification which is useful for machines, humans, and web developers<sup id="fnref:webdev"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:webdev" class="footnote-ref" title="Back in 2006, Catharine A. MacKinnon provokatively asked &quot;Are Women Human?&quot;. Her argument (which I shall badly summarise) is that if women were human, then they'd be protected by universal human…" role="doc-noteref">1</a></sup>.</p>
       +
       +<p>I recently stumbled across what I think is a little bug which <em>might</em> be caused by a misreading of <a href="https://svgwg.org/specs/animations/#KeyTimesAttribute">the SVG Animation specification</a>.  Here you should see two overlapping circles gradually appear:</p>
       +
       +<svg width="170" height="170" xmlns="http://www.w3.org/2000/svg">
       +    <path fill="#2c4169" d="M170 0H0v170h170z"></path>
       +    <circle r="45" cx="50" cy="50" fill="#e4da2e" opacity="0">
       +        <animate attributeName="opacity" begin="0s" dur="30s" values="0;  1;" keyTimes="0;  1" fill="freeze"></animate>
       +    </circle>
       +    <circle r="45" cx="80" cy="80" fill="red" opacity="0">
       +        <animate attributeName="opacity" begin="0s" dur="30s" values="0;  1;" keyTimes="0;  1;" fill="freeze"></animate>
       +      </circle>
       +</svg>
       +
       +<p>If you're on Chrome, you might only see one circle animate. Why? Bloody semicolons! The bane of every programmer's existence<sup id="fnref:eng"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:eng" class="footnote-ref" title="I imagine English literature students also find them confusing; everyone does." role="doc-noteref">2</a></sup>.</p>
       +
       +<p>The <a href="https://svgwg.org/specs/animations/#KeyTimesAttribute">specification for SVG Animation</a> has this text for human readers:</p>
       +
       +<blockquote><p><strong>keyTimes</strong></p>
       +
       +<p>A semicolon-separated list of time values used to control the pacing of the animation. Each time in the list corresponds to a value in the ‘values’ attribute list, and defines when the value is used in the animation function.</p>
       +
       +<p>[…]</p>
       +
       +<p>If the last semicolon separator is followed by either just white space or no more characters, ignore both the separator and the trailing white space.</p></blockquote>
       +
       +<p>To me, that isn't ambiguous. The text <code>keyTimes="0; 1;"</code> has a final semicolon with nothing after it. Therefore it should be ignored. Instead, Chrome throws an hissyfit and says <code>Error: &lt;animate&gt; attribute keyTimes: Invalid value, "0; 1;".</code></p>
       +
       +<p>But maybe the humans who wrote the description were sloppy. There's also a machine-readable formal specification. It defines the acceptable sequence as being:</p>
       +
       +<p><code>&lt;number&gt; [; &lt;number&gt;]* ;?</code></p>
       +
       +<p>This isn't quite Backus–Naur form<sup id="fnref:bnf"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:bnf" class="footnote-ref" title="Also the bane of programmers everywhere!" role="doc-noteref">3</a></sup>, but rather <a href="https://www.w3.org/TR/css-values/#value-defs">CSS Values</a>.</p>
       +
       +<ul>
       +<li>The <code>&lt;number&gt;</code> is a <a href="https://www.w3.org/TR/css-values/#component-types">component</a>.</li>
       +<li>The <code>[</code> and <code>]</code> are <a href="https://www.w3.org/TR/css-values/#component-combinators">grouping combinators</a>.</li>
       +<li>The <code>*</code> and <code>?</code> are <a href="https://www.w3.org/TR/css-values/#component-multipliers">component multipliers</a>
       +
       +<ul>
       +<li><code>*</code> "indicates that the preceding type, word, or group occurs zero or more times."</li>
       +<li><code>?</code> "indicates that the preceding type, word, or group is optional (occurs zero or one times)."</li>
       +</ul></li>
       +<li>The <code>;</code> is just a semicolon<sup id="fnref:cig"><a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fn:cig" class="footnote-ref" title="Just like how sometimes a cigar is just a cigar." role="doc-noteref">4</a></sup>.</li>
       +</ul>
       +
       +<p>Reading the definition tells us that a valid value will be a number, followed by zero-or-more groups of "semicolon and another number" with an optional final semicolon.</p>
       +
       +<p>So, based on my reading, I think Chrome is wrong to throw an error here. Both Firefox and Safari work with a trailing semicolon.</p>
       +
       +<p>Accordingly, I've <a href="https://issues.chromium.org/issues/427020732">raised a bug with the Chromium team</a>.  If you think I have erred in this matter, please let me know.</p>
       +
       +<div class="footnotes" role="doc-endnotes">
       +<hr>
       +<ol start="0">
       +
       +<li id="fn:experience" role="doc-endnote">
       +<p>I do have <a href="https://www.w3.org/TR/2018/WD-html53-20180426/">some experience in this matter</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:experience" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:webdev" role="doc-endnote">
       +<p>Back in 2006, Catharine A. MacKinnon provokatively asked "<a href="https://doi.org/10.2307/j.ctvjnrvck">Are Women Human?</a>". Her argument (which I shall badly summarise) is that if women <em>were</em> human, then they'd be protected by universal human rights. Given the state of the world then (and now) it is hard to argue that women receive as great a level of attention as the <a href="https://www.the-tls.com/politics-society/rights-equality/default-male">default male</a>. I don't intend to trivialise MacKinnon's work - but I do find it interesting that developers are often treated separately from other humans.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:webdev" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:eng" role="doc-endnote">
       +<p>I imagine English literature students also find them confusing; everyone does.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:eng" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:bnf" role="doc-endnote">
       +<p>Also the bane of programmers everywhere!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:bnf" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +<li id="fn:cig" role="doc-endnote">
       +<p>Just like how <a href="https://quoteinvestigator.com/2011/08/12/just-a-cigar/">sometimes a cigar is just a cigar</a>.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#fnref:cig" class="footnote-backref" role="doc-backlink"><img src="https://s.w.org/images/core/emoji/15.1.0/72x72/21a9.png" alt="↩" class="wp-smiley" style="height: 1em; max-height: 1em;" />︎</a></p>
       +</li>
       +
       +</ol>
       +</div>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/#comments" thr:count="1" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/an-annoying-svg-animation-bug-in-chrome/feed/atom/" thr:count="1" />
       +                        <thr:total>1</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Theatre Review: Operation Mincemeat ★★★★☆]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/theatre-review-operation-mincemeat/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61507</id>
       +                <updated>2025-06-22T09:14:43Z</updated>
       +                <published>2025-06-22T11:34:01Z</published>
       +                <category scheme="https://shkspr.mobi/blog" term="/etc/" /><category scheme="https://shkspr.mobi/blog" term="Theatre Review" />
       +                <summary type="html"><![CDATA[Everyone I know told me to go and see this show. I resisted as long as possible but managed to score cheap last-minute tickets via a friend. I wish I hadn&#039;t waited so long!  If you&#039;re unaware of the book (or the film. Or the novelisation of the film. Or the Twitter thread. Or the inaccurate tumblr retelling.) the story involves a dastardly British plan to use a corpse to fool the Nazi menace…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/theatre-review-operation-mincemeat/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/Operation_Mincemeat-1-400-400-100-nocrop.jpeg" alt="Logo for Operation Mincemeat - a black scribble on a yellow background." width="200" height="200" class="alignleft size-full wp-image-61508"> Everyone I know told me to go and see this show. I resisted as long as possible but managed to score cheap last-minute tickets via a friend. I wish I hadn't waited so long!</p>
       +
       +<p>If you're unaware of the book (or the film. Or the novelisation of the film. Or the Twitter thread. Or the inaccurate tumblr retelling.) the story involves a dastardly British plan to use a corpse to fool the Nazi menace into diverting their troops.</p>
       +
       +<p>So, naturally, this is a glitzy West End Musical. And, as befitting a story with a hundred different characters, there are five cast members playing everyone. Obviously, it is <em>very</em> silly.</p>
       +
       +<p>I can't lie - I found the start of the first act a bit underwhelming. It feels derivative of every other musical I've seen; like a British "Hamilton" without the budget. But as it wore on, something magical happened. The songs become interesting, the choreography leaps alive, and the cast started playing off the audience’s energy.</p>
       +
       +<p>The second act has the strongest opening I've seen in a good long while. It builds to a terrific conclusion - with just the right amount of joy and melancholy.</p>
       +
       +<p>Naturally, the cast are superb. It's exhausting watching them quick-change and shimmy across the stage. They are a beautifully formed ensemble. I usually don't like seeing shows multiple times, but given the frequent cast changes I find myself curious about how the various permutations work.</p>
       +
       +<p>It is an excellent and kinetic work of theatre. It revels in its daftness and knows exactly when to tug your heartstrings.</p>
       +
       +<h2 id="pre-show"><a href="https://shkspr.mobi/blog/2025/06/theatre-review-operation-mincemeat/#pre-show" class="heading-link">Pre-Show</a></h2>
       +
       +<p>Regular readers know how much I love discussing the pre-show elements. Mincemeat isn't as bad as most, but still treats the paying audience with the contempt London venues are known for.</p>
       +
       +<p>The theatre is cramped, with a packed bar, and inadequate toilet facilities. The corridors are decorated with photos of current cast members, which is nice. There's also a pre-show trivia quiz which, while fun, is only half-a-dozen questions - essentially a thinly veiled attempt to get you onto a mailing list.</p>
       +
       +<p>The cost of the programme is exorbitant - an advert filled brochure with the same information as can be found on the website.</p>
       +
       +<p>On the plus side, the stall seats are spacious and there's a bar to one side (if you can afford it).</p>
       +
       +<p>A single "cheap" ticket usually costs about 3-months of Netflix. Full price tickets are a monocle-popping 7-months of Netflix! At that price I'd expect a free souvenir programme and a complimentary ice-cream. And possibly a foot-massage.</p>
       +
       +<p>The <a href="https://operationmincemeat.com/tickets/">ticket lottery</a> reduces prices to a shade under 2-months of Netflix.</p>
       +
       +<p>There's nothing like seeing live theatre performed by a hyper-talented cast. Theatres need to understand that home entertainment is ubiquitous, cheap, <strong>and comfortable</strong>. If I can't pause your show to go for a wee, you'd better make sure you have enough loos for everyone at the interval.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/theatre-review-operation-mincemeat/#comments" thr:count="0" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/theatre-review-operation-mincemeat/feed/atom/" thr:count="0" />
       +                        <thr:total>0</thr:total>
       +                        </entry>
       +                <entry>
       +                <author>
       +                        <name>@edent</name>
       +                                        </author>
       +
       +                <title type="html"><![CDATA[Book Review: Venomous Lumpsucker by Ned Beauman ★★★★★]]></title>
       +                <link rel="alternate" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-venomous-lumpsucker-by-ned-beauman/" />
       +
       +                <id>https://shkspr.mobi/blog/?p=61183</id>
       +                <updated>2025-06-13T09:16:16Z</updated>
       +                <published>2025-06-21T11:34:56Z</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="satire" /><category scheme="https://shkspr.mobi/blog" term="Sci Fi" />
       +                <summary type="html"><![CDATA[No book has the right to be this good. It&#039;s the sort of howling sci-fi satire that Ben Elton used to excel at - a novel set five minutes in the future with a eye firmly on today&#039;s problems.  The plot is delightful - what if carbon credits extinction credits were the new capitalist plaything? What second, third, and forth order effects would that have on the world? The worldbuilding is sublime -…]]></summary>
       +
       +                                        <content type="html" xml:base="https://shkspr.mobi/blog/2025/06/book-review-venomous-lumpsucker-by-ned-beauman/"><![CDATA[
       +                                <html><head></head><body><p><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/06/hbg-title-venomous-lumpsucker-4-1.webp" alt="Book cover with fish." width="200" class="alignleft size-full wp-image-61184"> No book has the right to be this good. It's the sort of howling sci-fi satire that Ben Elton used to excel at - a novel set five minutes in the future with a eye firmly on today's problems.</p>
       +
       +<p>The plot is delightful - what if <del>carbon credits</del> extinction credits were the new capitalist plaything? What second, third, and forth order effects would that have on the world? The worldbuilding is sublime - with an prescient look at the evolution of DRM, Smart Contracts, AI assistants, and targetted assassinations.</p>
       +
       +<p>The characters are perfectly fleshed out and gradually reveal their motivations and insecurities:</p>
       +
       +<blockquote><p>one big thing about the socially normal was that they loved their social norms. Whereas Resaint couldn’t stand the politics, the niceties, the meetings where she had to spangle her expression and tone of voice with false enthusiasm just so people didn’t think she was a bitch.</p></blockquote>
       +
       +<p>There is a <em>slight</em> tendency towards Socratic dialogue as a means of exposition. The satire itself isn't exactly subtle - but when it has this many twists and turns I can forgive it for laying it on a bit thick.</p>
       +
       +<p>The ending(s) genuinely shocked me.</p>
       +</body></html>]]></content>
       +                
       +                                        <link rel="replies" type="text/html" href="https://shkspr.mobi/blog/2025/06/book-review-venomous-lumpsucker-by-ned-beauman/#comments" thr:count="2" />
       +                        <link rel="replies" type="application/atom+xml" href="https://shkspr.mobi/blog/2025/06/book-review-venomous-lumpsucker-by-ned-beauman/feed/atom/" thr:count="2" />
       +                        <thr:total>2</thr:total>
       +                        </entry>
       +        </feed>