2015年7月13日 星期一

Geek?技客?是什麼?我不宅,我用動手代替說話!

Standard

因為我對外都自稱一個 Geek,所以時常有人問我,Geek 是什麼?一直以來,「技客(Geek)」個名詞讓許多人感到陌生,甚至對這詞彙一知半解的人,都以為 Geek 與普通宅宅無異,更甚至是覺得這只是另一種宅宅的說法。的確,Geek 某些地方與普通宅宅很相近,指的是醉心於特定專業或領域的人,但這些人擁有絕佳才能,只是為了鑽研知識或研究新事物可以幾乎荒廢其他事,廢寢忘食對他們來說只是小意思,甚至可以犧牲人際關係等一般正常社會交際行為。由此可以看出 Geek 對於自有興趣的事物,將會多努力去鑽研。

不可否認,「技客(Geek)」這個詞在早期帶有貶意,但在現今社會中,人們交流的手段和方法已經透過科技有很大的改變,Geek 可以透過網路或各種新方法,找到能分享交流的同好朋友。透過網路串連,他們不再只是群體中被傳統主流排除在外的人,反而搖身一變,變成強力促使世界進步的主要群體。如今,大家眼中的 Geek ,代表著才能與努力,更代表能「動手完成任務」的傑出人們。開玩笑的說,專心致志(宅宅)加上真正動手實做的能力,就是「技客(Geek)」。

想要成為一個 Geek 嗎?只要你符合這樣的條件,無論你原本是個技術 Hacker、Maker 還是個設計師,更甚至是任何領域的人,都可以稱自己是一個 Geek,甚至可以以此為榮!也許,你也有自己沒發現,但是能堪稱 Geek 的一面也說不定!

後記

為了讓更多 Geek 能聚集在一起交流,共同迸出創新的火花,我們 Hackathon Taiwan 開始了一個新計畫 GeekBar I/O,將嘗試透過各種活動和方式,讓 Geek 們共同發光發熱!歡迎大家共襄盛舉!

2015年7月8日 星期三

快樂玩 ES6 Generator,從 co 起手式開始

Standard

自從 Node.js 0.12 版和 io.js 之後,大量的開發者開始了各自的 ECMAScript 6 大冒險,許多人對 Generator 的使用仍跌跌撞撞,對於這種看似「同步(Synchronous)」的「異步(Asynchronous)」機制,有許多人腦袋遲遲無法轉過來。雖然在小弟的書(參閱連結:新書報到!Node.js 模組參考手冊!)已經有清楚的說明 Generator 使用方法,但就許多讀者回函來看,對於 JavaScript 越是熟悉的人,越無法直觀理解 Generator 的思維,甚至是老是抓不准使用的時機點。

尤其是過去我們已經有 Promise、async、Q 和 bluebird 等處理非同步程式流程的模組和工具,很多人就是覺得沒有使用 Generator 的必要。不過,如果你會使用 co 模組,你會突然發現若是將過去的流程機制與 Generator 相搭配,程式開發將變得更為流暢。

若想要安裝 co 模組,可以直接以 NPM 下載:
npm install co

本文接下來會說明一些 co 的基本使用,破除一些 Generator 難以使用的地方,讓開發者們更容易開始 Generator 的旅程。

讓原生 Generator 更好用

這是很多人不喜歡使用 Generator 的主因,以往為了使用 Generator,我們還要先建立一個 Generator 的函數,然後不時的去處理 Generator 所返回的資訊,一遍又一遍進入 Generator 之中。因此,無論 Generator 再好用,這些麻煩的動作也完全抵銷他的優勢,大多數人還不如回到舊的流程控制方法,以免徒增自己的麻煩。

而如果使用 co,可以直接將 Generator 函數當作「立即函數使用」,其餘的部份我們可以不需要擔心:
var co = require('co');

co(function *() {
    console.log('Inside'); 
}) 

再也不用煩惱 yield!

以前光是 Promise,就已經讓很多人詬病,覺得每次使用 Promise 都要花許多時間對函數進行包裝,而 Generator 也有類似的問題,若是要使用 yield,更是一件大工程。於是,co 幫開發者做了些設計,讓 Generator 可以直接利用 yield 去跑 Promise 類型的函數、陣列等物件,因為是 yield,其執行模式是「異步」,不會阻塞事件引擎。

co 支援 Trunks,也就是回傳一個簡單函數進行異步工作,範例如下:
var co = require('co');

function updateInfo() {

    // 返回一個將被執行的函數 
    return function(done) { 

        // 可以執行各種異步工作
        setTimeout(function() {

            // 完成工作後執行 callback,參數一為錯誤訊息,參數二為回傳值
            done(null, 'Done'); 
        }, 1000);
    };
}

co(function *() {
    // 執行並等待回傳值 
    var ret = yield updateInfo();

    // 一秒後收到回傳值並印出來
    console.log(ret); 
});

支援 Promise 的 yield

如果你熟悉 Promise,這是個好消息, co 讓 yield 可以直接吃 Promise:
co(function *() {
    var ret = yield Promise.resolve(true);
});

直接使用 yield 跑一整個陣列的工作

前面提到 co 讓 yield 也支援陣列,所以我們可以準備一系列的工作,放在陣列中讓 yield 去處理:
co(function *() {
    var a = Promise.resolve(true);
    var b = Promise.resolve(true);
    var c = Promise.resolve(true); 
    var ret = yield [ a, b, c ];
});

異步處理一個陣列裡的所有元素

這大概是以往 JavaScript 最頭痛的工作,後來有了 async 這類模組後,才比較容易處理,不然光使用 forEach 或是 for 迴圈來做,碰到較大的陣列,往往使程式阻塞卡死。如果使用 co 前面的起手式,我們可以試著這樣做(如果不使用 Promise):
var arr = [ 1, 2, 3, 4, 5 ];

function handle(el) {

    return function() {
        // 處理傳入值 
        console.log(el); 
    };
} 

co(function *() {

    // 在 Generator 裡,使用 yield 不會使 JavaScript 事件引擎阻塞,
    // 但因為程式流程會等 yield 結束,for 迴圈也不會造成阻塞
    for (var index in arr) {
        var el = arr[index];
         yield handle(el);
    }
});

後記

經過 co 包裝後的 Generator 非常好用,無論你過去習慣用哪一種流程控制的方式,都可以很好的轉換並整合過來。試試看吧!:-)

2015年5月24日 星期日

黑客松式的學習活動:NodeSchool International Day 精彩紀錄

Standard
 『是不是要很厲害才能參加黑客松呢?』這是一個永遠都會有人問的問題。

事實上,黑客松從一開始的出發點,就是三五好友聚在一起進行研究及開發的活動,帶有很純粹的動機。參加這樣的活動,你不必真的很厲害到極點,而最重要的是動手和夥伴合作,過程中可以順便認識朋友與他人交流,讓投入的過程中更加豐富有趣。

從這樣的角度來看,『黑客松式的學習』是不是有可能的呢?如今看來是肯定的,5/23 於台北剛結束的 NodeSchool 聚會就是一場黑客松式學習活動,吸引了近兩百位參加者,共同參與了這場具有黑客精神的學習活動!

順帶一提,這此使用的場地,也是 黑客松台灣(Hackathon Taiwan) 每個月辦活動的主場地,無論如何,也記得來報名下次 6/13 - 6/14 (六、日)的黑客松活動!

什麼是 NodeSchool?

NodeSchool 是一個線上學校,目標是運用線上工作坊課程,讓所有人都可以在這學到各種技術。而恰逢 NodeSchool International Day 國際日活動,全球各地都紛紛各自舉行一場 NodeSchool 盛會,因此身在台灣的我們也理所當然響應了這樣的活動。 

這個活動的形式相當特別,沒有講師在台上講課,而是採用線上工作坊教材與題目的形式,讓參加者在自己的電腦上挑戰通關。NodeScool 擁有許多工作坊教材,從基礎課程到進階的選修課程都有,除了 JavaScript、Node.js 之外,也有 ES6、WebGL、Three.js、Functional Programing 和 React.js 等課程。詳細的課程資訊,可以參考 NodeSchool 官方網站


由於每一份教材都是經過設計,而且每一個主題和關卡都擁有提示和說明,參加者在一題題解答的過程中,可以靠自己慢慢學會一門技術。如果真的遭遇到了自己難以突破的困難,可以跟左右鄰居討論研究,若真的也沒有辦法了,可以找在現場自願的指導員(Mentor)幫忙排解問題。

黑客松式的學習活動

回想起過去從小到大,我們的學習模式,總是有個老師在台上教學,枯燥而乏味,而為了保證教學進度,不免伴隨著填鴨式的教學方法。這樣的模式我們早就習慣,雖不見得喜歡,但也無可奈何,逐漸的,我們的思考和學習,慢慢僵化了。

具有一定寫程式經驗的人都知道,如果想要把程式技術練好,動手研究是不可缺少的工作,而持續鑽研的熱情更是不可以缺少,學習並習慣自己動手解決一個個問題更是必要的訓練。此外,比起學習到一門技術,我們如何在學習和訓練的過程,培養自己自我學習和與其他人間的溝通交流,更為重要。與他人交換想法,或是藉由分享知識將自己所學內化,更是一種提昇自己的方式。

因此,NodeSchool 活動與過去的學習方法最大不同,就是提供一個讓大家共同參與的形式,目標是要大家能在此透過自己動手學習到技術,也參與交流討論,當大家在活動結束後走出會場時,能帶著貨真價值的學習成果回家。

沒有大神,只有迫切突破自我的歡樂參加者

別以為這樣標榜學習的活動只有初學者前來,其實會眾裡臥虎藏龍,不乏有大神級別的高手參與。只不過,在這樣的活動中,即便是高手,也正煩惱自己手上的問題和課程,也需要更多高手一同討論和解決問題。

由於 NodeScool 工作坊的主題相當廣泛,無論是初學者還是專家,都可以前來,然後挑戰一些自己感興趣的技術,然後號招在現場的高手們,一起討論並學習。我們可以說,NodeSchool 的活動,是一個兼具動手、討論交流和突破自我的學習活動。

後記

如果有人完成了課程,日後可以在參加 NodeSchool 時,自願擔任該課程的指導員(Mentor),如果還沒完成的人,可以回家繼續完成,若碰到問題,可以至 Github Issues 直接發問,或到每週四的 Node.js Party 及讀書會討論。日後,社群應該也會不定期的舉辦中小型的 NodeSchool 活動,讓大家共同參與。

另外有趣的是,這次活動也有碰到一些企業派人來參與或獵才,像我就碰到 Foxconn 等公司的主管級人物前來參加活動,也一起下去研究程式。誰說主管只會動一張嘴呢?至少會來黑客松的主管也會動手!:-D

2015年5月21日 星期四

簡報釋出!超酷炫科幻 UI:QML 入門

Standard

這次五月的 Hackathon Taiwan, 因為原本的講師沒空,所以我就來救援了一場 QML 工作坊,這堂課以活動的倒數計時器為開頭,討論怎麼使用 QML 進行超酷炫科幻 UI 的設計,是一堂初學入門課程。

有鑑於過去聽到不少人反應,要使用 QML 必須與 C/C++ 打交道,門檻相當高,於是,這個工作坊的目標,就是讓學員可以在純 QML 的環境下,以 QML 來開發自己的 UI 界面。即便是不熟悉程式語言的人,都可以輕易使用 QML 做出絢麗的 UI。

活動簡報


後記

這次 QML 工作坊事後反應還算不錯,甚至有人以 QML 來開發黑客松活動的作品,未來如果有機會可以再次開課。:-)

2015年5月7日 星期四

JavaScript 的各種迷霧

Standard
 在 Facebook 看到很多人都在整理自己的程式筆記,我也整理關於 JavaScript 語言常被誤解部份的筆記,然後分享出來供各位同好參考。

講實話,從 1995 年開始的 JavaScript,直到前幾年,都讓我恨的牙癢癢,甚至覺得他是個垃圾,因為當時的他太沒有規範,效能極差。直到近年來才逐步改善,我也才慢慢擺脫對他的排斥及恨意。

但就算已經有標準規範,JavaScript 語言對很多人來說依然很頭痛,除了其 Asynchronous 非同步的機制外,更要面對其極為動態(Dynamic)的特性,而從 OOP 的角度來看,其 classless 的設計更讓人不知所措(ES6 之後開始支援 Class),與傳統的 OOP 相去甚遠。所以,JavaScript 處處與其他語言完全不一樣的概念及思維,讓很多人在裡面處處誤解。

所以若是想學習 JavaScript 深入的概念,最好的方式就是放下其他語言的既有概念,直接了解 JavaScript 的核心機制,雖然會讓人手足無措,但卻是最好的手段。否則,很容易練就或死背很多怪招,寫出難以除錯或過於複雜的程式碼,當然,更嚴重的是誤導他人。

要深入或精通 JavaScript,務必了解並思考其執行程式時發生什麼事,每一行程式碼當下被執行時的狀態,遠遠比程式碼排列來得重要。只要掌握每一行程式碼的『執 行當下』,所有 JavaScript 的疑難雜症,都能迎刃而解。關於這一點,有興趣閱讀硬梆梆定義文件的,可以參考 ECMA-626 的『10.3 Execution Contexts』一節。(參考網址:http://www.ecma-international.org/ecma-262/5.1/#sec-10.3

關於 this 關鍵字的機制

很多人會搞糊塗 this 關鍵字,就因為他是一個會被 Execution Contexts 大量影響的東西。JavaScript 在 Function 或 Context 被執行時,才會依當下情況去決定 this 為何。這代表,使用 this 時在哪一個 function 或地方不重要,而是當進入這個使用 this 的 context 時(如:Function 被執行時)才會決定 this 是什麼,this 是什麼只跟你如何去呼叫 this 所在 Function,及 Context 內狀態的改變有關。關於 Function Call 怎麼決定 this 值,可參考:http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.3

當然,純講理論很難懂,可以大概歸納出 this 的使用方式與情景,有開發者已經整理了很清楚的文件,以及常誤觸的陷阱,可參考:https://software.intel.com/…/blo…/2013/10/09/javascript-this

若實在懶得看懂硬梆梆的文件,從實作面來看,就是記住簡單兩種規則而已。

一般來說,決定 Function 內的 this 為何,說明如下:
  1. 只要直接呼叫 Function ,就會代 global 進去當 this,這也是為什麼 Browser 裡面會是 window,因為在 Browser 裡的 global 就是 window。
  2. 如果一個 Function 處於一個 Object 上,像是 a.b() 這樣執行後,b 函數的內部會視 a 為 this。因為當 JavaScript 在透過 a 物件存取底下的 Function 並呼叫他時,會自動把依附的 a 物件(Caller)帶入當 this。

總歸來說,所有的 this 都是在執行期、呼叫當下所決定的,除非你使用 bind() 這類的做法事先去強制寫死他的 caller。這就能解釋,為什麼 this 總是不能往內部一層層自動傳進去,因為所有的 Function Call 都遵循著同樣的規則。

註:在嚴格模式下 Function 裡的 this 會是 undefined,不是他預設是 undefined,而是嚴格模式下呼叫一個 Normal function 時,他不會自動代入 global,所以才是 undefined。在嚴格模式下不能取得 base value(即 global),這點可參閱:http://www.ecma-international.org/ecma-262/5.1/#sec-8.7

Function 的存在

因為所有的型別都是 Object 的衍生物,甚至是 Function 也不例外,所以 JavaScript 裡的 Function 物件可以隨機被動態生成和定義,與其他大多數語言完全不一樣。其他語言多半將 Function 看做是一個寫死程式碼的區塊,放在一個固定的記憶體位置上,然後跳過去執行。而這樣可以動態定義 Function 的特性,導致 JavaScript 天生就支援 Lambda 、匿名函數等特色,因為可以依照任何情況,重新排列組合,甚至生成 Function 的執行流程。

關於記憶體及物件管理機制

JavaScript 的設計是以可動態擴充性為考量,所以也衍生出一套記憶體管理機制,以 Object 為基本記憶體管理單位。所有存取 Object,都透過一套 『Identifier -> Value』 的機制,而在執行上 Value 其實就是 Object。

與其他語言不太一樣的是,JavaScript 在利用 var 宣告 variable 時,實際上是建立一個 Identifier,並不是實體配置一塊物件記憶體。所以在 Identifier 建立的剛開始,並未對應到實際有意義的參考物件。直到我們額外去建立物件後,才讓 Identifier 去對應。可以說,這就是 key-value 的形式,而 Identifier 就是個 key。這部份可以參閱:http://www.ecma-international.org/ecma-262/5.1/#sec-12.2

由此可知, Identifier 本身不是 Object 的實體,因為他只是個 key 而已,就像 C/C++ 語言中的指標。

有趣的是,這樣 Reference 的機制,與 JavaScript object 中的 key-value 機制是一樣的,這也是為什麼 Object 可以隨意掛勾到任何地方。因為 JavaScript 程式中,我們一定是透過 Identifier/key 去取得並使用 Object,而且可能有很多不同的 Identifier/key 都指向同一個 Object。

記憶體回收

簡單來說,JavaScript 記憶體回收,就是當 Object 沒有被任何 Identifier 指向時,就被視為垃圾而回收釋放記憶體。

new 運算子如何建立一個物件

在定義上,用 new 建立物件要經歷過一些程序,甚至要檢查 Type 等工作,這部份的細節可參考原始定義:http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.2

不過,對於大多數開發者來說,不需了解太多細節,較簡化的流程可參考 Mozilla 提供的文件:https://developer.mozilla.org/…/Jav…/Reference/Operators/new
簡而言之,new operator 會去做到幾件事:

  1. 用 Object.create() 等方法去參考 Function.prototype,建立一個物件
  2. 跑 Constructor(也就是開發者定義的 Function)
  3. 如果 Constructor 內沒有回傳一個物件,就以步驟 1 建立的物件回傳出來。
這一切工作是在『內部(internal)』完成,完成後回傳物件出來。

如果你很清楚這些行為,可以把這些工作往外移,自己實作,並完全不用到『new 關鍵字』,但是通常開發者不會這麼做惡整自己。用 new 以後,等他回傳配置完成的物件,才是一般性的做法。

2015年4月19日 星期日

新書報到!Node.js 模組參考手冊!

Standard

經過幾個月努力,新書『Node.js 模組參考手冊』終於誕生。這本新書與前一本『不一樣的 Node.js』稍稍不同,主要訴求不是初學者入門,而是參考用書,無論是新手還是已經很熟練 Node.js 的專家好手,都可以拿來參考,還希望各界多多支持!

有鑑於 Node.js 發展迅速,其應用已經不只是被侷限在 Web 之上,甚至適合各種不同的領域與場景。所以,許多的功能及模組被大量開發出來,從網路應用、桌面應用甚至到嵌入式應用都可以使用 Node.js 來開發。

可以應用在各種場景,代表就會有不少人面對 Node.js 數不清的模組時,總是不知道該怎麼辦,除了很難抉擇之外,更是有很多超出原本常識的模組存在。有些時候,更是需要將許多模組拼湊起來,才能完成一個特殊的功能。

然而,大量的應用範例,也需要花大量時間才能一一摸索,若不是有人事先整理好,對於大多數人來說,無疑是永遠無緣觸碰。因此,這本書為此而生,希望透過大量整理各種應用範例,以減少 Node.js 開發者摸索的時間,加速學習或研究的速度,更甚至縮短產品開發的週期。

如果你是初學者,你可以從中找到一些基本模組的完整範例參考,或是學習模組選擇的方法。如果你已經是很熟悉 Node.js 開發的專家,你可以從本書看到許多使用 Node.js 所開發的特異功能的應用範例,如:Bittorrent、SSH Server、演算法、加密、文件格式、多媒體支援等。此外,本書也將提及 C/C++ 原生模組和 V8 JavaScript 引擎的原理和範例,還有各種資料庫、Message Queue(訊息佇列)等常用的完整使用範例,當然也有今年最新的 io.js 相關內容。

雖然說本書名為模組參考手冊,但整本書卻是以應用範例為導向,並非完全是一個個模組的介紹,有很多是多個模組整合而成的範例,許多部份都是網路上連原文文件都缺少的資訊或文獻,可以說是花大量時間和經驗的結晶。

我只能說,希望讀者們會喜歡!希望能幫上大家工作開發上的忙!請大家多多支持!

後記

前一本『不一樣的 Node.js』,因為一些模組更新太快,所以有些章節已經有些老舊,如果你是前一本書的讀者,可以和新書『Node.js 模組參考手冊』做比對參考,因為裡面有雷同的章節,可以使用新書的方法來取代舊書老舊的部份。

至於舊書翻版,我們已經跟出版社討論,短期內會將老舊的部份章節翻新,然後將這部份放上網路供讀者下載。然後會擬定計畫重新翻新整本書,引入 io.js 和 ES6 的部份,重新再出版。

2015年4月4日 星期六

精彩回顧!平民化的黑客松:Hackathon Taiwan

Standard
對很多人來說,黑客松(Hackathon)是一個可怕的詞彙,它神秘且陌生,似乎是只有軟體工程師能參與的活動。事實上,黑客松的本意只是希望大家可以齊聚一堂,跳出原本的生活圈,和其他人完成或創造一些與平常不一樣的東西。

打造一個平民化的黑客松一直是 Hackathon Taiwan 的目標,除了每月都舉辦推廣之外,為了讓活動更親民,還特意引入各種初學手把手的工作坊課程,以減少眾人對黑客松的恐懼,課程內容涵括了網站、軟體、硬體、設計、藝術領域,從 Arduino、Node.js、QML、前端、雲端服務、科技藝術一直到 3D 印表機等整合課程都有。為了讓更多人能學習更多更深入的技術,也陸續開設了不同類型的進階工作坊。無論是已經很厲害的人,還是沒有太多經驗的學生,都可以前來活動,找到自己覺得最舒服的位置,學習發自內心的動手去完成一件事。

這活動的最終目的,是希望見到大家以能力會友,撞出火花,讓大家找到能互補的團隊成員,成就未來有潛力的團隊,實現更多具有影響力的創新。如我們一直所說,這是一個如太古般的生命濃湯,孕育著人才與新創火花。來黑客松能做出什麼成果,或許很難說,但你一定會得到很多的朋友與經驗!

我們期待終有一天,當某個成功的新創公司被問到:『當初創辦人們是如何認識?』,他們會回答:『在 Hackathon 活動』。

精彩回顧影片

還不知道黑客松在做些什麼嗎?看看我們三月份兩天一夜活動的精彩回顧吧!

下次活動訊息

4/11-4/12 (六、日)兩天一夜的黑客松活動也開放報名了!完全免費!名額有限,快來報名吧!

議程頁面 ▶ https://hackathon.tw/agenda/agenda.html
報名頁面 ▶ http://www.accupass.com/go/hackathon06

社群訊息

此外,如果你有興趣,可以加入 Hackathon Taiwan 的 Facebook 粉絲團,關注最新動態!

https://www.facebook.com/HackathonTaiwan

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

2015年2月10日 星期二

第四屆 Hackathon Taiwan 回顧!人才們的集散地!

Standard

每個月舉辦的台灣黑客松(Hackathon Taiwan),第四屆活動順利落幕!感謝大家的支持!無論你碰上什麼樣的隊友,有沒有完成作品,下次都歡迎再來!

曾幾何時,許多人對黑客松活動已經感到麻痺,似乎就是一群躲在暗處的宅宅工程師聚集起來自我感覺良好的場合,不然就是許多新創團隊前來展示產品的地方。往往沒有機緣巧合參與的人,總是深怕自己能力不足而無法參與,也有人覺得來這裡看別人發表產品,相當無趣。人們逐漸忘了黑客松的原本出發點,也忘了捲起袖子動手的熱情,更忘了與人交流並相互扶持學習的愉悅。

事實上,一個在大家心目中理想的黑客松,不外乎就是有得玩、有得學、有得做、有得交流,最後,能上台展示自我並取得成就感。這樣的氛圍,不同於補習班,也不同於一般制式學校,因為沒有成績壓力、沒有世俗壓力、更沒有人干預你,這更像是一個大學校園,參與者就在這樣的環境中自由發展,盡情做自己覺得有趣的事。


也許是教育體制的問題,也許是歷史文化所致,我們從小就沒有太多自由發展的機會,這讓不少人很晚才找到了自己的興趣。而進入社會後,缺少發自內心驅動的職場生活,讓更多人被生活所困,只能被世界及國內潮流被動的推著往前。我們有多久,沒有因學習新事物而開心?我們有多久,沒有因為與同伴們完成共同目標而感到興奮?那些再簡單不過的樂事,變成是種奢望。

這也是為什麼,我們發起了這樣的黑客松活動,試圖喚起人們的童趣以及熱情,讓人們在這找回自我學習的熱誠,以及團隊合作的心情,更重要的是,能夠學習如何貢獻並展現自己。在我們的活動中,無論結果的作品如何,這些種種對一個好的人才來說,都是不可或缺的要素。因為我們認為,台灣的人才素質普遍不錯,只是尚未有好的方法展示出來,並引出其真正價值而已。

共同持續參與,並逐漸改變這個社會氛圍,在這我們看見了人才們發光,也看見這片土地的希望。如果你問我說台灣黑客松每屆的活動能留下什麼?我會說,別的黑客松我不知道,但我知道我們的活動,讓人們帶回去的是提升後的自己與改變產業、社會的動力。

也許你沒發現,但經歷過這一切後,你已經不一樣了。

後記

不同於普通的活動,籌劃黑客松更為累人,除了要照顧的是兩天一夜的會眾,還要規劃各類課程與營造氛圍,更不能為了財務壓力下與中心思想背道而馳,複雜程度完全不可同日而語。

可愛的是,我們的參與者都是發自內心的願意主動參與,讓人非常欣慰。看到越來越多人熱衷於參加活動,讓我們更有信心一屆屆辦下去。

感謝你們,不是單純的被正妹團、龍蝦與砸大錢的大魚大肉所吸引過來,而這就是廣告公司永遠無法理解的文化。