新人エンジニア向けの学習ページ

メモが端末から端末へ届くしくみ

約5分で読めます作成:2026年10月16日対象:新人エンジニア架空のデータによる例

メモはまずスマホに保存され、次にサーバーが番号を振り、ほかの端末が新しい分を取りに行きます。

押さえておくのはこれだけ
  1. メモは、送る前にスマホへ保存される
  2. サーバーが番号を振るので、順番は1つに決まる
  3. 端末は、前回の番号より後の分を取りに行く

メモが通る4つの層

やさしい順
  1. スマホの中送る前に、まずスマホへ保存します。ローカルコピー送信トレイ
  2. 同期サーバーの中サーバーが、すべての変更を1つの順番に並べます。変更変更番号
  3. ほかの端末の中端末は、前回見た変更より新しい分を問い合わせます。カーソルプル
  4. 2台の内容が食い違うときあとの変更が勝ち、もう一方の文章は置き換わります。競合後勝ち

つまり:メモは4つの層を通り、層ごとに覚える言葉は少しだけです。小さなラベルが、その層で学ぶ言葉です。

  1. メモは最初どこにあるのかスマホの中。送る前に保存されます。
  2. サーバーは変更をどうするのか番号を振って、順番を決めます。
  3. ほかの端末はどう知るのかカーソルより後の分を、自分から取りに行きます。
  4. 同じメモを2台で編集したらどうなるのかあとの変更が勝ちます。
  5. どうすれば動きを確かめられるのかスマホとブラウザで試す5つの手順です。

第1章 / 全5章、約1分

メモは最初どこにあるのか

おさらい:メモはまずスマホに保存され、送られるのはそのあとでした。

メモを編集しても、アプリは通信を待ちません。編集内容は、まずローカルコピーに保存されます。画面はすぐ反応し、電波が切れても何も失われません。

続いてアプリは、その編集を送信トレイに入れます。オンラインのあいだは、バックグラウンドの処理が順番に送ります。エレベーターの中など圏外では、送らずに待ちます。

ローカルコピー
スマホ本体に保存されたメモ。アプリは、まずこのコピーを読み書きします。
送信トレイ
保存済みで、まだ送っていない編集。サーバーに受け取られると、1件ずつ消えます。
メモを編集すると、編集内容はすぐローカルコピーに保存され、送信トレイに追加されます。あとで通信がつながると、送信トレイの中身が同期サーバーに送られます。 1. 編集するアプリで入力 2. ローカルコピーすぐ保存 3. 送信トレイ送信待ちの編集 4. 同期サーバーオンラインで受け取る 1〜3は通信がなくても動きます 通信が必要 メモを編集すると、編集内容はすぐローカルコピーに保存され、送信トレイに追加されます。あとで通信がつながると、送信トレイの中身が同期サーバーに送られます。 1. 編集するアプリで入力 2. ローカルコピーすぐ保存 3. 送信トレイ送信待ちの編集 4. 同期サーバーオンラインで受け取る 1〜3は通信がなくても動きます
つまり:保存と送信は別の手順です。保存は一瞬で終わり、送信は通信がつながったときに済みます。

送信トレイは、机の上に置いた手紙のトレイです。手紙は今のうちに書いておき、郵便はあとで順番に集めに来ます。たとえと違うのは、通信がつながった瞬間にアプリが自分で集める点です。

送信トレイの1行を見る

編集1件が1行になります。サーバーが受け取りを確認するまで、スマホが保管します。

outbox row 1
  note id     n_7f3a
  text        Milk, eggs
  edited at   2026-10-16 09:12:04
  tries       0

この章のポイント:メモはすぐスマホに保存され、編集は通信が戻るまで送信トレイで待ちます。

第2章 / 全5章、約1分

サーバーは変更をどうするのか

おさらい:編集は、スマホがオンラインになるまで送信トレイで待ちます。

スマホは、編集を1件ずつ同期サーバーに、変更として送ります。サーバーはそれを記録し、アカウントごとに次の変更番号を振ります。41、42、43と続きます。

同期サーバー
こちらで運用している、すべての端末がつながる1つのプログラム。
変更
送る形にまとめた編集1件。メモの ID、新しい文章、編集した時刻が入っています。
変更番号
アカウントごとにサーバーが数える、変更の通し番号。変更42は、必ず変更41のあとになります。

スマホ、タブレット、ブラウザ版は、どれも同じ一覧に変更を送ります。どの端末が先かを、サーバーは気にしません。届いた順が、そのまま順番です。

スマホ、タブレット、ブラウザ版が、同期サーバーに変更を送ります。サーバーはそれらを1つの変更ログに書き込み、届いた順に41、42、43と番号を振ります。 端末が送るサーバーの変更ログ スマホ タブレット ブラウザ版 同期サーバー変更に番号を振る届いた順に 41スマホ:買い物リスト 42Web:旅行のアイデア 43スマホ:買い物リスト スマホ、タブレット、ブラウザ版が、同期サーバーに変更を送ります。サーバーはそれらを1つの変更ログに書き込み、届いた順に41、42、43と番号を振ります。 スマホ タブレット ブラウザ版 同期サーバー届いた順に番号を振る 41スマホ:買い物リスト 42Web:旅行のアイデア 43スマホ:買い物リスト
つまり:一覧は1つで、順番も1つ。どの編集が先か、端末が迷うことはありません。
リクエストとレスポンスを見る

スマホが変更を1件送ると、サーバーが振った番号を返します。

POST /v1/changes
{ "note": "n_7f3a", "text": "Milk, eggs", "edited": "09:12:04" }

201 Created
{ "change": 41 }

この章のポイント:サーバーは変更に届いた順に番号を振り、その番号が順番を決めます。

第3章 / 全5章、約1分

ほかの端末はどう知るのか

おさらい:変更には番号があり、サーバーは変更を順番に保管しています。

パソコンは、知らせを待ちません。アプリを開いている間は10秒ごとに「前回の番号より新しい分は?」と聞きに行きます。この番号がカーソルです。この問い合わせがプルです。

カーソル
端末が最後に反映した変更番号。端末が自分で覚えておきます。
プル
端末が、サーバーに新しい分を問い合わせること。サーバーからは送りません。

サーバーは、その番号より後の変更をすべて順番に返します。端末は1件ずつ反映し、カーソルを最後に受け取った番号まで進めます。

パソコンのカーソルは41です。パソコンはサーバーに、41より後の分を問い合わせます。サーバーは変更42と43を返し、パソコンがそれを反映して、カーソルが43になります。 パソコンカーソル:41 同期サーバー変更43まで保存済み 1. 41より後は? 2. あり:変更42と43 パソコンカーソル:43 3. 42と43を順に反映し、43を記憶 パソコンのカーソルは41です。パソコンはサーバーに、41より後の分を問い合わせます。サーバーは変更42と43を返し、パソコンがそれを反映して、カーソルが43になります。 パソコンカーソル:41 1. 問い合わせ:41より後は? 同期サーバー変更43まで保存済み 2. 返答:変更42と43 パソコンカーソル:43 3. 42と43を順に反映し、43を記憶する
つまり:端末は、自分の位置を自分で覚えています。同じカーソルでもう一度聞けば、同じ答えが返ります。
問い合わせと返答を見る

カーソルは URL に入れて送ります。返答には、変更の一覧と最新の番号が入ります。

GET /v1/changes?after=41

200 OK
{ "latest": 43,
  "changes": [
    { "change": 42, "note": "n_2c91", "text": "Trip ideas" },
    { "change": 43, "note": "n_7f3a", "text": "Milk, eggs" } ] }

この章のポイント:サーバーからは送らず、端末がカーソルより後の分をすべて取りに行きます。

第4章 / 全5章、約1分

同じメモを2台で編集したらどうなるのか

おさらい:端末はカーソルより後の変更を取りに行き、順番に反映します。

お互いの変更を知らないまま、2台が同じメモを変更することがあります。これが競合です。バージョン2.3は、変更番号が大きいほうが勝つ、という1つのルールで解決します。

競合
互いに知らないまま加えられた、同じメモへの2つの編集。
後勝ち
番号が大きい変更が、もう一方の変更の文章を置き換えるというルール。

「あと」は、入力の時刻ではなく、届いた順のことです。09:10に入力してオフラインだったパソコンは、09:12に入力したスマホよりあとに届きます。勝つのは、パソコンの文章です。

メモ「買い物リスト」は、変更40の時点で「牛乳」です。スマホが09:12に「牛乳、卵」と入力し、1番目に変更41として送ります。パソコンはオフラインの09:10に「牛乳、パン」と入力し、2番目に変更42として送ります。サーバーは変更42を残すので、卵は置き換えられます。 買い物リスト(変更40の時点)牛乳 スマホ(09:12に入力)牛乳、卵。先に送信:変更41 パソコン(09:10に入力、オフライン)牛乳、パン。あとに送信:変更42 サーバーは変更42を残す牛乳、パン。卵は置き換わる パソコンのほうが先に入力しても、番号が大きいほうが勝つ メモ「買い物リスト」は、変更40の時点で「牛乳」です。スマホが09:12に「牛乳、卵」と入力し、1番目に変更41として送ります。パソコンはオフラインの09:10に「牛乳、パン」と入力し、2番目に変更42として送ります。サーバーは変更42を残すので、卵は置き換えられます。 買い物リスト(変更40の時点)牛乳 スマホ(09:12に入力)牛乳、卵。先に到着:変更41 パソコン(09:10に入力、オフライン)牛乳、パン。次に到着:変更42 サーバーは変更42を残す牛乳、パン。卵は置き換わる
つまり:決め手は届いた順で、時計の時刻ではありません。負けたほうの文章は置き換わります。
このルールの代償

2.3では、置き換えられた文章は残りません。共有ノートでは、チームメイトの文章が消えるおそれがあります。2.4で両方を残すかは、マーラさんとテッドさんが検討中です。

この章のポイント:編集がぶつかると、サーバーに最後に届いたほうが勝ち、もう一方の文章は置き換わります。

第5章 / 全5章、約1分

どうすれば動きを確かめられるのか

おさらい:メモは保存され、送られ、番号を振られ、プルされ、競合すれば置き換わります。

用意するのは、スマホとブラウザです。どちらも同じテストアカウントでサインインしておきます。所要時間は5分です。

  1. ブラウザ版とスマホ版のアプリを開きます。どちらも同じテストアカウントでサインインします。
  2. スマホの機内モードをオンにします。アプリはそのまま動きます。
  3. 「買い物リスト」というメモを編集します。末尾に「卵」を足します。
  4. 「その他」から「同期の詳細」を開きます。送信待ちの編集が1件と表示されます。
  5. 機内モードをオフにします。 10秒以内に件数が0になり、ブラウザ版に「卵」が表示されます。
機内モード
すべての通信を切るスマホの設定。アプリはオフラインになります。
同期の詳細
「その他」の中にある画面。送信トレイの件数と、スマホが最後に見た変更番号を表示します。
機内モードがオンのときの「同期の詳細」画面は、送信待ちが1件です。機内モードをオフにすると、同じ画面は送信待ちが0件になり、変更番号が新しくなります。 同期の詳細:オフライン 送信待ち1 最後に見た変更4,182 最終同期09:02 機内モードをオフにする 同期の詳細:オンライン 送信待ち0 最後に見た変更4,183 最終同期09:05 機内モードがオンのときの「同期の詳細」画面は、送信待ちが1件です。機内モードをオフにすると、同じ画面は送信待ちが0件になり、変更番号が新しくなります。 同期の詳細:オフライン 送信待ち1 最後に見た変更4,182 最終同期09:02 機内モードをオフ 同期の詳細:オンライン 送信待ち0 最後に見た変更4,183 最終同期09:05
つまり:送信トレイの件数が証拠です。スマホがオフラインの間は1、サーバーが編集を受け取ると0になります。
わざと競合させてみる

同じ手順を繰り返し、手順3だけ変えます。サーバーにはブラウザの編集が先に、スマホの編集があとに届きます。

  1. 機内モードをオンのままにします。スマホで「買い物リスト」を編集し、「卵」を足します。
  2. ブラウザで「買い物リスト」を編集します。「パン」を足し、保存されるのを待ちます。
  3. 機内モードをオフにします。スマホが最後に送るので、両方の画面でスマホの文章が勝ちます。

この章のポイント:「同期の詳細」画面で送信トレイの件数を見れば、編集がスマホを出たかどうか分かります。

まとめ

  1. メモはすぐスマホに保存され、編集は通信が戻るまで送信トレイで待ちます。
  2. サーバーは変更に届いた順に番号を振り、その番号が順番を決めます。
  3. サーバーからは送らず、端末がカーソルより後の分をすべて取りに行きます。
  4. 編集がぶつかると、サーバーに最後に届いたほうが勝ち、もう一方の文章は置き換わります。
  5. 「同期の詳細」画面で送信トレイの件数を見れば、編集がスマホを出たかどうか分かります。