We got some rain. Not a whole lot, but itās actually cooler now and the temperatures outside are below the ones inside.
Cool, @dce@hashnix.club. Youāre the first one I come across who actually writes Korn shell scripts. :-)
tt. Focusing them just alternates the fore- and background colors. With the old color scheme, I disliked that inline code and code blocks were basically just the opposite of normal text. Hence, unread code was white and read code yellow. I found this often confusing, especially with larger code blocks. Sure, there are the timestamp and author columns that still show the usual white (read) and yellow (unread) background for selected messages, but still.
As an alternative, I also gave a much simpler teal on gray with reversed colors on focus a shot. Hmm, not so sure either. :-?
Unread messages:

Read messages:

@movq@www.uninformativ.de The nice thing about properties is that you can compute and cache things on the fly at first attempt and also ensure validation for writing. But like you said, since itās not obvious that reading or writing might do some more things, itās strongly advised to avoid doing expensive stuff disguised as properties.
I reckon the vast majority of property use cases is to provide read-only access. At least that was my impression when I was doing a lot more in Python.
Personally, I think that this just reads a lot nicer:
oink.my_property
oink.my_property = 42
Than:
oink.get_my_property()
oink.set_my_property(42)
Btw, any field access is implemented using method calls. I might be wrong, but I believe thereās always __getattr__ and __setattr__ involved. 8-)
Unread messages are yellow, while read messages are white in tt. Focusing them just alternates the fore- and background colors. With the old color scheme, I disliked that inline code and code blocks were basically just the opposite of normal text. Hence, unread code was white and read code yellow. I found this often confusing, especially with larger code blocks. Sure, there are the timestamp and author columns that still show the usual white (read) and yellow (unread) background for selected messages, but still.
This is how it was before with unread messages:

Before with read messages:

So, I just reworked the code styles. Not sure if I like that or if it is actually an improvement. Unread code is teal on gray when not in focus and becomes blue on orange when focused. I thought the dark gray code background on a black regular background is still nice and subtle. The same similarity in colors for focused messages meant to go with an orange code background on a yellow regular background. The teal was too light, so went with a blue foreground color:

When read and unfocused, the new color scheme calls for the same code style teal on dark gray. However, with white as the main background for selected messages, I went with a light gray code background and a blue code foreground. Again, the contrast with white and teal wasnāt good enough. Vice versa, blue on dark gray is also not all that readable:

It looks like a parrot. Letās see if I begin to like it.
Iāve been coding again, and this time it might actually be useful to other people! https://codeberg.org/hellfire103/golden-retriever
I trip over this in our code at work all the time.
Python has this concept of āpropertiesā:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
a = Oink()
print(a.my_property)
my_property() is a method but it can be used as if it were a field.
This can also be used to define a setter:
class Oink:
def __init__(self):
self._foo = 3
@property
def my_property(self):
return self._foo
@my_property.setter
def my_property(self, value):
self._foo = 123 * value
Because, for some reason, Python people donāt like getters and setters. Instead, they hide it behind a property.
The result is, when you read this:
a.my_property = 5
print(a.my_property)
You have no idea that this actually calls a method.
@movq@www.uninformativ.de My grief with Java is that itās sooo verbose. Sure, all the enterprise garbage makes it a hell lot more terrible, but even regular Java feels always so lengthy. And back in the days when I was using it daily, I missed so many convenient things in the stdlib after having experienced Pythonās ābatteries includedā. Not sure if or how recent Java versions caught up.
@david@daiwei.me Oh, really? I thought Iāve posted compose view screenshots before. Anyway. Glad you like it as much as I do. :-)
The update interval has always been one second. I just didnāt remember and thus tried to time it by watching the preview update while typing. It felt like roughly under two seconds, but apparently my inner clock was off. After taking the screenshot and then examining it more closely, I noticed that the interval is stated right in the UI. :-D So, I just amended my message and didnāt bother taking a new screenshot. I figured I just leave it alone and see who spots the change, if at all. And, of course, you found the easter egg. Congrats, mate! 8-)
@movq@www.uninformativ.de Looks like subject parsing is broken.
@david@daiwei.me Ramen! Bon appetit.
@balloon-fu-sen@tw.fus.f5.si Not bad, quite a groovy sound.
@zvava@twtxt.net hunter2
tt has a "draft" mode right? You didn't publish, then edit over and over did you? š
@prologic@twtxt.net Not sure if this really counts as a draft mode or this is what you had in mind. I just was in the editor for ages and didnāt close it. tt provides an integrated preview for the rendered message in there. It automatically updates every second.
Hereās a screenshot of the compose view with the conversation context on the top to which to reply to, the editor in the middle and the almost-live preview at the bottom, I hope itās big enough: 
But itās not like I hit the āAdd messageā button in the compose view (the one currently selected on the screenshot), see the message in the conversation tree and then come back into the compose view to continue editing. Thereās no edit functionality in tt. Once the message is appended to my twtxt.txt file on disk, all I can do is edit it with vim. The U+2028 line breaks are really annoying to deal with (Iām sure I could do something about that if I spent the time), so I try to avoid that at all costs.
Once new messages have been added to my local file, I then manually upload the file to my server in a separate terminal. Thereās no upload command integrated into tt. Right from my very first message in the beginning, Iāve always done it exactly like that. Iām used to this and it really doesnāt bother me. But I can see that others might not be fans of that at all. I might add an upload mechanism to tt at some point in the future.
@david@daiwei.me Very nice!
Dear weather gods, can we please also have a decent amount of rain and not just a few drops that only make the humidity even worse?
@david@daiwei.me The stuff in parens is lost on yarnd:

@dce@hashnix.club I like the teal colors in the file manager.
@david@daiwei.me agreed on those. I have also noticed that the buttons are the top (Timeline, Mentions, Follows, Settings) shift a bit when clicked. I am not sure whatās causing that.
@david@daiwei.me Yeah, Oracle is a Dumpster Fire, thatās true. š«¤
Does yarnd still support the old āthreadingā? Letās see.
I really think I should go back to Java.
Writing programs in Python is so exhausting. I want a compiler and I want static typing. No, linters and type checkers and IDEs are not good enough. Compilers catch way more errors in advance.
Rust is also exhausting. Theyāre constantly adding language features and, at the same time, the runtime library remains tiny and you need 3rd party libraries for everything. Many of those are still at version 0.x (SemVer!) and you canāt rely on anything. Often times, you need the latest Rust nightly compiler.
Go is ⦠I donāt like it. And huge binaries.
I like C as a language, but itās too fragile. I want to have a proper HashMap every now and then.
None of the above have good GUI libraries, at least not on Linux.
And then thereās Java. This is my fractal renderer that I wrote over 17 years ago:
https://movq.de/v/fcd3c4e557/vid-1784121825.mp4
Itās fast. It has a GUI with custom widgets and those werenāt even hard to make. It still works without changing a single line of code. The source code files have timestamps from 2009 and I just noticed that the JAR file Iām using in the video was compiled in 2010.
Java as a language is relatively easy to learn and to master. There are few surprises. The source code organization with packages is good. Java API docs are clear and well written.
The JVM ramp-up times have improved considerably:
https://movq.de/v/e7314e521e/vid-1784121998.mp4
This isnāt like the Dark Ages anymore. Might even be usable for some CLI tools.
The only thing where Java really sucks is anything close-ish to the kernel. Try issuing an ioctl() ⦠I couldnāt have made my TUI framework in Java, but then again, I wouldnāt have needed to because Swing already exists and it just works.
@movq@www.uninformativ.de ha ha in this case I think Iām OK with a broken thread ha ha
@prologic@twtxt.net See, thatās what edit/delete is good for. š š¤Ŗ
@movq@www.uninformativ.de yeah itās one of the fundamental principles of Yarn social and everything that Iāve poured into the ecosystem that weāve collectively built here over the last, What is it six or seven years now?
@zvava@twtxt.net oooos š¤£
@david@daiwei.me Thatās a good thing. I still use it heavily, but I also realize that it is addictive. This whole idea of getting likes and boosts is horrible. Seeing ānumber goes upā is inherently addictive design, if you ask me. This should never have been added to a Free Platform like Mastodon, and Iām glad that twtxt doesnāt have anything like it.
@movq@www.uninformativ.de Thatās crazy⦠Do not want!
@david@daiwei.me @prologic@twtxt.net No worries, I was just trying it on for size.
I played it again today (10/12 on first try), but I canāt say that I love the format of the āshare linkā (the unnecessary yellow and green circles).
I think if I did want to post daily scores or something (for posterity), Iād likely setup a separate feed just for my āachievementsā. š
accidentally just pasted my twtxt.net password in the compose field
@misskatie@twtpub.com Awesome!!! Welcome š¤
and Iām not really sure Iāll ever add an edit or delete button to be honest š¤£
Hmmm
also, just to clarify, we built the hosted Service as the last lowest rung ladder for non-technical people. I fully expect most technical people will spin up their own publishing backend or use Github or similar so that long-term the ecosystem still remains very much decentralized.
@balloon-fu-sen@tw.fus.f5.si yes I wouldnāt go and change your feeds location the location a fourth time thatās for sure! š¤£
Just finished putting together my new cwm setup! 
@lyse@lyse.isobeef.org Ha, I technically never went too far, just havenāt been too actively posting admittedly :<
@david@daiwei.me Thank you! š
twtxt.net senders š¤¦āāļø). Fixed + deployed now š„³ give the hosted feed another go, it'll land this time š¤
@david@daiwei.me Found it. Some bugs in the āclaim limiterā. Fixingā¦
@david@daiwei.me Please write an issue for this š I donāt mind which way we go!
Ahh crap, I didnāt take any š
I also set this to local years ago:
$ go env | grep TELEM
GOTELEMETRY='local'
When this came out I was also outraged. But it doesnāt go anywhere, there are no network connections. It is effectively āoffā like this.
@lyse@lyse.isobeef.org Ahh yes, but tt has a ādraftā mode right? You didnāt publish, then edit over and over did you? š
@lyse@lyse.isobeef.org LOL š
letās just see if something like this crops up again.
I will very likely add a way to delete your feed(s) from the search engine, because I do thing thatās important. But as Art 17 points out, we canāt really guaranteed deletion in everyoneās caches around the planet haha š
The only place where this would be an issue is the Twtxt Search Engine ā But as the GDPR also points out:
Art. 17
The one place the āit propagated and I canāt recall itā problem is legally acknowledged is Art. 17(2), and it explicitly scales to whatās technically feasible:
āā¦the controller, taking account of available technology and the cost of implementation, shall take reasonable steps, including technical measures, to inform controllers which are processing the personal data that the data subject has requested the erasureā¦ā
Best-effort, given the technology. A decentralised, append-only, content-addressed feed is the available technology, and its limits are baked into the standard the law applies. Nobody ā not the user, not you ā is obliged to guarantee every cached copy vanishes.
So just because I enjoy this kind of thing (looking into laws and trying to understand themā¦):
GDPR is about roles, not ownership
Thereās no property right in personal data under GDPR. The whole regime hangs on three roles:
- Data subject ā the person the data is about.
- Controller (Art. 4(7)) ā āthe natural or legal person ⦠which, alone or jointly with others, determines the purposes and means of the processing of personal data.ā
- The rights in Arts. 16 and 17 are exercised by a data subject against a controller. They compel a third party to rectify or erase. They are not self-executing duties that a piece of software must expose.
Thatās the key. In your architecture, for a userās own posts about themselves sitting in their own feed on their own device:
- the user is the data subject, and
- the user is also the only person ādetermining the purposes and meansā of that data.
There is no third party controller to compel. The āright to erasureā is a right to make someone else delete ā and there is no someone else. It is satisfied the instant the user can change the file. A UI button is a convenience, not a legal requirement. Omitting it removes zero rights, because the data is a plain-text file the user can edit or delete by any means ā editor, sed, git, their file manager. Full practical control is retained; nobody is being denied anything by anyone.
@david@daiwei.me you had to poke me, eh?

@david@daiwei.me You mean, you mean⦠like mowing down a whole rain forest in a thunderstormās brutal heat? :-?
Show us todayās rain. :-)