@prologic@twtxt.net duud use an ad block on youtube.
@eaplmx@twtxt.net This exact thing happened to me last night. I happened to be watching some random Youtube video, then this Ad came on, normally they are short 3-5s ads and I just tolerate them (sometimes) ā But this particular ad was 20+ mins long! Somehow I kept listening to it too, despite my daughter telling me I could hit that āSkip Adā button.
What was it you ask?! š It was one of those testimonial-style, hyped up marketing videos of some product called āGemini 2ā (a currency trading app, allegedly), I kept watching all the way through, it was fantastic! š¤£
Then I went and read up on it! ā¦
Short answer: TOTAL FUCKING SCAM š¤£
@lyse@lyse.isobeef.org @prologic@twtxt.net yeah that was how i did it too. I think ill start using the debug version in new stuff since its been added. My comment was around assigning the result of an anonymous function to a a variable.
I was inclined to let this go so as not to stir anything up, but after some additional thought Iāve decided to call it out. This twt:
is exactly the kind of ad hominem garbage I came to expect from Twitterā¢, and Iām disappointed to see it replicated here. Rummaging through someoneās background trying to find a āgotchaā argument to take credibility away from what a person is saying, instead of engaging the ideas directly, is what trolls and bad faith actors do. Thatās what the twt above does (falsely, I might addāwhatās being claimed is untrue).
If you take issue with something Iāve said, you can mute me, unfollow me, ignore me, use TamperMonkey to turn all my twts into gibberish, engage the ideas directly, etc etc etc. There are plenty of options to make what I said go away. Reading through my links, reading about my organizationās CEOās background, and trying to use that against me somehow (after misinterpreting it no less)? Besides being unacceptable in a rational discussion, and besides being completely ineffective in stopping me from expressing whatever it is you didnāt like, itās creepy. Donāt do that.
@mckinley@twtxt.net really the language authors should have added those to the standard spec by now. That is just obscene.
Right now I have to setup jenny for my timeline. Just added myself to the Registry so that part is done.
(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
}
I have updated my eventDB to have subscriptions! It now has websockets like msgbus. I have also added a in memory store that can be used along side the disk backed wal.
@chronolink@chrono.tilde.cafe Replies are not part of the original twtxt format. They were added later as an extension by Yarn.social: https://dev.twtxt.net/doc/twtsubjectextension.html (only the section āMachine-Parsable Conversation Groupingā is used these days)
lolol actually, Iām now building a quickānādirty repl in C to test some mechanics, ended up implementing a small VM, adding sound asap, letās see where that leads me #crow #raven #lang #coding #sound #livecoding #nyx
started adding follows, decided to keep my list in the header here, hope it helps with discoverability and making new connections :)) #twtxt #community
Alright, check this out. I just kinda completed todayās project of converting a jeans into a saw bag. Itās not fully done, the side seams on the flap need some more hand sewing, thatās for sure. No, I donāt have a sewing machine. Yet?
At first I wanted to put in the saw on the short side, but that would have made for more sewing work and increased material consumption. As a Swabian my genes force me to be very thrifty. Slipping in on the long side had the benefit of using the bottom trouser leg without any modification at all. The leg tapers slightly and gets wider and wider the more up you go. At the bottom itās not as extreme as at the top.
The bag is made of two layers of cloth for extra durability. The double layers help to hide the inner two metal snap fastener counter parts, so the saw blade doesnāt get scratched. Not a big concern, but why not doing it, literally no added efforts were needed. Also I reckon it cuts off the metal on metal clinking sounds.
The only downside I noticed right after I pressed in the receiving ends of the snap fasteners is that the flap overhangs the bag by quite a lot. I fear thatās not really user-friendly. Oh well. Maybe I will fold it shorter and sew it on. Letās see. The main purpose is to keep the folding saw closed, it only locks in two open positions.
Two buttons would have done the trick, with three I went a bit overkill. In fact the one in the middle is nearly sufficient. Not quite, but very close. But overkill is a bit my motto. The sides making up the bag are sewed together with like five stitch rows. As said in the introduction, the flap on the hand needs some more love.
Oh, and if I had made it in a vertical orientation I would have had the bonus of adding a belt loop and carrying it right along me. In the horizontal layout thatās not possible at all. The jeans cloth is too flimsy, the saw will immediately fall out if I open the middle button. Itās not ridgid enough. Anyways, I call it a success in my books so far. Definitely had some fun.
Hereās a preview of some themes Iām adding to https://mkws.sh https://files.mills.io/download/plain.jfif, https://files.mills.io/download/mono.jfif !
I have uBlockOrigin on desktop and https://vancedapp.com/ on android. I never see ads on YouTube.
On SmartTV however this would be a nice addition.
Youāre right @ullarah@txt.quisquiliae.com I just watched Australia Post Outrage: Did She Need To Go? and I do believe Iāll start adding this to my āwatchlistā ā I donāt use Youtube specifically (because privacy eroding garbage); but the content this guy produces is awesome! š
Scotty from marketing really needs to be fired! Can we even fire Prime Ministers besides calling an election? š¤ The more you dig into our #Australian #Government the more you realize just how fucking corrupt they all are and have been over so many years. How?! š¤¦ā
My nutritional supplements aim should be:
- 1 or 1.5 cups of lentils (or any beans you might like better).
- 2 or 2.5 cups of bitter greens.
- 1 cup of your favourite protein (or an egg), grilled, or fried with a little of olive oil.
- 1 or 2 tomatoes, or a handful if of the cherry type.
- No added sugars. If it is sweet, make it have fibre.
- No added salt (or very little and ionised), as salt is everywhere.
Related, I tried wild rice for the first time yesterday. It was different, in a good way.
@movq@www.uninformativ.de Yup. Added all the language ones, and bam, working like a charm!
@quark@twtxt.netbros.com Answering to myself: it doesnāt. @movq@www.uninformativ.de, would that be something that it could be added?
@quark@twtxt.netbros.com I have removed the cron job, and added jenny -f
to the small script that starts mutt with the .muttrc-jenny
file. That way when I open, it refresh the feed before. Letās see how it goes.
i keep debating this in my head. i reckon the comradeās display device should be modular anyway, the display buffer is just that. doesnāt matter if thereās a TFT or an e(ink|paper) display on the other side. multiplexing uxn displays would be cool, but that would mean adding a display buffer cache for every instance and i donāt know if i want to have that much memory dedicated to swapping displays. iām on board with using uxn as a common runtime, but FRAM modules have six pins and top out at 256k (afaik). i only have 88 pins to work with so iāll have to place some hard limits on how many display devices the runtime allows.
No, Iām still doing them manually. š¤£š¤¦š» But I do think they are a good idea and will be adding them, I just havenāt gotten around to finding a compatible implementation of the hash yet.
Added to the fun.
@prologic@twtxt.net the meta info on the top I added manually. itās following what I have seen from some other twtxt feeds. the new parser will read them.
@xuu@txt.sour.is Btw⦠I noticed your pod has some changed Iām not familiar with, for example you seem to have added metadata to the top of feeds. Can you enumerate the improvements/changes youāve made and possibly letās discuss contributing them back upstream? :D
@prologic@twtxt.net in theory shouldnāt need to let users add feeds.. if they get mentioned by a tracked feed they will get added automagically. on a pod it would just need to scan the twtxt feed to know about everyone.
@prologic@twtxt.netdd ooh I am adding that to my test suite
@prologic@twtxt.net def would be a wider discussion on preventing the pod from adding its own key to a users device list. Or using device keys to authenticate instead of user/pass.
@prologic@twtxt.net an added benefit of the avatar:
would be the user could put their gravatar/libravatar image url like https://key.sour.is/avatar/01bc6186d015218c23dec55447e502e669ca4c61c7566dfcaa1cac256108dff0
List of AD computers that were created by regular users https://gist.github.com/dstreefkerk/377c063bd3083e2c6eecf3f7afdbf6da
Added clients and articles sections and added domgoergenās twtxt.txt to https://indieweb.org/twtxt
Added myself to the user list at https://github.com/mdom/we-are-twtxt
Added an h-card to my site. https://indieweb.org/h-card
It seems that adding Pusheen stickers to a Chromebook will cause it to stop booting. The more you knowā¦