Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rubyで書かれた ソースコードを読む技術 in kaigi on rails/technic-of-reading-source-code-written-in-ruby-for-kaigi-on-rails-2020

5897c223d847277d418b1635250bfcd2?s=47 fukajun
October 03, 2020
5.1k

Rubyで書かれた ソースコードを読む技術 in kaigi on rails/technic-of-reading-source-code-written-in-ruby-for-kaigi-on-rails-2020

5897c223d847277d418b1635250bfcd2?s=128

fukajun

October 03, 2020
Tweet

Transcript

  1. Rubyで書かれた ソースコードを読む技術 2020-10-03 Kaigi on Rails fukajun

  2. 今日話すこと

  3. 今日話すこと Rubyで書かれたソースコード読んでいて 困ったときにぼくがやっていること

  4. 自己紹介

  5. 自己紹介 - @fukajun - 株式会社ロコガイドで働くサーバーサイドエンジニア - データ基盤、インフラ周りを担当 - ときどきRuby&Railsでの開発に参加 -

    Railsとの出会い - Arelが入る前、Rails 2.3 or 3 くらい - sendagaya.rb主催 with @tkawa - 毎週月曜日に勉強会を開催 - そろそろ350回を超える!? - キーボード - デフォルト => hhkb type-s => NiZ atom66 (沼回避)
  6. アジェンダ

  7. アジェンダ - どういう感じで読めないか? - それを乗り越えるためには? - 具体的な方法

  8. どういう感じで読めないか?

  9. - コードがどこにあるのかわからない - コードを読んだけど推測する動作に自信が持てない - コードの流れがわからない どういう感じで読めないか?

  10. それを乗り越えるには?

  11. それを乗り越えるには? Rubyやgemの便利な機能を使う => 実際にコードを動かす

  12. 具体的な方法について

  13. コードを探すには? (検索編)

  14. コードを探すには?(検索編) gemのインストール場所をRails.root配下に ⬇こちらのやり方はDEPRECATED (bundler 2.1〜) $ bundle config set path

    ‘vendor/bundle’ --local $ bundle install $ bundle install --path vendor/bundle
  15. コードを探すには?(検索編) Rails.root 配下にgemをインストールしたら? - △遅い・終わらない - grep - ◯簡単・速い・便利 -

    ag(silver searcher) - rg(ripgrep) - ack
  16. コードを探すには? (メソッド編)

  17. コードを探すには?(メソッド編) Method#source_location 1 class Hoge 2 def run 3 end

    4 end hoge = Hoge.new > hoge.method(:run).source_location => ["hoge.rb", 2] > hoge.method(:run) # Ruby2.7〜 => #<Method: Hoge#run() hoge.rb:2>
  18. コードを探すには?(メソッド編) 例) Railsのソースコードを読むときに使ってみる ActiveRecord::Base.connectionの定義場所を調べる > ActiveRecord::Base.method(:connection).source_location => [".../gems/activerecord-6.0.3.3/lib/active_record/connection_handling.rb", 188] 1

    # frozen_string_literal: true 2 3 module ActiveRecord 4 module ConnectionHandling ... 187 # to any of the specific Active Records. 188 def connection 189 retrieve_connection
  19. 具体的な動作について知るには?

  20. 具体的な動作について知るには? デバッガーをつかう - binding.irb (ruby標準) - binding.pry (pry gem) -

    byebug (byebug gem) From: .../photos/app/controllers/albums_controller.rb @ line 3 : 1: class AlbumsController < ApplicationController 2: def index => 3: binding.irb 4: end 5: end
  21. 具体的な動作について知るには? From: .../photos/app/controllers/albums_controller.rb @ line 3 : 1: class AlbumsController

    < ApplicationController 2: def index => 3: binding.irb 4: end 5: end irb(#<AlbumsController:0x00007f8d94ae4998>):001:0> params => <ActionController::Parameters {"controller"=>"albums", "action"=>"index"} permitted: false> ... irb(#<AlbumsController:0x00007f8d94ae4998>):007:0> controller_name => "albums" irb(#<AlbumsController:0x00007f8d94ae4998>):008:0> action_name => "index"
  22. 呼び出し元について知るには?

  23. 呼び出し元について知るには? - puts caller (ruby標準) - backtrace (byebug gemでデバッグ中) class

    AlbumsController < ApplicationController def index puts caller end end
  24. 呼び出し元について知るには? .../app/controllers/albums_controller.rb:4:in `index' .../actionpack-6.0.3.3/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action' .../actionpack-6.0.3.3/lib/abstract_controller/base.rb:195:in `process_action' .../actionpack-6.0.3.3/lib/action_controller/metal/rendering.rb:30:in `process_action' .../actionpack-6.0.3.3/lib/abstract_controller/callbacks.rb:42:in

    `block in process_action' .../activesupport-6.0.3.3/lib/active_support/callbacks.rb:135:in `run_callbacks' : 省略 : .../rack-proxy-0.6.5/lib/rack/proxy.rb:57:in `call' .../railties-6.0.3.3/lib/rails/engine.rb:527:in `call' .../puma-4.3.6/lib/puma/server.rb:713:in `handle_request' .../puma-4.3.6/lib/puma/server.rb:472:in `process_client' .../puma-4.3.6/lib/puma/server.rb:328:in `block in run' .../puma-4.3.6/lib/puma/thread_pool.rb:134:in `block in spawn_thread' ※byebug起動中にスタックトレースをたどるときは、 up/down (スタック階層を上下移動) frame n (スタック階層n番へ移動), list (コード表示), edit (エディタで開く)を利用すると便利です
  25. gemのコードを読むときは?

  26. gemのコードを読むときは? - gemのコードでも気にせず変更 - 動作を知るためのコードを直接埋め込んでいく - binding.irb、byebugなどのデバッガー - Method#source_location, caller

    - puts, p - ブレークポイントを利用してもできるけど...
  27. 変更したgemを 元に戻すには?

  28. 変更したgemを元に戻すには? bundle or gem pristine コマンドを使う - Gemfileにあるgemを全部 - bundle

    pristine - Gemfileにあるgem(extensionなしのみ)を全部 : 速い ※ - bundle exec gem pristine --all --no-extension - 変更したgemを覚えている場合 ※ - bundle exec gem pristine [GEMNAME] --no-extension ※extensionありではうまく動作しなかった
  29. 迷子にならないように するには?

  30. 迷子にならないようにする? - コードを読む目的を明確に - 例) - 複数の値をオプションに渡す区切り文字を知る - activestorageでS3を使ったときのkeyの変更可否 -

    目的をどこかにメモする - メモをときどき振り返る
  31. まとめ

  32. まとめ - 困ったときはRubyやgemに助けてもらおう - 読む前/長期化しそうなとき目的を再確認しよう - デバッグ力の向上にもつながるかも

  33. ロコガイドではソースコードを どんどん読んで、Ruby/Railsで一緒に楽しく 開発してくれる仲間を募集中です! 気になったら wantedly、@fukajun に連絡ください

  34. ご視聴ありがとうございました。