Itās the little things that make me happy these days. Like adding a function to search for text with various encodings to my hex editor. All neatly organized in the menu and with accelerators.

@movq@www.uninformativ.de Thatās a clever idea - I had never considered adding an empty commit before, but I can see the value.
Iām still on a deckbuilding kick, so I was thrilled that we managed to get 3 games of Magic in last night.
In game 1, my Marvel Villains deck couldnāt stand up to Doctor Whoās Missy and her army of Cybermen (and Daleks). Since someone else was playing a dark lord Sauron deck, I guess that means sheās even more āvillainousā that anything Marvel or Tolkien could offer.
For game 2, I ran my Guardians of the Multiverse deck (formerly known as The B-Vengers or Marvel Heroes 2: Electric Bugaloo). It was working well, and I had quite an army going, but I was still one turn from a win when an opponentās tribal elf deck went off, killing everyone with 19 19/19 forest-walking elves. ĀÆ_(ć)_/ĀÆ
Then in game 3, I ran my Avengers deck, and finally got the win thanks to a Heroesā Podium, a pair of Hawkeyes, and a flying, shield-wielding Captain America. Assemble, indeed.
Last night will likely be my final Marvel-only game night for a while. I still need to test the decks out some more, but theyāre basically complete (I donāt currently plan on adding any more cards to them). Plus, while Iām on this kick, Iād like to finally finish my Sauron deck, and Iāve got some cards on order for both a Dune-themed deck and a couple of decks inspired by the old-school Beatdown Box.
Although I was initially concerned that adding modern Marvel superheroes to the high-fantasy worlds of āMagic: the Gatheringāā would be too aesthetically dissonant, instead itās gotten me back into deck building in a big way.
Since the set was released last month, Iāve built: a 5-color Super Villains deck, two 5-color Superheroes decks, plus a 5-color tribal Mutant Ninja Turtles deck (built from the best cheap singles from the TMNT set from earlier this year, a set that was a bit more dissonant, but still weird enough to be fun).
And then thereās the proxiesā¦

Finally, I added some tests and fixed this. After updating the feed metadata, I now just return early and do not attempt to build an SQL multi-value INSERT statement. Easy-peasy.
@lyse@lyse.isobeef.org Bingo!
Oh, yeah, newsboat is good. For this particular use case, I explicitly needed a graphical feed reader, though. š I ended up using Thunderbird, which has its own interesting way of configuring/adding feeds:
https://movq.de/v/a3557e3dc9/vid-1784952576.mp4
Why are feeds categorized as āMailā? Whatās going on with that āAddā button on the left of the dialog? Why does the dialog indicate that thereās a folder called ālist-files Recent Commitsā which doesnāt really exist in the end? (Why does it take about 1-2 seconds to load 25 feed items?) And so on.
Dang it, @david@daiwei.me, you blew my cover!
I was raised without a TV, so I donāt miss it one bit. My parents just didnāt by a new one after their super old black and white device died. Looking after a baby was maybe spare time activity enough for them. :-P
When there was some super cool program I wanted to watch, like a James Bond movie, I visited my grandma. Sure, it sometimes was a pity that I could not join yesterdayās TV series discussions with my classmates, but oh well. I survived that. Building stuff with Lego or playing outside was all I really wanted.
Apart from a few really good programs, thereās sooooo much trash, non-stop ads and the like. Even as a kid, I was very disgusted by all that. But I have to admit that visting somebody with a TV and watching a good show was usually a highlight. These days, I can easily waste all my time and more on YouTube. :-/
@prologic@twtxt.net Our company is paying a shitload of money for all these (different) AI tools ⦠Iām probably not allowed to tell you the exact number, but it is a lot. The only other way would be to lay off employees, so we can pay even more for AI. (Needless to say, that would be the worst possible move.)
For a private person, $20 a month is also pretty expensive, isnāt it? And then assume that you maybe need more than one AI tool. Youāre quickly up to $50 a month or much more. This isnāt something that I, as a private person, will ever be willing to spend for this kind of stuff.
āAIā is just expensive as fuck. On every level. They will have to (ab)use every possible way to squeeze more money out of it, and that includes ads and what not.
Not sure what happened to my twtxt there. It seems that my sync script, which pulls from Codeberg and copies the twtxt to hashnix.club/~dce, had started copying an empty file. No idea why.
It should be fixed now, though, thanks to me adding [ -s /home/dce/twtxt.txt ] && before it copies it to ~/public_html.
Hmm ā¦
My project pages have this āDownloadsā section and I offer tarballs for each release:
https://movq.de/git/jenny/#downloads
I added this many years ago because an OpenBSD dev asked for it (but the project in question didnāt end up in their ports after all).
What are your thoughts on this? Is it necessary to offer tarballs?
I noticed that some distributions have already moved away from using tarballs and instead always clone from Git. š¤
Deleted some old no longer used pixelart from my galley and added this as an alternative version, of the sprite one.

tt has a "draft" mode right? You didn't publish, then edit over and over did you? š
@prologic@twtxt.net Not sure if this really counts as a draft mode or this is what you had in mind. I just was in the editor for ages and didnāt close it. tt provides an integrated preview for the rendered message in there. It automatically updates every second.
Hereās a screenshot of the compose view with the conversation context on the top to which to reply to, the editor in the middle and the almost-live preview at the bottom, I hope itās big enough: 
But itās not like I hit the āAdd messageā button in the compose view (the one currently selected on the screenshot), see the message in the conversation tree and then come back into the compose view to continue editing. Thereās no edit functionality in tt. Once the message is appended to my twtxt.txt file on disk, all I can do is edit it with vim. The U+2028 line breaks are really annoying to deal with (Iām sure I could do something about that if I spent the time), so I try to avoid that at all costs.
Once new messages have been added to my local file, I then manually upload the file to my server in a separate terminal. Thereās no upload command integrated into tt. Right from my very first message in the beginning, Iāve always done it exactly like that. Iām used to this and it really doesnāt bother me. But I can see that others might not be fans of that at all. I might add an upload mechanism to tt at some point in the future.
I really think I should go back to Java.
Writing programs in Python is so exhausting. I want a compiler and I want static typing. No, linters and type checkers and IDEs are not good enough. Compilers catch way more errors in advance.
Rust is also exhausting. Theyāre constantly adding language features and, at the same time, the runtime library remains tiny and you need 3rd party libraries for everything. Many of those are still at version 0.x (SemVer!) and you canāt rely on anything. Often times, you need the latest Rust nightly compiler.
Go is ⦠I donāt like it. And huge binaries.
I like C as a language, but itās too fragile. I want to have a proper HashMap every now and then.
None of the above have good GUI libraries, at least not on Linux.
And then thereās Java. This is my fractal renderer that I wrote over 17 years ago:
https://movq.de/v/fcd3c4e557/vid-1784121825.mp4
Itās fast. It has a GUI with custom widgets and those werenāt even hard to make. It still works without changing a single line of code. The source code files have timestamps from 2009 and I just noticed that the JAR file Iām using in the video was compiled in 2010.
Java as a language is relatively easy to learn and to master. There are few surprises. The source code organization with packages is good. Java API docs are clear and well written.
The JVM ramp-up times have improved considerably:
https://movq.de/v/e7314e521e/vid-1784121998.mp4
This isnāt like the Dark Ages anymore. Might even be usable for some CLI tools.
The only thing where Java really sucks is anything close-ish to the kernel. Try issuing an ioctl() ⦠I couldnāt have made my TUI framework in Java, but then again, I wouldnāt have needed to because Swing already exists and it just works.
@david@daiwei.me Thatās a good thing. I still use it heavily, but I also realize that it is addictive. This whole idea of getting likes and boosts is horrible. Seeing ānumber goes upā is inherently addictive design, if you ask me. This should never have been added to a Free Platform like Mastodon, and Iām glad that twtxt doesnāt have anything like it.
@movq@www.uninformativ.de Yes, this is absolutely a no-go!
A long time ago when the first telemetry shitstorm happened, I added export GOTELEMETRY=off in my ~/.zshrc. But it doesnāt seem to be picked up at all (I actually call this sabotage!):
$ go env GOTELEMETRY
local
$ go env -w GOTELEMETRY=off
go: GOTELEMETRY cannot be modified
$ go telemetry off
$ go env GOTELEMETRY
off
@prologic@twtxt.net I really like how these two apps pair-up. Seeing as Iām still tweaking TwtKpr, Iām considering adding support for the same APIs as twtd (so maybe it can be used as another backend for Twtxt.App). š¤
you should see the new search engine stats page where Iāve added, spark lines, and time series graphs š
Adding support for forking, forked conversations and navigating back to the root of a thread for the Twtxt App š¤
I donāt know when this happend, but Jetbrains added an autocomplete to the terminal input of Webstorm. So when you start typing a common command, some sort of select box opens and it catches your keyboard focus, so you cannot keep typing. You also cannot type in the select, you have to use the arrow keys or the mouseāor hit ESC to close it. And then you type the next letter AND IT OPENS AGAIN. WHY?! I am typing faster than selecting some entries in a dropdownish thing. I really hate this.
Been digging Susam Palās Wander Console: https://susam.net/wander/
I like the way it combines human curation with algorithmic randomness, allowing you to visit other #smolweb sites without leaving āhomeā.
Like this one - The Oldschool PC Font Resource: https://int10h.org/oldschool-pc-fonts/fontlist/
I plan on adding one to my own site as part of its next update.
Added 1 account https://balloon.oldcities.org/twtxt-active-users.txt
balloon added a twtxt central page, including a timeline.
Nightfall Shore resident balloon has been doing a lot of work improving the district! balloon added a twtxt central page, including a timeline.
I just started a new #getkirby collection here on Mastodon, please let me know if you want to be added:https://mastodon.online/collections/116769879481433457
tt. But then, in the message tree, I spot another missed typo. My process is then to go to my twtxt.txt and fix it by hand. However, I still have to clean up tt's cache. This is rather tidious:
Fuck me! I tried to upgrade tview and the first thing I notice is a shitload of added dependency versions:
go.mod | 18 ++++-----
go.sum | 97 ++++++++++++++++++++++++++++++++++++++-----------
My code does not compile anymore as the view.FormItem interface was extended. Get/SetDisabled(ā¦) are quickly implemented, no worries.
But the tview.Primitive (what makes a widget) interface has now a bunch of PRIVATE methods. For focus handling. Would you believe that!? Thanks, I cannot satisfy this interface in my very custom widgets anymore. Okay then, I just embed *tview.Box. tt now successfully compiles, but does not react anymore on key presses and the message tree is not focused either.
Iām not in the mood to debug this shit. :-( Lunch time.
@lyse@lyse.isobeef.org ⦠I am literally writing a blog post about changelogs at this very moment ⦠š I am certainly adding the āāadd Xā and then later āremove Xāā to my list of DONāTs. š
Actually, Iām stupid: Iām using the normal rsync on OpenBSD as well.
And regarding OpenRsyncās general usability:
https://marc.info/?l=openbsd-misc&m=178090751524547&w=2
Right now openrsync is limited in functionality and is primarily present
for rpki-client. The limited functionality makes it unusable for generic
use and so any diff or change like the above will not be considered since it
is simply not ready.First problem to solve is to remove the mmap usage in openrsync. After
that modern protocol versions need to be added. Once that is in place one
can start a discussion about using openrsync as a default on OpenBSD.
Added a Listening box to show currently playing, and last played from my self-hosted Navidrome Music Server!
Apologies to anyone whoās seen an uptick in twtxt pings from me today⦠Iāve been working on shoe-horning my twtxt reader (TwtStrm) into my editor (TwtKpr, aka the express-twtkpr npm library), and it kind ran amok a few times. So again, sorry - Iāve added a minimum 10-minute cool-down period between pulls which should help (I hope š).
<updated> of the feed, too. But for some reason, some articles were suddenly marked as new.
Aha, yesterdayās newly added support for LC_TIME to render localized timestamps also broke the feed parsing with my LANG=de_DE.UTF-8 and LC_CTYPE=de_DE.UTF-8 environment. :-)
Atom feeds make use of RFC 3339 timestamps. They are first converted into RFC 882 timestamp representation, which is the one that RSS feeds use. However, this conversion now results in localized RFC 882 timestamps, which cannot be parsed into Unix timestamp numbers via curl_getdate(ā¦). I bet that it doesnāt know about the localization at all and expects English month and weekday names. Looking at its docs, I reckon that function was selected because of its myriad of supported timestamp formats: https://curl.se/libcurl/c/curl_getdate.html RFC 3339 is not included, though, hence the transformation up front.
The intermediate Item objects in the parser domain use std::string for the timestamp representation. This isnāt all that silly, because Newsboat supports all sorts of different feed formats with different timestamp formats. These RFC 883 timestamps are centrally parsed into time_t.
Speaking of time: Itās time to go to bed after this late bug hunting fun. :-)
Of course, @movq@www.uninformativ.de! Most of my points are also included in your list.
First of all, programming is what I really do enjoy the most. So, it doesnāt make any sense at all to not do this anymore. āBut you could use your now free time to do something much cooler and more valuable!ā, others might reply. Fuck no, I donāt want to waste my time with other shit that doesnāt fulfill me, why on earth would I want to do that?
All this hallucination reduces quality badly. In my experience, itās also happening much more rapidly than I expected. Even though developers are still supposed to own and understand whatever has been generated under their name and even be responsible for that, the sad reality is that teammates often blindly trust the AI output. āBut I asked the AI and it told me that $this was impossibleā, āIāve no idea either, but the AI just generated itā are responses I get more often. What really makes my angry is when I point out a flaw and suggest an alternative and this is the reaction. It happened several times that just trying it out and seeing it clearly work to proof my point only took me half a minute, but people still did something handwavy else instead.
The learning effect is drastically reduced. The more time I spend on a topic, the better the odds that whatever I learned actually makes it over into long-term memory. Itās like if a collegue just says ādo it like thatā or āthis solves your problemā, but neither explains the why or how. Somehow, people are still convinced that itās a completely different story when you replace the human counterpart with a computer program in this equation.
Skills are unlearned. Itās like with automation in general, just much worse. You end up in a state where youāve no clue how anything works under the hood or how to actually find out important information that are needed to solve your problem. Youāre screwed when a process breaks out of the blue. Even though it can become also rather terrible, with classical automation youāre typically still be able to decipher how exactly the thing was supposed to do something.
The energy consumption is sooo high, I absolutely do not want to be a part in burning down our planet. Iām sure I find (and probably have long found without knowing) other ways to contribute to worsen our climate crisis.
The scraper part is already covered in detail in your list. :-)
Iām convinced that license and copyright violations are only played down or even refused entirely because companies want to make big money quickly. With the work of others of course. Their double standards are obvious, they still try to actively keep their own stuff secret and out of any training sets. At most for internal use only. Virtually noone in charge is interested in good long-term solutions. Short-term for the win, when disaster eventually strikes, the causers are long gone, the responsibilities in other hands.
Vendor lock-in is something that lots of folks are only realizing very slowly. Itās completely crazy to me. This drug dealer routine should be well-known by now. Itās fucking everywhere. Yet, people are always surprised when they found themselves caught in it.
Adding new AI stuff only increases complexity. But complexity is the enemy that everybody should fear and reduce as much as possible. Of course, this is not limited to AI at all. And everywhere I look around, people in charge looooove to make things way more complicated than they ever need to be. Yet, simplicity is the real art and much harder to achieve.
I donāt understand why we have to go back full force to the ambiguity of natural languages. This alone should be more than enough to realize what a stupid idea all that is. Linked to that is that the āinstruction setā is interpreted differently with newer model versions. I mean, is has to be. Why else would somebody want to upgrade in the first place than to get more Powerful⢠Featuresā¢?
Some people argue that with AI the democratization is empowered. However, in my view, the exact opposite is the case. Models are getting so large that you can basically not run them locally or even train them. So, you have to rely on whatever the vendor offers you and runs for you. In the end, this only gives the owners more power, the multi billionaires. Not exactly what I understand by democratization.
Finally, technology assessments are missing completely. Or they are faked such that mostly only the (questionable) benefits are listed. But all the negative impact is just ignored.
Letās keep some popcorn around for when this all explodes. :-)
@itsericwoodward@itsericwoodward.com ahh, I missed this one! I have now added it to my calendar, so come 25 May 2027 I shall not forget. To the hoopy froods!
I wonder how they added this feature with only htmlā¦
@movq@www.uninformativ.de are you sure itās the browser is getting slow or is it website developers adding more more crap to their sites?
Iām still having some fundamental design issues with my TUI widget system, so Iām still not comfortable making this code public.
But after a day of work (and discussing AI ad nauseam at work), I just donāt have any energy left. š
Added a few more folks to my twtxt feed. Found them at https://tilde.club/~deepend/twtxttimeline/
i am trying to escape from big tech, as much as i can. spotify is just bad for artists, pays miserably plus they show ads for ICE recruitment in the US, netflix is just not interesting anymore and i donāt really wathch movies that much. the next one is paypal i think
Thanks, @movq@www.uninformativ.de! Oh no, get well, mate!
Yes, our singer is a male Iām pretty sure. Of course, itās hard to tell after sunset whether our blackbird wears a black or brown feather coat, but during daylight Iāve always only seen black ones sit on this roof ridge. It appears that Wikipedia is backing this up a little bit: https://de.wikipedia.org/wiki/Amsel#Reviergesang
I just added a video. Hmm, filtering the background camera noise also makes the audio rather squeaky. :-(
@lyse@lyse.isobeef.org For reasons I canāt fully explain, we have a bunch of courses in the area, most in public parks (they integrate nicely since they can be built with the existing landscape, only adding some yellow baskets, concrete starting pads, and maybe signs).
In my experience, the main difference between a disc golfer and a frisbee thrower is that the disc golfer will often have a bag full of different shapes of discs (including drivers of varying ranges and/or putters). Even in my small bag, Iāve got some long range drivers (a Beast, a Cheetah, a Valkyrie, and a Wraith), my aforementioned MRV (Mid-Range Vector), an ultralight Aero (which feels similar to a āstandardā frisbee), and 2 ārubberā putters (softer plastic, less ābouncyā).

@itsericwoodward@itsericwoodward.com Thanks! To be clear, my contribution was literally adding that sentence to the documentation, after other people did the work.
@lyse@lyse.isobeef.org Thanks (again) for the heads-up!. Iām not sure why you were seeing black text, but I just pushed a new version of the library (v0.10.1) with some updated colors in the demoās themes (which should hopefully address the contrast issues).
The dark mode was an aesthetic choice by a designer with a strong preference for dark mode (and who thought the maroon looked better as a background color), but in the interest of being supportive of my audience, I added a localstorage-backed memory to the theme toggle (so when you turn it to light mode, it should remember for future visits).
sqlparse is also unsuitable for me: https://github.com/andialbrecht/sqlparse/issues/688
Iām supporting incremental SQLite schema changes to just upgrade from an older database version to whatever the current software version supports. In the past, I already noticed that this is quite expensive in unit tests when each test case runs through the entire schema patches and applies them one by one.
To speed up test execution I now decided that I finally go through the troubles of maintaining both a set of incremental patches and a full schema setup in one go. A unit test verifies that both ways end up with the same structure. This gives me a set of SQLs to check the structures:
SELECT type, name, tbl_name, sql
FROM sqlite_schema
ORDER BY type, name, tbl_name
Unfortunately, the resulting CREATE TABLE SQL queries are formatted differently, depending on whether the full schema was set up in one big step or the structure had been modified with ALTER TABLE. Mainly, added columns are not on their own lines but appended in one physical line. Thatās why I wanted an SQL formatting tool. Since I didnāt find one that works decently, Iām now doing some simple string manipulation. Joining consecutive whitespace into a single space character, removing spaces before commas and closing parentheses and spaces after opening parentheses. This works surpringly good enough. Of course, if it fails, the ādiffā is absolutely horrendous.
Now for the cool part, my test execution dropped from around 5:05 minutes to just 1:32 minutes! I call that a win.
I just stumbled across PRAGMA table_info('tablename') https://sqlite.org/pragma.html#pragma_table_info, PRAGMA foreign_key_list('tablename') and friends. I guess, I have to play with that, now. Itās probably much better to use than the SQL text approach.
@kiwu@twtxt.net Sorry, I have two functional brain cells left in my brain, and Iām not sure if youāre asking What am I putting in it, as in a) when making some? Or as in b) when consuming/serving it?
a) 1L milk (0.5L cold + 0.5L warm @ ~45 °C), a bit of store bought yogourt for the bacteria, sugar and vanilla extract.
b) Most of the time, as is. But Iāve tried once: adding in a couple of diced strawberries that have been sitting in granulated sugar for a couple of minutes, until theyād released enough syrup, and I think I mightāve caught a new addiction on top of the original one.
What do you put in yours?
Reorganised the site navigation, and added a colophon page with technical website details (h/t: susam.net) š¤
Added my photo blog with recent updates. Backfilling older stuff⦠š·
@movq@www.uninformativ.de Our ads are one of these rubbish ones, unfortunately. They just speak about āan attractive salaryā. I reckon I will tell my boss about this talk tomorrow (even though I doubt that any of them are from our department).
Iāve got the impression that salary is amongst the most top secret topics in Germany in general. My conspiracy theory is that companies donāt put any numbers in job ads because that would just reveal that most employees are underpaid.
Adding noai.duckduckgo.com as Custom Search Engine ?~L~X https://thenewleafjournal.com/b/Drp
@movq@www.uninformativ.de Hehe. :-) This steep footpath connects a hiking parking lot outside the village and the edge of the village in a fairly straight line. Garden owners are allowed to drive their vehicles down from the village to their lots on this pathway and up again. These two poles are placed about a third up from the botton on a short, comparatively flat section to stop people from taking this shortcut to get down to the country road. Said road goes through the village but there are hairpins getting up and down. The road markings have been added recentlyish. I suspect to warn shooting down cyclists of the danger ahead. I havenāt seen something like this anywhere else either. :-)
@shinyoukai@neko.laidback.moe Do we now need ad filters in twtxt clients, too? O_o I hope not! Personally, I cannot stand the āSent with my crappy $phone/$appā e-mail footers.
But congrats on your client. :-)