From 6be91639f68555fd01f1aea6dfb8418eb4457891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20M=C3=A9taireau?= Date: Fri, 5 Apr 2024 15:37:59 +0200 Subject: [PATCH] A bunch of updates :-) --- content/Sans titre.md | 0 content/code/2024-02-24-crdts.md | 432 -------------------- content/code/2024-03-18-crdts.md | 493 +++++++++++++++++++++++ content/extra/robots.txt | 28 +- content/images/umap/crdt-converge.png | Bin 95462 -> 33833 bytes content/pages/resume.md | 71 ++++ content/pages/worklog/argos.md | 6 +- content/pages/worklog/flash.md | 41 ++ content/pages/worklog/notmyidea.md | 6 +- content/pages/worklog/umap.md | 57 ++- content/weeknotes/21-22.md | 51 +++ content/weeknotes/23.md | 51 +++ mnmlist/static/css/main.css | 6 +- mnmlist/static/fonts/Luciole-Regular.ttf | Bin 0 -> 167572 bytes mnmlist/templates/article.html | 2 +- mnmlist/templates/index.html | 2 +- mnmlist/templates/worklog.html | 10 +- pelicanconf.py | 2 +- plugins/neighbors.py | 2 + plugins/simplereader.py | 46 ++- 20 files changed, 825 insertions(+), 481 deletions(-) create mode 100644 content/Sans titre.md delete mode 100644 content/code/2024-02-24-crdts.md create mode 100644 content/code/2024-03-18-crdts.md create mode 100644 content/pages/resume.md create mode 100644 content/pages/worklog/flash.md create mode 100644 content/weeknotes/21-22.md create mode 100644 content/weeknotes/23.md create mode 100644 mnmlist/static/fonts/Luciole-Regular.ttf diff --git a/content/Sans titre.md b/content/Sans titre.md new file mode 100644 index 0000000..e69de29 diff --git a/content/code/2024-02-24-crdts.md b/content/code/2024-02-24-crdts.md deleted file mode 100644 index e8542f5..0000000 --- a/content/code/2024-02-24-crdts.md +++ /dev/null @@ -1,432 +0,0 @@ ---- -title: A comparison of JavaScript CRDTs -status: draft -tags: crdts, umap, sync -display_toc: true ---- - -This is not done yet, TODO : - -- [x] Change the table to be more readable, especially on mobile -- [x] Update the examples with JSON Joy to have a working example -- [x] Change the layout to be easier to understand. -- [ ] Enhance graphics to be easier to understand -- [ ] Part 3: Key takeaways ---- - -[TOC] - ---- - -Collaboration is one of the most requested features on uMap since a long time. We've added a way to merge same-layers edit, but ideally we would love to make things easier to understand and more fluid for the users. - -For this reason, I got more into CRDTs, with the goal of understanding how they work, what are the different libraries out there, and which one would be a good fit for us, if any. - -So far, [the way I've though about collaboration features on uMap](https://blog.notmyidea.org/adding-collaboration-on-umap-third-update.html) is by: - -- a) catching when changes are done on the interface ; -- b) sending messages to the other party and ; -- c) applying the changes on the receiving client. - -This works well in general, but it doesn't take care of conflicts handling, especially when a disconnect can happen. -## Part 1 - What are CRDTs? - -Conflict-free Resolution Data Types (CRDTs) are as a specific datatype able to merge its state with other states without generating conflicts. They handle consistency in distributed systems, making them particularly well-suited for collaborative real-time applications. - -CRDTs ensure that multiple participants can make changes without strict coordination, and all replicas converge to the same state upon synchronization, without conflicts. - -"Append-only sets" are probably one of the most common type of CRDT: if multiple parties add the same element, it will be present only once. It's our old friend `Set`. -### Why using them? - -For uMap, CRDTs offer a solution to several challenges: - -1. **Simultaneous Editing**: When multiple users interact with the same map, their changes must not only be reflected in real-time but also merged seamlessly without overwriting each other's contributions. - -2. **Network Latency and Partition**: uMap operates over networks that can experience delays or temporary outages. CRDTs can handle these conditions gracefully, enabling offline editing and eventual consistency. - -3. **Simplified Conflict Resolution**: Traditional methods often require complex algorithms to resolve conflicts, while CRDTs inherently minimize the occurrence of conflicts altogether. - -4. **Decentralization**: While uMap currently relies on a central server, adopting CRDTs could pave the way for a more decentralized architecture, increasing resilience and scalability. - -### Comparing with traditional data synchronization methods - -Traditional data synchronization methods typically rely on a central source of truth, such as a server, to manage and resolve conflicts. When changes are made by different users, these traditional systems require a round-trip to the server for conflict resolution and thus can be slow or inadequate for real-time collaboration. - -In contrast, CRDTs leverage mathematical properties (the fact that the datatypes can converge) to ensure that every replica independently reaches the same state, without the need for a central authority, thus minimizing the amount of coordination and communication needed between nodes. - -This ability to maintain consistency sets CRDTs apart from conventional synchronization approaches and makes them particularly valuable for the development of collaborative tools like uMap, where real-time updates and reliability are important. - -### Last Write Wins Registers - -For managing key/value data, I'm leaning onto Last-Write-Wins (LWW) registers within CRDTs. With LWW, the main concern is establishing the sequence of updates. In a single-client scenario or with a central time reference, sequencing is straightforward. However, in a distributed environment, time discrepancies across peers can complicate things, as clocks may drift and lose synchronization. - -To address this, CRDTs use vector clocks — a specialized data structure that helps to solve the relative timing of events across distributed systems and pinpoint any inconsistencies. - -> A vector clock is a data structure used for determining the partial ordering of events in a distributed system and detecting causality violations. -> -> – [Wikipedia](https://en.wikipedia.org/wiki/Vector_clock) - -At first, I found CRDTs somewhat confusing, owing to their role in addressing complex challenges. CRDTs come in various forms, with much of their intricacy tied to resolving content conflicts within textual data or elaborate hierarchical structures. Fortunately for us, our use case is comparatively straightforward. - -![CRDTs converging to the same state](/images/umap/crdt-converge.png) - -Note that we could also use a library such as [rxdb](https://github.com/pubkey/rxdb) — to handle the syncing, offline, etc — because we have a master: we use the server, and we can use it to handle the merge conflicts. But by doing so, we also give more responsibility to the server, whereas when using CRDTs it's possible to do the merge only on the clients. - -### Different types of CRDTs - -While reading the literature, I found that there are two kinds of CRDTs: state-based and operation-based. So, what do we need ? - -It turns out most of the CRDTs implementation I looked at are operation-based, and propose an -API to interact with them as you're changing the state, so **it doesn't really matter**. - -> The two alternatives are theoretically equivalent, as each can emulate the -> other. However, there are practical differences. State-based CRDTs are -> often simpler to design and to implement; their only requirement from the -> communication substrate is some kind of gossip protocol. **Their drawback is that -> the entire state of every CRDT must be transmitted eventually to every other -> replica, which may be costly**. In contrast, operation-based CRDTs transmit only -> the update operations, which are typically small. -> -> [Wikipedia on CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) - -### How the server fits in the picture - -While discussing with the automerge team, I understood that I was expecting the server to pass along the messages to the other parties, and that would be the way the synchronisation would be done. It turns out I was mistaken: in this approach, the clients send updates to the server, which merges everything together and only then sends the updates to the other peers. - -In order to have peers working with each other, I would need to change the way the provider works, so we can have the server be "brainless" and just relay the messages. - -For automerge, it would mean the provider will "just" handle the websocket connection (disconnect and reconnect) and all the peers would be able to talk with each other. The other solution for us would be to have the merge algorithm working on the server side, which comes with upsides (no need to find when the document should be saved by the client to the server) and downsides (it takes some cpu and memory to run the CRDTs on the server) - ---- -## Part 2: making a demo with different libraries - -Now that we're familiar with CRDTs and how they can help us, let's create a map application which syncs marker positions, on different clients. - -We'll be comparing three JavaScript libraries: [Y.js](https://yjs.dev/), [Automerge](https://automerge.org/) and [JSON Joy](https://jsonjoy.com), considering: - -1. **Efficiency**: Probe the bandwidth when doing edits. What's being transmitted over the wire? -2. **API**: is it easy to use for our use case? What are the challenging parts for us? -3. **Community and Support**: How is the size and activity of the developer community / ecosystem? -4. **Size** of the JavaScript library, because we want to limit the impact on our users browsers. - -### A leaflet map - -All the demos are made agains the same application, which creates markers when the map is clicked, and move the markers on hover. - -Here's the whole code for this: - -```js -import L from "leaflet"; -import "leaflet/dist/leaflet.css"; - -// Create a map with a default tilelayer. -const map = L.map("map").setView([48.1173, -1.6778], 13); -L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { - maxZoom: 19, - attribution: "© OpenStreetMap contributors", -}).addTo(map); - -// Features contains a reference to the marker objects, mapped by the uuids -let features = {}; - -// An upsert function -function upsertMarker({ latlng, uuid, local = false }) { - if (!uuid) uuid = crypto.randomUUID(); - let marker; - - if (Object.keys(features).includes(uuid)) { - marker = features[uuid]; - marker.setLatLng(latlng); - } else { - marker = new L.marker(latlng, { - draggable: true, - autoPan: true, - uuid: uuid, - }); - - features[uuid] = marker; - marker.addTo(map); - marker.on("dragend", ({ target }) => { - console.log("dragend"); - }); - } - - if (!local) { - console.log() - } -} - -// Add new features to the map with a click -map.on("click", ({ latlng }) => { - upsertMarker({ latlng }); -}); -``` - -Now, let's add synchronization. -### Y.js - -Y.js is the first library I've looked at, because it's the oldest one, and the more commonly referred to. - -The API seem to offer what we look for, and provides a way to [observe changes](https://docs.yjs.dev/api/shared-types/y.map#observing-changes-y.mapevent). Here's what I did: - -```js -import * as Y from "yjs"; -import { WebsocketProvider } from "y-websocket"; - -// Instanciate a document -const doc = new Y.Doc(); -``` - -To make changes to the CRDT: - -```js -let markers = doc.getMap("markers"); -markers.set(target.options.uuid, target._latlng); -``` - -To observe the changes: - -```js -markers.observe((event, transaction) => { - if (!transaction.local) { - event.changes.keys.forEach((change, key) => { - let value = markers.get(key); - if (change.action === "add") { - upsertMarker({ latlng: value, uuid: key, local: true }); - } else if (change.action === "update") { - upsertMarker({ latlng: value, uuid: key, local: true }); - } else if (change.action === "delete") { - console.log(`Property "${key}" was deleted. ".`); - } - }); - } -}); -``` - -It comes with multiple "providers", which make it possible to sync with different protocols (there is even a way to sync over the matrix protocol 😇). More usefully for us, there is [an implemented protocol for websockets](https://github.com/yjs/y-websocket). - -Using a provider is as easy as: - -```js -// Sync clients with the y-websocket provider -const provider = new WebsocketProvider( - "ws://localhost:1234", - "leaflet-sync", - doc -); -``` - -It's also possible to send "awareness" information (some state you don't want to persist, like the position of the cursor). It contains some useful meta information, such as the number of connected peers. - -```js -map.on("mousemove", ({ latlng }) => { - awareness.setLocalStateField("user", { - cursor: latlng, - }); -}); -``` - -I made [a quick proof of concept with Y.js](https://gitlab.com/almet/leaflet-sync/-/tree/yjs) in a few hours flawlessly. It handles offline and reconnects, and exposes awareness information. -#### Python bindings - -Y.js has been rewritten in rust, with [the Y.rs project](https://github.com/y-crdt/y-crdt), which makes it possible to use with Python (see [Y.py](https://github.com/y-crdt/ypy)) if needed. The project has been implemented quite recently and is currently looking for a maintainer. -#### Library size - -Size: Y.js is 4,16 Ko, Y-Websocket is 21,14 Ko -The library is currently used in production for large projects such as AFFiNE and Evernote. -#### The data being transmitted - -In the scenario where all clients connect to a central server, which handle the CRDT locally and then transmits back to other parties, I found that adding 20 points on one client, and then 20 points in another generates ~5 ko of data (~16 bytes per edit). - -| Pros | Cons | -| -------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| the API was feeling natural to me: it handles plain old JavaScript objects, making it easy to integrate. | It doesn't seem to work well [without a JS bundler](https://github.com/yjs/yjs/issues/325) which could be a problem for us. | -| It seems to be widely used, and the community seems active. | | -| It is [well documented](https://docs.yjs.dev/) | | -| There is awareness support | | - ---- -### Automerge - -[Automerge](https://automerge.org/) is another library to handle CRDTs. Automerge is actually the low level interface, and there is a higher-level interface exposed as [Automerge-repo](https://automerge.org/docs/repositories/). Here is how to use it: - -```js -import { Repo } from "@automerge/automerge-repo"; - -const repo = new Repo(); -let handle = repo.create() // or repo.find(name) -``` - -When you change the document, you actually call `change` which makes it possible to do the changes in a kind of "transaction function". - -```js -handle.change((doc) => { - doc[uuid] = cleanLatLng(target._latlng); -}); -``` - -Note that I had to use a `cleanLatLng` function in order to not pass the whole object, otherwise it wouldn't be serialized. It's really just a simple helper taking the properties of interest for us (and letting away all the rest). - -You can observe the changes, getting you the whole list of patches: - -```js -handle.on("change", ({ doc, patches }) => { - console.log(patches, doc); - patches.forEach(({ action, path }) => { - // We have to know the specifics of the patch operations getting passed - // two items in the path means we're inserting an object - if (path.length == 2 && action === "insert") { - let value = doc[path[0]]; - upsertMarker({ latlng: value, uuid: path[0], local: true }); - } - }); -}); -``` - -#### Python bindings - -There is an [automerge.py](https://github.com/automerge/automerge-py) project, but no changes has been made to it since 3 years ago. There are plans to update it, though. - -#### Library size - -Size: 1,64 mb, total is 1,74 mb. It's relying on Web assembly by default. - -The large bundle size is something that the team is aware of, and are working on a solution for. For us, it's important to have something as lightweight as possible, considering CRDTs is only one part of what we're doing, and that mapping can be done in context where connection is not that reliable and fast. - -#### The data being transmitted - -In the same scenario, I found that adding 20 points on one client, and then 20 points in another generates 90 messages and 24,94 Ko of data transmitted (~12 Ko sent and ~12Ko received), so approximately 75 bytes per edit. - -| Pros | Cons | -| -------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -| There is an API to [get informed when a conflict occured](https://automerge.org/docs/documents/conflicts/)

| Documentation was a bit hard to understand and to look at. Sometimes, it's easier to go look at the code.

| -| In general, the documentation is low level, which can be a good thing while debuging, or when getting more advanced usage. | The API is more verbose. You can see it as "less magical". | -| The team was responsive and trying to help. | There is no way (at the moment) to tell that a transaction is local or remote (but in practice it wasn't a problem) | - ---- -### JSON Joy - -[Json Joy](https://jsonjoy.com) is the latest to the party. - -It takes another stake by providing multiple libraries with a small functional perimeter. It sounds promising, even if still quite new, and would left us with the hands free in order to implement the protocol that would work for us. - -```js -import {Model} from 'json-joy/es2020/json-crdt'; -import { s } from "json-joy/es6/json-crdt-patch"; - -// Initiate a model with a custom ID - -const rootModel = Model.withLogicalClock(11111111); - -// populate it with default data -rootModel.api.root({ - markers: {}, -}); - -// Fork it on each client -let userModel = rootModel.fork(); -``` - -Making changes to the model. Here we are changing a constant for another one, by using `s.con`. - -```js -userModel.api.obj(["markers"]).set({ - [uuid]: s.con(target._latlng), -}); -``` - -Creating a patch, before sending it to the other parties: - -```js -import { encode, decode } from "json-joy/es6/json-crdt-patch/codec/verbose"; - -let patch = userModel.api.flush(); -let payload = encode(patch); -``` - -When receiving a message, decode it and apply it: - -```js -let patch = decode(payload); -model.api.apply(patch); -``` - -We can observe the changes this way. Here, we're having a look at the operation that happened and acting on it. The names of the operations aren't clearly specified by the spec. It seems a bit sketchy, so I'm not sure it's the way to handle this, but it works. - -```js -userModel.api.onPatch.listen((patch) => { - patch.ops.forEach((op) => { - if (op.name() === "ins_obj") { - let key = op.data[0][0]; - let value = userModel.view().markers[key]; - upsertMarker({ latlng: value, uuid: key, local: true }); - } - }); -}); -``` - -Metrics: - -- Size: 143 ko -- Data transmitted for 2 peers and 40 edits: (35 bytes per edit) - -| Pros | Cons | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| Low level, so you know what you're doing | It doesn't provide a high level interface for sync

| -| Small atomic libraries, making it easy to use only the parts we need. | It's currently a one-person project, without clear community channels to gather with other interested folks. | -| The interface [proposes to store different type of data](https://jsonjoy.com/libs/json-joy-js/json-crdt/guide/node-types) (constants, values, arrays, etc) | Quite recent, so probably rough spots are to be found | -| Distributed as different type of JS bundles (modules, wasm, etc) | - ---- -## Part 3: Key takeaways - -Y.js: - -- **JavaScript objects API**: uses native JS objects, making it easier to integrate with existing applications (but can also transport metadata we don't really want) -- **WebSockets**: a "connection provider" exists for WebSockets, handling offline changes, reconnections, etc. The currently implemented provider considers the server as a central node, which also maintains a CRDT locally. -- **Awareness API**: a protocol defined to send awareness information (who is connected, and for instance the cursor position) -- Versioning and history: Supports selective versioning through snapshots. -- Community and support: Active community with regular updates. -- Library Size / Network usage: Small size with efficient default compression of the data. - -Suitability for uMap: Ready-to-use with good documentation and examples, might do more than what we need, some bundler dependencies. - -Automerge: - -- **Transactional API**: API is transactional (edits should happen in a function), making it obvious, but can also be harder to implement. -- **WebSockets**: Multiple options with providers and storage, including WebSockets. It works similarly to the y.js one, with a copy of the data living on the server. There is currently no detection of offline / retry on disconnect, or awareness API. -- **Conflict Resolution**: [A conflict detection API](https://automerge.org/docs/documents/conflicts/) exists, which make it easy to get the conflicting values, when it happens. -- **Offline Changes Handling**: Requires a more manual approach to handle offline changes. -- Versioning and History: Designed with robust version history tracking. -- **Community and Support**: Strong support with a focus on collaboration. -- **Library Size / Efficiency**: Larger library with dependency on WebAssembly. - -JSON Joy: - -- **Lower-level API**: A low-level API offers granular control, it's more hands-on, but less magic. -- **WebSockets**: Nothing is provided in this area, and it would need to be implemented by ourselves. -- **Community and Support**: there is only one maintainer as of now, and the community doesn't exist yet. -- **Browser Compatibility**: Flexible bundles for diverse browser support, which might be helpful in our case. - -## Extra notes - -### YATA and RGA - -While researching, I found that the two popular CRDTs implementation out there use different approaches for the virtual counter: - -> - **RGA** [used by Automerge] maintains a single globally incremented counter (which can be ordinary integer value), that's updated anytime we detect that remote insert has an id -> with sequence number higher that local counter. Therefore every time, we produce -> a new insert operation, we give it a highest counter value known at the time. -> - **YATA** [used by Yjs] also uses a single integer value, however unlike in case of RGA we -> don't use a single counter shared with other replicas, but rather let each -> peer keep its own, which is incremented monotonically only by that peer. Since -> increments are monotonic, we can also use them to detect missing operations eg. -> updates marked as A:1 and A:3 imply, that there must be another (potentially -> missing) update A:2. - -### Resources - -- [CRDTs: The Hard Parts](https://www.youtube.com/watch?v=x7drE24geUw), a video by Martin Kleppmann where he explains the current state of the art of CRDTs, and why some problems aren't solved yet. -- [An Interactive Intro to CRDTs](https://jakelazaroff.com/words/an-interactive-intro-to-crdts/) gets you trough different steps to understand what are CRDTs, and how to implement a LWW Register. -- [Bartosz Sypytkowski](https://www.bartoszsypytkowski.com/the-state-of-a-state-based-crdts/) introduction on CRDTs, with practical exemples is very intuitive. -- [CRDT Implementations](https://jzhao.xyz/thoughts/CRDT-Implementations) contains nice information and vocabulary useful when working with CRDTs. diff --git a/content/code/2024-03-18-crdts.md b/content/code/2024-03-18-crdts.md new file mode 100644 index 0000000..77f798d --- /dev/null +++ b/content/code/2024-03-18-crdts.md @@ -0,0 +1,493 @@ +--- +title: A comparison of JavaScript CRDTs +tags: crdts, umap, sync +display_toc: true +--- + +Collaboration is one of the most requested features on [uMap](https://umap-project.org). +I've talked [in previous articles](https://blog.notmyidea.org/tag/umap.html) how +we could add real-time features "the simple way", by: + +- a) catching when changes are done on the interface ; +- b) sending messages to the other parties and ; +- c) applying the changes on the receiving client. + +This works well in general, but it doesn't take care of conflicts handling, especially when a disconnect can happen. + +For this reason, I got more into "Conflict-free Resolution Data Types" (CRDTs), with the goal of understanding what they are, how they work, what are the different libraries out there, and which one would be a good fit for us, if any. + +As things are changing quickly in this field, note that this article was written in March 2024. + +--- + +[TOC] + +--- + +## Part 1 - What are CRDTs? + +Conflict-free Resolution Data Types are a family of data types able to merge their states with other states without generating conflicts. They handle consistency in distributed systems, making them particularly well-suited for collaborative real-time applications. + +CRDTs ensure that multiple participants can make changes without strict coordination, and all replicas converge to the same state upon synchronization, without conflicts. + +"Append-only sets" are probably one of the most common type of CRDT: you can add the same element again and again, it will only be present once in the set. It's our old friend `Set`, as we can find in many programming languages. + +### Why using CRDTs? + +For uMap, CRDTs offer a solution to several challenges: + +1. **Simultaneous Editing**: When multiple users interact with the same map, their changes must not only be reflected in real-time but also merged seamlessly without overwriting each other's contributions. We need all the replicas to converge to the same state. + +2. **Network Latency and Partition**: uMap operates over networks that can experience delays or temporary outages (think editing on the ground). CRDTs can handle these conditions gracefully, enabling offline editing and eventual consistency. + +3. **Simplified Conflict Resolution**: Traditional methods often require complex algorithms to resolve conflicts, while CRDTs inherently minimize the occurrence of conflicts altogether. + +4. **Server load**: uMap currently relies on central servers (one per instance). Adopting CRDTs could help lower the work done on the server, increasing resilience and scalability. + +### Traditional data synchronization methods + +Traditional data synchronization methods typically rely on a central source of truth (the server) to manage and resolve conflicts. When changes are made by different users, these traditional systems require a round-trip to the server for conflict resolution and thus can be slow or inadequate for real-time collaboration. + +In contrast, CRDTs leverage mathematical properties (the fact that the data types can converge) to ensure that every replica independently reaches the same state, without the need for a central authority, thus minimizing the amount of coordination and communication needed between nodes. + +This ability to maintain consistency sets CRDTs apart from conventional synchronization approaches and makes them particularly valuable for the development of collaborative tools like uMap, where real-time updates and reliability are important. + +### Solving complex cases + +At first, I found CRDTs somewhat confusing, owing to their role in addressing complex challenges. CRDTs come in various forms, with much of their intricacy tied to resolving content conflicts within textual data or elaborate hierarchical structures. + +Fortunately for us, our use case is comparatively straightforward, and we probably only need LWW registers. + +### Last Write Wins Registers + +As you might have guessed from the name, a LWW register is a specific type of CRDT which "just" replaces the value with the last write. The main concern is establishing the sequence of updates, to order them together (who is the last one?). + +In a single-client scenario or with a central time reference, sequencing is straightforward. However, in a distributed environment, time discrepancies across peers can complicate things, as clocks may drift and lose synchronization. + +To address this, CRDTs use vector clocks — a specialized data structure that helps to solve the relative timing of events across distributed systems and pinpoint any inconsistencies. + +> A vector clock is a data structure used for determining the partial ordering of events in a distributed system and detecting causality violations. +> +> – [Wikipedia](https://en.wikipedia.org/wiki/Vector_clock) + +
+ CRDTs converging to the same state +
+ +Note that we could also use a library such as [rxdb](https://github.com/pubkey/rxdb) — to handle the syncing, offline, etc. — because we have a master: we use the server, and we can use it to handle the merge conflicts. +But by doing so, we would give more responsibility to the server, whereas when using CRDTs it's possible to do the merge only on the clients (enabling no-master replications). + +### State-based vs Operation based + +While reading the literature, I found that there are two kinds of CRDTs: state-based and operation-based. It turns out most of the CRDTs implementation I looked at are operation-based, and propose an API to interact with them as you're changing the state, so **it doesn't really matter** in practice. + +> The two alternatives are theoretically equivalent, as each can emulate the +> other. However, there are practical differences. State-based CRDTs are +> often simpler to design and to implement; their only requirement from the +> communication substrate is some kind of gossip protocol. **Their drawback is that +> the entire state of every CRDT must be transmitted eventually to every other +> replica, which may be costly**. In contrast, operation-based CRDTs transmit only +> the update operations, which are typically small. +> +> [Wikipedia on CRDTs](https://en.wikipedia.org/wiki/Conflict-free_replicated_data_type) + +### How the server fits in the picture + +While discussing with the automerge team, I understood that I was expecting the server to pass along the messages to the other parties, and that would be the way the synchronization would be done. It turns out I was mistaken: in this approach, the clients send updates to the server, which merges everything together and only then sends the updates to the other peers. It makes it easy for the server to send back the needed information to the clients (for new peers, or if the peers didn't cache the data locally). + +In order to have peers working with each other, I would need to change the way the provider works, so we can have the server be "brainless" and just relay the messages. + +For automerge, it would mean the provider will "just" handle the websocket connection (disconnect and reconnect) and all the peers would be able to talk with each other. The other solution for us would be to have the merge algorithm working on the server side, which comes with upsides (no need to find when the document should be saved by the client to the server) and downsides (it takes some cpu and memory to run the CRDTs on the server) + +### How offline is handled + +I was curious about how offline editing might work, and what would happen when going back online. Changes can happen both online and offline, making no difference for the "reconciliation" step. When going back online, a "patch" is computed by the newly reconnected peer, and sent to the other peers. + +--- + +## Part 2: JavaScript CRDTs + +Now that we're familiar with CRDTs and how they can help us, let's create a map application which syncs marker positions, on different browsers. + +We'll be comparing three JavaScript libraries: [Y.js](https://yjs.dev/), [Automerge](https://automerge.org/) and [JSON Joy](https://jsonjoy.com), considering: + +1. **Their external API**: is it easy to use in our case? What are the challenging parts? +2. **Community and Support**: What is the size and activity of the developer community / ecosystem? +3. **Size of the JS library**, because we want to limit the impact on our users browsers. +4. **Efficiency**: Probe the bandwidth when doing edits. What's being transmitted over the wire? + +I setup a demo application for each of the libraries. Everything is available [in a git repository](https://gitlab.com/umap-project/leaflet-sync) if you want to try it out yourself. + +### The demo application + +All the demos are made against the same set of features. It + +- Creates a marker when the map is clicked +- Moves the markers on hover. + +This should probably be enough for us to try out. + +Here's the whole code for this, using [Leaflet - a JavaScript library for interactive maps](https://leafletjs.com/). + + +```js +import L from "leaflet"; +import "leaflet/dist/leaflet.css"; + +// Create a map with a default tilelayer. +const map = L.map("map").setView([48.1173, -1.6778], 13); +L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", { + maxZoom: 19, + attribution: "© OpenStreetMap contributors", +}).addTo(map); + +// Features contains a reference to the marker objects, mapped by the uuids +let features = {}; + +// An upsert function, creating a marker at the passed latlng. +// If an uuid is provided, it changes the coordinates at the given address +function upsertMarker({ latlng, uuid }) { + if (!uuid) uuid = crypto.randomUUID(); + let marker; + + if (Object.keys(features).includes(uuid)) { + marker = features[uuid]; + marker.setLatLng(latlng); + } else { + marker = new L.marker(latlng, { + draggable: true, + autoPan: true, + uuid: uuid, + }); + + features[uuid] = marker; + marker.addTo(map); + marker.on("dragend", ({ target }) => { + console.log("dragend"); + }); + } +} + +// Add new features to the map with a click +map.on("click", ({ latlng }) => { + upsertMarker({ latlng }); +}); +``` + +It does the following: + +- Creates a map zoomed on Rennes, France +- Maintains a `features` object, referencing the added markers +- Provides a `upsertMarker` function, creating a marker on the map at the given latitude and longitude, and updating its latitude and longitude if it already exists. +- It listens to the `click` event on the map, calling `upsertMarker` with the appropriate arguments. + +Note that the data is not "reactive" (in the sense of React apps): there is no central state that's updated and triggers the rendering of the user interface. + +### Y.js + +Y.js is the first library I've looked at, probably because it's the oldest one, and the more commonly referred to. + +The API seem to offer what we look for, and provides a way to [observe changes](https://docs.yjs.dev/api/shared-types/y.map#observing-changes-y.mapevent). Here's how it works: + +```js +import * as Y from "yjs"; +import { WebsocketProvider } from "y-websocket"; + +// Instanciate a document +const doc = new Y.Doc(); +``` + +When we add a new marker, we update the CRDT (`markers.set`). + +```js +let markers = doc.getMap("markers"); +markers.set(target.options.uuid, target._latlng); +``` + +Another connected peer can observe the changes, like this: + +```js +markers.observe((event, transaction) => { + if (!transaction.local) { + event.changes.keys.forEach((change, key) => { + let value = markers.get(key); + switch(change.action){ + case 'add': + case 'update': + upsertMarker({ latlng: value, uuid: key, local: true }); + break; + case 'delete': + console.log(`Property "${key}" was deleted. ".`); + } + }); + } +}); +``` + +We cycle on the received changes, and then apply them on our map. In the case of an offline peer coming back online after some time, the `observe` event will be called only once. + +I'm not dealing with the case of marker deletions here, but deleted items are also taken into account. The data isn't really deleted in this case, but a "tombstone" is used, making it possible to resolve conflicts (for instance, if one people deleted a marker and some other updated it during the same time). + +Y.js comes with multiple "connection providers", which make it possible to sync with different protocols (there is even [a way to sync over the matrix protocol](https://github.com/yousefED/matrix-crdt) 😇). + +More usefully for us, there is [an implemented protocol for WebSockets](https://github.com/yjs/y-websocket). Here is how to use one of these providers: + +```js +// Sync clients with the y-websocket provider +const provider = new WebsocketProvider( + "ws://localhost:1234", + "leaflet-sync", + doc +); +``` + +This code setups a WebSocket connection with a server that will maintain a local copy of the CRDT, as explained above. + +It's also possible to send "awareness" information (some state you don't want to persist, like the position of the cursor). It contains some useful meta information, such as the number of connected peers, if they're connected, etc. + +```js +map.on("mousemove", ({ latlng }) => { + awareness.setLocalStateField("user", { + cursor: latlng, + }); +}); +``` + +I made [a quick proof of concept with Y.js](https://gitlab.com/umap-project/leaflet-sync/-/tree/yjs) in a few hours flawlessly. It handles offline and reconnects, and exposes awareness information. + +#### Python bindings + +Y.js has been ported to rust with [the Y.rs project](https://github.com/y-crdt/y-crdt), making it possible to have binding in other languages, like ruby and python (see [Y.py](https://github.com/y-crdt/ypy)). The python bindings are currently looking for a maintainer. + +#### Library size + +- Y.js is 4,16 Ko +- Y-Websocket is 21,14 Ko + +#### The data being transmitted + +In a scenario where all clients connect to a central server, which handles the CRDT locally and then transmits back to other parties, adding 20 points on one client, then 20 points in another generates ~5 Ko of data (so approximately 16 bytes per edit). + +Pros: + +- The API was feeling natural to me: it handles plain old JavaScript objects, making it easy to integrate. +- It seems to be widely used, and the community seems active. +- It is [well documented](https://docs.yjs.dev/) +- There is awareness support + +Cons: + +- It doesn't seem to work well [without a JS bundler](https://github.com/yjs/yjs/issues/325) which could be a problem for us. +- The Websocket connection provider doesn't do what I was expecting it to, as it requires the server to run a CRDT locally. + +--- +### Automerge + +[Automerge](https://automerge.org/) is another CRDT library started by the folks at [Ink & Switch](https://www.inkandswitch.com/) with Martin Kleppmann. Automerge is actually the low level interface. There is a higher-level interface named [Automerge-repo](https://automerge.org/docs/repositories/). Here is how to use it: + +```js +import { Repo } from "@automerge/automerge-repo"; + +const repo = new Repo(); +let handle = repo.create() +// or repo.find(name) +``` + +To change the document, call `handle.change` and pass it a function that will make changes to the document. + +Here, when a new marker is added: + +```js +handle.change((doc) => { + doc[uuid] = cleanLatLng(target._latlng); +}); +``` + +I had to use a `cleanLatLng` function in order to not pass the whole object, otherwise it wouldn't serialize. It's really just a simple helper taking the properties of interest for us (and letting away all the rest). + +Another peer can observe the changes, like this: + +```js +handle.on("change", ({ doc, patches }) => { + patches.forEach(({ action, path }) => { + if (path.length == 2 && action === "insert") { + let value = doc[path[0]]; + upsertMarker({ latlng: value, uuid: path[0], local: true }); + } + }); +}); +``` + +The "patch" interface is a bit less verbose than the one from Y.js. It wasn't well documented, so I had to play around with the messages to understand exactly what the possible actions were. In the end, it gets me what I'm looking for, the changes that occurred to my data. + +Here I'm using `path.length == 2 && action === 'insert'` to detect that a change occurred to the marker. Since we don't make a difference between the creation of a marker and its update (when being moved), it works well for us. + +#### Python bindings + +There are [python bindings](https://github.com/automerge/automerge-py) for automerge "core". (It doesn't — yet — provide ways to interact with "repos"). + +#### Library size + +- Size of the automerge + automerge repo: 1,64 mb +- Size of the WebSocket provider: 0,10 mb + +This is quite a large bundle size, and the team behind automerge is aware of it and working on a solution. + +#### The data being transmitted + +In the same scenario, adding 20 points on one client, then 20 points in another generates 90 messages and 24,94 Ko of data transmitted (~12 Ko sent and ~12Ko received), so approximately 75 bytes per edit. + +Pros: + +- There is an API to [get informed when a conflict occurred](https://automerge.org/docs/documents/conflicts/) +- Python bindings are currently being worked on, soon to reach a stable version +- The team was overall very responsive and trying to help. + +Cons: + +- The JavaScript is currently generated via Web Assembly, which could make it harder to debug. +- The large bundle size of the generated files. + +--- + +### JSON Joy + +[JSON Joy](https://jsonjoy.com) is the latest to the party. + +It takes another stake by providing multiple libraries with a small functional perimeter. It sounds promising, even if still quite new, and would leave us with the hands free in order to implement the protocol that would work for us. + +Here is how to use it. On the different peers you start with different forks of the same document: + +```js +import {Model} from 'json-joy/es2020/json-crdt'; +import { s } from "json-joy/es6/json-crdt-patch"; + +// Initiate a model with a custom ID + +const rootModel = Model.withLogicalClock(11111111); + +// populate it with default data +rootModel.api.root({ + markers: {}, +}); + +// Fork it on each client +let userModel = rootModel.fork(); +``` + +When adding a new marker, we can define a new constant, by using `s.con`… + +```js +userModel.api.obj(["markers"]).set({ + [uuid]: s.con(target._latlng), +}); +``` + +… and then create a patch and send it to the other peers: + +```js +import { encode, decode } from "json-joy/es6/json-crdt-patch/codec/verbose"; + +let patch = userModel.api.flush(); +let payload = encode(patch); +``` + +On the other peers, when we receive a patch message, decode it and apply it: + +```js +let patch = decode(payload); +model.api.apply(patch); +``` + +We can observe the changes this way: + +```js +userModel.api.onPatch.listen((patch) => { + patch.ops.forEach((op) => { + if (op.name() === "ins_obj") { + let key = op.data[0][0]; + let value = userModel.view().markers[key]; + upsertMarker({ latlng: value, uuid: key, local: true }); + } + }); +}); +``` + +Similarly to what we did with automerge, we're having a look into the patch, and filter on the operations of interest for us (`ins_obj`). The names of the operations aren't clearly specified by the spec. + +Metrics: + +- Size: 143 ko +- Data transmitted for 2 peers and 40 edits: (35 bytes per edit) + +Pros: + +- Small atomic libraries, making it easy to use only the parts we need. +- The interface [proposes to store different type of data](https://jsonjoy.com/libs/json-joy-js/json-crdt/guide/node-types) (constants, values, arrays, etc.) +- Distributed as different type of JS bundles (modules, wasm, etc.) +- Low level, so you know what you're doing + +Cons: + +- It doesn't provide a high level interface for sync +- It's currently a one-person project, without clear community channels to gather with other interested folks. +- Quite recent, so probably rough spots are to be found + +--- + +## Part 3: Comparison table + +I found Y.js and Automerge quite similar for my use case, while JSON Joy was taking a different (less "all-included") approach. Here is a summary table to help read the differences I found. + +| | Y.js | Automerge | JSON Joy | +| ---------------------- | ------------------------------------ | -------------------------------------------------- | ------------------------------------------------------- | +| Python bindings | [Yes](https://github.com/y-crdt/ypy) | [Yes](https://github.com/automerge/automerge-py) | No | +| Syncing | Native JS structures | Transactional functions | Specific types (bonus points for handling constants) | +| Coded in | JavaScript / Rust | TypeScript / Rust | Typescript | +| Awareness protocol | Yes, with presence | Yes, without presence | No | +| Conflict-detection API | No | Yes | No | +| Library size | **24.3Ko** §
| **1,74 mb** § | **143 ko** | + +§ size of the connectors included + +### Working with patches + +In order to observe the changes, we need to inspect the given patches and work on what we find. I found the different libraries expose different sets of APIs. All of these APIs were quite a bit hard to find, and it's not clear if they are public or private. + +One thing to keep in mind is that these "patch" events happen only once per patch received. You can see it as a "diff" of the state between the current and the incoming states. + +- Y.js exposes a utility which is able to tell you what the action on the key is ("delete", "update" and "add") +- Automerge and JSON Joy, on the other hand, don't provide such utility functions, meaning you would need to find that out yourself. + +### Conclusion + +The goal here is not to tell which one of these libraries is the best one. They're all great and have their strenghs. None of them implement the high-level API I was expecting, where the clients talk with each other and the server just relays messages, but maybe it's because it's better in general to have the server have the representation of the data, saving a roundtrip for the clients. + +I wasn't expecting to have a look at patches to understand what changed at the low level. The way it's currently implemented is very suitable for "reactive" applications, but require more involvement to sync between the CRDTs state and the application state. + +In the end, adding CRDTs is made very simple, probably due to the fact all we really need is a sort of distributed key/value store. + +I'm not sure yet which library we will end up using for uMap (if any), but my understanding is clearer than it was when I started. I guess that's what progress looks like 😎 + +## Extra notes + +### YATA and RGA + +While researching, I found that the two popular CRDTs implementation out there use different approaches for the virtual counter: + +> - **RGA** [used by Automerge] maintains a single globally incremented counter (which can be ordinary integer value), that's updated anytime we detect that remote insert has an id +> with sequence number higher that local counter. Therefore, every time we produce +> a new insert operation, we give it a highest counter value known at the time. +> - **YATA** [used by Yjs] also uses a single integer value, however unlike in case of RGA we +> don't use a single counter shared with other replicas, but rather let each +> peer keep its own, which is incremented monotonically only by that peer. Since +> increments are monotonic, we can also use them to detect missing operations eg. +> updates marked as A:1 and A:3 imply, that there must be another (potentially +> missing) update A:2. + +### Resources + +- [CRDTs: The Hard Parts](https://www.youtube.com/watch?v=x7drE24geUw), a video by Martin Kleppmann where he explains the current state of the art of CRDTs, and why some problems aren't solved yet. +- [An Interactive Intro to CRDTs](https://jakelazaroff.com/words/an-interactive-intro-to-crdts/) gets you trough different steps to understand what are CRDTs, and how to implement a LWW Register. +- [Bartosz Sypytkowski](https://www.bartoszsypytkowski.com/the-state-of-a-state-based-crdts/) introduction on CRDTs, with practical examples is very intuitive. +- [CRDT Implementations](https://jzhao.xyz/thoughts/CRDT-Implementations) are notes by Jacky which were useful to me when understanding CRDTs. diff --git a/content/extra/robots.txt b/content/extra/robots.txt index f3e996e..b1a115a 100644 --- a/content/extra/robots.txt +++ b/content/extra/robots.txt @@ -1,20 +1,20 @@ -User-agent: ChatGPT-User -Disallow: / +user-agent: ChatGPT-User +disallow: / -User-agent: GPTBot -Disallow: / +user-agent: GPTBot +disallow: / -User-agent: Twitterbot -Disallow: / +user-agent: Twitterbot +disallow: / -User-agent: CCBot -Disallow: / +user-agent: CCBot +disallow: / -User-agent: Google-Extended -Disallow: / +user-agent: Google-Extended +disallow: / -User-agent: Omgilibot -Disallow: / +user-agent: Omgilibot +disallow: / -User-agent: FacebookBot -Disallow: / +user-agent: FacebookBot +disallow: / diff --git a/content/images/umap/crdt-converge.png b/content/images/umap/crdt-converge.png index 5bbfc5cac419abe5afd2d7ba941c2dfb6e3a7abe..395a6421f8415fdb02dce2630240b896781a9e3c 100644 GIT binary patch literal 33833 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

5C1MUKCo%cl^! z=P~?xMp%f8r?Gu9v=+;CbTMm=J=1Le>JsRPv`J042CHww1SaH}bxsq-H&eCze2eU5 zu_f<5f>g!uLWW7et|izY*Z8nB6DUM}*aK8!f(NCtreT4E|JQODu*VhXZgz@+n#&?s zN5=)YP)*p5>I{y2O`Y=e&Ojum?X}ZM%a3&0d7(G4@hg~DaULpud&R)~fu@h{`PW@~ zlt(A2iZSL$4G>%(@E_{eN$|d?nKCX6;ToEgOhb$~Z2mp=kN)V_)BXqN#`X4#`C&?c znLYwoBlaq2u=?r+5I4C5d9$l#-+of7tA{O^*r7O?vY8>x!nG9y4H}3+fa(BCviKpG zbYY+1*xLhCuqTltXr2d9BFyPQKstut3qAU7yi-^Ja%;QZlU{LgyO%5GL*{SH^NfDu z#sZ~TShx*5)e#KS2+P|QNSaUCerVq!`JzYN8pIKXUIE{Y7e6(xwO?lP`Q0z=G+pkjY zCd5!535SW5sry_s1KZ&dY&9YZDaw*^ z`Q^A6sU#1g>Vl;f7GKGkUHrTZ#mTEznw01H`ETMht|vf>U}qTbXIRNx$p~z1NX(V? z4QhKj>sLHsKckyEj~QXL{gmv#m(&>gjk)ZQXBRJ;OhtA={VPLfAJHo>)Za(0a;!^0 zk5-E>6vzY3es2Y`vWp-|dicb*QR!+l48-{+7Y!~K7W7L1N_BWrHXvt>3Bb8kpdJ_S z3m?n;B2f_DOt5z(+w)c6{onhVuq@Q=X6KSJnEKQrO!en7N_H5Jqq=YXYE10-YWRFi zY<%3h`!WRi2!@Zo1gk3|bU%+TW%p-w2A5WQP7$1?ZZO$$T6#3X z)6Y}8hi;w1_=tQHI=TjZPfvUCId_!(?th=3{C&@V1C%+QQd#fBO=RZ-VFoNr?XGV} zMUhlz$5&uGFdztggQ&5Tcgetc7gkPG<7IUeUQdVX?he#{eB#+&&Pbg^|E>OZ885yB zwv}nuDy8mB7ILH%MCu5}__j3(h+1J&Dv`SW}-AlqJNJ`Q1D}lea}c z{`NZOf_a|bpGYoimx=h59na(X!V*3CuW6C%qyz~*?)d9~-&Ak>x%`p8%6^53Bwtpa zR6fOyccCeL`6))2@u#GLWXLbHrBER+N2hh;OzU;)uvMOZ!TvU70*sA(rVn7-p0?jZ ze<(cWU!#Qfyv0{ezZc22uUjRDO3dF`74k~^-G`oh?S~MW#ttq2tQ_x9ba?&%=|gEav-wW>Z5|MS4LlF zgEEUSl8u6F;X6qXa@bJfg+9RKn09Dzp(N@(WAPXg!al{>;Ruqv*itLQYl6S+_#A%~ z%Jv!B$dQS@Qcla{8qDaY(p`ONm;fs|#8OofL|GO3$h+H_audjq7s^%^Uc*u+*l=H| zB}at6rr;_^N<~Mf#*}JIT+54D#6ALrw=1o%LgsJU{CBU32-?#;;!lQXq)P^$Wy%5h z>pU&Eku>ahl493H(XF#1_B0f+lT!G|Xiqa!BucEf7Yb1?oM8$10MiJm+hju9+z7<@ zsQrc32BCKvLXGgElF+Z-$k(sU#8!e3DZG#aVzA09Mk&E@WQh>&=TrO2WNRSha?+xC z`HPXogd6d1o^UtS)oH>ck~s8}+gRqkHSsj|F{T=AQc{GiZHk>Mj&(i-Bkl;1+goLZ zmCwrPSk|%|(pDC7q|lOfa%a`KEM;}9BUy60kHN*a-5+o@I8^tS=g#@-2>oDW!Cm&uR8h(OU|3v9f+(wnPjd(HXG|~Td@TNx z4x^+5tJR}#aGBMK#S5FIr8i9b3On=&N)fU}Qk}?&wA>^-5|h-E$UICxW(pw#Vd&=6 z;-`QW^U_7~p^G|`C!Qn_+G7C^pX_?$GZM!rcbXq39Y)Gi&MW`Yz&TVDh;1EuwA0@s znp+BE$MS6{!D{)5=OB$* zx|WIGkY$5F+m~Yy0?$myH1YA;Z7Vac4L3J4i^uv(Lips}>3C_4aDmJg&RbS9<)BQx zc-|~Xs~Xj+)f$PSexXWzsg1&quu%ycA$sEA!rk+38zPEpB(kWsLXF##pe%p1SYm;x zmmZc0^_~q*Jx{35*=&?YM{iBHiYZ=`2`ZW5tp`kW9r7%Z5(|jQWwlac%vart7kKi= zm{D2>_>s*A%fS(bYKB8>^B#h>IFDX%G!7z&ZVK)F(++haUvjBDj0 zaob0L7pTqrsZtH}8*ny*0+GZGQ0HO3pq z6-yXkR=H9yRjAlbcT53odm!`c3cE1h;#dB=V0D0g8JP}$_kxTZ+h9ZXH^WFj&y7&O zU{pYwujSh~K2*HOPX-;OWmGH*jKy}PMeWph_^`PNf`Sk(69YIsG;C`qbs`yAAjY`3-VrqCI8KL0F4-mE!IEP}w~t z25yXRxal`&hRBR(tB#K+?NXus1w_2lRmLLx$gKJ*(=0;M z_p-_MKn_mv>P>q5w0$Gc|GU+)JeBS_+fo@35auK=s+axUJRyT_puQI+m%uWs{A}c{ zdPWHcIz)w<>*IG{dw9M*87QCiRaSLf+k3SHMizV|%>IlgQ|&F>jcOwkS3F8qiV+TYHilJL8KJrT)D$MrW#n5kEwl@Y$NhCeAutsWE;%*RC4A_@tCl%n&4f1 zm{xYq56JA9!{#X)$Rzi&o5NT#3{r8i_RGK3hm$u_^YP7|YeeheO&(1In7&`33>jOf ze;sB}l!eU9^^%@@^PZMZC)>Lp1^JO1mjo%VLsCEs)w?HF@O+cec_1aric#iw0%NdX z7-_Nr%RHRreQpV*#f9D1Y?egOb_aQDcG^bytbzHDO}om@#ilE7?-0jP5K@H3%{7N3 zYaC;;m(O01C#0xRqndnU`xBdaNW(8~9XpY0Y8En4xET0&zqFCC33o2?@<5n303x|g zyB_`#Ir#ydPY^;K{2Q=dj@#UJ*LqgyyAj}jnCSiJ1jgk{&7aSH!dDz`wivu33B_#S zV3#FFDOh`JcAuE|=U9@Qc;aEwr05z0*)wpa2HD!F`zwxW!C@|coTL1Sgne2)uVOIV zdMMy@;Bgyk9F$x4-pw}q$&#dPaHxRWz@W!;)m79ojDkG3`*Ll}l-ZB*YO<=QE3>30jv^!7NtA5u z2aVDb2-_avD%JrG`|id`d+=6{qXZZG$}sYzxAZRqXNITBGOysV?KNPdU5_|^U8nMHt!$&-uB$w0l$zbEESelt*cU36uwx}KAEm>b*Z4F><@-(g z#VAN~i#}F~;Xg1=zkKM|^DuhxUGtX7m)HqQ>uUalw@8?R>nPV_n1KL3=porTu_K8G zr4M0CIgG%z!1?+OT4F*5V-R^~fCS5M22Oq^MXDln zywO{?C4~ur>iSa*QGqeD9(6QAlrwr~n^g7oVim%E_;ypv8Eu?wFZMZ(>FNvInXLYt zkA;qC$ZLWGY3$QHwz5uLYC};G;qoYO)-~mWMTo`Hd}5}^@kw}JHVYa|Y}g$}jV{4=w==*ZiOEZC<`Kq? z-p?&pABL^jNdH>BcWz#kZ8#?)vFm%o=_|P;Y)5nHFH+XhtsJ zsg)~tA^f3Gd??q_Ejh=I3Z0OLBAyWAvo)4|WkbkT@!~MPf+Fin6@Tp!czOP|g5kEp zP(PFVdrLakBbl`vYDvDm=9}z2zjF>oszbO{-V{b`YKg1wj3eoi^W0uh z(ZUG0{vHb?mNo|i49Prf2eA&9Xd-5`&~pJB+!K;e8aA~$iDXo+JGDE2shpdUULo2L zxRNNrc(mhv@${KDG;l+)WKH2Fa2e9ToR%O$qnJ6fQ)nkR7SwHrhKZOE&7Ue0hIuBv z9+u*%AH^Rjm!qRF9E^ifuaJu=A?S=35Ecsfcln~IvP5h#=|qRu!QE*P$+BATWf z_+)b1)|=rfYiDych<_;1v9BA4tYCeZFv&{K z^P$T{#lL69I%F3PQ4UQ-wdJo&g^!C1%oL^}iTEvD{z*?(U-Mo|;`r@h5UOqF#G6$q zN6Yh*r(>(wS6H+T0M7LH^D6y~#D$EU)L<#glj8Vye>ThT#L-Oy;xs?nM{O6_`3)I+ zCmk}8jnezYpM^hAe)7ax=GvfGvScsn#7O!3&U9b4St3~iYso4Y$>GTWBTJlPiAkTY;sXWW^u&7 z@ZNW_G&12a=_s{04g960|H+uM4>Y&hX7At$?9Xn)p`C@^bSidQrcT45)3exzi9==oN+(R6jFQgP1Q=%Bgp` zOVA{KSV&K}o1vRap-}(?E@dx8;$M{ikZjXz6;T#GhKx*8guNQ21s((tU%wYPJ) zQCy?Ol-UV^dgK>0l$&^SwG~SLQ~63`H7ANO89vxkhFLl%ejIw3E@<|q8~^IZ;G_tl z%n3a{Yr+YRC7CX9NmF@fEIt48t>wrFvWe?+bdzMW$zX4)%5iz$B-;WsKl6t0p5M|`dJsf)*>jEUzJ zkWF$-681ix@TWtf6s;S!c}lO4T2!RTua$hzk=-8Jenf~z{}c3cA-czt!! z2cBvjhPPu%^F;pW;z3ejlAPp}e3Pb|?Bn$kj9Qk~tlnx%89XT82B52C84Qg<*2msl zQ5~a=Mns<{==~YKDqYX*B1pbrzf`lURt!O2q5+WiCx?G}H6v^d#7hVf zgAD$VV+S&vlZqodP2fHn7cpu|1yXrIqSD=!0u; z%@7<>!g-RxdJ_xZC-FJeE%@z{V=dky-ILr3j@1f|H^p5T8=Y`Cl|T3vFHEyOTA~L_ zF$1o@8TtfN2!W$|o6;#XV=XFg*&w|Dv$Lgf^+d}0rc`YPhR3=Z5i=94L<-$Qg{Tv+>3vB~of4B6#GbtyXqXMMpBQCyc31!fCUsnXgWCzkEi`&@Ub%YeD=9A`e% zRc<}1+1)HsZnkf~63E&JQsnElcLT0*yS7mdQOH#8NG9WAl4apikmvQC`cTFj1qPo= ziwFoJSO+@2=#uO8uCJqtzo$yO^82fnrq4E*{=&c1bu=ZMUqUF|zND>JIq1+B!AM;9 zrw__9p7u#*-N;PQ%jGh>;n6iXidr7qH|Om&y`QR;uW5s9(sTl@k`xPvu^ar%s{)6J ztM=k6BzU>oGnBOS+DGM{a3R54eivT-E#JEO^~ANefNl9{Pqz(#Lw=%_@?BRTUk4w` zc|rI3rQ}&@AYZX$sI}|f3vfve}H)1mK$20sYw~y&dZKNsv zf&6lcU!dGRdm^az32hX?s{Fiin(qHU5?&&wqADp^oKwj(}N!5g7Zyof<%k!ng~S3o~(=+WjDWeO&>LF zE+9eZqY0{HL;f4qY*VblBx$meHKD~XC^G*hOWn|o907-!7e37J9ZJyFIb%@eFgYno zBTBFzB)_>rCJ_!EDpfcE!Ep&^RK5>q0Iy*%+QWKA6W2ABCXVkx6#1Tl9x4TgAOg)y znwrJ*_}q0w)nZXfi}MU2s*O28F~om};l!=D>4n}T%?X}g$b>tz5g$HBix*WSCsKL3 zNh?JgF*pQYYMPLO2NQHdrN-lHOsg`&_<{a6KFwa7pdhub-kec-ht@G#!9bb~L*CML zc{mN?&$vn-I|X-H5%MxQF2eH{SxsHAa86MWqMsDHhK>?4?qNirifp0M%NU|TaNNtd zV^9x5QN`o!e_WXNt<68d!8eKk%$Cfg^JlpsQUgzp+@2do;<`tZpZ(bX$hP1{=P9JO zvm18gP^J(?=LWEY2^MaPvt>(D@OXa z0tP%(t{^BN{jeeL#lV~uIW6&heQ(djlb}jlll*BS9t6QwTRY-l<$7DBD zYXK^xynw@Qxv8R}!t1=&Yk4~$mlzZvafq(ZNNZJn25sGmr=%iGge$J|IY_tcQAPi>zBRHN(jpLo$?#h&Ra3eaOjko6>}Pd?QlTm zGe8IZy)|ETLudE$`W!Cp3DquX84P*DUu?guHBYPKUbug$GcdRPO)hUP(`jlvw5&Fc z1Odld3{2o}QcXn256FR;rE?oi8uvS^`d9L8hY*+AU-gPJ9{pKwxmU}#zm^$^JzYLj z!ju_%B1?vFs0ODo^PpUXivSPb-qo6u*vIKcbi286&NT7kEoHUab%Wh56yIS^F4x~# zy0=O0-8~L72KX)07ELzD82#&NPoi67#v}HN;lXXj!VvnY2KOO?y4LHaH${erUj;O* zni&^TKm4naJNjVw6E;R z!k8=~=`XrLt1b>6TC1`R5UU41k&9nIXC|KHZ;nIV+^+k@BDS7!3g=N?5I)64 zk~JpzbbA5w4Nj00KPt^$u?VMEniE2^kCoZ@cT>7Pvrh3{?^j?LInT3RcXQ-KP0|0o zTT_y=j5r9FB7i+0%z6cZPYj9{k8NN3qo|$x3>05(H>xV~lL5nMsNVeh9p_e>qqTJs zs1Q8&_HMR~ zuuXcamRUCr?zlCGHy>8WAv8%jaK)TL^z1Y^HV8i7nq!-ddW|CghS(F^e~J3C*{8a{ zw-ADajv(alfsFZcS+jKe7sB7QZnu%D{DbFTu!mi%RC?C>VncPlG)l|iMYTj>KpdnB zqkvy|7N$0Z!wiAP_a?fv&m3r&hhzPEdYM1~BKQ`9MlyOi|->54Ne($--*qbdTW| zvTz84VBsn)WlpV!;eUMP5<#0Wz<28>myafj$);Nag$z!qNm6dyOERhDV|e`CUFzeC zd9!rK-|5e!${W}9 zX*vFa@4%O0nM6E~3~B538ZLX{?jko6gxN!pBvY#9+fQCb(Kdodi6q(j^zue`G(;@oR#aYIj`8GluE}nW*ZZLU zyNrn8-Z*|lNDwZBM%@WK6hdDP4`qmylBiZ2&fv;`M?~($8w2c?O`zgmv-ssRKR^G#Y7h1Oel7QRxk34R-NzI=}ol2!-&|;;NP5%mK~3? zFR~u?M|qoF3h&m~W(3)W(?ya*9VTxm&z9S%7iA9fZcf*u=_3a|JAO#6%j+2wJ52n$ z3#!v-*$o+tZ{NNxZEhBv-98)G!neQ)f`iN}0{5;PLIKuIDJtONmIb!;K-AhkrbUa@ zab~!GI7pGa+qQ3Y?R{Ov`uOJO{^XvKbge6sA!(b3QQmETOvdIw^we3cv(8x+{L{^A zA&I1)uPzkF>+&{p@|`e@oQEd-ZR8TCh!xx#?yslAIba?4Lp@P8>gfF#2?zOv=cM=X z6IlfNw0i@JB$2)3;z?WX{Z(YVt)|RDxDYlno!u2uyUZ^}%`cxNaNLy26H-4UP;!1Y za(;Jb{X;<0UBhIqasTy>Pd5oGI>d-Xa~2ryp)}|d6+snP2+YjErYw^eT`j{F-yh6B zIsBFo3D^rfYv^pJ)x$hu0w3xT|Ij?_LFRXI@3V?B#oFouy3q zRJ%@jvE%0`=I^E2jKBkl%+FG8`!txav*j#sqkUBH^PuxGxay}Dp4?03G_9ELU@Ch#t%REv>ZA0*!3aU)(rgizl@*=qG`5?>HY0B`*hxBBplzI#7*Tb1uWHH@5lY z2OE~Jb8|&}RRiuu68^-JT>pxE3Y$?g{HqOH$NHy5{;;#L0ko#dU+vGF5TV&k`CcxQ zak@hFa*{%M97e*A-&Myyg_`wyp56N(f3{tg@RL!k2>2zp|8b(iSMT~Pvk1uC%!CTc zW5;fHay2~Qz`QLuTq$j}OxZ$vW4gXnSuJUI#gj@%F(#7H<%zkY8Na=nQaT>!pIOcj zt7Fah`{5`>vg1lM_C8zqlT3iHv)t>?XUmSm1=KCiIGr3;sZ{SB@*>c0|5(>!q0xZj zzFZdYyhA0Sj-dZeVt<$d7fF*Qh@WUr*t8s{D{Z!>7EbXJ`d%)1MJu;^SgWV+CO*tS zF+Gj7Xj%8R#Ot4R1h|$N&VKgY>x=a<=x9}~Q>mTU9k0NFy}S1vcy~fc#5m4#oM0>C zMXp!NBCN~gf#EHVA1@T68?URM;}Sm1c|hO!N9 zt+?PW;6h(y&P_f+Q1FF!C)F-tR}G3L6gJ`AzyfipC=5g4AZSX3R(spZteWKTFt^8o zv%;jJXiBh)2qqQW3WpHQ1jhc31r84O2h7?)g{ZiWK>nS?zyGF5@&eAdw*UbyNa_^o zc6c*s-hN}=I-S$ou#25ekgwJjGo)EL;Y_rpPz< z5%eQSsvb(S7xOINgBA{+R5HL%YV~?C(!zCd@;Sc7#1^;PdjFMrEZ@&X5e(a4fE&M-8vuq1`zf#(Nbpv&+DNd-IRE!0 z_yV}%F(w(Rf8PP@A_>?*;+Ugl*{N;7x}?!_}zxjLEGA^!`^Pw+ti literal 95462 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%0ATE30R>5+jh(Ho0_Ij5|` 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 Le management moderne cherche à responsabiliser le·la salarié·e par rapport au maintien de son propre emploi et de son propre salaire, ce qui n’a rien d’original et s’étend à l’ensemble du monde du travail. En droit du travail, il relève pourtant de la responsabilité de l’employeur de fournir un travail et de le rémunérer. La responsabilité du salarié est alors d’exécuter le travail prévu dans le contrat de travail en se subordonnant aux directives, au contrôle et aux possibles sanctions de son employeur. **Le discours selon lequel le salarié devrait être compétitif, flexible, dévoué pour maintenir son entreprise et son emploi révèle encore un abus de l’employeur qui se décharge sur ses salarié·es de sa propre responsabilité**. Là encore, un rappel des fonctions et des responsabilités peut permettre de distinguer ce qui relève de la pression extérieure et d’une méthode de management. +> [Le syndrome du patron de gauche (Arthur Brault-Moreau) — Zéro Janvier](https://blog.zerojanvier.fr/le-syndrome-du-patron-de-gauche-arthur-brault-moreau?pk_campaign=rss-feed) + + + + + diff --git a/mnmlist/static/css/main.css b/mnmlist/static/css/main.css index 328e8e8..1bd1a10 100644 --- a/mnmlist/static/css/main.css +++ b/mnmlist/static/css/main.css @@ -515,14 +515,10 @@ dd { padding-bottom: 0.5em; } -.page-title { - flex: 0; -} - .item>time { flex: 1; text-align: right; - color: #acabab; + color: #797878; padding-left: 1em; } diff --git a/mnmlist/static/fonts/Luciole-Regular.ttf b/mnmlist/static/fonts/Luciole-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2055e8aebbd79286938c3cdfe771a9b580d1d9ab GIT binary patch literal 167572 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

- {% endif %} {% if article.headline and article.category != "weeknotes" %}

{{ article.headline }} diff --git a/mnmlist/templates/index.html b/mnmlist/templates/index.html index 8916924..0c2490a 100644 --- a/mnmlist/templates/index.html +++ b/mnmlist/templates/index.html @@ -23,7 +23,7 @@ {% for article in articles[0:20] %}

  • {% set category_description = CATEGORIES_DESCRIPTION.get(article.category)[0] %} - {{ category_description }}: {{ article.title.replace(category_description, "") }} + {{ category_description }}: {{ article.title.replace(category_description, "") }}
  • {% endfor %} diff --git a/mnmlist/templates/worklog.html b/mnmlist/templates/worklog.html index 27e1737..4e1c04e 100644 --- a/mnmlist/templates/worklog.html +++ b/mnmlist/templates/worklog.html @@ -31,16 +31,16 @@ Mois - Heures - Jours + Jours rémunérés + Jours bénévoles - {% for month, amount in page.metadata.worklog.payed_monthly.items() %} + {% for month, hours in page.metadata.worklog.monthly_hours.items() %} {{ month }} - {{ amount }} - {{ (amount / 7.0) | round(1) }} + {{ (hours['payed'] / 7.0) | round(1) }} + {{ (hours['volunteered'] / 7.0) | round(1) }} {% endfor %} diff --git a/pelicanconf.py b/pelicanconf.py index 9e7f035..f064769 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -1,8 +1,8 @@ # -*- coding: utf-8 -*- PATH = "content" -AUTHOR = "Alexis" SITENAME = "Alexis Métaireau" +AUTHOR = "" THEME = "mnmlist" STATIC_PATHS = ["images", "audio", "extra", "docs"] STYLESHEET_URL = "/theme/css/main.css" diff --git a/plugins/neighbors.py b/plugins/neighbors.py index 7f89d4a..c5d41c7 100644 --- a/plugins/neighbors.py +++ b/plugins/neighbors.py @@ -65,5 +65,7 @@ def neighbors(generator): set_neighbors(articles, next_name, prev_name) + + def register(): signals.article_generator_finalized.connect(neighbors) diff --git a/plugins/simplereader.py b/plugins/simplereader.py index aa2f706..43b717b 100644 --- a/plugins/simplereader.py +++ b/plugins/simplereader.py @@ -6,6 +6,7 @@ from datetime import datetime from pathlib import Path from markdown.preprocessors import Preprocessor + from pelican import signals from pelican.readers import Markdown, MarkdownReader, pelican_open from pelican.utils import get_date, slugify @@ -19,26 +20,26 @@ except Exception: class WorklogPreprocessor(Preprocessor): pattern = re.compile( r""" - (?:(\w+)\s+)? # Day name - (\d{1,2})\s+ # Day number - ([\wéû]+)\s+ # Month name - (\d{4})\s+ # Year + (?:(\w+)\s+)? # Day name + (\d{1,2})\s+ # Day number + ([\wéû]+)\s+ # Month name + (\d{4})\s+ # Year \( - (\d{1,2})h # Hours (mandatory) - (?:\s+facturées)? # Optionally 'facturées', if not present, assume hours are 'facturées' + (\d{1,2})h # Hours (mandatory) + (?:\s+facturées)? # Optionally 'facturées', if not present, assume hours are 'facturées' (?:,\s*(\d{1,2})h\s*bénévoles)? # Optionally 'volunteer hours 'bénévoles' - ,? # An optional comma - \s* # Optional whitespace - (?:fun\s+)? # Optionally 'fun' (text) followed by whitespace - (\d)/5 # Happiness rating (mandatory, always present) - \) # Closing parenthesis + ,? # An optional comma + \s* # Optional whitespace + (?:fun\s+)? # Optionally 'fun' (text) followed by whitespace + (\d)/5 # Happiness rating (mandatory, always present) + \) # Closing parenthesis """, re.VERBOSE | re.UNICODE, ) def __init__(self, *args, **kwargs): self.data = {} - self.payed_monthly = defaultdict(int) + self.monthly_hours = defaultdict(lambda: defaultdict(int)) super().__init__(*args, **kwargs) def run(self, lines): @@ -58,7 +59,8 @@ class WorklogPreprocessor(Preprocessor): happiness, ) = match.groups() - volunteer_hours = int(volunteer_hours) if volunteer_hours else 0 + volunteer_hours = int( + volunteer_hours) if volunteer_hours else 0 payed_hours = int(payed_hours) happiness = int(happiness) date = datetime.strptime(f"{day} {month} {year}", "%d %B %Y") @@ -67,7 +69,9 @@ class WorklogPreprocessor(Preprocessor): "volunteer_hours": volunteer_hours, "happiness": happiness, } - self.payed_monthly[date.strftime("%Y/%m")] += payed_hours + current_date = date.strftime("%Y/%m") + self.monthly_hours[current_date]['payed'] += payed_hours + self.monthly_hours[current_date]['volunteered'] += volunteer_hours displayed_date = date.strftime("%A %d %B %Y") # Replace the line with just the date @@ -82,13 +86,14 @@ class WorklogPreprocessor(Preprocessor): This is run once, after everything has been parsed """ payed_hours = sum([item["payed_hours"] for item in self.data.values()]) - volunteer_hours = sum([item["volunteer_hours"] for item in self.data.values()]) + volunteer_hours = sum([item["volunteer_hours"] + for item in self.data.values()]) data = dict( data=self.data, payed_hours=payed_hours, volunteer_hours=volunteer_hours, - payed_monthly=self.payed_monthly, + monthly_hours=self.monthly_hours, template="worklog", ) if "total_days" in metadata: @@ -110,8 +115,10 @@ class SimpleReader(MarkdownReader): def __init__(self, *args, **kwargs): super(SimpleReader, self).__init__(*args, **kwargs) - self.settings["MARKDOWN"]["extensions"].append("markdown.extensions.toc") - self.settings["MARKDOWN"]["extension_configs"].update({'markdown.extensions.toc': {'toc_depth': 3}}) + self.settings["MARKDOWN"]["extensions"].append( + "markdown.extensions.toc") + self.settings["MARKDOWN"]["extension_configs"].update( + {'markdown.extensions.toc': {'toc_depth': 3}}) def read(self, source_path): self._source_path = source_path @@ -154,7 +161,8 @@ class SimpleReader(MarkdownReader): if "slug" not in metadata: metadata["slug"] = slugify( - metadata["title"], self.settings.get("SLUG_REGEX_SUBSTITUTIONS", []) + metadata["title"], self.settings.get( + "SLUG_REGEX_SUBSTITUTIONS", []) ) category = os.path.basename(