I Made an Offline Thing!

I’ve built a bridge between my RSS readers (Vienna and Tapestry) and my web browser so that I can connect my laptop to the Internet, fetch updated news stories, then disconnect. Later, while looking through the feed, I can queue up individual articles to be downloaded fully. Even later, I can connect the laptop to the Internet and run a script which will fetch all the queued articles to a folder on my laptop, open the local files in a browser, and clear out the queue. This allows me to do the actual reading of the full articles while being offline.

Continue reading “I Made an Offline Thing!”

Social, But Offline

I just saw a software update that mentioned GoToSocial so I looked it up to see what it is. And honestly, it’s kind of a thing I want, but barely.

So, think about posting, reading other people’s posts, you know, that whole online conversation thing. What do I really want? I want to hear from people I know and like. I want to hear about stuff they think is important. I want to be able to share what I’m up to with my friends, whom I may not see particularly often.

Do I especially care what my geographical neighbors think is important or interesting? Nope. If I did, I’d probably be more involved in the local ham radio scene, or even be walking up the driveway just to visit. But I’ve got very little (other than a ZIP code) in common with them.

So a single user Fediverse instance seems kind of attractive. But that brings in the problems of deliverability and discoverability. If I want people’s updates, either I need to poll their servers to get them or I need to spin up and keep my own server running and available. This is a problem. Because I feel like having a server that’s always on, whether I’m using it or not, is…kind of wasteful. Like, all that electricity and heat? Could we just…not?

What if, like, I don’t know…FidoNet or something? Like, have a server that spins up when the phone rings and then you use your momentary connection to upload your stuff and download everyone else’s stuff, and then you hang up and the server goes back to sleep? This is possible. We sort of did it once. External drives are cheap. Cell phones are a thing. Low power computers are a thing. “Instant” sleep/on is a thing. This could be made to work. Sure, it’d be slower, and a narrower pipe, and maybe inconvenient. But we could go outside and walk on the Earth, and we wouldn’t even need environment suits to do it.

Frameworks: Ensemble, Forked, Swift Data

I just learned about the existence of a framework called, “Forked.” The blurbs about it talk about “local first” application design and automated merging of concurrent offline editing. This seems very interesting to me. So I started looking at the source code and the example applications, and then reading about other stuff in the “local first” ecosystem, which is totally a thing I didn’t know about but which I wish I’d learned about in, let’s say 2010, when I started having some time to think about this kind of thing.

Continue reading “Frameworks: Ensemble, Forked, Swift Data”

Software Architecture Matters

I’m starting to take a look at Swift Data, and the experience is really, really uncomfortable for me. The tutorials and explanations of how this framework works and how it integrates with SwiftUI really serve to remind me that the way I think about structuring my programs is just plain not how most other folks who write tutorials or frameworks think about structuring programs.

Continue reading “Software Architecture Matters”

Always On Browser

As suggested by the category of this post, “Grumpy Old Man,” I am old enough that I was an independent adult when the web was invented. I remember the early behavior of web browsers, notably Netscape Navigator, and how they used local caching of fetched resources to make rendering pages bearably slow over a 14.4 modem connection. And how, when the connection dropped and a page failed to load, I could hit the “back” button and see the previous page because it was in the cache. A lot of things sucked about the late nineties, but that wasn’t one of them.

Today, it is raining where we live. This means that electrical power, and thus the cable modems on the utility poles, are only intermittently available. Because PG&E. But it also means that I get to see what modern web browsers do when the Internet goes away. Friend, it is not good, and it is a timely reminder of why I open everything in a new tab.

Learning to Nope

Over Thanksgiving, a fellow suggested I take a look at writing some bit of software to do with juggling voxels. I explained that there are three general kinds of programming that are specifically not fun for me: compilers, user interface, and drivers. Doing lots of math and spatial geometry in an attempt to squeeze out a little bit more performance feels, to me, kind of like a combination of all the trickiest bits of UI (graphics rendering, most especially) and device drivers (lots and lots of just-barely-above-the-metal instructions to a coder-abusive toolchain, where writing and debugging probably goes smoother if you’re just staring at hex). This is probably unfair, so maybe I will take a look, but that’s where my biases are.

The other day, a friend opined that they didn’t like Advent of Code because it’s a competition and not just coding for the sheer joy of learning. I see that, for sure. In years past, I’ve tackled it to practice various aspects of Swift programming: using different editors, different build methods, getting familiar with various libraries. But I’ve always dropped out after a short while, as at some point the problems just start seeming like obnoxious homework, and I’m not even getting a grade on this stuff. This year, I hit that point midway through day 3 — a new record! The second puzzle for day 3 is, essentially, “build a stack processing state machine.” That smells like a compiler to me.

Some people love doing this kind of problem analysis and then writing implementations of their solutions. Bless ‘em, we wouldn’t have compilers without these folks, and far be it from me to tell someone who’s having fun that they’re doing it wrong. But this year, I don’t need to practice this particular bit of development and it’s not fun for me. So I’ll be doing something else.

Prepare to Take Care

So, you know, things are likely going to get harder for people on the margins of power in the U.S., not just over the next few years, but probably for the next generation, until a bunch of justices retire. At least. Anyway, protests and lawsuits are great and necessary, but they’re things you do after people have already been hurt. I want to take a moment to point out some stuff you can do before.

Right now, there are a few places where it’s illegal for a woman to go out of state to get an abortion, and it’s also illegal for anyone to drive her. Also, it’s a trivial matter for anyone even LARPing as a cop, let alone actual law enforcement personnel, to track such people down. So, while you still can, the compassionate thing might be to get hold of some morning after pills. Maybe even prepare some abortion cards.

Updating a macOS application’s Help Book

Why yes, as a matter of fact that is a really long title. Nevertheless, there’s not a lot of documentation to be found, and certainly not a lot of practical advice that shows up easily. Now that I’m building help books for my applications, I’ve run into the situation where I update the help and then need to tell the Tips app to reload the index for an updated book. There’s no way to do that from the Tips app. Uninstalling the application that has the help book in it doesn’t trigger this, either. The thing to do is to fire up a Terminal window and use sudo, which is totally something I could trust my mother to do. Thanks, Apple.

sudo hiutil -P

That’s all – it just clears out all the cached help index files. They’ll get rebuilt the next time you look for help.

Just Enough Ruby

Last time, I complained about a problem I was having that meant I was going to have to learn enough Ruby to debug someone else’s code effectively. Fortunately for me, it turns out that I was being wildly pessimistic. In the end, I was able to get Middlemac working with Ruby 3.3.5 with only some twiddling of dependencies. I even submitted a PR with my fixes, but since the maintainer hasn’t touched the repo in over three years, I bet it’s abandonware.

Continue reading “Just Enough Ruby”