Golang 1.1 & Nodejs 0.11.2

不知道是講好的還是怎樣,兩個一起在今天放出新版本(不過更新的頻率差蠻多的就是了 XD)。因為莫名的支持(違),所以都會稍微留意一下兩項的發展,剛好在今天一起更新,就順便在這邊作個註記吧。

Go1發佈的時間已經是一年以前的事了(應該沒記錯吧),不過畢竟是Google本家的產品,所以讓人很有信心(無理由XD)。不過除了這種過激言論之外,還是有不少肯定的聲音啦,而且看起來本家也有心要推廣,所以App Engine也在第一時間就支援了,也算是有個成熟的平台可以使用(heroku也是另一個選擇 ;p)。

關於詳細的新版更新,可以參考官方的公告以及說明文件。之前就有提到1.x系列應該都會維持介面穩定,所以根據官方的說法,這次1.1也是相容1.0.x,主要的變動是在效能上的改善,想感受一下的可以到這邊看看 ;p

另外NodeJS也不約而同放出最新的測試版本,根據以往的慣例,目前的v0.11應該可以看做是v0.12的先行測試分支,所以可以看到一些未來預定加入的功能出現。對於下一個穩定版號v0.12的計畫,Isaac也剛好有提到,有興趣的可以看一下

重心會放在TLShttpclusterBuffer上以及一些效能改進。另外,也可以直接把v0.12當做是pre-v1.0,兩者應該會幾乎一樣。(應該可以期待今年之內可以看到!?)

Callback or Promises

最近nodejs社群對於核心介面的寫法突然湧起一股討論, 應該是下面這篇文章起的頭 ;p

主要是提到promises的規範能夠更好的來處理非對稱的程式,Promises這東西之前只稍微看過,一來是目前好像存在不只一種的規範,另外我一直到目前也實在不很瞭解它真正的用法,不過有興趣的Google一下應該也可以找到不少說明。不過概念類似根據執行的狀態(unfullfilled, resolved, rejected)然後執行對應的程式

  1. JavaScript异步编程的Promise模式
  2. Promises/A
  3. Asynchronous Control Flow with Promises
  4. A tool for making and composing asynchronous promises in JavaScript

有興趣的話,可以看一下spec成員的講解

然後就出現幾篇不同觀點的文章

nodejs社群成員有出來提一下不同的看法,也就是為什麼目前是採用callback的方式。
(蠻有趣的是,原來之前nodejs core是包含promise的,不過後來被拔掉了)

然後原作者又發了一篇新文,回應前面幾位作者的論點,另外也特別舉例子說明其實Promise也是可以很簡潔的。

因為對promise不夠了解,所以也不好多說些什麼,不過目前我也認同@mikeal所說的,callback的簡單明瞭是nodejs module可以蓬勃的原因之一,概念上也比較容易了解(至少對我而已是這樣沒錯啦),不過如果promise真的對於開發能帶來更好的結果的話,相信開發者也會逐漸轉換的吧(這算是開源世界的好處嘛(炸

Use Domain to Handle Nodejs Error

最近常常因為追推才開始寫文,這應該算是件好事吧!? :p

剛好都是提到NodeJS中處理Error的問題,就一起看一看,然後發覺其實也蠻相關的,因為他們都不約而同提到Domain,所以順便在這邊做個註記,可以開始試著用domain來簡化在nodejs中處理錯誤的問題。

首先是官方發出的公告:

在現有的http module之中有memory leak的問題,nodejs團隊已經針對問題在v0.8.20的版本中進行修正了,不過遵循著等價交換的原則(啥),會產生更多的hangup的錯誤,當然你也必須在程式中去處理這個問題。

當然,處理錯誤也不是什麼神奇的東西(除非你本來沒在做這件事 XDD
不過有人提到可以利用domain來處理。

JS中的錯誤處理一直沒有一種統一的作法,再加上JS非對稱處理的特性,會產生與其他程式語言不太相同的情況。然後就有位熱血大大特別寫了篇文章來說明在NodeJS之中,對於錯誤處理的幾種方式。

詳細的內容,大家可以直接看作者的原文,我在這邊只會概略提過。主要可以分成四種方式

  1. Return Error
  2. Throw Exception
  3. Callback
  4. Error Event

方法1在JS應該比較少人使用,所以主要討論放在2,3,4上面,不過無論是哪一種,你都可以利用Domain更有效來處理錯誤:

使用domain.run()(類似try catch的用法,包含整段程式區段)或domain.bind()(綁定特定的函式)在Exception之中,可以解決Exception互相影響的問題(如果你的try catch是多層的話,當最底層的例外被丟出的時候,全部都會被觸發)。

Callback的錯誤處理,一樣可以利用Domain來讓同一個Error handler來處理,而且也可以透過domain.intercept()讓來簡化callback的程式邏輯(因為intercept會自動處理callback的error - 預設是第一個參數),所以就可以變成這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Old way
test('a', 'b', function(err, data) {
    if (!err) {
        test(data, 'c', function(err, data) {
            // keep doing
        });
    }
});

//domain
domain.on('error', function(e) {
    // handle error
});
test('a', 'b', domain.intercept(function(data) {
    test(data, 'c', domain.intercept(function(data) {
        // keep doing
    });
});
Event就更方便了,因為domain會自動監聽error event,所以直接用domain.run()domain.add(EVENT_OBJ)都可以,然後只要emitter.emit('error', new Error(SOME ERROR)),實作domain.on('error')就可以了。

詳細的部份&範例程式都可以直接到作者原文那邊看,大推!

PS:前幾天又看到一個新個module - trycatch,說不定可以拿來試試,整合domain, long stack traces, color, format,除錯上看來會更方便一些 ;p

Welcome to Node.js V0.10.0

伴隨著官方公告,nodejs終於也邁向了v0.10最新的穩定版本

想快速了解新版的變動,可以直接看官方公告或是對岸的cnode成員的翻譯文

不外乎是改良與效能改進,不過v0.10最大的改變在於改良了原有的stream,所以我也只打算在這邊提關於Stream2的部份,如果是想了解其他部分的話,可以跳過這邊直接看上面列的那兩篇文章,或是官方之前寫的介面變動說明

除了原有的ReadStream, WriteStream之外,加入了DuplexTransform兩種新的類別。Duplex就是同時有Read & Write的功能,而Transform是更進一步,當你需要"在中間動點手腳"的時候用的,譬如zlib就是繼承Transfrom來實作的。

稍微列一下大概的用法,Duplex必須實作_read & _write兩個方法,然後Transform則是_transform


基本上就是個能跑秀個樣子的範例 XD,想看一下實際的程式,Duplex可以參考net,然後Transform則是zlib,使用介面與舊版是相容的(理論上 XD),不過新版之後的ReadStream使用方法有變動,所以如果你是用舊的方式(Listen 'data', resume() and pause()),都會切回舊的stream。

然後v0.10中,crypto也已經支援Stream了,所以之後加/解密之類的動作,都可以直接pipe過去就可以了,相當方便,再加上原本的fs, net, http, tls,都可以直接用stream來互相溝通了 :)

想知道更多有關v0.10的話,可以看一下之前Issac在Airbnb的分享

Les Miserables 電影心得

Les Miserables - Fight, Love, Hope, Dream

基本上,藝術、美感一類的東西從來就不是我的風格,所以自然也不太會去注意這一類的事。不過自從看到悲慘世界要翻拍電影版的新聞之後,我就下定決心一定得去電影院報到一次。

les_miserables_ver11

一切的孽緣(!)都是起自於高中時期,音樂老師放了一次Les Miserables 10th Anniversary Concert給我們欣賞,然後我就陷進去了。雖然也看過不少非常 的幾部作品,不過悲慘世界一直是我的不動第一位!

劇透什麼的應該就不需要了,應該大部分的人都聽過或看過這段故事吧,我個人也相當推薦音樂劇的版本,對於更重音樂性的朋友,10週年的那個版本應該可以滿足你/妳。(看那麼多的改編版,個人還是最愛10週年那個 :p)

想看電影的,應該也不會失望才對。不過不要把標準拉到跟音樂劇一樣比較不會有太大的落差,畢竟職業唱匠跟演員出身的還是有差,不過我相信電影版的演員都是導演特別挑過的才對,唱現場可以這樣應該不要再苛求了 :p

演員們還特別在今年Oscar上現場表演,讚!

個人比較遺憾的部份是,電影版並沒有加入(應該說補完)太多劇情上的內容。所以看完電影版會有點像音樂劇加強版的感覺。跟自己當初的期待有點落差,因為自己看音樂劇有太多腦補(XD),所以希望電影會多加一些劇情進去。不過瑕不掩玉,喜歡這部作品的觀眾進電影院應該是不會失望的 :p

不能不說,Anne Hathaway的最佳女配角真的是實至名歸,芳婷那段真的令人動容阿 ~

Canonical Rewrite Juju in Golang

這幾天看推的時候看到這篇

雖然知道Canonical有默默在用Go,不過沒想到他們這麼衝動(誤

應該是Canonical內部工程師寫的分享,主要是提到他們把Juju重新寫過,用Golang取代原來的python,至於什麼是juju,可以看一下官方製作的介紹影片 :)


簡單的說就是一套方便的雲端部屬工具,透過CLI,甚至更方便還可以直接使用圖形化的介面來部屬/管理程式到雲端上,有興趣的可以到juju的官方網站去看一下,或者直接玩一下圖形介面來部屬範例程式。

Golang Simple Go Through

最近花了點時間玩玩Golang,順便拿來當做內部Tech Talk的題目,真的是好物(誤)阿 XDD

目前功能上已經算蠻成熟了,而且跟nodejs有不少相似之處(連library/module的名稱都 XD),如果平常有接觸(C/C++/python/nodejs)任一,應該都可以輕鬆上手才是 :p

順便放上demo的簡單範例。Defer和一個簡單的wiki 也只是從官方範例節錄出來而已,有興趣也可以上github去找找,已經有不少golang的專案了 :p

Node.js 0.8.17 & Npm 1.2.0

早上起來就看到新版釋出的消息,不過有幾個特別的地方,稍微註記一下。

首先v0.8.17有特別要處理一個安全性(Integer overflow)問題,如果有使用到TypedArrays的使用者,請儘速升級到這個版號。

另外,是伴隨著一起升版的npm,從1.2.0之後加入了peerDependencies的新功能,有興趣的可以先看一下先前成員們的討論串:

其實我看不太懂(炸),不過去翻了一下討論列到的文章&範例,看起來像是為了處理擴充(plugin)而延伸出來的東西。一樣是在package.json裡使用peerDependeicies來定義,而列在上面的套件,安裝時會變成同層而不是從屬(sliding not child),而且會顯示錯誤如果安裝失敗。

// 如果你定義這樣
{
    "name": "pkgB",
    "version": "0.0.1",
    "dependencies": {
        "oauth": ""
    },
    "peerDependencies": {
        "express": "3.0.x"
    }
}
{
    "name": "pkgC",
    "version": "0.0.2",
    "dependencies": {
        "passport": "",
    },
    "peerDependencies": {
        "express": "3.0.x"
    }
}

// 然後另一個套件 { "name": "pkgA", "dependencies": { "pkgB": "~0.0.1", "pkgC": "~0.0.2" } }

// 安裝之後會變這樣 { "name": "pkgA", "version": "0.0.1", "dependencies": { "pkgB": { "version": "0.0.1", "dependencies": { "oauth": { "version": "0.9.8" } } }, "pkgC": { "version": "0.0.2", "dependencies": { "passport": { "version": "0.1.15" } } }, "express": { "version": "1.1.0" } } }

有看出端倪嗎 :p express被拉到pkgA套件相依的第一層,而不是在pkgB之下,這樣對於plugin的開發/測試將會更方便。@indexzero 有特別提到一點,這樣也可以順便把套件相依的關係拆的更細。有點像是達到繼承的效果,對於都是express的plugin,就不需要各自擁有一份,每個plugin都可以直接使用同個express。

想用新功能,請認明 >nodejs 0.8.17 || >npm 1.2.0,Enjoy!

Update: 作者有親自寫了一篇更詳細的說明