2020/01/13

[自己的 Hackathon] L10 盃黑客松之即時開票系統 - 過程 (不含技術介紹)

決定好了題目後
接下來就是要決定實作的系統樣貌跟需要用到的技術
好幾年前 (大約是林傑學長還在做微軟技術傳教士時)
我有用過 Azure Functions 做過一個整合 slack 與 trello 的 bot
當時是直接在 Azure 提供的網頁上寫 python 來達成
這次也是想利用 serverless 的技術試試看
所以設計了一個簡單的架構


流程簡圖

Crawler 跟 Update Handler 就用兩個 Azure Functions 實作
Queue 的部分使用 Azure Queue Storage

先來重新學習現代化的開發方式


這次想順便試試看目前使用 IDE 開發 Azure Functions 能做到多方便
所以先以 "使用 Visual Studio Code 在 Python 中建立和部署無伺服器 Azure Functions"
這篇微軟官方的教學文件開始
星期五晚上把小鬼們都弄去睡覺之後
就開始依著這篇文件一步步的學習
文件還算詳細
雖然還是有遇到一點點小問題
不過都能透過 Google 大神找到解決方法
走過整篇文件後
就可以學會幾件事情

1. 如何在本機上開發 Azure Functions 且啟動 local debugger
2. 如何建立 HTTP 觸發的 Azure Functions 並測試
3. 如何把資料用 Azure Functions 送到 Azure Queue Storage 中
4. 如何部屬本機開發好的 Azure Functions 到雲端上

我做完整個教學後就去睡覺了
準備明天早上起床後再新建立一個專案來做真正的系統

把系統雛型產生出來


一早八點起床
老婆出門上班而小鬼們還在睡
趁機加緊腳步把 Crawler, Update Handler 以及 Azure Queue Storage 都先建好
定義好要塞進 queue 的 JSON 樣子後
先把組合出 JSON 後塞入 queue
以及被 queue 觸發後取得 JSON 的部分做好

當然中間少不了排解小鬼們的紛爭
還有被女兒甩了門後進行諄諄教誨的時間
接著開始準備兩位少爺小姐的午餐
等到老婆回家後我趁隙出門投票
直到他們開始午睡
我再繼續推進我的進度

最後在投票截止前約半小時把基本的功能完成
Update Handler 可以依 JSON 的內容, 把票數填寫到對應的儲存格中
因為尚未開票所以沒有票數頁面可以爬
於是我用中選會網站的 "候選人簡歷" 確認我會使用 package 寫出可行的 Crawler
接著就是守在電腦前等待得票數頁面出現

有人投票日一早開 vscode 的嗎?

最刺激的時刻總會出現問題


我重新整理中選會網站到約下午四點十七分
開始出現得票數頁面了
馬上著手修改 Crawler 的部分
結果竟然遇到無法印出爬到的內容 (因為我想先用 print 看看爬到的內容是否正確)
搜尋了半天還是沒找到解法
靈機一動想說先印出爬到表格的欄數與行數
這樣我可以知道哪一張才是得票數表格
果然有用, 馬上針對我想知道的候選人票數做處理 (對不起宋杯杯)
確定爬到總統得票數且能透過 Azure Queue Storage 觸發 Update Handler
也寫了正確數字到 spreadsheet 後信心大增
就開始把剩下的區域立委做完
同時使用本機的方式先確定可以一直爬到最新票數
終於在五點半時按下 Deploy 按鈕送上雲端

一開始先以每一分鐘觸發一次的頻率觀察一下
前幾分鐘好像一切正常
結果出現了票數回朔的現象
只好馬上來 debug
用著不熟悉的 Azure 介面看 Application Insights
赫然發現我的本機仍在執行 Azure Functions
所以才會有被修改兩次的現象
但是關掉本機之後又發現不會取得最新的票數
Azure 雲端上的 Crawler 似乎會一直拿到一樣的內容
查了半天查不出結果
幸好透過 Application Insights 了解到原來在本機執行也可以
只好在出門前把雲端上的都關掉
開啟本機上的開發環境讓他自己跑了
萬幸的是在外面用手機看 spreadsheet
有一直在更新票數
才鬆了一口氣

最後收尾的 spreadsheet 排名


回到家後幫孩子們沐浴更衣完後
把最後 spreadsheet 上的結果表格
依照之前討論的勝利方式
利用條件式格式設定功能
將猜測最準的人 highlight 出來
這裡也學到了幾個 spreadsheet 公式
整個只有自己的 hackathon 就這樣告一段落
收穫真的很多

複雜的 spreadsheet 公式

沒有留言:

張貼留言