このリポジトリをクローンし VS Code で開くと、Dev Container が環境を構築する。
AtCoder 用ツール acc, oj をインストール済み。 VS Code タスクを支援する独自ツールもインストール済み。
以下のツールをインストールする。
デフォルトのプログラミング言語は Java。
docker イメージは atcoder-container で build したものを利用。 イメージを作り直す場合は、そちらのリポジトリを参照。 Dockerfile の 1行目で、自分で build したイメージを利用するように変更する。
デフォルトで利用する docker イメージは以下の言語に対応。
- Java (OpenJDK 23.0.1)
- Ruby (3.4.5)
- Elixir (1.18.4 (OTP 28.0.2))
- Python3 (CPython 3.13.7)
- JavaScript (Node.js 22.19.0)
- C++ (GCC 15.2.0)
- Rust (1.87.0)
- Erlang (28.0.2)
VSCode 上のターミナルで acc や oj を使って、そのまま利用可能。 コンテスト用ディレクトリは ~/contest/。
推奨は VS Code のタスク機能の利用。 2.1 に記述したタスクを tasks.json で設定済み。
- AtCoder: setup NEW contest(新規コンテスト参加)
- AtCoder: TEST code(コードのテスト)
- AtCoder: SUBMIT code(コードの提出)
- AtCoder: OPEN Task Page(問題ページをブラウザで開く)
タスク名:AtCoder: setup NEW contest
起動するとプロンプトが表示される。ここで abc101 などと入力すると、acc new abc101 --no-tests のようにコマンドを実行し各問題用ディレクトリを作成する。
テストケースは後述のコードテスト用タスクで自動ダウンロード。
このタスクは ~/contest/ ディレクトリ上で実行。
タスク名: AtCoder: TEST code
開いているソースコードを対象に oj t 相当のコマンドを実行。
ソースコードの拡張子を元に必要な -c オプションを追加。
テストケースはこのタスクの初回実行時に自動ダウンロード。
テストケースをセットアップ時にダウンロードしない理由は、提出タスクで余計なプロンプトを表示させないため。
タスク名: AtCoder: SUBMIT code
AtCoder の仕様変更により、このタスクはコンテスト開催時間中のみ利用可能。 それ以外の時間帯は手動で提出する必要がある。
開いているソースコードを対象に oj s 相当のコマンドを実行。
ソースコードの拡張子を元に -l オプションを推測。
間違う場合は各ディレクトリの makefile 中、該当言語用の OJ_SFLAGS で -l 指定を変更。
makefile はシンボリックリンクになっているため、一度変更すると他のディレクトリ中の makefile もすべて変更される。
タスク名: AtCoder: OPEN Task Page
開いているソースコードの対象の問題ページをローカルブラウザで開く。 このタスクのみ、コンテナ作成後一度だけ以下の操作が必要。
- VS Code で
ターミナル→新しいターミナルを開く - そのプロンプト上で
open-atcoderを実行 Codeで外部の Web サイトを開きますか?というダイアログが表示される- そのダイアログで
信頼されているドメインの構成をクリック https://atcoder.jp を信頼するを選択
このタスクはビルドタスクとして設定しているため、
ショートカット (Ctrl + Shift + b または Cmd + Shift + b)でも起動可能。
AtCoder ではビルド処理を実行することは少ないため、このような設定。
テストや提出をビルド処理に割り当てたい場合は tasks.json を変更。
これらのタスクは VS Code の Task Runner 拡張経由で実行可能。 Explorer ペイン中の "TASK RUNNER" から選択して実行。
Dev Container起動時に Task Runner Code拡張機能が自動インストールされる。 特別な設定やインストール作業は不要。
エクスプローラーパネル(左側サイドバー)に「TASK RUNNER」セクションが表示され、 設定済みタスクが一覧で表示される。 実行したいタスクをクリックするだけで実行可能。
手順例:
- エクスプローラーパネルを開く
- 「TASK RUNNER」セクションを展開
- 実行したいタスク(例:
AtCoder: TEST code)をクリック
この方法はコマンドパレットやショートカットキーよりも直感的で、初心者にもお勧め。
タスクの実行をショートカットに設定しておくと便利。
mac では Cmd + Shift + t, Windows では Ctrl + Shift + t に割り当てるのが推奨。
このキーは 閉じたエディタを再度開く 機能に割り当てられているが、
AtCoder 参加中にこの機能を使うことは少ない。
- mac の場合 Cmd + k Cmd + s, Windows の場合 Ctrl + k Ctrl + s を押して
キーボードショートカット画面を表示 - 検索窓に
タスクの実行を入力 タスク:タスクの実行の左側の+を押して、Cmd + Shift + tまたはCtrl + Shift + tを入力後 Enter
各ショートカットはコマンドラインからも利用可能。 補足として、これらのコマンドについて以下で説明する。 これらのコマンドについて理解・使用する必要はない。
これらのタスクを実行するために make を利用。 VS Code 上のターミナルで、該当する問題ディレクトリに移動後 make コマンドを実行可能。
新規コンテストセットアップタスクは acc を利用。
タスク間の差異を吸収するために am コマンドを用意している。
am new コマンドを利用。引数としてコンテスト名を与える。
例: am new abc039 で abc039 用のセットアップ。
abc コマンドで指定した abc またはその問題ディレクトリに移動。
arc コマンド、ahc コマンドで同様に arc, ahc の問題・ディレクトリに移動可能。
例: abc 039 で abc039 用ディレクトリに移動。
abc 039 a で abc039 の a問題ディレクトリに移動。
abc 039 a Main.java のようにファイル名まで指定すると、
指定の問題ディレクトリに移動したあとで指定ファイルを VS Code で開く。
各問題ディレクトリに移動したあと am o コマンドを実行すると、
そのディレクトリに対応した問題ページをブラウザで開く。
各問題ディレクトリに移動したあと am t コマンドに拡張子を引数として追加することで、その言語用プログラムのテストを走らせる。
例: am t .java のように実行。
拡張子の先頭の . を付け忘れないこと。
各問題ディレクトリに移動したあと am s コマンドに拡張子を引数として追加することで、その言語用プログラムを提出。
例: am s .java のように実行。
拡張子の先頭の . を付け忘れないこと。
https://github.com/smkwlab/atcoder-env
この環境は学生が AtCoder に参加する環境を構築することを念頭に開発した。 元は https://github.com/hinamimi/docker-atcoder から fork して開発を開始。 現在は差分が大きくなったため独立したリポジトリとしている。
コンテナイメージに新機能や修正が追加された場合、以下の手順で最新版を利用できる。
- VS Code で
Cmd/Ctrl + Shift + Pを押してコマンドパレットを開く - "Dev Containers: Rebuild Container Without Cache" を選択
この操作により、キャッシュをクリアして最新イメージから確実に再構築される。
cd /path/to/atcoder-env
docker compose down
docker compose pull
docker compose up -dその後、VS Code でフォルダを開き直す。
このリポジトリをテンプレートとして使用している場合、元のリポジトリの更新を取り込む方法。
テンプレートリポジトリから作成したリポジトリは、元のリポジトリとの接続がない。 最初に一度だけupstreamリモートを設定する必要がある。
# atcoder-envディレクトリで実行
git remote add upstream https://github.com/smkwlab/atcoder-env.git
git fetch upstream# 最新の更新を取得
git fetch upstream
# mainブランチに更新をマージ
git merge upstream/mainコンフリクトが発生した場合は手動で解決する。 特にテンプレートやスクリプトをカスタマイズしている場合は注意が必要。
マージ後、更新内容に応じて以下の対応が必要になる場合がある:
テンプレートファイル(atcoder-cli-nodejs/java/, atcoder-cli-nodejs/python/ 等)が更新された場合:
- 既存のコンテストディレクトリ: 自動では更新されない(既存のコードを保護するため)
- 新規コンテストディレクトリ:
am new実行時に自動的に新しいテンプレートを使用
既存のコンテストで新しいテンプレートを使いたい場合は、手動でコピーする:
# 例:Java のテンプレートを特定の問題ディレクトリにコピー
cp ~/.config/atcoder-cli-nodejs/java/Main.java ~/contest/abc123/a/bin/am, lib/.support/makefile などのスクリプトが更新された場合:
- bin/am: Dev Container を再起動すれば自動的に反映される
- makefile: シンボリックリンクのため、マージ後すぐに全コンテストディレクトリに反映される
.devcontainer/devcontainer.json や .vscode/tasks.json が更新された場合:
- VS Code で
Cmd/Ctrl + Shift + Pを押してコマンドパレットを開く - "Dev Containers: Rebuild Container" を選択
新規コンテストセットアップは acc の機能を利用。 Dev Container 内なら .config/atcoder-cli-nodejs/、 Dev Container 外なら atcoder-cli-nodejs/ に設定ファイルが存在。 このフォルダの config.json を編集することで挙動を変更可能。
デフォルトでコピーされるテンプレートファイルは java, python, cpp, ruby, elixir のもの。 これは config.json 中の default-template の値で変更可能。
各言語用テンプレートファイルはこのディレクトリ下の言語名ディレクトリ下にあるので、 好みに編集するのが推奨。
「AtCoder: setup NEW contest」タスクでコンテストをセットアップした後、自動的に開くファイルの言語を設定できる。
コンテナ初期化時に ~/.atcoder-default-lang ファイルが作成され、デフォルトは java に設定される。
# Python をデフォルトに変更
echo 'python' > ~/.atcoder-default-lang
# C++ をデフォルトに変更
echo 'cpp' > ~/.atcoder-default-lang
# 現在の設定を確認
cat ~/.atcoder-default-lang| 言語 | 設定値 | 開かれるファイル |
|---|---|---|
| Java | java |
Main.java |
| Python | python または py |
Main.py |
| C++ | cpp または c++ |
Main.cpp |
| Ruby | ruby または rb |
Main.rb |
| Elixir | elixir または ex |
Main.ex |
| Erlang | erlang または erl |
Main.erl |
| JavaScript | javascript または js |
Main.js |
| PHP | php |
Main.php |
| Rust | rust または rs |
main.rs |
環境変数 ATCODER_DEFAULT_LANG を設定することもできるが、~/.atcoder-default-lang ファイルが優先される。
プログラミング言語はファイルの拡張子で決定。
bin/am スクリプト内で判定。
shell script で書かれているが、それほど複雑ではないので変更・追加は容易。
このスクリプト内で設定した変数 PROG は次に説明する makefile 中で利用。
各プログラミング言語のバージョンは各タスク用ディレクトリ内の makefile で決定。
makefile は文法が若干特殊なので分かりにくいが、
基本的には OJ_SFLAGS という変数に適切な値を設定することで
oj コマンドでのコード提出時の言語指定を実現。
この makefile は UNIX のシンボリックリンクを用いて実態は一つ。 どこかのディレクトリ中の makefile を変更すると、すべての makefile が書き換わる。