SlideShare a Scribd company logo
1 of 18
Download to read offline
pry による REPL 開発について
2019/03/13
Tomoya Kawanishi
エネチェンジチーフエンジニア
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
1自己紹介
Tomoya Kawanishi a.k.a cuzic
エネチェンジ株式会社 チーフエンジニア
エンジニア、積極採用してます!
wantedly 経由でのご応募お待ちしております。
Ruby関西の中の人
みなさん、登壇お願いします!
Otemachi.rb の中の人
ご参加お待ちしています。
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
REPL とは、pry とは
REPL
Read、 Evaluate、 Print、 Loop
Lisp の関数名に由来して、REPL と呼ばれる
Ruby だと irb でできることが REPL
詳細まだ決まっていないときに、いろいろ実験するときに使え
る(詳しくはあとで)
pry
irb よりイケてる代替物
イケてるプラグインとかも使える
pry-byebug
pry-stack_explorer
2
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
よくある開発サイクル
開発速度 =
(実装→失敗→調査→修正)のループの回転速度
よくある開発サイクル
①エディタ等で、機能を実装する
②ファイルを保存
③動作を確認
④うまく動かず、失敗する
この変数は、Date型?Time型?String型?
ハッシュのキーって、Symbol?文字列?
引数って、モデルのオブジェクト? id ?
⑤原因を調査する
⑥修正し、②に戻る
3
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
REPL 駆動開発
REPL 駆動開発の開発サイクル
①機能を実装したい箇所にまず binding.pry を仕込む
②うまく動作するように、REPL 上で試行錯誤する
③うまくいったものをエディタにコピーする
④実際に動かしてみる!
⑤最初からイイ感じに動作する!
4
REPL駆動開発で、試行錯誤のループを高速回転!
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
binding.pry とは
binding.pry で、任意の場所で止めて、その場所の状態
を確認することができる
さまざまな変数の値を調べることで、不具合の原因の調
査ができる
5
def index
binding.pry
# 処理内容
end
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
?、show-doc、$、show-method
? や show-doc を使うとドキュメントを確認できる
$ や show-method を使うとメソッドの定義を確認で
きる
6
pry(main)> ? {}.values_at
From: hash.c (C Method):
Owner: Hash
Visibility: public
Signature: values_at(*arg1)
Number of lines: 5
Return an array containing the values associated with the
given keys.
Also see Hash.select.
h = { "cat" => "feline", "dog" => "canine", "cow" =>
"bovine" }
h.values_at("cow", "cat") #=> ["bovine", "feline"]
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
cd、ls 、TAB補完
cd でコンテキストを移動できる
ls で、オブジェクトの持つメソッド、インスタンス変数
などを一覧で確認できる
候補となる単語をタブで補完できる
7
pry(main)> ls []
pry(main)> cd []
pry(#<Array>):1> ls
pry(#<Array>):1> cd ..
pry(main)>
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
exit!、!!!、exit-program
binding.pry で調査しているときのあるある
ループの内側で binding.pry を書く
binding.pry のところで何度も何度も止められる
ウザい
乱暴な方法だけど、 exit! を使うと、Ruby のプロセス
を終了できる
rails s の中でこれをすると、rails s が落ちる
8
pry(main)> exit!
pry(main)> !!!
pry(main)> exit-program
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
break
break でブレイクポイントを設定できる
ループの中で中断したいときなどは、
① メソッドの先頭等で binding.pry を仕込む
② 条件付きでブレイクポイントを設定する
③ 調査、検証が終了すれば、ブレイクポイントを削除する
というような、手順で作業するのがオススメ
9
pry(main)> break 10 # カレントファイルの 10行目にブレイクポイントを設定する
pry(main)> break app/models/user.rb:15 # user.rb の 15行目にブレイクポイントを設
定する
pry(main)> break 14 if provider.key == "tepco" # provider.key が tepco の場
合にのみ 14 行目で中断させる
pry(main)> break # ブレイクポイントを一覧表示
pry(main)> break --delete 1 # ブレイクポイント#1 を削除
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
. と shell-mode
shell-mode で、カレントディレクトリがプロンプトで
表示できる
.echo hoge などとすると、シェルのコマンド入力とし
て受け付けてくれる
#{} による式展開が使えるので便利
10
pry(main)> filename = Rails.root + "db/schema.rb"
pry(main)> .cat #{filename}
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
help
pry のコマンドの全リストを確認できる
11
[1] pry(main)> help
Help
help Show a list of commands or information about a specific
command.
Context
cd Move into a new context (object or scope).
find-method Recursively search for a method within a class/module or
the current namespace.
ls Show the list of vars and methods in the current scope.
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
ls の高度な使い方
ls –m –G find オブジェクト名
そのオブジェクトのメソッドで find を含むものだけを表示
-G の引数として正規表現がつかえる
12
pry(main)> ls -m -G find User
ActiveRecord::Querying#methods:
find_by_sql find_in_batches find_or_create_by!
find_each find_or_create_by find_or_initialize_by
ActiveRecord::Core::ClassMethods#methods:
find find_by find_by! initialize_find_by_cache
ActiveRecord::Inheritance::ClassMethods#methods:
finder_needs_type_condition?
ActiveRecord::Base.methods:
_find_callbacks _find_callbacks? find_by_statement_cache=
_find_callbacks= after_find find_by_statement_cache?
User.methods: find_by_statement_cache
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
pry-byebug
pry-byebug でステップ実行ができる
step と next は実行する行数を引数にとれる
ユースケース
心当たりなく、変数の値が書き換わっている!
更新箇所を特定したい!
① 変数の書き換わる前、後の場所を特定する
② step 1000 などと実行し、変更があるかどうかを調べる
③ ②を繰り返し行い、2分探索などを実施し、変更箇所を特定する
13
pry(main)> step # 次のスコープの中に入る。(ステップイン)
pry(main)> next # 現在のスコープで1行進む。(ステップオーバー)
pry(main)> finish # 現在のスコープを抜ける(ステップアウト)
pry(main)> continue # 次のブレイクポイントまで進む
pry(main)> step 10 # ステップインで 10行進む
pry(main)> next 10 # ステップオーバーで 10行進む
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
pry-stack_explorer
pry-stack_explorer を使うと、呼び出し元にコンテキ
ストを移動できる
呼び出し元の変数の値がどうなっているか確認できる
ユースケース
意図せず before_save のフックが実行されてる!
どこで、save が行われているか特定したい!
実行されているフックの中で、binding.pry を設定
show-stack で、どこで save が実行されてるか特定
14
pry(main)> show-stack # スタックのリストを表示
pry(main)> frame 10 # そのスタックにコンテキストを移動する
pry(main)> up # そのメソッドの呼び出し元に移動
pry(main)> down # その行のメソッドを呼び出した先に移動
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
Tips: pry コマンドと名前が重複しているとき
history という名前の変数の内容を binding.pry から
確認したい!
eval するとうまくいく!
15
pry(main)> history # 入力履歴が表示される
pry(main)> eval("history") # ローカル変数 history の内容が表示される
Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」
結びとして
pry の機能は一度ちゃんと勉強するととても役立ちます。
私自身とても勉強になりました。
今回は、Ruby を前提とした説明でしたが、他言語(
javascript 等)でも、REPL 駆動開発は役立ちます。
REPL駆動開発をすることで、ライブラリの仕様、仕様・
実装について、思い込みで時間を浪費することで減り、
開発生産性がとても向上します。
また、懇親会等で感想を聞かせてください。
16
17
ご清聴ありがとう
ございました

More Related Content

More from Tomoya Kawanishi

Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Tomoya Kawanishi
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRubyTomoya Kawanishi
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてTomoya Kawanishi
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてTomoya Kawanishi
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決についてTomoya Kawanishi
 

More from Tomoya Kawanishi (20)

Ruby での外部コマンドの実行について
Ruby での外部コマンドの実行についてRuby での外部コマンドの実行について
Ruby での外部コマンドの実行について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Rake
RakeRake
Rake
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 

Recently uploaded

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 

Recently uploaded (9)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 

Pry による REPL 駆動開発(2019-03-13)

  • 1. pry による REPL 開発について 2019/03/13 Tomoya Kawanishi エネチェンジチーフエンジニア
  • 2. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 1自己紹介 Tomoya Kawanishi a.k.a cuzic エネチェンジ株式会社 チーフエンジニア エンジニア、積極採用してます! wantedly 経由でのご応募お待ちしております。 Ruby関西の中の人 みなさん、登壇お願いします! Otemachi.rb の中の人 ご参加お待ちしています。
  • 3. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 REPL とは、pry とは REPL Read、 Evaluate、 Print、 Loop Lisp の関数名に由来して、REPL と呼ばれる Ruby だと irb でできることが REPL 詳細まだ決まっていないときに、いろいろ実験するときに使え る(詳しくはあとで) pry irb よりイケてる代替物 イケてるプラグインとかも使える pry-byebug pry-stack_explorer 2
  • 4. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 よくある開発サイクル 開発速度 = (実装→失敗→調査→修正)のループの回転速度 よくある開発サイクル ①エディタ等で、機能を実装する ②ファイルを保存 ③動作を確認 ④うまく動かず、失敗する この変数は、Date型?Time型?String型? ハッシュのキーって、Symbol?文字列? 引数って、モデルのオブジェクト? id ? ⑤原因を調査する ⑥修正し、②に戻る 3
  • 5. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 REPL 駆動開発 REPL 駆動開発の開発サイクル ①機能を実装したい箇所にまず binding.pry を仕込む ②うまく動作するように、REPL 上で試行錯誤する ③うまくいったものをエディタにコピーする ④実際に動かしてみる! ⑤最初からイイ感じに動作する! 4 REPL駆動開発で、試行錯誤のループを高速回転!
  • 6. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 binding.pry とは binding.pry で、任意の場所で止めて、その場所の状態 を確認することができる さまざまな変数の値を調べることで、不具合の原因の調 査ができる 5 def index binding.pry # 処理内容 end
  • 7. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 ?、show-doc、$、show-method ? や show-doc を使うとドキュメントを確認できる $ や show-method を使うとメソッドの定義を確認で きる 6 pry(main)> ? {}.values_at From: hash.c (C Method): Owner: Hash Visibility: public Signature: values_at(*arg1) Number of lines: 5 Return an array containing the values associated with the given keys. Also see Hash.select. h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } h.values_at("cow", "cat") #=> ["bovine", "feline"]
  • 8. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 cd、ls 、TAB補完 cd でコンテキストを移動できる ls で、オブジェクトの持つメソッド、インスタンス変数 などを一覧で確認できる 候補となる単語をタブで補完できる 7 pry(main)> ls [] pry(main)> cd [] pry(#<Array>):1> ls pry(#<Array>):1> cd .. pry(main)>
  • 9. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 exit!、!!!、exit-program binding.pry で調査しているときのあるある ループの内側で binding.pry を書く binding.pry のところで何度も何度も止められる ウザい 乱暴な方法だけど、 exit! を使うと、Ruby のプロセス を終了できる rails s の中でこれをすると、rails s が落ちる 8 pry(main)> exit! pry(main)> !!! pry(main)> exit-program
  • 10. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 break break でブレイクポイントを設定できる ループの中で中断したいときなどは、 ① メソッドの先頭等で binding.pry を仕込む ② 条件付きでブレイクポイントを設定する ③ 調査、検証が終了すれば、ブレイクポイントを削除する というような、手順で作業するのがオススメ 9 pry(main)> break 10 # カレントファイルの 10行目にブレイクポイントを設定する pry(main)> break app/models/user.rb:15 # user.rb の 15行目にブレイクポイントを設 定する pry(main)> break 14 if provider.key == "tepco" # provider.key が tepco の場 合にのみ 14 行目で中断させる pry(main)> break # ブレイクポイントを一覧表示 pry(main)> break --delete 1 # ブレイクポイント#1 を削除
  • 11. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 . と shell-mode shell-mode で、カレントディレクトリがプロンプトで 表示できる .echo hoge などとすると、シェルのコマンド入力とし て受け付けてくれる #{} による式展開が使えるので便利 10 pry(main)> filename = Rails.root + "db/schema.rb" pry(main)> .cat #{filename}
  • 12. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 help pry のコマンドの全リストを確認できる 11 [1] pry(main)> help Help help Show a list of commands or information about a specific command. Context cd Move into a new context (object or scope). find-method Recursively search for a method within a class/module or the current namespace. ls Show the list of vars and methods in the current scope.
  • 13. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 ls の高度な使い方 ls –m –G find オブジェクト名 そのオブジェクトのメソッドで find を含むものだけを表示 -G の引数として正規表現がつかえる 12 pry(main)> ls -m -G find User ActiveRecord::Querying#methods: find_by_sql find_in_batches find_or_create_by! find_each find_or_create_by find_or_initialize_by ActiveRecord::Core::ClassMethods#methods: find find_by find_by! initialize_find_by_cache ActiveRecord::Inheritance::ClassMethods#methods: finder_needs_type_condition? ActiveRecord::Base.methods: _find_callbacks _find_callbacks? find_by_statement_cache= _find_callbacks= after_find find_by_statement_cache? User.methods: find_by_statement_cache
  • 14. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 pry-byebug pry-byebug でステップ実行ができる step と next は実行する行数を引数にとれる ユースケース 心当たりなく、変数の値が書き換わっている! 更新箇所を特定したい! ① 変数の書き換わる前、後の場所を特定する ② step 1000 などと実行し、変更があるかどうかを調べる ③ ②を繰り返し行い、2分探索などを実施し、変更箇所を特定する 13 pry(main)> step # 次のスコープの中に入る。(ステップイン) pry(main)> next # 現在のスコープで1行進む。(ステップオーバー) pry(main)> finish # 現在のスコープを抜ける(ステップアウト) pry(main)> continue # 次のブレイクポイントまで進む pry(main)> step 10 # ステップインで 10行進む pry(main)> next 10 # ステップオーバーで 10行進む
  • 15. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 pry-stack_explorer pry-stack_explorer を使うと、呼び出し元にコンテキ ストを移動できる 呼び出し元の変数の値がどうなっているか確認できる ユースケース 意図せず before_save のフックが実行されてる! どこで、save が行われているか特定したい! 実行されているフックの中で、binding.pry を設定 show-stack で、どこで save が実行されてるか特定 14 pry(main)> show-stack # スタックのリストを表示 pry(main)> frame 10 # そのスタックにコンテキストを移動する pry(main)> up # そのメソッドの呼び出し元に移動 pry(main)> down # その行のメソッドを呼び出した先に移動
  • 16. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 Tips: pry コマンドと名前が重複しているとき history という名前の変数の内容を binding.pry から 確認したい! eval するとうまくいく! 15 pry(main)> history # 入力履歴が表示される pry(main)> eval("history") # ローカル変数 history の内容が表示される
  • 17. Otemachi.rb #15 発表資料 「pry による REPL 駆動開発について」 結びとして pry の機能は一度ちゃんと勉強するととても役立ちます。 私自身とても勉強になりました。 今回は、Ruby を前提とした説明でしたが、他言語( javascript 等)でも、REPL 駆動開発は役立ちます。 REPL駆動開発をすることで、ライブラリの仕様、仕様・ 実装について、思い込みで時間を浪費することで減り、 開発生産性がとても向上します。 また、懇親会等で感想を聞かせてください。 16