コンピュータ将棋対局サーバー設置マニュアルを書こう＜本番編＞

関連記事 : http://qiita.com/muzudho1/items/a60074642bd452d4f089

基本情報
=======
|システム名|英字表記|
|---|---|
|指し手１秒|sasite1s|


手順
====

```
% sudo su -
```

このあと、パスワードを入力すること。
以後、ルート・ユーザーで作業していると想定する


手順
====

```
# do-release-upgrade
```

手順
====

```
# sudo apt-get install language-pack-ja
```

ここで日本語化する。下記の説明で　英語で書かれているものも、画面には日本語で表示されることがある。

次のコマンドは失敗すると思うが、失敗しても次へ進むこと。

```
# sudo update-locale LANG=ja_JP.UTF-8
```

手順
====

```
# cd /root
# git clone https://★ユーザ名@bitbucket.org/★チーム/sasite1s_run.git
```

このあと、パスワードを入れること。
（チームメンバーなら、これで git からダウンロードできるらしい）

手順
====

```
# cd /usr/games/sasite1s/ukamuse_sdt4_sasite1s/bin
# chmod 775 apery
```

チェック

```
# ls -l
```

apery のパーミッションが「-rwxrwxr-x」になっていること。

手順
====

```
# mv Sasite1s_Run/usr/games/sasite1s /usr/games/sasite1s
# mv Sasite1s_Run/var/www/html/sasite1s /var/www/html/sasite1s
# rm -rf Sasite1s_Run/
```

手順
====

```
# apt-get install apache2
```

```
# sudo apt-get install php-curl
```

```
# sudo apt-get install curl
```

```
# sudo apt install php7.0-bcmath
```

```
# apt install unzip
```

```
# sudo service apache2 restart
# curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin --filename=composer
```

```
# apt-get -y install php php-cgi libapache2-mod-php php-common php-pear php-mbstring
```

```
# apt-get -y install expect
```

```
# sudo apt-get update
# sudo apt-get install libev-dev
```

```
sudo apt-get update
sudo apt-get install rabbitmq-server
gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
gpg -a --export 7638D0442B90D010 | sudo apt-key add -
wget -O- https://packages.erlang-solutions.com/debian/erlang_solutions.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install init-system-helpers socat esl-erlang
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server
```

```
sudo apt-get install git
```

```
# git config --global user.name "★User Name"
# git config --global user.email "★hoge@hoge.com"
# git config --global core.quotepath false
```

ダブルクォーテーションの内側に、ユーザー名、メールアドレスを入れること。

手順
====

```
# sudo apt install g++
```

### チェック

```
# g++ --version
```

バージョン 5.4.0-6 以上が入っていること。

手順
====

```
# cd /root
# git clone git://github.com/CopernicaMarketingSoftware/AMQP-CPP.git
# cd AMQP-CPP
# make
# make install
```

手順
====

```
# sudo apt-get install git autoconf libtool automake build-essential mono-devel gettext cmake
```

### チェック

```
mono --version
```

バージョンが 4.2.1 以上ならOK。

手順
====

```
# cd /etc/php/7.0/cli
# ls
conf.d  php.ini
```

php.ini があることを確認する。

```
# cp php.ini php.ini.original
# ls
conf.d  php.ini  php.ini.original
```

php.ini ファイルがあり、php.ini.original が増えていることを確認する。

手順
====

これから、php.ini ファイルの編集を開始する。

```
# nano php.ini
```

使いやすいテキスト・エディタを使うこと。

```
;;;;;;;;;;;;;;;;;
; Miscellaneous ;
;;;;;;;;;;;;;;;;;
```

と書いてある区画を探す。

```
expose_php = On
```

を

```
expose_php = Off
```

に変更。

```
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
```

と書いてある区画を探す。

```
;error_log = php_errors.log
```

を

```
error_log = /var/log/php_errors.log
```

に変更。

```
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
```

と書いてある区画を探す。

```
;mbstring.language = Japanese
```

は、頭のセミコロンを外し、

```
mbstring.language = Japanese
```

に変更する。

```
;mbstring.http_input =
```

は、

```
mbstring.http_input = auto
```

に変更する。

```
;mbstring.detect_order = auto
```

は、頭のセミコロンを外し、

```
mbstring.detect_order = auto
```

に変更する。

php.ini を保存して閉じる。
ここまでで php.ini ファイルの編集を終了した。

```
# sudo service apache2 restart
```

手順
====

```
# cd /var/www/html/sasite1s
```

これから composer.json ファイルを作成し、編集する。

```
# nano composer.json
```

使いやすいテキスト・エディタを使うこと。

composer.json ファイルに次のように記述する。

```
{
  "require": {
      "php-amqplib/php-amqplib": "2.6.*"
  }
}
```

composer.json を保存して閉じる。
ここまでで composer.json ファイルの編集を終了した。

```
# composer install
```

手順
====

```
# rabbitmq-server
```

### チェック

例えば、次のように表示される。

```
RabbitMQ 3.5.7. Copyright (C) 2007-2015 Pivotal Software, Inc. 
  ##  ##      Licensed under the MPL.  See http://www.rabbitmq.com/ 
  ##  ## 
  ##########  Logs: /var/log/rabbitmq/rabbit@tk2-229-24163.log 
  ######  ##        /var/log/rabbitmq/rabbit@tk2-229-24163-sasl.log 
  ########## 
              Starting broker... completed with 0 plugins.
```

### 手順続き

続いて、

[Ctrl] + [Z] キーで

でスリープ状態にし、RabbitMQ から抜ける。

続いて次のように打鍵。 1 は RabbitMQ のジョブ番号を入れること。

```
bg 1
```

これで RabbitMQ をバックグラウンドで走らせておく。

手順
====

```
# cd /var/www/html/sasite1s
# php tamesi38a1.php
```

### チェック

```
# rabbitmqctl list_exchanges
Listing exchanges ...
        direct
amq.direct      direct
amq.fanout      fanout
amq.headers     headers
amq.match       headers
amq.rabbitmq.log        topic
amq.rabbitmq.trace      topic
amq.topic       topic
myexchange      direct
```

「myexchange direct」が含まれていればOK。

手順
====

```
# cd /usr/games/sasite1s/ukamuse_sdt4_sasite1s/bin
# ./apery --enqueue From_UkamuseSdt4_Sasite1s durable --dequeue To_UkamuseSdt4_Sasite1s durable autodelete > ./apery.out.log 2> ./apery.err.log < /dev/null &
```

### チェック

```
# ps aux | grep apery
root      1616  0.2 37.6 1613548 382140 pts/0  Sl    3月25   0:13 ./apery --enqueue From_UkamuseSdt4_Sasite1s durable --dequeue To_UkamuseSdt4_Sasite1s durable autodelete
root      3303  0.0  0.1  14264  1060 pts/0    S+   00:02   0:00 grep --color=auto apery
```

また、端末からログアウトしていなければ

```
# jobs
```

で確認し、
./apery が１つだけ Running (実行中）になっていることを確認する。
端末からログアウトしたあとは、jobs では見えない。

手順
====

```
# cd /usr/games/sasite1s
# mcs /r:RabbitMQ.Client.dll -define:UBUNTU tamesi34_cs.cs
```

```
# ./tamesi34_cs.exe
```

以下、文字化けしていたが説明を続ける。

```
???????????????????????????????(^~^)
Name         : ?????????
"" + [Enter] : ?????????
ex.) BrokenBox
Delete ? >
```

Delete ? と聞かれたら 何も打ち込まず [Enter]キーを押す。

```
??????????????????????????(^~^)
ex.) SunnyBox
Enqueue ? > To_UkamuseSdt4_Sasite1s
```

Enqueue ? と聞かれたら 「To_UkamuseSdt4_Sasite1s」と打ち込んで [Enter]キーを押す。

```
????????????????????????????????(^~^)
(1) durable    : RabbitMQ????????????
(2) autodelete : ????????1??????????????
(4) passive    : ?????????????????????????????
(8) exclusive  : ??????????????????????
ex.) 3
Enqueue ? > 3
```

もう一度 Enqueue ? と聞かれたら 「3」と打ち込んで [Enter]キーを押す。

```
?????????????????????????(^~^)
ex.) RainyBox
Dequeue ? > From_UkamuseSdt4_Sasite1s
```

Dequeue ? と聞かれたら 「From_UkamuseSdt4_Sasite1s」と打ち込んで [Enter]キーを押す。

```
???????????????????????????????(^~^)
(1) durable    : RabbitMQ????????????
(2) autodelete : ????????1??????????????
(4) passive    : ?????????????????????????????
(8) exclusive  : ??????????????????????
ex.) 1
Dequeue ? > 1
```

もう一度 Dequeue ? と聞かれたら 「1」と打ち込んで [Enter]キーを押す。

```
21:34:03 610 34_cs ___(C) start begin
21:34:03 616 34_cs ___(C) consumer.create begin
21:34:03 616 34_cs ___(C) consumer.create end
21:34:03 617 34_cs ___(C) channel.open begin
21:34:03 617 34_cs ___(C) connection.open begin
21:34:03 766 34_cs ___(C) connection.open end
21:34:03 771 34_cs ___(C) channel.open end
21:34:03 773 34_cs <-------- [interrupt!] Registered(^q^)
21:34:03 773 34_cs ___(C) start end
21:34:03 773 34_cs (P)___ waitRegistered begin
21:34:03 773 34_cs (P)___ waitRegistered end
???????[Ctrl]+[C]????????(^~^)
?????????????????????[Enter]????????(^?^)
ex.) hello, world
Enqueue? > 
```

「<-------- [interrupt!] Registered(^q^)」といった割込みがどこかに入っていることを確認する。

Enqueue? と聞かれたら 「usi」と打ち込んで [Enter]キーを押す。

```
usi
```

次はレスポンス。

```
21:34:07 906 34_cs (P)___ enqueue begin [usi]
21:34:07 906 34_cs (P)___ channel.open begin
21:34:07 906 34_cs (P)___ connection.open begin
21:34:07 915 34_cs (P)___ connection.open end
21:34:07 917 34_cs (P)___ channel.open end
21:34:07 922 34_cs (P)___ enqueue end
21:34:07 922 34_cs (P)___ connection.close begin
21:34:07 923 34_cs (P)___ channel.close begin
21:34:07 927 34_cs (P)___ channel.close end
21:34:07 931 34_cs (P)___ connection.close end
Enqueue? > 21:34:07 945 34_cs <-------- [interrupt!] Dequeue(^q^) id name ukamuse_SDT4
id author Hiraoka Takuya

option name Best_Book_Move type check default false
option name Book_File type string default book/20150503/book.bin
option name Byoyomi_Margin type spin default 500 min 0 max 2147483647
option name Clear_Hash type button
option name Draw_Ply type spin default 256 min 1 max 2147483647
option name Engine_Name type string default ukamuse_SDT4
option name Max_Book_Ply type spin default 32767 min 0 max 32767
option name Max_Random_Score_Diff type spin default 0 min 0 max 32600
option name Max_Random_Score_Diff_Ply type spin default 32767 min 0 max 32767
option name Min_Book_Ply type spin default 32767 min 0 max 32767
option name Min_Book_Score type spin default -180 min -32601 max 32601
option name Minimum_Thinking_Time type spin default 20 min 0 max 2147483647
option name Move_Overhead type spin default 30 min 0 max 5000
option name MultiPV type spin default 1 min 1 max 594
option name OwnBook type check default true
option name Slow_Mover type spin default 89 min 1 max 1000
option name Slow_Mover_10 type spin default 10 min 1 max 1000
option name Slow_Mover_16 type spin default 20 min 1 max 1000
option name Slow_Mover_20 type spin default 40 min 1 max 1000
option name Threads type spin default 2 min 1 max 256
option name Time_Margin type spin default 4500 min 0 max 2147483647
option name USI_Hash type spin default 256 min 1 max 1048576
option name USI_Ponder type check default true
usiok
```

ここまで流れてくる。

途中で Enqueue? と聞かれたタイミングで「id name ukamuse_SDT4」～「usiok」まで書かれた長文が割り込んでくることを確認する。

このタイミングで setoption を送ることで、思考時間の設定などができる。
説明は　この記事の下に付録として付けた。

次の文字列を打ちこみ、[Enter]キーを押す。

```
isready
```

時間がかかるので、10秒～20秒ぐらい待っていること。

```
21:34:55 055 34_cs (P)___ enqueue begin [isready]
21:34:55 056 34_cs (P)___ channel.open begin
21:34:55 056 34_cs (P)___ connection.open begin
21:34:55 062 34_cs (P)___ connection.open end
21:34:55 063 34_cs (P)___ channel.open end
21:34:55 064 34_cs (P)___ enqueue end
21:34:55 064 34_cs (P)___ connection.close begin
21:34:55 064 34_cs (P)___ channel.close begin
21:34:55 065 34_cs (P)___ channel.close end
21:34:55 065 34_cs (P)___ connection.close end
Enqueue? > 21:35:05 046 34_cs <-------- [interrupt!] Dequeue(^q^) readyok
```

「readyok」が割り込んできたらOK。

次の文字列を打ちこみ、[Enter]キーを押す。

```
usinewgame
```

```
21:36:07 541 34_cs (P)___ enqueue begin [usinewgame]
21:36:07 557 34_cs (P)___ channel.open begin
21:36:07 563 34_cs (P)___ connection.open begin
21:36:07 859 34_cs (P)___ connection.open end
21:36:07 864 34_cs (P)___ channel.open end
21:36:07 865 34_cs (P)___ enqueue end
21:36:07 865 34_cs (P)___ connection.close begin
21:36:07 865 34_cs (P)___ channel.close begin
21:36:07 882 34_cs (P)___ channel.close end
21:36:07 892 34_cs (P)___ connection.close end
Enqueue? >
```

Enqueue? と聞かれたら 次の文字列を打ち込んで [Enter]キーを押す。

```
position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves
```

```
21:36:42 006 34_cs (P)___ enqueue begin [position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves]
21:36:42 006 34_cs (P)___ channel.open begin
21:36:42 006 34_cs (P)___ connection.open begin
21:36:42 061 34_cs (P)___ connection.open end
21:36:42 070 34_cs (P)___ channel.open end
21:36:42 070 34_cs (P)___ enqueue end
21:36:42 071 34_cs (P)___ connection.close begin
21:36:42 071 34_cs (P)___ channel.close begin
21:36:42 072 34_cs (P)___ channel.close end
21:36:42 073 34_cs (P)___ connection.close end
Enqueue? >
```

Enqueue? と聞かれたら 次の文字列を打ち込んで [Enter]キーを押す。

```
go
```

```
21:36:45 053 34_cs (P)___ enqueue begin [go]
21:36:45 054 34_cs (P)___ channel.open begin
21:36:45 054 34_cs (P)___ connection.open begin
21:36:45 081 34_cs (P)___ connection.open end
21:36:45 084 34_cs (P)___ channel.open end
21:36:45 084 34_cs (P)___ enqueue end
21:36:45 084 34_cs (P)___ connection.close begin
21:36:45 084 34_cs (P)___ channel.close begin
21:36:45 085 34_cs (P)___ channel.close end
21:36:45 087 34_cs (P)___ connection.close end
Enqueue? > 21:36:45 679 34_cs <-------- [interrupt!] Dequeue(^q^) bestmove 2g2f
```

割り込んでくる文字列は　異なることがあるが、 bestmove が含まれていればOK。

手順
====

ブラウザで、次のURLにアクセスすること。

```
http://★サイトアドレス/sasite1s/ukamuse_sdt4.php?sfen%20lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL%20b%20-%201%20moves
```

初回の２、３回は　ページの表示までに時間がかかることがある。
1秒～10秒ほど待って、bestmove を含む文字列が返ってくればOK。

以上。

# 付録: setoption について

将棋エンジンから usiok が返ってきたあと、isready をこちらから送るまでに、
次の任意の setoption を、１つずつ連続して送ることができる。

Aperyに対し一方的に送り付ける段階なので、受け取ったかどうか確認できるような　応答は返ってこない。

ハッシュ・サイズ。一度探索した局面を覚えておくなどして、局面が合流したときの探索を省くなど有利にする。１台のＰＣでコンピュータ将棋だけを行う場合、ＰＣのメモリサイズの２分の１　を設定しておくと良い。

```
setoption name USI_Hash value 256
```

```
setoption name Clear_Hash value ★？
```

Apery の定跡ファイルを置くディレクトリ。

```
setoption name Book_File value book/20150503/book.bin
```

```
setoption name Best_Book_Move value false
setoption name OwnBook value true
setoption name Min_Book_Ply value ★？
setoption name Max_Book_Ply value ★？
setoption name Min_Book_Score value -180
```

相手の手番のときに考えるなら true。 **Sasite1sでは false にしておいた方がいいのでは。**

```
setoption name USI_Ponder value true
```

持ち時間に対し、思考を早めに切り上げる時間をミリ秒で指定する。通信遅延による切れ負けに対策したいときに使う。

```
setoption name Time_Margin value 500
setoption name Byoyomi_Margin value 500
setoption name Time_Margin value 4500 ※なんで同じ項目が２個あるんだ？
```

次善手も探索したいときは 2 にする。三次善手を調べたいときは 3 にする。
最善手を探す時間を　ワリカン　して次善手、三次善手を探すので、数字を大きくすると　最善手を読む時間が減る。プロ棋士の研究を外すよう　指し手をばらけさせたい時などに使う。指し手をばらけさせるだけが目的なら、思考時間をランダムにした方が弱体化するコストが少ない。

```
setoption name MultiPV value 1
```

```
setoption name Max_Random_Score_Diff value 0
setoption name Max_Random_Score_Diff_Ply value ★？
setoption name Slow_Mover_10 value 10 ※持ち時間15分, 秒読み10秒では10, 持ち時間2時間では3にした。(sdt4)
setoption name Slow_Mover_16 value 20 ※持ち時間15分, 秒読み10秒では50, 持ち時間2時間では20にした。(sdt4)
setoption name Slow_Mover_20 value 40 ※持ち時間15分, 秒読み10秒では50, 持ち時間2時間では40にした。(sdt4)
setoption name Slow_Mover value 89
```

何手目で引き分けとするかの数字。この手数に近づくと、時間切れしないように思考の時間管理を短くするようになる。**256手を超えることを想定する場合、この数字を想定する数字に設定すること。**

```
setoption name Draw_Ply value 256
```

指すのに 数ミリ秒かかるから、それも考慮して思考の時間管理を短くしよう、というもの。

```
setoption name Move_Overhead value 30
```

最小限使う　思考時間　と思われる。初期設定では 20ミリ秒。

```
setoption name Minimum_Thinking_Time value 20
```

```
setoption name Threads value ★CPUコア数を自動設定
```


# 付録: トラブルシューティング

```
// よく分からないときは再起動してやりなおすのが一番

    # 浮かむ瀬を落とす
    # ps aux | grep apery
    root       437  0.7 62.7 1628028 638636 ?      Sl   Mar23  33:52 ./apery --enqueue From_UkamuseSdt4_Sasite1s durable --dequeue To_UkamuseSdt4_Sasite1s durable autodelete
    root      1809  0.0  0.0  12936   984 pts/1    S+   06:45   0:00 grep --color=auto apery
    # kill 437

    # アパッチ再起動
    # sudo service apache2 restart

    # 浮かむ瀬起動
    # cd /usr/games/sasite1s/ukamuse_sdt4_sasite1s/bin
    # ./apery --enqueue From_UkamuseSdt4_Sasite1s durable --dequeue To_UkamuseSdt4_Sasite1s durable autodelete > ./apery.out.log 2> ./apery.err.log < /dev/null &

    # 対局開始設定
    # /usr/games/sasite1s/tamesi34_cs.exe
    ・Delete は空文字列でEnter
    ・Enqueue は To_UkamuseSdt4_Sasite1s と 3。
    ・Dequeue は From_UkamuseSdt4_Sasite1s と 1。
    ・usi
    ・isready
        10秒～20秒まち、readyok を待つ。
    ・usinewgame
    ・position sfen lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1 moves
    ・go

    これで bestmove が返ってきたらOK。

    tamesi34_cs.exe は [Ctrl] + [C] で強制終了すること。

    ブラウザでサイトにアクセス
    http://★サイトアドレス/sasite1s/ukamuse_sdt4.php?sfen%20lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL%20b%20-%201%20moves
```