Month: 2021-05


Yao Wei 13:31:29
@medicalwei has joined the channel


Yao Wei 18:36:31
@kevinliao did you test the PR?
kjcl 18:36:58
confirm it's working. 🙂 check out
🙌 1


kjcl 17:00:05
@medicalwei I've deployed the changes onto the local scraper, so the data from your fixes is now in production. 🙂
kjcl 17:00:32
I configured GitHub Actions today, so we'll now get Type checking and linting support in both JS and Python for pull requests. 🙂
kjcl 17:00:39
Getting ready to take this to the next g0v hackathon. 🙂
🙌 1
Yao Wei 17:43:54
Aaaaand I forgot to add Nantou MOHW into parser list ._.


Yao Wei 15:32:09
@kevinliao seems that the parser I did doesn't work as intended
kjcl 15:32:30
Which hospital? Im on my way home. Can take a look :)
kjcl 15:33:01
We should also think about how to add 公費疫苗資訊
Yao Wei 15:33:32
MOHW hospitals: Keelung MOHW is now fully booked
mrblueblue 16:53:19
@grokut has joined the channel
kjcl 17:14:28
Hi, I think conversation is happening in #covid19


kjcl 14:09:38
@medicalwei sorry I've been a little busy with work and havent had a chance yet. Have you investigated issues with MOHW parsers?
Not yet. I can do that this evening
Tested by running this script directly, you should see most of MOHW hospitals being unavailable. Also, this can be used for sponsored vaccines if hospitals use the same system for booking.
I'll test! Can you reformat with `pipenv run black`?
done. didn't see that the format is off
Go check it out!
Also, what's the format of sponsored vaccines?
Didn't notice that the repo is moved
The next issue is the link to the registration page
The data needs improvement. I agree... I'm trying to move from the CSV file to something more readable. I want to convert it to JSON.
Would suggest YAML though
Lemme run formatter again ._
tmonk 14:09:50
@felixtypingmonkey has joined the channel


kjcl 15:45:23
Dont know if anyone finds this interesting but today the local scraper migrated to async Python and it is now 5x faster.

#36 Asyncify our methods to improve performance

It's taking on average 40-50 seconds to scrape each time. This is too slow because the appointments are going very quickly now. We will save significant time by adopting async. Now down to 10-12 seconds. Test plan: `yarn scrape` confirm still works. mohw_nantou is broken and I need to file a fix request. *Test Plan:* ``` (vaccine2) ~/Documents/Programming/g0v/vaccine2/backend  master●  0m  python  [(3, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (11, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (19, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (8, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (27, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (21, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (17, {'self_paid': <AppointmentAvailability.AVAILABLE: 'Available'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (10, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (1, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (13, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (14, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (28, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (29, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (12, {'self_paid': <AppointmentAvailability.AVAILABLE: 'Available'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (22, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (2, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (4, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (5, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (6, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (7, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (9, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (15, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (16, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (18, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (20, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (23, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (24, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (25, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (26, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (30, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (31, {'self_paid': <AppointmentAvailability.NO_DATA: 'No data'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>})] ----Time: 50.78437399864197---- (vaccine2) ~/Documents/Programming/g0v/vaccine2/backend  async  0m  python  ----scrape_tonyen_hsinchu: 0.1959974765777588----- ----parse_tzuchi_hualien: 0.22075915336608887----- ----parse_ntu_yunlin: 0.4962174892425537----- ----parse_ntu_hsinchu: 0.8664581775665283----- ----parse_ntu_taipei: 1.107123613357544----- ----scrape_pch_nantou: 1.1037871837615967----- -----parse_mohw_nantou: Unexpected error: <class 'KeyError'> ----scrape_changgung_chiayi: 1.19110107421875----- ----parse_tzuchi_taipei: 1.9510462284088135----- ----parse_mohw_keelung: 1.9770476818084717----- ----scrape_siaogang_kaohsiung: 2.4221842288970947----- ----parse_mohw_taitung: 2.4698691368103027----- ----parse_mohw_miaoli: 2.8588149547576904----- ----parse_mohw_taoyuan: 3.3229405879974365----- ----parse_mohw_taichung: 3.3663933277130127----- ----parse_ncku_tainan: 5.681906461715698----- ----parse_mohw_kinmen: 8.428256511688232----- [(3, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (11, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (19, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (8, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (27, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (21, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (17, {'self_paid': <AppointmentAvailability.AVAILABLE: 'Available'>, 'government_paid': <AppointmentAvailability.NO_DATA: 'No data'>}), (10, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (1, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (13, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>}), (14, {'self_paid': <AppointmentAvailability.UNAVAILABLE: 'Unavailable'>, 'government_paid': <AppointmentAvailability.AVAILABLE: 'Available'>}), (28, {'self_paid': <AppointmentAv…

1 1 1
kjcl 15:45:54
We are reaching the point where vaccination slots are gone in the minute it takes for us to scrape and put them up so performance really matters now!


isabelhou 05:18:19
@isabelhou has joined the channel
chihao 07:01:30
@chihao has joined the channel
kiang 08:23:18
@kiang has joined the channel
Randyanto 12:46:23
@yonathan.randyanto has joined the channel
kjcl 18:54:11

Screenshot from 2021-05-15 18-39-16.png
Screenshot from 2021-05-15 18-45-59.png
在網頁和Code中注意到「疾病管理署」這個名稱,應該是「疾病管制署」,全名「衛生福利部疾病管制署」,英文名稱「Taiwan Centers for Disease Contorl」
4 👍 5


tmonk 15:38:08
Thanks to @kevinliao . is now being accessed with Let's Encrypt TSL. Such secure such wow. :doge:
❤️ 3
kjcl 15:53:40
I'm going to post an update in #general with all the accomplishments everyone has made! We have Tagalog support now too!
👍 3
Allen 15:57:44
@alllenwang6212 has joined the channel
Cos 16:27:33
@vikarechronos has joined the channel
marge 16:28:54
@marge.consunji has joined the channel
bettyvisualtech 16:43:42
@bettyvisualtech has joined the channel
chewei 16:53:09
@chewei has joined the channel
Mai 16:54:58
@karmin.sphinx has joined the channel
heranchris0430 16:55:12
@heranchris0430 has joined the channel
Ti-Chung 17:01:08
@tcheng10 has joined the channel
ael 17:34:31
@aelcenganda has joined the channel
Linc 17:42:17
@turtlelin1210 has joined the channel
Ezek 17:52:27
@lin.liszt has joined the channel
Jeremy 18:06:00
@qwe0123xd has joined the channel
Yu Shen 18:50:40
@hyy6983 has joined the channel
Vivi 18:55:49
@vivi5377 has joined the channel
yukai 19:02:06
@yukai has joined the channel
lanf0n 21:15:26
@lanf0n has joined the channel
liao.shen.yi 22:16:58
@liao.shen.yi has joined the channel
liao.shen.yi 22:21:29
There are some new vaccine locations that aren’t showing up on — can someone check? For example the district office associated clinics:


😮 1 👀 1
hdes93307 23:44:01
@hdes93307 has joined the channel
ky 23:46:21
@lisa has joined the channel
bil 23:52:20
@bil has joined the channel


kjcl 00:30:53
Hi @liao.shen.yi, I have scraped the CDC website and put all the data into this JSON file
kjcl 01:20:50
I put a notice saying our data is incomplete. I'm going to work on putting this data in tomorrow. I debated taking the site down, but since we provide live data and the CDC doesn't, it makes sense to keep it up with the warning.
👍 1
kjcl 01:25:20

感謝資訊更新 但我想再補充一下,在高危險區域內的醫院 需要被特別標示嗎?還是說就不鼓勵前往?

Yuting 01:25:32
@chaossha has joined the channel
游士鋒 01:33:11
@sfyou614 has joined the channel
u9780112 01:49:37
@u9780112 has joined the channel
Ian Li 01:54:24
@s09454 has joined the channel
yorkxin 10:42:59
@ducksteven has joined the channel
hungmi 12:52:57
@hungmi has joined the channel
tmonk 13:04:10
• 根據 COVID-19 防治一網通上面顯示,預定有配給疫苗的單位由大醫院到地方衛生所都有。
• 地方衛生所的資訊就要自己打電話去詢問目前掛號進度跟是否還有疫苗可打。
• 如同 @chaossha 所說的,有些醫院因為有確診病例等原因被認為不建議前往,也希望能標明清楚。
• 這麼多間醫院、衛生所都要寫一隻爬蟲抓取資料,現在感覺好像不太實際。
可能架構會跟最初一開始 @tnstiger 寫的口罩地圖蠻像的。

tnstiger 13:04:22
@tnstiger has joined the channel
isabelhou 13:06:21
😢 2
kjcl 13:25:46
2 2 👍 1
kjcl 13:26:58
🙌 2
utekidesign 13:48:05
@utekidesign has joined the channel
bess 13:52:07
@besslee has joined the channel
utekidesign 13:52:29
大家好,我是時雨設計的平面設計師,我今晚開始會幫忙設計「全民新冠肺炎 (COVID-19) 疫苗資訊」(的網頁視覺設計,想確認一下應該沒人認領要設計吧?

台灣新冠肺炎自費疫苗資訊 Taiwan COVID-19 Vaccination Information

台灣31家醫院COVID-19疫苗名額的現時資訊 Real-time Data about COVID-19 Vaccination Appointments in Taiwan.

我現在都是在用 的 component
zyan951231 2021-05-17 14:24:23
utekidesign 2021-05-17 14:49:26
utekidesign 2021-05-17 14:51:04
我這邊在改一些前端的程式了, 有設計要改的話我可以順便做
utekidesign 2021-05-17 15:07:55
多語系的架構, 以及選語言的方式. 會改成用 dropdown. 不過昨天大多先調整多語系的code, UI 的東西還沒做完
@utekidesign figma 或者 zeplin 可以嗎? 然後可以的話盡量先用 bootstrap 有的東西, 我怕我沒太多時間重刻 UI orz
utekidesign 2021-05-17 15:10:22
不然先調整排版或者部分元件的顯示方式去改 (例如選語言改成 dropdown 這類的), 先朝著讓上面的資訊方便閱讀的方向下去改
@kevinliao 有什麼想法嗎?
zyan951231 2021-05-17 15:13:56
@utekidesign 抱歉我似乎沒參與過用 AI 和 PS 來設計網站的時期…QQ
Figma/XD的好處是設計師們方便協作,有 css code panel 對前端工程師來說也比較方便
@lin.liszt PR 我好像看過了!~但是還沒時間 Deploy
需要串個 CI / CD, 先列個坑看誰有資源 & 時間可以用
我現在正在用一個Digital Ocean的 VPS
@zyan951231 @anmicius
會在#designer 這邊開啟相關的 Figma 協作
@utekidesign 所提供的 AI 我也會協助放到 Figma 上面

5 👍 7 1 🙏 1
tofus (Terry) 13:53:44 has joined the channel
Gordon 13:54:23
@gordon890908 has joined the channel
林禾堃 14:09:03
@ken1357924681010 has joined the channel
zyan951231 14:14:20
@zyan951231 has joined the channel
caasi 14:14:52
@caasi has joined the channel
Jonathan 14:21:32
@jonathan97.main has joined the channel
kjcl 14:21:41
Hi everyone, welcome Jonathan, who helped translate more of our UI to Bahasa Indonesia yesterday.
👍 7 2 4
alan5281 14:42:19
@alan5281 has joined the channel
Anmicius 14:45:19
@anmicius has joined the channel
kjcl 15:16:22
CI/CD Thread
現在是一個在VPS上跑的 NGinx/Gunicorn SystemD service. 我每一次要deploy 的時候必須先 Git pull; yarn build; sudo systemctl restart vaccinate
我可以把這個systemD service需要SuDO 的 Permission 關掉
我可以幫忙做 CD Pipeline 但是我比較習慣在 cloud 上做,不是 on-premise,你不介意的話我可以嘗試看看
像是跑在 ECS 或是 Heroku;我比較擅長打包成 container 的作法
不過要具體看你目前怎麼 deploy 的🤔
這段對嗎?我好奇 GCP 彰化機房有沒有被擋?
那麼什麼部分需要 CI / CD 呢?
Flask app
稍微看了一下大部分的 endpoint 可以變成靜態檔案,但是有一部分看起來會去 sync 抓資料,想知道什麼情況下會發生?
你說為什麼 會 call local_scraper?
yes,應該問說什麼情況下會去 call local_scraper ?
因為如果有人想要在他們 local machine 上面測試蟲蟲的話,可以:
pipenv run python --scrape
OK 那你跑在 VPS 的時候是沒有開啟 scrape 功能的嗎?
Redis 的KEY我可以到時候給你
.env 檔案
scraper -> VPS 是透過 Redis 傳遞的嗎?
Scraper -> 上傳到redis 從redis 讀
Great 那我大概知道怎麼做了,我先試試看 deploy 到 Heroku
到時候直接連到你的 Redis
好我把 key 私訊給你
我這邊先試著 deploy,如果你剛好下線,我會開一台 Redis 給你連連看
我在 GitHub 上開 issue 給你。你的 github username 是什麼/
先弄了 docker image(s). 我明天下班再來研究看看如何 deploy docker images on Digital Ocean. 如果你要直接嘗試的話也請便 🙂
但其實我同意你說的最終可能連 web server 都不需要,只剩下 scraper 需要在線上跑,那就得研究一下 static site generation。
kjcl 15:39:14


• 怎麼最好支援準備下一批的公費疫苗
• 怎麼收集現時名額資料

先 tag 一下 @mcpeng 有什麼想法
噢,只是想要先讓他知道有這件事。簡單摘要一下,就是之前 @kevinliao 做了一個可以查自費疫苗哪裡還有缺可以登記的網站。現在取消自費疫苗了,但有很多設計師想要跳坑幫忙設計得更好。

@kevinliao 覺得應該先釐清未來可能需要怎樣的民間疫苗查詢網站,再開工設計。

也許可以想一下可以如何參考口罩地圖的案例,政府開放 API 後民間可製作查詢介面,畢竟台灣最後還是需要大規模施打。
zyan951231 2021-05-17 20:17:25
請問 meeting 已經開始了嗎XD 我找不到加入的連結 QQ
🙌 4 👍 1
kjcl 15:43:47

關於公費疫苗制度的下一批的問題 - HackMD

👍 3 2