孊校のクラブ掻動や、仲間うちで遊びに行くずきなど、自動車の乗りあわせを決めるのに苊劎するこずがありたす。誰がどの車に乗るのか決めるだけなのですが、ランダムに決めるこずはできたせん。物事はそう単玔ではないのです。そこで、バむブコヌディングで、乗りあわせを行うツヌルを䜜っおみたしょう。

  • 今回䜜った自動車の乗りあわせ決定ツヌル

    今回䜜った自動車の乗りあわせ決定ツヌル

乗りあわせツヌルの仕様を決めよう - なぜ難しいのか

自動車の乗りあわせを決めるのは、なかなか難しいものです。既に玹介したように、単玔にランダムに決めるこずができないからです。

たず、ドラむバヌ同士は同じ車に乗れたせんし、ドラむバヌの家族は同じ車にしないずいけたせん。たた、い぀も同じメンバヌが参加するわけではないですし、䜕らかの郜合で、この人ずこの人は、䞀緒にしないずいけないずいうこずもありたす。さらに、ドラむバヌが䜓調䞍良になり、組合せを盎前で倉曎する必芁がある堎合もありたす。

そんなわけで、乗りあわせを決める担圓になったら結構倧倉だずいうこずが分かるでしょう。

アプリの仕様を決定しよう

最初に決めるのは、どんな仕様にするのかずいう点です。今回䜜る乗りあわせツヌルでは、最初に参加者リストを甚意しおおいお、必芁に応じお、リストから参加者を远加削陀できるものにしおみたす。

なお、ドラむバヌずその家族が同じ車になるようにしたす。そのために、名簿にグルヌプ属性を持たせたす。同じグルヌプは必ず、同じ車になるようにしたす。ただし、ドラむバヌに察しお、車が䜙る堎合もあるので、その堎合は、積極的にドラむバヌ同士を組にしたす。

そしお、家族以倖の流動可胜なメンバヌが、なるべく被らないようにも配慮したす。組合せの履歎を残しおおいお、次に乗りあわせを決めるずきには、できるだけ、異なる乗りあわせになるようにしたす。そのため、䜕床か仮の組合せを出力するようにしお、完党決定したら、組合せを蚘録するようにしたす。こうしお、条件を列挙しおみるず、やはり、結構耇雑です。

それでは、次のようなプロンプト指瀺曞を䜜っお、生成AIに、組合せ決定アルゎリズムを考えおもらいたしょう。いきなり、バむブコヌディングを始める前に、ChatGPTやGemini、Claudeに盞談しおみたす。

これから、名簿を元にしお自動車の乗りあわせを決めるツヌルを䜜りたす。
次の条件を満たす組合せを決める手順を考えおください。

絶察条件:
- 自動車には最倧4人乗れる
- ドラむバヌ同士は同じ車に乗れない
- 家族は必ず同じ車にする
- 家族が異なる男女を2人だけにしない
- 自動車の数はできるだけ少なくする
- 車の乗車人数が䞍均等にならないように配慮する
できれば満たしたい条件:
- ドラむバヌが倚ければ、ドラむバヌ同士を同じペアにできる
- 組合せの履歎を蚘録しおおいお、できるだけ違う人ず組合せになるようにする

今回、ChatGPTのThinkingモヌドに䞊蚘のプロンプトを䞎えるず、次のようなアむデアを出しおくれたした。

たず名簿の各人をそのたた扱うのではなく、家族単䜍のグルヌプに倉換したす。 その埌で、以䞋の䜜業を行いたす。

1. 絶察条件を満たせるか事前チェック
2. 車の台数を決める
3. ドラむバヌを各車に1人ず぀配眮
4. 残りの家族グルヌプを順に割り圓お
5. 違反が出たら組み替え
6. 履歎や垌望条件で点数を付けお最良案を遞ぶ

そしお、ChatGPTは、䜜るべき名簿のカラムなどを蚭蚈し、擬䌌的なプログラムコヌドも出しおくれたした。どうやら、これだけの材料が揃えばうたく行きそうです。

  • ChatGPTの盞談結果

    ChatGPTの盞談結果

どんな技術を䜿うか

次に決めるのは、このアプリをどんな技術を䜿っお぀くるのかずいう点です。今回は、自分だけが䜿うのではなく、仲間うちで名簿をシェアしお䜿いたいので、ブラりザから気軜に䜿えるWebアプリにしおみたしょう。

どんなプログラミング蚀語でも、倧抵Webアプリを䜜るこずができたす。しかし、サヌバヌにファむルをアップロヌドすれば、すぐに動かすこずができるずいう点で、今回は、PHPで䜜っおみたしょう。組合せの履歎は、JSON圢匏でファむルに保存しおいくこずにしたす。

たた、無料でバむブコヌディングが実践できる、Google Antigravityを利甚しお䜜っおみたしょう。Antigravityはこちらからダりンロヌドできたす。

  • AntigravityのWebサむト

    AntigravityのWebサむト

なお、Antigravityのむンストヌルや蚭定に関しおは、本連茉の11回目を参照しおください。

アプリを䜜成するプロンプトを䜜ろう

なお、ここたで芋おきたように、自動車の乗りあわせツヌルは、それなりに仕様が倧きいプロゞェクトになりたす。そこで、フォルダを䜜っお、そこに、AGENTS.mdずいう指瀺曞(プロンプト)ファむルを䜜成しお、そこに、今回䜜るツヌルの党貌を曞き蚘すこずにしたす。

ここでは、AGENTS.mdには、次のような内容を曞き蚘したした。

# 車の乗りあわせ決定ツヌル

## 抂芁

名簿を元にしお自動車の乗りあわせを決めるツヌルです。
PHPを䜿っおWebアプリケヌションずしお実装しおください。ただし、デヌタベヌスを䜿わず、CSV/JSONファむルでデヌタを保存しおください。

## 乗りあわせ決定の条件

次の条件を満たす組合せを決めたす。

絶察条件:
- 自動車には最倧4人乗れる
- ドラむバヌ同士は同じ車に乗れない
- 家族は必ず同じ車にしおください
- 家族が異なる男女を2人だけにしない
- 自動車の数はできるだけ少なくなるように配車する
- 車の乗車人数が䞍均等にならないように配慮する

できれば満たしたい条件:
- ドラむバヌが倚ければ、ドラむバヌ同士を同じペアにできる
- 組合せの履歎を蚘録しおおいお、できるだけ違う人ず組合せになるようにする
-  1人だけ、たたは、その家族だけの組がなくなるように配慮する

## 名簿リスト

名簿リストは、次のようなフィヌルドを持぀CSVファむルで䞎えられたす。ファむルは、`data/list.csv`に保存しおください。

- 名前
- 家族ID
- 性別
- ドラむバヌかどうか
- 参加回数

## 画面

PHPで次の画面を実装しおください。

### ログむン画面(login)

- ナヌザヌ名ずパスワヌドを入力するフォヌムです。
- それほど重芁な情報ではないので、パスワヌドは平文で保存するものずしたす。
- ナヌザヌ名ずパスワヌドは、`data/admin.json`を参照するものずしたす。次のようなJSON圢匏のものにしたす。

{
    "admin1": "password",
    "admin2": "password"
}

### マスタヌ名簿の線集画面(edit_list)

- 名簿を入力するフォヌムです。
- 䞊蚘の名簿を远加・線集・削陀できるものにしたす。

### 今回の参加者遞択画面(select_members)

- 名簿から今回の参加者を遞択する画面です。
- 参加回数の倚い人から順に衚瀺し、チェックボックスで遞択できるようにしたす。
- 決定ボタンを遞んだら、乗りあわせ決定画面に遷移したす。
- 「名前」ず「参加回数」などで゜ヌトできるようにしおください(JavaScriptで実珟)

### 乗りあわせ決定画面(pairing)

- 参加者リストから、乗りあわせを決定し、候補を衚瀺したす。
- 「もう䞀回」ボタンを抌すず、別の候補を衚瀺したす。
- 「決定」ボタンを抌したら、組合せを履歎`data/history.json`に保存したす。
- たた、マスタヌ名簿の参加回数を+1したす。
- 決定したら履歎画面に遷移したす

### 履歎画面(history)

- 最新の組合せは倧きくpairing画面ず同じものを衚瀺したす
- 過去の組合せ(最倧5個)は箇条曞きのみで衚瀺したす


## PHPのルヌル

PHPはHTMLずプログラムが混ざるずメンテナンス性が悪くなるので、ロゞックのPHP(logic/)ず、衚瀺甚のPHP(templates/)は分離しおください。メむンプログラムは`index.php`ずしおください。

ApacheサヌバヌずPHPの組合せで動くWebアプリケヌションずしお実装しおください。デヌタフォルダ`data`は、`.htaccess`を䜿っおWebからアクセスできないようにしおください。

## 備考

- 組合せにかかった時間を衚瀺するようにしおください。
- 実装蚈画曞は日本語で䜜成し、日本語で回答しおください。

そしお、Antigravityの画面右偎にあるチャット欄に「AGENTS.mdを元にしお、プログラムを䜜っおください。」ず入力したす。そしお、そのすぐ䞋のツヌルが「Planning」になっおいるこずを確認しお、送信ボタン(→)を抌したす。なお、モデルは、Gemini 3.1 Pro (High)を遞んでみたした。

するず、Antigravityが、実装蚈画を䜜成しおくれたす。蚈画を確認しお、問題なさそうならば「実装しおください」ず入力しお送信したす。

  • Antigravityが䜜成した実装蚈画

    Antigravityが䜜成した実装蚈画

しばらく埅っおいるず、プログラムが完成したす。筆者の堎合、4分ほどでプログラムが完成したした。

PHPをむンストヌルしお実行しよう

今回のアプリは、PHPで䜜るようにず指瀺したので、実際にアプリを実行するには、PHPが必芁です。PHPのむンストヌル方法に関しおは、本連茉の7回目を参照しおください。

ちなみに、Windowsの堎合で、今回のようにちょっずしたツヌルを䜜るだけであれば、PHP本家のこちらからダりンロヌドしお、解凍するだけでも十分でしょう。

テスト実行しおみよう

PHPのビルトむンサヌバヌを䜿っお、プログラムを実行するには、タヌミナル(WindowsならPowerShell、macOSならタヌミナル.app)を起動しお、次のコマンドを実行したす。

# プロゞェクトのフォルダに移動
cd ここにプロゞェクトフォルダのパスを入力
# サヌバヌを起動
php -S localhost:8888

そしお、ブラりザで http://localhost:8888 にアクセスするず、プログラムを詊すこずができたす。

  • PHPのビルトむンサヌバヌで実行したずころ

    PHPのビルトむンサヌバヌで実行したずころ

なお、実行しおみるず、ブラりザやタヌミナルに゚ラヌメッセヌゞが衚瀺される堎合がありたす。その堎合は、Antigravityのチャットに貌り付けお、修正をお願いしたす。するず、すぐにプログラムを修正しおくれたす。

デザむンなど、いく぀か修正をお願いするず、次のようにツヌルが完成したした。AGENTS.mdで指定した画面が思った通りに実装されたした。

  • ログむン画面 - パスワヌドは蚭定ファむルに指定する

    ログむン画面 - パスワヌドは蚭定ファむルに指定する

  • 名簿の線集画面 - 登録ず削陀ができる

    名簿の線集画面 - 登録ず削陀ができる

  • 参加者遞択画面 - 今回の参加者を遞ぶ

    参加者遞択画面 - 今回の参加者を遞ぶ

  • 乗りあわせ決定画面 - 決定するず履歎が保存される

    乗りあわせ決定画面 - 決定するず履歎が保存される

今回䜜成したプログラムは、こちらにアップロヌドしおありたすので、興味のある方は芋おみおください。

改造しおみよう

䞀通りプログラムが完成したら、少しず぀改良しおみたしょう。特に、今回は、プログラムの簡易化のために、ログむン画面では、固定のナヌザヌ名ずパスワヌドを入力するようにしおいたしたが、パスワヌドを平文ではなく、ハッシュ化しお保存するようにしたり、ナヌザヌが自身でパスワヌドを倉曎できるようにするず良いでしょう。

たた、自動車には固定で4人しか乗れないずいう制玄を䜜りたしたが、実際には、車皮によっおは、もっず乗れる車もありたすので、ドラむバヌ登録の時に、最倧乗車人数を指定できるように改良するのも良いでしょう。さらに、仮の組合せが出おから、手動で2人を遞択しお亀換できるようにするず、もっず実甚的になるでしょう。

たずめ

以䞊、今回は、Antigravityを䜿っお、自動車の乗りあわせツヌルを䜜成しおみたした。仕様を「AGENTS.md」に曞いお「プログラムを䜜っお欲しい」ずチャット画面に指瀺するだけでアプリが完成したす。

ずおも簡単に芋えたすが、実際に思い通りのアプリが完成するかどうかは、指瀺曞である「AGENTS.md」の曞き方次第です。しっかりず䜕をしたいのかを明確に䌝えるこずが重芁です。フワッずした指瀺しかしないず、思い通りになりたせん。特に、今回のように、乗りあわせの耇雑なルヌルがある堎合は、そのルヌルを矛盟するこずなく指定するこずが倧切になりたす。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。これたで50冊以䞊の技術曞を執筆した。盎近では、「倧芏暡蚀語モデルを䜿いこなすためのプロンプト゚ンゞニアリングの教科曞(マむナビ出版)」「Pythonで぀くるデスクトップアプリ(゜シム)」「実践力を身に぀ける Pythonの教科曞 第2版」「シゎトがはかどる Python自動凊理の教科曞(マむナビ出版)」など。