WSLとVSCodeでAtCoder Library環境構築

# はじめに
導入に苦戦したので備忘録として残しておきます．
変なところとか間違ってるところがあったらごめんなさい．

# 目標
AtCoder Libraryを，WSLとVSCodeで，いちいちフォルダをコピーしたりコンパイル時にオプションを付けたりしないでもどこでも利用できるようにしたい 

ACL公式のドキュメントはこちら

https://atcoder.github.io/ac-library/production/document_ja/

WSLとかVSCodeとかはすでに入ってるよって人は[ACLの導入](#aclの導入)からどうぞ


# 想定環境
Windows11

# WSL・Ubuntuのインストール
PowerShellを管理者権限で起動し，次のコマンドを打ってUbuntuをインストールします．
``` powershell
wsl --install –d Ubuntu
```
インストール後にwindowsを再起動をするとUbuntuコンソールが立ち上がるので，ユーザー名とパスワードを設定して終わりです．

このように`ユーザー名@~~`と緑の文字で出てくると思います．
![Ubuntu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/8255d3f5-c949-53c6-010c-350a72e5ec15.png)


# VSCodeのインストール
https://code.visualstudio.com/ からWindows用のVSCodeをダウンロードしてセットアップします．

### 使用許諾契約書の同意
使用許諾契約書に同意します．
![使用許諾契約書の同意](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/d0f1a97f-2c78-719a-ae10-6e29a6f32918.png)

### インストール先の指定
デフォルトのまま進めます．
![インストール先の指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/baaef485-4887-93ed-cf56-772f2868cfa7.png)

### スタートメニューフォルダーの指定
これもデフォルトのまま進めます．
![スタートメニューフォルダーの指定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/f203eef5-4086-bbab-0e00-70661ae99e07.png)

### 追加タスクの選択
追加タスクの選択をします．私は画像のようにしました．それぞれの意味は省略します．
![VSCode 追加タスクの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/c2ba3928-bee1-7982-233b-0df9ac42a0f0.png)

### インストール
設定を確認したらインストールします．
![インストール](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/1b56fdd2-95f4-8493-249f-51c758efd3b9.png)

# VSCodeの設定
インストールが完了するとVSCodeが起動すると思うので，初期設定をしていきます．
## 日本語化
まずVSCodeを日本語にしたいので，日本語化拡張を入れます．

https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja

上のリンクを踏むか，VSCodeの左側にあるテトリスみたいなアイコンをクリックして`Japanese`とでも打ち込めば出てくると思います．

![vscode-language-pack-ja](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/fb3b6f6c-bf61-26f4-d303-10b4bf889e90.png)

Installボタンを押してインストールできたら，日本語にして再起動するか聞かれるので再起動します

![restart](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/55d51bcf-dc62-b755-95ba-3d40ac2289c3.png)

再起動したら日本語になっていることが確認できると思います．

## WSLを使えるようにする
次はWSL上でコーディング・コンパイル・実行などなどができるようにしていきます．
### WSL拡張
WSLのフォルダを開けるようにする拡張機能が用意されているのでそれをインストールします．日本語化拡張と入れ方は同じです．

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl

インストールできたら左側のアクティビティーバーにモニターみたいなアイコンが増えていると思います．
![アクティビティーバー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/a8fc57fc-b863-351f-43ba-6e0faa6c6c21.png)

そうしたら左下にある`><`みたいなアイコンをクリックします．
![connect WSL](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/975c6b6c-0273-2a46-f7d2-801ea817d9bf.png)

上からメニューが出てくるので`WSLへの接続`を選択します．
![WSLダイアログ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/bf3fb7f1-9135-c383-e5ae-9cd4b27b9568.png)

色々な処理が終わったら，左下が`WSL:Ubuntu`と変化していることを確認してください．

![WSL:Ubuntu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/632cc77b-a49e-e300-fd7d-3fb65578bc42.png)

VSCode上でWSLを使用できるようになりました．

### フォルダの操作
VSCodeで`/home/<ユーザー名>/`を開いてみましょう．
上のタブの`ファイル - フォルダーを開く`を押します．
![ファイル - フォルダーを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/7f0f1742-26b6-0972-2d44-e244bf4ec9c8.png)

すると，フォルダのパスを入力するところが出てくるので，そこに`/home/<ユーザー名>/`と打ち込み，`OK`を押します．(すでに入力されていると思います)
![フォルダーを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/07a2d1f4-2757-225d-0db8-3c00605e9c14.png)

:::note warn
`ローカルを表示します。`を用いるとWindowsのエクスプローラーでフォルダを開けますが，WSLから抜けてしまうようなのでここで操作しましょう
:::

そうしたら`/home/<ユーザー名>/`が開かれているのが確認できると思います．念のため，左下の青いボタンを見てWSL上にいることを確認してください．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/caa6936b-32ff-b2d5-aaec-d7570d0b1198.png)

以上のようにすることで任意のフォルダをVSCodeのWSL上で開くことができます．

:::note info
UbuntuではなくWindows上のファイルにアクセスしたい場合は`mnt`以下を参照してください(パフォーマンスは落ちるそうなので注意です)
![mnt](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/f5260ba2-f9b5-2295-0230-376199b62e4e.png)
:::

# C++環境の構築
C++環境をWSLとVSCodeで構築します．

## 準備
C++ファイルを作成する前にコンパイラやインテリセンスを導入します．

### コンパイラ(g++)のインストール
C++をコンパイルするためにg++を入れます．
VSCodeで`ctrl + @`を押すとターミナルが起動し，下部に出現します．ターミナルの右上に`bash`と記載されていることを確認してください．
![bash](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/f1cf616c-3eb1-71ab-dd90-001d55f13d7a.png)

そうしたらターミナル上に以下のコマンドを入れます．
```bash
sudo apt update
sudo apt upgrade
sudo apt install build-essential
```
パスワードが求められるので，先ほど設定したUbuntu用のパスワードを入力してください．また，`Do you want to continue? [Y/n]`と聞かれるので`y`と適宜入力してください．
これでg++がインストールできました．
`g++ --version`とターミナルで入力してバージョン情報が表示されることを確認しましょう．

### デバッガ(gdb)のインストール
デバッグを行うためにgdbをインストールします．g++と同様にして，コマンドを以下の通りにします．
```bash
sudo apt update
sudo apt upgrade
sudo apt install gdb
```

### C/C++拡張
補完やデバッグ機能を提供する拡張機能です．入れておきましょう．

https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools

### フォルダの作成
`/home/<ユーザー名>/`に直接置くと汚れそうなので新しくフォルダを作りましょう．以下のいずれかの方法でAtCoderというフォルダを作ります．
- `/home/<ユーザー名>/`上で`mkdir AtCoder`を実行する
- VSCodeのGUIでフォルダを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/02106012-ddc0-d573-784d-1e9d285222db.png)
- Windowsのエクスプローラーのサイドバーの下の方にある`Linux`を押して`/home/<ユーザー名>/`まで移動してエクスプローラーから作成する

![エクスプローラー](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/0bc2798e-ca74-11d9-4d75-d86a6e34b860.png)

`/home/<ユーザー名>/AtCoder`が作成できたと思うので，そのフォルダをVSCodeで開きましょう．
![フォルダを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/d0e8a02f-0e4a-3692-036e-9b70c9d146ad.png)

![フォルダを開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/09f2ab62-dc67-a1df-775a-527044f380e4.png)

こんな感じにエクスプローラーのところに`ATCODER[WSL:Ubuntu]`と表示されていればOKです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/45a8cfc8-48fc-e4fc-8de4-b9356c0a8468.png)

## C++ファイルの作成
ではC++ファイルを作成してみます．VSCodeの`新しいファイル`を押すとファイルを作成できます．名前はなんでもいいですが，ここでは`hello.cpp`とします．拡張子は`cpp`が一般的(なはず)なので`cpp`としておきます．
![新しいファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/4ed5c8ba-0e2e-04b0-266b-6941f169b311.png)

新しく`hello.cpp`が作成できていることを確認できると思います．右の部分でコーディングができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/0ff7459b-95ef-974d-d7c5-331937d73773.png)

Hello Worldをしてみましょう．
以下のコードを打ち込みます．拡張機能を入れたので補完が効いているはずです．

```C++
#include<bits/stdc++.h>
using namespace std;

int main(){
    cout << "Hello World" << endl;
}
```

こんな感じになりましたかね？
![Hello World](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/b8954505-bf50-6487-4dd1-4cf038651f03.png)

早速コンパイル・実行をしたいですが，保存をしていないと内容が反映されません．保存されているかどうかはタブに白い丸があるかどうかでわかります．`ctrl + S`で保存をしたら白い丸が消えると思います．

:::note info
保存を毎回するのは面倒なので，VSCodeの設定の自動保存を有効化することをお勧めします

![自動保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/80a99d47-6074-ecc1-24d0-8da895582cbe.png)

:::

## コンパイル・実行
ではコンパイル・実行をしていきましょう．
ターミナルが下部にない場合は`ctrl + @`で出しておきます．
また，念のため`ls`コマンドなどでカレントディレクトリに`helo.cpp`があることを確認しておきましょう．

### コンパイル
コンパイルは先ほど導入したg++を用います．コンパイルコマンドは次の通りです．
```bash
g++ hello.cpp
```
コマンドを実行すると，`a.out`という実行ファイルが生成されます．

### 実行
実行コマンドは次の通りです．
```bash
./a.out
```

Hello Worldと出力されました！
![Hello World result](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/e0d5c6ae-4cb6-2021-ce9c-ac4226006871.png)

これでC++の実行環境を構築できました．

## デバッグ
デバッガはgdbをインストールしたので，これを用いてデバッグしてみましょう．
変数の値などが見てみたいので，`debug.cpp`というファイルを作成し，以下のコードを書き込んでみましょう．1から10までの和をfor文で計算するコードです．
```C++
#include<bits/stdc++.h>
using namespace std;

int main(){
    int sum = 0;
    for (int i = 1; i <= 10; i++){
        sum += i;
    }
    cout << sum << endl;
}

```
VSCodeでは行番号の左に赤い点を打つことでブレークポイントを設定できます．ここでプログラムの実行が一時停止します．
![ブレークポイント](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/186f4a03-c7c8-a565-e98f-3bc4dab53a13.png)![ブレークポイント2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/5161f40c-fdc2-8f20-2ed4-538bad146bb6.png)

7行目にブレークポイントを打ってデバッグをしてみようと思います．
左のアクティビティーバーに再生ボタンと虫が合わさったようなアイコンがあると思います．そこを押してデバッグを行います．`実行とデバッグ`ボタンを押すとデバッグがスタートします．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/44092e17-b724-f3fa-ba6a-6ed82aadb1ca.png)

構成を聞かれるので，真ん中の`g++ アクティブ ファイルのビルドとデバッグ`を選択します．間違えた場合は`AtCoder/.vscode/tasks.json`を削除・変更すればいいです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/e2fcd1a5-a77d-8f0a-248f-9d6f8caee4eb.png)

すると，実行され，7行目で止まったのがわかると思います．
左側にローカル変数の値が出力されていて，i: 1，sum: 0 であることがわかります．次に進むには浮いているメニューの続行ボタンを押します．このようにすることで，意図しない挙動をするプログラムのデバッグができます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/a0f9d1fc-c70c-3488-09ee-09ff2262d8ce.png)

入力が必要なプログラムでデバッガ用いる場合は，下部のメニューを`デバッグコンソール`から`ターミナル`に変更し，そこで入力を行って下さい．
デバッガはいろいろなことができるので詳しい説明は他の記事に任せようと思います．

# ACLの導入
いよいよAtCoder Libraryを導入します．

https://atcoder.github.io/ac-library/production/document_ja/

:::note warn
本記事ではAtCoder Libraryを，WSLとVSCodeで任意の場所で利用できるようにグローバルに使えるようにしています．競プロ用ディレクトリのみで使用する場合などは他記事や公式ドキュメントを参照してください．
:::


## zip解凍
公式サイトからzipをダウンロードして解凍しておきます．

https://atcoder.jp/posts/517

## AtCoder Libraryの配置
AtCoder Libraryを好きな場所に置きます．ただ，`mnt`以下に置くと少なくとも私の環境では補完等がかなり遅くなるのでUbuntu上に置くことをおすすめします．
本記事では`/home/<ユーザー名>/`に配置します．

## 環境変数の設定
環境変数を設定し，g++にAtCoder Libraryの場所を教えます．
.bashrcをvscodeで開いて編集します．.bashrcは`/home/<ユーザー名>/`直下にあります．
次の行を.bashrcの末尾に追加します．
```bash
export CPLUS_INCLUDE_PATH="/path/to/ac-library"
```
パスは適宜変更してください．私の場合は次のようになります．
```bash
export CPLUS_INCLUDE_PATH="/home/toufu24/ac-library"
```

.bashrcを変更できたら，ターミナルで次のコマンドを実行します．
```bash
echo $CPLUS_INCLUDE_PATH
```
これで先ほど設定したパスが表示されればOKです．
![CPLUS_INCLUDE_PATH](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/0a237c1b-91f9-d0f0-c859-d2ad68b45ddc.png)
表示されない場合は`source ~/.bashrc`を実行したり，再起動したりしてみてください．

2024/07/18追記
.bash_profileが存在する場合，.bashrcが読み込まれないことがあるらしいです．↓

https://scrapbox.io/ryoheimorimoto/WSL%E3%81%AEUbuntu%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AB.bashrc%E3%81%8C%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%82%8C%E3%81%AA%E3%81%84

## コンパイル
コンパイルができるか試してみましょう．では`ACL.cpp`という名前のC++ファイルを作成します．
中身は次のようにします．atcoder::modintを用いて-1 (mod 998244353)を出力しています．
```C++
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;

using mint = modint998244353;

int main(){
    mint out = mint(-1);
    cout << out.val() << endl;
}
```
VSCodeが`#include エラーが検出されました。`と言ってくると思いますが，一旦無視してください．(現在開いているフォルダにAtCoder Libraryがあると出ないみたいです)


ターミナルで以下のコマンドで，コンパイル・実行します．
```bash
g++ ACL.cpp
./a.out
```
無事コンパイルされ，`998244352`と出力されればOKです．
![998244352](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/646b0d7a-303a-36ad-cfa0-c769b116a9b2.png)


## VSCodeの設定
このままでは#includeエラーがでて補完が効かないので，VSCodeのC/C++拡張にもAtCoder Libraryの場所を教えてあげます．
VSCodeの設定を開きます．
![設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/69c496cc-7aec-852c-6f1b-cfeb5b2e940d.png)

設定を開いたら，`リモート[WSL:Ubuntu]`のタブに移動し，`include path`と入力し，`C_Cpp > Default: Include Path`にAtCoder Libraryのパスを追加します．
![C_Cpp > Default: Include Path](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/aa78838a-ace3-0b9b-5a58-b0815446970b.png)
こうすることで，WSLのUbuntu上ならばどこでもAtCoder Libraryを利用することができるようになりました．

:::note warn
**リモート[WSL:Ubuntu]** ではなく，**ワークスペース** でこの設定を行うと，別のワークスペースではAtCoder Libraryのパスが通りません
:::

ACL.cppを見てみるとエラーが消えていて，補完も効くようになっていると思います．
![ACL補完](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/5c2b2897-32c2-d51f-e915-e0c76fac6194.png)

また，デバッグもAtCoder Libraryを用いていてもできると思います．
![ACLデバッガ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3721358/b61d8419-6756-b063-330c-0c677bcc229e.png)