世間に乗り遅れることnヶ月、私もようやく今年の正月からAIコーディングエージェント(Claude Code)を使い始めた。その際の環境構築についてメモっておく。
AIエージェントを動かすにあたって、望ましいことが2つある。
AIエージェントは、(許可すれば)勝手にコマンドを実行できる。暴走してホームディレクトリを消された、という話もSNSでちらほら見かけた。そこで、AIエージェントが暴走しても問題ないように環境を隔離したい。具体的には、サンドボックスやVMなどの技術を使いたい。
そして、AIエージェントに対しては自然言語や簡単なYes/Noで指令を出すことができるので、人間が常時パソコンの前に座っている必要はない。私の場合は子供の世話があることを考えると、スマホで状況を確認しながら必要に応じて指令を出せる体制を整えたい。
この記事では、これらの条件を満たすために私が取った方法を簡単にまとめておく。
私が今使っているのがClaude Codeなのでタイトルにそれを入れたが、この記事ではClaude Code特有の話はしないので、CodexやGemini CLIでも同じようなことができるだろう。
自前のマシンで動かしたい
Web版Claude Code(Claude Code on the web)もあるようだが、
- ホストされたサービスは使用量制限が心配である。自前のコンピューティングリソースを活用したい
- もちろん、LLMの推論はクラウドで行われるのであるが、それ以外の処理、プログラムのビルド等は自前で行いたい。
- SSHアクセスしたい
- シェルコマンドの実行やテキスト編集のため。
- Claude Code on the webでもできるのかもしれないが、よくわからない。
などの理由で、自前のVM等でClaude Codeを動かすことにした。
VM
据え置きのMac mini(MacBookは閉じた時のスリープが不安)にmultipassでUbuntuのVMを立てた。ディスクは後から増やしづらいので、多めに割り当てておく。まあ、こういうVMは重要なデータを置かない運用にすれば、気軽に処分して建て直せるのだが。
$ multipass launch --cpus 14 --disk 50G --memory 10G --cloud-init cloud-config.yaml
cloud-initを使うと、Linux環境の初期設定をある程度自動化できて便利だ。内容の例は以下のような感じ:
#cloud-config
ssh_authorized_keys:
- ssh-ed25519 ***
- ssh-ed25519 ***
package_update: true
package_upgrade: true
packages:
- build-essential
- libgmp-dev
- ripgrep
- avahi-daemon
- tmux
runcmd:
# Install Tailscale: https://tailscale.com/kb/1031/install-linux
- curl -fsSL https://tailscale.com/install.sh | sudo -u ubuntu sh
# Install NVM: https://github.com/nvm-sh/nvm
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | sudo -u ubuntu bash
# Install Claude Code: https://code.claude.com/docs/en/overview
- curl -fsSL https://claude.ai/install.sh | sudo -u ubuntu bash
# Install GHCup: https://www.haskell.org/ghcup/
- curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sudo -u ubuntu env BOOTSTRAP_HASKELL_NONINTERACTIVE=1 sh
write_files:
- path: /home/ubuntu/.tmux.conf
content: |
set -g mouse on
cloud-initではSSHの公開鍵を登録したり、パッケージをインストールしたり、コマンドを実行したりできる。GHCupでHaskell環境を整えてみたが、環境変数の設定がうまくいってない気がするので手動で実行した方が良かったかもしれない。
VMの中からGitHubにpushしたり、プライベートリポジトリーをpullする場合は、ssh -A で他のマシンのSSH鍵を使うようにしている(GitHubにはVMのSSH鍵を登録しない)。
スマホからSSH
SSHクライアントとして動作するスマホアプリは色々ある。私はTermiusというのを使っている。
スマホでSSH鍵を使う場合は、アプリごとにSSH秘密鍵を作る形になると思う。しかし、マシンで一つならともかく、アプリごとに鍵を作って管理するのは面倒である。そこで、Tailscale SSHというのを使ってみた。
Tailscaleはクラウド型VPNサービスみたいなやつで、登録したマシンにIPアドレスやドメイン名でアクセスできる。それの追加機能としてTailscale SSHというのがあり、Tailscaleの認証を使ってSSHログインできる。
対象マシン(今回はVM)でTailscale SSHを有効にすると、スマホで鍵を管理しなくてもスマホに入れたTailscaleが認証をやってくれる。欠点はSSHログインの時にWebでの認証が求められることがあることで、PCからは普通のSSHを使うようにした方が良いかもしれない。
ターミナルマルチプレクサー
スマホでSSH接続すると、アプリがバックグラウンドに行った際に接続が切れるのではと心配になる(Termiusは割と頑張ってくれる気もするが)。あるいは、PCで作業を進めてスマホで作業を引き継ぎたい場合もあれば、スマホで進めた作業をPCで引き継ぎたいこともあるだろう。そういう場合に便利なのがターミナルマルチプレクサーだ(この用途だと「多重化」の必要はないが、まあいい)。
ターミナルマルチプレクサーは伝統的にはGNU screenやtmux、最近はZellijというのが出てきているようだ。私はtmuxを使っている。と言っても込み入った使い方はしていないが。
Web UI?
少し前にClaude Codeのサードパーティー製のWeb UIというやつを見かけた。前はClaude Code UIという名前だったが、今はCloudCLIという名前になっているようだ。
これも使えると便利なのかもしれないが、今のところはターミナルでの操作で十分かと思っている。
スマホ向けテキストエディター?
SSH越しにテキスト編集できるスマホアプリがあると良いのかもしれないが、今のところそれほど必要性を感じていない。スマホのキーボードはしょぼいので、テキスト編集はパソコンを触れる時で十分だと考えている。
スマホはともかく、iPadで操作したい時はモバイル向けテキストエディターがあると便利だろう。SFTP対応のものを選べばSSH越しにテキスト編集できそうだ。まあ私の場合は「MacBookを持たずにiPadだけを持ち歩く」という状況はあまりないのだが。
おまけ:私のClaude Code活用状況
私の現在のClaude Code(Proプラン)の使用状況は、バグの調査をさせたり、簡単なコードを書かせたり、英語のドキュメントを書かせたり、という感じだ。やることは人間が考え、AIの書いたものにも積極的に人間が手を入れている。そして、「おいしいコーディング」は自分でやりたいという気持ちがある。しかし、いつまでもそういうことは言っていられないだろう。いずれ、AIを使ってLunarMLやその他プロジェクトの開発を加速させるべきなのだろう。
私の今の気持ちとしては、やることの大枠は人間が決めたい。「ゲーム機のエミュレーターを作って」とだけ指示して作らせるのでは既存の仕様と実装をパクってくるだけで創造性がない。ゲーム機のエミュレーターを作らせるなら人間がゲーム機の概要を知っているべきだし、Cコンパイラーを書かせるなら人間がCコンパイラーの作り方の大枠を把握しているべきだ。人間は実装することからは解放されても、知識をつけて設計することから逃げるべきではない。しかし、これも旧時代の考えなのかもしれない。
