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
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
新卒PdEのリアル
ryu1013
1
310
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.7k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
260
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
210
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
140
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
100
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
250
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
Flow は今どうなっているか
mizdra
PRO
0
900
XHTMLが残したもの
yosuke_furukawa
PRO
1
380
Press start. Python's next generation.
willingc
PRO
3
300
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
590
Abbi's Birthday
coloredviolet
3
9.7k
Why Our Code Smells
bkeepers
PRO
340
58k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
520
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
HDC tutorial
michielstock
2
840
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
2
660
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
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
͋Γ͕ͱ͏͍͟͝·ͨ͠