この記事は Qiita Advent Calendar 2025 全国学生対抗戦 のシリーズ 7, 1 日目の記事です
はじめに
こんにちは。Hyd3-14 です。
AtCoder 用の環境を、WSL2 上で作り直しました。
以前から気になっていたのは、pip install や Node.js のバージョン管理で環境が散らかることと、CLI ツールからの自動提出 (oj submit) が AtCoder 側の変更で壊れやすいことです。
この記事の目的は、完全な自動提出環境を作ることではありません。
むしろ oj submit は諦めて、壊れやすい部分を AtCoder の Web UI に戻します。
そのうえで、acc new、oj t、ブラウザ提出、Git 記録までを自分の手元で回せる状態にします。
想定している読者は、Windows 11 + WSL2 + VS Code で AtCoder を始める人、または既存の競プロ環境を作り直したい人です。
この記事では C++ を前提にします。
最終的なディレクトリ構成のイメージです。
ghq で管理するワークスペースと、acc の設定ファイルの 2 箇所を整備します。
# 1. AtCoder 用ワークスペース (GitHub連携)
~/src/github.com/ユーザー名/atcoder-workspace/
├── .gitignore # 生成ファイルを除外する設定
├── abc380/ # コンテスト単位のフォルダ
│ ├── a/ # 問題単位のフォルダ
│ │ ├── main.cpp # 提出するソースコード
│ │ └── test/ # テストケース (ojで自動DL)
│ ├── b/
│ └── ...
└── ...
# 2. テンプレート設定 (atcoder-cli)
~/.config/atcoder-cli-nodejs/
└── cpp/
├── main.cpp # 雛形となるコード
└── template.json # 生成ルールの定義
前提環境
- OS: Windows 11
- WSL2: Ubuntu 24.04 (または 22.04)
- Shell: zsh (bash でも可)
- Compiler: GCC (build-essential)
- Editor: VS Code
この記事で作る状態
-
acc new abc380で問題ディレクトリを作れる -
oj tでサンプルテストを実行できる - 提出はブラウザで行う
- テスト後のコピー、提出ページ表示、Git 記録を
acs関数でまとめる
変更が必要な値は次のとおりです。
| 値 | 使う場所 | 例 |
|---|---|---|
YOUR_USER_ID |
GitHub リポジトリのパス | Hyd3-14 |
| C++ テンプレート | ~/.config/atcoder-cli-nodejs/cpp/main.cpp |
自分の普段の雛形 |
| VS Code ショートカット | ターミナルを開く操作 | Ctrl + [ |
採用する技術スタック
私は「ユーザー領域に寄せる」「復元する場所を減らす」を基準に選びました。
| ツール | 役割 | 選定理由 |
|---|---|---|
| mise | ランタイム管理 | Node, Python, ghq などをユーザー領域でまとめて管理する。 |
| uv | Python 管理 |
oj をシステムの Python から切り離す。 |
| pnpm | Node 管理 |
acc の導入に使う。 |
| acc | コンテスト管理 | ディレクトリ作成やテストケース DL 用。 |
| oj | テスト実行 | 高速なテスト実行用。 |
| ghq | リポジトリ管理 | ソースコードの散逸を防ぐ。 |
mise と wslu
Node.js、Python、ghq などは apt ではなく mise で管理します。
PC 移行時に復元する場所を減らしたいからです。
また、WSL から Windows 側のブラウザを開くために wslu も入れます。
# 1. システムの更新と wslu, コンパイラのインストール
sudo apt update
# wslu (ブラウザ連携用) と build-essential (g++用) を入れます
sudo apt install -y wslu build-essential
# 2. mise (ランタイムマネージャー) のインストール
curl https://mise.run | sh
# 3. パスの設定 (zshの場合)
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc
# 4. 言語ランタイムとツールのインストール
# Node.js, Python, pnpm などを mise 管理に寄せます
mise use -g node@lts
mise use -g python@latest
mise use -g pnpm@latest
mise use -g ghq fzf
acc と oj
acc と oj をインストールします。
acc は Node.js 側、oj は Python 側のツールなので、導入経路を分けます。
ここで oj を uv tool に入れておくと、システムの Python 環境に混ぜずに済みます。
# atcoder-cli (acc) の導入
pnpm add -g atcoder-cli
# online-judge-tools (oj) の導入
# uv tool を使い、独立した Python 環境にインストールします
uv tool install online-judge-tools
AtCoder のログイン
最近の AtCoder はセキュリティ(reCAPTCHA 等)が強化されており、通常の CLI ログインコマンドは失敗することが多いです。
私はここで何度か詰まったので、ブラウザのセッション情報を引き継ぐ aclogin を使います。
1. ツールのインストール
npm 公式には登録されていないため、GitHub から直接インストールします。
pnpm add -g key-moon/aclogin
2. セッション ID の取得
- Chrome 等で AtCoder にログインします。
-
F12キーで開発者ツールを開きます。 -
[Application] タブ → 左側 [Cookies] →
https://atcoder.jpを選択。 -
REVEL_SESSIONという項目の「値 (Value)」をコピーします(%3D...等で終わる長い文字列)。
3. ログイン実行
ターミナルで以下を実行し、コピーした値を貼り付けます。
aclogin
※ 検知されたツール: oj, acc と表示されれば成功です。
GitHub リポジトリ
精進記録を管理するためのリポジトリを作成します。ghq 管理下に置くことで迷子になりません。
1. リポジトリの作成
GitHub CLI (gh) を使います(未導入なら mise use -g gh)。
※注意: YOUR_USER_ID の部分はご自身の GitHub ユーザー名に書き換えてください
# プライベートリポジトリを作成し、ghq配下に配置
gh repo create atcoder-workspace --private --clone
# 作成されたディレクトリへ移動
cd $(ghq root)/github.com/YOUR_USER_ID/atcoder-workspace
2. .gitignore の設定
競プロではテストケース、実行ファイル、入力メモなどが増えます。
私は提出コードと設定だけを残したいので、これらを Git 管理から除外します。
atcoder-workspace ディレクトリ直下で実行してください。
cat << 'EOF' > .gitignore
# コンパイル済みバイナリ
*.out
*.exe
# テストケースと結果
test/
tests/
*.in
*.txt
# accの一時ファイル
.acc/
!/.acc/config.json
!/.acc/template.json
EOF
# 初期コミット
git add .
git commit -m "Initial commit"
git push -u origin main
acc のテンプレート
acc と oj のテストディレクトリ名を合わせます。
tests と test が混ざると毎回小さく引っかかるので、ここでは test に寄せます。
# 1. C++テンプレートをデフォルトにする
acc config default-template cpp
# 2. テストディレクトリ名を "test" (単数形) に統一
acc config default-test-dirname-format test
次に、コードの雛形を作成します。
# 設定ディレクトリの作成
mkdir -p ~/.config/atcoder-cli-nodejs/cpp
# template.json (accの設定)
cat << 'EOF' > ~/.config/atcoder-cli-nodejs/cpp/template.json
{
"task": {
"program": ["main.cpp"],
"submit": "main.cpp"
}
}
EOF
# main.cpp (C++の雛形)
# ※ご自身のテンプレートに合わせて書き換えてください
cat << 'EOF' > ~/.config/atcoder-cli-nodejs/cpp/main.cpp
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
int main() {
// Code here
return 0;
}
EOF
提出は自動化しない
oj submit は使えれば楽ですが、AtCoder 側の HTML 構造やログイン状態に左右されます。
私の用途では、ここを頑張って直し続けるより、提出ボタンだけ手動で押すほうが楽でした。
そこで、oj submit は使いません。
代わりに、テスト後のコピー、提出ページ表示、Git 記録をまとめる acs 関数を作ります。
最後の提出だけはブラウザで行います。
~/.zshrc (または ~/.bashrc) に以下を追記してください。
※注意: YOUR_USER_ID の部分はご自身の GitHub ユーザー名に書き換えてください
# AtCoderワークスペースのルートパス(ghqを使っている場合)
export ATCODER_ROOT="$(ghq root)/github.com/YOUR_USER_ID/atcoder-workspace"
function acs() {
echo "🧪 Running tests..."
# 1. コンパイル
g++ main.cpp
if [ $? -ne 0 ]; then
echo "❌ Compilation failed."
return 1
fi
# 2. テスト実行
# ojはカレントディレクトリの test/ を自動参照します
oj t -c "./a.out"
if [ $? -eq 0 ]; then
echo "✅ Tests passed!"
# 3. コードをクリップボードにコピー (WSL2の clip.exe を利用)
cat main.cpp | clip.exe
echo "📋 Code copied to clipboard!"
# 4. 提出ページをブラウザで開く
# 現在のディレクトリ名から問題IDを推測してURL生成
CONTEST_DIR=$(basename $(dirname $(pwd))) # 例: abc380
TASK_DIR=$(basename $(pwd)) # 例: a
TASK_ID="${CONTEST_DIR}_${TASK_DIR}" # 例: abc380_a
SUBMIT_URL="https://atcoder.jp/contests/${CONTEST_DIR}/submit?taskScreenName=${TASK_ID}"
# wslu (wslview) でWindows側のブラウザを起動
wslview "$SUBMIT_URL"
# 5. Git記録
echo "🚀 Committing to Git..."
pushd "$ATCODER_ROOT" > /dev/null
git add .
git commit -m "Solved: ${TASK_ID} at $(date +'%Y-%m-%d %H:%M')"
popd > /dev/null
echo "💾 Git recorded."
echo "👉 ブラウザで貼り付けて提出してください。"
else
echo "❌ Tests failed."
fi
}
追記したら source ~/.zshrc で反映させます。
VS Code から実行する
acs コマンドをすぐ実行できるように、VS Code にあるキーボードショートカットを設定します。
それは ターミナル: カスタム作業ディレクトリで新しいターミナルの作成を開始する です。
私はこれを Ctrl + [ に割り当てています。
これにより、たとえば abc380/a/main.cpp を開いている状態で Ctrl + [ を押すと、そのディレクトリで新しいターミナルが開きます。つまり、すぐに acs コマンドを実行できる状態になります。
普段の流れ
普段は次の流れで使っています。
-
コンテスト準備
# ワークスペースへ移動 cd .../atcoder-workspace # 問題ディレクトリ作成 acc new abc380 -
コーディング
VS Code で問題のファイルを開き、コードを書きます。
-
テスト & 提出 (acs)
問題のファイル (
abc380/a/main.cppなど) を編集し終わったら、先程割り当てたショートカットキー (例:Ctrl + [) でターミナルを開き、以下を実行します。acs- コンパイル & テストが走る
- テストが通った場合だけ、ブラウザで提出画面が開き、コードがコピーされる
- ブラウザ上で
Ctrl+Vして提出する - 同時に Git へコミットする
- 以下が実際に
abc380/aを提出したときの実行結果です。
➜ a git:(master) acs 🧪 Running tests... [INFO] online-judge-tools 11.5.1 (+ online-judge-api-client 10.10.1) [INFO] 4 cases found [INFO] sample-1 [INFO] time: 0.003073 sec [SUCCESS] AC [INFO] sample-2 [INFO] time: 0.004576 sec [SUCCESS] AC [INFO] sample-3 [INFO] time: 0.004732 sec [SUCCESS] AC [INFO] sample-4 [INFO] time: 0.004208 sec [SUCCESS] AC [INFO] slowest: 0.004732 sec (for sample-3) [INFO] max memory: 3.456000 MB (for sample-1) [SUCCESS] test success: 4 cases ✅ Tests passed! 📋 Code copied to clipboard! 🌍 Opening submit page: https://atcoder.jp/contests/abc380/submit?taskScreenName=abc380_a 🚀 Committing to Git... On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean 💾 Git recorded. 👉 ブラウザで貼り付けて提出してください。
トラブルシューティング
Q. ブラウザが開かない / クリップボードにコピーされない
A. WSL2 と Windows の連携機能が無効になっている可能性があります。以下のコマンドでエラーが出ないか確認してください。
cat /proc/sys/fs/binfmt_misc/WSLInterop
もし No such file... や WSL Interoperability is disabled といったエラーが出る場合は、一度 WSL を完全に再起動する必要があります。
- Ubuntu のターミナルを閉じる。
- PowerShell で
wsl --shutdownを実行。 - 再度 Ubuntu を開く。
これで機能するはずです。
Q. acs コマンドで「Compilation failed」になる
A. カレントディレクトリが間違っている可能性があります。
必ず abc380/a のように、main.cpp が存在するディレクトリの中に移動 してから実行してください。
まとめ
この構成で、自分は AtCoder 用の状態を atcoder-workspace と atcoder-cli の設定に寄せました。
完全自動提出は諦めましたが、テスト、コピー、提出ページ表示、Git 記録までは acs でまとめられます。
壊れやすい部分を AtCoder の Web UI に戻したので、少なくとも CLI 提出の仕様変更に振り回される範囲は減りました。
解いた問題の思考ログを Obsidian に残す運用も試しています。
うまく続いたら、そこは別の記事にします。