このブログのHamliteのAIを動くようにしてみました

タイトルの通り、このブログのHamliteAIボタンを使えるようにしました。

↑ のオセロの盤面が、Hamliteです。AIボタンを押すと、評価値が表示されると思います。

Hamlite

こんな風に表示されていればOK。

あとは技術的な話になります。つまり、これがどうやって動いてるかという話。

HamliteでAIボタンを押すと何が起こるか

Hamliteからサーバーに解析を要求

Hamliteから、othlog.hasera.net/edax.php に「この局面を解析して下さい!」とリクエストの通信が行われます。

具体的には、

https://othlog.hasera.net/edax.php?solve=all&board=–XXXXX–OOOOX—OOXXOXXOOXXOXXXOOOOXXOOOOOOXOX–OXXXX-XOXXXXXX-%20O

にアクセスしたときと同じような感じ。edax.phpに、「?」から後のパラメータが渡ります。これはHamliteが勝手にそういうリクエストを送信してくれます。盤面を表す64文字と、手番(O=白)です。

それに対する応答は、

callBackResult(11,”H6:+0,H8:-8,G2:-22,H2:-24,G7:-42,H6:BEST”);

です。空きマスの数、座標:評価値、最善手が返るわけです。それで、あとはHamliteが上記のように表示してくれます。

edax.phpは何をしているか

ソースコード貼ります。これは現在(2026/8/13)動いているもので、変更する可能性はあります。

edax.php

<?php header(‘Content-Type: text/javascript; charset=UTF-8’)
;
if (!isset($_GET[‘board’]) || trim($_GET[‘board’]) === ”) {
echo ‘callBackEmpties(15);’;
exit;
}

$board = trim($_GET[‘board’]);

$empties = substr_count($board, ‘-‘);

if ($empties >= 16) {
echo ‘callBackEmpties(‘ . $empties . ‘);’;
exit;
}

$board_escaped = escapeshellarg($board);

$cmd = “cd ~/edax; printf ‘setboard %s\\nhint 20\\n’ $board_escaped | ./lEdax-native | grep -E ‘^[[:space:]]*[0-9]+[[:space:]]+[+-][0-9]+’ | awk ‘
{
move = \”\”;
for (i = 1; i <= NF; i++) {
if (\$i ~ /^[a-hA-H][1-8]$/) {
move = toupper(\$i);
break;
}
}

if (move != \”\”) {
if (count > 0)
printf \”,\”;

printf \”%s:%+d\”, move, \$2;

if (count == 0 || \$2 > best) {
best = \$2;
bestmove = move;
}

count++;
}
}
END {
if (bestmove != \”\”)
printf \”,%s:BEST\”, bestmove;
}'”;

$result = shell_exec($cmd);

echo ‘callBackResult(‘ . $empties . ‘,”‘ . trim($result) . ‘”);’ . PHP_EOL;

ほとんど、ChatGPTが作ってくれました。

1.Hamliteから来るパラメータを受け取って

2.それをedax(lEdax-native)に渡して

3.edaxの出力から、合法手と評価値の組を作って、さっき書いたHamliteへの応答の形式にして出力します。

callBackResult(11,”H6:+0,H8:-8,G2:-22,H2:-24,G7:-42,H6:BEST”);

さっきの局面なら、こういう応答になりす。

つまり、HamliteAIボタンを押しただけで、サーバー側でedaxが一瞬動いて解析します。

補足

Hamliteのダウンロード、編集

Hamliteは、https://hamlite.ifdef.jp/download.html からダウンロードできます。

hamcode.js の中の、

var ONLINE = “//reversi-ai.appspot.com/endgame?”;

というのが、AIボタンを押したときにリクエストが飛ぶ先のURLで、これは今はもうないので動かないわけです。ここを、

var ONLINE = “https://othlog.hasera.net/edax.php?”;

に書き換えました。

あと、

if (nextMoveNo > 45)

という行がありますが、これは、45手目以降にAIボタンを有効にするという意味なので、40にすれば40手目から解析できます(edax.phpの中の、15とか16を、20、21にすれば20個空きくらいから動きますが、サーバーへの負荷が大きくなりすぎるかも知れません)

edaxのコンパイル

GitHubからedaxのソースコード(https://github.com/abulmo/edax-reversi/releases/tag/v4.6)をダウンロードして、サーバー上でコンパイルしました。

cd src

mkdir ../bin

make build ARCH=native CC=cc LIBS=”-lm -lrt -pthread”

で、../bin に lEdax-native(edaxの実行ファイル)ができました。

これは、環境によって異なると思います。

最初は

make build ARCH=native

とやってエラーが出て、エラーメッセージをChatGPTに貼り付けて教えてもらいました。まだ何か色々表示されていたのですが、動いたからヨシ!(えー)

edax-tree

lEdax-nativebin配下のままでも良いのですが、1つ上の階層にコピーしました。

eval.datは、Windows版のを流用しました。

book.datは勝手にできました(84バイトしかなくて、内容は空です)

edax.iniには、「-n 3」と書いてあります。3スレッド使うという意味。デフォルトのlevel 21で動いてるはずなので、24個空きくらいまでは、edax.iniに書かなくても完全読みしてくれると思います。24個空きまで読ませるなら、edax.phpの中の「hint 20」を「hint 24」にしないと行けないかも知れません(打てる場所の数が最大24カ所になるかも知れないから)

あとがき

Hamliteを私が提供しても、私のサーバーが使えなくなったら動かなくなってしまいます。liveothelloもそうで、ずっとliveothelloが使えるかは分かりません。

なので、本当は、誰かが提供したものを使うのではなく、分かる人が自分のサーバーにHamliteをアップロードして、edax.phpとedaxみたいにサーバー上で解析できる環境を作って動かすようにすると良いと思います。

Hamliteだけだと解析できないですが、今は、Hamliteから棋譜をコピーして手元のソフトに貼り付ければ解析できるので、PCで見てればあまり困らないんですよね。スマホだとまだちょっとコピーが面倒くさいかな。

自分のサーバーにHamliteをアップロードして、hamcode.js中の「var ONLINE = …」のところを

var ONLINE = “https://othlog.hasera.net/edax.php?”;

のように書き換えるだけでも、AIボタンが動くと思います。ただ、othlog.hasera.netがなくなると、AIボタンは使えなくなくなります。

edaxをサーバー上で動かすのは、私が書いた内容で分かる人向けです。

タイトルとURLをコピーしました