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
動的型解析器 Ethotrace
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
すぎうり
June 23, 2026
Programming
1
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
動的型解析器 Ethotrace
すぎうり
June 23, 2026
More Decks by すぎうり
See All by すぎうり
RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~
uproad3
0
0
お前はまだRubyの 型の強さを知らない
uproad3
0
1
Rubyのメソッド解決チェーン
uproad3
0
1
お前はまだRubyの 型システムを知らない
uproad3
1
47
UdonRubyの実現可能性について
uproad3
0
18
RubyKaja 2026
uproad3
0
10
VRChatでスライドを 表示する技術
uproad3
0
30
Other Decks in Programming
See All in Programming
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
200
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.8k
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
120
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
210
えっ!!コードを読まずに開発を!?
hananouchi
0
220
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
140
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
170
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
130
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
780
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
770
フィードバックで育てるAI開発
kotaminato
1
120
Featured
See All Featured
Discover your Explorer Soul
emna__ayadi
2
1.2k
Marketing to machines
jonoalderson
1
5.6k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
The World Runs on Bad Software
bkeepers
PRO
72
12k
GitHub's CSS Performance
jonrohan
1033
470k
First, design no harm
axbom
PRO
2
1.2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Mobile First: as difficult as doing things right
swwweet
225
10k
Producing Creativity
orderedlist
PRO
348
40k
Transcript
動的型解析器 Ethotrace テストはすでに型を知っている すぎうり
自己紹介 すぎうり • Twitter:@uproad3 • Ruby歴20年 • VRChat歴7年 • 仕事:Rails |
AWS | LT芸人 • 趣味:アーキテクト | リファクタリング | 電子工作 • 言語:Ruby | C# | C | JS | ほかいろいろ • 技術:Terraform | Unity | Ubuntu | MySQL | RaspberryPi • 悲しきフルスタックエンジニア • 最近はClaudeをシバきまわしている • 特に型に強い思い入れがあるわけではない
第1章 型注釈 強制されてませんか ? TypeScript / Java / C# /
Rust … 型を書かないとコンパイルが通らない Rubyには、それがない。 ——自由だ。
第1章 Rubyには型注釈がない=自由 型注釈を書かなくていい。書いてすぐ動く。 ダックタイピング ——「each できれば何でもいい」 # 型注釈なしでも動く def process(items)
items.each { |x| puts x } end process([1, 2, 3]) # OK process("hello") # OK (each を持てば何でも) この自由さがRubyの良さ——でも、代償がある
第1章 でも、その自由の代償に —— def process(x) String Array Enumable IO 結局
何を渡せばいいのか? 何が返ってくるのか? 型注釈もドキュメントもない。 コードを上から下まで追うしかない。 String Array
第1章 見えないものは、 3つある def process(x) ① 引数 何を渡せばいい? ② 投げる例外
何がraiseしうる? ③ 外部依存 裏で何に触ってる? インターフェースが見えないから ——使い方がわからない ④ 戻り値 何が返ってくる?
第1章 "書けば"解決する。でも —— 型注釈を書けば解決する # sig { params(x: T.untyped) #
.returns(String) } def process(x) ... end RBS / Sorbet でも—— ・書くコストが高い ・既存コードへの後付けは重い ・メタプロと相性が悪い 書かずに、型情報を手に入れる方法はないか ? ——テストがすでに証拠を持っている
2章 型は"書く"のではなく "観測する" 「書く」 RBS / Sorbet 人がコードを読んで宣言する 書くコストがかかる 後付けは重い 書くコストなしには型情報が得られない
「観測する」 ethotrace テストを走らせて記録する 書かなくていい テストがあれば証拠はある テストを走らせるだけで型情報が手に入る
第2章 型には、3つの側面がある Effect-TS の Effect<Success, Error, Requirements> という捉え方を借りた (詳しいのはそのへんにいるんで後で聞いてください) Success
成功して何を返すか Error どんな失敗をしうるか Requirements 何を必要とするか 型は「引数」と「戻り値」だけじゃない ——テストで観測すればこの 3つが採れる
第2章 この"観測する手段 "、昔から持っていた eavesdrop_call——大学時代のリファクタリング研究で作ったツール テストの網羅性を測るために、prepend でメソッド呼び出しを盗み聞きしていた 当時の目的は「網羅性」——型のことは1ミリも考えていなかった Effect-TSの3側面を知って気づいた —— 網羅性のために覗いていたメソッド呼び出しは、型情報そのものだった
第2章 観察するように観測する この観測するアプローチ、名前どうしようとClaudeに相談したら—— ethogram 動物行動学の用語。動物の振る舞いを観察して記録したカタログ Rubyのオブジェクトを「観察対象の動物」と見立て、振る舞いを記録する etho(振る舞い)+trace(追跡)= ethotrace 型を"書く"んじゃない。動物を観察するように、 "観測して"手に入れる
第3章 2章で借りた 3側面、Rubyで観測するとこうなる 受け付けるもの / 返すもの 引数に何のメソッドが 呼ばれたか 何をreturnしたか 投げる例外
外に飛んでいった 例外クラス 外部依存 ENV / Time / IO … に触れたか
第3章 "何を受け付けるの ?"——第1章の問いへの答え 第1章の「このメソッド、結局何を受け付けるの?」 観測すると、答えが出ます 「each、map、size が呼ばれた」という事実が記録される 型名ではなく「呼ばれたメソッドの集合」 ——ダックタイピングの側面から見た最低限必要な型 「each
できれば何でもいい、の'何でも'に輪郭がつく」
第3章 prepend で、メソッド呼び出しを捕まえる module ArgumentTracer def process(x) # 引数に呼ばれたメソッドを記録 called
= detect_protocol(x) # x に何が呼ばれるか観測 $observations << { method: :process, args_protocol: called } super # 元のメソッドを呼ぶ end end MyClass.prepend(ArgumentTracer) 詳しくはリポジトリで: github.com/uproad/ethotrace
第3章 観測結果——引数プロトコル 整形後の観測結果(実際の出力を読みやすく表示) method: MyClass#process args: x → protocol: [:each,
:map, :size] # xに呼ばれたメソッドの集合 # = "each、map、sizeを持っていれば何でも渡せる " 「型名」ではなく「呼ばれたメソッド集合」 ——これがダックタイピングの型の実体
第3章 このメソッドは例外を投げうるか prepend の rescue で、外に飛んだ例外を捕まえる module ExceptionTracer def process(x)
super rescue => e # 外に飛んだ例外クラスを記録 $observations << { raised: e.class } raise # 再度投げる end end 「型注釈には載らない情報」 ——呼び出し元が何を rescueすべきか、観測が教えてくれる
第3章 観測結果——例外チャネル method: MyClass#process raised: - ArgumentError - Tax::RateError #
このメソッドはこれらを投げ "うる" 型注釈には普通載らない情報。 でも、呼び出し元はこれを知りたい ——何を rescue すべきかが分かる
第3章 もうひとつ ——外部依存も見える method: MyClass#process requirements: - time.read # Time.now
を呼んだ - env.read(KEY) # ENV['KEY'] を参照した # requirements が空 = 純粋なメソッド ENV・Time・IO に触れたか——「純粋かどうか」が分かる
まとめ ダックタイピングは自由、でも「何を受け付けるか」が見えなかった テストを走らせれば、その振る舞いは観測できる 受け付けるもの、返ってくるもの、投げる例外、外部依存 観察すれば見えてくる Rubyでは、振る舞いベースの型観測ができる
型は"書く"だけのものじゃない 静的型付け言語では型は「書かされるもの」。 でもRubyでは——書かなくても、テストがすでに証拠を持っている。 観察するように、観測して手に入れる。 ——こういう発想も、あるんですよ。 → https://github.com/uproad/ethotrace