blog.ratterobert.com

movq (www.uninformativ.de)

I’ve got a prototype of my hardcopy simulator going. I’m typing on the keyboard and the “display” goes to the printer:

https://movq.de/v/56feb53912/s.png

https://movq.de/v/235c1eabac/MVI_8810.MOV.mp4

The biiiiiiiiiig problem is that the print head and plastic cover make it impossible to see what’s currently being printed, because this is not a typewriter. This means: In order to see what I just entered, I have to feed the paper back and forth and back and forth … it’s not ideal.

I got that idea of moving back/forth from Drew DeVault, who – as it turned out – did something similar a few years back. (I tried hard to read as little as possible of his blog post, because figuring things out myself is more fun. But that could mean I missed a great idea here or there.)

But hey, at least this is running on my Pentium 133 on SuSE Linux 6.4, printer connected with a parallel cable. 😍

(Also, yes, you can see the printouts of earlier tests and, yes, I used ed(1) wrong at one point. 🤪 And ls insisted on using colors …)

Read replies 2 days ago
movq (www.uninformativ.de)

RIP Android:

https://9to5google.com/2025/08/25/android-apps-developer-verification/

Since nobody is going to push back on this (I don’t even know if that would be possible), this is going to be a reality on every platform sooner or later.

I’d guess in 20, 30 years, there won’t be “PCs” anymore. No more home computing, no more “I just write my own software”. You won’t own devices anymore, it’ll all be rented and the landlord will tell you what you can do with it.

I hope that I’m wrong, but given where we are today, I don’t think that I will be.

Read replies 4 days ago
movq (www.uninformativ.de)

Sooooooooo, things happened, and I now have a dot matrix printer again. 😍😂

(One of the end goals is to simulate a hardcopy terminal on my old box. I’m waiting for another cable to arrive, I don’t have USB there. And then use ed(1) like it was meant to be used! 😅)

https://movq.de/v/850e04ba36/VID_20250821_180801.mp4.mp4

https://movq.de/v/850e04ba36/closeup.jpg

Read replies 1 week ago
movq (www.uninformativ.de)

UNIX: A History and a Memoir by Brian Kernighan

https://www.youtube.com/watch?v=WEb_YL1K1Qg

I could listen to him all day.

Read replies 1 week ago
movq (www.uninformativ.de)

Okay, often times, these “employer gimmicks” are just silly, but this one did make me laugh:

Read replies 2 weeks ago
movq (www.uninformativ.de)

This genre is great for background music: https://www.youtube.com/watch?v=n--SX54AUZU

Read replies 2 weeks ago
movq (www.uninformativ.de)

What’s Missing from “Retro”: gopher://midnight.pub/0/posts/2679

Read replies 3 weeks ago
movq (www.uninformativ.de)

Hard to believe that this song is from 1985:

https://www.youtube.com/watch?v=cen22TBHo9M

Read replies 3 weeks ago
movq (www.uninformativ.de)

We did an experiment at work today: Do I even need to lock my laptop when I’m gone or is nobody able to use it anyway?

It went as expected. 🤣

Read replies 3 weeks ago
movq (www.uninformativ.de)

Spiders are the only web developers that enjoy finding bugs.

Read replies 3 weeks ago
movq (www.uninformativ.de)

In 1996, they came up with the X11 “SECURITY” extension:

https://www.reddit.com/r/linux/comments/4w548u/what_is_up_with_the_x11_security_extension/

This is what could have (eventually) solved the security issues that we’re currently seeing with X11. Those issues are cited as one of the reasons for switching to Wayland.

That extension never took off. The person on reddit wonders why – I think it’s simple: Containers and sandboxes weren’t a thing in 1996. It hardly mattered if X11 was “insecure”. If you could run an X11 client, you probably already had access to the machine and could just do all kinds of other nasty things.

Today, sandboxing is a thing. Today, this matters.

I’ve heard so many times that “X11 is beyond fixable, it’s hopeless.” I don’t believe that. I believe that these problems are solveable with X11 and some devs have said “yeah, we could have kept working on it”. It’s that people don’t want to do it:

Why not extend the X server?

Because for the first time we have a realistic chance of not having to do that.

https://wayland.freedesktop.org/faq.html

I’m not in a position to judge the devs. Maybe the X.Org code really is so bad that you want to run away, screaming in horror. I don’t know.

But all this was a choice. I don’t buy the argument that we never would have gotten rid of things like core fonts.

All the toolkits and programs had to be ported to Wayland. A huge, still unfinished effort. If that was an acceptable thing to do, then it would have been acceptable to make an “X12” that keeps all the good things about X11, remains compatible where feasible, eliminates the problems, and requires some clients to be adjusted. (You could have still made “X11X12” like “XWayland” for actual legacy programs.)

Read replies 1 month ago
movq (www.uninformativ.de)

“Wayland Will Never Be Ready For Every X.Org User”

https://youtu.be/yURfsJDOw1E

Read replies 1 month ago
movq (www.uninformativ.de)

Here’s an example of X11/Xlib being old and archaic.

X11 knows the data type “cardinal”. For example, the window property _NET_WM_ICON (which holds image data for icons) is an array of “cardinal”. I am already not really familiar with that word and I’m assuming that it comes from mathematics:

https://en.wikipedia.org/wiki/Cardinal_number

(It could also be a bird, but probably not: https://en.wikipedia.org/wiki/Cardinalidae)

We would probably call this an “integer” today.

EWMH says that icons are arrays of cardinals and that they’re 32-bit numbers:

https://specifications.freedesktop.org/wm-spec/latest-single/#id-1.6.13

So it’s something like 0x11223344 with 0x11 being the alpha channel, 0x22 is red, and so on.

You would assume that, when you retrieve such an array from the X11 server, you’d get an array of uint32_t, right?

Nope.

Xlib is so old, they use char for 8-bit stuff, short int for 16-bit, and long int for 32-bit:

https://x.org/releases/current/doc/libX11/libX11/libX11.html#Obtaining_and_Changing_Window_Properties

That is congruent with the general C data types, so it does make sense:

https://en.wikipedia.org/wiki/C_data_types

Now the funny thing is, on modern x86_64, the type long int is actually 64 bits wide.

The result is that every pixel in a Pixmap, for example, is twice as large in memory as it would need to be. Just because Xlib uses long int, because uint32_t didn’t exist, yet.

And this is something that I wouldn’t know how to fix without breaking clients.

Read replies 1 month ago
movq (www.uninformativ.de)

I wore a Kubernetes shirt, in public, by accident, and now I feel dirty and ashamed. 😢

Read replies 1 month ago
movq (www.uninformativ.de)

Something happened with the frame rate of terminal emulators lately. It looks like there’s a trend to run at a high framerate now? I’m not sure exactly. This can be seen in VTE-based terminals like my xiate or XTerm on Wayland. foot and st, on the other hand, are fine.

My shell prompt and cursor look like this:

$ █

When I keep Enter pressed, I expect to see several lines like so:

$
$
$
$
$
$
$ █

With the affected terminal emulators, the lines actually show up in the following sequence. First, we have the original line:

$ █

Pressing Enter yields this as the next frame:

$
█

And then eventually this:

$
$ █

In other words, you can see the cursor jumping around very quickly, all the time.

Another example: Vim actually shows which key you just pressed in the bottom right corner. Keeping j pressed to scroll through a file means I get to see a j flashing rapidly now.

(I have no idea yet, why exactly XTerm in X11 is fine but flickering in Wayland.)

Read replies 1 month ago
movq (www.uninformativ.de)

The WM_CLASS Property is used on X11 to assign rules to certain windows, e.g. “this is a GIMP window, it should appear on workspace number 16.” It consists of two fields, name and class.

Wayland (or rather, the XDG shell protocol – core Wayland knows nothing about this) only has a single field called app_id.

When you run X11 programs under Wayland, you use XWayland, which is baked into most compositors. Then you have to deal with all three fields.

Some compositors map name to app_id, others map class to app_id, and even others directly expose the original name and class.

Apparently, there is no consensus.

Read replies 1 month ago
movq (www.uninformativ.de)

I bought the “remastered” versions of Grim Fandango and Forsaken on GOG, because they’re super cheap at the moment. Both have native Linux versions.

And both these Linux version crap their pants. 🫤 The bundled SDL2 of Forsaken says it “can’t find a matching GLX visual” and I couldn’t figure out how to fix that. I didn’t spend a lot of time on Grim Fandango.

Both work great in Wine. 🤦

(I do have the original version of Grim Fandango from the 1990ies, but that one does not work so well in Wine. I figured, if it’s so cheap, why not. And I now get to play the english version. 😃 The german dub is pretty damn good, actually, but I always prefer the original these days.)

Read replies 1 month ago
movq (www.uninformativ.de)

It took about a year, I think, but I’ve now finished another run of Tomb Raider I, II, and III. And I have, for the first time, played the two bonus packs “Unfinished Business” (for TR I) and “Golden Mask” (for TR II). They’re available as a free download, if you have the original games. (The bonus pack for TR III is not free.)

I just love these games – and the game mechanics. It’s just the right balance between challenging and relaxing.

https://movq.de/v/c55a2a137d/the%2Dend.jpg

Read replies 1 month ago
movq (www.uninformativ.de) Read replies 2 months ago
movq (www.uninformativ.de)

Someone did a thing:

https://social.treehouse.systems/@ariadne/114763322251054485

I’ve been silently wondering all the time if this was possible, but never investigated: Keep doing X11 but use Wayland as a backend.

This uses XWayland’s “rootful” mode, which basically just gives you a normal Wayland window with all the X11 stuff happening inside of it:

https://www.phoronix.com/news/XWayland-Rootful-Useful

In other words, put such a window in fullscreen and you (more or less) have good old X11 running in a Wayland window.

(For me, personally, this won’t be the way forward. But it’s a very interesting project.)

Read replies 2 months ago
movq (www.uninformativ.de)

I did a “lecture”/“workshop” about this at work today. 16-bit DOS, real mode. 💾 Pretty cool and the audience (devs and sysadmins) seemed quite interested. 🥳

  • People used the Intel docs to figure out the instruction encodings.
  • Then they wrote a little DOS program that exits with a return code and they used uhex in DOSBox to do that. Yes, we wrote a COM file manually, no Assembler involved. (Many of them had never used DOS before.)
  • DEBUG from FreeDOS was used to single-step through the program, showing what it does.
  • This gets tedious rather quickly, so we switched to SVED from SvarDOS for writing the rest of the program in Assembly language. nasm worked great for us.
  • At the end, we switched to BIOS calls instead of DOS syscalls to demonstrate that the same binary COM file works on another OS. Also a good opportunity to talk about bootloaders a little bit.
  • (I think they even understood the basics of segmentation in the end.)

The 8086 / 16-bit real-mode DOS is a great platform to explain a lot of the fundamentals without having to deal with OS semantics or executable file formats.

Now that was a lot of fun. 🥳 It’s very rare that we do something like this, sadly. I love doing this kind of low-level stuff.

Read replies 2 months ago
movq (www.uninformativ.de)

Saw this on Mastodon:

https://racingbunny.com/@mookie/114718466149264471

18 rules of Software Engineering

  1. You will regret complexity when on-call
  2. Stop falling in love with your own code
  3. Everything is a trade-off. There's no "best" 3. Every line of code you write is a liability 4. Document your decisions and designs
  4. Everyone hates code they didn’t write
  5. Don't use unnecessary dependencies
  6. Coding standards prevent arguments
  7. Write meaningful commit messages
  8. Don't ever stop learning new things
  9. Code reviews spread knowledge
  10. Always build for maintainability
  11. Ask for help when you’re stuck
  12. Fix root causes, not symptoms
  13. Software is never completed
  14. Estimates are not promises
  15. Ship early, iterate often
  16. Keep. It. Simple.

Solid list, even though 14 is up for debate in my opinion: Software can be completed. You have a use case / problem, you solve that problem, done. Your software is completed now. There might still be bugs and they should be fixed – but this doesn’t “add” to the program. Don’t use “software is never done” as an excuse to keep adding and adding stuff to your code.

Read replies 2 months ago
movq (www.uninformativ.de)

Okay, here’s a thing I like about Rust: Returning things as Option and error handling. (Or the more complex Result, but it’s easier to explain with Option.)

fn mydiv(num: f64, denom: f64) -> Option<f64> {
    // (Let’s ignore precision issues for a second.)
    if denom == 0.0 {
        return None;
    } else {
        return Some(num / denom);
    }
}

fn main() {
    // Explicit, verbose version:
    let num: f64 = 123.0;
    let denom: f64 = 456.0;
    let wrapped_res = mydiv(num, denom);
    if wrapped_res.is_some() {
        println!("Unwrapped result: {}", wrapped_res.unwrap());
    }

    // Shorter version using "if let":
    if let Some(res) = mydiv(123.0, 456.0) {
        println!("Here’s a result: {}", res);
    }

    if let Some(res) = mydiv(123.0, 0.0) {
        println!("Huh, we divided by zero? This never happens. {}", res);
    }
}

You can’t divide by zero, so the function returns an “error” in that case. (Option isn’t really used for errors, IIUC, but the basic idea is the same for Result.)

Option is an enum. It can have the value Some or None. In the case of Some, you can attach additional data to the enum. In this case, we are attaching a floating point value.

The caller then has to decide: Is the value None or Some? Did the function succeed or not? If it is Some, the caller can do .unwrap() on this enum to get the inner value (the floating point value). If you do .unwrap() on a None value, the program will panic and die.

The if let version using destructuring is much shorter and, once you got used to it, actually quite nice.

Now the trick is that you must somehow handle these two cases. You must either call something like .unwrap() or do destructuring or something, otherwise you can’t access the attached value at all. As I understand it, it is impossible to just completely ignore error cases. And the compiler enforces it.

(In case of Result, the compiler would warn you if you ignore the return value entirely. So something like doing write() and then ignoring the return value would be caught as well.)

Read replies 2 months ago
movq (www.uninformativ.de)

Fuck me sideways, Rust is so hard. Will we ever be friends?

Read replies 2 months ago
movq (www.uninformativ.de)

OpenBSD has the wonderful pledge() and unveil() syscalls:

https://www.youtube.com/watch?v=bXO6nelFt-E

Not only are they super useful (the program itself can drop privileges – like, it can initialize itself, read some files, whatever, and then tell the kernel that it will never do anything like that again; if it does, e.g. by being exploited through a bug, it gets killed by the kernel), but they are also extremely easy to use.

Imagine a server program with a connected socket in file descriptor 0. Before reading any data from the client, the program can do this:

unveil("/var/www/whatever", "r");
unveil(NULL, NULL);
pledge("stdio rpath", NULL);

Done. It’s now limited to reading files from that directory, communicating with the existing socket, stuff like that. But it cannot ever read any other files or exec() into something else.

I can’t wait for the day when we have something like this on Linux. There have been some attempts, but it’s not that easy. And it’s certainly not mainstream, yet.

I need to have a closer look at Linux’s Landlock soon (“soon”), but this is considerably more complicated than pledge()/unveil():

https://landlock.io/

Read replies 2 months ago
movq (www.uninformativ.de)

So I was using this function in Rust:

https://doc.rust-lang.org/std/path/struct.Path.html#method.display

Note the little 1.0.0 in the top right corner, which means that this function has been “stable since Rust version 1.0.0”. We’re at 1.87 now, so we’re good.

Then I compiled my program on OpenBSD with Rust 1.86, i.e. just one version behind, but well ahead of 1.0.0.

The compiler said that I was using an unstable library feature.

Turns out, that function internally uses this:

https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.display

And that is only available since Rust 1.87.

How was I supposed to know this? 🤨🫩

Read replies 2 months ago
movq (www.uninformativ.de)

When I chose the MIT license for all of my software, I thought:

“Should I use GPL, which I don’t really understand? Is that worth it? Yeah, there is a theoretical possibility that some company might use my code in their proprietary product … and then what? Should I sue them to enforce the GPL? I’m not going to do that anyway, so I’ll just use the MIT license.”

And now we have those LLM scrapers and now it’s suddenly a reality that these companies (ab)use my code. I can see it in my logs. I didn’t expect that back then.

GPL wouldn’t help, either, of course. (Regardless, I now think that GPL would have been the better choice anyway.)

I’m honestly considering taking my code and website offline. Maybe make it accessible through some obscure protocol like Gopher or Gemini, but no more HTTP.

(Yes, Anubis might help. Temporarily.)

I’m just tired.

Read replies 2 months ago
movq (www.uninformativ.de)

Maybe you’ll enjoy this as well:

I still have one of my first modems, a Creatix LC 144 VF:

I think this was the modem that I used when I first connected to the internet, but I’m not sure.

I plugged it in again and it still works:

The firmware appears to be from 1994, which sounds about right. I don’t think we had internet access before that. We certainly did use local mailboxes, though. (Or BBS’s, as you might call them.)

I now want to actually use that modem again. For the moment, I can only use a phone to dial into it, I lack a second modem to actually establish a connection. Here’s a video:

Not spectacular, but the modem does answer after me entering ATA.

I bought another cheap old modem on eBay and am now waiting for it to arrive. Once it’s here, I want to simulate an actual dial-up session, hopefully from OS/2 or Windows 3.x.

Read replies 3 months ago
movq (www.uninformativ.de)

That was so great to watch, I was smiling from ear to ear the whole time. 😃

https://www.youtube.com/watch?v=E7LYCERDnX4

Read replies 3 months ago
movq (www.uninformativ.de)

Happy to report that the neighbor has started playing Tschaikowski on their piano. And they’re getting really good at it! This is awesome. 😍

Read replies 3 months ago
movq (www.uninformativ.de)

Wanna read something very scary?

Your future doctor is using ChatGPT to pass medical school, so you better start riding a bike and eating healthy now.

😨😨😨

https://infosec.exchange/@duanegran/114531604486731084

Read replies 3 months ago
movq (www.uninformativ.de)

And to finish the day: Om Live at Pioneer Works 🤘 – https://www.youtube.com/watch?v=IwnDKcoVHmY

Read replies 3 months ago
movq (www.uninformativ.de)

Now playing: Funky bass and people moving in a funny way, doing funny faces: https://www.youtube.com/watch?v=zVyEPAMpwDc (Vulfpeck & Chris Thile – Dean Town)

Read replies 3 months ago
movq (www.uninformativ.de)

The thing about upright bass is that you must play it on a regular basis. At least several times a week, ideally daily. It requires quite a bit of strength and it’s very easy to lose those muscles again – at least I don’t use them that much otherwise. 🤣 I’ve been through several cycles of “gain strength → lose strength → goto 0” now …

Read replies 3 months ago
movq (www.uninformativ.de)

So, the “AI” bots have reached my website. Looks like they’re just slowly crawling everything at the moment – no DDoS-like attack yet. I wonder if that has something to do with my website being 100% static HTML. There are no GET parameters they can tweak and, at the end of the day, there’s not that much data on my server anyway … And maybe they have no idea what stagit is, so it doesn’t trigger “standard behavior”, like “this is a Gitea instance, let’s crawl this like crazy!”?

Read replies 3 months ago
movq (www.uninformativ.de)

Confession:

I’ve never found microblogging like twtxt or the Fediverse or any other “modern” social media to be truly fulfilling/satisfying.

The reason is that it is focused so much on people. You follow this or that person, everybody spends time making a nice profile page, the posts are all very “ego-centric”. Seriously, it feels like everybody is on an ego-trip all the time (this is much worse on the Fediverse, not so much here on twtxt).

I miss the days of topic-based forums/groups. A Linux forum here, a forum about programming there, another one about a certain game. Stuff like that. That was really great – and it didn’t even suffer from the need to federate.

Sadly, most of these forums are dead now. Especially the nerds spend a lot of time on the Fediverse now and have abandoned forums almost completely.

On Mastodon, you can follow hashtags, which somewhat emulates a topic-based experience. But it’s not that great and the protocol isn’t meant to be used that way (just read the snac2 docs on this issue). And the concept of “likes” has eliminated lots of the actual user interaction. ☹️

Read replies 3 months ago
movq (www.uninformativ.de)

If we must stick to hashes for threading, can we maybe make it mandatory to always include a reference to the original twt URL when writing replies?

Instead of

 hello foo bar

you would have

(<a href="?search=123467" class="tag">#123467</a> http://foo.com/tw.txt) hello foo bar

or maybe even:

(<a href="?search=123467" class="tag">#123467</a> 2025-04-30T12:30:31Z http://foo.com/tw.txt) hello foo bar

This would greatly help in reconstructing broken threads, since hashes are obviously unfortunately one-way tickets. The URL/timestamp would not be used for threading, just for discovery of feeds that you don’t already follow.

I don’t insist on including the timestamp, but having some idea which feed we’re talking about would help a lot.

In reply to: #123467 4 months ago
movq (www.uninformativ.de)

Remembered a fun little “hello world” program I made in 2018:

https://movq.de/v/a1c4a819e6/vid.mp4

(It runs smoothly. My computer just isn’t fast enough for a smooth X11 screengrab at that resolution.)

Read replies 4 months ago
movq (www.uninformativ.de)

To the parents or teachers: How do you teach kids to program these days? 🤔

Read replies 4 months ago
movq (www.uninformativ.de)

That was a wild ride:

https://www.youtube.com/watch?v=QSMDb1CWD6Y

Notice how old all these people sound. They started playing this game like 10, 15, 20 years ago, most of them left, but some are still there. I love that level of commitment. 😃

Also interesting from a technical point of view. Creating that virtual world and keeping it running consistently for so long … 🤯

Read replies 4 months ago
movq (www.uninformativ.de)

It’s AI shit, but … it is funny … and an appropriately bizzare response to a bizzare situation. 😂

https://www.youtube.com/watch?v=HJ8qGOe2K0o

Read replies 4 months ago
movq (www.uninformativ.de)

I’ve been using GIMP 3.0 for a few weeks now and it’s great. New features and I got rid of two custom plugins because they’re in core now. Literally nothing broke for me. And I really appreciate that they kept the familiar UI (instead of changing things just for the sake of change).

Thank you! 🥳

Read replies 4 months ago
movq (www.uninformativ.de)

I’m playing with ratterplatter again: It’s a toy that watches disk I/O and emulates the noise of a real hard disk. (Linux only.) It uses sound samples from one of my older disks.

I tried a different approach at estimating the disk activity and I think I finally got it right (after almost 10 years … 🤦).

Demo, booting a Windows 2000 VM: https://movq.de/v/1400544cc6/2kboot-ratterplatter-2.mp4

(For this purpose alone, I put a couple of mini speakers into my PC case, so that the noise comes from the right place: https://movq.de/v/a3b2dc0932/speakers.jpg)

The results aren’t too bad, but this thing can’t be super accurate due to the huge I/O caches that we have these days. For the video, I dropped the caches before booting Windows, otherwise you would have heard almost nothing.

FWIW, if you don’t know it yet, this is the equivalent for proper keyboard sound: https://github.com/zevv/bucklespring

Read replies 4 months ago
movq (www.uninformativ.de)

Tom Waits in 2025 looks and sounds exactly like you’d expect. 🥴

Read replies 4 months ago
movq (www.uninformativ.de)

If you’ve played Grim Fandango back in the day, you’ll enjoy this: https://www.youtube.com/watch?v=iNc58NznIUM

Read replies 5 months ago
movq (www.uninformativ.de)

Thinking about adding a little “focus” feature to my window manager: It hides all but one window, no wallpaper, no bars.

It would turn this

https://movq.de/v/a75eb68770/a0.jpg

into this

https://movq.de/v/a75eb68770/a1.jpg

or this

https://movq.de/v/a75eb68770/b0.jpg

into this:

https://movq.de/v/a75eb68770/b1.jpg

🤔

Read replies 5 months ago
movq (www.uninformativ.de)

I’ve identified several issues with my current (admittedly cheap) upright bass by now. It might be time to upgrade to a better model. 🤔

If only those things weren’t so damn expensive. I just checked the prices and simply burst out laughing. 😂

Read replies 5 months ago
movq (www.uninformativ.de) Read replies 5 months ago
movq (www.uninformativ.de)

This guy doing a dub techno mix and his GF in the background does yoga … which … sometimes … looks a bit like there’s just a dead body on the floor. 😂

https://www.youtube.com/watch?v=qA8G9D9LQIE&t=3095s

Read replies 5 months ago
movq (www.uninformativ.de)

Work takes up 110% of my energy at the moment. All I can do is sit here and try to unwind.

On an entirely unrelated note, Resident Alien (Alan Tudyk!) and Ghosts (Rose McIver!) are great shows.

Read replies 5 months ago
Reply via email