entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

RubyKaigi 2023にピクシブからはsue445が登壇します&採択されたProposalを公開します

2023年5月11日〜5月13日に渡って長野県松本市で開催される RubyKaigi 2023 に、ピクシブから技術開発本部インフラ部の末吉(@sue445)が登壇します。

rubykaigi.org

Fix SQL N+1 queries with RuboCop

5月12日(2日目)に登壇予定です!

rubykaigi.org

トークの内容

1人チームでISUCONに出るために1年かけて作ったgemの話をします。

sue445.hatenablog.com

rubocopの中でSQLのASTをparseしてN+1クエリを自動修正してる辺りはかなりの面白ポイントなので、来年のRubyKaigiのCFPに応募しようと思っています。(このgemだけで1時間話せるくらいのボリュームはある)

この辺の話をします。

Proposal

実際に採択されたProposalはこちらになります。

今後Proposalを出す時の参考にしてください。

Title

Fix SQL N+1 queries with RuboCop

Abstract

ISUCON is most famous performance turning contest in Japan. https://isucon.net/

I created https://github.com/sue445/rubocop-isucon for ISUCON. This gem automatically modifies SQL N+1 queries with RuboCop.

I'll talk about why I did this CRAZY thing and the technology it took to do this.

Details

https://github.com/sue445/rubocop-isucon (ISUCONのRubyの参照実装を自動で改善するcop)についての話をします。

このgemはISUCON11の予選敗退直後(2021年8月)に作り始めてISUCON12(2022年7月開催)の予選に実戦投入しています。(開発期間は約1年)

https://sue445.hatenablog.com/entry/2022/07/24/190412

トークのメインテーマは「SQLのN+1クエリをRoboCopで自動修正する」ですが、そこに至るまでの長い道のりを順序立てて話したり、N+1修正以外で作ったrubcop-isuconのcopの紹介をしたいと思ってます。

RuboCopといえば通常Rubyのソースコードをパースして Ruby のASTを取得し、そのASTを元に特定のルールに基づいた違反の検出やソースコードの自動修正(auto correct)を行う用途で利用されることが多いでしょう。

しかしrubocop-isuconではRubyのASTだけにとどまらずSQL文字列もパースして SQL のASTを取得し、それをRuboCop内での違反検出やauto correctに利用しています。

具体的には

  • copからDBに接続して実際のDBのスキーマ情報を取得し、それをcop内の解析で利用
    • 例:indexがついてないカラムをWHERE句で使ってたらcopで検知
  • RubyでSQL文字列をパースしてSQLのASTを取得する
    • いくつかライブラリを比較検討して最終的に https://github.com/tenderlove/gda にいきついたけど、アーロン製のgemというのも面白ポイントの1つ
  • SQLのASTをRubyの世界に持っていく。 (ASTの異世界転生)
    • RuboCopで扱うASTのnodeにはRubyのソースコード内の位置情報が含まれており、RuboCopはこれをもとにauto correctを行っている
    • しかしlibgdaで取得したSQLのASTのnodeには位置情報が含まれていないため、SQLのASTのnodeは自分自身がSQL文字列中のどこに位置しているかを知ることができない
    • そのため、SQLのASTの各nodeに位置情報を付与する仕組みを作成し、RuboCopのauto correctで利用できるようにした
  • RoboCopでauto correctしやすいN+1クエリについて

辺りが技術的に面白いのではと思ってます。

社内勉強会で発表した下記資料がベースになりますが、1年以上前の資料なので大幅に加筆修正が入ると思います。

  • (注:ここに社内勉強会で発表した資料のURLを貼ってたが不特定多数に公開する用途ではないので削除)

Pitch

箇条書きで書くとだいたいこんな感じです。

  • 昨今のウェブアプリケーションではなんらかのRDBの恩恵に預かってることが多いため聴講者にとっては身近なテーマ
  • 静的解析というアプローチからパフォーマンスチューニングに挑んでる事例はあまりない
  • 世の中にカスタムcopはたくさんあるが、copの中からDBに接続したりSQLをパースするというcopはおそらく他に存在しない
    • 少なくとも自分は見つけられなかった
    • そもそもRubyでSQLのASTを扱う事例があまりない

Detailsに書いたようにrubocop-isuconは技術的な面白ポイントを色々盛り込んでいるので、このトークを聞いた人に明日から使える面白copネタを持ち帰ってもらいたいと思っています。

補足

TitleとAbstractはサイトに公開されるものなので全て英語で記載してますが、Details(発表のテーマや流れ)とPitch(このCFPを採択すべき理由やアピール文)に関してはレビュアーしか見ないものなので日本語で記載しています。

【おまけ】Proposalの書き方の参考リンク

hsbtさんのエントリが参考になります。

www.hsbt.org

あとはググると実際に採択されたProposalがいくつか見つかるのでそれを読むのもいいです。

【宣伝】Music Event SponsorとしてRubyMusicMixin 2023を開催します

ピクシブは音楽中心懇親会 RubyMusicMixin 2023 を5月13日(土)の夜に開催します。スピーカーのsue445も参加予定ですので、発表を聞いてより詳しく話を聞いてみたい!と思った方はぜひお越しください。

日時: 2023年5月13日(土)20:00 - 26:00

場所: Bar & Lounge GNU

住所: 長野県松本市 深志 1-2-15 センチュリーマキシムビル 4階

  • 参加登録は不要です
  • RubyKaigi 2023 の名札をお持ちください。入場時にチェックを行います
  • 入場料は無料です。フード、ドリンク代は別にかかります。ドリンク無料チケットを入場時に配布予定です

inside.pixiv.blog

20191219021925
sue445
2018年7月に中途入社。CIおじさん。好きな言葉は「全ての手作業を自動化」。 好きなアニメは女児アニメ全般(プリキュア・プリティーシリーズ・アイカツ)とサザエさん。 多数のgemをOSSで公開 https://rubygems.org/profiles/sue445 。代表作はプリキュアのRuby実装のrubicure (https://github.com/sue445/rubicure)
20191219010152
alitaso
2018年4月入社。Ruby/Railsを使ってpixivコミックの開発に携わっています。好きな野球グラブはウイルソン A2000 1786型 です。