手作業でKGSにGTP接続してみる

囲碁プログラムを通信対局させる目標に向けて,通信を行う環境を確かめる.まずはKGS(KGS Go Server)でプログラムを対局させる為のkgsGtpをダウンロードし,対局プロトコルとなるGTP - Go Text Protocolをざっと読んでみた.

kgsGtpをつかったサーバーとの通信方法

kgsGtpはJavaで書かれた通信クライアントで,プログラムが公式対局(KGSのレーティングに反映される対局)を打つためには人用クライアントのCGoban3の代わりにこれを使う必要がある.

人間の場合 プログラムの場合
KGS -- CGoban3 -- 人 KGS -- kgsGtp -- プログラム

kgsGtpの使い方によると,プログラムがkgsGtpと接続するには5つの方法がある.

  1. kgsGtpのオプションにプログラムの起動コマンドを書く.プログラムのstdin/stdoutでGTPコマンドを扱う
  2. "named pipe"を利用する.入力,出力それぞれにひとつずつの"named pipe"を指定する.
  3. ポートを指定してTCP/IPを利用する.
  4. stdin/stdoutを利用する.kgsGtpのstdin/stdoutでGTPコマンドをやり取りする.
  5. (プログラムが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への接続方法を確かめる事ができた.

  • 次の目標

KGSでの対局に最低限必要なGTPコマンドについて調べる.