Happy Day of the Dude on this first day of Carpet Diem.

May you mark all strikes, no gutters.

We just finished “Shogun”, and it’s going to take me a day or two to decide what I think about that ending.

A Case for Turning Tulsa Into the Next Big Tech Hub | WIRED

Requirements OK will never meet:

  • Better politics. Techies are largely for individual rights. The Midwest largely isn’t.
  • Better worker protections. Great tech jobs aren’t usually in right to work states.
  • Employees own their ideas. In CA, for example, you can launch your own startup while still working for someone else. In the places in the Midwest I’ve lived, your employer generally owns things you create while working for them.

If you don’t build those, they won’t come.

I bought a 50MB (yes, megs) HD from an acquaintance. It was freaking slow connected to my Amiga, like 20-30KB per second. It also made a horrible high-pitched whine.

Figuring I had nothing to lose, I turned it over and squirted some 3-in-1 oil on the motor spindle. The whine started increasing in pitch as it quietened, and slowly the HD benchmark program started creeping up toward a more reasonable 1MB/s or so. I didn’t use that drive afterward, and just copied the, ahem, public domain apps and games off it and then threw it away.

I have not before or since sped up a computer by oiling it.

Golden Gate Bridge as seen from the Presidio.

Looking down along the length of the Golden Gate Bridge against a blue-green bay, distant cliffs, and a partly cloudy, sunny sky.

AWS WAF now uses /64s instead of /128s for IPv6 rate-limit bucketing. That’s a huge and welcome improvement!

June Bug, the new kitty, is mad at me for flinging her off the bed last night. By extension, so is my wife. But here’s how it went at 2AM:

Cat sees my ankle under the blanket, watches it, then pounces on it and bites it. I laugh and say stop that, kitty. I go back to sleep.

Cat sees my knee under the blanket, watches it, then pounces on it and bites it. I laugh and say stop that, kitty. I go back to sleep.

Cat sees my middle under the blanket, watches it, then pounces on it and 🐈🪽💨.

June Bug is starting to relax into her new home.

An orange-tinged tortoiseshell kitty with yellow eyes is laying on a fuzzy blanket and looking at the camera. Her tail is wrapped around her.

Girl Scout outside the grocery: Sir, would you like to buy some cookies?

Me: I’ll catch you on the way out.

Scout: We’re about to leave.

Me: OK, you talked me into it. My wife told me I’m not allowed to bring a bunch of these home, though.

Scout: What kind does she like? Get some of those and then she won’t mind!

And that’s how they got me.

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.

Jort is sucking a blanket and making biscuits. #caturday

A tortoiseshell kitty with a pink collar has a blanket in her mouth. Not seen: she’s kneading the blanket and purring loudly.

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.

Jort also likes learning about synthesizers.

A kitty is staring intently at TV showing a closeup of a synthesizer control panel.

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?

Amiga 1000 was a 32 bit computer

I’ve heard people describe the Amiga 1000 as a 16 bit computer a few times lately and it always catches me off guard. It was usually, defensibly, referred to as a 32 bit computer at the time.

Some of its implementation details were 16 bit, like the data bus and ALU, but they were largely invisible to users and programmers. Assembly code used 32 bit math instructions, even if the CPU executed them in 2 steps. It had a flat 32 bit address space, although only 24 address lines were implemented (kind of like how not all 64 address lines are available on a 64 bit CPU today). Registers were 32 bits wide. And later 68K CPUs could run A1000 software on pure 32 bit CPUs natively with no emulation or trickery.

Credit it with those extra 16 bits. It earned them.