Introducing Trilogy: a new database adapter for Ruby on Rails
We’ve open sourced Trilogy, the database adapter we use to connect Ruby on Rails to MySQL-compatible database servers. ⌘ Read more
Erlang Solutions: Implementing Go Fish to Learn Elixir
A walkthrough of how we implemented GoFish as a way of learning Elixir and the concepts of the BEAM and OTP.
In this article, we will outline our initial design and implementation of the card game Go Fish in Elixir using raw processes, and then describe how we were motivated to re-implement the project using the GenServer module instead. The first step is to agree upon the rules of the game, then describe the domain mode … ⌘ Read more
Erlang Solutions: How Can Technology Answer the Questions Still Unanswered in FinTech?
Leaders in the fintech industry joined us to discuss how technology can answer the remaining questions in fintech. They explored key technologies shaping the sector that could also have an impact on society as a whole. Join our panel moderated by Andrew Vorster (Innovation Catalyst) featuring Jacky Uys (Mambu … ⌘ Read more
** Miscellaneous this and that **
Since my brain injury (which I’ve since learned can be called an“ABI” or“acquired brain injury”) I’ve noticed that I have trouble focusing on programming tasks; I’m able to do what I need to do for work and family but, when it comes time for hobby projects I’m just gloop. Totally oozy.
Because of that I’ve been drawn to do more reading and game playing, but also still wanna code…I’ve found that it is easier to use more“batteries included” kinda languages, namely scheme, over what I’d … ⌘ Read more
@prologic@twtxt.net I think we could use deltachats new decentralising app format for it: https://delta.chat/en/2022-06-14-webxdcintro
testing twtxt using jenny
I should have attended the Homebrew Website Club London / Europe in June, after all they talked about maps, a topic I have some experience with. James uses Leaflet to create maps with his visited coffee shops. 👍 ⌘ Read more
I should have attended the Homebrew Website Club London / Europe in June, after all they talked about maps, a topic I have some experience with. James uses Leaflet to create maps with his visited coffee shops. 👍 ⌘ Read more
GitHub Discussions is now available on GitHub Enterprise Server
As part of GitHub Enterprise Server 3.6, enterprise customers will now be able to use GitHub Discussions. ⌘ Read more
👋 Hello @burglar@txt.sour.is, welcome to txt.sour.is, a Yarn.social Pod! To get started you may want to check out the pod’s Discover feed to find users to follow and interact with. To follow new users, use the ⨁ Follow button on their profile page or use the Follow form and enter a Twtxt URL. You may also find other feeds of interest via Feeds. Welcome! 🤗
👋 Hello @burglar@txt.sour.is, welcome to txt.sour.is, a Yarn.social Pod! To get started you may want to check out the pod’s Discover feed to find users to follow and interact with. To follow new users, use the ⨁ Follow button on their profile page or use the Follow form and enter a Twtxt URL. You may also find other feeds of interest via Feeds. Welcome! 🤗
(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
}
(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.
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.
by which the future life expectancy of some non-perishable things, like a technology or an idea, is proportional to their current age. Thus, the Lindy effect proposes the longer a period something has survived to exist or be used in the present, the longer its remaining life expectancy. The disproportionate influence of early tech decisions — brandur.org
Tailscale SSH
I finally got around to using Tailscale SSH. I’ve been using Tailscale for over a year to access my servers via SSH (my VPS is even available via Tailscale only), but I haven’t used the new Tailscale SSH feature yet. ⌘ Read more
With respect to logging.. oh man.. it really depends on the environment you are working in.. development? log everything! and use a jeager open trace for the super gnarly places. So you can see whats going on while building. But, for production? metrics are king. I don’t want to sift through thousands of lines but have a measure that can tell me the health of the service.
With respect to logging.. oh man.. it really depends on the environment you are working in.. development? log everything! and use a jeager open trace for the super gnarly places. So you can see whats going on while building. But, for production? metrics are king. I don’t want to sift through thousands of lines but have a measure that can tell me the health of the service.
@prologic@twtxt.net Error handling especially in Go is very tricky I think. Even though the idea is simple, it’s fairly hard to actually implement and use in a meaningful way in my opinion. All this error wrapping or the lack of it and checking whether some specific error occurred is a mess. errors.As(…) just doesn’t feel natural. errors.Is(…) only just. I mainly avoided it. Yesterday evening I actually researched a bit about that and found this article on errors with Go 1.13. It shed a little bit of light, but I still have a long way to go, I reckon.
We tried several things but haven’t found the holy grail. Currently, we have a mix of different styles, but nothing feels really right. And having plenty of different approaches also doesn’t help, that’s right. I agree, error messages often end up getting wrapped way too much with useless information. We haven’t found a solution yet. We just noticed that it kind of depends on the exact circumstances, sometimes the caller should add more information, sometimes it’s better if the callee already includes what it was supposed to do.
To experiment and get a feel for yesterday’s research results I tried myself on the combined log parser and how to signal three different errors. I’m not happy with it. Any feedback is highly appreciated. The idea is to let the caller check (not implemented yet) whether a specific error occurred. That means I have to define some dedicated errors upfront (ErrInvalidFormat, ErrInvalidStatusCode, ErrInvalidSentBytes) that can be used in the err == ErrInvalidFormat or probably more correct errors.Is(err, ErrInvalidFormat) check at the caller.
All three errors define separate error categories and are created using errors.New(…). But for the invalid status code and invalid sent bytes cases I want to include more detail, the actual invalid number that is. Since these errors are already predefined, I cannot add this dynamic information to them. So I would need to wrap them à la fmt.Errorf("invalid sent bytes '%s': %w", sentBytes, ErrInvalidSentBytes"). Yet, the ErrInvalidSentBytes is wrapped and can be asserted later on using errors.Is(err, ErrInvalidSentBytes), but the big problem is that the message is repeated. I don’t want that!
Having a Python and Java background, exception hierarchies are a well understood concept I’m trying to use here. While typing this long message it occurs to me that this is probably the issue here. Anyways, I thought, I just create a ParseError type, that can hold a custom message and some causing error (one of the three ErrInvalid* above). The custom message is then returned at Error() and the wrapped cause will be matched in Is(…). I then just return a ParseError{fmt.Sprintf("invalid sent bytes '%s'", sentBytes), ErrInvalidSentBytes}, but that looks super weird.
I probably need to scrap the “parent error” ParseError and make all three “suberrors” three dedicated error types implementing Error() string methods where I create a useful error messages. Then the caller probably could just errors.Is(err, InvalidSentBytesError{}). But creating an instance of the InvalidSentBytesError type only to check for such an error category just does feel wrong to me. However, it might be the way to do this. I don’t know. To be tried. Opinions, anyone? Implementing a whole new type is some effort, that I want to avoid.
Alternatively just one ParseError containing an error kind enumeration for InvalidFormat and friends could be used. Also seen that pattern before. But that would then require the much more verbose var parseError ParseError; if errors.As(err, &parseError) && parseError.Kind == InvalidSentBytes { … } or something like that. Far from elegant in my eyes.
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.
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.
GitHub Pages now uses Actions by default
As GitHub Pages, home to 16 million websites, approaches its 15th anniversary, we’re excited to announce that all sites now build and deploy with GitHub Actions. ⌘ Read more
The US put tornadocash on sanction list. Deleted github accounts and source. Since North Korea used it to launder stolen crypto.
And people are surprised that it happened? Github is and never have been a safe place to store code. Tor/i2p is much more safer places to host code. But I understand why people use github, I do so as well for public project, but I also selfhost my other things
I did a take home software engineering test for a company recently, unfortunately I was really sick (have finally recovered) at the time 😢 I was also at the same time interviewing for an SRE position (as well as Software Engineering).
Got the results of my take-home today and whilst there was some good feedback, man the criticisms of my work were harsh. I’m strictly not allowed to share the work I did for this take-home test, and I really can only agree with the “no unit tests” piece of the feedback, I could have done better there, but I was time pressured, sick and ran out of steam. I was using a lot of libraires to do the work so in the end found it difficult to actually think about a proper set of “Unit Tests”. I did write one (in shell) but I guess it wasn’t seen?
The other points were on my report and future work. Not detailed enough I guess? Hmmm 🤔
Am I really this bad? Does my code suck? 🤔 Have I completely lost touch with software engineering? 🤦♂️
I started working on plugins for GoBlog using a Go module I recently discovered: yaegi. It still feels like magic, because Go is typically a compiled language and yaegi makes it dynamic by embedding an interpreter. Is this overkill for GoBlog or does this possibly enable flexibility like WordPress plugins? ⌘ Read more
Release Radar · July 2022 Edition
While some of us have been wrapping up the financial year, and enjoying vacation time, others have been hard at work shipping open source projects and releases. These projects include everything from world-changing technology to developer tooling, and weekend hobbies. Here are some of the open source projects that released major version updates this July. […] ⌘ Read more
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
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
from now on, when talking about fractions, i will only use the terms “upper number” and “lower number”. those both have fewer syllables AND they’re vastly easier to understand. Thank you for coming to my TED talk.
Destroying Politicians using A.I ⌘ Read more
The XMPP Standards Foundation: The XMPP Newsletter July 2022
Welcome to the XMPP Newsletter, great to have you here again! This issue covers the month of July 2022.
Like this newsletter, many projects and their efforts in the XMPP community are a result of people’s voluntary work. If you are happy with the services and software you may be using, especially throughout the current situation, please consider saying thanks or help these projects! Interested in supporting the Newsletter team? Read more at the bottom … ⌘ Read more
**R to @mind_booster: Metaverse? Yeah, that other new thing, haven’t you notice? Nevermind that book in my shelf claiming that Second Life is Linden Lab’s Metaverse, or years of Metaverse references older than Facebook in papers, conferences, etc.: the Metaverse is now.
https://www.wiley.com/en-us/Second+Life%3A+The+Official+Guide-p-9780470096086**
Metaverse? Yeah, that other new thing, haven’t you notice? Nevermind that book in my shelf claiming that Second Life is Linden Lab’s Metaverse, or years of Metavers … ⌘ Read more
“to limit that rise to 1.5C […] global carbon emissions will have to be reduced by 45% by 2030.
[…]
Instead, we are on course for close to a 14% rise in emissions by that date – which will almost certainly see us shatter the 1.5C guardrail in less than a decade.”
“to limit that rise to 1.5C […] global carbon emissions will have to be reduced by 45% by 2030.
[…]
Instead, we are on course for close to a 14% rise in emissions by that date – which will almost certainly see us shatter the 1.5C guardrai … ⌘ Read more
@niplav@niplav.github.io if he’s willing to be even more nerdy he could use https://lojban.org/publications/cll/cll_v1.1_xhtml-section-chunks/section-evidentials.html and possibly color-code them in some less important color than red
Corrupting memory without memory corruption
In this post I’ll exploit CVE-2022-20186, a vulnerability in the Arm Mali GPU kernel driver and use it to gain arbitrary kernel memory access from an untrusted app on a Pixel 6. This then allows me to gain root and disable SELinux. This vulnerability highlights the strong primitives that an attacker may gain by exploiting errors in the memory management code of GPU drivers. ⌘ Read more
using subscripts for probability assignments?
In typography, an asterism, ⁂, is a typographic symbol consisting of three asterisks placed in a triangle, which is used for a variety of purposes. Asterism (typography) - Wikipedia)
Honest Government Ad | US Supreme Court ⌘ Read more
Web hosting is being moved to Ouvaton, a French co-op and email not sure yet. Might use them or Nubo a Belgian co-op
Tips & tricks for using GitHub projects for personal productivity
GitHub Issues is a core component of how developers get things done and, as we built more project planning capabilities into GitHub, we’ve found some fun and unique ways to use the new projects experience for personal productivity. ⌘ Read more
Finally found the time to set up my Raspberry Pi to do something useful. It was on my shelf for only three years or so.
I’m trying to switch from Konversation to irssi. Let’s see how that goes. Any irssiers out there who can recommend specific settings or scripts? I already got myself trackbar.pl and nickcolor.pl as super-essentials. Also trying window_switcher.pl. Somehow my custom binds for Ctrl+1/2/3/etc. to switch to window 1/2/3/etc. doesn’t do anything: { key = "^1"; id = "change_window"; data = "1"; } (I cannot use the default with Alt as this is handled by my window manager). Currently, I’m just cycling with Ctrl+N/P. Other things to solve in the near future:
- better, more colorful and compact theme (just removed clock from statusbar so far)
- getting bell/urgency hints working on arriving messages
- nicer tabs in status bar, maybe even just channel names and no indexes
- decluster status bar with user and channel modes (I never cared about those in the last decade)
Writing and Running a BBS on a Macintosh Plus
In 2015, I wrote a custom BBS server in Ruby and had been using it to run the Kludge BBS on a small OpenBSD server in my home office since then. ⌘ Read more
Erlang Solutions: Updates to the MIM Inbox in version 5.1
User interfaces in open protocolsWhen a messaging client starts, it typically presents the user with:
- an inbox
- a summary of chats (in chronological order)
- unread messages in their conversation
- a snippet of the most recent message in the conversation
- information on if a conversation is muted (and if so how long a conversation is muted for)
- other information that users may find useful on their welcome screen
Mongoos … ⌘ Read more
❤️ 🎶: Two of Us by ALi
The hardest technical solutions are right in front of your face.
Nassim Taleb had this old anecdote of the sheer absurdity that while the suitcase and other bags had existed for lifetimes, it was only in the 1990’s that people had the idea to put wheels on the things so they didn’t have to haul them around airports all day with their strength.
It reminds you of the fact that while children in the Incan Empire did indeed have some toys with wheels, apparently no one thought to use the wheel to make a simple … ⌘ Read more
The hardest technical solutions are right in front of your face.
Nassim Taleb had this old anecdote of the sheer absurdity that while the suitcase and other bags had existed for lifetimes, it was only in the 1990’s that people had the idea to put wheels on the things so they didn’t have to haul them around airports all day with their strength.
It reminds you of the fact that while children in the Incan Empire did indeed have some toys with wheels, apparently no one thought to use the wheel to make a simple … ⌘ Read more
@prologic@twtxt.net: 1. I use classic twtxt client written in Python from console, I like simplicity; 2. Thanks for the feedback about my website! It’s better viewed with old 800x600 monitors, haha
Microsoft: “Using an open-source solution may introduce risks”
Remember how Microsoft used to warn against using Open Source? Turns out… they still are. ⌘ Read more
Seems I forgot how to use my twtxt client
Gracefully Degrading Home Automation
Over the past two years, I have gradually increased my use of home
automation in our small city apartment. I started with an IKEA TRÅDFRI
light and a button, and today have over 40 devices doing useful things,
saving electricity and making our living more pleasant. I won’t lie: I
have done a lot of this just for fun and learnt quite a bit in the
process. But if it doesn’t eventually result in utility or aesthetics,
then I get rid of it. I can’t stand keeping frivolous s … ⌘ Read more
** Lamination for a lost explorer **
I remember the days when Kicks Condor used to update regularly. I miss those days.
For a while every post seemed to unearth some new, yet weirder corner of the little internet (maybe not yet the smol web).
There are folks doing similar web archeology…I do some of it myself…but no one does it like Kicks was doing it; there was often a feeling of unknown, but ulterior motive behind the curation — bits building towards a cohesive something.
Perhaps … ⌘ Read more
I will probably crash in the afternoon but right now I am going to use my energy to take a walk outside
The XMPP Standards Foundation: The XMPP Newsletter June 2022
Welcome to the XMPP Newsletter, great to have you here again! This issue covers the month of June 2022.
Like this newsletter, many projects and their efforts in the XMPP community are a result of people’s voluntary work. If you are happy with the services and software you may be using, especially throughout the current situation, please consider saying thanks or help these projects! Interested in supporting the Newsletter team? Read more at the bottom … ⌘ Read more
I just discovered that my phone app (on my personal smartphone) shows me the total call duration of all calls made with the phone so far. A total of about 137.5 hours, which is over five and a half days (!). And that’s just the calls I’ve made using the phone app in the last 22 months. With Telegram and WhatsApp (and my landline phone), I’m sure a few more hours could be added. I’ve often heard the statement that smartphones are hardly used for making calls anymore these days. But apparently I can disprove that. On … ⌘ Read more
How the GitHub Security Team uses projects and GitHub Actions for planning, tracking, and more
Can projects and GitHub Actions be used by your non-developer teams? They absolutely can. Check out how our Security Team uses GitHub to run the department effortlessly. ⌘ Read more
Write Better Commits, Build Better Projects
High-quality Git commits are the key to a maintainable and collaborative open- or closed-source project. Learn strategies to improve and use commits to streamline your development process. ⌘ Read more
Hmm, @prologic@twtxt.net / @lyse@lyse.isobeef.org: Should we remove the section “Traditional Human-Readable Topics” from the spec? Or mark is as deprecated? I haven’t seen this being used in the wild for years. 🤔
@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)
@prologic@twtxt.net Oh.. reading comprehension is strong today.. you went to US and now back.
@prologic@twtxt.net Oh.. reading comprehension is strong today.. you went to US and now back.
JD.com extends access to Tencent’s WeChat for three years with US$220 million in stock
JD.com is keeping its preferential access to WeChat’s 1.29 billion users, extending a partnership with Tencent that gives it a short cut on the platform. ⌘ Read more
Google’s ‘fast track to surveillance’ sparks backlash from European consumer groups over ‘deceptive’ practices
The Regional consumer organisation BEUC accused Google of using ‘deceptive design, unclear language, misleading choices and missing information’ for extensive data collection. ⌘ Read more
Vladimir Putin says Russia will respond if Nato deploys troops in Finland and Sweden
The president says Moscow will ‘create the same threats for the territories from which threats towards us are created’. ⌘ Read more
US protectionism hits China hardest, and Chinese are more averse to trade because of it, study finds
If China makes trade concessions to US in the face of strong domestic opposition, it ‘would risk a potentially destabilising domestic backlash’, according to a PIIE study that cites ‘worrying implications’ for open trade. ⌘ Read more
Beijing’s human rights policies drive unfavourable views of China, Pew survey finds
Negative views of China rise in most of 19 countries surveyed by the Pew Research Centre, setting record highs in nations including the US, Canada, Germany and South Korea. ⌘ Read more
US sanctions 25 more Chinese entities, including firm that touted its technology could help Russia monitor Ukraine’s submarines, frogmen
Marine technology company Highlander, one of the 25 new Chinese entities sanctioned by Washington, allegedly acquired US-origin items for use in military applications. ⌘ Read more
Sam Whited: Sirius
NameSiriusDesignationα CMaMake/modelHonda CB1100StyleNaked bikeEngine1140cc air-cooled inline fourTiresMetzeler Roadtec Z8 Interact Tires 110/80-18; 140/70-18
With gas prices as high as they are I recently decided to sell my Honda S2000,
Vela.
Though I normally say that there is never a reason to buy a new vehicle when a
used one can be had that’s just as good, depreciates less, and is cheaper, I’ve
decided to brake my own rule and ordere … ⌘ Read more
Japan eyes restart of nuclear plants offline since 2011 Fukushima disaster as temperatures soar
Soaring temperatures and a looming power crunch have prompted Japan to speed up reviews of the dozens of nuclear reactors that were shut down in the wake of Fukushima disaster. Nuclear power used to account for about 30 per cent of Japan’s energy mix before 2011. ⌘ Read more
China tells UN expansion of Nato, or a Nato-like body, into the Asia-Pacific will stir up conflict
Beijing is concerned US is building an Asian version of Nato as Australia, Japan, New Zealand and South Korea join the Nato meeting for the first time. ⌘ Read more
Pro-China agents posed as activists to protest US, Canada mines: security firm
A pro-China propaganda campaign used fake social media accounts to try to stir up opposition against mining firms that challenge China’s business interests, cybersecurity firm Mandiant said. ⌘ Read more
Russia’s Putin visits ‘friendly’ Central Asia on first trip abroad during war
Russia has been at pains to show it’s not under international isolation despite unprecedented US and European sanctions imposed over its attack on Ukraine. ⌘ Read more
Majority of Australians support defending Taiwan against invasion, survey finds
A Lowy Institute Poll found 51 per cent were in favour of Australia using its military forces to defend Taiwan. Just 12 per cent of those surveyed said they trust Beijing to act responsibly in global affairs. ⌘ Read more
Police in China arrest twin sisters who used each other’s passports more than 30 times to travel the world
Police in northern China arrested twin sisters under suspicion of swapping passports to visit various countries to skirt visa rules. ⌘ Read more
Singapore’s US$40 billion mega-port aims to solve shipping chaos
The world’s largest automated port, to be completed by 2040, will double the existing space and feature drones as well as driverless vehicles. ⌘ Read more
We moved to the US. When we got back we just never got new chickens again 😢
US ‘smart city’ tech highlights contrasts with China over privacy and control
American communities try to balance the benefits of new technology with the threats of a surveillance state. ⌘ Read more
US seeks China pressure on Russia to end Ukraine war as it weighs economic options against Beijing
‘China cannot evade responsibility, given its relationship with Russia, for speaking more clearly to them,’ says US national security adviser ahead of Nato summit. ⌘ Read more
@movq@www.uninformativ.de I usually only use eggs for baking or fry them for potatoes and spinach. @prologic@twtxt.net Why don’t you have them anymore? Did the fox get them all when the door didn’t close in time? ]:->
Chinese breakthrough lets human brains beam radio waves
Researchers say new technology could be used for mind-controlled military radar and other devices. ⌘ Read more
China, Nato and how the Ukraine war is spilling over into the Asia-Pacific
Indo-Pacific partners are joining the bloc’s summit for the first time as the US seeks to counter China’s influence. ⌘ Read more
Africa would welcome G7’s US$600 billion infrastructure push – if it happens
Mega spending plan Partnership for Global Infrastructure and Investment aims to counter influence of China’s belt and road strategy. ⌘ Read more
China pledges aid for Afghanistan after deadly quake but also seeks action from Taliban on terrorism
During call between foreign ministers, Wang Yi describes China as a ‘true friend’ to its neighbour and promises tents and beds among US$7.4 million aid package. ⌘ Read more
Evergrande crisis: embattled developer could face liquidation as creditor files winding-up petition in Hong Kong
The embattled developer received a winding-up petition from a creditor reportedly owned by a member of Hong Kong’s leadership election committee, for failing to pay US$109.91 million. ⌘ Read more
Australia-China relations: Canberra to set up Pacific defence school as Beijing seeks rival regional meeting
Canberra also plans to double funding for aerial surveillance in the Pacific region to recoup US$150 million lost each year to illegal fishing, a government minister said. ⌘ Read more
Tragedy in Texas as 46 migrants found dead in truck trailer, likely victims of heat
It may be the deadliest incident of human smuggling along the US-Mexico border in recent decades. ⌘ Read more
How an expanded BRICS could lead the world instead of the waning West
Adding new members to BRICS would fragment the world on a scale not seen since the Cold War and amplify the new era of ‘vertical globalisation’. The US would not be at the centre of geopolitics for the first time since World War II, and even France may switch sides. ⌘ Read more
China’s yuan liquidity reserve pool highlights efforts to loosen US dollar hegemony
China’s plan to establish a yuan liquidity reserve pool with the Bank for International Settlements (BIS) could help boost international use of the currency, while highlighting attempts to loosen US dollar hegemony. ⌘ Read more
Convincing a Linux guy to use FreeBSD
Watch now (76 min) | The Director of the FreeBSD Foundation tried to convince Lunduke to switch to FreeBSD. ⌘ Read more
US urged to plan minelaying campaign to halt mainland Chinese attack on Taiwan
A US navy commander suggests that laying mines in the Yellow Sea and Pearl River Delta could help bring Beijing to the negotiating table. ⌘ Read more
Joe Biden swipes at China, signing pledge to combat illegal fishing
The US president’s new national security memorandum comes as Washington seeks to counter Beijing’s growing influence in the Indo-Pacific. ⌘ Read more
US-led rare earths pact satisfies South Korea’s ‘definite need’ to cut China dependency
South Korea joined the US-led Minerals Security Partnership earlier this month alongside the likes of Germany, France, Britain, Australia and Japan in a move designed to reduce its dependency on China for key resources, including rare earths. ⌘ Read more
US man shoots Subway worker dead over ‘too much mayo on sandwich’
The gunman argued with two female staff before opening fire, killing one and injuring the other; the wounded woman’s 5-year-old son was at the restaurant at the time. ⌘ Read more
G7 summit statement will take aim at ‘challenge China poses’, US national security adviser says
Beijing’s non-market economic practices, approach to debt and human rights actions set to be addressed in communique issued from meeting in Germany. ⌘ Read more
A thaw in China-US diplomatic relations? We can only hope
Recent overtures by Chinese diplomats in Singapore, Hong Kong and Sydney, as well as displays of America’s friendlier side by its new ambassador to China, can’t help but inspire some optimism. ⌘ Read more
China hits back at US over G7 ‘zero-sum’ belt and road alternative
Washington’s revived partnership is an effort to ‘smear Beijing’ and its infrastructure initiative, foreign ministry says. ⌘ Read more
JD.com founder Richard Liu cashes out nearly US$1 billion from e-commerce giant after retreat from top job
Liu has sold Nasdaq-listed JD.com stock and Hong Kong-listed JD Health shares worth a combined US$988 million since April, according to filings. ⌘ Read more
Russia to spend US$14.5 billion on aircraft amid sanctions
The aviation industry has been in crisis since the West imposed sanctions banning airlines from countries such as Europe and the US, while foreign plane makers have stopped delivering new aircraft and spare parts. ⌘ Read more
Taiwan, US to hold first trade talks under new initiative
Taiwan’s top trade negotiator John Deng and deputy US trade representative Sarah Bianchi will meet virtually after Deng tested positive for Covid-19. ⌘ Read more