Notion Offline mode の基礎技術 CRDT : hkob の雑記録 (235)

はじめに

hkob の雑記録の第235回目は、Notion Offline Mode を実現するための基礎技術である CRDT について実験してみます。

昨日紹介した論文

昨日も紹介しましたが、今回のオフラインモードの牽引となった論文がこちらで紹介されています。

ローカルファーストのオタクや inkandswitch のファンのために:

これは sliminality, geoffreylitt, pvh, Martin Kleppmannが共著した論文です

https://inkandswitch.com/peritext/

ブロックベースのリッチテキストCRDTの技術的基盤を世界に提供してくれてありがとう。

inkandswitch の記事はこちらからアクセスできます。

www.inkandswitch.com

こちらからもリンクされていますが、CSCW 2022 で受理された論文は ACM digital library で読むことができます。

Peritext: A CRDT for Collaborative Rich Text Editing | Proceedings of the ACM on Human-Computer Interaction

著者による解説動画とその要約

今回の Notion のオフラインモードを受けて、この論文の著者が論文の解説動画をポストしていました。

せっかくなので、この動画を AI ミーティングノートで要約してもらいました。

概要

ジェフリー・リット氏がサラ・リン氏、マーリン・フレットマン氏、ピーター・ベッド・ハーデンバード氏と共同で開発した「パラテックス」というリッチテキスト文書でのコラボレーションを促進するための新しいアルゴリズムのプレゼンテーション。Industrial Research LabとKinswitchが支援している。

コラボレーティブエディティングの課題

リッチテキスト文書での共同編集において、2つの重要な特性を維持する必要がある:

  • 最終的な一貫性: 全てのデバイスで同じ最終状態のドキュメントを表示すること
  • 意図保存: 編集者の元々の意図を反映した結果になること

意図保存の具体例

  • プレーンテキストの場合: 「fox jumped」という文に複数ユーザーが同時に異なる単語(「quick」と「brown」)を挿入する場合、文字が交互に混ざるのではなく、それぞれの単語が独立して配置されるべき
  • リッチテキストの場合: あるユーザーが文全体を太字にし、別のユーザーが新しい単語を追加した場合、新しい単語も含めて太字が適用されるべき
  • 競合する書式の場合: 一方が赤色、もう一方が青色を同じテキストに適用した場合、一つの色を選択する必要がある

既存のアプローチ

  1. オペレーショナル・トランスフォーム (OT)
    • Google DocsやOffice 365などで使用
    • 中央サーバーが必要でスケーラビリティが制限される
    • 分散型の編集ワークフローには適さない
    • 実装が複雑
  2. コンフリクトフリー・レプリケーティング・データタイプ (CRDTs)
    • 分散型やオフライン編集ワークフローに適している
    • プレーンテキスト向けの研究は多いが、リッチテキスト向けの研究は少ない

パラテックスアルゴリズムの特徴

  • プレーンテキストCRDTを拡張し、意図保存と一貫性を確保
  • テキストシーケンスと共に書式設定操作を維持
  • 書式設定操作は特定の文字に接続される
  • 書式を削除する場合、操作を削除するのではなく、削除操作を追加する
  • 特定の範囲の書式を効率的に追跡・結合できる

リソース

詳細な資料、アルゴリズムのコード、正当性の証明が提供されている。

論文の中で紹介されているサンプルを検証

せっかくなので、論文の中で紹介されていたサンプルを Notion でも試して動画にしてみました。Example 1 です。追加されたテキストも bold になっています。

次は Example 2 では、二人で Bold にします。

Example 3 では、Bold と Italic の合成を行います。

Example 4 は二人で色を設定し合います。

Example 5 は追加されたテキストの場所によってアノテーションが変わります。

おわりに

今夜の Notion 座談会ではオフラインにすることができないので、事前に動画を作っておきました。このブログ記事を使ってオフラインモードを紹介してみます。

hkob.notion.site