Posts

Pieces I’ve written.

Climbing Further Up the Stack

Buildings on a street

As Gen AI programming tools continue to develop, I’m wondering what things will look like when we remove the human from the loop.

At that point, all the code that’s generated is solely for the AI. All the human-focused concerns we care about in code disappear—it becomes a black box. The code effectively becomes another intermediate language for a new layer on the stack.

As long as the solution fulfils its requirements and fits within the constraints of security and cost for the necessary performance, we’re happy.

Code structures and data schemas don’t matter—so long as the AI can refactor them to meet new requirements as they emerge.

It reminds me of stories of when assembly programmers first saw these flash new C compilers arrive on the scene and generate all this assembly code that no human had directly written.

A Raycast Extension to Search My Blog

A screen shot of Raycast running my new extension

I’ve been looking for a way to search through the local copy of my blog using Raycast.

I ended up writing a custom extension to do it. ChatGPT helped grease the way—especially in rendering the results.

It uses a brute force grep over the files’ contents which works fine given the size of the repository.

The two main actions on the extension are opening the post in my editor and copying a Markdown link to the post1.

Here is a look at the Raycast command:

export default function Command() {
  const [query, setQuery] = useState<string>("");
  const [results, setResults] = useState<SearchResult[]>([]);

  useEffect(() => {
    if (query.trim() === "") {
      setResults([]);
      return;
    }
    try {
      const posts = getAllPosts(BASE_PATH, BLOG_SUBDIRS);
      const matches = searchPosts(posts, query);
      setResults(matches);
    } catch (err) {
      console.error("Error reading blog posts:", err);
    }
  }, [query]);

  return (
    <List onSearchTextChange={setQuery} throttle isShowingDetail>
      {results.map(({ file, snippet }) => {
        const filename = path.basename(file);
        const relativePath = path.relative(BASE_PATH, file).replace(/\\/g, "/");

        // Convert to URL relative from site root based upon Hugo URL config
        const relativeUrl = `/${relativePath.replace(/\.md$/, "").replace(/\/\d\d\d\d-/, "/")}`;

        // Grab the title from the front matter
        const fileContent = fs.readFileSync(file, "utf8");
        const titleMatch = fileContent.match(/^title:\s*(.*)$/m);
        const title = titleMatch ? titleMatch[1].replace(/^['"]|['"]$/g, "") : filename;
        const markdownLink = `[${title}](${relativeUrl})`;

        return (
          <List.Item
            key={file}
            title={snippet.replace(/\*\*/g, "")}
            detail={<List.Item.Detail markdown={`**${relativeUrl}**\n\n---\n\n${snippet}`} />}
            actions={
              <ActionPanel>
                <Action.Open title="Open in VS Code" target={file} application="/Applications/Visual Studio Code.app" />
                <Action.CopyToClipboard title="Copy Markdown Link" content={markdownLink} />
              </ActionPanel>
            }
          />
        );
      })}
    </List>
  );
}

And here is the full file.


  1. Which is handy when cross linking while writing other posts. ↩︎

100 Days In

I’m over 100 days into my black & white a day project.

I inevitably end up shooting around the house and neighbourhood most days. This is forcing me to find novel perspectives on things I regularly pass. It’s also making me appreciate the different light over the course of the day.

Some days I struggle to get something good. That’s ok, photography, like most things, is a numbers game.

Black & White 365

I’m taking on a 365 photo challenge this year: capturing at least one black and white photo each day and adding it to my journal.

I haven’t focused on black and white photography since parting with my film cameras, so I’m excited to get back into it and hopefully improve.

Six days in, and I’m enjoying it so far.

K'gari

K’gari (Fraser Island) is beautiful.

We spent a few days there between Christmas and New Years.

It was the busy season and the island was packed with four wheel drivers. It felt like there were about fifty vehicles parked up for a swim at Eli Creek while we were there. We never felt crowded though, the island is huge.

Everyone bangs on about Lake McKenzie, and for good reason, it is beautiful.

The Illumina light show was an audiovisual delight.

The island is well worth a visit.

Things I Enjoyed in 2024

Let’s rip though a bunch more media, and a couple of products, that I enjoyed in 20241.

Music

Music is easily the most consumed media for me this year. Here’s a few albums I enjoy.

Love Changes Everything — Nothing like a Dirty Three album.

Little Rope — Hell of an album opener.

Teenage Snuff Film — Digging into my Australian music history.

Wild God — Good to have another Bad Seeds album.

Eleanor Jawurlngali — An ethereal voice.

Songs of a Lost World — I don’t listen to The Cure much. This new album is great.

I’m totally fine with it 👍 don’t give a fuck anymore 👍 — Loving these guys.

No Name — Grimy Jack White.

TV Shows

Turns out I still watch quite a bit of TV.

What we do in the Shadows — Final season. Better than the previous one. It was the right time to bow out. Laszlo and Nadja forever.

The Diplomat — Caught up on the first two seasons. Bit of London. Bit of politics. Bit of espionage.

Fisk — Caught up on the first three seasons. Cracks me up.

Drops of God — Wine-based superhero comic story. Yep, that’s right.

Industry — Season three was the best yet. The finale was fantastic.

The Bear — Season three felt like it was a bit padded out, but it still had its high points, like the episode Napkins.

Outer Range — Weird as shit.

Shogun — Kept me rapt.

The Gentlemen — Geezers geezering.

Blue Eye Samurai — Makes me want to watch more animated fare.

Mr and Mrs Smith — Great mix of character and action.

Fargo - Season five was a return to form.

Black Doves — Worth it just for the Irish assassins.

Movies

I need to watch more movies instead of TV.

Dune: Part Two — Technically brilliant.

Furiosa — George Miller is a genius.

Books

I fell off the reading wagon pretty hard this year.

Wool — Read this after watching Silo season one. Good sci-fi.

Infinite — I’ve been fascinated with immortality stories ever since watching Highlander.

Rubicon — An ancient Roman violent soap opera.

Road to seeing — One of my favourite photo books.

Podcasts

My regulars with a couple of new entries.

The Rest is History — The lads continue to produce good series. The French Revolution and Custer hooked me.

Conversations with Tyler — The density of ideas in these remains high.

The Watch — One for the CR heads.

The Rewatchables — Makes me laugh.

Bandsplain — Love the Grunge season.

The Big Picture — The more unhinged the draft show, the better.

Dithering — I enjoy when they bring up new angles on tech-related news.

Lenny’s Podcast — New to the rotation. Good for getting a view of product management.

Acquired on Microsoft — Two episodes running through the history of Microsoft.

Games

Playing games is the most reliable way for me to “switch off”. I don’t play loads. There are a couple of new additions this year.

Balatro — Roguelike poker game. Is killer on iPad.

Astro Bot — Sony found their Super Mario.

Greed — Dice game that’s great for the whole family.

Products

Yeti stubby cooler — Keeps those drinks cold.

Apple Watch Ultra 2 — In Batman black for maximum stealth.

Le Creuset Casserole — Grab one on sale and keep it forever.

Fujifilm GF 63mm F2.8 Lens — A good sized, fast, 50mm prime equivalent for the 100S.