作業場所は外。
計算資源は家。
iPhone で家の Mac mini に繋ぎっぱなしで開発する。カフェで書いた続きを、帰宅後そのまま再開する。──そのカラクリを、これから順番に説明します。
まず、どこで何が起きているか。
手元のスマホは「窓」にすぎず、実際の処理は家の Mac mini の中で走り続けている。その2つを繋いでいるのが mosh、家の中で作業を保持しているのが tmux。
mosh と tmux は、違う仕事をしている。
混同されがちだけど、片方は「通信」、もう片方は「セッション」を守る。両方あって初めて、どこからでも続きから再開できる。
SSH の代わりに使うリモートシェル。UDP ベースなので、回線が瞬断しても、別の Wi-Fi に繋ぎ変えても、IP アドレスが変わっても、セッションを保持したまま自動で復帰する。
ローカルエコーが効くので、衛星回線みたいに遅い環境でもキー入力が即座に画面に出る。体感がとにかく速い。
- 地下鉄で電波が消えても接続維持
- テザリングから Wi-Fi に切り替えても OK
- スリープから復帰しても繋がってる
ターミナル多重化ツール。Mac mini の中で「セッション」というコンテナを作り、その中で nvim や npm run dev を動かしておく。クライアントが切断されても、セッション自体は走り続ける。
あとから別の端末で tmux attach すれば、その画面にそのまま合流できる。複数ウィンドウや分割もそのまま保持される。
- iPhone を閉じても作業は走ったまま
- 家の Mac から同じ画面に合流できる
- 長時間ビルドを放置しても安全
つまり ── mosh がスマホと家の Mac mini の道を「切れない」ようにし、tmux が Mac mini の中の作業を「消えない」ようにする。2つを組み合わせると、どの端末から繋いでも「ずっと続いている1つのセッション」に居続けられる。
mosh がコネクションを守り、
tmux がセッションを守る。
回線が落ちても、画面を閉じても、作業はそこに居続ける
iPhone を開く。家の Mac mini が、そこにある。
ドトールでアイスコーヒーを置いて、ポケットから iPhone を出す。mosh で家の Mac mini に接続。
そして tmux attach。昨夜 23 時に閉じたつもりだった nvim が、142 行目で点滅している。何も失われていない。
圏外でも、セッションは死なない。
地下鉄に乗る。電波が消える。普通の SSH なら即切断、再接続でも前の画面は戻ってこない。
mosh は UDP で動くから、回線が落ちても怒らない。地上に出れば、IP が変わっていようと、自動で繋がり直す。tmux のセッションは家の Mac mini 側で走り続けているので、こちらは「画面に追いつく」だけでいい。
- 14:08カフェで mosh 接続 / tmux attach
- 14:32地下鉄 ── iPhone をポケットへ
- 14:33圏外 ── mosh は待機モード
- 14:51地上、IP 変更、Wi-Fi 切替
- 14:51自動再接続 ── nvim、そのまま 142 行目
椅子に座る。続きが、待っている。
家に着いて、Mac mini のターミナルから同じ tmux セッションに attach するだけ。iPhone でいじっていた画面が、そのまま 27 インチに広がる。
「外で書いて、家で続ける」── ではない。
「ずっと同じセッションが、デバイスを跨いで動いていた」。それだけ。
場所が、開発を縛らなくなる。
Chromebook + GPU マシンの組み合わせと、思想は同じ。手元は軽く、計算は家。違うのは ── これがポケットの中で起きていること。
# Mac mini 側 brew install mosh tmux tmux new -s work # iPhone / iPad / Chromebook 側 mosh mac-mini.local tmux attach -t work