<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_让生活Web个够</title><subtitle type="text">今天你Web了吗？</subtitle><id>http://feed.cnblogs.com/blog/u/22105/rss</id><updated>2012-02-03T14:00:56Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22105/rss"/><entry><id>http://www.cnblogs.com/fengmk2/archive/2012/01/01/2309261.html</id><title type="text">Defense hash algorithm collision 防御hash算法冲突导致拒绝服务器</title><summary type="text">问题 一篇#2011-003 multiple implementations denial-of-service via hash algorithm collision 文章，引起了 Web 应用安全领域的骚动。 这种hash算法冲突的原理到底是什么？可以看看一下两篇以PHP为例子的说明文章： PHP数组的Hash冲突实例 , Supercolliding a PHP array
关于...</summary><published>2011-12-31T16:49:00Z</published><updated>2011-12-31T16:49:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2012/01/01/2309261.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2012/01/01/2309261.html"/><content type="html">&lt;p&gt;&lt;strong&gt;问题&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;一篇&lt;a href="http://www.ocert.org/advisories/ocert-2011-003.html"&gt;#2011-003 multiple implementations denial-of-service via hash algorithm collision&lt;/a&gt; 文章，引起了 Web 应用安全领域的骚动。&lt;/p&gt;

&lt;p&gt;这种hash算法冲突的原理到底是什么？可以看看一下两篇以PHP为例子的说明文章：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.laruence.com/2011/12/30/2435.html"&gt;PHP数组的Hash冲突实例 &lt;/a&gt;, &lt;a href="http://nikic.github.com/2011/12/28/Supercolliding-a-PHP-array.html"&gt;Supercolliding a PHP array&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.xingdonghai.cn/a-new-supercolliding-with-array-of-php"&gt;关于最近PHP的Array爆出的冲突问题&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;既然是语言层面的hash算法冲突导致的，那么这种冲突就无法避免了。&lt;br /&gt;但是我们可以限制Hash key的数量来避免。&lt;/p&gt;

&lt;p&gt;所以可以进行一下设置解决此问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;限制请求大小 (只能指标不治本，因为PHP版本的话，700KB的数据就足以发起攻击)&lt;/li&gt;
&lt;li&gt;限制请求key的数量 (这可以基本解决问题，除非应用无法预知最大的key数量)&lt;/li&gt;
&lt;li&gt;只接受允许的key (这是终极方法，但需要保证开发记得配置新增的key)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;在Nodejs防御此问题&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strike&gt;虽然在目前为止还没看到对Nodejs造成攻击的具体方法，但是还是以防范于未然为原则，需要对此问题做好充分的防御措施。&lt;/strike&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodejs 的攻击方法已经出现&lt;/strong&gt;，具体测试结果可以查看 &lt;a href="http://fengmk2.github.com/mk2blog/blog/2011/hac-in-nodejs-results.html"&gt;Hash algorithm collision in Nodejs&lt;/a&gt;&lt;br /&gt;&lt;img src="http://ww1.sinaimg.cn/large/6cfc7910jw1doryp1riixj.jpg" alt="hac-results" title="" /&gt;&lt;/p&gt;

&lt;p&gt;由于我个人一直使用的是 &lt;a href="https://github.com/senchalabs/connect"&gt;connect&lt;/a&gt; ，所以我以 connect 为示例说明吧 ^_^&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;使用 connect.limit 限制 request-body-size&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/senchalabs/connect/issues/446"&gt;Issue #446&lt;/a&gt; 已有同学提出此问题了，@TJ回复如下:&lt;/p&gt;

&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;
  &lt;p&gt;we have limit() for this, which works for any request body. Even without this specific issue you could exhaust resources reasonably easily without some form of limiting&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;好吧，直接上 &lt;a href="https://github.com/senchalabs/connect/blob/master/lib/middleware/limit.js#L8"&gt;connect.limit&lt;/a&gt; 模块解决&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;connect()
  .use(connect.limit('1mb'))
  .use(handleRequest)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;修改 &lt;a href="https://github.com/visionmedia/node-querystring"&gt;qs&lt;/a&gt; 模块，让其支持 keys-limit 和 allow-keys&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/fengmk2/node-querystring/blob/master/lib/querystring.js#L106"&gt;querystring.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: 提了pull request，但是估计在没有真实攻击示例放出来之前，是不会被接受的。&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/**
 * Parse the given str.
 */

function parseString(str, options) {
  var limit = options &amp;&amp; options.limit;
  var keys = options &amp;&amp; options.keys;
  if (keys &amp;&amp; Array.isArray(keys)) {
    keys = {};
    for (var i = 0, l = options.keys.length; i &lt; l; i++) {
      keys[options.keys[i]] = 1;
    }
  }
  return String(str)
    .split('&amp;', limit)
    .reduce(function(ret, pair){
      try{
        pair = decodeURIComponent(pair.replace(/\+/g, ' '));
      } catch(e) {
        // ignore
      }

      var eql = pair.indexOf('=')
        , brace = lastBraceInKey(pair)
        , key = pair.substr(0, brace || eql);
      if (keys &amp;&amp; !keys[key]) {
        return ret;
      }
      var val = pair.substr(brace || eql, pair.length)
      val = val.substr(val.indexOf('=') + 1, val.length);

      // ?foo
      if ('' == key) key = pair, val = '';

      return merge(ret, key, val);
    }, { base: {} }).base;
}


/**
 * Parse the given query `str` or `obj`, returning an object.
 *
 * Options: (only effect on parse string)
 *
 *  - `limit` parse string split limit.
 *  - `keys`  which keys need to be parse.
 *
 * @param {String} str | {Object} obj
 * @param {Object} options
 * @return {Object}
 * @api public
 */

exports.parse = function(str, options) {
  if (null == str || '' == str) return {};
  return 'object' == typeof str
    ? parseObject(str)
    : parseString(str, options);
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;还需要让 &lt;a href="https://github.com/fengmk2/connect/blob/master/lib/middleware/query.js#L38"&gt;connect.query&lt;/a&gt; 模块 传递options参数给 &lt;code&gt;qs.parse()&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module.exports = function query(options){
  return function query(req, res, next){
    req.query = ~req.url.indexOf('?')
      ? qs.parse(parse(req.url).query, options)
      : {};
    next();
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;同样 &lt;a href="https://github.com/fengmk2/connect/blob/master/lib/middleware/urlencoded.js#L47"&gt;connect.urlencoded&lt;/a&gt; 模块也需要将options参数传递给 &lt;code&gt;qs.parse()&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    req.on('end', function(){
      try {
        req.body = buf.length
          ? qs.parse(buf, options)
          : {};
        next();
      } catch (err){
        next(err);
      }
    });
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;全部组合起来&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var qsOptions = { limit: 100 };
connect()
  .use(connect.limit('1mb'))
  .use(connect.query(qsOptions))
  .use(connect.bodyParser(qsOptions))
  .use(handleRequest)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;防范 http header 攻击&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;请求的 &lt;code&gt;http header&lt;/code&gt; 也会导致hash冲突，在&lt;code&gt;V8&lt;/code&gt;层面未修复hash算法之前，可以通过简单的 &lt;code&gt;http_patch.js&lt;/code&gt; 修复此问题:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var http = require('http');

var IncomingMessage = http.IncomingMessage;
var _addHeaderLine = IncomingMessage.prototype._addHeaderLine;

// limit http header number
IncomingMessage.prototype._addHeaderLine = function(field, val) {
  if (!this.__headerCount__) {
    this.__headerCount__ = 0;
  } else if (this.__headerCount__ &gt;= 100) {
    return;
  }
  _addHeaderLine.apply(this, arguments);
  this.__headerCount__++;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;最后&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;2011年末，苦逼的程序员还在为这个安全漏洞写补丁，打补丁，想各种解决方法。&lt;br /&gt;2012年或许还会有各种各样的问题，我们一起勇敢面对吧。&lt;br /&gt;Happy New Year!&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2309261.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2012/01/01/2309261.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/12/14/2288147.html</id><title type="text">fibonacci(40) benchmark</title><summary type="text">Node.js is Cancer show a wrong way to use nodejs.But the test code Fibonacci is so funny.I implement the fibonacci function in other Dynamic Languages for comparison testing. Languages Dynamic nod...</summary><published>2011-12-14T14:21:00Z</published><updated>2011-12-14T14:21:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/12/14/2288147.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/12/14/2288147.html"/><content type="html">&lt;p&gt;&lt;a href="http://teddziuba.com/2011/10/node-js-is-cancer.html"&gt;Node.js is Cancer&lt;/a&gt; show a wrong way to use nodejs.&lt;br /&gt;But the test code &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Fibonacci"&gt;Fibonacci&lt;/a&gt;&lt;/strong&gt; is so funny.&lt;br /&gt;I implement the &lt;strong&gt;fibonacci function&lt;/strong&gt; in other &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Dynamic_programming_language"&gt;Dynamic Languages&lt;/a&gt;&lt;/strong&gt; for comparison testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Languages&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodejs.org"&gt;nodejs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kkaefer.github.com/node-cpp-modules"&gt;nodejs + cpp module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://python.org"&gt;python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pypy.org/"&gt;pypy&lt;/a&gt;: a fast, compliant alternative implementation of the Python language (2.7.1). &lt;/li&gt;
&lt;li&gt;&lt;a href="http://perl.org"&gt;perl&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.php.net/"&gt;php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-lang.org/"&gt;ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.lua.org/"&gt;lua&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://luajit.org/"&gt;luajit&lt;/a&gt;: a Just-In-Time Compiler for Lua.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Static&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://golang.org/"&gt;go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to help add more dynamic languagues, please leave the &lt;strong&gt;implement code&lt;/strong&gt; in comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(^_^) c &gt; go &gt; luajit &gt; nodejs &gt; pypy &gt; lua &gt; python &gt; php &gt; perl &gt; ruby1.9.3 &gt; ruby1.8.5 (T_T)&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;Language&lt;/th&gt;&lt;th&gt;Times&lt;/th&gt;&lt;th&gt;Position&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;c&lt;/td&gt;&lt;td&gt;0m1.606s&lt;/td&gt;&lt;td&gt;#0&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;go&lt;/td&gt;&lt;td&gt;0m1.769s&lt;/td&gt;&lt;td&gt;#1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;node + cpp module&lt;/td&gt;&lt;td&gt;0m2.216s&lt;/td&gt;&lt;td&gt;#2&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;luajit&lt;/td&gt;&lt;td&gt;0m2.583s&lt;/td&gt;&lt;td&gt;#3&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;nodejs&lt;/td&gt;&lt;td&gt;0m5.124s&lt;/td&gt;&lt;td&gt;#4&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: green;"&gt;pypy&lt;/td&gt;&lt;td&gt;0m7.562s&lt;/td&gt;&lt;td&gt;#5&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;lua&lt;/td&gt;&lt;td&gt;0m34.492s&lt;/td&gt;&lt;td&gt;#6&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;python&lt;/td&gt;&lt;td&gt;1m11.647s&lt;/td&gt;&lt;td&gt;#7&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;php&lt;/td&gt;&lt;td&gt;1m28.198s&lt;/td&gt;&lt;td&gt;#8&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;perl&lt;/td&gt;&lt;td&gt;2m34.658s&lt;/td&gt;&lt;td&gt;#9&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: red;"&gt;ruby 1.9.3&lt;/td&gt;&lt;td&gt;4m40.790s&lt;/td&gt;&lt;td&gt;#10&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td style="color: red;"&gt;ruby 1.8.5&lt;/td&gt;&lt;td&gt;4m41.942s&lt;/td&gt;&lt;td&gt;#11&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;lua&lt;/strong&gt; use &lt;em&gt;local function&lt;/em&gt; will get better performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Codes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodejs&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function fibonacci(n) {
  if (n &lt; 2) {
    return 1;
  }
  return fibonacci(n - 2) + fibonacci(n - 1);
}

console.log(fibonacci(40));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time node fibonacci.js
165580141

real  0m5.153s
user  0m5.124s
sys 0m0.012s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;nodejs + cpp module&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;cppfibonacci.cpp&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &lt;node/v8.h&gt;
#include &lt;node/node.h&gt;

using namespace v8;

int fibonacci(int n) {
  if (n &lt; 2) {
    return 1;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

Handle&lt;Value&gt; Fibonacci(const Arguments&amp; args) {
    HandleScope scope;

    if (args.Length() &lt; 1) {
        return ThrowException(Exception::TypeError(
            String::New("First argument must be a number")));
    }
    Local&lt;Integer&gt; integer = args[0]-&gt;ToInteger();
    int r = fibonacci(integer-&gt;Value());

    return scope.Close(Integer::New(r));
}

void RegisterModule(v8::Handle&lt;v8::Object&gt; target) {
    // Add properties to target
    NODE_SET_METHOD(target, "fibonacci", Fibonacci);
}

// Register the module with node.
NODE_MODULE(cppfibonacci, RegisterModule);
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;wscript&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python

def set_options(ctx):
  ctx.tool_options('compiler_cxx')

def configure(ctx):
  ctx.check_tool('compiler_cxx')
  ctx.check_tool('node_addon')

def build(ctx):
  t = ctx.new_task_gen('cxx', 'shlib', 'node_addon')

  t.source = ['cppfibonacci.cpp']

  # Must be same as first parameter in NODE_MODULE.
  t.target = 'cppfibonacci'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;cppfibonacci.js&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var fibonacci = require('./build/default/cppfibonacci').fibonacci;
console.log(fibonacci(40));
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ node-waf configure
$ node-waf build
$ time node cppfibonacci.js
165580141

real  0m2.224s
user  0m2.216s
sys 0m0.008s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;python2.4.3 &amp;&amp; python2.6.7 &amp;&amp; pypy1.7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fibonacci(n):
    if n &lt; 2:
        return 1
    return fibonacci(n - 2) + fibonacci(n - 1)

print fibonacci(40)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time python2.4.3 fibonacci.py
165580141

real  1m11.667s
user  1m11.647s
sys 0m0.002s

$ time python2.6.7 fibonacci.py
165580141

real  1m9.837s
user  1m9.792s
sys 0m0.006s

$ time ./pypy-1.7/bin/pypy fibonacci.py
165580141

real  0m7.608s
user  0m7.562s
sys 0m0.031s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;perl&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sub fibonacci {
    my $n = shift;
    if ($n &lt; 2) {
      return 1;
    }
    return fibonacci($n - 2) + fibonacci($n - 1);
}

print fibonacci(40), "\n";
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time perl fibonacci.pl
165580141

real  2m34.777s
user  2m34.658s
sys 0m0.004s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;?php

function fibonacci($n) {
  if ($n &lt; 2) {
    return 1;
  }
  return fibonacci($n - 2) + fibonacci($n - 1);
}

echo fibonacci(40)."\n";

?&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time php fibonacci.php

165580141
real  1m28.364s
user  1m28.198s
sys 0m0.039s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;ruby1.8.5 &amp;&amp; ruby1.9.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def fibonacci(n)
  if n &lt; 2
    return 1
  end
  return fibonacci(n - 2) + fibonacci(n - 1)
end

puts fibonacci(40)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time ruby1.8.5 fibonacci.rb
165580141

real  5m43.132s
user  4m41.942s
sys 1m0.653s

$ time ruby1.9.3 fibonacci.rb
165580141

real  5m41.714s
user  4m40.790s
sys 1m0.661s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;lua &amp;&amp; luajit&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function fibonacci(n)
  if n &lt; 2 then
    return 1
  end
  return fibonacci(n - 2) + fibonacci(n - 1)
end

io.write(fibonacci(40), "\n")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ time ./lua-5.1.4/src/lua fibonacci.lua 
165580141

real  0m34.514s
user  0m34.492s
sys 0m0.004s

$ time ./LuaJIT-2.0.0-beta9/src/luajit fibonacci.lua 
165580141

real  0m2.598s
user  0m2.583s
sys 0m0.001s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;local function should be faster:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;local function fibonacci(n)
  if n &lt; 2 then
    return 1
  end
  return fibonacci(n - 2) + fibonacci(n - 1)
end

io.write(fibonacci(40), "\n")

$ time ./lua-5.1.4/src/lua fibonacci.lua.local
165580141

real  0m31.737s
user  0m31.549s
sys 0m0.001s

$ time ./LuaJIT-2.0.0-beta9/src/luajit fibonacci.lua.local
165580141

real  0m2.227s
user  0m2.225s
sys 0m0.001s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &lt;stdio.h&gt;

int fibonacci(n) {
  if (n &lt; 2) {
    return 1;
  }
  return fibonacci(n - 2) + fibonacci(n - 1);
}

int main() {
  printf("%d\n", fibonacci(40));
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gcc fibonacci.c
$ time ./a.out 
165580141

real  0m3.434s
user  0m3.427s
sys 0m0.000s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Compilation with optimization:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gcc -O2 fibonacci.c
$ time ./a.out 
165580141

real  0m1.607s
user  0m1.606s
sys 0m0.001s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://cnodejs.org/blog/?p=4982#comment-1875"&gt;@fool&lt;/a&gt;: How about C++ meta programming, it’s a bit of cheating&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#include &lt;stdio.h&gt;

template&lt;int n&gt;
struct fibonacci {
    enum { Result = fibonacci&lt;n-2&gt;::Result + fibonacci&lt;n-1&gt;::Result };
};

template&lt;&gt;
struct fibonacci&lt;1&gt; {
    enum { Result = 1 };
};

template&lt;&gt;
struct fibonacci&lt;0&gt; {
    enum { Result = 1 };
};

int main(int argc, char *argv[])
{
    printf("%d\n", fibonacci&lt;40&gt;::Result);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ g++ fibonacci.template.cpp 
$ time ./a.out
165580141

real  0m0.002s
user  0m0.001s
sys 0m0.001s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;go&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;package main

import "fmt"

func fibonacci(n int) int{
  if (n &lt; 2) {
    return 1
  }
  return fibonacci(n - 2) + fibonacci(n - 1)
}

func main() {
  fmt.Println(fibonacci(10))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;run&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ 6g fibonacci.go
$ 6l fibonacci.6
$ time ./6.out
165580141

real  0m1.770s
user  0m1.769s
sys 0m0.001s
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;nodejs&lt;/strong&gt; is very &lt;strong&gt;FAST&lt;/strong&gt;. &lt;br /&gt;&lt;strong&gt;luajit&lt;/strong&gt; 2X faster than nodejs, &lt;strong&gt;Shocking&lt;/strong&gt;.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2288147.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/12/14/2288147.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/23/2259679.html</id><title type="text">[nodejs]保证你的程序死了还能复活：forever and forever webui</title><summary type="text">forever A simple CLI tool for ensuring that a given script runs continuously (i.e. forever).一个非常简单的CLI工具，让你的程序持续运行。 安装forever: https://github.com/nodejitsu/forever $ [sudo] npm install forever -g ...</summary><published>2011-11-22T18:33:00Z</published><updated>2011-11-22T18:33:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/23/2259679.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/23/2259679.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/nodejitsu/forever"&gt;forever&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple CLI tool for ensuring that a given script runs continuously (i.e. forever).&lt;br /&gt;一个非常简单的CLI工具，让你的程序持续运行。&lt;/p&gt;

&lt;p&gt;安装forever: &lt;a href='https://github.com/nodejitsu/forever'&gt;https://github.com/nodejitsu/forever&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ [sudo] npm install forever -g&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Demo: 进程重启超过5次后将不再运行&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ forever examples/error-on-timer.js -m 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/FGRibreau/forever-webui"&gt;forever-webui&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A simple web UI for efficient nodejs administration&lt;br /&gt;既然有了CLI工具帮忙保证程序的持续运行，那么有个简单的web监控就更加好了。&lt;br /&gt;&lt;a href="https://github.com/FGRibreau/forever-webui"&gt;forever-webui&lt;/a&gt; 就是这样一个web应用程序。&lt;/p&gt;

&lt;p&gt;安装并运行&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm install forever-webui &amp;&amp; node node_modules/forever-webui/app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;浏览器访问 &lt;a href='http://127.0.0.1:8085'&gt;http://127.0.0.1:8085&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;img src="http://ww4.sinaimg.cn/large/61c56ebcjw1dnd6elhv81j.jpg" alt="http://ww4.sinaimg.cn/large/61c56ebcjw1dnd6elhv81j.jpg" title="" /&gt;&lt;/p&gt;

&lt;p&gt;PS：如果你使用forever来启动forever-webui，还可以自己监控自己喔，不知道会不会死循环？！&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;有爱&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;^_^ 希望本文对你有用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2259679.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/23/2259679.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/19/2254786.html</id><title type="text">[nodejs]Buffer vs String</title><summary type="text">疑问 按nodejs官方的文档说明，使用Buffer操作字节流通常会比转化成String要高效。实际情况全都是这样的吗？本文通过一个简单的解析HTTP Request Header实例来解开此疑问。 HTTP Request Header Demo POST /foo HTTP/1.1\r\n
Host: foo.example.com\r\n
Content-Length: 5\r\n
C...</summary><published>2011-11-18T17:21:00Z</published><updated>2011-11-18T17:21:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/19/2254786.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/19/2254786.html"/><content type="html">&lt;p&gt;&lt;strong&gt;疑问&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;按nodejs官方的文档说明，使用Buffer操作字节流通常会比转化成String要高效。&lt;br /&gt;实际情况全都是这样的吗？&lt;br /&gt;本文通过一个简单的解析HTTP Request Header实例来解开此疑问。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Request Header Demo&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;POST /foo HTTP/1.1\r\n
Host: foo.example.com\r\n
Content-Length: 5\r\n
Connection:keep-alive\r\n
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n
Cookie:connect.sid=OY2nKGqI3obs5lYee0JKTjhf.FDtbY1Jz5Ngw5So9Jv3MUetI5ITvrIfwgCkRw%2FcXUCk\r\n
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.41 Safari/535.7
\r\n\r\n
q=bar
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;需求&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;获取Header中Host的值&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buffer版本&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var SPACE = 0x20, // ' '
    COLON = 0x3a, // 58, :
    NEWLINE = 0x0a, // \n
    ENTER = 0x0d; // \r

exports.parse = function parse(data) {
    var line_start = 0, len = data.length;
    for(var i = 0 ; i &lt; len; i++) {
        // Host: xxx.abc.com
        if(data[i] === COLON) {
            var key = data.toString('ascii', line_start, i).toLowerCase();
            i++; // skip ':'
            if(key === 'host') {
                var value_start = i;
                while(i &lt; len) {
                    if(data[i] === ENTER) {
                        return data.toString('ascii', value_start, i).trim().toLowerCase();
                    }
                    i++;
                }
            }
        } else if(data[i] ===  ENTER &amp;&amp; data[i+1] === NEWLINE) {
            i += 2;
            line_start = i;
            if(data[i] ===  ENTER &amp;&amp; data[i+1] === NEWLINE) {
                // \r\n\r\n
                return 'Host header not found';
            }
        }
    }
    return null;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;String版本&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;exports.parse = function parse(data) {
    var lines = data.toString('ascii').split("\n");
    var cut, name, host;
    for (var i = 0, len = lines.length; i &lt; len; i++) {
        cut = lines[i].split(':');
        name = cut[0];
        if (name === 'Host') {
            if (cut[1] === undefined) {
                return 'Host header not found';
            }
            host = cut[1].trim().toLowerCase();
            return host;
        }
    }
    return null;
};
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;测试脚本&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var buffer_parse = require('./string-buffer-benchmark-parse-header-buffer').parse
  , string_parse = require('./string-buffer-benchmark-parse-header-string').parse;

var data = new Buffer('POST /foo HTTP/1.1\r\nHost: foo.example.com\r\nContent-Length: 5\r\nConnection:keep-alive\r\nAccept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nCookie:connect.sid=OY2nKGqI3obs5lYee0JKTjhf.FDtbY1Jz5Ngw5So9Jv3MUetI5ITvrIfwgCkRw%2FcXUCk\r\nUser-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.41 Safari/535.7\r\n\r\nq=bar');

//console.log(buffer_parse(data));
//console.log(string_parse(data), data.length);

var n = 1000000;
var start = new Date();
for(var i = 0; i &lt; n; i++) {
    buffer_parse(data);
}
console.log('buffer_parse take: ' + (new Date() - start) + ' ms');

start = new Date();
for(var i = 0; i &lt; n; i++) {
    string_parse(data);
}
console.log('string_parse take: ' + (new Date() - start) + ' ms');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;测试结果&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ node string-buffer-benchmark.js
buffer_parse take: 1888 ms
string_parse take: 4948 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Buffer比String快多了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2254786.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/19/2254786.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/17/2251990.html</id><title type="text">Nodejs "Hello world" benchmark</title><summary type="text">新版本 nodejs 性能 node0.6.0 已经发布了，性能提高如何呢？本文将记录 nodejs 历史更新中所有版本的hello world性能测试。 测试环境 $ uname -a
Linux xxx 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux $ cat /pro...</summary><published>2011-11-16T16:08:00Z</published><updated>2011-11-16T16:08:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/17/2251990.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/17/2251990.html"/><content type="html">&lt;p&gt;&lt;strong&gt;新版本 nodejs 性能&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.nodejs.org/2011/11/05/node-v0-6-0/"&gt;node0.6.0 已经发布&lt;/a&gt;了，性能提高如何呢？&lt;br /&gt;本文将记录 nodejs 历史更新中所有版本的hello world性能测试。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;测试环境&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ uname -a
Linux xxx 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux

$ cat /proc/cpuinfo
Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;测试 helloworld.js&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, "127.0.0.1");
console.log('Server running at &lt;a href='http://127.0.0.1:1337/'&gt;http://127.0.0.1:1337/&lt;/a&gt;');
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;http_load 压测命令&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ http_load -p 100 -s 10 &lt;a href='http://127.0.0.1:1337/'&gt;http://127.0.0.1:1337/&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;测试结果: fetches/sec&lt;/strong&gt;&lt;/p&gt;




&lt;div id="chart_div"&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;v0.7.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.7.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7676&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.6.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
      &lt;th&gt;0.6.7&lt;/th&gt;&lt;th&gt;0.6.6&lt;/th&gt;&lt;th&gt;0.6.5&lt;/th&gt;&lt;th&gt;0.6.4&lt;/th&gt;&lt;th&gt;0.6.3&lt;/th&gt;&lt;th&gt;0.6.2&lt;/th&gt;&lt;th&gt;0.6.1&lt;/th&gt;&lt;th&gt;0.6.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;7791&lt;/td&gt;&lt;td&gt;8046&lt;/td&gt;&lt;td&gt;8060&lt;/td&gt;&lt;td&gt;8111&lt;/td&gt;&lt;td&gt;8070&lt;/td&gt;&lt;td&gt;8138&lt;/td&gt;&lt;td&gt;8240&lt;/td&gt;&lt;td&gt;8157&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.5.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.5.10&lt;/th&gt;&lt;th&gt;0.5.9&lt;/th&gt;&lt;th&gt;0.5.8&lt;/th&gt;&lt;th&gt;0.5.7&lt;/th&gt;&lt;th&gt;0.5.6&lt;/th&gt;
        &lt;th&gt;0.5.5&lt;/th&gt;&lt;th&gt;0.5.4&lt;/th&gt;&lt;th&gt;0.5.3&lt;/th&gt;&lt;th&gt;0.5.2&lt;/th&gt;&lt;th&gt;0.5.1&lt;/th&gt;&lt;th&gt;0.5.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;8200&lt;/td&gt;&lt;td&gt;7259&lt;/td&gt;&lt;td&gt;7071&lt;/td&gt;&lt;td&gt;7098&lt;/td&gt;&lt;td&gt;6996&lt;/td&gt;
        &lt;td&gt;8073&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;7931&lt;/td&gt;&lt;td&gt;8127&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.4.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.4.12&lt;/th&gt;&lt;th&gt;0.4.11&lt;/th&gt;&lt;th&gt;0.4.10&lt;/th&gt;&lt;th&gt;0.4.9&lt;/th&gt;&lt;th&gt;0.4.8&lt;/th&gt;
        &lt;th&gt;0.4.7&lt;/th&gt;&lt;th&gt;0.4.6&lt;/th&gt;&lt;th&gt;0.4.5&lt;/th&gt;&lt;th&gt;0.4.4&lt;/th&gt;
        &lt;th&gt;0.4.3&lt;/th&gt;&lt;th&gt;0.4.2&lt;/th&gt;&lt;th&gt;0.4.1&lt;/th&gt;&lt;th&gt;0.4.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7510&lt;/td&gt;&lt;td&gt;7558&lt;/td&gt;&lt;td&gt;7600&lt;/td&gt;&lt;td&gt;7606&lt;/td&gt;&lt;td&gt;6588&lt;/td&gt;
        &lt;td&gt;7916&lt;/td&gt;&lt;td&gt;7931&lt;/td&gt;&lt;td&gt;7960&lt;/td&gt;&lt;td&gt;7981&lt;/td&gt;
        &lt;td&gt;7930&lt;/td&gt;&lt;td&gt;7965&lt;/td&gt;&lt;td&gt;7975&lt;/td&gt;&lt;td&gt;7490&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.3.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.3.8&lt;/th&gt;&lt;th&gt;0.3.7&lt;/th&gt;&lt;th&gt;0.3.6&lt;/th&gt;&lt;th&gt;0.3.5&lt;/th&gt;&lt;th&gt;0.3.4&lt;/th&gt;
        &lt;th&gt;0.3.3&lt;/th&gt;&lt;th&gt;0.3.2&lt;/th&gt;&lt;th&gt;0.3.1&lt;/th&gt;&lt;th&gt;0.3.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7810&lt;/td&gt;&lt;td&gt;7871&lt;/td&gt;&lt;td&gt;7815&lt;/td&gt;&lt;td&gt;8880&lt;/td&gt;&lt;td&gt;9000&lt;/td&gt;
        &lt;td&gt;8999&lt;/td&gt;&lt;td&gt;9200&lt;/td&gt;&lt;td&gt;9347&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.2.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.2.6&lt;/th&gt;&lt;th&gt;0.2.5&lt;/th&gt;&lt;th&gt;0.2.4&lt;/th&gt;&lt;th&gt;0.2.3&lt;/th&gt;
        &lt;th&gt;0.2.2&lt;/th&gt;&lt;th&gt;0.2.1&lt;/th&gt;&lt;th&gt;0.2.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7525&lt;/td&gt;&lt;td&gt;7481&lt;/td&gt;&lt;td&gt;7489&lt;/td&gt;&lt;td&gt;7500&lt;/td&gt;
        &lt;td&gt;7410&lt;/td&gt;&lt;td&gt;7136&lt;/td&gt;&lt;td&gt;7130&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;ul&gt;
&lt;li&gt;v0.1.x&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
    &lt;tr&gt;
        &lt;th&gt;0.1.104&lt;/th&gt;&lt;th&gt;0.1.103&lt;/th&gt;&lt;th&gt;0.1.102&lt;/th&gt;&lt;th&gt;0.1.101&lt;/th&gt;&lt;th&gt;0.1.100&lt;/th&gt;
        &lt;th&gt;0.1.99&lt;/th&gt;&lt;th&gt;0.1.98&lt;/th&gt;&lt;th&gt;0.1.97&lt;/th&gt;&lt;th&gt;0.1.96&lt;/th&gt;&lt;th&gt;0.1.95&lt;/th&gt;
        &lt;th&gt;0.1.94&lt;/th&gt;&lt;th&gt;0.1.93&lt;/th&gt;&lt;th&gt;0.1.92&lt;/th&gt;&lt;th&gt;0.1.91&lt;/th&gt;&lt;th&gt;0.1.90&lt;/th&gt;
        &lt;th&gt;0.1.0&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;7640&lt;/td&gt;&lt;td&gt;7538&lt;/td&gt;&lt;td&gt;7537&lt;/td&gt;&lt;td&gt;7674&lt;/td&gt;&lt;td&gt;7040&lt;/td&gt;
        &lt;td&gt;7280&lt;/td&gt;&lt;td&gt;7211&lt;/td&gt;&lt;td&gt;7340&lt;/td&gt;&lt;td&gt;7270&lt;/td&gt;&lt;td&gt;7210&lt;/td&gt;
        &lt;td&gt;7063&lt;/td&gt;&lt;td&gt;7931&lt;/td&gt;&lt;td&gt;8020&lt;/td&gt;&lt;td&gt;8561&lt;/td&gt;&lt;td&gt;8146&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&lt;strong&gt;v0.6.0与v0.4.12的性能对比&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;在&lt;a href="http://blog.nodejs.org/2011/11/05/node-v0-6-0/"&gt;v0.6.0更新&lt;/a&gt; 说明文章中，列出的对比数据&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v0.4.12 (linux) v0.6.0 (linux)&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http_simple.js /bytes/1024  5461 r/s    6263 r/s
io.js read                  19.75 mB/s  26.63 mB/s
io.js write                 21.60 mB/s  17.40 mB/s
startup.js                  74.7 ms     49.6 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;v0.4.12 (windows: Cygwin)   v0.6.0 (windows)&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http_simple.js /bytes/1024  3858 r/s    5823 r/s
io.js read                  12.41 mB/s  26.51 mB/s
io.js write                 12.61 mB/s  33.58 mB/s
startup.js                  152.81 ms   52.04 ms
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;v0.4 和 v0.6之间的更新说明请查看: &lt;a href="https://github.com/joyent/node/wiki/API-changes-between-v0.4-and-v0.6"&gt;API-changes-between-v0.4-and-v0.6&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node0.7.0&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7675.8 fetches/sec, 92109.6 bytes/sec
msecs/connect: 0.050985 mean, 1.047 max, 0.02 min
msecs/first-response: 12.9343 mean, 47.329 max, 2.926 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7790.79 fetches/sec, 93489.5 bytes/sec
msecs/connect: 0.052154 mean, 0.716 max, 0.023 min
msecs/first-response: 12.7397 mean, 41.609 max, 5.318 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8046.29 fetches/sec, 96555.5 bytes/sec
msecs/connect: 0.0517639 mean, 0.396 max, 0.023 min
msecs/first-response: 12.3359 mean, 36.495 max, 4.808 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.5&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8060.28 fetches/sec, 96723.4 bytes/sec
msecs/connect: 0.0518643 mean, 0.702 max, 0.021 min
msecs/first-response: 12.3109 mean, 35.02 max, 4.762 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.4&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8111 fetches/sec, 97332 bytes/sec
msecs/connect: 0.051521 mean, 1.847 max, 0.021 min
msecs/first-response: 12.2351 mean, 49.227 max, 1.847 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8070 fetches/sec, 96840 bytes/sec
msecs/connect: 0.0517654 mean, 0.502 max, 0.02 min
msecs/first-response: 12.2967 mean, 51.886 max, 5.151 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8137.79 fetches/sec, 97653.5 bytes/sec
msecs/connect: 0.0515829 mean, 0.642 max, 0.021 min
msecs/first-response: 12.1961 mean, 42.128 max, 3.111 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.1&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8239.6 fetches/sec, 98875.2 bytes/sec
msecs/connect: 0.0530447 mean, 0.439 max, 0.022 min
msecs/first-response: 12.0422 mean, 32.93 max, 1.846 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.6.0&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8157.38 fetches/sec, 97888.5 bytes/sec
msecs/connect: 0.0512865 mean, 0.741 max, 0.022 min
msecs/first-response: 12.1661 mean, 46.023 max, 4.57 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.10&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8200 fetches/sec, 98400 bytes/sec
msecs/connect: 0.0517871 mean, 0.508 max, 0.024 min
msecs/first-response: 12.0963 mean, 34.816 max, 4.831 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.9&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7258.88 fetches/sec, 87106.6 bytes/sec
msecs/connect: 0.0521661 mean, 0.667 max, 0.022 min
msecs/first-response: 13.6817 mean, 49.23 max, 3.31 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.8&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7070.8 fetches/sec, 84849.6 bytes/sec
msecs/connect: 0.0523142 mean, 0.517 max, 0.022 min
msecs/first-response: 14.0466 mean, 39.545 max, 6.215 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7097.59 fetches/sec, 85171.1 bytes/sec
msecs/connect: 0.0526457 mean, 0.586 max, 0.024 min
msecs/first-response: 13.9935 mean, 44.333 max, 5.604 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;6995.6 fetches/sec, 83947.2 bytes/sec
msecs/connect: 0.0525126 mean, 0.413 max, 0.022 min
msecs/first-response: 14.1971 mean, 37.55 max, 6.123 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.5&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8073.3 fetches/sec, 96879.6 bytes/sec
msecs/connect: 0.0509257 mean, 0.41 max, 0.02 min
msecs/first-response: 12.2924 mean, 44.222 max, 4.323 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.4&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;出现编译错误:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/home/admin/pkgs/node-v0.5.4/build/default/deps/uv/uv.a(eio.o): In function `eio__sync_file_range':
/home/admin/pkgs/node-v0.5.4/build/default/deps/uv/src/eio/eio.c:1083: undefined reference to `sync_file_range'
collect2: ld returned 1 exit status
Waf: Leaving directory `/home/admin/pkgs/node-v0.5.4/build'
Build failed:  -&gt; task failed (err #1): 
    {task: cxx_link node_main_5.o,node_5.o,node_buffer_5.o,node_javascript_5.o,
    node_extensions_5.o,node_http_parser_5.o,node_constants_5.o,node_file_5.o,
    node_script_5.o,node_os_5.o,node_dtrace_5.o,node_string_5.o,timer_wrap_5.o,
    handle_wrap_5.o,stream_wrap_5.o,tcp_wrap_5.o,pipe_wrap_5.o,cares_wrap_5.o,
    stdio_wrap_5.o,process_wrap_5.o,node_cares_5.o,node_net_5.o,
    node_signal_watcher_5.o,node_stat_watcher_5.o,node_io_watcher_5.o,
    node_stdio_5.o,node_child_process_5.o,node_timer_5.o,platform_linux_5.o,
    node_crypto_5.o,http_parser_3.o -&gt; node}
make: *** [program] Error 1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7931.39 fetches/sec, 95176.7 bytes/sec
msecs/connect: 0.0520728 mean, 0.701 max, 0.024 min
msecs/first-response: 12.5109 mean, 45.553 max, 5.302 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8126.8 fetches/sec, 97521.6 bytes/sec
msecs/connect: 0.0513291 mean, 2.476 max, 0.021 min
msecs/first-response: 12.2076 mean, 38.541 max, 1.328 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.5.1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;编译不通过，暂缺&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node0.5.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;编译不通过，暂缺&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node0.4.12&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7510 fetches/sec, 90120 bytes/sec
msecs/connect: 0.0540341 mean, 0.631 max, 0.023 min
msecs/first-response: 13.2113 mean, 47.364 max, 3.807 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.11&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7557.79 fetches/sec, 90693.5 bytes/sec
msecs/connect: 0.0553164 mean, 0.467 max, 0.025 min
msecs/first-response: 13.13 mean, 44.789 max, 2.899 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.10&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7600 fetches/sec, 91200 bytes/sec
msecs/connect: 0.0534043 mean, 0.367 max, 0.022 min
msecs/first-response: 13.0584 mean, 53.123 max, 4.559 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.9&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7605.7 fetches/sec, 91268.4 bytes/sec
msecs/connect: 0.0539834 mean, 0.379 max, 0.02 min
msecs/first-response: 13.0469 mean, 46.833 max, 5.299 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.8&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;6587.9 fetches/sec, 79054.8 bytes/sec
msecs/connect: 0.0512022 mean, 0.499 max, 0.021 min
msecs/first-response: 15.0846 mean, 49.04 max, 4.448 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7916.1 fetches/sec, 94993.2 bytes/sec
msecs/connect: 0.0516686 mean, 1.629 max, 0.021 min
msecs/first-response: 12.5375 mean, 43.116 max, 5.695 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7930.88 fetches/sec, 95170.6 bytes/sec
msecs/connect: 0.0517224 mean, 0.704 max, 0.022 min
msecs/first-response: 12.5125 mean, 42.465 max, 5.519 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.5&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7960 fetches/sec, 95520 bytes/sec
msecs/connect: 0.0522368 mean, 0.674 max, 0.021 min
msecs/first-response: 12.4676 mean, 43.185 max, 5.598 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.4&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7981.4 fetches/sec, 95776.8 bytes/sec
msecs/connect: 0.0511981 mean, 0.729 max, 0.02 min
msecs/first-response: 12.4255 mean, 51.829 max, 5.506 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7929.9 fetches/sec, 95158.8 bytes/sec
msecs/connect: 0.0510949 mean, 0.833 max, 0.023 min
msecs/first-response: 12.5189 mean, 51.677 max, 5.02 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7965.19 fetches/sec, 95582.3 bytes/sec
msecs/connect: 0.0526699 mean, 0.864 max, 0.023 min
msecs/first-response: 12.4563 mean, 42.695 max, 3.897 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.1&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7975.19 fetches/sec, 95702.3 bytes/sec
msecs/connect: 0.0527306 mean, 1.418 max, 0.021 min
msecs/first-response: 12.4361 mean, 47.871 max, 0.767 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.4.0&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7490 fetches/sec, 89880 bytes/sec
msecs/connect: 0.051049 mean, 0.691 max, 0.021 min
msecs/first-response: 13.255 mean, 51.421 max, 5.735 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.8&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7810 fetches/sec, 93720 bytes/sec
msecs/connect: 0.0514884 mean, 0.581 max, 0.02 min
msecs/first-response: 12.7136 mean, 43.613 max, 5.42 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.7&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7870.99 fetches/sec, 94451.9 bytes/sec
msecs/connect: 0.0527374 mean, 0.453 max, 0.022 min
msecs/first-response: 12.6068 mean, 37.022 max, 5.835 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7814.89 fetches/sec, 93778.6 bytes/sec
msecs/connect: 0.0522743 mean, 0.719 max, 0.023 min
msecs/first-response: 12.6983 mean, 37.436 max, 5.748 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.5&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8879.97 fetches/sec, 106560 bytes/sec
msecs/connect: 0.0571404 mean, 0.753 max, 0.022 min
msecs/first-response: 11.1496 mean, 46.028 max, 4.842 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.4&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;9000 fetches/sec, 108000 bytes/sec
msecs/connect: 0.0566353 mean, 0.633 max, 0.023 min
msecs/first-response: 11.0017 mean, 46.633 max, 5.126 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8999.29 fetches/sec, 107992 bytes/sec
msecs/connect: 0.0569282 mean, 0.583 max, 0.022 min
msecs/first-response: 11.0035 mean, 43.218 max, 5.112 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;9200 fetches/sec, 110400 bytes/sec
msecs/connect: 0.0582272 mean, 0.709 max, 0.023 min
msecs/first-response: 10.7557 mean, 32.685 max, 5.059 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.1&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;9347.3 fetches/sec, 112168 bytes/sec
msecs/connect: 0.0564677 mean, 0.974 max, 0.022 min
msecs/first-response: 10.592 mean, 38.921 max, 4.77 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.3.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;编译不通过&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;node0.2.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7524.9 fetches/sec, 90298.7 bytes/sec
msecs/connect: 0.0581787 mean, 0.649 max, 0.02 min
msecs/first-response: 13.1609 mean, 105.413 max, 5.191 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.5&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7480.6 fetches/sec, 89767.1 bytes/sec
msecs/connect: 0.0589546 mean, 0.693 max, 0.023 min
msecs/first-response: 13.2442 mean, 94.122 max, 5.744 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.4&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7488.59 fetches/sec, 89863.1 bytes/sec
msecs/connect: 0.0595586 mean, 0.428 max, 0.023 min
msecs/first-response: 13.2342 mean, 95.229 max, 5.88 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7500 fetches/sec, 89999.9 bytes/sec
msecs/connect: 0.0591254 mean, 0.57 max, 0.024 min
msecs/first-response: 13.1974 mean, 94.721 max, 5.728 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.2&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7409.99 fetches/sec, 88919.9 bytes/sec
msecs/connect: 0.0597531 mean, 0.558 max, 0.021 min
msecs/first-response: 13.3618 mean, 102.09 max, 5.846 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.1&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7135.9 fetches/sec, 85630.8 bytes/sec
msecs/connect: 0.0565066 mean, 0.59 max, 0.023 min
msecs/first-response: 13.8999 mean, 100.855 max, 5.703 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.2.0&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7129.99 fetches/sec, 85559.9 bytes/sec
msecs/connect: 0.0565618 mean, 0.356 max, 0.02 min
msecs/first-response: 13.915 mean, 100.048 max, 4.344 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.104&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7640 fetches/sec, 91679.9 bytes/sec
msecs/connect: 0.0577092 mean, 0.564 max, 0.024 min
msecs/first-response: 12.9695 mean, 90.161 max, 3.711 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.103&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7538.38 fetches/sec, 90460.6 bytes/sec
msecs/connect: 0.0577052 mean, 1.091 max, 0.021 min
msecs/first-response: 13.1506 mean, 92.522 max, 5.378 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.102&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7537.49 fetches/sec, 90449.9 bytes/sec
msecs/connect: 0.0583015 mean, 0.396 max, 0.024 min
msecs/first-response: 13.1514 mean, 103.188 max, 5.577 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.101&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7673.9 fetches/sec, 92086.8 bytes/sec
msecs/connect: 0.0588679 mean, 0.767 max, 0.021 min
msecs/first-response: 12.9082 mean, 99.924 max, 4.776 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.100&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7040 fetches/sec, 84480 bytes/sec
msecs/connect: 0.0557378 mean, 0.592 max, 0.022 min
msecs/first-response: 14.0982 mean, 107.368 max, 6.009 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.99&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7279.99 fetches/sec, 87359.9 bytes/sec
msecs/connect: 0.0555776 mean, 0.569 max, 0.022 min
msecs/first-response: 13.6292 mean, 93.241 max, 5.983 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.98&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7210.6 fetches/sec, 86527.2 bytes/sec
msecs/connect: 0.0552844 mean, 0.379 max, 0.02 min
msecs/first-response: 13.7576 mean, 94.502 max, 5.685 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.97&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7339.55 fetches/sec, 88074.6 bytes/sec
msecs/connect: 0.057371 mean, 0.802 max, 0.022 min
msecs/first-response: 13.5052 mean, 89.268 max, 5.326 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.96&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7269.6 fetches/sec, 87235.2 bytes/sec
msecs/connect: 0.0566584 mean, 0.573 max, 0.021 min
msecs/first-response: 13.6483 mean, 60.543 max, 4.296 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.95&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7209.65 fetches/sec, 86515.9 bytes/sec
msecs/connect: 0.0565087 mean, 0.529 max, 0.024 min
msecs/first-response: 13.7617 mean, 60.438 max, 4.418 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.94&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7063.39 fetches/sec, 84760.6 bytes/sec
msecs/connect: 0.0547156 mean, 0.66 max, 0.022 min
msecs/first-response: 14.0522 mean, 130.751 max, 4.987 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.93&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;7930.6 fetches/sec, 95167.2 bytes/sec
msecs/connect: 0.0587932 mean, 0.61 max, 0.023 min
msecs/first-response: 12.4891 mean, 77.833 max, 3.689 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.92&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8019.99 fetches/sec, 96239.9 bytes/sec
msecs/connect: 0.058158 mean, 0.718 max, 0.021 min
msecs/first-response: 12.354 mean, 79.033 max, 3.423 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.91&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8560.98 fetches/sec, 102732 bytes/sec
msecs/connect: 0.0596777 mean, 0.471 max, 0.022 min
msecs/first-response: 11.522 mean, 71.727 max, 3.235 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.90&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;8146.18 fetches/sec, 97754.2 bytes/sec
msecs/connect: 0.0595273 mean, 0.826 max, 0.021 min
msecs/first-response: 12.1531 mean, 223.064 max, 3.189 min
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;node0.1.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;helloworld.js跑不起来了，出现一下异常：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;hello.js:8: TypeError: Object #&lt;an Object&gt; has no method 'createServer'
http.createServer(function (req, res) {
     ^
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;有爱&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;^_^ 希望本文对你有用&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2251990.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/17/2251990.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/16/2251374.html</id><title type="text">npm 资源库镜像</title><summary type="text">使用方法 @mashihua 同学在cnode新闻组发布了他维护的npm镜像源，速度很快！ 以下是邮件内容： 很高兴的通知大家。在周末的空闲时间里，我们搭建了一个镜像的npm资源库，服务器在日本的Linode上。大家可用下面的命令来安装npm的模块： $ npm --registry &amp;quot;http://npm.hacknodejs.com/&amp;quot; install express 或下面的命令...</summary><published>2011-11-16T08:05:00Z</published><updated>2011-11-16T08:05:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/16/2251374.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/16/2251374.html"/><content type="html">&lt;p&gt;&lt;strong&gt;使用方法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/mashihua"&gt;@mashihua&lt;/a&gt; 同学在cnode新闻组发布了他维护的npm镜像源，速度很快！&lt;/p&gt;

&lt;p&gt;以下是邮件内容：&lt;/p&gt;

&lt;p&gt;很高兴的通知大家。在周末的空闲时间里，我们搭建了一个镜像的npm资源库，服务器在日本的Linode上。大家可用下面的命令来安装npm的模块：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm --registry "&lt;a href='http://npm.hacknodejs.com/'&gt;http://npm.hacknodejs.com/&lt;/a&gt;" install express
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;或下面的命令：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ env npm_config_registry="&lt;a href='http://npm.hacknodejs.com/'&gt;http://npm.hacknodejs.com/&lt;/a&gt;" npm install express 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;如果你想把它设成默认的资源库，可用下面的命令：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ npm config set registry "&lt;a href='http://npm.hacknodejs.com/'&gt;http://npm.hacknodejs.com/&lt;/a&gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;欢迎反馈，感谢大家的支持。&lt;/p&gt;

&lt;p&gt;PS: 还有一个资源镜像 &lt;a href="http://registry.npmjs.vitecho.com"&gt;&lt;a href='http://registry.npmjs.vitecho.com'&gt;http://registry.npmjs.vitecho.com&lt;/a&gt;&lt;/a&gt;，由 Senmiao 同学维护。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;自己动手搭建一个&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/mashihua"&gt;@mashihua&lt;/a&gt; 同学还分享了搭建经验：&lt;/p&gt;

&lt;p&gt;大家可以查看 &lt;a href='https://github.com/isaacs/npmjs.org'&gt;https://github.com/isaacs/npmjs.org&lt;/a&gt; 如何安装 npm 资源库。安装比较简单，最大的问题在于 couchdb 上。如果得到这样的错误：&lt;/p&gt;

&lt;p&gt;Error: insecure_rewrite_rule too many ../.. segments: registry/&lt;em&gt;design/app/&lt;/em&gt;rewrite/&lt;module&gt;&lt;/p&gt;

&lt;p&gt;请配置 /usr/local/etc/couchdb/local.ini 里 httpd 的选项  secure_rewrites = false&lt;/p&gt;

&lt;p&gt;当design文档和replication在同一个库时需要认证。可对registry这个资源采用用户名和密码认证的方式，&lt;a href='http://user:pwd@localhost/registry'&gt;http://user:pwd@localhost/registry&lt;/a&gt; 。因为可能碰到replication时，会返回401错误。&lt;/p&gt;

&lt;p&gt;可参考：&lt;a href="http://guide.couchdb.org/draft/replication.html"&gt;&lt;a href='http://guide.couchdb.org/draft/replication.html'&gt;http://guide.couchdb.org/draft/replication.html&lt;/a&gt;&lt;/a&gt;， &lt;a href="https://github.com/isaacs/npmjs.org/issues/19"&gt;&lt;a href='https://github.com/isaacs/npmjs.org/issues/19'&gt;https://github.com/isaacs/npmjs.org/issues/19&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2251374.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/16/2251374.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/15/2249119.html</id><title type="text">NodeBlog v0.2.0 更新说明</title><summary type="text">Change logs 完全基于Connect，提高整体响应性能；
移除对express, libxml2的依赖；
Session使用Mongodb存储； NodeBlog 介绍 A blog base on nodejs. Demo: http://nodeblog.org, http://nodeblog.cnodejs.net Features Write, Read, Li...</summary><published>2011-11-14T16:54:00Z</published><updated>2011-11-14T16:54:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/15/2249119.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/15/2249119.html"/><content type="html">&lt;p&gt;&lt;strong&gt;Change logs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;完全基于Connect，提高整体响应性能；&lt;/li&gt;
&lt;li&gt;移除对express, libxml2的依赖；&lt;/li&gt;
&lt;li&gt;Session使用Mongodb存储；&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NodeBlog 介绍&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A blog base on nodejs. Demo: &lt;a href='http://nodeblog.org'&gt;http://nodeblog.org&lt;/a&gt;, &lt;a href='http://nodeblog.cnodejs.net'&gt;http://nodeblog.cnodejs.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write, Read, List, Search blog.&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;li&gt;Support image and file upload.&lt;/li&gt;
&lt;li&gt;DIY template&lt;/li&gt;
&lt;li&gt;Support nodester.com, no.de... nodejs host services&lt;/li&gt;
&lt;li&gt;Simple to install&lt;/li&gt;
&lt;li&gt;Support post to twitter, facebook, weibo, tqq and so on.&lt;/li&gt;
&lt;li&gt;Speed&lt;/li&gt;
&lt;li&gt;Support MetaWeblog API Sync&lt;/li&gt;
&lt;li&gt;Support 42qu.com&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mongodb.org/"&gt;mongodb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo apt-get install mongodb
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;CentOS&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# install mongodb
# see: &lt;a href='http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages'&gt;http://www.mongodb.org/display/DOCS/CentOS+and+Fedora+Packages&lt;/a&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Node Modules Install&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ sudo npm install connect ejs weibo metaweblog mongoskin github-flavored-markdown
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Install NodeBlog&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ git clone git://github.com/fengmk2/nodeblog.git
$ cd nodeblog
$ cp config.js.tpl config.js
$ node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;DIY template&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.csstemplatesfree.org/templates/a_bit_boxy/index.html'&gt;http://www.csstemplatesfree.org/templates/a_bit_boxy/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://www.dcarter.co.uk/templates.html'&gt;http://www.dcarter.co.uk/templates.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://www.csstemplatesfree.org/templates/simple_square/index.html'&gt;http://www.csstemplatesfree.org/templates/simple_square/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href='http://www.instapaper.com/extras'&gt;http://www.instapaper.com/extras&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Snapshot&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Index Page
&lt;img src="http://ww1.sinaimg.cn/large/6cfc7910jw1dn1p7j7demj.jpg" alt="Index" title="" /&gt;&lt;/li&gt;
&lt;li&gt;Settings Page
&lt;img src="http://ww1.sinaimg.cn/large/6cfc7910jw1dn1p8enjrmj.jpg" alt="Settings" title="" /&gt;&lt;/li&gt;
&lt;li&gt;New Post Page
&lt;img src="http://ww3.sinaimg.cn/large/6cfc7910jw1dn1p9wmumkj.jpg" alt="new post" title="" /&gt;&lt;/li&gt;
&lt;li&gt;Comments of post
&lt;img src="http://ww2.sinaimg.cn/large/6cfc7910jw1dn1pbjnfeij.jpg" alt="comments" title="" /&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2249119.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/15/2249119.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/11/02/2233090.html</id><title type="text">关于__proto__的链式记忆 </title><summary type="text">实例化解析： function Foo() {}; var foo = new Foo();
foo.__proto__ === Foo.prototype;
foo.__proto__.__proto__ === Object.prototype;
foo.__proto__.__proto__.__proto__ === null;
foo.prototype === undefined;...</summary><published>2011-11-02T07:02:00Z</published><updated>2011-11-02T07:02:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/11/02/2233090.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/11/02/2233090.html"/><content type="html">&lt;p&gt;&lt;strong&gt;实例化解析：&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Foo() {};

var foo = new Foo();
foo.__proto__ === Foo.prototype;
foo.__proto__.__proto__ === Object.prototype;
foo.__proto__.__proto__.__proto__ === null;
foo.prototype === undefined;
foo.toString === Object.prototype.toString;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;原形继承后的实例化解析：&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Bar() {};

Bar.prototype.__proto__ = Foo.prototype;

var bar = new Bar();
bar.__proto__ === Bar.prototype;
bar.__proto__.__proto__ === Foo.prototype;
bar.__proto__.__proto__.__proto__ === Object.prototype;
bar.__proto__.__proto__.__proto__.__proto__ === null;
bar.prototype === undefined;
bar.toString === Object.prototype.toString
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;对象bar，访问toString，整个链式过程如下：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bar.toString 
    || bar.__proto__.toString 
    || bar.__proto__.__proto__.toString
    || bar.__proto__.__proto__.__proto__.toString 

bar.toString === Object.prototype.toString
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最终调用的是 Object.prototype.toString &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;奇怪的Foo.toString&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Foo.__proto__ === Function.prototype;
Foo.__proto__.__proto__ === Object.prototype;
Foo.prototype.__proto__ === Object.prototype;
// 神奇竟然不等于 Object.prototype.toString
Foo.toString === Object.toString;
Foo.prototype.toString === Object.prototype.toString;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;每个function生成的时候都直接被设置了toString 等于 Object.toString了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;参考文档&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/zh_tw/Core_JavaScript_1.5_%E6%95%99%E5%AD%B8/%E5%86%8D%E8%AB%87%E5%B1%AC%E6%80%A7%E7%9A%84%E7%B9%BC%E6%89%BF/%E5%AF%A6%E9%AB%94%E9%97%9C%E4%BF%82%E7%9A%84%E7%A2%BA%E5%AE%9A"&gt;實體關係的確定&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/cn/A_re-introduction_to_JavaScript"&gt;A re-introduction to JavaScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;有爱&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;希望本文对你有用 ^_^&lt;/p&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2233090.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/11/02/2233090.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/10/27/2225953.html</id><title type="text">NAE支持自定义域名了</title><summary type="text">@Cnodejs社区的NAE 目前正在邀请内测中，目前已经增加自定义域名绑定。 只需在package.json文件中指定customHost属性即可。 例如我需要绑定nae.nodeblog.org =&amp;gt; nodeblog.cnodejs.net ，只需在package.json增加一行即可： &amp;quot;customHost&amp;quot;: &amp;quot;nae.nodeblog.org&amp;quot;</summary><published>2011-10-26T18:29:00Z</published><updated>2011-10-26T18:29:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/10/27/2225953.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/10/27/2225953.html"/><content type="html">&lt;p&gt;@Cnodejs社区的&lt;a href="http://cnodejs.net"&gt;NAE&lt;/a&gt; 目前正在邀请内测中，目前已经增加自定义域名绑定。&lt;/p&gt;

&lt;p&gt;只需在package.json文件中指定customHost属性即可。&lt;/p&gt;

&lt;p&gt;例如我需要绑定nae.nodeblog.org =&gt; nodeblog.cnodejs.net ，只需在package.json增加一行即可：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"customHost": "nae.nodeblog.org"
&lt;/code&gt;&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2225953.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/10/27/2225953.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/fengmk2/archive/2011/08/17/2142904.html</id><title type="text">Nodejs 离线文档下载</title><summary type="text">本文收集我个人编译的一些离线文档 nodedoc.0.5.4.zip</summary><published>2011-08-17T03:35:00Z</published><updated>2011-08-17T03:35:00Z</updated><author><name>MK2</name><uri>http://www.cnblogs.com/fengmk2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/fengmk2/archive/2011/08/17/2142904.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/fengmk2/archive/2011/08/17/2142904.html"/><content type="html">&lt;p&gt;本文收集我个人编译的一些离线文档&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.everbox.com/f/z6AzllclKSll7jm16DO2gcQoXz"&gt;nodedoc.0.5.4.zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/fengmk2/aggbug/2142904.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/fengmk2/archive/2011/08/17/2142904.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
