SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|07|08|

2025-08-26(Tue) ちょっとウェブサーバ起動しといてくんない?

  ここんとこ「TopDrivin」の開発に夢中で、ゲームする間も惜しんで(?)、物理挙動やら、エンジン音やら、ラップタイム表示やら、次々に実装を進めている……のだが、その開発記事を書くのが追いつかない。どれも面白いコードばかりなのに。

  そこで気分を変えてプログラミングする(?)ことにする。ちょっと前から構想していた、AIによる自律端末操作。要するに、AIにコマンドを考えさせて、それを実際に端末で実行し、その結果をAIに渡して、必要ならまた次のコマンドを考えてもらう……というもの。

  ネックはAIの応答からコマンドを抜き出す方法……なのだが、実はそれはもう解決済み。AIに「JSON形式で答えてね」と指示すればよいのだ。それだけで割と機械処理しやすい形で返ってくる。

  個人的な考えだが、AIに事細かに指示する「プロンプトエンジニアリング」は極めてくだらない取り組みだと思う。自然文での指示が基本なのだから、ごく自然に必要最小限の文で指示をするべきなのだ。AIの種別によっては意図した結果にならなかったり、どのAIを使っても意図した結果にならなかったりするかもしれないが、それはAIの能力の不足であって、いましばらくの進化を待つべきだ。AIが十分に進化すれば「プロンプトエンジニアリング」などは不要になるはずで、そうなればそんな策を弄したような指示は逆に不自然な指示になるだろう。つまるところ「あなたは◯◯の専門家です」というプロンプト。気持ち悪ィんだよ。

  というわけで、作ってみた。やってることは単純。AIにコマンドをJSONで出させて、ssh経由で実行、その結果を渡し、AIにコマンドを……を繰り返すだけ。で「あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?」と、AIに指示した結果がこちら。

/home/user/devel/ngs $ INT=1 ./xopilot
REQ> あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンド[ssh root@localhost cat /etc/os-release]を実行しますか?
コマンド[ssh root@localhost id]を実行しますか?
================================================================================
Linuxの端末でコマンド「cat /etc/os-release」の実行結果は以下でした。
```
NAME="Fedora Linux"
VERSION="42 (MATE-Compiz)"
RELEASE_TYPE=stable
ID=fedora
VERSION_ID=42
VERSION_CODENAME=""
PLATFORM_ID="platform:f42"
PRETTY_NAME="Fedora Linux 42 (MATE-Compiz)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:42"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f42/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=42
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=42
SUPPORT_END=2026-05-13
VARIANT="MATE-Compiz"
VARIANT_ID=matecompiz
```
Linuxの端末でコマンド「id」の実行結果は以下でした。
```
uid=0(root) gid=0(root) groups=0(root)
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
Fedora Linuxにウェブサーバ(Apache HTTP Serverなど)がインストールされている場合、次のコマンドでサービスを起動できます。以下のコマンドをJSON形式で指示します。
 
```json
{
  "command": "systemctl start httpd",
  "description": "Apache HTTP Serverを起動します。"
}
```
 
もしNginxなど別のウェブサーバを使用している場合は、コマンドを変更する必要がありますので、その場合はお知らせください。
--------------------------------------------------------------------------------
コマンド[ssh root@localhost systemctl start httpd]を実行しますか?
================================================================================
指示してもらったコマンド「systemctl start httpd」の実行結果は以下でした。
```
 
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
次に、ウェブサーバの状態を確認してみましょう。以下のコマンドを実行してください。
 
```json
{
  "command": "systemctl status httpd",
  "description": "Apache HTTP Serverの状態を確認します。"
}
```
 
これにより、ウェブサーバが起動しているかどうかが確認できます。結果を教えてください。
--------------------------------------------------------------------------------
コマンド[ssh root@localhost systemctl status httpd]を実行しますか?
================================================================================
指示してもらったコマンド「systemctl status httpd」の実行結果は以下でした。
```
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
    Drop-In: /usr/lib/systemd/system/service.d
             └─10-timeout-abort.conf
             /etc/systemd/system/httpd.service.d
             └─override.conf
     Active: active (running) since Tue 2025-08-26 22:48:29 JST; 4s ago
 Invocation: 9638ae5341dd4ad4a36c37ec35333ea1
       Docs: man:httpd.service(8)
   Main PID: 77463 (httpd)
     Status: "Started, listening on: port 80"
      Tasks: 177 (limit: 18293)
     Memory: 13.8M (peak: 15.2M)
        CPU: 127ms
     CGroup: /system.slice/httpd.service
             ├─77463 /usr/sbin/httpd -DFOREGROUND
             ├─77464 /usr/sbin/httpd -DFOREGROUND
             ├─77465 /usr/sbin/httpd -DFOREGROUND
             ├─77466 /usr/sbin/httpd -DFOREGROUND
             └─77467 /usr/sbin/httpd -DFOREGROUND
 
 8月 26 22:48:29 derota.itline.jp systemd[1]: Starting httpd.service - The Apache HTTP Server...
 8月 26 22:48:29 derota.itline.jp (httpd)[77463]: httpd.service: Referenced but unset environment variable evaluates to an empty string: OPTIONS
 8月 26 22:48:29 derota.itline.jp httpd[77463]: Server configured, listening on: port 80
 8月 26 22:48:29 derota.itline.jp systemd[1]: Started httpd.service - The Apache HTTP Server.
```
あー、あのー、あれ。ウェブサーバだっけな。起動してないんなら、ちょっと起動しといてくんない?
コマンドの実行が必要であれば、そのコマンドをJSON形式で指示してください。実行結果を返します。
指示内容を実行できたら「追加のコマンドは必要ありません」と答えてください。
--------------------------------------------------------------------------------
ウェブサーバ(Apache HTTP Server)は既に起動しているようです。実行結果に「Active: active (running)」とあり、ポート80でリッスンしていることが示されています。
 
したがって、追加のコマンドは必要ありません。
--------------------------------------------------------------------------------

  見事に日本語の自然文の指示によりウェブサーバを起動することができている。root権限で実行させる都合から、確認モード(INT=1)を指定しているが、元気があれば自動走行でもできる。

  必要な設定は以下。操作対象のサーバとアカウントはsshのコマンドパラメータとして与える。最初に既定で「cat /etc/os-release」と「id」の実行結果を渡すのは、AIにコマンドの動作環境を知らせるためだ。これは、なかなかのアイデアではないかな。

@configs[:xopilot] = {}
@configs[:xopilot][:ssh_cmd]    = ['ssh', 'localhost']
@configs[:xopilot][:first_cmds] = ['cat /etc/os-release', 'id']
@configs[:xopilot][:result_max] = 64
@configs[:xopilot][:ask_max]    = 20

  あ。ちなみに「XoPilot」というコマンド名は「ゾパイロット」と読む。「Xalebot」の姉妹品であることを暗示しつつ「eXtra Offhand Pilot」を意味しつつ、某マイクソソフトのアレに当てつけた名前でもある。

  なお、全部は紹介しきれないが、指示の達成率はそれなりに高く、以下のような指示を概ねクリアできている。

・時刻同期の状態を教えてください
・ホームディレクトリの下に動画はありますか? あれば、そのリストと、動画の長さを調べてください
・昨日のメールの送受信数を調べてください
・ホームディレクトリの下にhoge.txtというファイルをfuga!という内容で生成してください。
・/etc/hostsにhogeというホストを追加してください。IPアドレスは192.168.0.99です。
・/etc/hostsにhogeというホストがあれば削除してください。
・ホームディレクトリの下に開発物件はありますか? あれば、概要を教えてください。

  XoPilotは自製のngsライブラリのサンプルである。http://itline.jp/git/ngsに置いておく。