Griffith Chen 的部落格

Node.JS

Griffith Chen 的照片

Node.js 是個架在 Google V8 JavaScript 引擎之少的事件驅動式的輸入輸出模組 (evented I/O),它的設計是根據在其他語言的框架 (framework) 像 Ruby 的 Event Machine 以及 Python 的 Twisted. Node 的目的是能夠提供一個簡單的方式來創作高效能和具擴充性的及時性網站應用程式。

JavaScript一般都是執行瀏覽器上。近年來,CommonJS、Jaxer 或 Narwhal 等等的框架不斷的出現,希望把 JavaScript 帶到伺服端的環境。跟這些選擇比起來 Node 有些不同,因為它是事件導向而不是執行緒導向。像是 Apache 這類用來提供 CGI 執行的網站伺服器是屬於執行緒導向,因為每當有一個請求送達的時候就會觸發一個系統執行緒產生。執行緒導向模式不具備同時處理大量連線的能力,因此也不適合用來設計及時性應用程式。
Node 透過事件循環 (event loop) 的方式取代執行緒,這樣就能夠同時處理上萬的連線。當一個連線請求 (request) 送達的時候作業系統會通知 Node,收到了通知 Node 會執行回呼涵式。每個連線只會佔了小小的堆積配置。然而,在ㄧ個需要處理大量連線的系統下,事件導向的 Node 在記憶體上也比較有效率。在 Node 的框架裡沒有鎖,它的涵式幾乎不會直接用到 I/O,所以程式行程也不會被鎖住。使用 Node 也程式的人也不需要為了死鎖 (deadlock) 而煩惱。

Node 的優點在於因為伺服器大多的時間都利用在等在 I/O 操作,而這些操作都遠比記憶題操作慢。Node 的 I/O 操作都是用非同步的方式,這樣就應許在處理I/O操作的同時程式行程繼續處理連線請求。

以下是一個用 Node 寫的 HTTP 伺服器,它接收的每一個請求都會回 ”Hello World”。

var sys = require(‘sys’), http = require(‘http’);

http.createServer(function(request, response) {
response.writeHead(200, {‘Content-Type’: ‘text/plain’});
res.end(‘Hello World\n’);
}).listen(8124);

sys.puts(‘Server running at http://127.0.0.1:8124’);

這程式載入了 sys 與 http 模組,然後建立了一個 HTTP 伺服器。被傳遞到http.createServer 的匿名函式會在每一個請求連線的時候被呼叫。當伺服器啟動的時候,它會告訴你它目前監聽埠號 8124。

Node 是一個令人興奮技術建立在另外一個非常了不起的技術上: Google 的V8 JavaScript 引擎。Node 這框架已經被科技界注意到,在加上它的模組化系統,在網路上已經有許多第三方的模組可以使用,來加強這完整框架。

SimpleDB

Griffith Chen 的照片

Amazon SimpleDB 是以 Amazon 的 Dynamo 為基礎的另外一個服務,把公司最缺的一塊,也就是資料庫,補起來了。SimpleDB 仍處於公眾測試階段;當前,用戶能在線註冊其免費版 – 也是說直到超出使用限制為止。SimpleDB 有幾方面的限制:
一次查詢最多只能執行5秒鐘。
除了字符串類型,別無其它數據類型。
一切都以字符串形式被存儲、獲取和比較。
字符串長度不能超過 1024 字節,限制了使用者在一個屬性中能存儲的文本的大小。
一個項目最多可以有 256個屬性。
由於處在測試階段,SimpleDB 的域不能大於10GB,整個庫容量則不能超過 1TB。

SimpleDB 不是 RDBMS (relational database management system,中文稱呼為「關聯式資料庫管理系統」),它的運作模式反而更簡單。Amazon SimpleDB 儲存的格式就是 Domain → PKeys, Pkey → Attributes,然後每個 Attribute可有許多Key → Value,像:

Key: 1
Attributes:
Category: Company
Name: Cellopoint
Website: http://www.cellopoint.com

SimpleDB 有簡易的 Select 語法可以使用。

安裝 PHP Library for Amazon SimpleDB:
1. 在 Amazon Web Services (AWS)官方網站下載 PHP Library for Amazon SimpleDB。
2. 將下載完的檔案解壓縮。
3. 從 AWS 申請以及取得 Access Key ID 與 Secret Access Key。

Client 連線測試:
1. cd 到 PHP Library 資料夾
2. vim test_client.php
<?php
$AWS_ACCESS_KEY_ID = …
$AWS_SECRET_ACCESS_KEY = …

require_once('Amazon/SimpleDB/Mock.php');
$service = new Amazon_SimpleDB_Mock();

require_once('Amazon/SimpleDB/Client.php');
$service = new Amazon_SimpleDB_Client($AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY);
?>
3. 執行 test_client.php

新增資料:
1. PHP 程式
$domain= “MyDomain”;
$item = “Product01”;

$attr1 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attr1->withName('Category')->withValue('Device');

$attr2 = new Amazon_SimpleDB_Model_ReplaceableAttribute();
$attr2->withName('Name')->withValue('D01');

$attrArr = array($attr1, $attr2);

$request = new Amazon_SimpleDB_Model_PutAttributesRequest();
$request->withDomainName($domain)->withItemName($item)->setAttribute($attrArr);

invokePutAttributes($service, $request);
2. Service 回應
Service Response
==============================
PutAttributesResponse
ResponseMetadata
RequestId
...
BoxUsage

取得資料:
1. PHP 程式
$request = new Amazon_SimpleDB_Model_QueryRequest();
$request->setDomainName('MyDomain');
$request->setQueryExpression(“['Category' = 'Device']”);

invokeQuery($service, $request);
2. Service 回應
GetAttributesResponse
GetAttributesResult
Attribute
Name
Category
Value
Device

ResponseMetadata
RequestId

BoxUsage
..

Google Omaha

Griffith Chen 的照片

Google 產品不需要使用者的操作來更新到最新的版本。這功能被稱呼為[自動更新]。

大部分的 Google 產品原來就有自動更新的功能,但是都分別使用了自己的方法去達到這目標。有些產品自己寫自己的自動更新機制,也同時有些產品使用了 Google 本身提供的自動更新機制以及伺服器。

Google 希望在它們的產品上減少重複代碼[code duplication],也不希望讓多台伺服器去擔任幾乎同一樣的功能。針對這些需求,Google 把它們產品全部歸在同一個自動更新機制下。這決定也是為了符合微軟 Windows 作業系統的進化。微軟的 Windows Vista 有一個相當嚴格的安全機制,不讓大部分安裝在電腦裡的程式去執行系統變更,包括:改 Windows 作業系同的登錄檔[Windows Registry]、寫到 Program Files 資料夾、或是在系統上做任何的永久性變更。這些條件都是傳統自動更新機制所需要執行的動作,因此在 Windows Vista 裡會無法順利執行。

除了這個以外,Google 產品還有面對另外一個問題:它們的客製化自動更新機制不統一。這造成了每一套產品都有不同的功能,也同時有了不同的行為。統一的機制能保證每一個 Google 產品都有一個完整的自動更新功能。

隨著 Google 產品的發展,它們的安裝過程以及使用者經驗[User Experience]的改善也變了越來越重要。以傳統的安裝模式而言,當使用者想安裝一個程式時通常會遇到很多技術性的用詞還有很多複雜的指定和選項。這會誤導使用者,並且讓他們不想要繼續安裝。

為了達到與克服以上所探討的問題,Google 開發了一套共用的機制來應付 Google Windows 產品的安裝和更新。這機制將跟一台自動更新的伺服器溝通。Google 把這機制稱為 Google Update,也把這計劃叫成 Omaha。

jQTouch

Griffith Chen 的照片

jQTouch 是一個基於 jQuery 的 JavaScript Framework,使用在手機裝置的 webkit 瀏覽器開發。iPhone、Nexus One、以及 Palm Pre 都可以使用 jQTouch 來開發手機應用軟體。jQTouch 提供讓開發者選擇自己的 css 主題,與加入插件 (extensions)。jQuery 是一個快速又簡淨的 JavaScript Framework,能過簡化開發者在 HTML 文件裡面尋找 DOM 物件、處理事件 (events)、製作動畫、和處理 Ajax 互動的過程。jQTouch 與 jQuery 的組合,甚至可以讓沒 jQuery 經驗的開發者容易的製作手機裝置上的手機應用軟體。


以下是一個程式首頁(Home)裡的 HTML:

<html>
<head>
<title>To-Do</title>
<link type=”text/css” rel=”stylesheet” media=”screen” href=”jqtouch/jqtouch.css”>
<link type=”text/css” rel=”stylesheet” media=”screen” href=”themes/jqt/theme.css”>
<script type=”text/javascript” src=”jqtouch/jquery.js”></script>
<script type=”text/javascript” src=”jqtouch/jqtouch.js”></script>
<script type=”text/javascript”>
var jQT = $.jQTouch({
icon: ‘todo.png’,
statusBar: ‘black’
});
</script>
</head>
<body>
<div id=”home”>
<div class=”toolbar”>
<h1>To-do</h1>
</div>
<ul class=”edgetoedge”>
<li class=”arrow”><a href=”#about”>About To-Do</a></li>
</ul>
</div>
<div id=”about”>
<div class=”toolbar”>
<h1>About To-Do</h1>
<a class=”back” href=”#”>Back</a>
</div>
</div>
</body>
</html>


程式首頁的 HTML 很簡單,它的 body 只有兩個 div。jQuery 和 jQTouch 是在 HTML head 加上去的:

• jqtouch.css 是一個必要的檔案,在裡面定義了手機裝置的架構設計規則,也同時包含了動畫處理,還有手機方向模式的處理。
• theme.css 是 jQTouch 提供的 css 主題之一。
• jquery.js 是 jQuery Framework 主要的檔案。jQTouch 是基於在  jQuery,所以它的 Framework 同時也包含了 jQuery 的檔案。
• jqtouch.js 是 jQTouch Framework 主要的檔案。
• 參數 jQT 是 jQTouch 的 initialized object。在首頁的例子裡,兩個屬性被定義:icon 以及 statusBar。

除了這兩個屬性以外,jQTouch 還有提供更多的屬性讓使用者可以指定和客製化他們程式的行為 (behavior) 和顯示 (appereance)。在例子裡,icon 指定了程式的 Web Clip 圖,statusBar 指定了程式在全螢幕模式裡,螢幕上顯示的 status bar顏色。

jQTouch 是一個很方便和豐富的 framework,可以讓開發者很快的加在程式裡 native-looking 的動畫和感覺。就像 Dave Methvin 說的: “你用10行的 jQuery 完成以往要 20 行左右枯燥的 DOM JavaScript。在寫完那 20 行的時間你已經用兩三行的 jQuery 完成要完成的工作。這不可能在更快,除非程式能有讀心術。” jQTouch 的設計概念也是完全的遵守了這概念。