lyse

lyse.isobeef.org

No description provided.

Recent twts from lyse
In-reply-to » Hello, i want to present my new revolution twtxt v3 format - twjson That's why you should use it: 1. It's easy to to parse 2. It's easy to read (in formatted mode :D) 3. It used actually \n for newlines, you don't need unprintable symbols 4. 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

Let me introduce you to the much superior version 4 instead: https://lyse.isobeef.org/tmp/twxm4.xml

​ Read More
In-reply-to » @lyse you must be loved by all the web developers in town! But ok, I have added all the missing semicolons, that should technically be there, but them not being there, does not make a difference.

@thecanine@twtxt.net And this is exactly why there are quirks modes in browsers


I’m actually glad I don’t have to deal with all this web shit and work with compilers that hit me in the face when I do something illegal. :-)

​ Read More
In-reply-to » hey friends guess who had tiktok teens flood a mostly abandoned site of hers that was meant for a small group of friends? and went from 15 to ~60 users in 20 minutes? ya girl

@kat@yarn.girlonthemoon.xyz They all just wanted to be friends with a cool gal like you. ;-) It’s sad that putting things openly on the internet just waits to be raided by script kiddies, bots or spammers eventually.

​ Read More
In-reply-to » This time, I brought my cam along. We checked out a piece of ex-forest they've cut down. It looks terrible now. :-( At least the spruce resin smell was nice. https://lyse.isobeef.org/waldspaziergang-2025-03-27/

@movq@www.uninformativ.de Yeah, like nearly all of them. There is the so called Bannwald, where it typically is not allowed to log, but there’s only one in my entire county and I haven’t even visted it. I should change that. https://de.wikipedia.org/wiki/Bannwald

​ Read More
In-reply-to » Not in the mood to deal with reality today, so here’s another one of those silly things: https://movq.de/v/68c61f8ecc/r2_session.ogg This time on electric bass, tuned down to B-standard because oomph. (Well, sounds okay on my headphones, but I’m obviously no sound engineer. đŸ€Ș)

@movq@www.uninformativ.de That’s really great! I can’t tell the difference to the original. :-)

​ Read More
In-reply-to » Wow, phishing is just around the corner 👀

@eapl.me@eapl.me Interesting! Two points stood right out to me:

  1. 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.

  2. 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.

​ Read More
In-reply-to » I need to import my yarn cache. It's sitting at about 1.5G in registry format. That should make things interesting...

@xuu 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.

​ Read More
In-reply-to » Thanks, @movq!

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.

​ Read More
In-reply-to » 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.

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

​ Read More
In-reply-to » Thinking about adding a little “focus” feature to my window manager: It hides all but one window, no wallpaper, no bars.

@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.

​ Read More
In-reply-to » 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.

If I didn’t mess this up, 61 feeds reduced down to 36.

​ Read More

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.

​ Read More
In-reply-to » When will the flat UI craze end? Can I get my buttons, scrollbars, and toolbars back, please?

@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. :-)

​ Read More
In-reply-to » i really wanna learn golang it looks fun and capable and i can read it kind of but every time i try it i'm immediately stuck on basic concepts like "what the fuck is a pointer" (this has been explained to me and i still don't get it). i did have types explained to me as like notes on code which makes sense a bit but i'm mostly lost on basic code concepts

@movq@www.uninformativ.de Oh, right, a type would be good to have! :-D

​ Read More
In-reply-to » When will the flat UI craze end? Can I get my buttons, scrollbars, and toolbars back, please?

@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.

​ Read More
In-reply-to » i really wanna learn golang it looks fun and capable and i can read it kind of but every time i try it i'm immediately stuck on basic concepts like "what the fuck is a pointer" (this has been explained to me and i still don't get it). i did have types explained to me as like notes on code which makes sense a bit but i'm mostly lost on basic code concepts

@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.

​ Read More
In-reply-to » 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.

@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

​ Read More

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. :-)

​ Read More
In-reply-to » Wow, this is a nice way to practice internationalization for our systems https://i18n-puzzles.com

@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. :-)

​ Read More

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?

​ Read More
In-reply-to » 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.

@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.

​ Read More
In-reply-to » 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.

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.

​ Read More

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.

​ Read More
In-reply-to » @lyse oooooh! I like how that's shaping up! Now you need a jobless vacation (not moneyless), so that the project goes from baby crawling, to toddler steps. :-)

@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/

​ Read More
In-reply-to » Righto, now with added basic subject support. Hopefully!

Perfect!

Image

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.

​ Read More
In-reply-to » Dang it, first attempt failed:

(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.

​ Read More
In-reply-to » Hi! For anyone following the Request for Comments on an improved syntax for replies and threads, I've made a comparative spreadsheet with the 4 proposals so far. It shows a syntax example, and top pros and cons I've found: https://docs.google.com/spreadsheets/d/1KOUqJ2rNl_jZ4KBVTsR-4QmG1zAdKNo7QXJS1uogQVo/edit?gid=0#gid=0

@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.

​ Read More
In-reply-to » 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.

@movq@www.uninformativ.de :-D

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/.

​ Read More

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/

Image

​ Read More
In-reply-to » 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.

@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 :-)

​ Read More
In-reply-to » Heute auf dem Heimweg roch es leicht gĂŒllig vom Stadtrand her. Is denn all wedder GĂŒlletied? đŸ„đŸ–đŸ’©đŸšœđŸ€ą https://m.youtube.com/watch?v=STPvOxUDekU

@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.

​ Read More
In-reply-to » 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.

@eapl.me@eapl.me @bender@twtxt.net @prologic@twtxt.net Not including a photo was a stupid move, sorry. There you go:

Image

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

Image

​ Read More
In-reply-to » @lyse Nein nein, nichts plattdeutsches. "Eberhardt Eichhörnchen" ist eine nette Alliteration und kommt aus einem Urlaub von vor ein paar Jahren. Auf dem Campingplatz gab es ein Eichhörnchen und der Eberhardt war durch eine Handwerkerwerbung prĂ€sent.

@arne@uplegger.eu Ah, witzige Geschichte! Ich fĂŒrchte, der Eberhardt wird sich nun bei mir auch festsetzen. ;-)

​ Read More

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.

​ Read More
In-reply-to » The other day, after a discussion online, we came to the conclusion that using awk+sed+tr could replace much of the development that requires a database. However, using SQLite to have a SQL syntax isn't a bad idea either. What do you think?

@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.

​ Read More
In-reply-to » 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.

@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.

​ Read More
In-reply-to » It's been ages since the last time we've had as much and as frequent of a rainfall as we've been having this week. The smell, the sounds, the wind pushing against my body ... are taking over my senses with joy, leaving no room for worryℱ (about the possibility of a flood).

@aelaraji@aelaraji.com That’s nice, enjoy it while it lasts! Rain can be something wonderful. Stay safe.

​ Read More
In-reply-to » One of the biggest gripes of the community with the way the threading model currently works with Twtxt v1.2 (https://twtxt.dev) is this notion of:

@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.

​ Read More

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.

Image

https://lyse.isobeef.org/waldspaziergang-2025-03-09/

​ Read More
In-reply-to » 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. :-(

Thanks, @xuu, 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

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.

​ Read More
In-reply-to » Ich fahre gleich zwei Stunden mit dem Zug durch das sonnige Mecklenburg-Vorpommern, um morgen PÜNKTLICH 🐓 mit den Schwiegereltern zur Familienfeier nach ThĂŒringen aufbrechen zu können. Ein Wochenende auf Achse wird das. 🚞🚐😞

@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?

​ Read More
In-reply-to » 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. :-(

@xuu 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
  • controller/
    • feeds.go: uses a Storage
    • feeds_test.go: here I wanted to reuse the newRAMStorage(
) function

I then tried to relocate the newRAMStorage(
) into a

  • teststorage/
    • storage.go: moved here as NewRAMStorage(
)

so that I could just reuse it from both

  • storage/
    • sqlite_test.go: uses testutils.NewRAMStorage(
)
  • controller/
    • feeds_test.go: uses testutils.NewRamStorage(
)

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.

​ Read More

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. :-(

​ Read More
In-reply-to » Hi everyone, I've drafted a Request for Comments (RFC) to improve how threads work in twtxt: https://git.mills.io/yarnsocial/twtxt.dev/issues/18

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. :-)

​ Read More
In-reply-to » 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.

@movq@www.uninformativ.de Luckily, they’re not made of steel as I would not have made it home with such heavy weights. :-D

​ Read More
In-reply-to » A depressing video about the current state of printers that just ends with “fuck this, I’m gonna talk about my cat now”: https://www.youtube.com/watch?v=bpHX_9fHNqE

@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.

​ Read More
In-reply-to » 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.

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.

​ Read More

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.

Image

Image

86 more photos: https://lyse.isobeef.org/wanderung-auf-den-hohenrechberg-2025-03-03/

​ Read More