SlideShare a Scribd company logo
つながりをゆるふわにしよう	

ActiveSupport::Notifications
2013-11-02 広島Ruby勉強会 #035
Rails のコードリーディング

• コード読んでるので毎月ピックアップ
• http://railsdoc.eiel.info/
• 今回は ActiveSupport::Notifications
ActiveSupport::Notifications

• 通知を実現するためのクラス
• オブジェクト間を緩い繋りに
オブジェクトの繋り

• オブジェクトはメッセージで繋る
• メッセージを送る方法
• メソッドの呼び出し
オブジェクトの繋り
• 直接メソッド呼び出し
• 繋りが強い
• ちょっと回り道をする
• 繋りを緩くできる
どうして緩くしたいか

• 変更箇所を減らしたい
• 本質と関係ないものを分離
どうして通知が欲しいかみていく

• 普通の呼び出し
• 処理を後から登録
• 通知を使う
普通の呼び出し

• 強い繋り
• 1対1の繋り
普通の呼び出し

作る
a

b

メソッドを呼ぶ
問題点

• 後から処理を追加するのに
• コードの変更が必要
例
class A
def hoge
# hogeする
end
end
!
a = A.new
a.hoge
a を hoge するときに b.hoge して
欲しい
例
class B
def hoge
# B hoge する
end
end

!
class A
def hoge
# hoge する
B.new.hoge
end
end
さらに追加したくなった
例
class B
def hoge
# B hoge する
end
end

!
class A
def hoge
# hoge する
B.new.hoge
B.new.hoge
end
end
Aを変更しなきゃいけない
Aが変えたくない場合がある

• Aがライブラリやフレームワーク
• 完成しているので変えられない
• Aが自分が作ったBを知ってるわけがない
処理を後から登録する

• 少し弱くなった繋り
• 1対多の繋り
処理を後から登録する

• ルールを決める
• オブジェクトを登録できるように
• 決めたメソッドを呼ぶ
処理を後から登録する
オブジェクトを登録

b

b

a

メソッドを呼ぶ

b

b

0個からn個
例
class A
def hoge
# hoge する
objects.each do |object|
object.hoge
end
end

!
def objects
@objects ||= []
end
end

!
a = A.new
a.hoge
b.hoge を追加したい
例

a = A.new
a.objects << B.new
a.hoge
Aの外側で
Aに処理を追加できる
問題点

• b を追加するのに a を知ってる必要がある
• オブジェクトへの参照が必要
通知を使う

• 文字列で繋りを作る
• だいぶ ゆるふわ
• 多対多の繋り
通知を使う
• 通知を呼び出す側
• 相手のことを意識する必要がない
• 呼ばれる側
• 相手のことを意識する必要がない
処理を後から登録する
登録しておく

b

a
処理をお願いする 通知システム
b

a

b
メソッドを呼ぶ
b
通知システムを経由することで
a と b の直接的な繋りを無くせる
代わりに
通知システムに
強い繋りが
具体例
class Notifications
@@regists = Hash.new([])

!
def self.regist(key,object)
@@regists[key] << object
end

!
def self.notify(key)
@@regists[key].each do |object|
object.hoge
end
end
end
具体例

# 通知 hoge があったときにすることを登録
Notifications.regist(‘hoge’, B.new)
!
# 通知 hoge を発生させる
Notifications.notify(‘hoge’)
ActiveSupport::Notifications

• Rails で通知を使うためのクラス
• Rails 3 で追加
• Developmentモードで
• HTMLの生成時間と
• SQLの実行時間
ActiveSupport::Notifications

• やりすぎ注意
• 処理の流れを明確にしたいところでは
使わないように

• Rails の中にも通知ポイントがある
使い方
• 通知の仕方
• ActiveSupport::Notifications.instrument
• 処理の登録
• ActiveSupport::Notifications.subscribe
通知の仕方
• 後で処理を追加したくなりそうだなー。
• ActiveSupport::

Notifications.instrument(name, payload)

• name
• 処理を登録する時に使う名前
• payload
• 登録した処理に渡す追加情報
処理の登録
• ActiveSupport::

Notifications.subscribe(pattern,&block)

• pattern
• 通知のした際の name
• 正規表現が使える
• block
• したい処理
pattern
• pattern には正規表現が
• /hoge/ であれば
• instrument の name が
• hoge.mogu
• mogu.hoge
• でも実行される
block
• block の中で使える情報
• name
• start
• finish
• id
• payload
name

• Notifications.instrument した時の引数
• pattern で指定しているので

正確な名前が欲しい時に
例
require ‘active_support/notifications’

!
include ActiveSupport

!
Notifications.subscribe(/hoge/) do |name|
puts name
end

!
Notifications.instrument(“hoge.goro”)
Notifications.instrument(“goro.hoge”)
# >> hoge.goro
# >> goro.hoge
start finish
• instrument側の

処理の時間を測定できる

• 始めの時間と終わりの時間
• instrumentする際にブロックを使う
例
require ‘active_support/notifications’

!
include ActiveSupport
Notifications.subscribe(/hoge/) do |name, start, finish|
p [start, finish]
end

!
Notifications.instrument(“hoge”) do
sleep(1)
end
# >> [2013-11-01 15:54:13 +0900, 2013-11-01 15:54:14
+0900]
id

• 通知システム内の通知者のID
• スレッドごとに変化する
• (別に知らなくて良い気がする)
例
require ‘active_support/notifications’
require ‘thread’

!
include ActiveSupport
Notifications.subscribe(‘hoge’) do |name, s, f, id|
p [name, id]
end

!
Notifications.instrument(‘hoge’)
Notifications.instrument(‘hoge’)
Thread.new { Notifications.instrument(‘hoge’) }.run
例 結果

["hoge", "8c71812749ca24e5a40e"]
["hoge", "8c71812749ca24e5a40e"]
["hoge", "c1050d011fe625537e41"]
payload

• メソッドのように引数を使いたい
例
require ‘active_support/notifications’

!
include ActiveSupport
Notifications.subscribe(‘hoge’) do |n, s, f, i, payload|
p payload
end

!
Notifications.instrument(‘hoge’, :hoge)
Notifications.instrument(‘hoge’,{hoge: 1})
# >> :hoge
# >> {:hoge => 1}
より深いどうでもいいところ

• ActiveSupport::Notifications::Instrumenter
• 通知処理を実質的にしているクラス
• スレッド毎に存在
より深いどうでもいいところ
• ActiveSupport::Notifications::Fanout
• 登録した処理を管理しているところ
• ActiveSupport::Notifications::Fanout::Subscribers
• 処理はこのモジュールの中にあるクラスのいずれかに
ラップされる

• finish がいるかどうかとかで区分される
• 呼ばれる予定処理を確認したりもできる
ご清聴ありがとうございました

More Related Content

More from Tomohiko Himura

OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島
Tomohiko Himura
 
Rails プロジェクトでスタートダッシュを決める
Rails プロジェクトでスタートダッシュを決めるRails プロジェクトでスタートダッシュを決める
Rails プロジェクトでスタートダッシュを決める
Tomohiko Himura
 
すごい cron ? - Jenkins 試した
すごい cron ? - Jenkins 試したすごい cron ? - Jenkins 試した
すごい cron ? - Jenkins 試した
Tomohiko Himura
 
すごい広島
すごい広島すごい広島
すごい広島
Tomohiko Himura
 
やりなおせる Git 入門
やりなおせる Git 入門やりなおせる Git 入門
やりなおせる Git 入門
Tomohiko Himura
 
すごい Hiroshima で楽しく学ぼう
すごい Hiroshima で楽しく学ぼうすごい Hiroshima で楽しく学ぼう
すごい Hiroshima で楽しく学ぼう
Tomohiko Himura
 
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
Tomohiko Himura
 
Mac OS X のパッケージ管理紹介/比較
Mac OS X のパッケージ管理紹介/比較Mac OS X のパッケージ管理紹介/比較
Mac OS X のパッケージ管理紹介/比較
Tomohiko Himura
 
軽量マークアップ言語で気楽にマークアップ
軽量マークアップ言語で気楽にマークアップ軽量マークアップ言語で気楽にマークアップ
軽量マークアップ言語で気楽にマークアップ
Tomohiko Himura
 
Hakyllで遊んでみた。
Hakyllで遊んでみた。Hakyllで遊んでみた。
Hakyllで遊んでみた。
Tomohiko Himura
 
Liquid の紹介
Liquid の紹介Liquid の紹介
Liquid の紹介
Tomohiko Himura
 
Git 仕組み 入門
Git 仕組み 入門Git 仕組み 入門
Git 仕組み 入門
Tomohiko Himura
 
Rails Guide 翻訳しようぜ。
Rails Guide 翻訳しようぜ。Rails Guide 翻訳しようぜ。
Rails Guide 翻訳しようぜ。
Tomohiko Himura
 
OSC 2012 HIROSHIMA
OSC 2012 HIROSHIMAOSC 2012 HIROSHIMA
OSC 2012 HIROSHIMA
Tomohiko Himura
 
SNS 「github」で遊ぼう
SNS 「github」で遊ぼうSNS 「github」で遊ぼう
SNS 「github」で遊ぼう
Tomohiko Himura
 
Hiroshima.rb on github
Hiroshima.rb on githubHiroshima.rb on github
Hiroshima.rb on github
Tomohiko Himura
 
日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github
Tomohiko Himura
 
Augmの裏側
Augmの裏側Augmの裏側
Augmの裏側
Tomohiko Himura
 

More from Tomohiko Himura (20)

OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島OSC2013 HIROSHIMA ライトニングトーク すごい広島
OSC2013 HIROSHIMA ライトニングトーク すごい広島
 
Rails プロジェクトでスタートダッシュを決める
Rails プロジェクトでスタートダッシュを決めるRails プロジェクトでスタートダッシュを決める
Rails プロジェクトでスタートダッシュを決める
 
すごい cron ? - Jenkins 試した
すごい cron ? - Jenkins 試したすごい cron ? - Jenkins 試した
すごい cron ? - Jenkins 試した
 
すごい広島
すごい広島すごい広島
すごい広島
 
やりなおせる Git 入門
やりなおせる Git 入門やりなおせる Git 入門
やりなおせる Git 入門
 
すごい Hiroshima で楽しく学ぼう
すごい Hiroshima で楽しく学ぼうすごい Hiroshima で楽しく学ぼう
すごい Hiroshima で楽しく学ぼう
 
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
黒い画面入門 + パッケージ管理紹介 + Macの使い方とか
 
Mac OS X のパッケージ管理紹介/比較
Mac OS X のパッケージ管理紹介/比較Mac OS X のパッケージ管理紹介/比較
Mac OS X のパッケージ管理紹介/比較
 
軽量マークアップ言語で気楽にマークアップ
軽量マークアップ言語で気楽にマークアップ軽量マークアップ言語で気楽にマークアップ
軽量マークアップ言語で気楽にマークアップ
 
Hakyllで遊んでみた。
Hakyllで遊んでみた。Hakyllで遊んでみた。
Hakyllで遊んでみた。
 
Liquid の紹介
Liquid の紹介Liquid の紹介
Liquid の紹介
 
Git 仕組み 入門
Git 仕組み 入門Git 仕組み 入門
Git 仕組み 入門
 
Rails Guide 翻訳しようぜ。
Rails Guide 翻訳しようぜ。Rails Guide 翻訳しようぜ。
Rails Guide 翻訳しようぜ。
 
Hiroshimarb 027-fiber
Hiroshimarb 027-fiberHiroshimarb 027-fiber
Hiroshimarb 027-fiber
 
Hiroshimarb 027-fiber
Hiroshimarb 027-fiberHiroshimarb 027-fiber
Hiroshimarb 027-fiber
 
OSC 2012 HIROSHIMA
OSC 2012 HIROSHIMAOSC 2012 HIROSHIMA
OSC 2012 HIROSHIMA
 
SNS 「github」で遊ぼう
SNS 「github」で遊ぼうSNS 「github」で遊ぼう
SNS 「github」で遊ぼう
 
Hiroshima.rb on github
Hiroshima.rb on githubHiroshima.rb on github
Hiroshima.rb on github
 
日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github日本androidの会 中国支部 29回勉強会 github
日本androidの会 中国支部 29回勉強会 github
 
Augmの裏側
Augmの裏側Augmの裏側
Augmの裏側
 

Recently uploaded

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
Takayuki Nakayama
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
t m
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
Toru Tamaki
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
harmonylab
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 

Recently uploaded (9)

キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援しますキンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
キンドリル ネットワークアセスメントサービスご紹介 今のネットワーク環境は大丈夫? 調査〜対策までご支援します
 
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
遺伝的アルゴリズムと知識蒸留による大規模言語モデル(LLM)の学習とハイパーパラメータ最適化
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
論文紹介:Deep Learning-Based Human Pose Estimation: A Survey
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
Generating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language ModelsGenerating Automatic Feedback on UI Mockups with Large Language Models
Generating Automatic Feedback on UI Mockups with Large Language Models
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 

つながりをゆるふわにしよう Active supprt notifications