【パーフェクト 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...

参照 

rails db:reset rails db:magrate reset

【図解入門 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って何だろう?となって、それがフラグだと知れたのが楽しかったです。うん感動した!😈

参照

本書の中にあった'gsub!'メソッド
正規表現
正規表現リファレンス

【パーフェクト 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アプリケーションはこれに準拠する必要があります。

元々はPythonWSGI(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はクライアントとサーバー間でやりとりされる情報のふるまいをアプリケーションレベルで一つ一つ検査し、必要に応じてブロックします。

  • 負荷分散装置(L7スイッチ)

負荷分散方式という決まり事に基づき、背後にいる複数のサーバーに振り分けることによって、システム全体で処理できるトラフィック量の拡張を図ります。また、ヘルスチェックと呼ばれる、定期的なサービス監視を行うことによって、障害の発生したサーバーを負荷分散対象から切り離し、サービスのサービスの可用性向上を図ります。

負荷分散対象から切り離すイメージ…?

1 2 3 4 5
🪨 🪨 🪨 🪨 🪨
🙋‍ 🙋‍ 🙋‍ 🙋‍ 🧎 <無理

1 2 3 4 5
🪨 🪨 🪨 🪨 🚧 <切り離そう
🙋‍ 🙋‍ 🙋‍ 🙋‍ 🚧 <ここは使わないで


まとめ

ここまで物理層からアプリケーション層までの機器を数珠つなぎに繋いでいけます。

参考

本書のみ

【パーフェクト Ruby on Rails】を読む - その11

第3章押さえておきたいRailsの基本機能

テストの種類と実行方法

ソフトウェアの開発において、テストを行うことで品質を一定の水準に保つことは必要不可欠です。プログラムのテストを記述する事でトータルコストを少なくするため、Rails標準のテストフレームワークのminitestを学びます。


bin/rails testでテストを実行することができます。

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についての議論が中心でした。 🤦‍♀️

参照

Sidekiqについて
非同期処理や定期実行を行う(Jobスケジューリング)