(ch03-ai-agent-in-terminal)= # 第3章 AI開発エージェントを端末で使う この章では、端末の中で動く AI を使えるようにします。 ブラウザで AI に質問した経験がある方も多いと思いますが、ここで使うのは少し違う道具です。 質問に答えるだけでなく、作業ディレクトリの中にファイルを作り、書き換えます。 本書は特定の製品に手順を固定しません。 どの製品を選んでも共通する使い方を、この章で身につけます。 ## 3.1 AI開発エージェントとは何か **AI 開発エージェント** は、端末の中で動き、ファイルの読み書きとコマンドの実行ができる AI です。 ブラウザのチャットとの違いは、成果物の受け渡し方にあります。 ブラウザのチャットに「Python でじゃんけんを作って」と頼むと、コードが画面に表示されます。 そのコードは、自分でコピーして、エディタに貼り付けて、ファイルとして保存する必要があります。 AI 開発エージェントに同じことを頼むと、`janken.py` というファイルが作業ディレクトリに作られます。 コピーも貼り付けもありません。 多くの AI 開発エージェントは、内部で ChatGPT や Claude、Gemini といった AI を利用しています。 考えている中身は、ブラウザのチャットと同じものです。 違うのは、コードやファイルを**どこで、どうやってやりとりするか**です。 受け渡し方の違いを、図3-1に示します。 ```{d2} :alt: ブラウザのチャットでは画面のコードを自分でコピーして貼って保存する4段階が要るのに対し、AI開発エージェントでは依頼するとファイルが作業ディレクトリに直接作られることを比べた図。 :width: 70% :align: center direction: down chat: "ブラウザのチャット" { style.fill: "#f1f3f4" c1: "画面にコードが出る" c2: "自分でコピーする" c3: "エディタに貼る" c4: "ファイルとして保存する" c1 -> c2 -> c3 -> c4 } agent: "AI 開発エージェント" { style.fill: "#e8f0fe" a1: "依頼する" a2: "janken.py が作業ディレクトリに作られる" { style.fill: "#e6f4ea" } a1 -> a2 } ``` {.caption-center} 図3-1: 成果物の受け渡し方の違い 違いをまとめると表3-1になります。 ```{list-table} 表3-1: ブラウザのチャットとAI開発エージェント :header-rows: 1 :widths: 30 35 35 * - - ブラウザのチャット - AI 開発エージェント * - 動く場所 - ブラウザ - 端末 * - コードの受け取り方 - 画面に表示される - ファイルとして作られる * - 既存ファイルの参照 - 貼り付けて渡す - 自分で読みに行く * - コマンドの実行 - できない - 許可すればできる ``` 「既存ファイルの参照」と「コマンドの実行」の2つが、この章で気をつけたい点です。 AI がファイルを読み書きし、コマンドを実行できるということは、便利である反面、意図しない変更も起こりうるということです。 そのための確認方法を 3.7 と 3.8 で扱います。 ### 3.1.1 候補と選び方 端末で動く AI 開発エージェントには、いくつもの製品があります。 代表的なものを表3-2に挙げます。 ```{list-table} 表3-2: 端末で動くAI開発エージェントの例 :header-rows: 1 :widths: 25 30 45 * - 名前 - 使うアカウント - 特徴 * - Claude Code - Anthropic - ソフトウェア開発の現場でよく使われている * - Codex CLI - OpenAI(ChatGPT) - ChatGPT を使っているなら試しやすい * - Gemini CLI - Google - Google アカウントだけで始められる * - OpenCode - 使うモデルの提供元 - オープンソース。モデルを自分で選ぶ * - Aider - 使うモデルの提供元 - オープンソース。変更を小さく積み重ねる使い方 ``` 表3-2の「使うアカウント」の列が、選ぶときの最初の手がかりになります。 **すでに持っているアカウントで使えるものを選ぶ**のが、いちばん手間が少ない方法です。 使えるアカウントの種類が変わることもあります。 選ぶ前に、その製品の公式ページで確認してください。 料金と無料の範囲は、本書では書きません。 条件が変わりやすく、書いた時点で古くなるからです。 実際、この1年のあいだにも、無料で使えるようになった製品と、無料の範囲が終わった製品の両方があります。 選ぶ前に、その製品の公式ページで最新の条件を確認してください。 条件を確認するときに見るのは、次の4点です。 1. **端末で動くか**。エディタに組み込まれた製品は、本書の環境では使えません。 2. **ファイルの作成と変更ができるか**。質問に答えるだけの製品では、第3章から先の手順が進みません。 3. **コマンドを実行できるか**。できなくても本書は読み進められますが、あると 3.8 の確認の練習ができます。 4. **やめやすいか**。月額制のサブスクリプションを契約する前に、無料の範囲か少額で試せると安全です。 3番目については、実行の前に確認を求める製品を選んでください。 確認なしで実行する設定を持つ製品もありますが、その設定は本書では使いません。 理由は 3.8 で扱います。 決められないときは、Google アカウントで始められるものを試してみてください。 新しくアカウントを作らずに済み、合わなければ別の製品に移れます。 **本書の手順は、どの製品を選んでも変わりません**。 インストール方法は製品ごとに違うので、それぞれの公式の手順に従ってください。 どの製品も、Ubuntu の端末でコマンドを1行か2行実行すれば入ります。 起動のしかたも短いコマンドです。 Claude Code なら `claude`、Gemini CLI なら `gemini` のように、決まった1語を打ちます。 実際に起動する手順は 3.3 で扱います。 用意できない場合や、うまく動かない場合の進め方は 3.10 にまとめてあります。 先にそちらを読んでから戻ってきてもかまいません。 ## 3.2 TUIとは何か AI 開発エージェントの多くは **TUI** という形式の画面を持っています。 TUI は Text User Interface の略で、文字だけで作られた操作画面です。 第2章で使ったコマンドは、実行すると結果を表示して終わります。 TUI は違います。 起動すると画面を占有し、入力欄や履歴が表示され、終了するまでそこにとどまります。 たとえば、画面の上のほうに過去のやりとりが流れ、下に入力欄が固定されている、という見た目です。 マウスは使わず、キーボードだけで操作します。 一度入ると元の画面に戻れないように見えますが、抜け方は 3.9 で扱います。 まずは安心して読み進めてください。 ふつうのコマンドとの違いは、図3-2のとおりです。 ```{d2} :alt: ふつうのコマンドは打つ・結果が出る・プロンプトに戻るで終わるのに対し、TUI は起動して画面を占有し、終了するまで入力と応答をくり返すことを比べた図。 :width: 70% :align: center direction: down cmd: "ふつうのコマンド(第2章)" { style.fill: "#f1f3f4" x1: "打つ" x2: "結果が出る" x3: "プロンプトに戻る" x1 -> x2 -> x3 } tui: "TUI" { style.fill: "#e8f0fe" y1: "起動する" y2: "画面を占有する" y3: "打つ / 答えが返る" y4: "終了するとプロンプトに戻る" y1 -> y2 y2 -> y3 y3 -> y2: "終了するまで繰り返す" y2 -> y4 } ``` {.caption-center} 図3-2: 実行して終わるコマンドと、とどまる TUI 窓やボタンがないだけで、やっていることは対話です。 入力欄に文章を打ち、Enter を押すと、AI が答えます。 その答えの中に「ファイルを作りました」「このコマンドを実行してよいですか」といった報告が混ざります。 ## 3.3 プロジェクトディレクトリで起動する AI 開発エージェントは、**起動したディレクトリを作業場所として扱います**。 その外側のファイルは、頼まない限り見に行きません。 外側を読ませたいときは、場所を明示して頼むことになります。 見える範囲は図3-3のようになります。 ```{d2} :alt: AI開発エージェントは起動したディレクトリ rpg とその中のファイルを作業範囲とし、ほかのディレクトリは頼まない限り見に行かないことを示した図。 :width: 55% :align: center direction: down home: "/home/taro" { style.fill: "#f1f3f4" rpg: "rpg ← ここで起動する" { style.fill: "#e6f4ea" f1: "plan.txt" f2: "main.py" } other: "ほかのディレクトリ\n(頼まない限り見に行かない)" { style.fill: "#f8f9fa" style.stroke-dash: 3 } } ``` {.caption-center} 図3-3: AI が作業場所として扱う範囲 そのため、起動する前に作業場所へ移動します。 第2章で作った `~/rpg` へ移動してから起動します。 ```bash cd ~/rpg ``` 移動できたことを `pwd` で確認します。 ```text taro@ubuntu:~/rpg$ pwd /home/taro/rpg ``` そのうえで、AI 開発エージェントを起動します。 起動コマンドは製品ごとに違い、Claude Code なら `claude`、Gemini CLI なら `gemini` のように1語を打って `Enter` です。 ```bash claude ``` 画面が切り替わり、入力欄が表示されれば起動できています。 本書では以降、製品名を書かずに「AI 開発エージェントを起動します」とだけ書きます。 この確認を省かないでください。 ホームディレクトリで起動すると、AI から見える範囲が広くなりすぎます。 作業に関係のないファイルまで読み書きの対象に入ってしまうので、目的のディレクトリで起動する習慣をつけます。 ## 3.4 AIに質問する 依頼の書き方には型があります。 次の3つを書くと、返ってくる答えが安定します。 1. **目的**: 何をしたいのか 2. **制約**: 守ってほしい条件 3. **出力**: どんな形で返してほしいか たとえば、次のように書きます。 ```text このディレクトリに、作りたいゲームの機能をメモしたファイルを作ってください。 - ファイル名は plan.txt - ターミナルで遊ぶRPGの機能を5つ、箇条書きで書く - 実装の話は書かず、遊ぶ人から見た説明にする ``` 制約を書かないと、返ってくるものが毎回変わります。 「ゲームのメモを作って」だけでは、ファイル名も、項目数も、粒度も AI が決めます。 その結果が気に入らなければ、また頼み直すことになります。 依頼文は、TUI の画面下にある入力欄に、日本語のまま打ち込んで `Enter` を押します。 改行の入れ方は製品によって違うので、慣れるまでは1行にまとめて書いてもかまいません。 最初から完璧な依頼文を書く必要はありません。 返ってきたものを見て、不足している条件を追加していくほうが早いです。 本書では、章が進むごとに依頼文の例を載せます。 ## 3.5 AIにファイルを作成させる 3.4 の依頼を実行すると、AI が `plan.txt` を作ります。 「plan.txt を作成しました」といった報告と、書いた内容が画面に表示されます。 作られたと言われたら、そのまま信じずに自分で確認します。 まず、ファイルがあるかどうかを `ls` で見ます。 ```text taro@ubuntu:~/rpg$ ls plan.txt ``` 次に、中身を `cat` で表示します。 `cat` は、ファイルの中身を画面に出すコマンドです。 ```text taro@ubuntu:~/rpg$ cat plan.txt # ターミナル探検RPG やりたいこと - プレイヤーの名前を入力できる - 探索すると敵に出会う - 敵と戦って勝つと経験値がもらえる - どうぐを拾って使える - 冒険の記録を保存して、次に遊ぶときに続きから始められる ``` 依頼した5項目が入っています。 内容も、遊ぶ人から見た説明になっています。 AI 開発エージェントの画面にも、作ったファイルの内容が表示されます。 それでも `cat` で確認する意味があります。 画面に出ているのは AI が「こう書いた」と示している内容で、保存された結果そのものではありません。 書き込みが途中で失敗していることも、別の場所に作られていることもあります。 本書では、**ファイルの状態は端末のコマンドで確かめる**という進め方をとります。 ## 3.6 AIにファイルを変更させる 既にあるファイルを変更するときは、**変更する範囲を限定して依頼します**。 ```text plan.txt に、次の1行を最後に追加してください。 ほかの行は変更しないでください。 - レベルが上がると体力と攻撃力が増える ``` 「ほかの行は変更しないでください」という一文が効きます。 これを書かないと、依頼していない変更が混ざることがあります。 たとえば、文体を整えたり、項目の順番を入れ替えたりといった変更です。 変更が終わったら、また `cat` で確認します。 ```text taro@ubuntu:~/rpg$ cat plan.txt # ターミナル探検RPG やりたいこと - プレイヤーの名前を入力できる - 探索すると敵に出会う - 敵と戦って勝つと経験値がもらえる - どうぐを拾って使える - 冒険の記録を保存して、次に遊ぶときに続きから始められる - レベルが上がると体力と攻撃力が増える ``` 最後に1行増え、ほかの行はそのままです。 依頼どおりの変更になりました。 ## 3.7 変更されたファイルを確認する 確認の方法を表3-3に整理します。 使うコマンドは3つです。 ```{list-table} 表3-3: ファイルを確認するコマンド :header-rows: 1 :widths: 30 70 * - コマンド - 用途 * - `ls` - ファイルがあるかどうかを見る * - `ls -l` - 大きさと更新日時を見る * - `cat ファイル名` - 中身をすべて表示する ``` `ls -l` を使うと、更新日時がわかります。 ```text taro@ubuntu:~/rpg$ ls -l 合計 4 -rw-r--r-- 1 taro taro 350 9月 7 22:01 plan.txt ``` 先頭の `合計 4` は、このディレクトリが使っているディスクの量を表す行です。いまは気にしなくてかまいません。 その下の行が、ファイル1つぶんの情報です。 左から、種類と権限、リンク数、所有者、グループ、大きさ(バイト)、更新日時、名前です。 いまは **大きさと更新日時** の2つだけ見えていれば十分です。 「変更したはずなのに更新日時が古い」なら、変更が保存されていません。 残りの項目が気になる場合は、AI に「`ls -l` の各列の意味を教えてください」と聞いてみてください。 先に進みたい場合は、飛ばしてかまいません。 ファイルが長くなってくると、`cat` では画面から流れてしまいます。 そのときは `less` を使います。 ```bash less plan.txt ``` `less` の中では、`↓` で1行進み、`スペース` で1画面進み、`q` で終了します。 第40章では、変更前と変更後の差分だけを見る方法も扱います。 いまの段階は、`cat` で全体を読む方法で十分です。 ## 3.8 AIが実行したコマンドを確認する AI 開発エージェントは、コマンドの実行もできます。 多くの製品では、実行する前に「このコマンドを実行してよいか」と確認が出ます。 確認は、たとえば `Run this command? (y/n)` のような形で表示されます。 文言は製品によって違いますが、実行してよいかを聞かれている点は同じです。 確認が出たら、コマンドを読んでから答えます。 判断の目安は、次のとおりです。 - **そのまま実行してよい**: `ls`、`cat`、`pwd`、`uv run python …` のように、読むだけ、または動かすだけのもの - **手を止めて確認する**: `rm`、`mv`、`sudo`、`>` を含むもの 後者の4つは、いずれも元に戻しにくい変更を起こします。判断の分かれ目を図3-4に示します。 ```{d2} :alt: 実行してよいか聞かれたら「元に戻せるか」で判断し、読むだけ・動かすだけの ls / cat / pwd / uv run python はそのまま実行、消す・上書きする・権限を変える rm / mv / sudo / > は手を止めて確認する、という分かれ道の図。 :width: 60% :align: center direction: down q: "実行してよいか聞かれた" { style.fill: "#f1f3f4" } judge: "そのコマンドは\n元に戻せるか" { shape: diamond style.fill: "#fef7e0" } ok: "そのまま実行してよい\nls / cat / pwd / uv run python" { style.fill: "#e6f4ea" } ng: "手を止めて確認する\nrm / mv / sudo / >" { style.fill: "#fce8e6" } q -> judge judge -> ok: "読むだけ・動かすだけ" judge -> ng: "消す・上書きする・権限を変える" ``` {.caption-center} 図3-4: 実行してよいコマンドの見分け方 - `rm`(削除): **Windows のごみ箱にあたる仕組みがありません**。消したファイルは元に戻せません - `mv`(移動と改名): 移動先に同じ名前のファイルがあると、確認なしで上書きされます - `sudo`(管理者権限で実行): システム全体のファイルを変更できます - `>`(ファイルへの上書き保存を表す記号): 既存の内容を消して書き直します これらのコマンドが提案されたときは、実行を承認する前に AI に聞き返します。 ```text そのコマンドは、どのファイルを消しますか。 消さずに済む方法があれば、そちらを教えてください。 ``` こうしたコマンドを AI が提案することがあります。 悪意があるわけではなく、不要になったファイルを片付けようとしただけ、ということもあります。 問題になるのは、読まずに承認したときだけです。 自動で承認する設定を持つ製品もあります。 本書の範囲では、その設定は使わないでください。 何が実行されたかを目で見ることが、この章の目的です。 ## 3.9 AIセッションを終了する TUI を終了するには、多くの製品で次のいずれかが使えます。 - `/exit` や `/quit` のようなコマンドを入力する - `Ctrl` + `D` を押す - `Ctrl` + `C` を2回押す 終了すると、第2章で見たプロンプトに戻ります。 ```text taro@ubuntu:~/rpg$ ``` 作ったファイルは、終了しても残ります。 消えるのは、画面上のやりとりだけです。 会話を再開したときに前回の内容が引き継がれるかどうかは、製品によって違います。 引き継がれない前提で進めるのが安全です。 そのために、決めた仕様や作業の途中経過は、`plan.txt` のようなファイルに書いておきます。 第17章では、この考え方でゲームの仕様書を作ります。 ## 3.10 AIが使えない場合の代替手段 AI 開発エージェントを用意できない場合でも、本書は読み進められます。 本書のコードはすべて紙面に載せてあり、手で入力しても同じものができます。 代わりの手段は2つあります。 - **端末で動くテキストエディタで、自分でファイルを作る** - **フロントマシンのブラウザでチャットに質問し、返ってきたコードを自分で保存する** どちらの場合も、ファイルを作って保存する作業は自分で行います。 そのためのエディタは、端末の中で動きます。 ### 3.10.1 端末で動くエディタ 文字だけの画面で動くエディタのうち、よく使われるのは次の2つです。 - **nano**: 画面の下に操作の一覧が出る。はじめての人でも迷いにくい - **vi**: ほぼすべての Linux に入っている。操作にくせがある **`vi` は、たいていの Linux に最初から入っています。** Ubuntu 24.04 でも入っています。 いっぽう `nano` は、入っていない場合があります。 手元にあるかどうかは、`--version` を付けて実行すると確かめられます。 ```text taro@ubuntu:~/rpg$ nano --version bash: nano: コマンドが見つかりません ``` `コマンドが見つかりません` と出たら、入っていません。 本書を書くのに使った Ubuntu 24.04 では、この状態でした。 まず nano の使い方を説明します。 そのあと 3.10.3 で、vi でも同じことをやってみます。 **手元の Ubuntu に nano がなく、追加するのも避けたい場合は、3.10.3 から読んでください。** 使い慣れたエディタがすでにあるなら、それを使ってかまいません。 本書はどのエディタでも進められます。 ここで扱うのは、何も用意していない状態から始める場合の話です。 ### 3.10.2 nano でファイルを作る nano がなければ、入れます。 ```text taro@ubuntu:~/rpg$ sudo apt install nano パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 状態情報を読み取っています... 完了 提案パッケージ: hunspell 以下のパッケージが新たにインストールされます: nano アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 9 個。 281 kB のアーカイブを取得する必要があります。 この操作後に追加で 909 kB のディスク容量が消費されます。 取得:1 http://ports.ubuntu.com/ubuntu-ports noble-updates/main arm64 nano arm64 7.2-2ubuntu0.2 [281 kB] 281 kB を 2秒 で取得しました (115 kB/s) 以前に未選択のパッケージ nano を選択しています。 (データベースを読み込んでいます ... 現在 16514 個のファイルとディレクトリがイン ストールされています。) .../nano_7.2-2ubuntu0.2_arm64.deb を展開する準備をしています ... nano (7.2-2ubuntu0.2) を展開しています... nano (7.2-2ubuntu0.2) を設定しています ... update-alternatives: /usr/bin/editor (editor) を提供するために自動モードで /bin/ nano を使います update-alternatives: /usr/bin/pico (pico) を提供するために自動モードで /bin/nano を使います ``` `sudo` は 3.8 で見たとおり、管理者の権限で実行するという意味です。 パスワードを聞かれたら、第2章で Ubuntu を用意したときに決めたものを入れてください。 **練習用のファイルを1つ作ります。** ファイル名を付けて `nano` を実行すると、そのファイルが開きます。 ないファイル名を指定した場合は、新しく作るところから始まります。 ```bash nano memo.txt ``` 画面が切り替わり、図3-5の状態になります。 ```{figure} ../_static/editor/n1-open.png :width: 100% :align: center :alt: nano で新しいファイルを開いたところ ``` {.caption-center} 図3-5: nano で新しいファイルを開いたところ 見るところは3つです。 - **いちばん上の帯**: エディタの名前と、開いているファイル名 - **まん中の広い部分**: ここに文字を書く - **いちばん下の2行**: 使えるキーの一覧 下の一覧にある `^G` や `^O` の `^` は、**`Ctrl` キー**を表します。 `^O` は「`Ctrl` を押しながら `O`」という意味です。 **そのまま文字を打ちます。** 矢印キーでカーソルを動かし、`Enter` で改行し、`Backspace` で消せます。 ふだん使っているエディタと同じ感覚で書けます。 3行ぶん打つと、図3-6のようになります。 ```{figure} ../_static/editor/n2-typed.png :width: 100% :align: center :alt: 3行を入力したところ ``` {.caption-center} 図3-6: 3行を入力したところ いちばん上の帯で、ファイル名のうしろに `*` が付いていることを確かめてください。 **`*` は「まだ保存していない」という印**です。 **保存します。** `Ctrl` を押しながら `O` を押すと、図3-7の状態になります。 ```{figure} ../_static/editor/n3-write.png :width: 100% :align: center :alt: Ctrl + O を押すと、書き込み先を聞かれる ``` {.caption-center} 図3-7: `Ctrl` + `O` を押すと、書き込み先を聞かれる 下から3行目に「書き込むファイル: memo.txt」と出ました。 このまま `Enter` を押せば、その名前で保存されます。 別の名前で保存したいときは、ここで書き換えます。 `Enter` を押すと、図3-8になります。 ```{figure} ../_static/editor/n4-saved.png :width: 100% :align: center :alt: 3行が書き込まれた ``` {.caption-center} 図3-8: 3行が書き込まれた 「3 行を書き込みました」と出ました。 ファイル名のうしろの `*` も消えています。 **エディタを終了します。** `Ctrl` を押しながら `X` を押すと、端末に戻ります。 保存できたかどうかは、`cat` で確かめます。 ```text taro@ubuntu:~/rpg$ cat memo.txt 探索で出す敵 - スライム - ゴブリン ``` **もう一度開いて、内容を変えてみます。** 同じように `nano memo.txt` と打つと、図3-9のように出ます。 ```{figure} ../_static/editor/n5-reopen.png :width: 100% :align: center :alt: 開き直すと、保存した内容が出る ``` {.caption-center} 図3-9: 開き直すと、保存した内容が出る 「3 行を読み込みました」と出て、さっき書いた内容が表示されました。 最終行の末尾にカーソルを移し、図3-10のように1行足します。 下矢印キーを2回押して3行目へ移り、`End` キーで行末へ移ります。 そこで `Enter` を押してから、新しい行を打ちます。 ```{figure} ../_static/editor/n6-added.png :width: 100% :align: center :alt: 4行目を足したところ ``` {.caption-center} 図3-10: 4行目を足したところ また `*` が付きました。 `Ctrl` + `O`、`Enter`、`Ctrl` + `X` の順に押して、保存して終了します。 ```text taro@ubuntu:~/rpg$ cat memo.txt 探索で出す敵 - スライム - ゴブリン - オオコウモリ ``` 新しく作って保存し、開き直して書き足し、また保存するところまでできました。 nano で使うキーは、当面は表3-4の4つで足ります。 ```{list-table} 表3-4: nano でよく使うキー :header-rows: 1 * - キー - 画面の表示 - すること * - `Ctrl` + `O` - `^O 書き込み` - 保存する * - `Ctrl` + `X` - `^X 終了` - 終了する * - `Ctrl` + `K` - `^K 切り取り` - カーソルのある行を切り取る * - `Ctrl` + `U` - `^U 貼り付け` - 切り取った行を貼り付ける ``` 保存せずに `Ctrl` + `X` を押すと、こう聞かれます。 ```text 変更されたバッファを保存しますか? Y はい N いいえ ^C 取消 ``` `Y` で保存、`N` で保存せずに終了、`Ctrl` + `C` で終了そのものを取り消します。 ### 3.10.3 vi で同じことをする `vi` は、Ubuntu 以外の Linux も含め、ほぼどこにでも入っています。 サーバに接続したら nano がなかった、という場面はよくあります。 そのときのために、最低限の操作を覚えておくと困りません。 vi には、nano にはない考え方があります。 **モード**です。 - **ノーマルモード**: キーが「命令」として働く。起動直後はこちら - **挿入モード**: キーが「文字」として入る ふつうのエディタは、いつでも挿入モードのようなものです。 vi は、この2つを行き来しながら使います。 **ファイルを開きます。** ```bash vi memo2.txt ``` 図3-11の画面になります。 ```{figure} ../_static/editor/v1-open.png :width: 100% :align: center :alt: vi で新しいファイルを開いたところ ``` {.caption-center} 図3-11: vi で新しいファイルを開いたところ 左端に `~` が縦に並んでいます。 これは「ファイルの終わりより先」を表す印で、中身ではありません。 いちばん下の行に `"memo2.txt" [新]` と出ています。 新しいファイルだという意味です。 **`i` を押します。** これで挿入モードに入り、図3-12のように表示が変わります。 ```{figure} ../_static/editor/v2-insert.png :width: 100% :align: center :alt: i を押すと、いちばん下に -- 挿入 -- が出る ``` {.caption-center} 図3-12: `i` を押すと、いちばん下に `-- 挿入 --` が出る いちばん下の行が `-- 挿入 --` に変わりました。 **この表示が出ているあいだは、打った文字がそのまま入ります。** 3行ぶん打つと、図3-13のようになります。 ```{figure} ../_static/editor/v3-typed.png :width: 100% :align: center :alt: 挿入モードで3行を入力したところ ``` {.caption-center} 図3-13: 挿入モードで3行を入力したところ **`Esc` キーを押します。** これでノーマルモードに戻り、図3-14のように表示が変わります。 ```{figure} ../_static/editor/v4-normal.png :width: 100% :align: center :alt: Esc を押すと -- 挿入 -- が消える ``` {.caption-center} 図3-14: `Esc` を押すと `-- 挿入 --` が消える `-- 挿入 --` が消えました。 ここから先、打ったキーは命令として扱われます。 **保存して終了します。** `:wq` と打つと、図3-15のようにいちばん下の行に出ます。 ```{figure} ../_static/editor/v5-wq.png :width: 100% :align: center :alt: :wq はいちばん下の行に表示される ``` {.caption-center} 図3-15: `:wq` はいちばん下の行に表示される `:` を押した時点で、いちばん下の行に `:` が出ます。 ここが命令を打ち込む場所です。 `w` が書き込み(write)、`q` が終了(quit)で、`Enter` を押すと実行されます。 端末に戻ったら、`cat` で確かめます。 ```text taro@ubuntu:~/rpg$ cat memo2.txt 探索で出す敵 - スライム - ゴブリン ``` **開き直して、1行足します。** ```bash vi memo2.txt ``` 図3-16のように、保存した内容が読み込まれます。 ```{figure} ../_static/editor/v6-reopen.png :width: 100% :align: center :alt: 開き直したところ ``` {.caption-center} 図3-16: 開き直したところ いちばん下に `"memo2.txt" 3L, 49B` と出ています。 3行、49バイトを読み込んだ、という意味です。 `G` を押すと最終行へ移り、`o` を押すと**その下に新しい行を作って挿入モードに入ります**。 続けて文字を打つと、図3-17のようになります。 ```{figure} ../_static/editor/v7-added.png :width: 100% :align: center :alt: G と o で行を足したところ ``` {.caption-center} 図3-17: `G` と `o` で行を足したところ `Esc` を押してノーマルモードに戻り、`:wq` と打って `Enter` で保存します。 ```text taro@ubuntu:~/rpg$ cat memo2.txt 探索で出す敵 - スライム - ゴブリン - オオコウモリ ``` vi で使うキーは、当面は表3-5の6つで足ります。 ```{list-table} 表3-5: vi でよく使うキー :header-rows: 1 * - キー - モード - すること * - `i` - ノーマル - カーソルの位置から挿入モードに入る * - `o` - ノーマル - 下に新しい行を作って挿入モードに入る * - `Esc` - 挿入 - ノーマルモードに戻る * - `G` - ノーマル - 最終行へ移る * - `:wq` - ノーマル - 保存して終了する * - `:q!` - ノーマル - 保存せずに終了する ``` **困ったら `Esc` を押してください。** どのモードにいるかわからなくなったときは、まず `Esc` です。 ノーマルモードに戻るので、そこから `:q!` と打てば、変更を捨てて抜けられます。 画面の見た目は、入っている vi の種類によって少し変わります。 ここに載せたのは、Ubuntu 24.04 に入っている vim のものです。 最小構成の `vim.tiny` では `~` に色が付かず、右下の表示も `全て` ではなく `All` になります。 それでも、**キーの操作は同じ**です。 練習で作った `memo.txt` と `memo2.txt` は、もう使いません。 消しておいてかまいません。 ```bash rm memo.txt memo2.txt ``` ### 3.10.4 ブラウザのチャットを使う 本書に載せた「AI に依頼する場合」の依頼文は、ブラウザのチャットにもそのまま貼り付けられます。 返ってきたコードを、Ubuntu 側で nano か vi を使って保存してください。 このときは、AI がファイルを直接作らない分、保存先とファイル名を自分で管理することになります。 コードをコピーして貼り付けるときは、端末アプリの貼り付け操作を使います。 Windows Terminal では `Ctrl` + `V`、macOS のターミナルでは `Cmd` + `V` です。 古いコマンドプロンプト(cmd.exe)では `Ctrl` + `V` が効かず、右クリックで貼り付ける必要があります。 nano に貼り付けるときは、そのまま貼り付けて大丈夫です。 vi に貼り付けるときは、**先に `i` を押して挿入モードに入って**ください。 ノーマルモードのまま貼り付けると、1文字ずつが命令として実行され、画面がめちゃくちゃになります。 そうなったら `Esc` を押し、`:q!` で抜けてやり直してください。 どちらの方法でも、実行するコマンドは同じです。 本書の実行コマンドは、AI を使うかどうかに関係なく動きます。 ## 3.11 ハンズオン問題 **問題3-1(easy / prompt-design)自分の環境について質問する** AI 開発エージェントを `~/rpg` で起動し、次の質問をしてください。 返ってきたコマンドを実際に実行し、表示された内容と AI の説明が合っているかを確かめてください。 **実行コマンド** ```bash cd ~/rpg ``` **依頼文** ```text いまいるディレクトリにあるファイルの一覧と、それぞれの大きさを知りたいです。 使うコマンドと、表示された各項目の意味を教えてください。 コマンドは実行せず、まず提案だけしてください。 ``` **実行例** ```text taro@ubuntu:~/rpg$ ls -l 合計 4 -rw-r--r-- 1 taro taro 350 9月 7 22:01 plan.txt ``` **ヒント** 1. 「実行せず、提案だけしてください」と書くと、内容を先に読めます。 2. 製品によっては、この指示を守らずに実行してしまうことがあります。その場合は、実行された結果と AI の説明を照らし合わせてください。 3. 表示された項目の意味がわからなければ、そのまま聞き返します。 4. 大きさの単位はバイトです。 **確認** AI の説明にある項目名と、自分の画面に出た値を1つずつ対応づけてください。 説明と画面が食い違っていたら、画面のほうが正しいと考えます。 :::{admonition} 解答と解説 :class: tip AI からは `ls -l` が提案されるはずです。 実行すると、次のように表示されます。 ```text taro@ubuntu:~/rpg$ ls -l 合計 4 -rw-r--r-- 1 taro taro 350 9月 7 22:01 plan.txt ``` 各項目の意味は次のとおりです。 - `-rw-r--r--`: 種類と権限 - `1`: リンク数 - `taro taro`: 所有者とグループ - `350`: 大きさ(バイト) - `9月 7 22:01`: 更新日時 - `plan.txt`: 名前 **解説** 依頼文に「実行せず、まず提案だけ」と書いたのが要点です。 こう書いておくと、コマンドの中身を読んでから実行するかどうかを決められます。 第3章 3.8 で扱う「実行前に確認する」の練習になっています。 いま覚えておく必要があるのは、大きさと更新日時の2つだけです。 権限やリンク数は、本書の範囲では使いません。 AI の説明と画面の表示が食い違うことがあります。 そのときは画面のほうが正しいと考えてください。 AI の説明は一般論として正しくても、使っている環境では違うことがあります。 ::: **問題3-2(easy / prompt-design)ファイルを作らせて、確認する** AI 開発エージェントに、`~/rpg` の中に `memo.txt` を作らせてください。 内容は、第2章で覚えたコマンドを4つ、それぞれの意味を1行で書いたものにします。 作られたら、`cat` で中身を確認してください。 **依頼文** ```text このディレクトリに memo.txt というファイルを作ってください。 - 内容は pwd、ls、cd、mkdir の4つのコマンドの説明 - 1コマンドにつき1行、「コマンド名: 説明」の形式で書く - 説明は Ubuntu の端末を初めて使う人向けにする ``` **実行コマンド** ```bash cat memo.txt ``` **ヒント** 1. 依頼文には、ファイル名、行数、書式の3つを入れます。 2. 生成された内容が長すぎたら、「1行30文字以内で」と条件を足して頼み直します。 3. `ls` でファイルができたことを先に確かめます。 **確認** `cat memo.txt` の結果を読み、4つのコマンドの説明が第2章の内容と合っているかを確かめてください。 違っていると感じた箇所があれば、実際にそのコマンドを打って、どちらが正しいかを確認してください。 :::{admonition} 解答と解説 :class: tip ```text taro@ubuntu:~/rpg$ cat memo.txt pwd: いまいるディレクトリを表示する ls: そこにあるファイルとディレクトリを一覧する cd: 別のディレクトリへ移動する mkdir: 新しいディレクトリを作る ``` **解説** 依頼文に、ファイル名、項目の数、書式の3つを入れました。 この3つを書いておくと、返ってくるものが安定します。 書かないと、ファイル名も項目数も AI が決めることになり、やり直しが増えます。 作られたと言われても、`ls` と `cat` で自分で確かめてください。 AI 開発エージェントの画面に表示された内容と、ディスクに保存された内容は別のものです。 内容が第2章の説明と食い違っていたら、そのコマンドを実際に打って確かめます。 たとえば `mkdir` の説明が怪しければ、`mkdir --help` を見れば決着します。 :::