Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
本番環境で使える実行コード記録機能
Search
Yusuke Endoh
February 28, 2019
Programming
38
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
本番環境で使える実行コード記録機能
Cookpad TechConf 2019 LT
https://techconf.cookpad.com/2019/yusuke_endoh.html
Yusuke Endoh
February 28, 2019
More Decks by Yusuke Endoh
See All by Yusuke Endoh
Practical TypeProf: Lessons from Analyzing Optcarrot
mame
1
3.4k
型システムを知りたい人のための型検査器作成入門
mame
15
5.5k
TRICK 2025 Results
mame
0
6k
Writing Ruby Scripts with TypeProf
mame
1
1.6k
An Invitation to TRICK: How to write weird Ruby programs
mame
1
1.5k
TypeProf進捗
mame
0
140
12年前の『型システム入門』翻訳の思い出話
mame
14
2.9k
Good first issues of TypeProf
mame
4
11k
Revisiting TypeProf - IDE support as a primary feature
mame
1
4k
Other Decks in Programming
See All in Programming
残高管理から台帳サービスへの進化
artoy
1
210
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
290
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
180
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
2
670
Domain-Driven Transformation
hschwentner
2
2.3k
気持ちぃ〜角丸 Squircle
ryu1013
0
320
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
110
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
Jetpack Compose Mechanisms
skydoves
3
820
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
JIS keyboard support in Omarchy
lef237
0
140
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.3k
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
516
110k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Exploring anti-patterns in Rails
aemeredith
4
540
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
500
sira's awesome portfolio website redesign presentation
elsirapls
0
460
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
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/