跳到主要內容

發表文章

目前顯示的是 一月, 2012的文章

Redis @ SmartOS

Redis也是一套NoSQL資料庫,使用key-value的方式來儲存string, hashes, lists, sets... 下面是官方介紹Redis的一段說明:
Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can containstringshasheslistssets and sorted sets.
一如往常,SmartOS上安裝Redis只有兩個步驟:
# pkgin search redis php5-redis-5.2.17.2.1.3  PHP extension for Redis php53-redis-5.3.6.2.1.3  PHP extension for Redis redis-2.2.14         Persistent key-value database with built-in net interface
=: package is installed and up-to-date <: package is installed but newer version is available >: installed package has a greater version than available package
# pkgin install redis-2.2.14 calculating dependencies... done.
nothing to upgrade. 1 packages to be installed: redis-2.2.14 (406K to download, 1316K to install)
proceed ? [y/N] y downloading packages... downloading redis-2.2.14.tgz:  203Kbps 100% error log can be found in /var/db/pkgin/err.log installing packages... installing redis-2.2.14... redis-2.2…

List file using Node

下面是簡單的讀資料匣檔案的動作,透過載入fs模組後,使用fs模組內的readdirSync來讀取目錄內容,然後透過console.log()將結果陣列呈現出來。

//file: 001-readdir.js /*載入fs模組*/
var fs = require('fs'); /*讀取 . (現在目錄)的內容*/ var files = fs.readdirSync('.'); /*列表,呈現於螢幕上*/ for ( i in files ) {
  console.log(files[i]);
}
延伸上例,下面這個範例主要在讀取指令列的第二個參數(註:第一個參數為Node.js檔案名稱)
//002-readdir.js 
var fs = require('fs');  /*預設使用執行時候目錄位置*/var dir = '.';  /*讀取第二個參數值,如沒有值,則使用預設位置*/ if ( process.argv[2] ) dir = process.argv[2];  var files = fs.readdirSync(dir);
for (i in files) {
  console.log(files[i]);
}

Node.js Simple Web Server

下面是個簡單的Node Web Server範例,語意上為載入http模組之後,使用http模組建立server,並在回應部份寫入header為'Content-Type':'text/plain'並回傳http code=200等的資訊。 而最後因為Node.js繼承JavaScript的語法慣例,因此最後可以直接由server物件呼叫設定聽取8124 port開啓http web服務。
var http =require('http');
http.createServer(function(req, res){
  res.writeHead(200,{'Content-Type'

Node.js多版本共存

想必在開發Node.js的過程中時常發現Node.js的版本又更新了吧...因為Node.js正值快速發展的階段,為了讓套件功能與使用方法可以更完整、更好用,因此...也不怪他拉 :P但是在維護您的程式碼時候,如何套用不同版本的Node SDK呢?首先解決安裝多個版本Node的問題吧... 如果您的Node是從Source Code build出來的,那您應該很熟悉這部份語法:

1. 重新configure您的source code, 並加上--prefix的參數指定您要安裝的位置(假設THE_NEW_VERSION_PATH是您要安裝Node的路徑): Linux/Mac: ./configure --prefix=$THE_NEW_VERSION_PATH Windows: ./configure --prefix=%THE_NEW_VERSION_PATH%
2. 設定您的環境變數(差別在於Windows用%%作為變數符號,而Linux使用$作為變數符號,且Windows的變數區隔字元為 ';' ,而Linux使用 ':' 作為區隔字元): Linux/Mac: export PATH=$THE_NEW_VERSION_PATH/bin:$PATH Windows: set PATH=%THE_NEW_VERSION_PATH%\bin;%PATH% 其中設定環境變數的部份,可以直接設定於系統的初始環境變數中(ex: $HOME/.bashrc, $HOME/.profile之類的檔案,Windows可設定於"環境變數設定"中設定),或是設定於專案的執行檔案中。

Node.js Socket Example

延伸上一篇Node.js的Socket Server介紹,下面是Ryna在Joyent Cloud上介紹的第二個範例,此範例建立一各Web服務與一各Socket服務,透過Socket服務的資料鍵入來顯示在Web Page上,透過簡單的幾個function將資料串流顯示於Web Server的頁面上,從這邊可以看到Node針對微型服務的功力阿!!
//Ryan Demo http = require('http'); net = require('net');
sockets = [];
tcpServer = net.createServer(function(socket){         sockets.push(socket);         socket.on('end', function(d){                 var i = sockets.indexOf(socket);                 sockets.splice(i,1);         }); });
tcpServer.listen(8001);
s = http.createServer(function(req, res){         var socket = sockets.shift();         if (socket) {                 socket.on('data', function(d){                         res.write(socket.remoteAddress + '>');                         res.write(d);                 });         } else {                 res.end('no sockets...');         } });
s.listen(8000);

Ryan's Demo

Node.js無疑是2010年度最佳的程式語言,非常用來適合建立微型服務(難怪他叫做Node),下面是Node.js原作者Ryan在Joyent Cloud上的Demo之一,透過Node的net模組建立一個socket服務,並將所有連入此socket之連入點所鍵入的訊息在每個連入的console中列印出來。



//Ryan's Demo
/*載入net模組*/
net = require('net');
/*建立people陣列,用於收容每個連入的socket*/
people = []
/*建立socket server並*/ s = net.createServer(function (socket) {
/*將連入的連線實體放置在people中*/      people.push(socket);
/*連線開啓後,將資料寫回每個socket的standard output*/      socket.on('data', function (data) {
        for (var i = 0; i < people.length; i++) {
            people[i].write(socket.remoteAddress + ">");
            people[i].write(data);
        }
    });

    /*socket結束時候之動作*/      socket.on('end', function () {
        var i = people.indexOf(socket);
        people.splice(i, 1);
    });
});
/*設定服務開啓在port 8000*/ s.listen(8000);

測試方式: 開啓兩個console並透過下面指令連線socket server: telnet localhost 8000隨意鍵入文字,預期可在非鍵入視窗的另一各console視窗之standard output看到對方傳來的文字

CouchDB基本操作

CouchDB為Apache專案,發展的部份相當健全,有用過JSON的人應該都知道JSON針對不同語言的實作上支援相當好,官方就提供許多語言的API版本,CouchDB也一樣有各種語言的API實作版本,因此開發者可以相當快速進入並熟悉操作,今天很高興有機會試用一下Apache CouchDB,找了一下網路上文獻,親手在MiCloud上建了一各環境來試試,建置的過程因為是在SmartOS上建立,過程非常簡單,就不贅述,其他環境的安裝與使用可以參考下面"相關參考資料"部份,都有非常詳細說明。 而關於SmartOS,安裝好後,相關檔案位置如下: DB安裝位置為:/opt/local/share/couchdb設定檔位置:/opt/local/etc/couchdb/default.ini預設admin web: http://COUCHDB_ADDR:5984/_utils/服務操作:啓動:svcadm enable couchdb關閉:svcadm disable couchdb重啓:svcadm restart couchdb
相關參考資訊: #Couch APIs http://wiki.apache.org/couchdb/Basics #Couch Rest API Documents http://wiki.apache.org/couchdb/HTTP_REST_API?action=show&redirect=HttpRestApi
基本操作: #在資料檔案($1)下面建立一筆資料(JSON檔案$2) curl http://COUCHDB_ADDR:5984/$1/ -d @$2 -H "Content-Type: application/json" curl http://COUCHDB_ADDR:5984/$1/ -d "{\"\name\":\"simonsu\"}" -H "Content-Type: application/json" ex:
$ curl -u "username" http://COUCHDB_ADDR:5984/sys_props/ -d "{\"name\":\&quo…

Nodefly

一個線上監控雲端伺服器服務的網站,透過簡單的指令安裝Agent後即可監控主機上的服務,目前監控看起來滿多樣化的∼ 下面是網站上的介紹:
https://www.nodefly.com/features NodeFly - Providing real-time monitoring across cloud instances Fast Set up - One line install so you can be monitoring in literally secondsUnified Dashboard - Visualize all your data in one locationSupporting multiple clouds + physical hardwareMonitor what is important to ensure applications stay up and runningGain real-time insight into capacity utilization and instantly see how changing usage affects performanceEnsure instances aren't over or underutilizedDig deep into you services layer to optimize your app performance Simplicity is the key. NodeFly has developed "active discovery" which will proactively find and setup monitors for all of your available services. We allow our users to gain detailed, real-time performance monitoring of cloud and application services so they can see everything that is happening, as it happens. From understanding system usage at every mo…

Riak server安裝

安裝Riak DB 原始碼安裝方式:自Basho下載Riak套件原始碼,然後解壓縮進行make,如果正確make之後,則會在資料匣內產生rel檔案匣,裡面會有riak資料匣,此為編譯後之位置所在。 curl -O http://downloads.basho.com/riak/riak-1.0.2/riak-1.0.2.tar.gz tar zxvf riak-1.0.2.tar.gz cd riak-1.0.2 make rel
啓動Riak服務:安裝好的riak可透過$RIAK_HOME/bin/riak來作啓動與關閉 riak start
檢視riak server狀態
riak ping >pong
連線進入riak console
riak console (ORriak attach)
測試安裝好的Riak:預設安裝好的 curl -v http://127.0.0.1:8098/riak/test

Python ASCII encode error

折騰許久的SmartMachine上的預設字碼問題終於在這各寧靜的夜裡得到解決...

之前在處理平台上中文字時候,可以正常顯示在standard output 但是在將standard output導向檔案時候卻一直顯示UnicodeEncodeError
# python tt.py > /tmp/test.txt Traceback (most recent call last):   File "tt.py", line 84, in <module>     jsonobj['email_address'],""\ UnicodeEncodeError: 'ascii' codec can't encode characters in position 221-226: ordinal not in range(128)
同時我也試過另開新檔案儲存的方式 fout = open('/tmp/insert.sql','w') fout.write(.....) 但是得到同樣的結果
原來平台上的預設編碼影響還真大.... 最後解法為: str.encode('utf8') 透過encode('utf8')之後 不論用print再導到file 或是fout.write都可正常執行

Rate Shaping

最近遇到一個網路專有名詞:Rate Shaping,查找了一下網路,發現滿有趣的,跟大家分享。(以下節錄自原文章:http://www.ezfiber.com.tw/resources/resources01.htm)
頻寬管理機制,共有 TCP Rate Shaping 、 Class-based Queuing 、 Fail Allocation of Bandwidth 及 Packet-size Optimization 等四種;完整的架構出最佳化的頻寬控管功能: 
A. TCP Rate Shaping :  TCP Rate Shaping 為一專為 TCP/IP 交通設計的管理法則,它會告知資料傳送者適時的減少資料傳輸量,來使得 TCP 資料流 (TCP Flow) 傳送更加平順,以便達到將 TCP 交通的瞬間巨量 (Burst) 情形降至最低。這些突如其來的巨量交通會造成路由器的交通阻塞,嚴重影響到一些無法接受傳輸延遲的網路應用 (Latency-Sensitive Application) 。 
然而, TCP Rate Shaping 只是很粗略的控制傳輸的訊框大小 (Window Size) ,對於低速的專線並無法有效的達到準確的頻寬管理。同時,一般所謂重要的應用 (Mission-Critical Application) 的封包均是相當短而快的傳輸連結, TCP Rate Shaping 無法對其有所幫助。此外, TCP Rate Shaping 只能控制 TCP 的交通,對於 Non-TCP 的交通則無法管理;而根據統計,網路上的交通約有 48% 為 TCP 的交通,約有 52% 為 Non-TCP 的交通。 
B. Class-based Queuing (CBQ)  Class-based Queuing(CBQ) 乃依據不同的 Class 等級提供不同的 Traffic Queuing ,它可補足 TCP Rate Shaping 只能管理 TCP 交通的問題,支援 TCP 及 Non-TCP 的交通管理,並且能管控到網路交通的封包階層 (Packet Level) ,故能更有效的控制低速頻寬的傳輸。 
C. Fail Allocation of Bandwidth  CBQ 雖能補強 TCP Rate Shaping 之不足,然而仍有其問題所在…

分享你的文章

幾個相當不錯的文件分享網站,下面文章來自:http://blog.soft.idv.tw/?p=25Scribd網址:http://www.scribd.com/
特點:這是筆者最喜歡用的分享系統,使用了Adobe的Flash Paper技術,可以上傳多種類型的文件檔案(.pdf, .doc, .ppt, .xls, .txt, .odt, .odp 等),直接轉換成Flash檔案,可以線上觀看。
Scribd有個特異功能,就是可以將上傳的文件直接「念」出來,還可以轉成mp3檔案供下載!
除了下載成mp3,還可以轉成pdf,word,txt等格式,只需上傳一次,轉檔全自動完成,真是方便啊∼∼ 此外還可以把文件嵌入到網頁中直接觀看喔∼
ps: 礙於中文字型的關係,上傳的中文文件文字會變成黑體字,整個頁面的編排可能會跟原先頁面不同(我猜是字型寬度的緣故),但中文顯示還算正常。
Slideshare網址:http://www.slideshare.net/
特點:Slideshare這個網站主要以分享投影片為主,可轉換文件成一頁一頁的flash投影片(一次看一頁,scribd則是可以連續捲頁),下載檔案也是ppt(PowerPoint)格式,中文字的處理也不是很完善,如果想在網頁上分享美美的圖片簡報檔案,還算是不錯的選擇。
上傳格式支援:ppt, odf(OpenOffice) & pdf (單一檔案上限 30MB)
Thinkfree網址:http://www.thinkfreedocs.com/
特點:Thinkfree 是個有名的線上文件編輯網站,以java技術做出媲美MS Office的線上Office系統。thinkfree Docs 目前還在beta階段,上傳/轉檔/下載的速度差強人意,想嚐鮮的看官可以玩玩看。(powerpoint格式有支援大綱功能喔,可以直接由旁邊的大綱視窗選頁)
支援上傳的檔案格式有:  .doc, .ppt, .xls, .pdf, .rtf, .dot, .pot, .pps, .xlt, .csv, .txt, .hwp