mac OSX Sierra で herokuのRubyチュートリアル実践(2017/1)

bitbacket+codeship+rubyとかいう個人向けでできる最低限の開発環境を整えよう企画。

ここにherokuを付け加えるべくとりあえず[Heroku dev center](https://devcenter.heroku.com/categories/ruby)にある[Getting Started on Heroku with Ruby](https://devcenter.heroku.com/articles/getting-started-with-ruby#introduction)に挑戦した。

二回目をじっくりどういうものか理解しながらやるついでにQiitaに意訳しながら書くとさらに理解が深まるメソッドを利用しています。

ちなみにrubyはやったことあるけど[^1]、いつも通り完璧に忘れているのでこれも初めてみたいな感覚で使います。
では行ってみよう。

適当に訳しているし大部分意訳なので間違いがあれば指摘していただけるとありがたい。

1. [Introduction](https://devcenter.heroku.com/articles/getting-started-with-ruby#introduction)
2. [Set up](https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up)
3. [Prepare the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#prepare-the-app)
4. [Deploy the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#deploy-the-app)
5. [View logs](https://devcenter.heroku.com/articles/getting-started-with-ruby#view-logs)
6. [Define a Procfile](https://devcenter.heroku.com/articles/getting-started-with-ruby#define-a-procfile)
7. [Scale the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#scale-the-app)
8. [Declare app dependencies](https://devcenter.heroku.com/articles/getting-started-with-ruby#declare-app-dependencies)
9. [Run the app locally](https://devcenter.heroku.com/articles/getting-started-with-ruby#run-the-app-locally)
10. [Push local changes](https://devcenter.heroku.com/articles/getting-started-with-ruby#push-local-changes)
11. [Provision add-ons](https://devcenter.heroku.com/articles/getting-started-with-ruby#provision-add-ons)
12. [Start a console](https://devcenter.heroku.com/articles/getting-started-with-ruby#start-a-console)
13. [Define config vars](https://devcenter.heroku.com/articles/getting-started-with-ruby#define-config-vars)
14. [Use a database](https://devcenter.heroku.com/articles/getting-started-with-ruby#use-a-database)
15. [Next steps](https://devcenter.heroku.com/articles/getting-started-with-ruby#next-steps)

一回もうやったけど、多いなおい…。
でも内容はあまりないようです。

# [Introduction](https://devcenter.heroku.com/articles/getting-started-with-ruby#introduction)

`Ruby`のチュートリアルだよ。
前提条件として下記が入ってるものとしておおくりするよ！

* freeのHerokuアカウント
* ローカル環境への`Ruby 2.2.5`のインストール
* ローカル環境への`Bundler`のインストール`gem install bundler`

これはまぁとりあえず適当にこなしました。
localのバージョンが新しすぎたのとバージョン変更など入ってなかったので諸々インストール。

```
$ brew update
$ brew upgrade ruby-build
$ rbenv install 2.2.5
$ rbenv gloval 2.2.5
$ gem install bundler
```


# [Set up](https://devcenter.heroku.com/articles/getting-started-with-ruby#set-up)

`Heroku Command Line interface(CLI)`のダウンロードとインストールをする。
これをインストールすると`heroku`コマンドがそれぞれのShell環境で使えるようになる・・・はずです。
私の場合は`MAC OS X`を選択して普通にインストールができました。
下記コマンド実行で作ってあるherokuアカウントにログインできるはずです。

```
$ heroku login
Enter your Heroku credentials.
Email: heroku_test@gmail.com
Password (typing will be hidden): 
Logged in as heroku_test@gmail.com
```

私の場合は大丈夫でしたが、環境が`firewall`内にある場合は外部[HTTP/HTTPSサービスへの接続にはプロキシーを使う](https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy)必要があるそうです。
herokuコマンドを実行する前にローカル環境変数に`HTTP_PROXY`もしくは`HTTPS_PROXY`を設定しましょう。
リンクしとくので適切に設定を行ってください。

# [Prepare the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#prepare-the-app)

ここではherokuのルビーの解説用スターターキットをローカルにダウンロード。

```
$ git clone https://github.com/heroku/ruby-getting-started.git
$ cd ruby-getting-started
```

#[Deploy the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#deploy-the-app)

いよいよ`heroku`にアプリをdeploy[^2]する。

```
$ heroku create
Creating app... done, ⬢ evening-tor-82984
https://evening-tor-82984.herokuapp.com/ | https://git.heroku.com/evening-tor-82984.git
```

herokuコマンドでcreateするときコマンドを実行したローカルフォルダにある`git repository`が関連づけられてその上でheroku上に`remote repository`が作られる。
アプリの名前は何も入れなければ勝手に作られる。
なんかこの状態でつける方法もあるみたいだけど、まぁコマンドのヘルプでも見れば書いてあるかも。

```
$ git push heroku master
```

ここちょっとわかんないなぁ。
`heroku`にpushするのはわかるんだけど、ここら辺rubyを見つけたからherokuが勝手に色々やってくれてるってことなのかな？
これって別の`ruby`入れても同じような動作になんのかね？[^3]

最後に`$ heroku open`でWEBで見れることを確認。

# [View logs](https://devcenter.heroku.com/articles/getting-started-with-ruby#view-logs)

なんかherokuは単一のチャンネルで全てのイベントを管理しているそうなので、一箇所見れば全部見れるらしい？
この翻訳(俺です)大丈夫か？

`heroku logs --tail`コマンドで見れる。
さっきの作ったサイト(私の場合は`https://evening-tor-82984.herokuapp.com/`もうないよ！)にアクセスしてみるとログが吐かれるのが見れると思います。
あといつも通り`Ctrl+C`でログの表示を閉じれます。

# [Define a Procfile](https://devcenter.heroku.com/articles/getting-started-with-ruby#define-a-procfile)

アプリケーションのrootディレクトリにある`Procfile`テキストファイルについてウニャウニャと。
アプリケーションがスタートする時のコマンドを指定できるらしいです。
サンプルのProcfileには下記のように書かれてます。

```
web: bundle exec puma -C config/puma.rb
```

なんかごちゃごちゃ書いある・・・・。

プロセスタイプ(web)と実行するコマンドについて書かれている。
webがここでは重要。herokuのweb系の接続関連はこれを指定すればいいのかな？
んで`puma`っていうwebサーバーを実行してconfig設定を渡している・・・みたいな感じ。

一応複数のバックグラウンドワーカーを動かすことも可能みたいなことが書いてあるかな。

# [Scale the app](https://devcenter.heroku.com/articles/getting-started-with-ruby#scale-the-app)

アプリケーションのスケールについて。
なんか今のところ`dyno`っていうコンテナで動いているらしい？
`ps`コマンドで現在動いてる`dyno`を確認できるらしい

```
$ heroku ps
Free dyno hours quota remaining this month: 996h 36m (99%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bundle exec puma -C config/puma.rb (1)
web.1: up 2017/01/31 13:08:03 +0900 (~ 8m ago)
```

まぁ一つだけ動いてるよと。
デフォルトではフリーの`dyno`が動いているそうです。
これは30分アクセスがなければスリープするそうです。
なんかここでもごちゃごちゃ書いているけどくわしく知りたければ[dyno](https://devcenter.heroku.com/articles/dynos)をみてください。
まぁ、スリープが嫌ならアカウントを`hobby`もしくは`professional`にアップグレードしてねだって。
例えばもし`professional`にすれば動作するdynoの数をコマンドラインから操作することで簡単にスケールできるって書いてあるのかな？

コマンドラインでの操作はフリーでも体験は可能で試しに下記コマンドを実行してopenしてみるとwebサーバーはエラーを返すはず。

```
$ heroku ps:scale web=0
$ heroku open
```

同様に下記コマンドでとりあえずは復活するはず

```
$ heroku ps:scale web=1
$ heroku open
```

# [Declare app dependencies](https://devcenter.heroku.com/articles/getting-started-with-ruby#declare-app-dependencies)

アプリケーションの依存関係宣言？

herokuはrootディレクトリにあるGemfileによってrubyアプリケーションだと認識しているらしい。
サンプルAPPはすでのGemfileを持っている。下記みたいな感じになっているはず。

```
source 'https://rubygems.org'
ruby '2.2.5'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use postgresql as the database for Active Record
gem 'pg'
gem 'rails_12factor', group: :production
# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.3'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
...
```

今回のサンプルのGemfileはpostgressqlにのみ最初にインストールが必要でそれをローカルにインストールする必要がある。
そこらへんは適当にやっといてください。
ちなみにインストールだけなら`brew install postgresql`で終わるはず。
後は知らん。

`bundle install`でローカルにも依存関係のある色々をインストールする。
これでローカルでもこのAppが動く準備は整った…はず。

1回目やった時ここら辺で実は詰まった。
localにインストールされてるrubyのバージョンが2.3.2だったのとpgがローカルになかった。
2回目で英語ちゃんと読んだらpgインストールしとけよって書いてあったやん…。
チュートリアル用に2.2.5のインストールと2.2.5用のbundlerのインストールとpgのローカルインストールをして解決(`brew install postgresql`)
と思いきや動かなかった。
なんでやっと思ってたらpgが起動してなかった。

#[Run the app locally](https://devcenter.heroku.com/articles/getting-started-with-ruby#run-the-app-locally)

ローカルでAppを実行する。

そのためにはローカルでは色々とやることがある。
このサンプルではデータベースはPostgresを使っている。ローカルへのインストールについての諸々は[こちら](https://devcenter.heroku.com/articles/heroku-postgresql#local-setup)[^4]を参照。
なんかローカルとDBの内容を合わせる方法みたいなことかいてあるぞ…まぁいいや。

rakeを使ってデータベースをローカルにも作る。

```
bundle exec rake db:create db:migrate
```

あれ？
なんか一回目はデータベースが起動してなくてここで詰まった気がする。
Postgres起動(`postgres -D /usr/local/var/postgres`)してないとうまく動かないのはここかな？
今回は起動してたからかなんの問題もなくうまくいきました。

ここまでくるとherokuコマンド使ってローカルを起動できるはず。

```
heroku local web
```

うまくいってれば[`http://localhost:5000`](http://localhost:5000)でローカルで起動しているはず。
通常通り、コントロール+cで抜けれるよ。

#[Push local changes](https://devcenter.heroku.com/articles/getting-started-with-ruby#push-local-changes)

ローカルでの変更をpushしようぜ。
Gemfileを編集して、`gem 'cowsay'`を追加する。下記みたいな感じ。

```text:Gemfile
source 'https://rubygems.org'
ruby '2.2.5'

gem 'cowsay'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
...
```

`app/views/welcome/index.erb`をこのgemを使った形に変更する。

```rb:index.erb
<pre>
<%= Cowsay.say("Hello", "Cow") %>
</pre>
...
```

ローカルで実行してみる。

```
$ bundle install
$ heroku local
```

ローカルで可愛い牛さんが挨拶してくれている。[`http://localhost:5000`](http://localhost:5000)

では次にローカルでの変更をherokuにdeployする。
つってもやることは簡単。
gitに変更をcommitして、pushするだけ。

```
$ git add .
$ git commit -m "Demo"
$ git push heroku master
$ heroku open
```

web上でも変更が確認できただろうか?

#[Provision add-ons](https://devcenter.heroku.com/articles/getting-started-with-ruby#provision-add-ons)

アドオンについて。つらつらとどういうものか書いてある。
ここら辺は読んでるけど訳さないので適当にどうぞ。

誤訳があるかもしれないけど、簡単にだけ。
アドオンはサードパーティー製のクラウドサービス。ログイン無しにあなたのサービスのモニタリングだったり色々やってくれる。
herokuは基本的に1500行文のログを保存しててくれるんだけど、アドオンとして提供されているものには全部の諸々のログ(search, and email and SMS alerts.)を保存してくれるものがある。

今回はその中の一つ`Papertrail`の導入をしてAdd-onsについて学ぶらしい。

まずは`Papertrail`をherokuに作る。

```
heroku addons:create papertrail
```

乱用防止のために、add-on提供には[アカウント認証](https://devcenter.heroku.com/articles/account-verification)が必要になリます。
まぁクレジットカード情報の登録ですね。
必要があれば直接登録しにいってください。（[アカウント認証できる場所](https://dashboard.heroku.com/account/billing/card)）
私は登録しちゃってるのですんなりいきましたけど、無理そうならこの行程できないのかな？　add-onの提供だけ？利用もかな？
よくわからないですけど。

とりあえず上の実行するとadd-onが展開されてアプリケーションに設定がされているはず。下記コマンドでAppのAdd-onリストを見ることができます。

```
$ heroku addons
```

後これで`Papertrail`のコンソール画面を開けます。

```
$ heroku addons:open papertrail
```

このアドオンの動きを見たければ、herokuのアプリにアクセスしてみればログが吐き出されるはずです。反映にはちょっと時間かかるかも。


#[Start a console](https://devcenter.heroku.com/articles/getting-started-with-ruby#start-a-console)

コンソールを始める…？
ちょっとここよくわからない。
`one-off dyno`についてがよくわかんない。
とりあえずコンソールで色々できるよってことかな。
あ〜・・・対象の環境で一度限りのdynoとしてコマンドを実行できるってことか。

```
$ heroku run rails console
```

上のコマンドでやった場合はrailsの環境をその場限りの環境として作成してconsoleでコマンドを実行できるってことかな、多分。

もし`Error connecting to process`が出る場合はfirewallの設定が必要らしい。
出ないのでスルー。

```
irb(main):001:0> puts Cowsay.say("hi", "Cow")
 ____ 
| hi |
 ---- 
      \   ^__^
       \  (oo)\_______
          (__)\       )\/\
              ||----w |
              ||     ||
=> nil
irb(main):002:0> exit
```

exitでコンソールを抜ける。
さっきはrailsでやったけど、bashを指定した場合はshellを開けます。

```
$ heroku run bash
Running bash on ⬢ evening-tor-82984... up, run.6383 (Free)
~ $ ls
app	  config     Gemfile	   log	     Rakefile	tmp
app.json  config.ru  Gemfile.lock  Procfile  README.md	vendor
bin	  db	     lib	   public    test
~ $ vim Gemfile
bash: vim: command not found
~ $ exit
exit
```

vimなかった・・・。
でもあれか実行してるherokuの環境の中でできる内容なのかな。
ここら辺詳しくは[こちら（one-off dyno](https://devcenter.heroku.com/articles/one-off-dynos)）らしい。
あとでちゃんと読むかも。読まないかも。読まないと思う。使わないし。

#[Define config vars](https://devcenter.heroku.com/articles/getting-started-with-ruby#define-config-vars)

環境変数定義関連のあれこれ。
詳しくは[こちらを参照(config vars)](https://devcenter.heroku.com/articles/config-vars)。
まぁ環境変数を設定することで色々便利だよと。
試しに使ってみようぜという内容。

まずは`app/views/welcome/index.erb`を編集というか下記のように一番上らへんに追記。

```
<% for i in 0..(ENV['TIMES'] ? ENV['TIMES'].to_i : 2) do %>
  <p>Hello World #<%= i %>!</p>
<% end %>
```

`heroku local`では自動的に`.env`ファイルの中のコンテンツを読み込んで環境変数として利用するらしい？
herokuに同様の環境変数をセットするには下記。

```
heroku config:set TIMES=10
```

一応それぞれのアプリケーションのネット上の管理画面からも環境変数は設定できるよ！
内容をコンソールから確認したい場合は下記。

```
$ heroku config
```

#[Use a database](https://devcenter.heroku.com/articles/getting-started-with-ruby#use-a-database)

データベースを使う。
なんかデータ保管用のadd-onはmarketplaceにいっぱいあるよと。
Redis/MongoDB/Postgres/MySQLなどなど。
今回はrailsで勝手にごにょごにょしてくれるfreeのpostgresについて学ぶらしい。
CLIで`addons`ってやると利用してるadd-onの一覧が見れるので見てみようねと。

```
$ heroku addons
```

configのリストを見ると勝手にdbで使われてるURLを教えてくれるよ。
herokuで提供されてるpgコマンドを使うともっと色々な情報が見れるよ。

```
$ heroku pg
=== DATABASE_URL
Plan:        Hobby-dev
Status:      Available
Connections: 0/20
PG Version:  9.6.1
Created:     2017-01-30 10:49 UTC
Data Size:   7.2 MB
Tables:      0
Rows:        0/10000 (In compliance)
Fork/Follow: Unsupported
Rollback:    Unsupported
```

まぁ色々情報を確認できるよねと。

サンプルアプリではすでにデータベースの機能を持っているらしい。試しにアプリケーションを開いてURLに`/widgets`を加えてみよう。
エラーページが現れると思う。`heroku logs`かPapertrailでエラー内容を確認すると大体こんな感じになってると思う。

```
$ heroku logs
...
2017-02-01T20:44:40.993070+00:00 app[web.1]: Started GET "/widgets" for 111.106.184.81 at 2017-02-01 20:44:40 +0000
2017-02-01T20:44:40.995614+00:00 app[web.1]: Processing by WidgetsController#index as HTML
2017-02-01T20:44:41.003190+00:00 app[web.1]:   Rendered widgets/index.html.erb within layouts/application (4.7ms)
2017-02-01T20:44:41.003725+00:00 app[web.1]: Completed 500 Internal Server Error in 8ms (ActiveRecord: 1.7ms)
2017-02-01T20:44:41.006703+00:00 app[web.1]: 
2017-02-01T20:44:41.006706+00:00 app[web.1]: ActionView::Template::Error (PG::UndefinedTable: ERROR:  relation "widgets" does not exist
...
```

まぁテーブルがないよっていうエラーだよね。作ってねぇもん。
というわけで`rake db:migrate`コマンドを使ってテーブル作ってみようぜと。
あれ？こういう時に使うのか`one-off dyno`...

```
$ heroku run rake db:migrate
Migrating to CreateWidgets (20140707111715)
== 20140707111715 CreateWidgets: migrating ====================================
-- create_table(:widgets)
   -> 0.0137s
== 20140707111715 CreateWidgets: migrated (0.0139s) ===========================
```

これやった後にさっきのURL（https://your-url/widgets）に飛ぶと見れるようになってるはず。
ローカルでもrake db:migrateすれば動くようになるよ。
DBの中身は下記コマンドでherokuのpostgresにアクセスできるからそこで確認してね。

```
$ heroku pg:psql

::DATABASE=>  select * from widgets;
```

もっと多く知りたければ[Heroku PostgresSQL]（https://devcenter.heroku.com/articles/heroku-postgresql）を見るといいよ。

psqlからexitでもCtr+cでも抜けられなくてちょっと焦ってしまった。
検索したらstackoverflowでみんな困っててわろた
[How to exit from PostgreSQL command line utility: psql](http://stackoverflow.com/questions/9463318/how-to-exit-from-postgresql-command-line-utility-psql)
¥q+enterで抜けれるってさ。

```
evening-tor-82984::DATABASE-> \q
ruby-getting-started $ 
```

#[Next steps](https://devcenter.heroku.com/articles/getting-started-with-ruby#next-steps)

・Herokuがどのように動いているかの技術的な概要を知りたい場合は[How Heroku Works](https://devcenter.heroku.com/articles/how-heroku-works)
・Rubyについてさらに多くを知りたい場合は[Ruby category](https://devcenter.heroku.com/categories/ruby)を訪れるといいよ
・HerokuでRubyのさらに深く潜りたい場合は[Getting Started with Rails 4.x on Heroku]もしくは[Getting Started with Ruby on Heroku]を読むこと

以上、流しで1回目やってから４日もかかってしまった…。
ただ、理解してない部分は大体理解できたかなって感じ(one-off dyno抜かして)
これ全部やると大変だなぁ。でも理解にはちょうどいいかなとは思う。



[^1]: すごい大きい会社の会員情報みたいなものをごにょごにょするのにこれ使えと指定されて作ったんだけどあういうのに使うには不向きな言語なんじゃないかなぁ？どうなんだろう。あと正確にはたぶんrails？になるの？よくわかんないけど。
[^2]: どうでもいいけど普通に展開するって言っちゃダメなの？まぁ若干ニュアンスが違う・・・のか？
[^3]: 自分のGITアプリをherokuに乗っけてみたら同じだった(pgじゃないとダメとか、そもそもローカルにpgがないとか色々戸惑ったけど上手くいきました。)
[^4]: これ見りゃ良かったやん！