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
OSSコントリビュート初体験:Rubocopのバグを修正した話
Search
5hun
July 03, 2025
Programming
58
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
66
Rubyと演奏したい〜その第一歩〜.pdf
5hun
1
80
Array#forty_two
5hun
0
90
与信管理を形にする: Ruby の柔軟性が支える高速データ収集・自動化基盤
5hun
1
390
ぼっちが秘める可能性〜孤高のRubyistが語る交流会サバイバル術〜
5hun
1
52
君もRailsもアップグレード!
5hun
1
29
完璧主義にこだわり続けるとシステム開発は不幸になると思った
5hun
0
53
地道なリファクタを続けてRspec高速化した話
5hun
0
94
Other Decks in Programming
See All in Programming
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
550
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
1.9k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
400
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
590
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
120
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
260
Jetpack Compose メカニズム
skydoves
0
430
アクセシビリティから考える情報設計
high_g_engineer
0
380
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
720
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
410
Featured
See All Featured
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
510
Building AI with AI
inesmontani
PRO
1
1.2k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Embracing the Ebb and Flow
colly
88
5.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Building an army of robots
kneath
307
46k
How GitHub (no longer) Works
holman
316
150k
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まで上げる ・今の名前でなんとしてもまたコントリビュートしたい