13. 第85回Ruby関西勉強会 発表資料 「AWSコスト管理をちゃんとしたくてやったこと」
tsort の使い方 (1/3)
tsort_each_node:グラフの各ノードを巡回するメソッド
tsort_each_child:引数のノードの子ノードを順次処理するメ
ソッド
12
class AwsTSort
include TSort
def tsort_each_node
@edges.each_key do |key|
yield key
end
end
def tsort_each_child(node)
@edges.fetch(node, []).each do |child|
yield child
end
end
…
end
TSort の使用例(定義)
14. 第85回Ruby関西勉強会 発表資料 「AWSコスト管理をちゃんとしたくてやったこと」
tsortの使い方(2/3)
今回は Hash でグラフ構造を表現
tsort 自体は任意のオブジェクトを使えるが Hash が便利
Tree に見立てると、key が親、value が子の関係。
13
@edges = Hash.new{|h, key| h[key] = []}
each_tag_ebs_eni do |instance_id, tags, ebs, eni|
@edges[instance_id].push *ebs
@edges[instance_id].push *eni
…
end
each_ebs_snapshot do |volume_id, snapshot_id|
@edges[volume_id].push snapshot_id
end
each_snapshot_ami do |snapshot_id, ami_id|
@edges[snapshot_id].push ami_id
end
TSort の使用例(グラフ構造の構築)
15. 第85回Ruby関西勉強会 発表資料 「AWSコスト管理をちゃんとしたくてやったこと」
tsort の使い方 (3/3)
each_strongly_connected_component_from で、
強連結結合のノードを順に取得できる
今回の例だと、あるインスタンスを親とする子孫全部を
取り出すということができる。
14
def resources_from(start)
[].tap do |resources|
each_strongly_connected_component_from(start) do |nodes|
resources.push *nodes # nodes は Array
end
resources.delete(start)
end
end
TSort の使用例(強連結結合の取得)