Node JS 小註解

Node JS 是一顆新星, 最近相當紅. 從字尾 JS 看來, 當然就是指 Java Script. Node 嘛…我也查不到, 可能是因為它有網路的背景吧!

網路上介紹 node JS 的文章已經相當多了, 切入的角度也各有不同. 但最重要的一件事是: node 是一個 Java script 的 server. 首先要有 Java script 寫好的 .js 檔, node server 才能夠去執行它.

通常我們會在瀏覽器端執行 Java script, 例如寫個表單程式之類的, 使用 Java script 會很方便. 而 Node JS 是在伺服器端運行 Java script 用的, 甚至 Node JS  本身就可以當作 web server 的平台, 拿來建立 HTTP server 之用.

從技術面來看, node JS 基於 Google V8 的 Java script engine (這也是 Chomre 在用的), 並且增加了一些內建的函式庫. 基本上我們可以找到其他一些性質相同的替代方案, 例如 common JS, RequireJS 等等. 相關訊息可以參考其他連結.

CommonJS 和 RequireJS 有什麼不同 ?

Common JS 和 node JS 都是用 synchronous module, 而  Require JS 採用 AMD (asynchronous module definition), 遇到需要的載入的模組, 才會把它叫進來.

Bridging the module gap between Node.js and browsers

Universal modules (browser, Node.js): imports and universal tests 

Synchronous module 的好處是全部的 module 已經進了 memory, 所以可以很快回應.  Node JS 只用一個 thread, 又強調 event driven. 所以反應迅速確實很重要. 當然, 如果 user 硬是寫了一個 blocking 的 Java script, 那麼 Node JS 還是會讓它卡住. 詳情可以看這裡:

Node入門  中間有一段專講 Blocking與 Non-Blocking. 

有些人的觀點是拿 node JS 和 PHP 比較. 畢竟 PHP 和 node JS 的差異很大, 直接比較並不太公平. 只能看出 node JS 的 event driven 寫起來比較省事. 另外一些人則是拿 node JS  和 AJAX 類比, 主要是討論兩者會不會都是一窩蜂? 至於在現實生活中, 這兩者倒是可以並存.

Node.jS初學者筆記(3)-用Ajax傳送資料

Node JS 真正長什麼樣子呢? 其實安裝起來就知道了. 其中有一個 node.exe 和一個 node_modules 的目錄, 好東西都在目錄裡. 支援的 module 包括 fstream. mode-uuid, request…等等. 安裝的連結在下面.

http://nodejs.org/#download

支援 node JS 的 Java script, 可以看 “Node入門" 裡面這個例子:

[圖片遺失]

這是一個 node 可以執行的  server.js, 只要安裝好 Node, 就能用 node server.js 產生一個聽 8888 port 的 HTTP server.

每當 port 8888  收到請求, call back function onRequest() 就會印出 Hello World. 如果沒有收到 port 8888 的訊號, 執行此 Javascript 只會印出 Server has started.

如果用匿名函數來寫, onRequest() 就省略不計了, 但 call back 的精神還在. 這也是 node JS 支援的語法.

總結一下, 如果我們想在 server 端處理 Java script, 使用 node JS 會是不錯的選擇. 至於在 web browser 端使用 Java script, 交給 Google V8 engine 就可以了, 不需要用到 node JS. 如果大家想學 node JS, 這幾個網址相當不錯:

Node.jS初學者筆記(1)-用GET傳送資料

為什麼選用 Node.js ?

Node JS 發明人 Ryan Dahl 自己做的簡介影片如下:

Lambda 小註解

進入正題之前, 請容我扯一段往事. 話說我們大學的時候, 系上有一位姓包的老教授, 人稱老包. 他是一個鐵面無私的老師,  三次點名不到必當, 所以很容易和開封府的包大人聯想在一起.

老包教的科目裡面有一科電力機械, 這本沉悶的教科書裡面用到一大堆的 γ 和 λ 符號; 所以老師言必稱 γ 和 λ . 敝人修完這堂課, 最後唯一記得的也就是 "柑仔" (γ)那麼大 (λ)了. 後者即是今天的主角 – 那麼大.

由於現在的程式愈來愈複雜, 所以多餘的東西漸漸被捨棄不用. 在這種考量之下, 匿名函式 (Anonymous Fuction) 應運而生, 而 Lambda 運算式正是匿名函式的其中一種, 另外一種是匿名方法 (Anonymous Method). 匿名方法可以省略參數 (清單), 但是 Lambda 不能.

先來看看 Lambda 運算子. Lambda 運算子具有將左邊參數指派給右式的功能, 比方說:

1. Expression Lambda (運算式 λ):

(input parameters) => expression

delegate int del(int i);

static void Main(string[] args) {

del MySquare = x => x * x;

int j = mySquare(5);     //j = 25 

}

所以我們就不需要中規中矩地寫一個乘方的函數, 而是草草帶過, 有正確答案就好.

或曰, 為什麼不用 macro 來代替呢? 其實 Lambda 的功力並非只有這樣.

2. Statement Lambda (陳述式 λ)

(input parameters) => {statement;}

delegate void ShowHelloWorld(string s);

ShowHelloWorld myDel = n => { string s = n + " " + "World"; Console.WriteLine(s); }; //  一行文函式

myDel("Hello");

結果當然是輸出 Hello World.

大家可以看得出來, 使用 Lambda 很像是寫 script,  只要意思不會搞錯, 字串或是數值都用一樣的寫法. 只要把握基本的原則, Lambda 就可以快速地為大家服務.

以下是 Lambda 的一般規則:

1. Lambda 必須包含與委派型別相同數目的參數。  

2. Lambda 中的每個輸入參數都必須能夠隱含轉換為其對應的委派參數。  

3. Lambda 的傳回值 (如果存在) 必須能夠隱含轉換為委派的傳回型別。

特別值得一提的是傳回值, 它使用 delegate 後面委派的型別, 如第一例中的 int, 和第二例中的 void.

Lambda 運算可以出現在 Visual Basic 或 C# (3.0) 之中. 上面舉的例子都是 C#, 此時會使用到 Lambda 運算子 =>.

歷代 C# 使用委派的歷史可以看這個例子, C# 2.0 開始用匿名方法, 直到 C# 3.0 之後才使用 Lambda.

class Test
{
    delegate void TestDelegate(string s);
    static void M(string s)
    {
        Console.WriteLine(s);
    }

    static void Main(string[] args)
    {
        // Original delegate syntax required
        // initialization with a named method.
        TestDelegate testDelA = new TestDelegate(M);

        // C# 2.0: A delegate can be initialized with
        // inline code, called an "anonymous method." This
        // method takes a string as an input parameter.
        TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };

        // C# 3.0. A delegate can be initialized with
        // a lambda expression. The lambda also takes a string
        // as an input parameter (x). The type of x is inferred by the compiler.
        TestDelegate testDelC = (x) => { Console.WriteLine(x); };

        // Invoke the delegates.
        testDelA("Hello. My name is M and I write lines.");
        testDelB("That's nothing. I'm anonymous and ");
        testDelC("I'm a famous author.");

        // Keep console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output: Hello. My name is M and I write lines. That's nothing. I'm anonymous and I'm a famous author. Press any key to exit. */

不過 VB 裡面沒有特定的 Lambda 運算子, 只有 Lambda 運算式, 例如:

Dim doubleIt As Func(Of Integer, Integer) = _ Function(x As Integer) x * 2

詳請可以看這一篇: Lambda 運算式

TR-069 小註解

TR-069 是個什麼東西呢? 它是一個 CPE (Client Premium Equipment) 管理的機制, 由 DSL forum 所提出, 正式名稱是 CPE WAN Management Protocol (CWMP). 舉凡可以透過網際網路上網的設備, 都是 TR-069 所考慮的客戶端設備.

對賣 IP STB 的廣播公司來說, 客戶升級失敗導致退貨是他們擔憂的一件事. 怎麼樣能夠讓客戶無痛升級呢? 首先就是要搞懂客戶家裡的網路設定, 甚至是設備的型號和版本, 對吧! 加入相容於 TR-069 軟體, 就相當於有了一個植入客戶產品裡面的木馬模組可以裡應外合.

當然, TR-069 可以做的事情不只是升級這一件事是, 舉凡轉移設定檔, 增減服務項目, 管理與收費 (pay-per-view), 家庭監控都在它鎖定的服務項目之內. 簡單地說, 只要 IC 設計公司可以提供 TR-069 的支援, 那麼影片供應商或是系統廠就可以輕易地換 IC solution, 而不用擔心原先設計了一堆程式都要重新來過. 

 TR-069 只是一個比較廣泛的規範, 它的親朋好友還包括了下面這些.

既然 TR-069 是基於網路的協議, 順便也展示一下它的 protocol stack. 出現在 stack 最上層的 ACS 表示 Auto Configuration Servers, 它相對於用戶端的 CPE. TR-069 就是溝通它們用的. 我們可從下圖看到它基於 SOAP (Simple Object Access Protocol) 和 RPC (remote procedure call), 而且可以加密.  其中 TLS = transport layer security, 而 SSL = Secure Sockets Layer, 是 TLS 的前身, 它的知名度也比較高.

[ref]

1. SPEC: TR-069 Issue 1 Amendment 4.

2. BawBaw 私人招待所

3. Overview of TR-069

DSM-CC 小註解

網路上不容易找到把 DSM-CC 講清楚的網站, 雖然官網或許講得很詳細, 但是如果有人想在 3 分鐘內知道這個名詞的屬性, 應該不能靠官網. 

DSM-CC 全名是 Digital Storage of Media Command and Control Protocol , 功用在於提供互動電視的下載機制.

如果要和 MPEG TS (transport stream) 一起傳輸, 就必須將 DSM-CC 的 message 包裝成 private section. 這種 DSM-CC section 和 TS 的 private section 相容, 因此可以在廣播碼流中夾帶 DSM-CC 的訊息. MPEG2 TS 夾帶 DSM-CC 訊息的格式請參考 [1].

DSM-CC 必須將一個可執行的程式, 切割成小段 (data pipe), 加入同步訊息 (data stream), 打包進 bit stream (multi-protocol encapsulation). 由於廣播的特性在於不知道使用者何時開機, 換台,…等等, 所以這些 DSM-CC 的服務 (service domain) 都必須週期性地出現在 TS 碼流當中. 這種特性稱為 Carousel (旋轉木馬), 亦即每隔一段時間就會再出現.    

像是 MPEG video 都有 GOP (group of picture), DSM-CC 的內容也分成 group. 於是有 group 外的 DSI (download server Initiate) 存放參考資訊, 以 group 形式出現的 DII (download info indication) 和 DDB (download data block).

如果是 object carousel, DSM-CC 的 service domain 分為三種 object: service gateway, directory, file. 看起來很複雜, 其實就是 service 的根目錄 (root), 文件夾 (folder), 和檔案 (file). 也就是傳過來的應用程式要放在哪裡的意思. 此時 DSI 負責存 service gateway info.

當收完 object carousel 之後, service 存放位置應該都已經確定了. 此時 data carousel 會將真正的 data (如應用程式) 放在 DDB 中傳輸 (以 group 出現).

對一個 STB 軟體來說, TS demuxer 解析了 PAT, PMT, 自然可以找到 data stream. DSM-CC 再負責從中間組合出應用程式. 這裡有個 trade-off 就是一次要組合幾個 module (object 或是 data) 才好? 如果看到一個 module 就收一個, 可能同時要收一大堆 module, 結果把記憶體弄爆! 一次如果只處理一個 module, 可想而知那個旋轉木馬不知道要繞幾圈才能把所需要的 module 都收齊, 速度一定其慢無比了.  

[Note]

1. http://www.360doc.com/content/10/0224/11/59579_16643719.shtml

2. 中文論文: 數位視訊廣播多媒體家用平台之DSM-CC軟體設計與實現

邊境市場與台灣的信評

前陣子, 標普把法國, 西班牙, 奧地利的信評從 AAA 移除,  順便把義大利降低到 BBB+. 這麼一來, 到底有多少還是 AAA 等級呢? 上網看了一下, 相當尷尬啊! 在惠譽 (FitchRating) 的版本中, 中國大陸的評等都比美國好. 雖然惠譽把義大利列在 A-, 而非標普版的 BBB+, 其實也相去不遠了.

在亞洲四小虎當中, 台灣確實敬陪末座, 連韓國這麼喜歡搞貶值的國家都比台灣還高上一級. 為啥台灣 “淹腳目" 的財政會變成這樣呢? 主要的原因就是舉債和減稅. 政府舉債額度到達 GDP 的 37.7 % 以上 (2011/1/26 資料), 而且執政黨喜歡減稅, 經濟景氣又下滑, 導致稅收不如預期.

資料來源:惠譽網站

搞清楚台幣的地位之後, 接下來想想邊境市場 (Frontier Market) 的問題.  馬克莫比爾斯 (Mark Mobius) 這個月的錢雜誌上說, 過去十年中, 成長最快速的十個國家中, 除了中國, 其他九個都邊境國家 (Frontier Countries). Frontier 被翻譯成 “邊境" 似乎有邊緣化這些國家之嫌, 就英文的原意來說, Frontier 有開拓者的意思, “這些國家正在開拓中" 感覺才是個比較正面的說法.

那些國家在這個行列當中呢? WIKI 上說有三個版本, FTSE 就是所謂的"富時指數有限公司"(Financial Times Stock Exchange), MSCI 就是最近老是不調升台灣在全球市場權重的那家摩根史坦利 (Morgan Stanley Capital International). 標普就是標準普爾 (Standard and Poor).

國家 英文 FTSE MSCI 標普
阿根廷 Argentina O O O
巴林 Bahrain O O O
孟加拉 Bangladesh O O O
波札那 Botswana O   O
保加利亞 Bulgaria O O O
哥倫比亞 Colombia     O
象牙海岸 Côte d’Ivoire O   O
克羅埃西亞 Croatia O O O
賽普勒斯 Cyprus O   O
厄瓜多 Ecuador     O
愛沙尼亞 Estonia O O O
加納 Ghana     O
牙買加 Jamaica O
約旦 Jordan O O O
哈薩克 Kazakhstan   O
肯亞 Kenya O O O
科威特 Kuwait   O O
拉脫維亞 Latvia O
黎巴嫩 Lebanon   O O
立陶宛 Lithuania O O O
馬其頓 Macedonia O    
馬爾他 Malta O    
模里西斯 Mauritius O O O
納米比亞 Namibia O
奈及利亞 Nigeria O O
阿曼 Oman O O O
巴基斯坦 Pakistan   O O
巴拿馬 Panama O
卡達 Qatar O O O
羅馬尼亞 Romania O O O
塞爾維亞 Serbia O O
斯洛伐克 Slovakia O   O
斯洛維尼亞 Slovenia O O O
斯里蘭卡 Sri Lanka O O O
千里達與托巴哥 Trinidad and Tobago   O O
突尼西亞 Tunisia O O
烏克蘭 Ukraine   O O
阿拉伯聯合大公國 United Arab Emirates   O O
越南 Vietnam O O O
贊比亞 Zambia     O

OK! 過去台灣人都認為自己勤儉又打拼, 所以創造出經濟奇蹟. 然而, 未來的舞台可能是屬於這些我們不熟悉的國家, 不但不知道它在哪裡? 連名字都可能沒聽過, 真是叫人情何以堪啊?

至少, 我們可以做到不要催眠自己, 台灣的經濟奇蹟已經過去啦! 想出頭就得創新!