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
Rails アプリ地図考 Flush Cut
Search
makicamel
February 06, 2025
Programming
230
1
Share
Rails アプリ地図考 Flush Cut
makicamel
February 06, 2025
More Decks by makicamel
See All by makicamel
Road to RubyKaigi: Play Hard(ware)
makicamel
1
580
First step to PicoRuby
makicamel
2
540
PicoRuby on Rails
makicamel
4
270
Take a small step beyond the api
makicamel
2
210
Road to RubyKaigi: Making Tinny Chiptunes with Ruby
makicamel
4
1.8k
Road to RubyKaigi
makicamel
4
670
ErdMap: Thinking about a map for Rails applications
makicamel
2
4.1k
dRuby 入門者によるあなたの身近にあるdRuby 入門
makicamel
4
1.7k
BulletmarkRepairer: auto corrector for N+1 queries
makicamel
10
8.3k
Other Decks in Programming
See All in Programming
「なんか〇〇ライブラリで脆弱性あるみたいなんだけど。。。」から始める脆弱性対応 / First Steps in Vulnerability Response
mackey0225
2
130
Kingdom of the Machine
yui_knk
2
1.5k
検索設計から 推論設計への重心移動と Recall-First Retrieval
po3rin
5
1.7k
Symfony AI in Action - SymfonyLive Berlin 2026
chr_hertel
1
150
書籍「ユーザーストーリーマッピング」が私のバイブル
asumikam
4
490
Agentic UI in the Frontend: Architectures with Open Standards @JAX 2026 in Mainz
manfredsteyer
PRO
0
110
ついに来た!本格的なマルチクラウド時代の Google Cloud
maroon1st
0
440
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
840
Liberating Ruby's Parser from Lexer Hacks
ydah
2
2.7k
Back to the roots of date
jinroq
0
860
【ディップ|26年新卒研修資料】OpenAPI/Swagger REST API研修
dip_tech
PRO
0
170
AWSはOSSをどのように 考えているのか?
akihisaikeda
0
120
Featured
See All Featured
Git: the NoSQL Database
bkeepers
PRO
432
67k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.4k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Everyday Curiosity
cassininazir
0
210
A Tale of Four Properties
chriscoyier
163
24k
Testing 201, or: Great Expectations
jmmastey
46
8.1k
How to Talk to Developers About Accessibility
jct
2
200
Mobile First: as difficult as doing things right
swwweet
225
10k
Faster Mobile Websites
deanohume
310
31k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
560
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
55k
Transcript
Rails アプリ地図考 Flush Cut @makicamel Omotesando.rb #106 スポンサー LT 2025.02.06
自己紹介 @makicamel / 川原万季 Ruby とビール とお酒が好き 好きな言葉は「エイってやってバーン」 ㈱アンドパッド
東京 Ruby 会議 12 https://regional.rubykaigi.org/tokyo12
東京 Ruby 会議 12 楽しかったですね!
東京 Ruby 会議 12 前夜祭でトークもさせてもらいました https://regional.rubykaigi.org/tokyo12/talks
東京 Ruby 会議 12 今日はこのトークの LT 版 https://regional.rubykaigi.org/tokyo12/talks
東京 Ruby 会議 12 気になった方は元資料を見たり懇親会で声をかけてもらえると嬉しいです https://speakerdeck.com/makicamel/thinking-about-a-map-for-rails-applications
「地図」
地図 株式会社アンドパッド 秋葉原オフィスに初めて来た人 地図を見てきましたね
地図 道しるべ[^1] [^1]: もちろんそれ以外のたくさんの役割があります
Rails アプリの地図 アプリを歩くための道しるべがほしい
Rails アプリの地図 道しるべがないと 新しいメンバー オンボーディングで教わる以外のアプリの知識の獲得は手探り 慣れたメンバー 普段触るサービスにアプリの知識が閉じがち いつの間にか知らないドメインが増えている
Rails アプリの地図 といえば ER 図
Rails アプリの地図 全 ER 図
Rails アプリの地図 主要 ER 図の手動メンテ
つくった https://github.com/makicamel/erd_map
地図 https://www.google.com/maps ズームインすると詳細が見える ズームアウトすると全体が見通せる
ErdMap https://github.com/makicamel/erd_map ズームインすると詳細が見える ズームアウトすると概要が見える
ErdMap 最初は 3 つの"重要"なモデルのみ表示 ズームインすると次に重要なモデルを表示 重要度の高いモデルは大きく、重要度の低いモデルは小さく表示 モデルを"コミュニティ"ごとに色分け
ErdMap ErdMap づくりに必要なこと モデルの"重要"度の評価 "コミュニティ"分割
ErdMap のつくり方
ネットワーク分析
ネットワーク分析 ネットワークとは ノード(点)とエッジ(線)で構成されるデータ構造 e.g. SNS のユーザー関係 ノード: ユーザー、エッジ: フォロー関係
ネットワーク分析 Rails アプリをひとつのネットワークとして捉える ノード: モデル エッジ: 関連
ErdMap に必要なこと モデルの"重要"度の評価 "コミュニティ"分割
重要度の評価指標 次数中心性 固有ベクトル中心性 媒介中心性 etc
重要度の評価指標: 次数中心性 直接関連している他モデルの数(次数)を評価 シンプルで高速
重要度の評価指標: 固有ベクトル中心性 どれだけ重要なモデルと関連しているか[^2]を評価 次数中心性の「数」の評価に対し「質」を評価 e.g. 請求データ ユーザーや注文といった中核モデルと紐づくため固有ベクトル中心性が高い 紐づくモデルが少ないため次数中心性が低い e.g. 履歴データ
中核モデルと紐づいても関連の終端になりやすく固有ベクトル中心性が低い 多数の関連を持つため次数中心性が高い [^2]: 関連する重要モデルの数ではなく相手モデルのスコアの合計
重要度の評価指標: 媒介中心性 他のモデル間の最短経路にどれだけ頻繁に登場するかを評価 e.g. 請求データ ユーザーや注文といった中核モデルと紐づくため固有ベクトル中心性が高い 他のノード間の最短経路にあまり登場しないため媒介中心性が低い
固有ベクトル中心性のアルゴリズム
固有ベクトル中心性のアルゴリズム 初期化 すべてのノードに初期スコアを与える 1. スコアの更新 各ノードのスコアの「接続先ノードのスコアの合計」を算出し正規化する 2. 繰り返し スコアが収束するまで 2
の計算を繰り返す 3.
固有ベクトル中心性のアルゴリズム 例えば「A-B」「A-C」が接続するネットワークで考えてみる
固有ベクトル中心性のアルゴリズム 1. スコアの初期化 2. スコアの更新 スコアの算出 → 正規化
固有ベクトル中心性のアルゴリズム 3. スコアの更新の繰り返し
固有ベクトル中心性のアルゴリズム スコアの更新を繰り返すと スコアがほとんど変化しなくなり 最終的に収束する
ErdMap に必要なこと モデルの"重要"度の評価 "コミュニティ"分割
コミュニティ分割 とは?
コミュニティ分割 重要なモデルとそれに関連するモデルを知りたい ひとつのモデルはひとつの概念を表す ビジネスロジックは複数のモデルから成ることが多い
コミュニティ分割 Mastdon の Account モデルの隣接モデル 情報が多くて情報を読み取りづらい 我々はもっと細かい単位で 概念を認識しているはず
コミュニティ分割 Mastdon のモデルの Account モデルが所属するコミュニティ Accountにまつわる概念が抽出されていそう
コミュニティ分割 モデルのグループをいい感じに分割して可視化したい
コミュニティ検出 アルゴリズム Louvain 法 Girvan-Newman 法[^3] etc [^3]: Louvain法は高速、Girvan-Newman法は計算コストが高いですが、 Railsアプリのモデルデータくらいなら関係なさそうです
コミュニティ検出: Louvain 法 ネットワーク内でつながりの強いコミュニティを発見するアルゴリズム モジュラリティを最大化するようノードを移動・統合し、最適化を繰り返すこと で自然なまとまりに分割する モジュラリティ = つながりの密度
コミュニティ検出: Louvain 法 6つのノード、7つのエッジを持つネットワークがあるとする 初期状態ではすべてのノードは独立したコミュニティ
コミュニティ検出: Louvain 法 複数のノードを同じコミュニティにした場合のモジュラリティの変化を見て モジュラリティが高くなるノードグループをコミュニティとして確定する
コミュニティ検出: Louvain 法 この操作を繰り返すと以下のコミュニティに分割される
実装 自分で実装しなくていい NetworkX が提供するメソッドをコールするだけ
NetworkX ネットワーク分析用パッケージ Python 製 Rails から呼びたい NetworkX https://github.com/networkx/networkx
PyCall.rb Ruby - Python ブリッジライブラリ Python オブジェクトを Ruby から触れる Ruby
オブジェクトを Python 側に見せられる mrknさん作 PyCall https://github.com/mrkn/pycall.rb PyCall があれば Ruby で機械学習ができる https://magazine.rubyist.net/articles/0055/0055-pycall.html
固有ベクトル中心性 networkx = PyCall.import_module("networkx") graph = networkx.Graph.new # ... graphにノードやエッジを追加
... centralities = networkx.eigenvector_centrality(graph) # => {ノード名: 中心性} のハッシュが返る これだけのコードで 固有ベクトル中心性が得られる
Louvain 法 whole_communities = networkx_community .louvain_communities(whole_graph) .map { |communities| PyCall::List.new(communities).to_a
} これだけのコードで Louvain 法でコミュニティ分割できる
ErdMap デモ(Redmine の ErdMap) Redmine https://github.com/redmine/redmine Sample HTML https://github.com/makicamel/erd_map/blob/main/sample/redmine.html
ErdMap を使ってみて
ErdMap 初見の小規模アプリ(モデル数 100)の場合 重要な概念がわかる アプリの機能や構造・データフローのイメージが湧く
ErdMap 触り慣れている中規模アプリ(モデル数 1,400)の場合 発見が多い 最近こんなモデルが作られていたのか、とか 気になっていたあのモデルはこういうものだったのか、とか あのサービスの主要モデルの関連はこうなっているのか、とか
ErdMap 楽 並列に並ぶファイル名から概念や構造を見出すのは困難 重みづけされグルーピングされて可視化されているとかんたん 発見がある 最新の状態の簡易的な ER 図がいつでもそこにある 可視化面白い 見えるようにすると何かが見える(かも)
設計の改善点、ボトルネック...
Rails アプリの地図 ぜひ試してみてください https://github.com/makicamel/erd_map
Special Thanks @youchan
None
We're hiring!