Andrew Aitken - Blog

Writing with Claude

A blank text box is definitely my kryptonite. I’ve always liked the idea of writing for my blog but I’ve never really had the motivation to keep at it. After using Claude to rewrite my blog in Astro, I felt it was the right time to write a post and I had a recent experience to get down in writing.

I don’t want Claude to write a blog post for me, Claude already has a blog. Instead I asked Claude to review what I had written which was only a few paragraphs at this point. Claude gave me really good pointers on which areas to expand upon and how to finish with something for the reader to think about. It all made sense and it was very helpful in creating a more rounded and interesting blog post.

What surprised me was how different Claude was from Copilot which has a tendency to rewrite whatever you give it, even when you just ask for a review.

Hopefully with Claude as an editor I will be inclined to write a little more often than the ten year gap between my last two posts.

Read more →

Pivot!

I was recently part of a project domain discovery meeting where the client dropped a bombshell at the beginning of the second day which completely changed the direction of the project. It can be very jarring, but it’s important to build what the client needs, even if that’s not what they thought they wanted yesterday.

The initial plan was to replace a system that had been built in-house which had usability issues. It had grown organically and was now spanning multiple SaaS providers.

But what caused the client to change direction so dramatically? It was one small feature being removed from MVP (minimum viable product) as it didn’t exist in the current system. They felt this was key, but this went against what was originally asked for, so questions were asked and when pressed on what would add the most value they suggested something entirely new which wouldn’t even live in the system we were looking to replace. Suddenly we are looking at a completely new application which hadn’t even been mentioned up until this point.

That feature still wasn’t in MVP after the dust had settled.

I think we should have done a little more probing on “why” to understand the real problem we were trying to solve, but the client came so confidently with the “what” that it was never scrutinised enough to see the misalignment.

When working with a client, even if they are sure of what they want, it’s important to take the time to understand the problem they are trying to solve and the value that the solution will deliver to help determine that you are on the right course.

The questions are deceptively simple, “what problem does this solve?” and “what does success look like?”, but it’s far too easy to ask them and accept the answers at face value. We must interrogate them and keep asking “why” until we reach the root of the problem.

Read more →

Suzuki Violin Book One

I realise this isn’t computer related, but I figured I might be inclined to blog more if I didn’t just limit it to programming subjects.

I bought a violin about 2 years ago and found a local teacher to get lessons once a week. Since then, my teacher moved to Sweden to have a baby but we continued the lessons on Skype after she had had the baby. From the very begginning I’ve been working my way through the Suzuki Violin Book 1 and more recently, the ABRSM Grade 1 Book.

I’ve finally reached the last song in the Suzuki book, Gavotte (that’s not me), which is going well and I am really happy I have reached the level I am at. I do have a tendency to get bored of things and give up, but I think having a teacher with weekly lessons and hearing my self play more complex peices has kept me going.

I’ve also decided to do the ABRSM level 1 exam, so I have been learning the songs in that book too. My exam is in the process of being booked and should be before the end of March!

I have been thinking about upgrading my bow & violin, but the prices goes up quite steeply from beginner. I would like to go to the violin shop and try a couple of better ones, but I don’t know if I’m good enough to notice a difference and I’m slightly worried I would notice a difference and end up wanting to buy it there and then.

Read more →

Getting parts of a Uri

One thing that keeps coming up, but not enough for me to actually remember what I learnt last time, is how to get different parts of a request Uri

So I made a little console app that outputs the different parts from two example Uris.

Behold

Uri Properties:

Using          : https://www.example.com/folder/page.aspx?query=1&sample=2#anchor
AbsolutePath   : /folder/page.aspx
AbsoluteUri    : https://www.example.com/folder/page.aspx?query=1&sample=2#anchor
Authority      : www.example.com
DnsSafeHost    : www.example.com
Fragment       : #anchor
Host           : www.example.com
HostNameType   : Dns
IsAbsoluteUri  : True
IsDefaultPort  : True
IsFile         : False
IsLoopback     : False
IsUnc          : False
LocalPath      : /folder/page.aspx
OriginalString : https://www.example.com/folder/page.aspx?query=1&sample=2#anchor
PathAndQuery   : /folder/page.aspx?query=1&sample=2
Port           : 443
Query          : ?query=1&sample=2
Scheme         : https
Segments       : /, folder/, page.aspx
UserEscaped    : False
UserInfo       :

Using          : http://www.example.com/folder
AbsolutePath   : /folder
AbsoluteUri    : http://www.example.com/folder
Authority      : www.example.com
DnsSafeHost    : www.example.com
Fragment       :
Host           : www.example.com
HostNameType   : Dns
IsAbsoluteUri  : True
IsDefaultPort  : True
IsFile         : False
IsLoopback     : False
IsUnc          : False
LocalPath      : /folder
OriginalString : http://www.example.com/folder
PathAndQuery   : /folder
Port           : 80
Query          :
Scheme         : http
Segments       : /, folder
UserEscaped    : False
UserInfo       :

Uri.GetLeftPart(UriPartial part)

Using                : https://www.example.com/folder/page.aspx?query=1&sample=2#anchor
UriPartial.Authority : https://www.example.com
UriPartial.Path      : https://www.example.com/folder/page.aspx
UriPartial.Query     : https://www.example.com/folder/page.aspx?query=1&sample=2
UriPartial.Scheme    : https://

Using                : http://www.example.com/folder
UriPartial.Authority : http://www.example.com
UriPartial.Path      : http://www.example.com/folder
UriPartial.Query     : http://www.example.com/folder
UriPartial.Scheme    : http://
Read more →

Warning - ExtensionAttribute is defined in multiple assemblies

I’ve noticed a warning in Visual Studio in a few projects where it gives me the following warning after building,

The predefined type "System.Runtime.CompilerServices.ExtensionAttribute" is defined in multiple assemblies in the global alias

I don’t like leaving warnings in my build but I didn’t have time to look into it until today. This handy tip from Remco te Wierik led me to the root of the issue. The .net Lucene contrib nuget package contains a reference Lucene.Net.FastVectorHighlighter which defines an ExtensionAttribute class in the System.Runtime.CompilerServices namespace.

Updating the assembly reference alias from “global” to a custom one, fixed the warning.

Read more →