<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" 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">
    <channel>
        <title>darbs.co</title>
        <link>https://darbs.co/</link>
        <description>Personal blog by Alex Darby — writing about software engineering, tech leadership, photography, and the web.</description>
        <lastBuildDate>Tue, 21 Apr 2026 21:29:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-GB</language>
        <copyright>CC BY-NC-SA 4.0 2021 © Alex Darby</copyright>
        <atom:link href="https://darbs.co/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Microblog 10-03-26]]></title>
            <link>https://darbs.co/post/2026-03-10/</link>
            <guid>https://darbs.co/post/2026-03-10/</guid>
            <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Just a little one.]]></description>
            <content:encoded><![CDATA[<p>Working on brushing off a lot of the winter dust at the moment. The breaks I've had over the last few months have been absolutely key.</p>
<p>I'm still mountain biking, I'm still gaming, and now I'm dancing. MAybe more to follow on this later.</p>
<p>I have been working on a lot of projects. Access to agentic code agents has gone a little off the rails for me over the last few weeks but I thought I'd like them all here in case any are of interest...</p>
<ul>
<li><a href="https://tanked.uk/">Tanked.uk</a> - A site inspired by a friend's work on the UK Gov fuel prices API.</li>
<li><a href="https://stale.cc/">Stale.cc</a> - A tool for re-discovering games in your Steam library you already own and might enjoy.</li>
<li><a href="https://nexttrainto.com/">NextTrainTo</a> - A focused site scoped to finding the next train from a to b.</li>
</ul>
<p>Various other things. I'm enjoying building things, which is delightful.</p>
<p>Alex.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Cozy World of Warcraft]]></title>
            <link>https://darbs.co/post/cozy-world-of-warcraft/</link>
            <guid>https://darbs.co/post/cozy-world-of-warcraft/</guid>
            <pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Taking a deep breath to smell the Peacebloom.]]></description>
            <content:encoded><![CDATA[<p>I've played a lot of World of Warcraft. I began playing in 2006 during the latter stages of the first iteration of the game. When I started playing, so did the rest of my student house. I can't remember who initiated the move, but we were all hooked, and I was hooked the most. There were about 6 million other players of the game at the time, which would peak at an astonishing 12 million during the Wrath of the Lich King era in 2008.</p>
<p>A typical day in the house would begin mid morning at some point, likely 10 - 11 am.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Microblog 23-11-25]]></title>
            <link>https://darbs.co/post/2025-11-23/</link>
            <guid>https://darbs.co/post/2025-11-23/</guid>
            <pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Just a little one.]]></description>
            <content:encoded><![CDATA[<p>I'd like to try and get more consistent about posts to this thing, recognising its been several months since my last post.</p>
<p>Its funny looking back at some of the topics and posts I've made. Design was an interesting thing. Since posting the topic it seems I capitulated to my usual approach to these things and didn't continue with it.</p>
<p>I was dangerously close to redeveloping the blog all together today, but the more I re-familiarise myself with the functionality, its still doing exactly what I wanted it to. Astro is a very powerful tool and I'm very happy with the development flow.</p>
<p>OK, so here are a few things I've been interested in since I last posted...</p>
<ul>
<li><a href="https://cyberspace.online/">Cyberspace.online</a> - A delightfully retro, theme-able, and engaging forum and chatroom. Come and say hello.</li>
<li>LLM dancing, as with everyone else I seem to be frolicking between all the major providers, most recently I've had some success investigating Gemini 3 and using the Antigravity dev tools.</li>
<li>Warhammer! - I've actually been assembling and painting some Warhammer which has been a delight. Its nice to make progress with such things. Worthy of a post.</li>
</ul>
<p>This has been nice. I'll endeavour to check in more often.</p>
<p>Alex.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Across The Obelisk... Fast]]></title>
            <link>https://darbs.co/post/2025-02-23/</link>
            <guid>https://darbs.co/post/2025-02-23/</guid>
            <pubDate>Sun, 23 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Finding new ways of extending a much loved game.]]></description>
            <content:encoded><![CDATA[<p>My friend group has played <a href="https://www.paradoxinteractive.com/games/across-the-obelisk/about">Across The Obelisk</a> a lot. We tend to gravitate towards it much more frequently over the last few years as apettites for more intense games has deminished. We've enjoyed the game a great deal and have by no means reached the limits of the game's difficulty.</p>
<p>We had already been playing the game in a sort of 'random draft' mode. We'd each roll a random character and keep the choice whenever the right type of character appeared. For me this is any of the healers. Already this had proven a real challenge and getting mismatching compositions to work together often had some unexpected results.</p>
<p>The next element to add was a time limit on running through a whole draft run. Two hours. Now this really kicked things into a new gear. We'd often find we were semi-afk during a run and only paying minimal attention to what was going on. This changed things a lot. Now, each turn was a challenge of only playing the most vital cards. Time to kill is now more important than ever as the run may just time out if the team don't have enough firepower. This built up to the point during the final boss fight, were two of us were skipping our turns alltogether, in a last ditch attempt to get over the line in time.</p>
<p>We finished the last run with an incredible four seconds to spare!</p>
<p>I can't recommend this enough if you are keen to add a new sense of urgency to the game. Wonderful.</p>
<p><img src="obelisk.png" alt="4 seconds!" /></p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Design - Part One]]></title>
            <link>https://darbs.co/post/design-part-one/</link>
            <guid>https://darbs.co/post/design-part-one/</guid>
            <pubDate>Sun, 26 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A self-directed exploration of design.]]></description>
            <content:encoded><![CDATA[<p>I've always been interested in design. Believe it or not from the evidence of my personal site. I'm claiming for the time being that it is more important for me to be able to publish things first, and for the design to be engaging second.</p>
<p>I want to make more of a formal personal study of design. From every angle. I like UI/UX, print design, typography, product design, everything. I want to understand the underlying principles and philosophies. I'd like to create a set of mental models to help with my understanding of design and I'd also like to have applied this learning to practical projects.</p>
<p>I'm not starting from zero. Many years ago I did a few bits and pieces of graphic design to aid with photography shows I was taking part in. We would need posters and flyers created to promote events and I would create something on Photoshop to serve this purpose.</p>
<p>Photoshop is very familiar to me. We used it extensively in the photo lab to do a wide range of jobs, colour correcting and restoring damaged images, laying out photos for large format printing, as well as some light design work here and there.</p>
<p>Assumptions:</p>
<ul>
<li>I know nothing about design principles, models, or processes.</li>
<li>I will get very distracted by buying books and materials instead of actually studying or practising.</li>
<li>I'll be more interested in UI/UX work than traditional graphic design or typography.</li>
<li>This post may not get a 'part two'.</li>
</ul>
<p>There are two books I have which are will hopefully help me make a good start with all this:</p>
<ol>
<li>Know Your Onions - Drew de Soto</li>
<li>Graphic Design School - David Dabner, Sandra Stewart, Abbie Vickress</li>
</ol>
<p>The first book had numerous good references from a post on Reddit and the second looked good as I was browsing Waterstones for the first. I have not expectations of either.</p>
<p>I'll also be trying to immerse myself in some YouTube and TikTok content to round out my experience. I'll try and collect a range of creators across all design topics for a well rounded view.</p>
<p>That's all for now. Its been interesting so far. I'll post further the deeper I get into things.</p>
<p>Alex.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Cardiff Dev]]></title>
            <link>https://darbs.co/post/cardiff-dev/</link>
            <guid>https://darbs.co/post/cardiff-dev/</guid>
            <pubDate>Sun, 17 Nov 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Doing something social for once.]]></description>
            <content:encoded><![CDATA[<h1><a href="https://discord.gg/83xdnFmHPd">https://discord.gg/83xdnFmHPd</a></h1>
<p>I don't know whats gotten to me over the last few weeks. I think something about hitting a certain unwanted age milestone has made me want to be a bit more active in building some kind of community. I largely blame this on the fantastic Stripe Press book <a href="https://press.stripe.com/get-together">Get Together</a>. Frankly the majority of the Stripe Press collection is lovely and inspiring.</p>
<p>Unsure how this will pan out but I think ideas are worth trying before you write them off, rather than the other way around.</p>
<p>Ultimately there is no endgame for this space. I think I'd just like a place for people to be able to hang out and meet others in the local tech community, to be able to speak to someone they may be able to meet face-to-face who they can start a project with, get advice from, or figure out why the heel they can't center that div...</p>
<p>Lets see how this goes.</p>
<p>Alex.</p>
<p><a href="http://cardiff.dev">https://cardiff.dev</a></p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Hooves]]></title>
            <link>https://darbs.co/post/hooves/</link>
            <guid>https://darbs.co/post/hooves/</guid>
            <pubDate>Sat, 26 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[A 250 word story challenge.]]></description>
            <content:encoded><![CDATA[<p>Light streamed into the kitchen. Autumn was turning to winter but the low morning sun still carried some warmth into the room and across Miles' face.</p>
<p>Miles lay on the kitchen floor. Very unwelcome memories of the last few days came flooding in all at once.</p>
<p>He was not well. He ached all over and his back was agony. Strange body hair had erupted all over his skin. Miles had been hairy all his life, but this was different. It was everywhere, covering every patch of skin. His head felt so heavy and he could barely hold it up. His clothes were in shreds everywhere.</p>
<p>Gradually his eyes opened, letting in the devastation of last night. Empty beer cans. He couldn't drown what was happening, try as he might.</p>
<p>His frying pan was in the wall. pinning Dahlia's framed gold record in place.</p>
<p>Rage pierced through his hangover, through the gnawing pain that seemed to engulf his body. How could she do this to him? that ungrateful bitch. That talent-less urchin. He had made her life possible and now this?</p>
<p>He moved his limbs which cried out as blood began rushing back. He tried rub his eyes, but they weren't hands any more. Just hooves.</p>
<p>Miles cried out, but it was all changing so fast. He heard a neigh.</p>
<p>looked up and saw the unmistakable shape painted roughly onto the glass of the kitchen door in dripping red paint. The horseshoe sigil was there.</p>
<p>It was her.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Station Eleven]]></title>
            <link>https://darbs.co/post/station-eleven/</link>
            <guid>https://darbs.co/post/station-eleven/</guid>
            <pubDate>Sun, 22 Sep 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Thoughts on the novel by Emily St. John Mandel]]></description>
            <content:encoded><![CDATA[<p>I've read and consumed a fair share of stories with a post-apocalyptic theme and I find something highly compelling about them. An excuse to lean into some terrible what-if thought experiments about the various collapses of civilisation. How moral and ethical boundaries are redrawn in the face of extreme change and hardship.</p>
<p>The elements I most enjoyed while reading Station Eleven were the emphasis on a particular characters life before and after the collapse. How each of the characters have been touched by this person's life and how their lives interact after the collapse as a result.</p>
<p>There were a great many scenes which leave a lot to the imagination, sometimes to dreadful effect.</p>
<p>I think overall and without spoiling the story, I'd highly recommend this book if you are looking for something relatable, human, curious, beautifully written, and at times challenging.</p>
<p>I haven't seen the series but I enjoyed the book a lot.</p>
<p>That's all for now.</p>
<ul>
<li>Alex.</li>
</ul>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[New Site ...Again]]></title>
            <link>https://darbs.co/post/2024-08-19/</link>
            <guid>https://darbs.co/post/2024-08-19/</guid>
            <pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[time for something new]]></description>
            <content:encoded><![CDATA[<p>I just can't leave things well enough alone. This page is now a NextJS app.</p>
<p>I like the developer experience and I suppose I can't avoid Javascript/Typescrypt forever. Frontend is fun and the NextJS intro project is very straightforward with some important and useful concepts.</p>
<p>The most important thing for me with this page is that it be a low friction way for me to deliver my scattergun thoughts and projects onto the web.</p>
<p>Cheers,</p>
<p>Alex.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[New Site]]></title>
            <link>https://darbs.co/post/2024-06-09/</link>
            <guid>https://darbs.co/post/2024-06-09/</guid>
            <pubDate>Sun, 09 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[time for something new]]></description>
            <content:encoded><![CDATA[<p>Well, this is the new site. I don't want to spend very long nudging pixels around the screen. There was nothing wrong whatsoever with the old site, I just wanted something new that I had built from scratch and have complete control over. Feel comfortable updating etc. etc.</p>
<p>So here we are, I hope it changes often. It will if I'm in a tinkering mood. The site consists mostly of a Flask backend which renders the existing markdown files. Not perfectly I must add, some of the older technical posts are not 100% rendering correctly. WIP. I'm using a classless CSS framework I quite like called <a href="https://github.com/oxalorg/sakura">Sakura</a> with some custom styling here and there. I wanted something very simple with a little flare and personality, but not a distraction from a more photography-focussed future.</p>
<p>I think that's what I'm hoping for in general, a more photography-focussed future.</p>
<p>As long as you can see this its good enough. I've been shooting more so I'm hoping to get everything posted here instead of just on socials.</p>
<p>Cheers,</p>
<p>Alex.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2024-04-15/</link>
            <guid>https://darbs.co/post/2024-04-15/</guid>
            <pubDate>Sun, 24 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>I've failed to update this site so many times over the last few months. This post has been renamed many times with various intended posting dates. I have no idea why.</p>
<p>I've rediscovered Cal Newport recently. By which I mean I have been enjoying 'Slow Productivity'. Its a very realistic approach to getting things done and something of an antidote to the cult of productivity. It reminds me of Oliver Burkeman's excellent 'Four Thousand Weeks'. It doesn't treat the reader like a machine.</p>
<p>Newport describes something which really resonated with me to do with working on less but caring more about quality. In the windows where I do feel 'productive' -- few and far between though they are -- I am often flitting ineffectually between tasks and projects and not actually delivering much of anything. There is definitely something to be said for practising concentration and having a mindset of finishing quality projects. I wish I had a keener eye for detail in this regard.</p>
<p>Cultivating discipline is something I often hear in the pages of the professionally successful. I'm loathed to admit that when I have been able to be firm with my petulant, reactionary brain and force it to do something it knows is good for it, I have noticed positive results. When I have managed to go for a regular run, walk to new places, or be more sociable. These are all things that help keep The Overthinking Machine at bay.</p>
<p>In the spirit of this shift in focus from doing a lot of things with low quality and erratic results I'm going to try and focus on getting just one good piece of work done per day. To have that thing be done to a decent standard, to not get distracted by something more attractive, and to have something finished at the end. doing five good pieces of work per week sounds like a very respectable rate. Its something to try at least.</p>
<p>I'm still really enjoying using Go for web projects at the moment. Its a very pleasant and productive language to use with good documentation. Its nice to make things, especially if they are very specific to you.</p>
<p>In the interests of getting something out I'm going to stop there.</p>
<p>That's all for now.</p>
<p>Alex</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2024-02-10/</link>
            <guid>https://darbs.co/post/2024-02-10/</guid>
            <pubDate>Sat, 10 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>OK, its been a while and we are getting things back on track. The last few weeks have been fairly dev centric. I've taken a shine to the simplicity and power of web projects powered by htmx and Go. The most excellent <a href="https://github.com/quii/learn-go-with-tests">Learn Go With Tests</a> has been an important part of that process. It has a strict TDD approach which is something I've been aware of but never fully appreciated the strength of the approach. Red, Green, Refactor, etc.</p>
<p>In addition to this I've loved every edition of <a href="https://blog.pragmaticengineer.com/">The Pragmatic Engineer</a> that I've read so far. Its sparked some interesting conversations and ideas at work and the documents section (subscriber only) has some fantastic starter template documents on topics such as on-call compensation, planning re-orgs, and project updates.</p>
<p>I've just added <a href="https://console.dev">Console</a> to my list of newsletters and the first has been interesting. In addition to the swathe of dot-dev projects, I've also set up <a href="https://daily.dev">daily.dev</a> which is a custom feed of articles within the tech space, delivered as a browser plugin.</p>
<p>There should be more Go content on here. I'm enjoying it a lot.</p>
<p>That's all for now.</p>
<p>Alex</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-12-11/</link>
            <guid>https://darbs.co/post/2023-12-11/</guid>
            <pubDate>Mon, 11 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>There haven't been many things I've seen this year that have been better than the <a href="https://youtu.be/VGhcSupkNs8?si=ZfVkIaPnGtcZT4IS">Jeff Bezos Rowing Boat</a>. There isn't much else to say.</p>
<p>One thing that might come close is the wonderful <a href="https://youtu.be/ZjlYFWLUDBQ?si=XqNCwlzfXa46J4fK">Tom Cardy</a>. This video I watched every day for a significant length of time. It has been singular in inspiring me to give D&amp;D a go.</p>
<p>I've been massively enjoying the new <a href="https://www.amazon.co.uk/Creative-Act-Way-Being/dp/1838858636">Rick Rubin</a> book. While it has a bit of a style to it that might not appeal to some, for me it touches on some really important concepts in a way that is direct, eloquent, and imaginative. I'm back on here doing this, so you partly have Rick to thank for that.</p>
<p>That's all for now.</p>
<p>Alex</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Using an Open Drop-In Call for Homeworking Teams]]></title>
            <link>https://darbs.co/post/dev-open-group-call/</link>
            <guid>https://darbs.co/post/dev-open-group-call/</guid>
            <pubDate>Fri, 25 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Thoughts about using an open drop-in call for homeworking development teams.]]></description>
            <content:encoded><![CDATA[<p>Over the course of the pandemic and the elevated reliance on remote working, it became clear to me that I was struggling with a part of office work that I hadn't even considered. In the first few weeks as we were all restricted to our homes, I was all onboard with the new remote setup. I liked the 30 second commute from my bed to work, I liked the new informality of the work environment, and it almost felt as though work had shed some of the corporate office atmosphere that had never really sat well with me.</p>
<p>In time, I began to struggle. While the benefits of remote working were clear, there were some subtleties that I had never considered that made things complicated. Its not easy as a team lead to get a 'read of the room' in a remote environment and even worse, it seemed as though every interaction or call with my team necessarily felt like a meeting, and not an informal question, or quick word to the side so as not to distract someone. I'd never noticed but there was always a key moment after an office meeting where everyone is making their way back to their desks and important informal comments are made, if nothing else but to clear the air, or diffuse any subtle tension that has built up as part of a lengthy planning session.</p>
<p>It was also clear that I was feeling increasingly isolated from both the rest of my team, as well as my peer group. Interactions were confined to semi-formal meetings or individual calls and there was virtually no unstructured social time. We had all the usual early pandemic company-wide call stuff going on, virtual escape rooms etc., however nice these may have been the piece that was missing was the rest of the working day. The time spent in the same environment as people you are working with, and importantly there were no opportunities to have chats with people outside the normal pool of people you work with.</p>
<p>In order to address this, our team began running an open call within a Teams channel. It is typical every day for all of the development team to be on this call at some point. There is no need for people to speak, turn their cameras on or interact with others if they don't wish to. What this does enable though, is a version of an open office environment where people can ask each other for help with people in the room. It allows bystanders to cast an eye over whats being shared and understand any issues that are being worked through. People just start by sharing their screen of Visual Studio and ask the question, and the majority of the time they get the help they need.</p>
<p>Additionally, as this call is happening in a public channel, it also allows anyone else in the business to drop in and ask a question. This means we can quickly field queries from the Support team, ask for someone from Product to drop in to rubber-stamp some work, or provide context or feedback, and generally be available to the business and not locked away behind processes of inquiry and ticket creation.</p>
<p>There are occasions where two people are having a lengthy pair-programming session who elect to peel off into a separate call, or a proper meeting is created based off of an off-the-cuff discussion. This is all possible and doesn't need to consume the group's attention.</p>
<p>I will make a concession that this works incredibly well for a small team, within a relatively small business. I'm keen to understand how this will scale in the future. If these calls will become unwieldy or be dominated by a particularly outspoken individual. If the team are inundated by queries and requests from people keen to circumvent whatever light priority process is in place for addressing their concerns within the context of the business at large. These are all things to watch closely and not let get out of hand. These calls would be missed if they became unmanageable.</p>
<p>The biggest benefits of using group calls is we maintain a very lightweight and agile approach based on conversation over process, we are social and available to the business while also being able to duck out and focus on the task at hand where necessary. I'm hoping we can keep them alive as things grow and change.</p>
<p>Final thoughts.</p>
<ul>
<li>This approach enables conversation instead of process for distributed teams.</li>
<li>The team are available and accessible to the business, within reason. This is not a method to bypass Product priorities.</li>
<li>No obligation for team members to join the call if focus time is required, though the majority do.</li>
<li>As the team scales, there will be a need to encourage short-lived breakout groups.</li>
<li>Provides vital informal social time.</li>
</ul>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-08-23/</link>
            <guid>https://darbs.co/post/2023-08-23/</guid>
            <pubDate>Wed, 23 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Long time, no thing. As they say. You may sense a theme from these links.</p>
<p>I've been watching a lot of simple YouTube stuff. And I don't mean that as a slight, there is absolutely a place for this kind of content. Firstly I've enjoyed magnet fishing with the illustrious <a href="https://www.youtube.com/@BondiTreasureHunter">Bondi Treasure Hunter</a>. The simple pleasure this man takes from dredging rusty crap out of rivers and canals is really infectious. At a very complex time, he has a fantastic attitude of including bystanders and other people in the fun. Would recommend.</p>
<p>There is something I find quite calming about <a href="https://www.youtube.com/@gemmawheeler">Gemma Wheeler Architecture</a>. I don't have the means or will to consider a project like the ones showcased on her channel, but I find something about her method of repurposing, and redesigning otherwise abandoned and unloved buildings refreshing.</p>
<p>I'm not entirely sure what I feel about the prevalence of Stoicism, especially in the cult-of-productivity landscape I seem to be bombarded by. That being said, I really like some of <a href="https://www.youtube.com/@DailyStoic">Daily Stoic - Ryan Holiday</a>. In particular there are elements of what is said about getting through difficult times, shaping your own narrative, and the importance of journaling which I find really helpful. I mostly enjoyed reading his book 'The Obstacle Is The Way' and could do with another go on it right now.</p>
<p>I've never thought of myself as being a person who likes being around others for any great length of time. And, I'm not entirely sure that I am. That being said, I've come to enjoy milling around crowds. Especially when things are particularly challenging. It seems to have the effect of diminishing how I'm feeling about my own problems, or at the very least, disrupting the thought pattern for a short while.</p>
<p>This has been a good exercise to pair with reconnecting with street photography. I find this kind of photography a balance between having the discipline to be bold to get the picture I want, as well as being forced to be in the moment. To take in the world as its happening and understand the flow of what people are doing. To read whats going to happen or stop and wait for a shot to materialize. Its been good to focus on this as well.</p>
<p>Trying to keep running, working, and getting out of bed in the morning.</p>
<p>I think that's all for now.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-05-21/</link>
            <guid>https://darbs.co/post/2023-05-21/</guid>
            <pubDate>Sun, 21 May 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Just music today.</p>
<p><a href="https://www.youtube.com/watch?v=2nHWE1NnrA0">![IDLES - MTT 420 RR]</a></p>
<p><a href="https://www.youtube.com/watch?v=9Snn7iet5gY">![Queens Of The Stone Age - I Appear Missing]</a></p>
<p><a href="https://youtu.be/JAhywJkalUE?t=39">![Radiohead - Lotus Flour]</a></p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-04-22/</link>
            <guid>https://darbs.co/post/2023-04-22/</guid>
            <pubDate>Sat, 22 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Its been an interesting week. I kept thinking of putting together a dedicated post about this, but I just want to mention it for now, and I can put something more thoughtful together later, if it matters. As this article states, the first step to diminishing these kinds of thoughts is simple awareness.<a href="https://www.health.harvard.edu/blog/how-to-recognize-and-tame-your-cognitive-distortions-202205042738">Cognitive Distortions</a>.</p>
<p>Fuck microservices. Love The Primagean, and this <a href="https://www.youtube.com/watch?v=s-vJcOfrvi0">video</a> articulates, even at a Netflix engineering level why microservices are a mistake. Engineers are very distracted by the building of the thing. Ship working code. That is all that matters.</p>
<p>I really enjoyed this top comment on <a href="https://news.ycombinator.com/item?id=35658387">How to become a Designer who codes</a>. I think over time my interest in esoteric back-end stuff is fading away. The simpler an idea, or website can be communicated the better. This is the cutting edge of the thing you are building and simple interaction design to effectively reach people is the key.</p>
<p>I like remote working, but the longer it goes on, the more I miss being with people on a regular basis. I'm not flipping to camp in-office-only just yet, but I'm going to try and be somewhere public to work on a regular basis. So I'll be in the new <a href="https://www.google.com/maps/place/Wales+Millennium+Centre/@51.4648421,-3.3156183,12z/data=!3m1!5s0x486e033133936da9:0x125425d6e336cfb8!4m10!1m2!2m1!1swmc!3m6!1s0x486e0336fb9949d1:0xb21b216518da85c6!8m2!3d51.4648421!4d-3.">WMC</a> cafe most Thursdays. Come and say hello.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[IFTTT - Some Automation Ideas]]></title>
            <link>https://darbs.co/post/ifttt-ideas/</link>
            <guid>https://darbs.co/post/ifttt-ideas/</guid>
            <pubDate>Sun, 16 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Suggestions for the IFTTT team.]]></description>
            <content:encoded><![CDATA[<p>I've been testing out IFTTT (If This Then That) over the last couple of days to do some fairly run-of-the-mill automation. You know, trying to get posts on here out into the wild via RSS, instead of the arduous copy-and-paste of the same message to three places that I would do otherwise. I've enjoyed it so far, but I'm looking to extend the automation further to satisfy my needs and I have some requests for the IFTTT team to consider for future updates.</p>
<ul>
<li>If I've been scrolling through Netflix for more than fourteen seconds it should just play The Devil Wears Prada again and save me the remaining eight minutes where I try to muster the courage to watch something new.</li>
<li>If I bought beer during the day and my Spotify plays anything off "The Holy Bible" by the Manics in the evening, I want to add a reminder to my phone to buy Asprin and Rennies.</li>
<li>If my phone detects I'm in Cornwall I want it to emit a shrill unpleasant tone until I leave. At least as far as Bristol. It should be bad enough that others encourage me to leave as well.</li>
<li>As effective as the "my alarm goes off at 07:23 &gt; wife hits me &gt; I wake up" automation is, id like my phone to condition me in my sleep so that I hit myself instead to deprive her of the satisfaction.</li>
<li>If its Retro day at work I'd like it to buy me beer and queue up "The Holy Bible" by the Manics on Spotify.</li>
<li>If I've been for a run I'd like to prevent my phone from comparing the run I did that morning to one when I was younger and fitter.</li>
<li>If I hit the landing page of an unfamiliar programming language, I'd like it to close the page, block the site, and open my GitHub wall of unfinished project shame.</li>
</ul>
<p>More to follow.</p>
<p>P.S. Where is the Mastodon integration?</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-04-04/</link>
            <guid>https://darbs.co/post/2023-04-04/</guid>
            <pubDate>Tue, 04 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>I've had a rocky run of non-fiction books recently, since the excellent "Four Thousand Weeks" which I read towards the end of last year. As part of my research into the Rust programming language I was watching the excellent <a href="https://youtu.be/2hXNd6x9sZs">No Boilerplate - How to Learn Rust</a> and a book was mentioned that piqued my interest. Two books in fact. <a href="https://www.scotthyoung.com/blog/ultralearning/">Scott H. Young - Ultralearning</a>, an interesting approach to deep and immersive learning processes, and <a href="https://www.amazon.co.uk/Rust-Programming-Language-2nd-Klabnik/dp/1718503105">The Rust Programming Language</a>.</p>
<p>Ultralearning thus far (and I'm admittedly only 60 pages in or so) has been a very good read. Several elements of Scott H. Young's ideas gel well with my outlook. There is something satisfyingly rebellious about taking institutional learning and approaching it from an all-out immersive, practical and self-driven angle. From those who plunge themselves into learning a new language by refusing to speak English at all for three months, to Eric Barone, who learned the many-faceted skills needed to create games, and after years of work produced the phenomenally successful Stardew Valley, solo.</p>
<p>This book was partly the inspiration behind picking up 'The Rust Programming Language'. After only the first few pages I've already picked up some basics that I would have probably missed and given a good basis of understanding, while at the same time launching myself head first into creating some projects.</p>
<p>More than this, Ultralearning has planted a dangerous seed of stopping 'dabbling' in many different things and making a concerted, focused effort to overachieve at them.</p>
<p>Interesting.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[I'm Learning Rust Part 1: ChatGPT CLI App]]></title>
            <link>https://darbs.co/post/learning-rust-part-01-chatgpt-cli/</link>
            <guid>https://darbs.co/post/learning-rust-part-01-chatgpt-cli/</guid>
            <pubDate>Sat, 01 Apr 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Getting started learning Rust with a simple CLI app.]]></description>
            <content:encoded><![CDATA[<p>Quick intro, I'm learning Rust and I'll be doing it on here. My code will be ugly, and I'll try and share as much of the ugly stuff as I can as we go. I love having a simple, useful project to build as part of getting started with any new language, so I thought I'd make a CLI app to interact with the ChatGPT API and return its response to the terminal.</p>
<h2>Setup.</h2>
<p>The first thing we will need is Rust. Head over to <a href="https://rustup.rs/">Rustup</a> for instructions for your specific system. I'm writing this on OSX, so I need ro run the following command to get things going...</p>
<pre><code>$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
</code></pre>
<p>Once you have been through the simple setup prompts, ensure you either refresh your terminal session or use this command to set your environment path:</p>
<pre><code>$ source "$HOME/.cargo/env"
</code></pre>
<p>We should now be able to check everything is installed correctly by querying the version of Cargo the Rustup installation script has installed:</p>
<pre><code>$ cargo --version
cargo 1.68.2 (6feb7c9cf 2023-03-26)
</code></pre>
<p>Excellent, now we can use Cargo to create a starter project.</p>
<pre><code>$ cargo new my-chatgpt-app
     Created binary (application) `my-chatgpt-app` package
</code></pre>
<p>Cargo should have created a Rust starter project for us with the following structure:</p>
<pre><code>.
├── Cargo.toml
└── src
    └── main.rs
</code></pre>
<p>Lets test our project and environment have been created correctly.</p>
<pre><code>$ cargo run
Hello, World!
</code></pre>
<h2>Dependencies.</h2>
<p>Next, we'll need to configure some crates our app will need. Lets edit the Cargo.toml file and add these creates as dependencies.</p>
<p>Cargo.toml</p>
<pre><code>

[dependencies]
clap = { version = "4.0", features = ["derive"] }
chatgpt_rs = "1.1.0"
tokio = { version = "1.27.0", features = ["rt-multi-thread"] }
</code></pre>
<p>Clap is a widely used Command Line Argument Parser (CLAP) that our app will use to accept an API key, and the message we are forwarding to ChatGPT. chatgpt_rs is the crate I've chosen as our ChatGPT client, and chatgpt_rs uses tokio to enable non-blocking asyc calls to the API. Be mindful of the versions I've used here as they may well have different implementations in future.</p>
<h2>Code.</h2>
<p>Now we have our dependencies configured, we can start building our app in the 'src/main.rs' file.</p>
<p>Firstly we'll import the module components we're going to need.</p>
<pre><code>use chatgpt::prelude::*;
use chatgpt::types::CompletionResponse;
use clap::Parser;
</code></pre>
<p>Now we'll create a struct to handle the arguments we want to supply to our app. Keeping things simple we'll just take the ChatGPT API key and the message we are sending for now. This struct will make use of some of the attributes of the clap module, which we can assign using an attribute macro. Attribute macros (as I understand so far) are a shorthand way of applying traits to structs, enums, etc. from external libraries.</p>
<pre><code>use chatgpt::prelude::*;
use chatgpt::types::CompletionResponse;
use clap::Parser;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    #[arg(short, long)]
    key: String,

    #[arg(short, long)]
    message: String,
}
</code></pre>
<p>This will allow us to make use of some of the features of Clap, such as returning basic usage information to the user about what types of arguments our app accepts, or establishing that the struct properties are Clap command line arguments with both a short and long name.</p>
<p>Now for the main function of our app, we'll parse the values defined in the Args struct and use the key to instantiate a new ChatGPT client. We can then Query the client using the 'message' argument and output the response to the console.</p>
<pre><code>use chatgpt::prelude::*;
use chatgpt::types::CompletionResponse;
use clap::Parser;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    #[arg(short, long)]
    key: String,

    #[arg(short, long)]
    message: String,
}

#[tokio::main]
async fn main() -&gt; Result&lt;()&gt; {

    // Parsing the argument values 
    let args = Args::parse();

    // Getting the API key
    let key = args.key;

    // Getting the message
    let message = args.message;

    // Creating a new ChatGPT client
    let client = ChatGPT::new(key)?;

    // Sending a message and getting the completion
    let response: CompletionResponse = client
        .send_message(message)
        .await?;

    println!("Response: {}", response.message().content);
    Ok(())
}
</code></pre>
<p>Thats all we need for now. Lets test everything is working.</p>
<pre><code>$ cargo run -- --key {{ YOUR_CHATGPT_API_KEY }} --message "describe the Rust programming language in five words"
Error: BackendError { message: "You exceeded your current quota, please check your plan and billing details.", error_type: "insufficient_quota" }
</code></pre>
<p>Perfect. Now once we've upgraded to the paid version of the API we should be able to call it using our app. That's it for now. I've enjoyed getting to grips with Rust so far, the syntax is a little alien to me at the moment but the compiler is possibly the best I've ever used with very clear feedback.</p>
<p>Check out the whole project on <a href="https://github.com/AlexDarby/gpt">GitHub</a>.</p>
<p>From here we might want to consider how we could extend our project to securely store the API key locally. More to follow.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[How To Win Scrum]]></title>
            <link>https://darbs.co/post/how-to-win-scrum/</link>
            <guid>https://darbs.co/post/how-to-win-scrum/</guid>
            <pubDate>Mon, 27 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Navigating the murky waters of a modern agile process.]]></description>
            <content:encoded><![CDATA[<p>Right, for the most part, if you are reading this you have likely been doing Scrum wrong. It's not your fault, nobody is blaming you. After all, this is a blameless working environment right? Oh my sweet summer child, no. By assuming you are working in an innocent fairytale land of egalitarian free-flowing ideas, you have allowed your colleagues to gain a critical advantage over you. Never fear my vulnerable friend. With these simple steps, you will wrestle control of the situation back from your fellows and gorge yourself on the bounteous glory of becoming The Winner Of Scrum.</p>
<ol>
<li>The Winner Of Scrum is a mindset. Your colleagues will approach a discussion with flexibility and collaboration. You must remain steadfast in your resolve. Your agenda is solid granite. It is a mighty millstone with which you grind your opponents into submission. Every ceremony, standup, conversation, and discussion, is an opportunity for you to ensure everyone is aware of your views on Technical Debt, or espouse the virtues of the frontend framework du jour. The content of your views matters not. Only that they are yours. If the recipient of your views is not rolling their eyes the minute you start speaking, you have not pushed it far enough.</li>
<li>The Winner Of Scrum does not burden themselves with following the Scrum process, or any process for that matter. Processes are there to align others with your agenda or cause so much red tape that yours is the only way forward. Add more processes. Create meetings to discuss adding more processes. The more others are adhering to "The Process", the less time they have to question your motives. If people question your motives, suggest adding a process whereby questions can only be raised in written form.</li>
<li>Claim the overbearing process is the root of the problem to destabilise the team. Ideally, if you have a "Scrum Master" they should be a nervous wreck.</li>
<li>The Winner Of Scrum aligns themselves with less confident members of the team who can parrot your nonsense. If you have followed step 2 well enough, everyone else will be so confused and bogged down with admin and meetings that you will have achieved a majority.</li>
<li>The Winner Of Scrum is relentless in execution. Take every opportunity to implement "What you thought the User Story meant" instead of delivering the specified work. Cherry-pick work items on components you are opposed to and claim they are impossible to work with until extensively refactored. If you are forced to drop this work item and move on for any reason, ensure you introduce a vicious bug with the component. Something that will take an unnecessarily long time to resolve, even for a competent engineer. You have now aligned a competent engineer with your agenda.</li>
<li>The Winner OF Scrum does not allow meddling in the team from any outside influences. Stakeholders, managers, Product. You have carefully pruned your walled garden to get to this point and outsiders will ruin everything with their accountability and logic.</li>
<li>The Winner Of Scrum keeps speaking. You talk and talk. You do not stop talking. You talk over, through and beyond everyone else. Every moment of silence, hesitation, or question is an opportunity for you to talk, especially if that question was not directed at you. You carpet-bomb the discussion with your words. Even if they make less and less sense the more you talk. Everyone else will have stopped listening, they will just be able to remember the sound of your voice going around and around.</li>
<li>The Winner OF Scrum stays true to their cause. You should by now have established an environment so confused and mired in red tape that healthy discussion is impossible. However, you must remain vigilant. Your mind is a fortress and you cannot allow it to be changed by the well-meaning ideas of your co-workers. Distraction is key here. Sensing a conversation is getting out of hand? ... time to turn off some production services.</li>
</ol>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Optimal morning routine for the hyper-productive]]></title>
            <link>https://darbs.co/post/morning-routine/</link>
            <guid>https://darbs.co/post/morning-routine/</guid>
            <pubDate>Sat, 25 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Ensure you start your day for peak performance.]]></description>
            <content:encoded><![CDATA[<ol>
<li>Wake to the sound of your alarm going off for the fourth time. If you rub your temples hard enough, maybe the dream you were having will fall out of your head and become reality. Chew some aspirin to take the edge off your hangover and drink water until you feel slightly sick.</li>
<li>You listened to a podcast last night telling you its healthier to sleep with your phone charging in a different room. Naturally you fell asleep mid way through this podcast and have an imprint of your phone in the middle of your back. Proceed to doomscroll your phone until you have established a baseline level of anger and disgust for the day.</li>
<li>You managed to set out your running clothes last night because you read somewhere that it helps motivate you to run in the morning. Put everything on, except your socks. You cant run in these socks, what the hell were you thinking last night? search your house for the right pair of socks, this should take at least 60% of the time you had allocated to get a run in. Eventually go for a run, feeling as though you have checked off an item from your daily routine in a way that makes you think about being younger and healthier. Ensure you prove to yourself you can still run fast by pushing yourself too hard and incurring a subtle injury that prevents you from running for the next six weeks.</li>
<li>You are home, put the coffee on and take a shower, prodding the parts of yourself you are most unhappy with.</li>
<li>Brush teeth.</li>
<li>Dress and prepare for work. Review your "todo" list from yesterday. Your day should revolve largely around the organization of your "todo" list. Under no circumstances should you complete more items from your "todo" list than you add. Review your calendar for the day which consists largely of meetings that are an opportunity for someone to speak at you in a way that would have been better served an email, but allows that person to look you in the eyes when they passive-aggressively call you out.</li>
<li>At 10:32 someone will say something in jest that you feel especially insecure about. Ensure you fixate on this comment for the next few years. While intended as a witty, throw-away comment, this remark now joins the infernal catalogue embarrassment and doubt that plague your every waking moment. Like poisoned barbs, to attempt to remove them only drives them in deeper. This disrupts your productivity further. You are now wishing for the arrival of 5:14pm where for six minutes and a drink and a half's time, you feel as though you have a solid grasp on the core of your "problem" and are willing and capable of executing it.</li>
<li>You are now ready for your day.</li>
</ol>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[ChatGPT Initial Thoughts]]></title>
            <link>https://darbs.co/post/chatgpt-initial-thoughts/</link>
            <guid>https://darbs.co/post/chatgpt-initial-thoughts/</guid>
            <pubDate>Mon, 20 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[My first few weeks using ChatGPT for technical learning.]]></description>
            <content:encoded><![CDATA[<p>I’ve found my first few weeks of using ChatGPT to support some learning and personal projects absolutely fascinating. I have, in typical fashion, pivoted around a lot in terms of technical learning and honestly, ChatGPT has been another important resource to help things along the way. I’ve been working on a Rails app, which I decided to migrate to Phoenix, I’ve redone my personal site, introducing some more Vue components to the VitePress core, and lastly I’ve been working on some C# for a work tooling project.</p>
<p>I’m evenly inexperienced with each of the technologies I picked up and I found some were distinctly easier to get up and running than others. Now, these inconsistencies are likely a symptom of my own learning preferences, or the familiarity of the format of the language. Long story short I found the C# to be the easiest to pick up along side ChatGPT. There could also be a factor of widespread documentation for this language compared to others, and that the more widely used ChatGPT models; 3.5 and 4 were trained on data up to June 2021 and August 2022 respectively.</p>
<p>I’ve had the most success with using a combination of ChatGPT, as well as official documentation. In my case I was using the official Azure DevOps client libraries, which are reasonably well documented and have a wealth of examples. I can’t emphasise enough that when ChatGPT got me lost, it was a combination of referring to code examples and StackOverflow that got me past it.</p>
<p>Having a threaded conversation with ChatGPT was one of the biggest boons. Being able to ask the chat to repeat itself, give explanations using analogies, and ask it to review my code and provide feedback was essential. Asking to implement solutions in an idiomatic way certainly pushed me to understand the approach of the language on a deeper level. This was key, for example for understanding the utility of interfaces and wrapper classes in C# when dealing with external dependencies.</p>
<p>While I used ChatGPT to get me up and running with unit testing, something I want to push it further on for my project is a good approach to integration/acceptance testing. Overall ChatGPT was keen to use the Moq library to create mock external endpoints, which, again was very useful.</p>
<p>There were instances were it would get itself stuck in a sort of loop, recommending I revert a change to something that I knew was previously also causing an error. I found that rephrasing the question did nothing to get it unstuck and eventually it was the official example code repo that got me unstuck. Additionally, when I was working with Rails, ChatGPT consistently tried to get me to use variable names that transpired to be protected keywords in that language.</p>
<p>ChatGPT is an immensely powerful tool which lends itself especially well to supporting programming projects, with clear deterministic outcomes. Be wary of pasting in security keys, and taking its code recommendations on face value.</p>
<p>It will not make you a programmer, but it certainly is an enhancement to a basis in technology. Who knows where it might go from here, or how long we will actually need to write lines of code to prompt such tools to generate business value, but as developers we are not here to write code. We are here to leverage our technical skills to solve problems. AI tools will allow us to implement our solutions more quickly.</p>
<p>In day-to-day terms they are not a threat to our existence. The rising tide of these solutions will create their own problems, ones we can’t even conceive of yet that we will need to solve. From the prevalence of the cloud for hosting business platforms, frontend frameworks, CSS preprocessors, static site generators. We couldn’t have conceived of where these tools would take us, and what problems they would create that we would need to resolve before they were here.</p>
<p>I’ll continue to use the thing for now, and see how it develops.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Publishing a pnpm project on Cloudflare Pages]]></title>
            <link>https://darbs.co/post/pnpm-cloudflare-pages/</link>
            <guid>https://darbs.co/post/pnpm-cloudflare-pages/</guid>
            <pubDate>Sat, 18 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[A quick walkthrough for using pnpm with Cloudflare PAges.]]></description>
            <content:encoded><![CDATA[<p>There are several options for managing node/JS/TS projects, and not all of them are enabled within the Cloudflare Pages build process. While there is a <a href="https://community.cloudflare.com/t/add-pnpm-to-pre-installed-cloudflare-pages-tools/288514">Community Feedback post</a> for an official solution, there are a couple of quick steps we can take to publish with pnpm.</p>
<p>Firstly, we will need to tell the Cloudflare Pages build agent to use a more up-to-date version of node. At time of writing the default is 12.x, but we can instruct the agent to use a version that will allow us to install and run pnpm. This is achieved by adding an environment variable in the Cloudflare Pages settings with the desired version.</p>
<pre><code>NODE_VERSION=16.7.0
</code></pre>
<p>Lastly, in the build command configuration for the page, we need to add a one-liner that will install pnpm and then use pnpm to build our project.</p>
<pre><code>npm install -g pnpm &amp;&amp; pnpm i &amp;&amp; pnpm build
</code></pre>
<p>Double check the build output and root directories are correct for your project and there we go, Cloudflare Pages with pnpm!</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Full-Stack Python with Pynecone.]]></title>
            <link>https://darbs.co/post/full-stack-python-with-pynecone/</link>
            <guid>https://darbs.co/post/full-stack-python-with-pynecone/</guid>
            <pubDate>Wed, 15 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[The story so far.]]></description>
            <content:encoded><![CDATA[<p>I love making stuff in the simplest way possible. I really love reducing tooling to its simplest form. Over the last few years, I've been learning with a focus on a singular technology to deliver a complete experience. Frontend, backend, all in one. This has taken me through some fantastic frameworks, Django, TailwindCSS, and latterly a little Rails and Phoenix.</p>
<p>I've learned a lot from these frameworks and approaches and</p>
<p>This is why I was super excited to discover <a href="https://pynecone.io/">Pynecone</a>. Pynecone is certainly in the early days of its development but seems as though its focus on rapid prototyping and developer-friendly approach has it off to a compelling start.</p>
<h2>Prerequisites</h2>
<p>To build and deploy our demo app, we'll need</p>
<ul>
<li>Python 3.7+, pip, venv</li>
<li>node 12.22.0+</li>
<li>Docker</li>
<li>flyctl (I'm hosting with <a href="http://Fly.io">Fly.io</a>, but any provider that can host a container, or static content will do)</li>
</ul>
<p>So let's get straight into it...</p>
<p>Let's set up a new directory and environment for our project</p>
<pre><code>mkdir pynecone-app
cd pynecone-app
python3 -m venv .
source bin/activate
</code></pre>
<p>Now let's add and initialize Pynecone, and create a requirements file to record the project dependencies.</p>
<pre><code>pip3 install pynecone
pc init
pip3 freeze &gt; requirements.txt
</code></pre>
<p>Great! ... all done! now we can run the local server and navigate to localhost:3000 and see the Pynecone landing page...</p>
<pre><code>pc run
</code></pre>
<p>All the display logic and styling for the page is held in the pynecone_app.py. Refer to the official <a href="https://pynecone.io/docs/getting-started/introduction">docs</a> to make any changes you want, add wrapped React components if you can't achieve something out-of-the-box, or set up a SQLite database using the pc.Model ORM.</p>
<p>Pynecone do provide their own hosting platform, which at the time of writing is behind a waitlist. Can't wait to try deploying our app? Great, maybe <a href="http://fly.io">fly.io</a> can help.</p>
<p>We can create a Docker image of the project by adding the <a href="https://github.com/pynecone-io/pynecone/blob/main/docker-example/Dockerfile">Dockerfile</a> supplied by the Pynecone team to the root of our project. Ensure the requirements.txt file is in the project root as well.</p>
<p>We will also need to change the <a href="http://pcconfig.py">pcconfig.py</a> file to accommodate running within Docker...</p>
<pre><code>import pynecone as pc

config = pc.Config(
    app_name="app",
    api_url="0.0.0.0:8000",
    bun_path="/app/.bun/bin/bun",
    db_url="sqlite:///pynecone.db",
)
</code></pre>
<p>Now lets initialize flyctl and launch our container...</p>
<pre><code>fly launch // This will take us through some guided steps to set up the project within Fly.io
fly deploy
</code></pre>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-03-13/</link>
            <guid>https://darbs.co/post/2023-03-13/</guid>
            <pubDate>Mon, 13 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>It's been an interesting day so far. I'm continuing across all fronts with some language learning. Slightly concerned I am spread far too thinly across many disciplines. Firstly I've been continuing to tinker with Elixir/Phoenix which is a very compelling and feature-rich stack to work with. Plugging away at the course as well as with a little semi-serious rework of this site. Not sure if I'll keep the momentum to finish this but it's feeling nice to work with so far.</p>
<p>Spent a little bit of the day working with some dotnet core as well. There is something to be said for working within the same domain as the rest of your team, in terms of future support for any tooling you create. How is a team going to maintain that one super-critical Python script if it's not a Python house? ChatGPT has been helping me here, mostly with syntax as I'm concerned it is leading me down the garden path in terms of its overall implementation approach.</p>
<p>Finally, as if that weren't enough I encountered <a href="https://pynecone.io/">Pynecone</a> today, which appears to offer a complete web app ecosystem, purely in Python. Have things come full circle? is it time for me to revert back to the warm safety of Python to achieve absolutely everything? ... possibly. A test run of Pynecone is incoming I think... just don't tell Phoenix. It'll be our little secret.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-03-12/</link>
            <guid>https://darbs.co/post/2023-03-12/</guid>
            <pubDate>Sun, 12 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>I've been doing an Elixir/Phoenix bootcamp over the past couple of days and I must say I've been enjoying it. Its my first exposure to functional programming and I think I'm picking up the concepts more quickly than with any OO languages. <a href="https://www.udemy.com/course/the-complete-elixir-and-phoenix-bootcamp-and-tutorial/">This course</a> has been good thus far, there are a few minor differences between Elixir versions, but nothing distracting.</p>
<p>I think one of my favourite elements of the Elixir/Phoenix stack is that it feels very fast to scaffold a project. Having worked on Django and done a little bit of Rails in the past, it certainly has that 'full-featured' feel. I'm aware of the power of Phoenix Live Vies and I'm excited to get into them. I've enjoyed the templating/server-side approach of those other frameworks, and using Phoenix with Tailwind and some Live View components feels like it might be a winner.</p>
<p>I was intending to move something over to Phoenix that I had started working on as a Rails project, but I'm feeling like finishing something small. There is also a little bit of me that wants to recreate this site as a Phoenix blog, but even that might be too big.</p>
<p>I am tempted by the idea of an incredibly minimal CSS configuration, using system default fonts, no imports etc.</p>
<p>I've used <a href="https://andybrewer.github.io/mvp/">MVP.css</a> in the past, but I like the look of <a href="https://github.com/igoradamenko/awsm.css">awsm.css</a> as well.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-03-02/</link>
            <guid>https://darbs.co/post/2023-03-02/</guid>
            <pubDate>Thu, 02 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>So the combination of good dev docs for Rails, combined with being able to ask ChatGPT technical questions and get a good descriptive answer has been a bit of a game-changer. I've been getting up to speed with the framework as well as getting well-laid-out answers on Ruby itself and it's been a very pleasant experience. If you have ever been curious to try out a new language or framework, the combination of <a href="https://github.com/jetpack-io/devbox">Devbox</a> and <a href="https://chat.openai.com">ChatGPT</a> is a compelling reason to go for it.</p>
<p>I intend on using this combination more aggressively at work as it's a powerful tool to accelerate your progress.</p>
<p>Speaking of Accelerate, I've been having issues calculating <a href="https://cloud.google.com/blog/products/devops-sre/using-the-four-keys-to-measure-your-devops-performance">DORA</a> metrics at work. I have been using a chunky <a href="https://colab.research.google.com/">Google Colab</a>/Python script to calculate everything but it's reached a fairly high degree of complexity, such that it's a bit of a pig to maintain. There are tools out there to purchase, but I haven't done the rounds recently to see if any of them are worthwhile.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-03-01/</link>
            <guid>https://darbs.co/post/2023-03-01/</guid>
            <pubDate>Wed, 01 Mar 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>The internet needs to be more fun. I've been using ChatGPT recently for a few things like asking for daily facts on various topics, digests of books, and its been particularly good at scaffolding coding projects as well. Its been especially powerful at kick-starting a project, or talking through a problem I'm not familiar with.</p>
<p>As such, I was very pleased upon discovering <a href="https://www.jailbreakchat.com/">JailbreakChat</a> which provides some often hilarious ways you can bend ChatGPT's rules. Making it talk to itself in a loop, and swearing incoherently.</p>
<p>I've also started a small project inspired by the excellent <a href="https://karl.gg">https://karl.gg</a>, but for the rogue-lite card battling game, <a href="https://acrosstheobelisk.com/">Across The Obelisk</a>. I'm hoping to build some kind of team/deck-building site. I'm intending to use Django as I spent a chunk of time with the framework and I find it really fast to get things up and running. Ideally I'd like an anonymous approach, where configurations are stored and shared as a string and potentially some kind of upvote/downvote structure as well. Always worth trying to run before you can walk.</p>
<p>HAving a play with a combination of <a href="https://guides.rubyonrails.org/getting_started.html">Ruby on Rails</a> and <a href="https://github.com/jetpack-io/devbox">DevBox</a> which was super easy to set up. Rails is very easy to understand coming from Django land, and it does some interesting and helpful things with resources, and using the cli to create models, views etc... hmmm, must investigate further.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-02-28/</link>
            <guid>https://darbs.co/post/2023-02-28/</guid>
            <pubDate>Tue, 28 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Things can be over-optimized. I have gotten very distracted in the past with trying to engineer the perfect conditions under which to do something, completely avoiding doing the thing. In fact, often I find by the time I'm done with preparing to do something, the will to actually do it is long gone. I think building the split keyboards as a means to improve my writing is the first example that comes to mind.</p>
<p>This said I've taken a look at <a href="https://regolith-desktop.com/">Regolith</a>, a desktop environment for Ubuntu, based on i3. Its pretty nice really. I think the issue I have is for me, I barely notice the difference, other than the inconvenience of occasionally not having access to a launcher when I need it. Once again, this is probably me stuck in my ways and the investment of learning this new system is just too big an ask. I'm better off just cracking on in less-than-perfect conditions.</p>
<p>That being said the <a href="https://www.lenovo.com/gb/en/p/accessories-and-software/keyboards-and-mice/keyboards/gx30m39693">Lenovo 300</a> is indeed super basic, but I've been getting by with it. Ultimately its a just a little too rough to use long term, but probably a decent shout for the price.</p>
<p>I've been looking into tagging posts in VitePress and having menu items on the sidebar. These posts are a little thematically all over the place and would definitely benefit from some kind of organization. At the moment though, it seems as though the vitepress-tags package wants us to organise the sidebar in a slightly odd way. I'm sure as things go on I'll need to customise things further. Good to know this is possible.</p>
<p>Lastly, I've been enjoying a solid blast of nostalgia while doing some retro gaming emulation, so far Wipeout on the PlayStation 1 and Saturn Bomberman for the Sega Saturn. Both of which have absolutely cracking soundtracks. They both occupied my attention for a significant amount of time. I've never got to grips with <a href="https://www.retroarch.com/">RetroArch</a> before but it seems a very capable emulation platform. What it can't emulate is my reaction times and ability to play these games.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2023-02-27/</link>
            <guid>https://darbs.co/post/2023-02-27/</guid>
            <pubDate>Mon, 27 Feb 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Well, what I'd hoped to be a more regular format for posting has somewhat fallen by the wayside. I've enjoyed writing more recently, so hopefully I'll be able to invest a little more time, and use a little more discipline to create these posts.</p>
<p>On the subject of discipline, I found this <a href="https://www.wisdomination.com/screw-motivation-what-you-need-is-discipline/">blog</a> fascinating. I'm a perpetual victim of putting things off until the perfect conditions are met where I'll feel motivated to act. Off the back of this post I have been able to make some positive changes, which has been lovely, frankly. It seems to me holding on to the discipline to act when you know you should is a muscle that needs continually stretching, and the reward for carrying out these tasks is sometimes not in the doing, but after they are done.</p>
<p>My ongoing journey with keyboards has taken an interesting turn. As much as I loved getting into the dark, sordid world of custom PCB printing, soldering switches, and flashing micro controllers, I have decided to test out the following budget, non-mechanical <a href="https://www.lenovo.com/gb/en/p/accessories-and-software/keyboards-and-mice/keyboards/gx30m39693">keyboard</a>... A Lenovo 300 UK (ISO) the logic being, responding to instinct, feel, and overall output. The simple fact of life is that I've accrued nearly 30 years of bad typing habits on sub-standard keyboards, and that's alright. IT arrives tomorrow, lets see how it goes.</p>
<p>I've recently moved back a step even from RSS feeds, which I have had a fairly non-committal relationship with over the last couple of years. Instead I'm trying out leaning more into mailing lists and newsletters. The theory being, there's no feed reader required, its just your emails, which are consumable on every device/platform. There are a myriad of ways to set up filtering and email rules if you want things going into certain folders for easy consumption. And things like keeping up to date with the news is migrated to a much more considered and concise summary of events in a daily/weekly format. So far its been going well and I'd say overall I feel better informed and aware of things in my wide array of interests than what had become a second doom-scroll of never ending feed updates on my RSS reader.</p>
<p>OK, there we go. That wasn't that painful was it?</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2022-11-30/</link>
            <guid>https://darbs.co/post/2022-11-30/</guid>
            <pubDate>Wed, 30 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Once again, I've been enjoying the videos of Philosophy Tube, specifically on <a href="https://www.youtube.com/watch?v=ATITdJg7bWI">Ignorance and Cencorship</a> .</p>
<p>I've been somewhat interested in the Mental Models blog on <a href="https://fs.blog/mental-models/">fs.blog</a>. Although I'm not entirely sure I'm bought in to this approach. I think this may be a tool, useful in specific application to a compatible problem, but not a magic bullet. Having said this, some of the models around systems thinking are particularly interesting from an engineering perspective.</p>
<p>I've had a very on-again-off-again relationship with note taking apps over the last few years. I've mostly been seesaw-ing between Notion and Obsidian. I really like the low-level utilitarian feel of Obsidian, but I've mostly preferred Notion's media support. Over the last few months I've mostly been using Notion, but its been progressively worse to use. Both the web app and the native installed version have been getting really bad import lag.</p>
<p>So I'm back to Obsidian. Its actually been really nice to start from scratch with a different system. Its super snappy for now. We'll see how its behaving in a few months.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2022-11-28/</link>
            <guid>https://darbs.co/post/2022-11-28/</guid>
            <pubDate>Mon, 28 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>Well, not much to report from today. Getting to grips with the new keyboard and layout has been really cool. It's starting to feel a bit more natural and can remember the basic key layout for the most part. The layers are a bit more tricky, especially as I keep changing them every 3 minutes.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2022-11-27/</link>
            <guid>https://darbs.co/post/2022-11-27/</guid>
            <pubDate>Sun, 27 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>So I've finished a new split keyboard and it's going very well so far. A proper post is on the way, but it's a <a href="https://github.com/davidphilipbarr/Sweep">Ferris Sweep</a>. I'm using the Colemak DH layout which is surprisingly good so far. It doesn't seem to have impacted my Qwerty typing at all and there is a lot less hand movement. I'm decades off the pace in terms of speed though, but am determined to catch up.</p>
<p>I was enthralled by these AI-generated <a href="https://www.djfood.org/fantasy-jodorowsky-tron-visualisations-by-johnny-darrell/">Tron concept</a> pieces inspired by Jodorowsky...</p>
<p>Lastly, this page has made me want to rewatch <a href="https://www.monkeon.co.uk/gifaanisqatsi/">Koyaanisqatsi</a></p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2022-11-24/</link>
            <guid>https://darbs.co/post/2022-11-24/</guid>
            <pubDate>Thu, 24 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>OK, here we go again. There have been some interesting bits on writing again today, this blog on the <a href="https://stackoverflow.blog/2022/11/23/why-writing-by-hand-is-still-the-best-way-to-retain-information/">benefit of handwriting for taking notes</a> over and above typing was great. I float between the two and can't seem to settle.</p>
<p>I had this post linked to me on <a href="https://uxplanet.org/ive-been-doing-buttons-wrong-have-you-2117c0066613">implementing buttons</a> which reminded me how much I enjoy design/UX. I had begun the Google UX course which I should pick back up and finish someday...</p>
<p>I've been working on some presentation materials and I needed to whiteboard something out and it reminded me how good a tool <a href="https://excalidraw.com">Excalidraw</a> is. If you like the style it seems super quick to throw something simple together to illustrate a point well.</p>
<p>Side thoughts today are that while I've been making an effort to migrate to the federated web, largely <a href="https://mastodon.social/@darbs">Mastodon</a>, I should remember to post images. I did like the format of taking a couple of shots per day on Instagram to share and it was a means for me as a latent photographer to keep sharp, keep my eyes open and take in the world around me. There are federated Instagram equivalents, however, I keep remembering the Scott Hanselman axiom "Own your words". This also applies to images. I'll think of a nice way of implementing an image gallery component to this site. There may not be such a thing in Vitepress as yet, but I can easily do something on a subdomain.</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Linkblog]]></title>
            <link>https://darbs.co/post/2022-11-23/</link>
            <guid>https://darbs.co/post/2022-11-23/</guid>
            <pubDate>Wed, 23 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[Linkblog post of interesting clippings.]]></description>
            <content:encoded><![CDATA[<p>So, I've been inspired to try and start a fairly frequent link blog-style thing, just to throw some things out there that I have found each day. I'm already in a semi-routine of collecting interesting stuff so I'm going to force it out into the open as well.</p>
<p>First things first, this is the source of the inspiration, an excellent new site influenced by the directory-driven internet of old. <a href="https://ooh.directory/">https://ooh.directory/</a>. Discovered some great resources off this thing already and I've only spent 10 minutes on it.</p>
<p>I've been continuing to enjoy the <a href="https://www.youtube.com/@thephilosophytube">Philosophy Tube</a> channel. In particular, over the last couple of days I've been through the episodes on <a href="https://youtu.be/KAFbpWVO-ow">Antisemitism</a> and <a href="https://youtu.be/TDcwIZzaf-k">Capital Punishment</a>. They are very well made/written and the channel has piqued my interest in Philosophy for sure.</p>
<p>Cool. That'll do for today :).</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Sending Push Notifications with Python and Ntfy.]]></title>
            <link>https://darbs.co/post/push-notifications-python-ntfy/</link>
            <guid>https://darbs.co/post/push-notifications-python-ntfy/</guid>
            <pubDate>Tue, 01 Nov 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[The story so far.]]></description>
            <content:encoded><![CDATA[<p>Over the last few days I encountered an excellent tool in the form of <a href="https://ntfy.sh">Ntfy</a>, an excellent anonymous message relay. There are quite a few compelling use-cases for a tool such as:</p>
<ul>
<li>Basic system monitoring and alerting.</li>
<li>Home automation.</li>
<li>Web scraping alerts.</li>
</ul>
<p>In order to recieve the notifications its recommended yo use the official app on the <a href="https://apps.apple.com/us/app/ntfy/id1625396347">App Store</a> / <a href="https://play.google.com/store/apps/details?id=io.heckel.ntfy">Play Store</a>. Bare in mind you don't need any kind of account or login for the app in order to recieve your notices.</p>
<p>I've elected to use a GUID as the message topic I am subscribing to, to prevent anyone stumbling upon my feed, though you can use anything like 'alexs-messages' if you wish. In the interest of security, the author of Ntfy does recommend the use of a personally hosted instance, should you want to be completely assured your messages are not being read/stored in their central system. While this is not in scope of this project I may cover it in a seperate post.</p>
<p>Create a GUID in the terminal with 'uuidgen'</p>
<pre><code>$uuidgen
67240364-be56-4a43-af4b-f4eae318ee94

</code></pre>
<p>Once you have the app installed on a device you should now be able to test you are recieving messages with a quick CURL command. Within the app, ensure you have added a new message subscription topic in the Ntfy app on your device and add the GUID as the topic name.</p>
<p>Now we can send a message to the topic using CURL to see if everything is working.</p>
<pre><code>curl -d "Test Message" ntfy.sh/67240364-be56-4a43-af4b-f4eae318ee94
</code></pre>
<p>With any luck you should have recvieved the test message. Great! ... OK time to crack open Python...</p>
<p>Lets set up a basic project from the Ntfy docs for Python...</p>
<pre><code># /notify.py
import requests

topic="67240364-be56-4a43-af4b-f4eae318ee94"

requests.post("https://ntfy.sh/" + topic, 
    data="Test Message".encode(encoding='utf-8'))
</code></pre>
<p>Running this script should generate the same message as our test CURL command above...</p>
<pre><code>python3 notify.py
</code></pre>
<p>Cool. Now we should update the script to allow us to send a title, priority status etc. and a few other elements as per the docs.</p>
<pre><code># /notify.py
import requests, json

topic="67240364-be56-4a43-af4b-f4eae318ee94"

requests.post("https://ntfy.sh/",
    data=json.dumps({
        "topic": topic,
        "priority": 5
        "message": "You left the house. Turn down the A/C?",
        "actions": [
            {
                "action": "view",
                "label": "Open portal",
                "url": "https://home.nest.com/",
                "clear": True
            }
        ]
    })
)
</code></pre>
<p>And there we go. We can now send ourselves (or any subscriber of the topic) notifications by calling the script.</p>
<p>Possible next steps:</p>
<ul>
<li>Add args to the script to allow you to parse options from the command line.</li>
<li>Migrate the script to a library and integrate it within a Python project.</li>
</ul>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[On the abuse of the Entropic Coffee Machine.]]></title>
            <link>https://darbs.co/post/entropic-coffee-machine/</link>
            <guid>https://darbs.co/post/entropic-coffee-machine/</guid>
            <pubDate>Tue, 18 Oct 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[The story so far.]]></description>
            <content:encoded><![CDATA[<p>2022.10.18</p>
<p>FAO: All Employees and Contractors.</p>
<p>As you are all I'm sure aware over the last six months, we at □□□□□□□□□□ □□□□□□□□ have endeavoured to improve staff satisfaction via the replacement of traditional conveniences with those which accept alternative currency and payment methods, to save our employees and guests' money while in our offices.</p>
<p>Since the adoption of the Entropic Coffee Machine, workplace accidents have increased sharply. While I'm sure we all appreciate the effect of being able to generate Coffee through the expenditure of personal energy instead of traditional fiat currency, I have observed a sharp increase in instances of employees losing phase with our preferred plane of existence. I have observed persons within immediate vicinity of the machine in a state of dimensional incongruence with that of their surroundings.</p>
<p>I am certainly pleased that we have been able to provide deliciously hot coffee and other beverages to staff without the hassle of fumbling with change or NFC devices, however, the rate at which we have been misplacing individuals has increased sharply. There have even been suggestions amongst the management team that misuse of the ECM is a means via which an employee may skive off and shirk their responsibilities. While I find it hard to accept that anyone would risk their ongoing existence to such a trivial end, nevertheless we must sadly now consider this a possibility.</p>
<p>Even more grave are the reports we have been receiving that individuals who have been abusing the ECM to traverse dimensions have not been the same upon their return. While they appear outwardly to been the same individual that left, we are convinced via our standard measurements they are not.</p>
<p>As such we find it necessary to impose a monitor to manage the proper use of the ECM until all the correct members of staff can be accounted for. Department managers, please ensure a rota is in place between yourselves to ensure someone is available to monitor the machine at all times.</p>
<p>Regards, T</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
        <item>
            <title><![CDATA[Remote Development With Tailscale, VSCode and DigitalOcean]]></title>
            <link>https://darbs.co/post/remote-development-tailscale/</link>
            <guid>https://darbs.co/post/remote-development-tailscale/</guid>
            <pubDate>Sun, 26 Jun 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[The story so far.]]></description>
            <content:encoded><![CDATA[<p>I use multiple devices and operating systems and while my development needs are not particularly heavy, and I can largely use the same tools across multiple systems, I don’t like the thought that I can’t seamlessly move between machines. I don’t trust that I haven’t forgotten to push local commits from one machine to remote and then I’m stuck doing the merge dance if I want to make any changes from another device. I use Linux, OSX and Windows all relatively often and I could conceivably wont to work on some projects on any of them.</p>
<p>I have also had very mixed experiences getting project dependencies up and running across different OS’s and devices. I’ve frequently used Jekyll for small web projects and especially on OSX, Ruby can be a mare to set up and configure. The appeal of having a pre-cooked environment on a remote machine that I can hook up my local VSCode instance to and carry on as normal is very compelling.</p>
<p>Recently I discovered that there is an immensely popular (over 11 million downloads at time of writing) add-on for VSCode that allows you to work with a remote file-system over SSH. Interesting. And particularly so as I was also reminded that the excellent Tailscale had recently enabled SSH over their tool. As it turns out there are some really simple steps we can take to get our secure, remote dev environment up and running.</p>
<p>Firstly, you will need to install Tailscale on any client machine you want to be able to access the development VM from, there are guides for virtually every OS on Tailscale’s site, including iOS and Android which is particularly useful if you are working on any web app projects and want to see how it looks on a mobile device.</p>
<p>I’m setting up my OSX machine as a client for now, so all I need to do is download the client from the App Store, create an account or sign in and that's the client node stet up.</p>
<p>Now that's done, we need our remote development machine to work from. Any device you have ownership of will do. By all means if you would prefer to use this method to connect to your ‘main’ computer from a laptop on the go, that works too. My use is split fairly evenly across several computers, so a VM running on a cloud provider works for me.</p>
<p>I decided to spin up a DigitalOcean Droplet as my dev machine, however there are a plethora of cloud hosting providers that you could also use, often with trial credits as well, allowing you to try this setup without paying a penny.</p>
<p>I navigated to the new Droplet page in the DigitalOcean console, selected a VM size and operating system I was comfortable with (Ubuntu 20) and configured remote access via SSH key for the initial setup. There are plenty of guides out there for generating your SSH keys if you haven’t done so already. Once you are happy with the settings for the machine we can create the Droplet and wait for it to be created, which shouldn’t take long.</p>
<p>On our Droplet, all I need to do is remote into the machine via DigitalOcean’s web terminal tool (Click on the newly created Droplet and select Access &gt; Launch Droplet Console) and a new window will load with a console session to the new VM.</p>
<p>Now that we have access to our new machine, we will need to ensure there is a non-root user to do your development with. You can create a new user…</p>
<pre><code>adduser username
</code></pre>
<p>Once you have filled in some basic information for the new user you can and add the new user to the sudoer’s list…</p>
<pre><code>usermod -aG sudo username
</code></pre>
<p>We can test this has worked by changing user to the newly created account and running whoami with sudo…</p>
<pre><code>su - username

sudo whoami
</code></pre>
<p>If the output says ‘root’ the new account has access to sudo and we can move to the next steps. If you are having trouble with this step it would be worth reviewing the /etc/sudoers file and ensure your new user account appears in the config with similar permissions…</p>
<pre><code>username ALL=(ALL:ALL) ALL
</code></pre>
<p>Now we have access to our new machine and we have su-ed to our new developer account, we need to get Tailscale up and running… as before, refer back to the installation docs for the specific OS you have chosen for the development machine. Ubuntu is here.</p>
<p>Once installed we can run</p>
<pre><code>sudo tailscale up --ssh
</code></pre>
<p>This will fire up the service with the extra SSH option. Once you have entered this command you will be prompted to authenticate the request by copying a URL from the terminal into a browser. Once authenticated, the Tailscale session will start and you should be able to SSH into the machine on the terminal using ‘ssh user@devbox’. You can check the Tailscale daemon is running using…</p>
<pre><code>service tailscaled status
</code></pre>
<p>Right. Now we can now add the SSH plugin to VSCode. Once this is done, add our devbox as a new remote host and connect.</p>
<p>This will give you the ability to run dev web servers remotely and the VSCode plugin will tunnel the connection to your local machine so you are able to view your project ‘locally’ via <a href="http://127.0.0.1:3000">http://127.0.0.1:3000</a>.</p>
<p>There we go.</p>
<p>Potential next steps could be ensuring backups are enabled on your VM’s hosing provider, and setting up things like GitHub CLI, and any remote development packages you may need.</p>
<p>Enjoy!</p>
]]></content:encoded>
            <author>alex@darbs.co (Alex Darby)</author>
        </item>
    </channel>
</rss>