Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Firestoreを利用したMAPアプリの開発について
Search
DaikiOKA
August 22, 2019
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Firestoreを利用したMAPアプリの開発について
DaikiOKA
August 22, 2019
More Decks by DaikiOKA
See All by DaikiOKA
スマホアプリのアナリティクス最適解
daikioka
0
230
位置情報を利用したMAPアプリの開発
daikioka
0
300
ぜひ使って欲しいCloud Functions for Firebase
daikioka
0
300
nori-na Tech Night vol.3
daikioka
0
330
相乗りアプリを構想から1ヶ月でストアにリリースできたわけ
daikioka
0
260
nori-na_tech_night_vol2.pdf
daikioka
0
570
Other Decks in Programming
See All in Programming
Workers Cache を知る
syumai
0
320
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1k
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.2k
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
140
速習iPhone Duo対応
yuukiw00w
2
920
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
250
setup-vp GitLab対応の裏側
naokihaba
0
140
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
32
14k
JRuby: Past, Present, and Future
headius
0
220
FreeBSDでZabbixを動かす
kenkino
0
340
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
290
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
570
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
520
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
490
Tell your own story through comics
letsgokoyo
1
1.1k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
BBQ
matthewcrist
89
10k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
The Curious Case for Waylosing
cassininazir
1
550
Optimizing for Happiness
mojombo
378
71k
Transcript
Caraquri Tech Night #4 FirestoreΛར༻ͨ͠MAPΞϓϦͷ։ൃʹ͍ͭͯ גࣜձࣾZERO TO ONE Ԭ େو
5XJUUFS*% !OPSJOPSJ@PLB Ԭେو • ৽ଔͰZERO TO ONEʹೖࣾ͠ɺ nori-naʹδϣΠϯ͢Δɻ • ࣾձਓ̏ࣾ།ҰͷΞϓϦΤ
ϯδχΞ • iOS(Objective-CɺSwift)ɺ Android(JavaɺKotlin)ɺWebͱ αʔόʔ(CakePHPɺTypeScript) Ͱ։ൃ ࣗݾհ DBSBRVSJ5FDI/JHIU
OPSJOBͱʁ ۭ੮ͷ͋ΔυϥΠόʔͱಉ͡ํʹҠಈ͍ͨ͠ਓΛ Ϛονϯάͤ͞Δ૬ΓʢϥΠυγΣΞʣαʔϏε DBSBRVSJ5FDI/JHIU
ϏδωεϞσϧ ૬Γ ۭ੮ Ҡಈ͍ͨ͠ υϥΠόʔ खྉ DBSBRVSJ5FDI/JHIU
ΞϓϦͷྲྀΕ త ਤɾ501 Ϛονϯά ϝοηʔδ DBSBRVSJ5FDI/JHIU
ਤը໘ͷઆ໌ ৽ணใ ϥΠϒνϟοτ ৽ن࡞ ืूͷݕࡧ ۙ͘ͷϩάΠϯϢʔβʔΛ දࣔ ૬ΓͷϦΫΤετΛૹ৴ DBSBRVSJ5FDI/JHIU
OPSJOB 'JSFTUPSF $MPVEGVODUJPOT GPSpSFCBTF όοΫΤϯυ 'JSFCBTF nori-naͷγεςϜߏ ͍߹Θͤ
DBSBRVSJ5FDI/JHIU
ࠓͷ͓ DBSBRVSJ5FDI/JHIU
ҐஔใΛར༻ͨ͠ΞϓϦ͕ ૿Ճ DBSBRVSJ5FDI/JHIU
ҐஔใΛڞ༗͢Δ͜ͱʹ ߅ײ͕ͳ͘ͳ͖ͬͯͨ ਤར༻࣮ଶௐࠪcגࣜձࣾθϯϦϯ DBSBRVSJ5FDI/JHIU
•έϞϯGO Z•nly Twit•er DBSBRVSJ5FDI/JHIU
چόʔδϣϯ ৽όʔδϣϯ ςΩετϕʔε Πϕϯτॏࢹ Ϛοϓϕʔε ϦΞϧλΠϜॏࢹ DBSBRVSJ5FDI/JHIU
ͳͥม͑ͨͷ͔ DBSBRVSJ5FDI/JHIU
چόʔδϣϯ ৽όʔδϣϯ ςΩετϕʔε Πϕϯτॏࢹ Ϛοϓϕʔε ϦΞϧλΠϜॏࢹ DBSBRVSJ5FDI/JHIU
ωΠςΟϒͷҙຯͳ͍ DBSBRVSJ5FDI/JHIU
MAPͰϦΞϧλΠϜʹ૬Γ DBSBRVSJ5FDI/JHIU
MAPϝΠϯͰؾ͍ͮͨ͜ͱ DBSBRVSJ5FDI/JHIU
Ϣʔβʔͷ͕͍ DBSBRVSJ5FDI/JHIU
Ұिؒޙͷ چόʔδϣϯ 10~15% ৽όʔδϣϯ 20~35% ଟ͍࣌50% DBSBRVSJ5FDI/JHIU
ͳͥ DBSBRVSJ5FDI/JHIU
ϢʔβʔͷϦΞϧλΠϜͳಈ͖͕ ݟΕΔ͔Β DBSBRVSJ5FDI/JHIU
Βͳ͍ਓͰ࣮ࡍʹډΔͱ ҆৺͢Δ DBSBRVSJ5FDI/JHIU
FirebaseͷϦΞϧλΠϜੑΛ׆༻ • FirestoreΛར༻ • ΞΫςΟϒͳϢʔβʔҎ֎Λ ಁ໌ • දࣔͯ͠ಈ͍͍ͯΔϢʔβʔ ͷಈ͖Λ͏ •
Ͳͷ͘Β͍લʹىಈͨ͠ͷ͔ Θ͔Δ
• FirestoreΛར༻ • ΞΫςΟϒͳϢʔβʔҎ֎Λ ಁ໌ • දࣔͯ͠ಈ͍͍ͯΔϢʔβʔ ͷಈ͖Λ͏ • Ͳͷ͘Β͍લʹىಈͨ͠ͷ͔
Θ͔Δ FirebaseͷϦΞϧλΠϜੑΛ׆༻
༻ͨ͠MAP .BQ,JU (PPHMF.BQ ੑ σϑΥϧτ αʔυύʔςΟʔ ྉۚ ແྉ ैྔ੍ ܦ࿏දࣔ
͋Γ ͳ͠ ϝϞϦ গͳ͍ ଟ͍ MapKitͷศརͳ ɾٯGeocodingɿҢܦ͔ΒॅॴΛऔಘՄೳ GoogleMapͷศརͳ ɾετϦʔτϏϡʔ ɾ༗໊ͳ؍ޫͷใΛදࣔՄೳ DBSBRVSJ5FDI/JHIU
ϢʔβʔͷҐஔใ Firestore্ͷҰͭͷҐஔใΛߋ৽͠ଓ͚Δ →উखʹߋ৽ →ϦΞϧλΠϜͰϢʔβʔ͕ಈ͘ DBSBRVSJ5FDI/JHIU
DBSBRVSJ5FDI/JHIU
ಈ࡞͕ॏ͘ͳΔ DBSBRVSJ5FDI/JHIU
ಈ࡞͕ॏ͘ͳΔݪҼ ঢ়گ දࣔ͢ΔϢʔβʔ͕ଟ͗͢Δʢ͓Αͦ300 ϢʔβʔΛ͑Δʣͱը໘͕ఀࢭ͍ͯ͠ ͨɻ ݪҼ ΞΠίϯը૾ͷαΠζ੍ݶΛ͔͚͍ͯͳ ͔ͬͨͨΊɺը૾ʹΑͬͯಡΈࠐΈʹ࣌ ͕͔͔ؒͬͨ
ຖճϢʔβʔΛಡΈࠐΉ JGMFUMBTU$FOUFS-PDBUJPOTFMGMBTU$FOUFS-PDBUJPO MBTU$FOUFS-PDBUJPOEJTUBODF UBSHFUMPDBUJPO TFMGNPWJOH5ISFTIPVME SPVUF%JTQMBZGBMTF\ NҎ্Ҡಈͨ͠Βɺߋ৽ TFMGSFMPBE"OOPUBUJPO MPDBUJPOMPDBUJPO
SBEJVTNBQ6TFS*O ^FMTFJGTFMGMBTU$FOUFS-PDBUJPOOJMSPVUF%JTQMBZGBMTF\ ࠷ॳͷϩʔυ TFMGSFMPBE"OOPUBUJPO MPDBUJPOMPDBUJPO SBEJVTNBQ6TFS*O ^FMTFJGTFMGNBQ7JFXBOOPUBUJPOTDPNQBDU.BQ \BT 6TFS"OOPUBUJPO^ JT&NQUZ\ TFMGSFMPBE"OOPUBUJPO MPDBUJPOMPDBUJPO SBEJVTNBQ6TFS*O ^ DBSBRVSJ5FDI/JHIU
දࣔ͢ΔϢʔβʔΛ·ͱΊΔ JGNBQ7JFX[PPN-FWFMTFMGNBQ;PPN-FWFM5ISFTIPVME\ NBQ7JFXBOOPUBUJPOTGPS&BDI\BOOPUBUJPOJO JGMFUDMVTUFSBOOPUBUJPOBT .,$MVTUFS"OOPUBUJPO\ NBQ7JFXSFNPWF"OOPUBUJPO DMVTUFS DMVTUFSNFNCFS"OOPUBUJPOTGPS&BDI\ BOOPUBUJPO
JO JGMFUBOOPUBUJPOBOOPUBUJPOBT %SJWFS"OOPUBUJPO\ NBQ7JFXSFNPWF"OOPUBUJPO BOOPUBUJPO ^ ^ NBQ7JFXBEE"OOPUBUJPOT DMVTUFSNFNCFS"OOPUBUJPOT ^ ^ ^ DBSBRVSJ5FDI/JHIU
࠷ޙʹ nori-naHosting࢝Ί·ͨ͠ɻ DBSBRVSJ5FDI/JHIU
Hostingͱ WebϖʔδΛެ։͢ΔΈ ɾJavaScriptͷϑϨʔϜϫʔΫͰ͋ΕͳΜͰྑ͍ ɾCloud Functionಉ༷πʔϧnpmܦ༝ͰΠϯετʔϧ ɾΞοϓϩʔυCloud Functionͱಉ༷ ɾͪΖΜFirestoreͷใΛදࣔՄೳ ɾnori-naͰVue.jsͰ࡞ DBSBRVSJ5FDI/JHIU
IUUQTTFBSDIOPSJOBKQ DBSBRVSJ5FDI/JHIU
IUUQTTFBSDIOPSJOBKQ DBSBRVSJ5FDI/JHIU
ͥͻͬͯཉ͍͠ Cloud functions for Firebase
Cloud functions for firebaseͱ 'JSFCBTFͷϢʔβೝূɺσʔλϕʔεͷՃͳͲͷΠϕϯτ Λड͚औͬͯॲཧΛߦ͏αʔϏε ݴޠɿ+BWB4DSJQUPS5ZQF4DSJQU 'JSFTUPSFτϦΨʔ w PO$SFBUF
w PO6QEBUF w PO%FMFUF w PO8SJUF DBSBRVSJ5FDI/JHIU
nori-naͰͷར༻ํ๏ • ϓογϡ௨ • σʔλͷूܭ • ֎෦αʔϏεͱͷ࿈ܞ(ܾࡁɺݕࡧ) DBSBRVSJ5FDI/JHIU
ϓογϡ௨ onCreate export const pushRideshareRequest = functions.firestore .document(commonUtil.makePath('ridesharerequest/{requestId}')) .onCreate((snap, context)
=> { const newValue = new firestoreModels.RideShareRequest(snap.data()); const to = newValue.to; console.log(`push start ridesharerequest : ${context.params.requestId}`); return pushMessageByUserId(to, '૬Γґཔ͕ಧ͖·ͨ͠ɻ༰Λ֬ೝͯ͠ڐՄ͠·͠ΐ͏ɻ'); }); DBSBRVSJ5FDI/JHIU
ϓογϡ௨ onUpdate export const pushLikeComment = functions.firestore .document(commonUtil.makePath('mapcomment/{mapcommentId}')) .onUpdate((change, context)
=> { const afterData = new firestoreModels.MapComment(change.after.data()); const afterLike = afterData.likeMembers.length; const beforeData = new firestoreModels.MapComment(change.before.data()); const beforeLike = beforeData.likeMembers.length; const toUserId = afterData.user; if (!toUserId) return null; if (beforeLike < afterLike) { return pushMessageByUserId(toUserId, '͍͍Ͷ͕ԡ͞Ε·ͨ͠ʂ'); } return null; }); DBSBRVSJ5FDI/JHIU
ϩʔΧϧͰςετՄೳ $npm run shell DBSBRVSJ5FDI/JHIU
ςετίʔυ QVTI%FTUJOBUJPO6QEBUF \ CFGPSF\ TDSFFO/BNFVTF MPDBUJPO\ MBUJUVEF
MPOHJUVEF ^ EFTUJOBUJPO\ OBNF5 HFP-PDBUJPO\ MBUJUVEF MPOHJUVEF ^ ^ ^ BGUFS\ TDSFFO/BNFVTFS MPDBUJPO\ MBUJUVEF MPOHJUVEF ^ EFTUJOBUJPO\ OBNF5PLZP5PXFS HFP-PDBUJPO\ MBUJUVEF MPOHJUVEF ^ ^ ^ ^ \ QBSBNT\ VTFS*EVTFS ^ ^ DBSBRVSJ5FDI/JHIU • beforeͱafterʹͦΕͧ ΕσʔλΛهड़ • paramsඞཁͳ࣌ͷ Έ
Cloud Functionͷ৽ػೳ Scheduler export const cronRemindShare = functions.pubsub //.schedule("0 18
* * *")//ຖ18࣌ʹ࣮ߦ .schedule("every 5 minutes")//͓͖̑ .timeZone("Asia/Tokyo") .onRun(async context => { console.log("͜͜Ͱఆظ࣮ߦ") });
·ͱΊ Firebase+Mapੑ͕ඇৗʹߴ͍ ϢʔβʔҐஔใΛϚοϓʹϦΞϧλΠϜදࣔ͢Δͱ݁ߏ໘ന͍ ͔ͦ͠͠ͷ··Ͱॲཧʹ ରࡦ • දࣔ͢ΔൣғΛݶఆ • ଟͷϢʔβʔΛҰͭʹ·ͱΊΔ WebϖʔδHostingͰ։ൃ͠Α͏
DBSBRVSJ5FDI/JHIU
͋Γ͕ͱ͏͍͟͝·ͨ͠