# I am the Watcher. I am your guide through this vast new twtiverse.
# 
# Usage:
#     https://watcher.sour.is/api/plain/users              View list of users and latest twt date.
#     https://watcher.sour.is/api/plain/twt                View all twts.
#     https://watcher.sour.is/api/plain/mentions?uri=:uri  View all mentions for uri.
#     https://watcher.sour.is/api/plain/conv/:hash         View all twts for a conversation subject.
# 
# Options:
#     uri     Filter to show a specific users twts.
#     offset  Start index for quey.
#     limit   Count of items to return (going back in time).
# 
# twt range = 1 6523
# self = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=5096
# next = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=5196
# prev = https://watcher.sour.is?uri=https://lyse.isobeef.org/twtxt.txt&offset=4996
@prologic Nope, we cannot.
@prologic @eldersnake I'd avoid the inverted logic. Checking a setting to disable a feature always feels wrong and confusing to me. I'd rather suggest to enable the checkbox by default. But I'm with you, an explanation what it does is definitely helpful. Maybe something along those lines: "Enabling this feature will keep you logged in, even after closing your browser. Do not activate this setting on shared devices."
@prologic Careful, you risk being hit by a brick. :-D
@bender I agree. For learning, reading is heaps better. There's also the very powerful Ctrl+F that I do not want to miss.
Nice long rant about AI: https://ludic.mataroa.blog/blog/i-will-fucking-piledrive-you-if-you-mention-ai-again/
Can't watch this. What the hell, why would you put a silly chat on the screen!? Distracting af.
@prologic Didn't understand anything. Luckily I don't have to waste my time with this web hipster shit. :-D But that's awesome! https://www.youtube.com/watch?v=ieqsL5NkS6I
@prologic Absolutely! I sure ate it after cleaning up the giant mess from door and floor. The good homemade apple sauce! :-(
@prologic I do NOT claim to be an expert in that realm. I've seen different things being implemented in the guise of "remember me". But I reckon the most common scheme, when this checkbox is activated, is to issue a dedicated, long-lived refresh token in a login cookie. I'm sure it is known under several different names. This "remember me" login cookie is separate from the actual short-lived session cookie.

Part 2 of this answer explains it fairly well: https://stackoverflow.com/a/477578 Also, this was a nice read: https://web.archive.org/web/20180819014446/http://jaspan.com/improved_persistent_login_cookie_best_practice

It depends on your threat model, but the use of public computers in libraries, internet cafés or similar is probably the most relevant here, when arguing against activating "remember me". These days, shared computer use is declining I'd assume. With twtxt being a niche for more computer-affine folks, I'd reckon this threat is not that high up the list. On the hand, you want to bring yarnd to the average non-nerd user, so this threat might actually rank more important.

It's probably okay and safe enough to remove "remember me" entirely and just issue a long-lived session cookie and be done with that. Optionally, power users or the administrator could benefit from configurable cookie lifetime(s).
@prologic Haha, my brain thought, that loopback address is missing a zero. :-D
Oh come on. The waffle fell off the plate and hit the door and then the floor. Of course with the apple sauce side each.
@bender Hihihi. ;-)
Just bent two clips or hooks from wire for my hat, so that I can attach a chin strap. Now the hurricane gusts don't blow off my hat anymore. Or so I do hope. :-D I just have to find a decent looking leather strip. The brown string I tried out quite closely matches the decorative hatband's color, but it's a bit too thin, could be more comfortable.
Those ducks belong to someone in town, @movq. Oh, sweet, I didn't know what that yellow bird was called. Thanks! :-)
Thank you, @prologic!
Went on a great 20km hike to the Wäscherschloss (lit. Launderer Castle) with my mate. Unfortunately, the castle was closed (only opens on Sundays and public holidays), so we had to peek under the door with our cameras.

[![Wäscherschloss](https://lyse.isobeef.org/wanderung-zum-waescherschloss-2024-06-15/33-vorschau.jpg)](https://lyse.isobeef.org/wanderung-zum-waescherschloss-2024-06-15/33.jpg)

Sunny and a few clouds, very windy, my hat blew off a few times, perfect 20°C hiking weather. Could have been a few degrees less, though. We walked through some beautiful scenery, especially when it is lit up by the sun. Really gorgeous views and paths. I should go over there more often. Last time was almost exactly two years ago.

The one steep foot path in the forest had 60cm deep canyons from the flood two weeks ago. Absolutely crazy! The burried post cable caution tape even was revealed. That path didn't look like a path anymore at all.

At home I had to remove a tick. Those fucking bastards!
@movq Oohhh, okay! Way more often than I thought. It's similar to oiling my handplane. Every time it squeeks or the friction gets too much (just the opposite ;-)), I pull the plane sole over my "rag in a can" oiler.
Very humid 20°C, cloudy and partially raining. That was today's weather when we went into the woods and paid or backyard mountain a visit: https://lyse.isobeef.org/waldspaziergang-2024-06-14/ Not very many folks around, looked like they all feared the liquid sunshine. The visibiliy was fairly mixed. Pretty clear in the west, we could see the Stuttgart TV tower 38.55km away (04). But very hazy to the north (03) when a rain cloud appeared.

Chestnut face nailed to a tree stump
@prologic Thanks mate! <3
@movq How often do you apply it?
@movq Haha, cool! :-) Also funny how the red container makes it completely change color.
@bender Waaahhh! Even just posting without editing?
@prologic This is how you can identify the duplicates in the feeds (storing the files first for potential further analysis later on without having to redownload them): cd /tmp; for u in prologic bender shreyan; do echo $u; curl -s https://twtxt.net/user/$u/twtxt.txt > $u.txt; uniq -cd $u.txt; done
@prologic Have a look at the raw feeds:

* https://twtxt.net/user/prologic/twtxt.txt
* https://twtxt.net/user/bender/twtxt.txt
* https://twtxt.net/user/shreyan/twtxt.txt*
Duplicates everywhere! Sigh.
@movq Right, this makes sense. Also, @bender reported the same over in https://twtxt.net/conv/ilupk5q. That whole conversation looks like that for me: Bender edits in red, notices in fuchsia (probably edits and leaves the message unchanged), and prologic acknowledges in orange. This conversation over here is marked in lime. Yeah, tt doesn't filter out duplicates. Maybe I should implement that.
@prologic I only notice that you post duplicates just like this one. This started few days ago.
I didn't know I wanted to watch a half hour lecture on over center mechanisms. But this was time very well spent with This Old Tony explaining them. Worth every second, just as always, highly recommended: https://www.youtube.com/watch?v=Ia3Iieejyg8
@bender Yes, they're on very different diets. ;-)

Hell no, I don't want to trade weathers. :-D Our humidity was around 60%.
These 24°C were brutal. The cow in 03 was standing in the bog, not sure why she liked this brackish water. It sounded "tchlk, schlk" when she moved around in that mud (what do you call that?). Some of these canyons, like 14, are over 30cm deep. Wow. In 15 at a height of two meters, a torn rag hangs in the tree in the creek bed. It's crazy to see how high the flood came in 16 with all the washed up stuff in the hedge.

https://lyse.isobeef.org/waldspaziergang-2024-06-07/

Hairy caterpillar
@movq Yes, classical "Abraummulden" and "Abrollcontainer". I haven't heard of any numbers yet, but I imagine that 100 houses have been affected. Probably more.

Here are a few photos: https://eislingen-online.de/_artikelanzeige.php?bearbeiten=_2024/2024_1150

But it's worse downstream in Ebersbach/Fils, if you want to read up on that. That's where the noise barrier collapsed onto B10 (I was mistaken on that regard, though, it wasn't the real river, but an overflowing water retention reservoir or something like that uphill that created a giant river, rushing down the streets and gardens, ripping out the accustic barrier). When water levels slightly dropped on Sunday evening, everybody here thought that we survived with only small damages, if at all. So the local fire service responded to help in Ebersbach where it had really escalated. However, they had to return shortly after, when a massive thunderstorm surprised us with very heavy rain and "land submerged" was reported back at home.
Went down to the creek and there's a skip in front of every house. Oh dear. Normally, the creek is a few meters below the tree line in 01-03. But as you can see, it went over the fields, several tens of meters wide.

Three days after the flood

The fire engine house next to the creek was also flooded. But the operational capability of the fire brigade was not affected as they already responded.

It's crazy how the relatively shallow field road on top of the hill looks. It was already in bad shape, but that's now another level. The drainage area is rather small, but tons of gravel is now in the meadows. 10cm deep holes and ditches in the road. The very loose gravel is difficult to cycle and walk on.
@prologic Yeah, l/m² is very common here. But I've also seen mm.
Between Friday 8am and Monday 8am it rained 161 liters per square meter. Our weatherman in town measured alone 40 liters on Sunday between 22:30 and 23:45. On average we get 92 liters in total in the entire May and 96 liters in June. It was a lot, but i didn't think it was actually that much. Wow!

Down in the town a lot of houses have been flooded. The municipality provided containers for all the garbage. From what I read it was the smaller creek, not the larger river that went absolutely berserk.
@prologic It was not the river water, but the rain water that found its way into the basement. It rained for a few days straight. So the ground was completely saturated at one point in time. Sunday to Monday night there was a ton of more really heavy rain, new water could not sink down anymore, so it leaked through the tight hole where the cables enter the house in the basement. That's roughly a meter above the basement floor. A tiny, tiny bit of fine sand accumulated on the floor beneath the hole.

I didn't even know that water can get through that hole in the wall, looks completely sealed to me. But as we learned, it is not sealed enough. I didn't see it flowing in, I just noticed the standing water on Monday morning.
@movq Thanks, all good. Could have been way worse. Time to work on the shelf. :-)
@movq Ein absolutes Gesamtkunstwerk. :-D Schon ne Qual, da zuzuhören. Ich habs durchgehalten, uff. ;-)
Holy crap, downstream the river broke through a noise barrier: https://www.tagesschau.de/inland/regional/badenwuerttemberg/swr-ebersbach-100.html
The river upstream kissed the hundred-year flood level (462 cm) the other day. https://www.hvz.baden-wuerttemberg.de/pegel.html?id=00265 (To me that link looks broken, but maybe it works on other browsers. :-?)

Just one pixel below

I'm on a hill, far away from the river, but with all that rain and soaked ground the water finally came into the basement where the cables enter the house over night. Luckily, just 15 mm high, so it didn't jump the doorsill into other rooms. And it was all clear, no muddy mess, all nicely filtered through the earth, gravel and sand. My shop vac is also designed to work as a wet vacuum cleaner, so that was really helpful.
@prologic I suspect this one being made of rubber, too.
@prologic Exactly, for my purposes that's enough. When I started out, I never imagined that migrations will take this long with all my gazillions of tests. :-)
@prologic There's a medieval market around the corner and this man-made western capercaillie is part of an archery tour through the forest where you can shoot all sorts of animals with bow and arrow. This one was target nine on the map.

Due to all the rain the whole market was closed yesterday, though. Since it's still raining today and tomorrow, I expect this to be total flop this years. Only Thursday was actually dry.
@bmallred Confirmed, it's fixed. :-)
@prologic The schema migration itself is easy. When not already on the latest version, loop through all schema patches and see which need to be applied. Suppose, the database schema is at version 0.5, then the SQL queries for versions 0.6, 0.7 and 0.8 are executed one after the other in exactly that order. And with a maiden database it starts out with 0.1 and goes through all the steps. Well, I just restarted with 0.8 being the first supported version, attempts to load older database versions will abort with an error. :-)

The automatic migration at startup simply exist to make *my* life easier. I not only operate this thing locally when developing, but also on a test and production environment. It's very convenient if the existing prod and test data just keep working with a new software version and I don't have to manually migrate things by hand. Simply start the new software version and voilà. I really don't wanna miss that.

Since I don't enjoy doing admin stuff, there is one big thing to not worry about. Even though I messed up one migration step so far and had to fix the production database by hand (removing all existing sessions by hand, so that a new column without default value could be added). It worked flawlessly with the test and local databases before, though, no active sessions did exist anymore at the point of deployment). That raised my adrenaline level.

I reckon I keep the supported versions to a minimum from now on. At least as long as I am absolutely sure that I'm the only person operating that software.
@movq Very cute! :-)
@prologic @movq @bender Clearly a witch on a broom!
It was a tiny bit moist on today's stroll. We saw exactly one other person in the forest. It's only raining once the entire weekend. And how!

All the black stuff on the shore of the pool are tad poles. Technically, there are hundreds of them on the flooded forest road. :-)

Tad poles on the flooded road

https://lyse.isobeef.org/waldspaziergang-2024-05-31/
Oh yes, it's certainly the DROP and CREATE COLUMN of existing tables. Wow! Alrighty then, removing the migration, here we go.
@prologic I had to read it two, three times, but I think I got it. Let me try. I believe most of it is general advice, not just specific to Go only.

# No Interface Is A Good Interface

First of all, don't start out with an interface right at the very beginning. Only create one if you later on come to the conclusion that you really have to, because chances for truly needing one are actually slim.

I experience that at my dayjob, too. There is a code base where I always wonder why certain interfaces exist in the first place. They're all implemented by exactly one type each, which is kind of useless. Just the type alone would totally suffice.

That train of thought to always also have an interface along with an implementing type might come from the Java enterprise world, at least that's where I encountered it really heavily. I never liked that. It just makes the code arbitrarily more complicated than it needs to be. The best code is the one that doesn't even exist. Simpler is better. Complexity is the root of all evil.

Advocates of the type with interface faction then like to argue: "But maybe sometime in the future we would like to create a second type that implements this interface, you will never know@11!! Or think of refactoring, we can also change the underlying implementation completely when we have an interface in front of it without people knowing!" But that basically never happens in reality. It reminds me a bit of premature optimization, preparing for the unknown future. Firstly, things turn out differently and secondly, other than one thinks. :-)

To be fair, thinking about what might happen or not is still a very valid thing. In my opinion it is even done not enough in this agile world. Implementation first, consideration second (if at all). But there are limits. So, start out simple. No interface for you at first.

That general rule goes at least for application development, it can be a little bit different when you write a library. More flexibility _might_ be actually helpful there.

# Interface Placement

When you define an actually beneficial interface, then place it in the same package where it is actually used in. Or lexically close to where is is used for that matter. As oposed to in the package where the implementing type resides in. This recommendation is very logical to me. The interface describes the API, so it should also go along with the rest of our API.

# Return Values

When you have a factory function to create a type that implements an interface, return that implementing type, not the interface. Using ugly suffixes in identifiers to help visualize the concept:

o
type FooInterface interface {
    Foo()
}

type FooImplementation struct { }
func (f *FooImplementation) Foo() { }

func NewFoo() *FooImplementation /* as opposed to FooInterface */ {
    return &FooImplementation{}
}


Most of the time I agree on that rule (it feels natural and correct), sometimes I don't. I reckon this depends on the exact use case at hand.

# Testing

When you have a type that you want to test, the recommendation is to not create dedicated interfaces for testing purposes only in order to mock something. If you do, this smells like a bad API design of the type in the first place. Instead, try to make its regular, productive API better, so it can be also used when testing the type.

Phew, this turned out to be a much longer post than I first anticipated. ;-) I hope this helps a bit.
Hmm, when I join all my eight incremental database schema changes into just a single one (basically drop support for migration of old databases), my test execution time drops from about 1:10 minutes to just 33 seconds. I might consider doing exactly that. I'm the only one who runs that software anyway.

Just haven't figured out where exactly the speedup comes from. I suspected that the column recreation is kind of expensive, but it doesn't really appear to that obvious. More testing is needed.
@prologic Absolutely! :-)
@prologic That looks cool! It even appears to get close to sunset.
One of our scout leaders found a blackbird laying outside the car and is now raising her:

Blackbird

https://lyse.isobeef.org/amsel-2024-05-29/

I should have taken a video of that gorgeous bird.
Thanks, @prologic! Could definitely be worse.
And today also just a quick two hour roundtrip in order to make it to the Yarn meetup almost in time: https://lyse.isobeef.org/waldspaziergang-2024-05-25/

View to the Swabian Alps
Quick stroll of just one and a half hours yesterday: https://lyse.isobeef.org/waldspaziergang-2024-05-24/

Old barn
Absolutely, that was really awesome! Four and a half hours, time flew. Looking forward to the next one. :-)
14:00 local time is not bad at all for me, I just might be a tiny bit late today. See you later.
@movq Yeah, there are much better ways to waste time. :-D

@bender @aelaraji All this antivirus shit just enlarges the attack surface even more.
@prologic @aelaraji @anth @movq ICQ was the first IM I ever had. I also still know my number, but I deleted my account well over a decade ago together with AIM and MSN in favor of Jabber.
Lol, somebody reverse-engineered the secret API to tell Windows that some snake oil is installed: https://github.com/es3n1n/no-defender
@bender Sounds about spot on. :-D
@movq No, LibreOffice didn't exist back then. :-D The user interface was somehow green. No clue.

TeXNicCenter is either dead or just finished. All features implemented and all bugs fixed. That's the thing, one doesn't know with completed software. ;-)

(Lol, there was a fuzz on my screen. Just perfectly aligned, so it looked like an accent grave and I was wondering how the quote got corrupted. :-D)

Agreed, a lot of people don't need the real document structure markup.

I actually cannot remember when I wrote my last letter using LaTeX. Maybe it was some kind of termination letter for a service that could not be cancelled online. It must have been a few years ago. The last "proper-ish" use of LibreOffice was at the end of last year when printing a quiz and map for the scouts I think.

Today, I was in a meeting where a workmate gave a talk. I noticed the LaTeX beamer look and feel and was intrigued. He said, that he cobbled together the corporate design, but it's not ready for official use yet. But that's really cool. My last prepared presentation with LaTeX beamer was in my previous company a few years back. But I didn't care about corporate design at all.
Regarding https://www.uninformativ.de/blog/postings/2024-05-23/0/POSTING-en.html: I remember using Star $Something back in the days. I don't remember the exact name anymore and none of the screenshots of StarOffice look familiar. Hmm. I have a green UI in mind. Not sure if I completely hallucinate it or whether that was actually the case. It was a commercial software, not freeware, we had to buy it, I think.

My first LaTeX distribution was MiKTeX with – if I remember correctly – the TeXNicCenter. A bit later on Linux I used Kile as my LaTeX editor. LaTeX produces the worst error messages I've ever come across. So compile early and often. But the results are amazing.

I know people who never make use of headings and the like to this day. Bold, italics, underline etc. is all they use. Despite writing larger documents. Admittedly, it took me a while to figure out and appreciate all the advantages of actually marking up the document structure properly.

These days I rarely reach for LaTeX or LibreOffice to craft new stuff in my private life. Simple text files is usually it. RST and Markdown if it has to be more fancy.
This is cool, the Engineerguy talks about the engineering of duct tape: https://youtu.be/E-F2QQuZZGk
@movq @prologic @bender Oh, I neither noticed the DDG downtime nor was I aware of their partnership with Bing. O_o Oh dear! Never heard of most search engines in this linked graph.
Heck yeah, that's a super cool catapult! https://www.youtube.com/watch?v=1XGACnLDEps I'd love to build one now.
Just before the rain hit us hard:

[![Green trees in front of dark clouds](https://lyse.isobeef.org/mittagssonne-2024-05-22/01-vorschau.jpg)](https://lyse.isobeef.org/mittagssonne-2024-05-22/01.jpg)
@prologic Depends on whether you consider your favorite secret service third-party or not. :-D
Riders^WColors in the sky: Sunset of the day
@movq Yeah, not so much stuff left that is made around the corner.
@movq I don't know. I thought that I had to accept beeing added to the contact list before somebody could message me, but apparently, that's not the case. Let's see how that unfolds.
@movq Ah ja, der Holgi. ;-)
Oh dear, I got plenty of spam – if not even worse – on one of my jabber IDs. One sender JID was on exploit.net or exploit.im or something like that (I already forgot).
@stigatle Oh cool, that looks nice! Great job. Would he be able to jump the fence when standing on his hut's roof? How does the door lock work? Also, that's some giant bone. :-) I bet he loves that one.

I couldn't help myself but notice that it appears your stairs and the left of the deck need some countersinks for the screws. 8-)
Thank you, @prologic. Once you leave the shitty towns, our scenery is very nice. Doesn't compare to other places, but I've seen also way worse. :-)
Hmm, didn't yarnd automatically inline image URLs back in the days? Looks like I have to resort back to markdown images again.
@iolfree I n d e e d ! W o r d s a r e p r o p e r l y s e p a r a t e d
Let's just go with that view: https://lyse.isobeef.org/wanderung-auf-den-wasserberg-und-das-fuchseck-2024-05-18/24.jpg
Two mates and I went on a 25km hike yesterday to the Wasserberg (lit. Water Mountain) and Fuchseck (lit. Fox Corner) on the edge of the Swabian Alb. They arrived by train and of course it was delayed by half an hour, "due to limited availability of tracks". That was a first one, I never heard that reason before. Another train had a breakdown in a train station and later my mates' train had to be rebooted, too. That restart alone took 10 minutes. O_o Software problem, it can't be helped.

It rained the whole day before, so a lot of foot paths had turned into small creeks. Also, the mud levels were much higher than usual. We also took one or the other shortcut which were even messier. And also reeaalllly steep (see 07 and 08). It didn't help that my guiding abilities also sucked a bit and I took the wrong turn twice. Oh well, we just explored new paths I've never been on. That's a win in my book. :-)

After a rest at the Wasserberghaus with a Spezi, we then decided to also visit the Fuchseck, since we're just around the corner. It took a bit longer that I remembered and after enyoing the view and eating homemade waffles with apple sauce, we then made our way home.

About 100 meters in front of the train station it began to rain. The thunderstorm caught up on us. We just made it in time, a couple of minutes later, the train was supposed to show up. I quickly walked home and was a bit soaked when I unlocked the front door.

It was great fun, it was a nice stroll for me, my mates were absolutely exhausted. Well, I admit, my feet hurt, too. :-)

Here's a nice view on the Three Emperor-Mountains in the distance. From left to right: Hohenstaufen, Rechberg and Stuifen, the left one is my backyard mountain:

https://lyse.isobeef.org/wanderung-auf-den-wasserberg-und-das-fuchseck-2024-05-18/42.jpg

More pics: https://lyse.isobeef.org/wanderung-auf-den-wasserberg-und-das-fuchseck-2024-05-18/
@prologic That's a lovely campfire! Let's see what my hike produced yesterday.
@movq Oh, made in Denmark.
@thecanine Woof, woof. :-)
@movq That's what I always think of with a shake of my head, too. Nowadays people voluntarily and actively feeding Stasi with all their information.
Hahaha, what an evil idea, @aelaraji. :-D

@movq At work, I mostly open Jira tickets in new tabs and don't navigate them. But yeah, GitHub unsurprisingly fucked up here. One more reason not to use it. ;-)
Hell yeah, this is some amazing bee stuff! https://www.youtube.com/watch?v=YgOYLDf5Wv8
@movq Classically navigating through the history still works perfectly fine on most (if not all) websites I visit.
@prologic @movq @bender Yup, I second that. :-) We went to Ebersberg Castle with the scouts. It was great fun and very exhausting at the same time.
All packed, ready to go.
@mckinley That's a cool idea!
@prologic Kehrwoche! :-)
@prologic I noted it in my calendar, looking forward to it. :-)
@prologic Cool!
@movq I'm subscribed to 48 feeds at the moment. And only a fraction is actually active.
@prologic Oh, was I? I don't recall any of that. But who knows. ;-)
@prologic I won't see any activity again, unless somebody else I follow interacts with them. Yep, fetching the feeds still happens with a patched version of the original twtxt client. tt is just a viewer of the database contents.
Righto, it's time for a rotation into archive feeds again.
I just cleared my following list. Kicked out all the 26 feeds that have not been updated for two years or more. This will reduce a bit of useless traffic.
@prologic I figured, yep.
@prologic Does one need a build timestamp anyway? That's an enemy to reproducible builds. Maybe just use the commit timestamp? That would work at least for official releases. It would be off for dirty working directories during development, though: git show -s --pretty=format:%cI