<?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>feed.cnblogs.com</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;code&gt;connect()&lt;br/&gt;  .use(connect.limit('1mb'))&lt;br/&gt;  .use(handleRequest)&lt;br/&gt;&lt;/code&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;code&gt;/**&lt;br/&gt; * Parse the given str.&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;function parseString(str, options) {&lt;br/&gt;  var limit = options &amp;&amp; options.limit;&lt;br/&gt;  var keys = options &amp;&amp; options.keys;&lt;br/&gt;  if (keys &amp;&amp; Array.isArray(keys)) {&lt;br/&gt;    keys = {};&lt;br/&gt;    for (var i = 0, l = options.keys.length; i &lt; l; i++) {&lt;br/&gt;      keys[options.keys[i]] = 1;&lt;br/&gt;    }&lt;br/&gt;  }&lt;br/&gt;  return String(str)&lt;br/&gt;    .split('&amp;', limit)&lt;br/&gt;    .reduce(function(ret, pair){&lt;br/&gt;      try{&lt;br/&gt;        pair = decodeURIComponent(pair.replace(/\+/g, ' '));&lt;br/&gt;      } catch(e) {&lt;br/&gt;        // ignore&lt;br/&gt;      }&lt;br/&gt;&lt;br/&gt;      var eql = pair.indexOf('=')&lt;br/&gt;        , brace = lastBraceInKey(pair)&lt;br/&gt;        , key = pair.substr(0, brace || eql);&lt;br/&gt;      if (keys &amp;&amp; !keys[key]) {&lt;br/&gt;        return ret;&lt;br/&gt;      }&lt;br/&gt;      var val = pair.substr(brace || eql, pair.length)&lt;br/&gt;      val = val.substr(val.indexOf('=') + 1, val.length);&lt;br/&gt;&lt;br/&gt;      // ?foo&lt;br/&gt;      if ('' == key) key = pair, val = '';&lt;br/&gt;&lt;br/&gt;      return merge(ret, key, val);&lt;br/&gt;    }, { base: {} }).base;&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;/**&lt;br/&gt; * Parse the given query `str` or `obj`, returning an object.&lt;br/&gt; *&lt;br/&gt; * Options: (only effect on parse string)&lt;br/&gt; *&lt;br/&gt; *  - `limit` parse string split limit.&lt;br/&gt; *  - `keys`  which keys need to be parse.&lt;br/&gt; *&lt;br/&gt; * @param {String} str | {Object} obj&lt;br/&gt; * @param {Object} options&lt;br/&gt; * @return {Object}&lt;br/&gt; * @api public&lt;br/&gt; */&lt;br/&gt;&lt;br/&gt;exports.parse = function(str, options) {&lt;br/&gt;  if (null == str || '' == str) return {};&lt;br/&gt;  return 'object' == typeof str&lt;br/&gt;    ? parseObject(str)&lt;br/&gt;    : parseString(str, options);&lt;br/&gt;};&lt;br/&gt;&lt;/code&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;code&gt;module.exports = function query(options){&lt;br/&gt;  return function query(req, res, next){&lt;br/&gt;    req.query = ~req.url.indexOf('?')&lt;br/&gt;      ? qs.parse(parse(req.url).query, options)&lt;br/&gt;      : {};&lt;br/&gt;    next();&lt;br/&gt;  };&lt;br/&gt;};&lt;br/&gt;&lt;/code&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;code&gt;    req.on('end', function(){&lt;br/&gt;      try {&lt;br/&gt;        req.body = buf.length&lt;br/&gt;          ? qs.parse(buf, options)&lt;br/&gt;          : {};&lt;br/&gt;        next();&lt;br/&gt;      } catch (err){&lt;br/&gt;        next(err);&lt;br/&gt;      }&lt;br/&gt;    });&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;全部组合起来&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;var qsOptions = { limit: 100 };&lt;br/&gt;connect()&lt;br/&gt;  .use(connect.limit('1mb'))&lt;br/&gt;  .use(connect.query(qsOptions))&lt;br/&gt;  .use(connect.bodyParser(qsOptions))&lt;br/&gt;  .use(handleRequest)&lt;br/&gt;&lt;/code&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;code&gt;var http = require('http');&lt;br/&gt;&lt;br/&gt;var IncomingMessage = http.IncomingMessage;&lt;br/&gt;var _addHeaderLine = IncomingMessage.prototype._addHeaderLine;&lt;br/&gt;&lt;br/&gt;// limit http header number&lt;br/&gt;IncomingMessage.prototype._addHeaderLine = function(field, val) {&lt;br/&gt;  if (!this.__headerCount__) {&lt;br/&gt;    this.__headerCount__ = 0;&lt;br/&gt;  } else if (this.__headerCount__ &gt;= 100) {&lt;br/&gt;    return;&lt;br/&gt;  }&lt;br/&gt;  _addHeaderLine.apply(this, arguments);&lt;br/&gt;  this.__headerCount__++;&lt;br/&gt;};&lt;br/&gt;&lt;/code&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;code&gt;function fibonacci(n) {&lt;br/&gt;  if (n &lt; 2) {&lt;br/&gt;    return 1;&lt;br/&gt;  }&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;console.log(fibonacci(40));&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time node fibonacci.js&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m5.153s&lt;br/&gt;user  0m5.124s&lt;br/&gt;sys 0m0.012s&lt;br/&gt;&lt;/code&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;code&gt;#include &lt;node/v8.h&gt;&lt;br/&gt;#include &lt;node/node.h&gt;&lt;br/&gt;&lt;br/&gt;using namespace v8;&lt;br/&gt;&lt;br/&gt;int fibonacci(int n) {&lt;br/&gt;  if (n &lt; 2) {&lt;br/&gt;    return 1;&lt;br/&gt;  }&lt;br/&gt;  return fibonacci(n - 1) + fibonacci(n - 2);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;Handle&lt;Value&gt; Fibonacci(const Arguments&amp; args) {&lt;br/&gt;    HandleScope scope;&lt;br/&gt;&lt;br/&gt;    if (args.Length() &lt; 1) {&lt;br/&gt;        return ThrowException(Exception::TypeError(&lt;br/&gt;            String::New("First argument must be a number")));&lt;br/&gt;    }&lt;br/&gt;    Local&lt;Integer&gt; integer = args[0]-&gt;ToInteger();&lt;br/&gt;    int r = fibonacci(integer-&gt;Value());&lt;br/&gt;&lt;br/&gt;    return scope.Close(Integer::New(r));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;void RegisterModule(v8::Handle&lt;v8::Object&gt; target) {&lt;br/&gt;    // Add properties to target&lt;br/&gt;    NODE_SET_METHOD(target, "fibonacci", Fibonacci);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;// Register the module with node.&lt;br/&gt;NODE_MODULE(cppfibonacci, RegisterModule);&lt;br/&gt;&lt;/code&gt;&lt;p&gt;wscript&lt;/p&gt;&lt;code&gt;#!/usr/bin/env python&lt;br/&gt;&lt;br/&gt;def set_options(ctx):&lt;br/&gt;  ctx.tool_options('compiler_cxx')&lt;br/&gt;&lt;br/&gt;def configure(ctx):&lt;br/&gt;  ctx.check_tool('compiler_cxx')&lt;br/&gt;  ctx.check_tool('node_addon')&lt;br/&gt;&lt;br/&gt;def build(ctx):&lt;br/&gt;  t = ctx.new_task_gen('cxx', 'shlib', 'node_addon')&lt;br/&gt;&lt;br/&gt;  t.source = ['cppfibonacci.cpp']&lt;br/&gt;&lt;br/&gt;  # Must be same as first parameter in NODE_MODULE.&lt;br/&gt;  t.target = 'cppfibonacci'&lt;br/&gt;&lt;/code&gt;&lt;p&gt;cppfibonacci.js&lt;/p&gt;&lt;code&gt;var fibonacci = require('./build/default/cppfibonacci').fibonacci;&lt;br/&gt;console.log(fibonacci(40));&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ node-waf configure&lt;br/&gt;$ node-waf build&lt;br/&gt;$ time node cppfibonacci.js&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m2.224s&lt;br/&gt;user  0m2.216s&lt;br/&gt;sys 0m0.008s&lt;br/&gt;&lt;/code&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;code&gt;def fibonacci(n):&lt;br/&gt;    if n &lt; 2:&lt;br/&gt;        return 1&lt;br/&gt;    return fibonacci(n - 2) + fibonacci(n - 1)&lt;br/&gt;&lt;br/&gt;print fibonacci(40)&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time python2.4.3 fibonacci.py&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  1m11.667s&lt;br/&gt;user  1m11.647s&lt;br/&gt;sys 0m0.002s&lt;br/&gt;&lt;br/&gt;$ time python2.6.7 fibonacci.py&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  1m9.837s&lt;br/&gt;user  1m9.792s&lt;br/&gt;sys 0m0.006s&lt;br/&gt;&lt;br/&gt;$ time ./pypy-1.7/bin/pypy fibonacci.py&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m7.608s&lt;br/&gt;user  0m7.562s&lt;br/&gt;sys 0m0.031s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;perl&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;sub fibonacci {&lt;br/&gt;    my $n = shift;&lt;br/&gt;    if ($n &lt; 2) {&lt;br/&gt;      return 1;&lt;br/&gt;    }&lt;br/&gt;    return fibonacci($n - 2) + fibonacci($n - 1);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;print fibonacci(40), "\n";&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time perl fibonacci.pl&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  2m34.777s&lt;br/&gt;user  2m34.658s&lt;br/&gt;sys 0m0.004s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;php&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;&lt;?php&lt;br/&gt;&lt;br/&gt;function fibonacci($n) {&lt;br/&gt;  if ($n &lt; 2) {&lt;br/&gt;    return 1;&lt;br/&gt;  }&lt;br/&gt;  return fibonacci($n - 2) + fibonacci($n - 1);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;echo fibonacci(40)."\n";&lt;br/&gt;&lt;br/&gt;?&gt;&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time php fibonacci.php&lt;br/&gt;&lt;br/&gt;165580141&lt;br/&gt;real  1m28.364s&lt;br/&gt;user  1m28.198s&lt;br/&gt;sys 0m0.039s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;ruby1.8.5 &amp;&amp; ruby1.9.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;def fibonacci(n)&lt;br/&gt;  if n &lt; 2&lt;br/&gt;    return 1&lt;br/&gt;  end&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1)&lt;br/&gt;end&lt;br/&gt;&lt;br/&gt;puts fibonacci(40)&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time ruby1.8.5 fibonacci.rb&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  5m43.132s&lt;br/&gt;user  4m41.942s&lt;br/&gt;sys 1m0.653s&lt;br/&gt;&lt;br/&gt;$ time ruby1.9.3 fibonacci.rb&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  5m41.714s&lt;br/&gt;user  4m40.790s&lt;br/&gt;sys 1m0.661s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;lua &amp;&amp; luajit&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;function fibonacci(n)&lt;br/&gt;  if n &lt; 2 then&lt;br/&gt;    return 1&lt;br/&gt;  end&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1)&lt;br/&gt;end&lt;br/&gt;&lt;br/&gt;io.write(fibonacci(40), "\n")&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ time ./lua-5.1.4/src/lua fibonacci.lua &lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m34.514s&lt;br/&gt;user  0m34.492s&lt;br/&gt;sys 0m0.004s&lt;br/&gt;&lt;br/&gt;$ time ./LuaJIT-2.0.0-beta9/src/luajit fibonacci.lua &lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m2.598s&lt;br/&gt;user  0m2.583s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;local function should be faster:&lt;/p&gt;&lt;code&gt;local function fibonacci(n)&lt;br/&gt;  if n &lt; 2 then&lt;br/&gt;    return 1&lt;br/&gt;  end&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1)&lt;br/&gt;end&lt;br/&gt;&lt;br/&gt;io.write(fibonacci(40), "\n")&lt;br/&gt;&lt;br/&gt;$ time ./lua-5.1.4/src/lua fibonacci.lua.local&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m31.737s&lt;br/&gt;user  0m31.549s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;br/&gt;$ time ./LuaJIT-2.0.0-beta9/src/luajit fibonacci.lua.local&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m2.227s&lt;br/&gt;user  0m2.225s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;c&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;#include &lt;stdio.h&gt;&lt;br/&gt;&lt;br/&gt;int fibonacci(n) {&lt;br/&gt;  if (n &lt; 2) {&lt;br/&gt;    return 1;&lt;br/&gt;  }&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1);&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;int main() {&lt;br/&gt;  printf("%d\n", fibonacci(40));&lt;br/&gt;  return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ gcc fibonacci.c&lt;br/&gt;$ time ./a.out &lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m3.434s&lt;br/&gt;user  0m3.427s&lt;br/&gt;sys 0m0.000s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;Compilation with optimization:&lt;/p&gt;&lt;code&gt;$ gcc -O2 fibonacci.c&lt;br/&gt;$ time ./a.out &lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m1.607s&lt;br/&gt;user  0m1.606s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;/code&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;code&gt;#include &lt;stdio.h&gt;&lt;br/&gt;&lt;br/&gt;template&lt;int n&gt;&lt;br/&gt;struct fibonacci {&lt;br/&gt;    enum { Result = fibonacci&lt;n-2&gt;::Result + fibonacci&lt;n-1&gt;::Result };&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;template&lt;&gt;&lt;br/&gt;struct fibonacci&lt;1&gt; {&lt;br/&gt;    enum { Result = 1 };&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;template&lt;&gt;&lt;br/&gt;struct fibonacci&lt;0&gt; {&lt;br/&gt;    enum { Result = 1 };&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;int main(int argc, char *argv[])&lt;br/&gt;{&lt;br/&gt;    printf("%d\n", fibonacci&lt;40&gt;::Result);&lt;br/&gt;    return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ g++ fibonacci.template.cpp &lt;br/&gt;$ time ./a.out&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m0.002s&lt;br/&gt;user  0m0.001s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;go&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;package main&lt;br/&gt;&lt;br/&gt;import "fmt"&lt;br/&gt;&lt;br/&gt;func fibonacci(n int) int{&lt;br/&gt;  if (n &lt; 2) {&lt;br/&gt;    return 1&lt;br/&gt;  }&lt;br/&gt;  return fibonacci(n - 2) + fibonacci(n - 1)&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;func main() {&lt;br/&gt;  fmt.Println(fibonacci(10))&lt;br/&gt;}&lt;br/&gt;&lt;/code&gt;&lt;p&gt;run&lt;/p&gt;&lt;code&gt;$ 6g fibonacci.go&lt;br/&gt;$ 6l fibonacci.6&lt;br/&gt;$ time ./6.out&lt;br/&gt;165580141&lt;br/&gt;&lt;br/&gt;real  0m1.770s&lt;br/&gt;user  0m1.769s&lt;br/&gt;sys 0m0.001s&lt;br/&gt;&lt;/code&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;code&gt;$ npm install forever-webui &amp;&amp; node node_modules/forever-webui/app.js&lt;br/&gt;&lt;/code&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\nHost: foo.example.com\r\nContent-Length: 5\r\nC...</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;code&gt;POST /foo HTTP/1.1\r\n&lt;br/&gt;Host: foo.example.com\r\n&lt;br/&gt;Content-Length: 5\r\n&lt;br/&gt;Connection:keep-alive\r\n&lt;br/&gt;Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n&lt;br/&gt;Cookie:connect.sid=OY2nKGqI3obs5lYee0JKTjhf.FDtbY1Jz5Ngw5So9Jv3MUetI5ITvrIfwgCkRw%2FcXUCk\r\n&lt;br/&gt;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&lt;br/&gt;\r\n\r\n&lt;br/&gt;q=bar&lt;br/&gt;&lt;/code&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;code&gt;var SPACE = 0x20, // ' '&lt;br/&gt;    COLON = 0x3a, // 58, :&lt;br/&gt;    NEWLINE = 0x0a, // \n&lt;br/&gt;    ENTER = 0x0d; // \r&lt;br/&gt;&lt;br/&gt;exports.parse = function parse(data) {&lt;br/&gt;    var line_start = 0, len = data.length;&lt;br/&gt;    for(var i = 0 ; i &lt; len; i++) {&lt;br/&gt;        // Host: xxx.abc.com&lt;br/&gt;        if(data[i] === COLON) {&lt;br/&gt;            var key = data.toString('ascii', line_start, i).toLowerCase();&lt;br/&gt;            i++; // skip ':'&lt;br/&gt;            if(key === 'host') {&lt;br/&gt;                var value_start = i;&lt;br/&gt;                while(i &lt; len) {&lt;br/&gt;                    if(data[i] === ENTER) {&lt;br/&gt;                        return data.toString('ascii', value_start, i).trim().toLowerCase();&lt;br/&gt;                    }&lt;br/&gt;                    i++;&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        } else if(data[i] ===  ENTER &amp;&amp; data[i+1] === NEWLINE) {&lt;br/&gt;            i += 2;&lt;br/&gt;            line_start = i;&lt;br/&gt;            if(data[i] ===  ENTER &amp;&amp; data[i+1] === NEWLINE) {&lt;br/&gt;                // \r\n\r\n&lt;br/&gt;                return 'Host header not found';&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    return null;&lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;String版本&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;exports.parse = function parse(data) {&lt;br/&gt;    var lines = data.toString('ascii').split("\n");&lt;br/&gt;    var cut, name, host;&lt;br/&gt;    for (var i = 0, len = lines.length; i &lt; len; i++) {&lt;br/&gt;        cut = lines[i].split(':');&lt;br/&gt;        name = cut[0];&lt;br/&gt;        if (name === 'Host') {&lt;br/&gt;            if (cut[1] === undefined) {&lt;br/&gt;                return 'Host header not found';&lt;br/&gt;            }&lt;br/&gt;            host = cut[1].trim().toLowerCase();&lt;br/&gt;            return host;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;    return null;&lt;br/&gt;};&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;测试脚本&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;var buffer_parse = require('./string-buffer-benchmark-parse-header-buffer').parse&lt;br/&gt;  , string_parse = require('./string-buffer-benchmark-parse-header-string').parse;&lt;br/&gt;&lt;br/&gt;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');&lt;br/&gt;&lt;br/&gt;//console.log(buffer_parse(data));&lt;br/&gt;//console.log(string_parse(data), data.length);&lt;br/&gt;&lt;br/&gt;var n = 1000000;&lt;br/&gt;var start = new Date();&lt;br/&gt;for(var i = 0; i &lt; n; i++) {&lt;br/&gt;    buffer_parse(data);&lt;br/&gt;}&lt;br/&gt;console.log('buffer_parse take: ' + (new Date() - start) + ' ms');&lt;br/&gt;&lt;br/&gt;start = new Date();&lt;br/&gt;for(var i = 0; i &lt; n; i++) {&lt;br/&gt;    string_parse(data);&lt;br/&gt;}&lt;br/&gt;console.log('string_parse take: ' + (new Date() - start) + ' ms');&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;测试结果&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;$ node string-buffer-benchmark.js&lt;br/&gt;buffer_parse take: 1888 ms&lt;br/&gt;string_parse take: 4948 ms&lt;br/&gt;&lt;/code&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 -aLinux 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;code&gt;$ uname -a&lt;br/&gt;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&lt;br/&gt;&lt;br/&gt;$ cat /proc/cpuinfo&lt;br/&gt;Intel(R) Xeon(R) CPU           E5410  @ 2.33GHz&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;测试 helloworld.js&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;var http = require('http');&lt;br/&gt;http.createServer(function (req, res) {&lt;br/&gt;  res.writeHead(200, {'Content-Type': 'text/plain'});&lt;br/&gt;  res.end('Hello World\n');&lt;br/&gt;}).listen(1337, "127.0.0.1");&lt;br/&gt;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;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;http_load 压测命令&lt;/strong&gt;&lt;/p&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;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;测试结果: fetches/sec&lt;/strong&gt;&lt;/p&gt;&lt;script type="text/javascript" src="https://www.google.com/jsapi"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;google.load("visualization", "1", {packages:["corechart"]});google.setOnLoadCallback(function() {  var datas = [    ['0', 8157, null, 7490, null, 7130],    ['1', 8240, null, 7975, 9347, 7136],    ['2', 8138, 8127, 7965, 9200, 7410],    ['3', 8070, 7931, 7930, 8999, 7500],    ['4', 8111, null, 7981, 9000, 7488],    ['5', 8060, 8073, 7960, 8880, 7480],    ['6', 8046, 6995, 7931, 7815, 7525],    ['7', 7791, 7098, 7916, 7871, null],    ['8', null, 7071, 6588, 7810, null],    ['9', null, 7259, 7606, null, null],    ['10', null, 8200, 7600, null, null],    ['11', null, null, 7558, null, null],    ['12', null, null, 7510, null, null]  ];  var versions = ['v0.6.x', 'v0.5.x', 'v0.4.x', 'v0.3.x', 'v0.2.x'];  drawChart(versions, datas);});function drawChart(versions, datas) {  var data = new google.visualization.DataTable();  data.addColumn('string', 'Version');  for (var i = 0; i &lt; versions.length; i++) {    data.addColumn('number', versions[i] + ' QPS');  }  data.addRows(datas);  var options = {    width: 800, height: 500,    title: '"Hello world" benchmark in Nodejs'  };  var chart = new google.visualization.LineChart(document.getElementById('chart_div'));  chart.draw(data, options);}&lt;/script&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;code&gt;http_simple.js /bytes/1024  5461 r/s    6263 r/s&lt;br/&gt;io.js read                  19.75 mB/s  26.63 mB/s&lt;br/&gt;io.js write                 21.60 mB/s  17.40 mB/s&lt;br/&gt;startup.js                  74.7 ms     49.6 ms&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;v0.4.12 (windows: Cygwin)   v0.6.0 (windows)&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;http_simple.js /bytes/1024  3858 r/s    5823 r/s&lt;br/&gt;io.js read                  12.41 mB/s  26.51 mB/s&lt;br/&gt;io.js write                 12.61 mB/s  33.58 mB/s&lt;br/&gt;startup.js                  152.81 ms   52.04 ms&lt;br/&gt;&lt;/code&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;code&gt;7675.8 fetches/sec, 92109.6 bytes/sec&lt;br/&gt;msecs/connect: 0.050985 mean, 1.047 max, 0.02 min&lt;br/&gt;msecs/first-response: 12.9343 mean, 47.329 max, 2.926 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.7&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7790.79 fetches/sec, 93489.5 bytes/sec&lt;br/&gt;msecs/connect: 0.052154 mean, 0.716 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.7397 mean, 41.609 max, 5.318 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.6&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8046.29 fetches/sec, 96555.5 bytes/sec&lt;br/&gt;msecs/connect: 0.0517639 mean, 0.396 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.3359 mean, 36.495 max, 4.808 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.5&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8060.28 fetches/sec, 96723.4 bytes/sec&lt;br/&gt;msecs/connect: 0.0518643 mean, 0.702 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.3109 mean, 35.02 max, 4.762 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.4&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8111 fetches/sec, 97332 bytes/sec&lt;br/&gt;msecs/connect: 0.051521 mean, 1.847 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.2351 mean, 49.227 max, 1.847 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8070 fetches/sec, 96840 bytes/sec&lt;br/&gt;msecs/connect: 0.0517654 mean, 0.502 max, 0.02 min&lt;br/&gt;msecs/first-response: 12.2967 mean, 51.886 max, 5.151 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.2&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8137.79 fetches/sec, 97653.5 bytes/sec&lt;br/&gt;msecs/connect: 0.0515829 mean, 0.642 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.1961 mean, 42.128 max, 3.111 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.1&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8239.6 fetches/sec, 98875.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0530447 mean, 0.439 max, 0.022 min&lt;br/&gt;msecs/first-response: 12.0422 mean, 32.93 max, 1.846 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.6.0&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8157.38 fetches/sec, 97888.5 bytes/sec&lt;br/&gt;msecs/connect: 0.0512865 mean, 0.741 max, 0.022 min&lt;br/&gt;msecs/first-response: 12.1661 mean, 46.023 max, 4.57 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.10&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8200 fetches/sec, 98400 bytes/sec&lt;br/&gt;msecs/connect: 0.0517871 mean, 0.508 max, 0.024 min&lt;br/&gt;msecs/first-response: 12.0963 mean, 34.816 max, 4.831 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.9&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7258.88 fetches/sec, 87106.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0521661 mean, 0.667 max, 0.022 min&lt;br/&gt;msecs/first-response: 13.6817 mean, 49.23 max, 3.31 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.8&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7070.8 fetches/sec, 84849.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0523142 mean, 0.517 max, 0.022 min&lt;br/&gt;msecs/first-response: 14.0466 mean, 39.545 max, 6.215 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.7&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7097.59 fetches/sec, 85171.1 bytes/sec&lt;br/&gt;msecs/connect: 0.0526457 mean, 0.586 max, 0.024 min&lt;br/&gt;msecs/first-response: 13.9935 mean, 44.333 max, 5.604 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.6&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;6995.6 fetches/sec, 83947.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0525126 mean, 0.413 max, 0.022 min&lt;br/&gt;msecs/first-response: 14.1971 mean, 37.55 max, 6.123 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.5&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8073.3 fetches/sec, 96879.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0509257 mean, 0.41 max, 0.02 min&lt;br/&gt;msecs/first-response: 12.2924 mean, 44.222 max, 4.323 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.4&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;出现编译错误:&lt;/p&gt;&lt;code&gt;/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc&lt;br/&gt;/home/admin/pkgs/node-v0.5.4/build/default/deps/uv/uv.a(eio.o): In function `eio__sync_file_range':&lt;br/&gt;/home/admin/pkgs/node-v0.5.4/build/default/deps/uv/src/eio/eio.c:1083: undefined reference to `sync_file_range'&lt;br/&gt;collect2: ld returned 1 exit status&lt;br/&gt;Waf: Leaving directory `/home/admin/pkgs/node-v0.5.4/build'&lt;br/&gt;Build failed:  -&gt; task failed (err #1): &lt;br/&gt;    {task: cxx_link node_main_5.o,node_5.o,node_buffer_5.o,node_javascript_5.o,&lt;br/&gt;    node_extensions_5.o,node_http_parser_5.o,node_constants_5.o,node_file_5.o,&lt;br/&gt;    node_script_5.o,node_os_5.o,node_dtrace_5.o,node_string_5.o,timer_wrap_5.o,&lt;br/&gt;    handle_wrap_5.o,stream_wrap_5.o,tcp_wrap_5.o,pipe_wrap_5.o,cares_wrap_5.o,&lt;br/&gt;    stdio_wrap_5.o,process_wrap_5.o,node_cares_5.o,node_net_5.o,&lt;br/&gt;    node_signal_watcher_5.o,node_stat_watcher_5.o,node_io_watcher_5.o,&lt;br/&gt;    node_stdio_5.o,node_child_process_5.o,node_timer_5.o,platform_linux_5.o,&lt;br/&gt;    node_crypto_5.o,http_parser_3.o -&gt; node}&lt;br/&gt;make: *** [program] Error 1&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7931.39 fetches/sec, 95176.7 bytes/sec&lt;br/&gt;msecs/connect: 0.0520728 mean, 0.701 max, 0.024 min&lt;br/&gt;msecs/first-response: 12.5109 mean, 45.553 max, 5.302 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.5.2&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8126.8 fetches/sec, 97521.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0513291 mean, 2.476 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.2076 mean, 38.541 max, 1.328 min&lt;br/&gt;&lt;/code&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;code&gt;7510 fetches/sec, 90120 bytes/sec&lt;br/&gt;msecs/connect: 0.0540341 mean, 0.631 max, 0.023 min&lt;br/&gt;msecs/first-response: 13.2113 mean, 47.364 max, 3.807 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.11&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7557.79 fetches/sec, 90693.5 bytes/sec&lt;br/&gt;msecs/connect: 0.0553164 mean, 0.467 max, 0.025 min&lt;br/&gt;msecs/first-response: 13.13 mean, 44.789 max, 2.899 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.10&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7600 fetches/sec, 91200 bytes/sec&lt;br/&gt;msecs/connect: 0.0534043 mean, 0.367 max, 0.022 min&lt;br/&gt;msecs/first-response: 13.0584 mean, 53.123 max, 4.559 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.9&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7605.7 fetches/sec, 91268.4 bytes/sec&lt;br/&gt;msecs/connect: 0.0539834 mean, 0.379 max, 0.02 min&lt;br/&gt;msecs/first-response: 13.0469 mean, 46.833 max, 5.299 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.8&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;6587.9 fetches/sec, 79054.8 bytes/sec&lt;br/&gt;msecs/connect: 0.0512022 mean, 0.499 max, 0.021 min&lt;br/&gt;msecs/first-response: 15.0846 mean, 49.04 max, 4.448 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.7&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7916.1 fetches/sec, 94993.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0516686 mean, 1.629 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.5375 mean, 43.116 max, 5.695 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.6&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7930.88 fetches/sec, 95170.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0517224 mean, 0.704 max, 0.022 min&lt;br/&gt;msecs/first-response: 12.5125 mean, 42.465 max, 5.519 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.5&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7960 fetches/sec, 95520 bytes/sec&lt;br/&gt;msecs/connect: 0.0522368 mean, 0.674 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.4676 mean, 43.185 max, 5.598 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.4&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7981.4 fetches/sec, 95776.8 bytes/sec&lt;br/&gt;msecs/connect: 0.0511981 mean, 0.729 max, 0.02 min&lt;br/&gt;msecs/first-response: 12.4255 mean, 51.829 max, 5.506 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7929.9 fetches/sec, 95158.8 bytes/sec&lt;br/&gt;msecs/connect: 0.0510949 mean, 0.833 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.5189 mean, 51.677 max, 5.02 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.2&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7965.19 fetches/sec, 95582.3 bytes/sec&lt;br/&gt;msecs/connect: 0.0526699 mean, 0.864 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.4563 mean, 42.695 max, 3.897 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.1&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7975.19 fetches/sec, 95702.3 bytes/sec&lt;br/&gt;msecs/connect: 0.0527306 mean, 1.418 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.4361 mean, 47.871 max, 0.767 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.4.0&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7490 fetches/sec, 89880 bytes/sec&lt;br/&gt;msecs/connect: 0.051049 mean, 0.691 max, 0.021 min&lt;br/&gt;msecs/first-response: 13.255 mean, 51.421 max, 5.735 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.8&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7810 fetches/sec, 93720 bytes/sec&lt;br/&gt;msecs/connect: 0.0514884 mean, 0.581 max, 0.02 min&lt;br/&gt;msecs/first-response: 12.7136 mean, 43.613 max, 5.42 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.7&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7870.99 fetches/sec, 94451.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0527374 mean, 0.453 max, 0.022 min&lt;br/&gt;msecs/first-response: 12.6068 mean, 37.022 max, 5.835 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.6&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7814.89 fetches/sec, 93778.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0522743 mean, 0.719 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.6983 mean, 37.436 max, 5.748 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.5&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8879.97 fetches/sec, 106560 bytes/sec&lt;br/&gt;msecs/connect: 0.0571404 mean, 0.753 max, 0.022 min&lt;br/&gt;msecs/first-response: 11.1496 mean, 46.028 max, 4.842 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.4&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;9000 fetches/sec, 108000 bytes/sec&lt;br/&gt;msecs/connect: 0.0566353 mean, 0.633 max, 0.023 min&lt;br/&gt;msecs/first-response: 11.0017 mean, 46.633 max, 5.126 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8999.29 fetches/sec, 107992 bytes/sec&lt;br/&gt;msecs/connect: 0.0569282 mean, 0.583 max, 0.022 min&lt;br/&gt;msecs/first-response: 11.0035 mean, 43.218 max, 5.112 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.2&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;9200 fetches/sec, 110400 bytes/sec&lt;br/&gt;msecs/connect: 0.0582272 mean, 0.709 max, 0.023 min&lt;br/&gt;msecs/first-response: 10.7557 mean, 32.685 max, 5.059 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.3.1&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;9347.3 fetches/sec, 112168 bytes/sec&lt;br/&gt;msecs/connect: 0.0564677 mean, 0.974 max, 0.022 min&lt;br/&gt;msecs/first-response: 10.592 mean, 38.921 max, 4.77 min&lt;br/&gt;&lt;/code&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;code&gt;7524.9 fetches/sec, 90298.7 bytes/sec&lt;br/&gt;msecs/connect: 0.0581787 mean, 0.649 max, 0.02 min&lt;br/&gt;msecs/first-response: 13.1609 mean, 105.413 max, 5.191 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.5&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7480.6 fetches/sec, 89767.1 bytes/sec&lt;br/&gt;msecs/connect: 0.0589546 mean, 0.693 max, 0.023 min&lt;br/&gt;msecs/first-response: 13.2442 mean, 94.122 max, 5.744 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.4&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7488.59 fetches/sec, 89863.1 bytes/sec&lt;br/&gt;msecs/connect: 0.0595586 mean, 0.428 max, 0.023 min&lt;br/&gt;msecs/first-response: 13.2342 mean, 95.229 max, 5.88 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.3&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7500 fetches/sec, 89999.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0591254 mean, 0.57 max, 0.024 min&lt;br/&gt;msecs/first-response: 13.1974 mean, 94.721 max, 5.728 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.2&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7409.99 fetches/sec, 88919.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0597531 mean, 0.558 max, 0.021 min&lt;br/&gt;msecs/first-response: 13.3618 mean, 102.09 max, 5.846 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.1&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7135.9 fetches/sec, 85630.8 bytes/sec&lt;br/&gt;msecs/connect: 0.0565066 mean, 0.59 max, 0.023 min&lt;br/&gt;msecs/first-response: 13.8999 mean, 100.855 max, 5.703 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.2.0&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7129.99 fetches/sec, 85559.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0565618 mean, 0.356 max, 0.02 min&lt;br/&gt;msecs/first-response: 13.915 mean, 100.048 max, 4.344 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.104&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7640 fetches/sec, 91679.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0577092 mean, 0.564 max, 0.024 min&lt;br/&gt;msecs/first-response: 12.9695 mean, 90.161 max, 3.711 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.103&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7538.38 fetches/sec, 90460.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0577052 mean, 1.091 max, 0.021 min&lt;br/&gt;msecs/first-response: 13.1506 mean, 92.522 max, 5.378 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.102&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7537.49 fetches/sec, 90449.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0583015 mean, 0.396 max, 0.024 min&lt;br/&gt;msecs/first-response: 13.1514 mean, 103.188 max, 5.577 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.101&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7673.9 fetches/sec, 92086.8 bytes/sec&lt;br/&gt;msecs/connect: 0.0588679 mean, 0.767 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.9082 mean, 99.924 max, 4.776 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.100&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7040 fetches/sec, 84480 bytes/sec&lt;br/&gt;msecs/connect: 0.0557378 mean, 0.592 max, 0.022 min&lt;br/&gt;msecs/first-response: 14.0982 mean, 107.368 max, 6.009 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.99&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7279.99 fetches/sec, 87359.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0555776 mean, 0.569 max, 0.022 min&lt;br/&gt;msecs/first-response: 13.6292 mean, 93.241 max, 5.983 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.98&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7210.6 fetches/sec, 86527.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0552844 mean, 0.379 max, 0.02 min&lt;br/&gt;msecs/first-response: 13.7576 mean, 94.502 max, 5.685 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.97&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7339.55 fetches/sec, 88074.6 bytes/sec&lt;br/&gt;msecs/connect: 0.057371 mean, 0.802 max, 0.022 min&lt;br/&gt;msecs/first-response: 13.5052 mean, 89.268 max, 5.326 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.96&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7269.6 fetches/sec, 87235.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0566584 mean, 0.573 max, 0.021 min&lt;br/&gt;msecs/first-response: 13.6483 mean, 60.543 max, 4.296 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.95&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7209.65 fetches/sec, 86515.9 bytes/sec&lt;br/&gt;msecs/connect: 0.0565087 mean, 0.529 max, 0.024 min&lt;br/&gt;msecs/first-response: 13.7617 mean, 60.438 max, 4.418 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.94&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7063.39 fetches/sec, 84760.6 bytes/sec&lt;br/&gt;msecs/connect: 0.0547156 mean, 0.66 max, 0.022 min&lt;br/&gt;msecs/first-response: 14.0522 mean, 130.751 max, 4.987 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.93&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;7930.6 fetches/sec, 95167.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0587932 mean, 0.61 max, 0.023 min&lt;br/&gt;msecs/first-response: 12.4891 mean, 77.833 max, 3.689 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.92&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8019.99 fetches/sec, 96239.9 bytes/sec&lt;br/&gt;msecs/connect: 0.058158 mean, 0.718 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.354 mean, 79.033 max, 3.423 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.91&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8560.98 fetches/sec, 102732 bytes/sec&lt;br/&gt;msecs/connect: 0.0596777 mean, 0.471 max, 0.022 min&lt;br/&gt;msecs/first-response: 11.522 mean, 71.727 max, 3.235 min&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;node0.1.90&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;8146.18 fetches/sec, 97754.2 bytes/sec&lt;br/&gt;msecs/connect: 0.0595273 mean, 0.826 max, 0.021 min&lt;br/&gt;msecs/first-response: 12.1531 mean, 223.064 max, 3.189 min&lt;br/&gt;&lt;/code&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;code&gt;hello.js:8: TypeError: Object #&lt;an Object&gt; has no method 'createServer'&lt;br/&gt;http.createServer(function (req, res) {&lt;br/&gt;     ^&lt;br/&gt;&lt;/code&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 "http://npm.hacknodejs.com/" 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;code&gt;$ npm --registry "&lt;a href='http://npm.hacknodejs.com/'&gt;http://npm.hacknodejs.com/&lt;/a&gt;" install express&lt;br/&gt;&lt;/code&gt;&lt;p&gt;或下面的命令：&lt;/p&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;br/&gt;&lt;/code&gt;&lt;p&gt;如果你想把它设成默认的资源库，可用下面的命令：&lt;/p&gt;&lt;code&gt;$ npm config set registry "&lt;a href='http://npm.hacknodejs.com/'&gt;http://npm.hacknodejs.com/&lt;/a&gt;"&lt;br/&gt;&lt;/code&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;code&gt;$ sudo apt-get install mongodb&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;CentOS&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;# install mongodb&lt;br/&gt;# 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;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;Node Modules Install&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;$ sudo npm install connect ejs weibo metaweblog mongoskin github-flavored-markdown&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;Install NodeBlog&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;$ git clone git://github.com/fengmk2/nodeblog.git&lt;br/&gt;$ cd nodeblog&lt;br/&gt;$ cp config.js.tpl config.js&lt;br/&gt;$ node server.js&lt;br/&gt;&lt;/code&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;code&gt;function Foo() {};&lt;br/&gt;&lt;br/&gt;var foo = new Foo();&lt;br/&gt;foo.__proto__ === Foo.prototype;&lt;br/&gt;foo.__proto__.__proto__ === Object.prototype;&lt;br/&gt;foo.__proto__.__proto__.__proto__ === null;&lt;br/&gt;foo.prototype === undefined;&lt;br/&gt;foo.toString === Object.prototype.toString;&lt;br/&gt;&lt;/code&gt;&lt;p&gt;&lt;strong&gt;原形继承后的实例化解析：&lt;/strong&gt;&lt;/p&gt;&lt;code&gt;function Bar() {};&lt;br/&gt;&lt;br/&gt;Bar.prototype.__proto__ = Foo.prototype;&lt;br/&gt;&lt;br/&gt;var bar = new Bar();&lt;br/&gt;bar.__proto__ === Bar.prototype;&lt;br/&gt;bar.__proto__.__proto__ === Foo.prototype;&lt;br/&gt;bar.__proto__.__proto__.__proto__ === Object.prototype;&lt;br/&gt;bar.__proto__.__proto__.__proto__.__proto__ === null;&lt;br/&gt;bar.prototype === undefined;&lt;br/&gt;bar.toString === Object.prototype.toString&lt;br/&gt;&lt;/code&gt;&lt;p&gt;对象bar，访问toString，整个链式过程如下：&lt;/p&gt;&lt;code&gt;bar.toString &lt;br/&gt;    || bar.__proto__.toString &lt;br/&gt;    || bar.__proto__.__proto__.toString&lt;br/&gt;    || bar.__proto__.__proto__.__proto__.toString &lt;br/&gt;&lt;br/&gt;bar.toString === Object.prototype.toString&lt;br/&gt;&lt;/code&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;code&gt;Foo.__proto__ === Function.prototype;&lt;br/&gt;Foo.__proto__.__proto__ === Object.prototype;&lt;br/&gt;Foo.prototype.__proto__ === Object.prototype;&lt;br/&gt;// 神奇竟然不等于 Object.prototype.toString&lt;br/&gt;Foo.toString === Object.toString;&lt;br/&gt;Foo.prototype.toString === Object.prototype.toString;&lt;br/&gt;&lt;/code&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 =&gt; nodeblog.cnodejs.net ，只需在package.json增加一行即可： "customHost": "nae.nodeblog.org"</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;code&gt;"customHost": "nae.nodeblog.org"&lt;br/&gt;&lt;/code&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>
