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
Firestoreを利用したMAPアプリの開発について
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
220
位置情報を利用した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
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
共通化で考えるべきは、実装より公開する型だった
codeegg
0
220
Foundation Models frameworkで画像分析
ryodeveloper
1
110
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
130
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
520
どこまでゆるくて許されるのか
tk3fftk
0
480
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
0
100
霧の中の代数的エフェクト
funnyycat
1
370
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
190
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
2.4k
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
260
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
410
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Being A Developer After 40
akosma
91
590k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Agile that works and the tools we love
rasmusluckow
331
22k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.5k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
How to Ace a Technical Interview
jacobian
281
24k
Optimizing for Happiness
mojombo
378
71k
AI: The stuff that nobody shows you
jnunemaker
PRO
8
830
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
͋Γ͕ͱ͏͍͟͝·ͨ͠