gnubg python scripting

バックギャモンの解析ソフト [GNU Backgammon](http://www.gnubg.org/) には、Pythonスクリプトを実行する機能がある。そのこと自体は前から知っていたが、Pythonを知らなかったので手が出せなかった。最近、仕事でPythonの使い方を少し覚えたので何かやってみようじゃありませんか！

## 準備

Ubuntu 14.04 LTSを使いました。gnubgのバージョンが 1.02 が入っていたのですが、このバージョンでは後述する `gnubg.match()` を呼んでも空の dict しか返ってきませんでした。なので、1.05 を[ソースからビルド](http://www.gnubg.org/index.php?itemid=100&catid=10)しました。

```
$ gnubg
GNU Backgammon 1.05.002  Jul  2 2016
Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 by Gary Wong.
Copyright (C) 2016 by Gary Wong and the AUTHORS; for details type `show version'.
This program comes with ABSOLUTELY NO WARRANTY; for details type `show warranty'.
This is free software, and you are welcome to redistribute it under certain conditions; type `show copying' for details.
(ゲーム無し)
```

## Pythonにアクセスする

`import gnubg`

このように始めたいところですが出来ません。gnubgをPythonで操作する方法は、ちょっと変わっています。
gnubgを起動した状態で、コマンドプロンプトに `>` を入力します。すると、IPython が使えるようになります。

```
(ゲーム無し) >
/usr/local/lib/python2.7/dist-packages/IPython/config.py:13: ShimWarning: The `IPython.config` package has been deprecated. You should import from traitlets.config instead.
  "You should import from traitlets.config instead.", ShimWarning)
IPython 4.2.1, Python 2.7.6 (default, Jun 22 2015, 18:01:27) 
[GCC 4.8.2]
In <1> > 
```

私の環境では何かいろいろ出ましたが、とりあえず気にしないことにします。
以下のコマンドでヘルプが参照できます。

```
In <1> > help(gnubg)
```

## マッチのインポート

[PlayOK](https://twitter.com/mkisono/status/749088135917608961)のマッチをインポートしてみましょう。

```
In <2> > gnubg.command('import mat 87027157.txt')
 GNU Backgammon  Position ID: AAAAunEAAAAAAA
                 Match ID   : 8AqgAFAAAAAE
 +13-14-15-16-17-18------19-20-21-22-23-24-+     O: mkisono
 |                  |   |                  | OOO 5 ポイント
 |                  |   |                  | OOO 
 |                  |   |                  | OOO 
 |                  |   |                  | OOO 
 |                  |   |                  | OOO
v|                  |BAR|                  |     5 ポイントマッチ (キューブ: 1)
 |                  |   |                  | X  
 |                  |   |                  | X   
 |                  |   | X           X    | X   
 |                  |   | X        X  X    | X   
 |                  |   | X        X  X  X | XX  0 ポイント
 +12-11-10--9--8--7-------6--5--4--3--2--1-+     X: cwm7296g
```

## マッチの解析

```
In <3> > gnubg.command('analyse match')
```

## 解析結果の表示

```
In <4> > gnubg.command('show statistics match')
プレイヤー                          mkisono                 cwm7296g               

チェッカープレイ統計

ムーブ総計                           49                      47                    
非強制ムーブ                        44                      36                    
マークしていないムーブ         45                      34                    
疑わしいムーブ                      1                       5                    
悪いムーブ                            2                       2                    
非常に悪いムーブ                   1                       6                    
Error total EMG (MWC)                         -0.555 ( -8.234%)       -2.515 (-34.975%) 
Error rate mEMG (MWC)                        -12.6   ( -0.187%)      -69.9   ( -0.972%) 
チェッカープレイのレーティング Intermediate            Awful!                 


運統計

非常に幸運なロール                0                       1                    
幸運なロール                         3                       4                    
普通のロール                        46                      38                    
不運なロール                         0                       3                    
非常に不運なロール                0                       1                    
Luck total EMG (MWC)                          +0.571 ( +9.871%)       -0.972 (-12.880%) 
Luck rate mEMG (MWC)                         +11.7   ( +0.201%)      -20.7   ( -0.274%) 
運の評価                             None                    None                   


キューブ統計

キューブアクションの総計       2                      30                    
ぎりぎりまたは現実のキューブアクション   2                       1                    
ダブル                                  1                       0                    
テイク                                  0                       1                    
パス                                     0                       0                    
Missed doubles below CP (EMG (MWC))        0                       0                    
Missed doubles above CP (EMG (MWC))        0                       0                    
Wrong doubles below DP (EMG (MWC))         1 (-0.042 ( -0.323%))   0                    
Wrong doubles above TG (EMG (MWC))         0                       0                    
間違ったテイク (EMG (MWC))          0                       0                    
間違ったパス (EMG (MWC))             0                       0                    
Error total EMG (MWC)                         -0.042 ( -0.323%)       -0.000 ( -0.000%) 
Error rate mEMG (MWC)                        -20.9   ( -0.162%)       -0.0   ( -0.000%) 
キューブアクション評価        Casual player           Supernatural           


総合統計

Error total EMG (MWC)                         -0.597 ( -8.557%)       -2.515 (-34.975%) 
Error rate mEMG (MWC)                        -13.0   ( -0.186%)      -68.0   ( -0.945%) 
Snowie error rate                             -6.2   ( +0.000%)      -26.2   ( +0.000%) 
総合評価                             Intermediate            Awful!                 
実際の結果                           +50.00%                 -50.00%               
Luck adjusted result                      +27.25%                 -27.25%               
Luck based FIBS rating diff.             +474.84                                        
Error based abs. FIBS rating             1858.7                  1078.7                 
チェッカープレイのエラーによるレーティングの減点  175.4                   971.3                 
キューブエラーによるレーティングの減点   15.9                     0.0  
```
やけにエラーの多いマッチでした・・

## マッチのデータを取得する

`gnubg.match()` コマンドを入力すると、マッチのデータが返ってきます。このデータを使って何しましょうかねぇ。

## まとめ

gnubg を Python でいじって遊ぶ準備が出来ました。ちょうど Python を勉強しているところなので、趣味と実益を兼ねていて、こんなに楽しいことはないですね！！

参考にしたページ
* http://osdir.com/ml/bug-gnubg-gnu/2013-12/msg00013.html