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 β¦)
My next try with twtxt - because itβs the closest to my idea of microblogging.
@kat@yarn.girlonthemoon.xyz Cool! I just got an idea for work tomorrow: Use dmenu to quickly start different SSH tunnels I routinely need.
@kat@yarn.girlonthemoon.xyz I have absolutely no idea, but I wouldnβt be surprised if it uses the closest full image after your cut point and not the one before. Hence, the deltas between the two full images have nothing to really refer to. So, the video player just shows the first full image it finds and βfreezesβ the image until the video stream actually hits it.
Let me try to visualize it, |
represent full images, .
just subsequent deltas:
Original start of video
β
|......|.....|........|......|..
β β
Cut point Cut point
Resulting video:
....|.....|........|....
ββββ
This is where it freezes
Could be complete bullshit, though. Wouldnβt be the first time that Iβm wrong. :-)
Iβm just curious, what exact command line do you use to cut the video?
@lyse@lyse.isobeef.org yesss itβs not my idea but itβs sooo fun here ngl like i should use it more!!
@movq@www.uninformativ.de Thatβs an interesting idea. For privacy, Iβd just omit the Referer
altogether. But maybe this helps talking to misconfigured HTTP servers that reject requests without such a header. No clue.
@lyse@lyse.isobeef.org Hm, I donβt think so, the requested page was a Linux-specific post. π€ I sometimes wonder if privacy-oriented browsers might do this on purpose, to create garbage data? π€ No idea.
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.)
@prologic@twtxt.net @bender@twtxt.net Thatβs what I thought as well, sounds way too expensive to me. But I have no idea what the prices are over here. Probably also astronomical. Campers sit around most of the time, one really would need to use them a lot to justify spending so much money on them.
But yeah, each to their own (expensive) hobbies. :-) I, for example, burn my money on tools that I donβt reallyβ’ need. :-P
@prologic@twtxt.net Yeah, this really could use a proper definition or a βmanifestβ. π Many of these ideas are not very wide spread. And I havenβt come across similar projects in all these years.
Letβs take the farbfeld image format as an example again. I think this captures the βspiritβ quite well, because this isnβt even about code.
This is the entire farbfeld spec:
farbfeld is a lossless image format which is easy to parse, pipe and compress. It has the following format:
ββββββββββ€ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Bytes β Description β
β βββββββββͺββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β 8 β "farbfeld" magic value β
ββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ’
β 4 β 32-Bit BE unsigned integer (width) β
ββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ’
β 4 β 32-Bit BE unsigned integer (height) β
ββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ’
β [2222] β 4x16-Bit BE unsigned integers [RGBA] / pixel, row-major β
ββββββββββ§ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The RGB-data should be sRGB for best interoperability and not alpha-premultiplied.
(Now, I donβt know if your screen reader can work with this. Let me know if it doesnβt.)
I think these are some of the properties worth mentioning:
- The spec is extremely short. You can read this in under a minute and fully understand it. That alone is gold.
- There are no βknobsβ: Itβs just a single version, itβs not like thereβs also an 8-bit color depth version and one for 16-bit and one for extra large images and one that supports layers and so on. This makes it much easier to implement a fully compliant program.
- Despite being so simple, itβs useful. Iβve used it in various programs, like my window manager, my status bars, some toy programs like βtuxeyesβ (an Xeyes variant), or Advent of Code.
- The format does not include compression because it doesnβt need to. Just use something like bzip2 to get file sizes similar to PNG.
- It doesnβt cover every use case under the sun, but it does cover the most important ones (imho). They have discussed using something other than RGBA and decided itβs not worth the trouble.
- They refrained from adding extra baggage like metadata. It would have needlessly complicated things.
@movq@www.uninformativ.de Yeah thatβs why Iβm striking this conversation with you π Not only do I respect your opinion quite highly π€£ But like you say (and Iβve read their philipshpy) it can be a bit βelitismβ for sure. Iβm genuinely interested in what we think of as software that βdoesnβt suckβ. Tb be honest I havenβt really put thought to paper myself, but I reckon if I did, Iβd have some opinions/ideasβ¦
In all fairness, GOG says that Forsaken is only supported on Ubuntu 16.04 β not current Arch Linux. If you ask me, this just goes to show that Linux is not a good platform for proprietary binary software.
Is it free software, do you have the source code? Then youβre good to go, things can be patched/updated (that can still be a lot of work). But proprietary binary blobs? Very bad idea.
I was wondering: What the heck is the light on my boot!? Turns out between sock and shoe tongue was a firefly, unbelievable! ;-D Iβve no idea how that happened. After untying, it took me five attempts to finally get it off. How crazy!
Watching several hundred glowworms tonight did not get boring. Itβs just so damn cool. :-)
@movq@www.uninformativ.de I also donβt think that Iβm a particularly good speaker. :-) The workshop model is a good idea, I like that.
Yeah, itβs really good fun. I can highly recommend it. This is also a good way to train (new) developers to think like attackers, how to break in, destroy something or raise awareness of some classes of bugs. Then you can avoid them next time. Itβs surprising to me what vulnerabilities come up during this event every time. So, absolutely worth it, win, win.
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.)
@kat@yarn.girlonthemoon.xyz I might give it a shot. π
Skimming through the manual: I had no idea that keeping the βupβ cursor pressed actually slows you down at some point. π€¦
pledge()
and unveil()
syscalls:
@movq@www.uninformativ.de I like this idea π Very neat!
@prologic@twtxt.net will do. No worries, not a show stopper. I will suggest that the muted numbered list not be sorted, but latest muted first. That way we have a better idea. Maybe adding timestamps to those too? Just a thought.
@movq@www.uninformativ.de you have no idea what a soul sucking, heartbreaking SOB 2025 turned out to be. I wish you the best of luck with whatever annoyances life might have thrown your way. Power to you, my friend.
@movq@www.uninformativ.de Iβve absolutely no idea how theyβre poured in. I bet it must be some automatic thing. At least I cannot imagine that any sane person would ever add such junk to a list.
i saw folks in #lowendtalk are discussing about which password managers are worth using?. should have summary peopleβs opinion and my own into a blog post, had this idea for a while, the purpose is to tell my people how to be more secure & easier in life.
fit 1 $ spin (saw 0.1 * sign fxy) $ rect 0 1 - rect 0 0.99 >> add;
#punctual #livecoding #creativecoding #videoart
@sorenpeter@darch.dk Also not very readable. Quite cryptic really π I have no idea how this works π€¦ββοΈ
My vision with this newsletter is to have a slower medium for communicating about my art as well as ideas and projects Iβm working on regarding how we can use digital technology to our own benefits instead of being exploited by big tech.
Twtxt not sloe enough for you? π€£
@kat@yarn.girlonthemoon.xyz Ta! The dead end wasnβt all that bad in my opinion. Personally, I really do like dirt paths and exploring. It was all dried up, so no muddy mess we had to walk through. More like climbing over thick branches that have been worked into the ground by harvesters or forwarders in the muddy winter. Rough terrain. My mate, on the other hand β whose idea it was to check out the real summit in the first place ;-) β wasnβt all that pleased about the detour. Oh well. :-D
To follow up what I said minutes ago, they donβt even want you to think of the initial idea, they want you to be a mindless organism, the AI algorithm analyses and tells what you should make, down to the script, so that you get the highest number of people possible to click it and see some AI generated advertisement, blended seemly into whatβs no lonher even your work.
https://arstechnica.com/gadgets/2025/05/netflix-will-show-generative-ai-ads-midway-through-streams-in-2026/
https://youtu.be/dGA6sVaGveU
sooo many ideas for my site now that itβs SSG powered, not enough energyβ¦.. i wanna make little content collections but no energy T__T also i only half know what content i wanna put in them lol!
@kat@yarn.girlonthemoon.xyz come on! Stop giving me ideas when Iβm bored, specially when thereβs a sewing machine in a room next to mine xD
Thanks to @kat@yarn.girlonthemoon.xyz and her shelf I finally spent several hours in the woodshop. I wanted to build two drawers for the workbench and thought that I will complete this project in no time. Iβve been so wrong again. ;-)
I didnβt draw any plans, just measured a few times and then went to cutting a bunch of particle board leftovers at the table saw. I routed rebates on the sides, fronts and backs to lap the boxes and sink in the bottom. It turned out that having no plans was a stupid idea. I cut exactly on the lines as I calculated and measured, however, the math in my head fell apart when it eventually met reality. The bottoms are too short, so I gotta glue on some strips. Also, with the longer fronts, the sides wonβt work either, I have to fix them as well. :-D
Finally, the lid of my cyclone bucket broke when the negative pressure got too large. Oh well. It was just an old wood glue bucket, Iβve got another empty one, so I can use that lid but strengthen it first with some plywood. Something for future Lyse to deal with.
All in all, it was still good fun. Wood (haha) do it again, but at least with some sketches on paper. ;-)
@kat@yarn.girlonthemoon.xyz Any idea why?
Z
for UTC +00:00
- is that allowed in your specs?
Regarding url =
I would suggest to only allow one and the maybe add url_old =
or url_alt =
!?
I'm still not a fan of a DM feature, even thou it helps that i have now been split out into a separate feed file. Instead if would suggest a contact =
field for where people can put an email or other id/link for an established chat protocol like signal or matrix.
@bender@twtxt.net I think this would be a good idea as @movq@www.uninformativ.de and @andros@twtxt.andros.dev have done β
I may even join the experiments if I have any spare time to hack a custom yrand
branch and run it up on say something like a yarnexp.mills.io
or something π€
@sorenpeter@darch.dk Yes, there are interesting things that can be incorporated to see how they work.
The issue of allowing the use of Z for UTC is interesting. I think I should add a brief explanation.
The url issue is for a debate :D . Maybe an issue could be opened. My opinion is that it is necessary to leave it as it is right now because otherwise the thread system, or replies, may have problems (404s). Itβs all a matter of discussion.
I like your idea of contact. I will add it.
Thanks to you for your feedback!!!
@andros@twtxt.andros.dev Thanks for consolidating a lot of good ideas. Especially how you have deiced to just extend the mention syntax for location-based treads. This might even be backward compatible with older (pre-yarn) clients.
What about using Z
for UTC +00:00
- is that allowed in your specs?
Regarding url =
I would suggest to only allow one and the maybe add url_old =
or url_alt =
!?
Iβm still not a fan of a DM feature, even thou it helps that i have now been split out into a separate feed file. Instead if would suggest a contact =
field for where people can put an email or other id/link for an established chat protocol like signal or matrix.
@kat@yarn.girlonthemoon.xyz Off-topic areas are always a good idea. :-) Web forums often had those. And web forums are actually what I had in mind, @bender@twtxt.net. π (While I do have a certain nostalgia for it now, Usenet has always been a bit weird to me. Canβt really explain why.)
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!β?
@lyse@lyse.isobeef.org Kind of, but on the other hand: This twt right here refers to 3rvya6q
and your feed, but your feed certainly does not include that particular twt (it comes from my feed).
But my proposal probably isnβt very helpful, either. We have this flat conversation model, so β¦ this twt right here, what should it refer to? Your twt? My root twt? I donβt know.
@prologic@twtxt.net Donβt include this just yet. I need to think about this some more (or drop the idea).
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
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#123467</a>) hello foo bar
you would have
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#123467</a> http://foo.com/tw.txt) hello foo bar
or maybe even:
(<a href="https://yarn.girlonthemoon.xyz/search?q=%23123467">#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.
7
to 12
and use the first 12
characters of the base32 encoded blake2b hash. This will solve two problems, the fact that all hashes today either end in q
or a
(oops) π
And increasing the Twt Hash size will ensure that we never run into the chance of collision for ions to come. Chances of a 50% collision with 64 bits / 12 characters is roughly ~12.44B Twts. That ought to be enough! -- I also propose that we modify all our clients and make this change from the 1st July 2025, which will be Yarn.social's 5th birthday and 5 years since I started this whole project and endeavour! π± #Twtxt #Update
July 1st. 63 days from now to implement a backward-incompatible change, apparently not open to other ideas like replacing blake with SHA, or discussing implementation challenges for other languages and platforms.
Finally just closing #18, #19 and #20 without starting a proper discussion and ignoring a βmicro consensusβ feelsβ¦ not right.
I donβt know what to think rather than letting it rest (May will be busy here) and focus on other stuff in the future.
@movq@www.uninformativ.de Agreed, finding the right motivation can be tricky. You sometimes have to torture yourself in order to later then realize, yeah, that was actually totally worth it. Itβs often hard.
I think if you find a project or goal in general that these kids want to achieve, that is the best and maybe only choice with a good chance of positive outcome. I donβt know, like building a price scraper, a weather station or whatever. Yeah, these are already too advanced if they never programmed, but you get the idea. If they have something they want to build for themselves for their private life, that can be a great motivator Iβve experienced. Or you could assign βem the task to build their own twtxt client if they donβt have any own suitable ideas. :-)
Showing them that you do a lot of your daily work in the shell can maybe also help to get them interested in text-based boring stuff. Or at least break the ice. Lead by example. The more I think about it, the more I believe this to be very important. Thatβs how I still learn and improve from my favorite workmate today in general. Which Iβm very thankful of.
Weβre all old farts. When we started, there werenβt a lot of options. But today? Iβd be completely overwhelmed, I think.
Hence, Iβd recommend to start programming with a console program. As for the language, not sure. But Python is probably a good choice
Thatβs what I usually do (when we have young people at work who never really programmed before), but it doesnβt really βhitβ them. Theyβve seen so much, crazy graphics, web pages, itβs all fancy. Just some text output is utterly boring these days. βΉοΈ And thatβs my problem: I have no idea how I could possibly spark some interest in things like pointers or something βlow-levelβ like that. And I truly believe that you need to understand things like pointers in order to program, in general.
@movq@www.uninformativ.de I started with Delphi in school, the book (that we never ever used even once and I also never looked at) taught Pascal. The UI part felt easy at first but prevented me from understanding fundamental stuff like procedures or functions or even begin
and end
blocks for if
s or loops. For example I always thought that I needed to have a button somewhere, even if hidden. That gave me a handler procedure where I could put code and somehow call it. Two or three years later, a new mate from the parallel class finally told me that this wasnβt necessary and how to do thing better.
You know all too well that back in the day there was not a whole lot of information out there. And the bits that did exist were well hidden. At least from me. Eventually discovering planet-quellcodes.de (I donβt remember if that was the original forum or if that got split off from some other board) via my best schoolmate was like finding the Amber Room. Yeah, reading the ITG book would have been a very good idea for sure. :-)
In hindsight, a console program without the UI overhead might have been better. At least for the very start. Much less things to worry about or get lost.
Hence, Iβd recommend to start programming with a console program. As for the language, not sure. But Python is probably a good choice, it doesnβt require a lot of surrounding boilerplate like, say Java or Go. It also does exceptionally well in the principle of least surprise.
I have a great idea for fixing the US economy. Get rid of all the nuclear weapons π€£
@quark@ferengi.one I do have an idea for syncing this π€
These ideas are dr the two books:
- Drift into Failure: From Hunting Broken Components to Understanding Complex Systems by Sidney Dekker (2011)
- Engineering a Safer World by Nancy Leveson (2011)
The former I havenβt read. The later I havenβt finished reading π
And the idea of asynchronous evolutions comes from system accidents where control failures emerge when system structure, constraints, and evolution are poorly managed.
The idea of drift into failure is small normal adaptations erode safety over time without people noticing.
@prologic@twtxt.net I donβt understand the diagram, nor have any idea of whatβs about. ππ»
Oddly, in defense of Google keeping Chrome
As much as Iβm a fan of breaking up Google, Iβm not entirely sure carving Chrome out of Google without a further plan for what happens to the browser is a great idea. I mean, Google is bad, but but things could be so, so much worse. OpenAI would be interested in buying Googleβs Chrome if antitrust enforcers are successful in forcing the Alphabet unit to sell the popular web browser as part of a bid to restore competition in search, an OpenAI execu β¦ β Read more
trying to not feel stressed today, so I digitally colored a smol frog that says fuck terfs! >m< i have no idea if I did that right bc itβs my first time using yarn to post an image so rip to me if I messed that up :βD
@andros@twtxt.andros.dev Haha π€£ Weβve explored this idea in the past and we decided that itβs actually a good idea to have an βappend-onlyβ feed for various reasons. Weβve also explored the idea of using Range
requests, but opted instead to just archive/rotate our feeds periodically π
There really isnβt much point in having a feed in reverse chronological order, except (maybe?) so a human read view the new twts at the top of the file?! π€£