手作業でKGSにGTP接続してみる
囲碁プログラムを通信対局させる目標に向けて,通信を行う環境を確かめる.まずはKGS(KGS Go Server)でプログラムを対局させる為のkgsGtpをダウンロードし,対局プロトコルとなるGTP - Go Text Protocolをざっと読んでみた.
kgsGtpをつかったサーバーとの通信方法
kgsGtpはJavaで書かれた通信クライアントで,プログラムが公式対局(KGSのレーティングに反映される対局)を打つためには人用クライアントのCGoban3の代わりにこれを使う必要がある.
人間の場合 | プログラムの場合 |
---|---|
KGS -- CGoban3 -- 人 | KGS -- kgsGtp -- プログラム |
kgsGtpの使い方によると,プログラムがkgsGtpと接続するには5つの方法がある.
- kgsGtpのオプションにプログラムの起動コマンドを書く.プログラムのstdin/stdoutでGTPコマンドを扱う
- "named pipe"を利用する.入力,出力それぞれにひとつずつの"named pipe"を指定する.
- ポートを指定してTCP/IPを利用する.
- stdin/stdoutを利用する.kgsGtpのstdin/stdoutでGTPコマンドをやり取りする.
- (プログラムがjavaの場合)kgsGtpをライブラリとして組み込む.
今回作るプログラムはC++の予定なので,5以外のどれかを使う事になりそう.今までの経験ではstdin/stdoutしか使った事がないので,2,3を使うとしたらそれぞれの使い方を勉強する.
1,4の場合に分からない事は
- 1の場合
- プログラムを直接指定すると,GUIはどうやって起動すれば良いのか?
- 4の場合
- kgsGtpとプログラムのstdin/stdoutはどうやってつなげれば良いのか?
手動で通信テスト
とりあえず,4のstdin/stdoutを使う方法なら,コマンドプロンプトでkgsGtpを起動すれば手作業でGTPコマンドを送れそうなので,KGSと通信するだけでもやってみた.
IDやパスワードなどを指定するconfigファイルを作り,kgsGtpのオプションに指定してkgsGtpを起動.
"list_commands"
"name"
"version"
というメッセージが送られてくるが,未対応の場合の返答として規定されている"?"を送信して無視させる.するとここでkgsGtpが終了してしまった.
ログを見ると,config中でログインする部屋を指定するroomオプションが文字化けしていて,部屋が見つからないために切断された事が判明.kgsGtpはISO-8859-1を使用しているため,日本語が文字化けしてしまった.検索すると,文字コードの変換ができるエディタプロパティエディタを発見した.これを使って文字コードを変えてもう一度試したところ接続に成功した.別のIDでCGoban3経由でログインし,プログラムのIDが部屋の参加者リストに入っている事を確認.KGSへの接続方法を確かめる事ができた.
- 次の目標