SlideShare a Scribd company logo
Mask map
KAI CHU CHUNG
GDE Cloud
GDG Cloud Taipei co-organizers
@CageChung
https://kaichu.io
Howard Wu
GDG Tainan Organizers
https://www.facebook.com/chanwei.wu
房志剛
GDG Kaohsiung Organizer
https://github.com/abc873693
Kevin Yang
GDE Angular / MVP
GDG Taichung Organizer
Angular Taiwan ex-oranizer
https://blog.kevinyang.net
Ahdaa Yeh
GDG Taipei Organizer
https://mosil.space
Kevin Chiu
GDG Taipei co-Organizer
https://github.com/kevin6449
Mask map PM
Howard Wu
GDG Tainan Organizers
https://www.facebook.com/chanwei.wu
● Background
● How to manage Experts’ team
Agenda
● 午餐的機緣
● 社群夥伴的(被)推坑
● Team members
○ PM - Howard
○ Web Frontend - Kevin Yang
○ Backend - Cage
○ APP - Ahdaa, 志剛
○ AoG - Wolke, Kevin Chiu
Background
臨時組建的 side project
● 提出方針,說明做事情的意義,而非實作細節
● 勿妄自菲薄,勇於做決定
● 對內溝通不是問題,對外做好窗口角色
● 除了他們的專業外,其他都是我的事
● 扛載壓力,盡可能爭取時間、資源
● 既然擁有技術能力,就適當的擔任替補
How to manage Experts’ team
最好的管理就是不管理(誤)
Mask map Frontend
Kevin Yang
GDE Angular / MVP
GDG Taichung Organizer
Angular Taiwan ex-oranizer
https://blog.kevinyang.net
● Tech Selection
● Trips and Tips
Agenda
Tech Selection
● Angular v9
● Angular Material
● Angular Google Maps Component
● AngularFire
Tech Select
Tips
● 透過 RxJS 的幫助可以將畫面互動與呼叫 API 撈取資料的動作,做有系統的整合
Tips #1
善用 RxJS
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
● 雖然可以將所有的藥局標是在畫面上,但過多的訊息除了會讓使用者混淆外,也會讓網
頁的顯示效能降低
● 減少畫面重新繪製的工作,資料前後的差異比較,只處理有異動的部分 (map marker)
Tips #2
減少顯示在畫面上的物件
● 過往很多很好用的應用程式到後期都壞掉都是因為加上過多的功能
● Keep it simple, 以解決問題為優先考量,而非製造問題
Tips #3
功能需求,要採減法而非加法
房志剛
GDG Kaohsiung Organizer
https://github.com/abc873693
Mask map Mobile
Ahdaa Yeh
GDG Taipei Organizer
https://mosil.space
● 技術選擇
● 開發時程
● 遇到的問題
Agenda
技術選擇
● 初版 2/5
● 改善UI 2/12
● 最新消息 2/21
● 回報機制 2/25
● 修BUG 2/29
開發時程
● 功能
■ Google Maps plugin
■ mask api
■ Firebase
■ UI
● Android 上架
● iOS審查中
初版
● 過濾器
● BottomSheet
● Firebase
● UI
改善UI
● Firebase Remote Config
● 提供政府的最新消息
最新消息
● mask feedback api
● UI
回報機制
● iOS無法上架
● Google Maps plugin
遇到的問題
iOS無法上架
● Flutter 官方維護的 plugin
● Develper preview
● 手勢偵測無效
● 特定情況下Marker會消失
Google Maps plugin
Mask AoG
Kevin Chiu
GDG Taipei co-Organizer
https://github.com/kevin6449
● 技術選擇
● 開發時程
● 遇到的問題
Agenda
技術選擇
● 初版 2月7日 週五上午00:00開始開發
● 送審 2月7日 週五 上午2:06
● 上架 2月7日 週五 上午6:10
開發時程
● Goolge Assistant 需要地理位置
(DiaglogFlow)
● iOS Goolge Assistant 需要地理位置
遇到的問題
KAI CHU CHUNG
GDE Cloud
GDG Cloud Taipei co-organizers
@CageChung
https://kaichu.io
Mask map backend
● Backend Story
● Insights
● Infrastructure
● Trips and Tips
Agenda
Backend Story
Backend Story
Join mask backend
project
2/5 4PM
Mask backend project
kick off
2/5 10PM
First version backend
API and website launch
2/6 6AM
33 versions delivery
3/5
Insights
Summary
Instances
Cloud SQL
CPU utilization
Cloud SQL
Read/write operations
Cloud SQL
Ingress/Egress
Infrastructure
Infrastructure
Pharmacies Backend
App Engine
Autoscaling
Cloud SQL
psql
Cloud
Storage
Feedback Backend
App Engine
Autoscaling
Website Backend
App Engine
Autoscaling
Data broker
Compute Engine
Cloud Load
Balancing
gsutil cp
hook
Swagger docs
App Engine
Mobile Devices
Push Notifications
wget
Cloud
Build
Release trigger
deploy
Stackdriver
Kiang
Cloud
Build
Infrastructure
Pharmacies Backend
App Engine
Autoscaling
Cloud SQL
psql
Cloud
Storage
Feedback Backend
App Engine
Autoscaling
Website Backend
App Engine
Autoscaling
Data broker
Compute Engine
Cloud Load
Balancing
gsutil cp
Swagger docs
App Engine
Mobile Devices
Push Notifications
wget
Cloud
Build
Release trigger
deploy
Stackdriver
Kiang
Cloud
Build
dispatch:
- url: "*/favicon.ico"
module: default
- url: "*/api/pharmacies*"
module: pharmacy
- url: "*/docs*"
module: docs
- url: "*/api/feedback*"
module: feedback
- url: "*/googleae8f4bcce8bec00c.html"
module: ownership
- url: "mask-9999.appspot.com/"
module: default
Mask map backend Services
# sync by 30 seconds
* 0-15,22-23 * * * ( sleep 1; /root/project/data-broker/run.sh >> /tmp/run.log)
* 0-15,22-23 * * * ( sleep 31; /root/project/data-broker/run.sh >> /tmp/run.log)
#!/bin/bash
TARGET_BUCKET=gs://mask-9999-pharmacies
...
RAW_URL=https://raw.githubusercontent.com/kiang/pharmacies/master/json/points.json
...
echo Job start `date`
echo Pull from github
wget "$RAW_URL?ts=`date +%s`" -O $DATA_PATH
echo ===========================
echo Sync data to GCS...
gsutil cp -r $DATA_PATH $TARGET_BUCKET/points.json
# call hook
echo ===========================
echo Call GAE hook...
curl -X POST https://mask-9999.appspot.com/api/pharmacies/sync_handler
Data broker Cron Job
├── cmd
│ ├── docs
│ ├── feedback
│ ├── ownership
│ └── pharmacy
├── internal
│ ├── app
│ │ ├── docs
│ │ ├── feedback
│ │ └── pharmacy
│ └── pkg
│ ├── errors
│ ├── level
│ ├── postgres
│ ├── responses
│ └── util
├── website
├── Makefile
├── cloudbuild.mask-web.yaml
├── dispatch.yaml
...
Mask backend project layout
go-kit
├── internal
│ ├── app
│ │ └── pharmacy
│ │ ├── endpoints
│ │ │ ├── endpoints.go
│ │ │ ├── middleware.go
│ │ │ ├── requests.go
│ │ │ └── responses.go
│ │ ├── model
│ │ │ └── pharmacy.go
│ │ ├── postgres
│ │ │ └── pharmacy.go
│ │ ├── service
│ │ │ ├── logging.go
│ │ │ ├── service.go
│ │ │ └── version.go
│ │ └── transports
│ │ └── http.go
...
steps:
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
curl -d '{"branchName":"mask-web-release"}' -X POST -H "Content-type: application/json" -H
"Authorization: Bearer $(gcloud config config-helper --format='value(credential.access_token)')"
https://cloudbuild.googleapis.com/v1/projects/mask-9999/triggers/a54e5cb6-e7f4-4e83-a125-1be3d032a
2fb:run
Mask-web cloudbuild.yaml
Trips & Tips
SELECT *, point($1, $2) <@> point(longitude, latitude)::point as
distance
FROM (select * from %s where longitude >= $3 and longitude <= $4 and
latitude >= $5 and latitude <= $6) as a
ORDER BY distance
limit $7;
CREATE EXTENSION if not exists cube;
CREATE EXTENSION if not exists earthdistance;
gcloud sql export csv $CLOUDSQL_INSTANCE $TARGET_BUCKET/feedbacks/`date
--date="-1 day" +%Y_%m%d`.csv --database=ma
sk --query='select o.name, f.description, f.user_id, f.pharmacy_id,
f.created_at from feedback_'`date --date="-1 da
y" +%Y_%m%d`' as f inner join options as o on f.option_id = o.id;'
Frontend https://github.com/gdg-twhk/mask-web
Backend https://github.com/gdg-twhk/mask-gae
Mobile App https://github.com/gdg-twhk/mask-app
MaskAoG https://github.com/gdg-twhk/mask-aog
Q & A
Thank You!
KAI CHU CHUNG
GDE Cloud
GDG Cloud Taipei co-organizers
@CageChung
https://kaichu.io
Howard Wu
GDG Tainan Organizers
https://www.facebook.com/chanwei.wu
房志剛
GDG Kaohsiung Organizer
https://github.com/abc873693
Kevin Yang
GDE Angular / MVP
GDG Taichung Organizer
Angular Taiwan ex-oranizer
https://blog.kevinyang.net
Ahdaa Yeh
GDG Taipei Organizer
https://mosil.space
Kevin Chiu
GDG Taipei co-Organizer
https://github.com/kevin6449

More Related Content

PDF
GDG Cloud Taipei: Meetup #52 - Istio Security: API Authorization
KAI CHU CHUNG
 
PDF
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
KAI CHU CHUNG
 
PDF
Coscup x ruby conf tw 2021 google cloud buildpacks 剖析與實踐
KAI CHU CHUNG
 
PDF
Dev fest 2020 taiwan how to debug microservices on kubernetes as a pros (ht...
KAI CHU CHUNG
 
PDF
Gdg cloud taipei ddt meetup #53 buildpack
KAI CHU CHUNG
 
PDF
Hiveminder - Everything but the Secret Sauce
Jesse Vincent
 
PDF
Introduction to Grunt.js on Taiwan JavaScript Conference
Bo-Yi Wu
 
PDF
Grunt & Front-end Workflow
Pagepro
 
GDG Cloud Taipei: Meetup #52 - Istio Security: API Authorization
KAI CHU CHUNG
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
KAI CHU CHUNG
 
Coscup x ruby conf tw 2021 google cloud buildpacks 剖析與實踐
KAI CHU CHUNG
 
Dev fest 2020 taiwan how to debug microservices on kubernetes as a pros (ht...
KAI CHU CHUNG
 
Gdg cloud taipei ddt meetup #53 buildpack
KAI CHU CHUNG
 
Hiveminder - Everything but the Secret Sauce
Jesse Vincent
 
Introduction to Grunt.js on Taiwan JavaScript Conference
Bo-Yi Wu
 
Grunt & Front-end Workflow
Pagepro
 

What's hot (20)

PDF
Building Grails Plugins - Tips And Tricks
Mike Hugo
 
PDF
Gradle - time for a new build
Igor Khotin
 
PPTX
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
PDF
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
ZeroTurnaround
 
PPTX
Taking Jenkins Pipeline to the Extreme
yinonavraham
 
PDF
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Rajmahendra Hegde
 
PPTX
Android presentation - Gradle ++
Javier de Pedro López
 
PDF
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Dirk Ginader
 
PDF
Gradle Introduction
Dmitry Buzdin
 
ODP
Gradle - time for another build
Igor Khotin
 
PDF
Hands on the Gradle
Matthias Käppler
 
PDF
Let Grunt do the work, focus on the fun!
Dirk Ginader
 
PDF
PuppetConf 2016: Running Puppet Software in Docker Containers – Gareth Rushgr...
Puppet
 
PDF
Gradle - the Enterprise Automation Tool
Izzet Mustafaiev
 
PDF
Docker d2 박승환
Seunghwan Park
 
PDF
Gradle presentation
Oriol Jiménez
 
PDF
Managing dependencies with gradle
Liviu Tudor
 
PDF
Isolating GPU Access in its Own Process (Foss-North 2018)
Patricia Aas
 
PDF
Docker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Applitools
 
PDF
Gradle in 45min
Schalk Cronjé
 
Building Grails Plugins - Tips And Tricks
Mike Hugo
 
Gradle - time for a new build
Igor Khotin
 
The world of gradle - an introduction for developers
Tricode (part of Dept)
 
[Image Results] Java Build Tools: Part 2 - A Decision Maker's Guide Compariso...
ZeroTurnaround
 
Taking Jenkins Pipeline to the Extreme
yinonavraham
 
Gradle build tool that rocks with DSL JavaOne India 4th May 2012
Rajmahendra Hegde
 
Android presentation - Gradle ++
Javier de Pedro López
 
Let Grunt do the work, focus on the fun! [Open Web Camp 2013]
Dirk Ginader
 
Gradle Introduction
Dmitry Buzdin
 
Gradle - time for another build
Igor Khotin
 
Hands on the Gradle
Matthias Käppler
 
Let Grunt do the work, focus on the fun!
Dirk Ginader
 
PuppetConf 2016: Running Puppet Software in Docker Containers – Gareth Rushgr...
Puppet
 
Gradle - the Enterprise Automation Tool
Izzet Mustafaiev
 
Docker d2 박승환
Seunghwan Park
 
Gradle presentation
Oriol Jiménez
 
Managing dependencies with gradle
Liviu Tudor
 
Isolating GPU Access in its Own Process (Foss-North 2018)
Patricia Aas
 
Docker and Your Path to a Better Staging Environment - webinar by Gil Tayar
Applitools
 
Gradle in 45min
Schalk Cronjé
 
Ad

More from KAI CHU CHUNG (20)

PDF
Devfest 2023 - Service Weaver Introduction - Taipei.pdf
KAI CHU CHUNG
 
PDF
DevFest 2022 - Skaffold 2 Deep Dive Taipei.pdf
KAI CHU CHUNG
 
PDF
DevFest 2022 - Cloud Workstation Introduction TaiChung
KAI CHU CHUNG
 
PDF
Devfest 2021' - Artifact Registry Introduction (Taipei)
KAI CHU CHUNG
 
PDF
Velero search &amp; practice 20210609
KAI CHU CHUNG
 
PDF
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
KAI CHU CHUNG
 
PDF
Google App Engine: Basic
KAI CHU CHUNG
 
PDF
GDG Cloud Taipei meetup #50 - Build go kit microservices at kubernetes with ...
KAI CHU CHUNG
 
PDF
Global GDG Leaders Summit, Google I/O 2018 經驗分享
KAI CHU CHUNG
 
PDF
Google apps script introduction
KAI CHU CHUNG
 
PDF
Screenshot as a service
KAI CHU CHUNG
 
PDF
Nas 也可以揀土豆
KAI CHU CHUNG
 
PDF
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
KAI CHU CHUNG
 
PDF
Django oscar introduction
KAI CHU CHUNG
 
PDF
Continuous Integration & Continuous Delivery with GCP
KAI CHU CHUNG
 
PDF
Google apps script introduction
KAI CHU CHUNG
 
PDF
Gae managed vm introduction
KAI CHU CHUNG
 
PDF
Google app engine (gae) 演進史
KAI CHU CHUNG
 
PDF
痞客趴趴走 Waldo
KAI CHU CHUNG
 
PDF
Waldo-gcp
KAI CHU CHUNG
 
Devfest 2023 - Service Weaver Introduction - Taipei.pdf
KAI CHU CHUNG
 
DevFest 2022 - Skaffold 2 Deep Dive Taipei.pdf
KAI CHU CHUNG
 
DevFest 2022 - Cloud Workstation Introduction TaiChung
KAI CHU CHUNG
 
Devfest 2021' - Artifact Registry Introduction (Taipei)
KAI CHU CHUNG
 
Velero search &amp; practice 20210609
KAI CHU CHUNG
 
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
KAI CHU CHUNG
 
Google App Engine: Basic
KAI CHU CHUNG
 
GDG Cloud Taipei meetup #50 - Build go kit microservices at kubernetes with ...
KAI CHU CHUNG
 
Global GDG Leaders Summit, Google I/O 2018 經驗分享
KAI CHU CHUNG
 
Google apps script introduction
KAI CHU CHUNG
 
Screenshot as a service
KAI CHU CHUNG
 
Nas 也可以揀土豆
KAI CHU CHUNG
 
60分鐘完送百萬edm,背後雲端ci/cd實戰大公開
KAI CHU CHUNG
 
Django oscar introduction
KAI CHU CHUNG
 
Continuous Integration & Continuous Delivery with GCP
KAI CHU CHUNG
 
Google apps script introduction
KAI CHU CHUNG
 
Gae managed vm introduction
KAI CHU CHUNG
 
Google app engine (gae) 演進史
KAI CHU CHUNG
 
痞客趴趴走 Waldo
KAI CHU CHUNG
 
Waldo-gcp
KAI CHU CHUNG
 
Ad

Recently uploaded (20)

PPTX
Aspire Leaders Project ( an app to schedule monthly medication deliveries for...
biancaleao5
 
PDF
23rd July 2025 Resume_Richard_O_Bonyo.pdf
bonyorichard
 
PDF
About The Hindu Society of North Carolin
paragdighe3
 
PPTX
AIHA Heat Stress App Version 2 Presentation.pptx
AIHA
 
PPTX
Culture_Presentation_Abdul_Rafay_With_Images.pptx
ehsanejaz57
 
PDF
UK email opt in changes - options for your forms
More Onion
 
PPTX
DFARS Part 246 - Quality Assurance Dod DFARS
JSchaus & Associates
 
PPTX
Annual Report 2024-2025 La Jolla Village Merchants Association
La Jolla Village Merchants Assocation
 
PPTX
原版Winchester毕业证文凭温彻斯特大学成绩单水印办理流程办文凭
e7nw4o4
 
PPTX
ILRI_PPP_ Presentation_08 Nov 2024.pptx.FJBGTFGJJJJGFGHGTYUYTRRTYYGBBJHFFFGHJ...
seidyimer7
 
PPTX
Training Local Plan Examinations 2025 PCPA - Copy (1).pptx
PAS_Team
 
PDF
Shree Shakti Seva Kendra – Child Development NGO in Mehsana
shreeshaktisevakendr
 
PDF
Challenges of Long-Term Social Security Forecasting
Congressional Budget Office
 
PPTX
Bloodborne_Pathogens_PPT_v-03-01-17.pptx
chadrickkeller
 
PPT
lecture_20_anxsacAFAERVedcdvrvVatomy.ppt
BALQISNURAZIZAH1
 
PDF
Indivisible Upstate SC Members Meeting July 26, 2025
indivisibleupstatesc
 
PPTX
LM-Powerpoint-Q1M1Wk1-G9-Basic-Physics.pptx
padilla136523160106
 
PPT
AtomsFirst2e_day18_sec22.1-22.2_22.4-22.5_CHMY172_spring_2016.ppt
sumodmjohn3
 
PDF
Religion and Ecology: Can The Climate Change?
João Soares
 
PPTX
National-National Spoil Your Dog Day (1).pptx
recouti384
 
Aspire Leaders Project ( an app to schedule monthly medication deliveries for...
biancaleao5
 
23rd July 2025 Resume_Richard_O_Bonyo.pdf
bonyorichard
 
About The Hindu Society of North Carolin
paragdighe3
 
AIHA Heat Stress App Version 2 Presentation.pptx
AIHA
 
Culture_Presentation_Abdul_Rafay_With_Images.pptx
ehsanejaz57
 
UK email opt in changes - options for your forms
More Onion
 
DFARS Part 246 - Quality Assurance Dod DFARS
JSchaus & Associates
 
Annual Report 2024-2025 La Jolla Village Merchants Association
La Jolla Village Merchants Assocation
 
原版Winchester毕业证文凭温彻斯特大学成绩单水印办理流程办文凭
e7nw4o4
 
ILRI_PPP_ Presentation_08 Nov 2024.pptx.FJBGTFGJJJJGFGHGTYUYTRRTYYGBBJHFFFGHJ...
seidyimer7
 
Training Local Plan Examinations 2025 PCPA - Copy (1).pptx
PAS_Team
 
Shree Shakti Seva Kendra – Child Development NGO in Mehsana
shreeshaktisevakendr
 
Challenges of Long-Term Social Security Forecasting
Congressional Budget Office
 
Bloodborne_Pathogens_PPT_v-03-01-17.pptx
chadrickkeller
 
lecture_20_anxsacAFAERVedcdvrvVatomy.ppt
BALQISNURAZIZAH1
 
Indivisible Upstate SC Members Meeting July 26, 2025
indivisibleupstatesc
 
LM-Powerpoint-Q1M1Wk1-G9-Basic-Physics.pptx
padilla136523160106
 
AtomsFirst2e_day18_sec22.1-22.2_22.4-22.5_CHMY172_spring_2016.ppt
sumodmjohn3
 
Religion and Ecology: Can The Climate Change?
João Soares
 
National-National Spoil Your Dog Day (1).pptx
recouti384
 

COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源

  • 1. Mask map KAI CHU CHUNG GDE Cloud GDG Cloud Taipei co-organizers @CageChung https://kaichu.io Howard Wu GDG Tainan Organizers https://www.facebook.com/chanwei.wu 房志剛 GDG Kaohsiung Organizer https://github.com/abc873693 Kevin Yang GDE Angular / MVP GDG Taichung Organizer Angular Taiwan ex-oranizer https://blog.kevinyang.net Ahdaa Yeh GDG Taipei Organizer https://mosil.space Kevin Chiu GDG Taipei co-Organizer https://github.com/kevin6449
  • 2. Mask map PM Howard Wu GDG Tainan Organizers https://www.facebook.com/chanwei.wu
  • 3. ● Background ● How to manage Experts’ team Agenda
  • 4. ● 午餐的機緣 ● 社群夥伴的(被)推坑 ● Team members ○ PM - Howard ○ Web Frontend - Kevin Yang ○ Backend - Cage ○ APP - Ahdaa, 志剛 ○ AoG - Wolke, Kevin Chiu Background 臨時組建的 side project
  • 5. ● 提出方針,說明做事情的意義,而非實作細節 ● 勿妄自菲薄,勇於做決定 ● 對內溝通不是問題,對外做好窗口角色 ● 除了他們的專業外,其他都是我的事 ● 扛載壓力,盡可能爭取時間、資源 ● 既然擁有技術能力,就適當的擔任替補 How to manage Experts’ team 最好的管理就是不管理(誤)
  • 6. Mask map Frontend Kevin Yang GDE Angular / MVP GDG Taichung Organizer Angular Taiwan ex-oranizer https://blog.kevinyang.net
  • 7. ● Tech Selection ● Trips and Tips Agenda
  • 9. ● Angular v9 ● Angular Material ● Angular Google Maps Component ● AngularFire Tech Select
  • 10. Tips
  • 11. ● 透過 RxJS 的幫助可以將畫面互動與呼叫 API 撈取資料的動作,做有系統的整合 Tips #1 善用 RxJS
  • 14. ● 過往很多很好用的應用程式到後期都壞掉都是因為加上過多的功能 ● Keep it simple, 以解決問題為優先考量,而非製造問題 Tips #3 功能需求,要採減法而非加法
  • 15. 房志剛 GDG Kaohsiung Organizer https://github.com/abc873693 Mask map Mobile Ahdaa Yeh GDG Taipei Organizer https://mosil.space
  • 16. ● 技術選擇 ● 開發時程 ● 遇到的問題 Agenda
  • 18. ● 初版 2/5 ● 改善UI 2/12 ● 最新消息 2/21 ● 回報機制 2/25 ● 修BUG 2/29 開發時程
  • 19. ● 功能 ■ Google Maps plugin ■ mask api ■ Firebase ■ UI ● Android 上架 ● iOS審查中 初版
  • 20. ● 過濾器 ● BottomSheet ● Firebase ● UI 改善UI
  • 21. ● Firebase Remote Config ● 提供政府的最新消息 最新消息
  • 22. ● mask feedback api ● UI 回報機制
  • 23. ● iOS無法上架 ● Google Maps plugin 遇到的問題
  • 25. ● Flutter 官方維護的 plugin ● Develper preview ● 手勢偵測無效 ● 特定情況下Marker會消失 Google Maps plugin
  • 26. Mask AoG Kevin Chiu GDG Taipei co-Organizer https://github.com/kevin6449
  • 27. ● 技術選擇 ● 開發時程 ● 遇到的問題 Agenda
  • 29. ● 初版 2月7日 週五上午00:00開始開發 ● 送審 2月7日 週五 上午2:06 ● 上架 2月7日 週五 上午6:10 開發時程
  • 30. ● Goolge Assistant 需要地理位置 (DiaglogFlow) ● iOS Goolge Assistant 需要地理位置 遇到的問題
  • 31. KAI CHU CHUNG GDE Cloud GDG Cloud Taipei co-organizers @CageChung https://kaichu.io Mask map backend
  • 32. ● Backend Story ● Insights ● Infrastructure ● Trips and Tips Agenda
  • 34. Backend Story Join mask backend project 2/5 4PM Mask backend project kick off 2/5 10PM First version backend API and website launch 2/6 6AM 33 versions delivery 3/5
  • 42. Infrastructure Pharmacies Backend App Engine Autoscaling Cloud SQL psql Cloud Storage Feedback Backend App Engine Autoscaling Website Backend App Engine Autoscaling Data broker Compute Engine Cloud Load Balancing gsutil cp hook Swagger docs App Engine Mobile Devices Push Notifications wget Cloud Build Release trigger deploy Stackdriver Kiang Cloud Build
  • 43. Infrastructure Pharmacies Backend App Engine Autoscaling Cloud SQL psql Cloud Storage Feedback Backend App Engine Autoscaling Website Backend App Engine Autoscaling Data broker Compute Engine Cloud Load Balancing gsutil cp Swagger docs App Engine Mobile Devices Push Notifications wget Cloud Build Release trigger deploy Stackdriver Kiang Cloud Build
  • 44. dispatch: - url: "*/favicon.ico" module: default - url: "*/api/pharmacies*" module: pharmacy - url: "*/docs*" module: docs - url: "*/api/feedback*" module: feedback - url: "*/googleae8f4bcce8bec00c.html" module: ownership - url: "mask-9999.appspot.com/" module: default Mask map backend Services
  • 45. # sync by 30 seconds * 0-15,22-23 * * * ( sleep 1; /root/project/data-broker/run.sh >> /tmp/run.log) * 0-15,22-23 * * * ( sleep 31; /root/project/data-broker/run.sh >> /tmp/run.log) #!/bin/bash TARGET_BUCKET=gs://mask-9999-pharmacies ... RAW_URL=https://raw.githubusercontent.com/kiang/pharmacies/master/json/points.json ... echo Job start `date` echo Pull from github wget "$RAW_URL?ts=`date +%s`" -O $DATA_PATH echo =========================== echo Sync data to GCS... gsutil cp -r $DATA_PATH $TARGET_BUCKET/points.json # call hook echo =========================== echo Call GAE hook... curl -X POST https://mask-9999.appspot.com/api/pharmacies/sync_handler Data broker Cron Job
  • 46. ├── cmd │ ├── docs │ ├── feedback │ ├── ownership │ └── pharmacy ├── internal │ ├── app │ │ ├── docs │ │ ├── feedback │ │ └── pharmacy │ └── pkg │ ├── errors │ ├── level │ ├── postgres │ ├── responses │ └── util ├── website ├── Makefile ├── cloudbuild.mask-web.yaml ├── dispatch.yaml ... Mask backend project layout go-kit ├── internal │ ├── app │ │ └── pharmacy │ │ ├── endpoints │ │ │ ├── endpoints.go │ │ │ ├── middleware.go │ │ │ ├── requests.go │ │ │ └── responses.go │ │ ├── model │ │ │ └── pharmacy.go │ │ ├── postgres │ │ │ └── pharmacy.go │ │ ├── service │ │ │ ├── logging.go │ │ │ ├── service.go │ │ │ └── version.go │ │ └── transports │ │ └── http.go ...
  • 47. steps: - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | curl -d '{"branchName":"mask-web-release"}' -X POST -H "Content-type: application/json" -H "Authorization: Bearer $(gcloud config config-helper --format='value(credential.access_token)')" https://cloudbuild.googleapis.com/v1/projects/mask-9999/triggers/a54e5cb6-e7f4-4e83-a125-1be3d032a 2fb:run Mask-web cloudbuild.yaml
  • 49. SELECT *, point($1, $2) <@> point(longitude, latitude)::point as distance FROM (select * from %s where longitude >= $3 and longitude <= $4 and latitude >= $5 and latitude <= $6) as a ORDER BY distance limit $7; CREATE EXTENSION if not exists cube; CREATE EXTENSION if not exists earthdistance;
  • 50. gcloud sql export csv $CLOUDSQL_INSTANCE $TARGET_BUCKET/feedbacks/`date --date="-1 day" +%Y_%m%d`.csv --database=ma sk --query='select o.name, f.description, f.user_id, f.pharmacy_id, f.created_at from feedback_'`date --date="-1 da y" +%Y_%m%d`' as f inner join options as o on f.option_id = o.id;'
  • 51. Frontend https://github.com/gdg-twhk/mask-web Backend https://github.com/gdg-twhk/mask-gae Mobile App https://github.com/gdg-twhk/mask-app MaskAoG https://github.com/gdg-twhk/mask-aog Q & A
  • 52. Thank You! KAI CHU CHUNG GDE Cloud GDG Cloud Taipei co-organizers @CageChung https://kaichu.io Howard Wu GDG Tainan Organizers https://www.facebook.com/chanwei.wu 房志剛 GDG Kaohsiung Organizer https://github.com/abc873693 Kevin Yang GDE Angular / MVP GDG Taichung Organizer Angular Taiwan ex-oranizer https://blog.kevinyang.net Ahdaa Yeh GDG Taipei Organizer https://mosil.space Kevin Chiu GDG Taipei co-Organizer https://github.com/kevin6449