I started strength training for the first time in January 2024, in my late 30s. I wish I’d started earlier, but it’s been a hugely positive change in my life. Some observations:

  1. Standing up straight is a lot easier; back muscles help with posture!
  2. Stability is cool. I’m noticeably better at tightening my core in daily life, balancing, etc.
  3. I can put much more power into specific movements (ex: pedal hard on a bike) before feeling exerted or losing control
  4. I can lift my gangly 85lb dog easily without worrying that I’ll mess up my back
  5. RSI pain in my arms + wrists is nearly gone

I’ve been going to the same gym 3x/week on average. They have a pretty good model where:

  1. They connect you with a specific personal trainer
  2. Before starting classes you do X training sessions, to make sure you have decent form and won’t injure yourself
  3. After starting classes you do a training session every other month or so
  4. The relationship with the trainer is a form of accountability; they notice if you miss classes for a couple weeks

The classes are Crossfit-ish; about 2/3 strength, 1/3 cardio. They’re surprisingly fun now that I know what I’m doing.

Why now?

Sometime in 2023 I saw people I respect in a professional context (Jack Rusher, Andreas Kling) talking about how it’s increasingly hard to build muscle as you grow older, and thought “hmm, concerning.”

Later I started thinking about New Year’s resolutions etc. (as one does), and reached out to a local gym on a whim.

Why didn’t I start earlier?

I’d never enjoyed lifting weights before, and I didn’t know how to do it safely. To be honest, I associated weight lifting with jock culture and looked down on it a bit. I’ve gone through on-and-off phases of going to the gym, but it’s always been individual cardio work. I didn’t enjoy team sports as a kid, and I’ve always been someone who prefers to figure things out on their own. That approach has served me well in some areas, but it wasn’t working for fitness.

Parting Advice

If you haven’t been able to commit to a fitness routine, try trading some money for training and a community of like-minded people. Expert advice is useful and social accountability works!

After 13 years of daily Twitter usage, I bit the bullet and switched to Bluesky (urbanism stuff, mostly) and Mastodon (computer stuff) full time.

I made friends on Twitter, I learned a lot, and I was part of a few communities that would not exist without Twitter. I’m proud of my small contributions to Vancouver urbanism over the years, and they mostly happened on Twitter or adjacent to it.

Leaving was sad but unavoidable; the site’s really gone downhill since Musk purchased it. The quality of discourse has plummeted now that the replies to any popular tweet are dominated by bluechecks. Twitter has a critical mass of shitty resentful people who wouldn’t be out of place on 4chan, and the site shoves their opinions in your face.

Anyway, it’s a few months in and I’m glad I made the change. I don’t love Mastodon, but Bluesky feels a lot like an earlier, more pleasant version of Twitter.

How I Use LLMs (Sep 2024)

Aider is pretty cool

It feels a bit early to be writing an update to something I wrote 1.5 months ago, but we live in interesting times. Shortly after writing that post, I started trying out Aider with Claude 3.5 Sonnet. Aider’s an open source Python CLI app that you run inside a Git repo with an OpenAI/Anthropic/whatever API key1.

My Aider workflow

  1. I direct Aider toward a file or multiple files of interest (with /add src/main.rs or similar)
  2. I describe a commit-sized piece of work to do in 1 or 2 sentences
  3. Aider sends some file contents and my prompt to the LLM and translates the response into a Git commit
  4. I skim the commit and leave it as is, tell Aider to tweak it some more, tweak it myself, or /undo it entirely

This works shockingly well; most of the time, Aider+Claude can get it right on the first or second try. This workflow has a few properties that I really like:

  1. It’s IDE-agnostic (no need to switch to something like Cursor)
  2. It’s very low-friction, which encourages trying things out
    1. No need to copy code from a browser, write commit messages, etc.
    2. Undoing work is trivial (just delete the Git commit or run /undo)
  3. It’s pay-as-you-go (I pay Anthropic by the token, no monthly subscription)

Prompts

Here are some examples of the prompts I do in Aider:

  • Library updates should be streamed to all connected web clients over a WebSocket. Add an /updates websocket in the Rust code that broadcasts updated LibraryItems to clients (triggered by a successful call to update_handler). The JS in index.html should subscribe to the WebSocket and call table.updateData() to update the Tabulator table
  • Add a new endpoint (POST or PUT) for adding new items to the library. It will create a new LibraryItemCreatedEvent, save it to the DB, apply it to the in-memory library, then broadcast the new item over the websocket
  • add a nice-looking button that bookmarks the current song. don’t worry about hooking it up to anything just yet
  • Add a new “test-api” command to justfile. It should curl the API exposed by add_item_handler and check that the response status code is CREATED
  • Write a throwaway C# program for benchmarking the the same SQLite insert as create_item() in lib.rs

I’m still developing an intuition for how to write these, but with all of these examples I got results that were correct or able to be fixed up easily. Sometimes I am very precise about what I want, and sometimes I am not; it all depends on the task at hand and how confident I am that the LLM will do what I’m looking for.

What does all this mean?

I dunno! The world is drowning in long-winded AI thinkpieces, so I’ll spare you another one.

All I know for a fact is that if I have a commit-sized piece of work in mind, there’s a very good chance that Claude+Aider can do it for me in less than a minute — today. I’m still exploring the implications of that, but Jamie Brandon’s Speed Matters post feels very relevant. I can try out more ideas and generally be more ambitious with my software projects, which is very exciting.


  1. You can also point Aider at a locally-hosted LLM, which is cool, but in my experience the quality is nowhere near as good as Claude. ↩︎

Slight departure from our usual programming: Riley Donovan (a writer from Salt Spring Island, who runs the “Dominion Review”) has some truly awful beliefs.

He was a frequent writer for the “Council of European Canadians”. For more context, see this post which was at the top of Reddit Vancouver.

This post used to contain a lot more detail, but Riley’s been submitting spurious complaints to get my website taken down and I don’t have time to deal with this.

I find LLMs to be pretty useful these days. I don’t consider myself to be on the frontier of LLM experimentation, but when I talk to (technical) people it sounds like my workflow is pretty uncommon, so I should probably write about it.

LLM (the command-line tool)

Simon Willison’s llm command-line tool is the primary way I use LLMs. I sometimes struggle to describe the appeal of llm to people because it’s boring. llm lets you do the following with any popular LLM (hosted or local):

  1. Ask the LLM one-off questions (optionally taking stdin as context)
  2. Start a chat session (optionally starting from the last ad-hoc question)

And that’s about it! It’s one of those lovely tools that does a few things well. I usually start sessions with exploratory questions/requests, sometimes piping in data:

cat xycursor.rs | llm "the end() function in this file is confusing, explain it"

And then if I need to follow up on a question, llm chat --continue drops me into an interactive chat that starts after the last question+response:

> llm chat --continue
Chatting with claude-3-5-sonnet-20240620
Type 'exit' or 'quit' to exit
Type '!multi' to enter multiple lines, then '!end' to finish
> write a comment explaining that function, using ASCII diagrams

Important things about this workflow:

  1. It’s trivial to “connect” the LLM to other data+files
    1. For example, every week I used to manually rewrite the output of this script to be more readable before publishing it; now I pipe it to llm and tell it to do an initial rewrite first
  2. llm makes it trivial to go from exploratory work to more focused iteration

I have llm set up to use this custom prompt, no matter what underlying LLM it’s using. I find that it helps make responses much more succinct.

GitHub Copilot

It’s good, I use it every day. It’s a lot more widely known than llm so I won’t spill too much ink over it.

Observations

I use LLMs and web search in a similar way: do a quick exploratory investigation into something, taking the initial results with a grain of salt. The skills+knowledge you need to evaluate Google results are very similar to the ones you need to evaluate LLM results!

I mostly use LLMs for computer stuff, and it’s often really easy to verify whether a programming/computing answer is any good; just try it out! LLMs are probably not quite as useful for fields where that’s not the case.

I’m happy with llm but it is, ultimately, a wrapper around a basic chat interface and we can probably do better. Claude Artifacts is very appealing in that it can offer a faster iteration cycle for web development (but is unfortunately coupled to an expensive subscription service), and Aider is interesting as a better way to give an LLM access to context from an entire code base. I’m hoping we’ll see more tools like these that extend what we can do with LLMs.

headshot

Cities & Code

Top Categories

View all categories