Javaエンジニアがいまさら始めるRuby開発環境

普段Javaを主言語として使っている人が、Rubyを始める時の開発環境構築の記事です。
自分は、2006年ぶりのrubyです。
最近、再び触ろうとしましたが、すべてを忘れていました。(つまり初心者)
なので、試行錯誤して作った環境構築と参考にした記事を記述しています。
（それとJavaでいうところの何なのかをも書きます。）
なお参考にした記事のリンク先を見た方がそれぞれの理解が深まると思います。

mac環境限定です。

# 構築の前に

構築の前にRuby環境において、Javaでは何なのかを簡単にまとめておきます。
正確には違うけど、大体こんな感じと捉えて下さい。

| Ruby                    | Java  | 概要|
|:-----------------------:|:----------------------:|:------------:             |
| rbenv                   |SDKMAN!                 |複数バージョンの使い分けの仕組み|
| gem                     |jar                     |ライブラリとしての意味とコマンドとしての意味がある|
|http://rubygems.org/     |http://search.maven.org/|ライブラリのレポジトリ         |
| bundler                 | gradle,maven           |パッケージ管理ツール           |
| rubocop                 | checkstyle             |コーディング規約のチェックツール |
| rubocop -a + Vim設定など | formatter              |ソースフォーマッターツール       |
| RDoc,YARD,TomDoc        |       JavaDoc          |ドキュメント。RDocが標準       |
|Test::Unit               |JUnit                   |単体テストフレームワーク        |
|RSpec                    | Spock(Groovy)          |BDDフレームワーク             |

Editorは、人によって大きく違うと思うけど、大体こんな感じだと思います。

* Rubyでは、Vim,Emacsなどのエディタ + Plugin + 開発支援なgem
* Javaでは、Eclipse,NetBeans,IntelliJなどのIDE

Javaの人はIDEが無いと辛いと思うかもしれませんが、Vim Pluginや開発支援するgemを使えば、IDEと遜色なく使えるのではないかと思います。
例えば、エディタ上で以下のことはできます。

* コード補完
* ブレイクポイントを置いて、ステップ実行
* カーソル上のクラスやメソッドに飛ぶ（gemやRuby本体のC言語も含む）
* 知りたいクラスやメソッドなどのドキュメントやソースの表示
* 保存時にコーディング規約違反の表示

# homebrew

mac標準のrubyでまずはhomebrewをインストールします。

```$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"```

ruby開発環境に関係するものを <del>Brewfile</del>  brewfile.sh に記述します。
(Brewfileは使えなくなったので書き換えました)


```brewfile.sh
brew install git

brew install lua
brew install ctags

## ruby
brew install readline
brew install ruby-build
brew install rbenv
brew install rbenv-gemset

## Editor
brew install vim --with-lua
・・・
```


上記<del>Brewfile</del>  brewfile.shのあるディレクトリで以下を実行してインストールします。

```
$ chmod +x brewfile.sh
$ ./brewfile.sh
```

# rbenv

Ruby環境のバージョン切り替えツールです。
JavaでいうところのSDKMAN!になります。
~~Javaでは環境変数 ```JAVA_HOME``` を手動で書き換えてたあれです。Rubyでは仕組みとして用意されています。~~

まずはパスを通しておきます。

```
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

* rbenv-default-gemsの利用

これは、どのバージョンのrubyでも共通に利用したいgemがある場合やプロジェクト内でバージョンを合わせたい場合にも役立ちます。
(ここでいうgemはjavaでいうところのjarです。)

まずは、インストール

```
$ git clone https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems
```

以下のファイルに```rbenv install```後に一緒に ```gem install``` したいgemを指定します。

```~/.rbenv/default-gems
bundler ~>1.7.0
pry
pry-doc
pry-stack_explorer
pry-byebug
refe2
rubocop
```

* ruby本体のインストールと設定

インストール可能なrubyバージョンを調べてインストールします。

```
$ rbenv install -l
・・・
$ rbenv install バージョン番号
```

インストールしたら ```~/.rbenv/versions/バージョン番号/bin/``` の実行ファイルを動作するシェルスクリプトを ```~/.rbenv/shims``` に置くためのコマンドを打ちます。

```
$ rbenv rehash
```

普段利用するバージョンを設定します。

```
$ rbenv global バージョン番号
```

以下は必要なときにやります。
特定のディレクトリで利用するバージョンを設定します。

```
$ rbenv local バージョン番号
```

使わないバージョンは削除の仕方です。

```
$ rbenv uninstall バージョン番号
```

一応、```rbenv-default-gems```で指定したアプリを見ます。

```
$ gem list
```


### 参考
rbenvは以下の記事を参考にしました。
[rbenvでRubyのバージョンを指定する方法](http://qiita.com/makoto_kw/items/cc73b628c9ef039f6e6f)

# Bundler

gemコマンドがシステムで利用するgemのパッケージ管理ツールで、Bundlerはアプリ毎のgem（とそのバージョン）管理ツールという理解です。
(Bundlerは、Javaでいうところのmavenやgradle)

インストールは、上記での ```rbenv-default-gems```を利用したので済んでいます。

管理したいgemをGemfileに記述します。

```
$ bundle init
```

上記コマンドで以下のGemfileができます。
(Gemfileは、Javaでいうところのpom.xmlやbuild.gradle)

```Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"
```

例えば、Gemfileに以下を追加して

```Gemfile
gem 'rspec', '~> 3.0.0'
gem 'pry'
gem 'pry-doc'
gem 'pry-stack_explorer'
gem 'pry-byebug'
```

インストールする。

```
$ bundle install --path vendor/bundle 
```

```--path``` によってgemが置かれる場所を指定できます。
これにより、プロジェクト毎に違うgemを利用することができます。
なお、一度 ```--path``` 付きでインストールすると次からも同じ場所にインストールされます。

```--path``` でインストールすると以下のコマンドでrspecが表示されません。

```
$ gem list
```

この場合は、```bundle exec``` を付けることで、インストールしたディレクトリを解決してコマンドを実行してくれます。

プログラム内では、以下のように記述するとgemを一括でrequireされます。

```
require 'bundler'
Bundler.require
```

### 参考
rbenvからbundlerまでは以下の記事を参考にしました。
[Rails開発環境の構築（rbenvでRuby導入からBundler、Rails導入まで）](http://qiita.com/emadurandal/items/a60886152a4c99ce1017)
[Bundler再履修: bundle execって何？ gemはどこに入るの？](http://memo.yomukaku.net/entries/IpCSQmo)
https://gist.github.com/kozy4324/5719555

# Editor

自分はエディタにvimを使っています。
(Javaでは、EclipseなどのIDEを使いますが、Rubyでは軽量なエディタにpluginなどでIDE的な機能を追加していくことが多いようです)

rubyの入力を補完させたいのでneocompleteプラグインを使います。
これはluaなvimでないと動きません。
まずは、対応vimかを確認します。

```
$ vim --version | grep lua
+lua
```

+luaが表示されない場合は、[こちらのブログ](http://ko2ic.github.io/blog/2014/05/22/vim-lua/)を参照して下さい。

またhomebrewのvimは現在+rubyになっています。一応確認します。

```
$ vim --version | grep ruby
+ruby
```

次に、vimプラグインを簡単に管理したいので、NeoBundleを入れます。

```
$ curl https://raw.githubusercontent.com/Shougo/neobundle.vim/master/bin/install.sh | sh
```


```.vimrc``` を記述します。

自分の場合はgithubで管理しています。一応、自分のをリンクしますが、これよりも他の方々のを参考にしたほうがいいと思います。
[Neobundle用のvimrc](https://github.com/ko2ic/dotfiles/blob/master/.vimrc.include/.vimrc.neobundle)
[ruby用のvimrc](https://github.com/ko2ic/dotfiles/blob/master/.vim/after/ftplugin/ruby.vim)


ここでvimを開くとneocompleteなどの記述したpluginがインストールされます。

# vim pluginやgemなど

## neocomplete

自動でコード補完をするプラグインです。

vimでは標準で補完機能があります。インサートモードで ```<Ctrl-x>``` で表示されます。例えば、その後```<Ctrl-o>``` をするとオムニ補完されます。

この ```<Ctrl-x>``` をしなくても補完が出るようにするためにneocomplete利用します。

以下が自分の ```.vimrc``` になります。
[Neocomplete用のvimrc](https://github.com/ko2ic/dotfiles/blob/master/.vimrc.include/.vimrc.neocomplete)

## Refe2

コマンドラインから日本語リファレンスを引くために利用します。

```rbenv-default-gems``` でインストール済(依存するbitclustも同様)なので、
まずはリファレンスのデータベースを作成する。

```
$ bitclust setup --versions=2.1.2
```

この操作で、~/.bitclust以下にドキュメントをダウンロードしてデータベースを作成しているようです。
更新も同様のコマンドです。

これでターミナルでドキュメントを見れますが、vim上で読みたいので、vim-ref-riを使います。

## vim-ref-ri

vimで以下のコマンドを打つとRefeのドキュメントが見れます。

```
: Ref refe Array
```

以下はriでドキュメントが見れます。

```
: Ref ri Array
```

Uniteプラグインを使っていれば、以下で出来ます。

```
: Unite ref/refe
```

```enter``` でカーソルのリファレンスが見れて、```<Ctrl-o>``` で戻る。```<Ctrl-i>``` で進む。
また、vim上のソースにカーソルを合わせて、 ```<Shift-k>```を入力すると 定義が見れます。

### 参考

refeは以下を参考にしました。
[vim-refとReFeでRubyのリファレンスマニュアルをvimで読む](http://www.xmisao.com/2014/04/10/vim-ref-and-how-to-use-ref-refe.html)

## ctags

ソースにインデックスを付けて、エディタで参照をするために利用します。

インストールは、homebrewで済んでいます。

rubyの定数も対象にするために以下を作成しておきます。

```~/.ctags
--regex-ruby=/^[\t ]*([A-Z][-_A-Za-z0-9]*::)*([A-Z][-_A-Za-z0-9]*)[\t ]*=/\2/C,constant/
```
そしてインデックスを作ります。
rubyプロジェクトのルートで以下のようなコマンドを叩きます。

```
$ ctags --languages=ruby -R .
```

ctagsディレクトリが出来ます。

これでインデックスされたソースは、vim上で、```<Ctrl-]>```でその定義のソースに飛びます。```<Ctrl-o>``` で戻ります。

### 参考

ctagsやrefは以下の記事を参考にしました。
[Rubyのコードを読むのが捗る技 (Vim)](http://qiita.com/joker1007/items/9c114a37560d6a29fe81)
[Rubyの定数をTag Jumpできるようにする](http://takesy.cocolog-nifty.com/atico/2011/06/rubytag-jump-00.html)

## pry,pry-doc,pry-stack_explorer,pry-byebug


主にソースにブレイクポイントを貼ってデバッグするために利用します。

pry自体はirbのパワーアップ版みたいなツールです。
pry-docはRuby本体のC言語を参照できるようにするツールです。
pry-stack_exploreは、pryで止めた場所までの呼び出しメソッドのスタックを扱えるツールです。
pry-byebugはpryでステップ実行をできるようにするツールです。Ruby2.0.0以前の場合は、pry-debuggerを利用します。

インストールは、```bundler``` で済んでいます。

例えば以下のように ```binding.pry``` と書き、 

```hello.rb
require 'pry'
class Hello
    def message
        @hoge = 'hoge'
        binding.pry
        @hoge = 'hello'
    end
end
Hello.new.message
```

実行させます。

```$ ruby hello.rb``` 

すると```binding.pry``` のところでpryが起動します。

```
    3: def message
    4:     @hoge = 'hoge'
    5:     binding.pry
 => 6:     @hoge = 'hello'
    7: end
```

下記のようにデバッグできます。
```ls``` でオブジェクトの状態を見て、```cd 変数名``` でそのオブジェクト内に入ります。

```
[1] pry(#<Hello>)> p @hoge
'hoge'
=> 'hoge'
[2] pry(#<Hello>)> ls
Hello#methods: message
instance variables: @hoge
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
[3] pry(#<Hello>)> cd @hoge
[4] pry('hoge'):1> upcase
=> 'HOGE'
[5] pry('hoge'):1>
```



```show-stack``` でスタック一覧が表示されて、```up``` で上位スタック、```dowon``` で下位スタックへ ```frame スタッック番号``` で直接移動します。

``` 
[1] pry(#<Hello>)> show-stack 
・・・
=> #0  message <Hello#message()>
   #1 [block]   block in run <PryByebug::Processor#run(initial=?, &_block)>
   #2 [method]  run <PryByebug::Processor#run(initial=?, &_block)>
   #3 [method]  resume_pry <PryByebug::Processor#resume_pry(context)>
   #4 [method]  at_line <PryByebug::Processor#at_line(context, _file, _line)>
   #5 [method]  at_line <Byebug::Context#at_line(file, line)>
   #6 [method]  message <Hello#message()>
   #7 [main]    <main>
・・・
[2] pry(#<Hello>)> up
・・・
[3] pry(#<PryByebug::Processor>)> down
・・・
[4] pry(#<Hello>)> frame 7
・・・
```

```s``` でステップ実行(メソッドに入る) ```n``` で次の行へ ```f``` でメソッドの外へ ```c``` で次のブレイクポイントへ

```
 => 6:     @hoge = 'hello'
    7:     "hello".capitalize
・・・
[1] pry(#<Hello>)> s
・・・
    6:     @hoge = 'hello'
 => 7:     'hello'.capitalize
・・・
```

途中でドキュメントやソースを見たくなったら、```show-doc```　、```show-source``` で見れます。

### 参考

pryは以下を参考にしました。
[ググるよりもまずはpry](http://qiita.com/Kokudori/items/2b36068cdf2e40e75c2d)
[Rubyistよ、irbを捨ててPryを使おう](http://labs.timedia.co.jp/2011/12/rubyist-should-use-pry.html)
[Pryが真の力を発揮してくれる19個のコマンドとコマンドの自作方法[Rails]](http://morizyun.github.io/blog/pry-command-rails-ruby/)
[Rails4 今のところ最強なデバッグツール達](http://qiita.com/yusabana/items/8ce54577d959bb085b37)

## rubocop

コーディングルールに準拠しているかをチェッックします。
(rubocopは、JavaでいうところのCheckStyle)

プロジェクトで以下のコマンドを打つと違反のある警告を無効にする ```.rubocop_todo.yml```ファイルができます。これを参考に自分たちのコーディングルールに合わせて作ります。

```
$ rubocop --auto-gen-config
```

ファイル名を```.rubocop.yml```にして、以下を打つと規約違反が表示されます。
-aオプションで一部の警告が自動で補正されます。

```
$ rubocop -a
・・・
lib/hello.rb:5:5: W: Remove debugger entry point binding.pry.
    binding.pry
    ^^^^^^^^^^^
・・・
```

## syntastic

rubocop（だけではないけど）をvim保存時に実行させるvim pluginです。

:wで保存するとエラー箇所がvim上に表示されます。
カーソルを警告の行に合わせると一番下に警告内容が表示されます。

```hello.rb
    1 require 'pry'
S>  2 class Hello
    3   def messagege
    4     @hoge = 'hoge'
S>  5     binding.pry
    6     @hoge = 'hello'
S>  7     binding.pry
    8     @hoge.capitalize
    9   end
   10 end
Missing top-level class documentation comment.
```

### 参考

rubocopは以下を参照しました。
[Rubocopを使ってコーディングルールへの準拠チェックを自動化](http://qiita.com/yaotti/items/4f69a145a22f9c8f8333)
[Rubocopをsyntasticを使ってVimから自動実行する](http://qiita.com/yuku_t/items/0ac33cea18e10f14e185)