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
RxJS, mixpanelで実装するSPAの行動分析基盤
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yosuke Kurami
November 02, 2017
Programming
600
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RxJS, mixpanelで実装するSPAの行動分析基盤
Yosuke Kurami
November 02, 2017
More Decks by Yosuke Kurami
See All by Yosuke Kurami
TypeScript LSP の今までとこれから
quramy
1
2k
フロントエンドテストの育て方
quramy
12
3.8k
App Router 悲喜交々
quramy
8
730
上手に付き合うコンポーネントテスト
quramy
6
2.3k
Patched fetch did not work
quramy
6
780
GraphQL あるいは React における自律的なデータ取得について
quramy
18
5.8k
Next.js App Router
quramy
15
3.9k
Fragment Composition of GraphQL
quramy
17
4.8k
reg-viz VRT tools
quramy
4
1.7k
Other Decks in Programming
See All in Programming
AI時代のUIはどこへ行く?その2!
yusukebe
21
7k
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
150
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
490
RTSPクライアントを自作してみた話
simotin13
0
520
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
Webフレームワークの ベンチマークについて
yusukebe
0
160
Signal Forms: Beyond the Basics @ngBaguette 2026 in Paris
manfredsteyer
PRO
0
240
Swiftのレキシカルスコープ管理
kntkymt
0
220
CSC307 Lecture 17
javiergs
PRO
0
320
Modding RubyKaigi for Myself
yui_knk
0
920
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
780
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
160
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The Language of Interfaces
destraynor
162
27k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Become a Pro
speakerdeck
PRO
31
6k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
140
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Raft: Consensus for Rubyists
vanstee
141
7.5k
Test your architecture with Archunit
thirion
1
2.3k
Transcript
3Y+4 NJYQBOFMͰ࣮͢Δ41"ͷߦಈੳج൫ :PTVLF,VSBNJ !2VSBNZ 1
"CPVUNF
w 2VSBNZ UXJUUFS(JU)VC2JJUB ͱ͍͍·͢ w OHKBQBOͷελοϑͯ͠·͢ w IUUQTMBDLJOWJUFOHKBQBOPSH w "OHVMBS
5ZQF4DSJQU 7JNΛภѪ͍ͯ͠·͢ ࣗݾհ
ձࣾαʔϏεհ
"*ΞφϦετ w IUUQTXBDVMBJDPN
"*ΞφϦετ w (PPHMF"OBMZUJDTͷσʔλΛݩʹɺ8FCαΠτͷվળҊΛ ఏҊ w ྫɿʮಛఆͷϖʔδΛݟΔͱ$73͕ஶ͘͠ѱ͘ͳΔʯ w 8FCϚʔέλʔ ཧళ͞Μ͚ʹͬͯΒ͏ͨΊͷ##
4BB4 w "OHVMBSWʹΑΔ41"
ࠓͷςʔϚ
41"͕ͲͷΑ͏ʹΘΕͯΔ͔Γ͍ͨ
σʔλΛݩʹվળΛݟ͚ͭΔ
NJYQBOFM w Ϣʔβʔ୯ҐͷΠϕϯτΛࡉ͔͘औಘɾੳͰ͖Δ
NJYQBOFMͷಛ w NJYQBOFMUSBDL ʜ ͰҙͷΠϕϯτΛૹ৴Ͱ͖Δ w σʔλΛ"1*ͰFYQPSUͰ͖Δ w #JH2VFSZʹJNQPSU w
ଞͷσʔλιʔε %# ͱΘͤͯɺ3FEBTIͰΫΤϦΛ ࡞Γɺ༷ʑͳ࣠Ͱੳ͕Ͱ͖Δ
ͲͷΑ͏ʹૹ৴͢ΕΑ͍͔ʁ
ϢʔβʔΠϕϯτͷநԽ w 41"Ͱ༷ʑͳʮΠϕϯτʯ͕ൃੜ͢Δ w %0.Πϕϯτ ϑΥʔϜͷೖྗ ϘλϯΫϦοΫ w ϧʔλʔʹΑΔը໘ભҠ
w ϞʔμϧΞϥʔτͷ։ด w Ϗδωεཁ݅తͳ ίϯόʔδϣϯΠϕϯτ w FUDʜ
ΠϕϯτͷநԽ w ΠϕϯτͷൃੜՕॴຖʹNJYQBOFMͷૹ৴Λॻ͘ͷɺ ॲཧͷݟཱ͕ͯѱ͘ͳΔ w ͦ͜ͰɺΠϕϯτΛ3YKTͷετϦʔϜͱͯ͠நԽ w ͜ͷετϦʔϜΛ4VCTDSJCFͯ͠.JYQBOFMૹ৴ w 3YKT࣌ؒͰൃੜ͢ΔΠϕϯτΛநతʹѻ͏͜ͱʹಛԽ͠
ͨϥΠϒϥϦ
ࢀߟʹͨ͠Ϟσϧ ҰൠతͳQVCTVCϞσϧ w SYKT͕ΈΛఏڙͯ͘͠ΕΔ -PH+ͳͲͰݟΒΕΔΧςΰϦઃܭ w lVJz w
lVJCVUUPOz w lVJCVUUPODMJDLz
this.ngZone.runOutsideAngular(() => { if (e && e["__pushed__"]) return; if (e)
e["__pushed__"] = true; const element = this.elemRef.nativeElement as HTMLElement; const value = element.textContent; const typeAttr = element.getAttribute("type"); const kindAttr = element.getAttribute("kind"); const iconAttr = element.getAttribute("iconKind"); const activity = createActivity(element, { categorySuffix: "button", action: "click", value, }); if (typeAttr) activity.label += `[type='${typeAttr}']`; if (kindAttr) activity.label += `[kind='${kindAttr}']`; if (iconAttr) activity.label += `[iconKind='${iconAttr}']`; this.accumulator.push(activity); }); 1VCMJTI&WFOUT
Observable.merge( activities .filterCategorizedActivity("ui.router") .filter(({ action }) => action === "navigationEnd")
.debounceTime(100), activities .filterCategorizedActivity("ui.root", { exclude: true }) .filterCategorizedActivity("ui.router", { exclude: true }) ) .mapFlattenData() .subscribe(({ action, category, ...rest }) => mixpanel.track(`${category}.${action}`, rest)) ; 4VCTDSJCF&WFOUT
ΠϕϯτநԽͷϝϦοτ w ΠϕϯτͷநԽʹΑΓɺૹ৴ίʔυΛՃ͢Δ͚ͩͰɺଞ αʔϏεͷ࿈ܞ͕Մೳɻ w FYɿྫ֎ൃੜ࣌ʹɺൃੜͨ͠Πϕϯτͷۙ݅ΛΤϥʔ τϥοΩϯάαʔϏε4FOUSZૹ৴ ܽམ͢Δ͜ͱʜ
4VNNBSZ
·ͱΊ w NJYQBOFM͍͍ͧ w #JH2VFSZ͍͍ͧ w 3Y+4͍͍ͧ w "OHVMBS͍͍ͧ
5IBOLZPV