<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web Development Notes</title>
	<atom:link href="http://blog.eood.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.eood.cn</link>
	<description>PHP, Drupal, Erlang, MySQL, Java, MongoDB, Linux, vim, ssh, screen etc</description>
	<lastBuildDate>Thu, 19 Apr 2012 08:16:19 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>WEB 开发中的当前目录调试工具及 PHP5.4 cli-server</title>
		<link>http://blog.eood.cn/debug_current_folder</link>
		<comments>http://blog.eood.cn/debug_current_folder#comments</comments>
		<pubDate>Thu, 19 Apr 2012 08:12:31 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Life & Work]]></category>
		<category><![CDATA[CLI]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/debug_current_folder</guid>
		<description><![CDATA[在当前目录启动 WEB 调试服务器在开发的时候非常有用。 比较新的开发框架都提供了这个功能。比如： Rails 可以在目录下执行 rails s Django 可以执行 django-admin.py runserver 8888 Nodejs 可以执行 node app.js 这意味着: 你可以在多个不同的目录同时开发不同的程序，随时启动调试这些 App 不必在开发环境下装庞大的 Apache 之类的 Server，也不必经常修改配置 但是 PHP 很久以来不太重视命令行工具，虽然有些流行的 PHP 框架自己增加了 很多 PHP 脚本工具，但是 命令行调试需要启动 WEB Server，就需要 PHP 的 支持了。 PHP5.4 增加了这个功能: cli-server 在任意程序目录下，执行 php -S localhost:8888 就可以调试当前目录下的程序了。 调试前端开发 前端开发更是需要在任意目录下启动 WEB server 调试前端样式 python -m SimpleHTTPServer 8888 [...]]]></description>
			<content:encoded><![CDATA[<p>在当前目录启动 WEB 调试服务器在开发的时候非常有用。</p>
<p>比较新的开发框架都提供了这个功能。比如：</p>
<ul>
<li>Rails 可以在目录下执行 rails s</li>
<li>Django 可以执行 django-admin.py runserver 8888</li>
<li>Nodejs 可以执行 node app.js</li>
</ul>
<p>这意味着:</p>
<ol>
<li>你可以在多个不同的目录同时开发不同的程序，随时启动调试这些 App</li>
<li>不必在开发环境下装庞大的 Apache 之类的 Server，也不必经常修改配置</li>
</ol>
<p>但是 PHP 很久以来不太重视命令行工具，虽然有些流行的 PHP 框架自己增加了<br />
很多 PHP 脚本工具，但是 命令行调试需要启动 WEB Server，就需要 PHP 的<br />
支持了。</p>
<h3>PHP5.4 增加了这个功能: cli-server</h3>
<p>在任意程序目录下，执行</p>
<pre>
php -S localhost:8888
</pre>
<p>就可以调试当前目录下的程序了。</p>
<h3>调试前端开发</h3>
<p>前端开发更是需要在任意目录下启动 WEB server 调试前端样式</p>
<pre>
python -m SimpleHTTPServer 8888
</pre>
<p>它的好处是可以列出目录结构。</p>
<h3>调试收发信件</h3>
<pre>
python -m smtpd -n -c DebuggingServer localhost:8888
</pre>
<h3>最后</h3>
<p><strong>在 UBUNTU 下安装 PHP5.4</strong></p>
<pre>
sudo add-apt-repository ppa:ondrej/php5
sudo apt-get update
sudo apt-get install php5 libapache2-mod-php5
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/debug_current_folder/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何写 GIT 的提交注释</title>
		<link>http://blog.eood.cn/wirte_git_commit_message</link>
		<comments>http://blog.eood.cn/wirte_git_commit_message#comments</comments>
		<pubDate>Tue, 17 Apr 2012 03:49:31 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Life & Work]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/git_commit_message</guid>
		<description><![CDATA[一般情况下，提交 GIT 时的注释可以分成几类，可以用几个动词开始： Added ( 新加入的需求 ) Fixed ( 修复 bug ) Changed ( 完成的任务 ) Updated ( 完成的任务，或者由于第三方模块变化而做的变化 ) 尽量将注释缩减为一句话，不要包含详细的内容。 假如有 Issues 系统，其中可以包含 Issue 的 ID。比如：Issue #123456 包含作者的信息。比如 by Bruce 完整例子： git commit -m 'Issue #[issue number] by [username]: [Short summary of the change].']]></description>
			<content:encoded><![CDATA[<p>一般情况下，提交 GIT 时的注释可以分成几类，可以用几个动词开始：</p>
<ul>
<li>Added ( 新加入的需求 )</li>
<li>Fixed ( 修复 bug )</li>
<li>Changed ( 完成的任务 )</li>
<li>Updated ( 完成的任务，或者由于第三方模块变化而做的变化 )</li>
</ul>
<p>尽量将注释缩减为一句话，不要包含详细的内容。</p>
<p>假如有 Issues 系统，其中可以包含 Issue 的 ID。比如：Issue #123456</p>
<p>包含作者的信息。比如 by Bruce</p>
<p><strong>完整例子：</strong></p>
<pre>git commit -m 'Issue #[issue number] by [username]: [Short summary of the change].'</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/wirte_git_commit_message/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 的一些不太常用的特性</title>
		<link>http://blog.eood.cn/php_features</link>
		<comments>http://blog.eood.cn/php_features#comments</comments>
		<pubDate>Fri, 06 Apr 2012 08:18:26 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/php_features</guid>
		<description><![CDATA[1. 变量函数名，可以用字符串拼接函数名 function aa($str) { echo $str; } $function = "aa"; $function('Hello'); // OR call_user_func($function, $param); 2. 列出所有函数，判断某个函数是否存在 get_defined_functions() function_exist() 3. 接受 PUT 请求，PHP REST 必备 parse_str(file_get_contents('php://input'), $put_vars); 4. 从字符串解析时间 echo date('Y-m-d', strtotime('-1 month ago')); 5. DEBUG 查看调用 backtrace $backtrace = debug_backtrace(); var_export($backtrace[0]) die(); 6. 交互式命令行，命令行执行 PHP php -a 和 php -r &#8216;echo &#8220;hello&#8221;;&#8217; 更多请看 [...]]]></description>
			<content:encoded><![CDATA[<p><b>1. 变量函数名，可以用字符串拼接函数名</b></p>
<pre class="prettyprint lang-php">
function aa($str) {
  echo $str;
}

$function = "aa";

$function('Hello');

// OR

call_user_func($function, $param);
</pre>
<p><b>2. 列出所有函数，判断某个函数是否存在</b></p>
<pre class="prettyprint lang-php">
get_defined_functions()

function_exist()
</pre>
<p><b>3. 接受 PUT 请求，PHP REST 必备</b></p>
<pre class="prettyprint lang-php">
parse_str(file_get_contents('php://input'), $put_vars);
</pre>
<p><b>4. 从字符串解析时间</b></p>
<pre class="prettyprint lang-php">
echo date('Y-m-d', strtotime('-1 month ago'));
</pre>
<p><b>5. DEBUG 查看调用 backtrace</b></p>
<pre class="prettyprint lang-php">

$backtrace = debug_backtrace();
var_export($backtrace[0])
die();
</pre>
<p><b>6. 交互式命令行，命令行执行 PHP</b></p>
<p>php -a 和 php -r &#8216;echo &#8220;hello&#8221;;&#8217;</p>
<p>更多请看 php -h</p>
<p><b>7. 内存使用检测</b></p>
<pre class="prettyprint lang-php">
memory_get_peak_usage()

memory_get_usage()
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/php_features/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Easiest way to make an asynchronous PHP function</title>
		<link>http://blog.eood.cn/easiest-way-to-make-an-asynchronous-php-function</link>
		<comments>http://blog.eood.cn/easiest-way-to-make-an-asynchronous-php-function#comments</comments>
		<pubDate>Thu, 29 Mar 2012 10:49:00 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Async]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/easiest-way-to-make-an-asynchronous-php-function</guid>
		<description><![CDATA[Asynchronous PHP function can be make via message queue. It is easy to make a message queue based on Redis or MongoDB. And there are also many message queue libraries to select. But for the lite widght process finishing in several seconds, there is a simper way to do this. Fork a background process to [...]]]></description>
			<content:encoded><![CDATA[<p>Asynchronous PHP function can be make via message queue. It is easy to make a message queue based on Redis or MongoDB. And there are also many message queue libraries to select. But for the lite widght process finishing in several seconds, there is a simper way to do this. Fork a background process to do the long time job and return immeditally.</p>
<p>In the web page, call the background process like this:</p>
<pre class="prettyprint lang-php">
$job_id = time();
shell exec("php job.php PASSWORD '".$job_id."' >> job.log &#038;");
echo 'Job received.';
</pre>
<p>In the job processing script:</p>
<pre class="prettyprint lang-php">
if($argv[1] !='PASSWORD') return;
sleep(10);
echo 'Done.';
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/easiest-way-to-make-an-asynchronous-php-function/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL 调优和使用必读</title>
		<link>http://blog.eood.cn/mysql</link>
		<comments>http://blog.eood.cn/mysql#comments</comments>
		<pubDate>Sat, 25 Feb 2012 08:34:20 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimize]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/?p=1804</guid>
		<description><![CDATA[MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快，PHP， Ruby, Python, Java 各有特点，虽然 NOSQL 最近越來越多的被提到，但是相信大部分架构师还是会选择 MYSQL 来做数据存储。 MYSQL 如此方便和稳定，以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的，比如，不要写过于消耗资源的 SQL 语句。但是除此之外，在整个系统上仍然有很多可以优化的地方。 1. 选择合适的存储引擎: INNODB 除非你的数据表使用来做只读或者全文检索 (相信现在提到全文检索，没人会用 MYSQL 了)，你应该默认选择 INNODB 。 你自己在测试的时候可能会发现 MYISAM 比 INNODB 速度快，这是因为： MYISAM 只缓存索引，而 INNODB 缓存数据和索引，MYISAM 不支持事务。但是 如果你使用 innodb_flush_log_at_trx_commit = 2 可以获得接近的读取性能 (相差百倍) 。 1.1 如何将现有的 MYISAM 数据库转换为 INNODB: mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快，PHP， Ruby, Python, Java 各有特点，虽然 NOSQL 最近越來越多的被提到，但是相信大部分架构师还是会选择 MYSQL 来做数据存储。</p>
<p>MYSQL 如此方便和稳定，以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的，比如，不要写过于消耗资源的 SQL 语句。但是除此之外，在整个系统上仍然有很多可以优化的地方。</p>
<h2>1. 选择合适的存储引擎: INNODB</h2>
<p>除非你的数据表使用来做只读或者全文检索 (相信现在提到全文检索，没人会用 MYSQL 了)，你应该默认选择 INNODB 。</p>
<p>你自己在测试的时候可能会发现 MYISAM 比 INNODB 速度快，这是因为： MYISAM 只缓存索引，而 INNODB 缓存数据和索引，MYISAM 不支持事务。但是 如果你使用 <strong><span style="color: #ff0000;">innodb_flush_log_at_trx_commit = 2</span> </strong>可以获得接近的读取性能 (相差百倍) 。</p>
<h3>1.1 如何将现有的 MYISAM 数据库转换为 INNODB:</h3>
<pre escaped="true">mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;" &gt; alter_table.sql
perl -p -i -e 's/(search_[a-z_]+ ENGINE=)INNODB/\1MYISAM/g' alter_table.sql
mysql -u [USER_NAME] -p [DATABASE_NAME] &lt; alter_table.sql</pre>
<h3>1.2 为每个表分别创建 INNODB FILE：</h3>
<p>innodb_file_per_table=1</p>
<p>这样可以保证 ibdata1 文件不会过大，失去控制。尤其是在执行 <span style="color: #ff0000;">mysqlcheck -o &#8211;all-databases</span> 的时候。</p>
<h2>2. 保证从内存中读取数据，讲数据保存在内存中</h2>
<h3>2.1 <span style="color: #ff0000;">足够大的 innodb_buffer_pool_size</span></h3>
<p>推荐将数据完全保存在 innodb_buffer_pool_size ，即按存储量规划 innodb_buffer_pool_size 的容量。这样你可以完全从内存中读取数据，最大限度减少磁盘操作。</p>
<h4>2.1.1 如何确定 innodb_buffer_pool_size 足够大，数据是从内存读取而不是硬盘？</h4>
<p>方法 1</p>
<pre escaped="true">mysql&gt; SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| Innodb_buffer_pool_pages_data    | 129037 |
| Innodb_buffer_pool_pages_dirty   | 362    |
| Innodb_buffer_pool_pages_flushed | 9998   |
| Innodb_buffer_pool_pages_free    | 0      |  !!!!!!!!
| Innodb_buffer_pool_pages_misc    | 2035   |
| Innodb_buffer_pool_pages_total   | 131072 |
+----------------------------------+--------+
6 rows in set (0.00 sec)</pre>
<p>发现 Innodb_buffer_pool_pages_free 为 0，则说明 buffer pool 已经被用光，需要增大 innodb_buffer_pool_size</p>
<p>INNODB 的其他几个参数</p>
<p>innodb_additional_mem_pool_size = 1/200 of buffer_pool<br />
innodb_max_dirty_pages_pct 80%</p>
<p>方法 2<br />
或者用 iostat -d -x -k 1 命令，查看硬盘的操作。</p>
<h4>2.1.2 服务器上是否有足够内存用来规划</h4>
<p>执行 <span style="color: #ff0000;">echo 1 &gt; /proc/sys/vm/drop_caches</span> 清除操作系统的文件缓存，可以看到真正的内存使用量。</p>
<h3>2.2 数据预热</h3>
<p>默认情况，只有某条数据被读取一次，才会缓存在 innodb_buffer_pool。所以，数据库刚刚启动，需要进行数据预热，将磁盘上的所有数据缓存到内存中。数据预热可以提高读取速度。</p>
<p>对于 InnoDB 数据库，可以用以下方法，进行数据预热:<br />
1. 将以下脚本保存为 MakeSelectQueriesToLoad.sql</p>
<pre escaped="true">SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,
    ' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
    FROM
    (
        SELECT
            engine,table_schema db,table_name tb,
            index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
        FROM
        (
            SELECT
                B.engine,A.table_schema,A.table_name,
                A.index_name,A.column_name,A.seq_in_index
            FROM
                information_schema.statistics A INNER JOIN
                (
                    SELECT engine,table_schema,table_name
                    FROM information_schema.tables WHERE
                    engine='InnoDB'
                ) B USING (table_schema,table_name)
            WHERE B.table_schema NOT IN ('information_schema','mysql')
            ORDER BY table_schema,table_name,index_name,seq_in_index
        ) A
        GROUP BY table_schema,table_name,index_name
    ) AA
ORDER BY db,tb
;</pre>
<p>2. 执行</p>
<p>mysql -uroot -AN &lt; /root/MakeSelectQueriesToLoad.sql &gt; /root/SelectQueriesToLoad.sql</p>
<p>3. 每次重启数据库，或者整库备份前需要预热的时候执行：</p>
<p>mysql -uroot &lt; /root/SelectQueriesToLoad.sql &gt; /dev/null 2&gt;&amp;1</p>
<h3>2.3 不要让数据存到 SWAP 中</h3>
<p>如果是专用 MYSQL 服务器，可以禁用 SWAP，如果是共享服务器，确定 innodb_buffer_pool_size 足够大。或者使用固定的内存空间做缓存，使用 memlock 指令。</p>
<h2>3. 定期优化重建数据库</h2>
<p>mysqlcheck -o &#8211;all-databases 会让 ibdata1 不断增大，真正的优化只有重建数据表结构：</p>
<pre escaped="true" lang="sql" line="1">CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;</pre>
<h2>4. 减少磁盘写入操作</h2>
<h3>4.1 使用足够大的写入缓存</h3>
<p>innodb_log_file_size</p>
<p>但是需要注意如果用 1G 的 innodb_log_file_size ，假如服务器当机，需要 10 分钟来恢复。</p>
<p>推荐 innodb_log_file_size = 0.25 innodb_buffer_pool_size</p>
<h3>4.2 innodb_flush_log_at_trx_commit</h3>
<p>这个选项和写磁盘操作密切相关：</p>
<p>innodb_flush_log_at_trx_commit = 1 则每次修改写入磁盘<br />
<span style="color: #ff0000;"> innodb_flush_log_at_trx_commit = 0/2 每秒写入磁盘</span></p>
<p>如果你的应用不涉及很高的安全性 (金融系统)，或者基础架构足够安全，或者 事务都很小，都可以用<br />
0 或者 2 来降低磁盘操作。</p>
<h3>4.3 避免双写入缓冲</h3>
<p>innodb_flush_method=O_DIRECT</p>
<h2>5. 提高磁盘读写速度</h2>
<p><span style="color: #ff0000;">RAID0</span> 尤其是在使用 EC2 这种虚拟磁盘 (EBS) 的时候，使用软<span style="color: #ff0000;"> RAID0 </span>非常重要。</p>
<h2>6. 充分使用索引</h2>
<h3>6.1 查看现有表结构和索引</h3>
<p>SHOW CREATE TABLE db1.tb1\G</p>
<h3>6.2 添加必要的索引</h3>
<p>索引是提高查询速度的唯一方法，比如搜索引擎用的倒排索引是一样的原理。<br />
索引的添加需要根据查询来确定，比如通过慢查询日志或者查询日志,或者通过 EXPLAIN 命令分析查询。</p>
<p>ADD UNIQUE INDEX<br />
ADD INDEX</p>
<h4>6.2.1 比如，优化用户验证表：</h4>
<p>添加索引</p>
<p>ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);<br />
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);</p>
<p>每次重启服务器进行数据预热</p>
<p>echo &#8220;select username,password from users;&#8221; &gt; /var/lib/mysql/upcache.sql</p>
<p>添加启动脚本到 my.cnf</p>
<p>[mysqld]<br />
init-file=/var/lib/mysql/upcache.sql</p>
<h3>6.2.2 使用自动加索引的框架或者自动拆分表结构的框架</h3>
<p>比如，Rails 这样的框架，会自动添加索引，Drupal 这样的框架会自动拆分表结构。会在你开发的初期指明正确的方向。所以，经验不太丰富的人一开始就追求从 0 开始构建，实际是不好的做法。</p>
<h2>7. 分析查询日志和慢查询日志</h2>
<p>记录所有查询，这在用 ORM 系统或者生成查询语句的系统很有用。<br />
log=/var/log/mysql.log<br />
注意不要在生产环境用，否则会占满你的磁盘空间。</p>
<p>记录执行时间超过 1 秒的查询<br />
long_query_time=1<br />
log-slow-queries=/var/log/mysql/log-slow-queries.log</p>
<h2>8. 激进的方法，使用内存磁盘</h2>
<p>现在基础设施的可靠性已经非常高了，比如 EC2 几乎不用担心服务器硬件当机。而且内存实在是便宜，很容易买到几十G内存的服务器，可以用内存磁盘，定期备份到磁盘。</p>
<p>将 MYSQL 目录迁移到 4G 的内存磁盘</p>
<pre escaped="true" lang="sql" line="1">mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/
mv /var/lib/mysql /mnt/ramdisk/mysql
ln -s /tmp/ramdisk/mysql /var/lib/mysql
chown mysql:mysql mysql</pre>
<h2>9. 用 NOSQL 的方式使用 MYSQL</h2>
<p>B-TREE 仍然是最高效的索引之一，所有 MYSQL 仍然不会过时。<br />
用 HandlerSocket 跳过 MYSQL 的 SQL 解析层，MYSQL 就真正变成了 NOSQL。</p>
<h2>10. 其他</h2>
<ul>
<li>单条查询最后增加 LIMIT 1，停止全表扫描。</li>
<li>将非&#8221;索引&#8221;数据分离，比如将大篇文章分离存储，不影响其他自动查询。</li>
<li>不用 MYSQL 内置的函数，因为内置函数不会建立查询缓存。</li>
<li>PHP 的建立连接速度非常快，所有可以不用连接池，否则可能会造成超过连接数。当然不用连接池 PHP 程序也可能将</li>
<li>连接数占满比如用了 @ignore_user_abort(TRUE);</li>
<li>使用 IP 而不是域名做数据库路径，避免 DNS 解析问题</li>
</ul>
<h2>11. 结束</h2>
<p>你会发现优化后，数据库的性能提高几倍到几百倍。所以 MYSQL 基本还是可以适用大部分场景的应用的。优化现有系统的成本比系统重构或者迁移到 NOSQL 低很多。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/mysql/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Add X-Runtime header to your Drupal application</title>
		<link>http://blog.eood.cn/add-x-runtime-header-to-your-drupal-application</link>
		<comments>http://blog.eood.cn/add-x-runtime-header-to-your-drupal-application#comments</comments>
		<pubDate>Sun, 12 Feb 2012 01:48:16 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Development Story]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[X-Runtime]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/?p=1792</guid>
		<description><![CDATA[Measure the time spend on executing the script is important. You can add a X-runtime header to the HTTP headers with the information of executing time. This is how I do in Drupal 6/7: function YourModule_init() { timer_start('x-runtime'); } function YourModule_exit() { $x_runtime = timer_stop('x-runtime'); $x_runtime = $x_runtime['time']; //drupal_set_header("X-runtime: $x_runtime ms"); //D6 drupal_add_http_header('X-Runtime', "$x_runtime ms", [...]]]></description>
			<content:encoded><![CDATA[<p>Measure the time spend on executing the script is important. You can add a X-runtime header to the HTTP headers with the information of executing time. This is how I do in Drupal 6/7:</p>
<p><img class="aligncenter size-full wp-image-1795" title="x-runtime" src="http://blog.eood.cn/wp-content/uploads/2012/02/x-runtime.png" alt="" width="477" height="216" /></p>
<pre escaped="true" lang="php" line="1">function YourModule_init() {
  timer_start('x-runtime');
}
function YourModule_exit() {
  $x_runtime = timer_stop('x-runtime');
  $x_runtime = $x_runtime['time'];
  //drupal_set_header("X-runtime: $x_runtime ms"); //D6
  drupal_add_http_header('X-Runtime', "$x_runtime ms", TRUE); //D7
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/add-x-runtime-header-to-your-drupal-application/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>2011 Review</title>
		<link>http://blog.eood.cn/2011-review</link>
		<comments>http://blog.eood.cn/2011-review#comments</comments>
		<pubDate>Sat, 31 Dec 2011 12:49:49 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Life & Work]]></category>
		<category><![CDATA[My Thinking]]></category>
		<category><![CDATA[2011]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[总结]]></category>
		<category><![CDATA[目标]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/?p=1784</guid>
		<description><![CDATA[又到一个年底，回顾一年的变化和目标，幸好有1年前的总结和目标 2010 Summary And 2011 Goals ，可以让我在一年后还能回顾一下以前的计划和现在的完成情况。 关于博客的总结 本年度博客数量有所降低，原因是下半年从主要开发 A 切换到主要开发 B 。而 B 的核心是人工智能，由于领域过于窄，不方便分享一些通用的心得；另一方面写博客的时间变少，有几篇总结性的博客想放到新的一年吧。以下是有一点价值的博文： 关于 Drupal What is new in Drupal 7 Drupal Views PHP Code Validator [Drupal] 错误执行MYSQL命令之后如何挽救 Add a custom tab menu in profile edit page in Drupal 7 Why Drupal is not popular in China Drupal 仍然是快速原型，甚至是生产系统的首选。当然现在更多的人推崇 Rails 或者 Django， NodeJS [...]]]></description>
			<content:encoded><![CDATA[<p>又到一个年底，回顾一年的变化和目标，幸好有1年前的总结和目标 <a title="Permanent Link to 2010 Summary And 2011 Goals" rel="bookmark" href="http://blog.eood.cn/2011_goals_2010_summary">2010 Summary And 2011 Goals</a> ，可以让我在一年后还能回顾一下以前的计划和现在的完成情况。<br />
<img title="m_s_2011" src="http://blog.eood.cn/wp-content/uploads/2011/12/m_s_2011.jpg" alt="" width="425" height="203" /></p>
<h2>关于博客的总结</h2>
<p>本年度博客数量有所降低，原因是下半年从主要开发 A 切换到主要开发 B 。而 B 的核心是人工智能，由于领域过于窄，不方便分享一些通用的心得；另一方面写博客的时间变少，有几篇总结性的博客想放到新的一年吧。以下是有一点价值的博文：</p>
<p><strong>关于 Drupal</strong></p>
<ol>
<li><a title="Permanent Link to What is new in Drupal 7" rel="bookmark" href="http://blog.eood.cn/what-is-new-in-drupal-7">What is new in Drupal 7</a></li>
<li><a title="Permanent Link to Drupal Views PHP Code Validator" rel="bookmark" href="http://blog.eood.cn/drupal-views-php-code-validator">Drupal Views PHP Code Validator</a></li>
<li><a title="Permanent Link to [Drupal] 错误执行MYSQL命令之后如何挽救" rel="bookmark" href="http://blog.eood.cn/drupal_mysql_tips">[Drupal] 错误执行MYSQL命令之后如何挽救</a></li>
<li><a title="Permanent Link to Add a custom tab menu in profile edit page in Drupal 7" rel="bookmark" href="http://blog.eood.cn/add-a-custom-tab-menu-in-profile-edit-page-in-drupal-7-2">Add a custom tab menu in profile edit page in Drupal 7</a></li>
<li><a title="Permanent Link to Why Drupal is not popular in China" rel="bookmark" href="http://blog.eood.cn/why-drupal-is-not-popular-in-china">Why Drupal is not popular in China</a></li>
</ol>
<p>Drupal 仍然是快速原型，甚至是生产系统的首选。当然现在更多的人推崇 Rails 或者 Django， NodeJS ，个人也在 2011 对这 3 中技术堆栈进行了认真比较，发现 Drupal 仍然是不二选择。当然 Drupal 只能用在 WEB 的 UI 界面和业务逻辑部分，对性能要求高的地方或者通讯层可以考虑用 NodeJS 或者 Erlang 。假如能自己定主要开发框架，我倒是愿意尝试 Django ，它看起来还是比较完善的。</p>
<p><strong>关于前端开发</strong></p>
<ol>
<li><a title="Permanent Link to JSON JSON-RPC 和 JSONP" rel="bookmark" href="http://blog.eood.cn/json-json-rpc-%e5%92%8c-jsonp">JSON JSON-RPC 和 JSONP</a></li>
<li><a title="Permanent Link to JSONP Library In Plain JavaScript With Timeout" rel="bookmark" href="http://blog.eood.cn/jsonp-library-in-plain-javascript-with-timeout">JSONP Library In Plain JavaScript With Timeout</a></li>
<li><a href="http://blog.eood.cn/backbone">Backbone JS框架指南</a></li>
<li><a title="Permanent Link to CoffeeScript – 未来可以取代 JavaScript 的语言" rel="bookmark" href="http://blog.eood.cn/coffeescript-2">CoffeeScript – 未来可以取代 JavaScript 的语言</a></li>
<li><a title="Permanent Link to Javascript 设计模式入门" rel="bookmark" href="http://blog.eood.cn/javascript-design-patterns">Javascript 设计模式入门</a></li>
</ol>
<p>前端部分这年尝试了基于 Backbone 开发，发现它也是个学习曲线比较高的东西，但是一旦熟悉还是很通用的。CoffeeScript 建议不要用，无论如何还是离不开 JS 。2011 前端部分研究比较多，发现 WEB 开发最靠谱的还是纯文本+超链接的方式，将计算分散到客户端是比较不靠谱的想法，尝试各种花哨的前端技术也是不靠谱的，毕竟<strong>用户体验</strong>才是王道。</p>
<p><strong>关于 WEB 架构</strong></p>
<ol>
<li><a title="Permanent Link to 谈一谈 Scalability 和可扩展的架构设计模式" rel="bookmark" href="http://blog.eood.cn/scalable_system_patterns">谈一谈 Scalability 和可扩展的架构设计模式</a></li>
<li><a title="Permanent Link to WEB Development Rookie – NodeJS" rel="bookmark" href="http://blog.eood.cn/web-development-rookie-nodejs">WEB Development Rookie – NodeJS</a></li>
<li><a title="Permanent Link to Enter Django Development" rel="bookmark" href="http://blog.eood.cn/enter_django_python_development">Enter Django Development</a></li>
<li><a title="Permanent Link to 细数跨语言通信的选择" rel="bookmark" href="http://blog.eood.cn/cross_language_communication">细数跨语言通信的选择</a></li>
</ol>
<p>NodeJS 可能是 2011 最热门的话题，目前已经在项目 B 用到了生产环境。</p>
<p><strong>其他</strong></p>
<ol>
<li><a title="Permanent Link to What tools and software used for development" rel="bookmark" href="http://blog.eood.cn/what-tools-and-software-used-fro-development">What tools and software used for development</a></li>
<li><a title="Permanent Link to XML 文件处理利器 VTD-XML" rel="bookmark" href="http://blog.eood.cn/vtd-xml_xml_parser">XML 文件处理利器 VTD-XML</a></li>
<li><a title="Permanent Link to Encrypt your files or content on cloud services" rel="bookmark" href="http://blog.eood.cn/encrypt-your-files-or-content-on-cloud-services">Encrypt your files or content on cloud services</a></li>
<li><a title="Permanent Link to 如何停止Windows服务器上僵死进程" rel="bookmark" href="http://blog.eood.cn/kill_zombie_process">如何停止Windows服务器上僵死进程</a></li>
</ol>
<h2>2011的个人计划完成</h2>
<ol>
<li>深入IOS , Android开发 <strong><span style="color: #ff0000;">未完成</span></strong></li>
<li>关注产品的网络营销 <span style="color: #ff0000;"><strong><span style="color: #008000;">完成</span></strong></span></li>
<li>项目1,2,3的开发和营销的0突破 <strong><span style="color: #ff0000;">未完成</span></strong></li>
<li><span style="text-decoration: line-through;">Improve Algorithm and Linux C DELETED</span></li>
<li>继续关注 Marketing, Social information, BI <span style="color: #ff0000;"><strong>完成</strong></span></li>
<li><span style="text-decoration: line-through;">换一个拥有大数据量的环境? DELETED</span></li>
</ol>
<p>Oh, shit!  好像 2011 并没有按计划进行，但是仍然很充实，有很多收获。</p>
<h2>2012个人目标</h2>
<ol>
<li>进入 <span style="color: #ff0000;"><strong>IOS</strong> </span>, <span style="color: #008000;"><strong>Android </strong></span>开发</li>
<li>继续关注市场和营销趋势</li>
<li>项目方向改进和营销</li>
<li>构建基于人工智能的解析器</li>
<li>写更多质量比较好的总结博客</li>
<li>尝试<span style="text-decoration: underline;"><strong>新</strong></span>的模式</li>
</ol>
<p><a href="http://blog.eood.cn/backbone"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/2011-review/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Drupal is not popular in China</title>
		<link>http://blog.eood.cn/why-drupal-is-not-popular-in-china</link>
		<comments>http://blog.eood.cn/why-drupal-is-not-popular-in-china#comments</comments>
		<pubDate>Fri, 30 Dec 2011 05:35:11 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[Architecture]]></category>
		<category><![CDATA[My Thinking]]></category>
		<category><![CDATA[China]]></category>
		<category><![CDATA[Drupal]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/why-drupal-is-not-popular-in-china</guid>
		<description><![CDATA[I have developed based on Drupal stack for more than 4 years. In my opinion: The learning curve of Drupal is higher than other stacks, since It&#8217;s flexibility.&#160; Server environment in China is very poor. Drupal can works well at least installed in VPS. The requirement is very simple in China, you can just install [...]]]></description>
			<content:encoded><![CDATA[</p>
<p>I have developed based on Drupal stack for more than 4 years. In my opinion:</p>
<ul>
<li>The learning curve of Drupal is higher than other stacks, since It&#8217;s flexibility.&nbsp;</li>
<li>Server environment in China is very poor. Drupal can works well at least installed in VPS.</li>
<li>The requirement is very simple in China, you can just install something like DZ forum or DEDE cms to accomplish the goal. Since the feature requirement is not comes from business requirement, they just want a simple web page to display there company profile etc.</li>
<li>Lots of teams want to build there own framework. (I disagree with this idea, it is wasting resource and time.)</li>
<li>The traffic of the website in China almost 100x larger than EU or US, but the value of the traffic is very low. So you need do more performance optimization for the Drupal site in China.</li>
<li>Most developers in China works on a Windows PC. So no drush, varnish, memcache, cron, etc.</li>
<li>Lots of developers installed Drupal and thought that Drupal is a blog :)</li>
</ul>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/why-drupal-is-not-popular-in-china/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google 彩蛋大全</title>
		<link>http://blog.eood.cn/google_tricks</link>
		<comments>http://blog.eood.cn/google_tricks#comments</comments>
		<pubDate>Tue, 20 Dec 2011 03:20:06 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[IT Reviews]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/google_tricks</guid>
		<description><![CDATA[在 Google 的搜索框输入以下词就能看到彩蛋效果： Let it snow = 在页面上下雪和下雾 Askew = 屏幕会向右倾斜 Tilt = 也是屏幕向右倾斜 Recursion = 循环提问你是不是要找 Recursion Hannukah = 出现一排小星星 Google 重力下沉效果:&#160;http://mrdoob.com/projects/chromeexperiments/google_gravity/ &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p><strong>在 Google 的搜索框输入以下词就能看到彩蛋效果：</strong></p>
<p>Let it snow = 在页面上下雪和下雾</p>
<p>Askew = 屏幕会向右倾斜</p>
<p>Tilt = 也是屏幕向右倾斜</p>
<p>Recursion = 循环提问你是不是要找 Recursion</p>
<p>Hannukah = 出现一排小星星</p>
<p>Google 重力下沉效果:&nbsp;<a href="http://mrdoob.com/projects/chromeexperiments/google_gravity/">http://mrdoob.com/projects/chromeexperiments/google_gravity/</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/google_tricks/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>比较酷的书签 (Bookmarklet) 应用</title>
		<link>http://blog.eood.cn/bookmarklet_apps</link>
		<comments>http://blog.eood.cn/bookmarklet_apps#comments</comments>
		<pubDate>Fri, 16 Dec 2011 05:51:01 +0000</pubDate>
		<dc:creator>Bruce Dou</dc:creator>
				<category><![CDATA[IT Reviews]]></category>
		<category><![CDATA[Appliaction]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://blog.eood.cn/bookmarklet_apps</guid>
		<description><![CDATA[// < ![CDATA[ google_ad_client = "ca-pub-5744751471423663"; /* blog */ google_ad_slot = "4169011132"; google_ad_width = 468; google_ad_height = 60; // ]]&#62; 书签应用是一种通过在书签中嵌入可以运行的 Javascript 代码，通过调用远程资源文件，对正在浏览的网页进行入侵式修改的应用。 书签应用的安装，一般是把一个链接拖到收藏夹，有的个人应用可能需要注册之后操作。 Cc2Me 是结合 Gmail 使用的网页笔记应用。可以收藏当前浏览 URL ，并且可以在当前 URL 记笔记，还支持 Tag ，通过 Gmail 的 Filter 管理。 YumTab 是一个自动收藏所浏览网页的应用，特点是可以自动提取图片和摘要，以便以后查阅。 Mobile Pref 是移动客户端的网页辅助开发工具，集成了 Firebug Lite DOM Monster Storager YSlow SpriteMe CSSess Zoompf 等工具。 PrintWhatYouLike 可以让你随意修改所浏览网页，添加删除内容，手工修改成所需要的打印版本。 Delicious [...]]]></description>
			<content:encoded><![CDATA[<p><script type="text/javascript">// < ![CDATA[
 google_ad_client = "ca-pub-5744751471423663"; /* blog */ google_ad_slot = "4169011132"; google_ad_width = 468; google_ad_height = 60;
// ]]&gt;</script><br />
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script></p>
<p>书签应用是一种通过在书签中嵌入可以运行的 Javascript 代码，通过调用远程资源文件，对正在浏览的网页进行入侵式修改的应用。</p>
<p>书签应用的安装，一般是把一个链接拖到收藏夹，有的个人应用可能需要注册之后操作。</p>
<p><a title="CC2ME" href="http://cctome.com/" target="_blank">Cc2Me</a> 是结合 Gmail 使用的网页笔记应用。可以收藏当前浏览 URL ，并且可以在当前 URL 记笔记，还支持 Tag ，通过 Gmail 的 Filter 管理。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://blog.eood.cn/wp-content/uploads/2011/12/amazingly_powerful.png" alt="" width="340" height="180" /></p>
<p><a href="https://yumtab.com/">YumTab</a> 是一个自动收藏所浏览网页的应用，特点是可以自动提取图片和摘要，以便以后查阅。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="https://yumtab.com/static/images/logo6b.png" alt="" width="120" height="40" /></p>
<p><a href="http://stevesouders.com/mobileperf/mobileperfbkm.php">Mobile Pref</a> 是移动客户端的网页辅助开发工具，集成了 <span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">Firebug Lite</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">DOM Monster</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">Storager</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">YSlow</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">SpriteMe</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">CSSess</a> </span><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><a style="outline-width: 0px; outline-style: initial; outline-color: initial; font-size: 12px; vertical-align: baseline; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: transparent; color: #0000ee; text-decoration: underline; background-position: initial initial; background-repeat: initial initial; padding: 0px; margin: 0px; border: 0px initial initial;">Zoompf</a> 等工具。</span></p>
<p><span style="font-family: Arial; font-size: 12px; line-height: 16px;"><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://stevesouders.com/mobileperf/mobileperfbkm.png" alt="" width="134" height="264" /></span></p>
<p><a href="http://www.printwhatyoulike.com/" target="_blank">PrintWhatYouLike</a> 可以让你随意修改所浏览网页，添加删除内容，手工修改成所需要的打印版本。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://www.printwhatyoulike.com/site/img/demotop_h3.png" alt="" width="396" height="254" /></p>
<p><a href="http://delicious.com/help/bookmarklets" target="_blank">Delicious</a> 鼎鼎大名的网址收藏网站。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://delicious.com/static/img/button_bookmarklet.png" alt="" width="162" height="44" /></p>
<p><a href="https://dev.twitter.com/docs/share-bookmarklet" target="_self">Twitter</a> 一键分享内容到 Twitter</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://blog.eood.cn/wp-content/uploads/2011/12/share-bookmarklet-flow.png" alt="" width="357" height="297" /></p>
<p><a href="http://readitlaterlist.com/bookmarklets" target="_blank">ReaditLater</a> 网页收藏工具</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://readitlaterlist.com/i/bookmarklets.png" alt="" width="243" height="216" /></p>
<p><a href="http://citebite.com/bookmarklet" target="_blank">CiteBite</a> 在线注释和网址收藏工具。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://blog.eood.cn/wp-content/uploads/2011/12/bookmarklet.gif" alt="" width="305" height="100" /></p>
<p><a href="http://www.readability.com/bookmarklets" target="_blank">Readability</a> 网页内容提取工具，可以自动移除广告和其他无关内容。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://du3itj18e4z0b.cloudfront.net/b90819/images/publish_learn.png" alt="" width="394" height="356" /></p>
<p><a href="http://www.addthis.com/tools/bookmarklets" target="_blank">AddThis</a> 很流行嵌入式的兴趣分享按钮的Bookmarklet</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://www.addthis.com/cms-content/images/tools/at_bookmarklet.jpg" alt="" width="522" height="260" /></p>
<p><a href="http://posterous.com/help/bookmarklet" target="_blank">Posterous</a> 博客类应用，通过 Bookmarklet 快捷的发布博客。</p>
<p><img style="display: block; margin-left: auto; margin-right: auto; border: 3px solid black;" src="http://blog.eood.cn/wp-content/uploads/2011/12/illustration1.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eood.cn/bookmarklet_apps/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.469 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-21 01:01:29 -->

