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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yusuke Endoh
February 28, 2019
Programming
0
22
本番環境で使える実行コード記録機能
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
型システムを知りたい人のための型検査器作成入門
mame
15
5.1k
TRICK 2025 Results
mame
0
5.4k
Writing Ruby Scripts with TypeProf
mame
1
1.2k
An Invitation to TRICK: How to write weird Ruby programs
mame
1
1.3k
TypeProf進捗
mame
0
99
12年前の『型システム入門』翻訳の思い出話
mame
14
2.7k
Good first issues of TypeProf
mame
4
9.5k
Revisiting TypeProf - IDE support as a primary feature
mame
1
3.3k
error_highlight: User-friendly Error Diagnostics
mame
0
53
Other Decks in Programming
See All in Programming
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
1.3k
文字コードの話
qnighy
44
17k
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
500
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
130
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
210
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
570
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
210
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
1k
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.2k
TipKitTips
ktcryomm
0
170
モジュラモノリスにおける境界をGoのinternalパッケージで守る
magavel
0
3.6k
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.9k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
4 Signs Your Business is Dying
shpigford
187
22k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Building an army of robots
kneath
306
46k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.5k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8k
Abbi's Birthday
coloredviolet
2
5.4k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
83
Producing Creativity
orderedlist
PRO
348
40k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
460
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
210
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
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/