# 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 235274
# self = https://watcher.sour.is?offset=232834
# next = https://watcher.sour.is?offset=232934
# prev = https://watcher.sour.is?offset=232734
@lyse Sorry I didn't mean to upset you or anyone here in the community. I am/was merely trying to solve what I perceive to be a problem and an ask in the community:

> How do I know what a hash refers to?

I believe the reason for this stems from a curiosity of the user of whether they _might_ find that thread interesting or whether there are new interested feeds to follow?

Although my idea increases complexity slightly (_introducing a new concept_) I don't think it's particular hard to understand, reason about or implement (_complicated_). One could even even make the implementation quite simple in fact.

Either way, the idea of a service (_cantralised_) or participating clients/registries (_distributed_) providing reverse hash lookups doesn't sound too bad really.

What do you propose to solve the above problem? 🤔
I went for a run this morning after months of not running and it feels so good!
@prologic 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.
[47°09′14″S, 126°43′22″W] Transfer 25% complete...
Das Gemälde eines Waldgasthofes vor einer holzvertäfelten Wand Das mitteldeutsche Twin Peaks.
[47°09′31″S, 126°43′51″W] Carrier too weak
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:

> What is this hash?
> What does it refer to?

Idea: Why can't we all agree to implement a simple URI scheme where we host our Twtxt feeds?

That is, if you host your feed at https://example.com/twtxt.txt -- Why can't or could you not also host various JSON files (_let's agree on the spec of course_) at https://example.com/twt/<hash> ? 🤔

That way we solve this problem in a truly decentralised way, rather than every relying on yarnd pods alone.
@unexplained_mysteries Interesting article on the philosophy of thougjts 🙌
Power outages throughout south east queensland (map)
5 miles: 5.18 miles, 00:09:18 average pace, 00:48:08 duration
finishing the 13 miles. this felt really easy on tired legs.
#running #treadmill
5 miles: 5.18 miles, 00:09:18 average pace, 00:48:08 duration
finishing the 13 miles. this felt really easy on tired legs.
#running #treadmill
5 miles: 5.18 miles, 00:09:18 average pace, 00:48:08 duration
finishing the 13 miles. this felt really easy on tired legs.
#running #treadmill
🧮 USERS:1 FEEDS:2 TWTS:1271 ARCHIVED:85113 CACHE:2793 FOLLOWERS:18 FOLLOWING:14
Ontem voltei a pegar no Django depois de 10 anos para um side-project. É como se fosse um regresso a um lugar onde um dia se foi feliz.

Tem a sua personalidade e tal, mas continuo a adorar os seus pormenores e as suas escolhas sobre como deve funcionar uma framework web.

Também fiquei muito agradado de ver que muito pouco mudou desde há uma década no que toca à forma fundamental como o Django faz as coisas. Talvez isso não seja apreciado pela juventude habituada a ciclos de upgrade rápidos e drásticos, mas pra mim foi um grande alívio ver que não tenho de me atualizar muito para montar um pequeno projeto.

Há gente djangueira por aí?

#python #django
Ontem voltei a pegar no Django depois de 10 anos para um side-project. É como se fosse um regresso a um lugar onde um dia se foi feliz.

Tem a sua personalidade e tal, mas continuo a adorar os seus pormenores e as suas escolhas sobre como deve funcionar uma framework web.

Também fiquei muito agradado de ver que muito pouco mudou desde há uma década no que toca à forma fundamental como o Django faz as coisas. Talvez isso não seja apreciado pela juventude habituada a ciclos de upgrade rápidos e drásticos, mas pra mim foi um grande alívio ver que não tenho de me atualizar muito para montar um pequeno projeto.

Há gente djangueira por aí?

#python #django
Ontem voltei a pegar no Django depois de 10 anos para um side-project. É como se fosse um regresso a um lugar onde um dia se foi feliz.

Tem a sua personalidade e tal, mas continuo a adorar os seus pormenores e as suas escolhas sobre como deve funcionar uma framework web.

Também fiquei muito agradado de ver que muito pouco mudou desde há uma década no que toca à forma fundamental como o Django faz as coisas. Talvez isso não seja apreciado pela juventude habituada a ciclos de upgrade rápidos e drásticos, mas pra mim foi um grande alívio ver que não tenho de me atualizar muito para montar um pequeno projeto.

Há gente djangueira por aí?

#python #django
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.

Rock climber going up the Spielburg

https://lyse.isobeef.org/waldspaziergang-2025-03-09/
[47°09′42″S, 126°43′08″W] Transponder still failing -- switching to analog communication
https://bentsukun.ch/posts/pkgsrc-with-git/ netbsd
@prologic Hahaha, I love that! :-D Something to laugh during these hard times. Hope you're doing alright.
@arne Glückwunsch, das ist in der Tat doch mal eine erfreuliche Abwechslung. :-)
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.*
[47°09′52″S, 126°43′22″W] Transponder malfunction
Pinellas County - Long run: 8.15 miles, 00:11:43 average pace, 01:35:28 duration
had a date night last night and probably drank a bit too much. my wife followed me on the bike while we did some errands as well. hot and humid this afternoon which really dragged me down. i'll finish the rest of the HM at home.
#running
Pinellas County - Long run: 8.15 miles, 00:11:43 average pace, 01:35:28 duration
had a date night last night and probably drank a bit too much. my wife followed me on the bike while we did some errands as well. hot and humid this afternoon which really dragged me down. i'll finish the rest of the HM at home.
#running
Pinellas County - Long run: 8.15 miles, 00:11:43 average pace, 01:35:28 duration
had a date night last night and probably drank a bit too much. my wife followed me on the bike while we did some errands as well. hot and humid this afternoon which really dragged me down. i'll finish the rest of the HM at home.
#running
Vous connaissez coolmaze pour transférer des fichiers? Je ne trouve pas le code source, donc ça ne doit pas être libre. Vous connaîtriez un équivalent, si possible auto-hébergeable? https://coolmaze.io/
Vous connaissez coolmaze pour transférer des fichiers? Je ne trouve pas le code source, donc ça ne doit pas être libre. Vous connaîtriez un équivalent, si possible auto-hébergeable? https://coolmaze.io/
[47°09′02″S, 126°43′14″W] Reading: 1.28 Sv
[47°09′52″S, 126°43′03″W] Storm recedes -- back to normal work
[47°09′51″S, 126°43′15″W] Wind speed: 44kph
❤️ 🎶: Greeting by Kassy
❤️ 🎶: Close I'll be by Kim Na Young
🧮 USERS:1 FEEDS:2 TWTS:1270 ARCHIVED:85107 CACHE:2793 FOLLOWERS:18 FOLLOWING:14
We've now had centimeters of rainfall in the last 24hrs 😱 -- Yesterday afternoon the local creek near us had already gone several inches over the footbridge too! 😱😱
[47°09′12″S, 126°43′24″W] Automatic systems disengaged due to blizzard
re reading so NewRAMStorage(…) is just something that setups your storage and initial data.. that can probably live with storage/sqlite. The point is the storage package does not import the implementations of storage.Storage It just defines the contract for things that use that interface. Now storage/sqlite CAN import storage and not have a circle dep.

It kinda works in reverse for import directions. usually you have your root package that imports things from deeper in the directory structures.. but for the case of interfaces it reverses where the deeper can import from parents but parents cannot import from children.


- app < storage
      < storage/sqlite
      < controller < storage
                   < storage/sqlite
 
- sqlite < storage

- storage X storage/sqlite
❤️ 🎶: A song from the past by Solar, Kassy
@lyse OK. So how I have worked things like this out is to have the interface in the root package from the implementations. The interface doesn't need to be tested since it's just a contract. The implementations don't need to import storage.Storage

- storage/ defines the Storage interface (no tests!)
- storage/sqlite for the sqlite implementation tests for sqlite directly
- storage/ram for the ram implementation and tests for RAM directly
- controller/ can now import both storage and the implementation as needed.


So now I am guessing you wanted the RAM test for testing queries against sqlite and have it return some query response?

For that I usually would register a driver for SQL that emulates sqlite. Then it's just a matter of passing the connection string to open the registered driver on setup.

https://github.com/glebarez/go-sqlite?tab=readme-ov-file#connection-string-examples
[47°09′44″S, 126°43′14″W] Weather forecast alert -- storm from SE
@lyse Das war ein sehr glatter Ritt mit der Bahn. Ebenso heute auf der Autobahn.
(gesendet aus Thüringen)
On my blog: Free Culture Book Club — acoustic (yin) https://john.colagioia.net/blog/2025/03/08/acoustic-yin.html #freeculture #bookclub
[47°09′34″S, 126°43′17″W] --interrupted--
****
¡Feminismo es igualdad!

#8M #DiaInternacionalDeLaMujer #WomenPowerRead more****
@prologic I do feel better, thanks! I'm just late in everything work-related, but at least I can work normally again.
https://www.auntiepdf.com/ #IA #OCR
[47°09′00″S, 126°43′13″W] Weather forecast alert -- storm from W
@emmanuel That's not good mate 😢 Hope you're feeling better? 🤗
I did not forget twtxt... it's just that I was always sick the last months, nothing serious but enough to take all my free time.
[47°09′17″S, 126°43′25″W] Raw reading: 0x67CBDCE1, offset +/-5
So... Cylone Alfred made landfall (_whatever that means_) last night, and I watched it hit my wife's Uncle/Aunt's place on one of the outer islands, then move westwards and sort of fizzle out. It's now been downgrade to a "Tropical Low" (_I guess not good enough for a Cat X anymore?_), but we're still in the Eye of it, and there's still a swirling mass of winds (_just not as fast_). Now we get to look forward to flooding 🤣_
🧮 USERS:1 FEEDS:2 TWTS:1269 ARCHIVED:85097 CACHE:2793 FOLLOWERS:18 FOLLOWING:14
https://galusik.fr/fridayrockmetal/2025-03-07-frm.m3u Tonight #FridayRockMetal playlist
On my blog: Toots 🦣 from 03/03 to 03/07 https://john.colagioia.net/blog/2025/03/07/week.html #linkdump #socialmedia #quotes #week
First #FridayReads of #MarchMysteryMadness #2025 with Stephen Chance's "Septimus and the Minster Ghost" - the second in the series - in a Faber Finds edition. Stephen Chance's "Septimus and the Minster Ghost" in a Faber Finds edition: White cover, grey text surrounded by a red frame.
First #FridayReads of #MarchMysteryMadness #2025 with Stephen Chance's "Septimus and the Minster Ghost" - the second in the series - in a Faber Finds edition. Stephen Chance's "Septimus and the Minster Ghost" in a Faber Finds edition: White cover, grey text surrounded by a red frame.
@arne Hals- und Beinbruch! Die Bahn hat ja nur die vier Feinde: Frühling, Sommer, Herbst und Winter. Wurdest Du heute positiv überrascht?
@prologic 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!
[47°09′03″S, 126°43′25″W] --white noise--
[47°09′48″S, 126°43′07″W] Reading: 1.64000 PPM
@prologic Thank you 😁
@prologic Thank you 😁
@lyse Oh, so *that’s* the problem! 😅*
@lyse Oh, so *that’s* the problem! 😅*
@prologic Brace for impact. 🫣 How stormy is it at the moment?
@prologic Brace for impact. 🫣 How stormy is it at the moment?
@andros I think you've done an amazing job of this client 🙌
You can find the #twtxt-el channel in Libera IRC to talk about the twtxt.el client, I will keep my connection open so you can ask me questions. Thank you!
You can find the #twtxt-el channel in Libera IRC to talk about the twtxt.el client, I will keep my connection open so you can ask me questions. Thank you!
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. 🚞🚐😞
[47°09′28″S, 126°43′12″W] Dosimeter fixed
❤️ 🎶: 風車轉呀轉 by 小阿七
❤️ 🎶: Bida by Jayda
[47°09′14″S, 126°43′13″W] Dosimeter still failing
❤️ 🎶: Loneliness is by Choi Yu Ree
[47°09′47″S, 126°43′42″W] Dosimeter overflow
I'm feeling old and grumpy, I wish I was young and carefree, 30 years ago, at the university, listening to #stereolab 😿
🧮 USERS:1 FEEDS:2 TWTS:1268 ARCHIVED:85090 CACHE:2802 FOLLOWERS:18 FOLLOWING:14
On my blog: Real Life in Star Trek, Birthright, part 1 https://john.colagioia.net/blog/2025/03/06/birthright-1.html #scifi #startrek #closereading
Il y des musiques comme ça... quand on prend le temps de les écouter, ça va mieux. Ce soir, c'est Hotel Californa des Eagles.
Il y des musiques comme ça... quand on prend le temps de les écouter, ça va mieux. Ce soir, c'est Hotel Californa des Eagles.
[lang=es] definitivamente es una buena llamada de atención para promover más donaciones a proyectos opensource. La verdad apoyo menos proyectos de los que 'debería', por el valor que me ofrecen.

Una opinión pragmática es que hay la libertad de no pagar, pero también esto nos debería llevar a que tenemos la libertad de SÍ reconocer los proyectos que nos dan valor, por medio de un donativo puntual o constante. Adaptarnos al contexto de lo que estamos ofreciendo.

Mi chava trabaja en Asociaciones Civiles (tipo OSALs/ONGs) y es un reto pedir donativos, por lo que es común pedir 'Cuotas de recuperación' pues ayudan a valorar más el servicio, y a que fluya el donativo. Creo que se puede hacer algo así en el código libre, apelando a diferentes motivadores en los usuarios.
[47°09′14″S, 126°43′59″W] Dosimeter malfunction
@movq "Thermometer must not be installed near aircraft turbine exhaust."
@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.*
[47°09′17″S, 126°43′48″W] Waiting for carrier
"Feminism is about examining systems" — @Felienne@Felienne

Also brilliantly put: "[...] By the way, the image of feminists being complainers is not something that appeared out of thin air, but was constructed by people opposing feminism [...]"

https://www.felienne.com/archives/8470

UPDATE: Looks like posting on feminism attracts some ugly replies and I have blocked 3 users already... that's useful in a sense.
Roy Ayers: NPR Music Tiny Desk Concert

https://www.youtube.com/watch?v=CghK8iVUHBs
**** ⌘ Read more****
Hacer software código opensource es desafiante y paulatinamente desgasta a su autor. Todo comienza con pasión y entusiasmo, por supuesto. Si logras repercusión, te enfrentas a una carrera de fondo que muchos terminan abandonando por las demandas constantes de usuarios que, a menudo, no valoran el trabajo ni contribuyen de manera significativa. Por mencionar un caso reciente: Hector Martin. Líder del proyecto Asahi Linux, quien dedicó años a adaptar Linux para los procesadores Apple Silicon, un logro técnico impresionante. Sin embargo, terminó renunciando debido a la presión de usuarios que exigían soporte y mejoras como si fueran clientes pagos.

La mayoría de los mantenedores no reciben ningún soporte económico. Solo unos pocos proyectos logran sostenibilidad financiera a través de patrocinios, mientras que la mayoría de los desarrolladores terminan con un segundo empleo no remunerado.

Sin un cambio en la forma en que se valora y apoya los proyectos Opensource, y no solo hablo de las grandes empresas multimillonarias. Sería una perdida para todos si acabaremos con un ecosistema de software archivado y abandonado.

Ahora te paso la pelota a ti, ¿cuando fue la última vez que apoyaste a un mantenedor de software opensource?

#opensource #software #sostenibilidad
Hacer software código opensource es desafiante y paulatinamente desgasta a su autor. Todo comienza con pasión y entusiasmo, por supuesto. Si logras repercusión, te enfrentas a una carrera de fondo que muchos terminan abandonando por las demandas constantes de usuarios que, a menudo, no valoran el trabajo ni contribuyen de manera significativa. Por mencionar un caso reciente: Hector Martin. Líder del proyecto Asahi Linux, quien dedicó años a adaptar Linux para los procesadores Apple Silicon, un logro técnico impresionante. Sin embargo, terminó renunciando debido a la presión de usuarios que exigían soporte y mejoras como si fueran clientes pagos.

La mayoría de los mantenedores no reciben ningún soporte económico. Solo unos pocos proyectos logran sostenibilidad financiera a través de patrocinios, mientras que la mayoría de los desarrolladores terminan con un segundo empleo no remunerado.

Sin un cambio en la forma en que se valora y apoya los proyectos Opensource, y no solo hablo de las grandes empresas multimillonarias. Sería una perdida para todos si acabaremos con un ecosistema de software archivado y abandonado.

Ahora te paso la pelota a ti, ¿cuando fue la última vez que apoyaste a un mantenedor de software opensource?

#opensource #software #sostenibilidad
Palavras de Francisco Ferreira na mais recente newsletter da #ZERO :

"Há poucas semanas, esta nova Comissão (apesar da mesma Presidente Ursula von der Leyen), apresentou o chamado pacote legislativo “omnibus”. [...]
A proposta #Omnibus pretende alterar três pilares fundamentais do Pacto Ecológico Europeu - a Diretiva de Dever de Diligência das Empresas em Sustentabilidade (#CSDDD), a Diretiva de Comunicação de Informações de Sustentabilidade das Empresas (#CSRD) e o Regulamento de Taxonomia. Tal pode comprometer os objetivos climáticos e sociais da União Europeia. O argumento da simplificação regulatória, usado pela Comissão Europeia, vai, na prática, resultar no enfraquecimento de regras fundamentais que garantem transparência empresarial, redução de emissões e proteção dos direitos humanos nas cadeias de fornecimento globais. Além disso, essa revisão legislativa ameaça as empresas que já investiram na transição sustentável, favorecendo aquelas que ainda não se adaptaram às exigências ambientais e sociais.

Quando a Europa deveria ser um farol à escala mundial, num mundo ameaçado por enormes crises ambientais, estamos afinal a retroceder em áreas fundamentais para o futuro."
Palavras de Francisco Ferreira na mais recente newsletter da #ZERO :

"Há poucas semanas, esta nova Comissão (apesar da mesma Presidente Ursula von der Leyen), apresentou o chamado pacote legislativo “omnibus”. [...]
A proposta #Omnibus pretende alterar três pilares fundamentais do Pacto Ecológico Europeu - a Diretiva de Dever de Diligência das Empresas em Sustentabilidade (#CSDDD), a Diretiva de Comunicação de Informações de Sustentabilidade das Empresas (#CSRD) e o Regulamento de Taxonomia. Tal pode comprometer os objetivos climáticos e sociais da União Europeia. O argumento da simplificação regulatória, usado pela Comissão Europeia, vai, na prática, resultar no enfraquecimento de regras fundamentais que garantem transparência empresarial, redução de emissões e proteção dos direitos humanos nas cadeias de fornecimento globais. Além disso, essa revisão legislativa ameaça as empresas que já investiram na transição sustentável, favorecendo aquelas que ainda não se adaptaram às exigências ambientais e sociais.

Quando a Europa deveria ser um farol à escala mundial, num mundo ameaçado por enormes crises ambientais, estamos afinal a retroceder em áreas fundamentais para o futuro."
Para a #musiquinta de #carnaval uma foto mas sem link, que não encontro estas músicas online.

"Gande Carnaval de Verão 1974" é um disco de Carnaval em que as letras foram alteradas para promover a #Tupperware :-P Foto do disco a ser tocado
Para a #musiquinta de #carnaval uma foto mas sem link, que não encontro estas músicas online.

"Gande Carnaval de Verão 1974" é um disco de Carnaval em que as letras foram alteradas para promover a #Tupperware :-P Foto do disco a ser tocado
Pinellas County - 4 miles: 4.05 miles, 00:08:21 average pace, 00:33:46 duration
the morning is so much better to run. just the getting up part sucks. legs tired from such a quick turn around but felt fine.
#running