25
初初初初 Gem 初初初初 2013/07/25 Web team MTG baba@BPS

初めてのGemの読み方

Embed Size (px)

Citation preview

Page 1: 初めてのGemの読み方

初めての Gem の読み方

2013/07/25 Web team MTG

baba@BPS

Page 2: 初めてのGemの読み方

本資料について 本資料は、社内勉強会の補助資料です

外部向けに書かれていない記述などがあります 資料だけですべて伝わるような配慮はされていません

本資料の取り扱いについて 再配布等のご相談は [email protected] までお願いしま

す。

Page 3: 初めてのGemの読み方

Gem とは何か Ruby のライブラリ 実体は単なる tar.gz ファイル rubygems.org

Page 4: 初めてのGemの読み方

なぜ Gem を読むのか 自分で安全を確認できる

Gem は無保証 詳しい挙動を把握できる

一風変わったことを実現できるか調べたい ドキュメントは完璧ではない

トラブル解決できる ブラックボックスに振り回されることがなくなる

勉強になる 知的好奇心 OSS は高品質なコードが多い

Page 5: 初めてのGemの読み方

なぜ Gem を読むのか レベル 0

Gem を使えない レベル 1

解説サイトをコピペしながら基本的な機能を使える レベル 2

README やリファレンスを読んでほとんどの機能を使える レベル 3

困ったときはソースを読んでトラブル解決できる レベル 4

Gem のバグを見つけたら pull request を送ってあげられる レベル 5

積極的な Gem の開発やメンテナンスをできる

Page 6: 初めてのGemの読み方

読む前に

Page 7: 初めてのGemの読み方

Gem のディレクトリ Gem::RUBYGEMS_DIR /home/baba/.rbenv/versions/2.0.0-p247/lib/

ruby/gems/2.0.0

Page 8: 初めてのGemの読み方

Gem のフォルダ構成 例 :mygem

Gemfile mygem.gemspec README lib

mygem.rb mygem

foo.rb bar.rb

spec …

Page 9: 初めてのGemの読み方

Ruby のおさらい オープンクラス require

Page 10: 初めてのGemの読み方

読んでみよう

Page 11: 初めてのGemの読み方

読んでみよう 入門

settingslogic activesupport (core_ext)

初級 capistrano kaminari

中級 paperclip rspec

上級 devise Rails

Page 12: 初めてのGemの読み方

読み方 何となく眺める デバッガで追いかける テストコードから読む

Page 13: 初めてのGemの読み方

active_support 4.0.0core_ext nil.blank?

true ‘’.present?

false 10.minutes

600 seconds 10.minutes.class # => Fixnum

ヒント: BasicObject

Page 14: 初めてのGemの読み方

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

Page 15: 初めてのGemの読み方

kaminari 0.14.1 User.where(…).page(7).per(30)

<%= paginate @users %>

Page 16: 初めてのGemの読み方

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

Page 17: 初めてのGemの読み方

devise 3.0.0 before_filter :authenticate_user! current_user devise_for :users

Page 18: 初めてのGemの読み方

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!

Page 19: 初めてのGemの読み方

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

Page 20: 初めてのGemの読み方

warden 1.2.3 warden/manager.rb

process_unauthenticated call_failure_app

warden/proxy.rb

Page 21: 初めてのGemの読み方

終わりに

Page 22: 初めてのGemの読み方

速く読むコツ 基本を押さえる

Ruby の文法をいちいち調べてたら遅い あたりをつける

1 機能に絞って掘り下げてみる 関係ない細かいところは読み飛ばす

ツールを活用する デバッガとか、良いエディタとか おすすめあれば教えて

コミットログを見る 自分で Gem を作る

Page 23: 初めてのGemの読み方

discussion

Page 24: 初めてのGemの読み方

「お客様」からの脱却 これだけじゃだめ

サンプルコードのコピペ 日本語で検索 英語で検索 ドキュメントを調べる

「この Gem が意味不明で 1 日はまった」 ソース読めよ  ( / _ ・ ) /

「この Gem にはバグがある」 直せよ  ( / _ ・ ) /

Page 25: 初めてのGemの読み方

「お客様」からの脱却 内部を理解しろというのは老害?

これは「内部を知らなくても良い」という意味?