WindowsでRubyとPostgreSQLを使う！ (WSL + VSCode)

## P.S. 動画にしました。
[YouTubeリンク](https://www.youtube.com/watch?v=IO2OX6VWYJY)
↑ 動画の 44:23 まで視聴頂ければ幸いです。後半は余談なので、無視で大丈夫！ (´・ω・`)

- 2020/10/22追記： インストールするRubyのバージョンを、Youtube動画に併せて、2.6.3 -> 2.6.5 表記に変更しました。

## 目標
- 以下の3つを使える様に (パソコンの環境を整える=>) 環境構築 する！
  * Git
  * Ruby
  * DB


## ざっくり全体の構成
- Windows 10
  * WSL
    * Ubuntu
      * Git
        * PostgreSQL
        * rbenv
          * ruby 2.6.5

WSLというWindows10の機能を使ってUbuntuと呼ばれるOS環境を構築します。  
そのUbuntuの中で 3つ(Git, Ruby, DB) を使える様にします！


## info. これからやること (Agenda)
1. Windowsの上でLinux環境を簡単に構築できるWSLという機能を有効にする。
2. MicrosoftStoreから「Ubuntu」をインストール。
3. Ubuntuを起動。(初回起動でNameとPassを設定)
4. PostgreSQLというデータベースの管理ソフトをインストール！
5. Rubyをインストールする。。。もろもろ。
6. VSCodeのターミナルを、今回構築したWSLのコンソールに紐付ける。


## 余談： なぜUbuntuなのか？ Windowsのそのままでは駄目なのか？
Windowsは接続やインストールで手間取る。  
それと、Qiitaやネット上の情報はMacOSやLinuxでの環境を前提に解説している事が多い。

WindowsOSではなく、Linuxベースにすることで、環境を近づけられる。  
ということで、今回はWindowsの上に、Linuxのディストリビューションの一つ、Ubuntu環境を構築していきます！

以下説明に入る。貼り付けて欲しいコードは、

```
コード部分
```
この様に表記していく。


## Info. 前提のハードウェア情報：
今期は「WSL」というWindowsの機能を使用して、Ubuntu環境を構築していく。  
このWSLは64ビット版のWindows10しか対応していない。  
※Home, Proどちらでも利用可能

また、OSのバージョンが1709以降でないと使えない。  
※1709でない人はWindows Updateをして欲しいです。

※OSの詳細を確認する方法  
1. 設定を開く(Win-I)
2. 「システム」
3. 「バージョン情報」
4. 「デバイスの仕様」「システムの種類」でビットを確認
5. 「Windowsの仕様」「バージョン」でバージョンを確認

[参考Qiita記事](https://qiita.com/Brutus/items/f26af71d3cc6f50d1640)


## 01 WSLの有効化： デフォルトでは無効なので、有効にする。
1. Windowsボタンをクリックして、検索窓に「Windowsの機能」と打つと出る。  
※プログラムのアンイストール → Windowsの機能の有効化または無効化でも行ける

2. 「Windows Subsystem for Linux」にチェックを入れる。  

※2020/10更新：
Windowsの機能の有効化または無効化の画面にて、「Windows Subsystem for Linux」の項目が表記されていない方は、
「Linux用Windowsサブシステム」を変わりに選択してください。
※最近のWindowsUpdateにて名称が変更された様です。


PCの再起動が始まる


## 02. 再起動後に、Microsoft Store で 「WSL」と検索して、「Ubuntu」をインストールする。
2020/10/24時点では、20.04 LTS があると思うので、そちらが推奨です！！ (後々のUpdateが少なくて済むというシンプルな理由です)

※頻繁に起動する様なら、タスクバーにピン留めすると良さそう。


## 03. Ubuntuの初期設定： Ubuntuのユーザー名とパスワード設定
初期起動のみUserNameと、Passwordの設定が求められる。
1. ユーザー名(任意)：
- 例) ```codebase```
- 例) ```lagoon```

2. パスワード(任意)：
- 例) ```pass```
※パスワードは、タイピングしても画面に表示されません。表示されませんが、打ててはいます。


## 04 PostgreSQLをインストールする
aptのインストール先を最新の状態にする  

```
sudo apt-get -y update
```

aptを使用して、PostgreSQLをインストールする  

```
sudo apt-get -y install postgresql
```

PostgreSQLサーバーの起動コマンドを入力  

```
sudo service postgresql restart
```

※後々DBを使う時に、通常はPCの起動時にDBは起動するが、まれにしない時がある。  
その場合は、上のコマンドを打てば良いので覚えておくと良い。


## 4.1 PostgreSQLの初期設定
インストール直後の設定が色々ある。  

まずは、下のコマンドを打ち込んでPostgreSQLへアクセスする。  

```
sudo -u postgres -i
```

ユーザーの作成  
※このユーザー名は、Debianの初期起動時に作ったユーザー名が良いかも。  

```
createuser -d -U postgres -P (任意のUser名) --superuser
```  
  - 例)  

  ```
  createuser -d -U postgres -P codebase --superuser
  ```
  - 例)  

  ```
  createuser -d -U postgres -P lagoon --superuser
  ```  

パスワードを求められたら、任意で打って欲しい
  - 例) ```pass```  
※たぶん確認用で2回、打ち込む事になるはず。

サンプルのデータベースを作成  
※もしかしたらエラー(例： WARNING: could not flush dirty data: Function not implemented)がたくさん出るかもしれない。でもWSL特有？のエラーらしく、まぁ正常にデータベースが作成されるので良いか。あとで調べるかも。  

```
createdb hello --owner=(先程作ったUser名) --template=template1
```  
  - 例)  

  ```
  createdb hello --owner=codebase --template=template1
  ```
  - 例)  

  ```
  createdb hello --owner=lagoon --template=template1
  ```

初期設定は終わったので、抜ける。  

```
exit
```


## 4.2 psqlが普通に動作するか確認
postgresにはpsqlコマンドを使ってアクセスする！  

```
psql hello
```  
※解説： 先程の初期設定で作ったhelloというデータベースへアクセスするコマンド

無事に先のコードが実行されたか確認する
ここまで無事に出来たら、PostgreSQLは大丈夫！  
よしPostgreSQLへのアクセスから抜ける  

```
\q
```
※ `\` が `￥` の半角で表示される方がいるかも？ でも大丈夫。同じです。


## 05 Rubyの構築
次にRubyが実行できる様に環境構築していく！

まずrbenvを紹介する。  
rbenvはRuby用のパッケージ管理システムのこと。  
Rubyをインストールするのにも使えるし、様々なバージョンのRubyを切り替えたりするのがスムーズに可能！

※なぜバージョンを切り替える必要があるかと言うと、その方が便利だから！  
今作ったWebAppが2.6.5で作ると、でもそれが来年のRuby2.7.xで動作する保証って無いよね。。。  
各プロジェクトごとに適用するRubyのバージョンを変更できた方が助かる。

それ、rbenvで管理させよう！てな感じです。  
[参考Qiita記事](https://qiita.com/tatsurou313/items/2a67075ae2416922bff0)

結論： Rubyは、rbnevでインストールする！という事でrbenvをインストールしよう！！！

その前に、rbenvをインストールする為に必要なパッケージをまずは、インストールする  

```
sudo apt-get -y install git autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev gcc libpq-dev
```

では、rbenvのインストール  
[参考記事](https://www.write-ahead-log.net/entry/2018/03/14/233630)  
↓一行ずつ(全部で5回)実行して欲しい。  

```
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
```  
rbenvのインストールはこれで終わり。  
次にRubyをインストールするが、インストールする前に、rbenvが無事に使えるか確認したい。  

インストール可能なRubyのバージョン一覧を表示させてみよう  

```
rbenv install -l
```

実際にRubyをインストールする。  
今回は2.6.5をインストールする。  
めっちゃ時間かかる(大体15-40分)  

```
rbenv install 2.6.5
```  
※このインストール間、画面上の表記があまり変化せず・・・あれ？フリーズしてね？って思うかもしれないが、大丈夫！、、、なはず。  
しばらくまってみよう。1時間待っても駄目なら疑おう。  

無事にRubyがインストールできたか、確認してみる  

```
rbenv versions
```  
ここで表示された一覧で、米印みたいなのが、systemでなければok

benvで今インストールした2.6.5を標準で使うように設定する  

```
rbenv global 2.6.5
```

ついでに、Rubyのバージョン確認コマンドを実行して確認もしよう。  

```
ruby -v
```  
インストールしたver(今回で言うと2.6.5)ならok

// rbenvをaptではなく、github経由でインストールする理由は、githubからだと比較的最新のバージョンをインストールできるから。・・・だったはず。。。


## 5.1 Rubyの便利なライブラリを入れとく
Rubyではライブラリをgemにパッケージ化してます。  
そのgemを管理する、パッケージ管理ツールがRubyGemsです。  
RubyGemsはRubyインストールと同時に使えます。

簡単に言うと、ライブラリ(拡張機能)はGemと呼ばれる機能で管理されてるし、インストールする時にはGemコマンドを使うよって事。  
gemはaptに似てる。

よし！では今後使いそうなGemをインストールしていこう！  

```
gem install sinatra sinatra-contrib pg -N
```  
※インストールで、セキュリティ警告のウィンドウが出るはず。許可してあげて。


## 06 VSCodeの設定変更
今回はWSLで環境構築したが、開発で使うVSCode上のターミナルからその環境にアクセスしたい。  
よって、VSCodeのsettings.jsonに以下を記述する。

※settings.jsonの開き方は、Ctrl-Shift-Pを押して、そこで「json」と入力。  settings.jsonを開く的なニュアンスの英語が選択肢としてあると思うので、それをクリック！

波括弧 "{ (中身) }" の中身に以下のコードを貼り付け  

```settings.json
// ターミナルを開いた時にWSLのCUIにアクセスするように設定 at 2019/06 on CODEBASEプログラミング教室
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe"
```

試しにターミナルを起動して確認してね。  
※ちなみに、ターミナルを開くショートカットがあるぞい。Ctrl-@
2020/10追記： 初回起動時には、右下に許可を求めるポップが出てくるので、許可ボタンをクリックして欲しいです。


試しに、インストールRubyのバージョンを確認するコマンドを打ってみても良い。  

```
ruby -v
```  
さっきと同じ2.6.5が表示されれば成功


## (余談)info. シンボリックリンクを作成しとく
必要な人のみやる。ただ、何かと便利  
シンボリックリンクとは、簡単に言うとショートカット。

- デスクトップへのリンク作成  

```
ln -s /mnt/c/Users/(Windowsユーザー名)/Desktop ~/Desktop
```

- 僕はOneDriveもやっとく  

```
ln -s /mnt/c/Users/(Windowsユーザー名)/OneDrive ~/OneDrive
```


## 最後に
本来はaptで取得する先を日本のサーバーに切り替えた方が良いらしいが、変更してうまくいくのか検証していないので、載せていない。今後、成功したらアップデートしとく予定。