jwz (Jamie Zawinski)
New Numbers Station just dropped
Each message starts with the Farsi word for "attention" followed by what is assumed to be some header information as two 5-digit groups. Then there is a set of 181 five-digit groups. Each message is padded out to take 20 minutes, and there are six messages in each transmission.

Direction finding has traced the signal to a US base near Stuttgart, Germany. In addition to using Farsi, Iran has repeatedly attempted to jam the signal, causing V32 to change frequencies a few times. There's also a more recent, so far unidentified, jammer trying to block the signal.

In addition to direction finding, there is a surprising amount of information you can glean from the audio. The first few days of broadcasts had specific beeps in the background, which appear to be warning tones from a specific type of American military transmitter that warns the operator when encryption is not engaged. At first, a human read the numbers. Eventually, the station switched to using automated numbers. In addition, there have been a few times when Windows 10 system sounds have leaked into the transmission.

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

Richard Stallman
Iran rockets vs US interceptors

The best estimate is that Iran still has roughly 1/3 of its missile stocks and 1/3 of its drone stocks. So much for the bullshitter's bombastic claim to have destroyed nearly all of them.

I think serious people already knew that such claims coming from him were not to be taken seriously.

Posted
Richard Stallman
New pun

New pun:      "Ifs, ands or buts"

After my cataract operations, they gave me a strict rule, "no ifs, ands or buts." But I used those words anyway, and I got conjunctivitis.

Posted
Richard Stallman
Canadian woman married to US citizen and her daughter jailed

Deportation thugs have jailed a Canadian woman married to a US citizen, and their daughter. She has papers authorizing her to be in the US, but not currently in her possession because she submitted them to another US agency for some sort of bureaucratic step. She warns all Canadians in the US that they are in danger, especially while their papers are in "processing".

Posted
Richard Stallman
Responding to Hegseth's Christian hatred

Democratic candidate Talarico. who is Christian, responds to Hegseth's Christian hatred with Christian love.

I am impressed favorably with Talarico's tolerance, and I am sure he is a better person and better citizen than any Republican candidate. However, while this reflects well on him, it is not evidence that any gods exist.

Posted
Richard Stallman
US sanctions placed on UN official Francesca Albanese

The US sanctions arbitrarily placed on UN official Francesca Albanese threaten anyone with US connections who does any sort of business or cooperation with her with punishment, even without a trial.

This includes US academics who investigate the patterns of Israel's war crimes in Palestine, as well as other students and faculty. Some of them support the lawsuit that aims to declare such sanctions unconstitutional.

Posted
Richard Stallman
US soldiers positioning to invade Iran

The US would find it hard to make the Strait of Hormuz safe for oil tankers by force. It could perhaps capture Kharg Island, but that would not protect oil tankers, and occupying the island would not make it easy to capture much oil.

Basically, these threats seem to be bluster.

The bully's pattern of bluster followed by pulling back has backfired completely against Iran.

While it gives me a wry pleasure to see him thwarted, seeing Iran's murderous religious fanatics defeat America's murderous religious fanatics in foreign relations is no pleasure. That will lead to great suffering for Iranians, and no alleviation for Americans.

Posted
Richard Stallman
Urgent: Childrens' rights

US citizens: call on your officials in Congress to protect immigrant children's right to education in public schools.

See the instructions for how to sign this letter campaign without running any nonfree JavaScript code--not trivial, but not hard.

US citizens: Join with this campaign to address this issue.

To phone your congresscritter about this, the main switchboard is +1-202-224-3121.

Please spread the word.

Posted
jwz (Jamie Zawinski)
Space Nazis
So wait... A major plot point of Superman (2025) was that Clark got a garbled answering machine message and didn't realize that his parents were Space Nazis who wanted him to take over Earth and eugenics-fuck his way to a new super-race (the plot of Invincible and also the plot of Elon Musk). But at the end Supergirl shows up, who left Krypton as a teenager. So couldn't the little blonde übermensch have just... told him about her time in the Krypton Youth and at Ku Klux Krypton rallies?

Anyway, the trailer for Supergirl (2026) looks alright. The miniseries that it is purportedly based on was really good.

Previously, previously, previously, previously.

jwz (Jamie Zawinski)
XScreenSaver 6.15
XScreenSaver 6.15 is out now, including iOS and Android. A whopping thirteen new savers this time:

  • New hack by me, worldpieces.
  • New Shadertoy hacks brought into the fold: bestill, bubblecolors, darktransit, downfall, driftclouds, goldenapollian, noxfire, prococean, rigrekt, trainmandala, trizm and universeball.

Shadertoys are so wild; you'll see like 30 lines of code, and when it runs it build an entire environment without there being a polygon or a model apparent anywhere. What witchcraft is this?? Well, here's a really good article that explains the techniques used: Painting With Math: A Gentle Study of Raymarching.

I fixed a bunch of Android bullshit, too (some of which meant needing to reimplement glRotatef etc. from first principles). Android's implementation of GLES is a buggy mess. Also I think Android has again lost the ability to ask for permission to load photos. I can't figure it out, so someone who gives a shit will have to send me a patch. I also still can't figure out why transparency doesn't work on Android. This makes Peepers be particularly horrifying.

Map Scroller: I updated the list of available maps, and made it show the name of the nearest city. One of the new map sets that works is the Google Satellite Map, and if you have two monitors, I highly recommend running that map in "Fully random location" mode. It has a habit of picking two places many thousands of miles apart that look surprisingly similar, like Greenland and Syria.

Boy do I have a lot to say about World Pieces:

This one took so much time! Most of my screensavers are pretty quick; generally they'll percolate in my head for a while, then I do the first 90% in half a day, and then the second 90% in another half day to two days. But this one was composed entirely of ratholes.

  1. Oh, first I have to find some sane way to get the country outlines. That means learning about GeoJSON and getting the proper data set from Natural Earth Data. Then that data has to be massaged and merged, and while there's probably some command-line way to do that, using mapshaper.org was easier.

  2. Now I've got a bunch of polylines with weird "hole" rules (not winding-rule!) and I need to triangulate them. Next rathole: learning how to use triangle.c correctly.

  3. Then I notice that while the GeoJSON has population data for countries, it does not for states and provinces. Ok, that should be easy to grab from Wikipedia, right? Next rathole: learning about SparQL, the Wikidata query language. It is one of the nastiest and most baffling query languages I've seen. Good job on that.

  4. Then I realize that while the GeoJSON contains the names of the countries translated into various languages, it doesn't tell you which ones are the official languages! Next rathole! Ok, surely we can get that from Wikidata too... Nope. While the Wikipedia pages contain the endonyms in the local character set, the Wikidata items only have them transliterated into Latin characters. To fix that, I had to scrape the Wikipedia page and parse the Wiki markup using regexps, dooming us to inhuman toil, etc. etc. Anyway, I got it working so that Japan can be spelled 日本...

  5. ...on macOS, iOS and Android. Why doesn't it work on Linux? Oh ho ho ho, another rathole, this one un-solved! So on Linux it notices when all of the characters came out as square boxes and falls back to the transliterated Latin versions. You're welcome.

  6. Ok, it's starting to come together. But since I'm zooming in a lot, the Earth imagery is looking a little grainy, since the image I have is 2048x1024. Well let's just go upgrade that. Next rathole! The old images I had were from the public domain 2002 NASA "Blue Marble" images and 2000 "Visible Earth, City Lights" images none of which still exist on NASA's site (all praise archive.org!)

    They seem to have deprecated those data sets in favor of the 2025 "Blue Marble: Next Generation" images and the 2012 "Black Marble" images. But... they're weird. First, both sets of images completely omit the North polar ice. Second, the 2025 daytime oceans are colored completely flat, whereas the 2002 images contained bathymetry details. And third, and worst of all, is no pairing of 2025 day images and 2016 night images where the pair have the same ice extents. This means that when we blend between the day and night images, it looks very weird. It took me days to finally accept that there was nothing that I could do to work around that.

  7. So now that those various ratholes are out of the way, it's trigonometry time. The way the countries pop up and face forward toward whereever the camera is a technique called "billboarding" and it's pretty easy. But what's not easy is doing a smooth transition between the object being billboarded, and the object being back in the scene. Especially since it's position in the scene is spinning and wobbling about willy-nilly. (Remember, you can also spin the globe with the mouse, and it has to keep track of that as well!)

  8. So the final rathole was finally coming to terms with quaternions. Quaternions and I have had a passing acquaintance for many years, but I finally had to get down and dirty and really understand them to make all of this work.

    Wikipedia describes quaternions as:

    Quaternions form a four-dimensional associative normed division algebra over the real numbers, and therefore a ring, also a division ring and a domain. It is a special case of a Clifford algebra, classified as Cl₀,₂(ℝ)≅Cl⁺₃,₀(ℝ). According to the Frobenius theorem, the algebra ℍ is one of only two finite-dimensional division rings containing a proper subring isomorphic to the real numbers; the other being the complex numbers.

    "I did not understand a math thing, and then I read the Wikipedia article on it, and now I understand the math thing" -- said literally no one ever. As far as I can tell, every math article on Wikipedia is written with the target audience of "person who wrote their grad school thesis on it" and no one else. Wikipedia's math articles are absolutely fucking useless for purposes of, you know, education.

    Anyway, 3Blue1Brown has a good intro video that is not like that!

    By the way, I propose that "Quaternions" should be pronounced like extruded cornmeal toroid "Funyuns".

Previously, previously, previously.

Posted
Bram Cohen
More on Version Control

Surprisingly and happily my last post on version control got picked up by Hacker News and got a lot of views. Thanks everybody who engaged with it, and welcome new subscribers. I put a ridiculous amount of work into these things and it’s nice when there’s something to show for it.

Something I didn’t quite realize when writing that last post is that in addition to supporting ‘safe rebase’ by picking one of the parents to be the ‘primary’ one, it’s possible to support ‘safe squash’ by picking a further back ancestor to be the ‘primary’ one. The advantage of this approach is that it gives you strictly more information than the Git approach. If you make the safe versions of blame/history always follow the primary path then if you perform all the same commands in the same order with both implementations then the outputs can be made to look nearly identical, with some caveats about subtle edge cases where the safe versions are behaving more reasonably. But the safe versions will still remember the full history, which both lets you look into what actually happened and gives you a lot less footguns related to pulling in something which was already squashed or rebased. The unsafe versions of these things literally throw out history and replace it with a fiction that whoever did the final operation wrote everything, or that the original author wrote something possibly very divergent from what they actually wrote.

Git is very simple, reliable, and versatile, but it isn’t very functional. It ‘supports’ squash and rebase the way writing with a pen and paper ‘supports’ inline editing. It implicitly makes humans do a lot of the version control system’s job. It’s held on because the more sophisticated version control systems haven’t had enough new functionality to compensate for their implicit reductions in versatility and reliability. My goal is to provide the foundation of something which tells a compelling enough story to be worth switching to. I think the case is good: At the minor cost of committing to diffs at commit time you can have safer versions of squash and rebase which Just Work, plus a better version of local undo for the occasional times when you encounter that nightmare and a pretty good version of cherry-picking as a bonus.

‘Committing to diffs at commit time’ is a subtle point. From a behavioral standpoint it’s a clear win. But it does create some implementation risk. Any such implementation needs a core of functionality which is is very well tested and audited and only updated extremely conservatively. This is why I made my demo implementation as simple as possible within the constraints of eventual consistency. Other systems which claim to do this I couldn’t understand their technical docs, much less develop intuitions of how they behave. With the ‘conflicts are updates which happen too close together’ approach I can intuitively reason about the behavior.

Some people found the ‘left’ and ‘right’ monikers confusing. Those are entirely advisory and can be replaced with any info you about the branch name it came from and whether it’s local or remote, or even blame information.

The ‘anchoring’ algorithm for CRDTs has been invented multiple times by independent groups in the last few years. I find it heartening that it’s only been in the last few years because I feel I should have come up with it over twenty years ago. Oddly they don’t seem to have figured out the generation counting trick, which is something I did come up with over twenty years ago. Combining the two ideas is what allows for there to be no reference to commit ids in the history and have the entire algorithm be structural.

One implementation detail I didn’t get into is that in my demo implementation it doesn’t flag ‘conflict’ sections which only consist of deletions with no insertions on either side. I’ve discussed the semantics of this with people and it seems more often than not people view flagging those as excessively conservative and are okay with them clean merging to everything gone. This is no doubt something people can get into religious wars over and it would be very interesting for someone to collect actual data about it but in practice it will inevitably be a flag individual users can set to their liking and the argument is really about the default.

One interesting question about version control is whether it can ever merge together two branches which look the same into a version which looks like neither parent. The approach I’ve proposed avoids doing that in a lot of practical cases which blow up in your face pretty badly, but that doesn’t mean it never does it. For example if you start out with XaXbX and one branch goes XaXbX → aXbX → XX while the other branch goes XaXbX → XaXb → XX. Then when you merge them together the first branch has deleted the first X of three while the second branch has deleted the last X of three so they’ll clean merge into a single X. This is a fairly artificial example which it would be hard to have happen in practice even if X is a blank line, especially if you use a diff algorithm which tries hard to keep the place repeated lines get attached to be reliable and consistent. But if it were to happen it feels like the history has ‘earned’ this funny behavior and going down to a single X with no conflict really is the right thing to do, as counterintuitive as that may be before you’ve worked through this example.

There was some discussion about my comment at the bottom of the last post about the code being artisanal but the post not. The risk with AI is that the code is a spaghetti mess which nobody realizes because no human has ever read it. There’s clear benefit to artisanal coding, or at least human auditing. The risks of AI assisted writing are a lot less. Humans understand what the words say. The AI’s writing is a lot breezier but less interesting but for reference materials that’s probably what you want. I did repeatedly go through that entire last post and tell the AI things which were wrong and should be changed. The experience was much better than manually editing because the AI could include whatever I said more quickly, in a more appropriate location, and with better wordsmithing than if I’d done it by hand. I didn’t try to change the tone to not sound like AI because that would have been more work and because I think it’s funny to encourage AI doomsaying by making it look like AI can write posts like that. This post was written entirely artisanally. Hopefully the term ‘artisanal code’ becomes a thing.

Subscribe now

Posted
jwz (Jamie Zawinski)
Internet advertising is going great.
I hear Spotify is the new hotness, let's see if they will take our money:

Ad name: DNA Lounge Bruno Mars Party
Your ad wasn't approved for the following reasons:
Reason: Your ad contains only music.
Recommendation: Submit a new ad with a clear voiceover that explains what's being advertised.

Do you want TikTok AI Voice? Because this is how you get TikTok AI Voice.

Previously, previously, previously, previously.

Posted
jwz (Jamie Zawinski)
GLES 1.x transparency
Dear Lazyweb, why doesn't alpha blending work when lighting is enabled on Android? Transparency works with glColor but not with glMaterial.

GL_VERSION in the Android simulator is "OpenGL ES-CM 1.1 (4.1 Metal - 88.1)".

This works fine on iOS and Cocoa, so it's not strictly a GLES thing, just Android. GLSL is not involved.

Test case:

Bool lights_p = time(0) & 1; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_BLEND); glDisable (GL_COLOR_MATERIAL); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); #define glColor4fv(v) glColor4f (v[0], v[1], v[2], v[3]) GLfloat c1[] = { 1, 0, 0, 0.5 }; GLfloat c2[] = { 0, 1, 0, 0.5 }; GLfloat v[] = { 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, }; glVertexPointer (3, GL_FLOAT, 0, v); glEnableClientState (GL_VERTEX_ARRAY); if (lights_p) { GLfloat amb[] = {0.5, 0.5, 0.5, 1}; glLightfv (GL_LIGHT0, GL_AMBIENT, amb); glEnable (GL_LIGHTING); glEnable (GL_LIGHT0); glColor3f (0, 0, 0); } else { glDisable (GL_LIGHTING); glDisable (GL_LIGHT0); } if (lights_p) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c1); else glColor4fv (c1); glDrawArrays (GL_TRIANGLES, 0, 6); glPushMatrix(); glTranslatef (0.5, 0.25, 0); if (lights_p) glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c2); else glColor4fv (c2); glDrawArrays (GL_TRIANGLES, 0, 6); glPopMatrix(); glDisableClientState (GL_VERTEX_ARRAY); glVertexPointer (3, GL_FLOAT, 0, 0);
Posted
jwz (Jamie Zawinski)
"Official Video, Full HD, Remastered"
In 2002, Michel Gondry (Eternal Sunshine, Let Forever Be, etc.) made a great video for Kylie Minogue's Come Into My World. I guess he has mortgage payments to make because he just remade it as a commercial for a purse but that's neither here nor there. What I'm here to complain about is that the official Kylie Minogue YouTube channel (1.5M subscribers) has the "Official video" (45M views) "Full HD, Remastered".

Now, I'm old enough to remember when "remastered" meant "we re-scanned the 35mm negative". Let's take a look at the upper left quadrant of the first 15 seconds of that video at half speed. On the left: a 702x576 rip I made of the video in 2003 from the SD DVD release, Directors Series Volume 3: The Work of Michel Gondry; on the right, the 1392x1062 "Official Full HD Remaster".

Pay special attention to the text on the white sign at about 8 seconds in. Full-screen it for the true zalgo-level, AI-upscale, edge-detect horrorshow.

This is why I have trust issues. Kylie.

Previously, previously, previously, previously.

Posted
jwz (Jamie Zawinski)
The Oberlin Luddite Club
Oberlin Luddites Reject "Year of AI Exploration" Adpoted by School Dear President Ambar, We are writing to you on a typewriter that is over 70 years old; this is a machine that we all know well. With it, we misspell words without the crutch of spell check or generative AI and we think intently about every phrase we pound out. As we force ourselves, for once, to slow down, we engage in a cognitive dialogue with ourselves. We do not seek perfection because we know that education is about the growing and challenging of our young minds' potential, not the chasing of inititurtonal 'gold-star' approval. We do not believe that your so-c alled 'Year of AI Exploration; providing enterprise ChatGPT and Google Gemini sub scriptions to every Oberlin student aligns with our college's founding principles. You claim that this year will be one of experimentation, not adoption. But even just one semester of accepted (encouraged even) chat bot use will jettison our student body down a lazy and irredeem able tunnel of intellctual destruction. We are a college grounded in learning and labor, which now risks straying from these rooted ideals. With ChatGPT at the helm, our emails, essays,and discussion posts will be generated for us, not by us. And let's not fool ourselves. This is precisely what these platforms will be used for by our busy, anxious student body. We see your vision for this year as advancing the college's 'businessification'--an alarming trend also seen in the takeover of our beloved library cafe by a 'bookstore' With no bools in stock (just shiny merch) and an app replacing customer service. In one instance, the college assumes we want efficiency at all cost through automated rather than hand-pulled coffee. In the other lies the false belief that we simply desire to turn in an essay, regardless of how little we've written of it. We need not stand by and witness the further atrophy of our liberal arts education. As you embark on your year of AI, we'll embark on our own year of self-actualization, of realizing the fruits of our labor and embracing human imperfection and raw inquiry. We will boldly reject information technologies operating out of data centers ghat guzzle water and energy sources(that simply must contradict our campus's carbon-neutral devotion). We will turn instead t o ourselves and embrace our natural intelligence, intentional hard work, and generative sweat rather than generative AI. We urge anyone who feels similarly to risk disapproval, perceived backwardness and the outward appearance of naivete and join us. Let us not ask what AI can do for Oberlin students, but what Oberlin students can do ourselves, while we still have the brain capacity to think on our own. Yours truly, The Luddite Club of Oberlin College, Logan Lane, CharLie McLaughlin, Mary Claire McGreivey, Sawyer Van Dyck, Simon Puchner-Noel,and Marlowe Blantz

Previously, previously, previously, previously.

Posted
jwz (Jamie Zawinski)
DNA Lounge: Wherein our long SVOG audit nightmare is finally over
To recap...

Back in 2021 we finally received some federal grant money to keep us alive and cover the enormous costs of having been completely closed for 18 months starting in early 2020... This was the COVID-19 Shuttered Venue Operations Grant (SVOG) which I think is the Payroll Protection Program (PPP) wearing a trenchcoat. The money was incredibly helpful! And it was incredibly difficult to get. The amount of paperwork needed to apply for and receive the grant was insane. We just about had to allocate someone to babysitting that paperwork full-time for six months. The effort and complexity was far beyond the reach of most small businesses, which is why most of the money for these grants went to billion-dollar corporate grifters instead of to the people it was supposed to help, notable examples being Ruth's Chris Steak House, Veritas (SF's biggest landlord), Shake Shack, Nestea, RealNetworks, Lil Wayne, Chris Brown, Marshmello, Steve Aoki and Alice in Chains. And of course multinational superpredator LiveNation who managed to steal millions in Federal aid meant for independent venues.

Anyway, it took more than a year from when we applied to when we got our first check. A year with zero customers. And then in late 2024 -- nearly four years later -- they did some kind of rule-changing rug-pull on us. They were "reviewing our file" and demanded that we submit an "audit report consistent with 2 CFR 200 Subpart F".

Just more dumb bureaucracy, right? Well.

Hiring someone to do that audit report correctly cost us $20,000. TWENTY THOUSAND DOLLARS. And had we not done it, they would have demanded we pay back all of the money we got in 2021.

In 2021, they literally told us, "You have to spend all this money. If you don't spend it all within a year, on these things, then you can't keep it." So we didn't even have the option to sit on twenty grand to pay for the eventual audit, even if they had told us that was going to happen, which they did not.

Couldn't they have just given us $20k less and paid for the audit with that? No, apparently not.

Anyway, the auditors decided that we had done something slightly wrong. Let's say we had expenses A through Z, and we said, "We are using the grant to pay for A, B and C." The auditors said, "Oh, you can't spend it on C. But you are allowed to spend it on D through F, so all you have to do is file an amendment, and it all comes out the same."

So we do that... and... crickets.

See, in between when this audit crap started, and the auditors finished, DOGE had dismantled the Small Business Administration, and they just... stopped answering their phones, or email. Even the auditors could not get hold of anybody and that's their entire business.

So between October 2024 and March 2026 we were unable to get anyone at SBA to respond to our request to amend the grant! They didn't say "no" (if they said "no" they would have demanded that we pay back hundreds of thousands of dollars) but rather than saying "yes" they just kept sending us monthly automated emails from a "noreply" address noting that "your Audit Report is still outstanding" and that "Your timely response is anticipated and appreciated in order to resolve any compliance issues."

For two years.

And then today -- the rains have come and the crops are saved!

The Small Business Administration's Shuttered Venue Operators Grant Program (SVOG) has completed its review of your audit submission package. SBA has determined that your organization has fully and materially complied with Federal grant audit requirements for fiscal year 2022.

Our accountant and the auditors wasted so many (billable) hours just trying to get someone on the phone to respond in any way, so the total wasn't just the $20,000 we had to pay the audit firm. It also included all the work our accountant did. Fortunately accountants are boss-level note-takers:

  • 43 emails with SBA;
  • 286 emails with the audit firm;
  • 4+ multi-hour zoom calls with the audit firm;
  • Calling SBA every Wednesday to inquire on the status of our amendments, for at least a year -- 50+ calls lasting at least 30 minutes and getting nowhere, so that's 25 hours right there.

So besides the audiors themselves, babysitting this also cost us somewhere north of 250 hours of labor from our own accountant.

For nothing.

Nothing.

To get us right back to zero.

It's impressive how Apartheid Emerald Mine Space Karen and Cheeto Mussolini have made our government so much more "efficient".


This is where I mention that if you would like to help out with the DNA Lounge Accountancy Defense Fund, you can make a one-time donation or join our Patreon, which by the way is a really good deal.

Posted

Planet Debian upstream is hosted by Branchable.