跳到主要內容

如何在Azure上佈署一個數據可視化網頁(2019-nCov)

如何在Azure上佈署一個數據可視化網頁(2019-nCov) 

簡介

很久沒有更新這個網誌了,所以藉著之前在家抗疫的日子建立了一個簡單的數據可視化程式,現在這個網站現在在Azure 中的一台VM中運行。 該網站的代碼已放置在我的Github中, 我把它分為API 和 前端網頁兩個Repository。 以下是它們Repository的網址

1.https://github.com/Isaac234517/ncov-web-api
2. https://github.com/Isaac234517/infection

而本項目的網址是 http://13.76.99.126/static/index.html
下圖是效果圖






這個可視化項目分為主頁及地圖, 主頁中會顯示你所選擇的地區的確診人數的趨勢圖及每日新增的趨勢圖。 而另外一頁是以數據地圖形式顯示世界各國的確診人數。
本項目的數據來自github上的https://github.com/BlankerL/DXY-COVID-19-Data  項目。本文章是在2019/04/13號草擬, 所以上圖的數據是4月13日當天的某個時間。

架構

我把本項目佈署到azure 的VM上, 由於項目的數據來自DXY-COVID-19-Data 項目。 我使用的是該項目當中的json 格式數據, 為確保數據能時常保持與DXY-COVID-19-Data 項目的數據同步所以在VM上我寫了一個cronjob 會每小時都會git pull 一次, 整個項目的數據會每小時更新一次。  另外這個項目採用Python 的Flask 開發, 頁面則時純靜態頁面。  下圖是本項目的架構圖;


此項目運行在Azure Platform 上的Linux VM中。 如上圖所示, 網頁的Http Request 通過Nginx 處理, 數據存取則透過頁面調用 Flask 的API 存取位於VM 上的JSON File  JSON File 則透過系統的Cron job 每小時使用Git pull  更新。

涉及的工具 、所使用的第三方程式庫或Framework 

1. Azure Platform
2. Nginx,
3. Python
4. Flask Web framework
5. git
6. Jquery , Bootstrap, EChart, Chosen.Jquery

在Azure 上架設本項目

接下來會介紹如何在Azure 的VM 上架設本網站,  首先大家需要開設一個Azure Account。
由於項目是實驗性質, 所以我會開設的VM 是這種

其餘磁碟及網絡則按照自己的需要選擇。
切記要令互聯網能存取你的VM的話, 需要設置能使用http 80 port 連接你的VM 設置的位置如下圖

設置好後, 便可打開Terminal ,輸入ssh username@vm_ip  連接你的VM


設置Flask Web API 

1. 在VM 中 輸入以下指令 安裝 python pip 及flask
    sudo apt-get update 
    sudo apt install python3.6
    sudo apt install python3-pip 
    pip3 install flask
    pip3 install flask-cors 
2. 完成安裝後安裝 git
    sudo apt install git
3. 安裝完成後 使用git clone 下載 DXY-COVID-19-Data 到VM中
4. 下載後前往DXY-COID-19下的JSON Folder, 下圖中紅圈標示的json 檔案是本項目會用到的數據檔案。
5. 由於數據是需要定時更新, 所以編寫了以下bash script
其中 cd "XX" 中的是DXY-COVID-19-Data 的資料夾路徑。 需要按照你的擺放位置更改。
6. 之後使用linux 的crontab 功能設置定時運行上面的bash script 我把它命為repository_update.sh 並且而放在ncov-web-api repository 下。  在terminal 中 輸入crontab -e  

之後輸入上圖中的0 * * * * XXX  XXX 是檔案路徑 如上圖 我的bash script 路徑是/home/Isaac/repository_update.sh  輸入後存檔退出。 
7. 使用crontab -l 檢查是否已正確設置 
現在,系統會每小時便運行git pull 更新DXY-COVID-19-Data 
8. 使用git clone 下載ncov-web-api repository 

9. 之後前往ncov-web-api資料夾下 輸入mkdir json_data 建立json_data 
10. 建立json_data資料夾後, 在json_datat 資料夾下建立4條symbolic link 指向剛才提及的4個json 檔案。 
   ln -s /home/Isaac/github/DXY-COVID-19-Data/json/DXYArea-TimeSeries.json DXYArea-TimeSeries.json
  ln -s /home/Isaac/github/DXY-COVID-19-Data/json/DXYArea.json DXYArea.json
  ln -s home/Isaac/github/DXY-COVID-19-Data/json/DXYOverall-TimeSeries.json DXYOverall-TimeSeries.json
  ln -s /home/Isaac/github/DXY-COVID-19-Data/json/DXYOverall.json DXYOverall.json
  指令中有顏色標示的是json 檔案的路徑。
11. 完成上面所有步驟後, 便可以開始設置網頁。

設置Web Page

本項的web page 是一個靚態網頁, render 是通過使用web api拿取數據實現的。 
1. git clone  infection 項目
2. 前往ncov-web-api 資料夾下建立symbolic link 
     ln -s /home/Isaac/github/infection/ static 
    指令中有顏色標示的是infection 項目的目錄。  在flask web framework下 static 目錄下的案案會被視為靜態檔案在http request 中以靚態方式呈現 (https://flask.palletsprojects.com/en/1.1.x/quickstart/#static-files
3. Web Page 及Web Api 的設置已完成, 現在可以開始最後的步驟, 設置nginx 伺服器。

設置nginx 伺服器

1. 使用apt 安裝nginx 伺服器
  

2. 安裝gunicorn 

3. 建立systemd 檔案, 該檔案會令到ubuntu restart時自動啓動gunicron WSGI Web Server 
 檔案內容可參考ncov-web-api下deployment_samples/app_service_sample 檔案

4. 在ncov-web-api資料夾下輸入以下命令 使系統在ncov-web-api資料夾下 建立app.sock 檔案 
5. 設署nginx 伺服器與gunicron連接
   設置內容下參考ncov-web-api/deployment_samples/app 檔案
  上圖中的server_name 需要改為azure vm 的public ip, proxy_pass 則改為http://unix:/ app.sock的檔案路徑 
6. 建立symbolic link 把/etc/nginx/sites-enabled/app 指向 /etc/nginx/sites-available/app 
7. 重啓nginx 伺服器
8. 開放防火牆給nginx 使用 
完成設置後,便可在瀏覧器輸入http://server_ip/static/index.html 

總結

整個過程對於初使用flask, gunicorn 及nginx 的人來說只需按照上面的步驟便可以成功部署。 

留言

這個網誌中的熱門文章

如何使用Macbook 進行W-Fi 竊聽及信號分析

OS X 中的Wi-Fi Analyzer 工具 要對無線網絡進行分析及診斷, 首先要在PC中安裝Wi-Fi Analyzer 應用程式。 Wi-Fi Analyzer是一種可以檢察Wi-Fi 信號強弱,找出適合架設Wi-Fi 的Channel , 搜尋附近Wi-Fi 接點及竊聽經Wi-Fi 傳送的網絡封包(這功能要視乎你的網卡是否支援監控模式)的工具。  在網絡上有不同的Wi-Fi Analyzer 供大家下載。 而在OS X 系統中, 其實已預設安裝了Wireless Diagnostics 程式。   在本文中, 會假定讀者對Wi-Fi 的專業名詞(如noise, ssid bssid 等)有基本的認識。 因此, 只會展示Wireless Diagnostics 的操作方法 。  Wireless Diagnostics  Wireless Diagnostics  是一個預設安裝在 OS X 系統的Wi-Fi 分析工具。 用戶可透過它的GUI 介面操作。  在主畫面中,按下option 鍵並點擊在上角的Wi-fi標記會出現Open Wireless Diagnostics。 然後點選它。 點擊工具列中的Window。 並會出現以下選項 如圖 1. Info     點取Info, 會顯示你現在所使用的Wi-fi資訊。 包括它的BSSID,Mac Address,Channel, Network Interface  等等資訊。 如下圖 2. Logs 點選Logs的話, 你可以選取想要收集的網絡介面日誌資訊。 要注意這設定需要重啓電腦才能生效。 並且它是會把收集到的資訊紀錄在電腦中。 因此當你不需要使用時,請記得把它關閉, 以免造成資源浪費。 3.Scan    點選Scan 的話,系統會立即掃描附近的AccessPoint  並列出它們的資料,包括SSID,Mac Address, Noise,RSSI,Channel 等等 資訊。另外系統也會對系統的現時環境作出評估, 列出最合適架設Wi-Fi 的 Channel。 以下圖 圖中的Summary, 就是系統對現在環境的評估。 Total 是系統偵擦到的AccessPoint 數目。 而Best 2.4GHz和Be

C# XML(輸出教學)

C# XML 輸出教學 XML 是其中一種主流的數據儲存格式之一, 在C# 中, 大概有3種不同的寫法把數據輸出成XML 文件。 在本文中, 我會利用一個簡單的Window form 程式介紹這3種不同的寫法。  以下是範例的XML 格式 <Im>    <Number>xx</Number>    <Name> xxx</Name>    <Type> xxx <Type>    <Data> xxx </Data> </Im> 從以上的結構可輕易看得出, 這個範例是把一張圖片輸出成XML 格式。 這是範例中使用的圖片 成功輸出的XML 文件 在Chrome 中顯示 Window form 程式 XML 輸出方法 方法一 首先要介紹的寫法是利用XMLElement 的操作, 在XmlDocument 中構建XML 節點。 上述程式碼先構建一個全新的XmlDocument, 然後逐一構建節點。 最後把構建的節點放到對應的節點或XML Root 節點下。 成功構建後便使用XmlDocument 中的save 方法輸出XML 文件。 以上要注意的事是使用這種方法生成XML 的話, 如遇到要處理圖片的情況。 請先把圖片轉換成base64 字串後, 再放到節點的inner Text 中。 方法二 第二種方法是利用XmlTextWriter 把xml node 按順序寫入Filestream 中。 最後輸出成XML 文件。 程序碼如下, 和方法1相比, 如遇到要處理圖片的情況下, 則只需把圖片的binary data  放到byte 類型的數組中, 再利用XmlTextWriter中的WriteBase64 方法便可。 不用自行轉換成base64字串。 但要留意的事是 由於是使用XmlTextWriter 是把text 以串流的型式輸出。 所以寫入資料流 時最好要按Xml結構的順序寫入。 因為在串流中append 結構是比較困難的事。 方法三 最後一種方法是使用XML.Serialization 空間下的方法, 個人比

C# 的Dynamic Object

C# 的Dynamic Object  介紹 在 .Net 4.0 版本 , C# 引入了動態編程。 實則上它並不是C# 語言的一部分 , 因為它是通過引入Dynamic Language Runtime(DLR library) 來實現的 。 對DLR Library 有興趣的話 可瀏覽( https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview )  但對於編譯語言(Compiled Language) 來說 ,  引入Dynamic 特性在當時(.Net 4.0 是在2010 發佈的)是一種大躍進 。 雖然 C# 中已有支援動態特性 , 但C# 始終是一種編譯語言 。所以我還是建議如非必要的話,還是不要使用動態編程 。 如果靜態編譯是可以做到這個效果的話就用靜態編譯實現 。 因為使用動態編程的話 , 在編譯時是不會提示你的程式碼會不會有錯誤 , 因此大大增加了執行時出現錯誤的風險 。 而且由於動態編程是late-binding. 所以物件的類別在執行時才會決定 。這種做法相對於靜態編譯是會有執行效率低的問題。 因此 編寫C# 程式應該以靜態編程的方式為主 。 但在以下情況 ,  用動態編程來編寫會較為合適 需要興COM Object 互動 Duck typing 需要與dynamic script language 如IronPython 或Ironruby 等互動 。 以上的情況, 有興趣的讀者可從互聯網中參考,  本文的以下部分會集中 說明C# 中 動態編程的基本語法, 介紹ExpandObject, DynamicObject 和 IDynamicMetaObject 及ExpandoObject 和DynamicObject 的用法。 Dynamic Keyword 若要在C# 中使用dynamic object, dynamic 這個keyword 你是絕對需要知道的 。 當一個變量以dynamic 作為它的型態 。 便代表它是late-binding. 編譯器在執行編譯時不會判斷它的型態 。 因此