タイトルの通り、このブログのHamliteのAIボタンを使えるようにしました。
↑ のオセロの盤面が、Hamliteです。AIボタンを押すと、評価値が表示されると思います。

こんな風に表示されていればOK。
あとは技術的な話になります。つまり、これがどうやって動いてるかという話。
HamliteでAIボタンを押すと何が起こるか
Hamliteからサーバーに解析を要求
Hamliteから、https://hamlite.hasera.net/edax.php に「この局面を解析して下さい!」とリクエストの通信が行われます。
具体的には、
https://hamlite.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は何をしているか
ソースコード貼ります。
edax.php
<?php header(‘Content-Type: text/javascript; charset=UTF-8’);
if (!isset($_GET[‘solve’]) || $_GET[‘solve’] !== ‘all’) {
echo ‘callBackEmpties(19);’;
exit;
}if (!isset($_GET[‘board’]) || trim($_GET[‘board’]) === ”) {
echo ‘callBackEmpties(19);’;
exit;
}$board = trim($_GET[‘board’]);
$empties = substr_count($board, ‘-‘);
if ($empties > 19) {
echo ‘callBackEmpties(‘ . $empties . ‘);’;
exit;
}$board_escaped = escapeshellarg($board);
$cmd = “cd ~/edax; printf ‘setboard %s\\nhint 35\\n’ $board_escaped | ./lEdax-native -h 18 | 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;
bestmoves = move;
}
else if (\$2 == best) {
bestmoves = bestmoves \”,\” move;
}count++;
}
}
END {
if (bestmoves != \”\”) {
n = split(bestmoves, bm, \”,\”);
for (i = 1; i <= n; i++)
printf \”,%s:BEST\”, bm[i];
}
}'”;$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”);
さっきの局面なら、こういう応答になります。
つまり、HamliteのAIボタンを押すと、サーバー側でedaxが一瞬動いて解析します。
2026年8月16日追記:
最善手が複数個所ある場合は、例えば
callBackResult(10,”H3:+0,E2:+0,G7:+0,H6:-2,G2:-2,H5:-4,G1:-6,:BEST,E2:BEST,G7:BEST”);
のように、座標と「BEST」の組が複数になるように修正しました。
補足
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は、edax.phpの中の19と書いてあるところと合わせる必要があって、edax.phpの中のが19ならnextMoveNo > 45を41にします(合計が60になるように)。私は、nextMoveNoのチェック自体をしないようにしました。
solveMulti(textBoard); は1つづつ繰り返し解析を要求するので効率が悪く、 solver(solveURL + “solve=all&board=” + textBoard); の方を使うようにして良いです。
edaxのコンパイル
GitHubからedaxのソースコード(https://github.com/abulmo/edax-reversi/releases/tag/v4.6)をダウンロードして、サーバー上でコンパイルしました。
cd src
mkdir ../bin
make build ARCH=native CC=gcc LIBS=”-lm -lrt -pthread”
で、../bin に lEdax-native(edaxの実行ファイル)ができました。
これは、環境によって異なると思います。
最初は
make build ARCH=native
とやってエラーが出て、エラーメッセージをChatGPTに貼り付けて教えてもらいました。まだ何か色々表示されていたのですが、動いたからヨシ!(えー)

lEdax-nativeはbin配下のままでも良いのですが、1つ上の階層にコピーしました。
eval.datは、Windows版のを流用しました。
2026年8月14日追記:
・edaxのソースコードから、eval.datを読み込む部分を削除すると、読み込まなないようにすることができます。具体的には、eval.cの、eval_open関数から、「data reading」とコメントが書かれているところから後ろを削除。終盤の完全読みだけなら、その部分がなくてもちゃんと動くようです。
・main.cの、main関数の、edge_stability_initを呼んでいるところを、呼ばないようにすると、起動が早くなります。これも、呼ばなくても終盤の完全読みは動くようです。
book.datは勝手にできました(84バイトしかなくて、内容は空です)
edax.iniには、「-n 3」と書いてあります。3スレッド使うという意味。デフォルトのlevel 21で動いてるはずなので、24個空きくらいまでは、edax.iniに書かなくても完全読みしてくれると思います。
あとがき
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をサーバー上で動かすのは、私が書いた内容で分かる人向けです。

