2017年7月26日

在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 PiCamera模組(而非USB CAM);因此需要多執行一步pip install PiCamera[Array]PythonOpenCV能夠存取Pi Camera模組

安裝完成後,需要跑個Sample Code試試看是否安裝正確;網路上有很多sample code,如果有興趣,也可以拿之前日本工程師寫的老闆偵測器(BossSensor)試試看。

這裡是一個支援OpenCV 3.1.0以上版本的測試程式:https://github.com/michael-chi/OpenCVSample;測試結果如下:

 

以下安裝步驟節錄自https://github.com/TechBubbleTechnologies/IoT-JumpWay-RPI-Examples/blob/master/_DOCS/2-Installing-OpenCV-3-2-0.md

Update apt-get:

$ sudo rpi-update

$ sudo apt-get update

$ sudo apt-get upgrade

Install developer tools:

$ sudo apt-get install build-essential cmake cmake-curses-gui pkg-config

Install required libraries:

$ sudo apt-get install \

    libjpeg-dev \

    libtiff5-dev \

    libjasper-dev \

    libpng12-dev \

    libavcodec-dev \

    libavformat-dev \

    libswscale-dev \

    libeigen3-dev \

    libxvidcore-dev \

    libx264-dev \

    libgtk2.0-dev

Install libraries used to optimize OpenCV:

$ sudo apt-get install libatlas-base-dev gfortran

Install Python development libraries & Numpy:

$ sudo apt-get install python2.7-dev

$ sudo apt-get install python3-dev

Install Numpy:

$ pip install numpy

$ pip3 install numpy

Create a directory to home OpenCV and enter it:

$ mkdir opencv && cd opencv

Checkout current OpenCV 3.2.0 & the contribs:

$ wget https://github.com/opencv/opencv/archive/3.2.0.zip -O opencv_source.zip

$ wget https://github.com/opencv/opencv_contrib/archive/3.2.0.zip -O opencv_contrib.zip

Unzip the code:

$ unzip opencv_source.zip

$ unzip opencv_contrib.zip

Move into the 3.2.0 directory, make the build dir and move into it:

$ cd ~/opencv/opencv-3.2.0 && mkdir build && cd build

Configure the build:

$ sudo cmake -D CMAKE_BUILD_TYPE=RELEASE \

    -D CMAKE_INSTALL_PREFIX=/usr/local \

    -D BUILD_WITH_DEBUG_INFO=OFF \

    -D BUILD_DOCS=OFF \

    -D BUILD_EXAMPLES=OFF \

    -D BUILD_TESTS=OFF \

    -D BUILD_opencv_ts=OFF \

    -D BUILD_PERF_TESTS=OFF \

    -D INSTALL_C_EXAMPLES=OFF \

    -D INSTALL_PYTHON_EXAMPLES=ON \

    -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.2.0/modules \

    -D ENABLE_NEON=ON \

    -D WITH_LIBV4L=ON \

        ../

If everything went ok you should see the following:

-- Configuring done

-- Generating done

Build OpenCV, grab a beer as this will take a while, come back and check at intervals to see if there has been any errors:

$ sudo make -j4

Once complete you should see the following:

[100%] Built target ...

Install OpenCV:

$ sudo make install

$ sudo ldconfig

Test the installation:

$ python/python3

>> import cv2

>> print (cv2.__version__)

>> import face

 

 

 

2017年7月24日

在Azure Logic App中使用Function App的Tips

一些在Logic App中使用Function App的筆記

  • Logic App中使用Function App

n   如何將參數傳給Function App

u  假如Logic AppHTTP Trigger會產出一個字串Outpout(如:Condition_1),我想要組成如下的Json文件,我們想把這個Json當成傳入給下一個步驟的Function App(RuleEngine)的參數。

{"condition":"Condition_1"}

設定的方式為:

Function RuleEnginRequest Body設定中,手動填上

{

           "condition":"<PLACE HOLDER>"

}

由標點到<PLACE HOLDER>處,手動加上actionBody('<上一步驟的名稱>')

n   Function App有一個Blob Input;會根據所傳入的condition值,讀取位於指定的Storage下的ruleengine/{condition}.json檔案

l   Function App定義Run.csx如下

public class BlobInfo

{

    public string condition { get; set; }

}

public async static Task<HttpResponseMessage>

Run(HttpRequestMessage req,

BlobInfo info,

string blobContents,

TraceWriter log)

{

           //…省略

}

l   Function.json設定binding如下

{

  "bindings": [

    {

      "name": "info",

      "type": "httpTrigger",

      "direction": "in"

    },

    {

      "name": "blobContents",

      "type": "blob",

      "direction": "in",

      "path": "ruleengine/{condition}.json",

      "connection": "<YOUR CONNECTION>"

    },

    {

      "name": "res",

      "type": "http",

      "direction": "out"

    }

  ]

}

n   針對某一個StepOutputIteration

u  加入ForEach Action,假設Json文件內容為

{

           handlers:[

                     {

                                "Name":"item1"

},

{

     "Name":"item2"

}

           ]

}

則指定針對actionOutputs(<步驟名稱>)['body']['handlers']Repeat

n   對每一個Array ElementName屬性做Switch-Case

 

2017年7月19日

VM ScaleSet版本更新

最近有個需求是要對架在VM ScaleSet上的服務做版本更新;並且在版本更新時,希望確保在版本更新的同時降低Downtime。因為在測試階段會有Staging環境,可能的話希望透過Production/Staging切換的方式進行。

下面是幾個SurveyVM Scaleset上的版本更新方式比較。

  • 更新VM Base Image

n   https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-upgrade-scale-set

n   設定新版本的VM ImageVMSS,然後"手動"Rolling update以確保沒有Downtime

u  預設UpgrdePolicyManual,表示我們必須自己手動更新所有的Instance;這樣可以確保客戶端沒有Downtime

u  也可以將UpgradePolicy設定為Automatic,如此一來,VMSS"同時"更新所有InstanceImage為新版本的Image;會造成Downtime

  • VIP Swap

n   透過Script切換Production/Staging環境的VIP

u  http://blog.michaelchi.net/2017/07/vm-scale-setvip-swap.html

n   在切換的過程中,使用者會感受到明顯的Downtime;在我的環境上,約有10-20秒的時間無法連線。

  • Application Gateway

n   如果前方有Application Gateway;可以透過重新關聯Application Gateway Rule的方式做切換

u  Production/Staging環境應該都已經設定了Backend PoolListenerRule

u  StagingRule解除關聯

u  ProductionBackend Pool重新指定到StagingBackend Pool

u  Application Gateway目前只支援Dynamic Public IP,並且不可指定DNS Name;使用前須注意。

n   切換過程中沒有明顯的Downtime;但是切換需要的時間較長,我的測試中,將環境從Staging切換到Production約需要一分鐘左右。

 

 

2017年7月17日

兩個VM Scale Set做VIP Swap

AzurePaaS服務例如Web App提供了Deployment Slot可以讓我們在不同的版本之間做切換;當我們更新了版本,可以先佈署到一個"Staging" Slot,測試完畢後,再切換到"Production" Slot

而在IaaS上平台本身則沒有提供這樣的機制,需要另外透過程式的方式進行。以下的範例中,我們透過ARM Template在同一個Resource Group中的Virtual Network的兩個Subnet中建立了兩個VM Scale Set,各自代表V1V2的版本(https://github.com/michael-chi/VMSSVipSwap/blob/master/arm-2vmss-customImage.json )。其架構如下:

 

 

 

 

 

 

 

 

 


在這個範例中,我透過預先建立好的兩個Windows Server 2012 Custom Image,在上面安裝了IIS Server並建立一個Default.Htm,用簡單的字串代表版本一和版本二。

其中,LB1後面接的VMSS V1代表版本一服務;LB2後面對接的VMSS V2代表版本二的服務。在實務上,我們可能會把LB 1所關聯的VIP設定為Static IP並透過DNS指定為我們Production環境的位址;當我們更新了服務到版本二時,為了減少版更新造成的Downtime。我們將版本二也佈署到雲端上的另一個VM Scale Set (VMSS V2),前方則透過LB 2這個Load Balancer來做Load balance。當我們確認版本二測試正常後,我們想要透過VIP的切換,將版本二"升級"Production版本;我們的做法是:

  1. 建立一個Temp IP
  2. LB 1IP指定給Temp IP
  3. LB 2IP指定給LB 1
  4. Temp IP指定給LB 2
  5. 刪除Temp IP

Power Shell Script在:https://github.com/michael-chi/VMSSVipSwap/blob/master/vip_swap.ps1

 

測試看看:

  • VIP Swap前:

  • VIP Swap

  • VIP Swap後:

 

Blog Archive

About Me