プログラミング
記事内に商品プロモーションを含む場合があります

DMOJをMac(Apple Silicon)で動かす方法|Dockerでローカルオンラインジャッジ環境を構築

Aru

競プロなどでお馴染みのオンラインジャッジをローカルで動かしたくなったので、色々調べてみました。ここでは、DMOJというOSSのオンラインジャッジシステムをApple Silicon搭載のMacで動作させたのでメモを残しておきます。

DMOJをMacで動かす

今回は、以下の記事を参考に環境を構築してみました。

Githubリポジトリも用意してくれていたのですがApple Silicon(Arm)ではうまく動かなかったので、一部修正したリポジトリを以下に置きました。

https://github.com/aruaru0/dmoj_docker

全体構成

全体構成は、元記事に書かれている通りで、オンラインジャッジシステム(app), redis, mysql, nginx, そして、judgeサーバー(python, c++, go)をDockerを使って起動します。

構成イメージ
          nginx
            |
           app
            |
     +------+------+
     |             |
   redis        mysql

        |
      judge

judgeサーバーは提出されたコードを実際にコンパイル・実行する役割を持っています。C++ / Python / Go などの実行環境がこのコンテナに含まれています。

リポジトリは、docker composeを使って、これらのサーバーを一気に立ち上げるものになります。

動かすにはDockerが必要になるので、Docker Desktopをダウンロードしインストール・起動しておく必要があります。

https://www.docker.com/ja-jp/get-started

環境構築の仕方

以下のコマンドでリポジトリをクローンします

git clone https://github.com/aruaru0/dmoj_docker.git

次に、dockerフォルダに移動します。

cd dmoj_docker/docker

このフォルダでbuildを実行します

docker compose build

buildでエラーがなければ以下のコマンドで立ち上げます。

docker compose up -d

起動できたら、setup.shを実行して環境構築は完了です

bash scripts/setup.sh

トラブらなければ、これだけで環境構築は完了です。

使い方

起動

起動は以下のコマンドです

docker compose up -d

終了

終了は以下のコマンドになります。

docker compose down

管理ページを開く

http://localhost:8081/admin にアクセスすることで管理画面を開くことができます。ユーザ名、パスワードともに初期設定はadminです。なお、setup.shを実行した時に登録したユーザーアカウントでログインしてもOKです。

問題文の追加について

問題文の追加はProblemsから行います。数式もLatex形式で入力することができます。こちらの詳細については、以下の記事を参考にしてください。

なお、問題のテストベクタはdmoj_docker/problemsのフォルダに置く必要があります。このフォルダにProblem Codeと同じ名前のフォルダ名を作成し、init.ymlとテストベクタを格納したzipファイルを配置します。

init.ymlは、以下のようなものになります。

archive: hello.zip
checker: standard
test_cases:
- batched:
  - in: hello.1.in
    out: hello.1.out
  - in: hello.2.in
    out: hello.2.out
  - in: hello.3.in
    out: hello.3.out
  points: 100
  • archive : テストベクタを格納したZIPファイル
  • test_cases: テストケースを記載したものです。入力(in:)と期待値(out:)が最低限必要です。
  • batched: テストケースを1塊にしたものです。全体がOKで点数をつける場合にはこちらが良いです。

詳しくはDMOJ Docsを参照してください。色々機能があります。例えば、浮動小数点誤差を許容するなどの設定も可能です。
https://docs.dmoj.ca/#/problem_format/problem_format

リポジトリのproblems/helloworldにサンプルを置きましたのでこちらを参考にしてみてください(この問題は初期化した後は登録されていないので問題を作成して登録してみてください。problem codeをhelloworldにすれば追加できます)

helloworldのサンプルは、文字列を入力すると、”hello world, xxxx”と返せという問題です。

その他

各ユーザーはhttp://localhost:8081に接続し、ユーザー登録することになります。サーバーのIPアドレス(http://IPアドレス:8081)にアクセスしてもらえば、LAN内のPCから接続できるので、ミニコンテストみたいなのをローカルで開催するのに便利です。

クローンしたリポジトリと同じく、ユーザー登録時のメールアドレスによるチェックはスキップしています(ローカルでやる場合はこの方が楽なので)。

まとめ

DMOJをMacで動かす方法について解説しました。実際に使ってみて気づいたのはエラー発生時に原因が分かりにくいということです。docker compose logsなどで、サーバーエラーを追跡する必要があるので、トラブルがあった場合はちょっと対応が面倒でした。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
ある/Aru
ある/Aru
IT&機械学習エンジニア/ファイナンシャルプランナー(CFP®)
専門分野は並列処理・画像処理・機械学習・ディープラーニング。プログラミング言語はC, C++, Go, Pythonを中心として色々利用。現在は、Kaggle, 競プロなどをしながら悠々自適に活動中 保有資格:CFP, マンション管理士、管理業務主任、宅建士など
記事URLをコピーしました