27
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AtCoder環境をDockerで作ってみた

Last updated at Posted at 2025-04-01

はじめに

自分なりには環境を整えているつもりですが、プロの方からしたらまだまだ使いづらく感じると思います。そのような点ありましたらご指摘お願いします。

なぜDocker?

「Dockerじゃなくてもいいのでは?」という意見の方も多いと思います。しかし、Dockerを使うことで様々な恩恵を受けることができます。例えば、以下のようなメリットがあります。

  • 別のPCでAtCoderをやるときも環境を楽に作り、楽に消すことができる
  • -> 移植性が高い
  • ホスト環境を一切汚さない

準備

まず、リポジトリを任意のディレクトリにクローンします。

$ git clone https://github.com/kurimochi/atcoder_on_docker

次に、コンテナ内でAtCoderにログインするための作業を実施します。今回使うonline-judge-toolsatcoder-cli自体にもログイン機能が備わっているのですが、AtCoder側の仕様変更によりそれが使えなくなってしまいました。これらのツールにはcookieを保存する場所があるので、今回はログイン済みのセッションクッキーをコピーする形をとります。

ホスト側のWebブラウザでAtCoderにログインします。その後、F12キーでDevToolsを開き、Application -> Cookies -> https://atcoder.jpと進みREVEL_SESSIONという名前のクッキーのValueをコピーしてください。そして、.devcontainer/src/cookie-template.jar.devcontainer/src/cookie.jarに、.devcontainer/src/session-template.json.devcontainer/secrets/session.jsonにコピーし、{Insert the copied value}という部分を先ほどの値に置き換えます。

$ cp .devcontainer/src/cookie-template.jar .devcontainer/secrets/cookie.jar
$ cp .devcontainer/src/session-template.json .devcontainer/secrets/session.json

最後に、.devcontainerディレクトリに移動しコンテナを作成します。

$ cd .devcontainer
$ docker compose up -d --build

私の環境ではイメージの作成だけでも3分強かかりました。また、このイメージは最終的に3GBを超えるほどの大きさになるのでそれなりのディスクスペースも必要です。

使い方

もしコンテナを終了させていたら、再度起動してください。

$ docker compose up -d

VSCodeでDev Containers拡張機能をインストールし、リモートタブでatcoderコンテナにアタッチします。

テストデータのダウンロード

以下では、実際に問題を解く手順を説明します。
まず、contest/ にアクセスし、問題のテストデータをダウンロードします。例えば、abc001という問題は以下のようにダウンロードできます。ユーザ名とパスワードの入力を求められることがありますが、空欄のままで構いません。

$ acc new abc001

--template pythonオプションを付けることで、Pythonで解答することができます。

$ acc new abc001 --template python

詳しくは、atcoder-cliのリポジトリかヘルプ(-h)をご覧ください。

解答

contest/配下にコンテストのディレクトリがあり、その配下には各問題のディレクトリがあります。VSCodeで解きたい問題のディレクトリにあるmain.*を編集してください。

テスト

本来ならもっと長いコマンドを入力するのですが、エイリアスをあらかじめ設定しておいたのでその必要はありません。それぞれ以下のコマンドでテストを実行できます。

C++: cpptest
Python3(PyPy): pypytest
Python3(CPython): py3test

提出

テストが成功したら、AtCoderに提出しましょう。なお、ここでも以下のようにエイリアスを設定しています。

C++: cppsb
Python3(PyPy): pypysb
Python3(CPython): py3sb

提出前に確認として文字列の入力を求められるので、それに従って提出してください。結果はAtCoderのWebページで見ることができます。

カスタマイズ

リポジトリの構成は以下のようになっており、*はそのファイル/ディレクトリがカスタマイズできることを意味します。

.
│  .gitignore
│  README.md
│
├─.devcontainer/
│  │  devcontainer.json         *
│  │  docker-compose.yml        *
│  │  Dockerfile                *
│  │
│  └─src
│      │  .bashrc               *
│      │  cookie-template.jar
│      │  requirements.txt      *
│      │  template.json
│      │
│      └─templates              *
│          ├─cpp
│          │      main.cpp
│          │      template.json
│          │
│          └─python
│                  main.py
│                  template.json
│
├─.vscode
│      c_cpp_properties.json
│
└─contest
    └─...

以下のセクションでは、各ファイル/ディレクトリのカスタマイズ方法について説明します。

.devcontainer/devcontainer.json

devcontainer.jsonはVSCodeが使用する設定ファイルです。ここでカスタマイズできるのは {.customizations.vscode}で、extensionsにはプリインストールされる拡張機能を、settingsには標準の設定を指定することができます。

.devcontainer/docker-compose.yml

docker-compose.yml はコンテナ設定ファイルです。.service.atcoder.container_nameでコンテナ名を変更できます。

.devcontainer/Dockerfile

Dockerfileはコンテナイメージの設計書です。ここでカスタマイズできるのは5行目のapt installコマンドで、インストールするパッケージをカスタマイズできます。例えば、この環境にRubyをインストールしたいなら、apt install -yの後に rubyを追加します。初心者にはあまりお勧めできませんが、独自のコマンドを追加することも可能です。

.devcontainer/src/.bashrc

.bashrcにはエイリアスが設定されています。新しい言語を追加したり、別のコマンドのエイリアスを設定したい場合は、ここに追加することができます。

.devcontainer/src/requirements.txt

requirements.txtでは、pipでインストールするライブラリをカスタマイズできます。例えばnumpyをインストールしたい場合は、requirements.txtnumpyを追加します。

.devcontainer/src/templates/

このディレクトリにはatcoder-cliでテストデータのディレクトリを作成するためのテンプレートが設定されています。テンプレートはmain.*で自由に変更することができます。
テンプレートを追加するには、templatesの下にディレクトリを作成し(ディレクトリ名はテンプレート名にする)、使用する言語のコードテンプレートを書きます。次に、src/template.jsonをそのディレクトリにコピーし、{Insert file name}を作成したコードのファイル名に置き換えます。
デフォルトのテンプレートを変更するには、以下のコマンドを実行します。{Insert template name}をテンプレートの名前に置き換えてください。

$ acc config default-template {Insert template name}

参考にした記事

27
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?