Computers annoyed me twice yesterday. Not really computers, I suppose. Computers are either on or off. The people in charge of certain computers annoyed me yesterday. One is a very unpleasant, 2024-ish version of dependency hell, and one was Apple (who don't annoy me very often, but when they do it makes me want to pitch every piece of Apple hardware I own, directly into the sea).
Annoyance 1. There's an element of this that is my own fault, and you'll probably see why at some point, but I consider that it's mostly just an annoying situation. Oracle bought MySQL a long time ago. A lot of people weren't happy about this because people don't like Oracle. Some people were unhappy enough that they forked MySQL and created MariaDB. Owing to licensing, and compatibility with the MySQL API, Debian kicked MySQL to the kerb and replaced it with Maria. They didn't even change names - when you install mysql-server, you get MariaDB, and that is mostly fine.
However, for me yesterday it was not fine. Amazon are finally ditching MySQL 5.7 and forcing you to upgrade to 8. In this time there has been some divergence, to the point that it doesn't seem to be a straight swap between Maria and MySQL any more when you're on MySQL 8. We moved to using Maria in development because its 5.7-compatible version 10.3 installs on Apple Silicon without emulation in Docker, but that's no-longer viable. We need to upgrade a pretty large codebase and I need to be sure that it still runs on MySQL 8. So I need to be running MySQL 8 in development to spot issues.
It turns out that using Debian and installing libmysql (i.e. libmaria - I don't know if that's what it's called but that's what it is) has some incompatibilities with MySQL - it specifically doesn't seem to be compatible with the latest authentication methods in MySQL which is literally the first hurdle. So I need MySQL MySQL. Maria won't do it. Fine - Oracle has Debian repos, I'll just update our Docker image to install MySQL from there. Except that MySQL doesn't make ARM-compatible Debian repos, so what I actually need to do is compile my libmysql bindings from source, just so that the MySQL language bindings compile with compatibility that I actually need. I'll then need another Docker image so that we're not compiling MySQL from source on CI. You shouldn't measure productivity in lines-of-code, but it took me about 5 hours to write 15 lines of code with all the trial and error and waiting.
Pretty annoying stuff. But not nearly as annoying as:
Annoyance 2. The same client uses Braintree for payments. We used to love Braintree as it was the first developer-friendly gateway I had used and, thus, the first one that wasn't an absolutely horrendous nightmare of esoteric, interpolated hash secrets. It actually had an API. Then PayPal bought it and it has gone downhill ever since. Its documentation is a sprawling mess of outdated or just wrong information. Its examples just don't work in a lot of cases. I don't like it. Stripe, I like. You should use Stripe.
This client wants to use Apple Pay; totally reasonable request in 2024. Documentation for implementing Apple Pay seems pretty simple. Configuration is a bit weird with downloading certificate signing requests from one UI and uploading them to another, then downloading certificates from that one and uploading to the first one. All whilst trying to follow processes that don't really know about each other and lead you down some weird paths. Because of course they do.
So I have everything set up, and I have a URL and TLS certificate I can use in test (thanks ngrok!). So I go to test an Apple Pay transaction. But it's not working because I'm using a real card in a sandbox environment. Why don't they just pretend to accept my card in sandbox? Pretty sure Braintree lets you use real cards and just doesn't charge them. Stripe definitely does. OK so what's the sandbox process like? I need a sandbox account - fine, Braintree and PayPal both need that. It's annoying but it's nothing new. Wait, I also need a device to sign into this sandbox account on? I have to log out of my iCloud account?! That is incredibly disruptive; I'm not doing that.
So I thought I would be clever (mistake). I installed xCode and got a simulator up and running. I can sign into the sandbox account on there and just run in sim. It used 20GB and an hour of my time waiting for downloads but it's still far better than needing to trash my phone every time I want to test Apple Pay on Braintree. Except that, for some reason, you just can't add cards to your wallet in Simulator. It fails and shows a generic error message. After trying a bunch of region-changing, I gave up. We must have an old iPad around here somewhere that I can use.
We do, but the battery is completely dead. So it goes on charge and I go out. I get back and it's on iOS 13 and won't let me add cards, so I upgrade to iOS 17.4 and try to add one of Apple's test cards. First one doesn't work. Neither does the second one. All the way up to the 7th random card from that list. None of them will add. No helpful error messages - just a generic "card cannot be added". Why!? So I start Googling to see if anyone else has experienced this, and I find an expired card in a Stack Overflow post. Update the expiry date and give it a try and it works. I can't believe it.
Tested my integration and everything works perfectly. Took about 5 minutes once everything was working. Getting everything working took 8 hours (with a 2 hour gap whilst the iPad got some charge). This whole thing is genuinely an absolute disgrace that I am still angry about, if you couldn't tell. I expect better from Apple on things like this. I can't believe that the test cards on their site just don't work. Why don't they automatically just issue a dummy card to every sandbox account that is just sitting in your wallet when you sign in? Why don't they just accept live cards and not charge them. No idea, but at least now I have an old iPad that I need to keep alive just to be able to test Apple Pay transactions. This sort of thing makes me never want to give Apple money ever again.
Short weeks are always the worst once your free day off is over.
Burgers and AI
We launched two sites recently, pretty much on the same day, for two very different companies.
We're alright
Being in constant company, even with people you love, can cause friction. There's a fine line between love and hate and all that
Context-specific aliases with fish shell
We're using Docker for everything now, which is great but it's a big ask of some of our frontend devs who aren't as comfortable with a CLI as others. Fortunately, there is a way!
I hate XML
The above screenshot is the difference between an XML product feed that Facebook can't be parsed (top) and one that can (bottom). A default namespace declaration. Why does this matter?
Desk setup
07/24/2019
Hits from the Pong
08/15/2015
Think before you buy Coda for iOS
07/17/2015
Playing with Mario Kart 8 Data
06/05/2015
Beers
03/06/2015
SOAP
03/06/2015
Infinity
11/20/2013