「 物事の重要な節目、節目で呼び出される関数みたいなものだぜ☆
どんな種類があるか カードにするといいんだが、 このブログでは テーブルにしよう☆」
Function | Log message | Description |
---|---|---|
match_request | 'request' | |
match_cancel | 'cancel' | |
match_start | 'start' | |
match_scoring | 'scoring' | |
match_end | 'end' | |
my_turn | 'my_turn' | |
my_move(move) | 'my_move' | 自分の指し手。 |
undo | 'undo' | |
his_turn | 'his_turn' | |
his_move(move) | 'his_move' | 相手の指し手。 |
logined | 'login' | |
logouted | 'logout' |
「 コマンドには数字が振ってあるんだが、これは 状態 なのではないかと思う☆」
行頭の数 | Description |
---|---|
1 | 手番に関係あるか? |
1 - 5 | 1 - 7 から来たら マッチ終了? |
1 - 6 | 1 - 5 から来たら マッチ開始? |
1 - 7 | 1 - 6 から来たら得点計算? |
9 | マッチング待ち中の状態か? |
9 | 'use |
9 | 'Match [xxxxx] with xxxxx in xxxxx accepted.' |
9 | 'declines your request for a match.' |
9 | 'You decline the match offer from' |
9 | '1 7 ' |
15 | 対局中の状態か? |
15 | 'Game 0000 zzzz: xxxx (xxxx xxxx xxxx) vs xxxx (xxxx xxxx xxxx)' |
15 | 'xxxxx0000(b): xxxx' #指し手? |
「 ↑ ざっくり、これだけ解析できれば コンピューター囲碁サーバーと通信できるみたいだが……☆」
「 ↑ 打つコマンドが分からん☆!
あっという間にタイムアウトだぜ☆!」
http://www.computer-go.jp/gifu2005/regulations/communication.html
「 ↑ Playera と Playerb が NNGS にログインし、
Playera から Playerb にマッチングを申込み、 ( match playerb B 19 40 0
)
あとは指し手かだぜ☆」
「 というか そのサイトに 通信ログ があるから見ましょうよ?」
「 client モード というのがあるらしい☆ 表示が simple になるぜ☆
GTP2NNGS も client モード 使ってそう☆」
「 ↑ 9 とか 1 スペース 5 とか、 15 とかあるな☆」
「 何が 1 5
で、何が 1 6
なのか分からん☆ IQテストかだぜ☆?」
「 ↑ 初期状態が こうで……☆
Login:
って尋ねられたら☆」
「 ↑ こうなって……☆
そのあとに set client TRUE
って打てば……☆」
「 それより先に、コミがいくつか という設定があっただろ☆ 初めからやり直せだぜ☆」
「 ↑ 初期状態は こうかだぜ☆
コミは 5.5 だが、コンピューター囲碁大会での勝敗判定は サーバーではなく エンジンの方がやるから
5.5 のまま放置しても問題ないぜ☆」
「 そして 対局を申し込むのは サーバー側ではなく プレイヤーが行うみたいだな☆
UECの大会では サーバー側が マッチを付けてくれるから やらなくていいけど、
match playerb B 19 40 0
☆」
「 ↑ playera は こんな感じだぜ☆
しかし、いつ石を打てばいいのか 合図が分からん☆ 相手の番に 打ってしまわないか☆?」
「 ↑ 受動的かつ強制的に 遷移するところがあるな☆
お互い 対局成立 までは 行くんだが☆」
「 お互い、どっちが 黒で、どっちが白かは 分かってるじゃない。
黒が先手よ」
「 ↑ Login の流れは確定だな☆
その次、能動的にコマンドを打つのと、受動的かつ強制的に遷移するの、どっちが優先かだな☆」
「 ↑ GTP2NNGS の input, output が さっぱり理解できん☆
NNGS(サーバー)からの input は @socket
を使って待機しているが、 GTP(エンジン)からの input はどこで待機しているんだぜ☆?」
「 receive は、 send のおまけに付いているだけだぜ☆
send してないときに送られてきた入力は どうすんだぜ☆?」
「 それは知らないが @listener
が使われているのは send 関数と、 receive 関数の中だぜ☆」
「 send と receive を区別してないのが 分け分からん……☆
これでは ログを取れるだけだぜ☆」
「 @listener
は、 テキストエリアの末尾に ログを追加しているだけかも知らん☆」
「 じゃあ 白番から先にログインしろ、と readme.txt
に書いているのは、マッチングを決め打ちしてハードコーディングしているのかだぜ☆?」
「 プレイヤー名と手番を指定して マッチングを要求するから、最初にログインする方は それでいいんじゃない?」
「 あとから入ったやつは どうやって 自分は後から入ったと認識するんだぜ☆?」
「 readme.txt
を読むと、 白番は先に Enter キーの空打ちでログインし、
黒番は後から 白番の名前を入れて Enter キーを打つようだぜ☆」
ruby nngsCUI.rb
input user:
wating match request.
NNGS -> 9 Set client to be True.
NNGS -> 1 5
「 ↑ NNGS を localhost に立てて、まず白番からログインだぜ☆」
ruby nngsCUI.rb
C:/Users/むずでょ/go/src/github.com/muzudho/gtp-to-nngs/muzudho-using/NngsClient.rb:80:in `waitfor': Socket not opened (IOError) from C:/Users/
むずでょ/go/src/github.com/muzudho/gtp-to-nngs/muzudho-using/NngsClient.rb:99:in `login'
from nngsCUI.rb:148:in `<main>'
「 エラーの出てくるプログラムを解析してても 意味なくない?」
$config = {
'NNGS' => {
'server'=>'localhost',
# 'server'=>'jsb.cs.uec.ac.jp',
# 'server'=>'nngs.computer-go.jp',
# 'server'=>'192.168.1.1',
'port'=>'9696',
'user'=>'zen01', # your account
'pass'=>'zen' # your password (any)
},
'GTP' => { # command to start your program
'command'=>'zen-10.4 --threads=1 --games=999999 --memory=400'
# 'command'=>'/home/yss/aya/ayamc -gtp'
# 'command'=>'/usr/games/bin/gnugo --mode gtp --quiet'
},
'SIZE' => 9,
'TIME' => 15, # minutes
'KOMI' => 7.0,
'BYO_YOMI' => 0
}
「 ↑ お父んは zen-10.4
とか持ってないだろ☆
先に GTPに対応した エンジンを作って 設定ファイルで設定しろだぜ☆」
「 白番のエンジンは、エンジン名を どうやって NNGS に渡しているんだぜ☆?」
「 うそ囲碁エンジン を作って 何を受信するか 待ち構えるかだぜ……☆」
「 Go言語でログ・ファイル書き出すの どうやるんだぜ……☆?」
How to collect, standardize, and centralize Golang logs
「 nngsCUI.rb が わたしのプログラムを呼んでくれている様子も無いぜ☆」
「 NNGS に対応しても NNGS にしか接続できないから、 GTP に対応するのが筋なのよ。
でも GTP に対応したところで大会には出れないから GTP を NNGS に変換する必要があるのよ」
「 NNGS も GTP2NNGS の両方とも手元にあるのに 動かんのか……☆」
「 GTP と NNGS の両方に対応できる作りにしておこうぜ☆?」
「 ↑ 大会が NNGS なんだから GTP は諦めていいだろ……☆
Go言語で Socket を開く方法を調べようぜ☆?」
「 TCP では NNGS に接続できない……、 Telnet でないとダメか……☆」
Go言語でtelnet通信 (reiver/go-telnetを使ってみた)
go get -v -u github.com/reiver/go-telnet
「 うーむ 分からん☆ Telnet について 調べてみるか……☆」
「 あれっ、 NNGS に つながらね……☆?
Windows の telnet
と、 Go言語の Telnet と何か違いがあるのかだぜ☆?」
「 あっ、Reader も使わないと NNGS からの受信文字列に気づかないのか☆
つながってた……☆」
GTPエンジン側が実装するパッシブ・コマンド:
Command | Description |
---|---|
boardsize | 思考エンジンが持っている盤が何路かを変更してください。 |
clear_board | 思考エンジンが持っている盤を初期化してください。 |
quit | 思考エンジンを終了してください。 |
protocol_version | 2 を送信してください。 |
name | 思考エンジンの表示名を送信してください。 |
version | バージョン番号 0.0.1 とかを送信してください。 |
list_commands | 対応できるコマンドの一覧を表示してください。 |
komi | コミを 6.5 のように送信してください。 |
undo | 思考エンジンが持っている盤を1手戻してください(未対応)。 |
genmove | 指し手を送信してください。 |
play | 思考エンジンが持っている盤の指定箇所に石を置いてください。 |
GTP2NNGS から GTPエンジンへ送信するコマンド:
Command | Arguments | Description |
---|---|---|
name | 黒手番では2回聞く? 白手番では3回聞く? | |
version | nameのあと1回聞く | |
何か activate で entry.get_text | ||
boardsize | 5 | boardsize, komi, clear_board は1セット |
komi | 0 | |
clear_board | ||
quit | ||
time_settings | time 0 0 | |
genmove | color | |
play | (black,white) move | |
undo | ||
time_left | color left 0 | |
showboard はコメントアウト |
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!