Blogs

jQTouch

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 的設計概念也是完全的遵守了這概念。

Gearman Distribute Computing Framework

簡介:
在如今網路發達的現代, 很多網路上面的服務有些是需要依賴電腦的計算能力, 而隨著計算量的增加, 有時候一台電腦是不夠的, 這時候我們就需要一個能夠幫助我們自動分配工作給其他電腦的方法。Gearman 提供了一個通用的框架讓我們能夠跟不同電腦或是不同的程序溝通, 他讓你可以把工作分散下去, 讓不同電腦同時幫你做運算, 也可以做到負載平衡, 對到分散式系統溝通的能力。對於一些網路服務, Gearman 提供簡單的解法來達到分散式運算的結果。

下面提供一些 Gearman 的特點:

  • 負載平衡
  • 提供 C, Perl, Python, PHP 等客戶端程式的 API
  • 目前並沒有廣播的功能
  • 自動分配工作
  • 可以利用 MySQL 等 DataBase 來儲存工作序列, 讓服務就算重新啟動, 資料也不會不見
    • blocking task invoke
    • non-blocking (concurrent multi-task), callback function when complete or fail!
  • worker
    • blocking task handle

在下面這張圖,你可以知道 Gearman 是如何運作的,你的應用程式會運用 Gearman 提供的 API 來發送新的任務給 Gearman Job Server,Job Server 會找到目前最為閒置的工作結點,並且把任務發送給他, 交給他去完成, 等到他完成就會把結果回傳回來。所有的溝通都是透過 Gearman 所提供的 API, 你不需要去處理任何網路通訊的事情。所有的溝通都可以是在不同機器上發生的。

Job Server fail over:
為了達到如果有 Job Server 無法繼續運作, 而不影響到服務, 我們可以跑起多個 Job Server, 並且讓Client 和 Work Node 都連過去,這樣如果有一台 Job Server 掛掉, 至少還有其他台 Job Server 存在,可以繼續提供服務, 而不至於影響到整個服務。

缺點:
目前沒有一套可以監控整個 Cluster 的工具, 還在開發中。

Reference:
http://gearman.org/
http://blog.flier.lu/2010/04/gearman-performance-tunning/

Tokyo Tyrant - part 1. (備份/還原)

 Tokyo Tyrant 是一個為底層資料庫 (Tokyo Cabinet) 所提供的高並發網路接口。

目前在許多網路相關的場景都可以看到它被廣泛地應用。

本文將簡介 Tokyo Tyrant 備份與還原的功能。


Backup (備份)


figure 1.

接下來的例子示範了如何備份一個 ttserver,與如何從先前備份的資料庫來還原 ttserver,如圖一所示。

 - 首先,啟動一個 ttserver
ttserver /tmp/ex1.tch

 - 開啟另外一個終端,並寫入一些資料
tcrmgr put localhost "foo" "bar"

 - 檢查資料是否寫入成功
tcrmgr get localhost "foo"

 - 備份資料庫
tcrmgr copy localhost /tmp/backup.tch

 - 接著模擬 ttserver crash,在第一個終端按下ctrl-c

 - 模擬資料庫檔案毀壞

rm /tmp/ex1.tch

 - 從備份資料庫檔案還原 ttserver,只需要拷貝資料庫檔案並重啟 ttserver
cp /tmp/backup.tch /tmp/ex1.tch
ttserver /tmp/ex1.tch

 - 檢查資料是否已還原
tcrmgr get localhost "foo"


定期地執行備份動作可以避免資料遺失(每天一次或數分鐘一次,取決於寫入操作有多頻繁)。但是我們仍然會失去介於上次備份與下次備份之間的所有修改操作。Tokyo Tyrant 也提供了另外的方法來還原這些修改操作。

Restore (還原)


figure 2.

接下來的例子示範了如何從 update log 來還原對資料庫的修改動作,如圖二所示。

 - 建立一個資料夾以存放 update log
mkdir /tmp/ulog

 - 啟動一個 ttserver 並開啟 update log 功能
ttserver -ulog /tmp/ulog /tmp/ex2.tch

 - 開啟另外一個終端,並寫入一些資料
tcrmgr put localhost "foo2" "bar2"

 - 檢查資料是否寫入成功
tcrmgr get localhost "foo2"

 - 接著模擬 ttserver crash,在第一個終端按下ctrl-c

 - 模擬資料庫檔案毀壞
rm /tmp/ex2.tch

 - 除了從備份資料庫檔案還原,我們還可以藉由重新執行紀錄在 update log 中的修改操作來還原資料庫

 - 如果需要的話,可以先將 update log 備份到別處
mv /tmp/ulog /tmp/ulog-back

 - 重新啟動 ttserver
ttserver /tmp/ex2.tch

 - 從 update log 還原
tcrmgr restore localhost /tmp/ulog-back

 - 檢查資料是否已還原
tcrmgr get localhost "foo2"

雲端上的遊戲 - OnLive

隨著 OnLive 遊戲點播服務的出現,玩電腦遊戲變得更便宜且容易。要玩到最新的遊戲,不再需要擁有一台配備了昂貴顯示卡及高速處理器的高階電腦。只要有一台能執行 Windows XP, Windows Vista 的普通 PC, 或是 Intel核心的 Mac OS X,再加上高速網路就很足夠。使用者甚至可以透過 OnLive 提供的 MicroConsole,直接在家中的電視上使用 OnLive 的服務。OnLive 提供購買、租賃遊戲,遊戲試玩,以及與 OnLive 上的其他玩家一同進行多人連線遊戲的服務。並還有線上觀看他人遊戲,錄影,分享影片,和查詢玩家基本資料等的社交功能。

基本上,玩家們只需要懂得如何使用瀏覽器便可以使用 OnLive。遊戲資料以及操作都是在遠端的伺服器上運算,再以瀏覽器作為介面呈現。一旦運算完數據,遊戲畫面便會透過視訊壓縮串流的方式送回瀏覽器,讓玩家們繼續進行遊戲。對於玩家們而言,即時遊玩的感覺並不會和在家中主機上玩遊戲有太大的差別。OnLive 省去了安裝、更新遊戲的擾人過程,並且節省了儲存遊戲資料的空間,不失為一個想方便玩遊戲的選擇。

OnLive 以結合多個獨立或是分享的伺服器來達到遠端即時遊玩的目的。所有遊戲資料都在這些伺服器上存取及運算,而這些伺服器每六個月便會進行一次升級以提供玩家們最佳的遊戲體驗。每個伺服器都有其專職的工作,例如處理使用者介面,執行遊戲,或是處理視訊串流等。而根據不同的運算需求,其也使用了不同等級的伺服器來提供服務。因此在玩遊戲的過程中,視遊戲階段的不同,玩家們所使用的伺服器也會相對的改變。

因為所有資料都是透過網路傳輸,OnLive 的服務是相當依賴及受限於玩家的連線頻寬的。OnLive 表示透過 5Mbps 的網路,是可以達到 1280X720高解析度每秒 60 幀的高品質影像的。然而,當網路速度下降時,玩家所得到的也就是相對較低的解析度及畫面更新率。當網路速度為 1.5Mbps 時,畫面是可以達到一般解析度的;但卻因為受限於視訊串流速度,而無法像在家中主機一般順暢的遊玩一些需及時反應的動作類遊戲。並且,由於畫面是壓縮過後的視訊影像,原先遊戲中的美術細節將無法清晰的呈現。

Node.JS

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 這框架已經被科技界注意到,在加上它的模組化系統,在網路上已經有許多第三方的模組可以使用,來加強這完整框架。