【VSCode + WSL】AtCoder 用の C++ 環境構築をしてみた。 ~ WSL 導入から Git によるソースコード管理まで ~
はじめに
国内で最も人気のある競技プログラミングプラットフォームである AtCoder に対して本腰を入れて取り組むうえで、ローカルでのプログラム実行環境は必須である。
特に C++ を使用する場合、コンパイルやデバッグの環境構築が必要になるため、慣れないうちはハードルが高い。 私は初めてやったときに3日ほど費やした記憶がある。
そこで今回は、 Windows で VScode を利用して、 AtCoder 用の C++ 環境構築をする手順についてまとめていく。
一部内容は 2024 年 3 月時点のものであることに注意。基本的に、パッケージ類は最新版のものをインストールして良い。
環境構築の目標と前提条件
Windows 上で直接環境構築を行うと、元々の Windows の環境を汚してしまうことになり個人的にあまり好きではないので、今回は WSL を使うことで Linux の仮想環境上に C++ のローカル実行環境を構築することにする。
どのような環境を作るのか
- コンテストが始まったら、 VScode 上でそのコンテストのディレクトリを作成し、各問題ごとに提出用ファイルを作成する。
- プログラムを書き終えたらそのプログラムをビルド。
- VScode 上で自動でサンプルケースを回し、結果を表示。
- 出力が合わなければ適宜デバッグを実行。
- 最終的に VScode からコマンドラインで提出を行い、ブラウザでジャッジ結果を確認する。
- コンテスト終了後、 Git を利用してプログラムを Github リポジトリに記録・保存。
理想的な VScode 上のディレクトリ構成はこんな感じ。
root/
└ AtcoderSolution/
├ (コンテスト名)/
| ├ (問題番号)/
| | ├ test/ # テストケース
| | | ├ sample-1.in
| | | └ sample-1.out
| | └ main.cpp # 提出用ファイル
├ a.out # 実行用ファイル
└ debug.in # デバッグ用のケース入力用ファイル
前提条件
- OS が Windows である。
- VSCode をインストール済み。
- AtCoder のアカウント作成済み。
WSL を VSCode 上で使えるようにする

こちらを参考にしながら、まずは VSCode 上に WSL の環境を構築していく。
WSL をインストールする
- VSCode 拡張機能「WSL」をインストール。
- アクティビティバーに追加された「リモートエクスプローラー」をひらき、「WSLターゲット」>「ディストリビューションを追加する」>「Ubuntu (最新LTSバージョン)」を選択。
default UNIX user accountを作成。ユーザネームとパスワードを入力する。このとき、パスワードは入力しても表示されないので注意。- インストール完了後、左下の「≶」のようなボタンを押して Remote 環境に移行する。
以降はこの Remote 環境上でコマンドを実行していく。
WSL 環境に gcc と g++ をインストールする
前項で作成した WSL 環境に、 C++ のコンパイラである gcc と g++ をインストールする。
- とりあえず、 gcc と g++ のインストール状況を確認。
> $ gcc --version
> $ g++ --version
- インストールされていない場合は、以下のコマンドでインストールする。
> $ sudo apt install gcc
- fetch に関するエラーが出たら、
apt-get(パッケージ管理コマンド)を更新。
> $ sudo apt-get update
私の環境では参考記事で記載されていた以下のエラーは起こらなかったので、先を進める。
> E: Release file for http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease is not valid yet (invalid for another 20h 18min 53s). Updates for this repository will not be applied.
build-essentialをインストール。
> $ sudo apt-get install build-essential
- インストールの確認。バージョン情報が表示されれば成功
> $ gcc --version
> $ g++ --version
上記のコマンド実行で gcc や g++ のバージョンが11.x.xだった場合は、 AtCoder のジャッジアップデートで対応した C++20 や C++23 の機能が使えない。
この記事を参考にしてバージョン12.x.xのコンパイラをインストールすることを推奨する。
WSL 環境に C++ 用の拡張機能をインストールする
以下の拡張機能を好みに応じてインストールする。太字のものは必須の拡張機能。打消線のものは既に非推奨となっている。
- C/C++ Extension Pack (C/C++, C/C++ Themes, CMake, CMake Tools が同梱)
- Command Runner
IntellicodeIntellicode API Usage Examples (Intellicode 導入で自動インストール)- Project Manager
- zenkaku
- Path Autocomoplete
- Markdown Preview Enhanced
- Material Icon Theme
- indent-rainbow
- Include Autocomplete
- Git Extension Pack
- Git History
- gitignore
- Git Graph
AtCoder Library (ACL) を導入する
ACL とは、AtCoder 公式が提供している C++ 用のライブラリである。 AtCoder の問題でよく使われるアルゴリズムやデータ構造をライブラリ化したもので、これはジャッジサーバにもあらかじめ組み込まれているので、 AtCoder で C++ を使っている人は導入しておいて損はないだろう。
- AtCoder 用のディレクトリを作成する。理想のディレクトリ構成の図に従って、ここでは
AtCoderSolutionとした。
> $ mkdir AtCoderSolution
-
VScode のコマンドパレットを開き、「WSL: Open Folder in WSL...」>「
/home/(user-name)/AtCoderSolution」を選択。以降はこのディレクトリ下でコマンドを実行する。 -
続いて、 ACL を以下のリンクから zip 形式でダウンロード。わかりやすいところに展開しておく。

- Windows のエクスプローラーで
AtCoderSolutionディレクトリを開く。
> $ explorer.exe .
- ダウンロードした
ac-libraryフォルダをAtCoderSolutionディレクトリにコピー。
以上で、ACL の導入は完了である。
atcoder-cli (acc) と online-judge-tools (oj) をインストールする

次にこの記事を主に参照しながら、VScode 上からテストケースのダウンロード、ソースコードの提出を自動で行えるようになる acc と、テストケースの自動実行をしてくれる oj を WSL 環境にインストールしていく。 ここで、 npm を導入していない場合は、上記記事中で紹介されているこの記事を参考にする。

また、pip3 も導入していない場合は、以下に示す acc 開発者のブログを参考にすると良い。
- とりあえず pip3 と npm のバージョンを確認する。
> $ pip3 --version
> $ npm --version
- インストールされていない場合は、以下のコマンドでまずは pip3 からインストールする。
> $ sudo apt-get install python3
> $ sudo apt install python3-pip
- 続いて、 npm をインストールする。
> $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
- 実行後、一度ターミナルを再起動し、以下のコマンドを実行する。
> $ nvm install node
> $ npm install -g npm
- 再び pip3 と npm のバージョンを確認する。バージョン情報が表示されれば成功。
> $ pip3 --version
> $ npm --version
- 次に、acc をインストールし、ヘルプコマンドを実行して動作確認。使用可能コマンド一覧が表示されれば成功。
> $ npm install -g atcoder-cli
> $ acc -h
- さらに、oj をインストールする。
> $ pip3 install online-judge-tools
- このとき、私の環境では以下のような警告が出た。
> WARNING: The script normalizer is installed in '/home/(user-name)/.local/bin' which is not on PATH.
> Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
> WARNING: The script jsonschema is installed in '/home/(user-name)/.local/bin' which is not on PATH.
> Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
> WARNING: The script oj-api is installed in '/home/(userr-name)/.local/bin' which is not on PATH.
> Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
> WARNING: The script oj is installed in '/home/(user-name)/.local/bin' which is not on PATH.
> Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
- どうやら、 PATH が通っていないらしいので、
~/.bashrcを開き、以下の内容を追記。
> export PATH="$PATH:/home/(user-name)/.local/bin"
- ターミナルを再起動して、以下のコマンドを実行したときにバージョン情報が表示されれば成功。
> $ oj -h
WSL 環境上で AtCoder にログインする
AtCoder社のDDoS攻撃対策の一環で、ログイン時やソースコード提出時に CAPTCHA 認証が導入された。

これによる acc や oj の不具合について、この記事でも極力対応しているつもりだが、不備がある可能性があることに注意。
前項で示した記事、あるいは以下に示す acc 開発者のブログを参考に進める。
- まず、acc と oj の連携状態を確認する。
availableと表示されれば OK。
> $ acc check-oj
acc で AtCoder にログインする
次に、 acc から AtCoder にログインを行う。以前はコマンドラインから簡単にできたが、現在は CAPTCHA 認証が導入されてしまったため、ブラウザで一度ログインした上でそのセッション情報を acc に渡す必要がある。
- ブラウザで AtCoder にログインしている状態で、(Chromeの場合は)
Ctrl + Shift + Iでディベロッパーツールを開き、「アプリケーション」タブを選択。左のサイドバーから「Cookie」>「 https://atcoder.jp 」を選択し、REVEL_SESSIONという名前の変数の値をコピーしておく。

- 続けて以下のコマンドを実行し、 acc の設定ファイルが配置されたディレクトリ
config-dirのパスを調べる。
> $ acc config-dir
config-dirディレクトリ配下のsession.jsonを開き(なければ新たに作成)、先ほどのREVEL_SESSIONの値を記述して保存する。
1.{2. "cookies": ["REVEL_FLASH=", "REVEL_SESSION=(ここにコピペ)"]3.}-以下のコマンドを実行し、you logged-in alreadyと表示されれば成功。
> $ acc login
oj で AtCoder にログインする
oj でも同様にログインを行う。こちらも CAPTCHA 認証を回避するため、セッション情報を oj に渡す必要がある。
- 以下のコマンドを実行し、
cookie.jarファイルのパスを確認する。
> $ oj -h
以下のような結果が返ってくるはず。
...
options:
-h, --help show this help message and exit
-v, --verbose
-c COOKIE, --cookie COOKIE
path to cookie. (default: /home/yuulis/.local/share/online-judge-tools/cookie.jar) # <- ココ
--version print the online-judge-tools version number
...
cookie.jarファイルを開き、先ほどのREVEL_SESSIONの値を記述して保存する。
#LWP-Cookies-2.0
Set-Cookie3: REVEL_FLASH=""; path="/"; domain="atcoder.jp"; path_spec; secure; discard; HttpOnly=None; version=0
Set-Cookie3: REVEL_SESSION="(ここにコピペ)"; path="/"; domain="atcoder.jp"; path_spec; secure; expires="2026-09-03 13:40:02Z"; HttpOnly=None; version=0
- 以下のコマンドを実行し、
[SUCCESS] You have already signed in.と表示されれば成功。
> $ oj login https://beta.atcoder.jp/
ブラウザでログインしているセッションが切れてしまうと、 acc / oj からのログインもできなくなってしまうので注意。セッションが切れてしまった場合は、再度ブラウザでログインし、上記の手順を繰り返す必要がある。
これまでの経験から、大体半年くらいでセッションが切れるようだ。
atcoder-cli の設定をする
コンテスト開始時の自動ファイル生成や提出用ファイルのテンプレートを作成するための acc の設定をしていく。
- 以下のコマンドを実行して、コンテスト開始時に1回で全ての問題用ファイルを生成するように設定を変更する。
> $ acc config default-task-choice all
次に、提出用ファイルのテンプレートを作成する。
- acc の設定ファイルが配置されたディレクトリ
config-dirに移動し、cppというディレクトリを作成する。このディレクトリ名がテンプレート名となる。
> $ cd acc config-dir
> $ mkdir cpp
cppディレクトリ下に、テンプレート用の C++ ファイル(今回はmain.cppとした)とtemplate.jsonを作成する。template.jsonには以下の内容を記述する。
1.{2. "task": {3. "program": ["main.cpp"],4. "submit": "main.cpp"5. }6.}- テンプレート用の C++ ファイルに自分好みの内容を記述後、そのテンプレートが認識されているか確認する。
cppという項目が表示されていれば成功。
> $ acc templates
- 以下のコマンドで、今のテンプレートをデフォルトのテンプレートに設定する。
> $ acc config default-template cpp
acc submitでassert parsed_memory_limitエラーが出る原因を解消する
実は、ABC 408が開催された時点より、全ての問題のメモリ制限の単位が KB / MB から KiB / MiB に変更されている。
これにより、acc submitコマンドを実行したときに、内部で呼び出されるoj submitコマンドがassert parsed_memory_limitエラーを出して、提出が失敗するようになってしまう。

これは、onlinejudge/service/atcoder.pyの 582 行目付近のコードが、メモリ制限の単位を KB / MB としてパースしていることが原因である。

ここでは、応急処置的だがこの問題を修正していく。
"~/.pyenv/versions/3.10.14/lib/python3.10/site-packages/onlinejudge/service/atcoder.py"を開き、以下の2か所をコードを修正する。- 581行目:
1. # When login as the admin, a link is added after memory limit. See https://github.com/online-judge-tools/api-client/issues/902.++ parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KiB|MiB)', memory_limit)3.-- parsed_memory_limit = re.search(r'^(メモリ制限|Memory Limit): ([0-9.]+) (KB|MB)', memory_limit)4. assert parsed_memory_limit- 586, 588行目:
1. memory_limit_value = parsed_memory_limit.group(2)2. memory_limit_unit = parsed_memory_limit.group(3)3.++ if memory_limit_unit == 'KiB':4.-- if memory_limit_unit == 'KB':5. memory_limit_byte = int(float(memory_limit_value) * 1000)6.++ elif memory_limit_unit == 'MiB':7.-- elif memory_limit_unit == 'MB':8. memory_limit_byte = int(float(memory_limit_value) * 1000 * 1000)9. else:10. assert Falseこのエラーは、 online-judge-tools の Github の Issues 及び Pull requests に既に持ち上がっているようだ。
C++ のコンパイル設定をする
以下の記事を参考に C++ コンパイル時の設定をする。

AtCoderSolutionディレクトリ上に適当な C++ ファイルを作成し、それを選択している状態でCtrl + Shift + Bでビルドを試みる。すると、.vscode/tasks.jsonが生成される。tasks.jsonを以下のように書き換える。
1.{2. "version": "2.0.0",3. "tasks": [4. {5. "label": "c++ build for AtCoder",6. "type": "shell",7. "options": {8. "cwd": "${fileDirname}"9. },10. "command": "g++",11. "args": [12. "-std=c++23",13. "-I",14. "${workspaceFolder}/ac-library/",15. "-g",16. "-O0",17. "-Wall",18. "-Wextra",19. "${file}",20. "-o",21. "${workspaceFolder}/a.out"22. ],23. "group": "build"24. }25. ]26.}VSCode の C++ IntelliSense 設定をする
- コマンドパレットをから「C/C++:Edit Configurations(JSON)」を選択。すると、
.vscode/c_cpp_properties.jsonが生成される。 c_cpp_properties.jsonを以下のように書き換える。
1.{2. "configurations": [3. {4. "name": "WSL",5. "intelliSenseMode": "gcc-x64",6. "compilerPath": "/usr/bin/gcc-12",7. "includePath": [8. "${workspaceFolder}/**",9. "${workspaceFolder}/ac-library/"10. ],11. "defines": [],12. "cStandard": "c11",13. "cppStandard": "c++23"14. }15. ],16. "version": 417.}コマンド割り当てとショートカットキーの設定
以下の記事を参考にし、 acc と oj コマンドを簡単なショートカットキーで実行できるようにする。
Command Runner にコマンドを割り当てる
先ほどインストールした拡張機能「Command Runner」のsettings.jsonを開き、以下の内容を追記する。
1."command-runner.commands": {2. "oj test": "oj test -S -N -c ${workspaceFolder}/a.out -d ${fileDirname}/test",3. "acc submit": "cd ${fileDirname} && acc submit ${file} || cd ../../"4.}oj のコマンド詳細は以下を参照。
ショートカットキーの設定
Ctrl + K → Sを入力してキーボードショートカット一覧を開き、右上のファイルアイコンをクリックしてkeybindings.jsonを開く。keybindings.jsonに以下の内容を追記する。
1.[2. {3. "key": "ctrl+alt+t",4. "command": "command-runner.run",5. "args": {6. "command": "oj test"7. }8. },9. {10. "key": "ctrl+alt+s",11. "command": "command-runner.run",12. "args": {13. "command": "acc submit"14. }15. },16. {17. "key": "ctrl+alt+b",18. "command": "workbench.action.tasks.build",19. "when": "taskCommandsRegistered"20. }21.]ここでは、「ビルド」をCtrl+Alt+B、「サンプルケース実行」をCtrl+Alt+T、「ソースコード提出」をCtrl+Alt+Sとした。
C++ のデバッグ環境を構築する
- ターミナル上で以下のコマンドを実行し、 C++ のデバッガである gdb をインストール。
> $ sudo apt install gdb
tasks.json作成時と同様に、適当な C++ ファイルを開いた状態でF5キーを入力すると、.vscode/launch.jsonが生成される。launch.jsonを以下のように書き換える。
1.{2. // IntelliSense を使用して利用可能な属性を学べます。3. // 既存の属性の説明をホバーして表示します。4. // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=8303875. "version": "0.2.0",6. "configurations": [7. {8. "name": "(gdb) Launch",9. "type": "cppdbg",10. "preLaunchTask": "c++ build for AtCoder",11. "request": "launch",12. "program": "${workspaceFolder}/a.out",13. "args": ["<", "${workspaceFolder}/debug.in"],14. "stopAtEntry": false,15. "cwd": "${fileDirname}",16. "environment": [],17. "externalConsole": false,18. "MIMode": "gdb",19. "miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /bin/gdb -q --interpreter=mi",20. "setupCommands": [21. {22. "description": "Enable pretty-printing for gdb",23. "text": "-enable-pretty-printing",24. "ignoreFailures": true25. },26. {27. "description": "Set Disassembly Flavor to Intel",28. "text": "-gdb-set disassembly-flavor intel",29. "ignoreFailures": true30. }31. ]32. }33. ]34.}私の環境では"externalConsole": falseの部分をtrueとすると、デバッグがうまく実行されなかった。
また、デバッグ終了時に、ターミナルに
> [1] + done /usr/bin/gdb --interpreter=mi --tty=${DbgTerm} 0</tmp/Microsoft-MIEngine-In-ndptacu6.2ri 1>/tmp/Microsoft-MIEngine-Out-9278nini .hzx
のような謎の文字列が表示されることがある。デバッグに関して直接的な影響はないのだが、この表示を消したい場合は上記のように
1.> "miDebuggerArgs": "-q -ex quit; wait() { fg >/dev/null; }; /bin/gdb -q --interpreter=mi"を追記しておくこと。詳しくは Github 上の下記 Issue を参照。
WSL 環境上に Git を導入する
以下の記事を参考に、ソースコード管理ツールとして WSL 環境上に Git を導入していく。
Git の初期設定
- 以下のコマンドで、 Git を使うユーザのEメールアドレスとユーザネームを登録する。
> git config --global user.email "(GitのEメールアドレス)"
> git config --global user.name "(Gitのユーザネーム)"
WSL から Github に SSH 接続する
~/.sshを作成し、そのディレクトリ下で次のコマンドを実行。秘密鍵と公開鍵のペアが作成される。
> $ ssh-keygen -t rsa
Enter file in which to save the key (/home//.ssh/id_rsa):と聞かれるので、鍵の名前を入力する(デフォルトではid_rsa)。Enter passphrase (empty for no passphrase):と聞かれるので、パスワードを入力する。入力したパスワードは表示されないので注意。空白の場合はパスワードを設定しないことになる。- 以下のページにアクセスして、 Github に先ほど生成した鍵の公開鍵の方を登録する。

- 「New SSH Key」をクリックし、「Title」には何のSSH鍵なのか分かりやすいように適当に付ける。また、「Key」には、次のコマンドを実行してグリップボードにコピーされる先ほど作成した公開鍵をペーストする。
> $ cat ~/.ssh/id_git_rsa.pub | clip.exe
- 入力が終わったら、「Add SSH key」で公開鍵を登録する。
作成した秘密鍵は絶対に第三者に漏洩しないように注意すること。漏洩した場合、 Githubへの不正アクセス及びソースコード盗用の恐れがある。
公開鍵は最悪漏洩してもセーフ。
.ssh/configを開き、以下の内容を追記する。
> Host github
> HostName github.com
> IdentityFile ~/.ssh/(秘密鍵の名前)
> User git
- 以下のコマンドで権限の修正をする。
> $ chmod 600 ~/.ssh/config
- 以下のコマンドで接続の確認をする。
> $ ssh -T git@github.com
Hi (githubアカウント名)! You've successfully authenticated, but GitHub does not provide shell access.と表示されれば成功。
Github 上のリモートリポジトリと紐づける
初回の push 時に限り、特別な操作を行う必要がある。 以下の記事を参考に進めていく。また、この段階で既に WSL 環境上に Git はインストールされているはずである。

- ローカルのリポジトリを初期化する。
> $ git init
- (必要があれば)ローカルのブランチ名を
masterからmainに変更する。
> $ git branch -m main
.gitignoreを作成し、以下の内容を追記する。
.vscode/\*\*
!c_cpp_properties.json
!launch.json
!tasks.json
ac-library/\*\*
_.in
_.out
- VSCode 上 の Git の UI から、「変更をステージ」>「コミット」を選択。
- Github 上でリモートリポジトリを作成し、その url をコピーしておく。今回はこのリポジトリを作成した。
- 次のコマンドを順に実行する。Github リポジトリの url は、最後に
.gitが付いたものである。
> $ git remote add origin (Github上のリポジトリのurl)
> $ git fetch origin
> $ git merge --allow-unrelated-histories origin/main
> $ git push origin main
おわりに
以上で、冒頭に示した環境を構築することができた。
工程が非常に多いので、予期せぬエラーなどで途中で詰まってしまうことが十分に考えられる。 エラーが出てきたら自分で調べてみる or 生成AIにぶん投げるのはもちろんだが、それでもなかなか解決しないかもしれない。 行き詰ったら最初からやり直してみるのも一つの手であろう。 幸いなことに、今回は仮想環境上で環境構築を行っているので、簡単にリセットすることができる。詳細は《おまけ》の項を参照してほしい。
実戦で使いにくいところがあれば、各々でカスタマイズしてみるのも良いだろう。
《おまけ》WSL のディストリビューションを削除してやり直す場合
次の記事を参考に、WSL のディストリビューションを削除して、「WSLターゲット」>「ディストリビューションを追加する」を選択するところからやり直すことができる。

- 既存のディストリビューションを確認。
> $ wsl -l -v
- 削除したいディストリビューションの
NAMEを指定して削除。
> $ wsl --unregister (削除したいディストリビューション名)
- 削除されたことを確認。
> $ wsl -l -v
参考記事







