RubyKaigi 2014 の 3日目まとめ
おはよう Rails
// とりとめもなく、気になったワードだけピックアップしておく
- ECのパッケージを使う場合に比べて、Railsフレームワークの知見(デプロイ、テスト、etc)を活用できたのは嬉しい
-
rake setup
で ミドルウェアのセットアップ等含めて実施してくれる - Rails new してちょっと準備したら gem が 100個くらい入るじゃないですか
- padorino 使ってると辛い
- Railsじゃなくても動くべきじゃん!というgemがRails実装に依存してたりして...
- Railsを選ばないと辛い
- padorino 使ってると辛い
- gemを手直ししたい
- pull-req出す or monkey patch どっち?
- private repo に fork して、パッチ宛てて、private gem serverにupしてる
- gemを入れるのに抵抗がある
- vs. gem入れないと世界規模でコピペしてる感じで嫌だ
- 消し忘れたgemがGemfileに残ってる
- 未使用のgemを検出するgemとか欲しい
- cron辛い
Speeding up Rails 4.2
- Aaron
- たこ焼き仮面
- RedHat
- ManageIQ .. 仮想マシン管理ツール
- Rails Contributors (コミット数 No.1)
Rack
- もう終わり
- Rackは楽じゃない
- the_metal 作った。うまくいけば Rack2.0 になる
- 今のRackの問題
- env .. どこでもだれでも変更できる (== グローバル変数)
- ストリーミングめんどい
- the_metal のアプローチ
-
call(req, res)
.. req と res はIOのようなインタフェースを持つ - tenderlove/the_metal
-
Rails4.2 speed up
- Adequate Record
- ActiveRecord の速度を2倍にする
- benchmark/ips というgem使ってる
- Blackbox Testing に使ってる
- Routes と link_to には関係がある?
- 要素数に相関は無いが、パラメータ数には正の相関がある
- Routes と link_to には関係がある?
-
GC.stat()
- allocation_tracer も便利(ブロック内で確保されたobjectを確認したりできる)
- リクエスト処理内部で一時的に作られるオブジェクトを減らした話
- String -> Buffer -> String と変換していたのを、中間のBufferを無くした
- 呼び出し側がルールを守るならば、呼び出される側をシンプルにできる
- 呼び出す側が nil を渡さないなら nil チェックを省略できる
- 呼び出す側が常にStringを渡すなら
.to_s
を省略できる
まとめ
- 一番早いコードは存在しないコード
- メソッドが扱うオブジェクト種別を限定すれば、コードはシンプルになる。シンプルなコードは早くなる。
- 計測すること measure, measure, measure
- Rails4.2 は今までで一番早いRailsになる
Practical Metaprogramming in Application
- moro
- はじめる! cucumber
- 永和システムマネジメント
- idobata
ゴール
- メタプログラミング怖くないよー
- メタプログラミング使いすぎるとメタメタになっちゃうよー
メタプログラミング
- コード実行時に言語構成要素を動的に生成する
- Rubyの言語構成要素
- class /module
- object
- method
- proc
class Book
def title
@title
end
def title=(t)
@title = t
end
end
# --
class Book
attr_accessor :title
end
- これもメタプログラミング
Pitfail
- 使いすぎるとよくわからんなる (読みにくい、メンテしにくい)
実際のアプリケーション開発でどうやって活かすか
- 問題領域を一段メタなところに広げて、コードをシンプルに書くことを考えると、ちょうど良い
- AR の
has_many :reviews
-
reviews
を取ってきて配列を返す... のではなく、 Association Object を返すだけ -
Book#reviews.build
みたいなのは Association Object が面倒みてる - 直接親子関係を返すのではなく、その関係性を表現するオブジェクトを用意する
- 関係性を表現する部分ではなるべくメタプログラミングを使わない
- ユーザが使いたい/使わせたいインタフェースに繋ぎこむところだけメタプログラミングを使って。
-
Case: Post / Comment / Photo
Everything is Broken: A Story of Hope
- http://rubykaigi.org/2014/presentation/S-JonanScheffler
- Jonan Scheffler
- New Relic の中の人
- OREGON から。すげえ日本語上手い
- Diffie-Hellman の説明を、色の混ぜあわせを使って説明してた
Fluentd Hacking Guide
- sonotsさん
- vimプレゼンテーション
- これは後でビデオ見るほうが分かりやすいかも
- 或いはコード読むべし