跳到主要內容

發表文章

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

Node.js package : forever

forever為一套node.js維運套件 透過監控程式健康狀態來管理node.js程式,並在異常關閉時候重新啓動您的程式,這樣就不用怕程式因為沒有handle的exception導致異常關閉時候不能提供服務拉!
forever的安裝與使用相當簡單:
1.首先,安裝forever套件(當然,您需要先有node.js與npm套件拉!),其中-g很重要,因為您必須要安裝到系統目錄,才能夠支援在任何環境下啟動forever程式 # npm install forever -g
2.使用forever管理您的node.js程式: (這邊假設我們建立了一個express專案,app.js的路徑是/tmp/TestPrj/app.js) 啟動您的node.js程式:forever start [node.js application path] # forever start /tmp/TestPrj/app.js  info:   Forever processing file: /tmp/TestPrj/app.js
檢視已啓動的forever程式(就是您使用forever啓動的node.js程式):forever list # forever list info:   Forever processes running data:       uid  command script              forever pid   logfile                          uptime         data:   [0] P0Fa node    /tmp/TestPrj/app.js 50062   50079 /Users/simonsu/.forever/P0Fa.log 0:1:49:10.335 
關閉已啓動的Node程式:forever stop [forever process id] # forever stop 0 info:   Forever stopped process: data:       uid  command script              forever pid   logfile                          uptime        [0] P0Fa node    /tmp/TestPr…

JavaScript: use strict

在Perl與JavaScript甚至Node.js中有發現use strict的存在...引用網友的說明:
use strict是ECMA-262 Edition 5定義的新語法,表示要用嚴格的Javascript語法來執行,有一些過去慣用的寫法就會出錯,例如使用變數前沒有用var宣告。
use strict主要是影響他所在的scope,如果在函數中使用,並不會讓global scope以及其他未使用的函數變成use strict。
給大家參考∼

Express Error: connect.cookieParser("secret") required for security when using sessions

注意到了嗎?最近expressjs升版了,目前版本是Express 3.0.0 Alpha1
# npm list express
npm WARN ls doesn't take positional args. Try the 'search' command
/root
├── ejs@0.7.1 
├─┬ express@3.0.0alpha1 
│ ├── commander@0.5.2 
│ ├─┬ connect@2.1.2 
│ │ ├── crc@0.1.0 
....
  │ └── semver@1.0.13 
  ├── sprintf@0.1.1 
  └─┬ ssh-agent@0.1.0 
    └── ctype@0.5.0 
但是使用了新的版本,執行上卻出現不明的Exception... 仔細檢查與舊版本間的差異...發現2.x跟3.x的版本有不少地方不一樣 直覺下做了幾個測試:
1. 2.x執行3.x所產生程式碼....無法執行,3.x的一些宣告2.x不認得,應該是function有做過修改... # node app.js 
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: object is not a function
    at Object.CALL_NON_FUNCTION (native)
    at Object.<anonymous> (/root/TestPrj2/app.js:10:11)
    at Module._compile (module.js:441:26)
    at Object..js (module.js:459:10)
    at Module.load (module.js:348:31)
    at Function._load (module.js:308:12)
    at Array.0 (module.js:479:10)
    at EventEmitter._tickCallback (node.js:192:40) 2. 3.x執行2.x所產生程式碼....無法執行…
引用Cisco說明Bandwidth與Throughput的影片,供大家參詳這兩個字!

Auto install Node.js in SmartOS

許多時候,在IaaS上面生一臺機器,部署一臺機器 裝到最後都懶了... 以Node.js安裝在Joyent SmartOS上為例 下面是一個自動安裝並設定環境變數的script
透過自動安裝的腳本 您就可以....執行,然後去睡覺拉:D
# cat prepareNode.sh 
#!/bin/bash
echo "Prepare the compile environment..."
pkgin search gmake | grep gmake | awk '{print $1}' > /tmp/node.install
pkgin search gcc | grep gcc | awk '{print $1}' >> /tmp/node.install
pkgin search python | grep python27 | awk '{print $1}' >> /tmp/node.install
for name in `cat /tmp/node.install` 
do
        echo 'Installing ' $name
        pkgin -y install $name
done
echo "Download Node source..."
wget http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz
tar -xzf node-v0.6.14.tar.gz
cd node-v0.6.14
./configure --prefix=$HOME/node
make && make install
echo "export PATH=$HOME/node/bin:$PATH" >> ~/.bashrc
echo "Done!!"
附註:上面是以SmartOSPlus 64為安裝實例,該SmartMachine上安裝Node.js基本上缺少gmake, gcc++, python等套件,不同的SmartMachine版本可能會因預載套件不同而異,當然node.js的版本也會因時間改變的!





Node.js mail module

之前介紹過node.js的一個mail module
但是當嘗試寄送html base的信件時候 發現支援有些問題....冏
這邊介紹另一個好用的套件nodemailer
安裝:npm install nodemailer
這邊直接將nodemailer包裝一下,使用者可以稍加修改後給專案使用 自製module: (file: sendMyMail.js) var nodemailer = require("nodemailer");
var smtpTransport = nodemailer.createTransport("SMTP",{
        service: "Gmail",
        auth: {
            user: "my_mail@gmail.com",
            pass: "**password**"
        }
});
var mailOptions = {
      from: "MyMail <my_mail@gmail.com>", // sender address
      to: "receiver@mycompany.com", // list of receivers
      subject: "Hello", // Subject line
      text: "Hello world ", // plaintext body
      html: "<h1>MAIL...</h1><br/><b>Hello world </b>" // html body
}
exports.sendNodeMail = function(receivers, subject, msg) {
  mailOptions.to = receivers;
  mailOptions.subject = subject;
  mailOptions.html = msg;
  smtpTransport.s…

Node.js connect MySQL example

Node.js中連線MySQL相當方便(相信連線其他資料庫也差不多吧!)這邊以三個步驟介紹撰寫MySQL撈資料的standalone程式 步驟如下:
步驟1. node mysql package npm install mysql
步驟2. db configure $ vi mysql-config.js
var db_options = {
    host: 'your.database.address',
    port: your_database_port,
    user: 'access_database_name',
    password: 'access_database_password',
    database: 'database_that_will_be_use'
};
var mysql = new require('mysql'), db = null;
if(mysql.createClient) {
    db = mysql.createClient(db_options);
} else {
    db = new mysql.Client(db_options);
    db.connect(function(err) {
        if(err) {
            console.error('connect db ' + db.host + ' error: ' + err);
            process.exit();
        }
    });
}
exports.db = db;

步驟3. simple query $ vi mysql-example.js var config = require('./mysql-config')
  , db = config.db;
exports.doit = function() {
//Query  db.query('SELECT * FROM SOME_TABLE', function(err, rows, fiels) {
  if(err) return next(err);
  consol…

AWS first node.js express project

本篇重點不是在於使用express或是node.js建立web server... 而是在建立了express project之後,server也起來了...但是卻連不上線的問題...
[ec2-user@ip-10-166-202-213 ~]$ npm install express ejs mail mysql npm http GET https://registry.npmjs.org/express npm http GET https://registry.npmjs.org/ejs npm http GET https://registry.npmjs.org/mail ...(Skip)
[ec2-user@ip-10-166-202-213 ~]$ express TestPrj
   create : TestPrj    create : TestPrj/package.json    create : TestPrj/app.js    create : TestPrj/public    create : TestPrj/public/javascripts    create : TestPrj/public/images    create : TestPrj/public/stylesheets    create : TestPrj/public/stylesheets/style.css    create : TestPrj/routes    create : TestPrj/routes/index.js    create : TestPrj/views    create : TestPrj/views/layout.jade    create : TestPrj/views/index.jade
   dont forget to install dependencies:    $ cd TestPrj && npm install
[ec2-user@ip-10-166-202-213 ~]$ cd TestPrj/ [ec2-user@ip-10-166-202-213 TestPrj]$ npm install npm http GET https://registry.npmjs.org/express/2.5.8 npm http …

簡單的CPU Benchmark

一個透算圓周率的Benchmark方式,簡單又方便 參考考站:http://www.linuxidc.com/Linux/2009-06/20495.htm 調用一些該網站的說明...
time是计时程序。scale是精度,4*a(1)调用了反正切函数。由三角函数我们知道1的反正切是pi/4, pi=4* pi/4。 -l -q参数的意思请参照manpage。这一行其实就是让bc计算1的反正切,计算精度是5000位。 下面是來自Mac一代AIR的結果: $ time echo "scale=5000; 4*a(1)" | bc -l -q 3.141592653589793238462643383279502884197169399375105820974944592307\ 8164062862089986280348253421...(skip)...3081770367515906735023507283540567040386\ 74351362222477158915049530984448933309634087807693259939780541934144\ 73774418426312986080998886874132604720
real1m11.582s user1m4.084s sys0m0.404s

Install Node.js in AWS m1 server

如果有人看上AWS m1 instance上的免費750小時服務,又想要玩Node.js的 下面是安裝步驟,給大家參考: 下載node原始碼,並解壓縮安裝Compile必要套件:安裝gcc++安裝openssl-dev安裝make編譯node.js原始碼(我喜歡編譯到$HOME/node目錄,再到~/.bash_rc增加PATH設定即可) 以下是執行過程(紅色部分是指令,藍色部分是我選擇的套件): [ec2-user@ip-10-166-202-213 ~]$ wget http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz --2012-04-06 14:49:49--  http://nodejs.org/dist/v0.6.14/node-v0.6.14.tar.gz 正在查找主機 nodejs.org... 8.12.44.238 正在連接 nodejs.org|8.12.44.238|:80... 連上了。 已送出 HTTP 要求,正在等候回應... 200 OK 長度: 10742747 (10M) [application/octet-stream] Saving to: `node-v0.6.14.tar.gz'
100%[======================================================================================>] 10,742,747  28.9M/s   in 0.4s    
2012-04-06 14:49:50 (28.9 MB/s) - `node-v0.6.14.tar.gz' saved [10742747/10742747]
[ec2-user@ip-10-166-202-213 ~]$ tar -xzf node-v0.6.14.tar.gz  [ec2-user@ip-10-166-202-213 ~]$ cd node-v0.6.14
[ec2-user@ip-10-166-202-213 node-v0.6.14]$ yum search gcc Loaded plugins: fastestmirror, priorities, security, update-motd Determining f…

Javascript同名函式

Javascript有別於一般物件導向程式語言的一個特色包含Javascript在同名函式的部分處理不同,物件導向語言中可以使用同名函式,並且以參數之型態與數量來判別真正要使用的函式,但Javascript則不然...「The arguments array- the secret to robust functions」中有針對Javascript的函式名稱定義做一些說明,因為Javascript函數的參數傳遞採用陣列方式(arguments array),傳入參數的個數可用arguments.length取得,而同名的函式反而在呼叫上有會出乎意料...
/* file: 000-duplicateFun.js */ function foo(x) {     console.log('Now call X!! x=' + x);
} function foo(x,y) {     console.log('Now call XY!! x=' + x);
} foo('a');
執行結果: $ node 000-duplicateFun.js  Now call XY!! x=a
發現了嗎,foo(x)函式被忽略了!

Ssh初次連線忽略know_hosts詢問

連線新的SSH Client時會因為~/.ssh/know_hosts中無key存在,而會詢問 $ ssh root@my.ip_address
The authenticity of host 'my.ip_address (my.ip_address)' can't be established.
RSA key fingerprint is 2f:64:60:3b:01:54:31:d7:68:f1:ca:50:ee:2a:5c:43.
Are you sure you want to continue connecting (yes/no)? 這時沒有回答yes還真的不給你連線...@@
這在需要自動延展新的server時候,如果遇到這樣的問題...就麻煩拉!
下面有兩個可以避開know_hosts的詢問: 1.連線時候加上參數“-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no” ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no username@ip_adreess
2.修改/etc/ssh/ssh_config檔案,打開StrictHostKeyChecking,並設定為no # Host * #   ForwardAgent no #   ForwardX11 no #   PubkeyAuthentication yes #   PasswordAuthentication yes #   FallBackToRsh no #   UseRsh no #   BatchMode no #   CheckHostIP yes StrictHostKeyChecking no #   EscapeChar ~