Skip to content

ykawabata17/my_study_during_training

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 

Repository files navigation

学んだことをメモ程度に書いていく

研修という勉強するのにもってこいの機会なので,研修期間中に勉強した内容についてアウトプットの場として使用することにする.

インターネットの仕組みについて

ここでは主に,HTTP通信の仕組みについて記載している.

Details

Webページが表示されるまでのフロー

  1. URLを解読する
  2. キャッシュにIPアドレスがないか確認する
  3. DNSでIPアドレスを取得する
  4. IPアドレスでWebサーバーにリクエストする
  5. ポート番号を割り当てる
  6. HTTPリクエストを送信する
  7. ロードバランサーでアクセスを調整する
  8. HTTPレスポンスを送信する
  9. レンダリングする

以上のような流れでクライアント側でWebページが表示される.
ここからは詳細を見ていく

1. URLを解読する

URLは,以下のような形で構成される
https://railsdoc.com/rails_base
これらのそれぞれの意味は,プロトコル ドメイン名 パス名である.

2. キャッシュにIPアドレスがないか確認する

キャッシュとは,一時的にデータを保存しておく場所.メモリともいう.
IPアドレスとは,サバーの住所.
つまり,キャッシュ内に今からアクセスしたいIPアドレスがあればそこから引っ張ってこよう!ということ.

3. なかったら,DNSでIPアドレスを取得する

DNSとは,Domain Name Systemの略で,名前解決をしてくれるサーバーのこと.
https://railsdoc.com/rails_baseのようなURLを123.456.789.0のようなIPアドレスに紐づけているシステムのこと.

コンピュータは数値しか読み取ることしかできないが,人間は文字を読む方が理解しやすい.なので,それを対応付けしているところ.
ドメインというのは,人間が理解しやすいように作られたもので,実際のコンピュータはIPアドレスを介してやりとりしている.

4. IPアドレスでWebサーバーにリクエストする

ここではリクエストの詳細な説明を割愛して,6番目で説明する.

5. ポート番号を割り当てる

ポート番号とは,TCP/IP通信においてコンピュータが通信に使用するプログラムを識別するための番号.
ポート番号は16ビットの整数であり,0~65535番まである.
IPアドレスがあればネットワーク上のコンピュータを一意に識別することができるが,該当コンピュータのどのプログラムに通信パケットを届けるかは決定できない.
どのプログラムに通信パケットを渡すのかを決定するためにポート番号を使用する.

ポート番号には以下の3つの識別がある.

  • WELL KNOWN PORT NUMBERS(ウェルノウンポート番号): 0番~1023番
  • REGISTERED PORT NUMBERS(登録ポート番号): 1024番~49151番
  • DYNAMIC AND/OR PRIVATE PORTS(ダイナミック/プライベートポート番号): 49152番~65535番

6. HTTPリクエストを送信する

HTTPリクエストとは

クライアントがサーバに対してデータを送信し要求すること HTTPリクエストは以下のような形式になっている

curl -v google.com ↓

> GET / HTTP/2            # HTTPメソッド
> Host: google.com        # メッセージヘッダ
> user-agent: curl/7.77.0
> accept: */*
>                         # 空白行
  • リクエスト行
    • GET http://123.4.5.6/index.htmlのような形
    • HTTPメソッド
      • GET: 指定したターゲットをサーバから取り出す
      • HEAD: 指定したターゲットに関連するヘッダー情報を取り出す
      • POST: 指定したターゲット(プログラム)にデータを送る
      • PUT: サーバ内のファイルを書き込む
      • DELETE: サーバ内のファイルを削除する
      • CONNECT: プロキシサーバ経由で通信を行う
  • メッセージヘッダ
    • ヘッダフィールド
    • クライアントやサーバがHTTPリクエストやレスポンスで追加情報を渡すことができる
    • この中に認証方法やキャッシュ,クッキーなどが入る
  • 空白行
  • エンティティボディ
    • メッセージ本体が入る

7. ロードバランサーでアクセスを調整する

ロードバランサーとは,負荷分散装置と呼ばれ,通信を複数のサーバーに分散する仕組みを提供する装置.

8. HTTPレスポンスを送信する

HTTPレスポンスとは

クライアントから送信されたデータをサーバが処理をしてクライアントに返信する応答のこと  HTTPレスポンスは以下のような形式になっている

  • レスポンス行
    • ステータスコード
  • メッセージヘッダ
    • ヘッダフィールド
  • 空白行
  • エンティティボディ
    • メッセージ本体

9. レンダリングする

ここでは以下のように処理が進む.

  1. サーバーからHTMLファイルがクライアントに送られる
  2. クライアントがHTMLファイルをローディングする
    • HTMLファイルにCSSの記述があればもう一度サーバーからダウンロードする
  3. スクリプティングする
    • JavaScriptを読み込む
  4. レンダリングする

HTTTPとは

Webの基本プロトコルのこと!

  • webサーバとwebブラウザの間でweb情報をやりとりするためのプロトコル(通信規則)
  • 動作がとてもシンプル
    • クライアントが要求を出し,サーバーが応答を返す
    • 1つの要求に対しては1つの応答を返すルール
  • HTTP通信を受けるポート番号は80番ポート

Cookie(クッキー)

クッキーはWebサーバアプリケーションがWebブラウザに対して特定の情報を保持させておく仕組みのこと.
HTTPはステートレスな仕組みであるが,クッキーを使うことでステートフルに使用できる.

HTTPとHTTPSの違い

通信が暗号化されているかされていないか!

  • HTTPSはSSL/TLSプロトコルが作り出す安全な接続を使って通信を行う
  • ポート番号は443番ポート
  • SSLサーバ証明書が必要

クライアントマシンをサーバのように扱って通信を行える

プロキシサーバとは

プロキシサーバとは,代理のサーバのこと
クライアントとサーバの間にプロキシサーバを置くことで.通信内容のチェックを行い,外部からの不正アクセスや不正侵入を防止することができる.

HTTPステータスコードについて

HTTPステータスコードとは,レスポンス行で表示される3桁の番号のこと.
以下に代表的なHTTPステータスコードを示す.

  • HTTP 100番台(information)
    • 100 Continue: リクエスト継続可能
    • 101 Switching Protocol: プロトコルの切り替え
    • 102 Processing: 処理中
    • ...
  • HTTP 200番台(Success)
    • 200 OK: リクエストが正常に処理できた
    • 201 Created: リクエストが成功してリソースの作成が完了
    • ...
  • HTTP 300番台(Redirection)
    • 300 Multiple Choice: リクエストに対して複数のレスポンスがあることを示す
    • 301 Moved Permanently: 恒久的に移動する
    • ...
  • HTTP 400番台(Client Error)
    • 400 Bad Request: 一般的なクライアントエラー
    • 403 Forbidden: 閲覧権限がないファイルやフォルダ
    • 404 Not Found: Webページが見つからない
  • HTTP 500番台(Server Error)
    • 500 Internal Server Error: 何らかのサーバ内で起きたエラー
    • 501 Not Implemented: サーバーがリクエストに満たすのに必要な機能をサポートしていない


RESTについて

ここではRESTアーキテクチャについて記載している.

Details

RESTとは

シンプルなWebシステムの設計思想のこと

RESTにはRESTの4原則がある.これを満たすものをRESTfulなシステムと呼ぶ.

RESTの4原則

RESTの4原則は,HTTPを設計した中心人物のRoy Fielding氏が2000年に提唱したもので,以下の4つである.

  1. 統一インターフェース(Uniform Interface)
  2. アドレス可読性(Addressability)
  3. 接続性(Connectability)
  4. ステートレス性(Stateless) 以下に詳細を説明する.

1. 統一インターフェース

情報をやり取りする方法を統一する. あらかじめインターフェースを決めておくことで設計をシンプルにする.
Webの場合の例) GET, POST, PUT, DELETEのメソッド

2. アドレス可読性

それぞれの情報ごとに場所や名前を識別できるURIで実現する.
Webの場合は通常URLで与えられる.

3. 接続性

やり取りされる情報の中にハイパーリンクを含めることができる.
これにより,1つのリンクから別の情報に接続することができ,円滑に情報連携を行うことができる.

4. ステートレス性

サーバーが過去の状態を持たず,純粋にその都度受け取った内容だけでやり取りする.
前のやり取りの結果に影響を受けないため,シンプルな設計にできる.(セッション管理が不要など)

RESTアーキテクチャとは

  • RESTはWebのシステムを設計するときの考え方の一つ
  • RESTは,カリフォルニア大学の大学院生だったRoy Fieldingが2000年に修士論文で発表した
  • RESTは(Representational State Transfer)の略で,直訳すると「具体的な状態の転送」という意味
  • REST以外のアーキテクチャスタイルに,MVC, パイプ&フィルタ,イベントシステム,P2Pなどがある
  • RESTにおけるリソースは,Web上のURI(URL・URN)を持ったすべての情報のこと
  • RESTを構成する6つのアーキテクチャスタイル
    • クライアント/サーバ
      • ユーザインタフェースと処理を分離する
      • クライアントがリクエストをサーバに出して,サーバがクライアントにレスポンスを返す
      • 利点
        • クライアントのマルチプラットフォーム化ができる
        • サーバはストレージとしての機能だけを提供すれば良い
    • ステートレスサーバ
      • クライアントのアプリケーションの状態をサーバで管理しない
      • Cookieを使ったセッション管理などでステートフルにすることが可能
      • 利点
        • クライアントからのリクエストに応じた後すぐに計算機リソースを解放できる -> サーバ側の実装を簡略化できる
    • キャッシュ
      • 一度取得したリソースをクライアント側で使い回す
      • 利点
        • クライアントとサーバの通信回数と量を減らすことができる
    • 統一インターフェース
      • URIで示したリソースに対する操作を統一した限定的なインターフェースで行う
      • 利点
        • 全体のアーキテクチャがシンプルになる
        • クライアントとサーバ実装の独立性が向上する
        • システム全体が階層化しやすくなる
    • 階層化システム
      • システムを改装に分離する
      • HTTPで統一されていることによって...
        • サーバとクライアントの間にロードバランサを設置して負荷分散できる
        • プロキシを設置してアクセスを制限する
      • 利点
        • 分散化や冗長化が容易になる
        • 既存の接続の間に新しいコンポーネントを追加することが可能
    • コードオンデマンド
      • プログラムをクライアントにダウンロードして実行する
        • JavascriptやJavaアプレットなど
      • 利点
        • クライアントにない機能を後から追加できる
  • 「統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバ」(Uniform Layered Code on Demand Client Cache Stateless Server)略して「ULCODC$SS」と呼ぶ
  • わかりやすいようにRESTと名前をつけた

RESTful APIとは

RESTの原則に則って構築されたWebシステムのHTTPでの呼び出しインターフェースのこと

RESTful APIを使うメリット

  • URIに規律が生まれることで,APIの開発者が楽になる
  • ブラウザのアドレスバーにURIを入力すればリソースが参照できる
  • サーバ/クライアント間で何も共有しないので,負荷に応じたスケーラビリティが向上する(ステートレス)
  • HTTP標準メソッドを使うことでシンプルで一貫性のあるリクエスト標準化が円滑に行える(統一インターフェース)


Rrailsコマンドについて

ここでは,Railsで覚えておいた方が良いコマンドについて記載している

Details

コントローラーの作成,削除

コントローラーを作成
$ rails g controller Sample
コントローラーの作成を取り消し
$ rails destroy controller sample

モデルの作成,削除

モデルの作成
$ rails g model Sample
モデルの作成を取り消し
$ rails destroy model Sample

データベースのマイグレーション

マイグレーション
$ rails db:migrate
マイグレーションの取り消し
$ rails db:rollback


RailsのActive Recordについて

ここではRailsのモデルを表現するActive Recordについて記載している.

Details

Active Recordについて

Active RecordはORM(オブジェクト/リレーショナルマッピング)システムに記述されているActive Recordパターンを実装したもの

  • データベースとやりとりをするデフォルトのRailsライブラリ
  • データオブジェクトの作成/保存/検索のためのメソッドを持つ
  • SQLを意識する必要がない

RailsのORMを使った例:
SQLの場合

SELECT * FROM users;

railsの場合

users = User.all

以下がActive Recordパターンで実現できる

  • 一つのデータベースのテーブルと一つのクラスを対応づける
  • そのクラスのインスタンスをテーブルの一つのレコードに紐付ける

要するに,SQLを直接書くことなくオブジェクトのメソッドでDB操作(CRUD)ができるということ!

Active Recordの重要機能

  • モデルおよびモデル内のデータを表現する
  • モデル同士の関連付けを表現する
  • 関連づけられているモデルかんの継承階層を表現する
  • データをデータベースで永続化する前にバリデーションを行う
  • データベースをオブジェクト指向スタイルで操作する



マイグレーション

マイグレーションとは,マイグレーションファイルをもとにテーブル操作を行う仕組みのこと
マイグレーションファイルは,Rubyで書かれたテーブルの設計図のこと

DBの生成手順

  1. rails g modelでmodelファイルとmigrationファイルを作成
    • migrationファイル: DBに変更を加える内容を書く役割
    • modelファイル: DBとRailsのアプリケーションをつなぐ役割
      • モデルは全てApplicationRecordクラスを継承している
      • ApplicationRecordクラスはActiveRecord::Baseクラスを継承している
      • ActiveRecordクラスがSQL構文をRubyに翻訳する機能を持っている
  2. rails db:mifrateを実行する
    • migrationファイルを元にDBに変更を加える
    • ActiveRecordによって作成されたテーブルは以下のような特徴を持つ
      • テーブル名はmodelの複数形
      • id, created_atが自動で生成される



バリデーション

オブジェクトがDBに保存される前にそのデータが正しいかどうかを検証する仕組み
バリデーションを定義すると,以下のメソッドが動く前に必ず検証される.

  • save/save!
  • create/create!
  • update/update!

!をつけると保存されなかった場合(検証で失敗した場合)に例外処理を返す.つまり,falseやインスタンスが帰ってくるのではなく,エラー文が表示される.

以下によく使われるバリデーションヘルパーを示す

  • presence
    • 「空でないか」を検証する
    • validates :email, presence: true
    • validates_presence_of :nameでも同じ意味
  • uniqueness
    • 値が重複していないかを検証する
    • validates :email, uniqueness: true
    • validates_uniqueness_of :emailでも同じ意味
  • まだいっぱいあるけどこの辺りは実装していく中で覚えていく



コールバック

コールバックとは,オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのこと
コールバックを利用することでActive Recordオブジェクトがのイベント発生時に常に実行されるコードを書けるようになる.

イメージ的にはクラスのinitメソッドと同じようなもん,?

以下のようなコールバックが存在する

  • before_validation
    • create, updateの前に発生する
  • around_save
    • create, updateの前後に発生する
  • after_update
    • create, updateの後に発生する

ここのサイトがめっちゃ見やすい



関連付け

**2つのActive Recordモデル同士のつながりを指す

  • 主キー
    • データベースにおけるレコードを一意に識別するためのカラム
  • 外部キー
    • 他のテーブルとの関連付けに使うキー

関連付けの種類を以下に示す

  • belongs_to
    • 1方向1 : 1の関係
    • 宣言を行ったモデルの各インスタンスは,他方のモデルのインスタンスに「従属」する
    • 参照元テーブル → 参照先テーブル
    • 外部キー(foreign key)が生成される
  • has_one
    • 1方向1 : 1の関係
    • 相手側の1つのモデルが自身のモデルへの山椒を持っている
  • has_many
    • 1 : 多の関係
    • 多くの場合,belongs_toの反対側で使われる
  • has_many :through
    • 多 : 多の関係
    • ユーザーと商品とレビューの関係を例にする
      • item → reviews(1:多)
      • review → user(1:1), review → item(1:1)
      • user → reviews(1:多)
    • この時item→review→userのようなアクセスをしなくても,has_many throughでitemから直接userにアクセスできる
  • has_one :through
    • 1 : 1の関係
    • has_many :throughと同じような感じ
  • has_and_belongs_to_many
    • 多 : 多の関係
    • :throughを指定した時と異なり,仲介モデルが存在しない


RailsのAction Viewについて

ここではRailsのテンプレートを表現するAction Viewについて記載している.

Details

Action ViewのテンプレートはHTMLファイルにRubyを埋め込むERB(Embedded Ruby)を用いる.
Railsがレンダリングする最終的なHTMLはテンプレート,パーシャル,レイアウトの3つの要素から構成される.

テンプレート

  • ERB
    • <% %>タグや<%= %>タグの中にRubyのコードを書ける
  • Builder
    • ERBの代わりに利用できる,よりプログラミング向きな記法
  • Jbuilder
    • Railsチームによってメンテナンスされているgemの一つ
    • Gemfileにデフォルトで含まれる

パーシャル

パーシャルはレンダリング処理を扱いやすく分割する仕組み
パーシャルを使うことでビュー内のコードをいくつものファイルに分割して書き出し,他のテンプレートでも使いまわせるようになる

RailsのDRY原則に従うために有効的に使う!

  • 命名ルール
    • パーシャルをレンダリングするにはrenderメソッドを使う
      • <%= render "header" %>のように使う
      • パーシャルのファイル名の冒頭にはアンダースコア_をつける

レスポンスの作成

コントローラ側から見たHTTPレスポンスの作成方法は以下の3通り

  • render
    • 完全なレスポンスを作成してブラウザに送信する
  • redirect_to
    • HTTPリダイレクトステータスコードをブラウザに送信する
  • head
    • HTTPヘッダーのみのレスポンスを作成してブラウザに送信する

以下にそれぞれのレスポンスの詳細を記載していく

render

ほとんどの場合,アプリケーションがブラウザで表示するコンテンツのレンダリングにはコントローラのrenderメソッドが使われる

redirect_to

別のURLにリクエストを再送信するようブラウザに指示する

head

本文のないヘッダのみのレスポンスをブラウザに送信できる



Action Controllerについて

ここではReilsのコントローラを表現するAction Controllerについて記載している

Details

コントローラはモデルとビューの間を仲介する
RailsのコントローラはApplicatioinControllerを継承したクラス.
Application ControllerActionController::Baseを継承していて,便利なメソッドが多数定義されている.詳しくはここ参照.

パラメータ

コントローラのアクションでは,ユーザーから送信されたデータやその他のパラメータにアクセスすることになる.
パラメータには以下の2種類がある

  • クエリ文字列パラメータ
    • URLの一部として送信される
    • URLの?文字の後に追加される
  • POSTデータ
    • ユーザーが記入したHTMLフォームから受け取ることができる

いずれのパラメータもparamsという名前のハッシュでアクセスできる

Strong Parameters

Web上から受け付けたパラメータが本当に安全なデータかどうかを検証した上で取得するための仕組み.

  • なぜ必要なのか
    • 意図しないデータの登録・更新を防いでくれる

セッション

  • セッションとは,アクセスの開始から終了までの一連の通信のこと
  • Railsアプリケーションでは,ユーザごとにセッションを設定する
  • セッションはコントローラとビューのみで利用できる
  • サイトにアクセスしてから一定時間経過することで通信が終了し,これを「1セッション」としてカウントする
  • Railsでは以下のようにさまざまなストレージを選べる
    • ActionDispatch::Session::CookieStore : 全てをクライアント側に保存する
    • ActionDispatch::Session::CacheStore : データをRailsのキャッシュに保存する
    • ActionDispatch::Session::ActiveRecordStore Active Recordデータベースに保存する(gemが必要)
    • Railsで推奨されているのはデフォルトのCookieStore Railsでセッションを実装する方法として最も一般的なのは,cookiesを使う方法. 
  • cookies
    • ユーザーのブラウザに保存される小さなテキストデータ
    • あるページから別のページに移動した時にも破棄されない
    • ユーザーIDなどの情報を保存できる

セッションハイジャック

  • 攻撃者があるユーザーのセッションIDのコピーを手に入れてそのユーザーとしてログインする
  • この手順はセッションリプレイ攻撃と呼ばれる

セッション固定

  • 攻撃者が既にもっているセッションIDをユーザーに使わせるように仕向ける
  • 攻撃者がユーザーとセッションを共有する
  • ユーザーがログインする直前にセッションを必ず即座にリセットすることで対策可能
  • reset_sessionメソッドで可能

永続クッキー(permanent cookies)

  • 記憶トークン

    • 記憶ダイジェストによるトークン認証に使用する
    • パスワードとトークンの違い
      • パスワード: ユーザーが作成・管理
      • トークン: コンピュータが作成・管理
  • cookiesを盗み出す有名な方法

    • 管理の甘いネットワークを通過するネットワークパケットからパケットスニッファというソフトウェアで直接cookiesを取り出す
      • **TLS(Transport Layer Security)**を適用して保護する
    • データベースに保存されている記憶トークンを盗み出す
      • 記憶トークンをハッシュ値に変換して保存する
    • *クロスサイトスクリプティング(XSS)*を使う
      • Railsによって自動的に対策が行われる
    • ユーザーがログインしているパソコンやスマホを直接操作してアクセスを奪う
      • デジタル署名という暗号技術を使う

フィルタ

フィルタはコントローラにあるアクションが実行される前後に実行されるメソッド
モデルのバリデーションと似てる

  • before_action :~
    • アクションを実行する前に処理する
  • after_action :~
    • アクションを実行した後に処理する
  • around_action :~
    • アクションを実行する前後に処理する

HTTP認証

Railsには以下の3種類のHTTP認証機構が組み込まれている

  • BASIC認証
  • ダイジェスト認証
  • トークン認証

HTTP BASIC認証

認証スキームの一種で,主要なブラウザおよびHTTPクライアントでサポートされている

http_basic_authenticate_withメソッドを使うだけでこの認証メカニズムを利用できる

HTTPダイジェスト認証

BASIC認証よりも高度な認証システム

暗号化されていない平文パスワードをネットワークに送信しなくて済む
authenticate_or_request_with_http_digestメソッドを使うだけで利用できる

HTTPトークン認証

HTTPのAuthorizationヘッダー内でBearerトークンを利用可能にするスキーム

authenticate_or_request_with_http_tokenメソッドで利用できる



Railsの重要概念について

ここでは,Railsで用いられる重要そうな概念(主観)について記載している.

Details

DRY(Don't Repeat Yourself)

RubyにはDRYという原則がある.
重複してしまっている分はERBによって取り除く.

パーシャル(Partial)

パーシャルとは,ビュー画面を共通化するために用いられる.
ビュー内のコードを各機能に分割して書き出し,他のテンプレートでも使い回すことができる機能.

  • 使用方法
    • _header.html.erbのように先頭に_をつけたファイルを使う
    • <%= render 'layouts/header' %>のように呼び出す

Railsのルーティング

Railsでは,以下のような名前付きルーティングを使用するのが慣例

<a href="about_path">About</a>

<%= link_to "About", about_path %>

上のコードは意味的には同じであるが,Railsでは下のコードを用いる.
これを用いることで,about_pathabout_urlといった名前付きルーティングを使えるようになる.

Asset Pipeline

詳細についてはRailsガイドを参照.
RailsのAsset Pipelineはデフォルトでは,LESSとよく似たSass言語をサポートする.
以下の3つの主要な機能が理解の対象になる.

  • アセットディレクトリ
    静的ファイルを目的に分類する標準的な3つのディレクトリが使われている.
    • app/assets: 現在のアプリケーション固有のアセット
    • lib/assets: 開発チームによって作成されたライブラリ用アセット
    • vendor/assets: サードパーティのアセット
  • マニフェストファイル
    • Railsではアセットパイプラインの中で読み込み時間を減らすためにCSSやJSを連結している
    • マニフェストファイルを使うことで,アセットをフォのように1つのファイルにまとめるのかをRailsに指示することができる
    • 実際にアセットをまとめる処理を行うのはSprocketsというgem
  • プリプロセッサエンジン
    • 必要なアセットをディレクトリに配置してまとめた後,様々なプリプロセッサエンジンを実行して結合する

アセットパイプラインの最大のメリット

本番のアプリケーションで効率的になるように最適化されたアセットを自動的に生成できる!

  • アセットパイプラインが全てのスタイルシートを結合して1つのcssファイルにまとめる
  • それらのファイルに対して不要な空白やインデントを取り除く処理をする
  • ファイルを最小化する
    → 開発環境と本番環境のどちらにもベストな環境を提供できる

Sass

Sassはスタイルシートを記述するための言語で,CSSよりも多くの点が強化されている.
Sassは.scssという拡張子が採用される.  

Sassが提供する2つの重要な機能

統合テスト(Integration Test)

マイグレーション

  • データの定義をRubyで記述することができる
  • SQLのDDL(Data Definition Language)が必要ない
    • DDL: データ定義言語と呼ばれ,SQLの命令(CREATE, DROP, ALTER...)などのこと

モデルのレコードを.destroyしても削除されたオブジェクトはメモリ上にまだ残っている

検証(Validation)と有効性(Validity)

モデルのバリデーション機能はテスト駆動開発(TDD)の方が相性が良い 検証のよく使われるケースを以下に示す

  • 存在性(presence)
    • validates :(変数名), presence: true
  • 長さ(length)
    • validates :(変数名), length: { maximum: 50 }
  • フォーマット(format)
    • validates :(変数名), format: { with: (正規表現) }
  • 一意性(uniqueness)
  • 確認(confirmation)

データベースのインデックス

RailsのWebサイトでは,トラフィックが多い時に一意性の検証を行なっているのにも関わらず重複するレコードが作成されてしまうことがある.
このような問題に対してデータベース上のカラムにインデックスを追加し,そのインデックスが一意であるようにする.

  • 検索(find)したい時インデックスがないとそのデータを上から全探索する必要がある
  • このような方法を全表スキャンと呼ぶ
  • インデックスがあると効率的に検索可能になる

インデックスを追加するには,マイグレーションする必要がある.
rails g migrate ~でマイグレーションを作成する.

パスワードの設定

ユーザー認証を行うときに必須なのがパスワード.
ユーザーの認証は以下のように進む.

  1. パスワードの送信
  2. ハッシュ化
  3. データベース内のハッシュ化された値との比較

セキュアなパスワードの実装は簡単で,モデルクラス内でhas_secure_passwordを呼び出すだけで良い.   呼び出すと以下の機能が使えるようになる.

  • セキュアにハッシュ化したパスワードをデータベース内のpassword_diget属性に保存可能
  • 仮想的な属性(passwordpassword_confirmation)が使える
  • 存在性と値が一致するかのバリデーションも追加される
  • authenticateメソッドが使える(引数の文字列がパスワードと一致すればUserオブジェクトを返し,一致しなければfalseを返す)

ただし,has_secure_passwordを使えるようにするには,モデル内にpassword_digestという属性が含まれていなければならない
また,最先端のハッシュ関数であるbcryptライブラリが必要

認証システム

  • ログインの基本的な仕組み
    • ブラウザがログインしている状態を保持
    • ユーザーによってブラウザが閉じられたら状態を破棄する

このような制限や制御の仕組みを**認可モデル(Authorization Model)**という.

fixture(フィクスチャ)

  • テスト時に登録済みユーザーとしてログインしておく必要がある場合がある
  • データベースにそのためのユーザーが登録されていなければならない
  • Railsではこのようなテスト用のデータを**fixture(フィクスチャ)**で作成できる
  • fixtureを使ってテストに必要なデータをtestデータベースに読み込んでおくことができる
  • test/fixtures/~.ymlに記載する.erbも使える.

クラスメソッドとインスタンスメソッド

  • クラスメソッド: クラスオブジェクトから実行可能
    • def self.method_nameでクラスメソッドを定義
    • def method_nameでインスタンスメソッドを定義

ページネーション

メタプログラム

プログラムでプログラムを作成する
Rubyの極めて強力な機能.

_pathと_urlの違い

  • そもそも_pathと_urlとは

    • ヘルパーの一種
  • _path

    • 相対パス
    • redirect_to以外で使用する
    • link_toでよく使用される
  • _url

    • 絶対パス
    • redirect_toの時にセットで使用する

SQLインジェクション

  • 第三者がSQLコマンドを悪用してデータベースの情報へ不正にアクセスし,情報を搾取や改ざん,削除する攻撃手法

リファラー(referrer)

Active Strage

  • アプリケーションのデータベース

  • 以下の3つのテーブルを使う

    • active_storage_blobs
    • active_storage_variant_records
    • active_storage_attachments
  • Active Storage APIの中で知っておくべきもの

    • has_one_attachedメソッド
      • 指定のモデルとアップロードされたファイルを関連づけるのに使う
      • has_many_attachedメソッドもある

能動的関係(Active Relationship)と受動的関係(Passive Relationship)

外部キー(foreign_key)について

  • referencesとは,カラムに保存できる型の一つで,外部キー(foreign_key)を作成する際に使用する
  • 簡単に言うと,外部キーとは,主キーを参照するためのカラムのこと

hidden_field_tagについて

Turbo

Turbo Streamsと呼ばれる部分を介して動作する

N+1クエリ問題

  • 概要

    • N件のデータ行を持つテーブルを全部読み出す -> 1回
    • 別のテーブルから,上記のテーブルの各行に紐づくデータを読み出す -> 計N回
    • よって合計でN+1回のクエリを実行する必要がある
  • 解決策

    • eager loading: あらかじめデータを取得しておく


ネスト

  • スタイルシート内に共通なパターンがあるときは要素をネストできる

例)

.center {
  text-align: center;
}

.center h1 {
  margin-bottom: 10px;
}

/* 上記をSassを使って書き換える */
.center {
  text-align: center;
  h1 {
    margin-bottom: 10px;
  }
}
#logo {
  ...
}

#logo:hover {
  ...
}

/* 上記をScssを使って書き換える */
#logo {
  ...
  &:hover {
    ...
  }
}

変数

  • 冗長なコードを削除しより自由な表現を可能にするために定義できる
h2 {
  color: #777;
}
footer {
  color: #777;
}

このように同じカラーコードが出てくる場合などは冗長的であるため,変数を用いて以下のように書き直すことができる.

$light-gray: #777
h2 {
  color: $light-gray;
}
footer {
  color: $light-gray;
}

正規表現について

"達人に学ぶDB設計"を読んで

1章

現代のアプリ開発では,データ設計は最も重要であると言える
一昔前まではプロセス中心アプローチ(POA:Process Oriented Approach),つまりアプリの処理を中心に開発していくようにしていた.
現代の開発では,データ中心アプローチ(DOA:Data Oriented Approach),つまりデータ設計を中心に開発を進めていく手法.

3層スキーマモデル

以下の3つのスキーマが存在する

  • 外部スキーマ
    • ユーザーから見たデータベース
  • 概念スキーマ
    • 開発者から見たデータベース
  • 内部スキーマ
    • DBMSから見たデータベース

概念スキーマはデータ独立性を保証するために存在するためにある

2章

データベースの設計は論理設計物理設計と進む.

論理設計

概念スキーマを定義する設計を論理設計と呼ぶ
論理設計は以下のステップで進められる

  1. エンティティの抽出
  2. エンティティの定義
  3. 正規化
  4. ER図の作成

物理設計

物理設計は,論理設計の結果を受けて,データを格納するための物理的な領域や格納方法を決める工程 物理設計は以下のステップで進められる

  1. テーブル定義
  2. インデックスの定義
    • インデックスがなくてもDBは正常に動作する
    • インデックスはDBのパフォーマンスを良くするためにある
  3. ハードウェアのサイジング
    • データのサイズハードウェアの性能の2種類考える必要がある
  4. ストレージの冗長構成決定
    • 高い耐障害性を持つ必要がある
    • RAIDという技術が用いられる
  5. ファイルの物理配置決定

RAIDについて詳しく見る

Details

代表的なRAIDには以下のようなものがある

  • RAID 0(ストライピング)
    • データを複数のドライブに分散させて書き込む
    • 単純に1本のデータを複数のドライブに分散させるだけ
    • 1本でもドライブが壊れたら終わり
    • 冗長性なし!
  • RAID 1(ミラーリング)
    • 同じデータを2本のドライブに並列に書き込む
    • 単純に冗長性が2倍に上がる
  • RAID 5(パリティレイド)
    • RAID 0と同様にデータを複数のドライブに分散させて書き込む
    • RAID 0との違いはパリティデータ(誤り訂正補正)も同時に書き込む
    • 1本のドライブに障害が発生しても復元可能
    • 同時に2本の障害が起こった場合は修復不可
  • RAID 10(1+0)
    • RAID 0とRAID 1の良いとこ取り
    • 余裕があればこれが一番良い
    • 必要なドライブの本数が多いためお金がかかる

バックアップ設計

バックアップには以下のような方式がある

  • フルバックアップ
    • 保存するデータ全てバックアップする方式
    • バックアップに時間がかかる
  • 差分バックアップ
    • フルバックアップからの差分データをバックアップする方式
  • 増分バックアップ
    • 前回のバックアップからの差分データのみをバックアップする方式

一般的に使われるバックアップ方式は,

  • フルバックアップ + 差分バックアップ
  • フルバックアップ + 増分バックアップ

リカバリ設計

リカバリ設計はバックアップ設計とセットで実施されるもの
リストアとリカバリ

  • リストア
    • バックアップファイルに戻す作業
  • リカバリ
    • トランザクションログを適用して変更分を反映する作業

3章

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors