@abucci@anthony.buc.ci coined the term âfailsceneâ:
https://buc.ci/abucci/p/1771250567.039684
I wonder about using âfailsceneâ to describe the current slate of AI tools and demos. In contrast with the demoscene, which is about getting very low powered computers to do cool things you wouldnât expect them to be able to do, the failscene is about getting very high powered computers to fail at doing boring things we already know how to do without them. Plus you can stylize it fAIlscene if youâre inclined to.
I love it.
There was an endless coming and going of sun, clouds and rain. Not to forget about the wind. I called it quits a bit earlier and went into the woods.
Towards the end I was completeley surrounded by rain curtains in all directions. This looked super cool. I thought I might make it home just in time without having to use my umbrella, but the rain clouds were way quicker than I anticipated. Just after the rain hit me, I met an acquaintance who just started his walk. The wind picked up hard and rain hammered down, mixed with snow. Holding the umbrella was a workout. Shortly after I returned, the rain stopped again.
I didnât notice the kestrel sitting on the tree when I took the last photo. That was a nice surprise when I sorted through the nearly 300 pics.
As @pluralistic@pluralistic wrote: âAI is asbestos in the walls of our tech society, stuffed there by monopolists run amok. A serious fight against it must strike at its rootsâ https://www.theguardian.com/us-news/ng-interactive/2026/jan/18/tech-ai-bubble-burst-reverse-centaur
@movq@www.uninformativ.de There are always some folks who would appreciate that. But I fear they are the minority. The rest just doesnât give a shit.
The selfcontradiction is that those who proudly use and promote AI also claim to be sustainable and green and so on. Iâve no clue how this is not considered fraud, but there we are.
@kiwu@twtxt.net Since Iâm not living in the US, I havenât seen it. Iâve only witnessed all the âoutrageâ about it through shows like Jon Stewartâs Daily Show. đ€Ł
@lyse@lyse.isobeef.org They certainly donât. đ«€
Had an idea earlier: How about going all in on sustainability and saving money/energy, so how about telling your customers âAI is a bad idea $because_long_list_of_reasons, here are our alternatives, youâll thank us in 5 yearsâ? (I bet the customers wouldnât listen either ⊠đ)
Fancy a 15% discount on my #Domestika #Python + #CreativeCoding course?
A_B_A_VILLARES-2026
Valid up to March 13th
(Beware Domestika also uses dark patterns like a very low priced offering that will trigger a âyearly subscriptionâ after a month if you donât read the small print and cancel⊠not nice)
Cheers to all #Python #CreativeCoding people here using #LinuxâŠ
Would you like to test a script by our friend and co-maintainer of thonny-py5mode GoToLoop that installs #ThonnyIDE and #py5 on your machine to see how it goes and help improve it?
I wonder if it would be bad form to ask students to run something like this:
curl -fsSL https://Gist.GitHubUserContent.com/GoToLoop/246a31d437aaa8c6eadb7f7186544e0f/raw/thonny-installer.bash -o thonny-installer.bash && chmod +x thonny-installer.bash && ./thonny-installer.bash
(because, you know, it trains them to run potentially dangerous stuff in other occasions)
Okay, so the funniest thing that has happened at work in the realm of AI so far is this:
So this guy (that holds a certain position of power) wants people to use more AI, meaning people are expected to install a set of AI tools on their laptops. But, of course, he doesnât want to write proper documentation for this, because that would be silly monkey work, right? So he conjures up some AI prompts that are intended to make the AI agent install all this stuff by itself.
Do you see where this is going? Can you see the punchline?
Thatâs right! Since none of this AI stuff is deterministic, every setup is different. đ€Šââïž Like, 10, 20 systems, all set up a little different and people wonder why this or that doesnât work as expected.
Okay, itâs not funny.
Fuck me dead! I accidentally confused an HTML file for a YAML file and manually opened it in my browser. Unfortunately, I clicked on the OK button of the popped up dialog a bit too fast, it just caught me off guard. It asked which program to open the YAML file in. Of course Firefox thought that it could handle that and suggested itself by default. Conveniently, the âdonât prompt me again and always use this selection from now onâ checkbox was enabled.
And then the endless loop of death started. Turns out, this fucking browser canât do shit with YAML files and delegated to what had been just configured. Oh, would you look at that!? Firefox! Empty tabs after empty tabs appeared. Killing and restarting Firefox just loaded the last session with all the tabs and the loop continued.
Some bloody snakeoil on my work machine slows down link openening requests by two, three seconds. Itâs always absolutely anoying, but luckily, it actually limited the rate of new tabs popping up. I still could not close the many tabs fast enough that had accumulated before I noticed what was going on in the background.
Going to the settings to change them was always interrupted with a new tab opening in the foreground.
Finally, killing Firefox and renaming the file on disk before restarting Firefox did the trick and broke the loop. I was still holding down Ctrl+W for a minute or so to get rid of the useless tabs. I didnât want to loose the important tabs, so just ditching the session wasnât an option.
salty-chat TUI client as well, which now includes proper notifications and a background agent that keeps running so you never miss any messages. It all "just works"âą and I'm quite happy with the outcome! đ€© #saltyim #revamp
@bender@twtxt.net Whwn do i see you start to use Salty IM more? đ
I canât remember if the hex viewer back then had these options. Donât even recall what software that was. :-)
The one that I used during my Windows 95 days was âHex Workshopâ. It had similar features, just not as promimently displayed. It shows them down there in the statusline as âValueâ:
https://movq.de/v/a24558f83f/s.png
Newer versions can probably do more, havenât checked. đ (Assuming this program still exists.)
Apart from selecting text to copy into the clipboard. But that probably has the potential for trouble and interference with button clicks, etc.
Yeah, thatâs a big problem: Once you activate mouse mode in the terminal, the terminal loses the ability to select text. đ Youâd either have to emulate that in the program itself (like Vim does) or give the user an easy way to turn mouse support on/off during runtime.
How did the startup times develop?
Theyâre pretty stable at around 230 ms on my old NUC. Itâs just fast enough so that it doesnât annoy me.
@movq@www.uninformativ.de Nice, itâs coming together! Despite it being ages ago that I used a hex editor or viewer, these different representations of information appear very handy to me. If I had to mess around on binary formats, Iâd definitely appreciate them. I canât remember if the hex viewer back then had these options. Donât even recall what software that was. :-)
I, too, only very, very rarely use the mouse in the terminal. Apart from selecting text to copy into the clipboard. But that probably has the potential for trouble and interference with button clicks, etc. If one isnât careful.
How did the startup times develop?
Hmmm, thatâs a pity. I never realized that before. The following Go code
var b bool
âŠ
b |= otherBool
results in a compilation error:
invalid operation: operator | not defined on b (variable of type bool)
I cannot use || for assignments as in ||= according to https://go.dev/ref/spec#Assignment_statements. Instead, I have to write b = b || otherBool like a barbarian. Oh well, probably doesnât happen all that often, given that I only now run into this after all those many years.
Iâm inclined to remove all mouse support, except for moving windows. đ€ I originally wanted this to emulate the behavior of DOS programs, but a) mouse support is a lot of code, b) using the mouse is cumbersome anyway and I would rarely do it.
@shinyoukai@yume.laidback.moe I donât have a use for it, just curious, why did you fork it?
Also transfering interesting radio recordings I found on the used MiniDiscs to FLAC.
TIL that #Processing 4 on Windows now has an installer!
I is not just a zipped folder anymore, I wonder if it will make it harder for people to use it on restricted school labsâŠ
TIL that #Processing4 on Windows now has an installer!
https://processing.org/download
I is not just a zipped folder anymore, I wonder if it will make it harder for people to use it on restricted school labsâŠ
TIL that #Processing4 on Windows now has an installer!
https://processing.org/download
It is not just a zipped folder anymore, I wonder if it will make it harder for people to use it on restricted school labsâŠ
@klaxzy@klaxzy.net Nope, not IONOS, but we use them a lot at work. To be honest, I consider them one of the better providers (at least regarding the IaaS stuff that we do). đ
Every single year I complain we should have an independent survey of Python users, not of âPython developersâ, as many people who use Python do not identify as professional software developers (https://ciberlandia.pt/@villares/109885982178235703) and the questions in the survey make no sense for them. We should have someone doing serious research designing an unbiased survey, not a software firm like Jetbrains doing market research.
Every year I fail to do something effective about this.
[Reposted publicly with some tweaks]
What a beautiful, beautiful 0°C Sunday arvo and evening! The weather forecast delayed the snow by the minute. An hour or so after it finally started very, very lightly, I headed off for the woods to check out the lake again. Unfortunately, with the fresh snow layer, the crazy wild surface texture of the ice sheet wasnât visible anymore. But it brought some other nice views and photo opportunities.
I initially thought that I just go for a quick turn. However, with the snowfall a wee bit increasing I was hooked and kept going. Visibility was poor, but the snow blankets just looked too stunning. The road surfaces were quite slippery, so I often just walked alongside the pathways. On downhill slopes I had some good fun sliding down the road on my feet. With varying success. Luckily, I managed not to fall.
On the summit of the mountain the twigs had those absolutely magnificently looking windblown crystal coverings. Awwwwwww! They never get old. It was already getting dark, so the camera was tired and wanted to sleep. The snow program then made use of the flash and Iâm quite pleased with how these shots turned out.
Two deer crossed the road in front of me and ran into the woods, that was sight for sore eyes. Although I felt bad that they had to flee from me in this white terrain. By the time I got home, the snow had accumulated around eight centimeters in height, even in town down in the valley. Walking on this fresh snow is just amazing. And I love the sound it makes. Today, the snow consistency must have been just right, because the crushing sound was really loud.
I cannot recall that I had frozen hair and beard before, but today, there was a thick ice buildup. In case I had, it was definitely never this much. Felt really cool.
Enough of this preliminary skirmishing, there ya go: https://lyse.isobeef.org/waldspaziergang-2026-01-25/
Has a bit of a long history story behind this, where last year at work we were reading this book called Engineering a Safer World and initially came across a service called Speech Reply that allowed me to upload a PDF copy of the book and start to read it, but unfortunately, the free trial right now before I can finish reading it turns out that Speech Reply service cost a whopping US$30 a month and expected me to pay a full year upfront, which was well over US$300 just for one fucking book! So I sent their sales and support staff a message kindly asking if it were possible to just pay for the audio transcription of just a single book or to change to a monthly subscription fee, to which they refused, so basically in the end I got very angry and told them to go fuck themselves and built my own service. A year later here we are :-)
Another project where Iâm going to use my terminal widget toolkit is a hex editor. This is still very young, obviously, and thereâs a lot of work to do (both in the toolkit and this particular application), but Iâm making some progress:
https://movq.de/v/2bae14ed16/vid-1769283187.mp4
Since this program is UTF-8 clean (I hope), you can do things like enter multi-byte UTF-8 sequences or paste them from the system clipboard (another hex editor I just tried failed to do this correctly):
https://movq.de/v/e9241034c1/vid-1769283755.mp4
Under the hood, Iâm using mmap() with MAP_PRIVATE, which is really cool: I get the entire file as a byte array, no matter how large it is, no need to actually read it upfront; and MAP_PRIVATE means that I can write to this area however I like without changing the underlying file. The kernel does copy-on-write for me. Only when you hit Save, it will write to the filesystem. And itâs just a couple lines of code. The kernel does all the magic. đ„ł
Spent basically the entire day (except for the mandatory walk) fighting with Pythonâs type hints. But, the result is that my widget toolkit now passes mypy --strict.
I really, really donât want to write larger pieces of software without static typing anymore. With dynamic typing, you must test every code path in your program to catch even the most basic errors. pylint helps a bit (doesnât need type hints), but thatâs really not enough.
Also, somewhere along the way, I picked up a very bad (Python) programming style. (Actually, I know exactly where I picked that up, but I donât want to point the finger now.) This style makes heavy use of dicts and tuples instead of proper classes. That works for small scripts, but it very quickly turns into an absolute mess once the program grows. Prime example: jenny. đ©
I have a love-hate relationship with Pythonâs type hints, because they are meaningless at runtime, so they can be utterly misleading. Iâm beginning to like them as an additional safety-net, though.
(But really, if correctness is the goal, you either need to invest a ton of time to get 100% test coverage â or donât use Python.)
My mate and I went on a hike earlier. Yesterday, we had lovely 12°C. But today, it was down to at most 4°C. Oh well. At least the sun was out and and there was just a tiny bit of wind. We knew upfont that scarf, beanie and gloves were mandatory. Especially at the more windy sections like up top the hills. The view was absolutely terrible, but we made the best of it.
With the sun shining on us during our lunch break at a forest edge bench, we still enjoyed the lookout in 01. I brought some old carpet scraps to sit on and was happily surprised that they isolated even better than I had hoped for. Some hot tea helped us staying warm.
After five hours we returned just after sunset. Iâm quite tired now, completely out of shape.
I love using #ThonnyIDE, and, on Linux, I can use !pip install, !jupyter lab, and !py5-live-coding mysketch.py on the interactive shell console, I wish this would work on Windows too :(
@bender@twtxt.net Iâm already using it for tracktivity (meant for tracking activities and events, like weather, food consumption, stuff like that), which is basically a somewhat-fancy CSV editor:
https://movq.de/v/f26eb836ee/s.png
I have a couple of other projects where I could use it, because they are plain curses at the moment. Like, one of them has an âedit boxâ, but you canât enter Unicode, because it was too complicated. That would benefit from the framework.
Either way, itâs the most satisfying project in a long time and Iâm learning a ton of stuff.
Iâm trying to implement configurable key bindings in tt. Boy, is parsing the key names into tcell.EventKeys a horrible thing. This type consists of three information:
- maybe a predefined compound key sequence, like Ctrl+A
- maybe some modifiers, such as Shift, Ctrl, etc.
- maybe a rune if neither modifiers are present nor a predefined compound key exists
Itâs hardcoded usage results in code like this:
func (t *TreeView[T]) InputHandler() func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
return t.WrapInputHandler(func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {
switch event.Key() {
case tcell.KeyUp:
t.moveUp()
case tcell.KeyDown:
t.moveDown()
case tcell.KeyHome:
t.moveTop()
case tcell.KeyEnd:
t.moveBottom()
case tcell.KeyCtrlE:
t.moveScrollOffsetDown()
case tcell.KeyCtrlY:
t.moveScrollOffsetUp()
case tcell.KeyTab, tcell.KeyBacktab:
if t.finished != nil {
t.finished(event.Key())
}
case tcell.KeyRune:
if event.Modifiers() == tcell.ModNone {
switch event.Rune() {
case 'k':
t.moveUp()
case 'j':
t.moveDown()
case 'g':
t.moveTop()
case 'G':
t.moveBottom()
}
}
}
})
}
This data structure is just awful to handle and especially initialize in my opinion. Some compound tcell.Keys are mapped to human-readable names in tcell.KeyNames. However, these names always use - to join modifiers, e.g. resulting in Ctrl-A, whereas tcell.EventKey.Name() produces +-delimited strings, e.g. Ctrl+A. Gnaarf, why this asymmetry!? O_o
I just checked k9s and theyâre extending tcell.KeyNames with their own tcell.Key definitions like crazy: https://github.com/derailed/k9s/blob/master/internal/ui/key.go Then, they convert an original tcell.EventKey to tcell.Key: https://github.com/derailed/k9s/blob/b53f3091ca2d9ab963913b0d5e59376aea3f3e51/internal/ui/app.go#L287 This must be used when actually handling keyboard input: https://github.com/derailed/k9s/blob/e55083ba271eed6fc4014674890f70c5ed6c70e0/internal/ui/tree.go#L101
This seems to be much nicer to use. However, I fear this will break eventually. And itâs more fragile in general, because itâs rather easy to forget the conversion or one can get confused whether a certain key at hand is now an original tcell.Key coming from the library or an âextendedâ one.
I will see if I can find some other programs that provide configurable tcell key bindings.
@movq@www.uninformativ.de Sorry, I meant the builtin module:
$ python3 -m pep8 file.py
/usr/lib/python3/dist-packages/pep8.py:2123: UserWarning:
pep8 has been renamed to pycodestyle (GitHub issue #466)
Use of the pep8 tool will be removed in a future release.
Please install and use `pycodestyle` instead.
$ pip install pycodestyle
$ pycodestyle ...
I canât seem to remember the name pycodestyle for the life of me. Maybe thatâs why I almost never use it.
Since I used so much Rust during the holidays, I got totally used to rustfmt. I now use similar tools for Python (black and isort).
What have I been doing all these years?! I never want to format code manually again. đ€Łđ
@lyse@lyse.isobeef.org Itâs not super comfortable, thatâs right.
But these mouse events come with a caveat anyway:
ncurses uses the XM terminfo entry to enable mouse events, but it looks like this entry does not enable motion events for most terminal emulators. Reporting motion events is supported by, say, XTerm, xiate, st, or urxvt, it just isnât activated by XM. This makes all this dragging stuff useless.
For the moment, I edited the terminfo entry for my terminal to include motion events. That canât be a proper solution. Iâm not sure yet if Iâm supposed to send the appropriate sequence manually âŠ
And the terminfo entries for tmux or screen donât include XM at all. tmux itself supports the mouse, but Iâm not sure yet how to make it pass on the events to the programs running inside of it (maybe thatâs just not supported).
To make things worse, on the Linux VT (outside of X11 or Wayland), the whole thing works differently: You have to use good old gpm to get mouse events (gpm has been around forever, I already used this on SuSE Linux). ncurses does support this, but this is a build flag and Arch Linux doesnât set this flag. So, at the moment, Iâm running a custom build of ncurses as a quick hack. đ And this doesnât report motion events either! Just clicks. (I donât know if gpm itself can report motion events, I never used the library directly.)
tl;dr: The whole thing will probably be âkeyboard firstâ and then the mouse stuff is a gimmick on top. As much as Iâd like to, this isnât going to be like TUI applications on DOS. Iâll use âWindowsâ for popups or a multi-window view (with the âWindowManagerâ being a tiny little tiling WM).
Hey folks! We have recently had a wonderful new release of #py5, read about the new 3D trimesh integration feature and the matplotlib TextPath integration.
That release was quickly followed by a release to fix some small issues that surfaced this last week. Please check out py5 0.10.9a1 and join us at https://github.com/py5coding/py5generator/discussions to share your experiences!
#CreativeCoding #Processing #Python #genuary (sorry for the hashtag spamming, I couldnât resist!)
httpd now sends the Last-Modified with UTC instead of GMT. Current example:
@shinyoukai@neko.laidback.moe Not using OpenBSD or httpd? Yeah. Itâs been working quite well since ~2017, so, meh, too lazy to switch now. But nothing is set in stone, of course.
And now the event loop is not a simple loop around cursesâ getch() anymore but it can wait for events on any file descriptor. Hereâs a simple test program that waits for connections on a TCP socket, accepts it, reads a line, sends back a line:
https://movq.de/v/93fa46a030/vid-1767547942.mp4
And the scrollbar indicators are working now.
Iâll probably implement timer callbacks using timerfd (even though thatâs Linux-only). đ€
More widget system progress:
https://movq.de/v/87e2bce376/vid-1767467193.mp4
I like the oldschool shadow effect. đ Not sure if Iâll keep it, but itâs neat.
The menu bar is still fake.
Had to spend quite a bit of time optimizing the rendering today. This can get really slow really quickly.
Unicode is Pain.
I might be able to start porting my first program (currently uses urwid) soon. đ€
@movq@www.uninformativ.de I noticed that your feedâs last modification timestamp was missing in my database. I cannot tell for certain, but I think it did work before. Turns out, your httpd now sends the Last-Modified with UTC instead of GMT. Current example:
Sat, 03 Jan 2026 06:50:20 UTC
Iâm not a fan of this timestamp format at all, but according to the HTTP specification, HTTP-date must always use GMT for a timezone, nothing else: https://httpwg.org/specs/rfc9110.html#http.date
@eldersnake@we.loveprivacy.club
Steps to world domination:
- âInventâ âAIâ (by using other peopleâs data).
- Get people hyped about it and ideally hooked on it.
- Only provide it as a cloud service. But hey, if you want to, you can run it locally!
- Buy all hardware available on the market, so that nobody but you can build more systems.
- All PCs of consumers and competitors are too weak now and canât be upgraded anymore.
- Everybody depends on your cloud service! Win!
All of that is possible because corporations donât have a âconscienceâ in capitalism. Nobody forces the RAM manufacturers to sell all their stuff to just one or two buyers, but since the only goal of that manufacturer is to make money, they do it.
@shinyoukai@neko.laidback.moe I canât believe Trace and Edgewall Software is still around and in use đ€Ł
On my way to having windows and mouse support:
https://movq.de/v/95bbbbd3e8/basic-windows.mp4
It would be cool to have something like Turbo Vision eventually.
(I considered just using Turbo Vision, but itâs a C++ library and thatâs not quite what Iâm looking for. But itâs not yet completely off the table.)
I keep thinking about this piece on students that have not learned yet about folder/directory structuresâŠ
I have met many students like that, I wonder if I could help them get it better, or if I shouldnât worry about it at all (theyâll mostly get used to it without much help).
@movq@www.uninformativ.de Well, just a very limited subset thereof:
- inline and multiline code blocks using single/double/triple backticks (but no code blocks with just indentation)
- markdown links using using
[text](url)
- markdown media links using

And thatâs it. No bold, italics, lists, quotes, headlines, etc.
Just like mentions, plain URLs, markdown links and markdown media URLs are highlighted and available in the URLs View. Theyâre also colored differently, similarly to code segments.
I definitely should write some documentation and provide screenshots.
Hurray, I finally fixed another rendering bug in tt that was bugging me for a long time. Previously, when there were empty lines in a markdown multiline code block, the background color of the code block had not been used for the empty lines. So, this then looked as if there were actually several code blocks instead of a single one.
https://lyse.isobeef.org/tmp/tt-bugfix-empty-lines-in-multiline-code-blocks.png
mu (”) now has builtin code formatting and linting tools, making ” far more useful and useable as a general purpose programming language. Mu now includes:
- An interpreter for quick âscriptinogâ
- A native code compiler for building native executables (Darwin / macOS only for now)
- A builtin set of developer tools, currently: fmt (-fmt), check (-check) and test (-test).
@shinyoukai@neko.laidback.moe Because you might not want to commit all changed files in a single commit. I very often make use of this and create several commits. In fact, I like to git add --patch to interactively select which parts of a file go in the next commit. This happens most likely when refactoring during a feature implementation or bug fix. I couldnât live without that anymore. :-)
If you have a much more organized way of working where this does not come up, you can just git commit --all to include all changed files in the next commit without git adding them first. But new files still have to be git added manually once.
$HOME is not specified it tries to resolve the user's home directory by user.Current().HomeDir. Maybe that's overkill, I have to check the XDG spec.
Ok, the standard library implementation is wonky at best, at least in regards to XDG, because it really doesnât implement it properly. https://github.com/golang/go/issues/62382 I stick to my own code then. It doesnât properly support anything else than Linux or Unixes that use XDG, but personally, I donât care about them anyway. And the cross-platform situation is a giant mess. Unsurprisingly.
@movq@www.uninformativ.de Thanks! Iâll have a look at SnipMate. Currently, Iâm (mis)using the abbreviation mechanism to expand a code snippet inplace, e.g.
autocmd FileType go inoreab <buffer> testfunc func Test(t *testing.T) {<CR>}<ESC>k0wwi
or this monstrosity:
autocmd FileType go inoreab <buffer> tabletest for _, tt := range []struct {<CR> name string<CR><CR><BS>}{<CR> {<CR> name: "",<CR><BS>},<CR><BS>} {<CR> t.Run(tt.name, func(t *testing.T) {<CR><CR>})<CR><BS>}<ESC>9ki<TAB>
But this of course has the disadvantage that I still have to remove the last space or tab to trigger the expansion by hand again. Itâs a bit annoying, but better than typing it out by hand.
@lyse@lyse.isobeef.org Well, I used SnipMate years ago (until 2012). IIRC, itâs more than just âinsert a bit of text hereâ, it can also jump to the correct next location(s) and stuff like that. Donât remember why I stopped using it.
Then I used nothing for a long time. Just before Christmas, I made my own plugin (⊠of course âŠ), which does everything I need at the moment (and nothing more).
It can insert simple templates and then jump to the next location:
https://movq.de/v/67cdf7c827/sisni%2Dpython.mp4
And replace a string after insertion:
https://movq.de/v/67cdf7c827/sisni%2Dheader.mp4
(Itâs not public (yet?) and it also uses vim9script, so I guess it wouldnât work on your system.)
Question to my fellow Vimers: Which snippet insertion mechanism are you using or can you (not) recommend?
tt URLs View now automatically selects the first URL that I probably are going to open. In decreasing order, the URL types are:
@lyse@lyse.isobeef.org That sounds useful. đ€
@lyse@lyse.isobeef.org I can tell you this right now, writing assembly / machine code is fucking hard workâą đ Iâm sure @movq@www.uninformativ.de can affirm đ€Ł And when it all goes to shitâą (which it does often), man is debugging fucking hard as hell! Without debug symbols I canât use the regular tools like lldb or gdb đ
println(1, 2) was bring printed as 1 2 in the bytecode VM and 1 nil when natively compiled to machine code on macOS. In the end it turned out the machine code being generated / emitted meant that the list pointers for the rest... of the variadic arguments was being slot into a register that was being clobbered by the mu_retain and mu_release calls and effectively getting freed up on first use by the RC (reference counting) garbage collector đ€Šââïž
@prologic@twtxt.net Tada, congratulations! I find that rather interesting, thanks for telling us. :-)
Whoo! I fixed one of the hardest bugs in mu (”) I think Iâve had to figure out. Took me several days in fact to figure it out. The basic problem was, println(1, 2) was bring printed as 1 2 in the bytecode VM and 1 nil when natively compiled to machine code on macOS. In the end it turned out the machine code being generated / emitted meant that the list pointers for the rest... of the variadic arguments was being slot into a register that was being clobbered by the mu_retain and mu_release calls and effectively getting freed up on first use by the RC (reference counting) garbage collector đ€Šââïž
@zvava@twtxt.net By hashing definition, if you edit your message, it simply becomes a new message. Itâs just not the same message anymore. At least from a technical point of view. As a human, personally I disagree, but thatâs what Iâm stuck with. Thereâs no reliable way to detect and âcorrectâ for that.
Storing the hash in your database doesnât prevent you from switching to another hashing implementation later on. As of now, message creation timestamps earlier than some magical point in time use twt hash v1, messages on or after that magical timestamp use twt hash v2. So, a message either has a v1 or a v2 hash, but not both. At least one of them is never meaningful.
Once you âupgradeâ your database schema, you can check for stored messages from the future which should have been hashed using v2, but were actually v1-hashed and simply fix them.
If there will ever be another addressing scheme, you could reuse the existing hash column if it supersedes the v1/v2 hashes. Otherwise, a new column might be useful, or perhaps no column at all (looking at location-based addressing or how it was called). The old v1/v2 hashes are still needed for all past conversation trees.
In my opinion, always recalculating the hashes is a big waste of time and energy. But if it serves you well, then go for it.
The compiler technique Iâm using here is to not âemitâ most of the runtime if itâs actually never used in your program, and also dropping dead code in the SSA pass.
My little toy operating system from last year runs in 16-bit Real Mode (like DOS). Since Iâve recently figured out how to switch to 64-bit Long Mode right after BIOS boot, I now have a little program that performs this switch on my toy OS. It will load and run any x86-64 program, assuming itâs freestanding, a flat binary, and small enough (< 128 KiB code, only uses the first 2 MiB of memory).
Here Iâm running a little C program (compiled using normal GCC, no Watcom trickery):
https://movq.de/v/b27ced6dcb/los86%2D64.mp4
https://movq.de/v/b27ced6dcb/c.png
Next steps could include:
- Use Rust instead of C for that 64-bit program?
- Provide interrupt service routines. (At the moment, it just keeps interrupts disabled.)
@thecanine@twtxt.net Is it because youâve used white pixels around it to sort of give it aht 3D look? đ Hmm? đ€
2025 end the year rewind:
Compared to only 3 new artworks in 2024 and next to no work, on other projects, this year I not only met the self-imposed goal of monthly pixelart, but exceeded it by 50%, with 18 additions in total.
Relicensed the majority of canine faction owned art and projects, under two less restrictive Creative Commons licensees*. This also applies retroactively, to everyone who used/archived our art and projects, back when the old license didnât allow it.
Disappointed by the current state of the Internet and continued lack of competition among browsers, completely reworked the main website* and made Smol Drive** (a new image gallery project), both made to be compatible with as many web and Gemini browsers, as possible.
*see https://thecanine.smol.pub
**see https://thecanine.smol.pub/smolbox
@movq@www.uninformativ.de Very nice! I often wish other languages had something similar. Sometimes, I use lambdas, but that also looks ugly and feels a bit like a misuse. Other times, just the normal blocks are enough, but itâs not the same. Especially with the mutability aspects as the article explains. Typically, I just put it in a function or ignore it if itâs just a few lines.
This feels useful: Rustâs Block Pattern
@lyse@lyse.isobeef.org I was surprised by that as well. đ I thought these were features that you can use, but no, you must do all this.
By the way, I now fixed the issue that I mentioned at the end and it works on the netbook now. đ„ł
https://www.uninformativ.de/blog/postings/2025-12-21/0/netbook.jpg
@kiwu@twtxt.net Assembly is usually the most low-level programming language that you can get. Typical programming languages like Python or Go are a thick layer of abstraction over what the CPU actually does, but with Assembler you get to see it all and you get full control. (With lots of caveats and footnotes. đ )
Iâm interested in the boot process, i.e. what exactly happens when you turn on your computer. In that area, using Assembler is a must, because you really need that fine-grained control here.
@lyse@lyse.isobeef.org Yeah, well, given that I didnât need this for such a long time, itâs probably not an essential tool. đ
Iâve often wanted to have an outline of text documents, though, and tagbar/ctags can do that as well:
https://movq.de/v/3c6d1a13d6/tagbar-md.png
https://movq.de/v/abc58e6d66/tagbar-latex.png
This isnât as powerful as the âNavigatorâ tool in StarOffice/LibreOffice (which can be used to rearrange the document), but still pretty useful:
https://www.uninformativ.de/blog/postings/2024-05-23/0/so31.mp4
@movq@www.uninformativ.de Interesting. I never found a big use for these kind of lists in general. But I might give it a shot again.
If your very popular project with lots of stars on GitHub is over 10 years old, and youâre still at a pre-1.0 version because youâre using SemVer and a 1.0 would mean making some kind of commitment and thatâs somehow not desirable for you, then I think youâre doing something wrong. đ€
#Processing & #py5 tip:
Remember the shapes you put on draw() will be redrawn over and over, and if they donât move (leaving a trail) you might want to either clean each frame with background(...), or stop the draw loop (noLoop() in Processing or no_loop() in py5), otherwise you kill the anti-aliasing of the lines/strokes/edges!
Iâm posting this tip because even using these tools for years and knowing this, today I briefly thought something was odd/broken because my lines were ugly with no âsmoothingâ :D
â`python
import py5
def setup():
py5.size(200, 200)
py5.stroke_weight(2)
# a line that will drawn once only
py5.line(10, 10, 190, 90)
def draw():
# you could clean the frame here with background(200)
# this other line will be redrawn many times
py5.line(10, 110, 190, 190)
def key_pressed():
py5.save('out.png')
py5.run_sketch()
â`
Using #Pythonâs #pathlib to compare two repos and get back some missing files from a ârecoveredâ version of a repo (mostly stuff in .gitignore that is handy not to discard right now).
from pathlib import Path
a = Path('sketch-a-day')
b = Path('sketch-a-day_broken')
files_a = {p.relative_to(a) for p in a.rglob('*')
if '.git' not in str(p)
if 'cache' not in str(p)
if 'checkpoint' not in str(p)
}
files_b = {p.relative_to(b) for p in b.rglob('*')
if '.git' not in str(p)
if 'cache' not in str(p)
if 'checkpoint' not in str(p)
}
missing = files_b - files_a
for p in missing:
(b / p).rename((a / p))
@shinyoukai@neko.laidback.moe it was a mess, we are better without it. Until a new mobile client comes (not holding my breath), Yarn is very usable on the mobile, just using the browser.
Webp, though it has been around for a long while, wasnât fully supported on all browsers until recently. The other formats has been in use for such a long time, proving to work just fine, that the advantages Webp provides havenât been seemingly enough to merit a switch.
Google is also the one behind Webp, and, well, people donât trust, nor like, them much.
Webp, though it has been around for a long while, wasnât fully supported on all browsers until recently. The other formats have been in use for such a long time, proving to work just fine, that the advantages Webp provides havenât been seemingly enough to merit a switch.
Google is also the one behind Webp, and, well, people donât trust, nor like, them much.
@zvava@twtxt.net I figure I will know when it is ready, the day I see you using it. Canât wait! :-)
@movq@www.uninformativ.de lovely, thanks for sharing! Now you know what I will be using today on a loop.
Conheço alguĂ©m que use os serviços da Infomaniak? Que tal a experiĂȘncia?
Use more WebP, I guess.
- Lossless PNG, 635 kB: https://movq.de/v/b239c54838/scrot.png
- Lossless WebP, 469 kB: https://movq.de/v/b239c54838/scrot.webp
- Lossy WebP, 110 kB: https://movq.de/v/b239c54838/scrot%2Dlossy.webp
- Lossy JPEG, 110 kB: https://movq.de/v/b239c54838/scrot%2Dlossy.jpg
@prologic@twtxt.net Here you go:
(LTT = âLinus Tech Tipsâ, thatâs the host.)
LTT: There was a recent thing from a major tech company, where developers were asked to say how many lines of code they wrote â and if it wasnât enough, they were terminated. And there was someone here that was extremely upset about that approach to measuring productivity, becauseâ
Torvalds: Oh yeah, no, you shouldnât even be upset. At that point, thatâs just incompetence. Anybody who thinks thatâs a valid metric is too stupid to work at a tech company.
LTT: You do know who you just said that about, right?
Torvalds: No.
LTT: Oh. Uh, he was a prominent figure in the, uh, improved efficiency of the US government recently.
Torvalds: Oh. Apparently I was spot on.
But it is weird that none of the slot plates (that I can find) appear to have the correct pin order. đ€
The two mainboards I have here use this order:
2468x
13579
But the slot plates use this:
12345
6789x
I tripped over this at first and wondered why it didnât work.
Has this changed recently or what? đ„Ž
@prologic@twtxt.net Ah, shit, you might be right. You can even buy these slot plates on Amazon. I didnât even think to check Amazon, I went straight to eBay and tried to find it there, because I thought âitâs so old, nobody is going to use that anymore, I need to buy second-handâ. đ€Šđ€Šđ€Š
It really shows that I built my last PC so long ago ⊠I know next to nothing about current hardware. đą
@prologic@twtxt.net Bwahahaha! I tried to establish some form of âconventionâ for commit messages at work (not exactly what you linked to, though), but itâs a lost cause. đ Nobody is following any of that. Nobody wants to invest time in good commit messages. People just want to get stuff done.
Iâm just glad that 80% are at least somewhat useful â instead of âwipâ or âshit i screwed upâ.
@lyse@lyse.isobeef.org I couldnât agree more! I think good commit messages are very useful, however, and Iâd much prefer the conventional mood style for Commit messages, but rather prefer telling a story rather than this weird syntax all over the shop!
@shinyoukai@neko.laidback.moe Are you using your Gitea username instead of got@ ? Are you forwarding auth?
@prologic@twtxt.net he uses subdomains. Which do you think the identity be associated with? (hint, âit is not so hard!â).
@shinyoukai@neko.laidback.moe yeah, thatâs the only reason why I use sub-domains when trying anything federated (I believe Matrix has the same problem), in case things didnât go as planned I can just migrate and take it down.
@itsericwoodward@itsericwoodward.com Nice to see someone else also participating! đ„ł
(Btw, they donât want us to share our inputs: https://www.reddit.com/r/adventofcode/wiki/faqs/copyright/inputs/ Yeah, itâs a bit annoying. I also have to do quite a bit of filtering on my repo âŠ)
FWIW, day 03 and day 04 where solved on SuSE Linux 6.4:
https://movq.de/v/faaa3c9567/day03.jpg
https://movq.de/v/faaa3c9567/day04%2Dv3.jpg
Performance really is an issue. Anything is fast on a modern machine with modern Python. But that old stuff, oof, it takes a while ⊠đ
Should have used C or Java. đ€Ș Well, maybe I do have to fall back on that for later puzzles. Weâll see.
@bender@twtxt.net Nothing will make me use Discord, though. đ Not voluntarily.
@prologic@twtxt.net I couldnât find the exact blog post from before, one that used redirection directives in its nginx config. but I found [this one ](https://melkat.blog/p/unsafe-pricing#:~:text=Something%20else%20Iâve%20been%20doing%20this%20year,%20fine.) mentioning a similar process but done differently.
@lyse@lyse.isobeef.org no wonder I picked that cake (albeit coincidentally), I adore almonds, and hazelnuts! Your teammates are absolutely amazing, dude! A very nice project farewell! On leaving places I have a small anecdote.
I know someone who on 3 February 2004 left his job to go elsewhere. At the time his teammates threw a party, and gave him a very nice portable storage. Twenty days later, he returned, and jokingly they asked him for the storage, and money spent on farewell party back. I heard, from a close source, that he gave them his middle finger, but donât quote me on that. đđđ
@prologic@twtxt.net
Interesting experiment for salty-chat, use the MQTT protocol instead of HTTP, in theory it shouldnât make a difference, at least
Before smartphones people used to use the Sony Camcorders, but even though they still exist today, theyâre uber expensive đ
@prologic@twtxt.net Using your own language?! Thatâs really nice! I hope you get home soon so you can give the code a try. đ
Thinking about doing Advent of Code in my own tiny language mu this year.
mu is:
- Dynamically typed
- Lexically scoped with closures
- Has a Go-like curly-brace syntax
- Built around lists, maps, and first-class functions
Key syntax:
- Functions use
fnand braces:
fn add(a, b) {
return a + b
}
- Variables use
:=for declaration and=for assignment:
x := 10
x = x + 1
- Control flow includes
if/elseandwhile:
if x > 5 {
println("big")
} else {
println("small")
}
while x < 10 {
x = x + 1
}
- Lists and maps:
nums := [1, 2, 3]
nums[1] = 42
ages := {"alice": 30, "bob": 25}
ages["bob"] = ages["bob"] + 1
Supported types:
int
bool
string
list
map
fn
nil
mu feels like a tiny little Go-ish, Python-ish language â curious to see how far I can get with it for Advent of Code this year. đ
âThe Internet Used To Be A Placeâ
@movq@www.uninformativ.de yeah, you fetched it too quickly, it was edited seconds after picking the wrong image. LOL. Which brings us back in a whole, huge circle, to twtxt edits, and how to handle them. đ
Advent of Code 2025 starts tomorrow. đ„łđ
This year, Iâm going to use Python 1 on SuSE Linux 6.4, writing the code on my trusty old Pentium 133 with its 64 MB of RAM. No idea if that old version of Python will be fast enough for later puzzles. Weâll see.
@lyse@lyse.isobeef.org Damn. That was stupid of me. I should have posted examples using 2026-03-01 as cutoff date. đ
In my actual test suite, everything uses 2027-01-01 and then I have this, hoping that thatâs good enough. đ„Ž
def test_rollover():
d = jenny.HASHV2_CUTOFF_DATE
assert len(jenny.make_twt_hash(URL, d - timedelta(days=7), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=3), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=2), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d - timedelta(seconds=1), TEXT)) == 7
assert len(jenny.make_twt_hash(URL, d, TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=1), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=2), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(seconds=3), TEXT)) == 12
assert len(jenny.make_twt_hash(URL, d + timedelta(days=7), TEXT)) == 12
(In other words, I donât care as long as itâs before 2027-01-01. đđ )
I have to say. A well designed Hypermedia Driven Web Application such as yarndâ using HTMX is just as good, i'd not better, than one written in React.
As someone that almost exclusively uses âDiscoverâ, that is. If you do use it like I do, you know I mean.