【パーフェクト Ruby on Rails】を読む - その15
DBを管理する
railsコマンドで利用できる主なコマンド
コマンド | 概要 |
---|---|
rails db:create | データベースを作成する(SQLite3の場合は不要) |
rails db:drop | データベースを削除(SQLite3の場合は「.sqlite3」ファイル自体を削除) |
rails db:migrate | マイグレーションの内容をDBに反映させる |
rails db:migrate:status | 現在のマイグレーション状態を表示する |
rails db:prepare | DBが存在すればマイグレーションを、存在しなければデータベースのセットアップを実行する |
rails db:reset | データベースをdropし、db:setupを実行する |
rails db:rollback | 実行したマイグレーションを取り消す |
rails db:schema:dump | DBの構成をdb/schema.rbへ出力する |
rails db:schema:load | db/schema.rbの内容をDBへ反映する |
rails db:seed | db/seeds.rbの内容を実行する |
rails db:seed:replant | DBの内容をTRUNCATE(切り捨て)し、db:seedを実行する |
rails db:setup | データベースを作成し、スキーマの読み込みとシードデータの読み込みを行う |
rails db:version | 現在適用しているマイグレーションのバージョンを表示する |
データベースについての曖昧だった知識を記述していきます
- リレーショナルデータベースについて
リレーショナルデーベースは表です。
数学の演算に基づいてデータを取り扱う事ができます。
一件のデータをレコード、各項目をフィールドと呼ぶ
- 外部キーとは
他の表の列を参照しているキーを外部キーと呼ぶ
作成されたmigrationファイルに変更を加えたものをDBに反映させたい時はrails db:migrate
する
一度、migrateしたものを取り消したい場合はrails db:rollback
を使います
(何があったかを残しておくためにロールバックは現場ではあまり使わないと聞きました)
ひとこと
進捗よりも、DBについてそもそもの部分がわかっておらず、根本的なところの議論が中心でした。今日でデータベースに対する理解が深まりました。🤦♀️ <oh...
参照
【図解入門 TCP/IP】を読む - その9
1-4 いろいろなネットワーク機器のカタチ
データリンク層以上(物理層以外)で動作するネットワーク機器は、さらに「物理アプライアンス」と「仮想アプライアンス」の2種類に大別することができます。この二つは、どちらも階層構造モデルに準拠しつつ、パケットを処理するという点においては変わりません。しかし、機器としてのあり方が変わります。
物理アプライアンス
目で見る事ができる、いわゆる箱型の装置です。
仮想アプライアンス
仮想化技術を提供するソフトウェア(仮想化ソフトウェア)の上で動作するネットワーク機器です。
(これら二つはハードウェアとかソフトウェアとかより、引いた目で見ないとイメージできない。もっと外側の部分)
ネットワークのカタチ
LAN,WAN,DMZこの3つを知ればネットワークの理解が大きく進みます。
LAN
LANはLocal Area Networkの略で、家庭や企業など、限られた範囲のネットワークのことです。スマホやタブレット、テレビやHDDレコーダーなど、たくさんの端末がインターネットに接続することが多くなってきて、家庭内の端末は、ブロードバンドルーターが提供しているLANに一旦接続して、インターネットに出ていきます。 企業のLANも基本的に変わらないが、構成しているネットワーク機器の性能と機能が大きく異なります。
WAN
WANはWide Area Networkの略で、距離的に遠く離れた範囲のネットワークのことです。
インターネットと閉域VPN網に大きく分けられます。
インターネットはざっくり言うと、ルーターの集まりです。
インターネットサービスプロバイダー(以下、ISP)や研究機関、企業などが持っているたくさんのルーターが、山を超え、谷を越え、海を越え、国境を繋いでくれていて、無数のパケットを運んでいます。
それぞれのISPには AS番号という、インターネット上で一意の管理番号が割り当てられています。ASはAutonomous(自律)Systemの略で、それぞれの組織が管理している範囲のことです。
- 閉域VPN網
LANとLANを接続するネットワークのことです。
DMZ
DeMilitarized Zoneの略で、インターネットに呼応会するサーバーを設置するネットワークの事です。冗長化 の機能が必要不可欠で、
"どの機器が故障しても、ケーブルが断線しても即座に経路が切り替わりサービスを提供し続けることができます"
そのために同じ種別のネットワーク機器を並列に配置します。
ひとこと
ここではまだ説明段階のようで「そういうものがあるんだな」、「へぇ〜」くらいの感覚で読んでました。🤔 🤔 🤔
参照
本書のみ
【パーフェクト Ruby on Rails】を読む - その14
3-2-5 RailsとRackの関係
Railsアプリケーションはrackupで起動可能です
RailsはRackの仕様に則ったアプリケーションなので
$ bundle exec rackup
コマンド実行後、ブラウザのlocalhost:9292
で起動できます。
rails new
すると config.ru
というファイルがあり、このファイルがあることがRackアプリケーションであるという証拠になります。
config.ruファイルに明記されていませんがどのようなRackミドルウェアを利用しているかを確認するには
% bin/rails middleware
で確認できます。
私の環境では以下の通りでした。
% bin/rails middleware use Webpacker::DevServerProxy use Rack::MiniProfiler use ActionDispatch::HostAuthorization use Rack::Sendfile use ActionDispatch::Static use ActionDispatch::Executor use ActiveSupport::Cache::Strategy::LocalCache::Middleware use Rack::Runtime use Rack::MethodOverride use ActionDispatch::RequestId use ActionDispatch::RemoteIp use Sprockets::Rails::QuietAssets use Rails::Rack::Logger use ActionDispatch::ShowExceptions use WebConsole::Middleware use ActionDispatch::DebugExceptions use ActionDispatch::ActionableExceptions use ActionDispatch::Reloader use ActionDispatch::Callbacks use ActiveRecord::Migration::CheckPending use ActionDispatch::Cookies use ActionDispatch::Session::CookieStore use ActionDispatch::Flash use ActionDispatch::ContentSecurityPolicy::Middleware use ActionDispatch::PermissionsPolicy::Middleware use Rack::Head use Rack::ConditionalGet use Rack::ETag use Rack::TempfileReaper run AppName::Application.routes
多い…。
ミドルウェア内の記述で破壊的メソッドのgsub!
が出てきたので復習しました
p "もとみち".gsub!("もと", "肉") #=> "肉みち" !は破壊的メソッドで、元あった"もと"を消し去り、"肉"として生まれ変わります。
今回、本書で書かれていたパターンは正規表現を置き換え元にしていたので同様のコードを書き、紐解いてみました。↓
p "hoge".gsub!(/hoge/i,"肉おいしい")#=>"肉おいしい" # /i の部分で含まれている大文字小文字関係なく変換する p "hoge".gsub!(/Hoge/i,"肉おいしい")#=>"肉おいしい" p "hoge".gsub!(/hoGe/i,"肉おいしい")#=>"肉おいしい"
↓paizaで検証しました。
正規表現をちゃんと言葉にできなかったので調べました
「正規表現」という単語が出てきたら「曖昧な感じで指定できるんだな~」という事です。正規なのに曖昧って面白いですね。🤷♀️
ひとこと
正規表現の/xyz/i
の/i
って何だろう?となって、それがフラグだと知れたのが楽しかったです。うん感動した!😈
参照
【パーフェクト Ruby on Rails】を読む - その13
Rackミドルウェアを学習している最中にinitializeメソッドを定義していたのでinitializeメソッドについて再度復習しました。
initializeとは
newのデフォルト値として設定できる(Ruby超入門p200~)
※RailsのModelではActiveRecordを継承しているため、initializeメソッドを指定しなくても、例えばUser.new
に引数を持たせてオブジェクトを作ることができます。
Rackミドルウェア
Rackにはアプリケーションサーバ(pumaとか)とアプリケーション(何かしら)の間に処理を追加するミドルウェアという機能が備わっています。
Rackミドルウェアというと、本書の場合で言えばアプリケーションであるRackとアプリケーションサーバであるpumaの間に処理を追加する機能です。
以下のようにuseメソッドで機能を追加できます。Runtimeを追加機能として持たせている記述です。
repuire "rack" require_relative "app"use Rack::Runtime run App.new
Rackミドルウェアを作るとき
Rack(インターフェース)はRubyで作られているから(RailsのようにActiveRecordは継承していないので)initializeを書いています。
Rackのアプリを起動する際はrackup
コマンドで起動します。
Rackミドルウェアとは関係なく単にミドルウェアとは何なのかと疑問に感じたので学習しました。
- ミドルウェア
OSさんとアプリケーションさんの間に入って、いろいろな雑用をしてくれるやつ
です。
ひとこと
点と点が線になり、また新たな点との出会いを繰り返しています。勉強が楽しいです。🐶
参照
【パーフェクト Ruby on Rails】を読む - その12
3-2 Rack
Rackは、RubyでWebアプリケーションを開発するための、最小限でモジュール化された適応性の高いインターフェースを提供します。HTTPのリクエストとレスポンスを可能な限りシンプルな方法でラップすることで、ウェブサーバー、ウェブフレームワーク、そしてその間にあるソフトウェア(いわゆるミドルウェア)のAPIを単一のメソッドコールに統一して抽出します。
その詳細はRack仕様に記載されており、すべてのRackアプリケーションはこれに準拠する必要があります。
元々はPythonのWSGI(Web Server Gateway Interface)という企画を元に提案されたものです。🥃
Rackはwebサーバーと、Rubyで作られたフレームワークのアプリケーションをつなぐ
インターフェイス)です。 (Rubyで作られた、という点が大事です。Railsだけではありません)
参照のgithubの意図からすると、
例えば「PHPでもRackと呼ぶのか?🤔」という疑問に対しては「NO🙅♀️」と言えるでしょう。🤷♀️🤷♀️🤷♀️🤷♀️
・アプリケーションサーバー
Railsを動かすためのサーバーです。webサーバーとのリクエストやレスポンスの処理が出来ます。
Railsのデフォルトのアプリケーションサーバーーは"puma" rails new
したらGemfileに書いてある
他にも"webrick"などがある。但しpumaより遅い。
Rackの規約
- callメソッドを定義する
- callメソッドは慣例的にenvあるいはenvironmentと命名する引数を一つ受け取る
- callメソッドは次の値を配列型で戻り値として返す必要がある
- HTTPのステータスコードを表す数値オブジェクト
- HTTPヘッダーを表すハッシュオブジェクト
- レスポンスボディとなる文字列を含んだ配列風オブジェクト
Rackに対する現時点での見解
pumaとか他にもあるアプリケーションサーバとrailsなどのフレームワークをつなぐインターフェースであり、もし今後、pumaより早いアプリケーションサーバが登場したとして、それをrailsにも使えるようにしてくれる、インターフェースがRackなのかなと思う。 Rackがあるおかげで相性が悪いから使えないとか発生しない。
学習した上で残る疑問点
自作のRackを作らなければならない状況がわからないです。
🤷♀️
ひとこと
現段階では一言で言えません🙇♂️
参照
Rack github
アプリケーションサーバー
Rackでwebフレームワークを自作する
【Ruby on Rails】アプリケーションサーバ「Puma」について
【図解入門 TCP/IP】を読む - その8
アプリケーション層で動作する機器
次世代ファイヤーウォール
ファイアウォールの進化版です。色々なセキュリティ機能を詰め込み、統合化を図っています。IPアドレスやポート番号だけでなく、いろいろな情報をアプリケーションレベルで解析することによって、トラディショナルファイアウォールより高次元のセキュリティ、高次元の運用管理性を実現しています。WAF(ワフ)
Web Application Fireの略。
WAFはクライアントとサーバー間でやりとりされる情報のふるまいをアプリケーションレベルで一つ一つ検査し、必要に応じてブロックします。SQLインジェクション
生のSQL文を書くことで、そのSQLが実行されてしまう攻撃のこと。そうすると、サイトが改ざんされてしまったり、隠れていたデータが見られ奪われてしまうこと。XSS(クロスサイトスクリプティング)
入力欄に<script>
を書いた投稿をすることによって、ユーザーを悪意あるサイトへ飛ばすなどの攻撃のこと。セッションハイジャックやwebサイトの改ざんなどにも使われる。
負荷分散装置(L7スイッチ)
負荷分散方式という決まり事に基づき、背後にいる複数のサーバーに振り分けることによって、システム全体で処理できるトラフィック量の拡張を図ります。また、ヘルスチェックと呼ばれる、定期的なサービス監視を行うことによって、障害の発生したサーバーを負荷分散対象から切り離し、サービスのサービスの可用性向上を図ります。
負荷分散対象から切り離すイメージ…?
1 2 3 4 5
🪨 🪨 🪨 🪨 🪨
🙋 🙋 🙋 🙋 🧎 <無理
1 2 3 4 5
🪨 🪨 🪨 🪨 🚧 <切り離そう
🙋 🙋 🙋 🙋 🚧 <ここは使わないで
まとめ
ここまで物理層からアプリケーション層までの機器を数珠つなぎに繋いでいけます。
参考
本書のみ
【パーフェクト Ruby on Rails】を読む - その11
第3章押さえておきたいRailsの基本機能
テストの種類と実行方法
ソフトウェアの開発において、テストを行うことで品質を一定の水準に保つことは必要不可欠です。プログラムのテストを記述する事でトータルコストを少なくするため、Rails標準のテストフレームワークのminitestを学びます。
bin/rails test
でテストを実行することができます。
ディレクトリ | 概要 |
---|---|
application_system_test_case.rb | システムの基底クラス |
channels | Action Cableに対するテストディレクトリ |
controllers | コントローラーに対する機能テストディレクトリ |
fixtures | テストデータ(fixture)を管理するディレクトリ |
helpers | ヘルパークラスに対するテストディレクトリ |
integration | 複数のコントローラー間でのテストに関するテストディレクトリ |
jobs | Active Jobに対するテストディレクトリ |
mailers | Action Mailer に対するテストディレクトリ |
models | モデルに対するテストディレクトリ |
system | システムテストディレクトリ |
test_helper.rb | ユニットテストで読み込むテスト用ヘルパークラス |
Active Jobというワードが初めて聞いたので少し掘り下げる(ざっくりと) - Actiive Jobという非同期通信用のフレームワークがある - sidekiq(gem)です。 - Redisはオープンソースの永続化可能なインメモリデータベース(In-memory database)で、BSDライセンスで公開されています。 特徴はインメモリ型データ構造ストアであること、そしてデータの永続化ができることといえるでしょう。 メモリ上で動作するキーバリューストア型のデータベースです。
- スタックとキュー(例)
- スタック…最後に積み上げた本を最初に取り出す
- キュー…最初に並んだ人を先にサービスする
- 大量のジョブはRailsとSidekiqを使うとよし DelayedJob(gem)とResque(gem)というのもある
ひとこと
今日は現時点で使った事がなかったActive Jobについての議論が中心でした。 🤦♀️