「 NNGS 1.1.22 囲碁サーバー立てようぜ、ローカルに☆」
「 ↑ C言語なんだが Linux 風なんで Linux上で動かした方がいいだろ☆」
「 ↑ 仕様書はこれだぜ☆ 分かるやつは 仕様書読めば分かる☆」
「 Red Hat、 Debian 系の OS なら……☆ Ubuntu の上で動くのか……☆?」
「 ↑ Docker Hub で欲しいものを見つける方法から 親切に解説した方が 良くないかだぜ☆?」
「 時間がないので Docker Hub の使い方が分からないやつは 無視で☆」
「 ↑ サーバーの立て方を読むか……☆
src/nngsconfig.h
と src/nngsmain.h
読んで勝手にコンパイルしろとのことだぜ☆」
「 ↑ プリプロセッサ・ディレクティブ読めば分かるだろ、というのは C言語 な感じがするよな、めんどくせ☆」
「 多分、 http://localhost:9696/
にゲームサーバーが立って、 6969
ポートは何かに使われてるんだろう……☆」
「 mlrate-1.1.0.tar.gz
って何だぜ☆?」
「 ↑ 2005年時点では ダウンロードできたという報告があるな……☆」
「 ↑ 2010年時点でも ググれば簡単にでてくるらしいぜ☆」
「 ↑ これか……☆? 名前しか一致してないが……☆ MD5 とか無いのか……☆ こんなセキュリティ ガバガバな方法でいいのか……☆?」
「 ダメだ、展開したあとのやつだぜ、ダウンロードめんどくせ☆ zip で欲しいぜ☆」
http://pem.nu/cms/index.php/freeprogs
「 ↑ mlrate
という字を見て メールのソフトかと思ってたんだが 違うのか……☆?」
「 ↑ make
したら、ただのエラーが出てきた わらう☆
調べるか……☆」
「 ↑ ソースコードが悪いことはないと思うので、オプションから調べていこうぜ☆?
まず CFLAGS
から☆」
「 ↑ これをダウンロードするには git
コマンドがいるな☆」
「 ↑ git
コマンドの生叩きとか知らんぜ☆ クローンでいいんだろうか……☆?」
git config --global user.name "XXXX"
git config --global user.email "[email protected]"
git clone https://github.com/mgorny/cpuid2cpuflags.git
「 ↑ この Makefile.am
は automake
なのでは……☆ めんどくさ……☆」
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# autoscan
configure.ac: warning: missing AC_CHECK_FUNCS([uname]) wanted by: src/hwcap.c:57
configure.ac: warning: missing AC_CHECK_HEADERS([limits.h]) wanted by: src/hwcap-dump.c:11
configure.ac: warning: missing AC_CHECK_HEADERS([stddef.h]) wanted by: src/hwcap.c:13
configure.ac: warning: missing AC_TYPE_SIZE_T wanted by: src/arm.c:156
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# ls
COPYING Makefile.am README autom4te.cache autoscan.log configure.ac configure.scan src tests
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# aclocal
aclocal: warning: couldn't open directory 'm4': No such file or directory
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# aclocal
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# ls
COPYING Makefile.am README aclocal.m4 autom4te.cache autoscan.log configure.ac configure.scan m4 src tests
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# automake -a
configure.ac:3: error: required directory ./build-aux does not exist
configure.ac:9: error: installing 'build-aux/compile'; error while making link: No such file or directory
configure.ac:5: error: installing 'build-aux/install-sh'; error while making link: No such file or directory
configure.ac:5: error: installing 'build-aux/missing'; error while making link: No such file or directory
configure.ac:20: error: required file 'config.h.in' not found
Makefile.am: error: installing 'build-aux/depcomp'; error while making link: No such file or directory
parallel-tests: error: installing 'build-aux/test-driver'; error while making link: No such file or directory
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# mkdir build-aux
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# automake -a
configure.ac:9: installing 'build-aux/compile'
configure.ac:5: installing 'build-aux/install-sh'
configure.ac:5: installing 'build-aux/missing'
configure.ac:20: error: required file 'config.h.in' not found
Makefile.am: installing 'build-aux/depcomp'
parallel-tests: installing 'build-aux/test-driver'
root@61636d9f1008:/app/mlrate/cpuid2cpuflags# automake -a
configure.ac:20: error: required file 'config.h.in' not found
autoreconf --install
「 ↑ わたしが欲しいのは cpuid2cpuflags
コマンドなんだが……☆」
「 もう bin
ディレクトリーに入ってたりしないのかだぜ☆?」
which cpuid2cpuflags
make
「 ↑ よし、 cpuid2cpuflags
実行ファイルが できてるぜ☆!」
「 シェイクスピアの小説が書けるまでキーボードを叩く猿 に肯定的なお父んの為せる技だぜ☆」
./cpuid2cpuflags
CPU_FLAGS_X86: aes avx avx2 f16c fma3 mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3
-O2 -pipe -march=native
root@61636d9f1008:/app/mlrate# vim Makefile
bash: vim: command not found
root@61636d9f1008:/app/mlrate# vi Makefile
bash: vi: command not found
cp /app/mlrate/cpuid2cpuflags/cpuid2cpuflags /usr/local/bin/cpuid2cpuflags
「 ↑ 確かにソースは腐っているが、なんで腐ったソース配ってるんだぜ☆?」
/* 2020-11-25 Add --> */
int getopt(int argc, char * const argv[],
const char *optstring);
extern char *optarg;
extern int optind, opterr, optopt;
/* --> 2020-11-25 Add */
「 ↑ 頭を使うのが嫌なので、関数プロトタイプ宣言文を ソースファイル(.c) の include 文の下に置いとこうぜ☆?」
cd /app/nngs
ln -s ../mlrate mlrate
./configure --prefix=$HOME/go/nngs/
make install
「 ↑ C++スタイルのコメントは許可されていません、という カッコいいエラーが出たんだが☆」
cd /app/mlrate
mkdir src
cp /app/mlrate/libmlr.a /app/mlrate/src/libmlr.a
cd /app/nngs
make install
「 ↑ *** [Makefile:238: install-recursive] Error 1
って出たぜ☆ 」
make clean
make
「 ↑ こういうエラーメッセージから 不具合を特定するのが 実践問題だぜ☆ やってみようぜ☆」
「 ↑ これは エラーが起きました、という定型文みたいなもんで 原因ではないぜ☆ それより前に原因があるぜ☆」
「 ↑ 見るからにリンカが並んでるんだが、同じもん定義すんな、と書いてるぜ☆
じゃあ 他に当てもないし 直してみるかだぜ☆」
「 ↑ 複数回定義しそうに見えないが、もっと詳しく見てみるかだぜ☆」
「 ↑ ヘッダー・ファイルと ソース・ファイルの両方に 構造体の定義文があるんだけど☆」
「 じゃあ ヘッダー・ファイルの方の 構造体の定義文を……、 extern
とかできるのかだぜ☆?」
「 ヘッダー・ファイルの方の 構造体定義文は コメントアウトで☆」
/*
* 2020-11-25 Add extern keyword.
* struct channel carray[MAX_CHANNELS];
*/
extern struct channel carray[MAX_CHANNELS];
「 ↑ エラー取れたかだぜ☆? お粗末なミス・コーディングだったな☆」
cd /root/go/nngs/bin
./nngssrv
「 ↑ 今度は何だぜ……☆? ログ・ファイル作ってやればいいのかだぜ☆?」
cd /root/go/nngs
mkdir nngssrv
cd nngssrv
mkdir stats
cd stats
touch logfile
cd /root/go/nngs/bin
./nngssrv
Fork1 = 13725
Fork2 = 13726
root@61636d9f1008:~/go/nngs/bin# NNGS: can't bind local address. errno=98(Address already in use)
NNGS: can't bind local address. errno=98(Address already in use)
Network initialize failed on ports 6969,9696.
telnet localhost 9696
bash: telnet: command not found
apt-get update
apt-get install telnet -y
telnet localhost 9696
bash: telnet: command not found
Reading package lists... Done
Building dependency tree
Reading state information... Done
telnet is already the newest version (0.17-41.2build1).
0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
root@61636d9f1008:~/go/nngs/bin# telnet localhost 9696
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Login: muzudho
"muzudho" is not a registered name. You may use this name to play unrated games.
(After logging in, do "help register" for more info on how to register.)
This is a guest account.
Your account name is muzudho.
No Name Go Server (NNGS) version 1.1.22
#>
「 ↑ こういうのは ターミナル2つ自分で開いて 1人2役するんだぜ☆
match
コマンド打つのめんどくさいが、石を置くのは A1
とかでいけるぜ☆」
「 ↑ pass
pass
で終わって、死に石判定は無視して done
で1対局 終わりだぜ☆」
「 ↑ Docker 化したんだが、 文字入力のとき 打った文字が表示されないので 暗号 打ってるみたいな感じだぜ☆」
「 ↑ Dockerコンテナに入って telnet したら ふつう だぜ☆」
「 ↑ 送信されてくる文字は 表示されるんだぜ☆ 入力した文字が表示されないのでは☆?」
「 ↑ 通信されていて、クライアント側の入力が表示されないんだよな☆」
「 Twitter で聞いたら、それって エコー っていうようよ」
「 6667
が合っていて、盤面が間違ってるかも知れないわよ?」
「 ↑ 全然違う……。
=4 C3
というところを見ると多分 C3
とか返せば良いはずだぜ」
「 ↑ コンピューター将棋で言うところの 将棋所に当る 自作の GTP engine to NNGS で中継すると
文字化けが直らないが B1
が取れてるので、標準入出力を使った 文字列の受け取りはできているのだろう……」
「 B1
を NNGS まで届けてくれなければ 対局できないが……」
「 思考エンジンが デバッグ用に出力している文字まで gtp-engine-to-nngs に送られてきてない?」
「 標準出力は 全部 gtp-engine-to-nngs に流れてくるぜ」
「 デバッグ出力を 標準出力へ垂れ流すの止めたら……。 ログへ流せだぜ」
「 ↑ 囲碁で Illegal Move
見れるの面白いだろ。
多分、石が置いてあるところに また置いたんだぜ。 Play
をまだ実装してないからな。
順調 順調」
「 play b a1
が送られてきたら 黒番が A1 に石を置いたという意味で エンジンは 盤を更新して = \n\n
を返すんだぜ」
「 genmove w
が送られてきたら 白番は 着手を返せだぜ。 例えば = A2\n\n
」
「 それは play b a1
に応えたのか、それとも = \n\n
に応えたのか?」
「 play b a1
に決まってるだろ。 そのあと = A2\n\n
を送ろうと思ってたんだぜ」
「 genmove w
を送ったあとに = \n\n
を送ってくんなだぜ」
「 お父んが間隔を開けずに 連続して送ってくるのが 悪いのでは?」
「 相手が A1
を打ったんだぜ。
だったら play b a1
をお前に送って、すぐに genmove w
だろ」
「 いや おかしい。 連続して送ってくんなだぜ。
わたしが = \n\n
を送り返すまで 待てだぜ」
// 0: 白番は対局を承諾へ
// 10: 黒番は着手へ
// 20: 白番は盤更新へ
// 30: 白番は着手へ
// 40: 黒番は盤更新へ
turnState uint
「 白番から ログインして 黒番が申し込むのは GTP2NNGS
の仕様であって
UEC杯は独自仕様の adminmatch
を使うんだけどな」
受信[]
受信[]
受信[1 6]
「 ↑ 空行が 2連続で返ってくるケースがある。
わたしの考えが ずれてしまうぜ」
(*dia.EngineStdin).Write([]byte("play %s %s"))
(*dia.EngineStdin).Write([]byte("play %s %s\n"))
[2021-02-20 02:59:52] <Engine> x=1 y=1 z=0119
「 ↑ x, y 表記と A1 表記だけにした……
なんとか 石を打ちあうところまでは 進んだぜ」
「 ↑ サーバー対局しない前提のプログラムだから 持ち時間は 自己計測してるが、
サーバーから返ってきた 残り時間 を 入れたくもあるよな、ぐぬぬぬぬ!」
「 お父んが いじると バグを盛り込む可能性が大きいので 今大会は そこの改修は 諦めろだぜ」
「 ↑ うーむ、整ったログが書けるかどうかは プログラミングの 基礎スキルだぜ。
もっと整理しよ」
「 ↑ file と rank を逆にしていたかもしれない」
「 ↑ GTプロトコル的には Pass
でも PASS
でもなく pass
かだぜ」
「 つぎは 終局したら 自動でログアウトしたいぜ。
つなぎっぱ にしないのが GTP2NNGS の状態遷移図みたいだしな」
「 ↑ done
と quit
を連続して エンジンに投げてたんだが」
「 フーム、 done
の返事を受け取ってから quit
投げないといけないんだな」
「 ↑ エンジンだけでなく、わたしの GE2NNGS も 終了させないとな」
「 きふわらべ ちゃんを置いて 外食に行きましょう。
うまくいってれば アプリケーションは ログを残して 終了してるわよ」
「 プログラムの途中で Exit するのって、だいたいイレギュラーな 強制終了 なんじゃないのか?」
「 じゃあ 愚直に ループから抜けて スレッドから抜けるぜ」
「 ダメだ、 エンジンと接続するスレッドから抜けただけで、 本体が止まんね」
「 あー、ちがうぜ わたしの GE2NNGS は終了していて、 VSCode のターミナルは終了していないだけだぜ」
「 あとは プロセスが終了したら 再起動するような プログラムがあれば 自動対局はできるの?」
「 両方のプロセスが終了したら、 白番、黒番の順で 起動するプログラムがあれば 自動対局できそうなんだがな」
「 ↑ あれっ、 わたしの GE2NNGS 終了してね。 サーバーにまだ つながってるぜ」
「 ↑ 自作パッケージの パブリッシュの 更新、遅。
いらいら」
「 ↑ pkg.go.dev
への反映は 数時間かかるみたいよ」
「 今日中に終わらんかった…… パッケージのパブリッシュに時間差があるという 思わぬタイムロスだぜ」
「 Go言語では コードブロックの最後に実行されたいものを defer
を使って書いておくと そうやってくれるみたいだが、
上から下へ順に読む、という感覚は狂うが、合理的だよな」
「 ↑ 月曜日に 一晩中考えて Scan( ) でブロッキングが発生したら解除する方法が分からないことから、
人間が標準入力からコマンドを打てる機能を廃止に」
「 ↑ 自作の別パッケージの 同じ型のグローバル変数入れてて エラーになってた。
別パッケージのグローバル変数見れるって 豪快だな」
「 ↑ きふわらべコロシアムを終了しても、 エンジンは生きてて ログを吐き続けるの 怖」
「 プロセスも 全体調和 させなダメなのかだぜ? 低レイヤー」
「 ↑ コネクターが コネクター 呼び出してたんで、そりゃ 無限ループするぜ」
「 ↑ コロセウムは エンジンではなく コネクターを起動しなくちゃいけないぜ。 書き直し」
「 ↑ exec.Command の第二引数は 愚直に半角空白でスプリットしたトークンを入れなきゃいけないみたいだぜ。書き直し」
「 ↑ ようやく ローカルPCで 自己対局できるようになったぜ」
23:20
「 ↑ パスワード設定できね……。こんな脆弱性あっていいのか」
<書きかけ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!