先月は RubyKaigi 会場での開催となったので,2ヶ月ぶりの開催です.主催の皆さまありがとうございます.
そしてまとめログを.
##時間割
- 13:30~14:45 前半セッション
- named_scope 詳しく
- Redmineの半歩先
- Scaffoldの半歩先
- 15:00~16:15 後半セッション
- Rails2.2 i18n
- iKnowを詳しく
- 16:30~17:00 LT
- 17:00~18:00 ふりかえり
====
##前半セッション:named_scope についてくわしく
- named_scope
- Rails 2.1 からの新機能.
- 検索集合に対して名前をつける.
- Method Chain で賢く Query が吐かれる.
- なにができるのか
- ORM によって,SQL/RDBMS は単なるデータストレージぽくなった.
- そこに,named_scope が ORM に集合演算の概念を再度持ち込んでくれた.
- 実際には
- :conditions を指定した絞り込み
- 引数を渡すこともできる
- method chain で適切な SQL を生成してくれる
- 集合に対する演算も適宜できる
- User.active.ban で active users を全て deleted = true にできる
named_scope :actione,
:conditions => ["#{table_name}.deleted = ?", false] do
def ban
self.update_all("deleted = true")
end
end
- ActiveRecord::Base に追加される method
- self.scopes() <- proxy ぽいものを返す
- self named_scope() <- これを使う
- Scope を作る Proc を作ってクラス変数に代入.
- named_scope の name を define_method する
- Scopne.new(parent, options, &block)
- parent : 親スコープ
- 左側にあるスコープ
- method_missing
- 自スコープに method がなければ,「親スコープ」の method_missing を呼び出す
- これで method_chain ができてる?
FAQ とか質疑応答とか
- limit / order / join は?
- 最初に(一番左)にあるものだけ.あとは上書きされずに無視される.
- join はバグっぽいどうさをするらしい.
- 結合は?
- 論理積
- 実行順序は?
- 最後から積演算されていく.
- UPDATE 文が実行されるときには,ActiveRecord::Base.connection.update が呼ばれる
- ここを見張っていればチューニングできるかも?
- Ruby 1.9 だと Proc に default 引数を書ける
- lambda が -> 演算子になる.詳しくはリファレンスマニュアルを見よう.
- max / sum などは?
- 順序にさえ気をつければ大丈夫なはず.
- default で User.active.find(…) なんてことは?
- うまい方法は見つかってない.
後半セッション:iKnow
RubyKaigi 2008 の振り返る+α
- rails 2.0, MRI 1.8.6, MySQL 5.0, Mongrel, Nginx, Ubuntu
- 同時ファイルアクセス数の制限があるから,それも注意
- 比較的 Version Up している.
- 600_000 / day PV
- 82 controllers
- 144 models
- 1078 views
- 474 migrations
- 最初は VPS で実装
- Master DB のみ実サーバに
- 今は
- LVS で load balancing
- NFS で static contents を配信
- 集計用 slave DB も用意
- SQL によっては tmp file 作るので,速いディスクが必要.
- Core 数を増やした.
- 処理速度向上のため.
- 最後は DB sharding
- DataFabric で自動 sharding
- count/size/length
- 通常は size
- each 前だと length
- 外部サービスを使う場合は,timeout を意識する
- ユーザ毎のディレクトリなど作る場合は,FileSystem によっては作れない場合がある.
- ext3 は 32000 弱で制限,xfs は大丈夫
###今回のお話
- 複数のRails Application を同じデータベース上に展開したい.
- migration と test をどうしよう
- 複数データベースを使った方法
- OO 的に if を多様するには論外
- View 内の if を削減したい
- template engine : Amrita
- API 用のデータ出力の際に,そのフォーマットをどこで指定するべきか.
- model の中に押し込めて,to_xml/to_json か,View を作るかどうか
- Logging
- ProcessID をログに吐かないと調べにくいことがある
- Supporting Mobile
- SQL
- Sub-query で index 付き SELECT をした方が速い場合がある.
select id, name, created_at from users order by id desc limit 10;
select id, name, (select created_at from users where users.id = id) from users order by id desc limit 10;
- Dependencies.clear
- development はファイルがアップデートされると依存関係を clear して再読込するが,production はしない.
- Class の autoload の規約と実装方法を調べる必要あり?
- Fixture hell?
- Fixture が巨大になりすぎる.
- fixtures :all
- 全ての fixture を load する
- PageView などは MERGE Engine を使ってる
- 時間を指定した fixture
- fixture を laod するときはテストそのものの時間がかかると,テストに失敗する場合がある.
- Timw.now に基底時間を作っておく
- Fair Proxy Balancer
- どれが1つでも時間がかかっていれば,そこにアクセスするユーザは待たされてしまう.これを buzy かどうかを判定して,4 を b に割り振るなどしたい.
a (1 s)
b (0.5 s)
c (0.5 s)
1 a
2 b
3 c
4 waits for a
5 b
6 c
7 waits for a
8 b
9 c
10 waits for a
- Plugins
- 日本語のローカライズ
- GetText が多い
- Globalize
- RedCloth
- White List
- 許可できる html などを指定できる.
- constatnt_cache
- asset_packager
###質疑応答
- ビジネスモデルは?
- 広告モデル
- コンテンツ作成費は?
- 今後は CGM に.
- xaky++
##LT
- RSpec で出力の色を変えるには
- Saikuro & Kwala
- Cyclomatic Complexity
- Complexity を見てボトルネックを調べられるかも?
- Kwala
- コピペコードが見れる!
- jpmobile
- module 化した
- あとから include した方が便利
- Tokyu.rb 活動報告
- Asakusa.rb 紹介
- ko1にrailsを教える活動
- rails + ruby1.9でバグ報告しよう
##ふりかえりなど
- Rails 2.2 i18n
- 日本語化の機構は結構動く
- english も単なる1言語になる
##KPTはWikiを
- RailsMeetingTokyo タグではてブする
##まとめなど 参加人数が過去最大の60人弱.まだ3回目ですが,いままでよりも確かに多かったなぁと思います.セッションもiKnowのZevさんの話とか聞けて結構有意義でした.
あと毎度思うのが,懇親会が内輪の飲み会になってそうな感じがするところ.何となく行きづらい雰囲気がありました.その点 GREE のは参加している人も懇親会前提っぽいので,そう言う雰囲気作りも重要かなと思いました.Tokyu.rbではそう言うことがないようにしないとなと思いました.
comments powered by Disqus