Happy 4th! I added fireworks to my ASCII art on https://mckinley.cc/
With Youtube testing a “three strikes and you’re out” policy against people who use ad blockers, I’m also wondering whether Web 2.0 is effectively walled off and I should just give up on it entirely and look elsewhere for information and entertainment.
An official FBI document dated January 2021, obtained by the American association “Property of People” through the Freedom of Information Act.

This document summarizes the possibilities for legal access to data from nine instant messaging services: iMessage, Line, Signal, Telegram, Threema, Viber, WeChat, WhatsApp and Wickr. For each software, different judicial methods are explored, such as subpoena, search warrant, active collection of communications metadata (“Pen Register”) or connection data retention law (“18 USC§2703”). Here, in essence, is the information the FBI says it can retrieve:
Apple iMessage: basic subscriber data; in the case of an iPhone user, investigators may be able to get their hands on message content if the user uses iCloud to synchronize iMessage messages or to back up data on their phone.
Line: account data (image, username, e-mail address, phone number, Line ID, creation date, usage data, etc.); if the user has not activated end-to-end encryption, investigators can retrieve the texts of exchanges over a seven-day period, but not other data (audio, video, images, location).
Signal: date and time of account creation and date of last connection.
Telegram: IP address and phone number for investigations into confirmed terrorists, otherwise nothing.
Threema: cryptographic fingerprint of phone number and e-mail address, push service tokens if used, public key, account creation date, last connection date.
Viber: account data and IP address used to create the account; investigators can also access message history (date, time, source, destination).
WeChat: basic data such as name, phone number, e-mail and IP address, but only for non-Chinese users.
WhatsApp: the targeted person’s basic data, address book and contacts who have the targeted person in their address book; it is possible to collect message metadata in real time (“Pen Register”); message content can be retrieved via iCloud backups.
Wickr: Date and time of account creation, types of terminal on which the application is installed, date of last connection, number of messages exchanged, external identifiers associated with the account (e-mail addresses, telephone numbers), avatar image, data linked to adding or deleting.
TL;DR Signal is the messaging system that provides the least information to investigators.
Honest Government Ad | Labor ⌘ Read more
@prologic@twtxt.net I said nothing about an international violent response. You added that 🤔
If someone punches you in the face over and over again, you don’t stand there and take it to avoid “begetting violence”. You stop them from punching you, and do your best to ensure they never punch you again. That’s not “violence begets violence”. That’s rationality.
Honest Government Ad | South Australia Protest Laws ⌘ Read more
Docker Init: Initialize Dockerfiles and Compose files with a single CLI command
This article introduces `docker init`, a new beta feature that simplifies the process of adding Docker to a project. ⌘ Read more
My desktop computer developed a really annoying vibration-induced buzzing sound a few months ago after I added some hard drives to it. It was one of these where it’d be more or less quiet, and then all of a sudden a buzzing would start. If you tapped the case, it often made the buzzing stop.
One by one I went through my components, and the day before yesterday I finally identified the guilty party, one particular HDD. Currently I have the case open and a piece of cardboard jammed under the drive in its tray. The computer has not buzzed since I did that, so it looks to me like securing that drive better will finally end this madness-inducing sound.
Wild that it takes so long to track down something like this and figure out what to do about it.
Honest Reserve Bank Ad (full video @ thejuicemedia) ⌘ Read more
Honest Government Ad | Reserve Bank of Australia ⌘ Read more
Lunduke Journal April Wrap-up
A commitment to no ads, live streaming on the way, & April PDF Magazine. ⌘ Read more
The era of ad supported services is coming to an end (and that’s a good thing).
Services like Substack, Locals, and Twitter (seriously) are leading the way. ⌘ Read more
I’m not super a fan of using json. I feel we could still use text as the medium. Maybe a modified version to fix any weakness.
What if instead of signing each twt individually we generated a merkle tree using the twt hashes? Then a signature of the root hash. This would ensure the full stream of twts are intact with a minimal overhead. With the added bonus of helping clients identify missing twts when syncing/gossiping.
Have two endpoints. One as the webfinger to link profile details and avatar like you posted. And the signature for the merkleroot twt. And the other a pageable stream of twts. Or individual twts/merkle branch to incrementally access twt feeds.
Dr Nigel Gray was determined to fight tobacco ads. Years later, his efforts are still paying off
The powerful anti-tobacco ads that shifted public opinion in Australia are featured in a new exhibition at Melbourne’s ACMI museum. ⌘ Read more
**RT by @mind_booster: My new hobby: finding public domain images that Getty sells for $500, locating hi-rez scans of their original publications, cropping and cleaning them up, adding metadata, and uploading them to Wikimedia Commons.
First one: https://commons.wikimedia.org/wiki/File:Fig_6_Le_Telephone_by_T_De_Moncel_Paris_1878.png**
My new hobby: finding public domain images that Getty sells for $500, locating hi-rez scans of their original publications, cropping and cleaning them up, adding metadata, and uplo … ⌘ Read more
Honest Government Ad | Visit New South Wales! ⌘ Read more
How to automate your dev environment with dev containers and GitHub Codespaces
GitHub Codespaces enables you to start coding faster when coupled with dev containers. Learn how to automate a portion of your development environment by adding a dev container to an open source project using GitHub Codespaces. ⌘ Read more
Honest Government Ad | Safeguard Mechanism 3/3 ⌘ Read more
Honest Government Ad | Safeguard Mechanism 2/3 ⌘ Read more
Honest Government Ad | Safeguard Mechanism 1/3 ⌘ Read more
Honest Government Ad | the Safeguard Mechanism ⌘ Read more
@prologic@twtxt.net I get the worry of privacy. But I think there is some value in the data being collected. Do I think that Russ is up there scheming new ways to discover what packages you use in internal projects for targeting ads?? Probably not.
Go has always been driven by usage data. Look at modules. There was need for having repeatable builds so various package tool chains were made and evolved into what we have today. Generics took time and seeing pain points where they would provide value. They weren’t done just so it could be checked off on a box of features. Some languages seem to do that to the extreme.
Whenever changes are made to the language there are extensive searches across public modules for where the change might cause issues or could be improved with the change. The fs embed and strings.Cut come to mind.
I think its good that the language maintainers are using what metrics they have to guide where to focus time and energy. Some of the other languages could use it. So time and effort isn’t wasted in maintaining something that has little impact.
The economics of the “spying” are to improve the product and ecosystem. Is it “spying” when a municipality uses water usage metrics in neighborhoods to forecast need of new water projects? Or is it to discover your shower habits for nefarious reasons?
Only Serifs
⌘ Read more
I added a camera shutter sound effect that plays whenever I take a screenshot. It’s a big improvement, having that feedback.
here’s a question: when do NNs generalize, and how hard? as in adding two specific numbers together vs. n-digit integer addition vs. addition in general vs. simple arithmetical operations
“There is, however,
evidence to suggest that a proportion of advertising-related data collection and tracking could be unnecessary, fuelling ad fraud and ‘made for advertising’ websites that have limited value to society, as well as generating carbon emissions.” href=”https://we.loveprivacy.club/search?q=%23ClimateCrisis”>#ClimateCrisis**
“There is, however,
evidence to suggest that a proportion of advertising-related data collection and tracking could be unnecessary, fuelling ad fraud and ‘made for advertising’ websites that have limited value to society, as well as … ⌘ Read more
I don’t use twtxt anymore, but I keep accidentally adding logs to it because the command I use to use !say is so similar to the shortcut I use to make !zet messages. So, some of my logs make no sense because they are out of context.
I think I’m going to create some boilerplate code for !gestku that isn’t ad-hoc. I think I’m ready for this. Gestkus need less code because of how quickly I want to make them.
@abucci@anthony.buc.ci see here in the okta docs: https://developer.okta.com/docs/reference/api/webfinger/ they are adding a prefix to the acct
Honest Government Ads | Behind the Scenes 2022 ⌘ Read more
I learned how to make gopls syntax highlight go templates in VSCodium.
By adding the following to my config

i could go from
into 
“The Sidecar” – Adding advanced networking, and a Linux shell, to a Psion palmtop
One of the coolest designs I’ve seen for extending older computers via the serial port. ⌘ Read more
i added some disclaimers
@prologic@twtxt.net duud use an ad block on youtube.
Honest Government Ad | Rental Crisis ⌘ Read more
@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.
Android vs iOS: Which spies on you more?
Watch now (25 min) | (This is a classic video originally produced back in 2018. It is presented here exactly as it originally was – including original ad spots. Many of the details discussed (links, stats, etc.) may have changed in the years that followed.) Which mobile operating system spies on you the most? Android or iOS? In other words: Does a Google-powered Android… ⌘ Read more
Honest Government Ad | Visit Western Australia ⌘ Read more
RT @joinmastodon@joinmastodon
Monetization usually means ads, changing the website to have people see more ads, invading people’s privacy to make sure they’ve seen ads… A single website also means one organization is in complete control. If they do what you don’t want them to do, you’re out of luck.
🐦🔗: https://twitter.com/joinmastodon/status/1586886723858042880 ⌘ Read more
Added a section to my XSLT stylesheet explaining what Atom is. That was the point of making it, but I got carried away with date conversion.
Honest Government Ad | Brazil 🇧🇷 ⌘ Read more
Integrated Terminal for Running Containers, Extended Integration with Containerd, and More in Docker Desktop 4.12
Docker Desktop 4.12 is now live! This release brings some key quality-of-life improvements to the Docker Dashboard. We’ve also made some changes to our container image management and added it as an experimental feature. Finally, we’ve made it easier to find useful Extensions. Let’s dive in. Execute commands in a runn … ⌘ Read more
The Docker-Sponsored Open Source Program has a new look!
Learn about the latest updates to the Docker-Sponsored Open Source Program. This announcement covers the new benefits being added and what’s staying the same! ⌘ Read more
@movq@uninformativ.de Do you know how I would find people that reply to my posts or replies or even mention my users? Prologic tried to contact me and unless I found him on the yarn pod then I would not know he exists and wants to talk to me. The user agents would work but I don’t know if I can view my web server logs from codeberg pages and I don’t know how to monitor my logs for mentions. What about the way yarn does it by added people you follow to your twtxt file and having friends of friends like yarn does it be a thing for jenny. Just an idea
@prologic@twtxt.net I have added that to my twtxt file. Even if I can’t see the metadata the people from yarn can. Not a big deal to add the metadata and it helps yarn users
@prologic@twtxt.net Yeah I don’t even know how to use them once I added myself to the registries. The jarn search engine is similar to the registries thing but its easier to search and find things from. Also I assume its easier to use it in the yarn pods and whatever elese to get new posts. I would always like to see yarn work with regular twtxt because there is advantges to plain twtxt.
@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.
Honest Government Ad | UK ⌘ 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
}