しふみんのブログ

しふみんのブログです。

Gitでローカルのブランチをコピーする方法

先日、GitでローカルのブランチAをコピーして同内容のブランチBを作る方法がないじゃん!とあれこれ悩んだので、このことをすっかり忘れて今後悩む時が来た時のために忘備録を残しておきます。

TL;DR

コピーしたいブランチから git checkout -b でブランチを作成する。

以下全てが余談

なぜ、いつもやっていることなのに変に難しく考えてしまってこんな簡単なことに気づかなかったんだという気持ちしかないですね。よく考えなくても、ブランチを作成した直後って派生元のブランチと全く同じ状態だから、言うなればそれがコピーじゃん!

当初は変に難しく「 -m でブランチの名前を変更することはできるけど、ブランチをコピーする方法はないな。リモートリポジトリを経由するしか方法はないか……」と考えてしまって

  1. ローカルのブランチAをリモートにpushする
    git push origin branchA
  2. ローカルのブランチAの名前を変更する
    git branch -m branchA branchB
  3. リモートのブランチAをローカルでcheckoutする
    git checkout branchA

上記の手順でブランチAをコピーしてブランチBを作るしかないかと思っていたけど、全然そんなことはなかった!ただ単にブランチAから git checkout -b するだけでよかった!

結局、Twitterでボソッと呟いた時にフォロワーからもらった助言で気づけたので、やはり悩みは外に出してみた方がいいなと思いました。

Heroku+RailsでLine botを作る 第10回 ローカル開発環境での動作確認

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回: http://shifumin.hatenablog.com/entry/2018/04/27/000500
第8回: http://shifumin.hatenablog.com/entry/2018/04/29/000500
第9回: shifumin.hatenablog.com

公式サンプルコードのオウム返しbotRailsへ実装(移植)しました。
またそのRailsアプリをHerokuへとデプロイし動作することを確認しました(第一部完)
今回はローカル開発環境での動作確認をやっていきたいと思います。

ngrok

ローカル開発環境での動作確認はngrokというツールを使います。
このツールを使うとローカル開発環境で動かしているサーバに対してパブリックなURLを割り当てることができます。
詳しくは下記をご参照ください。

ngrok.com qiita.com

LINE bot開発だと、そのURLをbotのチャンネル設定の「Webhook URL」に設定することによっていちいちHerokuにデプロイしなくても修正したコードの動作確認を行えるようになります。
便利ですね。

Homebrew-Cask

ngrokは公式の通りにインストールしてもいいのですが、面倒なのでHomebrew-Caskを使ってインストールしましょう。
Homebrew-Caskについては詳しくは下記をご参照ください(投げ)
簡単にいうと、macOSアプリケーションについてのHomebrewです。

参考: Homebrew-Cask

Homebrew-Caskを利用するためにHomebrewでtapします。

brew tap caskroom/cask

これでHomebrew-Caskを利用できるようになったのでngrokをインストールします。

brew cask install ngrok

direnv

前回の記事でRailsアプリを動かすために LINE_CHANNEL_SECRETLINE_CHANNEL_TOKEN環境変数をHerokuにセットしました。
同様に、ローカル開発環境でも動かすために同じ環境変数をセットする必要があります。

ローカル開発環境の環境変数のセットには direnv を使いましょう。
direnvについては詳しくは下記をご参照ください。

github.com qiita.com

Rails 環境変数」の文脈だとdotenvが有名な気がしますが、僕はdirenvの方が好きなのでこの連載ではdirenvを使います。
direnvの方が好きな理由は、下記のリンク先の記事にもありますが、dotenvだとアプリ内に明示的にdotenvのロードを記述する必要があるからです。
direnvはそれをする必要がありません(最初にシェルに設定を書く必要がありますが)

参考: DotenvではなくDirenvを使う | SOTA

それではHomebrewでdirenvをインストールしましょう。

brew install direnv

次にシェルに設定を記述します。
下記はシェルがbashの場合です。
他のシェルをお使いの方はよしなにやってください。

echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile

初期設定が完了したので環境変数を設定していきます。
公式的には direnv edit ですが、各種エディタでプロジェクトディレクトリのルートに .envrc を作成すれば大丈夫なはずです。

direnv edit . # path/to/your-project/.envrc をエディタで作成/編集する

必要な環境変数LINE_CHANNEL_SECRETLINE_CHANNEL_TOKEN の2つなので、 .envrc には下記の2行を書きます。

export LINE_CHANNEL_SECRET=<your_line_channel_secret>
export LINE_CHANNEL_TOKEN=<your_channel_token>

あとはdirenvが自動で環境変数を設定してくれるはずですが、読み込まれていなかったりエラーが発生した場合は direnv allow すればいいようです。

dieenv allow

試しにそれぞれの環境変数が設定されていることを確認してみましょう。

echo $LINE_CHANNEL_SECRET
<設定したLINE_CHANNEL_SECRETが出力される>
echo $LINE_CHANNEL_TOKEN
<設定したLINE_CHANNEL_TOKENが出力される>

ちゃんと環境変数が設定されているようです。

ローカル開発環境での動作確認

ここまででローカル開発環境で動作確認を行う準備が整いました。
なので、実際に動作確認を行なっていきましょう。
PostgreSQLサーバは起動しているものとします。
起動していない場合は下記のコマンドでPostgreSQLサーバを起動させます。

brew services start postgresql # 停止コマンドは brew services stop postgresql

続いて、Railsサーバを起動させます。

bin/rails s # あるいは bundle exec rails s

Railsサーバを起動させた状態でターミナルの別ウィンドウを開くなどして別のコマンドライン上でngrokを起動させます。

ngrok http 3000 # 停止は Ctrl + C

表示が切り替わり、例えば下記のような出力となるはずです。

ngrok by @inconshreveable

Session Status                online
Session Expires               7 hours, 59 minutes
Version                       2.2.8
Region                        United States (us)
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://cb413e80.ngrok.io -> localhost:3000
Forwarding                    https://cb413e80.ngrok.io -> localhost:3000

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00

重要なのは、 Forwarding の2つ目の値で、これが意味するところは、
「ローカルでRailsサーバが動いている localhost:3000https://cb413e80.ngrok.io というパブリックなURLにポートフォワーディングしている」

となります。
パブリックURLなので、自分のMac以外からも、つまりLINE Messaging APIからも自分のMacで動いているRailsサーバにアクセスさせることができます。
というわけで、このURLをLINE botの「Webhook URL」に設定しましょう。

f:id:shifumin:20180501213845p:plain

これで、 rails s を起動しているかつ ngrok http 3000 を起動している状態だとローカル開発環境から直でLINE botの動作を確認することができます。
例えば、コードを修正してbotの動作を変更させた時に、いちいちHerokuにデプロイすることなく動作を確認することができます。
楽でいいですね。
ちなみ、ngrokの起動を止めるとパブリックURLへのフォワーディングも止まります。
また、割り当てられるパブリックURLも起動のたびに異なるものとなります(= ngrokの起動のたびにWebhook URLの設定の変更は必要)

終わりに

今回はローカル環境での動作確認をやっていきました。
次回は今回の続きでローカル環境でのデバッグをやっていきましょう。

参考

ngrok - secure introspectable tunnels to localhost
https://ngrok.com/

ngrokを使用してローカル環境を外部に公開する - Qiita
https://qiita.com/kitaro729/items/44214f9f81d3ebda58bd

Homebrew-Cask
https://caskroom.github.io/

direnv/direnv: Unclutter your .profile
https://github.com/direnv/direnv

direnvを使おう - Qiita
https://qiita.com/kompiro/items/5fc46089247a56243a62

DotenvではなくDirenvを使う | SOTA
https://deeeet.com/writing/2014/05/06/direnv/

Heroku+RailsでLine botを作る 第9回 Herokuへのデプロイ

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回: http://shifumin.hatenablog.com/entry/2018/04/27/000500
第8回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリを作成し、動作することを確認しました。
そして、Railsアプリに公式サンプルコードのオウム返しbotを移植しました。
今回は作成したbotをHerokuにデプロイしていきたいと思います。

git commit

前回でオウム返しbotの実装(移植)が完了しましたので、ここらで git commit をしておきましょう。

git add .
git commit -m "implement echo bot"
git log --stat

commit 8fa85e05cdc2617e31e07b3260ca06417ca9862e (HEAD -> master)
Author: shifumin <hogehogehogehoge@mail.com>
Date:   Sun Apr 29 21:58:24 2018 +0900

    implement echo bot

 app/controllers/webhook_controller.rb | 40 ++++++++++++++++++++++++++++++++++++++++
 config/routes.rb                      |  2 +-
 2 files changed, 41 insertions(+), 1 deletion(-)

前回の変更内容ですね。
ちなみに、GitHubリポジトリを作成し、ここまでのコードを上げておきました(随時更新予定)

github.com

Herokuへのデプロイ

それではHerokuへのデプロイを進めていきましょう。
なお、Herokuのアカウントを作成していることは前提とします。

今回のHerokuアプリケーションの作成は全体的に下記の公式ドキュメント2つを参考にしました。

Herokuでサンプルボットを作成する
Getting Started with Rails 5.x on Heroku | Heroku Dev Center

Heroku CLIのインストール

最初に、コマンドライン上でHerokuを操作するためにHeroku CLIをインストールしましょう。
例のごとくHomebrewを使ってインストールします。

# brew install heroku/brew/heroku でも可
brew install heroku

参考:
devcenter.heroku.com

Herokuアプリの作成

Heroku CLIをインストールできたら、コマンドライン上でHerokuアプリの作成を進めていきます。
まずはHerokuにログインします。

heroku login
(登録したEmailとPasswordの入力)

次にアプリを作成します。
heroku create でherokuが名前を勝手につけてアプリを作成してくれますが、今回は heroku create <app_name> でアプリ名を付けて作成しましょう。

heroku create <your-app-name>
Creating ⬢ <your-app-name>... done
https://<your-app-name>.herokuapp.com/ | https://git.heroku.com/<your-app-name>.git

Herokuの各種設定

アプリのデータベースにPostgreSQLを利用しているので、それ用のHerokuのアドオンを追加します。

heroku addons:create heroku-postgresql:hobby-dev

参考:
devcenter.heroku.com

また、LINE Messaging APIの利用には下記の環境変数が必要なので登録します。
値は、この連載の第1回で確認した Channel Secretアクセストーク となります。

heroku config:set LINE_CHANNEL_SECRET=<your_line_channel_secret>
heroku config:set LINE_CHANNEL_TOKEN=<your_channel_token>

参考:
devcenter.heroku.com

Herokuへのpush

アプリの作成と各種設定が完了したので、ようやくHerokuへpushします。

git push heroku master

しばらく時間がかかります。
Herokuへのpushが完了したら、Herokuアプリの情報を確認してみましょう。
確認は heroku info で行います。

heroku info
=== amurosan-bot
Addons:         heroku-postgresql:hobby-dev
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/<your-app-name>.git
Owner:          your-mail-address@mail.com
Region:         us
Repo Size:      36 KB
Slug Size:      47 MB
Stack:          heroku-16
Web URL:        https://<your-app-name>.herokuapp.com/

一番下の Web URLbotが動作しているURLとなります。
こちらのURLをLINE DevelopersのChannel設定で登録しましょう。
例えば以下のような設定となります。

f:id:shifumin:20180430175408p:plain

LINE botの完成

これでようやく連載第9回にして、オウム返しを行うだけの簡単なLINE botですが、動くものを作成することができました。
めでたいですね。

諸事情によりQRコードを消しました><(ツイートからも読み取れないことを確認済)

動作は前回の記事で貼りましたが、現在は本当にオウム返ししか行いません(行えません)。

f:id:shifumin:20180428230824p:plain

俺たちの戦いはこれからだ!
しふみん先生の次回作にご期待ください。
次回以降でこのbotの機能改善をしていこうと思います。

終わりに

今回は作成したLINE botをHerokuへとデプロイしました。
次回はローカル環境での動作確認とデバッグについて行なっていきましょう。

参考

shifumin/sample-bot-for-line-bot-api: Sample bot using Line :: Bot :: API implemented in Rails on Heroku.
https://github.com/shifumin/sample-bot-for-line-bot-api

Herokuでサンプルボットを作成する - LINE Developers
https://developers.line.me/ja/docs/messaging-api/building-sample-bot-with-heroku/

Getting Started with Rails 5.x on Heroku | Heroku Dev Center
https://devcenter.heroku.com/articles/getting-started-with-rails5

Heroku CLI | Heroku Dev Center
https://devcenter.heroku.com/articles/heroku-cli

Heroku Postgres | Heroku Dev Center
https://devcenter.heroku.com/articles/heroku-postgresql

Configuration and Config Vars | Heroku Dev Center
https://devcenter.heroku.com/articles/config-vars

Heroku+RailsでLine botを作る 第8回 LINE botの雛形の作成

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: http://shifumin.hatenablog.com/entry/2018/04/26/000500
第7回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリを作成し、動作することを確認しました。
そして、記念すべき(?)はじめてのgit commitを行いました。
今回はLINE botの雛形を作成していきたいと思います。

line-bot-sdk-ruby

github.com

上記がLINE bot開発に使うRuby用のLINE Messaging APISDK(Software Development Kit)となります。

このリポジトリのREADMEのSynopsisにサンプルコードが載せられています。
Railsと同じくRubyのWAF(Web Application Framework)であるSinatraのコードです。
オウム返しを行う実装となっているようですね。

GitHub - line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.

このサンプルコードをRailsで動くように移植します。
Railsへの移植では下記も大いに参考させていただきました。

qiita.com

Railsへの移植

追加修正・新規作成したファイルは下記の2つです。

  • config/routes.rb (変更)
  • app/controllers/webhook_controller.rb (新規作成)

概要としては、LINE Messaging APIから受け取ったリクエストについてのルーティングを設定して(config/routes.rb)、その際に行うアクションを追加しています(app/controllers/webhook_controller.rb)。

Railsへ移植したコードと一言解説を下記に載せます。

config/routes.rb

Rails.application.routes.draw do
  post '/callback' => 'webhook#callback'
end

<HerokuアプリのURL>/callback にPOSTメソッドのリクエストを受け取った場合にWebbookコントローラのcallbackアクションに割り当てるようにしています。

app/controllers/webhook_controller.rb

require 'line/bot'

class WebhookController < ApplicationController
  protect_from_forgery except: :callback

  def callback
    body = request.body.read

    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      error 400 do 'Bad Request' end
    end

    events = client.parse_events_from(body)
    events.each { |event|
      case event
      when Line::Bot::Event::Message
        case event.type
        when Line::Bot::Event::MessageType::Text
          message = {
            type: 'text',
            text: event.message['text']
          }
          client.reply_message(event['replyToken'], message)
        end
      end
    }

    head :ok
  end

  private

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end
end

APIトークンを使って認証するため、下記のコードでCSRF対策を無効にしています。
callbackメソッドを除く -> callbackメソッドでは無効。
というか、無効にしないとローカル開発環境で動作確認する時にエラーが出る気がします。

  protect_from_forgery except: :callback

参考:
qiita.com

それ以外はほぼコピペですね。
一応clientメソッドをprivateメソッドに移した以外は。

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    }
  end

このclientメソッドの中で「Channel Secret」と「アクセストークン」を設定しています(ようやく第1回の伏線(?)を回収できました)
ですので、Herokuで動かす場合はHerokuに、ローカルで動かす場合はローカルに下記の環境変数を設定する必要があります。

  • LINE_CHANNEL_SECRET
  • LINE_CHANNEL_TOKEN

環境変数の設定は必要になった際にやっていきましょう。

終わりに

今回はLINE botの雛形として公式サンプルコードのオウム返しbotRailsへと移植しました。
動き的には下記画像のようにオウム返しを行うbotとなっています。

f:id:shifumin:20180428230824p:plain

次回は作成したこのbotをHerokuにデプロイしていきましょう。

参考

line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby

今更ながらRails5+line-bot-sdk-ruby+HerokuでLineBot作成してみたら、色々詰まったのでまとめました。 - Qiita
https://qiita.com/y428_b/items/d2b1a376f5900aea30dc

Rails4のCSRF対策で「Can't verify CSRF token authenticity」エラー - Qiita
https://qiita.com/chobi9999/items/2b59fdaf3dd8f2ed9268

Heroku+RailsでLine botを作る 第7回 はじめてのgit commit

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: http://shifumin.hatenablog.com/entry/2018/04/25/000500
第6回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、Railsアプリが動作する環境を整えました。
そして、Railsアプリを作成し、動作することを確認しました。
今回はアプリが動作することも確認できたことですし、現在の内容でgitでcommitしていきましょう。
(LINE botの雛形を作成するところまで進められず……)

git commit

gibo

git commit する前の準備として、.gitignoreをいい感じに整えるためにまずgiboを導入します。
.gitignoreというのはその名前の通り、gitの管理上無視する(ignore)するファイル(orディレクトリ)を指定するためのファイルです。
例えば、ログファイルや一時ファイルはバージョン管理をする意味がないですし、パスワード等の秘匿情報はバージョン管理すること事態が危険です。
そういったファイルを.gitignoreで指定します。
giboについては下記をご参照ください(定期投げ)

github.com qiita.com

それでは、Homebrewでgiboをインストールしましょう。

brew install gibo

インストールが完了したら、下記のgiboコマンドで.gitignoreを更新します。
gibo railsRails用の.gitignoreの内容を出力し、リダイレクト演算子 >| で.gitignoreに渡し上書きしています。

gibo rails >| .gitignore

.gitignoreの内容は下記のリンク先のRails用のものと同内容になったはすです。

github.com

git commit

.gitignoreをRails用のものに更新できたら、 git commit していきましょう。
コマンド群として下記のようになります。
git add コマンドは新規ファイルを、あるいは内容に変更があったファイルをgitの管理下に追加するコマンドです(苦しい説明)
. オプションを付けるとカレントディレクリの全ファイル(ディレクトリ)を対象に取ります。
コミットは git commit コマンドで行います。
-m オプションはコミットメッセージを付け加えるためのものです。
今回はRailsアプリを作成したということで create app としておきましょう。

git add .
git commit -m "create app"

gitは内容がドチャクソあるので詳しくは下記を合わせてご参照ください(投げ)

qiita.com kray.jp

また、 git log コマンドを使うと過去のコミット情報を見ることができます。
例えば、 --stat オプションを付けると変更ファイル名とその行数も合わせて表示させることができます。

git log  --stat

上記の git log --stat コマンドで確認すると下記のような出力になるはずです。
誰がいつコミットしたか、コミットメッセージ、変更のあったファイルとその行数等が分かりますね。

commit a75fe4bdf4dd9e5bfd866ad3bd4af32cda787c5d (HEAD -> master)
Author: shifumin <shifumin_no_honyarara@mail_adress.com>
Date:   Thu Apr 26 22:28:54 2018 +0900

    create app

 .gitignore                                             |  53 +++++++++++++++++++
 .ruby-version                                          |   1 +
 Gemfile                                                |  57 ++++++++++++++++++++
 Gemfile.lock                                           | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 README.md                                              |  24 +++++++++
 Rakefile                                               |   6 +++
 app/assets/config/manifest.js                          |   3 ++
 app/assets/images/.keep                                |   0
 app/assets/javascripts/application.js                  |  16 ++++++
 app/assets/javascripts/cable.js                        |  13 +++++
 app/assets/javascripts/channels/.keep                  |   0
 app/assets/stylesheets/application.css                 |  15 ++++++
 app/channels/application_cable/channel.rb              |   4 ++
 app/channels/application_cable/connection.rb           |   4 ++
 app/controllers/application_controller.rb              |   2 +
 app/controllers/concerns/.keep                         |   0
 app/helpers/application_helper.rb                      |   2 +
 app/jobs/application_job.rb                            |   2 +
 app/mailers/application_mailer.rb                      |   4 ++
 app/models/application_record.rb                       |   3 ++
 app/models/concerns/.keep                              |   0
 app/views/layouts/application.html.erb                 |  15 ++++++
 app/views/layouts/mailer.html.erb                      |  13 +++++
 app/views/layouts/mailer.text.erb                      |   1 +
 bin/bundle                                             |   3 ++
 bin/rails                                              |   4 ++
 bin/rake                                               |   4 ++
(以下略)

git log もオプションが大量にあるためその他オプション等はググるか下記等をご参照ください。

qiita.com

終わりに

今回はアプリをgitで管理するために記念すべきはじめての git commit を行いました。
次回こそはLINE botの雛形を作成していきましょう。

参考

simonwhitaker/gibo: A shell script for easily accessing gitignore boilerplates
https://github.com/simonwhitaker/gibo

気付いたら.gitignoreはgiboで自動生成する時代になっていた - Qiita
https://qiita.com/tmknom/items/c4bcebe17d25381fa45d

gitignore/Rails.gitignore at master · github/gitignore
https://github.com/github/gitignore/blob/master/Rails.gitignore

【Git】基本コマンド - Qiita
https://qiita.com/konweb/items/621722f67fdd8f86a017

Git初心者に捧ぐ!Gitの「これなんで?」を解説します。 | KRAY Inc
http://kray.jp/blog/git-why-explanation/

git log よく使うオプションまとめ - Qiita
https://qiita.com/take4s5i/items/15d8648405f4e7ea3039

Heroku+RailsでLine botを作る 第6回 Railsアプリの作成

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: http://shifumin.hatenablog.com/entry/2018/04/24/000500
第5回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
さらに、Bunblerを導入してrails gemをインストールしました。
今回は、(本当に!やっと!)Railsアプリを作成していきたいと思います。

rails new

ようやくのようやくで、Railsアプリの作成コマンドの実行までたどり着きました!
下記の rails new コマンドでRailsアプリを作成します。
コマンド実行後にOverwriteするかを聞かれたら全て y で問題ありません。

bundle exec rails new . --database=postgresql --skip-bundle --skip-test

rails new の各オプションの詳細は下記をご参照ください(投げ)

railsコマンド(rails) - - Railsドキュメント

それぞれのオプション他を軽く一言説明をしますと、

  • bundle exec
    • Bundlerでインストールしたカレントディレクリのgemのrailsコマンドを使用する
  • .
    • カレントディレクリにRailsアプリを作成する
  • --database=postgresql
  • --skip-bundle
    • bundle installを行わない -> 後で手動で行うため
  • --skip-test
    • test::unitを組み込まない -> この連載では(今のところは)テストを省略します

となります。
加えて、1点だけ補足説明しておきます。
前回の第5回の記事で bundle instlal したと思います。
あの bundle installrails gemをインストールするためのものです。
そして、実はもう一度 bundle install する必要があります。
次の bundle installRailsアプリを動かすために必要な他のgemをインストールするためのものになります。

ls -la で確認すると下記のようにRailsアプリの各ファイルが作成されていることと思います。

ls -la
total 32
drwxr-xr-x 22 shifumin staff  704  4 24 23:33 .
drwxr-xr-x 11 shifumin staff  352  4 22 11:51 ..
drwxr-xr-x  3 shifumin staff   96  4 24 22:09 .bundle
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 .git
-rw-r--r--  1 shifumin staff  604  4 24 23:33 .gitignore
-rw-r--r--  1 shifumin staff    5  4 24 23:33 .ruby-version
-rw-r--r--  1 shifumin staff 1969  4 24 23:33 Gemfile
-rw-r--r--  1 shifumin staff 2911  4 24 22:11 Gemfile.lock
-rw-r--r--  1 shifumin staff  374  4 24 23:02 README.md
-rw-r--r--  1 shifumin staff  227  4 24 23:02 Rakefile
drwxr-xr-x 10 shifumin staff  320  4 24 23:33 app
drwxr-xr-x  8 shifumin staff  256  4 24 23:33 bin
drwxr-xr-x 16 shifumin staff  512  4 24 23:33 config
-rw-r--r--  1 shifumin staff  130  4 24 23:33 config.ru
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 db
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 lib
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 log
-rw-r--r--  1 shifumin staff   66  4 24 23:33 package.json
drwxr-xr-x  9 shifumin staff  288  4 24 23:33 public
drwxr-xr-x  3 shifumin staff   96  4 24 23:33 storage
drwxr-xr-x  5 shifumin staff  160  4 24 23:33 tmp
drwxr-xr-x  4 shifumin staff  128  4 24 23:33 vendor

しかし、まだRailsアプリは動きません。
なぜならRailsアプリを動かすために必要な各gemがインストールされていないためです。
中身は載せませんが、 rails new 前は gem "rails" の行のみでしたGemfileにRailsアプリを動かすために必要な様々なgemが追加されていると思います。
これらのgemをインストールしていく必要があります。

line-bot-sdk-ruby gemの追加

追加されたgemをインストールする前にLINE bot開発に必要なgemを追加します。
下記の line-bot-api です。

github.com

Gemfileの一番最後に gem 'line-bot-api' の行を追加しましょう。
line-bot-apiの機能や使い方については実装時に追々見ていくことにします。

(前略)
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

gem 'line-bot-api'

余談ですが、gem名の記述が bundle init で作成したGemfileは "" で括られており、 rails new で上書き作成したGemfileは '' で括られていることを今回初めて知りました。
不思議ですね。

bundle install

2回目の bundle install です。
初回時に --path vendor/bundle オプションをつけていた場合、2回目以降はつけなくても ./vendor/bundle にインストールされます。
Bundlerの設定ファイルである .bundle/config の中身を見てみると、下記のように BUNDLE_PATH の設定があると思います。
これのおかげで、2回目以降は --path オプションが必要ないというわけです。

 ---
 BUNDLE_PATH: "vendor/bundle"

それでは追加されたgemを bundle install でインストールしましょう(今回も数分ほどかかるはずです)

bundle install

これで、ようやくRailsアプリを起動させる準備が整いました(大嘘)

rails s

Railsアプリ(のサーバ)を起動させるには rails s コマンドを利用します。

bundle exec rails s # bundle exec rails server でも bin/rails s でも bin/rails server でも可

下記のような出力が出るはずです。

=> Booting Puma
=> Rails 5.2.0 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song
* Min threads: 5, max threads: 5
* Environment: development
* Listening on
Use Ctrl-C to stop

Railsアプリが起動しましたね。
ちなみに、先に書いておくとアプリの起動を止める方法は最後の行に書いてあるように Ctrlボタン + C 同時押しです。

Railsアプリを起動させた状態でブラウザで確認してみましょう。
ローカル環境(Mac)で rails sRailsアプリを起動させた場合は http://localhost:3000/ でアプリを確認できます。
それではブラウザで確認してみます。

f:id:shifumin:20180425235639p:plain

Oh……

PG::ConnectionBad というエラーが出ていますね。
could not connect to server と怒られました。
そうです、データベースサーバのPostgreSQL(PG)の準備を何もしていないからです。

PostgreSQLのインストール

PostgreSQLについては下記をご参照ください(定期投げ)

(公式サイトがメンテ中なので後でここに貼ります)

インストール方法その他の詳細についてはこちらをご参照ください。

qiita.com

Homebrewでインストールし、データベースクラスタRuby(Rails)のデフォルトエンコーディングである UTF-8 で初期化します。

brew install postgresql
initdb /usr/local/var/postgres -E utf8

初期化が完了したら、下記のコマンドでPostgreSQLサーバを起動させます。

brew services start postgresql # 停止コマンドは brew services stop postgresql

それでは、PostgreSQLサーバも起動させたことですし、再びRailsアプリを起動させてブラウザで確かめてみましょう。

bundle exec rails s

f:id:shifumin:20180425235540p:plain

Oh……(2回目)
今度は ActiveRecord::NoDatabaseError というエラーが出ました。
FATAL: database "line_bot_development" does not exist とデータベースがないって怒られていますね。
そうです(2回目)、DBサーバは起動させましたが、肝心のデータベースをまだ作成していません。
データベースの作成(初期化)はrailsコマンドが良きに計らってやってくれます。
下記の rails db:create コマンドです。

bundle exec rails db:create
Created database 'line_bot_development'
Created database 'line_bot_test'

データベースが作られました(開発環境用DBとテスト用DB)
これで本当の本当の本当にRailsアプリを起動させる準備が整いました(真)

rails s再び

それでは、 rails sRailsアプリを起動させてブラウザで http://localhost:3000/ を確認しましょう。

bundle exec rails s

f:id:shifumin:20180425235424p:plain

無事にRailsアプリが起動できましたね。
お疲れ様でした(僕が)(今回の記事は長かった……)

終わりに

今回はRaisアプリの作成を行い、起動させ、確認しました。
次回はこのRails上にbotの実装を進めていきましょう。
ようやく本編がスタートする気がします。

参考

railsコマンド(rails) - - Railsドキュメント
http://railsdoc.com/rails

line/line-bot-sdk-ruby: Line: :API - SDK of the LINE Messaging API for Ruby.
https://github.com/line/line-bot-sdk-ruby

MacにPostgreSQL9.6.3をインストールしてみた - Qiita
https://qiita.com/uhooi/items/cd6256a72c6a03621c09

Heroku+RailsでLine botを作る 第5回 Bundlerの導入

前回までのあらすじ

第1回: http://shifumin.hatenablog.com/entry/2018/04/20/000500
第2回: http://shifumin.hatenablog.com/entry/2018/04/22/002000
第3回: http://shifumin.hatenablog.com/entry/2018/04/23/000500
第4回: shifumin.hatenablog.com

LINEデベロッパー登録を終え、必要なAPIキーである「Channel Secret」と「アクセストークン」を手に入れました。
また、必要なパッケージの導入し、Rubyをインストールしました。
そして、プロジェクトディレクトリをバージョン管理できるようにGitリポジトリ化しました。
今回は、Bundlerの導入を行っていきたいと思います(また、Railsアプリの作成まで辿り着けなかったよ……)

Bundlerとは

Rails(Ruby)アプリはBunlderというgem管理システムを導入することが多いです。
Ruby用のライブラリ(便利ツール的なもの)は「gem」という形で提供されています。
例えば、Railsもgemの形で提供されています。
このgemをGemfile(とGemfile.lock)というファイルで管理するためのシステムがBundlerです。
インストールするgemの種類・バージョン管理しているGemfile(Gemfile.lock)さえあれば同じgemの環境を整えることが容易であるため、複数人や複数の環境で開発を行う場合に役立ちます。

詳しくは下記を見てください(いつも通りの投げ)

Bundler: The best way to manage a Ruby application's gems qiita.com

Bundlerのインストール

そういうわけで、Bundlerをインストールしていきます。
念のため、gem自体をアップデートしてからBundlerをインストールします。

gem update --system
gem install bundler
bundle --version # bundle -v でも可
Bundler version 1.16.1

Bundlerがインストールされました。

Gemfileの準備

続けてBundlerで使用するGemfileの準備に進みます。
Gemfileとはインストールするgemの種類やバージョンを記載するファイルです。
まず、 bundle init でGemfileを作成します。

bundle init
Writing new Gemfile to /Users/shifumin/project/line_bot/Gemfile

Gemfileが作成されましたので開いて内容を確認します。

vim Gemfile # お使いのエディタでGemfileを開いてください(以下略)
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"

上記のようなGemfileになっているはずです。
まず、Railsアプリを実行するRubyのバージョンを明示するために ruby "2.5.1" の行を追加しましょう(バージョンは適宜ご変更ください)
次に、Railsをインストールするために gem "rails"コメントアウトを外しましょう。
また、一応Railsのバージョンを固定しておきましょう。
バージョンを固定する理由は、バージョンを固定しないとBundlerでgemをインストールする時期によってインストールされるgemのバージョンが左右されてしまうためです(やや曖昧な説明。許して)
バージョンが異なるとgemの挙動が変わって意図しない挙動をする場合があります(バグの温床になる)
例えば、現在(2018年4月24日)はバージョンを固定しない場合はRailsは5.2.0がインストールされますが、もう少し先の未来にはそれが5.2.1, 5.2.2, あるいは5.3.0になったりするはずです。
それでは、下のようにGemfileを修正しましょう。

# frozen_string_literal: true
ruby "2.5.1"

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "5.2.0"

rails gemのインストール

下記の bundle install コマンドでrails gemをインストールします。

bundle install --path vendor/bundle

--path vendor/bundle のオプションを付けています。
pathを指定する理由は、pathを指定しないとシステム配下にgemがインストールされてしまうためです。
今回インストールするgemはこのbot作成のためだけにインストールするので、プロジェクトディレクトリ配下にインストールされるようにpathを指定します。
詳しくは下記の公式ドキュメントの真ん中らへんをご参照ください。

Bundler: The best way to manage a Ruby application's gems

初回のインストールには数分かかるはずです。

Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Fetching rake 12.3.1
Fetching concurrent-ruby 1.0.5
(中略)
Fetching rails 5.2.0
Installing rails 5.2.0
Bundle complete! 1 Gemfile dependency, 41 gems now installed.
Bundled gems are installed into `./vendor/bundle`

Rails gem(とその依存関係のgem)は ./vendor/bundle/ にインストールされました。

終わりに

今回はBundlerを導入し、rails gemをインストールしました。
次回こそ、本当の本当にRailsアプリの作成を行なっていきましょう(三度目の正直)
この次に実行するコマンドが rails new であるため次回の記事で大丈夫(?)なはずです。。。

参考

Bundler: The best way to manage a Ruby application's gems
http://bundler.io/

Bundlerの使い方 - Qiita
https://qiita.com/oshou/items/6283c2315dc7dd244aef

bundle install - Bundler: The best way to manage a Ruby application's gems http://bundler.io/v1.16/bundle_install.html