1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[2025年版] WSL2で構築する「絶対に壊れない」AtCoder最強環境 (mise + uv + acc + oj + GitHub)

Last updated at Posted at 2025-11-23

この記事は 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: 競プロツールの導入

accoj をインストールします。依存関係が競合しないよう、それぞれ適切なマネージャーを使います。

# 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の取得

  1. Chrome等で AtCoder にログインします。
  2. F12 キーで開発者ツールを開きます。
  3. [Application] タブ → 左側 [Cookies]https://atcoder.jp を選択。
  4. 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: テンプレートと設定の最適化

accoj の連携をスムーズにします。特にディレクトリ名(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 で反映させます。


実際の精進フロー

環境構築お疲れ様でした。これからの精進は以下のリズムで行えます。

  1. コンテスト準備

    # ワークスペースへ移動
    # ghq+fzfを入れているなら `repo atcoder` などで爆速移動可能
    cd .../atcoder-workspace
    
    # 問題ディレクトリ作成
    acc new abc380
    
  2. コーディング

    # 必ず「問題のディレクトリ」に移動する
    cd abc380/a
    
    # VS Code等で main.cpp を編集
    code .
    
  3. テスト & 提出 (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を完全に再起動する必要があります。

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

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

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

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


まとめ & 次回予告

環境構築は「精進するための準備」であり、それ自体が目的ではありません。
この構成なら、PCを買い替えてもすぐに最強の環境を再現できます。

また、解いた問題はObsidianで手早く思考ログを残せないかなども検証中なので、上手くできたらまとめる予定です。乞うご期待!

Happy Hacking & Enjoy AtCoder!

1
0
0

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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?