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
OSSコントリビュート初体験:Rubocopのバグを修正した話
Search
5hun
July 03, 2025
Programming
55
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OSSコントリビュート初体験: Rubocopのバグを修正した話
初めてPSSコントリビュートした話です。
といっても、構文解析についての踏み込んだ話は触れていません。
初心者の方でも理解できるように作ったつもりなので、感想などいただけたら嬉しいです。
5hun
July 03, 2025
More Decks by 5hun
See All by 5hun
2026年、OSSコントリビュート初心者の歩き方 〜軽い一歩を、軽いままにしないために〜 / oss-contribution-for-beginners-2026
5hun
0
1.6k
Sine Wave By Ruby
5hun
1
63
Rubyと演奏したい〜その第一歩〜.pdf
5hun
1
77
Array#forty_two
5hun
0
87
与信管理を形にする: Ruby の柔軟性が支える高速データ収集・自動化基盤
5hun
1
370
ぼっちが秘める可能性〜孤高のRubyistが語る交流会サバイバル術〜
5hun
1
51
君もRailsもアップグレード!
5hun
1
28
完璧主義にこだわり続けるとシステム開発は不幸になると思った
5hun
0
52
地道なリファクタを続けてRspec高速化した話
5hun
0
91
Other Decks in Programming
See All in Programming
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
390
高専、大学編入、そして未踏へ〜プロダクト開発とキャリアの歩み - Technical College, University Transfer, and On to “Mitou” / My Journey in Product Development and Career
pkmiya
0
100
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
2
450
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
5
550
Go 1.27 における memory allocation の高速化
andpad
0
340
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
1.2k
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
FastAPI の並行処理モデルを完全に理解する
hoto17296
8
3.2k
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
220
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
130
初めての模倣学習とVLA
natsutan
0
320
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
650
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
What's in a price? How to price your products and services
michaelherold
247
13k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
From π to Pie charts
rasagy
0
330
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
390
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Cult of Friendly URLs
andyhume
79
7k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
500
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
550
Transcript
OSSコントリビュート初体験: Rubocopのバグを修正した話 Omotesando.rb #111
自己紹介 5hun @5hun_s アラームボックスという会社でRuby on Railsを書いています。 Ruby歴は1年と半年くらい。 趣味は音楽です。
会社紹介 アラームボックス株式会社は 与信管理という分野の会社です。 BtoBサービスを提供するSaaSの 会社です。
お客様へ、危ない企業の情報提供 反社、倒産、悪評など幅広くカバー あの会社の経営状況 はやばいわよ 代表者が 反社疑惑あり よし、あの会社と取引する のはやめとこう
取引先が倒産など、いざという時の保証 よし、安心! お金が支払われなかった 場合は 立て替えます! いわゆる、立替え払い
エンジニアの役割 ・多くの企業情報を蓄積、管理し、運用するためのシステムつくり ・企業情報を効率よく収集するためのAI活用 ・3つのメインサービス(パワーサーチ、モニタリング、ギャランティ)を利用 できる会員サイトの運用
ここから本題
お品書き ・初めてOSSコントリビュートしました ・修正したcop ・修正内容の解説
初めてOSSコントリビュートしました
初めてのissueとプルリクの提出 https://github.com/rubocop/rubocop/pull/14315
修正したcop
Style/SoleNestedConditional ネストしたif/unlessを一番外側のif文と繋げてくれます。 見ての通り、複数のネストを一発で修正してくれます。
ある日、自社プロダクトで突然のエラーが! rubocop –a コマンドを実行したら、下記のエラーが発生しました
気になったので原因と修正方法を考えてみました
修正内容の解説
その前に、今日話さないこと ・詳細なRubocopの内部構造 ・詳細な構文解析に関する専門用語の解説(パーサーとか) →それらを知らなくてもなんとなくできた!という話だと思ってください。
現状の把握(エラーの発生したコード) 2段目のネストでunlessを使っているのが ポイントです(ネタバレ)
まず、発生したエラーは何か見てみます https://github.com/whitequark/parser/blob/master/lib/parser/source/rewriter.rb ClobberingErrorが発生 しています!
エラーでググってみて、GitHubのコメントを読んでみます 上書きするような書き換え操作が行われると、Error が発生します
何か書き換える処理が重複して エラーになっていると予測。
次に、rubocopの、sole_nested_conditional.rb の実装を見てみます
スタックトレースから呼ばれている箇所を確認します 名前からして自動修 正するメソッドが呼ば れている https://github.com/rubocop/rubocop/blob/master/lib/rubocop/cop/style/sole_nested_conditional.rb
メソッドをたどり、自動修正をしている箇所を見つけました。 unlessなら!ifに 書き換える 条件ブロックを 繋げる
怪しいところは二つあると予測 ・複数のネストを一文に繋げるところでエラーになるのか ・unlessをifにする時にエラーになるのか どちらなのか検証してみます。
if/if/if はOK
つまり、 複数のネストを一文に繋げる→問題ない unlessをifにする→問題あり ということがわかりました。
ここからエラーの解説です
if/unless/if はNG 一番外側と2段目のネストが最初に修正対象として検知されます ①ここでunlessを 検知しifへ修正が 確定します
if/unless/if はNG 次に、2段目と3段目のネストが修正対象として検知されます ②ここでもunless を検知しifへ修正 が確定します
if/unless/if はNG 修正が重なり、 エラーとなる
なので、一度修正を検知した場所は 修正しないように記録しておけば良さそう
私の書いた実際の修正後のコード 他の箇所でも使われている既存の仕組みを利用して修正できました。
引数で指定されているノードとは 構文木における用語で、構文木を構成する個々の要素であり、文法の非終端記号 (例: 式、文、関数定義)や終端記号(例: 演算子、識別子、リテラル)に対応し ます。 ここでは、unless〜endのブロックを指すと思ってください。
修正後のコードが何をしているか ここでignore_nodesという 配列にセットします
修正後のコードが何をしているか ここでignore_nodesという 配列にセットします 現在修正対象のnodeが ignore_nodesに含まれているか 判定します
修正後のコードが何をしているか ノードが、unlessブロックかつ無視対象のノードでない場合のみ、 unlessをifに書き換えるようにすることで、 書き換え操作の重複を回避し、エラーも回避できるようになりました。
テストコードを作成、実行し、エラーが発生 しないことを確認し、プルリクを提出 →マージされました!
一点問題があり、マージ後にアカウント名 を変えました(Xと合ってなかった)
無慈悲な現状
今後の展望 ・仮説→検証の繰り返しをすれば、初見のコードも理解できるようになる! ・OSS活動楽しい! ・自社のRubocopを自分のコミットが含まれるv1.77まで上げる ・今の名前でなんとしてもまたコントリビュートしたい