My a11y journey

Jun. 20th, 2025 01:11 am
[personal profile] mjg59
23 years ago I was in a bad place. I'd quit my first attempt at a PhD for various reasons that were, with hindsight, bad, and I was suddenly entirely aimless. I lucked into picking up a sysadmin role back at TCM where I'd spent a summer a year before, but that's not really what I wanted in my life. And then Hanna mentioned that her PhD supervisor was looking for someone familiar with Linux to work on making Dasher, one of the group's research projects, more usable on Linux. I jumped.

The timing was fortuitous. Sun were pumping money and developer effort into accessibility support, and the Inference Group had just received a grant from the Gatsy Foundation that involved working with the ACE Centre to provide additional accessibility support. And I was suddenly hacking on code that was largely ignored by most developers, supporting use cases that were irrelevant to most developers. Being in a relatively green field space sounds refreshing, until you realise that you're catering to actual humans who are potentially going to rely on your software to be able to communicate. That's somewhat focusing.

This was, uh, something of an on the job learning experience. I had to catch up with a lot of new technologies very quickly, but that wasn't the hard bit - what was difficult was realising I had to cater to people who were dealing with use cases that I had no experience of whatsoever. Dasher was extended to allow text entry into applications without needing to cut and paste. We added support for introspection of the current applications UI so menus could be exposed via the Dasher interface, allowing people to fly through menu hierarchies and pop open file dialogs. Text-to-speech was incorporated so people could rapidly enter sentences and have them spoke out loud.

But what sticks with me isn't the tech, or even the opportunities it gave me to meet other people working on the Linux desktop and forge friendships that still exist. It was the cases where I had the opportunity to work with people who could use Dasher as a tool to increase their ability to communicate with the outside world, whose lives were transformed for the better because of what we'd produced. Watching someone use your code and realising that you could write a three line patch that had a significant impact on the speed they could talk to other people is an incomparable experience. It's been decades and in many ways that was the most impact I've ever had as a developer.

I left after a year to work on fruitflies and get my PhD, and my career since then hasn't involved a lot of accessibility work. But it's stuck with me - every improvement in that space is something that has a direct impact on the quality of life of more people than you expect, but is also something that goes almost unrecognised. The people working on accessibility are heroes. They're making all the technology everyone else produces available to people who would otherwise be blocked from it. They deserve recognition, and they deserve a lot more support than they have.

But when we deal with technology, we deal with transitions. A lot of the Linux accessibility support depended on X11 behaviour that is now widely regarded as a set of misfeatures. It's not actually good to be able to inject arbitrary input into an arbitrary window, and it's not good to be able to arbitrarily scrape out its contents. X11 never had a model to permit this for accessibility tooling while blocking it for other code. Wayland does, but suffers from the surrounding infrastructure not being well developed yet. We're seeing that happen now, though - Gnome has been performing a great deal of work in this respect, and KDE is picking that up as well. There isn't a full correspondence between X11-based Linux accessibility support and Wayland, but for many users the Wayland accessibility infrastructure is already better than with X11.

That's going to continue improving, and it'll improve faster with broader support. We've somehow ended up with the bizarre politicisation of Wayland as being some sort of woke thing while X11 represents the Roman Empire or some such bullshit, but the reality is that there is no story for improving accessibility support under X11 and sticking to X11 is going to end up reducing the accessibility of a platform.

When you read anything about Linux accessibility, ask yourself whether you're reading something written by either a user of the accessibility features, or a developer of them. If they're neither, ask yourself why they actually care and what they're doing to make the future better.

Photo cross-post

Jun. 20th, 2025 03:14 am
andrewducker: (Default)
[personal profile] andrewducker


Last Friday ever of dropping her off at school and him off at nursery!

Off to the Highland Show this afternoon. Going to be 28 degrees, so we'll all probably burst into flames.
Original is here on Pixelfed.scot.

These numbers don't seem to work

Jun. 19th, 2025 08:52 pm
history_monk: (Default)
[personal profile] history_monk
The SpaceX Starship project is in serious trouble. The last three test launches have failed, and yesterday the ship for the next launch exploded while being fuelled for a static firing test. However, even if things were working perfectly, there's a serious problem with the logistics of the project. 

Starship Block 1 was rated to deliver 100 tons of payload to LEO. Block 2 numbers are a bit vaguer at 100-150 tons, Block 3 targets 200 tons, and Block 4 is intended to carry 400 tons, if the vehicle is expended, which makes it much more expensive. Fuel carried to orbit counts as payload. For Starship to travel beyond LEO, it needs to be refuelled. It holds 1,500 tons of fuel. That's a lot. 

So far, no Starship has completed a full Earth orbit. The plan for the Human Landing System variant which is supposed to take astronauts back to the Moon is to carry out several large and entirely automated fuel transfers in orbit. Pumping fuel between large spacecraft in microgravity has not yet been demonstrated. The transfers have to happen in rapid succession because all the fuel is cryogenic and boils away as it warms up. Filling up 1,500 tons of fuel requires somewhere between four and twenty successful flights and successful transfers to deliver the fuel, depending on your assumptions. 

The test flights of Starship have demonstrated that a very high-performance vehicle - which it genuinely is - needs exquisite care before launch, which slows down the launch rate. SpaceX has two launch stands in Texas, and is building another at the Kennedy Space Centre. But that seems to be all of what they'll have for the next few years 

Currently they're planning an unmanned demonstration landing on the Moon this year, and the manned landing in 2027. They aren't going to meet those deadlines, as is quite obvious, and should stop pretending. They've built what seems like a pretty good rocket, but it won't do the things claimed for it any time soon. Those need something even bigger. 
[personal profile] mjg59
I'm lucky enough to have a weird niche ISP available to me, so I'm paying $35 a month for around 600MBit symmetric data. Unfortunately they don't offer static IP addresses to residential customers, and nor do they allow multiple IP addresses per connection, and I'm the sort of person who'd like to run a bunch of stuff myself, so I've been looking for ways to manage this.

What I've ended up doing is renting a cheap VPS from a vendor that lets me add multiple IP addresses for minimal extra cost. The precise nature of the VPS isn't relevant - you just want a machine (it doesn't need much CPU, RAM, or storage) that has multiple world routeable IPv4 addresses associated with it and has no port blocks on incoming traffic. Ideally it's geographically local and peers with your ISP in order to reduce additional latency, but that's a nice to have rather than a requirement.

By setting that up you now have multiple real-world IP addresses that people can get to. How do we get them to the machine in your house you want to be accessible? First we need a connection between that machine and your VPS, and the easiest approach here is Wireguard. We only need a point-to-point link, nothing routable, and none of the IP addresses involved need to have anything to do with any of the rest of your network. So, on your local machine you want something like:

[Interface]
PrivateKey = privkeyhere
ListenPort = 51820
Address = localaddr/32

[Peer]
Endpoint = VPS:51820
PublicKey = pubkeyhere
AllowedIPs = VPS/0


And on your VPS, something like:

[Interface]
Address = vpswgaddr/32
SaveConfig = true
ListenPort = 51820
PrivateKey = privkeyhere

[Peer]
PublicKey = pubkeyhere
AllowedIPs = localaddr/32


The addresses here are (other than the VPS address) arbitrary - but they do need to be consistent, otherwise Wireguard is going to be unhappy and your packets will not have a fun time. Bring that interface up with wg-quick and make sure the devices can ping each other. Hurrah! That's the easy bit.

Now you want packets from the outside world to get to your internal machine. Let's say the external IP address you're going to use for that machine is 321.985.520.309 and the wireguard address of your local system is 867.420.696.005. On the VPS, you're going to want to do:

iptables -t nat -A PREROUTING -p tcp -d 321.985.520.309 -j DNAT --to-destination 867.420.696.005

Now, all incoming packets for 321.985.520.309 will be rewritten to head towards 867.420.696.005 instead (make sure you've set net.ipv4.ip_forward to 1 via sysctl!). Victory! Or is it? Well, no.

What we're doing here is rewriting the destination address of the packets so instead of heading to an address associated with the VPS, they're now going to head to your internal system over the Wireguard link. Which is then going to ignore them, because the AllowedIPs statement in the config only allows packets coming from your VPS, and these packets still have their original source IP. We could rewrite the source IP to match the VPS IP, but then you'd have no idea where any of these packets were coming from, and that sucks. Let's do something better. On the local machine, in the peer, let's update AllowedIps to 0.0.0.0/0 to permit packets form any source to appear over our Wireguard link. But if we bring the interface up now, it'll try to route all traffic over the Wireguard link, which isn't what we want. So we'll add table = off to the interface stanza of the config to disable that, and now we can bring the interface up without breaking everything but still allowing packets to reach us. However, we do still need to tell the kernel how to reach the remote VPN endpoint, which we can do with ip route add vpswgaddr dev wg0. Add this to the interface stanza as:

PostUp = ip route add vpswgaddr dev wg0
PreDown = ip route del vpswgaddr dev wg0


That's half the battle. The problem is that they're going to show up there with the source address still set to the original source IP, and your internal system is (because Linux) going to notice it has the ability to just send replies to the outside world via your ISP rather than via Wireguard and nothing is going to work. Thanks, Linux. Thinux.

But there's a way to solve this - policy routing. Linux allows you to have multiple separate routing tables, and define policy that controls which routing table will be used for a given packet. First, let's define a new table reference. On the local machine, edit /etc/iproute2/rt_tables and add a new entry that's something like:

1 wireguard


where "1" is just a standin for a number not otherwise used there. Now edit your wireguard config and replace table=off with table=wireguard - Wireguard will now update the wireguard routing table rather than the global one. Now all we need to do is to tell the kernel to push packets into the appropriate routing table - we can do that with ip rule add from localaddr lookup wireguard, which tells the kernel to take any packet coming from our Wireguard address and push it via the Wireguard routing table. Add that to your Wireguard interface config as:

PostUp = ip rule add from localaddr lookup wireguard
PreDown = ip rule del from localaddr lookup wireguard

and now your local system is effectively on the internet.

You can do this for multiple systems - just configure additional Wireguard interfaces on the VPS and make sure they're all listening on different ports. If your local IP changes then your local machines will end up reconnecting to the VPS, but to the outside world their accessible IP address will remain the same. It's like having a real IP without the pain of convincing your ISP to give it to you.

Photo cross-post

Jun. 16th, 2025 12:20 pm
andrewducker: (Default)
[personal profile] andrewducker


I done found me a tree goblin!
Original is here on Pixelfed.scot.

First theatre of 2025 part 7

Jun. 15th, 2025 07:37 pm
lovingboth: (Default)
[personal profile] lovingboth

Extreme Circus

They've just finished their time in Lincoln. I'd picked up a discount flyer about a week before they opened. A combination of weather, them not doing Mon / Tues, and other things meant that I finally went on Saturday evening, while L and a couple of US friends plus someone else went to a singing concert at the cathedral.

It's very good - if you're anywhere near the rest of their 2025 tour, do go and see it. There was no act that wasn't at least fine.

Not everything on their website was on in Lincoln. I saw a sword swallower who adds an aerial aspect; two skaters spinning around on a circular table; a motorcyclist doing wheelies / balances; an acrobatic act with a couple of long swings being jumped from / between (good, possibly would have been even better seen from the side); and an aerial act that involved being dunked in a water tank several times, finally with it on fire*.

The second half was the better one: double wheel* (good); a solo high trapeze act involving using some rings to swing / walk between two trapezes and then jump between them without a safety net (very good); five people jumping on / off a transparent box between two trampolines (good, particularly when they're effectively shuffling themselves in order doing it); ending with a motorcycle 'globe of death' working up to four of them inside... before three other motorcyclists do leaps off a ramp over the globe into what must be an soft landing point at the back of the ring, then ride round the outside of the big top to do it again and again (good).

Between acts, there's a clown I've seen several times before and/or the live band (good) perform.

Sometimes, when everyone at a circus comes out for a final bow, I go 'Mmm, I thought there were plenty of people doing two (or more) acts'. Not this time: there are a lot of performers around the ring.


* Until the fire, I was thinking they missed a trick by not adding some bubble liquid to the water so that she would leave a trail of bubbles when back up in the air.

** Either I have seen the same act about ten times, or it got copied shamelessly after someone came up with it: two metal cylinders, large and wide enough to have someone inside, are joined together by bars and rotate around the middle point. At some point, as the whole thing rotates, someone goes around the cylinder that the person causing the ring to rotate isn't in and jumps / skips etc, especially at the high point of their rotation.

This one had two of these setups, one next to the other. I don't think I've seen that before.

Photo cross-post

Jun. 15th, 2025 05:15 am
andrewducker: (Default)
[personal profile] andrewducker


It was about ten seconds later that we realised how terrible Crocs are for climbing.
Original is here on Pixelfed.scot.

Confused by Disney ineptitude

Jun. 14th, 2025 12:03 pm
andrewducker: (Default)
[personal profile] andrewducker
Two weeks after seeing the CGI Lilo and Stitch at the cinema I'm watching the original with the kids. And it's so much better. The direction, the writing, the acting are all just much higher quality.

The remake felt much clumsier. And I don't really understand why.

Edit: Just realised that they entirely cut the Ugly Duckling part from the remake. Why would you do that? It's key to Stitch's arc!
And all of the bits where Lilo how to be like Elvis.

In fact, nearly all of the bits where Lilo talked to Stitch and built a relationship with him.
andrewducker: (my brain)
[personal profile] andrewducker
Reading this article on advice to teachers in the UK about using AI, they suggest using it for things like "marking quizzes" and "generating routine letters".

And what really annoys me about this is that it's a perfect example of where simple automation could be used without the need for AI.

The precise example in the article is "Generate a letter to parents about a head lice outbreak." - which is a fairly common thing to happen in schools. So why on earth isn't there one standard letter per school, if not one standard letter for the whole country, that can be reused by absolutely everyone whenever this standard event happens? Why does this require AI to generate a new one every time, rather than just being a standard email that gets sent?

Same with marking quizzes. If children get multiple-choice quizzes regularly across all schools, and marking them uses precious teacher time, why is there not a standard piece of software, paid for once (or written once internally) which enables all children to do quizzes in a standard way, and get them marked automatically?

If we're investing a bunch of money into automating the various processes that teachers spend far too much time on, start with simple automation, which is cheap, easy, and reliable.

Also, wouldn't it be sensible to do some research into how accurately AI marks homework *before* you tell teachers to use it to do that? Here's some research from February which shows that its agreement with examiners was only 0.61 (where 1.00 would be perfect agreement). So I'm sceptical about the quality of the marking it's going to be doing...

May 2025

S M T W T F S
    12 3
45678910
11121314151617
1819 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 20th, 2025 08:17 pm
Powered by Dreamwidth Studios