Upload
takao-baba
View
3.723
Download
6
Embed Size (px)
Citation preview
初めての Gem の読み方
2013/07/25 Web team MTG
baba@BPS
本資料について 本資料は、社内勉強会の補助資料です
外部向けに書かれていない記述などがあります 資料だけですべて伝わるような配慮はされていません
本資料の取り扱いについて 再配布等のご相談は [email protected] までお願いしま
す。
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.0core_ext nil.blank?
true ‘’.present?
false 10.minutes
600 seconds 10.minutes.class # => Fixnum
ヒント: BasicObject
active_support 4.0.0core_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!
rackclass 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 にはバグがある」 直せよ ( / _ ・ ) /
「お客様」からの脱却 内部を理解しろというのは老害?
これは「内部を知らなくても良い」という意味?