我不太懂closure, 不懂的程度大概是我在用它的時候也沒有意識到我在用, 也沒玩過Go, 不過昨晚心血來潮的開始想用它來寫一些東西, 研究了一下, 發現它…挺有趣的, 尤其是concurrent的部份, 以及讓我重新檢視了一下closure這部份

在Go裡, function是可以像在javascript中一樣, 被指定到一個變數來使用:

上面兩個範例, 一個是把函式指定給一個變數, 一個是來當做回傳值, 這也是Go的closure大致上的形態, 在Go Tour的第48頁的作業, 便是要求利用closure來完成Fibonacci數列的計算, 我們所熟知的Fibonacci數列(0, 1, 1, 2, 3, 5, 8 … f(n) = f(n-1) + f(n-2))可以用iterative或recursive的方式來求解(範例), 當然使用Go其實也可以採用這兩種方式:

Iterative solution:
Recursive solution:
如果單以公式看, Recursive solution是比較容易被理解的, 不過也比較有stack overflow的風險, 當然, 照這練習題的要求, 以上兩者都不滿足, 那改用closure來實作又是怎樣?
整體上還算蠻簡潔的, 既然closure在javascript也很常被利用, 這邊放一個javascript的版本做一下比較:

測試了一下效能, 前三種實作方式, 感覺不出有太大的差異, 也就很難說誰優誰劣, 至於Go與javascript的比較, 如果是以"go run “的方式跟node.js來比, node.js高出甚多, 可能"go run"還是需要經過編譯階段, 但如果先以"go build"編譯成原生碼(native code), go的效能就高出甚多了, 不過以這比較也不算準啦….




via Blogger http://bit.ly/POcYPv

太早起床,只好隨便研究點東西 :P
 
underscore.js對javascript來說是一個蠻好用的工具, 在前端應用程式的開發中也很常被利用到,但同樣以javascript為基礎開發的node.js, 能否直接使用underscore.js呢?

嘗試以下面的程式碼用node.js跑:

require('./underscore.js');                                                                

var a = [1, 23, 6, 11, 25, 12, 33, 11, 4];

_.forEach(a, function(v) {
console.log(v);
});


執行結果會得到“ReferenceError: _ is not defined”
打開underscore.js的原始碼一看, 發現了這一段, 其實它是有針對node.js做手腳的:


// Export the Underscore object for **Node.js**, with
// backwards-compatibility for the old `require()` API. If we're in
// the browser, add `_` as a global object via a string identifier,
// for Closure Compiler "advanced" mode.
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = _;
}
exports._ = _;
} else {
root['_'] = _;
}

也就是, 在browser時, “_"是一個global object, 但在node.js則不是, 原本的範例如果改成這樣就可以了:


var _us = require('./underscore.js');                                                                

var a = [1, 23, 6, 11, 25, 12, 33, 11, 4];

_us.forEach(a, function(v) {
console.log(v);
});


這樣一來, 前後端也可以共用同一份underscore.js了

補充: 類似的工具還有async這個, 也是前後端都可以應用

via Blogger http://bit.ly/R10QWD

趁著等車時寫一下昨天搭車時想到的一些東西

今年參加了好幾個國內外的hackthon,收穫還算不少,覺得,很多developers都有很多不錯且創新的想法,但實際上,大部份的工作場,除了以developers為主體的公司外,大部份的developers處的角色都是執行者,這些"想法"反而往往在工作場合不會出現或被埋沒,這讓我想到"Effective Programming"裡提到的"developers大多不善於表達"!

這倒很難辯駁的,這一行,包含我自己,不用說不懂的做美美的簡報、炫麗的demo,連把一個簡單的觀念傳達給別人都可能要花上大把時間,尤其是傳達給非技術相關的,developers的思考模式大多是非線性的、跳tone的,強一點的根本就是multi cores,而且,都是沒耐性的,所以往往傳達給別人的,大多不到本意的六成,被瞭解的大概又只剩這一半

Hackthon算是一種不錯的訓練,訓練人在短時間團隊合作並傳達更多有趣的想法,雖然我不是很喜歡那些藉這種場合宣傳自己產品的,畢竟他們的產物不是在當下產生的,不過也是很多有趣的startup就這麼興起的

 



via Blogger http://bit.ly/PXPsfy

GCM的前身就是所謂的C2DM, 最早在今年Google I/O時聽到C2DM將進化到GCM時, 就在想, 一定要架個server才可以利用GCM嗎?

其實是可以不用的

從API console可知, 是可以設定允許從任意IP傳送的

再來看看一般的流程:
1. Regster:
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
GCMRegistrar.register(this, SENDER_ID);
} else {
Log.v(TAG, "Already registered");
}
2. 取得Registration ID後將ID送至Server
3. Server之後可以用這ID送訊息給這一支手機

由"2"看來, 其實Registration ID是關鍵, 而不是Server, 任何人只要有Registration ID, 就可以傳送訊息給這隻手機了

做了個小小實驗, 寫了一支Activity同時具備了收訊息以及傳送(給自己)的能力:

http://bit.ly/Q9qSag

想到的應用: 兩隻手機透過條碼或藍牙交換Registration ID, 就可以透過GCM互傳訊息了

缺點: Registration ID如果有變(GCM是有可能更換ID), 就失效了

via Blogger http://bit.ly/Q9qSai

這問題我原先是在Stack overflow看到的:

http://bit.ly/PNSz84

我也提供了一個解法, 不過, 慚愧的是, 我當初突然想到這解法後, 自己並沒有去實驗它, 只是覺得理論上可行… :P

我的方法是, 利用GCM (Google Cloud Messaging), 裡面有一段:

When users uninstall an application, it is not automatically unregistered on GCM. It is only unregistered when the GCM server tries to send a message to the device and the device answers that the application is uninstalled. At that point, you server should mark the device as unregistered (the server will receive a NotRegistered error).

後來拿了GCM sample試了一下, 好像也可行, 只是不是那麼即時, 也就是沒辦法剛移除就知道了, 我的測試結果是, 一兩個小時候才出現 “NotRegistered”, 不過似乎也是個解法就是了…

via Blogger http://bit.ly/Qqr2Mn