<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[One Thing at a Time]]></title><description><![CDATA[Reflections on projects, focus, and making progress — one thing at a time.]]></description><link>https://onething.davecross.co.uk</link><image><url>https://onething.davecross.co.uk/img/substack.png</url><title>One Thing at a Time</title><link>https://onething.davecross.co.uk</link></image><generator>Substack</generator><lastBuildDate>Tue, 20 Oct 2026 10:58:23 GMT</lastBuildDate><atom:link href="https://onething.davecross.co.uk/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dave Cross]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[davecross@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[davecross@substack.com]]></itunes:email><itunes:name><![CDATA[Dave Cross]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dave Cross]]></itunes:author><googleplay:owner><![CDATA[davecross@substack.com]]></googleplay:owner><googleplay:email><![CDATA[davecross@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dave Cross]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Progressing on many fronts]]></title><description><![CDATA[It turns out that when you add a little planning, things work better. Who knew?]]></description><link>https://onething.davecross.co.uk/p/progressing-on-many-fronts</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/progressing-on-many-fronts</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Fri, 16 Oct 2026 15:56:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-gBB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-gBB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-gBB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-gBB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1980063,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://onething.davecross.co.uk/i/220700760?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-gBB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!-gBB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a4990f2-7d36-4c29-90de-e578d39a131b_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I&#8217;m just finishing my sixth week using the planning mechanisms I described in <a href="https://onething.davecross.co.uk/p/whatever-happened-to-my-2020-vision">my last newsletter</a>, and I&#8217;m very impressed by the difference they've made to my working day. I have a lot of progress to tell you about. And we&#8217;ll get to that, but first, I have a couple of speaking engagements that you might be interested in.</p><p>On Wednesday, 21 October (that&#8217;s next Wednesday, from when I&#8217;m writing this), I&#8217;m giving an online talk called <strong><a href="https://luma.com/6qqyscbm?tk=IWMYkz">MCP - Model Context Protocol in Perl: From Web App to AI Tools</a></strong> for Perl Maven. I&#8217;ll explain how I made the data that drives my Line of Succession website available to your favourite AI tools. There are already a ridiculous number of people signed up, but I&#8217;m sure there is room for a few more.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">One Thing at a Time is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>And then, a month later, we have the <a href="https://act.yapc.eu/lpw2026/">London Perl Workshop</a>. The workshop seems to have fully recovered from its post-COVID interregnum&#8212;this is the third consecutive year that the event has taken place. And this year it&#8217;s at a new venue, the Zoopla offices in Shad Thames. I&#8217;m not sure what I&#8217;ll be speaking about yet, but I&#8217;ve proposed a few talks and left the choice in the hands of the organisers. But even if they don&#8217;t select any of my talks, I&#8217;m confident that the day will be packed full of useful and interesting information for Perl programmers.</p><p>With that out of the way, let&#8217;s look at what I&#8217;ve been doing.</p><h2>Data Munging with Perl [2ed]</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!l_li!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l_li!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!l_li!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!l_li!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!l_li!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l_li!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png" width="204" height="325.531914893617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2250,&quot;width&quot;:1410,&quot;resizeWidth&quot;:204,&quot;bytes&quot;:1573571,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://onething.davecross.co.uk/i/220700760?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l_li!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!l_li!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!l_li!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!l_li!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6b322b21-cd77-455d-9263-ca1cf3957156_1410x2250.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Lots of progress here. You can see exactly what has changed by looking at the updates section on <a href="https://datamungingwithperl.com/">the book&#8217;s website</a>. I&#8217;m going to read the book through completely over the weekend and come up with a (hopefully very short) list of things that need to be fixed before the book can be published. The plan is that I&#8217;ll be able to bring some copies (real paperback copies!) with me to sell at the London Perl Workshop.</p><p>But if you can&#8217;t wait until then, you can still buy the <a href="https://leanpub.com/datamungingwithperl">Work In Progress version from LeanPub</a>, which will allow you to update to the completed ebook once it is published.</p><p>It&#8217;s good to get to complete a project. And publishing this will leave a large, book-writing-shaped hole in my schedule. I already have a few ideas about what might fill that hole.</p><h2>Perl School</h2><p>Working on <em>Data Munging with Perl</em> led me to think a little more deeply about <a href="https://perlschool.com/">Perl School</a>. At first, I was just publishing books by myself, but that has expanded and we now publish books by <a href="https://perlschool.com/authors/">four different authors</a>. I started to wonder what it might look like if Perl School turned into more of a &#8220;real&#8221; business (whatever that means). And, obviously, it means more books by more authors. But it also means running the business in a more professional manner. Which is what I&#8217;ve been trying to do over the last few months.</p><ul><li><p>I&#8217;ve had conversations with a number of people, which have led to potentially four or five new Perl School books to be written over the next year</p></li><li><p>I&#8217;ve set up a mailing list for people who want to keep in touch with what&#8217;s going on with Perl School (you can subscribe using the form at the bottom of every page on <a href="https://perlschool.com/">the website</a>)</p></li><li><p>I&#8217;ve created the first draft of an author agreement, which forced me to think a bit more deeply about what Perl School is and how it works (related to that, I&#8217;ve also rewritten the &#8220;<a href="https://perlschool.com/write/">Write For Us</a>&#8221; page on the website, so it better explains what we offer for authors)</p></li><li><p>I&#8217;ve written software that takes sales and royalty data from both Amazon KDP and LeanPub and combines that in a database that makes it easier to produce statements, telling me how much I owe authors</p></li><li><p>I&#8217;ve written production software that takes a book written in Markdown and produces an EPUB and two PDFs (one A4 with no blank pages for sale through LeanPub and a version for the Amazon KDP paperback print-on-demand system, that implements dozens of nice little formatting tweaks that make a print-on-demand book look more like a &#8220;real&#8221; book</p></li></ul><p>We are never going to be O&#8217;Reilly (or even Manning). But I think I&#8217;m building the basis of a nice little business. I just need people to buy a few more books.</p><h2>Line of Succession</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RTA2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RTA2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 424w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 848w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 1272w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RTA2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png" width="232" height="328.28" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1415,&quot;width&quot;:1000,&quot;resizeWidth&quot;:232,&quot;bytes&quot;:533921,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://onething.davecross.co.uk/i/220700760?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RTA2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 424w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 848w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 1272w, https://substackcdn.com/image/fetch/$s_!RTA2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e663ea7-9b03-40ee-bcd6-9249294eaf01_1000x1415.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Line of Succession is my most successful project. That is, it&#8217;s certainly the website that gets the most hits each month. But currently, it&#8217;s completely unmonetised. I ran Google Ads on in for a while, but I made almost no money and I don&#8217;t think they went well with the general ambience of the site. So I&#8217;ve been thinking about that.</p><ul><li><p>I&#8217;ve turned on paid subscriptions for the Substack associated with the site. No-one is paying yet though</p></li><li><p>I&#8217;ve got into more of a regular rhythm of posting to the Substack once a week. And I&#8217;ve moved away from covering just the current British royal family</p></li><li><p>I&#8217;ve fixed a few niggling little bugs on the site and made some improvements. For example, people who are excluded from the line of succession are now included in lists on the site</p></li><li><p>I&#8217;ve improved how the site&#8217;s <a href="https://lineofsuccession.co.uk/mcp/">Model Context Protocol</a> server works. I&#8217;ve been able to connect Line of Succession to both ChatGPT and Claude&#8217;s chatbot. It was an exciting day when that worked</p></li></ul><p>But my biggest play on the site is demonstrated by the image at the top of this section. I want to sell personalised prints of the line of succession on a certain date. I&#8217;m thinking there will be three price points: a digital image, an unframed print (maybe in multiple sizes) and a framed version. There&#8217;s a page on the site where you can <a href="https://lineofsuccession.co.uk/print">see how it would look for a date</a> that is meaningful to you in some way, but I&#8217;ve yet to work out the payment path or how to connect to a print shop that would print and ship the print.</p><h2>And everything else...</h2><p>Those are the three projects that have taken up most of my time over the last few weeks. But there are plenty of other things that I&#8217;ve been working on. Here are a few of them.</p><p><strong>Oneirina:</strong> I&#8217;ve been experimenting with AI-generated music for a while now, and I&#8217;ve created a virtual artist called <a href="https://oneirina.com/">Oneirina</a>. She has released a few songs on the usual streaming services, but getting people to listen to them is a completely different challenge. I&#8217;ve been experimenting with creating short music videos for <a href="https://www.youtube.com/@OneirinaMusic">YouTube</a> and <a href="https://www.tiktok.com/@OneirinaMusic">TikTok</a>, using a combination of AI video generation, ElevenLabs and CapCut. It&#8217;s been a lot of fun (and occasionally frustrating, particularly when TikTok decides to mute the music in a music video&#8212;when it&#8217;s my music on my video!) I&#8217;ve also just submitted a short video message from Oneirina for Spotify Wrapped 2026. I have no idea whether any of this will result in more people listening to the music, but I&#8217;m learning a lot along the way.</p><p><strong>The Story Cupboard:</strong> Another experiment with AI-generated video. A while ago, I wrote a children&#8217;s story called <em>George and the Smart Home</em>. I&#8217;ve now turned it into <a href="https://www.youtube.com/watch?v=psm4DJJdrxU">a short animated video</a>, complete with narration and music, and published it on YouTube. I&#8217;ve created a new channel called <em><a href="https://www.youtube.com/channel/UCX4z7YQy0PJEXMQlQCtbGGA">The Story Cupboard</a></em> for this and similar projects. The next video will be based on another children&#8217;s book I&#8217;ve written, <em>Digital Woodland ABCs</em>. Again, I have no idea whether anyone will watch these videos, but it&#8217;s interesting to see just how much you can achieve with tools that didn&#8217;t exist a couple of years ago.</p><p><strong>The Horsell Transmissions:</strong> Over the first half of this year, I wrote a science fiction serial called <em><a href="https://www.amazon.co.uk/dp/B0HK96X5Y6">The Horsell Transmissions</a></em>, which I published in instalments on Substack. I&#8217;ve now edited the whole thing into a book and published it as a paperback on Amazon. It&#8217;s nice to have another finished book out in the world. Of course, now I have to work out how to persuade people to buy it. I&#8217;m beginning to see a pattern here.</p><p><strong>NonProphet:</strong> This is another project that uses AI to generate content. It&#8217;s a system that produces short, daily social media posts about religion, scepticism and critical thinking. I&#8217;ve built the <a href="https://nonprophet.app/">first version of the software</a> and set up accounts on TikTok, Instagram, Bluesky and YouTube. The content generation is working well, but building an audience is proving rather harder. It turns out that automatically creating content and getting people to look at it are two very different problems. Who knew?</p><p><strong>Perl Hacks:</strong> I&#8217;ve also found some time to return to <a href="https://perlhacks.com/">Perl Hacks</a>, my long-running Perl blog. I&#8217;ve made a few improvements to the site and published some new posts. One of the most recent was a look back at <a href="https://perlhacks.com/2026/10/the-long-life-of-wwwshorten/">the history of </a><code>WWW::Shorten</code>, a Perl module I first released over twenty years ago. It&#8217;s slightly alarming to realise that some of the software I&#8217;ve written is now old enough to have its own history.</p><h2>So, is the planning working?</h2><p>Looking back over everything I&#8217;ve written here, I&#8217;m actually rather surprised by how much I&#8217;ve managed to get done over the last six weeks. And that&#8217;s before mentioning all the smaller things that haven&#8217;t made it into this newsletter.</p><p>I don&#8217;t think I&#8217;m working any harder than I was before. I&#8217;m certainly not working longer hours. But I am spending less time wondering what I should be doing next, and more time actually doing things. Having a plan for the week, and knowing which projects I&#8217;m supposed to be concentrating on, seems to make a real difference.</p><p>Of course, there&#8217;s still a problem. I&#8217;m very good at coming up with new ideas, and I&#8217;m getting better at turning those ideas into finished projects. What I&#8217;m not particularly good at is persuading people to pay money for the results. That&#8217;s probably something I should spend a bit more time planning.</p><p>But, for now, I&#8217;m going to count the last six weeks as a success. I&#8217;ve made progress on several projects, finished a few things that have been hanging around for far too long, and learned some interesting new skills.</p><p>And all it took was a little planning. Who knew?</p><p>That&#8217;s all for now, see you next time.</p><p>Leave a comment telling me what personal projects you&#8217;re working on,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">One Thing at a Time is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Whatever happened to my 2020 vision?]]></title><description><![CDATA[The importance of profit, practice and profile]]></description><link>https://onething.davecross.co.uk/p/whatever-happened-to-my-2020-vision</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/whatever-happened-to-my-2020-vision</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Tue, 15 Sep 2026 15:12:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3PM0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3PM0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3PM0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3PM0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2684019,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://onething.davecross.co.uk/i/215833567?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3PM0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3PM0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d1a601c-97c2-45d5-9192-4817239985e1_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the end of 2019, I quit my job.</p><p>That probably needs a little context.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>For most of my career, I&#8217;d been a freelance software developer. By 2018, I was a reasonably well-known Perl contractor and had worked for most of the companies in London that employed significant numbers of Perl programmers.</p><p>That year, I started a contract at FairFX (now called Equals Money). About a year later, the company decided to reduce its reliance on contractors. But rather than getting rid of me, they offered me a permanent job as a staff engineer.</p><p>I accepted.</p><p>About six months later, I realised that permanent employment really wasn&#8217;t for me.</p><p>So I resigned.</p><p>Fortunately, I had enough savings that I didn&#8217;t need to find another contract immediately. Instead, I decided to give myself a year to see whether I could turn one of the many ideas rattling around my head into a business that could support me.</p><p>I called it my <strong>2020 Vision</strong>.</p><p>The plan was simple. I&#8217;d spend a month on each idea. At the end of the month, I&#8217;d move on to the next one. Presumably, at some point, one of them would show enough promise that I&#8217;d concentrate on it.</p><p>January was the <a href="https://lineofsuccession.co.uk/">Line of Succession</a>. I&#8217;d been running a rather rudimentary version of the site for years, so I spent the month turning it into something more professional and started trying to find an audience for it.</p><p>February was Lystyng, an idea for a social network based around people sharing lists. That never got very far, although I still occasionally think there&#8217;s something in the idea.</p><p>March was <em>More Than Code</em>, a book about the parts of being a software developer that aren&#8217;t actually writing software.</p><p>And around this time, I started a newsletter to document the experiment.</p><p>I called it <em>One Thing at a Time</em>.</p><p>You can probably guess what happened next.</p><p>It was March 2020.</p><p>For no particularly rational reason (I was working at home anyway and had enough money to live on) the arrival of Covid completely derailed the experiment. The remainder of 2020 disappeared into a sea of confusion.</p><p>Since then, I&#8217;ve been slowly rebuilding.</p><p>I&#8217;ve taken more contracts. I&#8217;ve even had another attempt at permanent employment (I lasted four months that time). And, all the while, I&#8217;ve continued to collect projects.</p><p>Lots of projects. You will have seen me mention some of them in this newsletter.</p><p>There are books. Websites. Newsletters. Software projects. Music projects. Some are finished. Some are nearly finished. Some are little more than domain names and vague intentions. Some have been sitting untouched for years before suddenly springing back to life.</p><p>And this creates a problem.</p><p>The obvious solution is right there in the name of this newsletter: <strong>one thing at a time</strong>.</p><p>Pick the most important project. Work on it until it&#8217;s finished. Then pick another one.</p><p>It&#8217;s excellent advice.</p><p>And I seem completely incapable of following it.</p><h3>The Three Ps</h3><p>A few years ago, a friend suggested a different way of thinking about my collection of projects. I&#8217;ve refined the idea over time into what I now call the <strong>Three Ps</strong>.</p><p>They are <strong>Profit, Practice and Profile</strong>.</p><p><strong>Profit</strong> is the obvious one. Does this project make money? Or, perhaps more importantly, is there a plausible route by which it might eventually make money?</p><p>Client work is almost entirely Profit. Other projects might not make much money today, but could conceivably grow into useful sources of income.</p><p><strong>Practice</strong> is about developing skills.</p><p>I&#8217;m a software developer, but the list of things I want to be better at extends far beyond writing code. Writing, publishing, design, marketing, AI, video, audio, data analysis&#8212;there are always new things to learn.</p><p>A project can justify some of my time simply because working on it teaches me something useful.</p><p>And then there&#8217;s <strong>Profile</strong>.</p><p>Some projects put my work in front of people. They build an audience, enhance my reputation or introduce me to people I wouldn&#8217;t otherwise encounter.</p><p>That has value too. Sometimes it&#8217;s eventually financial value. Sometimes it leads to opportunities that I couldn&#8217;t possibly have predicted when I started the project.</p><p>The important thing is that these aren&#8217;t three separate buckets.</p><p>A good project might hit two of the Ps. A really good one might hit all three.</p><p>And a project that hits one of them particularly strongly can still be worth doing.</p><p>But there&#8217;s also an interesting question to ask about a project that doesn&#8217;t hit <strong>any</strong> of them.</p><p>Why am I spending time on this?</p><p>Perhaps there&#8217;s a good answer. This isn&#8217;t intended to be an algorithm for running my life. I&#8217;m allowed to do things just because I enjoy them.</p><p>But it&#8217;s a useful question.</p><h3>One day at a time</h3><p>Over the last couple of weeks, I&#8217;ve started using the Three Ps more deliberately to plan my working time.</p><p>And it&#8217;s made me reconsider what I meant when I called this newsletter <em>One Thing at a Time</em>.</p><p>Back in 2020, the unit of &#8220;at a time&#8221; was a month.</p><p>January was Line of Succession. February was Lystyng. March was <em>More Than Code</em>.</p><p>The theory was that I&#8217;d concentrate exclusively on one project for a month before moving on to something else.</p><p>I don&#8217;t think that works for me.</p><p>What seems to work rather better is making the unit <strong>a day</strong>.</p><p>I can have several active projects. But that doesn&#8217;t mean they all need to be competing for my attention simultaneously.</p><p>Today can be a book day.</p><p>Tomorrow can be a Line of Succession day.</p><p>Another day can be devoted to promoting some music I&#8217;ve released.</p><p>Another can be spent experimenting with some new technology.</p><p>The Three Ps help me decide which projects deserve those days. And once I&#8217;ve decided what a particular day is for, <em>One Thing at a Time</em> takes over.</p><p>There&#8217;s a surprisingly important psychological difference here.</p><p>If I know that a project has Thursday allocated to it, I don&#8217;t need to fiddle with it on Tuesday. I can concentrate on Tuesday&#8217;s project because I know the other thing&#8217;s turn is coming.</p><p>I&#8217;m still experimenting with this. I&#8217;m sure the system will change again.</p><p>But I increasingly think my problem was never that I had too many projects.</p><p>The problem was having too many projects asking for my attention <strong>at the same time</strong>.</p><h3>Putting it into practice</h3><p>This all sounds suspiciously like the kind of productivity system that is much more fun to devise than it is to actually use.</p><p>So I&#8217;ve started using it.</p><p>For the last couple of weeks, I&#8217;ve been looking across my collection of projects, thinking about how they score against the Three Ps, and giving particular projects whole days in my calendar.</p><p>Some of the choices are obvious.</p><p><strong><a href="https://datamungingwithperl.com/">Data Munging with Perl</a></strong> is the second edition of a book I first published more than twenty years ago. It&#8217;s currently about 80% complete and I want paperback copies available for the London Perl Workshop at the end of November. That&#8217;s primarily <strong>Profit</strong> (it&#8217;s a product I can sell), but writing it also keeps my Perl knowledge sharp and raises my profile in a community where I&#8217;ve been working for decades. So there&#8217;s a bit of all three Ps there.</p><p><strong><a href="https://lineofsuccession.co.uk/">Line of Succession</a></strong> is an even more interesting example. It&#8217;s the survivor from the original 2020 Vision experiment. It already has a small audience, and recently I&#8217;ve been looking seriously at ways to turn that audience into income &#8212; paid newsletter subscriptions, books and personalised printed family trees of the royal succession. That&#8217;s <strong>Profit</strong> and <strong>Profile</strong>, with plenty of Practice thrown in as I experiment with publishing and marketing.</p><p><strong><a href="https://nonprophet.app/">NonProphet</a></strong> is a much newer project: a website and set of social media accounts looking critically at claims that Old Testament passages predicted events in the life of Jesus. At the moment, it&#8217;s mostly <strong>Practice</strong> and <strong>Profile</strong>. It&#8217;s an excuse to experiment with automated content production and social media formats while writing about something I find interesting. I don&#8217;t currently have much of a plan for making money from it.</p><p>Then there&#8217;s <strong><a href="https://oneirina.com/">Oneirina</a></strong>, my increasingly elaborate experiment in creating and releasing music with generative AI. <a href="https://oneirina.com/release/lullabies-for-broken-screens/">An album came out last week</a>, which means there&#8217;s now the entirely different problem of working out how to persuade people to listen to it. That&#8217;s mostly Practice and Profile too: I&#8217;m learning an enormous amount about music distribution, promotion, video and AI tools.</p><p><strong><a href="https://perlschool.com/">Perl School</a></strong> is my small publishing house, specialising in books about Perl and related technologies. Next week I want to devote a day to looking at the business as a whole: the books already published, the ones in development, and what I can do to turn it into a more substantial source of income. It's an interesting Three Ps project because publishing obviously has potential for <strong>Profit</strong>, producing books involves plenty of <strong>Practice</strong>, and every new title helps build both the Perl School brand and my own <strong>Profile</strong>.</p><p>There are plenty of other projects too, at various stages of completion.</p><p>That&#8217;s one of the useful things about the Three Ps. It doesn&#8217;t tell me <em>what</em> to work on. It gives me a way to interrogate why I think something deserves my time.</p><h3>2020 Vision, revisited</h3><p>There&#8217;s one other thing I&#8217;ve noticed while thinking about all of this.</p><p>My 2020 Vision didn&#8217;t entirely fail.</p><p>The first project I worked on, back in January 2020, was the Line of Succession.</p><p>It&#8217;s still running.</p><p>In fact, over the last few weeks I&#8217;ve been putting more effort into it than I have for years: improving the site, building <a href="https://blog.lineofsuccession.co.uk/">the newsletter</a> and experimenting with ways that it might actually generate some useful income.</p><p>Six and a half years after I gave it its allotted month, I&#8217;m still finding out what that project might become.</p><p>Perhaps that was the real problem with 2020 Vision.</p><p>I assumed that a month would tell me whether an idea was worth pursuing.</p><p>But projects don&#8217;t necessarily work like that.</p><p>They can go quiet. They can change direction. Something that starts as Practice can become Profile. Something that builds Profile can eventually turn into Profit. An idea you abandon can suddenly become interesting again years later.</p><p>So perhaps I&#8217;m still following my 2020 Vision after all.</p><p>I&#8217;ve just stopped expecting it to run to a timetable.</p><p>And I&#8217;m still doing one thing at a time.</p><p>I&#8217;ve simply changed what I mean by &#8220;a time&#8221;.</p><p>How do you decide what to spend your time on? Could this framework be useful to you?</p><p>Until next time,</p><p>Cheers,</p><p>Dave&#8230;</p><p><strong>P.S.</strong> There&#8217;s a certain irony in writing an entire post about <strong>Profit, Practice and Profile</strong> while giving you no way to contribute to the first of those.</p><p>So, as part of today&#8217;s experiment, I&#8217;ve switched on paid subscriptions for <em>One Thing at a Time</em>.</p><p>Nothing else is changing. I have no plans to put posts behind a paywall. If you enjoy reading this for free, please carry on doing exactly that. But if you particularly enjoy the newsletter, find some of my experiments useful, or simply want to support what I&#8217;m doing, you now have that option.</p><p>And here&#8217;s the interesting bit. Before I&#8217;d even switched payments on, <strong>two people had already pledged to become paid subscribers</strong>.</p><p>So <em>One Thing at a Time</em> became a revenue-generating project the moment I pressed the button.</p><p>I guess we can put a tick next to <strong>Profit</strong>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Publishing Books]]></title><description><![CDATA[And using LLMs to help]]></description><link>https://onething.davecross.co.uk/p/publishing-books</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/publishing-books</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sat, 08 Aug 2026 16:33:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rlo_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rlo_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rlo_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rlo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg" width="4080" height="3060" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3060,&quot;width&quot;:4080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3137855,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://onething.davecross.co.uk/i/208974156?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd14e452f-bf55-4e1d-849d-9a7640272aef_3072x4080.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rlo_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 424w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 848w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!rlo_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea082d2-ec5a-47d0-8898-ce684c055631_4080x3060.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I recently posted this image to social media with a caption saying I had received proof copies of &#8220;real&#8221; books. I got some mild pushback from people wondering if they counted as real books if they had a large amount of AI input.</p><p>I hope it&#8217;s obvious that I meant &#8220;real books&#8221; as opposed to ebooks - which is what I&#8217;ve mostly been publishing over the last decade. But the conversation got me wondering about what people consider an appropriate level of AI assistance when publishing books. Everyone draws the line at different points, of course. Let me explain where I draw it. Actually, as you&#8217;ll see, I think it can be drawn at different points for different projects.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>The first thing to consider is the content of the book. There are a number of ways you could use an LLM to help create the actual text and images inside the book.</p><ul><li><p>You could brainstorm the subject with the LLM and use it to come up with a list of subjects you need to cover. The equivalent for a novel would be using the LLM to sketch out the skeleton of the plot.</p></li><li><p>You could use the LLM to actually produce the text that makes up the book. And, having done that, you could make various levels of manual edits in order to give the text something that is closer to your voice.</p></li><li><p>Or you could do the opposite. You could write the text yourself and then ask the LLM to proofread it, to ensure that your grammar was accurate and your prose makes sense.</p></li><li><p>Then there&#8217;s graphics. You could use an LLM to create images to illustrate your book. Or to produce the cover.</p></li></ul><p>Let&#8217;s look at the three books in the photo.</p><p>On the left, we have <em><a href="https://davecross.co.uk/whattoask">What to Ask Your Website Company</a></em>. I&#8217;m hoping this is going to become something that introduces me to potential clients. The idea is that it helps small businesses work through the process of working with a web design company to get a website that they&#8217;re happy with. It contains checklists of questions that they should ask to avoid the kind of cowboy companies that I&#8217;m sure we&#8217;ve all come across. And there&#8217;s an offer that, if the book isn&#8217;t enough, they can engage me to manage the project for them. For this, I knew the kinds of things that I needed to cover, but I was happy to brainstorm the concept with ChatGPT to ensure that I had everything covered. It&#8217;s also a very visual book. It contains about a dozen images that were generated for me by Midjourney. As was the cover.</p><p>In the middle, we have <em><a href="https://alice.sowman.org/">Reimagining Diana</a></em>. This is based on an experiment I carried out last year. I wanted to know if ChatGPT was capable of following a thread for long enough to create a novel. It turned out that it wasn&#8217;t. So we tried again by asking it to map out the plot first and then writing the novel a chapter at a time, sticking closely to the plot outline. This second attempt was rather more successful, and it&#8217;s that version that has ended up on Amazon. The cover was generated using ChatGPT. I suspect this is the book that will have the highest proportion of you thinking I&#8217;ve gone too far down the AI route.</p><p>Then, on the right, we have <em><a href="https://perlschool.com/books/design-patterns/">Design Patterns in Modern Perl</a></em> - the latest book from <a href="https://perlschool.com/">Perl School Publishing</a>. This isn&#8217;t written by me; it&#8217;s by Mohammad Sajid Anwar. And, to be honest, I don&#8217;t know how much use he made of AI while writing it (I strongly suspect none). Maybe I should ask the Perl School authors to declare that. But, honestly, if we get good books, I&#8217;m not sure how much I care. Oh, if you look carefully at the cover of this book, you&#8217;ll see there&#8217;s a light green pattern traced out. Mohammad sent me that, and I think he said he had asked ChatGPT to generate that for him. The rest of the cover (the layout of the text and the logo) is all down to my own meagre design skills. It&#8217;s pretty much the same layout that I&#8217;ve been using since long before any of us had heard about LLMs.</p><p>Another example. I&#8217;m (still!) working on the second edition of <em><a href="https://leanpub.com/datamungingwithperl">Data Munging with Perl</a></em>. For various reasons, I&#8217;ve been working on it in a very disjointed fashion, which means I sometimes forget what I&#8217;ve done and what is left. The last time I returned to it, I generated a PDF from the most up-to-date version I had, handed that to Claude and asked it what still needed to be done to update the book to modern Perl - and it gave me a to-do list. I&#8217;m not going to ask the LLM to write any of the updates, but it&#8217;s steering how I work on the book. Oh, and yes, I got ChatGPT to draw the robot on the new cover.</p><p>So, the <em>Data Munging</em> example shows that LLMs can be useful, even if you&#8217;re not using them to actually create the content. They can be useful for planning your work. But the books in the photo are the result of another use I&#8217;ve recently found for an LLM in the publication process.</p><p>Claude Cowork makes a cracking publisher&#8217;s assistant.</p><p>Until now, most of the books I&#8217;ve published have been ebooks. That&#8217;s for a number of reasons (that we&#8217;ll get into below), but one of the most important is that it&#8217;s far easier to format a manuscript for an ebook. Grab any book from your bookshelf and browse through the bits at the start of the book. That&#8217;s called the &#8220;front matter&#8221;. It&#8217;s the bits that come before the book really starts. You&#8217;ll find a half-title page (that just contains the title), a title page (containing the title and the author&#8217;s name), a copyright page (including all sorts of obscure publication details), a table of contents and, perhaps, a dedication.</p><p>Of course, you don&#8217;t need to have all of those pages. But if you want people to think they&#8217;ve got a &#8220;real book&#8221; in their hands, then those extra pages all signal that this book has gone through a proper publication process.</p><p>Then there are the pages that make up the content of the book. The sections and chapters. The chapters all start on a right-hand page (called &#8220;recto&#8221; in publishing parlance). Odd- and even-numbered pages have different headers - book title on the even-numbered (&#8220;verso&#8221;) pages and chapter title on the odd-numbered (&#8220;recto&#8221;) pages. And the header might be skipped on the first page of a chapter. The page numbers go in the footer - but they&#8217;re left-justified on verso pages and right-justified on recto pages.</p><p>Again, this isn&#8217;t all essential. But it all makes the book look more professional. We&#8217;ve been trained to expect books to be formatted that way. If you have a book that you&#8217;ve always thought looked a bit off, then take a closer look. I&#8217;ll bet it&#8217;s missing one or more of the features I&#8217;ve just mentioned.</p><p>And getting all of that right is not trivial. It takes a lot of trial and error. But that&#8217;s where Claude Cowork comes in (I bet other LLMs can do this too). It was Claude who explained all of these requirements to me. And it was Claude who, within a couple of hours of work, had taken Mohammad&#8217;s Markdown files and turned them into a PDF that I could upload directly to Amazon&#8217;s Kindle Direct Publishing (KDP) system. Honestly, I think it saved me a week of work. And, because I&#8217;m a developer (and Claude knows that), it gave me a shell script that can regenerate both the ebook version and the paperback print-ready PDF. Which is, of course, now wired into a GitHub Action that fires whenever the input files change.</p><p>And the books look great. Feel free to buy one and have a closer look.</p><p><strong>Last minute update:</strong> Before I move on from this subject (and onto another, closely related one), I just wanted to point out that I&#8217;ve been making some real progress on the second edition of <em>Data Munging with Perl</em> over the last week. I know it has taken rather longer than I originally promised, but you can buy the <a href="https://leanpub.com/datamungingwithperl">&#8220;work in progress&#8221; version from LeanPub</a> and I hope to have the finished version available in a couple of months. I&#8217;ve even relaunched the book&#8217;s web site at <a href="https://datamungingwithperl.com">datamungingwithperl.com</a>.</p><h2>Why publish paperbacks?</h2><p>You might be wondering why I&#8217;m suddenly publishing loads of paperbacks. When I was <a href="https://www.perl.com/article/perl-hacks-perl-school-and-the-future-of-perl-publishing/">interviewed by brian d foy about Perl School for Perl.com in 2020</a>, I was pretty adamant that Perl School was an ebook-only publishing house. What has changed? A few things.</p><p>Firstly, and most importantly, ebooks haven&#8217;t changed the world in quite the way I thought they would. While I&#8217;ve been pretty much ebook-only for over a decade, I seem to be a bit of an anomaly. There are still plenty of people (the majority, I think) who want paper books that they can put on their shelves. To be fair to myself, I never thought ebooks would take over in the popular fiction category, but I expected that technical books would be one area where they would quickly become dominant. I was wrong. What has actually happened is that the technical books industry has become a shadow of its former self as people turn to websites and videos instead of books that are often out of date before they hit the bookshop shelves.</p><p>Secondly, I don&#8217;t often get to talk face-to-face with Perl School customers, but on the few occasions that has happened over the last five or six years, someone has always specifically asked for a paperback edition of one of the books. Sometimes it&#8217;s because they just like physical books, but, often, it&#8217;s because they find physical books easier to read for some reason. I want Perl School books to be as accessible as possible, so I&#8217;ve known for a while that I needed to look into this at some point.</p><p>Thirdly, the economics have changed. In that Perl.com interview, I talked about how it was easy for Perl School to publish an ebook, without all the upfront costs of a traditional publisher. Well, that has pretty much become true for paperbacks too. Amazon&#8217;s KDP system now has an interface with an international print-on-demand service - and that&#8217;s what I use to print the paperbacks. It&#8217;s just a case of uploading a print-ready PDF of the manuscript (and remember what I wrote above about Claude making that incredibly easy).</p><p>And, finally, there&#8217;s Mohammad. Mohammad is the author of <em>Design Patterns in Modern Perl</em> (as seen above). We published the ebook edition back in November 2025, but I always got the impression that he wouldn&#8217;t consider himself a &#8220;real&#8221; author until he held a physical copy in his hand. So, soon after the ebook was released, I promised him a paperback copy &#8220;in a few months&#8221;. Which is why I made the effort to get it out a couple of months ago. And, honestly, he seems far more excited about the paperback than he did when the book was originally published for the first time. He has certainly told more people about it this time - even building <a href="https://design-patterns-in-modern-perl.com/">a website about it</a>.</p><p>All in all, I feel I&#8217;ve learned a valuable marketing lesson here - &#8220;you are not your customers&#8221;. I was sure that Perl School&#8217;s target audience would want ebooks because they were all like me - and I wanted ebooks. It turns out that&#8217;s not true, and the only way to find out what your customers want is to actually ask them. What a radical idea!</p><p>So there will almost certainly be more Perl School paperbacks in the future. I certainly want a paperback edition of <em>Data Munging with Perl</em>. And I might well revisit some of the older books too. Have I mentioned I&#8217;m also setting up a wider technical publishing house called <a href="https://claphamtechpress.com/">Clapham Technical Press</a>? That&#8217;s how my book, <em><a href="https://claphamtechpress.com/books/github-actions/">GitHub Actions Essentials</a></em> was published. Maybe some of those books need to be paperbacks too.</p><p>And maybe this time next year we&#8217;ll all be millionaires.</p><h1>Some blog posts</h1><p>Usually, I like to include links to a few blog posts that I&#8217;ve written since the last newsletter. But because it&#8217;s been six(!) months this time, there have been quite a few of them. Here is a selection:</p><ul><li><p><a href="https://perlhacks.com/2026/03/still-on-the-bleading-edge/">Still on the [b]leading edge</a></p></li><li><p><a href="https://perlhacks.com/2026/03/writing-a-toon-module-for-perl/">Writing a TOON Module for Perl</a></p></li><li><p><a href="https://perlhacks.com/2026/05/the-long-road-from-cgi-to-containers/">The Long Road from CGI to Containers</a></p></li><li><p><a href="https://perlhacks.com/2026/05/teaching-ai-about-the-british-monarchy-with-mcp/">Teaching AI About the British Monarchy with MCP</a></p></li><li><p><a href="https://perlhacks.com/2026/06/choosing-the-right-database-abstraction/">Choosing the Right Database Abstraction</a></p></li><li><p><a href="https://perlhacks.com/2026/08/the-future-isnt-evenly-distributed/">The Future Isn&#8217;t Evenly Distributed</a></p></li></ul><p>The one about MCPs is going to be turned into an online presentation for Perl Maven in October. <a href="https://luma.com/6qqyscbm">Registration is already open</a>.</p><p>The two on &#8220;CGI to Containers&#8221; and &#8220;Database Abstraction&#8221; form a matching pair about how the recent history of programming is largely a story of moving our abstractions to higher and higher levels. I&#8217;m considering using them as the basis of a talk at the London Perl Workshop this year.</p><p>But, of course, what&#8217;s more interesting is other people&#8217;s blog posts. Here are a few that I particularly enjoyed:</p><ul><li><p><strong><a href="https://irinasouthwell-220.medium.com/i-went-on-maternity-leave-and-came-back-to-a-world-of-ai-assisted-coding-send-help-8dfcf030d5ff">I Went on Maternity Leave and Came Back to a World of Vibe Coding</a></strong><br>Irina was a colleague many years ago. This post amused me, but also had me wondering how many other women had got back to work after maternity leave to find the industry had completely changed while they were away</p></li><li><p><strong><a href="https://lalitm.com/post/building-syntaqlite-ai">Eight years of wanting, three months of building with AI</a></strong><br>An interesting example of how AI-aided coding can be a force for good. I have so many new little tools that I would never have got round to writing if I had had to do it all myself</p></li><li><p><strong><a href="https://simonwillison.net/2026/Apr/2/lennys-podcast/">Highlights from my conversation about agentic engineering on Lenny&#8217;s Podcast</a></strong><br>Sometimes when the speed of change in the industry gets too much for me, I just go looking for Simon Willison&#8217;s most recent blog post that includes some kind of summary that he&#8217;s been asked to present. It always helps</p></li><li><p><strong><a href="https://www.youtube.com/watch?v=DW4a1Cm8nG4">I got a private lesson on Claude Cowork &amp; Claude Code</a></strong><br>How Boris Cherny, the inventor of Claude Code, uses his invention</p></li><li><p><strong><a href="https://curtispoe.org/articles/learn-how-to-write-production-quality-code-with-ai">Learn How to Write Production-Quality Code with AI</a></strong><br>Curtis Poe is an old friend from the Perl community and one of the few people who seems to be working hard to port the &#8220;engineering&#8221; part of Software Engineering to AI-aided coding</p></li></ul><h1>Something completely different</h1><p>All work and no play and all that&#8230;</p><p>I&#8217;ve mentioned Oneirina, my AI music project, previously. I continue to work on her music in my spare time. She now has a website (<a href="https://oneirina.com/">oneirina.com</a>) that I&#8217;m pretty pleased with. I&#8217;ve also started making videos for her songs - so she has a <a href="https://www.youtube.com/channel/UCx4Vygq8V5fPlaBOspA1H6w/">YouTube channel</a> too.</p><p>And songs from her debut album are starting to be released on <a href="https://open.spotify.com/artist/4JTAiXXVVEXrCSUHAduVhs">Spotify</a>.</p><p></p><p>That&#8217;s all for now. Tomorrow, I&#8217;m off to the <a href="https://www.edfringe.com/">Edinburgh Fringe Festival</a> for a few days. But I&#8217;ll be back with another newsletter in (hopefully) a few weeks.</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[That's a wrap on February]]></title><description><![CDATA[Look at me actually keeping to a schedule with these newletters!]]></description><link>https://onething.davecross.co.uk/p/thats-a-wrap-on-february</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/thats-a-wrap-on-february</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 01 Mar 2026 17:28:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!3rir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3rir!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3rir!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3rir!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3rir!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3rir!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3rir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/aa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3167239,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/189558126?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!3rir!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!3rir!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!3rir!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!3rir!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faa8ef4a3-952b-456f-a1b5-96e0e1d88415_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I shouldn&#8217;t speak too soon - this is only the third monthly newsletter. But I&#8217;m happy to hit even that small milestone.</p><p>So what&#8217;s been happening in February?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Perl School Publishing</h1><p>This is where I should be concentrating my efforts. And I&#8217;m certainly doing useful work in this area.</p><p>The first month&#8217;s royalties for <em><a href="https://perlschool.com/books/design-patterns/">Design Patterns in Modern Perl</a></em> arrived. It&#8217;s not going to change Mohammad&#8217;s way of life, but I think he was pleasantly surprised at the amount of money he got.</p><p>I spent some time working on getting a dead tree version of <em>Design Patterns</em> ready. It&#8217;s not quite there yet, but it&#8217;s getting close. And, hopefully, once I&#8217;ve solved the problem for one book, I&#8217;ll have processes in place to make it easy to do the same for other <a href="https://perlschool.com/">Perl School</a> books.</p><p>The other big project there is, of course, the second edition of <em>Data Munging with Perl</em>. I&#8217;m still making progress, but not at the rate I&#8217;d like. I&#8217;ve set myself a target, but I&#8217;m not going to tell you what that is - so you won&#8217;t laugh (or shout) at me when it sails past. It doesn&#8217;t help that I&#8217;ve had an idea that slightly pivots a previous writing project and has really excited me. I&#8217;ve told myself I can&#8217;t start working on it until <em>Data Munging</em> has been published.</p><p>When I first started using the &#8220;Perl School&#8221; brand (for training in 2012), I registered the .co.uk version of the domain. I mentioned that in a few blog posts at the time. But I soon realised the .com version was also available, so I bought that too. I kept them both for a while (redirecting the .co.uk to the .com), but three or four years ago, I decided to cut back on the domains I owned and let the original (.co.uk) version lapse. Last week, I saw a comment on one of those old blog posts, asking if I had fallen on hard times, because a link to the old domain now displayed a porn site. I guess I should be flattered that a porn gang thought the domain was valuable enough to register and hijack!</p><h1>Line of Succession</h1><p>I hadn&#8217;t done much work on the <a href="https://lineofsuccession.co.uk/">Line of Succession</a> site since I redesigned it last year. So it was about time it had a bit of love. So I turned my attention to it for a few days.</p><p>Last year, I discovered <a href="https://www.wikidata.org/">WikiData</a>, a site that provides machine-readable data about&#8230; well, about pretty much everything. I wish I had known about it when I was first filling in the data for Line of Succession six years ago. Back then, I spent many Sundays copying data from Wikipedia into my database. If I had known about WikiData I could have probably automated most of that.</p><p>But there&#8217;s always more data that can be added. And it&#8217;s always a good idea to ensure the data I have is still up to date.</p><p>So I&#8217;ve written <a href="https://github.com/davorg/succession/blob/master/bin/audit_wikidata_relations">a program</a> that uses WikiData to audit my database. It looks for things like missing death dates and missing children (so I don&#8217;t have to spend time poring over the society pages to check for births and deaths). It will even fix many of these problems automatically. It will also help me push my data back in time - as it looks for missing parents and will insert those records based on the information stored in WikiData.</p><p>I&#8217;ve written <a href="https://github.com/davorg/succession/blob/master/.github/workflows/audit_wikidata_relations.yml">a GitHub Actions workflow</a> that runs the audit program every day and produces a report of potential problems. Currently, I don&#8217;t let it fix things automatically, but  that&#8217;s bound to follow as my confidence in the program grows.</p><p>I&#8217;ve also tried to increase the rate at which I publish articles on the <a href="https://blog.lineofsuccession.co.uk/">Line of Succession newsletter</a>. If you have any interest in the British royal family, you might like to subscribe to that.</p><h1>Web servers and directory listings</h1><p>Back in January, I wrote <a href="https://perlhacks.com/2026/01/apphttpthis-the-tiny-web-server-i-keep-reaching-for/">a blog post</a> about <a href="https://metacpan.org/dist/App-HTTPThis/view/bin/http_this">App::HTTPThis</a>, a CPAN module I maintain that runs a simple static web server. I find it invaluable when I&#8217;m working on a static website (which is a surprisingly high amount of time).</p><p>The blog post led to a slight uptick in interest in the module and I ended up doing a bit more work on it. In particular, I took the code which generates a directory listing and split it out into a separate module (<a href="https://metacpan.org/pod/WebServer::DirIndex">WebServer::DirIndex</a>) in the hope that other people doing similar work could use the same code.</p><p>One interesting thing about this project was the way that I wrote almost no code for it. I created <a href="https://github.com/davorg-cpan/webserver-dirindex/issues">issues</a> in the <a href="https://github.com/davorg-cpan/webserver-dirindex">GitHub repo</a> and assigned those issues to <a href="https://github.com/features/copilot">GitHub Copilot</a>. A few minutes later, a pull request would show up and I would review it and (usually) merge it without any problems.</p><p>I was so impressed by how well this went that I wrote a blog post about it:</p><ul><li><p><a href="https://perlhacks.com/2026/02/treating-github-copilot-as-a-contributor/">Treating GitHub Copilot as a Contributor</a></p></li></ul><p>Maybe a similar workflow would work for you, too.</p><h1>Contributing to GitHub Marketplace</h1><p>I&#8217;ve used GitHub since soon after it first appeared. I like to keep up to date with its newest features. I&#8217;ve even written <a href="https://actions.davecross.co.uk/">a book about GitHub Actions</a> (that probably needs to be updated - I wonder when I&#8217;ll have time to do that). But I had never written anything that was available from <a href="https://github.com/marketplace">GitHub Marketplace</a>.</p><p>Until yesterday.</p><p>Like most good Open Source tools, it does one simple thing. And it scratches a personal itch.</p><p>I have a lot of projects on GitHub - I mean hundreds. And I&#8217;m a firm believer that a good project should have a website. But when you have hundreds of projects, it&#8217;s impossible to maintain that number of websites.</p><p>But, many of those projects will already contain a file that could function as a simple, one-page website for the project - the README.md.</p><p>I wanted an easy way to take a README.md, convert it to index.html and publish it to GitHub Pages. You can do this with Jekyll, of course, but sometimes, bringing in a whole Static Site Generator ecosystem can feel like overkill.</p><p>So, that&#8217;s what <a href="https://github.com/marketplace/actions/readme-to-index-html">readme-to-index</a> does. It:</p><ul><li><p>Installs <a href="https://pandoc.org/">Pandoc</a> in your workflow environment</p></li><li><p>It uses Pandoc to convert your README.md to index.html</p></li><li><p>By default, it uses <a href="https://simplecss.org/">Simple.css</a> to make the page look nice</p></li><li><p>It publishes that page to GitHub Pages</p></li></ul><p>I wrote a blog post going into more detail - <a href="https://dev.to/davorg/your-readme-is-already-a-website-dg7">Your README Is Already a Website</a></p><h1>KeepAChangeLog on MetaCPAN</h1><p>I like the idea of using industry standards wherever possible. And I think that sometimes the Perl community prefers its own standards to more widely-recognised ones.</p><p>One example is change logs.</p><p>There&#8217;s a CPAN module called <a href="https://metacpan.org/pod/CPAN::Changes">CPAN::Changes</a> that defines <a href="https://metacpan.org/dist/CPAN-Changes/view/lib/CPAN/Changes/Spec.pod">a specification for change logs</a> and then parses logs in that format. It&#8217;s used on MetaCPAN to present change logs in a very readable fashion.</p><p>But there&#8217;s an alternative standard called <a href="https://keepachangelog.com/">Keep A ChangeLog</a>. And, because that format is widely-used in open source projects, it&#8217;s the format I like to use. However, MetaCPAN doesn&#8217;t recognise that format, so my change logs get presented in a less satisfactory manner.</p><ul><li><p><a href="https://metacpan.org/release/HAARG/CPAN-Changes-0.500005/source/Changes">CPAN standard example change log</a></p></li><li><p><a href="https://metacpan.org/dist/WebServer-DirIndex/view/Changes.md">Example of one of my change logs</a></p></li></ul><p>Last April, I <a href="https://github.com/metacpan/metacpan-web/issues/3354">raised an issue</a> asking for support for the Keep A ChangeLog format. And volunteering myself to implement it. And then promptly forgot about.</p><p>I was reminded a few weeks ago, when Olaf Alders posted a comment on that issue, asking if I was still planning to work on it.</p><p>That galvanised me into doing something. I&#8217;ve now released <a href="https://metacpan.org/pod/CPAN::Changes::Parser::KeepAChangeLog">CPAN::Changes::Parser::KeepAChangeLog</a>, which parses a Keep A ChangeLog-style file and produces a standard parsed change log object. I&#8217;m hoping that can be injected into the MetaCPAN page build process to display my change logs in a nice manner. But that&#8217;s a project for later this month.</p><h1>We &#10084;&#65039; the NHS</h1><p>At the end of January, I had some routine blood tests, and some of the numbers came back slightly higher than my doctor was happy with. This led to a series of repeated tests, phone calls and a referral to a local hospital for some slightly deeper tests.</p><p>I&#8217;m sure I&#8217;m fine, and this is just my doctor ensuring that no possible avenue is left unexplored. And I think that&#8217;s great. I would far rather she order too many tests than too few.</p><p>I try to keep politics out of this newsletter, but I want to go on record as saying that the NHS is one of the great things about living in the UK. It&#8217;s something I appreciate more and more as I get older.</p><p></p><p>Anyway, enough sentimentality. That&#8217;s about all I achieved in February. Looking back at what I&#8217;ve just written, it seems rather more than I thought at the time. I guess that&#8217;s a good thing.</p><p>How about you? What achievements from February are you particularly proud of?</p><p>I&#8217;ll be in touch again in about a month.</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[New Year, New Projects]]></title><description><![CDATA[Still, probably, too many of them]]></description><link>https://onething.davecross.co.uk/p/new-year-new-projects</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/new-year-new-projects</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 01 Feb 2026 17:56:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AaKX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AaKX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AaKX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AaKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1020772,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/186512294?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AaKX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!AaKX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8318a9bd-7d1f-4299-808d-b11922ff0b6a_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Welcome to 2026. What have you all been working on? Let me give you a bit of an overview of my month.</p><h1>In-house training</h1><p>I used to have a nice little sideline in in-house Perl training. But as fewer and fewer companies used Perl, it slowed down and, eventually, died off. For a few years, I assumed that part of my career was behind me.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>But it&#8217;s had a late surge.</p><p>Just before Christmas, I got an email from an old friend from the London Perl Mongers, asking if I could give some Perl training to a few employees at his company. I, of course, agreed. I&#8217;ve done two days for them and I&#8217;m going back again next week.</p><p>All of which has made me think there might be other people out there who could also benefit from this training. In order to tempt those people into contacting me, I&#8217;ve put together a page where I&#8217;ve started to <a href="https://learn.davecross.co.uk/slides/">gather the slides</a> from the large number of training courses I&#8217;ve run in the past. It&#8217;ll take a while (not least because my filing system has not been great in the past), but it&#8217;ll be worth a look, I hope.</p><p>If you think this could be useful to you, then please get in touch (just reply to this email).</p><h1>Perl in TIOBE</h1><p>Did you know that TIOBE stands for &#8220;The Importance of Being Earnest&#8221;? I&#8217;m not sure what the connection between Wilde&#8217;s play and a software popularity index is.</p><p>For about twenty years, there has been a lot of commentary in the Perl community over the <a href="https://www.tiobe.com/tiobe-index/">TIOBE index</a>. Many people have expended a lot of time and energy explaining why the TIOBE index doesn&#8217;t measure anything useful. This is because, over that time, has been showing a dramatic fall in interest in Perl.</p><p>Those complaints have stopped now.</p><p>That&#8217;s because, over the last year or so, Perl has been rising up the index again. Which is, to be honest, slightly surprising. But the rise is undeniable. In January 2025, Perl was at #25 in the index. In January 2026, it was at #11.</p><p>TIOBE only ever make the current month&#8217;s data available, which includes a comparison to the data from a year earlier.  And because people often don&#8217;t realise that, we&#8217;ve had a year of &#8220;Perl leaps 20 places!&#8221; posts in <a href="https://reddit.com/r/perl">r/perl</a>. In order to attempt to counter that, I&#8217;ve put together <a href="https://tiobe.perlhacks.com/">a page that contains the data going back as far as I&#8217;ve managed to find it</a> (which is, sadly, only to mid-2015). It would be great ot have the data going back further than that - but at least it gives some context to the currently monthly figures.</p><p>I still have no idea why Perl is suddenly doing so well, though. If you have any theories, I'd love to hear them.</p><h1>Line of Succession work</h1><p>I mentioned in the last newsletter that I&#8217;ve been doing some work on Line of Succession. This is all triggered by my desire to move it off my rented VPS and into the cloud. This means I want to make it as slim as possible, so cloud charges don&#8217;t cripple me.</p><p>One thing I did was to move the database from MariaDB to SQLite. The tables are all pretty small, and a permanent database server is one of the things that can really rack up the cloud costs. I should point out that this only works because the database here is totally read-only. The line of succession only changes three or four times a year and, when it does, I update a local copy of the database and upload that to the production server.</p><p>This was great, but I started to notice some outages on the app (thanks to <a href="https://www.prettygoodping.com/">PrettyGoodPing</a>). It turned out that the system was running out of open filehandles. So the quick fix was to increase that to a huge number while I tracked down the real culprit. I soon worked out that I was assuming there was one persistent database connection per process - and that wasn&#8217;t the case. This was fine when I was using MariaDB, but for SQLite, each open connection is an open filehandle. Half an hour of investigation showed me where the problem was, and now the system runs forever without running out of filehandles.</p><h1>Perl Ad Server</h1><p>I run the <a href="https://perl-ads.perlhacks.com/">Perl Ad Server</a> - which is a simple way for people to add adverts for Perl community announcements to their websites. It&#8217;s been running for a while now and I had never really given much thought to the website that tells people what it is and how to use it.</p><p>Then Olaf Alders got in touch and asked if I would like to try out <a href="https://github.com/oalders/talk-about-us">a new AI prompt/skill</a> that he had developed (based on <a href="https://www.anildash.com/2025/12/05/talk-about-us-without-us/">a blog post by Anil Dash</a>). The idea is that you craft your text so that people are able to accurately (and accurately!) repeat your messaging, even when you aren&#8217;t around.</p><p>When looking at a project to try it out on, I thought of the Perl Ad Server. I fired up ChatGPT, gave it Olaf&#8217;s prompt and pointed it at the Ad Server&#8217;s web page. Within half an hour, I had the copy that you see on the page today. It&#8217;s a vast improvement on what was there before.</p><h1>Dave Knows London</h1><p>Later this year, it will be 46 years since I moved to London. I came here to go to university and just never left. In that time, I like to think I&#8217;ve walked most of the streets - certainly in Zone 1, maybe further out.</p><p>I&#8217;ve often thought that in an alternative universe, I could be a successful tour guide.</p><p>And now, I&#8217;ve dipped my toe into testing that theory. I&#8217;ve set up a website (using Substack) called <a href="https://london.davecross.co.uk/">Dave Knows London</a>, where I plan to share my knowledge of London over the coming months. I&#8217;m also publishing PDFs of self-guided tours through interesting parts of London. The first one (a walk along the river from London Bridge to the Royal Festival Hall) is already <a href="https://davorg.gumroad.com/l/london-walk-1">available on Gumroad</a>.</p><p>I wonder if anyone reading this newsletter was at the first YAPC Europe in London in 2000. As part of the evening entertainment, I took a group of people on a pub crawl along the Thames. That was basically this walk - but in reverse.</p><h1>Domains &amp; Substacks</h1><p>I used to be a bit of a domain hoarder. You know, the kind of person who has a great idea for a side-project and buys the domain before writing any code. And then (in at least 50% of cases) never writes the code. Let me know if that sounds at all familiar.</p><p>I&#8217;ve got better recently, though. Since 2020, I&#8217;ve made a determined effort to let a load of domains lapse. I still have too many, but it&#8217;s a manageable number. That&#8217;s why I wrote <a href="https://davorg.dev/mydomains/">the domain management tool</a> that I mentioned in the last newsletter[*].</p><p>But I may have replaced that with a new vice - collecting Substacks. And I don&#8217;t mean Substack subscriptions (surely, we all do that - let me know if you have one and I&#8217;ll subscribe). No, I mean actual Substacks that I own.</p><p>In case you want to subscribe to the full set:</p><ul><li><p><a href="https://davecross.substack.com/">One Thing at a Time</a> - this one. You&#8217;re probably already subscribed</p></li><li><p><a href="https://blog.lineofsuccession.co.uk/">Line of Succession</a> - posts about the British royal family (and I&#8217;m still slightly puzzled how I became an expert on that)</p></li><li><p><a href="https://horsell.substack.com/">The Horsell Transmissions</a> - my emerging novel, telling the story of The War of the Worlds from the perspective of the Martians</p></li><li><p><a href="https://london.davecross.co.uk/">Dave Knows London</a> - as mentioned above. Still getting going</p></li></ul><p>[*] And note that&#8217;s living on a subdirectory of an existing domain. In the past, that would have been on its own domain - that&#8217;s a sign of me getting better.</p><h1>An intriguing series of posts</h1><p>I like to mention at least one project that isn&#8217;t mine. And, today, it&#8217;s an intriguing series of blog posts from my old friend James Duncan. The point is to introduce his new project <a href="https://page.love/">Pagelove</a>. He has certainly piqued my curiosity.</p><ol><li><p><a href="https://page.love/blog/01-the-hollow-web.html">The Hollow Web</a></p></li><li><p><a href="https://page.love/blog/02-the-cost-of-the-shell.html">The Cost of the Shell</a></p></li><li><p><a href="https://page.love/blog/03-taking-documents-seriously.html">Taking Documents Seriously</a></p></li><li><p><a href="https://page.love/blog/04-the-shape-of-pagelove.html">The Shape of Pagelove</a></p></li></ol><h1>The adverts</h1><p>I&#8217;ve talked about my rejuvenated enthusiasm for in-house training. But that&#8217;s not the only way I could, perhaps, help you. Take a look at <a href="https://davecross.co.uk/services/">my services page</a> and let me know if there&#8217;s anything there that interests you.</p><div><hr></div><p>That&#8217;s all for this time. See you in a month (or so!)</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Books and websites and clouds, oh my!]]></title><description><![CDATA[And totally failing to stick to "one thing at a time"]]></description><link>https://onething.davecross.co.uk/p/books-and-websites-and-clouds-oh</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/books-and-websites-and-clouds-oh</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Wed, 31 Dec 2025 14:26:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/youtube/w_728,c_limit/JSaivpK6ZaA" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div id="youtube2-JSaivpK6ZaA" class="youtube-wrap" data-attrs="{&quot;videoId&quot;:&quot;JSaivpK6ZaA&quot;,&quot;startTime&quot;:null,&quot;endTime&quot;:null}" data-component-name="Youtube2ToDOM"><div class="youtube-inner"><iframe src="https://www.youtube-nocookie.com/embed/JSaivpK6ZaA?rel=0&amp;autoplay=0&amp;showinfo=0&amp;enablejsapi=0" frameborder="0" loading="lazy" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" width="728" height="409"></iframe></div></div><p>[The amount of time between newsletters continues to amuse and embarrass me in equal measures. I knew I had a draft newsletter that I wanted to finish and send out before the end of the year. I was surprised to find the draft dated from the middle of September!]</p><p>The title of this newsletter is supposed to remind me that it&#8217;s easier to make progress on a project if you only work on one thing at a time. The contents of this edition will be an object lesson in how bad I am at sticking to that.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2><em>Data Munging with Perl</em> (2ed)</h2><p>I <em>am</em> still making progress on this. But I&#8217;m embarrassed when I think of <a href="https://talks.davecross.co.uk/talk/perl-school-update/">the talk I gave about it at the last London Perl Workshop</a>, where I suggested it might be available at around Christmas. Luckily, I didn&#8217;t say which Christmas.</p><p>I have made progress on it though. In particular:</p><ul><li><p>Working on the chapter that used to be called &#8220;Hierarchical Data&#8221;. It used to cover HTML and XML. The new version will cut down on the XML content and replace it with coverage of JSON and YAML. I&#8217;ll publish a blog post soon that contains an extract from the new version of this chapter.</p></li><li><p>I got a few reports from LeanPub that the &#8220;work in progress&#8221; version isn&#8217;t working very well for some people. I dug into that and it turns out that the EPUB document that I saved from Google Docs isn&#8217;t a particularly standards-compliant EPUB. I&#8217;ve been working on a new production pipeline where I download a DOCX version and convert that to EPUB using <a href="https://pandoc.org/">Pandoc</a>. That seems to be working better.</p></li></ul><p>And let me briefly remind you of the existence of the work-in-progress version. You can <a href="https://leanpub.com/datamungingwithperl">buy that now from LeanPub</a> and you&#8217;ll get access to all updates - including the finished version when it arrives. That&#8217;s very useful for me, as I get to iron out little problems like the one I described above before I publish the final version.</p><h2><em>Design Patterns in Modern Perl</em></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UCd3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UCd3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 424w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 848w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UCd3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png" width="204" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/67363689-8752-4106-88dc-05f5264537ee_800x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1200,&quot;width&quot;:800,&quot;resizeWidth&quot;:204,&quot;bytes&quot;:522222,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/173843201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UCd3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 424w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 848w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!UCd3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F67363689-8752-4106-88dc-05f5264537ee_800x1200.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I did publish a book, though. My good friend, Mohammad Sajid Anwar, approached me in the autumn and asked if I would be interested in publishing his book, <em><a href="https://perlschool.com/books/design-patterns/">Design Patterns in Modern Perl</a></em>. If you know Mohammad&#8217;s work from <a href="https://perlweekly.com/">Perl Weekly</a> or <a href="https://theweeklychallenge.org/">The Weekly Challenge</a>, then you&#8217;ll understand why I leapt at the chance.</p><p>We managed to get the book published on both LeanPub and Amazon just in time for Mohammad to announce it at the end of his talk at the <a href="https://www.londonperlworkshop.com/">London Perl Workshop</a>. In working on turning his Markdown into an ebook, I took the opportunity to update my rather dated publication pipeline, and I wrote a blog post about that - <a href="https://perlhacks.com/2025/12/behind-the-scenes-at-perl-school-publishing/">Behind the Scenes at Perl School Publishing</a>.</p><p>Mohammad tells me his next book is almost ready (and he has another in progress behind that). I suspect we&#8217;ll be renaming <a href="https://perlschool.com/">Perl School</a> to &#8220;Anwar Books&#8221; before the end of 2026.</p><h2>Improving websites</h2><p>If you&#8217;ve followed my work for a while, then you&#8217;ll know that I run a lot of websites. At some point, they were each going to be the big, successful project that would make me ridiculous amounts of money and stop me from needing to work for a living. Of course, it never quite worked out like that.</p><p>Part of the problem (or, at least, as far as I can see) is my limitations as a web designer. I was delighted ten years ago when I discovered <a href="https://getbootstrap.com/">Bootstrap</a> and realised my websites didn&#8217;t need to look quite as bad as they originally did. But, eventually, I began to realise that while my sites no longer made me want to scratch my eyes out, their design still left a lot to be desired.</p><p>Luckily, ChatGPT is pretty good at website design. So, together, we started a project to improve the look of many of my websites. Let me show you an example.</p><h3>Read A Booker</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_o5S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_o5S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 424w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 848w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_o5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png" width="1282" height="1072" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1072,&quot;width&quot;:1282,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:175538,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/173843201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_o5S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 424w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 848w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 1272w, https://substackcdn.com/image/fetch/$s_!_o5S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2d69c0ab-8dea-4960-818d-20762756b105_1282x1072.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is how <a href="https://readabooker.com/">Read A Booker</a> looked a few months ago. It&#8217;s a site that lists all of the shortlisted titles for the Booker Prize over the years. Of course, it&#8217;s just a way to encourage people to buy the books using my Amazon Associates tag. But it doesn&#8217;t really work when the site looks as uninteresting as that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dcqg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dcqg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 424w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 848w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 1272w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dcqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png" width="1275" height="1075" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1075,&quot;width&quot;:1275,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:702163,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/173843201?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dcqg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 424w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 848w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 1272w, https://substackcdn.com/image/fetch/$s_!dcqg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F961de142-41f7-4c9a-868e-b2d0dc4bc926_1275x1075.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And here&#8217;s what it looks like today. Nothing has really changed in the structure of the site, but it just looks that little more enticing. It looks like a &#8220;real&#8221; website (whatever that means). The other pages all have similar improvements.</p><p>Oh, and as part of that project, ChatGPT also helped me write <a href="https://davorg.dev/amazon-store/">a little Javascript library</a> that adjusts Amazon links and buttons so they automatically go to a visitor&#8217;s nearest Amazon site.</p><h2>Line of Succession</h2><p>ChatGPT has also helped me make some improvements to the <a href="https://lineofsuccession.co.uk/">Line of Succession</a> website. This is a site that started as an intellectual puzzle and has grown into my most successful website. It&#8217;s a site that allows you to pick a date in the last 200 years and will show you the line of succession to the British throne on that date. It&#8217;s pretty niche, but it gets a reasonable amount of traffic each month. The British royal family are obviously still of great interest to a large number of people.</p><p>Over the last few months, my work on this site has been in three main areas:</p><ul><li><p>The site has been given a lick of paint. It&#8217;s still Bootstrap underneath, but it now looks far more professional</p></li><li><p>I&#8217;ve done some work on the underlying data. Obviously, I know from the news when someone near the top of the list is born or dies. But it would be easy to miss changes further down the line. With help from ChatGPT, I&#8217;ve developed some code that queries <a href="https://www.wikidata.org/">WikiData</a> and looks for births, deaths and other changes that aren&#8217;t already in my database. Later on, I think I can reuse a lot of that code to push my data further back in time</p></li><li><p>The site is driven by a <a href="https://perldancer.org/">Dancer2</a> app that queries an SQLite database and builds the line of succession for a given date. This isn&#8217;t particularly efficient and I&#8217;ve started redesigning it so the line of succession is precomputed and stored in the database. This will make the site much quicker. This work is ongoing</p></li></ul><h2>Moving to the cloud</h2><p>I still run a lot of my web apps on a VPS. This makes me feel like a dinosaur. So I&#8217;ve been moving some of those apps into the cloud. I wrote a blog post about my experiences.</p><ul><li><p><a href="https://perlhacks.com/2025/11/dancing-in-the-clouds-moving-dancer2-apps-from-a-vps-to-cloud-run/">Dancing in the Clouds: Moving Dancer2 Apps from a VPS to Cloud Run</a></p></li></ul><p>And then, because some people aren&#8217;t starting with nice, PSGI-compliant apps, I wrote another blog post explaining how you could also do that with crufty old CGI programs.</p><ul><li><p><a href="https://perlhacks.com/2025/11/elderly-camels-in-the-cloud/">Elderly Camels in the Cloud</a></p></li></ul><h2>Some silly toys</h2><p>I&#8217;ve <a href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/">written before</a> about how AI-assisted programming means a lot of little projects I wouldn&#8217;t previously have had time for are getting ticked off. Another version of that is fast becoming a good way to get bugs fixed in my software:</p><ul><li><p>Raise an issue in the GitHub repo</p></li><li><p>Assign the issue to Co-Pilot</p></li><li><p>Wait 20-30 minutes for the pull request to arrive</p></li></ul><p>And most of the time, I&#8217;m finding that those PRs are of very high quality. Any problems can often be traced to deficiencies in my specification :-)</p><p>Here are a couple of toys that I&#8217;ve recently written that someone else might find useful:</p><ul><li><p><a href="https://davorg.dev/january">Dave&#8217;s Dry January Tracker</a> - an older project, but it&#8217;s had a revamp for 2026</p></li><li><p><a href="https://davorg.dev/mydomains">MyDomains</a> - I&#8217;m getting over my domain buying habit, honestly! But this helps me track the ones I still have</p></li></ul><h2>Feeding my soul</h2><p>But I can&#8217;t work all the time. I need to soak in a bit of culture too - whether that&#8217;s consuming or creating. And I have plans to do more of both next year.</p><h3>Consuming</h3><ul><li><p><strong>Film</strong> - for some reason I&#8217;ve seen about half as many films in 2025 as I did in 2024. I just got out of the habit. It&#8217;s a habit I plan to resurrect in 2026. Feel free to follow me on <a href="https://letterboxd.com/realdavorg/">Letterboxd</a>.</p></li><li><p><strong>Books </strong>- I used to be a voracious reader, but I&#8217;ve barely finished a book since the pandemic in 2020. You can follow my attempts to read more on <a href="https://www.goodreads.com/author/show/6884929.David_Cross">Goodreads</a>.</p></li></ul><h3>Creating</h3><ul><li><p>I&#8217;ve written a couple of short stories that I&#8217;ve published on Medium.</p><ul><li><p><a href="https://davorg.medium.com/the-tourist-41ea5faabeae">The Tourist</a></p></li><li><p><a href="https://davorg.medium.com/ms-fnd-in-a-modl-or-the-day-the-corpus-collapsed-8caa0e0e64c4">MS Fnd in a Modl</a></p></li></ul></li><li><p>I&#8217;m experimenting with a long-form piece of fiction based on <em>The War of the Worlds</em>.</p><ul><li><p><a href="https://horsell.substack.com/">The Horsell Transmissions</a></p></li></ul></li><li><p>I&#8217;m no musician. But I&#8217;m enjoying the possibilities that AI music creation is bringing me. My main project is an artist called Oneirina (that&#8217;s her at the top of this newsletter). <a href="https://open.spotify.com/artist/4JTAiXXVVEXrCSUHAduVhs?si=J8KmUFgVTa-XLsSwnssfwA">She&#8217;s on Spotify, too.</a> I don&#8217;t pretend it&#8217;s deep or meaningful, but I think it&#8217;s fun.</p></li></ul><p>Anyway, that&#8217;s a wrap on 2025 (especially for those of you who are in Australia or New Zealand), I think. I&#8217;ll see you in 2026.</p><p>Happy New Year,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Making progress]]></title><description><![CDATA[Learning things I didn't expect to learn]]></description><link>https://onething.davecross.co.uk/p/making-progress</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/making-progress</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Mon, 07 Jul 2025 11:34:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GeAt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GeAt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GeAt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GeAt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3156684,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/165629652?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GeAt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 424w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 848w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!GeAt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5769bf9b-3dac-462a-9cc7-e06957e0db91_1536x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>When I started to think about a second edition of <em>Data Munging With Perl</em>, I thought it would be almost trivial. The plan was to go through the text and</p><ol><li><p>Update the Perl syntax to a more modern version of Perl</p></li><li><p>Update the CPAN modules used</p></li></ol><p>And that was about it.</p><p>But when I started looking through the first edition, I realised there was a big chunk of work missing from this plan</p><ul><li><p>Ensure the book reflects current ideas and best practices in the industry</p></li></ul><p>It&#8217;s that extra step that is taking the time. I was writing the first edition 25 years ago. That&#8217;s a long time. It&#8217;s a long time in any industry - it&#8217;s several generations in our industry. Think about the way you were working in 2000. Think about the day-to-day tasks you were taking on. Think about the way you organised your day (the first books on <a href="https://en.wikipedia.org/wiki/Extreme_programming">Extreme Programming</a> were published in 2000; the <a href="https://agilemanifesto.org/">Agile Manifesto</a> was written in 2001; Scrum first appeared at about the same time).</p><p>The first edition contains the sentence &#8220;Databases are becoming almost as ubiquitous as data files&#8221;. Imagine saying that with a straight face today. There is one paragraph on Unicode. There&#8217;s nothing about YAML or JSON (because those formats both appeared in the years following publication).</p><p>When I was writing the slides for my talk, <a href="https://talks.davecross.co.uk/talk/still-munging-data-with-perl/">Still Munging Data With Perl</a>, I planned to add a slide about &#8220;things we hadn&#8217;t heard of in 2000&#8221;. It ended up being four slides - and that was just scratching the surface. Not everything in those lists needs to be mentioned in the book - but a lot of it does.</p><p>When working on the book recently, I was reminded of how much one particular section of the industry has changed.</p><h2>The problem of screen-scraping</h2><p>The first edition has a chapter on parsing HTML. Of course it does - that was cutting edge at the time. At the end of the chapter, there&#8217;s an extended example on screen scraping. It grabs the Yahoo! weather forecast for London and extracts a few pieces of data.</p><p>I was thinking ahead when I wrote it. There&#8217;s a footnote that says:</p><blockquote><p>You should, of course, bear in mind that web pages change very frequently. By the time you read this, Yahoo! may well have changed the design of this page which will render this program useless.</p></blockquote><p>But I had no idea how true that would be. When I revisited it, the changes were far larger than the me of 2000 could have dreamed of.</p><ul><li><p>The page had moved. So the program would have failed at the first hurdle.</p></li><li><p>The HTML had changed. So even when I updated the URL, the program still failed.</p></li><li><p>And. most annoyingly, the new HTML didn&#8217;t include the data that I wanted to extract. To be clear - the data I wanted was displayed on the page - it just wasn&#8217;t included in the HTML.</p></li></ul><p>Oh, I know what you&#8217;re thinking. The page is using Javascript to request the data and insert it into the page. That&#8217;s what I assumed too. And that&#8217;s almost certainly the case. But after an afternoon with the Chrome Development Tools open, I could not find the request that pulled the required data into the page. It&#8217;s obviously there somewhere, but I was defeated.</p><p>I&#8217;ll rewrite that example to use an API to get weather data.</p><p>But it was interesting to see how much harder screen scraping has become. I don&#8217;t know whether this was an intentional move by Yahoo! or if it&#8217;s just a side effect of their move to different technologies for serving this page. Whichever it is, it&#8217;s certainly something worth pointing out in that chapter.</p><h2>Other writing</h2><p>I seem to have written quite a lot of things that aren&#8217;t at all related to the book since my last newsletter. I wonder if that&#8217;s some kind of displacement therapy :-)</p><p>I&#8217;m sure that part of it is down to how much more productive I am now I have AI to help with my projects.</p><ul><li><p><a href="https://perlhacks.com/2025/05/cleaner-web-feed-aggregation-with-appfeeddeduplicator/">Cleaner web feed aggregation with App::FeedDeduplicator</a> explains a problem I have because I&#8217;m syndicating a lot of my blog posts to multiple sites (and talks about my solution).</p></li><li><p><a href="https://perlhacks.com/2025/05/reformating-images-with-appblurfill/">Reformatting images with App::BlurFill</a> introduces a new CPAN module I wrote to make my life as a publisher easier (but it has plenty of other applications too).</p></li><li><p><a href="https://perlhacks.com/2025/05/turning-ai-into-a-developer-superpower-the-perl5lib-auto-setter/">Turning AI into a Developer Superpower: The PERL5LIB Auto-Setter</a> - another project that I&#8217;d been putting off because it just seemed a bit too complicated. But ChatGPT soon came up with a solution.</p></li><li><p><a href="https://perlhacks.com/2025/05/deploying-dancer-apps-the-next-generation/">Deploying Dancer Apps &#8211; The Next Generation</a> - last year, I wrote a couple of blog posts about how I deployed Dancer apps on my server. This takes it a step further and integrates them with systemd.</p></li><li><p><a href="https://perlhacks.com/2025/06/generating-content-with-chatgpt/">Generating Content with ChatGPT</a> - I asked ChatGPT to generate a lot of content for one of my websites. The skeleton of the code I used might be useful for other people.</p></li><li><p><a href="https://perlhacks.com/2025/06/a-slice-of-perl/">A Slice of Perl</a> - explaining the idea of slices in Perl. Some people don&#8217;t seem to realise they exist, but they&#8217;re a really powerful piece of Perl syntax.</p></li><li><p><a href="https://perlhacks.com/2025/06/stop-using-your-system-perl/">Stop using your system Perl</a> - this was controversial. I should probably revisit this and talk about some of the counterarguments I&#8217;ve seen.</p></li><li><p><a href="https://github.com/davorg/perlweekly2pod">perlweekly2pod</a> - someone wondered if we could turn the Perl Weekly newsletter into a podcast. This was my proof of concept.</p></li><li><p><a href="https://modern-css.davecross.co.uk/">Modern CSS Daily</a> - using ChatGPT to fill in gaps in my CSS knowledge.</p></li></ul><h2>Other people&#8217;s writing</h2><ul><li><p><a href="https://blog.google/technology/ai/generative-ai-io-keynote-2025/">How Google used generative media at I/O 2025</a></p></li><li><p><a href="https://fly.io/blog/youre-all-nuts/">My AI Skeptic Friends Are All Nuts</a></p></li><li><p><a href="https://simonwillison.net/2025/May/15/building-on-llms/">Building software on top of Large Language Models</a></p></li><li><p>Pete thinks he can <a href="https://sgnt.ai/p/vibe-coded/">help people sort out their AI-generated start-up code</a>. I think he might be onto something!</p></li></ul><h2>The Substack conversation</h2><p>Like most people, when I started this Substack I had an idea that I might be able to monetise it at some point. I&#8217;m not talking about forcing people to pay for it, but maybe add a paid tier on top of this sporadic free one. Obviously, I&#8217;d need to get more organised and promise more regular updates - and that&#8217;s something for the future.</p><p>But over the last few months, I&#8217;ve been pleasantly surprised to receive email from Substack saying that two readers have &#8220;pre-pledged&#8221; for my newsletter. That is, they&#8217;ve told Substack that they would be happy to pay for my content. That&#8217;s a nice feeling.</p><p>To be clear, I&#8217;m not talking about adding a paid tier just yet. But I might do that in the future. So, just to gauge interest, I&#8217;m going to drop a &#8220;pledge your support&#8221; button in this email. Don&#8217;t feel you have to press it.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://onething.davecross.co.uk/subscribe?"><span>Subscribe now</span></a></p><p>That&#8217;s all for today. I&#8217;m going to get back to working on the book. I&#8217;ll write again soon.</p><p>Dave&#8230;</p>]]></content:encoded></item><item><title><![CDATA[Talkin' and Writin']]></title><description><![CDATA[Making progress... slowly, but it's happening]]></description><link>https://onething.davecross.co.uk/p/talkin-and-writin</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/talkin-and-writin</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Thu, 24 Apr 2025 15:47:51 GMT</pubDate><content:encoded><![CDATA[<p>A month after the last newsletter - maybe I&#8217;m starting to hit a rhythm. Or maybe it&#8217;s just a fluke. Only time will tell.</p><h2>Still Munging Data With Perl</h2><p>As I mentioned in a brief update last month, I gave a talk to the Toronto Perl Mongers about <em>Data Munging With Perl</em>. I didn&#8217;t go to Toronto - I talked to them (and people all across the world) over Zoom. And that was a slightly strange experience. I hadn&#8217;t realised just how much I like the interaction of a live presentation. At the very least, it&#8217;s good to know whether or not your jokes are landing!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>But I got through it, and people have said they found it interesting. I talked about how the first edition of the book came about and explained why I thought the time was right for a second edition. I gave a brief overview of the kinds of changes that I&#8217;m making for the second edition. I finished by announcing that a &#8220;work in progress&#8221; version of the second edition is available from LeanPub (and that was a surprisingly good idea, judging by the number of people who have bought it!) We finished the evening with a few questions and answers.</p><p>You can order the book from <a href="https://leanpub.com/datamungingwithperl">LeanPub</a>. And the slides, video and a summary of the talk are all available from <a href="https://talks.davecross.co.uk/talk/still-munging-data-with-perl/">my talks site</a> (an occasional project where I&#8217;m building an archive of all of the talks I&#8217;ve given over the last 25 years).</p><h2>Still writing <em>Data Munging With Perl</em></h2><p>Of course, I still have to finish the second edition. And, having found myself without a regular client a few weeks ago, I&#8217;ve been spending most of my time on that. It&#8217;s been an interesting journey - seeing just how much has changed over the last quarter of a century. There have been changes in core Perl syntax, changes in recommended CPAN module and changes in the wider industry (for example, 25 years ago, no-one had heard of YAML or JSON).</p><p>I&#8217;m still unable to give a date for the publication of the final version. But I can feel it getting closer. I think that the next time I write one of these newsletters, I&#8217;ll include an extract from one of the chapters that has a large number of changes.</p><h2>Other writing</h2><p>I&#8217;ve been doing other things as well. In the last newsletter, I wrote about how I had built a website in a day with help from ChatGPT. The following week, I went a bit further and built another website - and this time ChatGPT didn&#8217;t just help me create the site, but it also updates the site daily with no input at all from me.</p><p>The site is at <a href="https://cool-stuff.co.uk/">cool-stuff.co.uk</a>, and I blogged about the project at <a href="https://perlhacks.com/2025/04/finding-cool-stuff-with-chatgpt/">Finding cool stuff with ChatGPT</a>. My blog post was picked up by the people at dev.to for their <a href="https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-5946">Top 7 Featured DEV Posts of the Week</a> feature. Which was nice :-)</p><p>I said that ChatGPT was updating the site without any input from me. Well, originally, that wasn&#8217;t strictly true. Although ChatGPT seemed to understand the assignment (finding an interesting website to share every day), it seemed to delight in finding every possible loophole in the description of the data format I wanted to get back. This meant that on most days, my code was unable to parse the response successfully and I had a large number of failed updates. It felt more than a little like a story about a genie who gives you three wishes but then does everything in their power to undermine those wishes.</p><p>Eventually, I discovered that you can give ChatGPT a JSON Schema definition and it will always create a response that matches that definition (see <a href="https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses">Structured Outputs</a>). Since I implemented that, I&#8217;ve had no problem. You might be interested in how I did that in <a href="https://github.com/davorg/cool-stuff/blob/main/.github/scripts/fetch_cool_site">my Perl program</a>.</p><h2>Other people&#8217;s writing</h2><p>Paul Cochrane has been writing an interesting series of posts about creating a new map for Mohammad Anwar&#8217;s <a href="https://metacpan.org/pod/Map::Tube">Map::Tube</a> framework. But in the process, he seems to have written a very useful guide on how to write a new CPAN module using modern tools and a test-driven approach. Two articles have been published so far, but he&#8217;s promising a total of five.</p><ul><li><p><a href="https://peateasea.de/building-map-tube-whatever-maps-a-howto-first-steps/">Building </a><code>Map::Tube::&lt;*&gt;</code><a href="https://peateasea.de/building-map-tube-whatever-maps-a-howto-first-steps/"> maps, a HOWTO: first steps</a></p></li><li><p><a href="https://peateasea.de/building-map-tube-whatever-maps-a-howto-extending-the-network/">Building </a><code>Map::Tube::&lt;*&gt;</code><a href="https://peateasea.de/building-map-tube-whatever-maps-a-howto-extending-the-network/"> maps, a HOWTO: extending the network</a></p></li></ul><h2>A spaceship has landed on Earth</h2><p>Occasionally, when I&#8217;m giving a talk I&#8217;ll wear a favourite t-shirt that has a picture of a space shuttle on it, along with the text &#8220;A spaceship has landed on Earth, it came from Rockwell&#8221;. Whenever I wear it, I can guarantee that at least a couple of people will comment on it.</p><p>The t-shirt is based on an advert from the first issue of a magazine called <em>OMNI</em>, which was published in 1978. Because of the interest people show in the t-shirt, I&#8217;ve put up a website at <a href="https://itcamefromrockwell.com">itcamefromrockwell.com</a>. The site includes a link to a blog post that goes into more detail about the advert, and also a link to a RedBubble shop where you can buy various items using the design.</p><p>If you&#8217;re at all interested in the history of spaceflight, then you might find the site interesting.</p><div><hr></div><p>Hope you found something of interest in today&#8217;s newsletter. I&#8217;ll be back in a week or two with an update on the book.</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Still Munging Data With Perl]]></title><description><![CDATA[A couple of very quick updates...]]></description><link>https://onething.davecross.co.uk/p/still-munging-data-with-perl</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/still-munging-data-with-perl</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Mon, 31 Mar 2025 09:29:28 GMT</pubDate><content:encoded><![CDATA[<p>This isn&#8217;t a real newsletter. I just had a couple of quick updates that I didn&#8217;t want to keep until I write another newsletter.</p><ol><li><p>I gave my &#8220;Still Munging Data With Perl&#8221; talk to an audience over Zoom, last Thursday. I thought it went well and people have been kind enough to say nice things about it to me. I&#8217;ve added a page about the talk to my talks site (<a href="https://talks.davecross.co.uk/talk/still-munging-data-with-perl/">talks.davecross.co.uk/talk/still-munging-data-with-perl/</a>). Currently it has the slides, but I expect to add the video in the next few days.</p></li><li><p>As part of the talk, I announced that the second edition of <em>Data Munging With Perl</em> is on sale through LeanPub as a &#8220;work in progress&#8221; edition. That means you can pay me now and you&#8217;ll get the current version of the book - but over the next few weeks you&#8217;ll get updated versions as the second edition gets more and more complete. See <a href="https://leanpub.com/datamungingwithperl">leanpub.com/datamungingwithperl</a>.</p></li></ol><p>That&#8217;s all for now. I hope to have a proper newsletter for you next week.</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Once a month?]]></title><description><![CDATA[That feels like an improvement!]]></description><link>https://onething.davecross.co.uk/p/once-a-month</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/once-a-month</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 23 Mar 2025 14:08:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Joxi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Maybe the secret to posting more often is to have interesting and/or useful things to say. I&#8217;m not sure what that says about my extremely intermittent posting frequency over the last five years or so.</p><h1>Building websites (easily)</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Joxi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Joxi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 424w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 848w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 1272w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Joxi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp" width="1232" height="928" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:928,&quot;width&quot;:1232,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:207878,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/159675263?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Joxi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 424w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 848w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 1272w, https://substackcdn.com/image/fetch/$s_!Joxi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80ea43a5-de71-4651-a580-2c01dfc0f47d_1232x928.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>But it looks like I&#8217;m on a roll. I have a few things I want to share with you. I&#8217;ve been down a bit of a rabbit hole thinking about the various different ways that websites are built these days.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Over the last few months, I&#8217;ve become lightly involved with the <a href="https://claphamsociety.com/">Clapham Society</a> - that&#8217;s a local group that spreads news about life in Clapham and gets involved in campaigning against things that are likely to have a negative effect on that life.</p><p>They wanted a new website. Now, I know a bit about how websites work, but I&#8217;d never describe myself as a web designer and I just don&#8217;t have the capacity to get involved in a project that needs to move a lot of content from an old website to a new one. But I had some conversations with them about what they were looking for in a new website and I helped them choose an agency that would build the new site (they went with <a href="https://agencyforgood.co.uk/">Agency for Good</a>, who seem to be very&#8230; well&#8230; good!) I also helped out wrangling their old domain name from their previous web hosting company and helped them get set up on Google Workspace (using a free account from <a href="https://www.google.com/intl/en-GB/nonprofits/">Google for Nonprofits</a>).</p><p>Anyway&#8230; that all went very well. But I started thinking about all of the horror stories you hear about small businesses that get caught up with cowboy website development companies and then end up with a website that doesn&#8217;t work for them, costs too much money and is hard to maintain.</p><p>And that led to me writing my <a href="https://websiteguide.davecross.co.uk/">Website Guide</a> (aka &#8220;What to Ask Your Website Company&#8221;). The aim was to write in non-technical language and provide a short and easy-to-understand guide that would give small business owners[*] the information they need to make better decisions when choosing a company to design and build their website.</p><p>Yes, it&#8217;s a bit outside my usual areas of expertise, but I think it works. I&#8217;m considering turning it into a short e-book next.</p><p>I realised this had all got a bit meta. I had built a website about how to get people to build you a good website. So I decided to lean into that and wrote a blog post called &#8220;<a href="https://blog.dave.org.uk/2025/03/how-i-build-websites-in-2025.html">How I Build Websites in 2025</a>&#8221; which explained the process and tools I had used to build the websites about building websites. Are you still with me?</p><p>Then, yesterday, I decided to take things a bit further. Like most geeks, I have several domains just lying around not doing anything useful and I wanted to know if I could quickly spin up a website on one of them that could bring me a bit of income (or, perhaps, get enough traffic that I could sell it on in a few months).</p><p>So in six hours or so, I built <a href="https://balham.org/">Balham.org</a>. Well, I say &#8220;I&#8221;, but I couldn&#8217;t have done it without a lot of help from ChatGPT. That help basically came in three areas:</p><ol><li><p>High-level input. Answering questions like &#8220;What sort of website should we build?&#8221;, &#8220;What pages should we have?&#8221; and &#8220;How do we make money out of this?&#8221;</p></li><li><p>Data and content. How long would it take you to get a list of 20 popular Balham businesses and create a YAML file suitable for use with Jekyll? ChatGPT did it in a minute or so.</p></li><li><p>Jekyll advice. I&#8217;m starting to understand Jeykyll pretty well, but this project went way beyond my knowledge many times. ChatGPT really helped by telling me how to achieve some of my goals.</p></li></ol><p>We did what we set out to do. The site is there and is, I think, useful. Now we have the phase where so many projects stall (I nearly wrote &#8220;my projects&#8221; there, but I think this is a problem for many people). We need to promote the site and start making money from it. That&#8217;s probably another session with ChatGPT next weekend.</p><p>And finally on this subject, for now, at least, today I wrote a blog post about yesterday&#8217;s project - &#8220;<a href="https://blog.dave.org.uk/2025/03/building-a-website-in-a-day-with-help-from-chatgpt.html">Building a website in a day &#8212; with help from ChatGPT</a>&#8220;.</p><p>[*] Owners of small businesses, not &#8230; well, you know what I mean!</p><h1>Data Munging</h1><p>I&#8217;m still working on the second edition of Data Munging with Perl. But, more urgently, I&#8217;m currently working on the slides for the talk I&#8217;m giving about the book next Thursday, 27 March to the Toronto Perl Mongers. I&#8217;m not flying to Toronto, it&#8217;s a virtual talk that I&#8217;ll be giving over Zoom. There are already over a hundred people signed up - which is all very exciting. Why not join us?  You can sign up at the link below.</p><ul><li><p><a href="https://lu.ma/3b8ekn8y">Dave Cross: Still Munging Data with Perl</a></p></li></ul><p>The book will be out as soon as possible after the talk (but, to be clear, that&#8217;s probably weeks, not days). Subscribers to this newsletter will be the first people to know when it&#8217;s published.</p><div><hr></div><p>Anyway, that&#8217;s all I have time for today. I really need to get back to writing these slides. Thanks for taking an interest.</p><p>Cheers,</p><p>Dave&#8230;</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[I'm still here, honest]]></title><description><![CDATA[I'l get more regular one day :-/]]></description><link>https://onething.davecross.co.uk/p/im-still-here-honest</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/im-still-here-honest</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 23 Feb 2025 16:00:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZXK-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I don&#8217;t really do New Year&#8217;s resolutions. But I like to start the year with a few aspirations of things I&#8217;ll try to do better in the coming year. This year, one of those was to post to this newsletter more frequently. So I have no idea how it&#8217;s fast approaching the end of February and this is the first newsletter of 2025 (and six months - almost to the day - since I last sent a newsletter).</p><p>So can I be the last person to wish you a Happy New Year? We&#8217;re eight weeks into the year. How&#8217;s it going for you so far?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Still munging data - 25 years on</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZXK-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZXK-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 424w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 848w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 1272w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZXK-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png" width="425" height="677" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:677,&quot;width&quot;:425,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184084,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://davecross.substack.com/i/157745328?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZXK-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 424w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 848w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 1272w, https://substackcdn.com/image/fetch/$s_!ZXK-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F05de0f16-4dd5-4cee-bed6-476cc3722167_425x677.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Some of you might be old enough to remember my book <em>Data Munging With Perl</em>. Towards the end of last year, I decided it was about time to produce a second edition. It&#8217;s a book I&#8217;m proud of and I think it still contains a lot of good advice, but a lot of the actual Perl in the book is looking rather dated now and it will be nice to have a version that updates a lot of the code.</p><p>I talked about my plans in <a href="https://talks.davecross.co.uk/talk/perl-school-update/">a lightning talk at the London Perl Workshop</a> last year. At the time, I mentioned that I hoped the book would be available &#8220;by Christmas&#8221;. But then I went and took on a full-time client that rather ate into the time I had available to work on the book. So Christmas came and went without the book being published. But I&#8217;m still making progress and I hope it&#8217;ll be available before too long. I have a bit of a fixed deadline as I&#8217;m giving a talk about the book to the Toronto Perl Mongers at the end of March, and I&#8217;d like it to be available by then.</p><p>The talk will be given over Zoom and it&#8217;s free. So please feel free if you&#8217;re interested in the book. It&#8217;s on 27th March at 20:00 UTC.</p><ul><li><p><a href="https://lu.ma/3b8ekn8y">Dave Cross: Still Munging Data with Perl</a></p></li></ul><h2>Proposed Perl Changes</h2><p>I&#8217;ve been part of the Perl community for far longer than I care to admit. But my contributions have mostly been non-technical. So I was surprised when a member of the <a href="https://psc.perlhacks.com/">Perl Steering Council</a> contacted me at the start of the year and asked for my help working on a new website that would make it easier for the community to see upcoming changes that had been proposed for the Perl language.</p><p>The PPC process has been in place pretty much since the Perl Steering Council was formed in 2020. But it had been suggested that only having the documents available through the GitHub website means that many people who might otherwise be interested, aren&#8217;t reading the proposals. So the PSC had decided it would be useful to turn that repo into a real website. And because of my experience with GitHub Pages and GitHub Actions, I would probably be a good person to get a first draft up and running quickly.</p><p>So that&#8217;s what I did. You can read more details about how it all works on my Perl Hack blog (<a href="https://perlhacks.com/2025/01/proposed-perl-changes/">part 1</a>, <a href="https://perlhacks.com/2025/02/proposed-perl-changes-part-2/">part 2</a>) and you can form your own opinion on how successful I&#8217;ve been by looking at the site at <a href="https://perl.github.io/PPCs/">https://perl.github.io/PPCs/</a></p><h2>Other blog posts</h2><p>I&#8217;ve written a few other blog posts over the last six months that you might find interesting:</p><ul><li><p><a href="https://perlhacks.com/2024/11/advertising-perl/">I wrote a simple ad server that allows people to add a banner advert for Perl community events to their website</a></p></li><li><p><a href="https://perlhacks.com/2024/11/a-link-site-of-your-very-own/">I talked about an application I&#8217;d written that provides a self-hosted (or, even better, GitHub Pages-hosted) LinkTree-like web page</a></p></li><li><p><a href="https://perlhacks.com/2025/01/london-perl-mongers-on-github-pages/">We moved the London Perl Mongers website to GitHub Pages</a> (I&#8217;m starting to detect a bit of a theme here!)</p></li><li><p><a href="https://perlhacks.com/2025/01/adding-structured-data-with-perl/">I explained a CPAN module I had written that makes it easy to add JSON-LD to a website</a></p></li></ul><h2>AI programming</h2><p>I&#8217;ve been using various AI tools to increase my productivity. But I&#8217;m really only dabbling at the moment. Other people are obviously doing more than I am. So this article really interested me. I&#8217;m definitely going to try to incorporate some of these suggestions into my workflow.</p><ul><li><p><a href="https://harper.blog/2025/02/16/my-llm-codegen-workflow-atm/">My LLM codegen workflow atm</a></p></li></ul><p>I&#8217;ve also been given access to the preview version of <a href="https://githubnext.com/projects/github-spark">GitHub Spark</a>. So I&#8217;ll be trying that out over the coming weeks.</p><h2>And finally&#8230;</h2><p>In the past, I&#8217;ve definitely been guilty of buying domain names for projects that I only have the vaguest of plans for. But over the last five years I&#8217;ve made a determined effort to stop doing that and to let old domains lapse once it becomes obvious that I&#8217;m not going to complete the project they were bought for. I think I&#8217;ve let somewhere between a third and a half of my domains lapse.</p><p>But sometimes a domain just has to be bought.</p><p>And I realised last week that South Sudan were allowing domain registrations at the top level of their ccTLD.</p><p>So&#8230; <a href="https://davecro.ss/">davecro.ss</a>.</p><p>That&#8217;s all for today. Let&#8217;s hope it&#8217;s not six months until my next newsletter.</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[GitHub Actions Training]]></title><description><![CDATA[Automate your software projects]]></description><link>https://onething.davecross.co.uk/p/github-actions-training</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/github-actions-training</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Mon, 26 Aug 2024 11:07:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nyx-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nyx-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nyx-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 424w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 848w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 1272w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nyx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png" width="1410" height="706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:706,&quot;width&quot;:1410,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:665885,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nyx-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 424w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 848w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 1272w, https://substackcdn.com/image/fetch/$s_!nyx-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd5fd0d-d663-4a4f-b4ea-a470d3525749_1410x706.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the original points of this newsletter was to tell people about upcoming training courses. That has been sadly lacking over recent years as I haven&#8217;t been running any public training courses since the pandemic.</p><p>But that&#8217;s all about to change. I have three online training courses coming up. And the first is in just a couple of days.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>If you&#8217;ve been reading this newsletter for a while, you&#8217;ll know that I&#8217;ve been taking an interest in GitHub Actions. I even wrote <a href="https://actions.davecross.co.uk/">a book about Github Actions</a> last year.</p><p>If you haven&#8217;t come across GitHub Actions before, it&#8217;s basically a tool for Continuous Integration and Continuous Deployment. But it can be used for so much more than that. GitHub are allowing you to run code on their servers. Running that code can be triggered on a schedule, by an event (like a commit) in your repo or just by pushing a button on your repo&#8217;s web page.</p><p>I was <a href="https://se-radio.net/2023/06/se-radio-567-dave-cross-on-github-actions/">interviewed by Software Engineering Radio</a> about GitHub Actions last year.</p><p>If you&#8217;re using GitHub to store your software, then I&#8217;m sure that GitHub Actions will allow you to do something that will make your life easier.</p><p>I&#8217;m running a two-hour introduction to GitHub Actions this coming Wednesday (28 August). It will start at 15:00 UK time and will be running over Zoom. You can get full details (and book tickets) <a href="https://learn.davecross.co.uk/github-actions/">from my web site</a>.</p><p>And that&#8217;s not all. I have two more course planned over the next few weeks. If you&#8217;re not interested in GitHub Actions, then perhaps you&#8217;re more interested in:</p><ul><li><p><a href="https://learn.davecross.co.uk/github-pages/">GitHub Pages</a> (11 Sep)</p></li><li><p><a href="https://learn.davecross.co.uk/github-copilot/">GitHub Copilot</a> (25 Sep)</p></li></ul><p>Hopefully, one of these subjects will interest you.</p><p>Tickets for the courses are &#163;49 each. But, as a subscriber to my newsletter, you can use <a href="http://www.eventbrite.co.uk/e/983918846757/?discount=subscribers">this promo link</a> which will give you 20% off.</p><p>I hope to see some of you online on Wednesday.</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Making a list]]></title><description><![CDATA[Pondering how projects become products]]></description><link>https://onething.davecross.co.uk/p/making-a-list</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/making-a-list</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 28 Jul 2024 16:22:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!steM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!steM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!steM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!steM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!steM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!steM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!steM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png" width="1456" height="832" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:832,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1954593,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!steM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 424w, https://substackcdn.com/image/fetch/$s_!steM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 848w, https://substackcdn.com/image/fetch/$s_!steM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 1272w, https://substackcdn.com/image/fetch/$s_!steM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c733193-137a-4e95-ba9e-65cf09eb52f8_1792x1024.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I think I&#8217;ll stop apologising for the large gaps between these emails. In one way, I&#8217;m doing you all a favour by giving you less to read.</p><p>I will also skip the story about stealing a laptop from one of the world&#8217;s largest IT consultancies again. Maybe I&#8217;ll tell the story next time. Maybe I&#8217;ll leave it as a teaser for you all that never gets resolved. Maybe it never happened.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>Today I want to talk about the difference between projects and products. This is a thought that turned up pretty much fully formed in my head a few days ago. I haven&#8217;t written it down before, but it feels important and/or useful so I thought I&#8217;d share it with you.</p><p>I&#8217;ve written a couple of blog posts recently about my &#8220;pointless personal projects&#8221;. I used to call them side-projects - but that ruined the alliteration.</p><ul><li><p>Here&#8217;s a blog post that&#8217;s even called &#8220;<a href="https://perlhacks.com/2024/03/pointless-personal-side-projects/">Pointless Personal Side-Projects</a>&#8221;. It concentrates on the software I wrote to create my link site - <a href="https://links.davecross.co.uk/">links.davecross.co.uk</a>. In it, I make the point that projects like this can be used to gain experience in new programming language features or new technologies.</p></li><li><p>And here&#8217;s a more recent blog post about another of my projects - <a href="https://perlhacks.com/2024/07/combining-calendars/">Combining Calendars</a>. An important point in that post is how anyone showing the slightest interest in one of these projects can get me so excited that I&#8217;ll spend days adding new features.</p></li></ul><p>These projects (and, if I&#8217;m honest, probably a dozen more) came into being because I had an itch to scratch. And, going back almost forty years, I remember that being the explanation for how most good open-source software projects got going. Someone had a problem and wrote software to fix that problem. Other people had the same problem and they got value out of using that software too.</p><p>Of course, projects that solve problems aren't all going to be open source. All software exists to solve a problem. And, if you&#8217;re lucky, people will pay you for the software that solves their problem.</p><p>And that&#8217;s when I started to wonder about the path from problem to project to product (there&#8217;s that alliteration again). The idea that popped into my head (while I was asleep) was that it&#8217;s a four-stage model.</p><ol><li><p>In the first stage, there&#8217;s the recognition of a problem and some attempts to sketch out something that solves the problem. Here&#8217;s an example. I wrote <a href="https://dev.to/davorg/solving-simple-problems-4p2f">a blog post about a program I wrote</a> that would suggest artists that I might want to listen to. The blog post talks about a couple of iterations of the project but there were a few more after the post was written. At this point, the code doesn&#8217;t need to be good (although I have standards to meet if I&#8217;m going to include it in a blog post!) It&#8217;s just a proof of concept - demonstrating that the problem <em>can </em>be solved, even if we haven&#8217;t found the best solution yet. Very few of my projects stop at this stage.</p></li><li><p>The second stage is making the code available for other developers to read and use. These days, that means uploading it to GitHub. And because you&#8217;re making it available for other people to read, that&#8217;s going to involve cleaning up the code. This is when you become more interested in confirming that you have the best solution to the problem. You might well (certainly if you&#8217;re me) break the code down into classes, make it testable and remove any hard-coded configuration information (put it config files, accept command-line arguments or read it from environment variables - all three if you&#8217;re feeling generous). This is the point at which I&#8217;ll be thinking about including a version number. Most of my projects get to this stage. Very few of them get any further.</p></li><li><p>The third stage is making it available to the general public. These days, that&#8217;s probably a web app (although, I should probably investigate how easy it is to make a phone app too. In the past, it might have been some kind of desktop app but, to be honest, I&#8217;m glad those days are behind us. At this stage I&#8217;ll need about things like deployment and hosting. It&#8217;s likely that I&#8217;ll need some kind of user management system (although things like <a href="https://lineofsuccession.co.uk/">Line of Succession</a> or <a href="https://readabooker.com/">ReadABooker</a> don&#8217;t need that). This is definitely the stage that would benefit most from a checklist of things that need to be done). I kinda assumed I was bad at getting things to this stage but, thinking about it, I have quite a few projects in this state - it&#8217;s the reason why I own so many domains!</p></li><li><p>The final stage - the Holy Grail - is to make the it profitable. This is, of course, the hardest step. And that&#8217;s why so few projects get to this stage. First you need to decide how you monetise the site and then you have to implement that strategy. And, finally, you need to market it so you get enough users to make a profit. I know that marketting is where I fall down pretty much every time. I do get things to this stage (<a href="https://readabooker.com/">ReadABooker</a> is full of Amazon affiliate links; Line of Succession has <a href="https://lineofsuccession.co.uk/shop">a shop page</a> and a load of Google Ads) but none of them have the traction they need to make real money.</p></li></ol><p>And there you have it. My roadmap to profitable products. I&#8217;m not saying it&#8217;s the only way to get to a profitable product, but I think it&#8217;s a workable one. And, having written this down, it&#8217;s clear where I need to address my efforts. I can&#8217;t just keep throwing projects up on the web and just expect them to find their audience. I need to get better at marketing. So even if you didn&#8217;t get anything useful out of this newsletter, I think I&#8217;ve learned a valuable lesson.</p><p>What do you think? Have you tried to turn an itch-scratching project into something profitable? What route did you take? How well did it work out?</p><h1>In other news</h1><p>A few other bits and pieces&#8230;</p><ul><li><p>I&#8217;ve mentioned before that I&#8217;ve been pleased with my experiments in AI-aided programming. I now have access to the beta version of <a href="https://github.blog/news-insights/product-news/github-copilot-workspace/">GitHub&#8217;s Copilot Workspace</a>. Where the standard version of Copilot makes suggestions in your editor while you&#8217;re working, Copilot Workspace takes it a step further. You give it an issue in one of your repos and it will plan and (when you give it the go-ahead) implement the required changes. You&#8217;ll end up with a pull request that you can examine and merge just as you would if it came from one of your colleagues. I had a lot of fun yesterday, whizzing through a load of issues that needed fixing in one of my (stage 2) projects. There was nothing that would have taken more than an hour to implement. But with the help of Copilot Workspace, each one took about ten minutes. I was very impressed and will be using it again.</p></li><li><p>The first batch of talks for this year&#8217;s London Perl Workshop <a href="https://act.yapc.eu/lpw2024/news/1702">have been accepted</a>. This includes a &#8220;Conference-Driven Development&#8221; proposal from me. I&#8217;m not quite sure where that fits on my list of stages above. Maybe Conference-Driven Development is its own thing. The <a href="https://act.yapc.eu/lpw2024/">LPW is returning</a> for the first time since 2019.</p></li><li><p>I&#8217;ve been worrying for a while about the way the Perl community is shrinking. A smaller community will have problems mainitaining community infrastructure and even adding new features to the language. A particular worry for me is the number of CPAN modules that are becoming unmaintained. This week, Curtis Poe realised that <a href="https://metacpan.org/dist/DBIx-Class">DBIx::Class</a> (a popular library for database access) is basically unmaintained and hasn&#8217;t been updated since 2022. It currently still works fine, but that won&#8217;t be true forever. You might be interested in the discussions about this on <a href="https://www.reddit.com/r/perl/comments/1eddi9n/dbixclass_has_not_been_updated_for_over_two_years/">Reddit</a> and <a href="https://www.facebook.com/groups/perlcommunity/posts/1717886782352274/">Facebook</a>.</p></li></ul><p>I won&#8217;t promise when the next of these newsletters will appear. But I&#8217;m quietly hoping that it&#8217;ll be some time in August.</p><p>Now I&#8217;m going to get back to moving projects along the product scale.</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Domain hijacking]]></title><description><![CDATA[This morning really didn't go as planned]]></description><link>https://onething.davecross.co.uk/p/domain-hijacking</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/domain-hijacking</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Wed, 01 May 2024 14:38:18 GMT</pubDate><content:encoded><![CDATA[<p>Today&#8217;s newsletter was going to be about how (and why) I once stole a laptop from one of the world&#8217;s largest IT consultancy companies. But I feel it&#8217;s more important to tell you about what happened to me this morning - and how you can stop it from happening to you.</p><p>You might already know I&#8217;m a big fan of <a href="https://pages.github.com/">GitHub Pages</a>. I&#8217;ve written <a href="https://blog.dave.org.uk/2018/08/simple-static-websites-with-github-pages.html">several</a> <a href="https://dev.to/davorg/updating-github-pages-using-github-actions-395a">blog</a> <a href="https://dev.to/davorg/deploying-github-pages-site-with-github-workflows-3bhh">posts</a> about how I use them. If you&#8217;ve visited a static website that I run over the last five years or so, there&#8217;s a very strong chance that it&#8217;s run on GitHub Pages. But you probably won&#8217;t realise it&#8217;s on GitHub Pages because I often set up custom domains for a site. My <a href="https://cpandashboard.com/">CPAN Dashboard</a> is running on GitHub Pages, for example. So is <a href="https://twittelection.co.uk/">TwittElection</a>. And <a href="https:/perlschool.com/">Perl School</a>. And many more. In fact one of the results of the story I&#8217;m about to tell is that I&#8217;m rather surprised at just how many domains I have pointing to GitHub Pages sites.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site">It&#8217;s easy enough to set up.</a> You just configure your DNS provider so the domain points to GitHub&#8217;s servers. And then you add a file called CNAME to the repo that contains the web site code. That&#8217;s so GitHub knows where to direct requests for that domain. So, for example, my <a href="https://github.com/davorg/perlschool">Perl School repo</a> contains <a href="https://github.com/davorg/perlschool/blob/master/static/CNAME">a file called CNAME</a> which literally just contains the text &#8220;perlschool.com&#8221;.</p><p>You should also note that the DNS configuration is the same no matter who is doing it. That is, GitHub publishes four IP addresses that you should point your domain to. So if you&#8217;re configuring a GitHub Pages site, you&#8217;ll use exactly the same IP addresses as I do.</p><p>So far so good. The problem comes when you start changing things around. And that's what I had done.</p><p>In my last newsletter, I mentioned my static site builder called Aphra. And I said I should create a web site for it. I had forgotten that I had already started to create a site some years ago. I had, of course, used GitHub Pages and the site was at <a href="https://aphra.davecross.co.uk/">aphra.davecross.co.uk</a>. I rediscovered this just after sending the last newsletter and had a bit of a think about the domain. In the end, I decided that as Aphra was a Perl project, it should really live at <a href="https://aphra.perlhacks.com/">aphra.perlhacks.com</a> instead. So I added a DNS entry in the perlhacks.com zone and changed the domain in the CNAME file.</p><p>At that point, I had introduced the problem. But I&#8217;d be really impressed if you can work out what it is.</p><p>I had a new DNS record for aphra.perlhacks.com. But I also had an old DNS record for aphra.davecross.co.uk. That was pointing at the GitHub servers, but there was no repo with a CNAME file configured to accept that connection.</p><p>If a bad person can find a DNS record that points at the GitHub servers but there&#8217;s no repo configured to accept connections on that domain, then they can create their own repo, add a CNAME that references that DNS record and serve their own content on your domain name.</p><p>That&#8217;s what had happened. Someone had spotted the &#8220;dangling&#8221; DNS record for aphra.davecross.co.uk and had created a GitHub Pages site containing that domain in its CNAME file and GitHub happily started serving their dubious content.</p><p>I assume there&#8217;s a way that you can automatically search for DNS records pointing at GitHub with no matching repo. I also assume there are enough people who make the same mistake as me that it&#8217;s worthwhile searching for this particular misconfiguration.</p><p>Of course, given that I&#8217;d forgotten about the existence of aphra.davecross.co.uk, I might never have found out about it - but I had a bit of dumb luck.</p><p>A while ago I did some work in SEO. And that got me in the habit of mildly obsessing about SEO for my web sites. One of the ways my obsession manifests is that I add all of my web sites to <a href="https://search.google.com/search-console">Google&#8217;s Search Console</a>. You register your domain and it will tell you how you&#8217;re doing on SEO. It also tells you other interesting things like which search queries bring visitors to your site.</p><p>So <a href="https://davecross.co.uk/">davecross.co.uk</a> is registered there. And yesterday, I got some weird emails from Google about the site. They told me that a new owner had been added to the site. I followed the link to Search Console but there was no sign of the new owner. Finally, this morning, I worked out they were talking about the &#8220;aphra&#8221; subdomain and, when I visited the site, I saw the new content and quickly worked out what had happened.</p><p>How do we fix the problem? My first attempt was to set up <a href="https://github.com/davorg/reclaim-aphra">a new repo</a> and try to override the CNAME in the spurious repo. But GitHub works on a &#8220;first come, first served&#8221; basis and it kept telling me that I couldn&#8217;t configure my repo to use that domain as it was already taken.</p><p>The easiest fix would be to just delete the DNS record so the new site stops working. But that&#8217;s only a temporary fix. What happens if I change my mind again and want to move the site back to the davecross.co.uk domain?</p><p>In the end, I did two things. <a href="https://gandi.net/">My DNS provider</a> allows you to configure web redirection rules so that requests are redirected to a different address before any web server even  gets to see the request. I set that up so that <a href="https://aphra.davecross.co.uk/">aphra.davecross.co.uk</a> redirects to <a href="https://aphra.perlhacks.com/">aphra.perlhacks.com</a>. It took a while for the DNS to propagate, but that&#8217;s working now - which solves the immediate problem.</p><p>But I couldn&#8217;t help thinking there must be a more permanent way to fix this problem. A way that prevents a random hacker from hijacking my domain in the first place. And it turns out that GitHub has thought of that. You can now <a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/verifying-your-custom-domain-for-github-pages">verify your custom domains</a> so that only you (or people working in your GitHub organisation) can configure a CNAME file so that it points at domains (or subdomains) that you own. It&#8217;s a simple process - you just add DNS records to the domain. The only slight downside here is that now I&#8217;ve verified davecross.co.uk, the hijackers are given seven days to respond to my claim (they won&#8217;t be able to, of course, as they don&#8217;t control the DNS) and until that time is up, I won&#8217;t get control of the domain - not that it matters in this case as I&#8217;ve stopped requests getting to their repo.</p><p>All in all, it was an interesting morning and lessons have been learned. If you want to benefit from my misfortune then I think there are a couple of important points:</p><ul><li><p><a href="https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/verifying-your-custom-domain-for-github-pages">Verify the domains</a> you&#8217;re going to use with GitHub Pages</p></li><li><p>Register all of your domains with <a href="https://search.google.com/search-console">Search Console</a>. Even if you don&#8217;t care about SEO, it&#8217;s still useful to know that Google are watching out for any weirdness going on with your site.</p></li></ul><div><hr></div><p>What else is going on?</p><ul><li><p>If you&#8217;re thinking about getting a trainer in to bring your team up to speed with Modern Perl best practices or GitHub Actions then now would be a really good time to speak to me</p></li><li><p>I&#8217;m also interested in talking about freelancing with you. Have a look at <a href="https://davecross.co.uk/services/">my services page</a> and see if there&#8217;s anything I offer that could be useful to you</p></li><li><p>I&#8217;ve also set up <a href="https://github.com/sponsors/davorg/">a GitHub sponsorship</a> scheme if you just find my work useful and would like to find a way to say thank you</p></li></ul><div><hr></div><p>Here are a few interesting links I&#8217;ve seen in the last week or so.</p><ul><li><p>I&#8217;ve had a lot of success (and fun!) using GitHub Copilot to make my coding more efficient. Now it looks like <a href="https://github.blog/2024-04-29-github-copilot-workspace/">GitHub Copilot Workspace </a>will be taking that a step further</p></li><li><p>At FOSDEM in February, Scott Chacon gave a talk called <a href="https://www.youtube.com/watch?v=aolI_Rz0ZqY">So You Think You Know Git</a>. I learned things (but you won&#8217;t get me to admit what they were)</p></li><li><p><a href="https://www.youtube.com/watch?v=ObUBUKOn-bo">The Sora hype continues</a> (and maybe gives your nightmares rather too many new ideas)</p></li><li><p><a href="https://simonwillison.net/2024/Apr/17/ai-for-data-journalism/">An annotated presentation from Simon Willison</a> illustrating how journalists could be using AI right now</p></li></ul><p>That&#8217;s all for now. I need to get back to verifying custom domains :-)</p><p>All the best,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>p.s. One last plea for help with my GitHub Pages problem. As I&#8217;ve said, the problem is now fixed. But I still don&#8217;t know which repo contains the CNAME file that hijacked my domain. If anyone can suggest how I could work that, it would make me very happy.</p>]]></content:encoded></item><item><title><![CDATA[Remember me?]]></title><description><![CDATA[I really need to be more consistent here]]></description><link>https://onething.davecross.co.uk/p/remember-me</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/remember-me</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Sun, 25 Feb 2024 18:00:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hUY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It&#8217;s six months since I sent out a newsletter. And, sadly, I don&#8217;t think that&#8217;s anywhere near the longest gap I&#8217;ve had between mailings. I wonder how I can get better at this.</p><p>Anyway, last time I wrote I was debating with myself about which project I would devote my time to. I never really reached a decision on that. So I&#8217;m still juggling a number of different things.</p><h2><strong><a href="https://actions.davecross.co.uk/">GitHub Actions Essentials</a></strong></h2><p>Marketing continues on the book I published last year. You&#8217;ll recall that I was interviewed for <a href="https://se-radio.net/2023/06/se-radio-567-dave-cross-on-github-actions/">Software Engineering Radio</a> about GitHub Actions. I thought that would be the last I would hear from them, but I forgot that the podcast was connected to the <a href="https://www.ieee.org/">IEEE</a>. Towards the end of last year, I heard from Gavin (who had interviewed me for the podcast) telling me that extracts from our conversation were going to be published in the <a href="https://www.computer.org/csdl/magazine/so">IEEE&#8217;s Software magazine</a>. The article appeared in their Jan-Feb 2024 issue and you can <a href="https://www.computer.org/csdl/magazine/so/2024/01/10372463/1T8PlWEqeeQ">read it online</a> (if you&#8217;re not already tired of reading me banging on about GitHub Actions).</p><p>In related news, I made some improvements to the Perl development workflows that I <a href="https://tprc2023.sched.com/event/1Lhnh">spoke about in Toronto</a> last summer and finally got around to writing <a href="https://perlhacks.com/2024/01/github-actions-for-perl-development/">a blog post about them</a>.</p><h2><strong>GitHub Pages Essentials</strong></h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hUY1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hUY1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hUY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png" width="216" height="344.6808510638298" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2250,&quot;width&quot;:1410,&quot;resizeWidth&quot;:216,&quot;bytes&quot;:1393317,&quot;alt&quot;:&quot;GitHub Pages Essentials&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GitHub Pages Essentials" title="GitHub Pages Essentials" srcset="https://substackcdn.com/image/fetch/$s_!hUY1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!hUY1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74bc231d-c767-4973-8e27-d95f537e3f79_1410x2250.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the potential projects on last year&#8217;s list was a follow-up to <em>GitHub Actions Essentials</em> which will be called <em>GitHub Pages Essentials</em>. Anyway, I&#8217;ve been making progress on that and I expect it to be published in a couple of months. Such a lot of my time currently seems to be spent working with GitHub Pages. I&#8217;m sure I must be one of the biggest users of the feature :-)</p><h2><strong>Perl Web Advice</strong></h2><p>I&#8217;ve just published <a href="https://perlhacks.com/2024/02/the-present-isnt-evenly-distributed-either/">another new blog post</a>. This one is about how CGI programs aren&#8217;t anywhere nearly as dead as the Perl community would like to think they are. There are still plenty of people out there working under constraints (either real or imagined) which means they&#8217;re still deploying their web applications in CGI environments and cutting themselves off from over twenty years of technological improvements in how we deploy web apps.</p><p>I think that most of the problem comes down to education. So I&#8217;m resurrecting a project from about seven years ago where I was planning a web site that would talk about best practices for the development and deployment of Perl web applications. The site already exists (there&#8217;s not much there though) at <a href="https://web.perlhacks.com/">web.perlhacks.com</a>. I&#8217;d welcome any input you might have.</p><p><strong>Update:</strong> I was writing this newsletter last night - just after I had published that blog post. This morning I&#8217;ve woken up to many comments defending CGI programs and asking what I&#8217;ve got against them. It seems clear that the argument for writing PSGI programs instead of CGI programs hasn&#8217;t been made strongly enough or clearly enough. So I guess that&#8217;s my next blog post sorted out!</p><h2><strong>Aphra</strong></h2><p>The subjects in this email are all a lot more intertwined than it might appear. The success of <em>GitHub Actions Essentials</em> has led to me thinking seriously about <em>GitHub Pages Essentials</em>. And Perl Web Advice sits at the intersection between my interest in GitHub Pages and wanting to steer people away from dated development and deployment techniques. And resurrecting Perl Web Advice has reactivated my interest in <a href="https://metacpan.org/dist/App-Aphra/view/bin/aphra">Aphra</a>.</p><p>What&#8217;s Aphra? I hear you ask. Well, I&#8217;m glad you did, because I&#8217;m going to tell you.</p><p>As I said above, I use GitHub Pages a lot. And GitHub Pages is a tool for creating and publishing static web sites. And the best way to create static web sites is to use a <a href="https://en.wikipedia.org/wiki/Static_site_generator">static site generator</a>.</p><p>Now, the default static site generator that&#8217;s baked into GitHub Pages is <a href="https://jekyllrb.com/">Jekyll</a>. I&#8217;ve tried many times to understand Jekyll, but there&#8217;s something about it that just doesn&#8217;t match with how my brain works. I always end up with a site that doesn&#8217;t quite work how I&#8217;d like it to.</p><p>So about seven years ago (and it&#8217;s possible that Perl Web Advice was the site that pushed me into it) I did what any self-respecting geek would do and wrote my own tool (because that&#8217;s the only way you can guarantee it works exactly how you want it to work, right?)</p><p>[Quick sidebar to discuss the name: I wanted to call it Hyde so I could make jokes about it being uglier but more powerful than Jekyll. But <a href="https://hyde.github.io/">Python had beaten me to it</a>. I considered the names of a couple of other characters from <em>Doctor Jekyll and Mr Hyde</em>, but, finally, settled on Aphra to commemorate <a href="https://en.wikipedia.org/wiki/Aphra_Behn">Aphra Behn</a>, a woman who more people should know about.]</p><p>Anyway, I&#8217;ve been using it on a few sites for several years now. I&#8217;ve made a few improvements and I&#8217;m pretty happy with how it works. I should probably start encouraging more people to use it.</p><p>Maybe I should set up a web site for it. Does anyone know of a good static site generator? :-)</p><h2><strong>George and the Smart Home</strong></h2><p>I&#8217;ve put together a simple marketing web site for my children&#8217;s book, <em><a href="https://george.davecross.co.uk/">George and the Smart Home</a></em>. Now you can see what the first dozen or so pages look like before you buy a copy.</p><h2><strong>Interesting links</strong></h2><p>Enough about me. Let&#8217;s finish with a few links to things that I&#8217;ve found interesting recently.</p><ul><li><p><a href="https://ovid.github.io/articles/will-you-lose-your-job-to-ai.html">Will You Lose Your Job To AI?</a> Curtis Poe is usually well worth reading and this piece about the effects that AI will have on the job market is no exception</p></li><li><p><a href="https://will.sowman.org/">Will Sowman</a> - I&#8217;ve published a couple of books by a local author. One on prompt engineering and one on how to get out of the rat race and start freelancing</p></li><li><p><a href="https://substack.com/@jamesomalley">The Odds and Ends of History</a> - I first met James when we were both part of the skeptics/atheist/rationalist movement in the 2000s. I was an occasional contributor to his much-missed podcast, The Pod Delusion. Now he&#8217;s writing a weekly newsletter on Substack. And it&#8217;s really interesting stuff</p></li><li><p><a href="https://www.youtube.com/watch?v=HK6y8DAPN_0">Introducing Sora</a> - I expect you&#8217;ve all seen OpenAI&#8217;s impressive video-generating tool. But here&#8217;s a link in case anyone has missed it</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://onething.davecross.co.uk/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share One Thing at a Time&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://onething.davecross.co.uk/?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share One Thing at a Time</span></a></p><p>That&#8217;s all for now. Hopefully, it won&#8217;t be another six months before my next newsletter.</p><p>Cheers,</p><p>Dave&#8230;</p>]]></content:encoded></item><item><title><![CDATA[The next thing...]]></title><description><![CDATA[What am I going to do next?]]></description><link>https://onething.davecross.co.uk/p/the-next-thing</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/the-next-thing</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Tue, 01 Aug 2023 05:00:15 GMT</pubDate><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HzOV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HzOV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 424w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 848w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 1272w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HzOV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png" width="676" height="250" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:250,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92462,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HzOV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 424w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 848w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 1272w, https://substackcdn.com/image/fetch/$s_!HzOV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e45ebb7-c096-40a3-9772-e1b16d4d96e6_676x250.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>At the start of this month, I was in Toronto for the Perl and Raku Conference. It was my first time ever at a Perl conference in North America and it&#8217;s been over twenty years since I spoke at a conference on that continent (it was an OSCON in San Diego).</p><p>I gave a talk about using GitHub Actions for Perl development (which you can <a href="https://www.youtube.com/watch?v=ol_Qk31v17g">watch on YouTube</a>) and a lightning <a href="https://www.youtube.com/watch?v=pIaZZqQOxC4">talk about my CPAN Dashboard project</a> (which is run using GitHub Actions). I&#8217;ve had a few more sales of <a href="https://actions.davecross.co.uk/">the book</a> in the weeks following the conference, so I guess I persuaded a few more people to buy it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>I&#8217;ve written <a href="https://dev.to/davorg/the-perl-and-raku-conference-toronto-2023-5c24">a blog post about my time at the conference</a> in which I recommend a few talks that I saw while I was there. In particular, Olaf Anders&#8217; talk <a href="https://www.youtube.com/watch?v=9J_9WQ_haDs">Whither Perl</a> struck a chord with me. It was a measured rumination on where Perl is currently and what the community should be thinking about in order to get themselves into a better place. It got me thinking about the community and my place in it. I don&#8217;t have any conclusions yet, but there&#8217;s certainly a blog post brewing that will, hopefully, be written sometime this week.</p><p><strong>One thing at a time&#8230;</strong></p><p>When I called this newsletter &#8220;One Thing at a Time&#8221;, it was really a message to myself. I&#8217;m far too good at thinking of business ideas, starting prototypes and never turning them into real income. I want to curb that instinct in myself and actually build something into a profitable business. I don&#8217;t mind if I end up with two or three (maybe more) small but profitable businesses, but I know that will only happen if I work on one of them at a time.</p><p>For example, here&#8217;s a sample of the things that are in my head at the moment (I&#8217;ve included links to some web sites that are very much works in progress - don&#8217;t be surprised if some of them make little sense in their current form):</p><ul><li><p>Two t-shirt/clothing ideas that I think could really sell</p></li><li><p>A sequel to the GitHub Actions book which would be about GitHub Pages</p></li><li><p>A coffee-table book about the royal family</p></li><li><p>More marketing for <em><a href="https://actions.davecross.co.uk/">GitHub Actions Essentials</a></em> (Do people want webinars on the subject? Would they pay for them?)</p></li><li><p>A <a href="https://perldiver.io/">tool for Continuous Integration</a> of Perl projects (written using GitHub Actions and GitHub Pages)</p></li><li><p><a href="https://127people.com/">A web app for beginners to genealogy</a></p></li><li><p>The book <em><a href="https://morethanco.de/">More Than Code</a></em> (and associated consultancy) that I&#8217;ve discussed here before</p></li><li><p>A <a href="https://claphamtechpress.com/">micro-publishing house</a> that helps technical people get their knowledge published as ebooks</p></li></ul><p>There are more, but eight items is a long enough list to be getting on with. I need to prioritise these ideas and work on one of them at a time.</p><p>So what criteria do I use to prioritise them? Well, honestly, I think it&#8217;s about making money. Which of them will people pay for? And speed. How quickly can I start making money from them?</p><p>The GitHub Pages book would be pretty simple to write. I have an outline already and could knock the book out in a few weeks. The Perl CI tool would be fun to work on, but I don&#8217;t think there&#8217;s much of a market for people to pay for it. The genealogy app is a bit more work to get it up and running and I&#8217;m not entirely sure how I&#8217;d monetise it. The royal family book would just be a lot of work. The publishing house is a nice little project - but it&#8217;s very dependent on how popular the individual books are.</p><p>I like <em>More Than Code</em>. And I have a lot of it written already. For those of you who weren&#8217;t around when I last discussed it - it&#8217;s basically a book that&#8217;s a mentor for people in a software development career. It talks them through all the bits of their job that aren&#8217;t actually writing code. So it covers stuff like being an efficient developer by knowing tools like your editor and your operating system better. There&#8217;s also a section about various software design and development processes and, at the end, it verges into &#8220;fluffier&#8221; areas like building a personal brand and getting known in the industry.</p><p>I haven&#8217;t decided which of these projects I&#8217;ll be concentrating on next. But I thought would be interesting to give you a bit of a peek into my head as I&#8217;m making up my mind.</p><p>What do you think? Are there any projects there that you&#8217;d like to see me take to completion? Which of them would you pay for?</p><p>I&#8217;ll let you know what I choose in my next newsletter.</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Software Engineering Radio]]></title><description><![CDATA[Still marketing my book...]]></description><link>https://onething.davecross.co.uk/p/software-engineering-radio</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/software-engineering-radio</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Thu, 08 Jun 2023 11:16:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W3re!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W3re!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W3re!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 424w, https://substackcdn.com/image/fetch/$s_!W3re!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 848w, https://substackcdn.com/image/fetch/$s_!W3re!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 1272w, https://substackcdn.com/image/fetch/$s_!W3re!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W3re!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png" width="624" height="351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:351,&quot;width&quot;:624,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:80858,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W3re!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 424w, https://substackcdn.com/image/fetch/$s_!W3re!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 848w, https://substackcdn.com/image/fetch/$s_!W3re!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 1272w, https://substackcdn.com/image/fetch/$s_!W3re!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F73839ac4-241b-4deb-ac60-f6d91e963727_624x351.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hi all,</p><p>When I last wrote to you (which is longer ago than I would like it to have been), I mentioned a podcast I would be talking on. My episode was published yesterday, so I can now tell you all about it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>It&#8217;s an excellent example of serendipity. Gavin Henry is one of the presenters of <a href="https://www.se-radio.net/">Software Engineering Radio</a>. He was looking for someone to appear on the podcast to talk about GitHub Actions when one of my newsletters plugging GitHub Actions Essentials appeared in his inbox. We exchanged a few emails and then spent a very pleasant hour or so talking about GitHub Actions back in April. The back-end team at SE Radio then took our conversation and turned it into a real podcast which <a href="https://www.se-radio.net/2023/06/se-radio-567-dave-cross-on-github-actions/">is now available for you to listen to</a> wherever you get your podcasts.</p><p>If you&#8217;re not really sure why you should care about GitHub Actions (and, more importantly, why you should <a href="https://actions.davecross.co.uk/">buy a book</a> about it) then I think our conversation does a good job of explaining what GitHub Actions is and how it can help you.</p><p>Other marketing efforts on the book continue to have a slow effect. I seem to be selling far more copies on LeanPub than on Amazon. I wonder if that&#8217;s my geeky audience having a preference for not using Amazon if possible?</p><h2>ChatGPT and Copilot</h2><p>Like the rest of the world, I&#8217;ve been experimenting with the new generation of Generative AI tools. Sometimes it feels like I&#8217;ve handed over most of the management of my life to GPT4. I&#8217;ve been using it to plan meals, exercise sessions and even sightseeing trips. It&#8217;s been really impressive.</p><p>But, as a geek, it&#8217;s coding where these tools really stand out for me. Over the last few years, I&#8217;ve become a reasonably competent Javascript programmer. But GPT4 has really increased my productivity. As an example, here&#8217;s my <a href="https://psc.perlhacks.com/">web page which links to the weekly status reports from the Perl Steering Council</a>. The initial version built a static page each week when the new report was published. But now it loads the data from a JSON file and builds a table that can be sorted in various useful ways. None of that would have been beyond my Javascript abilities, but it would have taken me a few hours to get there. With a few carefully-chosen prompts, the new version was ready in about an hour. It wasn&#8217;t all plain-sailing - GPT4 consistently hallucinated the wrong name for a Font Awesome icon - but it was far easier than doing it myself.</p><p>I&#8217;ve also been experimenting with <a href="https://github.com/features/copilot">GitHub Copilot</a>. I had put off trying it for months because I thought (wrongly, as it happens) that it only supported a small number of languages - that didn&#8217;t include Perl. But that&#8217;s not the case. Its Perl support seems to be pretty good. Ovid wrote <a href="https://ovid.github.io/articles/using-github-copilot-with-vim.html">a blog post</a> which summarises his (positive) experience with Copilot and mine is very similar.</p><p>My &#8220;aha!&#8221; moment came when I decided to refactor some code and Copilot read my mind and produced the correct code without any prompts from me.</p><p>I was working on a web application that needed to switch between two display modes - one had basically no CSS and the other used CSS to make the output far prettier. The class had an attribute called &#8220;pretty&#8221; which determined which version to use. So the method that renders the output contains code like this:</p><p><code>my $css = $self-&gt;pretty ? $self-&gt;pretty_css : $self-&gt;standard_css;</code></p><p>And that $css variable was then interpolated into the output HTML. I decided to put that logic into a new method called &#8220;css()&#8221;. I just typed &#8220;sub css {&#8220; and when I pressed the enter key, Copilot suggested a body for the method that was exactly what I wanted.</p><p>I was sold. I&#8217;m currently on the free trial, but once that&#8217;s up it&#8217;s going to be well worth the tenner or month it&#8217;s going to cost me.</p><h2>AWS and AI</h2><p>I was at the AWS Summit in London yesterday. As you&#8217;d guess, generative AI was a big topic there as well. AWS already has <a href="https://aws.amazon.com/machine-learning/ai-services/">a number of AI-based services</a> and that number is only going to increase as time passes. They now have a Copilot competitor called <a href="https://aws.amazon.com/blogs/machine-learning/introducing-amazon-codewhisperer-the-ml-powered-coding-companion/">CodeWhisperer</a> which might be worth a look.</p><p>I always come away from AWS Summit enthused to get my stuff moved into the AWS cloud and this year was no exception.</p><p>A few years ago, I started writing a series of blog posts called <a href="https://dev.to/davorg/series/892">Into the Cloud</a>, where I was going to explain how I moved one of my personal projects onto AWS. I never completed that project (real jobs got in the way) but I think the time is right to get back to it. And I think I&#8217;ll have a good helper this time. I&#8217;ve already had a conversation with ChatGPT about the project and we&#8217;ve come up with a plan to complete the transition. I&#8217;ll let you know how it goes.</p><h2>Hire me</h2><p>As you might be able to tell, I&#8217;m having a lot of fun writing books, experimenting with new toys and working on my own projects. But the mortgage still needs to be paid, so I&#8217;m in the market to take on a bit of work. If you or anyone you know can make use of my skills (Perl, Linux, web development, databases, GitHub Actions, and so on) then please get in touch.</p><p>Until next time,</p><p>Cheers,</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA["GitHub Actions Essentials" is published]]></title><description><![CDATA[The hard part is marketing it]]></description><link>https://onething.davecross.co.uk/p/github-actions-essentials-is-published</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/github-actions-essentials-is-published</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Fri, 14 Apr 2023 11:21:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!WIfB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WIfB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WIfB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WIfB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png" width="262" height="418.0851063829787" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2250,&quot;width&quot;:1410,&quot;resizeWidth&quot;:262,&quot;bytes&quot;:1382881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WIfB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!WIfB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6d2ca98a-2cbc-41e8-b614-7a4ac1672a8b_1410x2250.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I released <em><a href="https://actions.davecross.co.uk/">GitHub Actions Essentials</a></em> into the world yesterday. The link will take you to a website which has links to all the places where you can buy it. Currently, that&#8217;s Amazon and LeanPub, but I&#8217;m open to suggestions of other places where you&#8217;d expect to buy it.</p><p>Currently, it&#8217;s ebook-only, but I&#8217;m looking into options for making it available in the physical world as well. Let me know if you&#8217;d find that useful.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>This feels like the culmination of many weeks of work - researching the subject, writing the book, editing the book, wrangling it into a format that can be sold through various outlets. But, in reality, the real work starts now.</p><p>I now need to sell it.</p><p>I think I&#8217;ve mentioned before that I&#8217;m not a natural marketer (is it &#8220;marketer&#8221; or &#8220;marketeer&#8221;?) I would love to live in a world where I mention my new book on Twitter, Facebook and LinkedIn and suddenly the sales start flooding in. But, sadly, it&#8217;s not like that at all. There&#8217;s a lot more work that needs to be done. I did the easy tweeting and stuff like that yesterday. This newsletter is the next step in the campaign. This is a relatively easy step. This feels a bit like talking to a group of friends. I hope you don&#8217;t feel like you&#8217;re being marketed to - even though you are.</p><p>Buy my book! It&#8217;s great!!</p><p>But that&#8217;s not how marketing is supposed to go these days. Hey, I&#8217;ve read Seth Godin - I know how this stuff works. Let&#8217;s try again.</p><ul><li><p>GitHub Actions will make your life easier by automating a lot of the software engineering process</p></li><li><p><em>GitHub Actions Essentials</em> will show you how to use GitHub Actions in order to make your life easier</p></li><li><p>Buy my book! It&#8217;s great!!</p></li></ul><p>See! That&#8217;s better, isn&#8217;t it? My book solves problems and makes your life better.</p><p>Then there are the bits of the process that a traditional publisher would do for me. Sending out review copies to people (and, later, chasing for reviews), paying for adverts in the right places (knowing where &#8220;the right places&#8221; are). I&#8217;ll need to do all of that myself. (Hint - if you&#8217;re able to help me get a review copy to someone who will write a relatively high-profile review, then please get in touch.)</p><p>A couple of things have serendipitously fallen into my lap. LeanPub has started doing a series of <a href="https://www.youtube.com/watch?v=FmcABFZH2bU&amp;list=PLUeW7hrYTk8yIkvPxCCBqO9I7k8nyPb3b">&#8220;book launch videos&#8221;</a> where they interview the authors of recently-published books. Overnight I got an invitation to take part in one of those - so I&#8217;ll be interviewed next Monday for that. Also, when my last newsletter went out, one of the subscribers was looking for someone to be interviewed about GitHub Actions for their (pretty well-known) software engineering podcast. We&#8217;re recording the conversation next week, so I&#8217;ll be able to share more details in the next newsletter.</p><p>Another important marketing tip is to use any existing audience that you have. Some of you will know me from my work in the Perl community. The Perl community has annual conferences in both Europe and North America and I&#8217;ve proposed a talk on &#8220;GitHub Actions for Perl Development&#8221; to both of them. Yesterday I heard that it had been accepted for the <a href="https://tprc.to/tprc-2023-tor/">conference in Toronto</a> in July, so it looks very much like I&#8217;ll be speaking there. This will be the first time I&#8217;ve spoken at a conference in North America since OSCON was in San Diego (over twenty years ago).</p><p>It&#8217;s possible that writing this newsletter is slowly turning into a marketing avoidance tactic. So I should probably stop now and turn my attention to some other potential customers. I&#8217;ll be back with more updates in a week or two. Oh, but before I go, I wanted to include an extract for you (step 1: provide useful content). So, below is &#8220;Appendix B: List of Useful GitHub Actions and Integrations&#8221;. Hopefully, this will give you a brief flavour of the kinds of things that you can do with GitHub Actions (thereby giving you a reason to buy the book - this marketing lark is addictive!)</p><p>Speak to you soon,</p><p>Dave&#8230;</p><h1>Appendix B: List of Useful GitHub Actions and Integrations</h1><p>This appendix provides a curated list of useful GitHub Actions and integrations that can enhance your workflows and improve your development process. While this list is not exhaustive, it should help you discover the potential of GitHub Actions and encourage you to explore the GitHub Actions Marketplace for more actions.</p><ol><li><p><strong>actions/checkout:</strong> This action checks out your repository so your workflow can access its contents. It is one of the most commonly used actions in GitHub Actions workflows.</p><ul><li><p>Repository:<a href="https://github.com/actions/checkout"> https://github.com/actions/checkout</a></p></li></ul></li><li><p><strong>actions/setup-node:</strong> Sets up a Node.js environment on the runner, allowing you to run Node.js scripts and tools in your workflow.</p><ul><li><p>Repository:<a href="https://github.com/actions/setup-node"> https://github.com/actions/setup-node</a></p></li></ul></li><li><p><strong>actions/setup-python:</strong> Sets up a Python environment on the runner, allowing you to run Python scripts and tools in your workflow.</p><ul><li><p>Repository:<a href="https://github.com/actions/setup-python"> https://github.com/actions/setup-python</a></p></li></ul></li><li><p><strong>actions/cache:</strong> Caches dependencies and build outputs to improve workflow execution times.</p><ul><li><p>Repository:<a href="https://github.com/actions/cache"> https://github.com/actions/cache</a></p></li></ul></li><li><p><strong>actions/upload-artifact and actions/download-artifact:</strong> Uploads build artifacts from a job and downloads them for use in subsequent jobs.</p><ul><li><p>Repository:<a href="https://github.com/actions/upload-artifact"> https://github.com/actions/upload-artifact</a> and<a href="https://github.com/actions/download-artifact"> https://github.com/actions/download-artifact</a></p></li></ul></li><li><p><strong>actions/create-release:</strong> Creates a new release on GitHub and uploads assets to the release.</p><ul><li><p>Repository:<a href="https://github.com/actions/create-release"> https://github.com/actions/create-release</a></p></li></ul></li><li><p><strong>actions/github-script:</strong> Allows you to write inline scripts that interact with the GitHub API and other GitHub Actions features using Octokit and the actions-toolkit libraries.</p><ul><li><p>Repository:<a href="https://github.com/actions/github-script"> https://github.com/actions/github-script</a></p></li></ul></li><li><p><strong>codecov/codecov-action:</strong> Uploads your code coverage reports to Codecov, a popular code coverage analysis and reporting tool.</p><ul><li><p>Repository:<a href="https://github.com/codecov/codecov-action"> https://github.com/codecov/codecov-action</a></p></li></ul></li><li><p><strong>deployments/ftp-deploy:</strong> Deploys your repository to a remote server via FTP or SFTP.</p><ul><li><p>Repository:<a href="https://github.com/deployments/ftp-deploy"> https://github.com/deployments/ftp-deploy</a></p></li></ul></li><li><p><strong>jakejarvis/lighthouse-action:</strong> Runs Google Lighthouse audits on your web application and generates reports.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/jakejarvis/lighthouse-action"> https://github.com/jakejarvis/lighthouse-action</a></p></li></ul><ol start="11"><li><p><strong>peter-evans/create-pull-request:</strong> Automates the creation of pull requests from within your GitHub Actions workflows.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/peter-evans/create-pull-request"> https://github.com/peter-evans/create-pull-request</a></p></li></ul><ol start="12"><li><p><strong>semantic-release/semantic-release:</strong> Fully automated version management and package publishing based on semantic versioning rules.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/semantic-release/semantic-release"> https://github.com/semantic-release/semantic-release</a></p></li></ul><ol start="13"><li><p><strong>snyk/actions: </strong>Scans your dependencies for vulnerabilities using Snyk, a popular open-source security platform.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/snyk/actions"> https://github.com/snyk/actions</a></p></li></ul><ol start="14"><li><p><strong>SonarCloud/github-action:</strong> Integrates SonarCloud, a cloud-based code quality and security analysis platform, into your GitHub Actions workflows.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/SonarCloud/github-action"> https://github.com/SonarCloud/github-action</a></p></li></ul><ol start="15"><li><p><strong>stale/stale:</strong> Automatically marks issues and pull requests as stale after a period of inactivity, and eventually closes them if no further activity occurs.</p></li></ol><ul><li><p>Repository:<a href="https://github.com/stale/stale"> https://github.com/stale/stale</a></p></li></ul><p>Remember to explore the<a href="https://github.com/marketplace?type=actions"> GitHub Actions Marketplace</a> for additional actions and integrations that may suit your specific needs.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Digging into GitHub Actions]]></title><description><![CDATA[How I ended up writing a new book]]></description><link>https://onething.davecross.co.uk/p/digging-into-github-actions</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/digging-into-github-actions</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Fri, 24 Mar 2023 07:46:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EhXi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve been following <a href="https://dev.to/davorg">my blog posts on dev.to</a>, then you&#8217;ll know that I&#8217;ve been doing a lot of work with GitHub Actions over the last year or so. If you haven&#8217;t seen what I&#8217;ve been writing, here are a few links to catch you up:</p><ul><li><p><a href="https://dev.to/davorg/github-actions-for-semi-static-web-sites-597g">GitHub Actions for semi-static web sites</a></p></li><li><p><a href="https://dev.to/davorg/not-that-pr-thanks-3m1c">Not that PR, thanks</a></p></li><li><p><a href="https://dev.to/davorg/dependabot-and-github-actions-3lai">Dependabot and GitHub Actions</a></p></li><li><p><a href="https://dev.to/davorg/deploying-github-pages-site-with-github-workflows-3bhh">Deploying GitHub Pages sites with GitHub Workflows</a></p></li></ul><p>I think that GitHub Actions is a useful feature which allows you to automate large parts of the software development process. Every day that I use it, I find another interesting thing about it and I&#8217;m sure I&#8217;ve only scratched the surface.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p>All of which means that over the last few weeks, I&#8217;ve found myself writing about GitHub Actions. And it&#8217;s almost ready to be published. The front cover is below and I&#8217;ve been working on <a href="https://actions.davecross.co.uk/">a website about the book</a> (it&#8217;s very much a work in progress - feel free to take a look but don&#8217;t be surprised if things don&#8217;t work and please don&#8217;t share the link with anyone else yet).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EhXi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EhXi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EhXi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png" width="246" height="392.5531914893617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2250,&quot;width&quot;:1410,&quot;resizeWidth&quot;:246,&quot;bytes&quot;:1382881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EhXi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 424w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 848w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 1272w, https://substackcdn.com/image/fetch/$s_!EhXi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af1c655-f9dc-433d-8c9a-96086350efba_1410x2250.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One thing that the web page does have already is a table of contents - so you can see whether or not you&#8217;ll be interested in the book. And, below, I present the first preview content from  the book. This is an extract from section 10.3 - <em>Automating Project Management and Collaboration</em>.</p><div><hr></div><h2>Automating Project Management and Collaboration</h2><p>Automating project management and collaboration tasks can significantly improve the efficiency of your development process and help your team stay focused on delivering high-quality code. GitHub Actions provides a flexible platform for creating custom workflows to automate various aspects of your project management and collaboration efforts.</p><p>In this section, we will discuss several examples of how you can leverage GitHub Actions to automate project management and collaboration tasks</p><h3>Automating Issue and Pull Request Management</h3><p>Issues and pull requests are at the core of GitHub's collaborative features, allowing team members to report bugs, suggest enhancements, and submit code changes. By automating their management with GitHub Actions, you can save time, improve organization, and ensure consistency in your project.</p><p>Here are some key aspects of automating issue and pull request management with GitHub Actions:</p><ol><li><p><strong>Labelling:</strong> Automatically apply labels to new issues and pull requests based on predefined criteria. For example, you can label issues as "bug" or "enhancement" based on their description or use specific labels for pull requests targeting particular branches. This helps categorize and prioritize tasks within your project.</p></li><li><p><strong>Assignment:</strong> Assign issues and pull requests to specific team members or groups based on predefined rules. This ensures that the right person is responsible for addressing each task and helps distribute workload evenly across your team.</p></li><li><p><strong>Triage:</strong> Automatically move issues and pull requests through different stages of your development process. For example, you can create a workflow that automatically moves a pull request to a "review" stage when it's ready for review, and then to a "testing" stage when it's been approved.</p></li><li><p><strong>Notifications:</strong> Send custom notifications to team members, Slack channels, or email addresses when specific events occur. This can help keep your team informed about the progress of issues and pull requests, and ensure that everyone is on the same page.</p></li><li><p><strong>Automated checks:</strong> Implement automated checks and validations for pull requests to ensure that they meet certain quality standards before they can be merged. For example, you can enforce that all pull requests pass your CI pipeline or meet specific code coverage thresholds.</p></li><li><p><strong>Merging:</strong> Automate the process of merging pull requests once they meet certain criteria, such as passing all required checks or receiving a specific number of approvals. This can help streamline your development process and ensure that code changes are merged promptly and consistently.</p></li></ol><p>To get started with automating issue and pull request management, explore the available GitHub Actions in the marketplace that are designed for these purposes. You can also create custom workflows tailored to your project's specific needs. By implementing automation in your issue and pull request management, you'll be able to focus more on the actual development work and maintain a more organized, efficient, and collaborative project environment.</p><h3>Integrating GitHub Actions with Project Boards</h3><p>GitHub Project Boards provide a visual representation of your project's progress, allowing you to manage tasks, prioritize work, and track milestones. Integrating GitHub Actions with Project Boards can streamline your project management and help you maintain an up-to-date view of your project's status.</p><p>Here are some key aspects of integrating GitHub Actions with Project Boards:</p><ol><li><p><strong>Automatic Card Creation:</strong> Automatically create cards on your Project Board when new issues or pull requests are opened. This ensures that all tasks are tracked in a centralized location and allows team members to get an overview of the work that needs to be done.</p></li><li><p><strong>Card Movement:</strong> Automate the movement of cards between different columns on your Project Board based on specific triggers or events. For example, when a pull request is approved, you can automatically move its corresponding card to a "Ready for Merge" column. This helps maintain an accurate representation of your project's progress and minimizes manual work for your team.</p></li><li><p><strong>Card Assignment:</strong> Assign cards to team members automatically based on predefined rules or conditions. This can help distribute the workload more evenly and ensure that the right person is responsible for each task.</p></li><li><p><strong>Updating Card Details:</strong> Automatically update card details, such as labels, assignees, or due dates, based on changes in the associated issue or pull request. This keeps your Project Board up-to-date and ensures that all relevant information is easily accessible.</p></li><li><p><strong>Project Board Notifications:</strong> Send custom notifications to your team when specific events occur on your Project Board, such as when a card is moved to a different column or when a due date is approaching. This can help keep your team informed and ensure that everyone is aware of important updates or deadlines.</p></li></ol><p>To integrate GitHub Actions with your Project Boards, you'll need to create custom workflows that interact with the GitHub API to perform actions related to Project Boards. Explore the available actions in the GitHub Actions Marketplace for managing Project Boards or create your own custom actions tailored to your project's needs.</p><p>By integrating GitHub Actions with your Project Boards, you can automate and streamline your project management processes, leading to increased efficiency and better collaboration among team members.</p><h3>Collaborating with External Teams and Services</h3><p>In many software projects, collaboration extends beyond your immediate team to include external teams or third-party services. Integrating GitHub Actions with these external resources can facilitate seamless collaboration, streamline communication, and ensure that all parties stay informed and in sync.</p><p>Here are some key aspects of collaborating with external teams and services using GitHub Actions:</p><ol><li><p><strong>Interacting with External Repositories:</strong> Set up workflows that interact with external repositories, such as creating pull requests, opening issues, or updating code in a forked repository. This can be particularly helpful when working with open-source projects or collaborating with other organizations on shared initiatives.</p></li><li><p><strong>Third-Party Service Integration:</strong> Integrate GitHub Actions with popular third-party services such as Jira, Trello, Slack, or Microsoft Teams to automate various project management, communication, and collaboration tasks. For example, you can create a workflow that posts a message to a specific Slack channel when a new pull request is opened or synchronize GitHub issues with Jira tickets.</p></li><li><p><strong>Shared Workflows and Actions:</strong> Share workflows and actions across multiple repositories or organizations. This allows you to establish best practices and maintain consistency across your projects. You can also leverage GitHub's reusable workflows feature to minimize duplication of effort and streamline the setup process for new projects.</p></li><li><p><strong>Access Control and Permissions:</strong> Configure access controls and permissions for your GitHub Actions workflows to ensure that only authorized users can perform specific actions or access sensitive information. This is particularly important when working with external collaborators, as it helps maintain the security and integrity of your codebase.</p></li><li><p><strong>Collaboration on Custom Actions:</strong> Encourage collaboration on the development of custom GitHub Actions by making the source code available in a public repository. This allows external contributors to submit improvements, report issues, or suggest new features, fostering a community-driven approach to action development.</p></li></ol><p>To successfully collaborate with external teams and services using GitHub Actions, it's essential to plan and implement appropriate workflows, access controls, and integrations. This will enable your team to work efficiently with external collaborators, harness the power of third-party services, and maintain the security and integrity of your projects.</p><h3>Automating Code Review and Feedback</h3><p>Automating code review and feedback processes using GitHub Actions can significantly improve the overall quality of your codebase and streamline collaboration among team members. By incorporating automated checks and reviews, you can ensure that your project adheres to established coding standards and best practices while minimizing human errors and oversight.</p><p>Here are some key aspects of automating code review and feedback using GitHub Actions:</p><ol><li><p><strong>Linting and Static Code Analysis:</strong> Integrate linters and static code analysis tools in your workflows to automatically check for syntax errors, code style violations, and other issues. These tools can provide immediate feedback on pull requests, ensuring that your codebase remains clean and maintainable. Popular tools include ESLint for JavaScript, Pylint for Python, and RuboCop for Ruby.</p></li><li><p><strong>Automated Testing:</strong> Configure your workflows to run automated tests on every pull request or commit. This helps identify potential issues early in the development process and ensures that new changes do not introduce regressions. You can also use GitHub Actions to run tests in parallel or across multiple environments, further increasing the reliability and robustness of your codebase.</p></li><li><p><strong>Code Review Automation:</strong> Use GitHub Actions to automate various aspects of the code review process, such as automatically assigning reviewers, enforcing review policies, or checking for compliance with specific guidelines. This can help streamline the review process and ensure that all code changes are thoroughly vetted before being merged into the main branch.</p></li><li><p><strong>Automated Feedback:</strong> Integrate GitHub Actions with communication platforms like Slack or Microsoft Teams to provide real-time feedback on code changes. For example, you can create a workflow that sends a message to a specific channel whenever a new pull request is opened or when automated tests fail. This helps keep your team informed and encourages prompt action on issues.</p></li><li><p><strong>Performance and Security Checks:</strong> Use GitHub Actions to automatically analyze your code for performance bottlenecks, security vulnerabilities, and other potential issues. Tools like SonarQube or Snyk can help you identify and address these concerns early in the development process, ensuring that your code remains secure and performant.</p></li></ol><p>By automating code review and feedback processes using GitHub Actions, you can establish a more efficient and effective collaboration environment for your team. This, in turn, leads to higher quality code, fewer defects, and faster development cycles, ultimately resulting in a more successful and robust software project.</p><h3>Streamlining Documentation and Knowledge Management</h3><p>Effective documentation and knowledge management are critical to the success of any software project. They ensure that all team members have access to the information they need to understand, contribute to, and maintain the codebase. GitHub Actions can help automate and streamline various aspects of documentation and knowledge management, making it easier for your team to stay informed and up-to-date.</p><p>Here are some key strategies for streamlining documentation and knowledge management using GitHub Actions:</p><ol><li><p><strong>Automated Documentation Generation:</strong> Use GitHub Actions to automatically generate and update project documentation based on code comments, markdown files, or other sources. Tools like JSDoc, Sphinx, and Jekyll can help you create comprehensive and well-structured documentation with minimal effort. By integrating these tools into your workflow, you can ensure that your documentation remains current and accurate as your codebase evolves.</p></li><li><p><strong>Documentation Linting and Validation:</strong> Validate your documentation for syntax, structure, and consistency using GitHub Actions. Tools like markdownlint, textlint, or reStructuredText linters can help you enforce documentation standards and best practices. By automatically checking documentation in pull requests or commits, you can maintain high-quality documentation that is easy to understand and navigate.</p></li><li><p><strong>Automated Knowledge Base Updates:</strong> Integrate GitHub Actions with your knowledge management system or wiki to automatically update documentation and other resources when changes are made to your codebase. For example, you could create a workflow that updates a Confluence page or a GitHub Wiki whenever a new feature is added or an existing feature is modified. This ensures that your team always has access to the most up-to-date information.</p></li><li><p><strong>Change Tracking and Notification:</strong> Use GitHub Actions to monitor changes to documentation and other knowledge resources, and notify team members of relevant updates. This can help keep your team informed about important changes and encourage collaboration and knowledge sharing. Integrating GitHub Actions with communication platforms like Slack or Microsoft Teams can facilitate real-time notifications and discussions around documentation updates.</p></li><li><p><strong>Automating Release Notes:</strong> Generate and publish release notes automatically using GitHub Actions. By extracting relevant information from commit messages, pull requests, and issue tracker updates, you can create detailed and accurate release notes that help users understand the changes and improvements in each new version of your software.</p></li></ol><p>By leveraging GitHub Actions to automate and streamline documentation and knowledge management processes, you can foster a more informed and collaborative development environment. This leads to better decision-making, more efficient workflows, and ultimately, a more successful and maintainable software project.</p><div><hr></div><p>I need your help with the book. I think the book is in pretty good shape, but I&#8217;m looking for a handful of people to give it a read and let me know what you think about it. I&#8217;m really looking for help in three areas:</p><ul><li><p>Is the subject matter interesting or useful? And do I go into enough detail (or, perhaps, too much)?</p></li><li><p>Is the content accurate? Or have I made a bit of a fool of myself in some places?</p></li><li><p>How&#8217;s my English? I like to think that I know how to write reasonably well, but with something this substantial, there are always going to be a few errors that will creep in. Let&#8217;s get those knocked on the head.</p></li></ul><p>I&#8217;m afraid, the timescales are pretty tight. I&#8217;d like to get this published towards the end of next week. So please only volunteer if you&#8217;ll have time to spend on the project over the next few days.</p><p>In exchange, you&#8217;ll get a credit in the foreword and a copy of the ebook in whatever format you prefer (as long as that&#8217;s EPUB, Mobi or PDF!)</p><p>Please get in touch by email or on Twitter or Mastodon if you&#8217;d like to help. I&#8217;ll send a link to the first half a dozen or so to get in touch.</p><p>And, hopefully, I&#8217;ll have more news about this next week.</p><p>Thanks for reading.</p><p>Dave&#8230;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading One Thing at a Time! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Join my chat]]></title><description><![CDATA[A private space for us to converse and connect]]></description><link>https://onething.davecross.co.uk/p/join-my-chat</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/join-my-chat</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Thu, 23 Mar 2023 17:09:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2H2-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today I&#8217;m announcing a brand new addition to my Substack publication: the One Thing at a Time subscriber chat.</p><p>This is a conversation space in the Substack app that I set up exclusively for my subscribers &#8212; kind of like a group chat or live hangout. I&#8217;ll post short prompts, thoughts, and updates that come my way, and you can jump into the discussion. </p><p><strong>To join our chat, you&#8217;ll need to download the <a href="https://substack.com/app/app-store-redirect">Substack app</a>, now available for both iOS and Android.</strong> Chats are sent via the app, not email, so turn on push notifications so you don&#8217;t miss conversation as it happens.</p><div><hr></div><h2>How to get started</h2><ol><li><p><strong>Download the app by clicking <a href="https://substack.com/app/app-store-redirect">this link</a> or the button below.</strong> Substack Chat is now available on both iOS and Android.</p></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.com/app/app-store-redirect&quot;,&quot;text&quot;:&quot;Get app&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.com/app/app-store-redirect"><span>Get app</span></a></p><ol start="2"><li><p><strong>Open the app and tap the Chat icon.</strong> It looks like two bubbles in the bottom bar, and you&#8217;ll see a row for my chat inside.</p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2H2-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2H2-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 424w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 848w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 1272w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2H2-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png" width="542" height="276.5837912087912" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:743,&quot;width&quot;:1456,&quot;resizeWidth&quot;:542,&quot;bytes&quot;:501468,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!2H2-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 424w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 848w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 1272w, https://substackcdn.com/image/fetch/$s_!2H2-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F9a23d49f-76bd-4f75-baac-0ae5733774bd_1456x743.png 1456w" sizes="100vw" loading="lazy" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><ol start="3"><li><p><strong>That&#8217;s it!</strong> Jump into my thread to say hi, and if you have any issues, check out <a href="https://support.substack.com/hc/en-us/sections/360007461791-Frequently-Asked-Questions">Substack&#8217;s FAQ</a>.</p></li></ol><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://open.substack.com/pub/davecross/chat&quot;,&quot;text&quot;:&quot;Join chat&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://open.substack.com/pub/davecross/chat"><span>Join chat</span></a></p>]]></content:encoded></item></channel></rss>