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
42
0
Share
OSSコントリビュート初体験: Rubocopのバグを修正した話
初めてPSSコントリビュートした話です。
といっても、構文解析についての踏み込んだ話は触れていません。
初心者の方でも理解できるように作ったつもりなので、感想などいただけたら嬉しいです。
5hun
July 03, 2025
More Decks by 5hun
See All by 5hun
Array#forty_two
5hun
0
48
与信管理を形にする: Ruby の柔軟性が支える高速データ収集・自動化基盤
5hun
1
290
ぼっちが秘める可能性〜孤高のRubyistが語る交流会サバイバル術〜
5hun
1
39
君もRailsもアップグレード!
5hun
1
15
完璧主義にこだわり続けるとシステム開発は不幸になると思った
5hun
0
43
地道なリファクタを続けてRspec高速化した話
5hun
0
40
“技術カンファレンスで何か変わる?” ──RubyKaigi後の自分とチームを振り返る
5hun
0
250
Other Decks in Programming
See All in Programming
Offline should be the norm: building local-first apps with CRDTs & Kotlin Multiplatform
renaudmathieu
0
210
第3木曜LT会 #28
tinykitten
PRO
0
100
Radical Imagining - LIFT 2025-2027 Policy Agenda
lift1998
0
310
Alternatives to JPA 2026
debop
0
110
CursorとClaudeCodeとCodexとOpenCodeを実際に比較してみた
terisuke
1
450
VueエンジニアがReactを触って感じた_設計の違い
koukimiura
0
170
セグメントとターゲットを意識するプロポーザルの書き方 〜採択の鍵は、誰に刺すかを見極めるマーケティング戦略にある〜
m3m0r7
PRO
0
530
Kubernetes上でAgentを動かすための最新動向と押さえるべき概念まとめ
sotamaki0421
3
490
Server-Side Kotlin LT大会 vol.18 [Kotlin-lspの最新情報と Neovimのlsp設定例]
yasunori0418
1
140
AI-DLC Deep Dive
yuukiyo
8
3.7k
実践ハーネスエンジニアリング #MOSHTech
kajitack
7
6.5k
Codex CLI でつくる、Issue から merge までの開発フロー
amata1219
0
360
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
2
1.7k
Designing Experiences People Love
moore
143
24k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
53k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
200
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Discover your Explorer Soul
emna__ayadi
2
1.1k
HDC tutorial
michielstock
2
620
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
110
Bash Introduction
62gerente
615
210k
We Have a Design System, Now What?
morganepeng
55
8.1k
AI: The stuff that nobody shows you
jnunemaker
PRO
6
570
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まで上げる ・今の名前でなんとしてもまたコントリビュートしたい