WSLでLinuxライクにターミナルで遊ぼう（前編）

※本投稿は[commew Advent Calendar 2019](https://qiita.com/advent-calendar/2019/commew)の1日目の記事です。  
##はじめに

[こみゅー](https://commew.net/)はWeb系フリーランスのコミュニティーなだけに、たまーにPC買い換えたりするタイミングで

　「WindowsとMacだったらどっち買うべきでしょうか？」

という質問が出たり、

　「Docker扱いづらいから早くMac欲しいなー」

って声が上がったりします。

「Web開発ならMac」って意見がやっぱり多いし実際Mac使いのメンバーが多数派な印象なんですが、やっぱりMacはUnix互換のOSだけあって、iTerm2みたいな優秀なターミナル上ですぐに使えるshellがあったり、デフォルトでRubyやPythonといったプログラミング言語がインストールされてWebサーバー上で動く環境と揃えやすく親和性が高い故にすんなり開発に取り組めるんじゃないかなってのは、使った事がない僕[^1]でも同意します笑[^2]

でも最近のWindows上のLinux環境の急速な進化で、その差もどんどん少なくなってきている様ですよ！
WindowsPCはハードが性能の割に安価なのと、メモリ増設等のカスタマイズが容易にできるというメリットもありますしね。
あとはゲームがしやすいとか笑[^3]


##Windows上のUnix互換環境について

Windowsにも随意分前(1995年位）から [Cygwin](https://www.cygwin.com) というUNIXライクな環境を提供する互換レイヤーや、[MSYS2](https://www.msys2.org)(MinGW)といったGNUツールチェーンの移植版があります。要はこれらは貧弱なコマンドラインしかなかったWindowsを何とかLinuxの使い勝手に近づけようってプロダクトであり、僕も随分とお世話になりましたが、やはりそれなりに使える環境にするにはかなりの手間と時間が必要です。

しかしWindows10になってからは、WSL(Windows Subsystem for Linux)という仕組みが標準でOSに組み込まれる様になり、Linuxライクどころか本物のLinuxディストリビューションが手軽に使える様になりました。
これを使いやすいターミナルエミュレータと組み合わせる事でLinuxのCLI環境が手に入り、bashやzshといったシェルを操りWindowsの全てのファイルにアクセス可能で、LinuxのシェルからWindowsのプログラムを起動する事も出来る様になります。

##WSLでできないこと

現状のWSL(WSL1)は、Linuxそのものではなく、LinuxカーネルへのシステムコールをWindowsカーネルの機能に変換して実行しています。なのでホストOSのLinuxカーネルを共有する仕組みで動作するDockerの様なコンテナは直接使う事が出来ません。
2020年5月以降にリリース予定の「20H1」というWindows10のバージョンではWSL2が採用される事になっています（Insider Preview版のWindows10では既に試せる）が、こちらでは本物のLinuxカーネルがWindowsに載るので、Dockerもかなり簡単に扱える様になります。[^4]
WSL1からWSL2には環境そのままコマンド1発でとても簡単に変換出来るので、Windows10の一般ユーザーである私たちはWSL2のリリースまで以下で紹介する手順で環境を整えておくとしましょう！

##Windows10へのWSLの導入

###1. WSL機能を有効にする

* 「スタート」をクリックし、表示されたアプリの一覧の「W」欄から「Windowsシステムツール」をクリックします。
表示された一覧から「コントロールパネル」をクリックします。
![wsl01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/5cac7dbc-5a63-0482-c5b8-90aa334ce6ab.png)

* 「プログラム」をクリックします。
![wsl02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/49a7845b-3ebf-c564-ea28-658368363270.png)

* プログラムと機能を選択し、左の「Windowsの機能の有効化または無効化」をクリック
 ![wsl03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/c7238401-df42-a4b2-05aa-307eb28c225d.png)

* 「Windows Subsystem for Linux」にチェックを入れて、[OK]をクリック
*![wsl04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/507dde60-45fa-3369-8e6b-28dd538df5c6.png)

* Windowsを再起動する。

以上でWSLの導入は完了です！

###2. Linuxディストリビューションのインストール


* 「スタート」をクリックし、表示されたアプリの一覧の「M」欄から「Microsoft Store」をクリックし、表示されたウィンドウの検索欄に”WSL"と入力してクリックします
![wsl05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/588c44df-eddd-c888-17cb-12a279d22fa1.png)

* WSLにインストール可能なLinuxディストリビューションが一覧表示されます。いくつか種類があって（確かArchやKali Linuxもあった様な。。）迷いますが、Web上の情報も多い「Ubuntu」を選択する事でクリックします（最新のUbuntuが入ります）。
![wsl06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/2151c86b-b797-3a3d-e450-0a050147ca07.png)

* 「入手」をクリックするとインストール開始です。
![wsl07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/69ea9ebc-9133-a9a9-ef91-e1de1fad2d0d.png)

* コマンドプロンプトが起動し、下記の様なメッセージが表示されて止まります。

```
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:
```

* WSLで使うユーザー名、パスワード、パスワード（再入力）の順に1行ずつ入力し、[Enter]を押していきます。このあたりGUIなしで普通のLinuxをインストールした場合と一緒ですね。

```
Enter new UNIX username: rattcv
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
```

* 下記の様なメッセージが表示されればUbuntuのインストールは成功です！

```
Installation successful!
To run a command as administrator (user "root"), use "sudo <command></command>".
See "man sudo_root" for details.
 
rattcv@MyComputer:~$
```

* exitと入力するとコマンドラインが終了します。これでUbuntuが導入されました！


###3. ターミナルエミュレータのインストール

この段階でスタートメニューに「Ubuntu」が追加されていて、また画面下部のタスクバーにもUbuntuのアイコンが表示されてクリックすればすぐにUbuntuが使える様になっていますが、これで起動するCLI環境は、Windows標準のコマンドプロンプト上で動きます。日本語入力も出来てこのままでも十分使えますが、CLIアプリケーション上で記号や絵文字等の表示が崩れる問題があります。MacのiTerm2とも遜色無い環境が使いたいので、MS謹製の「WindowsTerminal」がちゃんと使える様になるまでは是非サードパーティーのターミナルエミュレータを導入してみましょう。
 [mintty](https://github.com/mintty) という前述した Cygwin 上で使えるWindowsネイティブ（Cygwin用のX Window System無しで使える）な強力なターミナルエミュレータがありますが、ありがたいことにその開発元で [wsltty](https://github.com/mintty/wsltty) というWSL環境でも直ぐに使える仕組みを準備してくれています。
細かな設定が可能でとても使い勝手が良く、WSL1で使うターミナルエミュレータの中では最もおすすめです。Sixel Graphicsにも対応しているので、ターミナル画面上に画像を表示したり動画を再生する事も可能です（これが滅茶苦茶面白い）。


 [こちら](https://github.com/mintty/wsltty/releases) からダウンロードします。現時点(2019/12/01)では3.0.6が最新で、これはWSL2にも対応しているんですが、前述したSixel Graphicsが正常に動作しないので3.0.2.3をインストールしましょう（画像表示とか必要ない人は3.0.6でOKです）。
この問題は将来の版で解決されるとは思います。（既にリポジトリには3.1.0が上がっていますが自分でCygwinを入れてビルドする必要がある）。

ダウンロードが完了したらファイルクリックでインストールです。インストールが完了するとタスクバーにペンギンのアイコンが追加されるので、これをクリックするとMinTTYでUbuntuが使える様になります。

初期表示はこんな感じで黒画面ですが、設定を変える為にウインドウ上で右クリックして「Options...」をクリックしましょう。
![wsl08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/8b3d9638-70c5-e0a3-e9cc-dfc61d788a01.png)


自分の今の設定はこんな感じです。
![wsl09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/0ca02727-5fd1-cb2b-1e3e-b5e4fdd52b63.png)



フォントは [Cicaフォント](https://github.com/miiton/Cica) がおすすめです。絵文字・アイコン表示もできますしプログラミングにとても適したフォントだと思います。


ここで変更した設定は
C:\Users\%USERNAME%\AppData\Roaming\wsltty\config
に保存されますが、これは直接エディタで編集する事も出来ます。

自分のwslttyの見た目(Vimが起動してます)はこんな感じです。

![wsl10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13048/67584c53-7d96-f234-9214-76be28743761.png)


参考までに上記画面のconfigを貼っておきますね。



```C:\Users\%USERNAME%\AppData\Roaming\wsltty\config
# To use common configuration in %APPDATA%\mintty, simply remove this file
Locale=ja_JP
Font=Cica
FontHeight=12
ThemeFile=
CursorType=block
CursorBlinks=no
Term=xterm-256color

RowSpacing=2
BoldAsFont=no
FontHeight=12
CursorType=block
CursorBlinks=no
Locale=ja_JP
Charset=UTF-8
Columns=112
Rows=34
ForegroundColour=68,68,68
BackgroundColour=223,223,223
CursorColour=95,135,175
Black=68,68,68
Red=175,0,0
Green=0,135,0
Yellow=175,95,0
Blue=0,95,175
Magenta=135,0,135
Cyan=0,135,135
White=255,255,255
BoldBlack=68,68,68
BoldRed=175,0,0
BoldGreen=0,135,0
BoldYellow=175,95,0
BoldBlue=0,95,175
BoldMagenta=135,0,135
BoldCyan=0,135,135
BoldWhite=255,255,255
Language=ja
BellType=0
```

ここまでの手順で、ワンクリックでLinuxのCLIが使える環境を整備する事が出来ました。
色々コマンドを打ったり、普通のUbuntu同様 apt でツールをインストールしてみてください！

「後編」では、WebのCLI開発でも良く使う Vim や tmux の、WSL 特有の便利な設定等を紹介したいと思います。ではでは。



[^1]: ちなみに僕は基本 LinuxDesktop で開発しますが、アプリ作成でWindows使う事もあるためshellが無いと死にます笑
[^2]: 最近Webに興味持ち始めた娘向けには MacBook Air のゴールドを購入しました。何かオシャレだし笑
[^3]: 反対にiOSアプリはMacじゃないと作れないとか、どうしてもMacが必要なシチュエーションはあると思います。
[^4]: 他にも制限はいくつかありますが、今回はDockerを例にあげました。