【3回目】Railsに挫折中の人が、Ruby/Sinatraから再入門してみた(全7回)
5/11より毎週土曜日、株式会社X-HACK主催の勉強会、
【全7回】Ruby / Vue.js「ゼロから」ウェブサービスを作る【初心者向け | 個別指導あり】
に参加しています。
学んだことをこちらでアウトプットしていきます!
今回は3回目!
今回はsinatraプロジェクトを本番環境(Heroku)へのデプロイ、PostgreSQL、オブジェクト指向などについて学びました!
間違っている記述などあれば教えていただけると嬉しいです!
1.SinatraプロジェクトをHerokuでデプロイしてみよう!
前回作成したSinatraプロジェクトを実際に、デプロイする手順を紹介
⭐︎「Heroku」とは?
Heroku はコンテナベースのクラウド型 PaaS(サービスとしてのプラットフォーム)です。
heroku公式より引用(https://jp.heroku.com/about)
はて?どういうこと?PaaSとは?(-_-)
⭐︎まず、PaaSとは?
アプリケーションを動作させるための土台となるプラットフォームをサービスとして提供するサービスのこと。
要するに、PaaSにアプリケーションを放り込むと、動いてくれる!
【具体例】
Google App Engine
Azure App Service
Heroku
*ちなみに、IaaS、SaaSとは?
・IaaS→「Infrastructure as a Service」の略。アプリケーションを構築および稼動させるための基盤(インフラ)をインターネット上で提供するサービスのこと。
【具体例】
AWS (Amazon EC2)
Google Compute Engine(GCP)
・Saas→「Software as a Service」の略。インターネット上で提供されているソフトウェアのこと。
【具体例】
「Gmail」などのGoogleアプリケーション
TwitterやLineなどのSNS
*まとめると!
Iaas→ネットワーク、ハードウェア、OSまで用意してくれる!
PaaS→IaaS + ミドルウェア(DB、Rubyを動かす環境など)を用意してくれる。
SaaS→PaaS + アプリケーションとして提供してくれる。
よって、アプリケーションを「動かす」難易度は、
IaaS < PaaS < SaaS の順に優しくなる。
⭐︎Herokuにデプロイ
早速Herokuにデプロイしましょう!
①Heroku登録
②Heroku CLIインストール
→コマンドラインでherokuを操作可能に!
$ brew install heroku
③ターミナルでアカウント認証(メールアドレス、パスワード入力)
$ heorku login
④ 作成したプロジェクトを、Git操作でcommitまで完了させる
$ git init
$ git add -A
$ git commit -am "first heroku deploy" // 「-am」はcommitとaddを同時に行える!
⑤herokuのリモートデポジトリに追加し、herokuにpush!!!
$ heroku git:remote -a <プロジェクト名>
$ git push heroku master
⑥完了!!・・・のはずが、、、エラー。
⭐︎必ず起動設定ファイルを記述しよう!
⑦上のエラー画面をもとに、Herokuのログを見てみる
$ heroku logs --tail
⑧config.ruファイルが足りない!
ばーっと出たログの中に「configuration /app/config.ru not found」を発見!
ググったところ、どうやらconfig.ruファイルが足りないらしい!
(参考:http://hihan.hatenablog.com/entry/2017/08/25/015416)
⑨プロジェクト直下にconfig.ruを作成し、下記を記述。
require './app'
run Sinatra::Application
⑩再度Git操作、Herokuへのpush(③〜⑧)をして、今度こそ完成!!
*Rack(サーバフレームワークとRubyフレームワークの橋渡しをするもの)用の設定ファイルには、「Procfile」と「config.ru」の2パターン(知っている限り)がある。
Procfileの場合:
①プロジェクト直下に、Procfileを作成
②「web: bundle exec ruby app.rb -p $PORT」を記述して保存。
2.PostgreSQLを使ってみよう!
⭐︎PostgreSQLのgemをインストール
①bundle init でGemfileを作成した後、Gemfileを編集し保存。
source "https://rubygems.org"
gem 'sinatra'
gem 'sinatra-contrib'
gem 'pg'
②bundle install 実行。
$ bundle install --path vendor/bundle
*「--path vendor/bundle」オプションを付けると、プロジェクト直下にgemをインストールしてくれる。
「bundle install」のみ→グローバルにインストールされる。
【メリット】プロジェクト毎にgemを分けられる。
【デメリット】その分容量を圧迫してしまう。
オプションを付けた2回目以降は、「bundle install」のみでプロジェクトにgemがインストールされていく。
⭐︎PostgreSQLと接続!
③app.rbに下記を追記し、PostgreSQLに接続し、情報を受け取る。
require 'pg'
get '/' do
# インスタンス変数
@message = []
# 接続情報
connect = PG::connect(
host: "",
user: "",
password: "",
dbname: "",
port: "5432"
)
# DB接続→SQL発行し、データを受け取る
results = connect.exec("SELECT * FROM test")
# データをインスタンス変数に格納
results.each do |result|
@message << result
end
# DB接続終了
connect.finish
#index.erbに遷移
erb :index
end
*接続情報は、herokuの作成したプロジェクトのpostgresql→setteigs内のDatabase Credentialsを参照するとわかる!
赤字のホスト、データベース名、ユーザー名、パスワード、ポート番号をコードの接続情報に入力。
(デプロイする場合は、このままだとセキュリティ的によろしくないので、必ず環境変数に通すなどの処理を行う!)
④erbでインスタンス変数を取り出し、DBから受け取った情報を出力!
(ここは状況に応じて処理を変えてください!)
<ul>
<% @message.each do |mes| %>
<li><%= mes["id"] %></li>
<li><%= mes["address"] %></li>
<% end %>
</ul>
⭐︎PG Commanderについて
「PG Commander」というツールを使えば、デスクトップ上でDBの情報をGUIで見ることができるので便利!
先程のheroku上のDBも、コードに記述した接続情報と同様に、
・ホスト
・ポート番号
・ユーザー名
・パスワード
・データベース名
を記載すれば、DB内の情報を見ることができる!(ニックネームは任意のものでOK)
3.オブジェクト指向とは?
突然ですが、ざっくりRubyの肝であるオブジェクト指向について。
本質は、データ管理を楽にするために考案されたもの!
⭐︎本屋を例にしてみます。
ここで質問!
もし、本屋さんの本が全て「あいうえお順」に並んでいたらに並んでいたらその本屋さんに行きますか?
行かないですよね〜。そんなお店!!
探すのに大変。。お店側も並べるのに一苦労です!!
一般的な本屋さんでは、カテゴリー分けしたり、売れ筋は平置きしたり、著者ごとに分けたり、出版社ごとに分けたりして、分かりやすいようにしてくれていますね。
本の管理も、書籍ISBNをもとに管理しています!
この考え方をコード上に落とし込んで考えたのが、オブジェクト指向です!
・本クラス
・カテゴリークラス
・売れ筋クラス
・著者クラス
・出版社クラス
などに分類し、一つ一つの情報を毎回入力するのではなく、それぞれのクラスと連動させるようにしています。
(例)
「痛快! コンピュータ学」/坂村 健/集英社文庫/「コンピュータ・IT」
↓
0001/1001/2001/3001
それぞれのクラスに情報が記載されているため、数字だけで管理が可能!
※ちなみに、コンピュータの事を知りたければ「痛快! コンピュータ学」
X-HACK松田さんのオススメです!ぜひ!(僕はまだ読めてませんが。笑)
⭐︎ざっくりまとめると!
オブジェクト指向とは・・・
クラスを用いて、データ管理を楽に、データ量を削減する為の仕組みです!
4.質問まとめ
本日質問したことを簡単にまとめてみます。
⭐︎N+1問題とは?
SQLを1回投げたつもりが、紐付いているデータ分だけのSQLを発行してしまっている問題。
1+N問題の方がしっくり来た。「bullet」というgemでも検知できるみたい。
下記のQiita記事が分かりやすかったです。
(参考)https://qiita.com/hisonl/items/763b9d6d4e90b1606635
⭐︎個人開発もローカル仮想環境で開発した方が良い?
【メリット】
・環境を万が一壊しても、仮想環境なら環境ごと消せば良いので楽!
・プロダクト毎に環境を使い分けられる!
【デメリット】
・構築や設定がめんどくさい。
・パソコンが重くなる。
【結論】
ローカル仮想環境を構築しないで大丈夫!
必要に駆られたらで、問題なし!
⭐︎仮想環境のファイルの出し入れがめんどくさい!
「Synced Folders」を使えば、ホストOS(vagrantコマンドを叩く方)とゲストOS(仮想環境側)でファイルを共有できる!
(参考)https://qiita.com/Noe/items/623267cd8c8634ae11af
今週は以上になります!
クラスについては、今後の授業で詳しくやるようなので、そちらでしっかりまとめていきたいと思います