Skip to content

smkwlab/atcoder-env

Repository files navigation

AtCoder 参加用環境

このリポジトリをクローンし VS Code で開くと、Dev Container が環境を構築する。

AtCoder 用ツール acc, oj をインストール済み。 VS Code タスクを支援する独自ツールもインストール済み。

0. Dev Container 環境構築

以下のツールをインストールする。

1. 対応プログラミング言語

デフォルトのプログラミング言語は 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)

2. 使い方

VSCode 上のターミナルで acc や oj を使って、そのまま利用可能。 コンテスト用ディレクトリは ~/contest/。

推奨は VS Code のタスク機能の利用。 2.1 に記述したタスクを tasks.json で設定済み。

2.1 タスク一覧

  • AtCoder: setup NEW contest(新規コンテスト参加)
  • AtCoder: TEST code(コードのテスト)
  • AtCoder: SUBMIT code(コードの提出)
  • AtCoder: OPEN Task Page(問題ページをブラウザで開く)

2.1.1 新規コンテストセットアップタスク

タスク名:AtCoder: setup NEW contest

起動するとプロンプトが表示される。ここで abc101 などと入力すると、acc new abc101 --no-tests のようにコマンドを実行し各問題用ディレクトリを作成する。 テストケースは後述のコードテスト用タスクで自動ダウンロード。 このタスクは ~/contest/ ディレクトリ上で実行。

2.1.2 コードテスト用タスク

タスク名: AtCoder: TEST code

開いているソースコードを対象に oj t 相当のコマンドを実行。 ソースコードの拡張子を元に必要な -c オプションを追加。 テストケースはこのタスクの初回実行時に自動ダウンロード。 テストケースをセットアップ時にダウンロードしない理由は、提出タスクで余計なプロンプトを表示させないため。

2.1.3 コード提出用タスク

タスク名: AtCoder: SUBMIT code

AtCoder の仕様変更により、このタスクはコンテスト開催時間中のみ利用可能。 それ以外の時間帯は手動で提出する必要がある。

開いているソースコードを対象に oj s 相当のコマンドを実行。 ソースコードの拡張子を元に -l オプションを推測。 間違う場合は各ディレクトリの makefile 中、該当言語用の OJ_SFLAGS-l 指定を変更。 makefile はシンボリックリンクになっているため、一度変更すると他のディレクトリ中の makefile もすべて変更される。

2.1.4 問題ページ閲覧用タスク

タスク名: AtCoder: OPEN Task Page

開いているソースコードの対象の問題ページをローカルブラウザで開く。 このタスクのみ、コンテナ作成後一度だけ以下の操作が必要。

  1. VS Code で ターミナル新しいターミナル を開く
  2. そのプロンプト上で open-atcoder を実行
  3. Codeで外部の Web サイトを開きますか? というダイアログが表示される
  4. そのダイアログで 信頼されているドメインの構成 をクリック
  5. https://atcoder.jp を信頼する を選択

このタスクはビルドタスクとして設定しているため、 ショートカット (Ctrl + Shift + b または Cmd + Shift + b)でも起動可能。 AtCoder ではビルド処理を実行することは少ないため、このような設定。 テストや提出をビルド処理に割り当てたい場合は tasks.json を変更。

2.2 Task Runner拡張機能によるタスク実行

これらのタスクは VS Code の Task Runner 拡張経由で実行可能。 Explorer ペイン中の "TASK RUNNER" から選択して実行。

Dev Container起動時に Task Runner Code拡張機能が自動インストールされる。 特別な設定やインストール作業は不要。

エクスプローラーパネル(左側サイドバー)に「TASK RUNNER」セクションが表示され、 設定済みタスクが一覧で表示される。 実行したいタスクをクリックするだけで実行可能。

手順例:

  1. エクスプローラーパネルを開く
  2. 「TASK RUNNER」セクションを展開
  3. 実行したいタスク(例: AtCoder: TEST code)をクリック

この方法はコマンドパレットやショートカットキーよりも直感的で、初心者にもお勧め。

2.3 ショートカットキーによるタスク実行

タスクの実行をショートカットに設定しておくと便利。 mac では Cmd + Shift + t, Windows では Ctrl + Shift + t に割り当てるのが推奨。 このキーは 閉じたエディタを再度開く 機能に割り当てられているが、 AtCoder 参加中にこの機能を使うことは少ない。

2.3.1 ショートカットキー設定方法

  1. mac の場合 Cmd + k Cmd + s, Windows の場合 Ctrl + k Ctrl + s を押して キーボードショートカット 画面を表示
  2. 検索窓に タスクの実行 を入力
  3. タスク:タスクの実行 の左側の + を押して、Cmd + Shift + t または Ctrl + Shift + t を入力後 Enter

2.4 コマンドラインからのタスク実行

各ショートカットはコマンドラインからも利用可能。 補足として、これらのコマンドについて以下で説明する。 これらのコマンドについて理解・使用する必要はない。

これらのタスクを実行するために make を利用。 VS Code 上のターミナルで、該当する問題ディレクトリに移動後 make コマンドを実行可能。

新規コンテストセットアップタスクは acc を利用。

タスク間の差異を吸収するために am コマンドを用意している。

2.4.1 新規コンテストセットアップコマンド

am new コマンドを利用。引数としてコンテスト名を与える。 例: am new abc039 で abc039 用のセットアップ。

2.4.2 問題用ディレクトリ移動

abc コマンドで指定した abc またはその問題ディレクトリに移動。 arc コマンド、ahc コマンドで同様に arc, ahc の問題・ディレクトリに移動可能。

例: abc 039 で abc039 用ディレクトリに移動。 abc 039 a で abc039 の a問題ディレクトリに移動。

abc 039 a Main.java のようにファイル名まで指定すると、 指定の問題ディレクトリに移動したあとで指定ファイルを VS Code で開く。

2.4.3 問題ページ閲覧用コマンド

各問題ディレクトリに移動したあと am o コマンドを実行すると、 そのディレクトリに対応した問題ページをブラウザで開く。

2.4.4 コードテスト用コマンド

各問題ディレクトリに移動したあと am t コマンドに拡張子を引数として追加することで、その言語用プログラムのテストを走らせる。 例: am t .java のように実行。 拡張子の先頭の . を付け忘れないこと。

2.4.5 コード提出用コマンド

各問題ディレクトリに移動したあと am s コマンドに拡張子を引数として追加することで、その言語用プログラムを提出。 例: am s .java のように実行。 拡張子の先頭の . を付け忘れないこと。

3. GitHub repository

https://github.com/smkwlab/atcoder-env

この環境は学生が AtCoder に参加する環境を構築することを念頭に開発した。 元は https://github.com/hinamimi/docker-atcoder から fork して開発を開始。 現在は差分が大きくなったため独立したリポジトリとしている。

4. コンテナイメージの更新

コンテナイメージに新機能や修正が追加された場合、以下の手順で最新版を利用できる。

4.1 VS Code からの更新(推奨)

  1. VS Code で Cmd/Ctrl + Shift + P を押してコマンドパレットを開く
  2. "Dev Containers: Rebuild Container Without Cache" を選択

この操作により、キャッシュをクリアして最新イメージから確実に再構築される。

4.2 コマンドラインからの更新

cd /path/to/atcoder-env
docker compose down
docker compose pull
docker compose up -d

その後、VS Code でフォルダを開き直す。

5. テンプレートやスクリプトの更新

このリポジトリをテンプレートとして使用している場合、元のリポジトリの更新を取り込む方法。

5.1 初回のみ:upstreamリモートの設定

テンプレートリポジトリから作成したリポジトリは、元のリポジトリとの接続がない。 最初に一度だけupstreamリモートを設定する必要がある。

# atcoder-envディレクトリで実行
git remote add upstream https://github.com/smkwlab/atcoder-env.git
git fetch upstream

5.2 更新の取得とマージ

# 最新の更新を取得
git fetch upstream

# mainブランチに更新をマージ
git merge upstream/main

コンフリクトが発生した場合は手動で解決する。 特にテンプレートやスクリプトをカスタマイズしている場合は注意が必要。

5.3 更新内容の反映

マージ後、更新内容に応じて以下の対応が必要になる場合がある:

5.3.1 テンプレートファイルの更新

テンプレートファイル(atcoder-cli-nodejs/java/, atcoder-cli-nodejs/python/ 等)が更新された場合:

  • 既存のコンテストディレクトリ: 自動では更新されない(既存のコードを保護するため)
  • 新規コンテストディレクトリ: am new 実行時に自動的に新しいテンプレートを使用

既存のコンテストで新しいテンプレートを使いたい場合は、手動でコピーする:

# 例:Java のテンプレートを特定の問題ディレクトリにコピー
cp ~/.config/atcoder-cli-nodejs/java/Main.java ~/contest/abc123/a/

5.3.2 スクリプトやmakefileの更新

bin/am, lib/.support/makefile などのスクリプトが更新された場合:

  • bin/am: Dev Container を再起動すれば自動的に反映される
  • makefile: シンボリックリンクのため、マージ後すぐに全コンテストディレクトリに反映される

5.3.3 Dev Container設定の更新

.devcontainer/devcontainer.json.vscode/tasks.json が更新された場合:

  1. VS Code で Cmd/Ctrl + Shift + P を押してコマンドパレットを開く
  2. "Dev Containers: Rebuild Container" を選択

6. カスタマイズ

6.1 新規コンテストセットアップ時

新規コンテストセットアップは acc の機能を利用。 Dev Container 内なら .config/atcoder-cli-nodejs/、 Dev Container 外なら atcoder-cli-nodejs/ に設定ファイルが存在。 このフォルダの config.json を編集することで挙動を変更可能。

デフォルトでコピーされるテンプレートファイルは java, python, cpp, ruby, elixir のもの。 これは config.json 中の default-template の値で変更可能。

各言語用テンプレートファイルはこのディレクトリ下の言語名ディレクトリ下にあるので、 好みに編集するのが推奨。

6.2 デフォルト言語の設定

「AtCoder: setup NEW contest」タスクでコンテストをセットアップした後、自動的に開くファイルの言語を設定できる。

コンテナ初期化時に ~/.atcoder-default-lang ファイルが作成され、デフォルトは java に設定される。

6.2.1 設定の変更

# Python をデフォルトに変更
echo 'python' > ~/.atcoder-default-lang

# C++ をデフォルトに変更
echo 'cpp' > ~/.atcoder-default-lang

# 現在の設定を確認
cat ~/.atcoder-default-lang

6.2.2 対応言語

言語 設定値 開かれるファイル
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

6.2.3 高度な設定

環境変数 ATCODER_DEFAULT_LANG を設定することもできるが、~/.atcoder-default-lang ファイルが優先される。

6.3 コード提出時言語選択

プログラミング言語はファイルの拡張子で決定。 bin/am スクリプト内で判定。 shell script で書かれているが、それほど複雑ではないので変更・追加は容易。 このスクリプト内で設定した変数 PROG は次に説明する makefile 中で利用。

各プログラミング言語のバージョンは各タスク用ディレクトリ内の makefile で決定。 makefile は文法が若干特殊なので分かりにくいが、 基本的には OJ_SFLAGS という変数に適切な値を設定することで oj コマンドでのコード提出時の言語指定を実現。

この makefile は UNIX のシンボリックリンクを用いて実態は一つ。 どこかのディレクトリ中の makefile を変更すると、すべての makefile が書き換わる。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published