tag:blogger.com,1999:blog-16453551413109641922024-03-14T01:07:41.341+08:00Michael的雲端筆記本Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.comBlogger190125tag:blogger.com,1999:blog-1645355141310964192.post-3635577567520089112017-10-26T17:20:00.001+08:002017-10-26T17:21:29.352+08:00[Blockchain][Ethereum]建立oracle 在Ethereum中,所有的資料都只在blockchain中流動,如果需要取得外部的資訊(例如天氣資料),只能透過oracle跟外部溝通。在這篇文章我們不討論oracle的安全性議題,而專注在如何建立一個oracle,讓外部取得blockchain中發生的事件。 完整的oracle contract架構如下: myClientContract"繼承"OracleApp合約OracleResolver合約保存實際Oracle合約(OracleContract)的位址OracleContract會trigger一個QueryEventOffchain listener會監控QueryEvent,如果此Event發生,則Offchain listener會收到通知,在這裡便可以將資料存到外部資料庫 步驟 所有的source code都在Github上:https://Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-53206364525382795782017-10-11T17:02:00.001+08:002017-10-11T17:02:45.949+08:00[Ethereum][Blockchain] Authentication Neded:Password or unlock 與 personal_unlockAccount does not exist 在Azure上可以直接由Marketplace佈署Ethereum Network。佈署完成後,我們可以透過Marketplace佈署Truffle Client機器,也可以直接在Linux上安裝Truffle作為client端的開發測試工具。以下是我在測試過程中遇到的一些問題。 1. 當執行Truffle migrate時,出現Authentication Neded:Password or unlock錯誤 Ethereum的Transaction Node為了安全考量,預設會將帳號鎖定;任何寫入Blockchain的交易都需要先unlock帳號。 使用geth或truffle可以透過下列指令來解鎖 personal.unlockAccount(web3.Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-64318470856630955862017-09-13T14:47:00.001+08:002017-09-13T14:47:34.886+08:00Azure Event Grid測試筆記 照著這份文件的步驟跑了一次Event Grid Custom Event測試;大致都滿直觀的。另外額外測試了一下Custom Filter,目前似乎只能針對Subject這個欄位Filter: 假如我在Subscription設定了如下的Filter 則以下的Event會被此Subscription接收 Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-80206816431993720772017-08-23T12:26:00.001+08:002017-08-23T12:26:46.717+08:00Bot Framework Bot + Facebook Messenger 2.0讓真人客服與對話機器人合作 Facebook在今年的F8大會上公布了新的Messenger platform 2.0;其中一個新的功能是新的Handover API,他允許我們在Messenger平台上開發不同App,並在App之間共享對話資訊。其中一個常見的應用便是對話機器人與真人客服之間的"Handover"。 為了快速的測試,我依照Facebook的文件,以C#寫了一個Webhook來模擬真人客服的工具,在這個模擬程式裡面,不管使用者說甚麼,他都會在使用者的輸入前加上[From Agent]後回傳。由於Facebook Messenger API規定只有Primary Receiver(在這裡是我的客服機器人)可以切換目前的對話Owner。因此,當消費者對客服說"bye"時,我便透過FBHelper這個類別中的TransferControlBackToBot()將對話控制權交還給客服機器Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-40064506351136526682017-07-26T10:36:00.001+08:002017-07-26T10:36:35.675+08:00在Raspberry Pi (with Pi Camera Module)上安裝OpenCV 安裝過程主要是參考了這一篇的步驟,基本上沒有甚麼特別需要注意的地方,一步一步照著做下來就是了 https://github.com/TechBubbleTechnologies/IoT-JumpWay-RPI-Examples/blob/master/_DOCS/2-Installing-OpenCV-3-2-0.md 依照步驟安裝完成後,因為我所使用的是Raspberry Pi的Camera模組(而非USB CAM);因此需要多執行一步pip install PiCamera[Array]讓Python與OpenCV能夠存取Pi Camera模組 安裝完成後,需要跑個Sample Code試試看是否安裝正確;網路上有很多sample code,如果有興趣,也可以拿之前日本工程師寫的老闆偵測器(BossSensor)試試看。 這裡是一個支援Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-28937433717806579292017-07-24T19:18:00.000+08:002017-07-24T19:19:29.944+08:00在Azure Logic App中使用Function App的Tips 一些在Logic App中使用Function App的筆記 在Logic App中使用Function App <![if !supportLists]>n <![endif]>如何將參數傳給Function App <![if !supportLists]>u <![endif]>假如Logic App的HTTP Trigger會產出一個字串Outpout(如:Condition_1),我想要組成如下的Json文件,我們想把這個Json當成傳入給下一個步驟的Function App(RuleEngine)的參數。 {"condition":"Condition_1"} 設定的方式為: 在Function RuleEngin的Request Body設定中,手動填上 { &Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-72710345043906106012017-07-19T11:18:00.001+08:002017-07-19T11:23:24.715+08:00VM ScaleSet版本更新 最近有個需求是要對架在VM ScaleSet上的服務做版本更新;並且在版本更新時,希望確保在版本更新的同時降低Downtime。因為在測試階段會有Staging環境,可能的話希望透過Production/Staging切換的方式進行。 下面是幾個Survey的VM Scaleset上的版本更新方式比較。 更新VM Base Image <![if !supportLists]>n <![endif]>https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-upgrade-scale-set <![if !supportLists]>n <![endif]>設定新版本的VM Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-63684856306280940172017-07-17T15:09:00.001+08:002017-07-17T15:09:42.702+08:00兩個VM Scale Set做VIP Swap Azure的PaaS服務例如Web App提供了Deployment Slot可以讓我們在不同的版本之間做切換;當我們更新了版本,可以先佈署到一個"Staging" Slot,測試完畢後,再切換到"Production" Slot。 而在IaaS上平台本身則沒有提供這樣的機制,需要另外透過程式的方式進行。以下的範例中,我們透過ARM Template在同一個Resource Group中的Virtual Network的兩個Subnet中建立了兩個VM Scale Set,各自代表V1與V2的版本(https://github.com/michael-chi/VMSSVipSwap/blob/master/arm-2vmss-customImage.json )。其架構如下: <!--[if gte vml 1]>Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-77656877639736539112017-06-29T22:50:00.001+08:002017-06-29T22:50:44.214+08:00簡易Bing Speech STT WebSocket Sample Bing Speech API除了REST API介面之外,也提供了WebSocket介面;不過只有Android、iOS以及Windows平台才有提供相對應WebSocket的API。其他平台如果可以使用WebSocket,則可以依照Protocol文件(https://docs.microsoft.com/zh-tw/azure/cognitive-services/speech/api-reference-rest/websocketprotocol) 實作以WebSocket與Bing Speech API溝通。 Bing Speech To Text API提供了三種辨識的方式:Interactive、Conversation及Dictaction;每種方式有各自的Endpoint;連線時需要依據辨識方式連接到不同的端點。 Mode Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-73189926911510085492017-06-29T21:48:00.001+08:002017-06-29T23:01:22.531+08:00簡易Bing Speech STT WebSocket API Wrapper Bing Speech API除了REST API介面之外,也提供了WebSocket介面;不過只有Android、iOS以及Windows平台才有提供相對應WebSocket的API。其他平台如果可以使用WebSocket,則可以依照Protocol文件(https://docs.microsoft.com/zh-tw/azure/cognitive-services/speech/api-reference-rest/websocketprotocol) 實作以WebSocket與Bing Speech API溝通。 Bing Speech To Text API提供了三種辨識的方式:Interactive、Conversation及Dictaction;每種方式有各自的Endpoint;連線時需要依據辨識方式連接到不同的端點。 Mode Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-31554290320828895492017-06-17T18:47:00.001+08:002017-06-17T18:48:39.978+08:00Cortana與企業端驗證 新的Cortana Channel讓Bot Framework建立的對話機器人利用Windows 10, iOS及Android上的Cortana與使用者透過語音對話。 Cortana Channel也提供了內建的OAuth 2.0驗證機制,讓機器人服務通過驗證的使用者,在企業情境下非常有用。 啟用Cortana OAuth支援的方式在官方網站上已經有詳細的說明:https://docs.microsoft.com/en-us/cortana/tutorials/bot-skills/bot-skill-auth;一個比較需要注意的地方是,如果是透過Bot Builder建立的機器人,在一開始撰寫時應該已經註冊過Microsoft App了;此時,不需要再如文件上的說明建立一個新的App,只需要到https://apps.dev.microsoft.com找到先前登入好的Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-74896798416352948972017-05-16T15:03:00.000+08:002017-05-16T15:04:28.758+08:00在Ubuntu上Compile Azure IoT Edge Azure IoT Edge是今年的Build大會上宣布的新的Azure IoT家族的服務,同時也是先前釋出的IoT Gateway SDK的進化版本;透過Azure IoT Edge,強化設備端在物聯網的方案中的能力。有興趣的話可以在這裡註冊預覽:https://aka.ms/pspreview 為了讓設備端可以更緊密的與雲端的Azure IoT服務聯繫,在設備端上我們必須要使用Azure IoT Edge (Azure IoT Gateway SDK)與雲端溝通;Azure IoT Edge的詳細安裝設定方式在Github上有詳細的說明:https://github.com/Azure/iot-edge/blob/master/doc/devbox_setup.md 下面是我在Ubuntu 14.04上面安裝Node.js Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-49599126792216208652017-03-23T15:18:00.001+08:002017-03-23T15:23:01.005+08:00[Azure IoT Suite]使用客製化的登入驗證登入IoT Suite網站 Azure IoT Suite提供了一個Pre-Configured的解決方案,讓開發人員可以快速的開發IoT方案而無須全部從頭開始。由於是"Pre-Configured",因此這個方案有許多的前提假設,其中一個假設是,人員需要透過Azure AD來管控。而某些情況下,特別是當我們需要將現有人員資料的方案與IoT Suite整合時,這常常會造成一些額外的挑戰。 Azure IoT Suite基本上是一個ASP.Net MVC的專案,透過OWIN來做身分驗證,因此,如果我們想要將現有的人員管控機制(例如資料庫)與IoT Suite整合時,我們還是可以透過OWIN來提供另外一種身分驗證機制。 <![if !supportLists]>l <![endif]>首先,下載最新版本的IoT Suite Source Code <![if !Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-16508311485981542622017-03-08T11:33:00.001+08:002017-03-08T11:38:10.275+08:00在Raspberry Pi 3上安裝Pocketsphinx以及Node-Pocketsphinx 語音辨識是近來非常熱門的議題,透過語音助理在某些場景下可以提供相當的便利性,特別是當我們能夠在一些小型設備上實現語音辨識。語音辨識因為牽涉到大數據以及機器學習,對於軟硬體的需求較高,一般人並不是那麼容易實現,因此各廠商也紛紛端出了雲端的語音辨識方案,例如Microsoft Cognitive Service中的Bing Speech API。 雲端的方案因為有比較好的硬體支持,比較完整且大量的資料庫以及專門的研究人員不斷的研發改進,因此辨識效果上一般會比較好。但是,某些情況下我們還是需要離線的解決方案作為備援;這時有許多的開源的選擇,例如Pocketsphinx。 Sphinx是美國卡內基美隆大學所開發的英語語音識別系統,PocketSphinx則是基於Sphinx-2所開發的適用於嵌入式系統上的語音識別方案。網路上有許多基於PocketSphinx開發的FrameworkMichael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-22019852077492829082017-02-19T15:56:00.000+08:002017-02-19T15:57:43.731+08:00使用MQTT協議存取IoT Hub 使用MQTT協議存取IoT Hub Azure IoT Hub內建支援MQTT 3.1.1,當設備無法使用IoT Hub SDK時,我們可以透過直接操作MQTT協議對IoT Hub進行操作。 在官方文件中說明了如何使用MQTT存取IoT Hub的各項功能,不過實際上實作的時候可能或多或少還是會遇到一些狀況;這一篇文章我透過Paho這個MQTT Client的UI工具,直接透過MQTT去存取IoT Hub。 準備事項 <![if !supportLists]>l <![endif]>首先建立一個IoT Hub,並使用Device Explorer工具建立一個Device其Id為device001 <![if !supportLists]>l <![endif]>建立完成後,產生一組Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-4596050984142204342016-12-13T22:35:00.001+08:002016-12-13T22:37:10.735+08:00建立自己的Channel與LUIS Action Binding整合 在上一篇中,我們展示了如何透過LUIS Action Binding & Action Fulfillment整合Bot Framework建立一個不需要寫程式也能運作的Chat Bot;不必寫程式碼雖然很吸引人,但是必要的複雜邏輯勢必還是要透過萬能的程式解決。 在LUIS的Action Binding機制中,也允許我們寫自己的Channel,在Action被Trigger之後,LUIS可以去呼叫我們自己的API取得回應。下面我們用一個很簡單的範例說明。 <![if !supportLists]>l <![endif]>首先,我們先建立一個C#的API App <![if !supportLists]>n <![endif]>事實上,任何形式的REST API都可以;這裡只是為了簡單使用API Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-57267958840465410202016-12-13T18:37:00.001+08:002016-12-13T18:38:06.380+08:00LUIS Action Fulfillment +Bot Framework = 不需要程式碼的Chat Bot Bot Framework搭配LUIS作為語意分析,可以讓我們的對話機器人更有人性的理解我們的需求。在LUIS新的版本中,也推出了許多方便的功能與Bot Framework搭配;其中一個Action Fulfillment可以讓我們不必寫程式也能夠完成許多基本的需求。 在這個例子中,我會建立一個LUIS應用程式透過預設的GetWeather Channel來取得現在的天氣狀況,並與Bot Framework整合。(完整的預設Channel列表在:https://www.luis.ai/Help#PublishingModel ) 以下的例子假設您已經有使用LUIS的經驗,並且使用過Bot Framework Developer Portal。 <![if !supportLists]>l <![endif]>登入https://Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-60066299604265768432016-11-25T08:26:00.001+08:002016-11-25T10:31:34.996+08:00用Azure Functions處理物聯網事件
Azure Functions是Azure的Serverless服務,非常適合用來處理需要快速開發佈署、任務單純的需求;使用Azure Functions的Dynamic層級時,系統會依照資源使用量自動調整系統規模,減少管理的人力與時間。
在為北京的客戶建立物聯網方案時,我們使用Azure Functions來作為呼叫第三方服務的方式;傳統設備端的數據進到IoT Hub之後,利用Stream Analytics挑出事件並放到Service Bus Queue中,然後利用Azure Functions把數據透過REST API傳給第三方服務。由於Queue的特性,我們可以簡單地達到保證送達;並且因為任務單純明確,使用Azure Functions可以很快的完成需求。
方案架構大約如下
<![if !supportLists]>1. Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-12230200721201050662016-11-23T15:29:00.001+08:002016-11-23T15:29:17.080+08:00幾個發布UWP到Windows 10 IoT Core上的方式 (二) WinAppDeployCmd WinAppDeployCmd工具隨著Windows 10 SDK安裝在C:\Program Files (x86)\Windows Kits\10\bin\x86目錄下 詳細的使用方式可以參考這一篇:https://msdn.microsoft.com/zh-tw/library/mt203806.aspx 確認Windows 10 IoT Core設備能以網路連線並且參考前一篇的方式產生UWP Package後 打開Cmd切換目錄到WinAppDeployCmd安裝路徑輸入以下指令 WinAppDeployCmd.exe install -file "C:\Temp\App2\App2\AppPackagesv105\App2_1.0.7.0_Debug_Test\App2_1.0.7.0_arm_Debug.appxbundle" -ip 192.168.1.111 其中Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-77377735776462229122016-11-23T11:50:00.001+08:002016-11-23T11:50:24.007+08:00幾個發布UWP到Windows 10 IoT Core上的方式 (一) Visual Studio/IoT Portal算是把這幾天測試的心得做個筆記 Visual Studio遠端發布 這應該是開發人員最習慣的方式 首先確認你的Visual Studio 2015已經安裝了Update 3以及Remote Debug Tool Update 透過IoT Core的Portal確認Remote Debugger已經啟動 如果沒看到msvsmon.exe,在Portal上設定啟動 這裡如果還有錯誤,我的方式是更新到Windows最新版本,然後Reboot 打開Visual Studio專案,在Debug設定如下;其中192.168.1.111是Windows 10 IoT Core設備的位址 接著就可以用Visual Studio直接佈署了 透過IoT Portal發布 打開Visual Studio專案,選擇Store –> Package 選擇No,因為IoT Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-24884374157894905912016-09-30T15:54:00.001+08:002016-09-30T16:01:06.611+08:00在Windows Server上架設Mosquitto Server筆記一下在Windows VM上安裝Mosquitto的步驟 準備事項 在Windows環境上安裝OpenSSL:http://slproweb.com/products/Win32OpenSSL.html 安裝Mosquitto:https://mosquitto.org/ 以OpenSSL建立憑證 依序執行以下指令建立憑證給稍後Mosquitto做SSL連線使用 openssl req -new -x509 -days 3650 -keyout m2mqtt_ca.key -out m2mqtt_ca.crtopenssl genrsa -des3 -out m2mqtt_srv.key 1024openssl req -out m2mqtt_srv.csr -key m2mqtt_srv.key -newopenssl x509 -req -in m2mqtt_srv.csrMichael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-77610456726084137642016-09-25T07:26:00.001+08:002016-09-25T07:26:28.860+08:00.Net Micro Framewrok連接IOT Hub.Net Micro Framework適合使用在資源受限制的設備上,例如各種嵌入式設備;讓開發人員使用熟悉的Visual Studio以及C#來撰寫這些設備上的程式。在物聯網的情境下,若要與Azure IOT Hub連接發送感測資料,或是接收由IOT Hub發送下來的資料時,可以透過適用於.Net MF上的MQTT或是AMQP函式庫,直接操作底層的通訊協議;或是使用Azure IOT SDK的Micro Framework Libaray連接。 在這裡,我們使用AMQP .Net Lite這個Library來實現.Net Micro Framework與IOT Hub連接。 程式碼(文末)相當簡單,基本上只要照著範例做就可以了;比較需要注意的是連接時的username與password username:其格式為<DEVICE ID>@sas.<IOT HUB Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-74673188167834658952016-08-25T17:37:00.001+08:002016-08-25T17:37:28.558+08:00[Azure]客製化IOT Suite Portal的儀錶板Azure IOT Suite是一個開源、預先設置好的套件,透過此套件可以讓我們快速的客製化開發IOT的解決方案。關於IOT Suite詳細的資訊可以參考這裡:https://azure.microsoft.com/zh-tw/suites/iot-suite/ 在所有的IOT專案中,儀表板幾乎都是需要相當程度客製化的;一般來說,我們可以透過PowerBI來拉好所需的報表,再鑲入IOT Suite的Portal上;或是使用其他第三方廠商或是開源的專案來製作報表(例如Freeboard) 這裡我想展示的是如果我們只是單純地想在IOT Suite介面上增加簡單的欄位,所需的客製化步驟。 在開始進行前,我們需要一個前端模擬器,這個前端模擬器會模擬設備送上數據以及metadata;我已經事先準備好了一個IOT Suite模擬器:https://github.com/michael-chi/Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-69857702702223145992016-08-16T00:18:00.001+08:002016-08-16T00:28:10.422+08:00用Azure Alert與Azure Automation自動回應系統警告Azure Alert可以讓我們針對系統的效能指標設定警告,例如當CPU五分鐘內平均用量大於90時,發出一個警告;這時我們通常會希望系統自動將機器提升到更高等級。或是例如當Azure Service Bus Queue用量到達一定程度時,發出警告郵件給管理者等等。 這類自動針對警告做出相對動作的機制,在Azure上可以透過Azure Automation的WebHook來達成;以下我會以Azure SQL Database作為範例,展示當Azure SQL Database的Storage用量到達一定程度時,透過Automation Webhook自動調升SQL等級。 當然,上述功能也可以透過Azure SQL Database的Elastic Database Pool讓我們更彈性的使用保留的DTU,特別是當我們有多個資料庫時,Elastic Database Pool可以更有效的運用Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0tag:blogger.com,1999:blog-1645355141310964192.post-47407884102461200782016-08-05T10:09:00.001+08:002016-08-05T10:16:42.163+08:00[Azure]存取AD B2C tenant的資料在上兩篇文章中,我們示範了如何建立Azure B2C Tenant以及如何透過B2C Tenant驗證管理會員資料;接下來我們要模擬一個情境:我的公司管理網站需要透過企業AD驗證身分,並且我作為一個管理員可以透過此管理網站取得(或修改)已經登入的會員資訊。 為了達到這個模擬情境,我們需要準備以下的資源: 一個Azure AD Tenant(非B2C Tenant) 一個Azure AD B2C tenant 一個管理網站,並設定期使用Azure AD驗證身分 為了方便起見,這裡的Azure AD Tenant我使用公司本身的Azure AD;Azure B2C Tenant則沿用上篇文章中所使用的B2C Tenant。 在B2C Tenant建立App 先到https://manage.windowsazure.com上,打開B2C Tenant管理頁面,註冊一個App Michael Chihttp://www.blogger.com/profile/10234833310559494855noreply@blogger.com0