Bash on Ubuntu on Windows (on Mac) つかってみた。

**記事内容は古くなっているため。 WSL(bash on windows)に興味がある方は別記事をご覧ください**

------------------


待ちわびた、windows fall creaters update
**みなさんは楽しめましたか？**

私の知り合いの中にアップデートに`嘆く人`や、`喜ぶ人`、いろいろいましたw

windowsUserにとってはBow(Bash on Windows)の正式版ということですぐにアップデートした人もおおいのではないでしょうか？

皆さんはどうでしたか？
A:「よっし！アプデ！！!おおおぉぉぉおおおっ便利！！！！！！！！！」
B: 「よっしゃきた〜〜〜〜〜〜！！！！！！アップデートしたろ！！！wwww
あああああああああwwwwwww環境しんだあああああああwwwwつらすぎぃぃwwwwww」
C: 「ちょっと様子見かなぁ。。。」
D:「え？そんなことあっったん？？？w」（そもそもアプデ知らない）

と、まぁ人それぞれ一喜一憂あったのではないでしょうか？w

windowsアップデート、エンジニアにとっては`アプデしたい欲` と`環境壊れたらどうしよう。。。`という葛藤がありそうですね。。

twitterでwindowsupdateでエゴサすると。。悲劇の声がおおいですし。。。（苦笑）
　> https://twitter.com/search?q=windows+update

--------------------------------------

そこで、今回は**普段vurtualbox + vagrant 等の仮装環境を使っている人** や、**Linuxをデュアルブート**している人***WSL?なにそれ？***って人向けの
　**windows Subsystem for Lunux**　入門記事となってます！

## agenda
1. そもそもWSLとは
2. WSLメリット・デメリット
3. なんでWSLなの？
4. WSLのインストール
5. rails on WSL
6. python(jupyter) on WSL
7. nginx on WSL
8. まとめ

##1.そもそもWSLとは
- WSL(Windows Subsystem for Liux)と呼ばれるものです  
 →なるほど。(わからん！w)  
 では調べてみよう！  
 ['ok google、 Windows Subsystem for Linux ってなに？'](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux)  
（ちなみにgoogle homeはwikiの中のトップのほうを読み上げてくれるみたいです？w）
→google home を真似して上記linkはwikiに飛んでいます。

- 簡単にいうと
　**windowsでbashが叩ける！というもの**

```
後ほど追記します！w
(勉強不足。。)
```

##2. WSLメリット・デメリット

```メリット.md
1.bashが使える
2.アプリをいれるだけで実質Linuxが使える！
3.今までvurtualbox,VMwareを使っていたのであれば下記のメリット
　 - メモリをそちらに割かずに利用できる！
　 - 仮想環境の移動がいらない
　 - vagrantの環境構築エラーのようなエラーは基本ない（はず）
　 - windows storeで提供してるのでupdateでエラーもない！（よね？流石に）
```

```デメリット.md
- インストールするまでの設定がちょっとだけめんどくさい（おそらく本当のしょがくしゃ）
- ファイルシステムとか裏側がちょっとわかりにくい

でしょうか...んーいまのところは感じてない
```

##3. なんでWSLなの？
WSLを使わずともwindowsでのプログラミング環境は様々な選択肢があります。
 1. windowsの上でそのまま開発する方法。
 2. デュアルブートして、Linuxマシンとして開発する方法(これだとwindows機とは呼べない。。。w)
 3. dockerを使ったコンテナ技術を使う方法
 4. AWScloud9 を使った開発方法
 5. VirtualBox等のGUIを使ってLinuxを使う方法
 6. vagrantを用いたwindowsとLinuxのいいとこ取り方法
 7. そしてWSL！

 こんなにもいろいろな方法があるのにWSLのどこがいいのか考えてみます。 

| 開発環境  |  実行速度  |環境構築難易度| 理由 | ネット環境の有無 |
|:---:|:---:|:-----:|:-----:|:------:|:--------:|
|そのままwindows   |早い  | ○(△)| 言語によってはアプリで終わる。物によってはめんどくさい。  |ローカル環境なので不要|
| デュアルブート | 早い|△| パーティション設定を失敗するとデータが全て吹っ飛ぶ可能性 | 不要 |
|docker| それなりに早い | △ |ある程度のdockerの知識があればすぐにできる（初期学習コストが高めかも） | dockerの環境構築時のみインターネット必須 |
|AWScloud9|ちょっと遅い？課金すれば早くなるはずw|◎|会員登録だけ。楽|開発したい時は常にネット環境必須|
|VirtualBox|それなりに早い(ホストマシンからのメモリ割り当て次第)|○|installerに従うだけ|ISOをダウンロードする際だけネット必須|
|vagrant|VBと同じく、ホストマシン次第。|○~×|windowsのマシンによってはBIOSレベルでの変更が必要。vagrant&&VirtualBoxのバージョンの相性等、いろんなエラー原因がある。|初期の設定時のみネット必須|
|WSL|早い（ホストマシンのスペック次第？メモリ割り当てとか自動）|◎|windowsStoreからダウンロード。ぽちぽちするだけ|downloadの時だけ必須|


個人的にはネット環境がない場合でもプログラミングをすることがあるため、消去法的に**'AWSclud9'**は使えないですね。。
また、windows上での開発だとmacユーザーとのチーム開発でたびたび問題になることがあるので**'そのままのwindows'**も消えます。
**'docker'**は以前学習しましたが、コマンドがひたすら長い。。
→当然メリットはあるのですが、メイン開発環境としてdockerというよりは
VB+vagrantの上でdockerとか、WSLの上でdocker、windowsの上でdockerを利用した検証環境としての利用を主な手段にしそうなので、これも選択肢から消えます。

```memo.md
2. デュアルブートして、Linuxマシンとして開発する方法(これだとwindows機とは呼べない。。。w)
5. VirtualBox等のGUIを使ってLinuxを使う方法
6. vagrantを用いたwindowsとLinuxのいいとこ取り方法
7. そしてWSL！
```
になりますが、
*デュアルブート*はパーティション破壊した人を何名か知っているのでできればしたくない、、、  
*VirtualBox*はホストマシンのメモリを半分くらい割かないと少し大きい開発の時に死にかける（4G ~ 8G）  
*VB＆＆vagrant*はエラー発生しまくる（特にwindows update直後や、VB,vagrantのお互いのヴァージョン依存関係がめんどくさい）  
というような**デメリット**を大きく感じてしまいます。。

なので本エントリでは　　

- ホストマシンのメモリを十二分に発揮できる。
- WindowsのファイルをWSLからいじれる。
- WSLで作成したファイルをwindowsからいじれる
- localhostをwindows WSLともに共有している。
- **windowsが公式サポートしている！**
- なんとなく使ってみたかった！（***超重要***）

という理由から***WSL***を利用しております！w
(9割近く、**使いたかっただけ**なのにディスりまくってる。。。。それぞれの環境のいいところあったらコメント欄で**優しく**指摘して欲しいです。)

##4. WSLのインストール
**では早速早速。windows storeからダウンロード！！！！！！！！**
→*だめ。絶対*
[![Screenshot from Gyazo](https://gyazo.com/e378c5f461fe3ee275fd741f8d0ebf12/raw)](https://gyazo.com/e378c5f461fe3ee275fd741f8d0ebf12)
**ここで止まってなにもできません！w**

まず、WSLをinstallするには設定をしなければなりません。  

- windows insider previewの機能をonにする
- windows の設定 WSLをonにする

1.windows insider previewの機能をonにする

 - windowsの設定画面から
 　設定 > Windows insider Program
[![Screenshot from Gyazo](https://gyazo.com/0b6070cf0bc875030e455795244ef63c/raw)](https://gyazo.com/0b6070cf0bc875030e455795244ef63c)
windowsの最新アップデートなどを受け取るためにmicroSoftアカウントを紐付けます！
→サイトから登録し、めーるでの認証ですが。comformメールをクリックしてからここの設定画面で認証突破するのに半日くらいのタイムラグがありました。。。

2. コントロールパネル＞プログラム＞windows機能有効化＞windows subsystem for linux にチェック！
[![Screenshot from Gyazo](https://gyazo.com/2d70089e3d29479b558a19f91e8e926a/raw)](https://gyazo.com/2d70089e3d29479b558a19f91e8e926a)

[![Screenshot from Gyazo](https://gyazo.com/cf3064b0615d8130aa10239159b58a7c/raw)](https://gyazo.com/cf3064b0615d8130aa10239159b58a7c)

[![Screenshot from Gyazo](https://gyazo.com/c9065b7060a033808e8199bd59a5b736/raw)](https://gyazo.com/c9065b7060a033808e8199bd59a5b736)

これで事前準備が終了です。
**windowsStoreを開いてinstallしましょう！**
[![Screenshot from Gyazo](https://gyazo.com/23d8c6be4b800536decda3bc5f630d79/raw)](https://gyazo.com/23d8c6be4b800536decda3bc5f630d79)

installしたらアプリケーションを開くと**ドス窓**のようなものが起動します。
（初回起動はすごい長いかもしれません、気長に待ちましょうw）
[![Screenshot from Gyazo](https://gyazo.com/304aa0a9ae1643a841d27c8c3dc28860/raw)](https://gyazo.com/304aa0a9ae1643a841d27c8c3dc28860)
すると、起動ができます！


**では、普段私が使ってる開発環境や、http serverがWSLで使えるのか試してみます。**


##5. WSLにrails環境をつくってみる　→rails sまで

[過去の自分のメモが役に立った](http://fumihumi.hatenablog.com/entry/2017/11/08/195814)

```command.txt

#必要そうなライブラリ入れる。
$ sudo apt-get update
# sudo apt-get install vim
$ sudo apt-get -y install git curl g++ make
$ sudo apt-get -y install zlib1g-dev libssl-dev libreadline-dev
$ sudo apt-get -y install libyaml-dev libxml2-dev libxslt-dev
$ sudo apt-get -y install sqlite3 libsqlite3-dev nodejs
$ sudo apt-get -y install mysql-server mysql libmysqlclient-dev
$ sudo /etc/init.d/mysql status
$ sudo /etc/init.d/mysql start
$ sudo mysql -u root -p
 > password: (設定時に入力したpass)

#rbenvいれる
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ which rbenv
-> /home/("user name":fumi)/.rbenv/bin/rbenv

$ rbenv install 2.5.1
(今回は2.5.1系を入れます)
$ rbenv global 2.5.1
$ rbenv rehash
$ ruby -v
(install したrubyバージョンが出てれば成功)
＃ここからrails環境構築
$ gem install bundler
$ gem install rails
$ rails -v
(install したrails バージョンが出てれば成功)
```

**rails sampleを走らせてみる**
windowsからエディタで編集することも踏まえシンボリックリンクを貼ります

- $ ln -s /mnt/c/Users/fumi/Desktop/rails rails

- $ cd rails
- $ rails new sample -d mysql (databaseにmysql)
- $ rails s
ブラウザで[localhost:3000](http://localhost:3000/)にアクセス！
[![Screenshot from Gyazo](https://gyazo.com/c0ccdef99e250abf2a120530584ba070/raw)](https://gyazo.com/c0ccdef99e250abf2a120530584ba070)
**できた！**
（追記）：https://qiita.com/moyashimanjyu/items/31134451c584668dfd26
WSLのfileシステムの問題でエラーになる場合もある？リンク先参考

WSLというアプリケーション上で立ち上げたrailsサーバーにはportfording。
もしくはip指定をしないと無理なのかと思ってましたが。
localhostでアクセスできるんですね。。。　　(*発見*)

つまりは、windowsの中でアプリケーションとして動いているlinuxがサーバーになるだけであって、完全に仮想空間として分離していない。。。？・・

ipaddressが一緒です（下記添付）

[![Screenshot from Gyazo](https://gyazo.com/abf995fa8d8dd91cec1ddbd82847cd69/raw)](https://gyazo.com/abf995fa8d8dd91cec1ddbd82847cd69)

localhostでアクセスした際にwindows側でlocalhostとアクセスするのは、
WSLのipを踏むことと同じ,ということですねw

***詳しい方コメントください！w***


##6. WSLにpython環境→ jupyter notebook起動まで

```command.txt
まず、pyenvを入れます
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
その後、bashrcに設定を書き込みます

$ echo 'export PYENV_ROOT="$HOME/.pyenv"'
$ echo 'export PATH="$PYENV_ROOT/.pyenv/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ which pyenv
→  /home/fumi/.pyenv/bin/pyenv
$ pyenv install --list | grep anaconda
# 今回はanacondaを用いた環境にしたいので grep anacondaとし、結果を少なくしています。
# そこで表示されたうちインストールしたいバージョンを次のコマンドで入力します
$ pyenv install anaconda3-4.4.0
$ pyenv versions
→ インストールしたものが表示されていれば成功(次のコマンドで利用します。)
$ pyenv shell anaconda3-4.4.0
$ pyenv rehash
$ python --version
→ Python 3.6.1 :: Anaconda 4.4.0 (64bit)
# 今回は機械学習（jupyterを使いたい）のでanacondaをインストールしました。

## jupyter 起動
$ jupyter notebook
# tokenの入力があるのでサーバーログからコピペするとloginできます。
```
[![Screenshot from Gyazo](https://gyazo.com/67a0570aa0b5a72905c98b1f45f214c4/raw)](https://gyazo.com/67a0570aa0b5a72905c98b1f45f214c4)
[http://localhost:8888/tree](http://localhost:8888/tree)
このURLで、jupyterにアクセスできました！
rails同様localhostでアクセスできるのは楽ですね。

##7. WSLでnginxを走らせてみよう！

```command.txt
$ cp /etc/apt/sources.list /etc/apt/sources.list.org
$ vi /etc/apt/sources.list
#末尾に下記３行を追加
  ## nginx
   deb http://nginx.org/packages/ubuntu/ precise nginx
   deb-src http://nginx.org/packages/ubuntu/ precise nginx
# この三行を追加することでaptでnginxを入れるための準備の準備ができる。

$ diff /etc/apt/sources.list /etc/apt/sources.list.org
# 入力した内容の確認をします。

$ wget http://nginx.org/keys/nginx_signing.key
$ cat nginx_signing.key | apt-key add -
$ apt-get update

$ apt-get install nginx
$ sudo nginx
# nginx 起動
```
起動した状態で[http://localhost/](http://localhost/)にアクセスし、下記のようになっていれば成功です！

***dekita!***
[![Screenshot from Gyazo](https://gyazo.com/a92641d6026c5bf0621232c3b32051c4/raw)](https://gyazo.com/a92641d6026c5bf0621232c3b32051c4)


WSLでもサーバーになれるんですね！w
ただ、あまり推奨はされてないみたいです。
[![Screenshot from Gyazo](https://gyazo.com/1bfacff3689badd6d4e2fdb874139afe/raw)](https://gyazo.com/1bfacff3689badd6d4e2fdb874139afe)

WSLのnginxをサーバーにしてオリアプ展開したらダメってこと。。でしょうか？
→***まぁ。さすがにクラウドつかいますよね？***

***個人開発程度でなら便利なので良さそうですね***


##8. まとめ
***WSLいいぞ***

- bashが使える（**重要**）
- vimが使える（**重要**）
- localhostが共有されているのでVMとかではipを調べたり必要があるがそれの必要がない。  
- ホストマシンのファイルを編集できる。ホストマシンからも編集できる。  
- ホストマシンのリソースを最大限に発揮できる。
- 多分マシンによってエラーとか、ないはず。（Hyper-vを利用している訳でもなさそうなので。）
→情報不足ですので、***　（俺｜私｜僕）のマシンでWSL使えねぇ!○すぞ！***って情報あったらコメントが欲しいです。

--------------------------------------------------------------------

***最後に***

***個人的にWSLをなんとなく使ってみたかっただけで、信者という訳ではありません。***

### ※検証環境について
 MacBook Pro (13-inch, 2017),macOS High Sierraのマシン
[VMwarefusion version8.5.9](https://store.vmware.com/store?Action=pd&Locale=ja_JP&SiteID=vmwjapan&gclid=CjwKCAiA693RBRAwEiwALCc3u4oJl3SPRw1W_0dawzfkK0AMG8ds9uXj2X93pf7XJlhh_Ogp0AGx2xoCqacQAvD_BwE&k_clickid=63700cdc-6a60-4e2a-b6ec-d2670dd86731&kw=vmwarefusion&mt=e&productID=5124966800&src=ps_570c41fd1ed2e&utm_campaign=GS_eBiz_Lead_APJ_JP_JA_BR_RLSA_Fusion&utm_medium=ppc&utm_source=google)を利用し、windows10を仮想空間に立ち上げています。

# WSLの導入は個人の責任のもとお願い致します。

***補足や、ご指摘等ありましたら、コメントにてお願いいたします。***


参考にさせていただいたwebサイト。
[Rails on WSL](https://qiita.com/moyashimanjyu/items/31134451c584668dfd26)
[【随時更新】pyenv + Anaconda (Ubuntu 16.04 LTS) で機械学習のPython開発環境をオールインワンで整える](http://blog.algolab.jp/post/2016/08/21/pyenv-anaconda-ubuntu/)
[Ubuntu 12.04LTSにnginxをインストールする方法](https://webkaru.net/linux/nginx-install-ubuntu-12-04lts/)
[ubuntuでnginxの起動と最低限のコマンド](https://joppot.info/2014/03/10/970)

最後までお読みいただき有難うございます。