WSL2+Ubuntuを使ってatcoderをC++で始める方法 2023年春

## 初めに(執筆理由)

これまで、若干面倒な手段を踏むことでしか使えなかったWSLが、アップデートによって簡単にインストールできるようになったので、やり方についてまとめます。
> 若干面倒な手段-> BIOS(OSを入れる前の段階とかに必要なやつ)を触ったり、Windowsの古くさい設定画面を触らないといけなかったりしていました。

また、これから作る環境は競技プログラミング専用なので、開発などには向かない可能性があります。あくまで競プロ用のものとして読んでください。
**著者**
[KujiraBox]([KujiraBox - AtCoder](https://atcoder.jp/users/KujiraBox))
情報系の高専生
atcoder algo緑 [twitter🐤]([kujira（@Kujira_Box）さん / Twitter](https://twitter.com/Kujira_Box))

---
## 対象読者
- windows10,11ユーザ
- 競技プログラミングを始めたいが手の付け方が分からない人
- 他の環境、言語から移行しようとしている人
---
## 環境
- windows11
	windows10でもいいですが何かと便利なので
- Ubuntu
	たぶん一番使われているLinuxの派生
	日本語入力なども簡単にできて優しい
- VSCode
	microsoft社謹製のエディタ 拡張機能が非常に多く、特別な拘りがないならこれ一択
	WSLへの接続をまじで簡単にやってくれます。
---
## 早速やっていきます。
##### 1.microsoftストアからWSLの入手
![WSL picture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/8a3caa34-398f-c13d-23cd-a06b65ae37be.png)
https://www.microsoft.com/store/productId/9P9TQF7MRM4R
インストールをするだけです。
これでwindows上でLinux系のOSを動かすことができるようになりました。

一応正しくインストールできているかの確認方法を載せます。**必須ではないです**
windowsキー+Rを押して出てきた小さなウィンドウにcmdと入力
黒い画面、コマンドプロンプトが出てきます。
そこにwsl --versionと入力すると以下のような情報が返ってくるはずです。(英語の可能性もあります)

```
C:\Users\ここはユーザネーム>wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
MSRDC バージョン: 1.2.3575
Direct3D バージョン: 1.606.4
DXCore バージョン: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windowsバージョン: 10.0.22621.1265
```

---

##### 2.Ubuntuの入手
![Ubuntu picture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/62e37f98-2f0e-f88b-9b2c-386d09873d5e.png)
https://www.microsoft.com/store/productId/9PDXGNCFSCZV
同じくインストールするだけです。

インストールが終わったらどこからでも開いてください。
```
Installing, this may take a few minutes...
```
訳:インストール中です。数分待ってください **待ちましょう**
```
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
```
**このページ、非常に重要です。**
使うユーザネーム、パスワードは短くすることをおすすめします。割と高頻度に使うので
パスワードの設定は入力しても**見えなくなっている**ことに注意しましょう
入力自体はできているはずです。今回、私はKujiraという名前を使いました。
**初回起動時に0x80370114エラーと出る (BinomialSheepさんからの指摘 感謝します!)**
PC内のアプリ検索から、
Windowsの機能の有効化または無効化 > 「仮想マシン プラットフォーム」にチェック（参考 https://zenn.dev/ohno/articles/1cb49d190af1f4 ）

**間違えてタブを落としたり文字入力できなかった場合**
自分の名前が
```
root@なんちゃら:~#
```
になってしまっていると思います
これは恐らくrootユーザというものです。正しい解決法もあると思うんですが面倒なので
Ubuntu アプリをアンインストールして入れ直しましょう。

---
##### C++のインストール (ここからは基本Ubuntuでの操作です。windowsのコマンドプロンプトは使いません。)
ようやくここまで来ました。
ですがそのまえに、環境をアップデートしておきましょう。
```
kujira@laptop:~$ sudo apt update
kujira@laptop:~$ sudo apt upgrade
```
先ほど決めたパスワードの入力が必要です。
また、実行途中に[Y/n]?と書かれた一文がてきますが **y** を打って進めてください。
これはユーザに、環境を変えるようなプログラムの実行の許可を聞いています。

次はC++関連のインストールです。以下を実行してください。

```
kujira@laptop:~$ sudo apt install build-essential -y
```
開発向けのパッケージがいろいろ詰まったものをインストールしています。
また、末尾に -y と付いていますが、これは[Y/n]をすべてyesで通すというオプションです。インストールがめちゃくちゃ長いときは、いちいち押していられないので使いましょう。

バージョン確認を行います。(必須ではないです)以下を入力して近い値だったらokです
gccは簡単にいえばC,C++のコンパイラで、ファイルの拡張子が.cならC言語として,.cppならC++としてコンパイルします。全部C++でコンパイルするg++もあります
```
kujira@laptop:~$ gcc --version
gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
```
デバッグ用のツールもインストールします。あって損することはないので入れときましょう
```
kujira@laptop:~$ sudo apt install gdb -y
```
---
#### VSCodeについて
インストールについては、めちゃめちゃ記事出てると思うので割愛します。VSCodeで調べてインストールしましょう

**拡張機能のはなし**
VSCodeは、windows側とUbuntu側、それぞれ別に拡張機能を入れます。
今、普通にVSCodeを開くとwindows側で立ち上がります。

**Windows側で入れた方がいい拡張機能は以下三つです**
- [日本語化プラグイン](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
- [WSLと連携させてくれるやつ(必須)](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)
- [アイコンを見やすくするやつ(お好み)](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme)

WSLのプラグインを入れると画面左下に
![mark pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/c6e36b7c-e7f4-5a09-368a-1d6455c309a4.png)
このマークが出ると思います。ここをクリックして、**新しいWSLウィンドウ**を選択します。
![window pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/9a36996c-b56d-aac4-bcc0-44de72b21a23.png)
これで、Ubuntu側のVSCodeが立ち上がりました。ここから先はWindows側のVSCodeは使わないので閉じてもらって構いません。

**Ubuntu側で入れた方がいい拡張機能は以下三つです**
- [日本語化プラグイン](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
- [C/C++ Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack)
- [Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)

#### Code Runnerの説明
Shell(黒い画面に近いもの)にC++ファイルのコンパイルと実行を書き込む際、**Ctrl+alt+N** ですべて一発でやってくれる便利機能です。必ずcppファイルを開いているときに使いましょう。初期設定が少し必要で、設定から
```
code-runner.runInTerminal
```
を調べ、チェックを入れましょう。
![check pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/33eb0445-a742-d7d8-6635-bc1cd17e884d.png)
これをしないと入力をうまく与えられないんですよね。

**ちょっと便利な説明(必須ではないです)**
CodeRunnerだと.outファイル(実行ファイル)が(cppファイル名).outとなり嵩張って邪魔なので私は**Executor Map**(設定から調べてください)を下のように変更しています これですべてa.outで出てきます
```
"cpp": "cd $dir && g++ $fileName -I ACLのパス && ./a.out",
```
> ACLとは？
> C++用の、よく使うアルゴリズムやデータ構造をまとめたライブラリです[ACLのリンク](https://atcoder.github.io/ac-library/document_ja/)
> Atcoder社が作っているので,そのままAtcoder側でも使えます。
> 導入も少し面倒なので最初は無視してもいいかも？

#### プログラミングするディレクトリを作る
[A - 積雪深差 (atcoder.jp)](https://atcoder.jp/contests/abc001/tasks/abc001_1)
この問題を解きながら環境を作りましょう
**1.ディレクトリ作成**
普段通りエクスプローラーを開くと下のような場所にUbuntuが追加されているのが確認できます
![exp pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/ab31094b-1494-19b1-a277-a8007201750d.png)
Windowsでファイルを作成するのと同じ要領で、
home/ユーザ名/
の位置に移り、ここの先にフォルダを作っていきます。
自分の場合は
```
/home/ユーザ名/.pg/atcoder
```
としています

VSCode側で開きます。
![folder pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/9a08d31a-509f-49bd-2813-1e3ef838a3a7.png)
こうしてさきほど作ったatcoderフォルダまで移ります
>この画面、最初に開いたときどうやってキャンセルするのか分からなくて凄く焦りました。
>escキー(キーボード左上)で閉じる

↓↓↓の画面のようになっていれば大丈夫です
![dir pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/e41296e2-1c99-6b95-9cf4-ddb8f29cb788.png)

#### CPPファイルの作成
![cppfile](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/8824f156-fc86-8abc-4c13-a3790e74c180.png)
①でフォルダ"ABC001"の作成
"ABC001"をクリックして開いた状態にして、
②でファイル"A.cpp"の作成
です
>皆さんの環境には無いフォルダや謎のUマークが私の例には付いていますが、こちらの環境の話なので無視して大丈夫です。

#### プログラムを書こう
```C++
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
    int H1, H2;
    cin >> H1 >> H2;
    cout << H1 - H2 << endl;
    return 0;
}
```
これをA.cppに書き込んで、 **Ctrl+S** (保存)してください。

#### プログラムを実行しよう
A.cppを開いた状態で、**Ctrl+alt+N** を入力してください。
すると、勝手にターミナルが立ち上がるはずです。
ターミナルにテストケース1、
```
15
10
```
を張り付けて**Enter**を押しましょう
```
5
```
と出力されれば成功です。
**例**
![terminal pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/aaee0f51-9320-93fe-a259-55ad84214cdb.png)

---
#### 付録 [デバッグしてみよう]
左端にある、虫マークを押すと、デバッグができます。VSCode側がデバッグオプションのテンプレートをいくつか用意してくれているのでgccを使っているものを選んで動かしてみましょう
![debug pic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711704/76d67d1d-bd37-6de7-3bdd-d942fdd69f26.png)
値をリアルタイムに見せてくれて便利です。複雑な問題を解く際や、DP(アルゴリズム)の遷移を見たいときなんかに使えます。
以下のサイトが詳しく書いていて参考になります。
[【初心者向けに解説】Visual Studio CodeでC言語/C++のデバッグ方法 | Inno-Tech-Life](https://inno-tech-life.com/dev/cpp/cpp_debug_vscode/)

---
#### 最後に
これを読んで始めた人が、僕より強くなって競プロを教えてくれる日が来ることを切に願います。