SlideShare una empresa de Scribd logo
1 de 18
Descargar para leer sin conexión
Predefを使ったSQLのトレース
山本悠滋
2015-06-04 表参道.rb #1
こんにちは!
山本悠滋(@igrep) 26歳♂
Eightのサーバーサイド担当です。
最近はCoffeeScriptでクライアントをよく触ります。
Haskellの勉強会を毎月やっとります。
小さな小さなgemを作りました
predefと言います
小さな小さなgemを作りました
使ったことある人ー ( ^ω^)ノ
小さな小さなgemを作りました
リリースまだですけどwww
=> しました! predef
なにするgem?
「Module#prependしてdefするgem」略して「predef」
ただのModule#prependのショートカット
なにするgem?
例えば...
class SomeExternalClass
def method_you_know(*args)
...
end
end
↑みたいな(外部のライブラリなど、直接触りづらい)クラ
スがあったとして
なにするgem?
例えば...
Predef.predef SomeExternalClass, :method_you_know do|*args|
p args
super(*args)
end
↑みたいにすると
対象のメソッドの前後に好きな処理を加えられちゃう♪
この場合、引数を出力する処理を加えちゃう♪
なにするgem?
やってることは実質これ↓と同じ
module Wrapper
def method_you_know *args
p args
super(*args)
end
end
class SomeExternalClass
prepend Wrapper
end
詳しくはprependでググってください。
なにするgem?
余計なmoduleを定義しなくて済む
ただそれだけなんで別に無理に使う必要もない
事例
アプリ上で発行されうる全てのSQLと、その場所を把握した
い
ActiveRecord任せのためどこでどんなクエリを発行するか
分かりにくくなりがち
ただし、SELECT・DELETE・UPDATEのみ。
INSERTやその他DDLなどはテストでだけ実行されるケース
が多い。
あと、要件上あまり関心がなかった。
事例
アプリ上で発行されうる全てのSQLと、その場所を把握した
い
Mysql2::Client#queryメソッドをラップした上で、全テスト
を実行
最終的にActiveRecordが実行するはずなので、漏れがない
ラップしたqueryメソッドで受け取った引数と、バックトレース
をログに出す
カバレッジもとり、カバーできてない分のみコードを読む
事例
アプリ上で発行されうる全てのSQLと、その場所を把握した
い
こんな感じ...
Predef.predef Mysql2::Client, :query do|sql|
if sql =~ /SELECT|UPDATE|DELETE/
puts sql
pp caller
end
super(sql) # 引数を忘れずに
end
事例
アプリ上で発行されうる全てのSQLと、その場所を把握した
い
で、こんな感じの出力が!
SELECT * from your_apps_table WHERE ...
["/path/to/your_app/app/models/foo.rb:355:in `some_method_in_model'",
...]
Tips
Refinementsも用意してます
使い方
using Predef::Refinements
Mysql2::Client.predef :query do|sql|
...
end
まとめ(みなさん向け)
$ gem install predef
まとめ(みなさん向け)
require 'predef'
using Predef::Refinements
Mysql2::Client.predef :query do|sql|
puts sql if sql =~ /.../
super(sql)
end
まとめ(私向け)
さっさと bundle exec rake release しなさい。
こちらも終了: predef

Más contenido relacionado

La actualidad más candente

TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3Keiichi Hagiwara
 
Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Kazuhide Maruyama
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacksHiro Yoshioka
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回龍一 田中
 
わかる LT@2
わかる LT@2わかる LT@2
わかる LT@2Shingo Inoue
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Narihiro Nakamura
 
Pgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-jaPgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-jaToshi Harada
 
Hashicorpツールズ
HashicorpツールズHashicorpツールズ
HashicorpツールズUchio Kondo
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」Takeshi Kiriya
 
Java屋な僕がFuelPHPを使ってみた
Java屋な僕がFuelPHPを使ってみたJava屋な僕がFuelPHPを使ってみた
Java屋な僕がFuelPHPを使ってみたManabu Yamamoto
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話disc99_
 
カジュアルに セキュリティテスト はじめよう #qpstudy
カジュアルにセキュリティテストはじめよう #qpstudyカジュアルにセキュリティテストはじめよう #qpstudy
カジュアルに セキュリティテスト はじめよう #qpstudyMasahiro NAKAYAMA
 
カジュアルにセキュリティテストはじめよう
カジュアルにセキュリティテストはじめようカジュアルにセキュリティテストはじめよう
カジュアルにセキュリティテストはじめようMasahiro NAKAYAMA
 
Java script関数コールの追跡
Java script関数コールの追跡Java script関数コールの追跡
Java script関数コールの追跡Keiichi Kobayashi
 

La actualidad más candente (20)

TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3あるあるLT〜サーバーサイドエンジニア〜 Vol.3
あるあるLT〜サーバーサイドエンジニア〜 Vol.3
 
Js async
Js asyncJs async
Js async
 
Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)Typescriptの中のこと(浅め)
Typescriptの中のこと(浅め)
 
Programming camp 2010 debug hacks
Programming camp 2010 debug hacksProgramming camp 2010 debug hacks
Programming camp 2010 debug hacks
 
Javaに這いよる.NET
Javaに這いよる.NETJavaに這いよる.NET
Javaに這いよる.NET
 
Web技術勉強会 第33回
Web技術勉強会 第33回Web技術勉強会 第33回
Web技術勉強会 第33回
 
つぶLT20121215
つぶLT20121215つぶLT20121215
つぶLT20121215
 
わかる LT@2
わかる LT@2わかる LT@2
わかる LT@2
 
Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会Railsハイパー実践講座-第35回NaCl勉強会
Railsハイパー実践講座-第35回NaCl勉強会
 
Pgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-jaPgconf asia-201612203-pg reversi-ja
Pgconf asia-201612203-pg reversi-ja
 
Compare Japanese Fonts
Compare Japanese FontsCompare Japanese Fonts
Compare Japanese Fonts
 
Hashicorpツールズ
HashicorpツールズHashicorpツールズ
Hashicorpツールズ
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
わんくま東京#49 LT 「DynamicQuery ~MSDN サンプルの逆襲~」
 
Java屋な僕がFuelPHPを使ってみた
Java屋な僕がFuelPHPを使ってみたJava屋な僕がFuelPHPを使ってみた
Java屋な僕がFuelPHPを使ってみた
 
JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話JavaのテストGroovyでいいのではないかという話
JavaのテストGroovyでいいのではないかという話
 
カジュアルに セキュリティテスト はじめよう #qpstudy
カジュアルにセキュリティテストはじめよう #qpstudyカジュアルにセキュリティテストはじめよう #qpstudy
カジュアルに セキュリティテスト はじめよう #qpstudy
 
カジュアルにセキュリティテストはじめよう
カジュアルにセキュリティテストはじめようカジュアルにセキュリティテストはじめよう
カジュアルにセキュリティテストはじめよう
 
Java script関数コールの追跡
Java script関数コールの追跡Java script関数コールの追跡
Java script関数コールの追跡
 

Similar a Predefを使ったsqlのトレース

Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法yhara
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Ransui Iso
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To ClojureKent Ohashi
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回龍一 田中
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
Proof and Emacs
Proof and EmacsProof and Emacs
Proof and Emacsdico_leque
 
ES6,7で書ける JavaScript
ES6,7で書ける JavaScriptES6,7で書ける JavaScript
ES6,7で書ける JavaScriptShin Sekaryo
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライドkoturn 0;
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogrammingMasanori Kado
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017Motohiro Ueki
 
若気の至りを精算する
若気の至りを精算する若気の至りを精算する
若気の至りを精算するKenji Daikoku
 

Similar a Predefを使ったsqlのトレース (20)

Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Tdd
TddTdd
Tdd
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
From Java To Clojure
From Java To ClojureFrom Java To Clojure
From Java To Clojure
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Web技術勉強会 第31回
Web技術勉強会 第31回Web技術勉強会 第31回
Web技術勉強会 第31回
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
Proof and Emacs
Proof and EmacsProof and Emacs
Proof and Emacs
 
ES6,7で書ける JavaScript
ES6,7で書ける JavaScriptES6,7で書ける JavaScript
ES6,7で書ける JavaScript
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
20110820 metaprogramming
20110820 metaprogramming20110820 metaprogramming
20110820 metaprogramming
 
クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017クイズ・Python勝ち抜きバトル pycon jp_2017
クイズ・Python勝ち抜きバトル pycon jp_2017
 
若気の至りを精算する
若気の至りを精算する若気の至りを精算する
若気の至りを精算する
 

Más de 悠滋 山本

Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】悠滋 山本
 
Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)悠滋 山本
 
Whom to Recommend Elm to?
Whom to Recommend Elm to?Whom to Recommend Elm to?
Whom to Recommend Elm to?悠滋 山本
 
いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談悠滋 山本
 
Monad as things to do
Monad as things to doMonad as things to do
Monad as things to do悠滋 山本
 
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!悠滋 山本
 
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad悠滋 山本
 

Más de 悠滋 山本 (7)

Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
 
Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)
 
Whom to Recommend Elm to?
Whom to Recommend Elm to?Whom to Recommend Elm to?
Whom to Recommend Elm to?
 
いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談
 
Monad as things to do
Monad as things to doMonad as things to do
Monad as things to do
 
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
Monadなんてどうってことなかった話 - Monadなんてただの型クラス!
 
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad
2014 05-11-関数型lt大会-「やらなければならないこと」としてのhaskellのmonad
 

Predefを使ったsqlのトレース