我不太懂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
在node.js使用underscore.js
太早起床,只好隨便研究點東西 :P
underscore.js對javascript來說是一個蠻好用的工具, 在前端應用程式的開發中也很常被利用到,但同樣以javascript為基礎開發的node.js, 能否直接使用underscore.js呢?
嘗試以下面的程式碼用node.js跑:
執行結果會得到“ReferenceError: _ is not defined”
打開underscore.js的原始碼一看, 發現了這一段, 其實它是有針對node.js做手腳的:
也就是, 在browser時, “_"是一個global object, 但在node.js則不是, 原本的範例如果改成這樣就可以了:
這樣一來, 前後端也可以共用同一份underscore.js了
補充: 類似的工具還有async這個, 也是前後端都可以應用
via Blogger http://bit.ly/R10QWD
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
一些小想法 10/4
趁著等車時寫一下昨天搭車時想到的一些東西
今年參加了好幾個國內外的hackthon,收穫還算不少,覺得,很多developers都有很多不錯且創新的想法,但實際上,大部份的工作場,除了以developers為主體的公司外,大部份的developers處的角色都是執行者,這些"想法"反而往往在工作場合不會出現或被埋沒,這讓我想到"Effective Programming"裡提到的"developers大多不善於表達"!
這倒很難辯駁的,這一行,包含我自己,不用說不懂的做美美的簡報、炫麗的demo,連把一個簡單的觀念傳達給別人都可能要花上大把時間,尤其是傳達給非技術相關的,developers的思考模式大多是非線性的、跳tone的,強一點的根本就是multi cores,而且,都是沒耐性的,所以往往傳達給別人的,大多不到本意的六成,被瞭解的大概又只剩這一半
Hackthon算是一種不錯的訓練,訓練人在短時間團隊合作並傳達更多有趣的想法,雖然我不是很喜歡那些藉這種場合宣傳自己產品的,畢竟他們的產物不是在當下產生的,不過也是很多有趣的startup就這麼興起的
via Blogger http://bit.ly/PXPsfy
[Android] GCM可以怎麼用?
GCM的前身就是所謂的C2DM, 最早在今年Google I/O時聽到C2DM將進化到GCM時, 就在想, 一定要架個server才可以利用GCM嗎?
其實是可以不用的
從API console可知, 是可以設定允許從任意IP傳送的
再來看看一般的流程:
1. Regster:
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
其實是可以不用的
從API console可知, 是可以設定允許從任意IP傳送的
再來看看一般的流程:
1. Regster:
2. 取得Registration ID後將ID送至ServerGCMRegistrar.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");
}
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
[Android] 如何知道使用者是否已移除你的程式
這問題我原先是在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