Rails勉強会@東京第31回に参加してきた.

先月は 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