justin․searls․co

The Terms of Service are coming from inside the house!

I just received this e-mail directly from my Synology NAS, to alert me to a change in its data collection policy. Who is the "our", here?

If a device in my house e-mails me from inside my house, kinda seems like the data it's collecting should also be in my house?

Unifi has a neat way of sorting dates

This UI, which appears to be the result of a query like ORDER BY year DESC, date ASC is a violence.

Enter your iPhone passcode to set up your Mac

Gun-to-head, there's no way in hell I would successfully draw the flowchart of account states and security responses necessary for me to land on this screen.

(I have no idea where this iPhone 11 Pro even is!)

visionOS Algorithm Failure Detected

Neat.

Epic Inbox Zero

I am generally extremely on top of my inbox, but I don't know if I can get through 18 quintillion e-mails by end-of-day.

Captchas have really gotten away from us

Thanks to recent advancements in AI, the only way to pass this captcha and prove you're a human is to mutter, "what the fuck are we even doing here anymore," into your device's microphone.

Better 404 design

There are exactly three things I want from a 404 page:

  1. Something approaching an apology
  2. An easy way to report the broken link
  3. Copy that might elicit a sensible chuckle

This page only took a few minutes to make. The "let us know" link pre-populates the entire e-mail and is implemented in a Rails view thanks to a helper method that makes constructing mail_to links a little nicer:

def mail_to_url(email, **options)
  "mailto:#{email}?" + options.map { |k, v|
    "#{k}=#{ERB::Util.url_encode(v)}"
  }.join("&")
end
<%= link_to "let us know", mail_to_url("support@betterwithbecky.com",
  subject: "I got a 404!",
  body: "I clicked a link that led me here, but got a 404 message:\n\n#{request.url}"
) %>

Wish people spent more time sweating details like this.

GPT 3.5 is a lot worse than GPT 4

It should shock no one to learn that Open AI's newer, better language model is an improvement over the old one, but if you aren't an active user of any of this newfangled AI stuff, it can be easy to lose track of just how much better things are getting and how quickly.

If you subscribe to GPT Plus, ChatGPT will also implement the ReAct pattern for requests it thinks can be formalized, which is one way to mitigate hallucinations.

Pictured here, asking "days between 12/10 and 2/11":

  1. GPT 3.5, which gets it completely wrong with a nonsensical reasoning
  2. GPT 4, which gets it right and even has a little terminal prompt link
  3. Opening up that link will actually show you a Python script GPT 4 used to compute the answer

Cool beans. 🫘

Vision Pro with the Good Strap

Following up on my post from this morning on how to use a 3rd party "halo" strap for Vision Pro, my incredible brother Jeremy printed and sanded these adapters for me. The experience wearing this strap is night-and-day better than either of Apple's built-in straps. The headset's weight is finally where it should be.

Still got it

10 pounds. 19 liters. Vision Pro, MacBook Air, spare battery, and all the clothes and toiletries I need to travel indefinitely.

Still got it.

Neat HomePod Update

The latest batch of 17.3 updates appear to have nuked all my HomePods. Very neat.

Trying VS Code's Terminal Loader instead of foreman or overmind

I did a video about debugging Rails in Visual Studio Code a couple years ago that showed off how to use the remote interface of the debug gem with Rails 7's Procfile-based bin/dev workflow. Using foreman or overmind and the remote debugger interface is fine but it's honestly no replacement for the developer experience of running binding.irb directly against a dedicated terminal running nothing other than rails server.

So I decided to give this Terminal Loader extension a try to see if I could have my cake and eat it too: a one-shot way to run all of my development servers across multiple terminals. The verdict? It works!

  1. Install the extension
  2. Run the command TLoader: Load Terminals (via Command-Shift-P) once, which will:
    • Launch a couple dummy terminals with split-views, which you can feel free to kill manually
    • Create a workspaceConfiguration/LoadTerminal.json, which you can (and should, IMO) add to .gitignore
  3. Edit the LoadTerminal.json file to specify which terminal groups you want to open, how many columns per group, and the commands to run for each one

This is my config for a straightforward Rails 7 app that runs the Rails server, the tailwind CLI, a Rails console, and Solid Queue. Because I don't typically need to interact with tailwind or my queue daemon, I relegated those to a shared terminal group. And while I didn't have need for it in this case, I appreciate that the extension allows you to set a different working directory for each terminal, which will be a huge boon to my projects that embed sub-libraries and example apps.

Here's my first crack at a LoadTerminal.json for this project:

{
  "version": "1.2.1",
  "groups": [
    {
      "name": "Rails Server",
      "description": "Rails Server",
      "enabled": true,
      "terminals": [
        {
          "name": "server",
          "path": ".",
          "cmd": [
            "env RUBY_DEBUG_OPEN=true bin/rails server -p 3000"
          ],
          "num": 0
        }
      ]
    },
    {
      "name": "Rails Console",
      "description": "Rails Console",
      "enabled": true,
      "terminals": [
        {
          "name": "console",
          "path": ".",
          "cmd": [
            "bin/rails console"
          ],
          "num": 0
        }
      ]
    },
    {
      "name": "Other",
      "description": "Tailwind / Queue",
      "enabled": true,
      "terminals": [
        {
          "name": "tailwind",
          "path": ".",
          "cmd": [
            "bin/rails tailwindcss:watch"
          ],
          "num": 0
        },
        {
          "name": "queue",
          "path": ".",
          "cmd": [
            "bin/rake solid_queue:start"
          ],
          "num": 0
        }
      ]
    }
  ]
}

Seems to work fine! Nice change of pace not having to juggle virtual-terminals-within-an-electron-wrapper-within-a-terminal anymore.

What if I replaced myself with a chatbot?

Potential preview of coming attractions.

The entire reason I started blogging was to avoid repeating myself to people, so the prospect of uploading a corpus of hundreds of thousands of words I've written and hundreds of open source repositories I've created to build a Searls-flavored ChatGPT was immediately attractive.

Unfortunately, it still dishes takes I disagree with too often for me to turn it on publicly. Unclear whether this custom GPT feature represents a very thin candy shell with a lot of ego projection and wish-casting to make it seem more "real".

Filtering iCloud Shared Photo Library by Contributor

Since its release last year, how to filter the photos in our shared library to only show the photos I contributed has eluded me. Individual photo metadata shows who contributed a photo (and in the case of duplicates, multiple people might have contributed the same photo), but there was no way to view one's contributions in bulk.

After a few months of latent frustration, I figured out a way!

In the search bar, enter the e-mail address of the contributor's Apple ID and you should see a auto-suggestion like "👥 Shared by person@example.com".

If you're on macOS and you want to create an album of just these photos, you can create a smart album by selecting "Text" as your criteria, "is" as your condition, and the e-mail address (e.g. "person@example.com") as the text, and the album will include the same set of photos.

Nifty!

Return of the Swipe!

watchOS 10 removed one of my favorite Apple Watch features, swapping the active watch face by swiping from left or right. Well, it's back by popular demand in watchOS 10.2, but it's hidden behind this setting.

Settings ➡ Clock ➡ Swipe to Switch Watch Face

Trimming the Tree

You know what's easier than hanging lights on a tree? Hanging a picture of a tree that embeds battery-powered lights.

Conference Speaking Prevention Hotline

I realize that people find public speaking to be extremely scary, but I didn't realize it was THIS bad.

Paywall Logic

Is this a preview of one of the puzzles included in my subscription? Is this a Wordle? Am I in a Wordle?

Will paying yearly save me from having to do math?

Quest Complete

I just received this email from my ENT's second-rate patient portal. Apparently they thought it made sense to treat appointments like quests to be completed? If I go often enough will I start earning achievements?

Staples is getting thirsty

Earlier this year when Amazon announced Staples stores would start accepting returns, I figured Staples was trying to increase foot traffic to its failing retail stores. I did not expect that they would be so thirsty that they'd pay customers $10 to do so.

I'm sure they'll make it up in volume.