今更ながら Ruby on Rails Tutorial をやってみた (その1)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から**Ruby on Rails Tutorial**をやってみようと思い立ちました。チュートリアルを読み進めながら備忘録を残せればなぁと思います。また、このような技術的な記録をQiitaに残すのも初めてなので、マイペースで複数回に分けて書いてみようと思っています。
尚、Rails 5.1に対応した第4版を用いて、かつCloud9ではなくVagrantを使用した環境構築で進めていきます。

## 学習環境

* Windows 10 Home Fall Creators Update
* Visual Studio Code(今後VSCodeと呼称)

## ～著作権とライセンス まで…

Ruby on Railsについて学習しようと思うと必ずこのチュートリアルに出会います。職場でRails案件を担当している方も「チュートリアルを一通り消化すれば基礎は大丈夫」的なことを言ってました。[YassLab社](https://yasslab.jp/)の方々のお陰でこのように学習できることに心から感謝いたします。あと、このチュートリアルを3日で読破したDerek Siversすげぇ。

## 第1章 ゼロからデプロイまで

### Vagrantを使用した環境構築

とても丁寧に手順が書いてある為に基本的には備忘録も何もないのですが、今回**Vagrant**を使用した環境でチュートリアルをやってみたいと思っているので、まずはこれについて備忘録を残します。
といっても、実際は[YassLab社が準備した設定ファイル](https://github.com/yasslab/railstutorial.jp_starter_kit)に沿って操作するだけです。
基本的にREADME.md、for_windows.mdを参照します。

1. VirtualBoxをインストールする。今回はVer.5.2.6を選択した。  
   デフォルトの仮想マシンフォルダーを`C:\Workspace\VirtualBox VMs`に変更した。
2. Vagrantをインストールする。今回はVer.2.0.2を選択した。
3. [スターターキットをダウンロード](https://github.com/yasslab/railstutorial.jp_starter_kit/archive/master.zip)して解凍する。
4. 解凍したフォルダを`C:\Develop\railstutorial.jp_starter_kit-master`に配置する。
5. PowerShellで以下のコマンドを実行する。(初回は時間が掛かるので注意。)

```powershell
$ cd C:\Develop\railstutorial.jp_starter_kit-master
$ vagrant up
```

上記手順でVagrantによる環境構築は完了です。とても簡単ですね。
for_windows.mdにはGit for Windowsのインストールを行うよう記載がありますが、スターターキットをzipでダウンロードする場合は必ずしも必要な手順ではないと思います。但し、チュートリアルを進める中でGitによるバージョン管理を学習するので、ゆくゆくはGit for Windowsのインストールが必要になると思います。

尚、Vagrantの簡単な操作は以下の通りです。

```powershell
# 起動
$ vagrant up
# ログイン
$ vagrant ssh
# シャットダウン
$ vagrant halt
# 再起動
$ vagrant reload
# ステータス確認
$ vagrant status
# 削除
$ vagrant destroy
# SSH接続情報確認
$ vagrant ssh-config
```

TeraTerm等のSSHクライアントを利用して接続する場合は`vagrant ssh-config`によって「HostName、User、Port、IdentityFile」を確認する必要があります。

ログイン後にRubyとRailsのバージョンを確認したところ、それぞれRuby 2.4.2とRails 5.1.2でした。
チュートリアルではRails 5.1.4を使用しているので`gem update rails -v "5.1.4"`としてアップデートします。
以上、Vagrantを使用することで**Railsをインストールする**まで進めることが可能です。

### hello, world! への道

ここからは「hello, world!」を表示する通過儀礼が始まる訳ですが、実は上記Vagrantを使用するとホストOSとゲストOSで特定のディレクトリが同期しているので、そのディレクトリ上でRailsアプリを開発するととても便利です。
今回の場合は`C:\Develop\railstutorial.jp_starter_kit-master\data`と`/vagrant_data`が同期しています。
その為、チュートリアルではホームディレクトリ上に`environment`ディレクトリを作成していますが、今回は`/vagrant_data`上に`environment`ディレクトリを作成します。

先に進めていくと、`bundle install`を実行したところで次のエラーが発生しました。

```bash
Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
```

どうもVagrant上で名前解決ができていないようで、IPアドレス直打ちでpingコマンドを実行すると疎通確認できました。
困ったので一度Vagrantを再起動してみると名前解決できるようになってました。
`Retrying fetcher due to error`で検索すると同様のエラーで再起動したら直ったという話が他にもあったので、Vagrant特有で何かあるのでしょうか。今回は原因を追うと切りがないのでこの件は終了。

その後は特に問題もなく、無事ブラウザ上で`hello, world!`を確認することができました。やったね！
色々な言語で`hello, world!`を表示してきましたが、動いた時のワクワク感はいつも楽しいです。

### 使い慣れないGit

業務で使用している開発言語の都合上、普段はGitを使用しません。なのでGitは使い慣れていない為に危機感を感じていたところ、案の定Bitbucketにpushする際にエラー発生して戸惑いました。
`git push -u origin --all`を実行したところ`error: failed to push some refs to 'xxxxxxxxxxxxxxx.git'`というエラーが…。
リモートリポジトリをマージしてないから？と思って`git fetch && git merge origin/master`を実行しても`fatal: refusing to merge unrelated histories`というエラー発生。
事例をググったところ、Git 2.9から「mergeコマンドとpullコマンドでは，--allow-unrelated-historiesを指定しない限り，無関係なヒストリを持つ２つのブランチをマージすることはできなくなった。」との情報を発見。そこで`git merge --allow-unrelated-histories origin/master`としたところ無事マージすることができ、その後リモートリポジトリに`git push`することができました。
Bitbucketのリポジトリを新規作成した際の`Initial commit`コミットと、ローカルリポジトリの`Initialize repository`コミットがそれぞれルートコミットでかつ同じでなかったから発生した？と漠然と理解しています。

あともう1点、Gitホスティングサービス毎にSSH Keyを切り替えたかったので`~/.ssh/config`ファイルを作成して次のように記述しました。
以下ではHerokuについても設定してあります。

```bash:~/.ssh/config
Host bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile ~/.ssh/sample1_rsa
    IdentitiesOnly yes

Host heroku.com
    HostName heroku.com
    User git
    IdentityFile ~/.ssh/sample2_rsa
    IdentitiesOnly yes
```

`…/hello_app/.git/config`ファイルについては以下のように記述しました。

```bash:…/hello_app/.git/config
  .
  .
[remote "origin"]
	url = bitbucket.org:<アカウント名>/hello_app.git
	fetch = +refs/heads/*:refs/remotes/origin/*
[remote "heroku"]
	url = heroku.com:xxxxxxxxxxxxxxx.git
	fetch = +refs/heads/*:refs/remotes/heroku/*
  .
  .
```

その後、Herokuへのデプロイも無事成功して第1章を終えることができました。

## 残件

今回**VSCode**を使用して学習しているのですが、以下の点を第2章開始までに設定しようと思います。

1. PowerShell上でGitコマンドタブ補完ができるようにする。  
posh-gitを使用すると可能になると何処かで読んだことがあるので、挑戦してみようと思います。
2. VSCode上で2つ以上ターミナルを立ち上げたときにキーボードショートカットでターミナル切り替えできるようにする。  
今のところPowerShellを2つ立ち上げて、1つはGit/Herokuのコマンドを打つ、もう1つはVagrantで構築した仮想環境に接続して Railsのコマンドを打つ、という形で学習しています。(この方法がいいのかどうかも含めて試行錯誤中…。)
デフォルト設定ではターミナル切り替えにキーボードショートカットが割り当てられていないようなので、よさげなショートカットを設定しようと思います。


それでは、次回 第2章から再開したいと思います。