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

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

実際の　設置マニュアル　は別に書く。
この記事は、マニュアルを書くために考えていることを書く。Qiitaコミュニティで使われている言葉を借りれば、ポエムとも言える。

# 深さ1: 概要
## 名称（仮）
指し手１秒　（さしていちびょう）　（sasite1s）

```
// ポエム
// まだ仮。
// コンピューターで名前に使える英単語表記を添えておくとプログラマーにとっては親切。
//
// 開発中の名前は「どうでもよく」かつ「特徴的で」「被らない」「ひとことで言える名前」の方が作業が捗る。
// 起ち上げ時は 当事者メンバーの3人、4人程度だけで通じればいいのでプロジェクトの名前は
// ブラジル でも 千葉県 でも何でも構わない。
//
// 不意にエレベーター内で大声でしゃべっていても他人には何の事だか分からないという
// 情報セキュリティ面でアドバンテージもあるが、もっと身近な話しでは
// プログラマーは似たような代り映えのしない作業ばっかり毎日やってるので
// プロジェクト名ぐらい　大胆ではっきりして欲しいというところがある。
// 
// だというのに 開発中のコードネームは　ずっと shogi だった。
// 名前を付けるのがとても　めんどくさかった。
//
// 関わる人が増える公開という段階に近づくほど
// 物をよく表したまともな名前を考えよう。
```

## 環境

|抽象度0|抽象度-1|抽象度-2|抽象度-3|
|---|---|---|---|
|本番環境サーバー|さくらVPS|2Gプラン||
|本番環境OS|Linux|Ubuntu|16.04|
|リモート端末|(1)PuTTY|||
|テスト用ブラウザ|(1)Google Crome|||
|パソコン/開発OS|(1)Windows<br/>(2)Mac|(1)10||
|コンピュータ将棋ソフト|Apery|浮かむ瀬|SDT4|

```
// ポエム
// わたしの記事でよく出てくる　この謎の表なんだが、
// パソコンで .exe を叩いてくれ、と言うと　叩けん　と返ってくるので
// 何が起こってるか会ってみると Mac だったことがある。
// パソコンという言葉で会話が通じたようでいて、やっていることは全然違うものだ。
//
// １７年ぐらい前、
// PC には Internet Explorer がどこでも入っていることから、
// 一切何もインストールしなくて済む Java で開発してほしいという依頼があった。
//
// そこで一切何もインストールしない縛りで Microsoft版Java 1.1 を用い開発が進んでいたら
// Java をバージョンアップしました、とかいう顧客からの謎のメッセージとともに
// ５か月ぐらい リストなどのコレクションが使えないという縛り環境で進めたプログラムが
// 動かなくなり　うんこと化して差し戻しになったが　それ以後は便利になったことがある。
// 抽象度-3　とか　抽象度-4　のあたりは深く考えず　制限されたり無視されたりする。
// バージョンというのは　魚の小骨か何かなのだろうか。
//
// 今月も、基本設計からJavaScriptまで全部やってほしいという案件を見たことがある。
// なんか他の人にはできるらしいんだが、わたしにはできない。
// 囲碁でいうと、勝ってください、みたいな抽象度で頼まれた感じ。
//
// 相手は多分　スキルがマッチしていませんね、と思っているかもしれないんだが
// こっちからすると客は何人がＰＣ操作をして、電源はどこにあって　ケーブルの配線は何メートル必要で　データの伝送量はどれぐらいで　期間は何年で　何社のＰＣを使う縛りとかあるのか、無名のソフトはどこまで利用できるのか、プライバシーマークは取得するのか、
// 裁量も余裕も分からないし、選択肢が多すぎて分からん。まあ　スキルは足りていない。
//
// まあ、がんばれ。
```


## 配備するプログラム
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a4.png?raw=true)

```
// ポエム
// 以下は　こうしたい、というメモ書きであって、テスト環境は　まだ散らばったものだ。
// (2017-03-23 Add)この構成で１つ用意した。だからわたしではなく相方が
// 同じ操作ができるマニュアルを早く書けというハナシなんだが。
```

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354.png?raw=true) **Sasite1s_Run**
非公開のビットバケツに置いておいたので、取っていってもらうように書いておこう。

```
本番環境の取得元(むずでょのPC)
==============================


    ビットバケツ Sasite1s_Run リポジトリ
        |
        |
        |                                           # 本番環境に配置するもの
        +--- usr/
        |       |
        |       +--- games/
        |               |
        |               +--- sasite1s/
        |                       |
        |                       +--- tamesi34_cs.cs
        |                       |
        |                       +--- ukamuse_sdt4_sasite1s/
        |                               |
        |                               +--- bin/
        |                               |       |
        |                               |       +--- apery
        |                               |       |
        |                               |       +--- benchmark.sfen
        |                               |
        |                               |
        |                               +--- reservation.exe
        |                               |
        |                               +--- reservation.expect
        |
        |
        +--- var/
                |
                +--- www/
                        |
                        +--- html/
                                |
                                +--- sasite1s/
                                        |
                                        +--- tamesi38a1.php
                                        |
                                        +--- ukamuse_sdt4.php

    # 以下の３つの評価値ファイルは含まれていない

        20161007
            |
            +--- KK_synthesized.bin
            +--- KKP_synthesized.bin
            +--- KPP_synthesized.bin

    ※ むずでょのローカル環境では
        C:/～/2017-03-04_Sasite1s/Run_SakuraVPS/ 以下
```

```
# git clone https://★ユーザ名@bitbucket.org/★チーム/sasite1s_run.git
Cloning into 'sasite1s_run'...
Password for 'https://★ユーザ名@bitbucket.org':
```

sasite1s_run がダウンロードされるので、次のように mv コマンドを使って配置する。

```
# cd ★sasite1s_runを落としたディレクトリ
# ※配置先は、先にディレクトリを作っておくこと
# mv sasite1s_run/usr/games/sasite1s/ukamuse_sdt4_sasite1s /usr/games/sasite1s/ukamuse_sdt4_sasite1s
# mv sasite1s_run/var/www/html/sasite1s/ukamuse_sdt4.php /var/www/html/sasite1s/ukamuse_sdt4.php
```

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a2.png?raw=true) **https://drive.google.com/open?id=0B0d3atdVgIH2ZS1WTTFBTmdEUU0**
評価値ファイルは 800メガバイトもあって重いので、Ｗｅｂサイトからダウンロードしてもらおう。

```
別途取ってくる物
================

    https://drive.google.com/open?id=0B0d3atdVgIH2ZS1WTTFBTmdEUU0
        または
    https://github.com/HiraokaTakuya/apery/releases/tag/SDT4
        |
        |                                           # ukamuse_sdt4.zip の中身
        |
        +--- ukamuse_sdt4
                |
                +--- bin
                        |
                        +--- 20161007
                                |                   # 以下の３つのファイル（評価値ファイル）を取ってくること
                                |
                                +--- KK_synthesized.bin
                                |
                                +--- KKP_synthesized.bin
                                |
                                +--- KPP_synthesized.bin

    ※ むずでょのローカル環境では
    ※      C:/～/2017-03-04_Sasite1s/Run_Apery_Large/usr/games/sasite1s/ukamuse_sdt4_sasite1s/bin 以下


    別途取ってきたものの配置先
    --------------------------

        /
        |
        |
        +--- usr/
                |
                |
                +--- games/sasite1s/ukamuse_sdt4_sasite1s/
                        |
                        |                               # Apery
                        |
                        +--- bin/
                                |
                                +--- 20161007/
                                        |
                                        +--- KK_synthesized.bin
                                        |
                                        +--- KKP_synthesized.bin
                                        |
                                        +--- KPP_synthesized.bin
```

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a5.png?raw=true)
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a3.png?raw=true) **さくらVPS**
これを複数台　用意できればいいわけだ。

```
本番環境の配置先
================
    ※ 一部の .exe ファイルなど、あとから加えるものもこの図に含まれる


    /
    |
    |
    +--- usr/
    |       |
    |       |
    |       +--- games/sasite1s/
    |               |
    |               |
    |               |                               # Tool
    |               +--- tamesi34_cs.cs
    |               |
    |               +--- tamesi34_cs.exe
    |               |
    |               |
    |               +--- ukamuse_sdt4_sasite1s/
    |                       |
    |                       |
    |                       |                       # Apery
    |                       +--- bin/
    |                       |       |
    |                       |       +--- 20161007/
    |                       |       |       |
    |                       |       |       +--- KK_synthesized.bin
    |                       |       |       |
    |                       |       |       +--- KKP_synthesized.bin
    |                       |       |       |
    |                       |       |       +--- KPP_synthesized.bin
    |                       |       |
    |                       |       |
    |                       |       +--- apery
    |                       |       |
    |                       |       |
    |                       |       +--- apery.out.log
    |                       |       |
    |                       |       |
    |                       |       +--- apery.err.log
    |                       |       |
    |                       |       |
    |                       |       +--- benchmark.sfen
    |                       |
    |                       |
    |                       |
    |                       |                       # Expect
    |                       +--- reservation.expect
    |                       |
    |                       |
    |                       |                       # Exe
    |                       +--- reservation.exe
    |
    |
    +--- var/
            |
            |
            |                                       # Php
            +--- www/html/sasite1s/
                    |
                    +--- tamesi38a1.php
                    |
                    +--- ukamuse_sdt4.php
```

配置先の binフォルダーはあとで 20161007フォルダーを転送したいので、書き込み可能にしておく。

それぞれの解説

|名前|解説|
|---|---|
|reservation.expect|PHPからreservation.exeを実行するためだけにあるもの|
|reservation.exe|浮かむ瀬が使用中か、空いてるかを調べるだけのもの|
|apery|浮かむ瀬第４回将棋電王トーナメント版を改造したもの|
|apery.out.log|空っぽなら正しい挙動。何か書いてたら改造漏れ|
|apery.err.log|エラーがあったら書かれる。どんどん溜まっていくから１行でも何か書かれてたら要調査、要メンテナンス|
|20161007|2016年10月7日に機械学習が終わったと思われる大胆な名前のフォルダー|
|KKP_synthesized.bin|３駒関係の評価値が入っている３つあるファイルの内の１つ|
|KK_synthesized.bin|３駒関係の評価値が入っている３つあるファイルの内の１つ|
|KPP_synthesized.bin|３駒関係の評価値が入っている３つあるファイルの内の１つ|
|ukamuse_sdt4.php|スマホゲーは、このURLにアクセスしてくると思う。指し手を１秒未満で返す。bestmove で始まるメッセージは指し手。error で始まるメッセージが返ってきたらエラー|

この実行用環境、どこに置いておこうか。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703231551.png?raw=true)
ビットバケツに置いておけばいいのだろうか。

- Sasite1s_Src
- Sasite1s_Run

と分けたらいいんだろうか。PHP はソースコードと実行ファイルを兼ねてるから仕分けがすっきりしないな。


```
// ポエム
// 「1分ぐらいで 3行ぐらいで書いてくれたらええんや！」と言われるような上図も３時間ぐらいかけて考えている。
// 場合によっては　１週間ぐらい寝かせて「分かりません」とか「読んでない」ことが分かったりするので、
// 人を動かすには「読まれる文章」であることが必要で、それに３時間ぐらいかけている。
// そうやって書いた文章は「1分ぐらいで書いたんだろ」と思われるぐらいシンプルになるだろう。
// 客の言う「1分ぐらい」は、そういう 1分。
```

```
// ポエム
// そういえば 17年前（17年前に何があったのか）
// 会社のURLが変わりました、とかいうので
// Javaの名前空間名を変えることになったんだが、
// 既存のライブラリと整合性が取れなくなったのな。
//
// URLはパーマネント（永続的）に変わらない想定なのかもしれないが、
// 会社名は変わるのだった。
//
// ところで去年、
// 客先が社名変更したんだが、プログラムに埋め込まれている社名を変えるのは
// 要件に無いよ、ということで　何も起こらず賢かった。
//
// 開発が得意な人は、最初の注文に無かったことを断るのも得意とは言えるだろう。
```

## 深さ2: 楽しいインストール、アップグレード
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a7.png?raw=true)
ファイルを外側から内側へ移動するだけで 環境が作れたら簡単なんだが、そうもいかないのがある。

サーバーにログインし、取ってくるコマンドを実行したり（インストール）、
バージョンをアップデート（アップグレード）したりして　用意しよう。

以下は入れるパッケージのメモ書きだ。そのうち詰めていく。

```
    パッケージ
        |
        |                           # そもそも　これが無ければ……
        +--- Apt
        |
        |
//      |                           # 日本語化はしない方がマシか
//      +--- language-pack-ja
        |
        |
        |                           # Webアプリケーション
        +--- Apache 2.4.18
        |       |
        |       +--- curl ------+
        |       |               |
        |       +--- bcmath ----+
        |       |               |
        |       +--- unzip -----+
        |                       |
        |                       +--- Composer
        |                               |
        |                               +--- PHP 7.0
        |
        |
        |                           # 外部プロセス操作
        +--- Expect 5.45-7
        |
        |
        |                           # プロセス間通信
        +--- libev-dev
        |       |
        |       +--- EALANG 19.3
        |               |
        |               +--- RabbitMQ 3.6.6
        |               |
        |               +--- git
        |                       |
        |                       +--- g++ 5.4.0-6
        |                               |
        |                               +--- php-amqplib/php-amqplib 2.5.*
        |
        |
        |                           # 対局準備
        +--- mono
```

１つ１つのインストール方法は　長くなるので、**記事の末尾に　いつか** 書き足さねばなるまい。

```
// ポエム
// Ubuntuには　なんかインストーラー無いの？　よく分からん。
//
// Windowsの Visual Studio 2015 に初期装備されている NuGet とか、
// PHP の Composer というライブラリを使うと、
// 設定した、欲しい構成、およびバージョンに　自動で準備してくれるのな。
// あれは便利だと思った。
//
// そういうのあるんだったら、こんな「設置マニュアル」なんか書かずに
// 設定ファイル書いて、あとはコマンド打っておいて、の１行で済ますんだが。
```

## Linux / Ubuntu 16.04
とりあえず Ubuntu を最新版にしよう。

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

日本語化しよう。

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

```
# sudo update-locale LANG=ja_JP.UTF-8
*** update-locale: Warning: LANGUAGE ("en_US:") is not compatible with LANG (ja_JP.UTF-8). Disabling it.
```

ロケールの更新は失敗してしまうようだ。

## Apache 2.4.18
バージョンを確認しよう。

```
# apache2 -version
```

と打鍵しよう。

```
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2016-07-14T12:32:26
```

2.4 以上が入ってりゃ大丈夫だろ。多分。
入ってなかったら　騒いでるだろ。その時考えよう。

Apache 2 をインストールするコマンド。

```
apt-get install apache2
```

## Apt
Ubuntu に 最初からインストールされていることを期待。

## Curl

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

と打鍵すれば、PHP用の cURL を入手できる。
ふつうの cURL は次のようにインストールする。

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

## bcmath
composer をインストールしたあと、composer を実行しようとすると bcmath を入れろとエラーが出てくるので入れておくこと。

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

パスワード入力を要求されたかと思ったが、要求されないこともあった。

## unzip
Composer がダウンロードしようとするファイルが圧縮ファイルのときに、このコマンドが必要とされる。

```
apt install unzip
```

## Composer

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

TODO: 使い方は　あとで書く。

## PHP 7.0

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

PHP7.0 だけではなく、関連ライブラリも入れると ブラウザでアクセスしたときに PHP が実行されるようだ。

## Expect 5.45-7
もしかすると Ubuntu16.04 に最初から入っていたかもしれないが、覚えてないのでインストール方法を書いておく。

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

## libev-dev
例によって Apt (apt-get)でインストールする。

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

## EALANG 19.3
RabbitMQ をインストールするついでにインストールする。
この節での説明は略。

## RabbitMQ 3.6.6
手際が悪いんだが、次のようにインストールする。

```
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
```

TODO: 起動方法は　あとで書く。

## git

```
# 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
```

「UbuntuにGitをインストールする」（Androidアプリ開発＠つくばの日記）
https://okuzawats.com/install-git-on-ubuntu-20150615/

## G++ 5.4.0-6

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

一番最新のものをいれればいいはず。
インストールできたか確認するときは

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

## php-amqplib/php-amqplib 2.5.*
Git Hub からソースをダウンロードしてきて、Makefile を使ってインストールする。

「AMQP-CPP」 （CopernicaMarketingSoftware/AMQP-CPP）
https://github.com/CopernicaMarketingSoftware/AMQP-CPP

ダウンロードも Ubuntu上でやってしまおう。

```
# cd /usr/games/sasite1s
# git clone git://github.com/CopernicaMarketingSoftware/AMQP-CPP.git
```

カレント・ディレクトリーにダウンロードされる。
だが、これはソースなんで、そもそも本番環境に要るんだろうか？ インストールだけ必要？

Makefile のあるディレクトリに移動して、手際が悪いんだが次のように打鍵する。
g++ をインストールしていることが必要。

```
# make
# make install
```

TODO: あとで書く。

## mono

インストールされているか確認

```
# mono --version
```

インストール

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





# 深さ3: 楽しい設定

## PHPの設定

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

.original という名前を付けて php.iniのバックアップを残しておいて、 php.ini を編集する。

```
# nano php.ini
```

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

と書いている区画、Misc～ は雑多ぐらいの意味だが、

```
expose_php = On
```

は

```
expose_php = Off
```

にしておく。

「「expose_php = off」の設定」（エンジニア足立のコーディング日記）
https://www.deep-deep.jp/blog_engineer/archives/3793

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

という区画は長いんだが、区画の下の方にある

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

を、

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

に変える。

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

という区画はもっと長いんだが、

```
[mbstring]
```

という区画を探す。

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

は頭のセミコロンを外す。

```
mbstring.language = Japanese
```

```
;mbstring.internal_encoding =
```

は、

```
mbstring.internal_encoding = UTF-8
```

に変える。

```
;mbstring.http_input =
```

は

```
mbstring.http_input = auto
```

に変える。

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

は、頭のセミコロンを外す。

```
mbstring.detect_order = auto
```

php.ini を保存して閉じる。
アパッチを再起動してみる。

```
# sudo service apache2 restart
```

## Composer

PHP を展開したいフォルダーに カレント・ディレクトリーを移動する。

(例)

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

そのフォルダーに、composer.json ファイルを自分で作って、置く。

```
# nano composer.json
```

内容は次のように書く。例えば php-amqplib/php-amqplib ライブラリのバージョン 2.6 が欲しい場合。

composer.json

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

ファイルを作成したら、次のように打鍵する。

```
composer install
```

PHPが動かないようなら、アパッチを再起動すること。

## メッセージ・キューの初期設定

```
# 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。

## tamesi34_cs.cs / tamesi34_cs.exe

コンパイル

```
# mcs /r:RabbitMQ.Client.dll -define:UBUNTU tamesi34_cs.cs
```

tamesi34_cs.exe を実行

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











# 深さ4: 常駐サービスの楽しい起動と停止
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a8.png?raw=true)

```
    バックグラウンド・プロセス
        |
        +--- RabbitMQ Server
        |
        +--- ./apery
```

|名前|説明|
|---|---|
|RabbitMQ Server|PHPプログラムが、浮かむ瀬に指し手を覗う仕組みで利用|
|./apery|標準入出力を全個所プロセス間通信に置き換えた 浮かむ瀬SDT4。デーモンとかにせず、単に　バックグラウンドで待機させておくだけ|

## Linux / Ubuntu 16.04

一般ユーザー名を入れてログイン。（rootユーザーではログインできない）

パスワードを入力。

続けてルートユーザーに切り替えたい場合

```
% sudo su -
```

から、パスワードを入力。


## Apache 2.4.18
再起動したい場合。

```
# sudo service apache2 restart
```

## RabbitMQ

###起動

```
# rabbitmq-server
```

から、

[Ctrl] + [Z]

でスリープ状態にし、

```
bg 1
```

1 はジョブ番号。

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

###停止

```
rabbitmqctl stop
```

## 浮かむ瀬(Sasite1s 改造版)
### 警告
1つのサーバーで 1つの浮かむ瀬を動かしていることを想定。2つ以上動かすための説明は大変なので省略。

### 起動
オリジナルの Apery の起動の仕方と比べると コマンドが変わっているので注意。

```
# 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 &
```

起動直後に１回だけする設定

```
# cd /usr/games/sasite1s
# ./tamesi34_cs.exe
```

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

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

```
??????????????????????????(^~^)
ex.) SunnyBox
Enqueue ? > To_UkamuseSdt4_Sasite1s
????????????????????????????????(^~^)
(1) durable    : RabbitMQ????????????
(2) autodelete : ????????1??????????????
(4) passive    : ?????????????????????????????
(8) exclusive  : ??????????????????????
ex.) 3
Enqueue ? > 3
?????????????????????????(^~^)
ex.) RainyBox
Dequeue ? > From_UkamuseSdt4_Sasite1s
???????????????????????????????(^~^)
(1) durable    : RabbitMQ????????????
(2) autodelete : ????????1??????????????
(4) passive    : ?????????????????????????????
(8) exclusive  : ??????????????????????
ex.) 1
Dequeue ? > 1
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? > 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
```

usiokが返ってきて、isreadyを送り返す間に、setoption を使って　各種エンジン設定を行うことができる。
デフォルトでは次のようになっているかと思う。
setoption は任意だが、現状の Sasite1s 設計では　設定はこのタイミングでしか行えない。

```
setoption name USI_Hash value 256
setoption name Clear_Hash value ★？
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
setoption name USI_Ponder value true
setoption name Time_Margin value 500
setoption name Byoyomi_Margin value 500
setoption name Time_Margin value 4500 ※なんで同じ項目が２個あるんだ？
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
setoption name Draw_Ply value 256
setoption name Move_Overhead value 30
setoption name Minimum_Thinking_Time value 20
setoption name Threads value ★CPUコア数を自動設定
```


```
isready
```

10秒ぐらい待っていること。

```
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
```

```
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? > 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? > 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 が返ってきたので動いている。
ブラウザを使ってアクセスしてみよう。

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








# 付録
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703232354a6.png?raw=true)
読まなくていいものを書こう。

配置図（メモ書き）

```
どこに何が置いてあるかの表。
本番開発ソースはブランチし（改造を加え）ていることがある。

むずでょのローカル実験環境
==========================

    E:/～/2017-03-04_Sasite1s/
        |
        |
        |                                           # 試しにWeb等からダウンロードしたライブラリなど
        +--- Downloads_Otherwise/
        |
        |
        |                                           # 本番環境でインストールしたものを調べたいときなど
        +--- Downloads_SakuraVPS/
        |
        |
        |                                           # Bash の試しプログラム
        +--- Try_Src_Bash/
        |
        |
        |                                           # C++
        +--- Try_Src_Cpp/
        |                                                   # ビットバケツでソース管理。容量が おおよそ 1MB に満たないもの
        |
        +--- Try_Src_Cpp_Large/
        |       |
        |       +--- Sasite1s_Dev_Cpp/ukamuse_sdt4_チャイルド4（プロセス間通信）
        |                                                   # Apery 本番ソースの分岐親
        |                                                   # 2017-03-21 05:01
        |
        |
        |                                           # C#
        +--- Try_Src_Csharp/
        |                                                   # ビットバケツでソース管理。容量が おおよそ 1MB に満たないもの
        |
        +--- Try_Src_Csharp_Large/
        |       |
        |       +--- Csharp_Tamesi34/Csharp_Tamesi34/Program.cs
        |                                                   # ./tamesi34_cs.exe のソース
        |
        |
        |                                           # Expect
        +--- Try_Src_Expect/
        |       |                                           # ビットバケツでソース管理。容量が おおよそ 1MB に満たないもの
        |       |
        |       +--- Sasite1s_Src_Expect/tamesi37a1.expect
        |                                                   # reservation.expect 本番ソースの分岐親
        |
        |
        |                                           # PHP
        +--- Try_Src_Php/
                |                                           # ビットバケツでソース管理。容量が おおよそ 1MB に満たないもの
                |
                +--- Sasite1s_Src_Php/tamesi26a5.php.txt
                |                                           # ukamuse_sdt4.php 本番ソースの分岐親
                |
                +--- tamesi38a1.php


むずでょの本番開発ソース
========================


    C:/～/2017-03-04_Sasite1s/
        |
        |
        |                                           # Apery
        +--- Src_Cpp/
        |       |
        |       +--- ukamuse_sdt4_child4
        |               |                                   # 容量を10MB以下に納めたいので、ビットバケツでC++のソース管理するのはこのフォルダ下だけ
        |               |
        |               +--- x64/
        |               |                                   # このフォルダーはソース管理から省く
        |               |
        |               +--- benchmark.cpp
        |              ...
        |               |    略
        |              ...
        |               +--- usi.hpp
        |
        |
        |                                           # Expect
        +--- Src_Expect/
        |       |
        |       +--- reservation.expect
        |                                                   # ビットバケツでソース管理
        |                                                   # テキストエディターで編集
        |
        |
        |                                           # Php
        +--- Src_Php/
        |       |
        |       +--- ukamuse_sdt4.php
        |                                                   # ビットバケツでソース管理
        |
        |
        |                                           # この文書
        +--- 配置図.txt
```

## メッセージ・キュー
必要な設定がある。そのうち細かく書こう。これは何かという説明をせず、設定方法だけ書くことが重要だ。

```
    メッセージキュー
        |
        |                           # →浮かむ瀬SDT4（sasite1s用）
        +--- To_UkamuseSdt4_Sasite1s
        |           durable
        |           autodelete
        |
        |                           # ←浮かむ瀬SDT4（sasite1s用）
        +--- From_UkamuseSdt4_Sasite1s
                    durable
```

# これって何

## Linux / Ubuntu 16.04

```
// ポエム
// OSのうち、無料で使えることで有名なやつ。パソコンと言えば Windows、Macintosh、Linux が有名どころ。
// Tron とかいう国産のOSが美しかったという話しは職場の経験者から聞くんだが、わたしは見たことがない。
// どこに行ったのだろうか。Multix はおろか Unix すら見たことない。
// 
// Linux は　動物に例えると　心臓部のことなので、Ubuntu といった体を手に入れて配布される。
// Ubuntu は Linuxのディストリビューション（配布形態）の中の１つで、
// 容量が小さくて有名なUSBに入れて配布できるぐらい小さいことで有名。
// そのUSBも大容量になってしまった。
```

## Apache 2.4.18

```
// ポエム
// Apacheと PHPは すでにインストールされています！ と利便性を訴える相方をよそに
// Apacheと PHPを アンインストールして入れなおす　わたしがいるのだった。
//
// 無料で使えるWebアプリケーション・サーバーといえばApache(アパッチ)。
// ブラウザで見れるページでも開設したい人はまず導入する。LAMPの4文字のうちA担当。
```

## Apt
パッケージを取ってくるもの。

```
// ポエム
// じゃあ　パッケージって何なのか、なんだが　漫画でも読んでいて続きはＷｅｂで、とでも書いてたら
// スマホでＷｅｂを見る人もいれば　スマホも持っていなくて続きを見るのも困難する人もいるだろう。
// パッケージを取ってくる、とは、必要なものは手元に全部持ってくる、という意味合いに似ている。
// スマホの方から漫画にやってきて完結してくれたら楽だろう。
//
// あれっ？ Aptパッケージ を Apt で取ってくるにはどうすればいいんだ？と思うんだが
// そんな状況になってたら現地のサーバー管理者に再インストールでもしてもらうことになるんじゃないだろうか。
// 外部記憶装置のCDから dpkg とか利用することになるとしてもリモートからではどうするんだ。
```

## Curl
ファイルをダウンロードするもの。

```
// ポエム
// 正しくは cURL（カール）。物の名前はキャメルケースにしてほしい。cURL とか何ケースなのか。
// 
// URLが　電脳空間での物の場所を示す住所だとすれば、cURL は　電脳空間のクロネコヤマトのようなもの。
// PHPライブラリを入手しようとしたときに　まず cURL を用意したりすることになる。
//
// あれっ？ Apt と cURL、どっちを先に入手するのか、と思ってしまうんだが
// そのサイズの比較は 地球と埼玉県ぐらいの違いがあるだろう。
// Apt で cURL は取ってこれるが、cURL では Apt は取ってこれない。
```

## bcmath
切り上げとか、切り捨ての計算をするときに使う数学ライブラリ・パッケージなんだが、なんでこれが要るのか分からないんだが　エラーが出てたんで入れた。

## Composer
PHPライブラリを　指定したバージョンで　構成してくれるパッケージ。必要なものは全部揃えてくれる。

これは Apt ではなく cURL を使って拾ってくる。

PHP7.0を入れる前だったか、入れた後だったかは忘れた。
なんだかよく分からずアパッチは再起動した。

## PHP 7.0
LAMP の P担当。競合の主なプログラミング言語は Ruby,Perl,Python。Java、または .Net フレームワークを使っている場合に競合するマークアップ言語は Jsp,Asp。

```
// ポエム
// PHP はバージョンアップのたびにライブラリがどんどんサポート切れを起こすので
// 顧客が「古いバージョンいい！だがメンテナンスはしてほしい」という素朴な要望を
// いかに切り捨てて 新しいバージョンに移行させるかが プログラマーの課題だ。
//
// 古いライブラリを使っていると、
// その古いライブラリを動かすには さらに古いライブラリが必要で、
// その古くてサイズがでかいライブラリをインストールしたら
// 動かすには 古いバージョンのPHPが必要になって
// しかし サーバーは PHP5.3以前を切り捨てているなどして 動かず、
// 行き詰るという可能性がある。
//
// 日本の企業では 勝手にバージョンアップされて 勝手にコストが増えた、
// という見方をするところもあり、
// 一度投資すれば何十年も使える、という感覚が見え、
// 15年前から使われているJavaのフレームワークを使える人が募集されて
// いたりする。
// 個人事業主が大企業と競合せずに仕事するなら、各年で 新しい技術をさっさと覚えて
// 海外のあれ、真似してほしい、とかいう小さな仕事でも拾っていこう。
// 
// ただ、この問題は野ざらしにされているわけではなく、
// 逆に composer という優れたツールが生まれてきてむしろ長所として好転しつつある。
// 古いライブラリを切りさえすれば。
```

## Expect 5.45-7

```
// ポエム
// プログラムから、外部プロセスを起動し、操作もするもの。
// 外部プロセスが "usiok" という出力を返してくれば、それに反応して // "isready" を入力をする、といった対話を組むことができるので、外部プロセスを操作することができる。
```

## libev-dev
非同期通信するとき、どうせみんなループでブロックして　受信を待ってるんだろ、といったコードを書かなくてよくするライブラリ。

## EALANG 19.3
アーランと読む。たくさんのマシンで並行処理したいときに縁の下で動いている環境。



# 下地は書いた。
## 設定ファイル
プログラム中に埋め込まれた **サイト・アドレス** を外部テキスト・ファイルにするなりしないと配備できないんじゃないか。
どうするのがいいか。
と思っていたんだが、localhost:5672 ぐらいしかプログラムには埋め込まれていなかった。

/etc フォルダーの下に用意しようと思ったが、とりあえずまだ必要無さそうだ。

## 次は
これを元に　マニュアルを作成したい。