Posts filed under “Tech”

The desk chair post

This is my desk chair.

It is a front seat from a 1990 Vauxhall Astra GTE, bolted to a subframe made from steel box section scavenged from some industrial shelving, welded to a swivel-chair base that I found in a skip. I've had some variant of it for over a decade, but I had cause to re-engineer it recently, so I am posting about it now. It's extremely comfortable! It is more supportive than any other chair I have used, including chairs that look like car seats, and including chairs that cost upwards of a grand.

There are two of these in existence! My brother was dismantling an Astra GTE that he purchased for an engine donor (MOT-failure GTEs were not worth much more than scrap weight back then, and that is a memory from the "painful to think about" department, next to the working two-door Range Rover I helped dismantle...). I got the seat for free on the condition that I made the other front seat into a desk chair for him as well. That other chair is still in use by a kid in the family as a gamer chair, and that makes me happy.

It has been rebuilt several times. This is because office swivel chairs are made of no material in particular, especially the cheap kind that gets thrown into a skip when it becomes too ugly to use. Usually this does not matter, because the sitting part of a swivel chair is also made of no material in particular, so the system in its entirety has plenty of flex. The Astra seat has a lot of extra weight, and there is no flex in the over-engineered subframe, so swivel chair bases tend to break.

This is what the subframe looks like.

It's not pretty, but you can't see it when you're sitting on it. If you look closely, you can see where I cut out a reinforcing section in the middle in the latest incarnation. This is in a probably-vain attempt to try and un-engineer a bit more rigidity out of the frame. I might try speed holes next.

I had a stroke of luck last time this broke a swivel-chair base. The base collapsed, and literally minutes later I saw my neighbour throwing a shitty-looking desk chair into a skip. I'll have some of that, thank you.

I can understand them throwing it out.

This time around, I decided to give the Astra seat a deep clean after reassembling the chair. I did not know how badly it needed one. This little thing is a game changer:

It's a brush attachment for a drill, which you can buy for about £15 on Amazon as part of a set. It demolishes baked-in cat fluff and everything else on a seat that a vacuum cleaner won't touch. I was impressed.

This is what a vacuum cleaner doesn't get out...

Everything mentioned so far, I acquired for free. This time around, I have got some improved castors for it, to replace the usual scratchy-sounding castors that you get on cheap desk chairs.

These have roller bearings, seem to be made of actual metal, and its wheels are made of a material not entirely unlike that of the small bouncy balls we had as kids that could be launched at the floor and which rebounded to the height of a four-storey building. They roll very nicely. They're also a lot stronger than flimsy desk chair castors. This isn't an unqualified good. See also what I wrote about the subframe earlier; they don't flex, which means they transfer forces elsewhere. That might cause the swivel base to break earlier than it would otherwise. We'll see!

You may have noticed that it does not have arm rests. You are not the first. I showed a photo of it to someone earlier today and they said "it needs arm rests". It doesn't need arm rests, but the fact someone thinks it needs arm rests means that it isn't the unquestioned best desk chair in the world. So maybe that is a project for another day...


The easy, snarky post would be "it's the current year and there are still systems out there that can't handle non-ASCII characters", on Twitter. Snark is boring! Pretending to be offended is sad!

Years ago, there was a blog (whose name I forgot) that documented cracks in the system like this; tiny reminders that systems that we take for granted, that we have little cause to give thought to, are oft computer systems written by humans, and humans make mistakes. I enjoy these reminders.

Conjecture: the text was originally written in some older version of Microsoft Word. Word converted the apostrophe in haven't to a "smart" quote, and that got pasted into a system that didn't understand it. Still, the system worked, I got a receipt, KFC didn't buckle under the weight of a thousand UnicodeDecodeErrors, and the world kept turning. :)

"Ain't that some bullshit", 365-to-Migadu-migration edition

TL;DR: Use imapsync with DavMail.

So my subscription for Office 365 (or whatever it's called these days) was due for renewal in January. I only ever used it for email on my domain. Given how increasingly hateful the Outlook web client has been in recent years (worst among them was when it randomly disabled the ability to send plain-text email for some time), and my general desire to move as much of my life away from software I have no control over, I decided to migrate my shit to Migadu. Partly because Migadu is kinda cheap, partly because Drew DeVault recommended them, but mostly because I really like their beautifully simple and functional website. I'm shallow!

Obviously, I didn't want to lose any of my email in this process. What should have happened is that I would enable IMAP on Office365, plug in some command line options to imapsync, and by the magic of open standards email would be moved from one place to another. Open standards are good! People who write open source software are awesome!

Of course, one half of that involved dealing with Microsoft. That and the rule of time estimates (increase the unit, halve the quantity) and the rule of everything is bullshit and never fucking works meant that I wasted more than a few hours trying to make that happen. Greetings from 3am!

The short version is if you use Office 365 in the same manner I did, which is that you were both the administrator of the domain and a user on the domain (because it was for personal email and you're the only person on the domain), nothing you do will make IMAP work for your account. Not if you navigate six levels of Enterprise-ness and a UI with decade-old branding to enable 2FA and then to enable "app passwords", not if you go disable security defaults and probably still nope if you run some PowerShell magic spells that I've seen around.

Give up trying to make IMAP work directly and use DavMail. I did!

DavMail is a proxy between Microsoft's proprietary protocols and protocols such as IMAP that the rest of the world uses. There's a package in the Ubuntu repositories called davmail, but because everything is bullshit and never fucking works the Ubuntu package is broken if you don't install the openjdk-11-jre package first (through no fault of DavMail's authors).

Anyway, once you've worked out that last bit from reading some random Debian bug report, you will want to go into DavMail's settings, under the "Main" tab, and change "Exchange Protocol" to "O365Interactive".

Then run a magic spell...

./imapsync \
  --host1 localhost \
  --port1 1143 \
  --user1 '' \
  --debugimap1 \
  --password1 'hunter2' \
  --host2 '' \
  --user2 '' \
  --password2 'hunter3'

...and DavMail will pop up a with a link to open in your browser, and that will in turn redirect to a URL that you copy-and-paste into DavMail. Some time later your mail will appear in Migadu or whatever else you decide to migrate to.

So, that was some bullshit. But it's done now! And I only have to do that once. And if I ever do have to do it again I won't waste hours of my time and hours of someone else's time trying to work out why IMAP isn't working, because, reminder, if your account is an admin account for an O365 domain it absolutely never will.

Anyway, imapsync and DavMail are good! They made me happy! I've only been dealing with mail migration bullshit for one long night, but the authors of both have been dealing with it for years. Here's a figurative toast to those fine people, and here's to many years of Migadu and me!

Self-archaeology and the Internet Movie Car Database

This was my mum's Mercedes 220. It was glorious.

She bought LRO 468L for £500 in either 1989 or 1990, because back then it was merely an old car (though cars aged much quicker 30 years ago). It was beautiful, silent, luxurious, and very wafty. I loved it, and everyone else did. She sold it a few months later for slightly more than she paid for it, because it needed welding work on the floorpan. A very young Me did not talk to her for a day after that.

It was last MOT'ed in 1990, so we can probably conclude it does not exist anymore (or, to avoid offending those of you who believe in the laws of thermodynamics, exists in an entirely different form). A W114 or W115 is still on my bucket list of cars to own. It might even be the next project I build, if my next project starts before the prices of these go through the roof.

Fast-forward just a few years. Recently, someone pointed out that if you search for a registration plate on Google Images, there's a good chance that it will find a photo of that car, because Google indexes any text it finds within an image, and may notice the text on the numberplate. Like ANPR, but for everything.

It worked on my car. Among others, it found a photo taken at the late Rockingham Motor Speedway, which my brother (the previous owner) took in 2007 back when "camera phone" still meant "thing with a dialpad", and posted on a forum in 2008.

It worked when I entered the registration of this Mercedes, too. I know the registration off by heart, because my memory is weird. I remember a Windows 95 product key that I last used in anger in 1997, and the registration of my mum's car from 31 years ago, and sometimes draw a blank when I have to enter my PIN into a cash machine.

The first result was the picture you saw at the top of this article. I uploaded that photo to Wikimedia Commons over 15 years ago, and things often spread to weird and unexpected places when you do that. (I'll tell you the story about the wall art in the bogs at Downham Market station some other time...)

The second and third images were the offspring of obsessive categorisation at scale. I would hope any petrolhead would know about the Internet Movie Car Database, wherein a (presumably vast) number of very dedicated people are aiming to identify every car in every film & television program. If your car appeared in the background of, e.g., an episode of The Bill in December 1984, then there's a good chance someone has captured and categorised it.

Well how about that!

But wait: It's brown! Or at least looks brown. Did it get a respray before my mum owned it? Or did a worn 80s VHS tape not reproduce the glorious red that it was? I won't ever know the answer to that, and I am okay with that.

The cars we knew in our youth are, or will be, almost all lost to time and entropy; only a very few are lucky enough to be recommissioned or restored. But this Mercedes was lucky to have its few seconds of fame on the small screen, and was immortalised, to some very tiny extent and entirely accidentally, by some extraordinarily committed people on the Internet. That's more than most cars will get, and that, is good enough for me.

Your deactivated Facebook account really is reactivating itself

There are a lot of posts & questions & other things in various places online wherein people are complaining about this happening to them. Usually there's someone to tell them that nope, it's something you did. I can guarantee that it is not, in fact, necessarily something you have done. Because it happened to me (which totally changed my opinion about Facebook being an awful company), and I went to specific lengths to ensure that Facebook would not reactivate my account when I deactivated it. Specifically:

  • I did not sign in from any other devices. I do not have the Facebook app on any of my phones, and never have. Only two things have accessed it: my desktop computer and my laptop. After deactivating my account, I cleared the cookies on my laptop to be sure.
  • I do not have any apps that could have reactivated it, because there are NO apps connected to my account.
  • It is entirely implausible that anyone could have logged into my account with my credentials. My password is extremely long and complex (it is "hunter2"[1]). In the unlikely event that someone guessed a 28-character password, they decided absolutely nothing with my account. But I'll reiterate, nobody guessed my password.
  • From what I have read, according to some rando on Quora, there is a "This is temporary, I will get back soon" checkbox?! Hmm... I'm not actually saying this is impossible. But when I deactivated my account I specifically checked for sneaky things like this because Facebook is an awful company staffed with terrible people, and if I trust them with anything it is that they will reliably do whatever thing gives nice values on the "Engagement" axis on a graph.

So...either Facebook does in fact randomly reactivate your account, or Facebook is doing some sneaky shit in which you have "agreed" to randomly reactivate your account. They are either betraying you, or they are using dark patterns during account deactivation such that someone who is actively looking for dark patterns is tricked into "agreeing" that they will reactivate it. Either way, it is being reactivated without your consent. Anyone that tells you otherwise is gaslighting you.

[1] Kidding.

On "whitelisting" and "blacklisting"

As a straight white guy from middle-of-nowhere Tory Brexitland I'm sure I am supposed to say something about political correctness gone mad, but this is worth a read and makes some fine points. Upshot:

It's fairly common to say whitelisting and blacklisting to describe desirable and undesirable things in cyber security. For instance, when talking about which applications you will allow or deny on your corporate network; or deciding which bad passwords you want your users not to be able to use.

However, there's an issue with the terminology. It only makes sense if you equate white with 'good, permitted, safe' and black with 'bad, dangerous, forbidden'. There are some obvious problems with this.

I agree.

From now on, the NCSC will use 'allow list' and 'deny list' in place of 'whitelist' and 'blacklist' on our website.

I propose not referring to notional "lists" at all. This will invariably make your writing clearer.

Let's take an example from the article. "An allow list of applications" is clumsy (let alone the alternative form, "an allow listed application"). It is much terser and accurate to refer to "trusted applications" for ones you know to be good, and "malicious" for ones you know to be bad. No lists required! (Adjust the terminology to your use case as required.)

For the example of passwords, of course you only ever check against a list of known-compromised ones; you certainly don't have a list of ones that are safe to use. Again, you can almost always get rid of notional "lists". Some examples:

  • This password is blacklisted 🡒 This password is known to be weak
  • This function checks the given password against a blacklist 🡒 This function checks if the given password is known to be weak

It is fine to refer to lists when there are actual lists; if your program is supplied with or downloads a set of textual rules for allowing & denying access to something, for example. Here again, though, you are discussing an implementation detail rather than what actually happens, which is generally not good form in anything but documentation dedicated to discussing implementation details.

I am reminded of a ticket from a few months ago in the Django project:

We'd like to add aliases for the trans and blocktrans template tags which do not have connotations to the transgender community. An initial proposal would be to add translate and blocktranslate as aliases.

The lazy counter to this would be that "translate" shares the same "trans" root as "transgender", and who is to say that it's only a valid contraction of one of them?

I say "lazy", because the reporter handed the Django a great opportunity for improvement: why pick a tag name like trans when it could cause confusion with something else? Even when there is no scope for confusion, we're not limited to MS-DOS filenames these days (and don't get me started on "i18n"). You can and should use whole English words; {% translate %} makes for better and clearer code than {% trans %}.

You should definitely improve your terminology to be more inclusive - it's a low-effort way of making the world a little bit better. And do use that opportunity to write stronger and more clearly while you are there.