iPhone6s Plus + AWS で世界のどこにいても Rails の開発をする【環境構築編】

# はじめに
MacBook Air などのノート PC を持ち歩かなくても iPhone だけでプログラミングができないものかといろいろ模索した結果、AWS を ssh でリモート接続して開発すればいいのではないか、という結論に達しました。

その環境構築の流れを紹介します。使用するアプリなど持っていいものがあるよ、などということがあれば是非教えていただきたいです。

# iPhone で使用するアプリ
今回使用するアプリは次の通りです。

## [AWS Console](https://itunes.apple.com/jp/app/aws-console/id580990573?mt=8)
Amazon Web Services を iOS デバイスから操作するアプリです。これがあればインスタンスの起動・停止や状況の確認などできます。ただ、新規のインスタンスを作ったりするには PC から行う必要があるので、何かあった場合の停止措置などを行うものと割り切った方が良さそうです。

## [Serverauditor](https://itunes.apple.com/jp/app/serverauditor-ssh-shell-console/id549039908?mt=8)
iOS デバイスから SSH を使用してサーバへ接続するアプリです。AWS の場合は認証に鍵を使用しますが、これは Dropbox 経由で鍵ファイルを登録することで実現します。SSH クライアントとしては文句ありませんし、これで無料ということで大満足ですが、emacs を使用した場合に日本語入力ができないため、その辺りは別途方法を考える必要があります。

## [FTP Client Lite](https://itunes.apple.com/jp/app/ftp-client-lite/id864215011?mt=8)
FTP クライアントアプリ。iOS デバイスからサーバへ FTP 転送を行います。SFTP とかで SSH を使用した転送も可能なので機能は申し分ありません。強いて言えば Lite 版は接続先の情報が保存できないので毎回 IP アドレス等を入力する必要があるところが難点なので、Pro 版へのアップデートも検討してもいいかもしれません。

# AWS の環境を作る
## EC2 インスタンスの起動
PC の方から AWS に環境を作っておきましょう。とりあえず無料枠の t2.micro でサクッと EC2 サーバだけ立てておけば当面は困らないかと思います。あとは念のためアラートのメールを送ってもらうように設定したくらいでしょうか。$1 を超えたらメールを送ってもらうようにしました。当面は無料のはずなので。

ちなみに Amazon Linux AMI を使用しています。`2015.09-release` が作成時点の最新版でした。

## 環境変数 PS1 の設定
コマンドラインのプロンプト設定をカスタマイズするのが好きなので、PS1 の設定を行っています。

```
export PS1='\[\e[0;31m\][\u : `pwd`]$ \[\e[0m\]'
```

とりあえずこんな感じにしています。赤い文字でユーザ名とカレントディレクトリが表示されます。

## タイムゾーンの設定
[こちら](http://qiita.com/azusanakano/items/b39bd22504313884a7c3)の記事を参考にさせていただきました。

## Ruby on Rails のセットアップ
そしてメインの Ruby on Rails をインストールしていきます。

### 参考書籍
[「改訂3版基礎 Ruby on Rails」](http://www.amazon.co.jp/改訂3版基礎-Ruby-Rails-IMPRESS-SERIES/dp/4844338153)を使用しています。書籍版を持っていますが、Kindle も持っているので移動時は Kindle 版を参照しています。内容は全く同じです。

### RVM のインストール
先に書いた通り Amazon Linux AMI を使用していると Ruby 2.0 がインストール済みですが、参考書籍では Ruby 2.2.1 を使用します。また複数のバージョンが混在した時は `RVM` などを利用した方が切り替えが楽なので先に `RVM` をインストールしておきます。

`RVM` のインストールは[`RVM` の公式ページ](https://rvm.io/rvm/install)を参考にします。

### Ruby 2.2.1 のインストール
`RVM` がインストールできれば後は簡単です。

```
[ec2-user : /home/ec2-user]$ rvm install 2.2.1
```

とすればインストールが始まります。インストールが完了したら `rvm list` コマンドを実行してみます。

```
[ec2-user : /home/ec2-user]$ rvm list

rvm rubies

=* ruby-2.2.1 [ x86_64 ]

# => - current
# =* - current && default
#  * - default
```

と表示され、現在の Ruby のバージョンが 2.2.1 になっていることがわかります。念のため `ruby -v` を実行してちゃんと現在の Ruby が 2.2.1 になっていることを確認しておきます。

```
[ec2-user : /home/ec2-user]$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-linux]
```

はい。大丈夫そうです。

### Rails のインストール
そして Rails をインストールします。コマンドとしては簡単です。`gem` がありますので、以下のコマンドを実行します。

```
[ec2-user : /home/ec2-user]$ sudo gem install rails --version "4.2.1" --no-rdoc --no-ri
```

設定するオプションは参考書籍に従っています。重要なのはバージョンです。参考書籍の中では Ruby が 2.2.1 で Rails が 4.2.1 としているのできっちり合わせておきます。

通常はこれでおしまいなのですが、AWS に入れた時はエラーが続出しました。

# Rails インストールのエラー対応
試行錯誤しながらやったので、無駄なオペレーションもあるかもしれませんが全部書いておきます。

## nokogiri 問題
まず最初に出たエラー。

```
Fetching: i18n-0.7.0.gem (100%) Successfully installed i18n-0.7.0 Fetching: thread_safe-0.3.5.gem (100%) Successfully installed thread_safe-0.3.5 Fetching: tzinfo-1.2.2.gem (100%) Successfully installed tzinfo-1.2.2 Fetching: minitest-5.8.3.gem (100%) Successfully installed minitest-5.8.3 Fetching: activesupport-4.2.1.gem (100%) Successfully installed activesupport-4.2.1 Fetching: rack-1.6.4.gem (100%) Successfully installed rack-1.6.4 Fetching: rack-test-0.6.3.gem (100%) Successfully installed rack-test-0.6.3 Fetching: mini_portile-0.6.2.gem (100%) Successfully installed mini_portile-0.6.2 Fetching: nokogiri-1.6.6.4.gem (100%) Building native extensions. This could take a while... ERROR: Error installing rails: ERROR: Failed to build gem native extension. /usr/bin/ruby2.0 extconf.rb mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h Gem files will remain installed in /usr/local/share/ruby/gems/2.0/gems/nokogiri-1.6.6.4 for inspection. Results logged to /usr/local/share/ruby/gems/2.0/gems/nokogiri-1.6.6.4/ext/nokogiri/gem_make.out 
```

`nokogiri` のインストールで失敗した模様。[この記事](http://qiita.com/chobi9999/items/7b66677b3bf3da8acc14)が詳しいので記事にある通りのことをやってみたがダメ。違う事象か。

要は `nokogiri` がインストールされていればいいんだろうと考えて、

```
gem install nokogiri -- --use-system-libraries=true --with-xml2-include=/usr/include/libxml2/
```

を実行してみる。が、玉砕。

```
rvm get stable
```

と

```
gem update --system
```

でそれぞれ最新化してみたものの変わりなし。通勤電車の中で焦り始める。この時点で iPhone からインストール作業を実施している。ネットでいろいろ調べた結果、[この記事](http://darutk-oboegaki.blogspot.jp/2015/04/rails-ubuntuvirtualboxwindows.html?m=1)に書かれた内容でインストールが完了した。

## railties 問題
インストールが完了したので、お約束のコマンドを実行。

```
rails -v
```

出たのがこのエラー。

```
[ec2-user : /home/ec2-user]$ rails -v /usr/share/ruby/vendor_ruby/2.0/rubygems/dependency.rb:296:in `to_specs': Could not find 'railties' (>= 0) among 11 total gem(s) (Gem::LoadError) from /usr/share/ruby/vendor_ruby/2.0/rubygems/dependency.rb:307:in `to_spec' from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_gem.rb:47:in `gem' from /usr/local/bin/rails:22:in 
```

エラーメッセージには `railties` が見つからないと書かれているので、

```
gem install railties
```

を実行したらこのエラーは解消。なぜかバージョンは `4.2.5` になっていたが気にしないことにした。

## bundle 問題
参考書籍に従ってアプリケーションの生成を実施。その後、`bundle install` を実行したらエラー。

```
ec2-user : /home/ec2-user/rails/asagao]$ bundle install /usr/share/ruby/vendor_ruby/2.0/rubygems/dependency.rb:296:in `to_specs': Could not find 'bundler' (>= 0) among 27 total gem(s) (Gem::LoadError) from /usr/share/ruby/vendor_ruby/2.0/rubygems/dependency.rb:307:in `to_spec' from /usr/share/ruby/vendor_ruby/2.0/rubygems/core_ext/kernel_gem.rb:47:in `gem' from /usr/local/bin/bundle:22:in `<main>' 
```

これは `bundle` が入っていないようなので入れることにした。

```
gem install bundle
```

これで解決。

## execjs 問題
次々と目の前にハードルが立ちはだかりますが、次は `execjs` 問題。上のエラーで `bundle install` まで完了したのでとりあえず `WEBrick` を起動して `http://localhost:3000` へアクセスしてみましょうという通過儀礼。`rails s` が起動しない。

```
[ec2-user : /home/ec2-user/rails/asagao]$ rails s /home/ec2-user/.rvm/gems/ruby-2.2.1/gems/execjs-2.6.0/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable) 
```

JavaScript を実行する環境がないらしい。[この記事](http://qiita.com/you21979@github/items/4efd9fc4363573191b5c)で解決した。

## 外部からのアクセス
無事 `WEBrick` が起動したものの、iPhone の Safari からアクセスできないのでファイヤーウォール系の問題かと思っていたら、

```
rails s --bind=0.0.0.0
```

とやることで外部からアクセス完了。これで Rails を使った開発を iPhone から行う準備が整った。