初めてのGemの読み方
2013/07/25 Web team MTG
baba@BPS
本資料について
 本資料は、社内勉強会の補助資料です
 外部向けに書かれていない記述などがあります
 資料だけですべて伝わるような配慮はされていません
 本資料の取り扱いについて
 再配布等のご相談は baba@bpsinc.jp までお願いします。
Gemとは何か
 Rubyのライブラリ
 実体は単なるtar.gzファイル
 rubygems.org
なぜGemを読むのか
 自分で安全を確認できる
 Gemは無保証
 詳しい挙動を把握できる
 一風変わったことを実現できるか調べたい
 ドキュメントは完璧ではない
 トラブル解決できる
 ブラックボックスに振り回されることがなくなる
 勉強になる
 知的好奇心
 OSSは高品質なコードが多い
なぜGemを読むのか
 レベル0
 Gemを使えない
 レベル1
 解説サイトをコピペしながら基本的な機能を使える
 レベル2
 READMEやリファレンスを読んでほとんどの機能を使え
る
 レベル3
 困ったときはソースを読んでトラブル解決できる
 レベル4
 Gemのバグを見つけたらpull requestを送ってあげられる
 レベル5
 積極的なGemの開発やメンテナンスをできる
読む前に
Gemのディレクトリ
 Gem::RUBYGEMS_DIR
 /home/baba/.rbenv/versions/2.0.0-
p247/lib/ruby/gems/2.0.0
Gemのフォルダ構成
 例:mygem
 Gemfile
 mygem.gemspec
 README
 lib
 mygem.rb
 mygem
 foo.rb
 bar.rb
 spec
 …
Rubyのおさらい
 オープンクラス
 require
読んでみよう
読んでみよう
 入門
 settingslogic
 activesupport (core_ext)
 初級
 capistrano
 kaminari
 中級
 paperclip
 rspec
 上級
 devise
 Rails
読み方
 何となく眺める
 デバッガで追いかける
 テストコードから読む
active_support 4.0.0
core_ext
 nil.blank?
 true
 ‘’.present?
 false
 10.minutes
 600 seconds
 10.minutes.class # => Fixnum
 ヒント:BasicObject
active_support 4.0.0
core_ext
 active_support.rb
 active_support/core_ext.rb
 active_support/core_ext/numeric.rb
 active_support/core_ext/numeric/time.rb
 active_support/core_ext/object.rb
 active_support/core_ext/object/blank.rb
 active_support/core_ext/object/try.rb
 active_support/proxy_object
 active_support/duration.rb
kaminari 0.14.1
 User.where(…).page(7).per(30)
 <%= paginate @users %>
kaminari 0.14.1
 kaminari.rb
 kaminari/railtie.rb
 kaminari/hooks.rb
 kaminari/models/active_record_extension.rb
 kaminari/models/active_record_model_extension
.rb
 kaminari/models/active_record_relation_methods
.rb
 kaminari/models/page_scope_methods.rb
 kaminari/helpers/action_view_extensio.rb
devise 3.0.0
 before_filter :authenticate_user!
 current_user
 devise_for :users
devise 3.0.0
 devise.rb
 devise/rails.rb
 devise/controllers/helpers.rb
 def authenticate_#{mapping}
 warden.authenticate!(opts)
 def current_#{mapping}
 @current_#{mapping} ||= warden.authenticate(:scope =>
#{mapping})
 devise/rails/routes.rb
 devise_for
 devise_session, devise_password, …
 devise/mapping.rb
 devise/failure_app.rb
 store_location!
rack
class MyApp
def call(env)
[200, {‘Content-Type’=>’text/plain’}, [‘Hello’]]
end
end
class MyMiddleware
def initialize(app)
@app = app
end
def call(env)
status, header, body = @app.call(env)
body += ‘, world’
[status, header, body]
end
end
warden 1.2.3
 warden/manager.rb
 process_unauthenticated
 call_failure_app
 warden/proxy.rb
終わりに
速く読むコツ
 基本を押さえる
 Rubyの文法をいちいち調べてたら遅い
 あたりをつける
 1機能に絞って掘り下げてみる
 関係ない細かいところは読み飛ばす
 ツールを活用する
 デバッガとか、良いエディタとか
 おすすめあれば教えて
 コミットログを見る
 自分でGemを作る
discussion
「お客様」からの脱却
 これだけじゃだめ
 サンプルコードのコピペ
 日本語で検索
 英語で検索
 ドキュメントを調べる
 「このGemが意味不明で1日はまった」
 ソース読めよ (/_・)/
 「このGemにはバグがある」
 直せよ (/_・)/
「お客様」からの脱却
 内部を理解しろというのは老害?
 これは「内部を知らなくても良い」という意味?

初めてのGemの読み方