はじめに

https://github.com/mjx-project/mjx

最新Mac環境へのlocalインストール→失敗

まずは使っているMac環境へインストールを試みる。

  • 環境
    • CPU: Apple silicon
    • Python: 3.7以上
    • pip(Pythonのパッケージマネージャー)

公式ドキュメントでは pip install mjx でインストール可能とのことなので実行してみる

 python -m pip install mjx
Collecting mjx
  Using cached mjx-0.1.0.tar.gz (354 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting google==3.0.0 (from mjx)
  Using cached google-3.0.0-py2.py3-none-any.whl.metadata (627 bytes)
Collecting protobuf==3.17.3 (from mjx)
  Using cached protobuf-3.17.3-py2.py3-none-any.whl.metadata (858 bytes)
Collecting grpcio==1.39.0 (from mjx)
  Using cached grpcio-1.39.0.tar.gz (21.3 MB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting numpy (from mjx)
  Downloading numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl.metadata (62 kB)
Collecting pillow (from mjx)
  Downloading pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl.metadata (9.0 kB)
Collecting svgwrite (from mjx)
  Using cached svgwrite-1.4.3-py3-none-any.whl.metadata (8.8 kB)
Collecting inquirer (from mjx)
  Using cached inquirer-3.4.1-py3-none-any.whl.metadata (6.8 kB)
Collecting beautifulsoup4 (from google==3.0.0->mjx)
  Using cached beautifulsoup4-4.13.5-py3-none-any.whl.metadata (3.8 kB)
Collecting six>=1.5.2 (from grpcio==1.39.0->mjx)
  Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting soupsieve>1.2 (from beautifulsoup4->google==3.0.0->mjx)
  Using cached soupsieve-2.7-py3-none-any.whl.metadata (4.6 kB)
Collecting typing-extensions>=4.0.0 (from beautifulsoup4->google==3.0.0->mjx)
  Using cached typing_extensions-4.15.0-py3-none-any.whl.metadata (3.3 kB)
Collecting blessed>=1.19.0 (from inquirer->mjx)
  Using cached blessed-1.21.0-py2.py3-none-any.whl.metadata (13 kB)
Collecting editor>=1.6.0 (from inquirer->mjx)
  Using cached editor-1.6.6-py3-none-any.whl.metadata (2.3 kB)
Collecting readchar>=4.2.0 (from inquirer->mjx)
  Using cached readchar-4.2.1-py3-none-any.whl.metadata (7.5 kB)
Collecting wcwidth>=0.1.4 (from blessed>=1.19.0->inquirer->mjx)
  Using cached wcwidth-0.2.13-py2.py3-none-any.whl.metadata (14 kB)
Collecting runs (from editor>=1.6.0->inquirer->mjx)
  Using cached runs-1.2.2-py3-none-any.whl.metadata (10 kB)
Collecting xmod (from editor>=1.6.0->inquirer->mjx)
  Using cached xmod-1.8.1-py3-none-any.whl.metadata (1.8 kB)
Using cached google-3.0.0-py2.py3-none-any.whl (45 kB)
Using cached protobuf-3.17.3-py2.py3-none-any.whl (173 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Using cached beautifulsoup4-4.13.5-py3-none-any.whl (105 kB)
Using cached soupsieve-2.7-py3-none-any.whl (36 kB)
Using cached typing_extensions-4.15.0-py3-none-any.whl (44 kB)
Using cached inquirer-3.4.1-py3-none-any.whl (18 kB)
Using cached blessed-1.21.0-py2.py3-none-any.whl (84 kB)
Using cached editor-1.6.6-py3-none-any.whl (4.0 kB)
Using cached readchar-4.2.1-py3-none-any.whl (9.3 kB)
Using cached wcwidth-0.2.13-py2.py3-none-any.whl (34 kB)
Downloading numpy-2.3.2-cp313-cp313-macosx_14_0_x86_64.whl (6.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.6/6.6 MB 11.6 MB/s  0:00:00
Downloading pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl (5.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.3/5.3 MB 11.6 MB/s  0:00:00
Using cached runs-1.2.2-py3-none-any.whl (7.0 kB)
Using cached svgwrite-1.4.3-py3-none-any.whl (67 kB)
Using cached xmod-1.8.1-py3-none-any.whl (4.6 kB)
Building wheels for collected packages: mjx, grpcio
  Building wheel for mjx (pyproject.toml) ... /
(しばらく待つ)
          raise CompileError(msg)
      distutils.compilers.C.errors.CompileError: command '/usr/bin/clang++' failed with exit code 1

      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for grpcio
Failed to build mjx grpcio
error: failed-wheel-build-for-install

× Failed to build installable wheels for some pyproject.toml based projects
╰─> mjx, grpcio

grpcio周りでエラーが発生しているのでビルドに失敗

その後grpcioを先にインストールしたり、バージョンを変えたりと色々と試したが、上手くインストールできず。。。

Docker環境でmjxをインストール

一旦Mac環境にインストールすることは諦めてDocker環境にインストールすることを検討

Dockerfileの作成

下記のDockerfileを作成して、mjxをインストールする

FROM python:3.9-slim-bullseye

# 最低限のビルドツールを入れておく
RUN apt-get update && apt-get install -y --no-install-recommends \
    build-essential cmake pkg-config git 

# pip を更新してから mjx を入れる
RUN python -m pip install --upgrade pip setuptools wheel \
 && pip install mjx tqdm jupyterlab

# jupyterlabの起動
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]

サンプルのノートブックを実行するためにtqdmやjupyterlabも同時にインストールするようにDockerfileを作成します

Dockerイメージのビルドと実行

下記コマンドでビルドと実行を行う

# ビルド
docker build --platform=linux/amd64 -t mjx-py39 .

# 実行
docker run --platform=linux/amd64 -it -p 8888:8888 --rm mjx-py39

正常に起動するとjupyterlabのURLが出力されるのでアクセスする(ex. http://127.0.0.1:8888/lab?token=34379a...)

Notebookの作成と麻雀卓の表示

公式のnotebookを参考に麻雀の盤面を作成してみた

ちゃんと実行して局面が表示された!

hello_mjx

確かにきれいな盤面が表示されている

次回はmjxに用意されている機能について紹介していきたいと思います。