@mana@yarn.girlonthemoon.xyz i LOVEEEE her 2018 BD event sm
yarnd
UI/UX experience (for those that use it) and as "client" features (not spec changes). The two ideas are quite simple:
This expands the usefulness of Twtxt / Yarn.social to:
- Sharing small posts
- Sharing links
- Sharing media
- Having long conversations
- Voting on topics, opinions or decisions
- RSVPing to virtual or physical events
#event:abc123 RSVP: yes +1
yarnd
UI/UX experience (for those that use it) and as "client" features (not spec changes). The two ideas are quite simple:
#event:abc123 Go Meetup – Sat Apr 27, 3pm @ Darling Harbour
💡 I had this crazy idea (or is it?) last night while thinking about Twtxt and Yarn.social 😅 There are two things I think that could be really useful additions to the yarnd
UI/UX experience (for those that use it) and as “client” features (not spec changes). The two ideas are quite simple:
- Voting – a way to cast, collect a vote on a decision, topic or opinion.
- RSVP – a way to “rsvp” to a virtual (pr physical) event.
Both would use “plain text” on top of the way we already use Twtxt today and clients would render an appropriate UI/UX.
SDL2 ported to Mac OS 9
Well, this you certainly don’t see every day. This is a “rough draft” of SDL2 for MacOS 9, using CodeWarrior Pro 6 and 7. Enough was done to get it building in CW, and the start of a “macosclassic” video driver was created. It DOES seem to basically work, but much still needs to be done. Event handling is just enough to handling Command-Q, there is no audio, etc etc etc. ↫ A cast of thousands The hardest part was a video driver for the classic Mac OS, which had to be created mostly f … ⌘ Read more
There’s a secret art easter egg thing, hidden on my website ( https://thecanine.ueuo.com ), for this years April fools event - it’s been there for a few weeks, but now I can finally give hints.
In a couple of days I’ll be giving a talk about #twtxt https://www.meetup.com/es-ES/python-valencia-meetup/events/306769708/
I saw 100% I/O wait in htop today but couldn’t find a process which actually does I/O. Turns out, I/O wait isn’t what it used to be anymore:
https://lwn.net/Articles/989272/
In my case, it was mpd which triggered this:
https://github.com/MusicPlayerDaemon/MPD/issues/2241
mpd doesn’t actually do anything, it just sits there and waits for events. To my understanding, this is similar to something blocking on read()
. I’m not quite sure yet if displaying this as I/O wait (or “PSI some io”) is intentional or not – but it sure is confusing.
Yeah. It’s mostly a parser at the moment. But I have extended the calendar.txt to include todo.txt and a repeat syntax to generate future occurances of events and todos.
do you mind sharing a picture ?
I can’t find something similar here, but my wife gave this one last year, and I’ve been using it a bit. I’d say it’s useful as you’ve shared.
We also have a shared calendar in the kitchen for family events, and it’s working great.
Black swans occur when an event with a high negative impact but low probability occurs.
The big established parties are all bad traitors. I blame them and their actions to help raise AfD. They just [don’t?] give a fuck about the ordinary people, they’re only concerned about their private gain and power.
To a large degree, yes. But I think the media is also equally at fault. There was absolutely no reason to invite AfD people to every event and let them talk. This has been going on for over 10 years. When we give them a stage to spread their hate, are we really surprised that hate spreads … ?
I don’t know the answers to this desaster. I’m beginning to think that people literally just want an outlet for their frustration, nothing more. It’s not about what particular parties actually plan to do. At least I think this applies to people in their 30ies and 40ies.
I should really fix my calender rendering. A two day event only pops up in the first day, but not in the second. When extended to three days, it correctly shows up in all three days. Meh.
Holly Hill - Long run: 12.06 miles, 00:09:43 average pace, 01:57:15 duration
did not sleep last night. the bed was not too comfortable and i was burning up for some reason. the run went well. it was a decent temperature and i kept the pace pretty moderate (mainly around a 9:30). hit two bridges going back-and-forth between daytona. i did walk a bit around mile ten to recollect myself but a good run nonetheless.
my daughter got first all-around in her gymnastic meet and did really well on all events, too!
#running
Pinellas County - 6 mile run: 6.05 miles, 00:08:49 average pace, 00:53:18 duration
pretty good run. been tough logging this last week or so with all the work, but its going well. there was a lot of people waiting to get in to walsingham park today… probably the 5km event i saw posted a couple of weeks ago. i need to be better about planning these things.
#running
Why Upstart from Ubuntu failed
Upstart was an event-based replacement for the traditional System V init (sysvinit) system on Ubuntu, introduced to bring a modern and more flexible way of handling system startup and service management. It emerged in the mid-2000s, during a period when sysvinit’s age and limitations were becoming more apparent, especially with regard to concurrency and dependency handling. Upstart was developed by Canonical, the company behind Ubuntu, with the aim of reducing boot time … ⌘ Read more
@movq@www.uninformativ.de Over-ear headphones make moving and turning around quite uncomfortable. But it looks like you’re having a very calm sleep, unlike me, who likes to turn a bit on the side every now and then, too.
When I use noise cancelling devices in bed (absolutely required at scouting events), it’s simple ear plugs. I got myself a big pack of 200 pairs nine and a half years ago (oh wow, didn’t realize I have them this long). A lifetime supply. Especially when I reuse them two, three dozen times or so before they’re worn out and don’t seal properly anymore.
@eapl.me@eapl.me A way to have a more bluesky’ish handles in twtxt could be to take inspiration from Bridgy Fed and say: If NICK = DOMAIN then only show @DOMAIN
So instead of @eapl.me@eapl.me it will just be @eapl.me
And it event seem that it will not break webfinger lookup: https://webfinger.net/lookup/?resource=%40darch.dk (at least not for how I’ve implemented webfinger on my sever for a single user;)
ES enrichment… À lire. https://glue.ghost.io/leveraging-threat-intel-for-event-enrichment-in-security-onion/
hmm i think i would want something that has support for repeating events. otherwise it looks neat.
What’s made you unlock twitch.tv?
A couple of events where my only choices for watching them are: Twitch, Youtube or Fartbook.
What are you doing differently?
TL;DR: I stopped going there unless I have to for the reason above.
I used to spend Waaaaay too much time on the platform. I had a whole setup using Streamlink, MPV and Chatterino where sometimes, I’d have up to 10 concurrent open streams all day long on a secondary monitor (thanks to tiling window managers’ magic), some I was interested in watching, some I moderated for a couple of friends and some I’ve had open just for support (helping new streamers in the community with their numbers till they take off and such). Theeen something happened to one of my loved ones, so I had to stop all the nonsense and spend that time and attention with the person who deserves it the most. I blocked the platform at first since I had a habit to type twit...
as soon as I opened a browser 😅 (addiction is real) and now I don’t. (That reflex got replaced with typing twtxt...
instead 😂)
👋 Reminder folks of the upcoming Yarn.social monthly online meetup:
- Event: Yarn.social Online Meetup
- When: 23rd November 2024 at 12:00PM UTC (midday)
- Where: Mills Meet : Yarn.social
gemini calls the request-response cycle a transaction in the spec. since trasactions are not cached, we have this problem where we can’t tell if anything was updated without fetching it and we can’t indicate how often a client should expect the content to be valid. the most common solution right now to just to keep requesting the resource until it changes or stops existing, which isn’t ideal. this sort of update notification model is interesting because it re-frames your thinking into something more like event sourcing. you end up needing to add an event queue and dispatch to the server, which is a bit more complex on the server side than plain static files, but the client stays the same. i’m curious to see what kind of systems could be built on this gemini message queue concept.
that’s a neat solution to the dead old feeds problem. pull-once-once-on-notify seems to fit the gemini tx model better than scraping pages on a cron timer. i don’t have a mechanism in my setup to produce that event yet other than the cron that rebuilds the capsule periodically, but that’s just a stand-in for not having any CI rn and especially not a CI that works with fossil.
👋 Reminder folks of the upcoming Yarn.social monthly online meetup:
I hope to see @david@collantes.us @movq@www.uninformativ.de @lyse@lyse.isobeef.org @xuu@txt.sour.is @sorenpeter@darch.dk and hopefully others too @aelaraji@aelaraji.com @falsifian@www.falsifian.org and anyone else that sees this! 🙏 We’re hopefully going to primarily discuss the future of Twtxt and the last few weeks of discussions 🤣
- Event: Yarn.social Online Meetup
- When: 28th September 2024 at 12:00pm UTC (midday)
- Where: Mills Meet : Yarn.social
- Cadence: 4th Saturday of every Month
Agenda:
- Let’s talk about the upcoming changes to the Twtxt spec(s)
- See #xgghhnq
- See #xgghhnq
the new post-quantum encryption algos have dope names CRYSTALS-Kyber, CRYSTALS-Dilithium, SPHINCS+, FALCON https://www.nist.gov/news-events/news/2023/08/nist-standardize-encryption-algorithms-can-resist-attack-quantum-computers
Celestial Event
⌘ Read more
@movq@www.uninformativ.de This outage did affect me, though not much, via the university where my wife teaches and where I teach sometimes. They actually sent out an alert in their emergency alert system (the one they use to alert people of extreme weather events and bomb threats, mostly), telling people that all IT systems were down.
A friend of mine elsewhere pointed out that they pushed this change on a Friday, which of course no software developer with any experience would ever, ever, ever do. I have to assume there’s some toxic management at CrowdStrike, but who knows. Even more reasons to sympathize with the poor folks who are probably going to be working nights and weekends to clean up this mess.
Chasing
⌘ Read more
👋 Okay folks, let’s startup the Yarn.social calls again.
- Event: Yarn.social Online Meetup
- When: 25th May 2024 at 12:00pm UTC (midday)
- Where: Mills Meet : Yarn.social
- Cadence: 4th Saturday of every Month
Agenda:
Anything we want to talk about. Twtxt, Yarn, self hosting, cool stuff you’ve been working on. chit-chat, whatever 😅
@lyse@lyse.isobeef.org They sure are silly at times. :-) You really have to combine this event with something else, like learning a new language. Otherwise it gets boring real quick.
What I absolutely love about AoC is that it’s – indeed – a bit like school. 😅 The problems are well-defined, the inputs are well-defined, and there is a definite answer. It’s either right or wrong – period. Compared to real life and work, I welcome this very much. 🤣
@xuu@txt.sour.is Ah, you went with the “scanning” approach as well. I did that, too.
It’s quite surprising to see (imho) how many people on reddit started substituting strings (one
becomes 1
etc.). That makes the puzzle much harder by introducing nasty corner cases.
(Maybe I was just lucky this time to pick the correct approach right from the start. 🤣 Or maybe it’s a bit of experience from doing past AoC events …)
Talking in the local dev group about twtxt. Let’s see if new hackers join the conversation.
Dendrochronology
⌘ Read more
Let’s be clear here. Daniel Penny allegedly choked a black man, Jordan Neely, to death on a subway car. Neely was being loud, but he was not physically threatening anybody and did not have a weapon. In any other context, this would be called “murder”, at the very least, “manslaughter” if one were being gracious. Because of the US’s history, a white man murdering a black man in sight of the public is oftentimes, and rightfully, called a “lynching”. It has a public, political purpose amounting to terrorism.
Daniel Penny was allowed to go free for awhile after this event. He is only now facing accountability, having been recently indicted (arrested and charged with a crime) as he should have been day of. And here is racist right-wing toadie Ben Shapiro saying that Daniel Penny–the white alleged killer–is the one being lynched. Not the black man who was allegedly murdered by Penny in view of the public, and who is now dead. Penny himself, who is still very much alive.
@prologic@twtxt.net, I don’t know how you go on defending Ben Shapiro, but in the context of US society, what Shapiro is saying is reprehensible and unacceptable. He’s a right-wing troll with disgusting, not to mention flat out stupid, opinions.
@abucci@anthony.buc.ci buuuuut it show when winter!
In the time scale viewed from the planets perspective, the climate has changed many many times.. The issue is whether that change that will inevitability come is hospitable to us meat bags. Or if we are doomed to take part in the next mass extinction event.
I was listening to an O’Reilly hosted event where they had the CEO of GitHub, Thomas Dohmke, talking about CoPilot. I asked about biased systems and copyright problems. He, Thomas Dohmke, said, that in the next iteration they will show name, repo and licence information next to the code snippets you see in CoPilot. This should give a bit more transparency. The developer still has to decide to adhere to the licence. On the other hand, I have to say he is right about the fact, that probably every one of us has used a code snippet from stack overflow (where 99% no licence or copyright is mentioned) or GitHub repos or some tutorial website without mentioning where the code came from. Of course, CoPilot has trained with a lot of code from public repos. It is a more or less a much faster and better search engine that the existing tools have been because how much code has been used from public GitHub repos without adding the source to code you pasted it into?
From my small experience in writing an event database, I am inclined to agree with this.
Historical Dates
⌘ Read more
(cont.)
Just to give some context on some of the components around the code structure.. I wrote this up around an earlier version of aggregate code. This generic bit simplifies things by removing the need of the Crud functions for each aggregate.
Domain ObjectsA domain object can be used as an aggregate by adding the event.AggregateRoot
struct and finish implementing event.Aggregate. The AggregateRoot implements logic for adding events after they are either Raised by a command or Appended by the eventstore Load or service ApplyFn methods. It also tracks the uncommitted events that are saved using the eventstore Save method.
type User struct {
Identity string ```json:"identity"`
CreatedAt time.Time
event.AggregateRoot
}
// StreamID for the aggregate when stored or loaded from ES.
func (a *User) StreamID() string {
return "user-" + a.Identity
}
// ApplyEvent to the aggregate state.
func (a *User) ApplyEvent(lis ...event.Event) {
for _, e := range lis {
switch e := e.(type) {
case *UserCreated:
a.Identity = e.Identity
a.CreatedAt = e.EventMeta().CreatedDate
/* ... */
}
}
}
Events
Events are applied to the aggregate. They are defined by adding the event.Meta
and implementing the getter/setters for event.Event
type UserCreated struct {
eventMeta event.Meta
Identity string
}
func (c *UserCreated) EventMeta() (m event.Meta) {
if c != nil {
m = c.eventMeta
}
return m
}
func (c *UserCreated) SetEventMeta(m event.Meta) {
if c != nil {
c.eventMeta = m
}
}
Reading Events from EventStore
With a domain object that implements the event.Aggregate
the event store client can load events and apply them using the Load(ctx, agg)
method.
// GetUser populates an user from event store.
func (rw *User) GetUser(ctx context.Context, userID string) (*domain.User, error) {
user := &domain.User{Identity: userID}
err := rw.es.Load(ctx, user)
if err != nil {
if err != nil {
if errors.Is(err, eventstore.ErrStreamNotFound) {
return user, ErrNotFound
}
return user, err
}
return nil, err
}
return user, err
}
OnX Commands
An OnX command will validate the state of the domain object can have the command performed on it. If it can be applied it raises the event using event.Raise() Otherwise it returns an error.
// OnCreate raises an UserCreated event to create the user.
// Note: The handler will check that the user does not already exsist.
func (a *User) OnCreate(identity string) error {
event.Raise(a, &UserCreated{Identity: identity})
return nil
}
// OnScored will attempt to score a task.
// If the task is not in a Created state it will fail.
func (a *Task) OnScored(taskID string, score int64, attributes Attributes) error {
if a.State != TaskStateCreated {
return fmt.Errorf("task expected created, got %s", a.State)
}
event.Raise(a, &TaskScored{TaskID: taskID, Attributes: attributes, Score: score})
return nil
}
Crud Operations for OnX Commands
The following functions in the aggregate service can be used to perform creation and updating of aggregates. The Update function will ensure the aggregate exists, where the Create is intended for non-existent aggregates. These can probably be combined into one function.
// Create is used when the stream does not yet exist.
func (rw *User) Create(
ctx context.Context,
identity string,
fn func(*domain.User) error,
) (*domain.User, error) {
session, err := rw.GetUser(ctx, identity)
if err != nil && !errors.Is(err, ErrNotFound) {
return nil, err
}
if err = fn(session); err != nil {
return nil, err
}
_, err = rw.es.Save(ctx, session)
return session, err
}
// Update is used when the stream already exists.
func (rw *User) Update(
ctx context.Context,
identity string,
fn func(*domain.User) error,
) (*domain.User, error) {
session, err := rw.GetUser(ctx, identity)
if err != nil {
return nil, err
}
if err = fn(session); err != nil {
return nil, err
}
_, err = rw.es.Save(ctx, session)
return session, err
}
Progress! so i have moved into working on aggregates. Which are a grouping of events that replayed on an object set the current state of the object. I came up with this little bit of generic wonder.
type PA[T any] interface {
event.Aggregate
*T
}
// Create uses fn to create a new aggregate and store in db.
func Create[A any, T PA[A]](ctx context.Context, es *EventStore, streamID string, fn func(context.Context, T) error) (agg T, err error) {
ctx, span := logz.Span(ctx)
defer span.End()
agg = new(A)
agg.SetStreamID(streamID)
if err = es.Load(ctx, agg); err != nil {
return
}
if err = event.NotExists(agg); err != nil {
return
}
if err = fn(ctx, agg); err != nil {
return
}
var i uint64
if i, err = es.Save(ctx, agg); err != nil {
return
}
span.AddEvent(fmt.Sprint("wrote events = ", i))
return
}
This lets me do something like this:
a, err := es.Create(ctx, r.es, streamID, func(ctx context.Context, agg *domain.SaltyUser) error {
return agg.OnUserRegister(nick, key)
})
I can tell the function the type being modified and returned using the function argument that is passed in. pretty cray cray.
Hi, I am playing with making an event sourcing database. Its super alpha but I thought I would share since others are talking about databases and such.
It’s super basic. Using tidwall/wal as the disk backing. The first use case I am playing with is an implementation of msgbus. I can post events to it and read them back in reverse order.
I plan to expand it to handle other event sourcing type things like aggregates and projections.
Find it here: sour-is/ev
@prologic@twtxt.net @movq@www.uninformativ.de @lyse@lyse.isobeef.org
Health Data
⌘ Read more
#event Upcomming Meetup in Copennhagen: algolab(the_art_of_live_coding) @ Støberiet / Computer Klub
Apple Event for 18 October 2021, 10:00 PDT, 13:00 EDT begins. Commentary will stream as replies to this twt. I might miss things here and there, as I will also be on a work meeting from 13:00 to 14:00 EDT.
Apple Store online down before today’s event. Less than two hours till it goes live!