Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ErdMap: Thinking about a map for Rails applicat...

makicamel
January 17, 2025

ErdMap: Thinking about a map for Rails applications

Thinking about a map for Rails applications
2025.01.17. 東京 Ruby 会議 12 前夜祭
https://github.com/makicamel/erd_map

makicamel

January 17, 2025
Tweet

More Decks by makicamel

Other Decks in Programming

Transcript

  1. Thinking about a map for Rails applications   Array#map  

    地図 今日は Rails アプリケーションの「地図」の話
  2. Rails アプリケーションのモデル あるモノリシックなリポジトリのモデル数 1,407 [^1][^2] ❯ rails stats +----------------------+---------+---------+---------+---------+-----+-------+ |

    Name | Lines | LOC | Classes | Methods | M/C | LOC/M | +----------------------+---------+---------+---------+---------+-----+-------+ | Controllers | 143687 | 112455 | 1656 | 10661 | 6 | 8 | | Models | 225756 | 161799 | 1407 | 11681 | 8 | 11 | | Views | 4136 | 3202 | 0 | 0 | 0 | 0 | | # ... | .... | .... | .... | .... | .. | .. | +----------------------+---------+---------+---------+---------+-----+-------+ | Total | 1805333 | 1434727 | 4962 | 32224 | 6 | 42 | +----------------------+---------+---------+---------+---------+-----+-------+ [^1]: rails stats なのでモジュールや PORO も含みます [^2]: 2025年1月14日時点
  3. 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
  4. 固有ベクトル中心性 networkx = PyCall.import_module("networkx") graph = networkx.Graph.new # ... graphにノードやエッジを追加

    ... centralities = networkx.eigenvector_centrality(graph) # => {ノード名: 中心性} のハッシュが返る これだけのコードで 固有ベクトル中心性が得られる
  5. Louvain 法 素の実装だとコミュニティが巨大になる場合がある 再帰的に分割を試みる def split_communities(graph, communities) # ... communities.each

    do |community| if community.size <= MAX_COMMUNITY_SIZE result << community else subgraph = graph.subgraph(community) sub_communities = networkx_community.louvain_communities(subgraph).map { |comm| PyCall::List.new(comm).to_a } # ... splitted_sub = split_communities(subgraph, sub_communities) result.concat(splitted_sub) # ... end