この記事は Qiita Advent Calendar 2025 全国学生対抗戦 のシリーズ7, 1日目の記事です
はじめに
AtCoderの環境構築で、pip install でシステム環境を汚したり、Node.jsのバージョン管理で消耗していませんか?
また、CLIツールからの自動提出 (oj submit) がAtCoderのサイト仕様変更で頻繁にエラーになることに疲れていませんか?
本記事では、2025年時点のモダンなツールチェーン(mise, uv, pnpm)を駆使して、「システムを汚さず、高速で、メンテナンスが楽な環境」 を構築します。
さらに、頻繁に壊れる自動提出機能に見切りをつけ、「テスト合格 → クリップボードにコピー → ブラウザ起動 → Git記録」 を一撃で行う、堅牢な半自動ワークフローを提案します。
本記事で構築するディレクトリ構成のゴールイメージです。
ghq で管理するワークスペースと、acc の設定ファイルの2箇所を整備します。
# 1. 精進用ワークスペース (GitHub連携)
~/src/[github.com/ユーザー名/atcoder-workspace/](https://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
採用する技術スタック
「早い・汚さない・管理しやすい」を基準に選定しています。
| ツール | 役割 | 選定理由 |
|---|---|---|
| mise | ランタイム管理 | asdfのRust製高速版。Node, Python, ghq等を一元管理。 |
| uv | Python管理 | pipの爆速代替。仮想環境分離が容易。 |
| pnpm | Node管理 | ディスク容量に優しく高速。 |
| acc | コンテスト管理 | ディレクトリ作成やテストケースDL用。 |
| oj | テスト実行 | 高速なテスト実行用。 |
| ghq | リポジトリ管理 | ソースコードの散逸を防ぐ。 |
手順1: ベース環境の構築 (mise & wslu)
まず、システムの apt に依存せず、モダンなパッケージマネージャー mise を導入します。また、WSLからブラウザを制御するための 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 use -g node@lts
mise use -g python@latest
mise use -g pnpm@latest
mise use -g ghq fzf
手順2: 競プロツールの導入
acc と oj をインストールします。依存関係が競合しないよう、それぞれ適切なマネージャーを使います。
# atcoder-cli (acc) の導入
pnpm add -g atcoder-cli
# online-judge-tools (oj) の導入
# uv tool を使うことで、独立したPython環境にインストールされます(重要)
uv tool install online-judge-tools
手順3: ログイン設定 (aclogin)
最近の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 と表示されれば成功です。
手順4: 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
手順5: テンプレートと設定の最適化
acc と oj の連携をスムーズにします。特にディレクトリ名(tests vs 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
手順6: 最強の運用フロー「acsコマンド」
ここが本記事のハイライトです。
oj submit コマンドは便利ですが、サイトのHTML構造が変わるたびに動かなくなります。
そこで、「テスト合格 → クリップボードにコピー → ブラウザ起動 → 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 "👉 Just Paste (Ctrl+V) and Submit!"
else
echo "❌ Tests failed."
fi
}
追記したら source ~/.zshrc で反映させます。
実際の精進フロー
環境構築お疲れ様でした。これからの精進は以下のリズムで行えます。
-
コンテスト準備
# ワークスペースへ移動 # ghq+fzfを入れているなら `repo atcoder` などで爆速移動可能 cd .../atcoder-workspace # 問題ディレクトリ作成 acc new abc380 -
コーディング
# 必ず「問題のディレクトリ」に移動する cd abc380/a # VS Code等で main.cpp を編集 code . -
テスト & 提出 (acs)
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. 👉 Just Paste (Ctrl+V) and Submit!
トラブルシューティング
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 が存在するディレクトリの中に移動 してから実行してください。
まとめ & 次回予告
環境構築は「精進するための準備」であり、それ自体が目的ではありません。
この構成なら、PCを買い替えてもすぐに最強の環境を再現できます。
また、解いた問題はObsidianで手早く思考ログを残せないかなども検証中なので、上手くできたらまとめる予定です。乞うご期待!
Happy Hacking & Enjoy AtCoder!