9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[2026年版] WSL2 で AtCoder 環境を作り直した記録 (mise+uv+acc+oj+GitHub)

9
Last updated at Posted at 2025-11-23

この記事は 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 の取得

  1. Chrome 等で AtCoder にログインします。
  2. F12 キーで開発者ツールを開きます。
  3. [Application] タブ → 左側 [Cookies] → https://atcoder.jp を選択。
  4. 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 コマンドを実行できる状態になります。


普段の流れ

普段は次の流れで使っています。

  1. コンテスト準備

    # ワークスペースへ移動
    cd .../atcoder-workspace
    
    # 問題ディレクトリ作成
    acc new abc380
    
  2. コーディング

    VS Code で問題のファイルを開き、コードを書きます。

  3. テスト & 提出 (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 を完全に再起動する必要があります。

  1. Ubuntu のターミナルを閉じる。
  2. PowerShell で wsl --shutdown を実行。
  3. 再度 Ubuntu を開く。

これで機能するはずです。

Q. acs コマンドで「Compilation failed」になる

A. カレントディレクトリが間違っている可能性があります。
必ず abc380/a のように、main.cpp が存在するディレクトリの中に移動 してから実行してください。


まとめ

この構成で、自分は AtCoder 用の状態を atcoder-workspace と atcoder-cli の設定に寄せました。
完全自動提出は諦めましたが、テスト、コピー、提出ページ表示、Git 記録までは acs でまとめられます。
壊れやすい部分を AtCoder の Web UI に戻したので、少なくとも CLI 提出の仕様変更に振り回される範囲は減りました。

解いた問題の思考ログを Obsidian に残す運用も試しています。
うまく続いたら、そこは別の記事にします。

9
5
2

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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?