開発環境構築（2020年版・WSL2+VcXsrv）

[前回の記事](https://qiita.com/sus304/items/6ce0e90de25551f2da44)から時間が経って、環境が変わってきたので更新。
先日、大型アップデート「Windows10 May 2020 Update」でWSL2がリリースされたのでCygwinから乗り換える。
numpyなどのパッケージインストールも楽になったのでAnacondaを捨ててpipenvによる管理に乗り換える。

ということで構築する環境は

* Windows10
* WSL2 + Ubuntu-20.04

で

* Python
* Fortran90/95
* C/C++

を動かせるようにする。
ちなみに使っているのはWindows10 Pro 64bitだが、Homeでも問題ない。

# WSL2(Windows Subsystem for Linux 2)導入
## May 2020 Update
Windows Updateでアップデートがかかっていなければ、[ここ](https://www.microsoft.com/ja-jp/software-download/windows10)からアップデートがかけられる。
アップデートはそこそこ長いのでコーヒーでも飲みながら待つ。

## Win機能の操作
コントロールパネル→プログラムと機能→Windowsの機能の有効化または無効化から

* Linux用Windowsサブシステム：有効（チェック）
* Hyper-V：無効（非チェック）
* 仮想マシンプラットフォーム：有効（チェック）

にしてOKすれば再起動がかかるのでドーナツでも食べて待つ。

再起動したら、念の為でPowerShellからコマンドを打っておく。

```powershell
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
```
```powershell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
```

それぞれ、「操作は正常に完了しました。」と表示されていればよし。

## Linuxディストリビューション導入
※これまでにWSL1を使っている場合はこの項は不要なので読み飛ばすとよい。

MicrosoftStoreからディストリビューションをインストールする。
ここではUbuntu-20.04をインストールするが18.04やDebianでもかまわない。
その場合は適宜読み替えること。

インストールが完了したらUbuntu-20.04を起動する。
MicrosoftStoreでインストールした画面やスタートから起動するのが早い。
起動したらコマンドプロンプトチックなウインドウをが現れてディストリビューションの初期化が始まる。これも少し長いので台所の洗い物でもして待つ。

初期化が終わればユーザ名に続いてパスワードの登録が進む。
ここでのユーザはadminとなるため、スーパーユーザのパスになるので忘れないように。

## WSL2の適用
インストールしたUbuntuにはWSL1が適用されているため、WSL2に変更する。

まずはWSL1が適用されていることを確認するため、コマンドプロンプトを開き

```console
wsl -l -v
```

を打つ。
先程インストールしたディストリビューションと状態、バージョンが表示される。
このバージョンが1であればよい。

WSL2用にLinuxカーネルの更新をする。下のリンクからダウンロードしたファイルを実行し、インストール。

[https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel](https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel)

インストールが終わったらコマンドプロンプトに戻って以下のコマンドを打つ。

```console
wsl --set-version Ubuntu-20.04 2
```

もう一度

```console
wsl -l -v
```

を叩いて、バージョンが2になっていれば成功となる。
最後に以下のコマンドを叩いて、wslの標準ディストリビューションを今回のものに設定する。

```console
wsl -s Ubuntu-20.04
```

# ターミナルアプリ導入
標準のターミナルがコマンドプロンプトチックで大変微妙なので、ターミナルアプリを別途導入する。
せっかくMicrosoftからWindowsTerminalがリリースされているのでこれを用いる。
FluentTerminalやwslttyなどでもかまわない。

# パッケージインストール
以降はUbuntu上での操作となる。
まずはインストール済みパッケージを更新する。

```bash
sudo apt update
sudo apt upgrade
```

あとは必要なものをインストールしていく。

```bash
sudo apt install vim
sudo apt install git
sudo apt install make
sudo apt install gcc
sudo apt install g++
sudo apt install gfortran
sudo apt install gdb
sudo apt install python3-tk
```

ここまででC/C++とFortran90/95の環境はできあがっている。

続いてPythonの環境としてpipenvを導入する。
pipenvの説明は[公式](https://pipenv-ja.readthedocs.io/ja/translate-ja/)や[こちら](https://narito.ninja/blog/detail/58/)や[こちら](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)を参照してほしい。

```bash
pip install pipenv
```

でインストール。

# X Serverインストール
このままだとmatplotlibなどのグラフィカルなものが表示されない。
そのためにX Serverをインストールしなければならない。
ここでは[VcXsrv](https://sourceforge.net/projects/vcxsrv/)をインストールする。

設定についてはWSLのリポジトリに[issue](https://github.com/microsoft/WSL/issues/4106)が立っているのでこれを参考に。

VcXsrvのxlaunch.exe（インストール時になにも変えていなければデスクトップにショートカットが生成されているはず）
を起動し、X Serverの設定を行う。

1. multiple windowsを選択
2. start no clientを選択
3. Additional prameters for VcXsrvに -ac を追加
4. Save configurationで設定ファイルをてきとうなところに保存しておく
5. 完了を押して設定完了

そのままだとPCを再起動するたびにVcXsrvを起動しなければならない。
ので先程保存したconfig.xlaunchのショートカットをWindowsのスタートアップフォルダに作成しておく。

また、ファイアウォールの対象外にvcxsrv.exeを追加しておくこと。
セキュリティソフトを入れている場合はセキュリティソフトの設定から、
それ以外はコントロールパネルから設定する。

残るはWSL側の設定として.bashrcに

```bash
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

を追記する。


# 動かしかた兼サンプル
作った環境のテストとして適当にグラフを書いてみる。

```bash
mkdir sample
cd sample
pipenv install
pipenv shell
pipenv install numpy matplotlib
vim app.py
```

```python:app.py
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, np.pi*2, 0.1)
y = np.sin(x)

plt.figure()
plt.plot(x, y)
plt.xlabel('x')
plt.ylabel('sin(x))
plt.grid()
plt.show()
```

```bash
python app.py
```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124076/a15b2381-67dd-2091-87be-bd790883571a.png)

このグラフが表示されれば環境構築は正常にできている。

# その他
エクスプローラから

```
\\wsl$Ubuntu-20.04\home\user_name
```

でWSLのファイルにアクセスできる。
とても便利。

Visual Studio Codeでもremote拡張を導入すればWSL側のファイルを編集できる。