Recently a video popped up in my feed about a developer’s experience of coding with AI and why they were done with it. I found it interesting and began writing a comment to respond to it, only to realise it became rather long. So I thought I’d expand it into a blog post about my thoughts on coding with AI, LLM-based agents etc.
I’ve recently been rereading short stories from The Complete Robot by Issac Asimov. I’m particularly fond of the Powell and Donovan stories and the Susan Calvin stories. It was while rereading “Galley Slave” that I realised the monologue at the end of the story by the professor was quite prescient to our modern AI and Large Language Model world.
Large Language Models (LLMs, and what is currently being called AI) are incredibly divisive right now. On one side you have those hyping them up as a small step from ushering in the singularity . And on the other side those who think they’re a colossal waste of electricity and water, that all they produce is “slop”, and they’re going to take away everyone’s jobs. As with most things in life, the…
Model Context Protocol or MCP, is quickly being adopted as a standard for extending Large Language Model (LLM) based AI functionality. But what is it? By the end of this post I hope to have explained the main concepts of MCP and have built a simple Dice Rolling MCP Server.
With the rise of Large Language Models (LLMs), I’ve been spending some of my free time experimenting with them. I’ve mainly been interested in seeing what can be built with them, getting to grips in general with how they work, and practicing how to best use them.
Back in January 2024 I wrote a post about efficiently writing to S3 in Python that has become relatively popular on this blog (thanks to GoatCounter for revealing this.) So I thought I’d take a broader look at the most efficient ways to read and write from S3 with special attention paid to AWS Lambdas and resource-constrained containers in general.
Recently I stumbled upon a post about the Chinese developed Large Language Model (LLM) DeepSeek on LinkedIn that I wanted to address. Specifically the post was scaremongering about security concerns with wide adoption and use of the DeepSeek model.
Previously I mentioned that I use NeoVim as my editor of choice and updated to using Packer as a plugin manager. At the end of January 2025 I decided to finally migrate away from the unmaintained Packer project to Lazy.nvim .
This page serves as the third and final part of a summary of my experience with Advent of Code 2024 . As is normal with December, work and personal commitments got in the way of completing Advent of Code 2024, so this post only covers days 13 to 16, and has been written quite some time into 2025.
This page serves as the second part of a summary of my experience with Advent of Code 2024 , covering days 7 to 12. For the first 6 days see my previous post .
I’ve recently caved into the idea of adding some tracking onto my blog, but rather than cave completely to the likes of Google Analytics, I’ve opted to investigate some minimal, privacy friendly tracking solutions.
This page serves as the first part of a summary of my experience with Advent of Code 2024 . A mentioned in my original post , I decided against forcing myself to learn another programming language as well as opted not to post an article for each challenge.
It’s come again, Advent of Code 2024 . I don’t think I have ever fully finished one of these, I probably came close in one of the earlier ones during the 2010’s.
GDPR and specifically, the Right to Erasure (aka ‘right to be forgotten’) are tough nuts to crack in the world of Data. Given our predilection to data hoarding the requirements to be able to erase user information in a timely manner can prove difficult when you have a huge data estate.
As programmers we’re often taught to take certain things for granted, when it comes to performance. Likewise, we often throw around the Sir Tony Hoare quote, made famous by Donald Knuth: “Premature optimisation is the root of all evil.” But what is premature optimisation?
This is a quick tip from a blunder I made when writing some Scala code using the AWS S3 object listing API . Hopefully it will save someone else from making the same mistake and show how important it is to have good tests, a clear API and the literacy skills to read it.
Before Christmas 2023 we ran into an issue with one of our simpler data ingests at work. An AWS Lambda , written in Python that queried an API, transformed the results, and landed them in Amazon S3 as JSON (gzipped JSON Lines files to be specific), started to fail.
It’s that time of year again. Time to commit to participating in AdventOfCode 2023 only to not finish it. In seriousness, I’ve tried to finish for a few years but always find other commitments get in the way. Nevertheless, I am going to be doing Advent of Code 2023!
As I mentioned many moons ago, I use the text editor Vim as one of my daily drivers. To be precise I actually use NeoVim . Recently I have decided to clean up my configuration files and I plan on documenting that adventure here.
I don’t like software Mocks or Mocking frameworks in general. In my experience they don’t really help when it comes to testing software, at least the kind I work on, and the frameworks themselves are a nightmare to deal with.
This is the first post in a series about creating a search engine for the Gemini internet technology . In it, we will briefly discuss what Gemini is and the basics of creating a Search Engine.
A little bit of a cryptic title but bear with me, this is a post about how when you build an interface, or any code really, you should consider the effect of your decisions.
Recently at work I encountered a Spark job that had begun to intermittently fail after a long period of successes. Debugging Spark jobs is a skill in and of itself that I will touch on it lightly here, but in my evaluation of this job I found that:
With the basic Scala implementation of Wordle out of the way in my last post I thought it might be a fun activity to create a Wordle solver/helper in a similar way. I like to avoid using such things on real world puzzles as they suck the fun out of them but writing them and testing them is fun in and of itself, so lets get started.
The game Wordle seems to have come out of nowhere in recent months and become a favourite among many. In this post I will show how you can make a game similar to Wordle in Scala.
Recently there’s been an outpouring of software activists or, as some call them, hacktivists, protesting the war between Russia and Ukraine. One of these people, a man by the name of Brandon Nozaki Miller , decided to introduce malware into a popular Node.js library known as node-ipc .
In an old talk by Kevlin Henley he made an observation on an effective programming habit through the use of a vampire analogy . The analogy went something like this:
Recently I finished reading the Mistborn book series by Brandon Sanderson , a fantasy series set in his Cosmere setting. This is a brief review of that series.
Recently, I was tasked with deleting a load of extraneous tables that made their way into one of our AWS Glue Catalogs. These tables were causing a major issue by virtue of a fact that there were 15,000+ of them. To solve this problem I applied a bit of Bash scripting that I thought I’d share.
In my last 2 posts I was working on a way to processes Nonograms in Scala. In the first I outlined what they were and a file format to store them in. In the second I showed my code in Scala to represent them and parse them from the file format I defined. In this post I will continue on with code to write out the file format and render them.
In my previous post I described what a Nonogram was and crafted a file format to use for representing a Nonogram and any clues/hints associated with it. In this post I intend to go through the steps of building software to read, write and display Nonograms in the decided format.
It is a tendency among many people to perfect something before they think of ever releasing it or showing it to anyone else. Often you might label these people perfectionists, and they exist in all spheres of life, from programming to writing to art. There is a big problem with being a perfectionist and thats that you hardly ever release anything!
Having been using Linux exclusively as my operating system for development for quite some time now I thought it was time to catalog some of the useful commands and programs I use in the terminal on an almost daily basis.
Last night I was struck by a mini disaster! My phone had run out space due to the amount of photographs I have taken over the last few years! Annoyed at the sudden disruption to my phones operation I went to work trying to delete old photos and back them up.
Recently I wrote a very quick C program to parse my i3 configuration file and output the bound keys within. This was to help jog my memory of the various keys I have set in my configuration file beyond the common ones.
Digging through some old notes I stumbled upon the diagram I made when planning my home network during my last move. I had decided to take a little paranoid approach to my networking.
Recently I wanted to refresh my C programming skills and was on the lookout for a library or framework for getting graphics onto the screen while doing so and I stumbled upon the Raylib library. It suited the bill perfectly.
So in my last post I lamented that I was getting only spam comments on my blog after updating it with Staticman to enable comments so today I have decided to disable comments altogether.
Since 2021/02/27 my blog has had comments enabled courtesy of Staticman. Unfortunately it seems that the only comments I get are spam so I am torn as to whether to continue enabling comments or to remove them.
Recently I have been experimenting with the terminal email client mutt ( neomutt to be specific) in preparation for setting up my own email server (I want to stop being over reliant on GMail). Initially I stumbled upon offlineimap as a way of downloading and syncing mail from an IMAP server, but as it turns out it is built in Python 2 and considered a bit obsolete and slow by many. So after some…