@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.
@movq@www.uninformativ.de I see, fair point, yeah.
about:compat
in Firefox.
@movq@www.uninformativ.de Yikes! I didnât know about about:compat
. Crazy!
@xuu@txt.sour.is Wow, thatâs a giant graveyard. In my new database I have 16,428 messages as of now. Archive feed support is not yet available, so itâs just the sum of all the 36 main feeds.
There are 82.108 read statuses, but only 24.421 messages in the cache. In contrast to the cache with the messages, the read statuses are never cleaned up when a feed was unsubscribed from. And the read statuses also contain old style hashes, before we settled on the what we have today. Still a huge difference. Hmm.
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.
Thanks, @movq@www.uninformativ.de!
My backing SQLite database with indices is 8.7 MiB in size right now.
The twtxt
cache is 7.6 MiB, it uses Pythonâs pickle
module. And next to it there is a 16.0 MiB second database with all the read statuses for the old tt
. Wow, super inefficient, it shouldnât contain anything else, itâs a giant, pickled {"$hash": {"read": True/False}, âŚ}
. What the heck, why is it so big?! O_o
@movq@www.uninformativ.de You could also just use a tiling window manager. :-) As a bonus, it doesnât waste dead space, the window utilizes the entire screen. To also get rid of panels and stuff, put the window in fullscreen mode.
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.
If I didnât mess this up, 61 feeds reduced down to 36.
I now subscribed to most feeds in my Go 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.
This might motivate me to actually âfinishâ the new client, so that it could become my daily driver. No need to use the old software stack any longer. Letâs see how bad this goes.
@movq@www.uninformativ.de Yeah, most of the graphical applications are actually KDE programs:
- KMail â e-mail client
- Okular â PDF viewer
- Gwenview â image viewer
- Dolphin â file browser
- KWallet â password manager (I want to check out
pass
one day. The most annoying thing is that when I copy a password, it says that the password has been modified and asks me whether I want to save the changes. I never do, because the password is still the same. I donât get it.)
- KPatience â card game
- Kdenlive â video editor
- Kleopatra â certificate manager
Qt:
- VLC â video player
- Psi â Jabber client (I happily used Kopete in the past, but that is not supported anymore or so. I donât remember.)
- sqlitebrowser â SQLite browser
Gtk:
- Firefox â web browser
- Quod Libet â music player (I should look for a better alternative. Canât remember why I had to move away from Amarok, was it dead? There was a fork Clementine or so, but I had to drop that for some unknown reason, too.)
- Audacity â audio editor
- GIMP â image editor
These are the things that are open right now or that I could think of. Most other stuff I actually do in the terminal.
In the pastâ˘, I used the Python KDE4 bindings. That was really nice. I could pass most stuff directly in the constructor and didnât have to call gazillions of setters improving the experience significantly. If I ever wanted to do GUI programming again, Iâd definitely go that route. There are also great Qt bindings for Python if one wanted to avoid the KDE stuff on top. The vast majority I do for myself, though, is either CLI or maybe TUI. A few web shit things, but no GUIs anymore. :-)
Oh, itâs called âunsubscribeâ.
@movq@www.uninformativ.de Oh, right, a type would be good to have! :-D
@movq@www.uninformativ.de Where can I join your club? Although, most software I use is decentish in that regard.
I just noted today that JetBrains improv^Wcompletely fucked up their new commit dialog. Thereâs no diff anymore where I would also be able to select which changes to stage. I guess from now on Iâm going to exclusively commit from only the shell. No bloody git integration anymore. >:-( This is so useless now, unbelievable.
@kat@yarn.girlonthemoon.xyz Pointers can be a bit tricky. I know it took me also quite some time to wrap my head around them. Let my try to explain. Itâs a pretty simple, yet very powerful concept with many facets to it.
A pointer is an indirection. At a lower level, when you have some chunk of memory, you can have some actual values sitting in there, ready for direct use. A pointer, on the other hand, points to some other location where to look for the values oneâs actually after. Following that pointer is also called dereferencing the pointer.
I canât come up with a good real-world example, so this poor comparison has to do. Itâs a bit like you have a book (the real value that is being pointed to) and an ISBN referencing that book (the pointer). So, instead of sending you all these many pages from that book, I could give you just a small tag containing the ISBN. With that small piece of information, youâre able to locate the book. Probably a copy of that book and thatâs where this analogy falls apart.
In contrast to that flawed comparision, itâs actually the other way around. Many different pointers can point to the same value. But there are many books (values) and just one ISBN (pointer).
The pointerâs target might actually be another pointer. You typically then would follow both of them. There are no limits on how long your pointer chains can become.
One important property of pointers is that they can also point into nothingness, signalling a dead end. This is typically called a null pointer. Following such a null pointer calls for big trouble, it typically crashes your program. Hence, you must never follow any null pointer.
Pointers are important for example in linked lists, trees or graphs. Letâs look at a doubly linked list. One entry could be a triple consisting of (actual value, pointer to next entry, pointer to previous entry).
_______________________
/ ________\_______________
â â | \
+---+---+---+ +---+---+-|-+ +---+---+-|-+
| 7 | n | x | | 23| n | p | | 42| x | p |
+---+-|-+---+ +---+-|-+---+ +---+---+---+
| â | â
\_______/ \_______/
The âxâ indicates a null pointer. So, the first element of the doubly linked list with value 7 does not have any reference to a previous element. The same is true for the next element pointer in the last element with value 42.
In the middle element with value 23, both pointers to the next (labeled ânâ) and previous (labeled âpâ) elements are pointing to the respective elements.
You can also see that the middle element is pointed to by two pointers. By the ânextâ pointer in the first element and the âpreviousâ pointer in the last element.
Thatâs it for now. There are heaps ;-) more things to tell about pointers. But it might help you a tiny bit.
@andros@twtxt.andros.dev @prologic@twtxt.net Exactly. The screenshots of the last few days show it in action. But I do not consider it ready for the world yet. @doesnm@doesnm.p.psf.lt appears to have a high pain tolerance, though. :-)
@andros@twtxt.andros.dev You use your real name as login name, too?
@prologic@twtxt.net I see this with the scouts. Luckily, not at work. But at work, Iâm surrounded by techies.
@movq@www.uninformativ.de Oh my goodness! Iâm so glad that I donât have to deal with that in my family. But yeah, I guess youâre onto something with your theory. This article is also quite horrific. O_o
@movq@www.uninformativ.de Wooaah, that is cool! \o/
Hahaha, a bird is singing really load and it sounds almost exactly like a car alarm. Well, itâs probably the other way around, the car alarm was modeled after the birdcall. :-)
@eapl.me@eapl.me I looked at the first few puzzles and they are pretty cool so far! I havenât actually implemented any of them, but Iâm fairly certain about how Iâd solve them properly. I went through some linked reference articles yesterday, theyâre also really good. I will recommend this to some workmates. :-)
Itâs extremely surprising to me that younger non-technical people just type in their full name (properly cased first and last name with a space in between) for a technical username in account registration or login forms. Iâve seen that happening several times in the past few years. The field name is âBenutzernameâ in German, literally âusernameâ. Even adding a placeholder text to signal that they could simply use their nickname in lowercase did not change anything at all. Well, one person used at least an e-mail address.
This wasnât the case six, seven years ago, everybody had some ârealâ username. Even non-techies. It looks like some âcommon knowledgeâ is getting lost. Strange. Very weird. It trips me every time I see it.
Have you experienced something similar?
@doesnm@doesnm.p.psf.lt Heck yeah! Worky, worky! \o/
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.
@movq@www.uninformativ.de Hahaha, that name is certainly fitting! :-D
Yeah, I should revert that and try to figure out which programs misbehaved. But thatâs something for future Lyse. 8-) Right now, I just redefine TERM
in my Makefile when the USER
happens to be me.
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.
@david@collantes.us Tada, the reply context is now also shown above. Itâs slowly coming together and reaching a state where I can actually use this as my daily driver I think. :-)
@david@collantes.us Thanks, yes, absolutely! ;-)
I now notice that I should also show the original message(s) to which I reply. That was super useful in the original tt
. But one after the other. The mentions are now automatically filled in. \o/
Perfect!
I now also implemented basic replying by hitting a
as in answering. Whatâs missing is automatically adding mentions in the message text template. Thatâs gonna be a bit more tricky, though.
tt
.) Now, this is the second attempt in tt2
.
Righto, now with added basic subject support. Hopefully!
(Back in tt
.) Well, it kinda worked. At least appending to the file. But my cache database got screwed up. I do not yet support replies, so the subject and and root hash columns have not been set at all, resulting in a message that is just not shown at all. I gotta do something about that next. The good thing is, though, after simply fixing the two columns the message appeared on screen.
(The previous message was written with tt
.) Now, this is the second attempt in tt2
.
Letâs see!
Dang it, first attempt failed:
Somehow, my local feed cannot be opened to append to. I reckon, I have to resolve the tilde first:
@kat@yarn.girlonthemoon.xyz Allegedly, thereâs at least a CLI for that, yarnc
. I neither used nor looked at it, though.
@movq@www.uninformativ.de Oh for sure, I fully agree!
@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.
@kat@yarn.girlonthemoon.xyz Itâs there, but yarndâs markdown library probably thinks that itâs some broken HTML and swallows it, not sure.
@thecanine@twtxt.net Yeah, nobody will ever find that setting.
@movq@www.uninformativ.de ]:-> Ah, just that one line scrolls horizontally, not the entire screen.
@thecanine@twtxt.net It suits your site very well, but I find this font hard to read. In any case, keep on pixeling.
@movq@www.uninformativ.de Haha! Yeah, I really donât know if thatâs the best translation.
In the meantime, I tried to add English subtitles, so the international audience has a chance of enjoying some of them, too. There are a bunch of puns, so translations donât work at that great.
I went to an exhibition of my fine arts teacher who passed away last year. He was a pretty cool dude and good teacher. I reckon I had him in 7th and probably also 8th grade. His Schelme (imps) were very famous here in this county and presumably well beyond.
Unfortunately, picture frame glas doesnât mix all that great with a fairly dark light and my camera. So, sorry in adavance for the poor quality. Anyway, I photographed a few funny paintings. Watch out, it may contain saucy contents: https://lyse.isobeef.org/siegfried-wagner-farrenstall-2025-03-15/.
@movq@www.uninformativ.de Hahaha, nice! :-D I had to check the solution to get it. Itâs a good one.
Ich war auf der Ausstellung meines letztes Jahr verstorbenen BK-Lehrers. Er war ein ziemlich cooler Typ und guter Lehrer. Wenn ich mich recht erinnere, mĂźsste ich ihn in der 7. und vermutlich auch 8. Klasse gehabt haben. Seine Schelme waren hier im Landkreis und vermutlich darĂźber hinaus weit bekannt.
Bilderrahmenglas in Verbindung mit vergleichsweise dunkler Beleuchtung gibt leider keine gute Kombination mit meiner Kamera ab. Vorab entschuldige ich mich bereits fßr die zu wßnschen ßbrig lassende Qualität. Nichtsdestotrotz habe ich ein paar witzige Bilder abfotografiert. Obacht, kann mitunter anzßglichen Inhalt enthalten: https://lyse.isobeef.org/siegfried-wagner-farrenstall-2025-03-15/
Hahaha, ein Klassiker herrlich nachgespielt: https://www.youtube.com/watch?v=vkNuWG_J544 Unglaublich, kann man sich bei uns heutzutage Ăźberhaupt nicht mehr vorstellen.
@eapl.me@eapl.me Yes, I believe so.
Thatâs cool, solar eclipse on the moon: https://www.flickr.com/photos/fireflyspace/54386246629/in/album-72177720313239766/
@movq@www.uninformativ.de @prologic@twtxt.net Dito. Even though I only had four day weeks and three days of weekend the last month, I feel very exhausted as well. Back to five days next week. :-(
@movq@www.uninformativ.de Thatâs cool! I just canât justify the amount of space it permanently takes. But it fits nicely with the other gauges you have. And with that in mind, it actually is super tiny.
@eapl.me@eapl.me Interesting, I wasnât aware that other parts of the world consider them to be a German thing :-)
@arne@uplegger.eu Das ist ein recht zuverlässiger Wetterbericht. Wenn die Bauern mit ihren Gßllefässern hier vorbeifahren, weià ich sofort, dass Regen angekßndigt ist. :-)
Ha, das Lied gefällt mir auĂerordentlich gut! \o/ Mit Abstand das beste GĂźllelied. Ich kenn noch ein paar schwäbische, aber die gehen lang nicht so ab wie dieses hier.
@eapl.me@eapl.me @bender@twtxt.net @prologic@twtxt.net Not including a photo was a stupid move, sorry. There you go:
This particular one is 95mm wide and 185mm high. Fairly compact.
I can only use it figure out distances to other dates and to do some basic calendar math. Iâm not able to actually schedule anything. But I grew up with a month calendar like you have there where all appointments of the entire family was recorded.
By far most of my paper use is drawing random stuff on scratch paper during meetings. :-D
@arne@uplegger.eu Ah, witzige Geschichte! Ich fĂźrchte, der Eberhardt wird sich nun bei mir auch festsetzen. ;-)
I got a small desk calendar as advertising gift. It shows three months at once. Iâm using this thing since the beginning of this year and I have to say that it turned out to be super useful. Iâm happily surprised.
It sits on my desk next to my rightmost monitor. Iâve set it up so that I can see the last, current and next months. Each morning, I advance the âtoday windowâ or whatever its proper name is. This gives me a sense of what date we have today and which I will have forgotten half a minute later already. At most. However, itâs easily at hand by turning my head just a few degrees.
With the last month still showing, I had several occasions so far where a date in the past popped up in a meeting. I could easily tell when something happened, how long ago that was. Or how many days or weeks are left until we have to deliver something, etc.
In hindsight, this is absolutely no surprise at all. But I still find it fascinating. Iâm now actually wondering why I never had something like that before. How could I live without that thing? Sure, I pulled up a calendar on my computer, ncal -w3
or so. But I always hated the inverted ncal
output, necessary for showing week numbers, though. Having a paper calander right next to my screen at all times is sooooo much more handy.
So, do yourself a favor and think about whether such a desk calendar might be useful to you.
The only annoying thing is that the âtoday windowâ moves too easily. It slips down by its own. I reckon it wants me to regularly interact with it, so that I memorize the current date.
@andros@twtxt.andros.dev If something fits in a CSV file, it typically doesnât require a database. I agree with that. Depending on the application, more complicated queries might benefit from a database, though. I donât know awk very well, but I could imagine that grep, sed and cut reach their CSV processing limits rather quickly when you have to deal with escaped (multiline) fields.
I only very rarely have to deal with CSV files or databases in my day to day life. Maybe, these classic Unix tools offer some tricks Iâm not aware of. When I have some more complicated CSV input, I generally reach for Python.
@eapl.me@eapl.me @arne@uplegger.eu @andros@twtxt.andros.dev Thanks mates!
Hmmm, Eberhardt. Ist das eine plattdeutsche Sache? Dass ich den flinken Nagern so lang zuschauen konnte, war ein seltener Glßcksfall. Normalerweise sind die nach fßnf oder spätestens zehn Minuten wieder aus dem Sichtfeld verschwunden.
@movq@www.uninformativ.de Yeah, horizontal scrolling is an invention right from the devil himself. :-D Itâs awful, I canât stand it.
I watched two squirrels this morning for about half an hour: https://lyse.isobeef.org/eichhoernchen-2025-03-11/ They were super crazy fast. Also, they bit off plenty of twigs and carried them around, not sure where they put them. Iâve never seen them do that before. Once more I realized that I need a better zoom.
Which photos would you remove?
@aelaraji@aelaraji.com I cannot tell you either. I donât know the difference. :-)
@aelaraji@aelaraji.com Thatâs nice, enjoy it while it lasts! Rain can be something wonderful. Stay safe.
@kat@yarn.girlonthemoon.xyz @prologic@twtxt.net When I make dev
on current master, I get a proper version. Same with make server
. Assuming you cloned the repo, do you have any (uncommited) changes? What does git status
tell you?
Of course, @bender@twtxt.net, anytime! As our number one bug finder, your service has to be rewarded. :-)
@prologic@twtxt.net We canât agree on this idea because that makes things even more complicated than it already is today. The beauty of twtxt is, you put one file on your server, done. One. Not five million. Granted, there might be archive feeds, so it might be already a bit more, but still faaaaaaar less than one file per message.
Also, you would need to host not your own hash files, but everybody elseâs as well you follow. Otherwise, what is that supposed to achieve? If people are already following my feed, they know what hashes I have, so this is to no use of them (unless they want to look up a message from an archive feed and donât process them). But the far more common scenario is that an unknown hash originates from a feed that they have not subscribed to.
Additionally, yarndâs URL schema would then also break, because https://twtxt.net/twt/<hash>
now becomes https://twtxt.net/user/prologic/<hash>
, https://twtxt.net/user/bender/<hash>
and so on. To me, that looks like you would only get hashes if they belonged to this particular user. Of course, you could define rules that if there is a /user/
part in the path, then use a different URL, but this complicates things even more.
Sorry, I donât like that idea.
We had a very sunny day, peaking at 19°C. This not only decoyed me out, but also plenty motorcycle terrorists. Eh fuckwits, nobody wants to listen to your bloody engine and exhaust noise, keep it quiet for fuckâs sake! Many of your rider collegues can manage it, too, so should you.
I had some sore muscles after yesterdayâs waste paper collection with the scouts. So, I only went for a short trip to my closest backyard mountain. Watching two rock climbers was interesting. Thatâs not something I see very often.
@prologic@twtxt.net Hahaha, I love that! :-D Something to laugh during these hard times. Hope youâre doing alright.
@arne@uplegger.eu GlĂźckwunsch, das ist in der Tat doch mal eine erfreuliche Abwechslung. :-)
Thanks, @xuu@txt.sour.is, great explanation. In another project Iâve structured it exactly like you wrote. The mock storage over there extends the SQLite storage and provides mechanism to return errors and such for testing purposes:
- storage/ defines the interface
- sqlite/ implements the storage interface
- mock/ extends the SQLite implementation by some mocking capabilities and assertions
- sqlite/ implements the storage interface
Here, however, there are no storage subpackages. Itâs just storage
, thatâs it. Everything is in there. The only implementation so far is an SQLite backend that resides in storage
. My RAM storage is exactly that SQLite storage, but with :memory:
instead a backing file on disk. I do not have a mock storage (yet).
I have to think about it a bit more, but I probably have to do exactly that in my tt
rewrite, too. Sigh. I just have the feeling that in storage/sqlite/sqlite_test.go I cannot import storage/mock for the helper because storage/mock/mock.go imports and embeds the type from storage/sqlite. But Iâm too tired right now to think clearly.
@arne@uplegger.eu Hals- und Beinbruch! Die Bahn hat ja nur die vier Feinde: FrĂźhling, Sommer, Herbst und Winter. Wurdest Du heute positiv Ăźberrascht?
@prologic@twtxt.net You just have to stay in the center. Itâs supposed to be calm in there I heard. Just getting there is the tricky part. Good luck!
@movq@www.uninformativ.de âThermometer must not be installed near aircraft turbine exhaust.â
@xuu@txt.sour.is My layout looks like this:
- storage/
- storage.go: defines a
Storage
interface
- sqlite.go: implements the
Storage
interface
- sqlite_test.go: originally had a function to set up a test storage to test the SQLite storage implementation itself:
newRAMStorage(testing.T, $initialData) *Storage
- storage.go: defines a
- controller/
- feeds.go: uses a
Storage
- feeds_test.go: here I wanted to reuse the
newRAMStorage(âŚ)
function
- feeds.go: uses a
I then tried to relocate the newRAMStorage(âŚ)
into a
- teststorage/
- storage.go: moved here as
NewRAMStorage(âŚ)
- storage.go: moved here as
so that I could just reuse it from both
- storage/
- sqlite_test.go: uses
testutils.NewRAMStorage(âŚ)
- sqlite_test.go: uses
- controller/
- feeds_test.go: uses
testutils.NewRamStorage(âŚ)
- feeds_test.go: uses
But that results into an import cycle, because the teststorage
package imports storage
for storage.Storage
and the storage
package imports testutils
for testutils.NewRAMStorage(âŚ)
in its test. Iâm just screwed. For now, I duplicated it as newRAMStorage(âŚ)
in controller/feeds_test.go.
I could put NewRAMStorage(âŚ)
in storage/testutils.go, which could be guarded with //go:build testutils
. With go test -tags testutils âŚ
, in storage/sqlite_test.go could just use NewRAMStorage(âŚ)
directly and similarly in controller/feeds_test.go I could call storage.NewRamStorage(âŚ)
. But I donât know if I would consider this really elegant.
The more I think about it, the more appealing it sounds. Because I could then also use other test-related stuff across packages without introducing other dedicated test packages. Build some assertions, converters, types etc. directly into the same package, maybe even make them methods of types.
If I went that route, I might do the opposite with the build tag and make it something like !prod
instead of testing. Only when building the final binary, I would have to specify the tag to exclude all the non-prod stuff. Hmmm.
Dang it! I ran into import cycles with shared test utilities again. :-( Either I have to copy this function to set up an in-memory test storage across packages or I have to put it in the storage package itself and guard it with a build tag that is only used in tests (otherwise I end up with this function in my production binary as well). I donât like any of the alternatives. :-(
Thank you, @eapl.me@eapl.me, this is awesome! Iâm curious to see if we find some more advantages with the current approach. It seems there should be some more, but I can only think disadvantages right now. :-)
@prologic@twtxt.net Best wishes!
@movq@www.uninformativ.de Did you place it in the sun? We only got 15°C today.
@prologic@twtxt.net Damn! :-( Yeah, I wonât build that into my client. Not worth it for the many things that are still undetectable and the low frequency it happens.
@bmallred@staystrong.run Oh, I hear you! Itâs always after carefully proofreading and publishing that a typo suddenly pops up. :-) Not sure if amending your edit implementation is really worth it, but happy hacking in case you do.
@movq@www.uninformativ.de Luckily, theyâre not made of steel as I would not have made it home with such heavy weights. :-D
@movq@www.uninformativ.de Fuck! So there arenât any non-criminal printer vendors out there anymore. Very sad. I really donât understand why this is not highly illegal in the entire world.
And I just added a video clip of the woodpecker. As you can easily see from the shaking, it hammers so dang hard that the whole ground around the tree vibrates.
I went on a 5:30 hours long hike to my second backyard mountain. About 12km to get there and roughly 9km on the way back. It was super nice, sunny all day long, 12°C and luckily just a little bit of wind. Great scenery. I managed to capture one great spotted woodpecker hammering along. There was also a kestrel hovering over a meadow and then landing on a sports field light pole. At the castle ruin I could watch 10-12 gliding red kites (with the V-shaped tail) and other raptors, maybe bussards, I donât know, for about five minutes. That was fascinating. Unfortunately, my camera doesnât too well with moving targets.
86 more photos: https://lyse.isobeef.org/wanderung-auf-den-hohenrechberg-2025-03-03/
@prologic@twtxt.net No edits anymore! \o/
@movq@www.uninformativ.de Yeah, the ground was wet here, too. Some sections of esp. smaller paths had turned into mud holes. There are a few notorious spots. Oh well, you just have to press on. :-)
Forest animals also have to do the laundry, they even have a proper clotheshorse! See: https://lyse.isobeef.org/wanderung-zu-den-schurrenhoffuechsen-2021-05-15/07.jpg :-D
@movq@www.uninformativ.de Hahaha, stimmt! :-D
@bmallred@staystrong.run I forgot one more effect of edits. If clients remember the read status of massages by hash, an edit will mark the updated message as unread again. To some degree that is even the right behavior, because the message was updated, so the user might want to have a look at the updated version. On the other hand, if itâs just a small typo fix, itâs maybe not worth to tell the user about. But the client doesnât know, at least not with additional logic.
Having said that, it appears that this only affects me personally, noone else. I donât know of any other client that saves read statuses. But donât worry about me, all good. Just keep doing what youâve done so far. I wanted to mention that only for the sake of completeness. :-)
@andros@twtxt.andros.dev Iâve commented on the ticket: https://git.mills.io/yarnsocial/twtxt.dev/issues/14#issuecomment-19142
In all reality, though, I donât see that our community will come to an agreement. Some folks just donât want to give up on the content-based addressing scheme.
@bmallred@staystrong.run Not an issue if youâre the doctor working there. :-)
@bmallred@staystrong.run Any edit automatically changes the twt hash, because the hash is built over the hash URL, message timestamp and message text. https://twtxt.dev/exts/twt-hash.html So, it is only a problem, if somebody replied to your original message with the old hash. The original message suddenly doesnât exist anymore and the reply becomes detached, orphaned, whatever you wanna call it. Threading doesnât break, though, if nobody replied to your message.
Es gibt Tage, da kommtâs mir auch so vor: https://www.youtube.com/watch?v=EUkkyrHc8so
We went up our backyard mountain again right after lunch. The sun peaked through the clouds sometimes. The 6°C felt much, much cooler with the northeast wind. We got lucky, though, it was dead calm at the summit. At least on the southwestern side, which is a few meters lower than the very top to the east. That was shielded absolutely perfectly from the wind (we were extremely surprised), so we sat down on a bench and could really enjoy the sun heating us up. Apart from the haze, the view was really nice.
There were even patches of snow left up top, that was unexpected. Also, somebody created a cool rock art piece on a tree stump. That one rock absolutely looked like a face. Crazy!
Gewisse Ăhnlichkeiten sind nicht zu leugnen: https://datajournal.org/schon-wieder/
@andros@twtxt.andros.dev I donât see a burst of new twtxt clients popping up. Yeah, the most recent ones are TwtxtReader and twtxt-el. Did I miss one? I agree with @david@collantes.us, looks normal to me. :-)
Iâm also working on my rewrite at the moment, but that started⌠*looking at the git history*⌠oh wow! O_o Over two years ago! I just implemented jumping to the next/previous unread message.
I just learned about a few to me unknown git settings: https://blog.gitbutler.com/how-git-core-devs-configure-git/ Letâs see how quickly I canât live without them anymore. ;-)
@movq@www.uninformativ.de @david@collantes.us Where can I join you? Building a log cabin in the woods would be dang awesome!
@movq@www.uninformativ.de I donât know. It seems a bit like whatever we do or donât do, weâre gonna lose. :-( Unless the ban is successful.
Amd of course, TDD! I tried that, but it doesnât work all that great for me in its strict form. I have the feeling that coming up with a single new failing test, making it pass, maybe some refactoring, rinse and repeat wastes significantly more time than doing it in â what they call â the âbundleâ approach. Coming up with several tests in advance and then writing the code or vise versa is usually much quicker. I do find that more enjoyable, it also helps me to reduce smaller context switches. I can focus on either the tests or the production code.
As for the potentially reduced code coverage with a non-TDD approach, I can easily see which parts are lacking tests and hand them in later. So, thatâs largely a specious argument. Granted, I can forget to check the coverage or simply ignore it.
I agree with John, TDD results in less elegant code or requires more refactoring to tidy it up. Sometimes, itâs also not entirely clear at the beginning how the API should really look like. It doesnât happen often, but it does happen. Especially when experimenting or trying out different approaches. With TDD, I then also have to refactor the tests which is not only annoying, but also involves the danger of accidentally breaking them.
TDD only works really well, if you have super tiny functions. But we already established that I typically donât like tiny methods just for the purpose of them being extremely short.
When fixing a bug, I usually come up with a failing test case first to verify that my repaired code later actually resolves the problem. For new code, it depends, sometimes tests first, sometimes the productive code first. Starting off with the tests requires the API to be well defined beforehand.
@andros@twtxt.andros.dev Just before the pandemic, we watched Uncle Bob videos once a week in the lunch break. While almost all of my old teammates agreed with his views, I partially found them to be very odd and even counterproductive.
I didnât come across John Ousterhout or any of his work before, at least not deliberately. So, this document is my first contact.
I only finished the chapter on comments and I totally agree with John so far. This document just manifests to me how weird Bobâs view is on certain subjects.
I always disagreed with the concept of a maximum method length. Sure, generally, shorter functions are probably better, but it always depends. And Iâve certainly seen super short methods that just made the code flow even worse to follow. While âone function should only do one thingâ is a nice general rule, Iâm 100% in team John with the shown examples. There are cases, where this doesnât help readability at all. Not even close.
To me, a function always has to justify its existence. Either by reusing it at least at another place or by coming up with dedicated tests for it. But if it is just called once and there are no tests, I almost always decide against it. Personally, I donât mind longer methods. We just recently had a discussion about that and I lost against two other workmates who are more in Uncle Bobâs camp, they refactored one medium sized method into three very short ones. Luckily, we agree on most other topics.
Lol, what!? The shorter the method, the longer the variables inside? I first thought I misread or the writeup mixed it up. Iâll always do it the other way around.
Iâve been also bitten badly by outdated comments in the past, but Bob must have worked on really terrible projects to end up with such an attitude to dislike comments. Oh well. No doubt, Iâve come across by several orders of magnitude more useless comments, in my experience (autogenerated) JavaDocs fall in the category more frequently than not. So, I know that there are different types of comments. A comment doesnât automatically mean that it is good and justified.
But I also partially agree with Bob and John and think that a good name has a proper chance to save a comment. Though, when in doubt, I go Johnâs route and use a shorter name with a comment rather than use a kilometer long identifier. Writing good comments typically takes some time, sometimes much longer than writing the code. It regularly takes me several minutes. Itâs a hard art.
I perhaps should read up on Johnâs work. He seems to be more reasonable and likeminded. :-) Let me continue to complete this document.
@thecanine@twtxt.net Thatâs one of my favorite dogs. Very cute. I like its headband and bandana with the bones.
@david@collantes.us Yeah. A horrendously wrong but simple solution often outpaces are bit more correct but complex one. Especially if the simple one suggests that oneself doesnât have to change at all and can just continue along. Wishful thinking.
@bender@twtxt.net @arne@uplegger.eu Hahaha, I love it! :-D
@aelaraji@aelaraji.com Same. It actually goes for anything AI-related. Itâs best kept in /dev/null.