2021-01-24に更新

GTP2NNGS を解析しようぜ☆(^~^)?

ごびょー☆(^~^) ぶぱぱら☆(^~^) ぱげー☆(^~^) 公開下書き

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 GTP2NNGS を解析しようぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 勝手にしろだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 Ruby を使えばいいのに……」

Observer

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 物事の重要な節目、節目で呼び出される関数みたいなものだぜ☆
どんな種類があるか カードにするといいんだが、 このブログでは テーブルにしよう☆」

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'

KIFUWARABE_80x100x8_01_Futu.gif
「 12か所だな☆」

State

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 コマンドには数字が振ってあるんだが、これは 状態 なのではないかと思う☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 NNGSのソースを読めば分かるのでは?」

行頭の数 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' #指し手?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ ざっくり、これだけ解析できれば コンピューター囲碁サーバーと通信できるみたいだが……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 NNGS を動かしてみましょうよ?」

20210118go52a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 打つコマンドが分からん☆!
あっという間にタイムアウトだぜ☆!」

http://www.computer-go.jp/gifu2005/regulations/communication.html

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ 読めだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ Playera と Playerb が NNGS にログインし、
Playera から Playerb にマッチングを申込み、 ( match playerb B 19 40 0 )
あとは指し手かだぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 というか そのサイトに 通信ログ があるから見ましょうよ?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 client モード というのがあるらしい☆ 表示が simple になるぜ☆
GTP2NNGS も client モード 使ってそう☆」

20210118go53.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 9 とか 1 スペース 5 とか、 15 とかあるな☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 まぎらわしい……☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 なんで対局してんのに、毎回ゲーム情報 流れてくんの?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 持ち時間とかじゃないか☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 何が 1 5 で、何が 1 6 なのか分からん☆ IQテストかだぜ☆?」

20210118go55.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 初期状態が こうで……☆
Login: って尋ねられたら☆」

20210118go56.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こうなって……☆
そのあとに set client TRUE って打てば……☆」

20210118go57.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ こうなるわけかだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 それより先に、コミがいくつか という設定があっただろ☆ 初めからやり直せだぜ☆」

20210118go57.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 初期状態は こうかだぜ☆
コミは 5.5 だが、コンピューター囲碁大会での勝敗判定は サーバーではなく エンジンの方がやるから
5.5 のまま放置しても問題ないぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 そして 対局を申し込むのは サーバー側ではなく プレイヤーが行うみたいだな☆
UECの大会では サーバー側が マッチを付けてくれるから やらなくていいけど、
match playerb B 19 40 0 ☆」

20210118go58a1.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 設定はこれぐらいだと思うけど☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 状態遷移は どうだったんだぜ☆?」

20210118go59.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ playera は こんな感じだぜ☆
しかし、いつ石を打てばいいのか 合図が分からん☆ 相手の番に 打ってしまわないか☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 playerb の状態遷移図を 見てみましょう!」

20210118go60.png

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 受動的かつ強制的に 遷移するところがあるな☆
お互い 対局成立 までは 行くんだが☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 お互い、どっちが 黒で、どっちが白かは 分かってるじゃない。
黒が先手よ」

20210118go61.png

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ Login の流れは確定だな☆
その次、能動的にコマンドを打つのと、受動的かつ強制的に遷移するの、どっちが優先かだな☆」

2021-01-19 tue

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ GTP2NNGS の input, output が さっぱり理解できん☆
NNGS(サーバー)からの input は @socket を使って待機しているが、 GTP(エンジン)からの input はどこで待機しているんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 @io だろ☆ receive という関数がある☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 receive は、 send のおまけに付いているだけだぜ☆
send してないときに送られてきた入力は どうすんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 それは知らないが @listener が使われているのは send 関数と、 receive 関数の中だぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 send と receive を区別してないのが 分け分からん……☆
これでは ログを取れるだけだぜ☆」

KIFUWARABE_80x100x8_01_Futu.gif
「 @listener は、 テキストエリアの末尾に ログを追加しているだけかも知らん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ 白番から先にログインしろ、と readme.txt に書いているのは、マッチングを決め打ちしてハードコーディングしているのかだぜ☆?」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 プレイヤー名と手番を指定して マッチングを要求するから、最初にログインする方は それでいいんじゃない?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あとから入ったやつは どうやって 自分は後から入ったと認識するんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 readme.txt を読むと、 白番は先に Enter キーの空打ちでログインし、
黒番は後から 白番の名前を入れて Enter キーを打つようだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 みんな そんなめんどくさいこと やってんの☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 分からん☆ Ruby をインストールするか……☆」

ruby nngsCUI.rb
input user:

wating match request.
NNGS -> 9 Set client to be True.
NNGS -> 1 5

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 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>'

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 続いて 黒番で入って見ると エラー☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 エラーの出てくるプログラムを解析してても 意味なくない?」

$config = {
  'NNGS' => {
    'server'=>'localhost',
#    'server'=&gt;'jsb.cs.uec.ac.jp',
#    'server'=&gt;'nngs.computer-go.jp',
#    'server'=&gt;'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'=&gt;'/home/yss/aya/ayamc -gtp'
#    'command'=&gt;'/usr/games/bin/gnugo --mode gtp --quiet'
  },
  'SIZE' => 9,
  'TIME' => 15,         # minutes
  'KOMI' => 7.0,
  'BYO_YOMI' => 0
}

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ お父んは zen-10.4 とか持ってないだろ☆
先に GTPに対応した エンジンを作って 設定ファイルで設定しろだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 先が長……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 白番のエンジンは、エンジン名を どうやって NNGS に渡しているんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 渡していないのでは☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 じゃあ どうやって対局が付くんだぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 config,rb に ユーザー名が書いてあるぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うそ囲碁エンジン を作って 何を受信するか 待ち構えるかだぜ……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Go言語でログ・ファイル書き出すの どうやるんだぜ……☆?」

Go言語らしいLoggingについて

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ ググれだぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 動かんサンプルなんかリンク貼るなだぜ☆」

How to collect, standardize, and centralize Golang logs

KIFUWARABE_80x100x8_01_Futu.gif
「 ↑ じゃあ これはどうだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ファイルに書き出せないロガーなんか要らね☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 GTP に対応したエンジンの書き方が分からん☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 nngsCUI.rb が わたしのプログラムを呼んでくれている様子も無いぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「 NNGS に対応しても NNGS にしか接続できないから、 GTP に対応するのが筋なのよ。
でも GTP に対応したところで大会には出れないから GTP を NNGS に変換する必要があるのよ」

KIFUWARABE_80x100x8_01_Futu.gif
「 NNGS も GTP2NNGS の両方とも手元にあるのに 動かんのか……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 GTP と NNGS の両方に対応できる作りにしておこうぜ☆?」

KIFUWARABE_80x100x8_01_Futu.gif
「 2倍めんどくさ……☆」

https://golang.org/pkg/net/

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 大会が NNGS なんだから GTP は諦めていいだろ……☆
Go言語で Socket を開く方法を調べようぜ☆?」

2021-01-20 wed

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 TCP では NNGS に接続できない……、 Telnet でないとダメか……☆」

Go言語でtelnet通信 (reiver/go-telnetを使ってみた)

go get -v -u github.com/reiver/go-telnet

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむ 分からん☆ Telnet について 調べてみるか……☆」

GolangでTelnetを使ってみようぜ☆(^~^)?

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑ 調べてきたぜ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あれっ、 NNGS に つながらね……☆?
Windows の telnet と、 Go言語の Telnet と何か違いがあるのかだぜ☆?」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 あっ、Reader も使わないと NNGS からの受信文字列に気づかないのか☆
つながってた……☆」

2021-01-24 sun

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 行き詰ったので いったん 整理しよ……☆」

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 はコメントアウト

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーん、また後ほど☆」

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事