We wrote a pretty powerful AWS infra tool in Python, and haven’t done much with it in a couple years except to update its dependencies.

I’m kinda thinking about porting it to Rust to get some extra type constraints (it’s already mypy-clean, but…) and make it a single executable deployment.

Today I learned you can’t just go adopt a cat. I figured you’d show up, find one you get along with, and then they’d put it in a bag or whatever for you and you’d take it home. Nope. There’s a lot more to it than that.

That feels a little counterproductive. Sure, you don’t want any weirdo to come in and leave with a living animal. At the same time, I’d think it would be a little easier and not require multiple visits and interviews. It’s a cat, not an infant.

I'm coming around to AI-assisted programming

I’m working on a personal project where I saved some initial programming time by hardcoding a lot of configuration, like:

let board_menu = Menu {
    name: "Board".to_string(),
    help_suffix: "B".to_string(),
    commands: vec![
        Command {
            arg: "B".to_string(),
            help: "Board list".to_string(),
            pattern: make_pattern("b"),
            available: available_always,
            func: board::board_lister,
        },
        Command {
            arg: "Bn".to_string(),
            help: "Enter board #n".to_string(),
            pattern: make_pattern(r"b\s*(\d+)"),
            available: available_always,
            func: board::board_enter,
        },
        ...
    ],
};				

I wanted to turn that into a config file so that other users could tweak it without editing code or having to recompile. I opened a new file in my editor which I had connected to GitHub’s Copilot free tier, saved it as “config.json”, and pasted the Rust code into the file so the AI would have something to look at. I started typing:

{
  "menus": {
    "board": {

Then I paused for a second. Copilot came up with this autocompletion:

{
  "menus": {
    "board": {
      "name": "Board",
      "help_suffix": "B",
      "commands": [
        {
          "arg": "B",
          "help": "Board list",
          "pattern": "b",
          "available": "available_always",
          "func": "board::board_lister"
        },
        {
          "arg": "Bn",
          "help": "Enter board #n",
          "pattern": "b\\s*(\\d+)",
          "available": "available_always",
          "func": "board::board_enter"
        },
        ...
      ]
    }
  }
}

Now, I’m perfectly capable of hand-editing my original code to a new format. I’ve done that roughly a zillion times in my career. I know how to do it. But that would’ve taken several minutes of drudgery (unless I wrote a macro or something to automate it, in which case it would’ve only taken a couple of hours). Copilot’s suggestion was exactly, to the letter, what I would have written manually, in a fraction of the time.

I have no interest in letting AI write code for me. I tell people that writing software is my favorite thing in the world, and they laugh, but I’m not joking. I wouldn’t let a computer take over my hobby any more than I’d let it play my piano for me, or feed my cat for me, or write my journal for me. I like doing those things. However, if it wants to take care of the mechanical grunt work like this while I concentrate on the more interesting bits, I’m happy to let it try.

This PlayStation Network outage is about to irk me. I just wanna play some Diablo.

Credit Karma stopped accepting my decade-old Google Voice phone number for 2FA. It won’t let me change to use my regular number because we were already using that for my wife’s account (which she asked me to manage for her). Their support’s idea for resolving this? Just ask Verizon for a new temporary phone number each month or so forever.

Um, no.

Tapestry is out now

Tapestry from Iconfactory is out now and you should get it. I’ve been using it for months in beta instead of my usual RSS reader. It’s a delightful re-thinking of what such a thing can be like. Imagine a chronological timeline of all your fave news sources that you deliberately choose, be they websites, people on Mastodon, comics, podcasts, YouTube channels, or whatever, in one beautiful app.

One big difference between Tapestry and other readers is that its “connectors” aren’t limited to just RSS. They’re open source and you can write your own. Want to see new calendar events in your feed? You could make that happen. Amazon orders? Why not! The Apple Music songs your friends are listening to? Sure! Yeah, I’ve been planning a few connectors of my own.

Tapestry is on my home page. When I have a few minutes, I open it instead some random doomscroll. I’m happier for it.

My wife ordered a new shower curtain that is advertised as, quote, “waterproof”. I would hope so.

I wish monitors had frame buffers and that video out could optionally just send diffs. I have 2 4K monitors and I’m trying to figure out how to easily switch them between home and work computers. I keep bumping against hardware limits. I understand that being an issue for gaming, but I just want to run Emacs on a large screen. I could handle that over a DSL connection and Screen Sharing. Why do I need multiple Thunderbolt ports to display mostly static content?