SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
pry による REPL 開発について
2017/12/26
Tomoya Kawanishi
エネチェンジチーフエンジニア
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
1自己紹介
Tomoya Kawanishi a.k.a cuzic
エネチェンジ株式会社 チーフエンジニア
エンジニア、積極採用してます!
Ruby関西の中の人
みなさん、登壇お願いします!
第80回 Ruby関西勉強会 1月13日(土)
株式会社 Aiming で開催予定
Otemachi.rb の中の人
これからもご参加お願いしますっ!
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
REPL とは、pry とは
REPL
Read、 Evaluate、 Print、 Loop
Lisp の関数名に由来して、REPL と呼ばれる
Ruby だと irb でできることが REPL
詳細まだ決まっていないときに、いろいろ実験するときに使え
る(詳しくはあとで)
pry
irb よりイケてる代替物
イケてるプラグインとかも使える
pry-byebug
pry-stack_explorer
2
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
よくある開発サイクル
開発速度 =
(実装→失敗→調査→修正)のループの回転速度
よくある開発サイクル
①エディタ等で、機能を実装する
②ファイルを保存
③動作を確認
④うまく動かず、失敗する
多くの場合、変数の内容が違ったり
引数、返り値が想定と違ったりする
モデルのオブジェクトを渡す?文字列を渡す?
⑤原因を調査する
⑥修正し、②に戻る
3
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
REPL 駆動開発
REPL 駆動開発の開発サイクル
①機能を実装したい箇所にまず binding.pry を仕込む
②うまく動作するように、REPL 上で試行錯誤する
③うまくいったものをエディタにコピーする
④実際に動かしてみる!
⑤最初からイイ感じに動作する!
4
REPL駆動開発で、試行錯誤のループを高速回転!
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
binding.pry とは
binding.pry で、任意の場所で止めて、その場所の状態
を確認することができる
さまざまな変数の値を調べることで、不具合の原因の調
査ができる
5
def index
binding.pry
# 処理内容
end
Otemachi.rb #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」
cd、ls 、TAB補完
cd でコンテキストを移動できる
ls で、オブジェクトの持つメソッド、インスタンス変数
などを一覧で確認できる
候補となる単語をタブで補完できる
7
pry(main)> ls []
pry(#<Array>):1> cd []
pry(#<Array>):1> ls
pry(#<Array>):1> cd ..
pry(main)>
Otemachi.rb #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」
break
break でブレイクポイントを設定できる
ループの中で中断したいときなどは、
① メソッドの先頭等で binding.pry を仕込む
② 条件付きでブレイクポイントを設定する
③ 調査、検証が終了すれば、ブレイクポイントを削除する
というような、手順で作業するのがオススメ
9
pry(main)> break 10 # カレントファイルの 10行目にブレイクポイントを設定する
pry(main)> 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 #2 発表資料 「pry による REPL 駆動開発について」
. と shell-mode
shell-mode で、カレントディレクトリがプロンプトで
表示できる
.echo hoge などとすると、シェルのコマンド入力とし
て受付てくれる
#{} による式展開が使えるので便利
10
pry(main)> filename = Rails.root + “db/schema.rb”
pry(main)> .cat #{filename}
Otemachi.rb #2 発表資料 「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 #2 発表資料 「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 #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」
pry-stack_explorer
pry-stack_explorer を使うと、呼び出し元にコンテキ
ストを移動できる
呼び出し元の変数の値がどうなっているか確認できる
14
pry(main)> show-stack # スタックのリストを表示
pry(main)> frame 10 # そのスタックにコンテキストを移動する
pry(main)> up # そのメソッドの呼び出し元に移動
pry(main)> down # その行のメソッドを呼び出した先に移動
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
Tips: pry コマンドと名前が重複しているとき
history という名前の変数の内容を binding.pry から
確認したい!
eval するとうまくいく!
15
pry(main)> history # 入力履歴が表示される
pry(main)> eval("history") # ローカル変数 history の内容が表示される
Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」
結びとして
pry の機能は一度ちゃんと勉強するととても役立ちます。
私自身とても勉強になりました。
今回は、Ruby を前提とした説明でしたが、他言語(
javascript 等)でも、REPL 駆動開発は役立ちます。
REPL駆動開発をすることで、ライブラリの仕様、仕様・
実装について、思い込みで時間を浪費することで減り、
開発生産性がとても向上します。
また、懇親会等で感想を聞かせてください。
16
17
ご清聴ありがとう
ございました

Weitere ähnliche Inhalte

Was ist angesagt?

Perl/CGI 入門
Perl/CGI 入門Perl/CGI 入門
Perl/CGI 入門keroyonn
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
Serfが面白いと俺の中で話題にwwwwww 【改訂版】
Serfが面白いと俺の中で話題にwwwwww 【改訂版】Serfが面白いと俺の中で話題にwwwwww 【改訂版】
Serfが面白いと俺の中で話題にwwwwww 【改訂版】Masahito Zembutsu
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdbakirahiguchi
 
Goでこれどうやるの? 入門
Goでこれどうやるの? 入門Goでこれどうやるの? 入門
Goでこれどうやるの? 入門zaru sakuraba
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールAtsuo Ishimoto
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the presentmoznion
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてt-sin
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」yoshiaki iwanaga
 
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~Preferred Networks
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作るgoccy
 
Return Oriented Programming
Return Oriented ProgrammingReturn Oriented Programming
Return Oriented Programmingsounakano
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ SEGADevTech
 
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)nabe-abk
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)do_aki
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 

Was ist angesagt? (20)

Stack pivot
Stack pivotStack pivot
Stack pivot
 
Perl/CGI 入門
Perl/CGI 入門Perl/CGI 入門
Perl/CGI 入門
 
Rake
RakeRake
Rake
 
最速C# 7.x
最速C# 7.x最速C# 7.x
最速C# 7.x
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
Serfが面白いと俺の中で話題にwwwwww 【改訂版】
Serfが面白いと俺の中で話題にwwwwww 【改訂版】Serfが面白いと俺の中で話題にwwwwww 【改訂版】
Serfが面白いと俺の中で話題にwwwwww 【改訂版】
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
Goでこれどうやるの? 入門
Goでこれどうやるの? 入門Goでこれどうやるの? 入門
Goでこれどうやるの? 入門
 
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツールPyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
PyCon JP 2012 hands-on セッション/ FlaskによるWebアプリケーションの実装とプログラミングツール
 
Perl::Lint is over, for the present
Perl::Lint is over, for the presentPerl::Lint is over, for the present
Perl::Lint is over, for the present
 
SECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについてSECDマシン 実装と動きとその他もろもろについて
SECDマシン 実装と動きとその他もろもろについて
 
第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
PFIセミナーH271022 ~コマンドを叩いて遊ぶ コンテナ仮想、その裏側~
 
Perlと出会い、Perlを作る
Perlと出会い、Perlを作るPerlと出会い、Perlを作る
Perlと出会い、Perlを作る
 
Return Oriented Programming
Return Oriented ProgrammingReturn Oriented Programming
Return Oriented Programming
 
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~ CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
CEDEC2021 ダウンロード時間を大幅減!~大量のアセットをさばく高速な実装と運用事例の共有~
 
Akka stream
Akka streamAkka stream
Akka stream
 
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
毎秒2000Requestを捌くPerl製CMSの内部構造(Debianサーバ1台にて)
 
PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)PHP AST 徹底解説(補遺)
PHP AST 徹底解説(補遺)
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 

Ähnlich wie Pry による repl 駆動開発について

Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended LibraryAkio Tajima
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門Yasuko Ohba
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionGoh Matsumoto
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアKouhei Sutou
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料慎平 仁藤
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4leverages_event
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメKazuaki Takase
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionSatomi Tsujita
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますinfinite_loop
 
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編hiboma
 
ROMA on JRuby at JRubyKaigi 2010
ROMA on JRuby at JRubyKaigi 2010ROMA on JRuby at JRubyKaigi 2010
ROMA on JRuby at JRubyKaigi 2010Rakuten Group, Inc.
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?ogawatti
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編Kazuya Numata
 
とっとるびー(2回目)発表資料
とっとるびー(2回目)発表資料とっとるびー(2回目)発表資料
とっとるびー(2回目)発表資料ionis111
 

Ähnlich wie Pry による repl 駆動開発について (20)

Ruby Extended Library
Ruby Extended LibraryRuby Extended Library
Ruby Extended Library
 
Ruby on Rails 入門
Ruby on Rails 入門Ruby on Rails 入門
Ruby on Rails 入門
 
Rails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd editionRails初心者レッスン lesson1 3rd edition
Rails初心者レッスン lesson1 3rd edition
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
Rubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェアRubyを使った分散全文検索ミドルウェア
Rubyを使った分散全文検索ミドルウェア
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料
 
今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4今、最もイケてるPHPフレームワークLaravel4
今、最もイケてるPHPフレームワークLaravel4
 
Ruby で扱う LDAP のススメ
Ruby で扱う LDAP のススメRuby で扱う LDAP のススメ
Ruby で扱う LDAP のススメ
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
Rails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2editionRails初心者レッスン lesson4 2edition
Rails初心者レッスン lesson4 2edition
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
MogileFS をバックエンドとしたPrivate S3の作り方 【後半】API 編
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
ROMA on JRuby at JRubyKaigi 2010
ROMA on JRuby at JRubyKaigi 2010ROMA on JRuby at JRubyKaigi 2010
ROMA on JRuby at JRubyKaigi 2010
 
静的サイトどこにする?
静的サイトどこにする?静的サイトどこにする?
静的サイトどこにする?
 
高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編高トラフィックサイトをRailsで構築するためのTips基礎編
高トラフィックサイトをRailsで構築するためのTips基礎編
 
とっとるびー(2回目)発表資料
とっとるびー(2回目)発表資料とっとるびー(2回目)発表資料
とっとるびー(2回目)発表資料
 

Mehr von Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について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
 

Mehr von Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
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クローリングについて
 
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 のメソッドについて
 

Pry による repl 駆動開発について

  • 1. pry による REPL 開発について 2017/12/26 Tomoya Kawanishi エネチェンジチーフエンジニア
  • 2. Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」 1自己紹介 Tomoya Kawanishi a.k.a cuzic エネチェンジ株式会社 チーフエンジニア エンジニア、積極採用してます! Ruby関西の中の人 みなさん、登壇お願いします! 第80回 Ruby関西勉強会 1月13日(土) 株式会社 Aiming で開催予定 Otemachi.rb の中の人 これからもご参加お願いしますっ!
  • 3. Otemachi.rb #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」 よくある開発サイクル 開発速度 = (実装→失敗→調査→修正)のループの回転速度 よくある開発サイクル ①エディタ等で、機能を実装する ②ファイルを保存 ③動作を確認 ④うまく動かず、失敗する 多くの場合、変数の内容が違ったり 引数、返り値が想定と違ったりする モデルのオブジェクトを渡す?文字列を渡す? ⑤原因を調査する ⑥修正し、②に戻る 3
  • 5. Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」 REPL 駆動開発 REPL 駆動開発の開発サイクル ①機能を実装したい箇所にまず binding.pry を仕込む ②うまく動作するように、REPL 上で試行錯誤する ③うまくいったものをエディタにコピーする ④実際に動かしてみる! ⑤最初からイイ感じに動作する! 4 REPL駆動開発で、試行錯誤のループを高速回転!
  • 6. Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」 binding.pry とは binding.pry で、任意の場所で止めて、その場所の状態 を確認することができる さまざまな変数の値を調べることで、不具合の原因の調 査ができる 5 def index binding.pry # 処理内容 end
  • 7. Otemachi.rb #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」 cd、ls 、TAB補完 cd でコンテキストを移動できる ls で、オブジェクトの持つメソッド、インスタンス変数 などを一覧で確認できる 候補となる単語をタブで補完できる 7 pry(main)> ls [] pry(#<Array>):1> cd [] pry(#<Array>):1> ls pry(#<Array>):1> cd .. pry(main)>
  • 9. Otemachi.rb #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」 break break でブレイクポイントを設定できる ループの中で中断したいときなどは、 ① メソッドの先頭等で binding.pry を仕込む ② 条件付きでブレイクポイントを設定する ③ 調査、検証が終了すれば、ブレイクポイントを削除する というような、手順で作業するのがオススメ 9 pry(main)> break 10 # カレントファイルの 10行目にブレイクポイントを設定する pry(main)> 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 #2 発表資料 「pry による REPL 駆動開発について」 . と shell-mode shell-mode で、カレントディレクトリがプロンプトで 表示できる .echo hoge などとすると、シェルのコマンド入力とし て受付てくれる #{} による式展開が使えるので便利 10 pry(main)> filename = Rails.root + “db/schema.rb” pry(main)> .cat #{filename}
  • 12. Otemachi.rb #2 発表資料 「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 #2 発表資料 「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 #2 発表資料 「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 #2 発表資料 「pry による REPL 駆動開発について」 pry-stack_explorer pry-stack_explorer を使うと、呼び出し元にコンテキ ストを移動できる 呼び出し元の変数の値がどうなっているか確認できる 14 pry(main)> show-stack # スタックのリストを表示 pry(main)> frame 10 # そのスタックにコンテキストを移動する pry(main)> up # そのメソッドの呼び出し元に移動 pry(main)> down # その行のメソッドを呼び出した先に移動
  • 16. Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」 Tips: pry コマンドと名前が重複しているとき history という名前の変数の内容を binding.pry から 確認したい! eval するとうまくいく! 15 pry(main)> history # 入力履歴が表示される pry(main)> eval("history") # ローカル変数 history の内容が表示される
  • 17. Otemachi.rb #2 発表資料 「pry による REPL 駆動開発について」 結びとして pry の機能は一度ちゃんと勉強するととても役立ちます。 私自身とても勉強になりました。 今回は、Ruby を前提とした説明でしたが、他言語( javascript 等)でも、REPL 駆動開発は役立ちます。 REPL駆動開発をすることで、ライブラリの仕様、仕様・ 実装について、思い込みで時間を浪費することで減り、 開発生産性がとても向上します。 また、懇親会等で感想を聞かせてください。 16