ブログは完成した画面を自慢する。そこに至るまで何が切れたかは書かない。書き手はすでに突破したか、そもそも経験していないからだ。この章は反対をする。私が実際に経験したエラーを、症状、原因、処方に分けて一つずつ解剖する。検索してもなかなか出てこないことだ。
§ 00 · 組む前に――まずフォルダーを移せ
この章全体に先立つ勧めを書く。後で出てくる八つの罠はすべて有効で、私もすべて踏んだ。ただし、まだリモートを組んでおらず、プロジェクトも初期なら、その前に一つやることがある。コードの入った作業フォルダーをデスクトップの外へ移せ。強く勧める。
理由は単純だ。Macはデスクトップや書類などのフォルダーを別に施錠して管理する。後の七つ目と八つ目の罠は、コードがその施錠されたフォルダー内にあるために起きる。外にあれば、この二つは最初から起きない。私は逆の順序を踏んだ。全部組み、しばらく使い、二つとも踏んでからようやく移した。移したら、その場で詰まりが解けた。
ただし移す作業は、フォルダーをドラッグして終わりではない。一つの規則を押さえればよい。壊れるのは古い住所を文字で埋め込んだものだけだ。どこかに古い住所が文字で残っていれば、そこだけ壊れる。住所を介さずつながっていたものは無事だ。次の四つを一つずつ探して直し、再び測る必要がある。自動でついてくるものは一つもない。引っ越しは初期ほど安い。その理由は、埋め込んだ住所がまだ少ないからだ。
| 何を | 合わせ直さないと | 合わせ直しと確認の方法 |
|---|---|---|
| 設定・自動検査ファイルに埋めた古い住所 | 自動検査や道具が黙って動かなくなる。エラーさえ出ず、ずっと後で気づく。四つで最も危険。 | 古い住所をすべて探して新しい住所に替える。確認は、古い住所の検索結果が0になるまで。 |
| gitが覚えている作業フォルダーの位置 | gitが古い場所を探しに行って失敗する。作業ツリーを複数使っていればすべて同じ。 | 登録場所を修復する命令を一度実行する。作業ツリー一覧を出し、すべて新しい住所か目で全件確認する。 |
| ビルドキャッシュ | 前回焼いた成果物に古い住所が固まり、ビルドやサーバーが誤った場所を指す。 | 直すのでなく捨てる。キャッシュを消して焼き直す。焼き直したものに古い住所が0であることを確認。 |
| 文書・メモに記した住所 | 人が読む案内が死んだ住所を指す。機械は正常でも人が迷う。 | 検索して直し、検索結果0で確認する。ただし過去の記録など、当時のまま残すべき文書は残す。 |
§ 01 · 成功談にはこの瞬間がない
初めてリモートを組んだ数日間、私は三つに詰まった。韓国語が化け、接続を拒まれ、正常だったプログラムが開かなかった。どれも私のコーディング能力と無関係で、どれも検索ですぐには出なかった。
理由がある。ブログが書くのはハッピーパス、最初から最後まで順調に進む道だ。初心者が本当に転ぶのは、その道を外れた失敗地点だが、成功談にはそこがない。書き手はすでに突破して記憶に残らなかったか、運よく経験しなかったかだ。
だからこの章は失敗だけを書く。以下は私が実際に踏んだ罠だ。それぞれ症状、原因、処方で記した。同じ場所で止まったら、検索の前にこの表を見てほしい。
§ 02 · 八つの罠
以下の八つはリモート開発で踏みやすい罠だ。最初の六つは構築時にぶつかるもので、大半は道具自体の癖か、二つの道具が衝突する場所だ。最後の七と八は性質が違う。組む途中でなく、完成して正常に動いていたリモートが、ある朝突然切れる。何も触っていないのに。原因が分かれば処方は大抵一行だ。ただし最後の一つは違う。
| № | 罠(症状) | 原因と処方 |
|---|---|---|
| 1 | 韓国語が化けて入力できない(CJK) | まずCJK。中国語、日本語、韓国語(Chinese・Japanese・Korean)は一文字が複数バイトからなり、字母が組み合わさって一文字となり、画面で二桁を使う。一文字一バイトのアルファベットを念頭に作られたコマンドラインツールにとって、CJKは長く最も扱いにくい文字であり続けている。どれほど優秀なチームの道具でも、完全な韓国語入力は保証できない。だから文字化けは二か所から来る。①向こうの機械。遠隔接続した窓(SSH)はタブレットの言語設定を向こうへ渡さず、機械は「一バイト文字だけを使う」という既定値に落ちる。処方は、向こうの機械で接続のたびに最初に自動実行される開始設定ファイル、いわゆるプロファイルに「UTF-8を使う」という一行を入れること。プロファイルは接続のたびに最初に読まれる、自分専用の準備スクリプトだ。②手元の窓。向こうを直しても韓国語入力が抜けるなら、タブレットのターミナルアプリが韓国語の組み立て入力を正しく渡せていない。よくあり、最上位のアプリでも起きる。処方は、そのアプリ設定でCJKや入力関連オプションを探してオンにすること。Termiusにもある。韓国語を完全にするには両方を直す必要がある。 |
| 2 | ショートカットが奪い合う | 原因:画面を保持する網(tmux)と中で動くAIツールが同じショートカットを使う。処方:どちらかを別の組み合わせに移し、衝突をなくす。tmuxの設定一行で済む。 |
| 3 | プログラムが開きかけてエラーを出す | 原因:先に起動した同じプログラムが死なず、幽霊のように残って新しい起動を妨げる。処方:幽霊プロセスを探して終了するか、網全体を一度再起動すれば解ける。再インストールは不要。 |
| 4 | ログイン用アドレスが「無効」と出る | 原因:Termiusなど一部の窓は、ログイン用アドレスとワンタイムコードを一行につないで表示し、丸ごとコピーするとアドレスが壊れる。処方:手で分け、アドレスだけをブラウザーへ入れ、コードは別に入力する。 |
| 5 | 場所を変えると接続に失敗する | 原因:ネットワークが変わると、プライベートネットワーク(Tailscale)が新しい経路を作り直すのに数秒かかる。その間に接続すると失敗する。処方:失敗は故障ではない。数秒後に再試行すればつながる。Tailscaleアプリを先に起こせばより速い。 |
| 6 | 接続が切れて作業が飛ぶのが怖い | 原因:窓に直接ぶら下がる作業は、窓が閉じると死ぬ。処方:最初から網(tmux)にぶら下げておけば、接続が切れても作業は機械の中で続く。つなぎ直して再接続すれば元の場所に戻る。 |
| 7 | 昨日まで開けたフォルダーが突然アクセスを拒む | これは性質が違う。組む途中でなく、正常だったリモートがある朝切れる。症状:機械には確かにつながり、ログインも成功するのに、コードのあるデスクトップの作業フォルダーへ触れると「Operation not permitted(操作は許可されていません)」が出る。原因はAppleが深夜に静かに配信するセキュリティ更新だ。Macは明け方に自分でシステムを更新する。この機械にも午前三時に更新が入った記録がある。その時、遠隔接続を受ける門番プログラム、正確にはそれを起動する部品sshd-keygen-wrapperの「フルディスクアクセス」許可がリセットされ、外れる。Macはデスクトップや書類など敏感なフォルダーを別に施錠する。この錠がフルディスクアクセスだ。遠隔からそこに届くには、門番に明示的な許可が要る。処方:Mac本体の画面で[システム設定 → プライバシーとセキュリティ → フルディスクアクセス]を開き、一覧でsshd-keygen-wrapperを探し、スイッチを再び入れる。なければ[+]で追加する。ファイル選択画面で[移動 → フォルダへ移動](Command+Shift+G)を使い、/usr/libexecを開いて中のsshd-keygen-wrapperを選ぶ。オンにして遠隔接続を一度切り、つなぎ直せばフォルダーが開く。この罠が最も悪質なのは、何も変えていないのに昨日できたことが今日できず、検索でも原因に届きにくいからだ。リモートを知る者だけが、この朝に崩れない。そして最初から踏まない道が一つある。この章の冒頭§00で勧めたとおり、コードフォルダーを施錠されたフォルダーの外へ出すことだ。 |
| 8 | 権限を確かにオンにしたのに拒まれ続ける | 7番の処方どおりフルディスクアクセスをオンにした。画面のスイッチも両目で確認した。それでも「Operation not permitted」が出る。大半はここで崩れる。オンを自分で見たのだから、もう試せることがないように見えるためだ。原因は三つで、どれも画面には出ない。①オンにした権限は、すでに動くプログラムには反映されない。起動時に受けた判定を持ち続ける。新しい判定を受けるには、根から起動し直す必要がある。②オンにすべき項目は、人が知っている名前とは違う。権限一覧に似た名前が並ぶが、必要なのは実際に実行されるファイル名だ。この機械では馴染みの名前claude・Claudeがオンで、本当の実行ファイルclaude.exeがオフだった。これをオンにするまで何度再起動しても無駄だった。③根の場所は道具ごとに違う。網(tmux)の中のプログラムの根は網の主人、外で単独で動くものの根はそのプログラム自身だ。発端は夜間だった。AIツールが明け方に自分を更新し、三度起動し直して、古い根を失った枝が生まれた。Macはフォルダーへの許可で「どのプログラムの血統から来た要求か」を調べる。祖先がすでに死んでいると判定自体ができず、無条件に拒む。処方は二層。確実な道は、命令一行も要らない。機械の電源を切って入れ直す。すべての根が生まれ直し、三つの原因が一度に消える。精密な道は、まず権限一覧で本当の実行ファイル名を探してオンにする。次にプログラムを根から起動し直す。網の中ならtmux kill-serverで網の主人を替え、セッションを新しく作る。注意:開いていた全セッションが閉じるので、先に作業を確認する。網の外で単独で動くものは完全に終了して再実行する。この罠が悪質な理由はもう一つある。症状が一つでも原因が一つとは限らない。私は網の主人を替えて自分の側が復活したのを見て「全部直った」と判断した。しかし網の外の別の枝は、その後二十分も止まっていた。一枝が復活しても機械全体が治ったわけではない。この罠も7番と根が同じだ。§00の勧めどおりコードが施錠されたフォルダーの外にあれば、どちらも起きなかった。 |
§ 03 · なぜこれが勝負を分けるのか
八つは些細に見える。韓国語が化け、ショートカットが衝突し、プログラムが開かず、昨日開けたフォルダーが今日閉ざされ、権限を入れても開かない。華やかな問題ではない。しかし初心者がリモート開発を諦めるのは、まさにここだ。コードが難しいからでなく、到達を阻まれるから。
コードはAIツールが代わりに書ける。しかし「接続できません」「韓国語が化けます」「プログラムが開きません」の前で、人は止まり、検索し、出てこなければやめる。仕事を始めることもできず、到達で崩れるのだ。
だから、この退屈な表一つが、華やかなコード十行より長くあなたの仕事を生かす。到達する方法を知る者が長く働く。
記事を読む: sass.studio.