【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

今週は以上になります!
クラスについては、今後の授業で詳しくやるようなので、そちらでしっかりまとめていきたいと思います

この記事が気に入ったらサポートをしてみませんか?