【Ruby】SinatraをVagrantに速攻構築。全部コピペで出来るようにしました。

#Sinatraとは？
SinatraとはRubyフレームワークのひとつです。
RubyのフレームワークといえばRuby On Railsが有名ですが、
Sinatraフレームワークは「**とにかく軽量**」「**さっくと始める**」事に特化しています。
何が良いかというと、とにかく**routing**が楽です。

詳しくは
https://ja.wikipedia.org/wiki/Sinatra
http://www.sinatrarb.com/intro-ja.html
辺りを参考にして頂けるとわかりやすいかと思います。

また今回は、**Slim, CoffeScript, Sass**をテンプレートにして構築していきます。
OSは**CentOS65**を使用します。


#Vagrantの準備
##プロジェクトディレクトリ作成, Vagarntの初期化
本記事はDesktopに作成

```bash:shell
$ cd ~/Desktop 
$ mkdir sinatra
$ cd sinatra
$ vagrant init
```

##Vagrantfile書き換え
Vagrantfileが生成させています。開くと色々書いてありますが、**全部消して** 下記をコピペしてください。

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"
  config.ssh.forward_agent = true
  # config.vm.synced_folder "./", "/vagrant", nfs: true
  config.vm.network :private_network, ip:"192.168.33.33"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--natdnsproxy1", "off"]
    vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off"]
  end
end
```
コピペしたら保存します。

##Vagrantの起動、ログイン
下記コマンドでVagrantの起動、ログインします。

``` bash:shell
$ vagrant up
$ vagrant ssh
```
ログインが完了したら、下記コマンドで諸々インストールします。

```bash:shell
$ sudo yum update
$ sudo yum install wget vim
$ sudo yum -y install curl-devel libffi-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker 
$ sudo yum -y install libxslt-devel libxml2-devel sqlite-devel
$ sudo yum -y install gcc gcc-c++
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install readline-devel
```

gitのアップデート

```bash:shell
$ cd
$ wget https://www.kernel.org/pub/software/scm/git/git-2.5.0.tar.gz
$ tar zxvf git-2.5.0.tar.gz
$ cd git-*
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
$ which git 
$ git --version
```

#rbenvでRuby, Bundlerのインストール
準備が整ったらRubyをインストールします。下記コマンドでRubyをインストールしてください。

Rubyのインストール

```bash:shell
$ 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"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l

$ rbenv install 2.2.1 #安定版インストール。少し時間がかかります。
$ rbenv global 2.2.1
$ which ruby
$ which gem
$ ruby -v
$ gem -v
```
Bundlerのインストール

```bash:shell
$ rbenv exec gem install bundler
$ rbenv rehash
$ which bundler # ~/.rbenv/配下に入る
$ bundler -v
$ gem list bundler
```

#sinatraプロジェクトの作成
bundlerのインストールが終わったので、いよいよsinatraを入れていきます。

##作業ディレクトリの作成

```bash:shell
$ cd /vagrant
$ mkdir sinatra #ディレクトリ名は任意に変更してください
$ cd sinatra
```

##Bundlerの初期化, Gemのインストール

```bash:shell
$ bundle init
```
上記コマンドでVagrantfileが生成させています。開くと色々書いてありますが、**全部消して** 下記をコピペしてください。

```rb:Gemfile
source 'https://rubygems.org'

gem 'sinatra'
gem 'sinatra-contrib'
gem 'sass'
gem 'slim'
gem 'coffee-script'
gem 'therubyracer'

group :develoopment do
  gem 'shotgun'
  gem 'thin'
end
```

保存が完了したら下記コマンドでGemをインストールします。

```bash:shell
$ bundle install --path vendor/bundle
```
Gemのインストールが完了しました。

#sinatrateのテンプレート作成
ここまで来たらとは自分の作業しやすいようにゴリゴリディレクトリ等を作っていくだけです！
僕は下記のようにディレクトリ、ファイルを配置してみました。

```bash:sinatra
sinatra/
　├ app.rb
　├ assets/
　│　└ js/
　│　└ scss/
　├ config.ru # sinatra起動時に一番最初に呼ばれる
　├ Gemfile
　├ Gemfile.lock
　├ Vendor/
　├ views/
　│　└ index.slim
```
こんな感じです。**app.rb, config.ru**は必須です。
viewsにhtml系を、assetsにjsやscssを格納するようにしました。（ここらへんは作業しやすいように変更も大丈夫です）

##app.rb, config.ruの設定
上記で作成した、app.rb, config.ruを編集します。
**config.ru** ・・・sinatra起動時に一番最初に呼び出せれるファイル。ここでapp.rbを呼び出すようにしてます。
**app.rb** ・・・ Controllerの役割をします。ここでroutingの設定をおこないます。

config.ru

```bash:config.ru
require 'bundler'
Bundler.setup
require File.expand_path(File.join('..','app'), __FILE__)
run App
```

app.rb

```rb:app.rb
require 'sinatra/base'
require 'sinatra/reloader'
require 'slim'
require 'sass'
require 'coffee-script'

class App < Sinatra::Base
  configure :development do
    register Sinatra::Reloader
  end

  # routingの設定
  get '/' do
    slim :index
  end
end
```

#sinatraの起動
下記コマンドでsinatraを起動します。

```bash:shell
$ bundle exec shotgun --server=thin --port=3000 -o 192.168.33.33
```
最後にブラウザに
**http://192.168.33.33:3000/**アクセスして結果を確認しましょう！
下記図のようにhelloworldが出れば大成功です！！
![192_168_33_33_3000.png](https://qiita-image-store.s3.amazonaws.com/0/49347/221dcbbd-4a50-5639-5b5b-a8630f774810.png)


お疲れ様でした！以上がVagrantにsinatra開発環境作成手順になります！
Railsより簡単に作業を始められるので小さめのプロジェクトにおすすめですね！

#おまけ
##nfsをONにして読み込み速度高速化
Vagrantfileの下記コメントを外す

```rb:Vagrantfile
config.vm.synced_folder "./", "/vagrant", nfs: true
```

#参考
http://cu39.hateblo.jp/entry/2013/07/02/183935
http://qiita.com/mochizukikotaro/items/f6f7ac94576728cd0f2a
http://qiita.com/mochizukikotaro/items/970e69b0217eeb790752