Searching We Love Privacy Club

Twts matching #notes
Sort by: Newest, Oldest, Most Relevant

In reply to: Oatmeal - week notes

The worst kind of blogging is blogging about blogging, so, I’ll keep this blogging about blogging short!

I’ve made some minor updates to the design of the website that have improved it’s usability a wee bit, and are a step in the right direction toward upping my accessibility game. The major remaining accessibility issues are around color contrast and some structura … ⌘ Read more

⤋ Read More

** week notes **
It got a wee bit cold here in Maine this weekend. It was thankfully uneventful for us. We hung around inside and watched it get real cold outside. Our home faired pretty well, too. Honestly pleasantly surprised about that!

We picked this weekend to go all in on potty training — pantsless days, treats, rousing bouts of encouragement sung, and a lot of spot cleaning. Fueled by hubris, I thought we had this potty trainin … ⌘ Read more

⤋ Read More

(Communiqué) L’énergie du désespoir
Suite à la demande d’un lecteur assidu, je reproduis ici la tribune, déjà publiée vendredi par Olivier Delamarche et Nicolas Meilhan, adressée par les acteurs des territoire de l’Ain, de Savoie et Haute Savoie à l’adresse du Président Macron au sujet de la crise énergétique qui les frappe de plein fouet. Note à mes lecteurs […] ⌘ Read more

⤋ Read More

Snikket: Notes on the F-Droid security warning
Snikket Android users who installed the app via F-Droid may receive a warning
from F-Droid telling them that the app has a vulnerability and that they
“recommend uninstalling immediately”. First of all - don’t panic! This is a
over-simplified generic warning that is scary, but the actual situation is
not quite so scary and has an explanation. Here goes…

How F-Droid works

When an app is developed and ready for release, it must be compiled and built,
to produce the fina … ⌘ Read more

⤋ Read More

Jérôme Poisson: Libervia progress note 2022-W45
Hello, it’s time for a long overdue progress note.

I’ll talk here about the work made on ActivityPub (AP) gateway and on end-to-end encryption around pubsub.

Oh, and if everything goes well, this blog post should be accessible from XMPP and ActivityPub (and HTTP and ATOM feed), using the same identifier goffi@goffi.org.

Forewords

The work made on the AP gateway has been possible thanks to a NLnet/NGI0 grant (w … ⌘ Read more

⤋ Read More

** Occasional notes **
If they aren’t weekly, I guess they’re occasional?

3rd repair procedure to fix brain bleed was a success. I have a few more scans and follow ups, but, knock wood I think I’m through at this point.

I’ve spent about a week laying low and taking it easy navigating some wild pain, but that is subsiding now. I watched a bunch of stuff. It was a nice change of pace. I don’t typically watch much television or many movies. Stand outs (all things I revisited) include:

  • Michael Clayton
  • Point Break, the o … ⌘ Read more

⤋ Read More

** week notes **
Am I allowed to call them“week notes” if I don’t do them weekly?

I went in for what was supposed to be my final brain scan, a diagnostic angiogram (don’t look that up). The good news is that the repair has officially cured my brain bleed! The bad news is that they saw another vessel that looks primed to bleed; I’m due for another repair procedure sometime in October. I’m pretty bummed to not be done with this ordeal, but trying to remain optimistic that this new one was caught before it bled and because the surgeon s … ⌘ Read more

⤋ Read More

Une presse française lâche et paresseuse
Ah, finalement, qu’il est doux d’être journaliste en France dans un journal de révérence ! Jadis, c’était un travail fatigant, voire stressant et parfois même risqué : il fallait aller chercher l’information directement sur le terrain et la corroborer le carnet de notes à la main. Certains événements pouvaient impliquer de mettre sa vie en danger ; et […] ⌘ Read more

⤋ Read More
In-reply-to » 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.

(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 Objects

A 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
}

⤋ Read More

Monerotopia Presentation and Website News
Just a note that within two hours (11AM NY time), my edited Monerotopia presentation with slides and all will be premiering here on the Monero Talk channel on YouTube.

I did already do an extended commentary and explanation of my talk here on my PeerTube channel, and I might put this an the edited talk onto my YouTube channel if I feel like it. You shou … ⌘ Read more

⤋ Read More

Nix 2.8.0 released
We’re pleased to announce the availability of Nix 2.8.0. It will be
available from NixOS -\
Getting Nix / NixOS.

Here are the release notes:

  • New experimental command:nix fmt, which applies a
    formatter defined by the formatter.<system></system> flake
    output to the Nix expressions in a flake.

  • Various Nix commands can now read expressions from standard input
    using--file -.

  • New experimental builtin function
    builtins.fetchClosure that c … ⌘ Read more

⤋ Read More

Annotate PDFs on Linux
This post is about a GUI tool called pdfrankestein that
fills a gap on mostly Linux machines where a powerful and easy to use
PDF annotator does not exist.

Adobe Acrobat® on Windows and Mac allow you to add text, drawings and
signatures to PDF documents. This is useful when filling forms or
marking notes to send back to someone. Such a tool with similar
capabilities and easy of use does not exist on Linux. The reason that’s
often cited is that PDF is a c … ⌘ Read more

⤋ Read More

Docker: Nine Years YOUNG
Nine years ago today, March 15, 2013, Solomon Hykes, the founder of Docker, first demoed Docker publicly to the world at PyCon. On stage Solomon noted that, for developers, “shipping to the server is hard,” and thus he and the early team designed Docker to help developers more easily build, share, and run any app, […]

The post Docker: Nine Years YOUNG appeared first on Docker Blog. ⌘ Read more

⤋ Read More