はじめに v |
1章 基本的な手法 1 |
1.1 メタプログラミングとは何か 1 |
1.1.1 DRY 2 |
1.1.2 注意 3 |
1.1.3 ボトムアッププログラミング 3 |
1.2 Rubyの基礎 4 |
1.2.1 クラスとモジュール 4 |
1.2.2 メソッド参照 5 |
1.2.3 Metaid 18 |
1.2.4 変数の参照 19 |
1.2.5 ブロック、メソッド、Proc 21 |
1.3 メタプログラミング手法 24 |
1.3.1 メソッド参照の先送り 24 |
1.3.2 ジェネレーティブプログラミング:リアルタイムでのコードの記述 25 |
1.3.3 継続 27 |
1.3.4 バインディング 28 |
1.3.5 内省とObjectSpace:データとメソッドの実行時の調査 29 |
1.3.6 プロキシクラスによる委譲 31 |
1.3.7 モンキーパッチ 33 |
1.3.8 既存のメソッドへの機能の追加 33 |
1.3.9 モジュール化 36 |
1.4 関数型プログラミング 37 |
1.4.1 高階関数 38 |
1.4.2 Enumerable 38 |
1.4.3 Enumerator 41 |
1.5 例 43 |
1.5.1 実行時の機能の変更 43 |
1.5.2 Railsのルーティングコード 45 |
1.6 参考文献 47 |
2章 ActiveSupportとRailTies 49 |
2.1 Rubyで見逃しているもの 49 |
2.2 コードの読み方 52 |
2.2.1 コードを特定する方法 53 |
2.2.2 コールスタックを読む 54 |
2.2.3 RubyとRailsのデバッグ 56 |
2.2.4 出発点 60 |
2.2.5 テストを読む 60 |
2.2.6 最新情報の取得 61 |
2.3 ActiveSupport 61 |
2.4 コア拡張 65 |
2.5 RailTies 82 |
2.5.1 Railsのコンフィグレーション 82 |
2.5.2 アプリケーションを初期化するための20の手順 82 |
2.5.3 リクエストのディスパッチ 85 |
2.6 参考文献 85 |
3章 Railsプラグイン 87 |
3.1 プラグインの概要 87 |
3.1.1 プラグインのロード 87 |
3.1.2 Railsプラグインのインストール 88 |
3.2 プラグインの作成 91 |
3.3 プラグインの例 94 |
3.3.1 account_locationプラグイン 94 |
3.3.2 ssl_requirementプラグイン 96 |
3.3.3 http_authenticationプラグイン 97 |
3.4 プラグインのテスト 99 |
3.4.1 プラグインデータベースの依存関係のテスト 103 |
3.5 参考文献 104 |
4章 データベース 105 |
4.1 データベース管理システム 105 |
4.1.1 PostgreSQL 106 |
4.1.2 MySQL 106 |
4.1.3 SQLite 108 |
4.1.4 Microsoft SQL Server 109 |
4.1.5 Oracle 109 |
4.2 LOB 110 |
4.2.1 データベースストレージ 110 |
4.2.2 ファイルシステムストレージ 112 |
4.2.3 X-Sendfileによるデータ送信 114 |
4.2.4 静的ファイルの処理 116 |
4.2.5 Railsでのアップロードの管理 116 |
4.3 高度なデータベース機能 118 |
4.3.1 アプリケーションデータベースと統合データベース 119 |
4.3.2 制約 119 |
4.3.3 複合キー 121 |
4.3.4 トリガ、ルール、ストアドプロシージャ 123 |
4.3.5 例 124 |
4.4 複数のデータベースへの接続 125 |
4.4.1 Magic Multi-Connections 127 |
4.5 キャッシュ 128 |
4.6 負荷分散と高可用性 129 |
4.6.1 MySQL 130 |
4.6.2 PostgreSQL 132 |
4.6.3 Oracle 133 |
4.6.4 Microsoft SQL Server 133 |
4.7 LDAP 134 |
4.7.1 ActiveLDAP 134 |
4.7.2 LDAPによる認証 134 |
4.8 参考文献 135 |
5章 セキュリティ 137 |
5.1 アプリケーションの問題 137 |
5.1.1 認証 137 |
5.1.2 クライアントを信用しない 140 |
5.1.3 安全なフォールバック 145 |
5.1.4 隠すことによるセキュリティ 146 |
5.1.5 エラーメッセージの保護 146 |
5.1.6 ブラックリストではなくホワイトリスト 147 |
5.2 Webの問題 148 |
5.2.1 Railsセッション 148 |
5.2.2 クロスサイトスクリプティング 150 |
5.2.3 クロスサイトリクエストフォージェリ 152 |
5.2.4 正規化 154 |
5.3 SQLインジェクション 155 |
5.4 Rubyの環境 156 |
5.4.1 シェルの使用 156 |
5.4.2 オブジェクトの汚染 157 |
5.5 参考文献 157 |
6章 パフォーマンス 159 |
6.1 計測ツール 160 |
6.1.1 ブラックボックス解析 160 |
6.1.2 コードの計測 163 |
6.1.3 Rails Analyzer Tools 164 |
6.2 Railsの最適化の例 167 |
6.2.1 アクションのプロファイリング 167 |
6.2.2 最適化と再プロファイリング 169 |
6.2.3 ベンチマーク 173 |
6.3 ActiveRecordのパフォーマンス 178 |
6.3.1 SQLへの急降下 178 |
6.3.2 1+N問題 178 |
6.3.3 インデックス 180 |
6.3.4 データベースのパフォーマンスの計測 184 |
6.4 アーキテクチャのスケーラビリティ 186 |
6.4.1 セッション 187 |
6.4.2 キャッシュ 189 |
6.5 その他のシステム 195 |
6.5.1 正しいツールの選択 195 |
6.5.2 ActionMailer 196 |
6.6 参考文献 197 |
7章 REST、リソース、Webサービス 199 |
7.1 RESTとは何か 199 |
7.1.1 動詞 201 |
7.1.2 リソース 204 |
7.1.3 表現とコンテンツタイプ 207 |
7.1.4 ステートレス性 209 |
7.2 RESTfulアーキテクチャの利点 220 |
7.2.1 概念的な単純さ 220 |
7.2.2 キャッシュとスケーラビリティ 221 |
7.2.3 変更への堅牢性 223 |
7.2.4 統一性 223 |
7.3 RESTful Rails 224 |
7.3.1 RESTfulルーティング 224 |
7.3.2 リソースベースの名前付きルート 225 |
7.3.3 ActionViewサポート 231 |
7.3.4 コンテンツタイプ 232 |
7.3.5 HTTPキャッシュ 234 |
7.3.6 HTTPレスポンスステータスコード 237 |
7.3.7 ActiveResource:RESTfulサービスの利用 238 |
7.3.8 Action Web Service 246 |
7.4 ケーススタディ:Amazon S3 247 |
7.4.1 概念と用語 247 |
7.4.2 認証 248 |
7.4.3 アーキテクチャと操作 249 |
7.4.4 S3クライアントとS3サーバー 250 |
7.5 参考文献 251 |
8章 i18nとL10n 253 |
8.1 ロケール 253 |
8.2 文字エンコーディング 254 |
8.2.1 ASCII 254 |
8.3 Unicode 255 |
8.3.1 UTF 256 |
8.4 RailsとUnicode 257 |
8.4.1 Ruby 1.9の多言語化 258 |
8.4.2 ActiveSupport::Multibyte 258 |
8.4.3 Unicodeの正規化 259 |
8.4.4 UTF-8入力のフィルタリング 261 |
8.4.5 UTF-8の格納 262 |
8.4.6 UTF-8の処理 264 |
8.4.7 文字セットの変換 265 |
8.5 RailsのL10n 267 |
8.5.1 インターフェイスとリソースの翻訳 267 |
8.5.2 ロケール固有の設定 273 |
8.5.3 モデル翻訳 274 |
8.5.4 Globalizeの例:アドレス帳 276 |
8.6 参考文献 286 |
9章 Railsの統合と拡張 289 |
9.1 Railsコンポーネントの置換 289 |
9.1.1 ActiveRecordの置換 289 |
9.1.2 他のテンプレートエンジン 300 |
9.2 Railsコンポーネントの統合 303 |
9.2.1 ActiveRecord 303 |
9.2.2 ActionMailer 306 |
9.3 Railsへの貢献 309 |
9.3.1 パッチの提供 310 |
9.3.2 Railsの単体テスト 312 |
9.4 参考文献 314 |
10章 大規模なプロジェクト 315 |
10.1 バージョン管理 315 |
10.1.1 一元型バージョン管理 315 |
10.1.2 分散型バージョン管理 318 |
10.1.3 ブランチとマージ 320 |
10.1.4 データベースのマイグレーション 325 |
10.2 Issue Tracking 327 |
10.3 プロジェクトの構造 328 |
10.3.1 Subversionのコンフィグレーション 328 |
10.3.2 Subversionの外部定義とPiston 329 |
10.3.3 Railsバージョン 330 |
10.3.4 環境の初期化 331 |
10.3.5 gemのインクルード 331 |
10.3.6 マルチアプリケーションプロジェクト 332 |
10.4 Railsの導入 334 |
10.4.1 何も共有しないことによるスケーラビリティ 335 |
10.4.2 フロントエンドWebサーバー 336 |
10.4.3 アプリケーションサーバー 338 |
10.4.4 Capistrano 340 |
10.4.5 Vlad the Deployer 340 |
10.4.6 継続的な統合 341 |
10.5 参考文献 342 |
付録A Rails 2.1におけるプラグイン環境の変化 343 |
A.1 Gitリポジトリからのプラグインのインストール 343 |
A.1.1 script/pluginコマンドによるインストール 343 |
A.1.2 gitコマンドによるインストール 344 |
A.1.3 アーカイブファイルからのインストール 344 |
A.2 RubyGemsによるプラグインのインストール 344 |
A.3 本書で紹介されているプラグインのGitリポジトリ一覧 345 |
索引 347 |