Open Letter to the FSF

I have been professionally active in software development for 27 years and I have used and even contributed to Free Software.  While Richard Stallman has played a critical role in the development of Free Software, he has also contributed to a toxic atmosphere of male entitlement – a sense that rules only apply to other people.

I’m disappointed and angry that your organization has chosen to reinstate him in a leadership position and to see you cite his “wisdom” as one of the factors in that decision. The statements that led to Mr. Stallman leaving the board were bad enough; his non-apology clearly demonstrates that not only is he not sorry, but that he doesn’t even understand what he did wrong. That isn’t wisdom, it’s arrogance, and pretending otherwise tars the FSF with the same brush.

What your organization seems to be saying to the world is, “If you make stuff we like, it doesn’t matter if you treat some people horribly. Good software is more important than human rights.” Because you seem unclear, I am telling you that’s wrong, and you ought to be ashamed of yourselves. Do better.

App Clip

So, when I saw the bit about App Clips at WWDC last year, I wasn’t terribly excited. After all, QR codes have been around for ages; the fact that Apple ignored them until they could figure out a proprietary version struck me as par for the course. Even the example use case they gave (still give) seems geared toward chain stores in physical locations. But! An App Clip is a way to provide a subset of an iOS app’s functionality for free with a framework to upsell to the full app. Just what I want for a paid game!

I don’t like subscriptions. Sure, if the app uses some off-device resource that has an associated cost, I can see the need. It’s fair to pay for stuff. But for my simple little game, there’s really no point. I set it up to cost a dollar because the resources it took to build it weren’t free (had to license the icons, for example), but seriously, it didn’t cost much. But since it’s not a subscription, the App Store doesn’t provide an easy way to offer a free trial for a few days and then pay for it. I suppose other apps solve this with some kind of advertising and in-app purchase to buy the ad-free experience. I may not like subscriptions but I hate ads. I’m coming to the viewpoint that supporting your software with ads is equivalent to selling your users to the advertisers, and that, my friends, is human trafficking.

So anyway, I spent the past couple of days creating an App Clip for Three Lines, which lets you play the small board. The full game lets you play bigger boards and choose different icons. This seems like a great thing. But since it’s the first time I’ve done nearly all of this, I have no idea whether it’s going to work properly. This page ought to display a “Smart App Banner” if the conditions are right. As I understand it, that means the page is loaded in Safari, on an iOS device, that doesn’t already have Three Lines installed.

UPDATE: Okay, the smart app banner shows up (even though I have the app installed on my phone via TestFlight) but the banner is for the App Store page. How do I get it to be for the App Clip? Maybe I have to release the app with the clip first…but then how would I know that it works? Hmm. This does feel a little…undocumented.

How to Make a Library with Xcode

A few months ago, I asked a question on Hacking with Swift about how to extract code from an existing project into a library. This is a thing that, over the course of many years of developing Java applications, I find myself doing often. I solve a problem for one project, then get to another project and realize I have to solve the same problem, so I rewrite the solution to be reusable. I found myself in the same situation with some Swift projects, and I wanted to do the same thing. I know it’s possible — there are zillions of libraries out there to let you do useful things — but I couldn’t find any reference documentation or tutorials on how to do it.

Nobody responded. Well, not nobody, but the only reply I got was along the lines of, “This other guy at this one website once did something almost like that, so maybe ask him?”

Now, months later, I searched on an entirely different question (what’s the difference between an Xcode workspace and a project?) and that has led me to a partial answer to a couple of entangled questions.

Continue reading “How to Make a Library with Xcode”

A New Project

For the past several months, I’ve been following along with Paul Hudson‘s quite excellent series of tutorials. The focus of this series is to develop a portfolio application, demonstrating knowledge of iOS and SwiftUI, as well as good development practices (testing, architecture, etc.). At first, there were a couple of videos per week, but it has slowed down since Christmas. Maybe it’s more work than he initially thought, maybe it doesn’t pay as well as he thought, maybe he wants to spend more time with his family; whatever, I’m certainly not going to complain. As usual for me, I’ve learned enough that I want to start doing stuff other than just following along.

Continue reading “A New Project”

Insightful Or Obvious?

A friend just passed this interview along, and it got me thinking. Every so often, this sort of thing pops up on my radar: lone individual / tiny group doing things on their own rather than using the commonly available mass-produced thing, and they’re doing it for Reasons. I find something seductive in these stories. Self-sufficiency, exercising one’s own creativity, building just exactly the thing one wants or needs, these are really powerful juice. Heck, the QBCPS does this all the time, because we want what we want and we aren’t happy about settling for almost good, so we build things and make things so that we have the lives we want, not the lives we can buy. (Incidentally, this is why when our house and nearly all our belongings burned up in a fire, we’re fundamentally okay — we are not defined by our stuff.)

So, then, I read an article about Lojban, or about living self-sufficiently (or nearly so) in a tiny house or on a boat or in an RV or something, or about someone who writes all their own programs and builds their own solar panels or whatever, and I feel pulled to that. And then I come to my senses. Because the feeling of being creative like that is really seductive, but the reasons given in the story (or even in this essay) are never really the reasons. They’re rationalizations of the feeling. The reason we do this stuff is because it feels good; because we like it.

The mass-produced, widely available, almost-good products are not emotionally satisfying. But they have massive network externalities. They interoperate with one another. There’s a globe-enveloping ecosystem of human stuff that all works together. Building a thing that doesn’t plug into that ecosystem is a huge amount of work, and whatever benefits you reap from that work are either massively delayed or else they’re highly personal.

I have this feeling that this might be applicable to the development of the civilization package (writing, sedentism, hierarchy, agriculture,…) but that’s way more work than I’m prepared to do on the topic. Instead, I’m just going to appreciate that there are people doing their own things, rolling their own tech, and know that it’s okay for me not to participate in their stuff; that I’ve got stuff of my own.

Programmer’s Notebook – Ruby

I’ve been using MacOS as my desktop and development environment for the past 19 years. Whenever I got a new laptop, I’d use the migration assistant to copy my user settings over. So, I’ve got a lot of cruft in my home directory. Over that time I mostly did Java programming. But, there’s also been a bit of Perl, and I dabbled in Python for a hot second. More recently, it’s been Flutter, and most recently of all, Swift. And last OS update switched me from bash to zsh, so there’s just a huge .zshrc in my home directory. Oh yeah, and I came to OS X from FreeBSD by way of Linux, so before Homebrew won, I mostly used ports to install stuff.

So today: fastlane. It’s cool, it promises to automate some vital yet tedious tasks, most especially taking screenshots for the app store. That’s great, but it’s ruby. Ruby ships with Mac OS, but that’s kind of down-rev and the latest packages don’t like it. I have never done ruby programming, but I’ve installed tools (which ones? when? who can remember?) that required it and so there were weird traces of a ruby version manager, and maybe some kind of gem manager, so that fastlane couldn’t admit that it was completely installed or runnable or that maybe snapshots were even a thing, or that, hey, is ruby even installed on this computer?

After I kid you not, 14 solid hours of trying things that worked but broke other stuff, I’ve finally got fastlane to admit that it works.

  1. Some tool needed to be removed entirely. rvm? rbenv? Dunno, but I had to invoke it with implode which made me feel a little better.
  2. Everyone in the world thinks that ruby version 3.0.0 is the thing to use. Except fastlane, which wants to use rexml, which is no longer bundled with ruby 3.0.0. There was something else broken with version 3, but I can’t remember what it was — it was way harder to solve than just installing rexml. Anyway, stick to version 2.7.2. Oh yeah, bundle couldn’t resolve ruby version dependencies.
  3. Homebrew says that rbenv, which delegates to ruby-build, installs openssl 1.1 but doesn’t ever patch it and it does so per ruby environment. So, if you want a patched openssl and you only want one instead of however many ruby versions you’ve got, you should provide a compiler flag to tell ruby-build about the Homebrew version. Don’t do this, because ruby won’t compile.

Release!

Stumpy is ready for use, for anyone who wants to use it. If you’re working on an application that sends email and you’d like to test that feature, you may find this useful.

In other news, searching for “pop3 client library” leads me to believe that every developer for macOS thinks that Apple Mail is the absolute bees knees and there’s just no reason anyone would want to receive email in any other way. Unless maybe they wanted to use python. Which is just mystifying to me, because come on!

Stumpy Progress

With a bit of persistence and lots of print statements, I’ve debugged my port of the core dumbster features over to Swift. Stumpy now works as a native replacement for dumbster. It turned out there was a capitalization mismatch (my code was looking for ‘Message-ID’ while Mail was writing ‘Message-Id’) and a counting error (headers and body are supposed to be separated by a blank line, and that means two successive \r\n tuples: the first to terminate the last line of the headers and the second to terminate the blank line).

So now that that’s complete, it’s time to turn my attention to the UI. Rather than independently starting and stopping the servers, I think I’d like to start and stop both servers for a given mail store together. Also, I want the UI to report how many messages are currently in the mail store. All of this information should go together into a mail store view, which gets displayed by the top level view.

Stumpy: History and Problem Statement

When we were first writing the software for LinkedIn, Jean-Luc put together a python script that would act like a dummy MTA and mail store. The point was that the application was going to be sending out emails of various kinds, notably invitations to connect, and we needed to be able to write tests that would verify that feature (the emails are well-formed, they actually get sent, etc.) without sending real messages to real email accounts. This was incredibly valuable.

Years later I was contracting at NASA, working on a system that, again, generated emails. I wanted to institute some kind of automated testing, and tried to come up with a similar tool for use there. I found out that I’m allergic to python but I found a Java program that did half of what I wanted – it would pretend to be sendmail and accept any emails and just stuff them into an in-memory store. I forked it and modified it to add a POP3 server so that the application could generate and send the emails and then a tester could open the email with Outlook or Apple Mail or whatever and then click included links or open attached files, etc.

Even later, I modified that program by putting a JavaFX graphical UI on top, and letting you spin up multiple corresponding SMTP/POP3 server pairs. The point, that time, was that I was working on a play-by-email server and I wanted to have the server and clients all talking to each other via email but still on my development machine. As a responsible software developer, I do not make a practice of turning untested robots loose on the world.

The problem that I have with the program as it stands is, well, there are a few problems. First, it’s in Java; Apple has stopped treating Java like a first-class citizen of the desktop, and it’s getting harder and harder to convince a JavaFX app to build, let alone to act like a Mac app. Second, it takes way too much in the way of computer resources. When it’s running, my laptop gets hot and the battery drops. It’s awesome to have the tool, but it gets like 1 kiloflop per hogshead of diesel. I feel like it should be possible to do better, and I feel like the problem lies in JavaFX. Third, I’m trying to learn Swift and SwiftUI so that I can write native applications. This feels like an opportunity.

In about 1991, someone I knew made a pun around “Ren & Stimpy” being like rn and SMTP and that has stuck with me. So, I’m porting dumbster from Java to Swift, and that involves changing the name. Thus, I dub the new project, “Stumpy.”

Concurrency, Closures, and SwiftUI on Mac OS X

Synopsis

I want to get some clarity about how to use GCD and closures to handle dispatching work between multiple contexts. This is something I’m very familiar with in Java, but not at all in Swift (let alone, using SwiftUI). Inspired by a cartoon that appeared in The New Yorker many years ago, Barkin’ Dogs represents the conversation that happens when two dogs get excited.

Continue reading “Concurrency, Closures, and SwiftUI on Mac OS X”