ただRubyで使われていないメソッド
を削除したい人生だった
@muramurasan
自己紹介
○名前
□松村 康弘 (@muramurasan)
○所属
□ピクスタ株式会社 開発部
○来歴
□客先常駐の組み込みSEを3年やって、
「畜生、転職だ!」
□2015年10月からピクスタでRailsをさわり始める
○趣味
□食器洗い
本題
RubyKaigi2016
で未使用のメソッド
を静的解析するgem
が紹介されました
What is “debride”
○Rubyのソースコードを静的解析し、
どこからも呼ばれていないメソッドを抽出する
○呼ばれないことが自明なメソッドについては、
ホワイトリストを記述できるようになっている
https://github.com/seattlerb/debride
What is “debride”
https://github.com/seattlerb/debride
実行結果
どこからも呼ばれていな
いメソッドを抽出
実行時にwhitelistを
設定することで、
任意のメソッドを除外
debride の辛い点
○Railsで使う場合、
□ ControllerのActionをホワイトリストに逐
一記述する必要がある
□ Viewから呼び出されるメソッドを検知でき
ない(はず)
○動的にメソッド呼び出しが行われるケースは対
応できない (エッジケースとイタチごっこ)
https://github.com/seattlerb/debride
そこで
OKURIBITO
というgemを
作っています
yamlに未使用と思われるメソッドを記述し、
それらのメソッドが呼び出された際にロギン
グしたり、Slackに通知したりする。
→本番運用の中で、既存の振る舞いに影響を
与えずにメソッドを消せるか見極めることが
できる。
OKURIBITOとは?
https://github.com/muramurasan/okuribito
機能一覧
任意のメソッド呼出を検
出
監視対象メソッドに、Moduleを
prepend(フック)させており、プロ
ダクションコードの修正が不要
(外からyamlで指定する)
yamlに監視メソッドを記述
クラスメソッドと、インスタンスメソ
ッドの監視を分けて記述可能!
呼出検知時、各種ロギング
・コンソール出力
・Slack通知
・ログファイル出力
監視開始日時の記録
初めて監視対象に投入した日時を記録
しておいてくれるので、3ヶ月呼ばれ
ていなかったら消す、とかできる
https://github.com/muramurasan/okuribito
ざっくりの動き
https://github.com/muramurasan/okuribito
1. yamlをもとに各クラスに
同名メソッドを定義した
Moduleをprependする
(この時、初回のprepend
なら時刻をロギングしてお
く)
User
# feed
# following?
...
PatchModule
# feed
ざっくりの動き
https://github.com/muramurasan/okuribito
1. yamlをもとに各クラスに
同名メソッドを定義した
Moduleをprependする
(この時、初回のprepend
なら時刻をロギングしてお
く)
User
# feed
# following?
...
PatchModule
# feed
Client
2. 監視対象クラスの監
視対象メソッドが呼ば
れる
feed
ざっくりの動き
https://github.com/muramurasan/okuribito
1. yamlをもとに各クラスに
同名メソッドを定義した
Moduleをprependする
(この時、初回のprepend
なら時刻をロギングしてお
く)
User
# feed
# following?
...
PatchModule
# feed
Client
2. 監視対象クラスの監
視対象メソッドが呼ば
れる
feed
3. 設定に応じた通知が
行われる
Slack通知
ロギング
今後の課題
○Railsで導入を簡単にできるようにする
○テストを書く
○呼び出し検知時に実行する処理を自由に
書けるようにする
□ Slack通知とかエッジケースすぎるので、本当は利用者に裁量を持
たせたい
○debrideの解析結果からyamlを生成する
コマンドを提供する
□ 実運用を考えると、監視対象のメソッドを書き起こすのが一番だ
るいはず。そこで既存の有能gemの力を借りる
○rubygemsで公開する(勇気をください......)
https://github.com/muramurasan/okuribito
THANKS!
Any questions?
😂
任意のメソッド呼出を検出 yamlに監視メソッドを記述
呼出検知時、各種ロギング 監視開始日時の記録
https://github.com/muramurasan/okuribito

Shibuya.rb0921 / ただRubyで使われていないメソッドを削除したい人生だった