<?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, 21 Jul 2026 18:25:45 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[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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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"><svg role="img" 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"><g><title></title><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"><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"><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><item><title><![CDATA[Week 51: Some ideas to make money]]></title><description><![CDATA[Running a little late this week]]></description><link>https://onething.davecross.co.uk/p/week-51-some-ideas-to-make-money</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/week-51-some-ideas-to-make-money</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Wed, 22 Sep 2021 14:33:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1Nuz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.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_!1Nuz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg" width="1200" height="802" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46037,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Nuz!,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%2F7e6baacb-e732-4c94-8e08-aa704e20c18e_1200x802.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"><svg role="img" 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"><g><title></title><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"><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"><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>It&#8217;s twelve days since I sent out the first of these weekly updates. Which means I&#8217;m more than a little late. I can see I&#8217;m going to have to be a little bit more organised here.</p><p>Part of the problem, I think is that there&#8217;s not actually very much to report. I took a couple of days off over my birthday to do tourist things in London and then, the following weekend, I decided I needed to recharge my mental batteries before starting again, so I spent a couple of nights down on the Dorset coast. And, in both cases, I rejigged my working week so that I allocated most of the time I had left to my part-time freelancing job. All of which means I haven&#8217;t, yet, dedicated much time to this project.</p><p>But there is some progress. On the journey back from Dorset I talked through one of my projects with my business partner and came up with several ideas. Before I get into those, let&#8217;s take a higher-level look at the project.</p><p><strong>A Brief Introduction to </strong><em><strong>More Than Code</strong></em></p><p><em>More Than Code</em> is the book I was working on when the pandemic struck in March 2020. It&#8217;s loosely based on a workshop I ran at the European Perl Conference in Glasgow in 2018. The workshop was called <a href="https://act.perlconference.org/tpc-2018-glasgow//talk/7241">&#8220;The Professional Programmer&#8221;</a> and the idea was to talk to programmers about the bits of their job that weren&#8217;t actually designing and writing code.</p><p>Over three or four hours we traced a route from very technical things like source code control, editors and databases past useful techniques like SCRUM and design patterns and ending on &#8220;fluffy&#8221; topics like building a career and personal branding. The attendees all seemed to enjoy it and find it useful and, over the rest of the conference, a couple of people approached me and suggested that I should think about doing more presentations along the same lines.</p><p>So that&#8217;s why it became my March 2020 project. I figured that if my small slice of the programming community found it useful, then maybe a book on the subject would be interesting to a far larger community (and, perhaps, people who were thinking about programming as a career).</p><p>The plan was to write 3,000 words a day. That would have got me most of the way to a book that I planned to sell through Amazon and other ebook services. I also thought that I could run seminars on the subject.</p><p>Of course, Covid stopped me from delivering on that plan. But I did get 18,000 words written before I ground to a halt. And, reviewing them over the last week, I see that most of them are pretty good words.</p><p><strong>Moving Forward</strong></p><p>I still think that More Than Code is a good idea, so it&#8217;s one of the projects that I&#8217;m going to be pressing on with over this year. Of course, at a basic level, the plan remains the same - write another 60,000 words or so on the subject. But I think there&#8217;s a bit more to it than that. And that&#8217;s what I was discussing with my friend on the way back from Dorset.</p><p>The big difference that contractors (like me) have to deal with when moving to a more entrepreneurial mindset is that it&#8217;s no longer about trading your time for money. Over the last twenty-five years, I&#8217;ve done pretty well at selling my time to many different companies. I turn up at their office for a day and sprinkle a little modern Perl magic over their codebase and they pay me some money. But that doesn&#8217;t scale. There are only a certain number of days in a year and there&#8217;s a limit to how much I can make by writing Perl for a day.</p><p>We need to think about moving to a model where we&#8217;re selling a product that doesn&#8217;t use up my time. Something that can be making money even when I&#8217;m asleep. The book is a good start in that direction. But only a massive optimist would suggest that a technical book could bring in as much income as a contractor does in a year.</p><p>My next thought was seminars. I can run public courses on the subject, or sell my services to a company and go in-house for a day, talking to their employees about their careers. But we&#8217;re back at trading time for money. I mean, yes, hopefully, my time would be more valuable in that scenario and I&#8217;d be able to charge quite a lot more for each day&#8217;s work. But I wouldn&#8217;t be working every day and, let&#8217;s face it, a seminar on technical careers isn&#8217;t going to sell out the Albert Hall.</p><p>So I think that&#8217;s a possibility. But it&#8217;s only really a stepping-stone to the next couple of ideas - selling videos and e-learning on the same subject.</p><p>Videos are the obvious next step. You can start by just recording a talk. But the problem with a video is the same as you get with a book - it&#8217;s very static. The first time you read a technical book, you might read it straight through. If it&#8217;s a useful book, you might later refer to particular sections when you have certain problems to solve. It&#8217;s not a very interactive way to learn.</p><p>But e-learning is better. With e-learning, you can change the route through the course depending on how the user is doing. They can choose their own way through the course. It&#8217;s far more interactive and, therefore, you find that more of the knowledge is retained by the student.</p><p>I also think that companies will pay more for e-learning. Whereas a company might buy two or three copies of a book for their technical library, you can sell them e-learning on a per-seat basis - and then they can make it available to everyone through their in-house learning portal.</p><p>Ultimately, I think I&#8217;ll end up with a hybrid strategy:</p><p>* Books sold through standard channels</p><p>* Seminars (both public and in-house)</p><p>* Videos of seminars</p><p>* E-learning</p><p>What do you think? Is this a service that you think you (or your company) might be interested in? What format would you want it in? Have I missed a useful format?</p><p>Of course, this all relies on me having the material ready. And that&#8217;s why the first order of business is to finish writing the book - which isn&#8217;t a trivial task!</p><p>More next week,</p><p>Dave&#8230;</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></p>]]></content:encoded></item><item><title><![CDATA[Week 52: The clock is ticking]]></title><description><![CDATA["I must stop procrastinating; I'll start tomorrow."]]></description><link>https://onething.davecross.co.uk/p/week-52-the-clock-is-ticking</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/week-52-the-clock-is-ticking</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Fri, 10 Sep 2021 06:50:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!JBot!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.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_!JBot!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg" width="1456" height="972" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:972,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:439461,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 424w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 848w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!JBot!,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%2F07eac133-3d28-492f-bd4c-ba46b58b767b_3000x2002.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"><svg role="img" 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"><g><title></title><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"><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"><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>It was my birthday earlier this week. It seems unlikely (to me, at least) but I was 59. Which means there&#8217;s only a year to go until I am 60.</p><p>I&#8217;ve never really been bothered about those big &#8220;round number&#8221; birthdays. I&#8217;ve sailed through 20, 30, 40 and even 50 without any worries at all. &#8220;Age is just a number,&#8221; I&#8217;d say when asked (or some equally pointless nonsense).</p><p>But 60 feels different. I can tell it&#8217;s going to feel <em>really </em>different by the way I&#8217;m already thinking about it when it&#8217;s a year away. At 60, it&#8217;s going to be difficult to persuade myself that I&#8217;m still actually pretty young. By 60 you&#8217;re not only supposed to know what you&#8217;re going to do with your life - you&#8217;re supposed to have done most of it.</p><p>And I have a year left to get to that point.</p><p>Hold that thought.</p><p>Those of you who have been following my work for a while now might remember my &#8220;<a href="https://davecross.co.uk/2020-vision/">2020 Vision</a>&#8221; project (or, more accurately, projects). I gave up my job and I planned to give myself six months to work on various ideas and see if any of them could be made into a sustainable business. I spent three months working on three different things with varying levels of success.</p><p>And then the pandemic hit.</p><p>I mean it didn&#8217;t hit me in any real, measurable fashion. I was already working from home, so my daily routine didn&#8217;t change. I was planning to live off my savings for six months, so I didn&#8217;t need to get involved in any of the government financial schemes for business owners. There was no reason for anything to change.</p><p>But everything changed.</p><p>I completely lost my focus. March&#8217;s project was to write a book. But I didn&#8217;t get a quarter of the way into it. My concentration was shot to pieces. I was spending too much of my diminishing mental energy worrying about infection rates and government briefings.</p><p>The second half of the year is a bit of a haze. I ended up taking on a contract for the last three months of the year - remote working of course. But as the end of the year approached I was adamant that I was going to have another try at building a business in 2021. So I ended my contract and started 2021 in pretty much the same position as I had started 2020 (except with a global pandemic raging in the background).</p><p>2021 didn&#8217;t start well. I was completely unfocused. I dabbled with a few things. I made tweaks to a lot of websites that I run. I released updated versions of most of the Perl libraries that I maintain.</p><p>I didn&#8217;t make any money.</p><p>Then an old client got in touch offering some work maintaining a codebase that I used to work on. I asked if they would consider a part-time contract and they said yes. So that&#8217;s where I am right now. I work two days a week for my client and the rest of the week is free for me to do what I want. And the contract brings in enough money for me to live on so I&#8217;m no longer burning through my savings. It&#8217;s all working out rather well.</p><p>Except, that I&#8217;m still not making much progress on my own projects. I needed something to push me into getting on with building a business.</p><p>And that&#8217;s where the 59th birthday scare comes in. I now have a deadline. I want to achieve something - have some kind of business going - by my next birthday.</p><p>So that&#8217;s the plan. I&#8217;ll spend two days a week working for my client and three days a week getting back to some of the projects I wanted to work on last year. Initially, I plan to finish the book and work on a project management tool that I&#8217;ve been building with a potential business partner - more about both of those projects in forthcoming emails.</p><p>And, in order, to keep myself on track, I want to share my progress with you. I&#8217;m going to send out a weekly update to this mailing list every week. Hopefully, the thought of having to tell people what I&#8217;ve achieved each week will mean I&#8217;m driven to actually achieve something.</p><p>Oh, and notice that the title for this piece is &#8220;Week 52&#8221;? That&#8217;s another little piece of psychological trickery. I&#8217;m giving myself a countdown to my 60th birthday; a target to aim at.</p><p>If you&#8217;re already subscribed to my mailing list, I hope you&#8217;ll find this slight realignment of it interesting. If you&#8217;re not already subscribed, I hope you&#8217;ll consider subscribing in order to keep up to date with what I&#8217;m doing.</p><p>See you next week.</p><p>Dave&#8230;</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>]]></content:encoded></item><item><title><![CDATA[The story of eBooks and me]]></title><description><![CDATA[By day, a mild-mannered software developer but by night, an international publishing magnate. Read on to hear the origins of Clapham Technical Press.]]></description><link>https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me</link><guid isPermaLink="false">https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me</guid><dc:creator><![CDATA[Dave Cross]]></dc:creator><pubDate>Wed, 23 Jun 2021 10:06:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!syTk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.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_!syTk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 424w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 848w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 1272w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png" width="652" height="307" data-attrs="{&quot;src&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:652,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31850,&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_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 424w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 848w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.png 1272w, https://substackcdn.com/image/fetch/$s_!syTk!,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%2F5c54c901-1dc4-4543-a6e4-4d86f318b772_652x307.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"><svg role="img" 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"><g><title></title><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"><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"><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;ve been interested in eBooks for several years. Back in 2014, at the London Perl Workshop, I announced that I would be writing a book on Modern Web Development Techniques that would be available by the 2015 workshop. That book never happened, and one of the reasons for that was that I got lost down a massive rabbit hole while researching the best way to publish an eBook.</p><p>After a few false starts, I developed the pipeline that I still use today for publishing eBooks. I knew I wanted to store the text in a non-proprietary format - one that I could use all Unix&#8217;s text manipulation tools on; one that could be easily stored in a standard source code control system. I write in Markdown and I produce output in ePub, Mobi and PDF.</p><p>I gave <a href="https://www.slideshare.net/davorg/conference-driven-publishing-56093858">a talk about my pipeline</a> (called &#8220;Conference Driven Publishing&#8221;) at a few conferences in 2015 - including at that year&#8217;s London Perl Workshop, where I apologised for not writing the book I promised the previous year. In August, I wrote a blog post <a href="https://blog.dave.org.uk/2015/08/writing-books-the-easy-bit.html">describing my process in more detail</a> and in November, I used the pipeline to publish my first eBook - a collection of old blog posts called <em><a href="https://www.amazon.co.uk/Eighteen-Classic-Albums-Dave-Cross-ebook/dp/B017KUM88Y">Eighteen Classic Albums</a></em>.</p><p>In 2016, I adapted my talk to a less Perl-centric audience and gave the new version (renamed to <a href="https://www.slideshare.net/davorg/writing-books-the-easy-bit">&#8220;Writing Books (The Easy Bit)&#8221;</a>) at the spring FLOSS UK conference in London. A few people seemed interested in what I was doing and I started to toy with the idea of publishing an eBook about publishing eBooks (a project that I have started, but am yet to finish).</p><p>I had been wondering what my next eBook would be but in 2017, a perfect opportunity presented itself. A beginners Perl tutorial that I had written for Udemy fell out of favour and found itself in a derelict section of their site where broken CSS made it pretty much unusable. When I contacted them about it, they said they had no plans to fix it but that I was welcome to republish it myself. So I decided to do that.</p><p>Turning the course into a (brief) eBook was easy - I was getting pretty used to my pipeline by that time. But I decided that I would take this a step further and make it the first book in a series of books about Perl. Five years earlier, I had used the Perl School branding for a series of training courses and I decided to <a href="https://perlhacks.com/2017/12/regenerating-perl-school/">reuse that brand</a> for my new series of books. <em><a href="https://perlschool.com/books/perl-taster/">Perl Taster</a></em> soon became the first book in the series and I gave a talk at the next London Perl Workshop introducing the brand and inviting other people to write for the series.</p><p>John Davies spoke to me after my talk and proposed a book on using Selenium with Perl (based on a talk he had given at the workshop). A few months later, <em><a href="https://perlschool.com/books/selenium-perl/">Selenium &amp; Perl</a></em> became the second Perl School book and it began to look like we&#8217;d really need <a href="https://perlschool.com/">a website</a>.</p><p>So we had a brand. And the brand got quite a boost when well-known Perl author brian d foy got in touch with me and asked if he could publish some eBooks through Perl School. I obviously leapt at the chance and we have now published four of brian&#8217;s books. Along with another book each by John Davies and me, that brings <a href="https://perlschool.com/books/">Perl School&#8217;s current catalogue</a> to a total of eight books. I was <a href="https://www.perl.com/article/perl-hacks-perl-school-and-the-future-of-perl-publishing/">interviewed by brian for perl.com</a> about the ideas behind Perl School. We also started making some of our <a href="https://leanpub.com/u/briandfoy">books available</a> <a href="https://leanpub.com/u/davorg">through LeanPub</a>. Outside of Perl School, I helped a friend publish her <a href="https://www.amazon.co.uk/dp/B086PB2X8F/">chick-lit novel</a>.</p><p>And that&#8217;s the story so far. I&#8217;ve written and published a number of eBooks on both Amazon and LeanPub and I&#8217;ve helped a few other people do the same thing.</p><p>But that&#8217;s not where it ends. Perl programming is a pretty niche market and the Perl School books aren&#8217;t exactly selling in large numbers. So it&#8217;s time for the next stage of the plan. I&#8217;m going to take the lessons I&#8217;ve learned from the last six years and apply them to a larger marketplace. For that purpose, I&#8217;ve set up <a href="https://claphamtechpress.com/">Clapham Technical Press</a> - a service that will do what Perl School does for Perl authors, but for people writing about any technologies. If you want to know a bit more about the mechanics of publishing eBooks, then please get in touch. If you want help turning your ideas into an eBook, then please get in touch. If you want someone to handle uploading your eBook to various platforms for you, then please get in touch.</p><p>We&#8217;re at <a href="mailto:hello@claphamtechpress.com">hello@claphamtechpress.com</a> and we&#8217;d love to help you get your knowledge out into the world.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://onething.davecross.co.uk/p/the-story-of-ebooks-and-me/comments"><span>Leave a comment</span></a></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>]]></content:encoded></item></channel></rss>