Rubyの実行環境構築 on Windows

#はじめに
Rubyの勉強をしたいなと思い、WindowsマシンにRubyの実行環境を構築した手順を投稿します。
構築方法はいくつかあると思いますが、今回は一番シンプルなRubyInstaller2を使用した方法を紹介します。
公式サイトで公開されているRubyInstaller2というインストーラーを使用して、ウィザードに従って進めていくだけで簡単に実行環境が構築できてしまう、お手軽な方法です。
また、Ruby諸々に関して初心者なもので、何か記述内容に誤りがありましたらご指摘よろしくお願いします。

#環境
- OS:Windows7 Professional(64bit OS)
- Ruby 2.4

#参考
手順は以下の投稿を参考にさせて頂いてます。ここの説明だけではわからないよという方はそちらも参考にしてみてください。

- [RubyInstaller2でWindows環境にRuby 2.4 + Rails 5.0.2をインストールする](https://qiita.com/jnchito/items/08b5be458134073c60e3)

- [Rubyプログラミング入門　Rubyのダウンロードとインストール](http://mrradiology.hatenablog.jp/entry/2018/01/14/154120)

#手順
では、順番に手順を追っていきます。

**1. RubyInstaller2のダウンロード**

- [RubyInstaller1](https://rubyinstaller.org/downloads/)

上記の公式サイトからRubyInstaller2をダウンロードします。

![RubyEnvironment1](https://cl.ly/3U0q2n3g4445/RubyEnvironment1.png)

64bit OSの場合はx64版、32bit OSの場合はx86版を選択してください。
なお、記事投稿時点(2018/01/28)ではRuby 2.5安定版対応のインストーラーがリリースされていましたが、Latest Newsにgemの互換性が不完全だから、今はまだRuby 2.4版のインストールをおすすめするよとコメントされていたことからRuby 2.4版を選択しています。
いや、それでも最新版が良いし、Ruby 2.5版の改善に貢献してやるぜというチャレンジ精神旺盛な方はRuby 2.5版でインストールしてみるのも良いかもしれません。

[Latest News(RubyInstaller 2.5.0-1 released)](https://rubyinstaller.org/2017/12/25/rubyinstaller-2.5.0-1-released.html)

**2. ダウンロードした実行ファイルの実行**

**3. Licenseにaccept**

![RubyInstaller3](https://cl.ly/1T2k3l3Y3B1e/RubyEnvironment3.png)


**4. 環境設定**

![RubyInstaller2](https://cl.ly/0q153Z1o0c3b/RubyEnvironment2.png)

特にこだわりが無ければデフォルトの設定で良いと思います。
補足としてはPathの設定ですが、Rubyのプログラムファイルを実行する時に```>C:\Ruby24-x64\bin\ruby.exe sample.rb```のように実行ファイルのパスを記述しなければいけないところを、Pathを設定することで```>ruby sample.rb```で実行できるようになるので、Pathは設定することをおすすめします。
後ほど、本当にPathが正しく設定されているかも確認します。

**5. インストールの完了**

![RubyInstaller4](https://cl.ly/0O010l18273f/RubyEnvironment4.png)

ここまででRubyのインストールは完了です。
続いてMSYS2のインストールに進むかどうか聞かれますが、MSYS2は一部のgemを使用する上で必要になるということなので、私はインストールしています。

**6. 「1」を入力してEnter**

![RubyInstaller5](https://cl.ly/143C3D1m2L2c/RubyEnvironment5.png)

MSYS2のインストールに進むと上記の画面が開き、「1」を選択するとウィザードが開きます。

**7. 「次へ」を選択**

![RubyInstaller6](https://cl.ly/3k0X2I0r2q1F/RubyEnvironment6.png)


**8. MSYS2のインストール先を指定**

![RubyInstaller7](https://cl.ly/1h1T292k3d2h/RubyEnvironment7.png)

**9. スタートメニューでの表示名を指定**

![RubyInstaller8](https://cl.ly/3I1R0l3V3g2q/RubyEnvironment8.png)

**10. MSYS2のインストールの完了**

![RubyInstaller9](https://cl.ly/0w252d2J170y/RubyEnvironment9.png)

「MSYS2 64bitを実行中」は「MSYS2 64bitを実行する」の誤訳みたいです。
チェックを入れたままだと完了後にターミナルが実行されたかな?
すいません、忘れてしまいました。

**11. インストーラーに戻って「2」を入力してEnter**

![RubyInstaller5](https://cl.ly/143C3D1m2L2c/RubyEnvironment5.png)

MSYS2のアップデートを行います。
「MSYS2 system update succeeded」とメッセージが表示されれば完了です。

**12. 再びインストーラーで「3」を入力してEnter**

![RubyInstaller5](https://cl.ly/143C3D1m2L2c/RubyEnvironment5.png)

「MSYS2 and MINGW development toolchain succeeded」とメッセージが表示されれば完了です。

正直言いますと、なんでMINGWというものが出てきたのかよくわかっておりません。
本当はその意味を理解して進めないと問題が起きた時にトラブルシューティングできないので、よろしくないのですが...
後々、追記してゆけたらと思いますのでお許しください。

以上で、MSYS2のインストールも含めてRubyの実行環境構築が完了しました。

#環境確認

最後に、本当に実行環境が構築できているのか確認してゆきましょう。
確認にはコマンドプロンプトかWindows PowerShellを使います。
個人的にWindows PowerShellの方が好きなので、本投稿ではWindows PowerShellでの確認方法を記述してゆきます。
Windows PowerShellについては以下の投稿が参考になると思います。

- [PowerShell 使い方メモ](https://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57)

##Pathの確認
先ほど言っていたPathが正しく設定されているか確認しましょう。
PowerShellのターミナルで以下のコマンドを入力してください。

``` :PowerShell
PS> $Env:Path.split(";")
```

コマンドの意味としては、PowerShellで予約されている環境変数参照用の変数「$Env」のPathの中身をセミコロンを区切りとして、表示してくれというところでしょうか。

ちなみに、「Env」はドライブを表しています。(物理的にEnvドライブが存在しているわけではないですが)
「Env」がドライブのひとつであることは以下のコマンドでわかります。

``` :PowerShell
PS> gdr

Name           Used (GB)     Free (GB) Provi
----           ---------     --------- -----
Alias                                  Alias
C                  43.94        168.85 FileS
cert                                   Certi
D                    .19         19.91 FileS
Env                                    Envir
Function                               Funct
HKCU                                   Regis
HKLM                                   Regis
Variable                               Varia
WSMan                                  WSMan
```

そして、「Path」がEnvドライブ下にあることも以下のコマンドでわかります。

``` :PowerShell
PS> dir Env:

Name                           Value
----                           -----
ALLUSERSPROFILE                ***
  :
Path                           ***
  :
```

本題に戻りまして、Path確認のコマンドで以下のように表示されれば設定できています。

```:PowerShell
PS> $Env:Path.split(";")
C:\Ruby24-x64\bin          /*インストール時に指定したパスの配下のbinフォルダ
```

もし、Pathが正しく設定されていなければ、以下のコマンドで設定できます。
設定に関してはWindows PowerShellを管理者として実行してから行ってください。

```:PowerShell
PS> $oldSystemPath = [System.Environment]::GetEnvironmentVariable("Path", "Machine")
PS> $oldSystemPath += ";C:\Ruby24-x64\bin"  /*インストール時に指定したパスの配下のbinフォルダ
PS> [System.Environment]::SetEnvironmentVariable("Path", $oldSystemPath, "Machine")
```

各コマンドの簡単な意味としては、
1. 現在のPathの設定を変数$oldSystemPathに格納
2. 変数$oldSystemPathに対してRubyのPath設定を追加
3. 変数$oldSystemPathを適用
といった流れです。

より詳細な説明は以下のページが参考になると思います。

- [【PowerShell】環境変数を設定する](https://hosopro.blogspot.jp/2017/01/powershell-set-environment-variable.html)

最後に、Pathが通っているか確認しましょう。
ホームディレクトリとか適当なカレントで以下のコマンドを実行して、Rubyのバージョンが表示されれば完璧です。

```:PowerShell
PS> ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x64-mingw32]
```

##Rubyの実行確認
実際にRubyスクリプトが実行できることを確認しましょう。
デスクトップとか適当な場所に以下のRubyスクリプトを作成。

```Ruby:sample.rb
puts 'Hello world!'
```
PowerShellの実行で以下のように表示されれば環境の構築は完了です。

```:PowerShell
PS> ruby xxx\sample.rb  /*xxxはsample.rbを作成したディレクトリを指定してください
Hello world!
```

以上でRuby実行環境構築は完了です。

#補足
Encoding設定でハテナなことがあったので、メモ程度に記述しておきます。
Encoding設定はインストール手順の以下の画面で設定する"Use UTF-8 as default external encoding"の部分です。

![RubyInstaller2](https://cl.ly/0q153Z1o0c3b/RubyEnvironment2.png)

ここの設定としてはRubyスクリプトをデフォルトで文字コードUTF-8として読み込むよ、だからUTF-8以外の文字コードで保存されたRubyスクリプトで文字リテラルの出力処理なんかすると、文字化けする可能性があるよと解釈しています。(この解釈が間違っているかもしれませんが...)
本当にそうなのかなと思って、じゃあ、デフォルトUTF-8 Encoding設定を追加して確認してみようということで以下の環境変数を設定しました。


```:PowerShell
PS> [System.Environment]::SetEnvironmentVariable("RUBYOPT", "-EUTF-8", "User")
```

環境変数RUBYOPTにデフォルトのEncoding文字コードを設定します。
そして、以下のようなRubyスクリプトを作成して実行。

```Ruby:sample2.rb
puts 'あいうえお'  /*UTF-8形式でファイルを保存
```

実行結果は'あいうえお'が出力される想定通りの結果でした。
次はsample2.rbをS-JIS形式で保存して実行すると、```invalid multibyte char (UTF-8)```と怒られて、そもそも文字化けとかではなくて実行できないのかと納得。

ここで、なんとなくirbを実行。なんと、irbが実行できない!?
irbはInteractive RubyのことでRubyを対話的に実行できるインタプリタのことです。詳細は以下のページを参考にしてみてください。

- [library irb](https://docs.ruby-lang.org/ja/latest/library/irb.html)

irbのエラーは以下のようなものでした。

```:PowerShell
PS> irb
C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `delete': invalid byte sequence in UTF-8 (ArgumentError)
        from C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6135:in `alloc_history_entry'
        from C:/Ruby24-x64/lib/ruby/site_ruby/rbreadline.rb:6168:in `add_history'
        from C:/Ruby24-x64/lib/ruby/site_ruby/readline.rb:368:in `<<'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `block (2 levels) in load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `each'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:76:in `block in load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:75:in `open'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:75:in `load_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:65:in `extended'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:21:in `extend'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:21:in `init_save_history'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/ext/save-history.rb:45:in `save_history='
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb/context.rb:92:in `initialize'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:412:in `new'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:412:in `initialize'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:383:in `new'
        from C:/Ruby24-x64/lib/ruby/2.4.0/irb.rb:383:in `start'
        from C:/Ruby24-x64/bin/irb.cmd:19:in `<main>'
```

irbはRUBYOPTを設定するまでは正常に動作していました。
後からRUBYOPTを追加しただけだから何か設定が足りていないのかなと思い、一度Rubyをアンインストールし、インストールウィザードの"Use UTF-8 as default external encoding"の設定にチェックを入れて再度インストール。
RUBYOPTに「-EUTF-8」が設定されていることを確認。
UTF-8形式のRubyスクリプトが実行できて、S-JIS形式は実行できないことを確認し、再度irbを実行するも上記と同じエラーに。

そもそも、RUBYOPTを設定しない状態のデフォルトのEncodingってなんだろうと思い、RUBYOPTを削除した状態でUTF-8形式とS-JIS形式のRubyスクリプトを実行。
すると、UTF-8形式は実行できて、S-JIS形式は実行できませんでした。他にもEUC-JP形式のものも試しましたが実行できませんでした。
この状態であればirbも正常に実行可能。

RUBYOPTにUTF-8のEncodingの設定をしてもしなくてもデフォルトのEncodingはUTF-8で、なおかつ、RUBYOPTにUTF-8のEncoding設定をするとirbが使えなくなる。
これってRUBYOPTの設定いらなくないかという結論に至りました。

本当はirbエラーの内容を紐解いて解析していくべきなのでしょうが、現状でそこまでのスキルが無く、RUBYOPTを設定しないことで問題が生じたらまた考えようかという感じで落ち着きました。