kait.dev

Because I use this like three times a year and always have to look it up: When you want to merge folders of the same name on a Mac (e.g., two identically named folders where you want the contents of Folder 1 and Folder 2 to be in Folder 2), hold down the option key and drag Folder 1 into the container directory of Folder 2. You should see the option to merge.

Note that this is a copy merge, not a move merge, so you'll need to delete the source files when you're done. It also appears to handle recursion properly (so if you have nested folders named the same, it'll give you the same option).

Did I almost look up a whole app to do this? Yes, I did. Is it stupid this isn't one of the default options when you click and drag? Yes, it is.

This post brought to you by Google Drive's decision to chunk download archives separately (e.g., it gives me six self-contained zips rather than 6 zip parts). Which is great for failure cases but awful on success.

Love is for Losers cover

Love is for Losers

by Wibke Bruggeman

Highly Recommended

Whyyy do I feel so seen when I read these books?

Oh, right, queer book website. Duh.

Every thought, action and emotion that flitted through main character's Phoebe's mind made absolute sense to me. The tight, choppy prose (the entire novel is presented as a particularly terse teen's personal diary) immediately told me who this girl was and how she saw life. How confusing interpersonal relationships seemed to be, veering from one end of the emotional spectrum to the other with hardly a breath inbetween. The whiplash as you try to tamp down the hard, bad feelings no matter how much they struggle and whimper, only to have them explode out from your grasp when you least expect it.

Writing characters on the autism spectrum is hard. (I'm going to take a wild leap of faith here and assume Phoebe is on the autism spectrum, despite never being officially confirmed in the novel.) Much in the same way that depictions of mental illness handled incorrectly can seem trite or patronizing to those who actually have those conditions, too often autism comes off as performative, a collection of traits or tics or quirks instead of a character.

Phoebe, on the other hand, feels authentic and true in a way I haven't often encountered in a novel, especially one aimed at younger readers. Both in how she relates to herself and others, I can 100% confirm her actions are, if not exactly how I would act, completely within the realm of possibility. In that portrayal, I can see how some people might be put off by the book (much in the same way I find some neurotypical folks are put off by neurospicy behavior and thinking). 

Though I don't think I can classify this novel as happy or peppy, it was nevertheless driven and energetic. It doesn't have a sad ending, per se, but it's not all sunshine and rainbouws (no, that's how they spell it in England, it's fine). But oh my gosh, this book was a wonderful chance to step outside myself and see the world filtered through someone else who thinks just like me. And that's so rare and valuable, I can't help but cherish it.

Synopsis

In this wry and hilarious queer YA romantic comedy, fifteen-year-old Phoebe realizes that falling in love is maybe not just for losers. Did you know you can marry yourself? How strange / brilliant is that? Fifteen-year-old Phoebe thinks falling in love is vile and degrading, and vows never to do it. Then, due to circumstances not entirely in her control, she finds herself volunteering at a local thrift shop. There she meets Emma . . . who might unwittingly upend her whole theory on life. This is a laugh-out-loud exploration of sexuality, family, female friendship, grief, and community. With heart and hilarity, Wibke Brueggemann's sex-positive YA debut is perfect for readers who love *Heartstopper* and Casey McQuiston.

Dislcaimer: I am not receiving any affiliate marketing for this post, either because the services don't offer it or they do and I'm too lazy to sign up. This is just stuff I use daily that I make sure all my new computers get set up with.

My current list of must-have Mac apps, which are free unless otherwise noted. There are other apps I use for various purposes, but these are the ones that absolutely get installed on every machine.

  • 1Password Password manager, OTP authenticator, Passkey holder and confidential storage. My preferred pick, though there are plenty of other options. ($36/year)

  • Bear Markdown editor. I write all my notes in Bear, and sync 'em across all my devices. It's a pleasant editor with tagging. I am not a zettelkasten person and never will be, but tagging gets me what I need. ($30/year)

  • Contrast Simple color picker that also does contrast calculations to make sure you're meeting accessibility minimums (you can pick both foreground and background). My only complaint is it doesn't automatically copy the color to the clipboard when you pick it (or at least the option to toggle same).

  • Dato Calendar app that lives in your menubar, using your regular system accounts. Menubar calendar is a big thing for me (RIP Fantastical after their ridiculous price increase), but the low-key star of the show is the "full-screen notification." Basically, I have it set up so that 1 minute before every virtual meeting I get a full-screen takeover that tells me the meeting is Happening. No more "notification 5 minutes before, try to do something else real quick then look up and realize 9 minutes have passed." ESSENTIAL. ($10)

  • iTerm2 I've always been fond of Quake-style terminals, so much so that unless I'm in an IDE it's all I'll use. iTerm lets a) remove it from the Dock and App Switcher, b) force it to load only via a global hotkey, and c) animate up from whatever side of the screen you choose to show the terminal. A+. I tried WarpAI for a while, and while I liked the autosuggestions, the convenience of an always-available terminal without cluttering the Dock or App Switcher is, apparently, a deal-breaker for me.

  • Karabiner Elements Specifically for my laptop when I'm running without my external keyboard. I map caps lock to escape (to mimic my regular keyboards), and then esc is mapped to hyper (for all my global shortcuts for Raycast, 1Password, etc.).

  • NextDNS Secure private DNS resolution. I use it on all my devices to manage my homelab DNS, as well as set up DNS-based ad-blocking. The DNS can have issues sometimes, especially in conjunction with VPNs (though I suspect it's more an Apple problem, as all the options I've tried get flaky at points for no discernible reason), but overall it's rock-solid. ($20/year)

  • NoTunes Prevents iTunes or Apple Music from launching. Like, when your AirPods switch to the wrong computer and you just thought the music stopped so you tapped them to start and all of a sudden Apple Music pops up? No more! You can also set a preferred default music app instead.

  • OMZ (oh-my-zsh) It just makes the command line a little easier and more pleasing to use. Yes, you can absolutely script all this manually, but the point is I don't want to.

  • Pearcleaner The Mac app uninstaller you never knew you needed. I used to swear by AppCleaner, but I'm not sure it's been updated in years.

  • Raycast Launcher with some automation and scripting capabilities. Much better than spotlight, but not worth the pro features unless you're wayyyy into AI. Free version is perfectly cromulent. Alfred is a worthy competitor, but they haven't updated the UI in years and it just feels old/slower. Plus the extensions are harder to use.

  • Vivaldi I've gone back to Safari as my daily driver, but Vivaldi is my browser of choice when I'm testing in Chromium (and doing web dev in general. I love Safari, but the inspector sucks out loud). I want to like Orion (it has side tabs!). It keeps almost pulling me back in but there are so many crashes and incompatible sites I always have to give up within a week. So Safari for browsing, Vivaldi for development.

Still waiting for that SQL UI app that doesn't cost a ridiculous subscription per month. RIP Sequel Pro (and don't talk me to about Sequel Ace, I lost too much data with that app).

OK, so it's not exactly "new" anymore, but this is the accessibility talk I gave at Longhorn PHP in Nov. 2023. And let's be honest, it's still new to 99% of you. My favorite piece of feedback I got was, "I know it's about 'updates,' but you could have provided an overview of the most common accessibility practices." Bruh, it's a 45-minute talk, not a 4-hour workshop.

Canadian Boyfriend cover

Canadian Boyfriend

by Jenny Holiday

Must Read

The joke drew me in, but the clarity and earnestness of the writing kept me through the end. I had not actually heard about the Canadian girlfriend until the musical Avenue Q, but it's a well-trod trope: Oh, you see, I do have a significant other, they just live far away (in Canada, usually). It's a way of saving face in front of others without ever needing to produce said person, and it rarely works as well as those who deploy it might hope.

I don't even want to get into the specifics all that much, because I feel like the reveals and the plot advancements really go hand-in-hand. Suffice it to say, one of Rory's three jobs involves teaching at a local ballet school, and she has a minor crisis when her own Canadian Boyfriend unexpectedly shows up after an intervening decade-plus, mourning his deceased wife. Hilarity ensues.

There's a meet-cute, and some adorable stumbling and mixups, but the overwhelming feeling I took away from this novel is contentment. Which is odd, given the context and the fairly in-depth discussions of and visits to therapy we get from both the mains! But these characters are so lovingly and realistically presented, with flaws and hope and charm, that I couldn't help but be swept up. Even when issues and problems are confronted, the book doesn't shy away or seem to take the easy route. There's conflict and difficulty, but there's also an underlying layer of care (from both the author and the characters) holds the surges before they overwhelm.

A wonderful book you'll want to sit with and luxuriate in. I'm only upset the follow-up is still a year-plus away!

There's a particularly spirited dispute over the definition of "hosers" that I think gets close to the truth but doesn't quite nail it. Though, as someone who grew up in a state that only touched Canada, my opinion probably doesn't get me very far.

Lacking vision

Link Lacking vision

It is incredible that all of this works with just a single button click, but all that scaling complication also explains the bad news: you can only have a single Mac display in visionOS. You can’t have multiple Mac monitors floating in space. Maybe next time.

Where does it end

Link Where does it end

management's quest to see how much more cheaply an increasingly poor product can be sold at the same price and under the same name as what came before is, at bottom, the story of basically every industry or institution currently in decline or collapse.

The race to the bottom is a problem because nobody knows where to go once you've won

See almost all current commercial applications of AI, for example.

Despite Universal's false narrative and rhetoric, the fact is they have chosen to walk away from the powerful support of a platform with well over a billion users that serves as a free promotional and discovery vehicle for their talent.

— TikTok, on Universal Music Group’s decision to pull its music from the service

LMAO, TikTok really said UMG shouldn't get mad because they're getting paid in exposure. In my younger years I might have written a pithy parody of "First they came...", but now I’m just hopeful people will hear the clarion call of even large corporations demanding to get paid what they're worth as a sign they should do the same.

Music Find it streaming

Alina Gingertail's name sounds like a D&D character, but her music sounds like every Gaelic-ish song I hear in movies where, when I look it up, find out the artist has released exactly one song in that style ever.

Also, HOW does YouTube Music still not have embeds???

At some point companies and orgs are going to learn that when you attune so sharply to the feedback loop, you only hear the loudest voices, who are usually a small minority. If you only cater to them, you’re dooming yourself to irrelevance.

This post was brought to you by my formerly beloved TV series Below Deck

I had an old TV lying around, so I mounted it on my wall vertically. I grew up on StatusBoard, which was especially invaluable in newsrooms in the early aughts (gotta make that number go up!). I figured as I got deeper into self-hosting and my homelab I'd want some sort of status board so I could visualize what all was running, and partially just because everybody gets a dopamine hit from blinkenlights when they buy new stuff.

I was wrong! I in fact don't care what services are running or their status - I'll find that out when I go to use them. And since I mounted it on the wall, it wasn't particularly helpful for actually connecting to the various computers for troubleshooting. So I had to find something to do with it.

I loaded Dakboard on it for a while, which is pretty nice for digital signage. If I actually wanted to show my calendar, I would have stuck with them to avoid having to write that integration myself. But since my calendar already lives on my watch, in my pocket and in my menubar, I decided I didn't need it on the wall as well. And who wants to spend $4 on a digital picture frame???

So I built my own little app. I spun up a plain Typescript project, wrote an RSS parser, connected a few free photo APIs (and scraped the Apple TV moving wallpapers), and connected to my Plex server through Tautulli to get the data about what was currently playing. I got all of it wired up and ...

I hated it. Too much whitespace visible, and I felt compelled jack up the information density to fill the space. Otherwise, it was just sitting there, doing nothing. I for a second half-wished I could just throw up an old iPhone on the wall and be done with it.

And that's when it struck me. Why not use some physical design traits? Though skeumorphism got taken too far after the iPhone was first released, it feels we overcorrected somewhat. There's something to be said for having a variety of metaphors and interfaces and display options.

So that's where my first draft took me.

A screenshot of the application. The top half looks like a picture inside a mat, complete with shadow. The bottom looks like a desk, with a piece paper that has headlines written on it slide partially underneath an old iPod Video

Honestly, I really like it! I like the aesthetics of the older iPod, seeing actual layers of things and some visual interest where the metaphor holds together visually. It's giving me serious "faux VR vibes" nostalgia like the software from the early 00s such as Win3D.

But I couldn't stop there. After all, I'd get burn-in if I left the same images on the screen for too long. So, every 12 minutes or so, when the image/video updates, there's a 50% chance the screen will shift to show the other view.

A screenshot of the second mode of the application. The top half has a faux wood grain background with a sheet of notebook paper with headlines written on it, slid underneath a Microsoft Zune MP3 player

No vendor lock-in, here!

Not everything has to use the same design language! Feels like there’s a space between all and nothing. “Some.” Is that a thing? Can some things be flat and some skeuomorphic and some crazy and some Windows XP?

We can maybe skip over Aero, though. Woof.

I've recently been beefing up my homelab game, and I was having issues getting a Gotify secure websocket to connect. I love the Caddy webserver for both prod and local installs because of how easy it easy to configure.

For local installs, it defaults to running its own CA and issuing a certificate. Now, if you're only running one instance of Caddy on the same machine you're accessing, getting the certs to work in browsers is easy as running caddy trust.

But in a proper homelab scenario, you're running multiple machines (and, often, virtualized machines within those boxes), and the prospect of grabbing the root cert for each just seemed like a lot of work. At first, I tried to set up a CA with Smallstep, but was having enough trouble just getting all the various pieces figured out that figured there had to be an easier way.

There was.

I registered a domain name (penginlab.com) for $10. I set it up with an A record pointing at my regular dev server, and then in the Caddyfile gave it instructions to serve up the primary domain, and a separate instance for a wildcard domain.

When LetsEncrypt issues a wildcard domain, it uses a DNS challenge, meaning it only needs a TXT record inserted into your DNS zone to prove it should issue you the server. Assuming your registrar is among those included in the Caddy DNS plugins, you can set your server to handle that automatically.

(If your registrar is not on that list, you can always use

certbot certonly --manual

and enter the TXT record yourself. You only need to do it once a quarter.)

Now we have a certificate to use to validly sign HTTPS connections for any subdomain for penginlab.com. You simply copy down the fullchain.pem and privkey.pem files to your various machines (I set up a bash script that scps the file down to one of my local machines and then scps it out to everywhere it needs to go on the local network.)

Once you have the cert, you can set up your caddy servers to use it using the tls directive:

tls /path/to/fullchain.pem /path/to/privkey.pem

You'll also need to update your local DNS (since your DNS provider won't let you point public URLs at private IP addresses), but I assume you were doing that anyway (I personally use NextDNS for a combination of cloud-based ad-blocking and lab DNS management).

Bam! Fully accepted HTTPS connections from any machine on your network. And all you have to do is run one bash script once a quarter (which you can even throw on a cron). Would that all projects have so satisfying and simple a solution.

I'm definitely not brave enough to put it on a cron until I've run it manually at least three times, TBH. But it's a nice thought!

Re: Apple’s convoluted EU policies

It's surprising how often D&D is relevant in my everyday life. Most people who play D&D are in it to have fun. They follow the rule - not just the letter of the law, but the spirit.

But every once in a while you'll encounter a "rules lawyer," a player who's more concerned with making sure you observe and obey every tiny rule, punish every pecadillo, than actually having fun.

All the worse when it's your GM, the person in charge of running the game.

But there's one thing you learn quickly - if someone is trying to game the rules, the only way to win (or have any fun) is play the game right back.

For smaller/mid-tier devs, if you're only offering free apps you should probably just continue in the App Store.

But for larger devs who might run afoul of the new guidelines where apps distributed outside the App Store get charged a fee every time they go over a million users?

Oops, Apple just created collectible apps, where if you have Facebook (and not Facebook2), we know you got in early. Think about it: Same codebase, different appId. The external app stores can even set up mechanisms for this to work - every time you hit 999,000 installs, it creates a new listing that just waits for you to upload the new binary (and switches when you hit 995K). Now your users are incentivized to download your app early, in case becomes the big thing. Lower app # is the new low user ID.

If I'm Microsoft, I'm putting a stunted version of my app in the App Store (maybe an Office Documents Viewer?) for free, with links telling them if they want to edit they have go to the Microsoft App Store to download the app where Apple doesn't get a dime (especially if Microsoft uses the above trick to roll over the app every 995K users).

Even in the world where (as I think is the case in this one) Apple says all your apps have to be on the same licensing terms (so you can't have some App Store and some off-App Store), it costs barely anything to create a new LLC (and certainly less than the 500K it would cost if your app hits a million users). Apple's an Irish company, remember? So one of your LLCs is App Store, and the other is external.

To be clear, I don't like this setup. I think the iPhone should just allow sideloading, period. Is all of this more complicated for developers? Absolutely! Is the minimal amount of hassle worth saving at least 30% percent of your current revenue (or minimum $500K if you go off-App Store)? For dev shops of a certain size, I would certainly think so.

The only way to have fun with a rules lawyer is to get them to relax, or get them to leave the group. You have to band together to make them see the error of their ways, or convince them it's so much trouble it's not worth bothering to argue anymore.

Yes, Apple is going to (rules-)lawyer this, but they made it so convoluted I would be surprised if they didn't leave some giant loopholes, and attempting to close them is going to bring the EU down on them hard. If the EU is even going to allow this in the first place.

Changing Gears cover

Changing Gears

by LA Wright

Highly Recommended

An engaging sapphic romance novel whose villains felt heartrendingly drawn from real life. Aussie protagonist Jen's relationship with her family, her faith and the accompanying judgment

made me uncomfortable for the first half of the book or so; I was mildly concerned it was going to take a swerve into late 90s lesbian fiction (spoiler alert: One or both of them always die, because queer relationships weren't allowed happily ever afters. Thankfully, not a concern here). I eventually realized my discomfort lay in how much it reminded me of the same thoughts and feeling I had when I was younger. So huge props to the author for making that aspect feel so realistic!

But I come not to damn this book with faint praise; the relationship between the two leads was lovely, a simultaneous instant attraction that builds slowly but surely. I sincerely hope the author got to expense a bike trip to France for all the details that were put in; I can't speak to their truth, but it certainly helped me feel like I was along for the ride.

Synopsis

*Changing Gears* sweeps you off your feet as Jen, a reserved private school teacher from Sydney, discovers love and faces the ultimate test of self-discovery. When Jen collides with Abi, a magnetic Scottish travel writer, on a serene cycling expedition through France, sparks fly and temperatures rise. But their flirtatious two weeks together challenges everything Jen thought she knew about herself, her beliefs, and her future. Their sizzling chemistry not only makes her question her conservative upbringing but also ignites a fire of self-exploration she thought she had extinguished years before. As Jen grapples with returning to her old life in Sydney, she finds herself entangled in a heated conflict when a student faces cruel, homophobic bullying. Fuelled by her newfound courage, she takes a stand against injustice, risking her job and confronting her deepest fears to protect her student. Just when the chaos reaches its peak, Abi reappears, forcing Jen to confront her innermost desires and make a heart-wrenching decision. Will she embrace love and acceptance, defying her family and risking it all for a chance at happiness? With the stakes higher than ever, Jen must summon the courage to be true to herself, no matter the consequences. Packed with longing, resilience, and the power of love, *Changing Gears* is a captivating tale that will leave you breathless. Join Jen on this emotional rollercoaster as she navigates the storms of her heart and discovers the true meaning of bravery in the face of adversity. Don't miss this gripping romance where love challenges boundaries and drives one woman's journey to authenticity.

The ending felt a bit "and everyone clapped!", but it was still satisfying.

Fear of AI is eternal

Link Fear of AI is eternal

“The big curiosity is what medium a Furby uses to record audio,” one employee wrote. “I would assume that since it can ‘respond’ to certain audio cues that it would use storage similar to a digital answering machine or straight computer memory chips. Anybody know?”

Others said “Furby is only a $35 toy and is not that sophisticated. As a previous [listserv] posting pointed out, the ‘learning’ the doll does is programmed into it so that the longer you use it the more it ‘knows.’”

A great reading of newly FOIA'd documents from the folks at 404 Media. I definitely understand the impetus to understate existing rules about banning personal electronics from NSA spaces, but doesn't it also smack somewhat of security by obscurity?

It's always fun to get messages worrying about people FOIA'ing documents in documents you FOIA'ed.

I'll be hitting the lecture circuit again this year, with three conferences planned for the first of 2024.

In February, I'll be at Developer Week in Oakland (and online!), talking about Data Transfer Objects.

In March, I'll be in Michigan for the Michigan Technology Conference, speaking about clean code as well as measuring and managing productivity for dev teams.

And in April I'll be in Chicago at php[tek] to talk about laws/regulations for developers and DTOs (again).

Hope to see you there!

Who holds a conference in the upper Midwest in March???

It is revolting to have no better reason for a rule of law than that so it was laid down in the time of Henry IV. It is still more revolting if the grounds upon which it was laid down have vanished long since and the rule simply persists through blind imitation of the past.

— Oliver Wendell Holmes

From an article by Jill Lepore. I still do not understand how she's able to produce so much (deeply researched) content.

A Vision for the future

Link A Vision for the future

Apple keeps emphasizing that the Vision Pro isn’t meant to isolate you from the rest of the world, and the display on the front of the headset is designed to keep you connected to others.

I don't care if it isolates me? I don't want to be wearing it constantly, anyway.

If I'm perfectly honest, the killer VR app for me is working. If I can use a head-mounted display for a large screen for an existing computer (and get rid of the gigantic monitors of my workstation / use them when working away from home), I'm in.

Just ... not for $3.5K.

I mean, I would also probably play games on it, but not dramatically more than I do now (which is maybe 1-2 hours a week across all platforms, if I'm lucky?)

RIP, Titan

Titan was the silliest boy, who at some point was feral and yet constantly slept like this - as if to say, "please eviscerate me." Love you, buddy. Miss you. ❤️

Titan was the silliest boy, who at some point was feral and yet constantly slept like this - as if to say, "please eviscerate me." Love you, buddy. Miss you. ❤️