Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
本番環境で使える実行コード記録機能
Search
Yusuke Endoh
February 28, 2019
Programming
0
11
本番環境で使える実行コード記録機能
Cookpad TechConf 2019 LT
https://techconf.cookpad.com/2019/yusuke_endoh.html
Yusuke Endoh
February 28, 2019
Tweet
Share
More Decks by Yusuke Endoh
See All by Yusuke Endoh
An Invitation to TRICK: How to write weird Ruby programs
mame
1
830
TypeProf進捗
mame
0
33
12年前の『型システム入門』翻訳の思い出話
mame
14
2k
Good first issues of TypeProf
mame
4
6.9k
Revisiting TypeProf - IDE support as a primary feature
mame
1
2.4k
error_highlight: User-friendly Error Diagnostics
mame
0
23
TRICK 2022 Results
mame
0
41
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mame
0
47
Enjoy Ruby Programming in IDE and TypeProf
mame
0
36
Other Decks in Programming
See All in Programming
Open source software: how to live long and go far
gaelvaroquaux
0
660
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
140
Honoとフロントエンドの 型安全性について
yodaka
7
1.4k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
220
パスキーのすべて ── 導入・UX設計・実装の紹介 / 20250213 パスキー開発者の集い
kuralab
3
880
dbt Pythonモデルで実現するSnowflake活用術
trsnium
0
260
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
5分で理解する SOLID 原則 #phpcon_nagoya
shogogg
1
300
自力でTTSモデルを作った話
zgock999
0
100
仕様変更に耐えるための"今の"DRY原則を考える
mkmk884
9
3.1k
1年目の私に伝えたい!テストコードを怖がらなくなるためのヒント/Tips for not being afraid of test code
push_gawa
1
500
Jakarta EE meets AI
ivargrimstad
0
280
Featured
See All Featured
Music & Morning Musume
bryan
46
6.4k
Code Reviewing Like a Champion
maltzj
521
39k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Practical Orchestrator
shlominoach
186
10k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
570
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
How GitHub (no longer) Works
holman
314
140k
How to Ace a Technical Interview
jacobian
276
23k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Transcript
【Ruby 2.6新機能紹介】 本番環境で使える 実行コード記録機能 遠藤侑介 Cookpad TechConf 2019 LT
遠藤侑介 (@mametter) • Rubyコミッタ • プログラミング言語Ruby開発メンバ • テストを中心にいろいろやってます • フルタイムRubyコミッタ
• Ruby開発がクックパッドでの業務 w/ 笹田耕一 • Ruby3の静的解析が主ミッション
Ruby 2.6 リリース • 終端なしRange • unicode 定数名 • cause
表示 • refinement拡張 • ブロック to_h • Enum#chain • #Arithmetic Sequence • Kernel#then • Proc 合成 • exception 引数 • Array#union と #difference • Array#filter • Binding# source_locatoin • Dir#each_child • Exception#full_ message拡張 • Hash#merge拡張 • Random.bytes • ブロック String#split • Unicode 11.0.0 • RubyVM::AST • RubyVM.resolve_ feature_path • TracePoint拡張 • Bundler 同梱 • oneshot coverage • FileUtils#cp_lr • Matrixの破壊的更新 •rescue なし else •フリップフロップ •File.read("|...") •String#crypt •Object#=~ •Procレベルの$SAFE •MJIT •Proc高速化 •VM生成系の一新 •スレッドキャッシュ •タイマースレッド削除 •Fiber の実装向上 •Transient Heap 新機能 廃止・非推奨 性能改善
• 終端なしRange • unicode 定数名 • cause 表示 • refinement拡張
• ブロック to_h • Enum#chain • #Arithmetic Sequence • Kernel#then • Proc 合成 • exception 引数 • Array#union と #difference • Array#filter • Binding# source_locatoin • Dir#each_child • Exception#full_ message拡張 • Hash#merge拡張 • Random.bytes • ブロック String#split • Unicode 11.0.0 • RubyVM::AST • RubyVM.resolve_ feature_path • TracePoint拡張 • Bundler 同梱 • oneshot coverage • FileUtils#cp_lr • Matrixの破壊的更新 •rescue なし else •フリップフロップ •File.read("|...") •String#crypt •Object#=~ •Procレベルの$SAFE •MJIT •Proc高速化 •VM生成系の一新 •スレッドキャッシュ •タイマースレッド削除 •Fiber の実装向上 •Transient Heap 新機能 廃止・非推奨 性能改善 Ruby 2.6 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
• 終端なしRange • unicode 定数名 • cause 表示 • refinement拡張
• ブロック to_h • Enum#chain • #Arithmetic Sequence • Kernel#then • Proc 合成 • exception 引数 • Array#union と #difference • Array#filter • Binding# source_locatoin • Dir#each_child • Exception#full_ message拡張 • Hash#merge拡張 • Random.bytes • ブロック String#split • Unicode 11.0.0 • Ruby::AST • RubyVM.resolve_ feature_path • TracePoint拡張 • Bundler 同梱 • oneshot coverage • FileUtils#cp_lr • Matrixの破壊的更新 •rescue なし else •フリップフロップ •File.read("|...") •String#crypt •Object#=~ •Procレベルの$SAFE •MJIT •Proc高速化 •VM生成系の一新 •スレッドキャッシュ •タイマースレッド削除 •Fiber の実装向上 •Transient Heap 新機能 廃止・非推奨 性能改善 詳しくは『クックパッド開発者ブログ – プロと読み解く Ruby 2.6 NEWS ファイル』 Ruby 2.6 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
• 終端なしRange • unicode 定数名 • cause 表示 • refinement拡張
• ブロック to_h • Enum#chain • #Arithmetic Sequence • Kernel#then • Proc 合成 • exception 引数 • Array#union と #difference • Array#filter • Binding# source_locatoin • Dir#each_child • Exception#full_ message拡張 • Hash#merge拡張 • Random.bytes • ブロック String#split • Unicode 11.0.0 • Ruby::AST • RubyVM.resolve_ feature_path • TracePoint拡張 • Bundler 同梱 • oneshot coverage • FileUtils#cp_lr • Matrixの破壊的更新 •rescue なし else •フリップフロップ •File.read("|...") •String#crypt •Object#=~ •Procレベルの$SAFE •MJIT •Proc高速化 •VM生成系の一新 •スレッドキャッシュ •タイマースレッド削除 •Fiber の実装向上 •Transient Heap 新機能 廃止・非推奨 性能改善 今日のテーマ 詳しくは『クックパッド開発者ブログ – プロと読み解く Ruby 2.6 NEWS ファイル』 Ruby 2.6 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
背景:お台場プロジェクト • クックパッドの中核サービスの アーキテクチャ改善プロジェクト • APIサーバーのアーキテクチャ改善 • 不要なサービスの廃止 • デッドコードの自動検出と削除
• ストレージ数の削減 • 特殊な実行環境・開発環境の廃止
背景:お台場プロジェクト • クックパッドの中核サービスの アーキテクチャ改善プロジェクト • APIサーバーのアーキテクチャ改善 • 不要なサービスの廃止 • デッドコードの自動検出と削除
• ストレージ数の削減 • 特殊な実行環境・開発環境の廃止 詳しくは『クックパッド開発者ブログ – クックパッド基幹システムのmicroservices化戦略 〜お台場プロジェクト1年半の軌跡〜』
背景:お台場プロジェクト • クックパッドの中核サービスの アーキテクチャ改善プロジェクト • APIサーバーのアーキテクチャ改善 • 不要なサービスの廃止 • デッドコードの自動検出と削除
• ストレージ数の削減 • 特殊な実行環境・開発環境の廃止 詳しくは『クックパッド開発者ブログ – クックパッド基幹システムのmicroservices化戦略 〜お台場プロジェクト1年半の軌跡〜』
デッドコードの削除 • 実行されないコードを見つける • 動的言語のRubyでは意外に大変 • クックパッドでは、rubyインタプリタに パッチを当てて実行を記録してた(!)
デッドコードの削除 • 実行されないコードを見つける • 動的言語のRubyでは意外に大変 • クックパッドでは、rubyインタプリタに パッチを当てて実行を記録してた(!) 詳しくは『クックパッド開発者ブログ –
Ruby の lazy loading の仕組みを利用して 未使用の gem を探す』
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 1: if 42 >
0 2: puts "used" 3: else 4: puts "unused" 5: end
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines:
true) load "program.rb" p Coverage.result 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines:
true) load "program.rb" p Coverage.result => {"program.rb"=>{ :oneshot_lines=> [1, 2]}} 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines:
true) load "program.rb" p Coverage.result => {"program.rb"=>{ :oneshot_lines=> [1, 2]}} 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines:
true) load "program.rb" p Coverage.result => {"program.rb"=>{ :oneshot_lines=> [1, 2]}} 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end 1・2行目が実行された
Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines:
true) load "program.rb" p Coverage.result => {"program.rb"=>{ :oneshot_lines=> [1, 2]}} 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end 1・2行目が実行された ➔4行目は実行されなかった (3・5行目は無意味)
1: if 42 > 0 2: puts "used" 3: else
4: puts "unused" 5: end Ruby 2.6新機能: oneshot coverage • 実行された行番号を記録する機能 require "coverage" Coverage.start( oneshot_lines: true) load "program.rb" p Coverage.result => {"program.rb"=>{ :oneshot_lines=> [1, 2]}} 1・2行目が実行された ➔4行目は実行されなかった (3・5行目は無意味) 詳しくは『クックパッド開発者ブログ -- Ruby 2.6 新機能:本番環境での利用を目指した コードカバレッジ計測機能』
実装上の工夫 • 実行記録フックのフラグが バイトコードについている • フックが1回走ったらフラグを消す • 2回め以降はゼロオーバーヘッド • フラグ参照も工夫されている
• 簡潔データ構造の利用など 詳しくは『Ruby 2.5 の改善を自慢したい』 詳しくは『簡潔ビットベクトルでRubyをlog N倍速くした』
本当に本番環境でも使える? • 鋭意作業中 詳しくは RubyKaigi の次の発表で…… Sangyong Sim "Cleaning up
a huge ruby application"
まとめ • クックパッドでの実課題から Rubyに実行された行番号を 調べる新機能を入れました • 『クックパッド開発者ブログ』は情報満載 https://techlife.cookpad.com/