Published on August 2, 2017
Author: techblogyahoo
Source: slideshare.net
1. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 2017年7月19日 1 松本 誠義 ヤフーのロギングSDKの挑戦 〜データドリブン企業を目指して〜
2. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. データ&サイエンスソリューション統括本部 データプラットフォーム本部 開発4部 データセンサー1 入社:2016年 新卒 担当:iOS 趣味:海釣り 松本 誠義 自己紹介 2
3. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アジェンダ 背景:ロギングSDKのこれまで 課題:ロギングSDKの課題 展望:自動ロギングの実現に向けて 3 テーマ「データ収集」
4. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 背景 ロギングSDKのこれまで
5. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. トップメッセージより ヤフーは世界でもユニークな マルチビッグデータカンパニーです トップメッセージ https://about.yahoo.co.jp/info/message/
6. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ユーザー規模 6 9,000万1日 ユニーク ブラウザ ※出所:Yahoo! JAPAN社内データ(2016年4月-6月の平均)
7. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 提供サービス 7 Media US Search Video Answer Mail JP US JP Membership C2C Payment C2C EC B2C EC Local
8. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 様々なデータセット 8 検索 EC 金融 メッセージングサービス 地図、カーナビ 興味のある言葉 買ったもの ユーザーの資産 自然言語 位置情報
9. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. データ利活用のサイクルを回したい 9 サービスや 機能を提供 データがたまる データから 気づきを得る インサイト ユーザー データ
10. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギングSDK Key-ValueのシンプルI/F • ヘルスチェック • サービス改善 ほぼ全てのサービスに導入完了 iOS, Android, Webに対応
11. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 全社のデータ利活用 各サービス毎にデータを利活用できている 11 でも、まだまだ課題が…。
12. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 課題 ロギングSDKの課題
13. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. データ利活用のボトルネック SDKの課題 • サービスの実装が大変 • 集めたデータの整合性がとれない 13
14. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 14 サービスの実装が大変 SDKで提供している機能 その結果。。。 送りたいログは大量 セッション管理 Key-Valueのログ送信I/F ロギングのための実装が多い ラッパーライブラリが必須 SDK Wrapper • インスタンス管理 • ログ送信の最適化
15. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 集めたデータの整合性がとれない 15 Button1 Button1, 2 画面外含む ログ取得のタイミング 画面に入った時 例. 要素の表示 Button 1 Button 2 Button 1 サービスごとにログの意味合いが異なる サービスA サービスB
16. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 原因 • サービス側の実装が大変 • 集めたデータの整合性がとれない 16 ログ取得のI/Fだけを提供 共通のパラメータは自動化すべき
17. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 展望 自動ロギングの実現に向けて
18. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自動化の対象 18 サービス独自のイベントロギング サービス共通のロギング項目 • 要素の表示 • 要素に対するClick
19. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 19 自動ロギングとロギング実装の工数 Before: After: サービスのロギングに割く工数が激減! 画面の表示 パラメータの指定 送信処理 要素の追加 パラメータの指定 送信処理 Clickイベント パラメータの指定 送信処理 パラメータの指定要素生成時
20. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自動ロギングとデータの整合性 20 データの整合性が取れるようになる Button 1 Button 2 Button 1 サービスA サービスB SDK SDK Button1 Button1 自動ロギング 自動ロギング
21. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. データ利活用のボトルネック解消へ 21 SDKの課題 • 実装が大変 • 集めたデータの整合性がとれない 自動ロギング導入 • サービスのロギングに割く工数が激減 • データの整合性が取れるようになる
22. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 要素の表示とClickの自動化処理 どのように実現したか
23. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 自動化後のサービス側のロギング実装 23 Button 1 Button 2 Button 1 Button 2 対象: YES 対象: YES 対象: YES ロギング対象の指定 要素が画面に表示された 要素が非表示になった ButtonがClickされた ロギング対象指定のI/F ロギング対象の監視・判定処理 自動ロギング
24. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. どのように実現したか(1/2) ロギング対象指定のI/F
25. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギング対象指定のI/F 25 image1.isTarget = YES; button1.isTarget = YES; 目指す形:ロギング対象の各要素にフラグをセット 要素のsuperクラスを拡張してプロパティを追加する UIView UIButton UIImage UIView+Sample.h/m @property (nonatomic) BOOL isTarget;
26. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. iOS: カテゴリで値を保持する 26 @dynamicプロパティのアクセサでget/setする @dynamic isTarget; - (BOOL)isTarget { NSNumber *boolNumber = objc_getAssociatedObject(self, @selector(isTarget)); return [boolNumber boolValue]; } - (void)setIsTarget:(BOOL)isTarget { objc_setAssociatedObject(self, @selector(isTarget), [NSNumber numberWithBool:isTarget], OBJC_ASSOCIATION_RETAIN); } id objc_getAssociatedObject(id object, const void *key); void objc_setAssociatedObject(id object, const void *key, id value, policy); #import <objc/runtime.h> AssociatedObjectの利用
27. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギング対象を指定できるようになった 27 Button 1 Button 2 対象: YES 対象: YES 対象: YES id: img1 id: btn1 id: btn2 同様に任意のパラメータの設定も可能
28. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. どのように実現したか(2/2) ロギング対象の監視・判定処理
29. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギング対象の監視・判定 29 Button 1 Button 2 可視 可視 不可視 Button 1 Button 2 不可視 可視 可視 View-out View-in スクロール 判定結果 監視
30. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギング対象の監視 ↓ ロギング実施の判定処理
31. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 監視に利用できそうな技術 ポーリング 一定時間ごとに処理を実行 イベントのフック イベント発生ごとに処理を実行 31
32. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. アプリの状態遷移に関わるイベント 32 イベント iOSの場合 画面の描画が完了 viewDidAppear 現在の画面が非表示になった viewDidDisappear スクロールされた scrollViewDidScroll アクションの送信(click等) sendAction
33. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. なぜフックするのか 33 イベント実装メソッド サービス側の実装 画面の遷移など ロギング処理 サービス側で ロギング実装の必要あり
34. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. イベントハンドラのフック 34 ロギング処理 サービス側の実装 画面の遷移など イベント実装メソッド ロギング処理を 差し込みたい
35. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Method Swizzling(iOS) 35 ロギング処理 scrollViewDidScroll scrollWithLogging scrollWithLogging サービスの実装 メソッドの処理を入れ替える仕組み
36. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Method Swizzling(iOS) 36 scrollViewDidScroll scrollWithLogging ロギング処理 scrollWithLogging サービスの実装 IMP class_replaceMethod( Class cls, SEL name, IMP imp, const char *types ); 元scrollWithLogging 元scrollViewDidScroll
37. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 状態変化の監視 37 可視状態を要素に保持し、判定の度に比較 Button 1 Button 2 Button 1 Button 2 Button 1 Button 1 Button 2 View-in View-out 例:スクロールの監視時
38. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. ロギング対象の監視 ↓ ロギング実施の判定処理
39. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 可視状態の判定 1. ロギング対象の探索 2. 座標の変換 3. 領域の判定 39 Button 1 Button 2
40. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. window&screen 1. ロギング対象の探索 40 Button 1 Button 2 YES YES YES root view scroll view for (UIView *subView in rootView.subviews) { if (subView.isTarget) { ... rootview起点にsubviewを走査 ※前提:windowとscreenが同サイズ
41. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 2. 座標の変換 41 window&screen Button 1 Button 2 root view scroll view YES YES YES CGRect rectInWindow = [subview convertRect:subview.bounds toView:nil]; 対象viewの座標をWindow座標系に変換
42. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 3. 領域の判定 42 window&screen Button 1 Button 2 root view scroll view YES YES YES 可視 可視 不可視 CGRectIntersectsRect(window.bounds, rectInWindow) 対象viewの座標がwindow内に含まれるか判定
43. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 実装完了 43 ロギング対象指定のI/F ロギング対象の監視・判定処理 自動ロギング実現に必要な実装
44. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. Button 1 Button 2 組込みテストの結果 44 Button 1 Button 2 Button 1 Button 2 View-out View-inButton 1 Button 2 この間、サービス側の実装はゼロ
45. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. 組込みテストの結果 45 Button 1 Button 2 View-out Click Button 1 Button 2 Text 1 この間、サービス側の実装はゼロ View-out View-in View-in
46. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ
47. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まとめ データドリブン実現に向けたSDKの課題 • 実装が大変 • データの整合性がとれない 自動ロギングでボトルネックの解消
48. Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved.Copyrig ht © 2017 Yahoo Japan Corporation. All Rig hts Reserved. まだtrial&error。 挑戦は続きます。