Shellsharks Blogroll - BlogFlock 2026-06-24T15:51:01.209Z BlogFlock Adepts of 0xCC, destructured, fLaMEd, Trail of Bits Blog, Aaron Parecki, gynvael.coldwind//vx.log (pl), Westenberg, James' Coffee Blog, joelchrono, Evan Boehs, cool-as-heck, Kev Quirk, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Werd I/O, Johnny.Decimal, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s Blog Tiamat's Wrath (The Expanse #8) - Joel's Log Files https://joelchrono.xyz/blog/tiamats-wrath 2026-06-24T15:00:00.000Z <p>The eight book of <em>The Expanse</em> by James S.A. Corey. Spoilers ahead.</p> <p>I’ve recently realized that I kind of spend too much time summarizing things without spoilers, but I’ll just share the summary from the website and then share my thoughts about stuff, I guess? By now, eight books later, you are not, or you should not, be reading this review unless you are already with me, or you read the book and want my thoughts, so yeah, whatever.</p> <blockquote> <p>Tiamat’s Wrath finds the crew of the Rocinante fighting an underground war against a nearly invulnerable authoritarian empire, with James Holden a prisoner of the enemy.</p> <p>Thirteen hundred gates have opened to solar systems around the galaxy. But as humanity builds its interstellar empire in the alien ruins, the mysteries and threats grow deeper.</p> <p>In the dead systems where gates lead to stranger things than alien planets, Elvi Okoye begins a desperate search to discover the nature of a genocide that happened before the first human beings existed, and to find weapons to fight a war against forces at the edge of the imaginable. But the price of that knowledge may be higher than she can pay.</p> <p>At the heart of the empire, Teresa Duarte prepares to take on the burden of her father’s godlike ambition, but Teresa has a mind of her own and secrets even her father the emperor doesn’t guess.</p> <p>And throughout the wide human empire, the scattered crew of the Rocinante fights a brave rear-guard action against Duarte’s authoritarian regime. Memory of the old order falls away, and a future under Laconia’s eternal rule—and with it, a battle that humanity can only lose—seems more and more certain. Because against the terrors that lie between worlds, courage and ambition will not be enough. . .</p> </blockquote> <p>The second book of the third trilogy was quite the read. There are a lot of things happening that I didn’t see coming, like at all.</p> <p>Every character here is once again, separated from each other for half the book. This was an incredible choice, as well as the addition of Teresa, who gives us a look into how the Empire really works and how things develop from there. As young as she may be, the responsibilities on her shoulders are quite the burden, and it’s interesting how everything pans out through her choices.</p> <p>This book barely features Holden’s perspective, as he’s trapped and unable to do a lot. Most of the time he’s just reacting to the choices of everyone else, completely oblivious, although he does make a play, and the way things go from there turn out to be extremely important for his survival.</p> <p>Elvi is pretty important given her position as a scientist, it was nice to see her and Fayez again, I must admit. Her passion for science continues to be infectious, and through her chapters we will see the aliens at play once more. The cosmical events in this book were something I didn’t see coming at all. The alien artifacts and technology, the measures taken by the Laconian Empire to try and harness such power, and her involvement on a huge plot twist made her chapters truly remarkable to me!</p> <p>Naomi continues to be an incredibly cool individual, and now her role is more important than ever as part of the Rebellion against the Empire. She really will be travelling all over the place avoiding the enemy, by herself. Dealing with all this without Holden gives way to some emotional moments too.</p> <p>Bobbie will actually clash with Naomi as another leader, in a friendly enough way. As the captain of the one ship that could actually deal any damage to the Empire, her role will be quite vital on this story, aided by Alex.</p> <p>Alas, Amos goes missing—said very early on the story—Alex is still a loyal, but tired pilot, and many other things happen.</p> <p>The writing was as good as ever, the plot twists really got to me. It really felt kind of dark and hopeless and a bit sad at times, with a lot of writing decisions I didn’t see coming, including some unexpected losses or changes to the characters. Beware!</p> <p>As much as I liked the writing, I think the story got a bit weird at times, like they setup a lot of stuff and powered up the bad guys on the previous book, and ended up backtracking quite a bit here. It makes sense within the story and it’s all justified, but a lot of things felt a little shoved aside to make things much more plausible. Still, I give it a pass.</p> <p>With how things have gone, I am really looking forward to the finale, there’s still so much that needs to wrap up…</p> <p>Good stuff.</p> <table> <thead> <tr> <th style="text-align: left">Date</th> <th style="text-align: right">Pages</th> <th style="text-align: right">Time</th> <th style="text-align: right">%</th> </tr> </thead> <tbody> <tr> <td style="text-align: left">2026-05-12</td> <td style="text-align: right">67</td> <td style="text-align: right">1:00:00</td> <td style="text-align: right">5.2</td> </tr> <tr> <td style="text-align: left">2026-05-14</td> <td style="text-align: right">50</td> <td style="text-align: right">0:35:21</td> <td style="text-align: right">9.1</td> </tr> <tr> <td style="text-align: left">2026-05-15</td> <td style="text-align: right">71</td> <td style="text-align: right">1:13:09</td> <td style="text-align: right">14.61</td> </tr> <tr> <td style="text-align: left">2026-05-17</td> <td style="text-align: right">18</td> <td style="text-align: right">0:20:07</td> <td style="text-align: right">16.01</td> </tr> <tr> <td style="text-align: left">2026-05-18</td> <td style="text-align: right">65</td> <td style="text-align: right">0:56:00</td> <td style="text-align: right">21.06</td> </tr> <tr> <td style="text-align: left">2026-05-19</td> <td style="text-align: right">60</td> <td style="text-align: right">0:57:53</td> <td style="text-align: right">25.72</td> </tr> <tr> <td style="text-align: left">2026-05-20</td> <td style="text-align: right">35</td> <td style="text-align: right">0:31:33</td> <td style="text-align: right">28.44</td> </tr> <tr> <td style="text-align: left">2026-05-21</td> <td style="text-align: right">74</td> <td style="text-align: right">1:01:49</td> <td style="text-align: right">34.19</td> </tr> <tr> <td style="text-align: left">2026-05-22</td> <td style="text-align: right">118</td> <td style="text-align: right">1:48:57</td> <td style="text-align: right">43.35</td> </tr> <tr> <td style="text-align: left">2026-05-23</td> <td style="text-align: right">26</td> <td style="text-align: right">0:25:34</td> <td style="text-align: right">45.37</td> </tr> <tr> <td style="text-align: left">2026-05-24</td> <td style="text-align: right">73</td> <td style="text-align: right">1:07:21</td> <td style="text-align: right">51.04</td> </tr> <tr> <td style="text-align: left">2026-05-25</td> <td style="text-align: right">98</td> <td style="text-align: right">1:35:15</td> <td style="text-align: right">58.65</td> </tr> <tr> <td style="text-align: left">2026-05-26</td> <td style="text-align: right">31</td> <td style="text-align: right">0:26:00</td> <td style="text-align: right">61.06</td> </tr> <tr> <td style="text-align: left">2026-05-27</td> <td style="text-align: right">92</td> <td style="text-align: right">1:20:09</td> <td style="text-align: right">68.2</td> </tr> <tr> <td style="text-align: left">2026-05-28</td> <td style="text-align: right">50</td> <td style="text-align: right">0:44:46</td> <td style="text-align: right">72.08</td> </tr> <tr> <td style="text-align: left">2026-05-31</td> <td style="text-align: right">44</td> <td style="text-align: right">0:36:23</td> <td style="text-align: right">75.5</td> </tr> <tr> <td style="text-align: left">2026-06-07</td> <td style="text-align: right">47</td> <td style="text-align: right">0:45:47</td> <td style="text-align: right">79.15</td> </tr> <tr> <td style="text-align: left">2026-06-08</td> <td style="text-align: right">83</td> <td style="text-align: right">1:34:08</td> <td style="text-align: right">85.59</td> </tr> <tr> <td style="text-align: left">2026-06-09</td> <td style="text-align: right">186</td> <td style="text-align: right">2:26:14</td> <td style="text-align: right">100</td> </tr> <tr> <td style="text-align: left">Total</td> <td style="text-align: right">1288</td> <td style="text-align: right">19:26:26</td> <td style="text-align: right">100</td> </tr> </tbody> </table> <p>This is day 84 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=Tiamat's Wrath (The Expanse #8)">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116805698423911319">Reply on Fediverse</a> </p> Journalism is rearranging the deckchairs. It needs to reinvent itself. - Werd I/O 6a3bdcce1f238300013908b6 2026-06-24T13:34:06.000Z <p>Link: <a href="https://shirishkulkarni.co.uk/journalisms-logical-fallacy/?ref=werd.io"><em>Journalism&apos;s Logical Fallacy, by Shirish Kulkarni</em></a></p><p>Journalism is in crisis, and it&#x2019;s really easy (and lazy) to say that making a technology or process tweak will fix it: we just need to use AI to fill capacity gaps, or build stronger comments into our site, or we need a better business or distribution model.</p><p>None of those things address the underlying question of <em>why</em> we need journalism, why it&#x2019;s important, and what it should be. By addressing innovation at the edges, newsrooms are avoiding the hard, existential work of revisiting their core value to begin with. But it&#x2019;s only by understanding that core value that they will actually reset their relationships with audiences, build greater trust and loyalty, and pull themselves out of the rut they find themselves in.</p><p>Shirish Kulkarni&#x2019;s findings from listening projects in Wales &#x2014; with multiple dramatically different demographics &#x2014; contradict a lot of the narratives newsrooms have been telling themselves. For example:</p><blockquote>&#x201C;The second finding challenges one of the journalism industry&#x2019;s most comfortable premises: that audiences &#x2013; particularly marginalised communities &#x2013; are news-illiterate and need to be educated. The opposite is true. In fact, the communities we work with are forensically sharp about media &#x2013; often more so than the industry insiders who talk about them.&#x201D;</blockquote><p>This mirrors something you often hear from mission-driven tech projects: &#x201C;we just need to educate the user&#x201D;. Usually the opposite is true: you need to educate yourself <em>about</em> the user and give them the thing they actually need. And in the case of journalism, at least as a finding of this research, the need turns out to be pretty simple:</p><blockquote>&#x201C;They want help making good decisions. For themselves, their families, their communities. Not drama, not outrage, not the next breaking story. Practical, trustworthy, usable information that helps them navigate their lives.&#x201D;</blockquote><p>It&#x2019;s important, once again, to separate the work of <em>news</em> &#x2014; breaking headlines, emergent facts &#x2014; from <em>journalism&#x2019;s</em> work to provide context and meaning. The first is a commodity; the second is both inherently community-driven and has always been more valuable.</p><p>Here I want to bang an old drum: newsrooms like to talk about <em>audience</em> strategies, not <em>community</em> strategies. It&#x2019;s a meaningful difference that Shirish highlights well. The first implies an ivory tower broadcast approach: &#x201C;we just need to reach people&#x201D;. The second is an active relationship between a newsroom and the people it serves; a two-way conversation that requires trust and understanding on both sides.</p><p>The internet has always been a conversation. We&#x2019;ve had the ability to build relationship-centric news organizations for 30 years, but most remain stubbornly set in a print mindset. This kind of research makes it clear how important that shift is, but, like Shirish, I don&#x2019;t believe most existing newsrooms will evolve to actually meet this need. They can&#x2019;t: the immediate commercial pressure is severe, and changing the model requires changing highly-ingrained cultural norms and assumptions that have been inherited from print. And in the midst of that panic, they&#x2019;re jumping into bed with companies (AI vendors, proprietary social media platforms) that intermediate their relationships with their communities in exchange for some short-term wins.</p><p>So their outlook is not rosy. Instead, I think we&#x2019;ll see <em>new</em> newsrooms emerge that reinvent what journalism is, are unafraid to build real, lasting, two-way relationships with the people they&#x2019;re trying to serve, and eat everybody else&#x2019;s lunch.</p> Auth0 PHP - manually authenticating JWT idTokens - Terence Eden’s Blog https://shkspr.mobi/blog/?p=70732 2026-06-24T11:34:25.000Z <p>I find it baffling just how poorly documented most big projects are. Auth0 by Okta has a fair bit of cash, lots of customers, and almost completely absent documentation.</p> <p>Here's how to successfully authenticate a JWT supplied by Auth0.</p> <p>Once your user has authenticated with Auth0, they will be given an <code>accessToken</code> and an <code>idToken</code>. Only the <code>idToken</code> is needed for our purposes.</p> <p>It will look something like this:</p> <p><code>eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImFiYzEyMyJ9.eyJnaXZlbl9uYW1lIjoiSm8iLCJmYW1pbHlfbmFtZSI6IlRlc3QiLCJuaWNrbmFtZSI6IkpvVGVzdCIsIm5hbWUiOiJKbyBMZSBUZXN0IiwicGljdHVyZSI6Imh0dHBzOi8vZXhhbXBsZS5jb20vam8ucG5nIiwidXBkYXRlZF9hdCI6IjIwMjYtMDQtMjhUMTM6NTk6NTUuNjcxWiIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJpc3MiOiJodHRwczovL2V4YW1wbGUuZXUuYXV0aDAuY29tLyIsImF1ZCI6ImFiYzEyMyIsInN1YiI6ImZhY2Vib29rfDEyMzQ1NiIsImlhdCI6MTc3NzM4NDc5NiwiZXhwIjoxNzc3NDIwNzk2LCJzaWQiOiJhYmMxMjMtNDU2LWRlZmdoaWprIiwibm9uY2UiOiIxMjM0NTY3ODkwIn0.ZgnZxOOtfczLewlm_agK6mJMYetVTZrHlBlu5qzXbADlhvZB8RraVuFKmFutLZLibMQxz_RY0oh4hRufVWDHJ0kuocW38kRHztDg7R5KOfvJEM46WW49xvhLhKprzkx9WXDDlpCRNL0QbBK2U0F1VjmRpTp1Q5cHEd8PBsa4rGAhfqudXp5JrC2Lm5e7ji0AQ_s7HJhy59b9mTb3tMqHGsrWDZS915zHPYEQtSvg5o9sSx1tCRfsyL6kdsdkaTffQjJDUrT5hpIQ-2_9tGuqioJjP4c0edQ85TaK9UnSxfzMQ8gYez963kbo_Iv1fJyaTVwXR-AVvwK-CeGJAFrheQ</code></p> <p>Yeuch! If you stick it into <a href="https://www.jwt.io/">JWT.io</a> you'll see that it is Base64 encoded JSON containing a header, body, and signature. Each part is separated by a <code>.</code> character.</p> <p>You could manually decode it, but that's a bit of a pain in the arse. So here's how to do it with <a href="https://github.com/auth0/auth0-PHP/">the Auth0 PHP library</a>. I'm <a href="https://github.com/auth0/symfony">using the Symfony one</a>, but it should all be fairly similar.</p> <p>First, import the library:</p> <pre><code class="language-php">use Auth0\SDK\Auth0; </code></pre> <p>Next, you'll need to send the token to the PHP. You can do this in a header, GET, or similar:</p> <pre><code class="language-php">$authHeader = $request-&gt;headers-&gt;get("Auth0-Authorization"); </code></pre> <p>Then, set up Auth0 so that it can parse and validate the token:</p> <pre><code class="language-php">try { $token = $authHeader; $auth0 = new Auth0([ "domain" =&gt; $_ENV["AUTH0_DOMAIN"], "clientId" =&gt; $_ENV["AUTH0_CLIENT_ID"], "clientSecret" =&gt; $_ENV["AUTH0_CLIENT_SECRET"], "cookieSecret" =&gt; "_" // Dummy value. ]); $decoded = $auth0-&gt;decode( token: $token, tokenType: \Auth0\SDK\Token::TYPE_ID_TOKEN, ); } catch (\Exception $e) { error_log("Auth0 Error - {$e}"); } </code></pre> <p>The <code>cookieSecret</code> <em>must</em> be set - even though you aren't using cookies. Any non-null value is fine.</p> <p>The <code>tokenType</code> must also be set correctly.</p> <p>Assuming you all goes well, you will have a <code>decoded</code> object which has validated against Auth0. So how do you get the user's details from it?</p> <p>Well, you <em>could</em> split the original <code>idToken</code> at the period character and Base64 decode the middle one. Try it now to see what it contains! Or <code>print_r()</code> the decoded token to see it in all its cryptographic glory.</p> <p>The easiest way is to do:</p> <pre><code class="language-php">$claims = $decoded-&gt;toArray(); </code></pre> <p>Then you can access various properties by doing:</p> <pre><code class="language-php">$username = $claims["nickname"]; $identifier = $claims["sub"]; </code></pre> <p>Perhaps there is a more official way - but I couldn't find anything in the documentation. Hurrah for reading source code!</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=70732&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager"> Thinking out loud about project management - Johnny.Decimal https://johnnydecimal.com/blog/0225-thinking-out-loud-pm/ 2026-06-24T00:40:26.000Z <p>This is a working draft for figuring out the end of our <a href="https://johnnydecimal.com/jdu/taskpm/">Task and Project Management course</a>.</p> <div class="youtube-embed" data-astro-cid-aomsn35f=""><iframe src="https://www.youtube-nocookie.com/embed/JuXHu9YVDFI" title="YouTube video" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" referrerpolicy="strict-origin-when-cross-origin" data-astro-cid-aomsn35f=""></iframe></div> <p>I&#39;ve been thinking a lot about project management for the last 6 months and I&#39;m thinking out loud here, nothing is set in stone. However, me and Lucy are using the concepts mentioned and it&#39;s working really well in our business.</p> <p>Overall, there&#39;s nothing radically new in terms of project management principles. But how can these principles work alongside a Johnny.Decimal system to help us complete very-small or very-big projects successfully?</p> <p>This is a rough-sketch, draft-rehearsal for the final project management modules in the course. We weren&#39;t going to publish it, but what the hey, maybe it will help someone or generate practical feedback.</p> Throwing my Roku in the trash - Posts feed https://www.coryd.dev/posts/2026/throwing-my-roku-in-the-trash 2026-06-23T22:57:00.000Z <div class="e-content"><p>I work from a big corner desk and part of the space on that desk is taken up by a small TV positioned in the corner. I use it occasionally and, for the longest time, it&#39;s had a Roku stick attached to it. It&#39;s reliable, but the UI has been filled with more and more cruft when all I ever want to do is launch <a href="https://jellyfin.org">Jellyfin</a>.<sup id="fnref:1" class="footnote-ref">1</sup></p> <p>This was the lone Roku device on our home network, it was mostly idle and the top two domains blocked by <a href="https://nextdns.io/?from=m56mt3z6">NextDNS</a> were a pair of Roku tracking subdomains. <a href="https://newsroom.roku.com/news/2026/06/fox-corporation-to-acquire-roku-inc-/ishjvytb-1781489389">Roku is also being acquired by an odious media company.</a> I&#39;m invested to the tune of, maybe, $29.99. I bought a cheap device and got a progressively crappy experience. It&#39;s not a whole ecosystem, it&#39;s not inescapable, but it&#39;s all irritating.</p> <p>I looked at onn streaming devices<sup id="fnref:2" class="footnote-ref">2</sup> but ended up buying a cheap Xiaomi TV box running Google TV. Out of the frying pan and into the fire, sort of. The key differentiator here is that Google TV means Android, Android means I can install and meaningfully change things.</p> <p>I plugged the thing in, added Xiaomi to my native tracking denylist in nextDNS, set up a throwaway Google account and configured things:</p> <ol> <li>Unlock developer options: navigate to <code>Settings -&gt; System -&gt; About -&gt; scroll to &#34;Android TV OS build&#34; and click it until it says &#34;You are now a developer.</code></li> <li>Enable <a href="https://developer.android.com/tools/adb">Android Debug Bridge</a>: <code>Settings -&gt; System -&gt; Developer options -&gt; turn on USB debugging</code> (conveniently this also enables network ADB).</li> <li>Install ADB: <code>brew install android-platform-tools</code>.</li> <li>Connected to the streaming box: <code>adb connect &lt;box-ip&gt;:5555</code>. The TV&#39;ll prompt you to allow USB debugging and you can opt to always allow from this computer.</li> </ol> <p>From here, things are wide open. I grabbed the F-Droid APK from their site and installed it (<code>adb install F-Droid.apk</code>) and installed <a href="https://f-droid.org/en/packages/app.smarttube.fdroid/">SmartTube</a> as well. Google TV&#39;s home screen is about as noisy as Roku&#39;s (it also includes ads) but you can get around that by using a custom launcher. I went with <a href="https://projectivylauncher.com">Projectivy</a>. When installed it&#39;ll prompt you for access necessary to override the default launcher and you can configure it to be far, far more minimal than the defaults for either of these platforms.</p> <p>The last change I made was to install <a href="https://buttonmapper.com">Button Mapper</a>. It&#39;ll prompt you for permissions much like Projectivy does and let you remap all of the (often useless) streaming app specific buttons on your remote. Netflix now opens Jellyfin, Prime opens Apple TV and YouTube opens SmartTube (naturally).</p> <p>It&#39;s a reasonable amount of configuration but now, when I do use this particular TV, it&#39;s not at all grating.<sup id="fnref:3" class="footnote-ref">3</sup> There are no ads, no unnecessary apps, no irritating screensavers. It plays what I want, without issue.</p> <div class="footnotes" role="doc-endnotes"><hr/><ol><li id="fn:1"><p>Pressing the home button conveniently scrolls you up to rows of Roku-provided junk, rather than the top row of apps you have installed. ↩</p> </li><li id="fn:2"><p>Apparently these are made by Walmart? Are they any less terrible than Fox? ↩</p> </li><li id="fn:3"><p>We&#39;ll see how Xiaomi does in the NextDNS tracker blocker rankings. ↩</p> </li></ol></div></div> Signs you're a dangerous terrorist: using Signal, moving zines - Werd I/O 6a3acd84bdf9df00019c2572 2026-06-23T18:16:37.000Z <p>Link: <a href="https://www.theguardian.com/us-news/2026/jun/23/prairieland-ice-protesters-texas-sentenced?ref=werd.io"><em>Texas anti-ICE protesters convicted of terrorism charges sentenced to at least 50 years in prison, by Sam Levine in The Guardian</em></a></p><p>This is an outrageous litmus test for the freedom to protest in America:</p><blockquote>&#x201C;A group of Texas protesters convicted of terrorism charges received unusually harsh sentences of at least 50 years in prison on Tuesday in a closely watched case that was widely seen as a test case of the Trump administration&#x2019;s efforts to crack down on dissent.&#x201D;</blockquote><p>Let&#x2019;s be clear: a few of the protesters were out of bounds. One fired an AR-15 at the police, which goes beyond legitimate protest into inciting violence (and maybe even deliberate provocation). I would never condone that kind of activity.</p><p>But these sentences far outstrip anything that&#x2019;s been given to anyone on the right wing: the leader of the Proud Boys, as this article notes, was sentenced to 22 years in prison. One protester wasn&#x2019;t even present, but was sentenced to 30 years for moving some zines:</p><blockquote>&#x201C;The ninth defendant, Daniel Sanchez-Estrada was not at the protest, but was convicted of corruptly concealing a document or record after prosecutors said he moved leftwing zines and other materials at the request of Rueda, his wife, after she was arrested. Sanchez-Estrada was sentenced to 30 years in prison on Tuesday.&#x201D;</blockquote><p>Many of the protesters had guns and were part of a gun club. They all possessed them legally. I personally wish there was not a right to bear arms and think that their ubiquitous presence in America makes everyone less safe, but the right to own them is enshrined in the Second Amendment. Instead, other &#x201C;evidence&#x201D; was used to infer that they planned violence, including this specific argument that should give everyone pause:</p><blockquote>&#x201C;[&#x2026;] including their decision to communicate and auto-delete messages on Signal, an encrypted messaging platform widely used among activists, journalists and other citizens wary of government surveillance.&#x201D;</blockquote><p>Collectively, the justice department argued that these convictions are proof that anti-fascists are terrorists, which should <em>also</em> give us pause. The precedent here is obviously very dangerous for freedom of speech, freedom of assembly, and democracy in America.</p> Father's Day and gifts for myself - W25 - Joel's Log Files https://joelchrono.xyz/blog/w25 2026-06-23T17:10:00.000Z <p>This week was wild, one of the most hectic days at work, watching the World Cup at church, getting some late birthday presents for myself, taking pictures, maybe a date? I don’t know what’s going onnn.</p> <p>Alas, here’s some notes on it all, from June 16 to 22, 2026. Let’s go!</p> <ul> <li> <p>👔 Happy Father’s day to the people fulfilling that role in the family. We had a fun time at church, every non-dad prepared some food to eat together at the end, which is always nice to have. There was also a fun photo shoot section where I took pics with dad and the family, things were cool.</p> </li> <li> <p>✝️ An unexpected loss in a close friend’s family turned some things upside down. There have been way too many deaths this year. We went to the funeral early and mourned with them. The family appreciated the support. We share the same faith and the same hope. John 11:25-27.</p> </li> <li> <p>🧑‍💻 We had this project at work that was incredibly time-consuming and required a bunch of people doing things, and it’s finally over. Everything was a chore but it only lasted half a day and it’s finally implemented in production. All good, all is good now.</p> </li> <li> <p>⚽ My church streamed the Mexic vs South Korea game on the projector screen and we were all together watching the game. Mexico wins and is on the first position of the group! Super cool stuff.</p> </li> <li> <p>🎶 I acquired some music from Bandcamp! The soundtracks for <em>Faster Than Light</em> and the original <em>Zelda &amp; Chill</em> album.</p> </li> <li> <p>⌚ Got a new member for my watch collection. For my birthday, I purchased a <a href="https://www.casio.com/intl/watches/casio/product.AQ-S820W-1AV/">Casio AQ-S820W</a>. A solar powered watch which has a pretty similar size to the G-Shock GA-2100—also known as the CasiOak. It has managed to replace my trusty Casio Royale for the whole week, which is quite nice. Loving it so far.</p> </li> <li> <p>I have kinda been looking at more watches because of this and tempted by a few. I actually ordered a Casio MQ-24—the classic, cheapest analog they have—and well, I got a fake, not the first time this happens, but I just got a refund!</p> </li> <li> <p>🕹️ Another interest of mine is being piqued… I plan to get a Nintendo 3DS soon, maybe a N3DS XL, maybe a 2DS XL, I am still pondering on it all. I’ll keep you updated though!</p> </li> <li> <p>📷 I spent way too much time trying to make a nice <a href="https://en.wikipedia.org/wiki/Tom_Sachs#Knolling">knolling</a> of my EDC gear. Yes, I am working on an updated post for that, I just haven’t written a single word because I’m too busy getting the thumbnail done.</p> </li> <li> <p>📸 I also photographed my watch collection, because I think I’ll write a page to showcase them soon. Some day.</p> </li> <li> <p>💻 I’m thinking about resurrecting my Raspberry Pi 4. I had done a lot of things with it <a href="/tags/raspberrypi/">back in the day</a>, and I got a lot of ideas <a href="">asking on the fediverse</a>, but <strong>I would like recommendations</strong> for a proper case for it, a way to get it to safely shutdown during a power loss too—lots of rain where I live cause this often.</p> </li> <li> <p>🍿 Remember the girl I kind of invited to watch movies but she couldn’t that day? I tried again, and plans were made, I wonder how it’ll go.</p> </li> </ul> <p><img src="/assets/img/blogs/2026-06-23-week.webp" alt="Collage of the week" /></p> <h2 id="gaming">Gaming</h2> <p>I’ve been pretty much focusing on one game at a time lately, I think the Summer Game Challenge has me in a completionist mood.</p> <ul> <li> <p><strong>Transistor</strong> - This game has been even more awesome this week. The mechanics are really strong, the semi-turn-based combat caught my fancy. There’s this sandbox area that is full of tests and it’s great, because I’ve learned a bunch of things at a pace that the combat during the main game doesn’t quite allow. There are challenges focused on certain aspects of the gameplay, so you have to get good at it to go through, which is really satisfying. The story itself has been really interesting as well, although there is still a lot of unknowns. I just fought a giant beast that haunted me for a whole bunch of the game until I reached the top of some tower, it was pretty epic.</p> </li> <li> <p><strong>Slice &amp; Dice</strong> - I played this for an hour or so total this week. It still has a challenge but I’ve been distracted by other things while on my phone.</p> </li> <li> <p><strong>Super Smash Bros Ultimate</strong> - Just a quick match with friends, nothing too serious this time around.</p> </li> </ul> <h2 id="reading">Reading</h2> <ul> <li><strong>Leviathan Falls</strong> - Up to chapter 3. The final chapter of the grand saga of <em>The Expanse</em>, by James S.A. Corey. As much as I know that <a href="https://sotolf.polymaths.page/">Sotolf</a> is no fan of the ending—<em>please do not wreak havoc in the comments if you read this</em>—I am still very excited about the way everything will play out!</li> <li><strong>Shikimori’s Not Just Cute</strong> - Up to chapter 140. Things have gotten a bit serious. The friend group has gotten into the last year of high school lately, and the future is full of possibilities. I know the manga will end in 40 or so chapters, so I am curious to see how things wrap up.</li> <li><strong>Spy X Family</strong> - Up to chapter 136. This grandiose mini-arc where Loid is invited to a party full of enemies was incredibly fun! It is over now and I am looking forward to more ridiculous misadventures.</li> </ul> <h2 id="watching">Watching</h2> <p>I am finally done watching all of the <em>Max Steel</em> movies, post incoming!</p> <ul> <li> <p><strong>Max Steel vs The Mutant Menace</strong> - Here we see Cytro back—the best robot friend ever!—now on the good side, and he is awesome from here on. We will face against Max Steel’s ultimate foe, Toxon, N-Tek’s best agent, fallen from grace after a radioactive explosion. As this villain awakens, he plans to contaminate all of the planet with poison, radiation and waste. This villain is so powerful, Max will need to upgrade once again (last time was on <em>Max Steel: Countdown</em>) to be able to face him. Epic movie, way too short.</p> </li> <li> <p><strong>Max Steel vs The Toxic Legion</strong> - This was the most epic thing known to me back then. Toxon leads once more, together with Extroyer and Elementor. Every villain teaming up against Max Steel, looking to create a giant toxic storm that will end life as known on Earth. The challenge is up! There’s a redemption arc, and a new villain as a result from this.</p> </li> <li> <p><strong>Max Steel: Makino’s Revenge</strong> - After Max stops the toxic storm, some residual waste mutated Mike (I forgot the last name) into Makino. He was an influencer and independent journalist, and will use those skills and his power to control machines and computers to difame and expose Max Steel’s work as an agent. The spin on how social media and news affect the way people see things was very interesting for the time. The villain is very cartoon-ish though unfortunately.</p> </li> <li> <p><strong>Max Steel: Monstrous Alliance</strong> - Another team-up where Toxon, Makino and Elementor work together to take on Max, and N-Tek’s most powerful base, a floating ship in the sky that would protect the innocent and end conflict (think <em>Captain America’s The Winder Soldier</em>). Of course, with Makino’s control of technology, Toxon plans to use this ship to deploy… you guessed it, toxins, all over the world. Max Steel will have to step up one last time to finally put an end to them.</p> </li> <li> <p><strong>Terminator: Salvation</strong> - Decided to watch this one on a whim. I actually quite enjoy this <em>Terminator</em> movie, it tries a bit of a different take on the usual formula, and it works out in my opinion. A lot of weird choices like the romance subplot and the exagerated screams from the protagonist looking in the style of <em>Revenge of the Sith</em>, but cool action and sequences nonetheless.</p> </li> </ul> <h2 id="around-the-web">Around the web</h2> <h3 id="blogposts">Blogposts</h3> <ul> <li><a href="https://tracydurnell.com/2026/06/19/i-dont-like-prompts/">I don’t like prompts</a> - Interesting take by Tracy on writing prompts, I haven’t participated a lot on the Indieweb Carnival and similar, but I do enjoy writing challenges, quizzes or question challenges—except the AI one, I feel icky answering that one.</li> <li><a href="https://mtwb.blog/posts/2026/music/i-miss-streaming-music/">I Miss Streaming Music</a> - In a way I miss how useful algorithms can be for discovery. At the same time, I kind of like asking people for recommendations more often and get out of the comfort zone.</li> <li><a href="https://gabz.blog/posts/doomscrolling-for-a-game">Doomscrolling for a Game</a> - The paradox of choice attacks once again. It’s weird because lately I’ve been on a “one game at a time” mood and it has actually worked for me, but things change.</li> <li><a href="https://musingsfromatangledmind.com/2026/06/15/wildlife-rescue-story/">Roadside Assistance</a> - Love these musings that are about seemingly vain things. This one’s features wildlife, and it’s very cute!</li> </ul> <h3 id="youtube">YouTube</h3> <ul> <li><a href="https://youtu.be/OwMF5hQ2nNk">Improve the Casio F91 Backlight for Free</a> - This little mod is actually pretty interesting. I might give it a go and report back, but no promises.</li> <li><a href="https://youtu.be/ELa5wGew_6s">I Played as San Marino until I WON the WORLD CUP</a> - Just some entertaining gameplay from a FIFA game I never played. I think I’m just nostalgic for the 2010 World Cup days.</li> <li><a href="https://youtu.be/UeE57f9QeDs">Casio is ALL YOU NEED: The Perfect 3 Watch Collection</a> - I have more than three watches so, and it’s impossible not to need more once you start buying…</li> <li><a href="https://youtu.be/M7ak-fAW16Y">I Tried 3D Printing for the First Time</a> - Oh no, TechDweeb was infected by the 3D printing virus, am I in danger?</li> </ul> <p>This is day 83 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=Father's Day and gifts for myself - W25">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116800589737774597">Reply on Fediverse</a> </p> 📝 2026-06-23 12:58: Create one of those Uses pages. Still a work in progress, but there's a good... - Kev Quirk https://kevquirk.com/2026-06-23-1258 2026-06-23T11:58:00.000Z <p>Create one of those Uses pages. Still a work in progress, but there's a good chunk of the stuff I use on there now.</p> <p><a href="https://kevquirk.com/uses">https://kevquirk.com/uses</a></p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-23%2012%3A58">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-23-1258#comments">leave a comment</a>.</p> </div> Wonders of Web Weaving, Episode 7 - James' Coffee Blog https://jamesg.blog/2026/06/23/wonders-of-web-weaving-episode-7 2026-06-23T00:00:00.000Z <p><a href="https://web-weaving.jamesg.blog/7" rel="noreferrer">The seventh episode of Wonders of Web Weaving is out</a>:</p><blockquote>In Episode 7, I chat with <a href="https://ohhelloana.blog" rel="noreferrer">Ana</a>, the author of <a href="https://ohhelloana.blog" rel="noreferrer">ohhelloana.blog</a>. We talk about, among other things, the growth we see in our websites over time, finding an in-person indie web community, and connecting with people using personal websites.</blockquote><p>I hope you enjoy the episode!</p><p><a href="https://web-weaving.jamesg.blog/subscribe/" rel="noreferrer"><em>Wonders of Web Weaving has an RSS feed</em></a><em> you can use to follow along from wherever you get your podcasts.</em></p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a101c07d098af0a2',t:'MTc4MjE5OTQ1NA=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> <a class="tag" href="https://ohhelloana.blog">Ana</a> <a class="tag" href="https://ohhelloana.blog">ohhelloana.blog</a> <a class="tag" href="https://web-weaving.jamesg.blog/7">The seventh episode of Wonders of Web Weaving is out</a> <a class="tag" href="https://web-weaving.jamesg.blog/subscribe/">Wonders of Web Weaving has an RSS feed</a> Introducing Patch the Planet - Trail of Bits Blog https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ 2026-06-22T16:50:00.000Z &lt;p&gt;What happens when you clear dozens of Trail of Bits engineers’ schedules, pair them with every open-source maintainer they can contact, and unleash the latest frontier models like GPT-5.5-Cyber on critical open-source targets? Thanks to &lt;a href="https://openai.com/index/daybreak-securing-the-world/"&gt;our partnership with OpenAI&lt;/a&gt; and its Daybreak initiative, &lt;a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb"&gt;we can report&lt;/a&gt; that the impact is hundreds of discovered bugs, 64 pull requests, and 51 issues filed across 19 projects (with many more still undergoing coordinated disclosure). That was just the first week of &lt;a href="https://trailofbits.com/patch-the-planet"&gt;Patch the Planet&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Frontier models like GPT-5.5-Cyber are producing a firehose of security findings, and already-stretched maintainers must sift through all of it to separate real vulnerabilities from plausible-sounding false positives. Patch the Planet is different: with our experts orchestrating and triaging findings, we handle the work of fixing and hardening the code alongside the people who maintain it.&lt;/p&gt; &lt;p&gt;The first week of Patch the Planet covered 19 projects across cryptography, networking, language infrastructure, and software supply chain. Among these 19 projects were cURL, NATS, pyca, Sigstore, aiohttp, the Go project, freenginx, Python and python.org, urllib3, PyPI, SimpleX, Valkey, and RustCrypto. Over 30 projects have joined the initiative so far, and we’re rapidly expanding it to include more; if you maintain an open-source project, &lt;a href="https://trailofbits.com/patch-the-planet"&gt;apply to join&lt;/a&gt;!&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-1.gif" alt="&amp;ldquo;Live look at the Trail of Bits engineering teams&amp;rdquo;" width="500" height="221" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Live look at the Trail of Bits engineering teams&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;p&gt;Anyone can file an issue, flex, and walk away. We showed up with the patches: 37 are already merged, and many more are in flight. These merges go beyond just fixing bugs: we’re adding new tests and fuzzing harnesses, CI security scanning, supply-chain tooling, correctness fixes, and features maintainers had been meaning to get to. The goal of Patch the Planet is to leave essential open-source projects measurably better off.&lt;/p&gt; &lt;h2 id="we-brought-patches-not-just-bug-reports"&gt;We brought patches, not just bug reports&lt;/h2&gt; &lt;p&gt;We’re reporting public findings &lt;a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb"&gt;on GitHub&lt;/a&gt;, including 64 total pull requests. We also filed 51 issues, 19 of which are already closed with a fix. This public tally undercounts the work, since several projects take reports through private channels like HackerOne, GitHub security advisories, mailing lists, and private forks, and most of these have not been released publicly yet.&lt;/p&gt; &lt;p&gt;What&amp;rsquo;s in those pull requests matters more than the count. At python.org, we added a CI workflow built on &lt;a href="https://github.com/zizmorcore/zizmor"&gt;zizmor&lt;/a&gt;, our open-source GitHub Actions auditor, fixed all of the issues it flagged, and integrated it into their CI. In RustCrypto, we contributed correctness fixes to the big-integer library that higher-level cryptography is built on, alongside genuine feature work in review: serde encoding support and HPKE DHKEM suite IDs. Other patches were plain engineering help: storage-accounting and service-restart fixes in SimpleX, a clearer admin-quarantine confirmation in PyPI&amp;rsquo;s Warehouse, and supply-chain improvements like SBOM sidecars for Python&amp;rsquo;s Windows artifacts. We will also be upstreaming many testing improvements and new testing campaigns. Arguably, our best contributions are not even bug or security fixes.&lt;/p&gt; &lt;p&gt;Keeping track of all of this is a bot we call Patchy. Patchy monitors every project, posts each new finding and merged patch to our Slack, and, for reasons we consider scientifically sound, reintroduces the common use of &lt;a href="https://openai.com/index/where-the-goblins-came-from/"&gt;goblins, gremlins, and assorted creatures&lt;/a&gt;. Here&amp;rsquo;s Patchy&amp;rsquo;s description of &lt;a href="https://github.com/pyca/cryptography/pull/14933"&gt;an issue that has been patched&lt;/a&gt;:&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-2_hu_d772e23377508832.webp" alt="&amp;ldquo;Patchy’s description of an issue that has been patched&amp;rdquo;" width="1200" height="329" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Patchy’s description of an issue that has been patched&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;p&gt;When a patch lands, Patchy celebrates with a triumphant &lt;code&gt;PATCHY HAPPY&lt;/code&gt;. Making Patchy happy is really what drives us.&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-3_hu_5af72ac2534386fd.webp" alt="&amp;ldquo;Bug patched, Patchy happy&amp;rdquo;" width="1200" height="185" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Bug patched, Patchy happy&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;h2 id="a-few-highlights-from-the-week"&gt;A few highlights from the week&lt;/h2&gt; &lt;p&gt;The week produced more than we can fit in this post, but here are some quick highlights.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;A fuzzing lab built in a day.&lt;/strong&gt; Given a narrow goal (find remotely exploitable bugs) and no instructions on how, GPT-5.5-Cyber decided that reading the source of one of the most-reviewed C libraries in existence was a poor use of tokens. Instead, it stood up a full fuzzing lab in under a day: sanitizer and variant builds, a seed corpus drawn from existing tests, and harnesses across a dozen entry points. Instead of simply fuzzing exposed APIs, it successfully built a harness that injected operating system backpressure to identify novel issues by reaching previously unexplored buggy states. We estimate all of that effort likely would’ve taken one of our fuzzing experts two to three weeks to do manually. Just as important, it showed judgment about what to test, what to report (and not report), and where to find higher-impact findings. We&amp;rsquo;ll publish the full details in a standalone field report.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;A pipeline for variant testing historical CVEs built in a day&lt;/strong&gt;. Codex was also adept at building simple but effective pipelines, such as the CVE variant analysis pipeline shown below. Codex’s &lt;code&gt;/goal&lt;/code&gt; feature combined with frontier models like GPT-5.5-Cyber for this type of variant analysis produced novel issues with almost exclusively high-signal output.&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-4_hu_a106c2e464121abc.webp" alt="&amp;ldquo;Pipeline for historical CVE variant analysis&amp;rdquo;" width="1200" height="617" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Pipeline for historical CVE variant analysis&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;A release-pipeline improvement at python.org.&lt;/strong&gt; We reported multiple security issues for &lt;a href="http://python.org"&gt;python.org&lt;/a&gt;, including some issues closing a legacy-API authorization gap. But we’re most proud of the work that produced long-term improvements to python.org&amp;rsquo;s release infrastructure: the new zizmor CI scanning, tightened release-file and metadata validation, deletion scoping fixed so bulk operations can&amp;rsquo;t reach beyond their target, and release-tooling patches in review that quote remote command arguments, fail safely on partial uploads, and add SBOM sidecars.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The aiohttp maintainers fixed their issues almost immediately.&lt;/strong&gt; We privately reported a cluster of issues across aiohttp&amp;rsquo;s client and server paths, including cookies that could regain broader scope after a save and reload, digest credentials that could answer a challenge from the wrong origin, and resource limits that ran after attacker-controlled buffering rather than before. The maintainers authored and merged all eight fixes within hours, seven of them inside a single five-hour window. We were impressed and appreciate the maintainers’ prompt and collaborative work on these issues!&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Differentially testing major cryptographic libraries against each other.&lt;/strong&gt; Many of our projects implement the same logic, protocols, and algorithms. In particular, multiple projects implement the same cryptographic algorithms and standards like X.509 certificates. Therefore, we used Codex to point these projects at each other, and identify any relevant behavioral differences. This proved to be a high-signal approach that uncovered several issues, including &lt;a href="https://github.com/pyca/cryptography/pull/14933"&gt;this AES-GCM issue in PyCA&lt;/a&gt; and several X.509 issues, which we plan to upstream to &lt;a href="https://x509-limbo.com/"&gt;&lt;code&gt;x509-limbo&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt; &lt;h2 id="finding-the-bugs-is-now-the-easy-part"&gt;Finding the bugs is now the easy part&lt;/h2&gt; &lt;p&gt;If it wasn’t already clear from the last several months of security news, this week makes one thing clear: the expensive part of security work has moved. Arming Codex with fuzzing campaigns, variant analysis, differential testing, agentic searching, and similar techniques produces real vulnerabilities and compresses weeks or months of manual effort into hours. The advantage is no longer in finding bugs, but everything after: confirming a finding, getting its severity right, writing a patch a maintainer will accept, hardening the surrounding code, making long-term improvements to prevent similar issues in the future, and coordinating a disclosure. That is the work that floods of AI-generated reports threaten to bury.&lt;/p&gt; &lt;h2 id="guidance-for-maintainers"&gt;Guidance for maintainers&lt;/h2&gt; &lt;p&gt;If you’re a maintainer managing an unsustainable number of AI-generated bug reports, the core challenges you need to solve are deduplication, false-positive filtering, and severity correction.&lt;/p&gt; &lt;p&gt;Deduplication is the easiest problem to solve technically. Even simple AI-based tools that compare new reports against open issues perform well, especially when grounded in affected code lines. Automating this step eliminates most of the noise.&lt;/p&gt; &lt;p&gt;False-positive filtering and severity correction are harder, but they can be managed. Without explicit guidance, models default to rating everything as critical.&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-5_hu_1b13148a17364cf7.webp" alt="&amp;ldquo;Patchy without threat model and severity guidance&amp;rdquo;" width="1200" height="1019" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Patchy without threat model and severity guidance&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;p&gt;Generic approaches like our &lt;a href="https://github.com/trailofbits/skills/tree/main/plugins/fp-check"&gt;fp-check&lt;/a&gt; tool help, but only to a point. The best improvements require project-specific documentation, threat models, and severity criteria. &lt;a href="https://cryptography.io/en/latest/security/"&gt;PyCA&amp;rsquo;s security documentation&lt;/a&gt;, for example, was dramatically effective at reducing false positives in our bug candidates. Files like &lt;code&gt;AGENTS.md&lt;/code&gt; that explicitly tell models which documentation to consult produced the most consistent and effective results. If security researchers are armed with this documentation, especially &lt;a href="http://AGENTS.md"&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; for AI-based research, more noise will be filtered out before reaching the maintainers.&lt;/p&gt; &lt;h2 id="whats-next-and-how-to-get-involved"&gt;What&amp;rsquo;s next and how to get involved&lt;/h2&gt; &lt;p&gt;This was just our first week. Over 30 projects have committed to join Patch the Planet, with a growing waitlist. As more findings clear coordinated disclosure, we&amp;rsquo;ll publish more results and deeper field reports, including full fuzzing lab details, the variant-analysis and differential-testing pipelines, and the tooling we&amp;rsquo;re building to help maintainers triage AI-generated reports themselves. Our &lt;a href="https://gist.github.com/patch-the-planet/69fd1aa925c8e73edea9e6e967043cbb"&gt;Patch the Planet gist&lt;/a&gt; contains the full public list of our week one output.&lt;/p&gt; &lt;p&gt; &lt;figure&gt; &lt;img src="https://blog.trailofbits.com/2026/06/22/introducing-patch-the-planet/ptp-image-6.gif" alt="&amp;ldquo;Join Patch the Planet and spread the word&amp;rdquo;" width="480" height="207" loading="lazy" decoding="async" /&gt; &lt;figcaption&gt;Join Patch the Planet and spread the word&lt;/figcaption&gt; &lt;/figure&gt; &lt;/p&gt; &lt;p&gt;If you maintain a critical open-source project and want this kind of help, you can &lt;a href="https://trailofbits.com/patch-the-planet"&gt;apply to join Patch the Planet&lt;/a&gt;.&lt;/p&gt; Cybersecurity for the paranoid business traveller - Terence Eden’s Blog https://shkspr.mobi/blog/?p=64419 2026-06-22T11:34:18.000Z <p>Over the years, I've worked for organisations with various levels of risk tolerance for business travellers. Some have been (rightly) paranoid and others have been (wrongly) placid about the threats their employees face.</p> <p>The fact is, individuals are often targeted for espionage, blackmail, or other state-sponsored attacks.</p> <p>Here's a list of some of the different advice I've received, roughly sorted into levels of suitability. Start at the top and work your way down until you reach a suitable level.</p> <h2 id="usb-sticks-no-thanks"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#usb-sticks-no-thanks">USB sticks? No thanks!</a></h2> <p>At some point, you'll be given a gift of a decorative USB pen drive. It'll either be part of a goodie-bag or you'll be told it has all of this quarter's TPS reports on it.</p> <p>You should thank them for their kind gift. On your way back to the hotel, drop the stick in a bin.</p> <p>There's just too much which can go wrong with a USB stick. Maybe it has a virus. Maybe it is an exfiltration device. Maybe it has extreme pornography and the police will catch you with it. Just chuck it. If anyone asks, say you couldn't get it to work and can they please email you the information.</p> <h2 id="usb-power-play-it-safe"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#usb-power-play-it-safe">USB Power? Play it safe!</a></h2> <p>USB powers everything from your phone and laptop, to your headphone and eReader. But USB cables also carry data. Some devices can be silently hacked by plugging them in to a dodgy power port.</p> <p>Is it <em>likely</em> that the USB socket on the airport bus has been set up to exfiltrate travellers' data? Probably not - but why take the risk?</p> <p>The best thing you can do is to always charge from your own device. Get a travel charger or, ideally, a portable battery and <em>only</em> use that for charging.</p> <p>For extra paranoia, you can buy USB condoms and charging-only cables - but they tend to be slower at charging.</p> <h2 id="reduce-your-app-attack-surface"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#reduce-your-app-attack-surface">Reduce Your App Attack Surface</a></h2> <p>Do you <em>need</em> all those apps on your phone? Will you cope without your banking apps, dating apps, streaming apps? Each one is a potential vector for abuse.</p> <p>Is it legal for you to date your preferred romantic partner in your intended destination? You shouldn't have to hide yourself, but having an illegal app on your phone is a great way to get picked up by the police.</p> <p>Go through your phone and uninstall anything which isn't important to the trip.</p> <h2 id="a-vpn-probably-draws-more-attention-than-it-is-worth-but-browse-cautiously"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#a-vpn-probably-draws-more-attention-than-it-is-worth-but-browse-cautiously">A VPN probably draws more attention than it is worth, but browse cautiously</a></h2> <p>This is slightly counter-intuitive. Every important site on the web uses HTTPS. The really important ones <a href="https://hstspreload.org/">are on a special list</a> which means your browser will <em>only</em> use a secure connection. The chances of your data being intercepted is minimal.</p> <p>But using a VPN immediately makes your traffic look suspicious and, in some countries, may be illegal.</p> <p>That said, while the contents of your communications will be private, their destination is easy to figure out. Don't browse pornography or any other site which is liable to get you in trouble. This may include news sites from outside the country.</p> <h2 id="what-passwords-do-you-need"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#what-passwords-do-you-need">What passwords do you need?</a></h2> <p>Hopefully you use a password manager - and hopefully all your passwords are unique. But do you really need to carry around <em>all</em> of them? You password manager almost certainly allows you to create a sub-account into which you can deposit anything you need for your trip.</p> <p>Similarly, you don't need <em>all</em> your MFA codes with you. If you <em>do</em> need MFA please make sure it isn't coming through SMS.</p> <h2 id="theyre-not-flirting-with-you"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#theyre-not-flirting-with-you">They're not flirting with you.</a></h2> <p>Mate, you're a middle-aged sales rep who scored a trip to a conference in an exotic country. Do you <em>really</em> think that pretty young thing is enthralled by your tales of middle-management?</p> <p>No.</p> <p>At best, the photos will be used to blackmail you. At worst the police will claim that they're under the age of consent and <em>that</em> will be used to blackmail you.</p> <h2 id="laptops-and-liability"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#laptops-and-liability">Laptops and Liability</a></h2> <p>Your IT team has provided you with a laptop which is encrypted and biometricly secured, right? But do you need that <em>specific</em> laptop?</p> <p>Grab a cheap laptop. Fill it with only the documents you need. When you get back home, toss it.</p> <p>I'm quite serious, a £200 Chromebook is a cheap price to pay to prevent your secrets getting stolen or your network being infiltrated.</p> <h2 id="what-else"><a href="https://shkspr.mobi/blog/2026/06/cybersecurity-for-the-paranoid-business-traveller/#what-else">What Else?</a></h2> <p>Possibly you think some of these are overkill. Perhaps you think I'm not being paranoid enough. What would you add to the list?</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64419&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager"> Over/Under Interview - Robb Knight • Posts • Atom Feed https://rknight.me/blog/over-under-interview/ 2026-06-22T09:55:58.000Z <p><strong>Avengers</strong></p> <p>The movies, overrated with the exception of Infinity War/Endgame which was some of the best movie experiences I've ever had.</p> <p>The comics, underrated. The stories from the comics is where it's at but it's not a medium that everyone can enjoy. There are so many great Avengers and Avengers-adjacent stories available if you're willing to give it a try. My recommendation is <a href="https://www.marvel.com/comics/series/25575/west_coast_avengers_2018_2019">Kelly Thompson's West Coast Avengers run</a>.</p> <p><strong>Weeknotes</strong></p> <p>Underrated. I <em>love</em> reading people's weeknotes and I've found it a useful tool to get out random thoughts I've had as well as share fun things I've seen online that week. The pressure to do them every week though, massively overrated. You don't need to do that to yourself, post when you want.</p> <p><strong>Stickers</strong></p> <p>Underrated. What a fun item stickers are but you've <em>got to use them</em>. Stick them on anything. Maybe <a href="https://maique.eu/tag/stickerSpotter">Maique will spot one you stuck somewhere</a>. I love stickers.</p> <p><strong>BuJo</strong></p> <p>This is a tough one. Bullet Journal the <em>brand</em>? Overrated. Intentionally or not, one look at the website shows that it exists now to sell courses, books, and other related services.</p> <p>Bullet Journal the <em>system</em> on the other hand has a lot of good ideas. I don't do all of them, nor do I follow it strictly but the things I did take from the (the bullet system itself, migrating tasks, monthly spreads) have been massively helpful. Slightly underrated if only because the website no longer reflects the system and rather serves as the business side.</p> <p><strong>Tacos</strong></p> <p>Underrated. I'm in the UK where we have a troubling lack of mexican-inspired food available but whats not to love? Meat, sauce, taco shell, lettuce, it's got it all.</p> <p><strong>What are the two best books you couldn't live without and that you recommend?</strong></p> <p><a href="https://en.wikipedia.org/wiki/How_to_Lie_with_Statistics">How to Lie with Statistics</a>. I read this when I was 17 or so and it blew my mind the way you can present data in different ways to elicit different reactions or prove your point. Fair warning this was written in 1954 so some of the language would not be appropriate in 2025, but the ideas are solid.</p> <p><a href="https://en.wikipedia.org/wiki/So_You%27ve_Been_Publicly_Shamed">So You've Been Publicly Shamed</a>. This one serves have a warning both about what one might post online, as well as how wild online mobs can get.</p> People and Blogs Interview - Robb Knight • Posts • Atom Feed https://rknight.me/blog/people-and-blogs-interview/ 2026-06-22T09:48:50.000Z <p><strong>Let's start from the basics: can you introduce yourself?</strong></p> <p>I'm a developer and dad to two girls living in Portsmouth on the south coast of the UK. By day I work for a SaaS company and in my own time I work on my <a href="https://rknight.me/projects">many side projects</a>. In a previous life I worked at a certain clown's restaurant which is where I met my wife some 15 years ago.</p> <p>Although developer is what I get paid to do I'm trying to move towards more <em>making</em>; websites, <a href="https://rknight.me/blog/stickers-maths-and-postage/">stickers</a>, shirts, art, whatever. I have no idea what that looks like yet or how it's going to pay my bills. I have a whole host of <a href="https://rknight.me/projects">side projects</a> I've worked on over the years; they're not all winners but they all serve, or served, a purpose. If I get lucky, they resonate with other people which is always nice.</p> <p><strong>What's the story behind your blog?</strong></p> <p>I've had a lot of blogs over the years, most of which would get a handful of posts before being abandoned. There was a version that ran on Tumblr which I did do for at least a year or two — any interesting posts from that have been saved. The current iteration is by far the longest serving and will be the final version. There's no chance of me wiping it all and starting again.</p> <p>This current version is part of my main website which is where I put <em>everything</em>. My toots on Mastodon start life as a <a href="https://rknight.me/notes">note post</a>, I post <a href="https://rknight.me/links/">interesting links I find</a>, and I log all the media I watch/play/whatever (I don't want to say consume, that's gross) in <a href="https://rknight.me/almanac/">Almanac</a>, which itself is on the third or fourth iteration.</p> <p>As I said above, I had done a few posts on the Tumblr-powered blog but if I look at my stats for posts, it was around 2022 when Twitter started to fall apart that I started to blog more. I was moving away from posting things directly onto social media sites and getting it onto my own site.</p> <p>I started writing more posts that just had a short idea or helpful tip because I realised not every post has to be some incredible think piece. My analytics show that these posts also tend to be the most popular which probably says more about the state of large, ad-riddled websites than it does about my writing. For example <a href="https://rknight.me/blog/convert-spotify-facebook-to-email-login/">this post about disconnecting Facebook from Spotify</a> is consistently in the top five posts on my site but you're never going to read that post unless you specifically need it. It's not a &quot;good&quot; post, it just exists.</p> <p><strong>What does your creative process look like when it comes to blogging?</strong></p> <p>To call what I have a process would be a very liberal use of the word &quot;process&quot;. If I have nothing to write about I just won't write anything, I have no desire to keep to a schedule and write just for the sake of it. Usually, I'll get prompted by something someone asks like &quot;How did you do X on your website?&quot; or I feel like I have something to say that would be interesting other people.</p> <p>I write my posts in Obsidian, then when they're ready to go I'll add them to my site. If I'm on my <s>proper computer</s> laptop I use <a href="https://rknight.me/blog/my-blogging-workflow/">my CLI tool</a> to add a new post. If I'm on mobile, I use the very <a href="https://github.com/rknightuk/knightcms">haphazard CMS</a> I built.</p> <p>I'll proof read most things myself before posting and I rarely ask for anyone else's input but if I do want a second opinion it's going to be previous <a href="https://manuelmoreale.com/interview/keenan">P&amp;B interviewee</a>, <a href="https://gkeenan.co">Keenan</a>. Usually I'm able to get out what I want to say fairly succinctly without too much editing.</p> <p><strong>Do you have an ideal creative environment? Also do you believe the physical space influences your creativity?</strong></p> <p>A proper keyboard and ideally a desk to sit at is what I prefer when I'm writing (or coding) but I can live with just the keyboard. My desk setup makes some people's skin crawl because there's so much going on but I like having all the trinkets and knick knacks around me.</p> <figure><img src="https://cdn.rknight.me/site/desk-2025.jpg" alt="A desk surrounded by bookshelves and pegboard with various items hanging from them" /></figure> <p>I deeply dislike using my phone for most things outside of scrolling lists, like social media so I rarely write long posts on it. The small form factor just doesn't work for me at all but I also kind of need it to exist in the world.</p> <p><strong>A question for the techie readers: can you run us through your tech stack?</strong></p> <p>All my domains are registered with <a href="https://porkbun.com">Porkbun</a> and I manage the DNS with <a href="https://dnscontrol.org/">DNSControl</a> - my main domain, <a href="http://rknight.me">rknight.me</a>, has nearly 50 records for subdomains so managing those without DNSControl would not be a fun activity. Speaking of DNS I use <a href="https://bunny.net">Bunny</a> for my DNS management and also use their CDN for images and other files I need to host.</p> <p>The website itself is, as are many of my side projects, built with <a href="https://www.11ty.dev">Eleventy</a>. Eleventy gives me the flexibility to do some interesting things with the posts and other content on my site which would be much harder with some other systems.</p> <p>The site gets built on <a href="https://forge.laravel.com/">Forge</a> to a <a href="https://www.hetzner.com/">Hetzner</a> server whenever I push an update to GitHub either via command line, or through the aforementioned CMS, and is also triggered at various points in the day to pull in my Mastodon posts.</p> <p><strong>Given your experience, if you were to start a blog today, would you do anything differently?</strong></p> <p>Assuming I actually had to the time to do it, I think I would start with the CMS first, before building anything of the actual site. It is a pain to update things when I'm not at my laptop but jamming features into my CMS is equally frustrating.</p> <p>If I wanted something off the shelf and easier to maintain I suspect I would choose <a href="https://ghost.org/">Ghost</a> or <a href="https://pika.page/">Pika</a>.</p> <p><strong>Financial question since the Web is obsessed with money: how much does it cost to run your blog? Is it just a cost, or does it generate some revenue? And what's your position on people monetising personal blogs?</strong></p> <p>Many of these costs are part of my freelancing so are bundled with other sites I run and somewhat hidden but I'll do my best to outline what I do use.</p> <p>I have a single server on Hetzner that serves my main site as well as another 30 or so side projects so the cost is negligible per-site but it costs about $5 a month. Forge costs $12 a month to deploy my site along with other sites. The domain is $20 a year I think but that's it.</p> <p>I have a <a href="https://oneamonth.club/">One a Month Club</a> <a href="https://buymeacoffee.com/rknightuk/membership">here</a> and I have a handful of people supporting that way. I also use affiliate links for services I use and like which occasionally pays me a little bit.</p> <p>I think monetising blogs is fine, if it's done in a tasteful way. Dumping Google ads all over your site is terrible for everyone but hand-picked sponsors or referrals is a good way to find new services. Just keep it classy.</p> <p><strong>Time for some recommendations: any blog you think is worth checking out? And also, who do you think I should be interviewing next?</strong></p> <p>I want to read sites that are about the person writing them. Photos of things people have done, blog posts about notebooks, wallpaper, food, everything. Things people enjoy.</p> <p>This is the second time I'm going to mention <a href="https://gkeenan.co/avgb/">Keenan</a> here because they write so wonderfully. They also have a podcast with <a href="https://cygnoir.net/about">Halsted</a> called <a href="https://friendship-material.simplecast.com">Friendship Material</a> which is all kinds of lovely and joyful and everyone should listen.</p> <p><a href="https://alexwlchan.net">Alex</a> writes some really interesting computing-related posts, like this one about using <a href="https://alexwlchan.net/2024/static-websites/">static websites as tiny archives</a>.</p> <p><a href="https://anniemueller.com">Annie</a> is so smart and honest in her writing it brings me joy every time I see a new post from her. <a href="https://anniemueller.com/posts/how-i-a-non-developer-read-the-tutorial-you-a-developer-wrote-for-me-a-beginner">This post is a masterpiece</a>.</p> <p><strong>Final question: is there anything you want to share with us?</strong></p> <p>I'd be a terrible business boy if I didn't at least mention <a href="https://echofeed.app">EchoFeed</a>, an RSS cross posting service I run.</p> <p>I also <a href="https://ruminatepodcast.com">have a podcast</a> that used to be about tech but is now about snacks.</p> I Am A Link Curator - The Weblog of fLaMEd https://flamedfury.com/posts/i-am-a-link-curator/ 2026-06-22T08:49:05.000Z <p>What’s going on, Internet? Friend of the site <a href="https://jamesg.blog/" rel="noopener">James</a> recently shared a new post <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">Blogger Archetypes</a> which asks a series of questions to help you narrow down your character as a member of the blogging community. A bit of indie web fun.</p> <p>Here are my results:</p> <blockquote> <p><strong>You are a Link curator</strong></p> <p>The web is not just its pages, but the connections between pages. You have internalised this and love spending your time exploring the web and sharing what you find with the world.</p> <p><strong>You are also a Culture maker</strong></p> <p>You love to help push the blogging community forward by starting discussions, encouraging thought, and sharing what’s on your mind.</p> </blockquote> <p>And the other archetypes on offer:</p> <blockquote> <p><strong>Explorer:</strong> To you, the web feels like a library that’s open all hours and has everything you could ever imagine! You love reading others blogs, and know how important readers are to the whole of the indie web community!</p> <p><strong>Community gardener:</strong> You love to help contribute to building the blogging community, either through your writing or how you share the spirit of writing on the web with friends.</p> <p><strong>Author:</strong> You love writing and have a growing backlog of posts on your website! Words are your best friend and you’re always thinking about what to write next.</p> </blockquote> <p>Link curator feels about right. A lot of what I do here is exactly that. Surfing the web, finding the good stuff, and passing it along. The <a href="https://flamedfury.com/bookmarks">bookmarks</a>, the links back to other people’s writing (which I need to get back into doing regularly). That’s the fun part for me.</p> <p>If you’ve got a blog, go and <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">take the quiz</a> and write up what you got. Send it my way, I’d love to to see what you got. 🤙</p> <p>Hey, thanks for reading this post in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: I Am A Link Curator">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/i-am-a-link-curator/#webmention">webmention</a>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p> 📝 2026-06-22 09:39: The fox continues to prowl around our chickens. This morning we caught it in the... - Kev Quirk https://kevquirk.com/2026-06-22-0939 2026-06-22T08:39:00.000Z <p>The fox continues to prowl around our chickens. This morning we caught it in the GARDEN a few feet from our favourite chicken. Luckily the magpies warned us and we were able to scare it away.</p> <p>It's not nice keeping the little cluckers cooped up in this heat, but needs must unfortunately.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-22%2009%3A39">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-22-0939#comments">leave a comment</a>.</p> </div> No, I don't want you to summarise the page! - Kev Quirk https://kevquirk.com/no-i-dont-want-you-to-summarise-the-page 2026-06-22T08:04:00.000Z <p>I've talked about LLMs a few times here - the TL;DR is that I find them useful <em>for certain use cases</em>.</p> <p>Searching something complex? Great.</p> <p>Checking my code, or helping me with a problem in said code? Count me in.</p> <p>But summarising a page I'm reading? Absofuckinglutely not.</p> <p>One of the things I really enjoy about the web is surfing it and <em>reading</em>. Reading is one of the great joys I get from the web, and <a href="https://kevquirk.com/?type=book">in general</a>. Why would I want a bastardised version of your words presented to me by a computer when I can read the actual words you took time to write?</p> <p>LLMs have their place and are useful tools in my opinion, but I'm getting sick of them being crammed into every facet of computing.</p> <p>Hopefully the bubble will burst soon and we can all enjoy an LLM <em>enriched</em> web, not an LLM <em>hijacked</em> web.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=No%2C%20I%20don%27t%20want%20you%20to%20summarise%20the%20page%21">reply to this post by email</a>, or <a href="https://kevquirk.com/no-i-dont-want-you-to-summarise-the-page#comments">leave a comment</a>.</p> </div> Registration review: Taiwan - Johnny.Decimal https://johnnydecimal.com/blog/0224-rego-review-taiwan/ 2026-06-22T06:53:29.000Z <p>Vehicle registration plates provide a ubiquitous numbering scheme that&#39;s easy to enjoy: just walk around the streets and pay attention. Each country offers its own variant of the form, so in this series I will review each country&#39;s registration plates as I encounter them.</p> <blockquote> <p>These reviews are not scientific and should not be quoted as authoritative.</p> </blockquote> <h2 id="introduction">Introduction</h2> <p>Taiwan&#39;s scheme was refreshed in 2012. This review only considers the post-refresh scheme. Older plates are still very common.</p> <h2 id="schema">Schema</h2> <p>A simple, consistent scheme: <code>AAA-0000</code>. The usual suspects are omitted from the letter prefix – <code>O</code>, <code>I</code> – but <code>Q</code> remains, as we&#39;ll see below.</p> <p>Absurdly, the number <code>4</code> is no longer used. I thought this was user preference, as I did see <em>one</em> in the wild. But it seems that the user preference was so strong, they elected to remove it. The plate I saw must have been from an older range.</p> <p>This broad omission of <code>4</code> is common across Asia – it sounds like the word &#39;death&#39; – as is the equally absurd omission of the West&#39;s superstition, <code>13</code>.<sup><a href="#user-content-fn-thirteen" id="user-content-fnref-thirteen" data-footnote-ref="" aria-describedby="footnote-label" class="footnote">1</a></sup> (Combined with the fact that the ground floor is represented as <code>1</code> means that a room on the 14th floor isn&#39;t quite as high as one might hope.)</p> <p>The scheme allows a theoretical maximum of <code>24^3 × 9^4 = 90,699,264</code> plates. Given Taiwan&#39;s population of 23.5m people this is a touch under 4 cars each. This doesn&#39;t feel like enough, but the most recent plate I saw began <code>CCD</code> indicating that about 10% of plates have been issued in 14 years. So we don&#39;t need to worry about them running out.</p> <h3 id="special-cases">Special cases</h3> <p>There are special cases for electric vehicles <code>E__-____</code>, rentals <code>R__-____</code>, and so on. I appreciate this additional information being encoded in the plate.</p> <p>They&#39;ve also removed a whole bunch of three-letter words from the pool so bad luck if you wanted <code>GAY-0000</code>. Inexplicably, <code>ANT</code> is disallowed. Because that&#39;s … an ant?</p> <h3 id="issue-date">Issue date</h3> <p>The scheme encodes issue date gracefully: it&#39;s pretty obvious by looking at cars that they started at <code>AAA</code> and they&#39;re currently somewhere in the early-to-mid-<code>C__</code>s.</p> <p>This avoids issues of specifically encoding a year into the plate, as we&#39;ll see the next time I visit the UK. It also provides a free street game: find the latest plate!</p> <h3 id="region-awareness">Region awareness</h3> <p>There appears to be no region encoding in the plate. Taiwan is a relatively small island so this probably isn&#39;t necessary, but I do like knowing where someone is from.</p> <h3 id="schema-45">Schema: 4/5</h3> <ul> <li>Pro: simple, obvious, and consistent.</li> <li>Con: no regional coding, the <code>4</code> thing, and it feels punitive to have excluded <code>ANT</code>.</li> </ul> <h2 id="design">Design</h2> <p>A simple plate, stamped metal, black on white in its standard form. I prefer an embossing over a cheaper-looking laminate so top marks here.</p> <p>The typeface is slightly condensed which looks nice on the plate. But I like a plate to fill the space given for it on the vehicle, and a narrow plate rarely does that.</p> <figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="A close-up photo of a Taiwanese registration plate, BQD-2793. The Q has a strong diagonal line that cuts across the entire character, starting half way down the left side and clearly jutting out of the lower-right of the figure." height="326" loading="lazy" src="https://johnnydecimal.com/blog/0224A-Taiwan_rego_Q-798x326.png" width="798"> </picture> </figure> <p>Theoretically that&#39;s a <code>-</code> dash separating the letters and numbers, but it&#39;s shown as a dot on most (all?) plates. I would have stretched that out a little, at least on cars where there&#39;s plenty of room.</p> <h3 id="points-for-a-nice-q">Points for a nice <code>Q</code></h3> <p>If you&#39;re going to use a <code>Q</code> you really have to make sure it looks like a <code>Q</code>. Taiwan is a clear pass in this category.</p> <h3 id="markings-at-the-bottom">Markings at the bottom</h3> <p>Apparently they moved the screw holes exclusively to the top to allow for those markings, barely visible, at the bottom. I wouldn&#39;t have bothered.</p> <h3 id="design-35">Design: 3/5</h3> <ul> <li>Pro: stamped metal. A nice typeface.</li> <li>Con: no other adornments. Kinda plain. Doesn&#39;t fill the space.</li> </ul> <h2 id="summary">Summary</h2> <p>Overall Taiwan scores 7/10: not bad for our first entrant. It&#39;s an inoffensive plate that does the job without trying to get in your face. I just wish that they&#39;d put a <em>touch</em> more into its design.</p> <div data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2> <ol> <li id="user-content-fn-thirteen"> <p><code>13</code> is <em>not</em> excluded from the registration scheme, to be clear. I refer to its common omission from building floor numbers. <a href="#user-content-fnref-thirteen" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref footnoteBackLink">↩</a></p> </li> </ol> </div> Finished reading Book of the Dead - Molly White's activity feed 6a39376f91f30f1ebedb9f5f 2026-06-22T00:12:23.000Z <article class="entry h-entry hentry"><header><div class="description">Finished reading: </div></header><div class="content e-content"><div class="book h-entry hentry"><a class="book-cover-link" href="https://www.mollywhite.net/reading/books?search=Book%20of%20the%20Dead"><img class="u-photo book-cover" src="https://m.media-amazon.com/images/S/compressed.photo.goodreads.com/books/1442534083i/6526.jpg" alt="Cover image of Book of the Dead" style="max-width: 300px;"/></a><div class="book-details"><div class="top"><div class="series-info"><i>Kay Scarpetta</i> series, book <span class="series-number">15</span>. </div><div class="title-and-byline"><div class="title"><i class="p-name">Book of the Dead</i> </div><div class="byline">by <span class="p-author h-card">Patricia Cornwell</span>. </div></div><div class="book-info">Published <time class="dt-published published" datetime="2007">2007</time>. 511 pages. </div></div><div class="bottom"><div class="reading-info"><div class="reading-dates"> Started <time class="dt-accessed accessed" datetime="2026-06-20">June 20, 2026</time>; completed June 21, 2026. </div></div></div></div></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-06-22T00:12:23+00:00" title="June 22, 2026 at 12:12 AM UTC">June 22, 2026 at 12:12 AM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=crime" title="See all books tagged "crime"" rel="category tag">crime</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=mystery" title="See all books tagged "mystery"" rel="category tag">mystery</a>, <a class="tag p-category" href="https://www.mollywhite.net/reading/books?tags=thriller" title="See all books tagged "thriller"" rel="category tag">thriller</a>. </div></div></footer></article> Removing prefixes and suffixes in Python - James' Coffee Blog https://jamesg.blog/2026/06/22/removing-prefixes-and-suffixes-in-python 2026-06-22T00:00:00.000Z <style media="(prefers-color-scheme: dark)">pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #49483e } .highlight { background: #272822; color: #F8F8F2 } .highlight .c { color: #959077 } /* Comment */ .highlight .err { color: #ED007E; background-color: #1E0010 } /* Error */ .highlight .esc { color: #F8F8F2 } /* Escape */ .highlight .g { color: #F8F8F2 } /* Generic */ .highlight .k { color: #66D9EF } /* Keyword */ .highlight .l { color: #AE81FF } /* Literal */ .highlight .n { color: #F8F8F2 } /* Name */ .highlight .o { color: #FF4689 } /* Operator */ .highlight .x { color: #F8F8F2 } /* Other */ .highlight .p { color: #F8F8F2 } /* Punctuation */ .highlight .ch { color: #959077 } /* Comment.Hashbang */ .highlight .cm { color: #959077 } /* Comment.Multiline */ .highlight .cp { color: #959077 } /* Comment.Preproc */ .highlight .cpf { color: #959077 } /* Comment.PreprocFile */ .highlight .c1 { color: #959077 } /* Comment.Single */ .highlight .cs { color: #959077 } /* Comment.Special */ .highlight .gd { color: #FF4689 } /* Generic.Deleted */ .highlight .ge { color: #F8F8F2; font-style: italic } /* Generic.Emph */ .highlight .ges { color: #F8F8F2; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #F8F8F2 } /* Generic.Error */ .highlight .gh { color: #F8F8F2 } /* Generic.Heading */ .highlight .gi { color: #A6E22E } /* Generic.Inserted */ .highlight .go { color: #66D9EF } /* Generic.Output */ .highlight .gp { color: #FF4689; font-weight: bold } /* Generic.Prompt */ .highlight .gs { color: #F8F8F2; font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #959077 } /* Generic.Subheading */ .highlight .gt { color: #F8F8F2 } /* Generic.Traceback */ .highlight .kc { color: #66D9EF } /* Keyword.Constant */ .highlight .kd { color: #66D9EF } /* Keyword.Declaration */ .highlight .kn { color: #FF4689 } /* Keyword.Namespace */ .highlight .kp { color: #66D9EF } /* Keyword.Pseudo */ .highlight .kr { color: #66D9EF } /* Keyword.Reserved */ .highlight .kt { color: #66D9EF } /* Keyword.Type */ .highlight .ld { color: #E6DB74 } /* Literal.Date */ .highlight .m { color: #AE81FF } /* Literal.Number */ .highlight .s { color: #E6DB74 } /* Literal.String */ .highlight .na { color: #A6E22E } /* Name.Attribute */ .highlight .nb { color: #F8F8F2 } /* Name.Builtin */ .highlight .nc { color: #A6E22E } /* Name.Class */ .highlight .no { color: #66D9EF } /* Name.Constant */ .highlight .nd { color: #A6E22E } /* Name.Decorator */ .highlight .ni { color: #F8F8F2 } /* Name.Entity */ .highlight .ne { color: #A6E22E } /* Name.Exception */ .highlight .nf { color: #A6E22E } /* Name.Function */ .highlight .nl { color: #F8F8F2 } /* Name.Label */ .highlight .nn { color: #F8F8F2 } /* Name.Namespace */ .highlight .nx { color: #A6E22E } /* Name.Other */ .highlight .py { color: #F8F8F2 } /* Name.Property */ .highlight .nt { color: #FF4689 } /* Name.Tag */ .highlight .nv { color: #F8F8F2 } /* Name.Variable */ .highlight .ow { color: #FF4689 } /* Operator.Word */ .highlight .pm { color: #F8F8F2 } /* Punctuation.Marker */ .highlight .w { color: #F8F8F2 } /* Text.Whitespace */ .highlight .mb { color: #AE81FF } /* Literal.Number.Bin */ .highlight .mf { color: #AE81FF } /* Literal.Number.Float */ .highlight .mh { color: #AE81FF } /* Literal.Number.Hex */ .highlight .mi { color: #AE81FF } /* Literal.Number.Integer */ .highlight .mo { color: #AE81FF } /* Literal.Number.Oct */ .highlight .sa { color: #E6DB74 } /* Literal.String.Affix */ .highlight .sb { color: #E6DB74 } /* Literal.String.Backtick */ .highlight .sc { color: #E6DB74 } /* Literal.String.Char */ .highlight .dl { color: #E6DB74 } /* Literal.String.Delimiter */ .highlight .sd { color: #E6DB74 } /* Literal.String.Doc */ .highlight .s2 { color: #E6DB74 } /* Literal.String.Double */ .highlight .se { color: #AE81FF } /* Literal.String.Escape */ .highlight .sh { color: #E6DB74 } /* Literal.String.Heredoc */ .highlight .si { color: #E6DB74 } /* Literal.String.Interpol */ .highlight .sx { color: #E6DB74 } /* Literal.String.Other */ .highlight .sr { color: #E6DB74 } /* Literal.String.Regex */ .highlight .s1 { color: #E6DB74 } /* Literal.String.Single */ .highlight .ss { color: #E6DB74 } /* Literal.String.Symbol */ .highlight .bp { color: #F8F8F2 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #A6E22E } /* Name.Function.Magic */ .highlight .vc { color: #F8F8F2 } /* Name.Variable.Class */ .highlight .vg { color: #F8F8F2 } /* Name.Variable.Global */ .highlight .vi { color: #F8F8F2 } /* Name.Variable.Instance */ .highlight .vm { color: #F8F8F2 } /* Name.Variable.Magic */ .highlight .il { color: #AE81FF } /* Literal.Number.Integer.Long */ .highlight .nn, .highlight .n{color: light-dark(black, var(--dark-foreground-color)) }</style><style media="(prefers-color-scheme: light)">pre { line-height: 125%; } td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } .highlight .hll { background-color: #ffffcc } .highlight { background: #f8f8f8; } .highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #F00 } /* Error */ .highlight .k { color: #008000; font-weight: bold } /* Keyword */ .highlight .o { color: #666 } /* Operator */ .highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ .highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #9C6500 } /* Comment.Preproc */ .highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ .highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ .highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #E40000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #008400 } /* Generic.Inserted */ .highlight .go { color: #717171 } /* Generic.Output */ .highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #04D } /* Generic.Traceback */ .highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008000 } /* Keyword.Pseudo */ .highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #B00040 } /* Keyword.Type */ .highlight .m { color: #666 } /* Literal.Number */ .highlight .s { color: #BA2121 } /* Literal.String */ .highlight .na { color: #687822 } /* Name.Attribute */ .highlight .nb { color: #008000 } /* Name.Builtin */ .highlight .nc { color: #00F; font-weight: bold } /* Name.Class */ .highlight .no { color: #800 } /* Name.Constant */ .highlight .nd { color: #A2F } /* Name.Decorator */ .highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #00F } /* Name.Function */ .highlight .nl { color: #767600 } /* Name.Label */ .highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #19177C } /* Name.Variable */ .highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */ .highlight .w { color: #BBB } /* Text.Whitespace */ .highlight .mb { color: #666 } /* Literal.Number.Bin */ .highlight .mf { color: #666 } /* Literal.Number.Float */ .highlight .mh { color: #666 } /* Literal.Number.Hex */ .highlight .mi { color: #666 } /* Literal.Number.Integer */ .highlight .mo { color: #666 } /* Literal.Number.Oct */ .highlight .sa { color: #BA2121 } /* Literal.String.Affix */ .highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ .highlight .sc { color: #BA2121 } /* Literal.String.Char */ .highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ .highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #BA2121 } /* Literal.String.Double */ .highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ .highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ .highlight .sx { color: #008000 } /* Literal.String.Other */ .highlight .sr { color: #A45A77 } /* Literal.String.Regex */ .highlight .s1 { color: #BA2121 } /* Literal.String.Single */ .highlight .ss { color: #19177C } /* Literal.String.Symbol */ .highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #00F } /* Name.Function.Magic */ .highlight .vc { color: #19177C } /* Name.Variable.Class */ .highlight .vg { color: #19177C } /* Name.Variable.Global */ .highlight .vi { color: #19177C } /* Name.Variable.Instance */ .highlight .vm { color: #19177C } /* Name.Variable.Magic */ .highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style> <style> @font-face { font-family: 'MonaspaceArgon'; src: url('/assets/fonts/MonaspaceArgon-Regular.woff2') format('woff2'); font-weight: 400; font-style: normal; } pre, code { font-family: 'MonaspaceArgon', ui-monospace, monospace; } </style> <p>A few weeks ago, I learned about the <code>removeprefix</code> method in Python. It lets you remove a specific prefix from the beginning of a string. For example, I can use the following code to remove <code>www.</code> from the beginning of a domain name:</p><div class="highlight"><pre><span></span><span class="s2">"www.jamesg.blog"</span><span class="o">.</span><span class="n">removeprefix</span><span class="p">(</span><span class="s2">"www."</span><span class="p">)</span> </pre></div> <p>If the string doesn’t contain the prefix, nothing happens; if the string does contain the prefix, the prefix is removed.</p><p><em>Note: If you are parsing URLs in Python, you should use a library like </em><a href="https://docs.python.org/3/library/urllib.parse.html" rel="noreferrer"><em>urllib.parse</em></a><em> to extract parts of a URL.</em></p><p>I did some digging and, via <a href="https://stackoverflow.com/questions/16891340/remove-a-prefix-from-a-string">a mention of the method in Stack Overflow</a>, I learned that Python 3.9 added support for methods for <a href="https://docs.python.org/3/whatsnew/3.9.html">removing prefixes and suffixes from strings</a>: <code>removeprefix</code> and <code>removesuffix</code>.</p><p>When I learned about <code>removeprefix</code>, I felt a little bit of joy. I have been using Python for years and had no idea about this method.</p><p>Instead of doing the trick to measure the length of a string I want to remove, and then removing that number of characters from the beginning of a string using indexing if the string <code>startswith</code> the string I want to remove, I now can use a single method: <code>removeprefix</code> (and <code>removesuffix</code> to do the same at the end of a string).</p><h2 id="addendum:-lstrip-and-rstrip">Addendum: lstrip and rstrip</h2><p>While the <code>lstrip()</code> and <code>rstrip()</code> methods, which remove either whitespace or specified characters from the start or end of a string, may sound like they do the same thing, they remove all instances of the specified characters. For example, if I use this code:</p><div class="highlight"><pre><span></span><span class="s2">"www.w.jamesg.blog"</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s2">"www."</span><span class="p">)</span> </pre></div> <p>The code returns:</p><pre><code>jamesg.blog</code></pre><p><code>lstrip()</code> has removed all <code>w</code> and <code>.</code> characters that would start the string.</p><p>I thought I would document this because for a while I wasn’t aware this was the behaviour of <code>lstrip</code> and <code>strip</code>.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0f9ebd3aeafe718',t:'MTc4MjExNzM0Mw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> <a class="tag" href="https://docs.python.org/3/library/urllib.parse.html">urllib.parse</a> <a class="tag" href="https://docs.python.org/3/whatsnew/3.9.html">removing prefixes and suffixes from strings</a> <a class="tag" href="https://stackoverflow.com/questions/16891340/remove-a-prefix-from-a-string">a mention of the method in Stack Overflow</a> 📝 2026-06-21 18:42: It's handy when your riding buddy is a photographer. You end up with some nice... - Kev Quirk https://kevquirk.com/2026-06-21-1842 2026-06-21T17:42:00.000Z <p>It's handy when your riding buddy is a photographer. You end up with some nice photos.</p> <p><img src="https://kevquirk.com/content/images/2026-06-21-1842/1000009851.webp" alt="1000009851" /></p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-21%2018%3A42">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-21-1842#comments">leave a comment</a>.</p> </div>