2015年3月21日 星期六

NAN:Node.js 與 io.js 的 Native Addon 開發利器

Standard
自從 Node.js v0.11 版之後,內建的 V8 引擎被更新了,於是 JavaScript 引擎的原生 API 大幅度改變,導致很多以 C/C++ 所撰寫的原生模組紛紛出現相容性問題。影響範圍包括了前陣子發佈的 Node.js v0.12 以及 io.js 1.0+,因為都使用了新版的 V8 JavaScript Engine,而有同樣的問題。

其實這樣的問題已經不是新鮮事,自從 Node.js v0.8 到 v0.10 就開始有些許不相容的問題,只是到了 v0.12 和 io.js 之後,出現了更多狀況。因此 Node.js 圈子內的知名開發者 Rod Vagg 建立了 NAN 專案,用來解決這樣 Native API 不相容的問題。

NAN 全名為 Native Abstractions for Node.js,目標是設計一系列通用 API 供 Native Add-on 開發者所使用,讓開發者可以使用這通用的 API,一次性開發出支援 v0.8、v0.10、v0.12 和 io.js 1.0+ 的原生模組,不必再為 V8 原生 API 相容性所苦。

若想要使用 NAN,可以直接以 NPM 下載:
$ npm install nan

然後在 binding.gyp 中加入 include_dirs 的屬性設定,讓 Node.js 或 io.js 引入 NAN 模組:
'include_dirs': [
    "<!(node -e \"require('nan')\")"
]

經過這樣的設定配置後,我們就可以在 C/C++ 程式裡面引入 NAN 的標頭檔,開始使用 NAN 的 API:
#include <nan.h>

NAN_METHOD(Hello) {
    NanScope();
    NanReturnUndefined();
    // 或是這樣寫 NanReturnValue(Undefined());
}

上面的程式碼,代換成舊的版本(v0.8、v0.10),就等同於:
Handle<Value> Hello(const Arguments& args)
{
    HandleScope scope;
    return scope.close(Undefined());
}

若在新版的 Node.js v0.12 或是 io.js 之上,就等同於:
void Hello(const v8::FunctionCallbackInfo<Value>& args)
{
    Isolate *isolate = Isolate::GetCurrent();
    HandleScope scope(isolate);

    args.GetReturnValue().Set(Undefined());
}

我們可以看到,NAN 已經包裝成一個簡單的 API,方便開發者去移植或開發 Native Add-on。

建立物件

此外,NAN 也將許多物件類型的建立方法,利用 Template 統一成 NanNew() 這樣一個 API,例如:
Local<String> string = NanNew<String>("hello world");
Local<Boolean> boolean = NanNew<Boolean>(NanTrue());
Local<Number> number = NanNew<Number>(123);
Local<Array> number = NanNew<Array>();

更多功能

NAN 有更多的功能,有興趣的人可以參考專案上的說明:
https://github.com/rvagg/nan

後記

因應 io.js 的推出,最近開始搬移手上的 Native Module,包括了 node-dbus、 brig 以及其他種種模組,碰到 V8 API 大改,讓人手足無措,好在 NAN 已經解決了大多數的問題。其實不只是 V8 的更新,libuv 的更新也是問題之一,只不過問題還算小,日後有空再來筆記下來。

2015年3月18日 星期三

Hackathon Taiwan 新倒數計時器系統

Standard

話說

如果你之前就有參加過我們的 Hackathon 活動,就會對從第一屆黑客松就有的倒數計時器有所記憶。這是我們特別為 Hackathon 活動所開發的倒數計時器,其著漂亮粒子特效,讓許多人印象深刻,尤其是投影在夜晚的牆壁和玻璃上,伴隨著台北 101 和夜空為背景,可說是非常炫麗又有氣氛。



但經歷過了四次活動,這個計時器也該功成身退了,隨著活動人數成長,活動內容及場地規劃,舊的計時器已經慢慢不敷使用,除了一身漂亮的動畫外,沒有太多的功能。而且,縱使有著一個看起來炫酷的特效,對工作人員和很多參加者來說,也慢慢膩了。

於是,我們又提起筆開始設計一個全新的倒數計時器系統,想設計一個更具科技、科幻感及現代感的介面,除此之外,更希望可以在未來可以引入更多的功能和互動機制,如導引、會場資訊查詢、甚至是直播等。就這樣,一個新的計時器誕生,並在 3/7 - 3/8 第五次的黑客松活動被使用。

因為我們期望這個計時器,不只是用來倒數計時,未來能變成一個多用途的活動系統,所以在設計上有更多的規劃及保留。也採用更多色塊來進行設計,讓畫面上有更多可利用的空間。

互動功能

在這次活動中,我們觀察到了一個現象,那就是對正在專心進行創作及 Hack 的人,手上的工作雖樂趣無窮,但對於旁觀者來說,卻是無聊透頂,這讓黑客松(Hackathon)活動的現場,時不時會呈現一種沈悶的氛圍。此外,參加者的工作效率往往呈現著週期性,或是專心時間總有一個極限,適當的放鬆和中斷也是常見的情況。但是如果放鬆或中斷手上工作時,沒別的事可以舒展身心,這會感到相當無聊了,於是會看到有些人會選擇用吃東西來打發中間的時間。

其實,來黑客松除了動手做之外,人際關係經營及交流也是很重要的一環,但別人正在專心工作時,你不便打攪,尤其是當同隊的人都正在專注做事實,你剛好想要換個氣的時候,更不可能去煩自己的隊友。不過,雖然你的周圍可能沒人可以跟你互動,但你可以去找同樣想換氣的人產生互動,畢竟全場人這麼多,跟你處於同一個狀態的人總是有不少。

那麼,如何找到人可以跟自己互動或交流呢?

這次活動,我們建立了 IRC Channel ,讓參加者可以上來 IRC 聊天室來說說話。所以,如果你有興趣,除了活動時間之外,平時也可以加入我們的 IRC 聊天室掛著:
Server: irc.freenode.net
Channel: #HackathonTaiwan
若是你不懂 IRC 客戶端程式如何使用,也有 Web 介面可以使用:
http://webchat.freenode.net
雖然我們已經嘗試引入聊天互動的機制,但我們發現仍不足夠,因為大部分的人仍然不知道有這樣的管道可以與其他人聊天及討論,或在活動中根本忘了可以使用這些服務。於是,為了讓更多人可以輕鬆地看到聊天室內的精彩訊息,我們在這次活動空閒時開發了一個新功能,將 IRC Channel 的訊息接到了新倒數計時器系統上,並畫了一個區域讓它顯示聊天內容。如此,參加者在休息或放鬆時,可以側頭看看周遭的計時器投影,順便看看聊天內容,相當有趣。

此外,一旦有了這樣的功能,可以預見的是,參加者能在上面找隊友或跨團隊找人協助,或是打發不專心的時間,當然,更能拓展人際關係與交流,實踐黑客松的價值。

展示影片



程式原始碼

身在這個開放的時代,提供程式原始碼是很正常的一件事。

如果你對這支應用程式有興趣,可以從這取得程式原始碼,如果有什麼想法,也歡迎在 Github 上發 issue 或跟我們說:
https://github.com/HanGee/Hankathon

後記

下次黑客松台灣(Hackathon Taiwan)活動預計是 4/11(六)、4/12(日),記得找朋友一起來參加!也歡迎加入我們的粉絲專頁,取得各種第一手訊息:
https://www.facebook.com/HackathonTaiwan