2014年11月7日 星期五

jekyll使用sass(scss)

目錄結構

.
|-_sass
    |-default.sass
|-css
    |-main.sass

  • 將.sass(.scss)放於_sass資料夾中。
  • 將主css放於css資料夾中。


在main.sass中加入:

---
---
@import "default"

  • 需要加---是因為此檔案是要可以被jekyll所解析的,所以要符合jekyll格式。
  • @import的路徑只要是檔案名就可以了。

在.html中引用的路徑是css/main.css

  • jekyll會將.sass解析為.css所以後面寫.css即可。

PS:


想要變更_sass資料夾位置或名稱,在_config.yml中加入:

sass:
    sass_dir: 路徑

想要將css壓縮,在_config.yml中加入:

sass:
    style: :compressed

參考

將footer element固定於網頁最下方

這篇是看完CSS-TRICKS的Sticky Footer(要看程式碼請參考此連結)之後所理解出來的原理解釋。

步驟


1. 將網頁分為兩個部份:


  1. 網頁主體(page-wrap)
  2. 頁腳區塊(site-footer)

2. 因為是對於margin所作的效果,所以先將其設為0。


3. 將html及body的height設為100%是為了要將網頁設成視窗大小(如果小於視窗大小的話)。


4. 將網頁主體min-height設為100%以符合html大小,而將margin-bottom設為你要的大小的負數,這裡將邊界往內凹,讓頁腳區塊也可以在100%的高度中,但這樣會產生一個問題,當你的網頁長度(height)超過視窗-頁腳區塊的大小時,網頁主體的內容會跟頁腳區塊重疊,為解決這問題,我們需要設置:after。


5. 將網頁主體設定一個:after的區塊,這個after區塊要跟footer一樣大,after區塊會緊跟在page-wrap的內容之後(在page-wrap中),當然他也算在page-wrap的長度裡,這樣子我們就會給page-wrap一個跟site-footer一樣大小的block,也就是利用這個沒有內容(透明)的block去填補原本凹進去的地方,這樣子page-wrap的內容就不會跟site-footer重疊了。

2014年11月5日 星期三

裝設vim-airline font

在安裝vim-airline時有遇到幾個問題,在這裡做個整理。

1. 在terminal中沒有跑出顏色

解決:

在~/.vimrc中寫入下面的程式碼
if $COLORTERM == 'gnome-terminal'
set t_Co=256
endif

參考:

http://askubuntu.com/a/126

2. 安裝之後沒有出現airline

解決:

在~/.vimrc中寫入下面的程式碼
set laststatus=2

參考:

https://github.com/bling/vim-airline#configuration

3.在安裝之後無法完整顯示

解決:

照著https://powerline.readthedocs.org/en/master/installation/linux.html#fonts-installation所給的指示做。

注意:

A. ~/.fonts如果沒有此目錄的話,自己新增(mkdir ~/.fonts)
B. ~/.config/fontconfig/conf.d/如果沒有此目錄的話,新增(mkdir -p ~/.config/fontconfig/conf.d/

2014年11月3日 星期一

Jekyll問題排除

這裡列出幾個在使用Jekyll的時候所遇到的問題,供日後參考。


問題一:在gem install jekyll時遇到ERROR: Failed to build gem native extension.

解決:安裝ruby 1.9.1(sudo apt-get install ruby1.9.1-dev)

參考:
http://hire.chrisjlee.net/node/229
http://jekyllrb.com/docs/troubleshooting/#installation-problems

問題二:在gem install jekyll時遇到ERROR: While executing gem ... (NoMethodError) undefined method `name' for #<RDoc::RubyToken::TkLPAREN:...>

解決:安裝rdoc(gem install rdoc

參考:
https://github.com/jekyll/jekyll/issues/1560

問題三:在執行jekyll時遇到Could not find a JavaScript runtime.

解決:安裝nodejs(sudo apt-get install nodejs)

參考:
http://jekyllrb.com/docs/troubleshooting/#could-not-find-a-javascript-runtime-execjsruntimeunavailable
http://stackoverflow.com/a/9333316

2014年10月28日 星期二

解決git中[fatal: remote origin already exists.]的問題

在要把新的repository送上github的時候都會遇到[fatal: remote origin already exists.]的問題:
新增說明文字
這時候有兩個方式可以解決:
1. 改名(例:origin改成first)
2. 將origin的url改掉

第一個方式

git remote add origin [url]
改成
git remote add first [url]

第二個方式

利用set-url改掉origin的url
git remote set-url origin [url]

參考

取出js或是json檔案中的內容

在解析網頁的時候常常要到其js或是json中去取得資料,像是下面這兩個例子:

因此我寫了一個處理的function,可以輕鬆地拿到想要的資料:

步驟

1. 將空白刪除。
2. 將跳脫字元處理好。
3. 取出再"="跟";"之間的字串。

參考

2014年10月26日 星期日

在Chrome extensions中使用gif.js

最近看開chrome extension時遇到了gif.js使用上的問題,原因是在gif.js裡會使用到web worker,可是在chrome extension 中會出現SecurityError,搜尋google在stackoverflow中的一篇問答找到了原因,原來是因為chrome自身的bug所以讓extension無法讀取web worker。

步驟

1. 在chrome extension中加入patch-worker.js
2. 將gif.js檔案中的['gif.worker.js']取代成[chrome.runtime.getURL('path/gif.worker.js')]。
(註:path為你放gif.js的路徑)

2014年7月7日 星期一

在.NET應用程式中安裝RxNorm API

目的

由於要做藥物名統一的工作,中間需要用到RxNorm的API,現在把RxNorm API的安裝方式做一個整理。

環境

  • Visual Studio Express 2012
  • C#

步驟

1. 創立應用程式

新增一個新的C#專案,把[應用程式路徑]記起來。
[應用程式路徑]=C:\Users\Hsin_Ping\Documents\Visual Studio 2012\Projects\InstallRxNormAPI\InstallRxNormAPI

2. 記住[wsdl路徑]

在電腦中找出[wsdl路徑]記起來。
[wsdl路徑]=C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools

3. cmd

打開命令提示字元,輸入下列指令:

完成之後應該會得到以下訊息代表正確:

4. 在應用程式新增DBManagerService.cs

在應用程式按[右鍵]>[加入]>[現有項目]新增DBManagerService.cs。

5. 加入System.Web.Services參考

在應用程式按[右鍵]>[加入參考]新增System.Web.Services。

參考

2014年7月2日 星期三

於IIS安裝PHP

平台

  • Windows 8.1
  • IIS 8.5

方法

使用Web Platform Installer安裝PHP。

步驟

1. 下載Web Platform Installer

這裡下載Web Platform Installer,照著步驟安裝。

2. 開啟IIS管理員

在搜尋框中輸入IIS就可找到

3. 開啟Web Platform Installer

在[管理]中按下[Web Platform Installer]就會出現Web Platform Installer的介面。

4. 安裝PHP

安裝步驟
  1. 上列按[產品]
  2. 左列按[架構]
  3. 中間按[PHP(選你需要的版本)]
  4. 下列按[安裝]

5. 開啟CGI

a. 在[控制台\程式集\程式和功能]中按下[開啟或關閉Windows功能]

b. [Internet Information Services]>[World Wide Web 服務]>[應用程式開發功能]>[CGI]將此勾選

6. 重新啟動IIS管理員

7. 進入PHP Manager

8. 進入Manage all settings

9. 將date.timezone的value改為Asia/Taipei

參考

2014年6月26日 星期四

自動登入apple developer

在工作的時候遇到了需要讓電腦自動登入apple developer的需求,想到的解決方法就是用HttpWebRequest去做網頁的溝通,進而得到cookies,達到登入的目的。

目的

利用HttpWebRequest進入apple developer,取得登入所需的cookies。

方法

我們要模仿網頁的互動就要先去觀察網頁的傳遞方式,所以第一步我們要做的觀察,我們知道網頁的運作方式之後就可以將開始寫程式了,利用HttpWebRequest來模仿browser中我們所做的動作,達到登入的目的。

步驟

1. 觀察網頁運作

這裡我們利用chrome的developer tools(在chrome上按下F12即可使用),我們在觀察方面有2個部分要注意的:

1. 傳送帳號密碼的真正網址

網頁的設計常常會再登入中間安插一個專門處理的網頁,如果網頁是這樣設計的話那我們表面上看到的那個uri就不是真正在做登入的頁面了,為了避免這樣的情況,我們可以利用developer tools來找到真正做處理的uri。
在這裡我們可以看到Post的網頁其實是action中的uri,而非原本的uri

2. headers

接下來我們就要去看看網頁的標頭檔是什麼樣子的,由developer tools我們可以看到網頁的標頭檔。
紅色框框部分為要注意的部分

2. 撰寫程式碼

先處理第一點的第一個部分,我們要先抓出真正的uri,在這裡我們使用的是Html Agility Pack,這個package可以利用元素的XPath找出那個元素的屬性,要找出元素的XPath也很容易,只要使用developer tools就可以了。
元素>按右鍵>Copy XPath
找出XPath後我們才算是真正開始寫程式碼,我們可以把程式分成兩個部分:
  1. 找出真正處理的uri
  2. 撰寫正確的request取回登入資訊的cookies
再來是程式碼的部分


結論

其實要自動登入很簡單,只要熟悉http的運作就可以很容易的做出,在這個部份我覺得最重要的就是google developer tools要熟練。

2014年5月17日 星期六

手動ndk-build

在Android Studio裡,有了gradle的幫助我們不需要自己去撰寫Android.mk,它自動就會幫你產生Android.mk,build成.so檔就可以引用,但是當一個大程式要這麼做的時候就會產生問題,因為複雜,所以你會需要自己編寫Android.mk,這個時候就會產生問題,現在我們就來看看要怎麼樣自己撰寫Android.mk和ndk-build。

目的

自己撰寫Android.mk和ndk-build來寫一個Hello JNI。

前置處理

MainActivity.java中的寫法跟第一個Android NDK(Java call C)中相同,先把它寫上去。

步驟

1. javah

上一篇有講,這裡就不再多說了,只是這裡的classpath要改一下,如下所示 : 


2. main

這裡跟上一篇相同。

3. Android.mk

在ndk/doc中,我們可以找到ANDROID-MK.html中的說明,以下是我寫的 : 


4. 關掉自動ndk-build

因為我們不想要讓gradle自動去build ndk,所以我們要把它關掉,在build.gradle的android中打上下面的指令 :



5. ndk-build

接著開Terminal,目錄移到jni,鍵入ndk-build(記得要設定環境參數)


6. 移動檔案

將生成出來的libs中的armeabi資料夾整個移到build/ndk/debug/lib中,就可以運行了

參考資料

2014年5月15日 星期四

第一個Android NDK(Java call C)

最近因為要在Android中使用到C Library,查了一下發現NDK這個工具,它讓Java可以去呼叫C,讓我們在Android的專案中也可以使用C Library。

環境

  • Windows 8.1(64bits)
  • Android Studio 0.58
  • Android NDK Revision 9d
  • ASUS Nexus 7-Android 4.4.2(API 19)

目的

我們要利用Java去呼叫C的方法,然後將取到的字串輸出。

步驟

1. 下載NDK

https://developer.android.com/tools/sdk/ndk/index.html下載符合自己系統的NDK,這裡我們下載Windows 64-bit的NDK,目前的版本是9d。
載好之後隨便放一個地方,記得路徑以便等下使用(我的路徑為C:\Android\android-ndk-r9d)。

2. 新增native宣告C的方法

在MainActivity.java中打入上面的程式碼,宣告完native function之後要先build,要不然等下的javah會找不到這個方法導致遺漏。

3. 使用javah

先簡單講解javah的使用方式,它可以幫我們產生C header file以便讓我們可以在.java中找到對應的方法。

開啟Terminal

Tools > Open Terminal

將所在目錄轉到main

鍵入javah的指令產生.h


  • -d directory(你要儲存的目錄)
  • -classpath path(javah需要的classes(SDK及project的class路徑))
PS:如果找不到javah的話會產生下面的錯誤
在環境變數裡加上javah的路徑就可解決

4. 加入main.c

如果上面的native有被build的話,你的.h中應該會有{your package}_{native function}(我的就是Java_com_hpchen_testndk_app_MainActivity_getStringFromNative)。
PS:如果沒有請clean project,刪掉jni資料夾,rebuild之後再把第3步重做一次。

  • 記得include .h
  • 將.h中的native function寫好

5. 加入util.c

加入一個空的util.c

6. local.properties中加入ndk路徑


將第1步記下的路徑加入local.properties

7. build.gradle中加入ndk參考


注意:是app中的build.gradle,不是project的。

8. 在MainActivity中load library


執行之後就會看到"Hello JNI !"了。

參考


2014年4月23日 星期三

WebRTC-控制傳輸內容

在視訊電話時,我們有時會不想要讓對方聽到聲音或是看到影像,WebRTC中也有這種功能,以下是一個簡單的例子(使用WebRTC二部曲-RTCPeerConnection-下部(實作)的例子過修改)。

原理

我們在上次的範例中直接將自己的資料流(localStream)傳給遠端,但因為local端和remote端都是同一個資料流,所以在改變資料流的內容的時候會連自己的都被改掉(你不想讓對方看到你的視訊影像,卻連自己都看不到自己的影像了),所以我們就要先新增一個新的MediaStream專門給remote端使用,這樣我們就可以對這個remote端的資料流做處理也不會影響到local端的資料流了。

實作

Step 1

上次的例子中新增兩個check boxs :

Step 2

新增onclick事件
這裡我們利用getAudio(Video)Tracks()[0]來取得資料流的資訊,然後將enabled屬性做調整就可以達到控制的目的

Step 3

將localStream複製成remoteStream丟給remote peer

2014年4月18日 星期五

WebRTC二部曲-RTCPeerConnection-下部(實作)

平台

  • Visual studio 2012
  • adapter.js(WebRTC跨平台的shim)

目的

這次實作我們要在同一個視窗中開啟兩個視訊畫面,當我們按下Start鍵時我們可以在第一個畫面(Caller)將webcam抓到的畫面顯示,而當我們按下Call鍵時會利用RTCPeerConnection連線取得Stream顯示在第二個畫面(Callee),而HangUp鍵就是關閉連線,雖然這樣做實際性不高,但這樣的Demo可以很清楚地了解RTCPeerConnection的運作原理。

實作

Step 0 : adapter.js

在開始之前,我們要先解決一個擾人的問題-跨平台,就想我們在Demo getUserMedia的時候因為不同的Browser有不同的函式名稱,導致我們要去做一些處理才能確保他能在各個平台上運作,為了省去這樣的麻煩我們將使用adapter.js來cover這些問題。

Step 1 : html

我們一開始先設置需要的js及tag


Step2 : RTCPeerConnectionDemo.js

添加onclick事件給每個Button



Start : 利用webcam取得畫面(聲音)



Call : 設置RTCPeerConnection


1.設置Local跟Remote的Connection的handler
  •  onicecandidate : 還記得上次的圖中的送信人(candidate)嗎?onicecandidate就是在將找到的送信人給記起來
  • onaddstream(我們的demo中local peer並不需要接收stream所以local peer沒有此handler) : 當接收到stream時所要做的動作,在這裡我們將stream放到id為videoRemote的<video>中

2.將要傳送的stream放入connection中
3.建立offer及answer
  • local Peer建立offer
  • 將自己(local)的地址(local description)記下來
  • 當對方(remote)收到地址(remote description)時記下來
  • 對方(remote)也會把自己的地址(local description)記下來
  • 對方(remote)發送answer給自己(local)
  • 自己(local)會把對方的地址(remote description)記下來


HangUp : 關閉連線



2014年4月10日 星期四

Visual Studio 中斷點(break point) 介紹

這次要介紹的是在Visual Studio中的中斷點使用方式,我們在debugger的時候最簡單的方式就是將參數output到console上,可是這樣做很費時又很麻煩,且每次在做完debug之後往往又要把這些output刪除,學會中斷點出現之後,debug就會輕鬆很多了。

平台

  • Visual Studio 2012

設置

在要中斷的行前面點【滑鼠左鍵】
設置完之後可以按【開始】讓我們來看看中斷點的作用 : 
中斷的情形
由上圖我們可以看到兩點 : 
  1. 在中斷點的地方會有一個黃色箭頭還會反白字串,以方便程式設計師看到中斷的行位置
  2. 程式的執行只會到中斷行的前一行而已(console沒有output代表Console.WriteLine沒執行)

控制

在中斷的情況下我們會看到控制項中有幾個按鈕,在這裡我只介紹【逐步執行】,按下【逐步執行】(或按F11)後會看到下面的畫面 : 
黃色箭頭下移一行,Console出現output
【逐步執行】就是一步步往下執行的意思,這個功能在Debug的時候非常好用。

監看式

在中斷的情況下對變數按【右鍵】>【加入監看式】就可以將變數家道【監看式視窗】中 :

紅色框【加入監看式】,黃色框【監看式】,綠色框【平行監看式】
在【監看式】中,我們可以將變數的【值】做改變,這樣我們就可以測試在不同的情況下程式的反應是不是如預期,而【平行監看式】就可以以執行緒做區分,在多工的程式中Debug更加一目了然。

功能

在【中斷點】上按【滑鼠右鍵】可以看到有一些功能可以調整 : 
功能
  • 條件(因【叫用次數時】的功能可以被【條件取代】,所以就不多加描述了)
可以設定要中斷的條件,ex: num > 1000,下面可以選擇是要true的時候中斷還是要再狀態變更(true>false、false>true)的時候中斷
  • 篩選
篩選主要適用於【多工】,它可以讓使用者決定要使用【中斷點】的執行緒或是機器
  • 叫用時
可於每次【中斷】列印信息之後【繼續執行】,這個功能可以方便的觀察出變數的變化,也不用再將訊息output到console了

結論

在學校中通常都只講求理論,對於實作技巧的教學好像的沒那麼多了(像我就是一直到大四去實習才來學到這些Debug的技巧,真的浪費了我好多的時間QQ),可是這些技巧又是寫程式的重要技巧,所以就在此講解,希望有幫到大家^^

2014年4月5日 星期六

利用指令碼匯出(匯入)資料庫

在SQL server中雖然有匯入匯出精靈,但她真的是不太好用,所以我這次要提供一個不同的匯出方式,也就是利用產生指令碼來匯出資料庫,可以讓大家多一種選擇

平台

  • Microsoft SQL server 2012

步驟

Step 1

在要匯出的資料庫上按【右鍵】>【工作】>【產生指令碼】

Step 2

【下一步】

Step 3

這裡可以選擇要整個資料庫還是特定的物件,這個教學是要把整個資料庫給匯出所以選【編寫整個資料庫和所有資料物件的指令碼】>【下一步】

Step 4

先決定【檔案名稱】(也就是路徑)>【進階】>【要編寫指令碼的資料類型】選項改成【結構描述和資料】>【確定】>【下一步】

Step 5

【下一步】

Step 6

【完成】

Step 7 

之後去你儲存的路徑會看到一個.sql檔,將它點開,把裡面所有的內容複製。

Step 8

按下【新增查詢】>把剛剛複製的貼上>【執行】

結論

如果上列的步驟都有完成的話就可以看到一個你剛剛的資料庫了,完成,收工。
我個人是覺得這樣的方式比較快速,也不用東調西調的,希望有幫到大家^^

2014年4月3日 星期四

WebRTC二部曲-RTCPeerConnection-上部(架構介紹)

RTCPeerConnection讓我們可以簡單的實現網頁上的p2p傳送機制,在接下來的文章中要帶大家來了解這個陌生的朋友

架構圖

先看架構圖,待會看步驟會比較清楚

步驟

在開始實作之前,我先來解釋RTCPeerConnection的運作步驟,我以擬人化的方式講解,應該比較可以理解 :

  1. 有一天Peter(Caller)想要寫信(stream)給Sunny(Callee)
  2. Peter(Caller)先將信封袋(RTCPeerConnection)給準備好,然後拿到自己家的資料(CreateOffer)並記下自己的地址(SDP)
  3. 但是Peter(Caller)並不知道Sunny(Callee)在哪裡,於是Peter(Caller)將自己的地址(SDP)送到一個收發站(server side)去等待Sunny(Callee)的到來
  4. Sunny(Callee)她也想要跟Peter(Caller)寫信(stream)了,Sunny(Callee)到了收發站(server side)發現已經有Peter(Caller)的地址(SDP)了,於是Sunny(Callee)把Peter(Caller)的地址(SDP)記起來然後把自己的地址(SDP)寫在信封袋(RTCPeerConnection)上回傳給Peter(Caller),這樣一來雙方都有對方和自己的地址(SDP)了
  5. 同時,由於Peter(Caller)及Sunny(Callee)他們都被困在城牆(NAT or Fire Wall)內,所以就必須要把信交給人力資源銀行(ICE server),他們會找到可以送信的人(candidate)
  6. 於是Peter(Caller)和Sunny(Callee)終於可以藉由RTCPeerConnection傳信了,YA!!
我覺得RTCPeerConnection最難的就在於要理解他的運行,只要了解了,我們實作起來就會輕鬆許多,所以這次就到這裡,先把這寫消化,我們下次再來講實作的部分。

2014年4月2日 星期三

Hello SignalR

這次要介紹的是ASP.NET SignalR library,它可以讓我們很簡單的寫出Real-time的網頁程式,原本要使用web socket在那寫的老半天,又要考慮到跨平台所帶來的影響,而使用了SignalR就不需要再考慮這些了,因為它都可以幫你處理,詳細的原理可以參考【SignalR 再次超越你對 Web 的想像 - 建立即時互動的 Web】這篇,在這篇裡我會demo一個簡單的即時通訊網頁。

平台

  • .NET Framework 4.5
  • C#
  • SignalR 2.0
  • Visual Studio 2012
  • Windows 8

實作(借用Tutorial: Getting Started with SignalR 2.0的例子)

Step 1

開啟WebSocket通訊協定

控制台>程式集>程式和功能>開啟或關閉Windows功能>Internet Information Service>World Wide Web功能>應用程式開發功能>勾選【WebSocket通訊協定】

Step 2

新增ASP.NET空白Web應用程式

選取【.NET Framework 4.5】>選取【ASP.Net空白Web應用程式】>按下【確定】

Step 3

安裝SignelR

開啟【套件管理器主控台】>鍵入【install-package Microsoft.AspNet.SignalR】>按【Enter】

Step 4

建立SignalR Hub 類別

方案總管中在方案上按【滑鼠右鍵】>【加入】>【新增項目】>【SignalR Hub 類別】>【新增】

在這個類別中我們可以撰寫signalR要做的函式,先把下面的code覆蓋初始的code : 

這裡不是很懂吧,沒關係,之後的說明會詳細解說。

Step 5

建立OWIN Startup類別

建立一個類別,將下列程式碼貼上 : 

OWIN為Open Web Interface for .NET的簡稱,簡單的來說就是可以把原本預設的server做變更,像是.NET通常都是使用IIS,使用了OWIN我們就可以任意的決定我們的server side要給誰處理,在SignalR中我們就要把後端交給SignalR Hub運作。

Step 6

建立.html及.js

Chat.html :
main.js :

注意 : Chat.html中script的載入順序一定要先jQuery再SignalR再<script src="signalr/hubs"></script>,signalr/hubs這個資料夾只有再run time的時候才會動態產生,它是SignalR用在jQuery及server端溝通上的管理。

Step 7

將Chat.html設為起始頁

Chat.html按【右鍵】>【設定為起始頁】

Demo

輸入名字
開啟多個Chat.html
開始聊天嘍

程式運作說明

利用chat.server.send(name, message);去叫ChatHub中的send method,然後ChatHub會用Clients.All.broadcastMessage(name, message);去叫用client中的broadcastMessage將資訊傳給client

參考資料

SignalR 再次超越你對 Web 的想像 - 建立即時互動的 Web

2014年3月29日 星期六

WebRTC首部曲-getUserMedia

之前已經看過了WebRTC的一些背景知識,現在就來看看要如何實作吧,首先我們要介紹的是getUserMedia,這個API是為了要讓broswer可以取得攝影機及麥克風的訊息,以前我們要使用攝影機通常都還是要安裝一些應用程式才能抓到攝影機及麥克風,可是getUserMedia不須安裝任何插件,哈哈,是不是很方便阿。

我們先來看一下getUserMedia這位主角的基本資料 :

Syntax


Parameter

  • constraints : 設定media type
  • successCallback : 當成功取得media stream所做的function
  • errorCallback : 當發生錯誤時做此function
來看一下這個getUserMedia,它本身有三個parameters : 

constraints是對這個media type所做的設定,像是要取得影像還是聲音等等...。

successCallback是成功取得media stream之後要做的function,像是我們可能會想要把影像放到<video>裡顯示在網頁上。

而最後一個就是我們最不想看到的errorCallback了,如果錯誤發生(QQ)就會執行這個,這裡面可以擺一些補救措施,例如視訊發生錯無時會撥放別的影片,也可以用log紀錄錯誤訊息。

Demo

這個demo所要做的就是要單純的把攝影機及麥克風所取得的資訊顯示在網頁上。

Step1

首先我們要先讓media stream在網頁上有一個<video>(舞台),這樣它才能大顯身手 :
注意 : 一定要把autoplay設好,要不然影像會被定格喔。

Step2

再來就是這次的重點了,我們要設定好3個parameters,才能使getUserMedia乖乖運轉不出錯 : 
這裡我們將constraints中的audio和video的屬性值都設為true,表示我們要取得audio和video,success中我們要將傳回來的stream放到<video>中,在這裡因為這個stream是一個Blob object,所以我們要將這個object轉成src可以吃的URL,這樣我們的<video>才不會拉肚子,最後我們在error中輸出log。

注意 : 有些人會懶得設定errorCallBack,但是我建議養成好習慣至少印出log,這樣在debug的時候會輕鬆很多唷(我自己就是血淋淋的例子@@)。

做到這裡先來讓它跑一下吧,應該會出現以下的錯誤 :







會發生這個錯誤是因為跨遊覽器的問題,getUserMedia在不同的browser中有不同的名字,像在chrome叫做webkitGetUserMedia,在FireFox中叫做mozGetUserMedia,這種情形其實並不少見,因此就產生了modernizr這個方便的小工具,它可以處理網頁跨平台所產生的問題,這邊我們先不使用modernizr,我們使用下列判斷來處理這個問題 :

Step3

在browser上執行,你應該會看到下面的提醒 :




按下允許之後就會出現你帥氣(漂亮)的臉了。

結論

這次的demo讓我們學習到了要如何藉由browser去存取webcam及mic,而getUserMedia它傳回的是一個stream,所以你當然可以對它做一些處理(像是淡化、銳化、長寬等等),但是這個主題的重點沒有放在那裏,所以我就先不說了,今天就先到這裡,再見嘍。

參考資料