BML 小註解

什麼是 BML 呢?它和體檢時令人尷尬的 BMI 沒有關係, BML 全名是 Broadcast Markup Language (廣播標記語言). 它在 1999 年由日本提出來, 記載在 ARIB STD B24 標準之中. 如同它的名字顯示的, 這是 XML 的一種, 又用在數位電視廣播.

網路上相關的訊息很少, 最好的一個 link 可能是這個:New Generation TV platform API and Privacy Protection

試想, 如果電視台送過來的訊息是一個 XML file, 那麼傳輸效率還挺高的, 只要接收端的 browser 夠強, 就可以達到節省頻寬的目的.

至於在歐洲推動了很多年的 MHP (Multimedia Home Platform) 架構, 則是在接收端建好 Java 的虛擬機, 等著 run 傳過來 Java 程式 (例如用 DSM-CC), 相形之下效率就低了些. 

最近在歐洲比較紅的 HbbTV 基本上也是以 CE-HTML 做互動.未來更將改用 HTML5  取代 CE-HTML. 在那一天還沒有來臨之前, 我們先關心一下歷經市場十多年考驗的 BML 吧,它的 API 多達 229 個! 有些功能連 HTML5 都還沒有.

BML Broadcasting Extension API 包括:

• EPG API

• VOD/Broadcasting base on Home Server API

• Storage API

• Interactive/Presentation API

• Other TV set Control API

比方說, BML 還支援把節目的畫面用印表機印出來, 這樣夠炫了吧!更別說什麼連續劇預約錄影, 硬碟儲存權限保護等等了. 因此, 在上面提到的那篇文章中, 作者認為 BML + HTML5 會是最佳互動電視的解決方案.

不過, 個人以為 BML 幾乎只有日本人在用, 而 HTML5 可以無限改版擴充, 總有一天 HTML X 樣樣都會比 BML 強!

在 Word 製作文件目錄

最近在寫文件的時候, 剛好需要製作三種目錄, 包括 TOC (table of cotents), 圖形與表格的目錄 (table of figures). 雖然套用別人的樣板就沒有問題, 但是其實自己不會做這個東西. 上網查了一下, 大多數都是英文的網頁, 而且沒有 Office for Mac 的版本, 其實搞不懂關鍵何在?

雖然我也看到 Word 給我的提示, 不過那只適用於 Table of Contents, 對 Table of Figures 只能算是誤導吧?

List of Tables

No table of figures entries found.
In your document, select the words to include in the table of contents, and then on the Home tab, under Styles, click a heading style. Repeat for each heading that you want to include, and then insert the table of contents in your document. To manually create a table of contents, on the Document Elements tab, under Table of Contents, point to a style and then click the down arrow button. Click one of the styles under Manual Table of Contents, and then type the entries manually.

如果要製作 table of content, 首先要決定標題的形式, 也就是 style. 比方說最大的標題 (Heading 1) 要選 1, 次大的標題 (Heading 2) 要選 1.1, 再下一級標題 (Heading 3) 要是 1.1.1…之類的. 這邊用 mouse 的右鍵可以選到這個 style 適用的字體或是字型大小, 還可以把整份文件的同一個 style 都改成一致的格式.

最後, 在需要插入 TOC (table of contents) 的地方, 從 word 的工具列選擇 insert, 然後再選擇 index and table (索引及表格) , 就可以自動把 TOC 建出來, 而且還可以在這裡選擇表現方式, 有沒有顏色? 要不要排縮等等.

至於製作 figure 和 table 的 table, 那就需要事先告知 Word. 首先對於每個圖形或是表格, 不是光把字打上去就算了. 像是 Figure 1. System Overview 這樣是不行的, 難以寄望 word 自己就能把表給建出來. 每個說明文字要先插入一個標題 (caption). 去工具列選 insert → caption, 就可以接著選擇這是公式, 圖形或是表格. 至於標題的 style 是啥都不要緊.

同樣在需要插入 table of figure 的地方, 再去選一次 insert → index and table, 選擇 table of figure, 再從中選擇是建立 equation, figure, 還是 table 的 index 就可以了.

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