XHack勉強会 第2回『Ruby「ゼロから」画像共有サービスを作る』で学んだこと
今回はsinatraのシンプルなwebサービスの作り方を学んだので、
それに関連することをまとめようと思います。
このノートでざっくり分かること。
・sinatraのインストールからwebアプリ立ち上げ
・エラー文章を読み解く方法について
・Git、GitHubについて
・Ruby(webアプリケーション)とDB接続との関係
・データベースとSQLについて
【sinatraのインストールからwebアプリ立ち上げ】
■sinatraについて
軽量なWebアプリケーションフレームワークのこと。
同様のフレームワークに「RubyonRails」があるけど、
そちらは徹底したルール化を行いwebサイトを高速で作る。
ただ初心者には覚えることも多く、とても難しく最悪挫折。。。
という道になるかもしれない。
そんなRubyの初心者の方に最もオススメしたい、
とりあえずウェブサービスを作るのに最適なフレームワークが
「Sinatra」とのこと。
■bundlerについて
「bundler」とはgem専用のパーケージ管理システムのこと。
gemを個別にインストールした場合、
それぞれの互換性などがあり共同開発の場合は各環境を合わせる必要がある。
そういうgem同士の互換性を保ちながら、自動で各gemの導入及び管理を行ってくれる。
bundler本体以外のgemは、bundler経由でインストールすること。
もしインストールしてなければ下記コマンドを実行すること。
$ gem install bundler
$ bundler -v # バージョン及びインストール確認
■sinatraのインストール
Rubyとかは以前のノートでインストール済と考える。
適当なディレクトリ(プロジェクトディレクトリ)を作ってから
$ bundle init
そして作成された[Gemfile]に以下を記入
gem "sinatra"
そしてターミナルに戻り
$ bundle install --path vendor/bundle
・"--path vendor/bundle"とは
実際の開発時はアプリケーション(プロジェクト)ごとに分けることが推奨されているので、インストール先の指定をする。
(プロジェクトディレクトリ内のvendor/bundleディレクトリ内にインストール)
※ちなみにこの設定は記憶されるので、次回以降"bundle install"だけ実行しても同様の設定が付加される。
その後、適当なRubyファイル(app.rb)を作成しsinatraの起動。
require 'sinatra'
get '/' do
'hello'
end
$ bundle exec ruby app.ab
・"bundle exec"とは
簡単に言うと、「現在居るプロジェクトのGemを指定する」ということ。
"rake xxx"の場合は、「システム側のgemを指定する」ということ。
これを実行すると最後の方に"pid=xxxxx port=xxxx"と表示されているが、
このportの番号を使ってブラウザで下記にアクセスをし、「hello」と表示されていればOK。
これでwebアプリケーションの作成は完了。
■sinatra/reloaderの導入
ただこのままでは変更の度にsinatraの再起動が必要なので、
ブラウザリロードで再読込してくれる"sinatra/reloader"を導入する。
まずsinatraを"Control+C"で停止。
そして「Gemfile」に下記を追記。
gem 'sinatra'
gem 'sinatra-contrib' # この行を追加
そして"bundle install"を実行。
その後、「app.rb」に下記を追記。
require 'sinatra'
require 'sinatra/reloader' # この行を追加。sinatra-contribはこのために必要
get '/' do
'hello'
end
そして1度sinatraを起動し、先程のページを開いた後に
「app.rb」の'hello'を好きな文章に変更する。
そしてブラウザをリロードし、変更通りになっていればOK。
■VIEWの追加
これではただのテキスト表示にしか過ぎないので、
ちゃんとしたHTMLで表示したいという時は、
[.erb]ファイルを作って呼び出す形になります。
・.erbファイルとは
HTMLの中にRubyの構文を入れることが出来るファイル。
まずプロジェクトディレクトリ直下に"views"というディレクトリを作成。
その中に[好きな名前.erb]ファイル(今回は"test")を作成し、
中に以下を記入。
<%= Time.now %>
そしてこのファイルを参照できるように、
[app.rb]ファイルに下記を追記。
require 'sinatra'
require 'sinatra/reloader'
get '/' do
'hello'
end
# ここから
get '/time' do
erb :test
end
# ここまでを追加
そしてsinatraを起動し、ブラウザで下記URLにアクセス。
現在時刻が表示されれば完成。
【エラー文章を読み解く方法について】
ここまでスムーズに進んだ設定で書いてきましたが、
もしもエラーが出た場合として記載しようと思います。
・ブラウザでページを開く際にURLを間違えた or
ルーティング設定を間違えた時など
要は
http://localhost:xxxx/times
と
get '/time' do #ここがルーティング設定。(/time)
erb :test
end
が上記みたいに異なっていた場合。
こんなエラーが出ます。
翻訳したら「Sinatraはこの点については知りません」と書いてました。
要は「このURLは当てはまるものがない」です。
→ルーティングか入力したURLを見れば分かる、ということになります。
ちなみに左下にsinatraからの凄い親切な解決策が書いてあります。
「ルーティング設定を"/times"にしたら、そのURLは見つかるよ」
なので、自動的に
URLに"s"を付けていた。 or ルーティング設定の"s"が抜けていた。
などと気付けます。
・ルーティング設定にてファイル名の指定を間違えた、など
get '/time' do
erb :test
end
とルーティング設定をしてて
「test2.erb」と名前がなっていた場合は
こんなエラーが出ます。
右上に"No such file or directory"って書いていますが、
"このファイルもしくはディレクトリが見つからない"ということです。
そして"BACKTRACE"部分に、どこがおかしいのかも指摘してくれています。
これでファイル名の間違いなのか、ファイル名の指定が間違いなのか
などが分かります。
英語は文章上、結論を先に言いたがる言葉なので
結構最初の方に根本のエラーがあることが多いので
重点的に見るようにしたらいいのかな?と思います。
【Git、GitHubについて】
■Gitとは
ファイルを管理する時に日付をつけたり、
ルールを作ってファイルをたくさん増やして管理する。
ただ人間なので、ルール守れなかったりして
どれが最新なのかどの時点のファイルなのか
更にはどんな変更がされたファイルなのかも分からない
これを自動化してくれるツールが
バージョン管理システム「Git」
■GitHubとは
Gitを使ったプロジェクト管理のWEBサービスのこと。
Gitリポジトリ(ざっくり言うとプロジェクトディレクトリ)を
オンライン上にアップロード(バックアップ)でき、他の人と共有できる。
他の人のリポジトリにもアクセスでき、共同開発が可能になる。
またターミナルのGit操作はただのテキスト表示だが、
こちらは視覚的に変更履歴などを確認できる。
■Git操作時のコマンド・前回コミットから変更されたファイルの一覧表示
・前回コミットから変更されたファイルの一覧表示
$ git status
・保存したい変更履歴をgitに教える
$ git add [ファイル名]
$ git add . # 全ての変更したファイルを指定
・変更履歴を保存(コミット)する
$ git commit -m [何を変更したのかコメントを書く]
■GitHubへの反映
コミットされたファイルをGitHubに反映するには、
GitHub上で新しくリポジトリを作成し、下記コマンドを実行。
・GitHub(リモートリポジトリ)とローカルリポジトリを接続(新しくリポジトリ作ったページに書いてるコマンド)
$ git remote add otigin git@github.com:xxxx/xxxx.git
・変更履歴をGitHubへ伝える
$ git push origin master
その後、GitHub上で"PullRequest" → "merge"というのが基本の流れ。
これでGitHubにアップロード完了。
【Ruby(webアプリケーション)とDB接続の関係】
■ローカルマシンでDBにアクセスするRubyプログラムの流れ
①ターミナルからRubyプログラム起動 `$ ruby sample.rb`
②rubyプログラムに記述されたプログラムが実行される
③プログラムがDBアプリケーション(DBA)と接続する
④プログラムがDBアプリケーションに対してSQLを送る
⑤DBアプリケーションは、データベースからデータを取得する
⑥DBアプリケーションは、プログラムに結果を渡す
⑦RubyプログラムがDBから結果を受け取る(ハッシュや配列)
⑧受け取った結果を利用して処理を行う
■ブラウザからサーバーにリクエスト送信する場合(ネットワーク経由)
①クライアント(ブラウザ)がサーバーへリクエスト送信(http://xxx)
②サーバーアプリケーションがリクエストを受け取る
③リクエストに応じたRubyプログラムが起動する
④ここからはローカル②〜⑥.までと同じ
⑤受け取った結果をHTMLやJSONといった形式に変換する
⑥サーバーからクライアントへレスポンスを送信
⑦ブラウザが結果を表示する
【データベースとSQLについて】
■データベースについて
データとは、コンピュータに保存・記憶されている数値のこと。
このデータが集まったものがデータベース。(エクセルの表みたいなもの)
「データベースを使うメリット」
・複数のデータをまとめて管理できる。
・データを簡単に探せる。
・簡単に編集できる(更新が簡単)。
・トランザクション処理を使える。
・トランザクション処理とは
結果の整合性が要求される複数の処理を1つにまとめたもの。
処理には「成功」か「失敗」しかなく、
もし全ての処理が成功しなかったら、元の状態に戻る。
(銀行の口座振込など)
基本的にデータベースは、永続的に保存される物なので
不揮発性のストレージ(HDD、SSDなど)に保存されている必要がある。
そして検索しやすいように整理がされている。
・不揮発性のストレージの理由
揮発性(メモリ)は超高速だが容量が少ない為、
DBのような膨大なデータを保存できない。
それに電源供給を止めるとメモリ上に展開してるデータは消える為、
重要なデータを入れることに向かない。
なので揮発性メモリは、プログラムをメモリ上に展開し
それを実行することに向いている。
そして必要な時だけ、必要なデータをDBから引き出す。
それが役割。
■SQLとは
データベースを操作する言語。
色々な種類(postgleSQL,MySQL,SQliteなど)があるが、
SQLは国際標準化されているのでデータベースが変わったとしても、
同じSQLで操作することが可能。
そしてSQLを使っていないシステムはないと言っても過言ではない。
■データベースの中身
データベースは「一定の形式で整理されたデータの集まり」であるため、
データベース内のそれぞれの列には指定したデータしか入力できないようにする。
それをデータ型と言い、主に下記に分類される・
・数値型
int型:整数
float型:浮動小数点数
・文字列型
char型:255文字までの文字列。
・日付&時刻型
date型:日付
time型:時刻
■なぜデータ型を指定するのか
・データはメモリ展開され処理されるので、メモリ使用量を少しでも
節約するため。
・データに意味を持たせ、管理をしやすくするため。
・入力に制限をかけて、入力ミスなどを防ぐため。
■DB操作の基本的な種類とオーソドックスな書き方
・検索
select 「項目1」, 「項目2」 from 「テーブル1」 where 「項目3」='「条件1」';
・追加
insert into 「テーブル1」 (「項目1」, 「項目2」) values('「値1」', '「値2」');
・更新
update 「テーブル1」 set 「項目1」 = '「値1」', 「項目2」 = '「値2」' where 「項目3」='「条件1」';
・削除
update 「テーブル1」 set 「項目1」 = '「値1」', 「項目2」 = '「値2」' where 「項目3」='「条件1」';
ざっくりとまとめて見ましたが、Gitについてはまた別の記事で
まとめるつもりです。