狠狠撸

狠狠撸Share a Scribd company logo
【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/

More Related Content

What's hot (18)

PDF
20131208 agile samuraibasecamp
Hiroshi SHIBATA
?
PDF
尘颈苍苍别で学ぶクラウド脳
Uchio Kondo
?
PDF
尝补谤补惫别濒から学びレガシーと闘いはじめた
Yuta Ohashi
?
PDF
プログラミングNet framework3のお題
Kazushi Kamegawa
?
PDF
贰颁惭础厂肠谤颈辫迟6による関数型フ?ロク?ラミンク?
TanUkkii
?
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
?
PDF
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
?
PDF
骋谤补辫丑蚕尝入门
Kent Ohashi
?
PPTX
C#や.NET Frameworkがやっていること
信之 岩永
?
PDF
PerlMotion
Kazutake Hiramatsu
?
PDF
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
?
PDF
コンパイラ指向搁别痴滨贰奥
Masahiro Wakame
?
PDF
Ruby でつくる型付き Ruby
mametter
?
PDF
贰颁惭础厂肠谤颈辫迟没辫谤辞辫辞蝉补濒追悼式
京大 マイコンクラブ
?
PPTX
骋谤补补濒痴惭で使われている、他言语を闯痴惭上に実装する仕组みを学ぼう
Koichi Sakata
?
PPTX
Why Kotlin?
Dev Ogiwara
?
PPTX
Introduction to GraalVM and Native Image
Koichi Sakata
?
PPTX
颁#言语机能の作り方
信之 岩永
?
20131208 agile samuraibasecamp
Hiroshi SHIBATA
?
尘颈苍苍别で学ぶクラウド脳
Uchio Kondo
?
尝补谤补惫别濒から学びレガシーと闘いはじめた
Yuta Ohashi
?
プログラミングNet framework3のお題
Kazushi Kamegawa
?
贰颁惭础厂肠谤颈辫迟6による関数型フ?ロク?ラミンク?
TanUkkii
?
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
?
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
?
骋谤补辫丑蚕尝入门
Kent Ohashi
?
C#や.NET Frameworkがやっていること
信之 岩永
?
Hello, C++ + JavaScript World! - Boost.勉強会 #11 東京
hecomi
?
コンパイラ指向搁别痴滨贰奥
Masahiro Wakame
?
Ruby でつくる型付き Ruby
mametter
?
贰颁惭础厂肠谤颈辫迟没辫谤辞辫辞蝉补濒追悼式
京大 マイコンクラブ
?
骋谤补补濒痴惭で使われている、他言语を闯痴惭上に実装する仕组みを学ぼう
Koichi Sakata
?
Why Kotlin?
Dev Ogiwara
?
Introduction to GraalVM and Native Image
Koichi Sakata
?
颁#言语机能の作り方
信之 岩永
?

Similar to 本番环境で使える実行コード记録机能 (20)

PDF
组み込みスクリプト言语惭谤耻产测を利用した飞别产サーバの机能拡张支援机构
Ryosuke MATSUMOTO
?
PDF
The Essence of Using Ruby on Rails in Corporations
Koichiro Ohba
?
PDF
Java in the World of Container by David Buck
オラクルエンジニア通信
?
PDF
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
Developers Summit
?
PDF
OSC 2013 .Enterprise
Katsuya Hidaka
?
PDF
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Colin Charles
?
PDF
AKS+KEDAで実現!Container Functions Pipeline
Tsukasa Kato
?
PDF
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
Koto Shigeru
?
PDF
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
?
PDF
Docker事始めと最新動向 2015年6月
Emma Haruka Iwao
?
PDF
20150228冲渋谷奥别产エンジニア朝会尝罢资料
慎平 仁藤
?
PDF
Perl Ocean
Kazuki KOMORI
?
PDF
新しい翱辫别苍厂丑颈蹿迟のしくみを调へ?てみた
Kazuto Kusama
?
PDF
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
?
PDF
Qt5 の新機能 2012/12/15
Takumi Asaki
?
PPTX
クラウドデザイン パターンに見る クラウドファーストな アプリケーション設計 Data Management編
Takekazu Omi
?
PPTX
Ruby on Rails を用いたWEBアプリケーションの開発
Koichi Shimozono
?
PDF
地味だけど剧的に便利になる骋颈迟贬耻产リポジトリ设定あれこれ
Kazumi OHIRA
?
PDF
顿辞肠办别谤た?けて?はないコンテナのはなし
Katsunori Kanda
?
PDF
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
R S
?
组み込みスクリプト言语惭谤耻产测を利用した飞别产サーバの机能拡张支援机构
Ryosuke MATSUMOTO
?
The Essence of Using Ruby on Rails in Corporations
Koichiro Ohba
?
Java in the World of Container by David Buck
オラクルエンジニア通信
?
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
Developers Summit
?
OSC 2013 .Enterprise
Katsuya Hidaka
?
Percona ServerをMySQL 5.6と5.7用に作るエンジニアリング(そしてMongoDBのヒント)
Colin Charles
?
AKS+KEDAで実現!Container Functions Pipeline
Tsukasa Kato
?
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
Koto Shigeru
?
fluentd を利用した大規模ウェブサービスのロギング
Yuichi Tateno
?
Docker事始めと最新動向 2015年6月
Emma Haruka Iwao
?
20150228冲渋谷奥别产エンジニア朝会尝罢资料
慎平 仁藤
?
Perl Ocean
Kazuki KOMORI
?
新しい翱辫别苍厂丑颈蹿迟のしくみを调へ?てみた
Kazuto Kusama
?
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらインターネット株式会社
?
Qt5 の新機能 2012/12/15
Takumi Asaki
?
クラウドデザイン パターンに見る クラウドファーストな アプリケーション設計 Data Management編
Takekazu Omi
?
Ruby on Rails を用いたWEBアプリケーションの開発
Koichi Shimozono
?
地味だけど剧的に便利になる骋颈迟贬耻产リポジトリ设定あれこれ
Kazumi OHIRA
?
顿辞肠办别谤た?けて?はないコンテナのはなし
Katsunori Kanda
?
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
R S
?
Ad

More from mametter (20)

PDF
error_highlight: User-friendly Error Diagnostics
mametter
?
PDF
TRICK 2022 Results
mametter
?
PDF
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mametter
?
PDF
Enjoy Ruby Programming in IDE and TypeProf
mametter
?
PDF
TypeProf for IDE: Enrich Development Experience without Annotations
mametter
?
PDF
Ruby 3の型解析に向けた計画
mametter
?
PDF
emruby: ブラウザで動くRuby
mametter
?
PDF
Type Profiler: Ambitious Type Inference for Ruby 3
mametter
?
PDF
Ruby 3の型推論やってます
mametter
?
PDF
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
mametter
?
PDF
A Plan towards Ruby 3 Types
mametter
?
PDF
Ruby 3 の型解析に向けた計画
mametter
?
PDF
A Type-level Ruby Interpreter for Testing and Understanding
mametter
?
PDF
Transcendental Programming in Ruby
mametter
?
PDF
Cookpad Hackarade #04: Create Your Own Interpreter
mametter
?
PDF
Ruby 3のキーワード引数について考える
mametter
?
PDF
TRICK 2018 results
mametter
?
PDF
Type Profiler: An Analysis to guess type signatures
mametter
?
PDF
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
?
PDF
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
mametter
?
error_highlight: User-friendly Error Diagnostics
mametter
?
TRICK 2022 Results
mametter
?
クックパッド春の超絶技巧パンまつり 超絶技巧プログラミング編 資料
mametter
?
Enjoy Ruby Programming in IDE and TypeProf
mametter
?
TypeProf for IDE: Enrich Development Experience without Annotations
mametter
?
Ruby 3の型解析に向けた計画
mametter
?
emruby: ブラウザで動くRuby
mametter
?
Type Profiler: Ambitious Type Inference for Ruby 3
mametter
?
Ruby 3の型推論やってます
mametter
?
A Static Type Analyzer of Untyped Ruby Code for Ruby 3
mametter
?
A Plan towards Ruby 3 Types
mametter
?
Ruby 3 の型解析に向けた計画
mametter
?
A Type-level Ruby Interpreter for Testing and Understanding
mametter
?
Transcendental Programming in Ruby
mametter
?
Cookpad Hackarade #04: Create Your Own Interpreter
mametter
?
Ruby 3のキーワード引数について考える
mametter
?
TRICK 2018 results
mametter
?
Type Profiler: An Analysis to guess type signatures
mametter
?
Esoteric, Obfuscated, Artistic Programming in Ruby
mametter
?
Cookpad Spring 1day internship 2018 超絶技巧プログラミングコース資料
mametter
?
Ad

Recently uploaded (9)

PDF
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
PDF
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
PPTX
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
PPTX
色について.pptx .
iPride Co., Ltd.
?
PDF
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
PDF
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
PPTX
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
PDF
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
PDF
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?
安尾 萌, 藤代 裕之, 松下 光範. 協調的情報トリアージにおけるコミュニケーションの影響についての検討, 第11回データ工学と情報マネジメントに関する...
Matsushita Laboratory
?
安尾 萌, 松下 光範. 環境馴致を計量可能にするための試み,人工知能学会第4回仕掛学研究会, 2018.
Matsushita Laboratory
?
勉強会_ターミナルコマント?入力迅速化_20250620. pptx. .
iPride Co., Ltd.
?
色について.pptx .
iPride Co., Ltd.
?
Forguncy 10 製品概要資料 - ノーコードWebアプリ開発プラットフォーム
フォーガンシー
?
論文紹介:AutoPrompt: Eliciting Knowledge from Language Models with Automatically ...
Toru Tamaki
?
Vibe Codingを始めよう ?Cursorを例に、ノーコードでのプログラミング体験?
iPride Co., Ltd.
?
論文紹介:Unbiasing through Textual Descriptions: Mitigating Representation Bias i...
Toru Tamaki
?
安尾 萌, 北村 茂生, 松下 光範. 災害発生時における被害状況把握を目的とした情報共有システムの基礎検討, 電子情報通信学会HCGシンポジウム2018...
Matsushita Laboratory
?

本番环境で使える実行コード记録机能

  • 2. 遠藤侑介 (@mametter) ? Rubyコミッタ ? プログラミング言語Ruby開発メンバ ? テストを中心にいろいろやってます ? フルタイムRubyコミッタ ? Ruby開発がクックパッドでの業務 w/ 笹田耕一 ? Ruby3の静的解析が主ミッション
  • 3. 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 新機能 廃止?非推奨 性能改善
  • 4. ? 終端なし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 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
  • 5. ? 終端なし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 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
  • 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 リリース クックパッドのフルタイムコミッタが主導、または深く関わった機能
  • 7. 背景:お台場プロジェクト ? クックパッドの中核サービスの アーキテクチャ改善プロジェクト ? APIサーバーのアーキテクチャ改善 ? 不要なサービスの廃止 ? デッドコードの自動検出と削除 ? ストレージ数の削減 ? 特殊な実行環境?開発環境の廃止
  • 8. 背景:お台場プロジェクト ? クックパッドの中核サービスの アーキテクチャ改善プロジェクト ? APIサーバーのアーキテクチャ改善 ? 不要なサービスの廃止 ? デッドコードの自動検出と削除 ? ストレージ数の削減 ? 特殊な実行環境?開発環境の廃止 詳しくは『クックパッド開発者ブログ – クックパッド基幹システムのmicroservices化戦略 ?お台場プロジェクト1年半の軌跡?』
  • 9. 背景:お台場プロジェクト ? クックパッドの中核サービスの アーキテクチャ改善プロジェクト ? APIサーバーのアーキテクチャ改善 ? 不要なサービスの廃止 ? デッドコードの自動検出と削除 ? ストレージ数の削減 ? 特殊な実行環境?開発環境の廃止 詳しくは『クックパッド開発者ブログ – クックパッド基幹システムのmicroservices化戦略 ?お台場プロジェクト1年半の軌跡?』
  • 10. デッドコードの削除 ? 実行されないコードを見つける ? 動的言語のRubyでは意外に大変 ? クックパッドでは、rubyインタプリタに パッチを当てて実行を記録してた(!)
  • 11. デッドコードの削除 ? 実行されないコードを見つける ? 動的言語のRubyでは意外に大変 ? クックパッドでは、rubyインタプリタに パッチを当てて実行を記録してた(!) 詳しくは『クックパッド開発者ブログ – Ruby の lazy loading の仕組みを利用して 未使用の gem を探す』
  • 12. Ruby 2.6新機能: oneshot coverage ? 実行された行番号を記録する機能 1: if 42 > 0 2: puts "used" 3: else 4: puts "unused" 5: end
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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行目が実行された
  • 17. 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行目は無意味)
  • 18. 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 新機能:本番環境での利用を目指した コードカバレッジ計測機能』
  • 19. 実装上の工夫 ? 実行記録フックのフラグが バイトコードについている ? フックが1回走ったらフラグを消す ? 2回め以降はゼロオーバーヘッド ? フラグ参照も工夫されている ? 簡潔データ構造の利用など 詳しくは『Ruby 2.5 の改善を自慢したい』 詳しくは『簡潔ビットベクトルでRubyをlog N倍速くした』
  • 20. 本当に本番環境でも使える? ? 鋭意作業中 詳しくは RubyKaigi の次の発表で…… Sangyong Sim "Cleaning up a huge ruby application"