(satire) Instead of making English the official language of the US, the US should ban it.

Posted Thu May 29 10:45:44 2025 Tags:

Explaining the part of the Big Bad Bill that would make nearly all existing court orders in the US unenforceable.

Republicans control Congress and the presidency, and have demonstrated their intention to convert that into absolute, arbitrary power. The only obstacle that remains is the judiciary. This is their plan to make the judiciary too weak to restrain them.

The campaign to bully law firms to refuse to work for his victims is another method of making the courts powerless.

*US judge overturns [the bully's] order targeting major law firm Jenner & Block.*

Posted Thu May 29 10:45:44 2025 Tags:

The bully has said nothing about Ukraine lately, but since he was unable to bring about a peace deal (which was probably impossible), he may have lost interest. Or he may have something worse in mind.

Posted Thu May 29 10:45:44 2025 Tags:
Posted Thu May 29 10:45:44 2025 Tags:

President Bukele of El Salvador has jailed a prominent anti-corruption lawyer. I wonder if they tattooed her with alleged "gang symbols".

Posted Thu May 29 10:45:44 2025 Tags:

The Anna's Hummingbird species has evolved, in less than a century, to adapt its beak to California's hummingbird feeders, and spread its range as the feeders have spread.

Posted Thu May 29 10:45:44 2025 Tags:

*[Republican] Members of Congress are accused of hiding out when workers have sought answers on why their jobs were axed.*

Why so Republicans persist so firmly in supporting something they know their constituents loathe? It's not as if they were ignorant of that sentiment. So there is to be a reason.

I have two theories:

  1. They are afraid that magats will commit violence against them and their relatives. I can understand being afraid of violence, but if that were the only reason, they could quietly resign and be safe.
  2. They have deals sewed up to get millions of dollars each, perhaps as consultants to some corporations, if they deliver fully on billionaires' demands. It may be painful to stay the course against public hostility, but once they have crushed democracy and cemented its tomb, they will be sitting pretty.

Posted Thu May 29 10:45:44 2025 Tags:

The corrupter's cryptocurrencies are a range of opportunities for rich people to pay him off.

If we ever have a US government not in the hands of the rich, it should prohibit federal and state officials from owning an investment fund of any kinds.

Posted Thu May 29 10:45:44 2025 Tags:
Posted Thu May 29 10:45:44 2025 Tags:

US citizens: call on the Senate to to block weapons sales to Qatar and UAE due to the corrupter's corrupt dealings with both countries.

If you phone, please spread the word! Main Switchboard: +1-202-224-3121

Posted Thu May 29 10:45:44 2025 Tags:

I recently did some vibe coding to come up with this demo, which may be useful for brain training if you happen to have focus problems. Using the latest Claude for this worked great. I did the whole thing without writing any code myself and only a bit of inspecting the code itself. So on the whole vibe coding works great, especially for someone like me who knows how to code but would rather not learn the vagaries of front end development. But it’s nowhere near the level of simply asking the AI to write something and have it come out. In fact being a programmer helps massively, and may be an absolute requirement for certain tasks.

Vibe coding definitely changes the, uh, vibe of coding. Traditional programming feels like a cold uncaring computer calling you an idiot a thousand times a day. Of course the traditional environment isn’t capable of calling you an idiot so it’s really you calling yourself an idiot, but it’s unpleasant anyway. With vibe coding you’re calling the AI an idiot a thousand times per day, and it’s groveling in response every time, which is a lot more fun.

Thanks for reading Bram’s Thoughts! Subscribe for free to receive new posts and support my work.

I’d describe Claude as in the next to the bottom tier of programmer candidates I’ve ever interviewed. The absolute bottom tier are people who literally don’t know how to code, but above them are people who have somehow bumbled their way through a CS degree despite not understanding anything. It’s amazingly familiar with and fluent in code, and in fact far faster and enthusiastic than any human ever possibly could be, but everything vaguely algorithmic it hacks together in the absolute dumbest way imaginable (unless it’s verbatim copying someone else’s homework, which happens a lot more often than you’d expect). You can correct this, or better yet head it off at the pass, by describing in painstaking detail each of the steps involved. Since you’re describing it in english instead of code and it’s good at english this is still a lot less effort and a huge time saver. Sometimes it just can’t process what you’re telling it is causing a problem so it assumes your explanation is correct and plays along, happily pretending to understand what’s happening. Whatever, I’d flunk it from a job interview but it isn’t getting paid and is super fast so I’ll put up with it. On some level it’s mostly translating from english into code, and that’s a big productivity boost right there.

Often it writes bugs. It’s remarkably good at avoiding typos, but extremely prone to logical errors. The most common sort of bug is that it doesn’t do what you asked it to, or at least what it did has no apparent effect. You can then tell it that it didn’t do the thing and ask it to try again which usually works. Sometimes it makes things which just seem janky and weird, at which point it’s best to suggest that it’s probably accumulated some coding cruft and ask it to clean up and refactor the code, in particular removing unnecessary code and consolidating redundant code. Usually after that it will succeed if you ask it to try again. If you skim the code and notice something off you can ask it ‘WFT is that?’ and it will usually admit something is wrong and fix it, but you get better results by being more polite. I specifically said ‘Why is there a call to setTimeout?’ and it fixed a problem in response. It would be helpful if you could see line numbers in the code view for Claude, but maybe the AI doesn’t understand those as reference points yet.

If it still has problems debugging then you can break down the series of logical steps of what should be happening, explain them in detail, and ask it to check them individually to identify which of them is breaking down. This is a lot harder than it sounds. I do this even when pair programming with experienced human programmers as well, which is an activity they often find humiliating. But asking the AI to articulate the steps itself works okay.

Here’s my script for prompts to use while vibe coding debugging, broken down into cut and pasteable commands:

  1. I’m doing X, I should be seeing Y but I’m seeing Z, can you fix it? (More detail is better. Being a programmer helps with elucidating this but isn’t necessary.)

  2. That didn’t fix the problem, can you try again?

  3. Now I’m seeing X, can you fix it?

  4. You seem to be having some trouble here. Maybe the code has accumulated some cruft with all these edits we’re doing. Can you find places where there is unused code, redundant functionality, and other sorts of general cleanups, refactor those, and try again?

  5. You seem to be getting a little lost here. Let’s make a list of the logical steps which this is supposed to go through, what should happen with each of them, then check each of those individually to see where it’s going off the rails. (This works a lot better if you can tell it what those steps are but that’s very difficult for non-programmers.)

Of course since these are so brainless to do Claude will probably start doing them without prompting in the future but for now they’re helpful. Also helpful for humans to follow when they’re coding.

On something larger and more technical it would be a good idea to have automated tests, which can of course be written by the AI as well. When I’m coding I generally make a list of what the tests should do in english, then implement the tests, then run and debug them. Those are sufficiently different brain states that I find it’s helpful to do them in separate phases. (I also often write reams of code before starting the testing process, or even checking if they’ll parse, a practice which sometimes drives my coworkers insane.)

A script for testing goes something like this:

  1. Now that we’ve written our code we should write some automated tests. Can you suggest some tests which exercise the basic straight through functionality of this code?

  2. Those are good suggestions. Can you implement and run them?

  3. Now that we’ve tested basic functionality we should try edge cases. Can you suggest some tests which more thoroughly exercise all the edge cases in this code?

  4. Those are good suggestions. Can you implement and run them?

  5. Let’s make sure we’re getting everything. Are there any parts of the code which aren’t getting exercised by these tests? Can we write new tests to hit all of that, and if not can some of that code be removed?

  6. Now that we’ve got everything tested are there any refactorings we can do which will make the code simpler, cleaner, and more maintainable?

  7. Those are good ideas, let’s do those and get the tests passing again. Don’t change the tests in the process, leave them exactly unchanged and fix the code.

Of course this is again so brainless that it will probably be programmed into the AI assistants to do exactly this when asked to write tests, but for now it’s helpful. Also helpful as a script for human programmers to follow. A code coverage tool is also helpful for both, but it seems Claude isn’t hooked up to one of those yet.

Thanks for reading Bram’s Thoughts! Subscribe for free to receive new posts and support my work.

Posted Wed May 28 22:08:37 2025 Tags:
Dear Lazyweb,

When my internal video encoder machine relays its RTMP stream to the external public server, MPEG glitches get introduced, and I would like to know how to fix that.

I am hoping for answers from someone who actually understands how RTMP transports and reconstitutes MPEG frames, or who knows how to take these TS files apart and identify why they are glitching.

(I shouldn't have to say this but I do: If your suggestions are more along the lines of, "Have you tried changing this magic number in the config file?" without a coherent theory of why, then your suggestions are almost certainly unhelpful. Likewise, "Why don't you just..." ← not the question I asked.)

Details:

  • Both machines are running nginx-1.17.10 and nginx-rtmp-module Feb 2022.

  • Internal machine runs OBS 31.0.3 streaming to rtmp://localhost/live/

  • Internal nginx rtmp is configured like so. Notably, hls_fragment 10s, hls_playlist_length 30s.

  • External nginx rtmp is configured like so. Notably, hls_fragment 6s. Why are they different? I don't remember. At some point I thought that seemed to improve... something.

Here are some example TS files covering approximately the same time range from the internal and external streams. The the internal ones play fine; the external ones contain glitches.

The first handclap happens at around 6s in the internal stream, and 3s in the external, so if you plot the segments on a timeline, it looks like this. Asterisks indicate glitches. They don't correlate well to segment changes in either the internal or external streams.

 = 00 ext 1: 1748393053750.ts | 01 | 02 = | 03 int 1: 1748393056339.ts | | 04 | | 05 | = 06 ext 2: 1748393061627.ts (handclap) | | * 07 | | * 08 | | * 09 | | * 10 | | 11 | = 12 ext 3: 1748393066847.ts = | 13 int 2: 1748393066342.ts | | 14 | | 15 | | * 16 | | * 17 | = 18 ext 4: 1748393073414.ts | | 19 | | 20 | | 21 | | 22 = | 23 int 3: 1748393076343.ts | = 24 ext 5: 1748393079981.ts | | 25 | | 26 | | 27 | | * 28 | | * 29 | = 30 ext 6: 1748393086982.ts | | 31 | | 32 = | * 33 int 4: 1748393086341.ts | | * 34 | | * 35 | = * 36 ext end | 37 | 38 | 39 | 40 | 41 = 42 int end

Another thing that I don't understand, which is probably unrelated: when I pack these TS files into an MP4 with:

ffmpeg -f concat -i concat.txt -c copy out.mp4

the audio de-synchronizes by like half a second. Why?

Previously, previously, previously.

Posted Wed May 28 03:37:09 2025 Tags:
If you want a picture of the future, imagine a boot stamping on a human face forever a spicy autocompleter submitting software changes to a regular expression parser.

Also, you can't block it. As Kyle Reese reminded us, "It absolutely will not stop -- ever -- until you accept its pull req̷̩̓u̸̾͜ḙ̶̈s̶̫͑t̶̙͒."

Previously, previously, previously, previously, previously, previously, previously, previously, previously, previously.

Posted Tue May 27 19:37:32 2025 Tags:
Millions yearn to be creativity-adjacent:

"I've always been jealous of the glory authors get," explained Wolverton, assembling fresh Ikea bookcases to display his newly-published oeuvre. "Actual writing takes time away from surfing for deepfake porn. I just want books with my name on them to impress my friends. ChatGPT made that happen."

Chaz is not alone. Machine learning engineers believe millions yearn to be creativity-adjacent.

"These people are entirely bereft of the basic skills necessary for creativity and they aren't interested developing them," said Victor Drolet, Spicy Autofill Evangelist. "A few could potentially string enough words together into something worth reading, but research shows they will never try."

Egon Hunt, who teaches a $4000, eight-week online prompt engineering course, asserted that "authors" like Wolverton can fulfill dreams of passing as a real-enough writer to those who don't read. "A creative vacuum like Chaz can manage to type in a few prompts, and then the LLM does all the rest." [...]

Accusations that LLMs combine greed with sloth are "narrow-minded", assert experts. With the right prompts, they insist LLM's can deliver far more comprehensive moral transgressions. "In addition to the classical seven deadly sins," adds Drolet, "LLMs even generate entirely new deadly sins such as grath, hoth, and lurm!"

Previously, previously, previously.

Posted Sun May 25 18:58:39 2025 Tags:
Still eagerly waiting for someone to tell me where I can go meet my local Blade Runner at one of my city's famed Open-Air Drug Markets. I assume COVID vaccines will remain harder to get than heroin for the foreseeable future.

Threat Model:

Led by Vinay Prasad and Martin Makary, the US FDA announced Tuesday that Covid vaccines will no longer be available for most Americans, only allowing access to adults over 65 and people with at least one high-risk medical condition. There are no exceptions for in-home caregivers, including those who care for disabled children, those with cancer, and the elderly. In line with a popular false conspiracy theory, the FDA has required Covid vaccine makers to expand warnings about risks of heart harms, which are rare.

One day after the US FDA said it would require new clinical trials for approval of annual Covid-19 boosters, Moderna was compelled to withdraw its application for US approval of its highly successful, outperforming combined flu-Covid shot.

Great Barrington Declaration backer Jay Bhattacharya delivered his first town hall speech as NIH head this week, triggering a mass walkout when he told the assembled NIH scientists that Covid was created in the US by NIH.

Previously, previously, previously, previously.

Posted Thu May 22 19:43:15 2025 Tags:
I found video, June 2024:

"The tortoise lays on its back, its belly baking in the hot sun, beating its legs trying to turn itself over, but it can't. Not without your help. But you're not helping."
There is no reporting on this from non-Musk-Fanboy sites, and there's nothing on the Vicksburg News site, but this video was on their Facebook.
Remember kids, being mean to his cars is terrorism.

Posted Wed May 21 18:29:40 2025 Tags:

First of all, what's outlined here should be available in libinput 1.29 but I'm not 100% certain on all the details yet so any feedback (in the libinput issue tracker) would be appreciated. Right now this is all still sitting in the libinput!1192 merge request. I'd specifically like to see some feedback from people familiar with Lua APIs. With this out of the way:

Come libinput 1.29, libinput will support plugins written in Lua. These plugins sit logically between the kernel and libinput and allow modifying the evdev device and its events before libinput gets to see them.

The motivation for this are a few unfixable issues - issues we knew how to fix but we cannot actually implement and/or ship the fixes without breaking other devices. One example for this is the inverted Logitech MX Master 3S horizontal wheel. libinput ships quirks for the USB/Bluetooth connection but not for the Bolt receiver. Unlike the Unifying Receiver the Bolt receiver doesn't give the kernel sufficient information to know which device is currently connected. Which means our quirks could only apply to the Bolt receiver (and thus any mouse connected to it) - that's a rather bad idea though, we'd break every other mouse using the same receiver. Another example is an issue with worn out mouse buttons - on that device the behavior was predictable enough but any heuristics would catch a lot of legitimate buttons. That's fine when you know your mouse is slightly broken and at least it works again. But it's not something we can ship as a general solution. There are plenty more examples like that - custom pointer deceleration, different disable-while-typing, etc.

libinput has quirks but they are internal API and subject to change without notice at any time. They're very definitely not for configuring a device and the local quirk file libinput parses is merely to bridge over the time until libinput ships the (hopefully upstreamed) quirk.

So the obvious solution is: let the users fix it themselves. And this is where the plugins come in. They are not full access into libinput, they are closer to a udev-hid-bpf in userspace. Logically they sit between the kernel event devices and libinput: input events are read from the kernel device, passed to the plugins, then passed to libinput. A plugin can look at and modify devices (add/remove buttons for example) and look at and modify the event stream as it comes from the kernel device. For this libinput changed internally to now process something called an "evdev frame" which is a struct that contains all struct input_events up to the terminating SYN_REPORT. This is the logical grouping of events anyway but so far we didn't explicitly carry those around as such. Now we do and we can pass them through to the plugin(s) to be modified.

The aforementioned Logitech MX master plugin would look like this: it registers itself with a version number, then sets a callback for the "new-evdev-device" notification and (where the device matches) we connect that device's "evdev-frame" notification to our actual code:

libinput:register(1) -- register plugin version 1
libinput:connect("new-evdev-device", function (_, device)
    if device:vid() == 0x046D and device:pid() == 0xC548 then
        device:connect("evdev-frame", function (_, frame)
            for _, event in ipairs(frame.events) do
                if event.type == evdev.EV_REL and 
                   (event.code == evdev.REL_HWHEEL or 
                    event.code == evdev.REL_HWHEEL_HI_RES) then
                    event.value = -event.value
                end
            end
            return frame
        end)
    end
end)
This file can be dropped into /etc/libinput/plugins/10-mx-master.lua and will be loaded on context creation. I'm hoping the approach using named signals (similar to e.g. GObject) makes it easy to add different calls in future versions. Plugins also have access to a timer so you can filter events and re-send them at a later point in time. This is useful for implementing something like disable-while-typing based on certain conditions.

So why Lua? Because it's very easy to sandbox. I very explicitly did not want the plugins to be a side-channel to get into the internals of libinput - specifically no IO access to anything. This ruled out using C (or anything that's a .so file, really) because those would run a) in the address space of the compositor and b) be unrestricted in what they can do. Lua solves this easily. And, as a nice side-effect, it's also very easy to write plugins in.[1]

Whether plugins are loaded or not will depend on the compositor: an explicit call to set up the paths to load from and to actually load the plugins is required. No run-time plugin changes at this point either, they're loaded on libinput context creation and that's it. Otherwise, all the usual implementation details apply: files are sorted and if there are files with identical names the one from the highest-precedence directory will be used. Plugins that are buggy will be unloaded immediately.

If all this sounds interesting, please have a try and report back any APIs that are broken, or missing, or generally ideas of the good or bad persuation. Ideally before we ship it and the API is stable forever :)

[1] Benjamin Tissoires actually had a go at WASM plugins (via rust). But ... a lot of effort for rather small gains over Lua

Posted Wed May 21 04:09:00 2025 Tags:

Avelo Airlines quashed a boycott campaign over its polarizing decision to operate federal deportation flights.

"Polarizing". Never change, NYT.

Seth Miller, a New Hampshire lawmaker, placed billboard ads protesting Avelo Airlines' decision to operate flights for ICE. Avelo accused him of trademark infringement.

Seth Miller, an independent aviation journalist and state lawmaker in New Hampshire, began the campaign last week with advertisements on two billboards near Avelo's busiest airport urging travelers to avoid the airline. The ads, near Tweed New Haven Airport in Connecticut, featured a modified Avelo logo and the message: "Does your vacation support their deportation? Just say AvelNO!"

Days later, a lawyer for the airline sent Mr. Miller a letter saying he had violated Avelo's trademark. Mr. Miller said the airline had also persuaded the billboard operator, Lamar Advertising, to take down the ads. In response, he sued the airline Friday afternoon in Nevada, where the airline is incorporated, asking a court to affirm that he was only exercising his freedom of speech.

Previously, previously, previously, previously, previously, previously.

Posted Tue May 20 22:07:27 2025 Tags:
This is a fun tale of largely-unsuccessful reverse engineering of a bricked and abandoned rental bike, but who could have predicted this nightmare except everybody.

Posted Tue May 20 18:01:51 2025 Tags:
Week three of my neighbor's interminable construction project, whatever it is. So another day of finding music that synergizes well with power tools when played really fucking loud. I guess we'll start today with The Hammer Party. Hope they enjoy it.
Posted Mon May 19 17:52:50 2025 Tags:

Planet Debian upstream is hosted by Branchable.