OSXでAperyと将棋をするためにDockerを使ってみた

Diverse Advent Calendar 12日目です。

単純に電王戦を観戦していたら参加している将棋エンジンと指してみたくなりました。
そこで去年から公開している
[github apery](https://github.com/HiraokaTakuya/apery)
を動かして指してました。

Readmeを読んでみたら[将棋所](http://www.geocities.jp/shogidokoro/index.html)の使い方が載っていたので試してみました。
なお、こちらは[将棋ぶらうざＱ](http://park.geocities.jp/sbrowser_q/)はmacで動くので簡単にAperyと指すことが出来ると思います。

##スペック
OSX yosemite v10.10.5
メモリ 16GB
プロセッサ 3.4GHz Intel Core i5

##動かす
macのXへ飛ばすために下記にある参考にさせていただいたURLを見るとsocatとXQuartz(X11)が必要なのでインストールします。

```
$ brew install socat
$ brew install caskroom/cask/brew-cask
$ brew install xquartz
```
XQuartz(X11)は10.7 Lion以前は標準で標準でインストールされていましたが、10.8 Mountain Lion以降から標準でインストールされていないので代わりにXQuartzをインストールしないといけなくなりました。
ちなみに上記ではhomebrewを使用してインストールしていますが[XQuartz](http://www.xquartz.org/)こちらからダウンロードしてインストールすることが出来ます。

```
xquartzを起動
socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
```
xquartzを起動して環境変数DISPLAYの設定がされます。
socatを使用して6000番ポートでTCPの受け入れる状態し、$DISPLAYを指定しdockerコンテナとMacで通信が行われるようにします。
XQuartzを起動しても下記のようになっていない時は再起動する必要があるかもしれないです。

```
(例)
$ echo $DISPLAY
/private/tmp/com.apple.launchd.aqpJZ45kSc/org.macosforge.xquartz:0
```

####Dockerfile
```Dockerfile
# DOCKER-VERSION 1.9.1
# VERSION 0.0.1

FROM ubuntu:14.04

MAINTAINER python_spameggs

RUN apt-get update && apt-get install -y \
    wget \
    unzip \
    mono-complete \
    git-core \
    build-essential

RUN export uid=1000 gid=1000 && \
    mkdir -p /home/shogi && \
    echo "shogi:x:${uid}:${gid}:Developer,,,:/home/shogi:/bin/bash" >> /etc/passwd && \
    echo "shogi:x:${uid}:" >> /etc/group && \
    echo "shogi ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/shogi && \
    chmod 0440 /etc/sudoers.d/shogi && \
    chown ${uid}:${gid} -R /home/shogi

USER shogi
ENV HOME /home/shogi
WORKDIR /home/shogi

RUN git clone https://github.com/HiraokaTakuya/apery.git
WORKDIR /home/shogi/apery
RUN cd src/ && make
#RUN cd src/ && git submodule init && git submodule update # This is Heavy
RUN wget https://hiraoka64@bitbucket.org/hiraoka64/bin/get/5ef825dbcbea.zip && \
    unzip 5ef825dbcbea.zip && \
    rmdir bin && \
    mv hiraoka64-bin-5ef825dbcbea bin
RUN cp src/apery bin/apery
RUN cd bin/ && ./make_synthesized_eval.sh

WORKDIR /home/shogi
RUN wget http://www.geocities.jp/shogidokoro/download/Shogidokoro.zip
RUN unzip Shogidokoro.zip

WORKDIR /home/shogi/Shogidokoro
ENTRYPOINT [ "/usr/bin/mono" ]
CMD [ "Shogidokoro.exe" ]
```
###ビルド

```
docker build -t apery .
```

```#RUN cd src/ && git submodule init && git submodule update```
はサイズが大きく時間がかかりすぎてタイムアウトしてしまうので
```RUN wget https://hiraoka64@bitbucket.org/hiraoka64/bin/get/5ef825dbcbea.zip```
こちらをダウンロードして使用していますのでこのbinが更新されたらビルドがコケると思いますのでその時は[こちら](https://bitbucket.org/hiraoka64/bin/downloads)から最新のURLに置き換えるといいかもしれないです。

```RUN cd bin/ && ./make_synthesized_eval.sh```
こちらも時間のかかるものなのですが、評価関数のフォルダに「*_synthesized.bin」がないとaperyの起動が非常にかかるそうなので作成しています。(数分〜数十分)

###実行

```
docker run --rm -e DISPLAY=192.168.99.1:0 --name shogi_apery apery
```
192.168.99.1:0の192.168.99.1の部分はdockerとvirtualboxを繋ぐIPを指定してあげればいい。
socatの方を動かしてから別ウィンドウのターミナルをからdocker runしてください。

```
$ ifconfig
...
vboxnet3: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
	ether 0a:00:27:00:00:03
	inet 192.168.99.1 netmask 0xffffff00 broadcast 192.168.99.255
```
なのでdocker runする前に次に振られるIPを調べておくといいですね。

docker runすると
![docker_run.png](https://qiita-image-store.s3.amazonaws.com/0/27949/29dd1341-dcc5-f1f7-eaab-1b84c7ff5ba2.png "docker_run.png")
このように将棋所が起動されます。

##Aperyと指す
```
GAME(G) -> Engine Manager -> Add -> ../apery/bin/aperyを選択
```
そうしたら対戦EngineにAperyが選べるようになります。
あとは

```
GAME(G) -> Start New Gameを選択
```
![game_start.png](https://qiita-image-store.s3.amazonaws.com/0/27949/c900c8e7-c137-e393-f748-c90cb5971e04.png "game_start.png")
と先後や持ち時間の設定してOKを対局開始です。
![start.png](https://qiita-image-store.s3.amazonaws.com/0/27949/1ad3fec2-c536-1d1a-f1db-e5afef7d10f9.png "start.png")

また、```apt-get install gpsshogi```でGPS将棋が入るようなのでApery対GPS将棋もできたりします。
他にも[将棋エンジン](http://www.geocities.jp/shogidokoro/enginelink.html)こちらに公開されているものがあるので指すことが出来ます。

##参考
[Running GUI apps with Docker](http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/)
[Docker Containers on the Desktop](https://blog.jessfraz.com/post/docker-containers-on-the-desktop/)
[How to run a Linux GUI application on OSX using Docker](http://kartoza.com/how-to-run-a-linux-gui-application-on-osx-using-docker/)
[DockerコンテナのGUIをMac側に飛ばして表示させよう。](http://qiita.com/akiko-pusu/items/e42aab2df1a5772f9585)

###蛇足
持ち時間5分、秒読み30秒で先後それぞれ5戦しましたが10-0でAperyにボコボコにされました。