@prologic@twtxt.net correct type parameters. 😅
(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.
To all my feed subscribers: If you are annoyed by the TTS audio or the “Interactions” link, add a “.min” in front of the feed type in the URL. For example https://jlelse.blog/.min.rss. Thanks for following! 😄 ⌘ 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
PEP 696: Type defaults for TypeVarLikes
This PEP introduces the concept of type defaults for TypeVarLikes (TypeVar, ParamSpec and TypeVarTuple), which act as defaults for a type parameter when none is specified. ⌘ Read more
The Chromium super (inline cache) type confusion
In this post I’ll exploit CVE-2022-1134, a type confusion in Chrome that I reported in March 2022, which allows remote code execution (RCE) in the renderer sandbox of Chrome by a single visit to a malicious site. I’ll also look at some past vulnerabilities of this type and some implementation details of inline cache in V8, the JavaScript engine of Chrome. ⌘ Read more
No insurance payout over capsizing of Hong Kong’s Jumbo Floating Restaurant, owner says
Jumbo was insured by a type of policy that covered third-party losses instead of losses to the company, statement by Aberdeen Restaurant Enterprises says. ⌘ Read more
Great blog post. I’ve been thinking about this, just couldn’t put it into words. https://seirdy.one/posts/2022/06/25/two-types-of-privacy/
Philippines’ Duterte leaves brutal legacy in presidency marked by drug war, US-China policy flip-flops
The extrajudicial killings of some 8,000 people has ‘opened the floodgates for a type of governance that disregards the rule of law, due process and human rights’, activists say. ⌘ Read more
‘It can create life’: Chinese team claim stem cell breakthrough in mice study
Researchers say they turned one type of stem cell into another that can develop into all types in the body. ⌘ Read more
Top French court rules against burkinis in city pool
The judges blocked Grenoble’s bid to allow all types of swimwear; a change to allow women to bathe topless was not challenged. ⌘ Read more
Häagen-Dazs Hong Kong apologises after banned pesticide found in 2 types of vanilla ice cream products
Centre for Food Safety halts sale of Häagen-Dazs’ pint-sized and bulk-sized vanilla ice cream after Taiwan’s food authorities found ethylene oxide in them. ⌘ Read more
numpy.unique needs the type to be comparable by < and >, not just ==. that seems like overkill.
Masks, Covid-19 test kits, plastic bottles: more than 9,000kg of litter found on Hong Kong’s hiking trails, seashore last year, green group says
Plastic bottles, bottle lids and buoys top three types of rubbish commonly found on seashore, while cigarettes, tissue paper and food packaging dot hiking trails, green group Ecobus says. ⌘ Read more
Gajim: Gajim 1.4.4
Gajim 1.4.4 comes with many improvements: emoji auto-complete, automatic theme switching when your desktop switches from light to dark in the evening, a completely reworked Gajim remote interface, and many bug fixes.
After many emoji improvements in Gajim 1.4.3, this version comes with an emoji auto-complete while writing messages! As soon as you start typing a :, a popover will show you available emoji shortcodes, just like on Slack or Github 🎉

False Dichotomy
⌘ Read more
False Dichotomy
⌘ Read more
Code scanning finds more vulnerabilities using machine learning
Today we launched new code scanning analysis features powered by machine learning. The experimental analysis finds more of the most common types of vulnerabilities. ⌘ Read more
having small “this feels like mdma” type moments during listening to techno & dancing. who knew that ~1000 hours of meditation could have an effect?
there are two types of panpsychism, and they can be distinguished by asking “if i shatter this glass, will it feel pain?”. one answers “yes”, the other answers “no clue, but probably not”
The Go 1.18 generics landscape
A fairly complete presentation about Go 1.18 generics including examples, planned changes for future releases, writing generics code, defining constraints, new library packages, and generics examples for generics Map() / Reduce() / Filter() and a type-safe Set implementation. 1 points posted by FGM ⌘ Read more
PEP 682: Format Specifier for Signed Zero
Though float and Decimal types can represent signed zero, in many
fields of mathematics negative zero is surprising or unwanted – especially
in the context of displaying an (often rounded) numerical result. This PEP
proposes an extension to the string format specification allowing negative
zero to be normalized to positive zero. ⌘ Read more
从 CPU 角度理解 Go 中的结构体内存对齐
大家好,我是 Go 学堂的渔夫子。今天跟大家聊聊结构体字段内存对齐相关的知识点。
原文链接: https://mp.weixin.qq.com/s/H3399AYE1MjaDRSllhaPrw
大家在写 Go 时有没有注意过,一个 struct 所占的空间不见得等于各个字段加起来的空间之和,甚至有时候把字段的顺序调整一下,struct 的所占空间又有不同的结果。
本文就从 cpu 读取内存的角度来谈谈内存对齐的原理。
01 结构体字段对齐示例
我们先从一个示例开始。T1 结构体,共有 3 个字段,类型分别为 int8,int64,int32。所以变量 t1 所属的类型占用的空间应该是 1+8+4=13 字节。但运行程序后,实际上是 24 字节。和我们计算的 13 字节不一样啊。如果我们把该结构体的字段调整成 T2 那样,结果是 16 字节。但和 13 字节还是不一样。这是为什么呢?
”`
type T1 struct {
f1 int8 // 1 byte
f2 int64 // ... ⌘ [Read more](https://gocn.vip/topics/20967)```
Eagle-eyed folks may have noticed that I made a few wee changes to this website.
The biggest, and most noticeable one is that I’ve filtered out all of the like type posts from appearing on the main feed, from rss, and in the archives. There were waaaaay to many, so filtering them out makes the entire website a lot more navigable. They are not gone, though, and I’ll probably keep sharing like type posts, but now they ar … ⌘ Read more
I just went to type the phrase “I avoid Linux like the plague” but then remembered that we’ve all learned that most people won’t actually go much out of their way to avoid the plague.
平凯星辰获评《金融电子化》2021 金融业新技术应用创新突出贡献奖
近日,《金融电子化》杂志社发布了 “2021 第十二届金融科技应用创新奖” 评选结果,平凯星辰(北京)科技有限公司(以下简称 “平凯星辰”)榜上有名,这是对平凯星辰在金融科技领域的创新成果与能力的充分肯定。

Day 16 of Advent of Code is so confusing that I will not finish today’s puzzle. I wonder if yesterday was my last day with Advent of Code, or will the puzzles become more understandable and easier again in the next few days? Maybe I’m just more the practical type. I like programming, but such complex algorithms are not really my thing. And in the end, Advent of Code is supposed to be fun… ⌘ Read more
go 1.18 泛型初体验
go 1.18 泛型初体验go.1.18beta 版发布,众所周知这个 go.1.18 版本会默认启用 go 泛型。这个版本也号称 go 最大的版本改动。
初识 golang 的泛型我们写一个 demo 来看看 go 的泛型是长啥样
”`
package main
import (
<span class="s">"fmt"</span>
)
type OrderTypesRead more”`
PEP 677: Callable Type Syntax
This PEP introduces a concise and friendly syntax for callable types,
supporting the same functionality as typing.Callable but with an
arrow syntax inspired by the syntax for typed function
signatures. This allows types like Callable[[int, str], bool] to
be written (int, str) -> bool. ⌘ Read more
On the blog: Amateur Stenography https://john.colagioia.net/blog/2021/11/28/steno.html #education #technology #opensource #typing
** Operators in C **
Following up my notes on Data Types and Variables in C here are notes on operators in C.
An operator is a symbol that represents a mathematical or logical operation. An operator effects operands.
C provides a number of operators.
Some arithmetic operators include,
”`hljs plaintext
+*
/
%
”`
% is the most exciting of the list, it is called modulo and it returns the remainder after division. Of note, modulo c … ⌘ Read more
PEP 673: Self Type
This PEP introduces a simple and intuitive way to annotate methods that return
an instance of their class. This behaves the same as the TypeVar-based
approach specified in PEP 484
but is more concise and easier to follow. ⌘ Read more
line in question: https://git.mills.io/yarnsocial/yarn/src/branch/master/types/lextwt/ast.go#L793