<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5882547617466196949</id><updated>2011-07-08T07:02:11.376+08:00</updated><category term='创意'/><category term='Physics'/><category term='VirtualBox'/><category term='宗教'/><category term='正则表达式'/><category term='Zend Framework'/><category term='How to'/><category term='Wine'/><category term='历史'/><category term='Blogger'/><category term='Science'/><category term='系统设置'/><category term='C++'/><category term='PHP'/><category term='Firefox'/><category term='Evolution'/><category term='ubuntu 安装升级'/><category term='视频'/><category term='输入法'/><category term='设计模式'/><category term='折纸'/><category term='eclipse'/><category term='Apache'/><category term='Linux 命令'/><category term='JavaScript'/><category term='算法'/><category term='crontab'/><category term='数据结构'/><title type='text'>Data Planet</title><subtitle type='html'>Open source, Open your eyes, Free your mind</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-3446330376785426794</id><published>2010-08-03T17:42:00.002+08:00</published><updated>2010-08-27T10:30:40.042+08:00</updated><title type='text'>Linux 下网络支付</title><content type='html'>很久没更新了。。&lt;br /&gt;系统：Ubuntu 10.04。&lt;br /&gt;  今天在当当上定了一套书&lt;a href="http://product.dangdang.com/product.aspx?product_id=20843555"&gt;《&lt;span class="black000"&gt;HOW &amp;amp; WHY美国经典少儿百科知识全书&lt;/span&gt;》&lt;/a&gt;，通用&lt;a href="https://www.99bill.com/"&gt;快钱&lt;/a&gt;使用&lt;a href="http://www.gdb.com.cn/"&gt;广发信用卡&lt;/a&gt;支付的，相当方便。当然广发网银使用软键盘输入密码稍微有点不方便，但比起 Linux 下无法使用的国内多数的银行好多了。嗯，这是我第一次完全在 Linux 下完成全部流程的支付。&lt;br /&gt;  其实支付宝做的也相当的不错了，不过最后的支付密码需要使用控件，否则无法完成支付。据说有 Linux 下 Firefox 的插件，但貌似要手动安装。。&lt;br /&gt; 另外据说浦发银行也是支持 Linux 的。&lt;br /&gt;&lt;br /&gt;支持 Linux 的银行：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;浦东发展银行&lt;/li&gt;&lt;li&gt;&lt;strike&gt;广东发展银行&lt;/strike&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;欢迎补充。&lt;br /&gt;&lt;br /&gt;--- 8月27日更新 ---&lt;br /&gt;广发自8月20日开始更改了登录方式，采用了落后的安全控件方式，将Linux用户拒之门外。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-3446330376785426794?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/3446330376785426794/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=3446330376785426794' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3446330376785426794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3446330376785426794'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2010/08/linux.html' title='Linux 下网络支付'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-5958150252996830397</id><published>2009-10-19T17:17:00.002+08:00</published><updated>2009-10-19T17:19:51.340+08:00</updated><title type='text'>PPS Totem 插件的 PPA 源</title><content type='html'>&lt;code&gt;deb http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main&lt;br /&gt;deb-src http://ppa.launchpad.net/portis25/ppa/ubuntu karmic main&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;加入源后只需&lt;br /&gt;&lt;code&gt;sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 27F5B2C1B3EAC8D9&lt;br /&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install totem-pps&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-5958150252996830397?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/5958150252996830397/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=5958150252996830397' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5958150252996830397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5958150252996830397'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2009/10/pps-totem-ppa.html' title='PPS Totem 插件的 PPA 源'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-114772581396075538</id><published>2009-04-25T18:25:00.000+08:00</published><updated>2009-04-25T18:27:07.384+08:00</updated><title type='text'>crontab 随机更换壁纸</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;cron 两句话搞定：&lt;br /&gt;&lt;br /&gt;&lt;code&gt;*/10 * * * * export $(xargs -n 1 -0 echo &amp;lt;/proc/$(pidof x-session-manager)/environ | grep -Z DBUS_SESSION_BUS_ADDRESS=) &amp;amp;&amp;amp; /usr/bin/gconftool-2 -t string -s /desktop/gnome/background/picture_filename "`find $HOME/Picture/Wallpapers/ -name \*.jpg -o -name \*.png | sort -R | tail -n 1`"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;说明：&lt;br /&gt;export $(xargs -n 1 -0 echo &amp;lt;/proc/$(pidof x-session-manager)/environ | grep -Z DBUS_SESSION_BUS_ADDRESS=) 是为了解决 cron 中无法使用 gconftool 的问题，因为 gconftool-2 需要使用 dbus。&lt;br /&gt;gconftool-2 -t string -s /desktop/gnome/background/picture_filename "value" 更改壁纸&lt;br /&gt;`find $HOME/Picture/Wallpapers/ -name \*.jpg -o -name \*.png | sort -R | tail -n 1` 在 当前用户的主目录/Picture/Wallpapers/ 下查找 jpg 和 png 文件，然后使用 sort 随机排序，tail -n 1 返回最后一条数据。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-114772581396075538?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/114772581396075538/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=114772581396075538' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/114772581396075538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/114772581396075538'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2009/04/crontab_25.html' title='crontab 随机更换壁纸'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-5580534433384571219</id><published>2009-01-15T22:59:00.002+08:00</published><updated>2009-01-15T23:03:37.615+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='正则表达式'/><title type='text'>Regular Expression (POSIX Extended)</title><content type='html'>Regular Expression (POSIX Extended)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dataplanet.blogspot.com/2006/12/blog-post.html"&gt;模式的数学定义&lt;/a&gt;&lt;br /&gt;&lt;b&gt;给定集合U,若存在映射F,使得S=F(U)并且S⊆U,则映射F就是集合U上的一个模式(pattern).&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;介绍&lt;br /&gt;&lt;br /&gt;注：从 PHP 5.3 开始这个扩展将被废弃，使用性能更好功能更多的 PCRE (Perl-Compatible Regular Expressions) 扩展。&lt;br /&gt;PCRE 包括非贪婪模式、断言、条件子模式等不被 POSIX-extended 规则表达式 支持的语法。&lt;br /&gt;&lt;br /&gt;规则表达式用于复杂的字符串操作。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Metacharacters&lt;br /&gt;&lt;br /&gt;扩展规则表达式使用的元字符：&lt;br /&gt;|   ^   $   .   *   +   ?   (   )   ［  ］  {   }   \&lt;br /&gt;&lt;br /&gt;.      代表任何单个的字符&lt;br /&gt;^    不匹配任何字符，用来表示一行的开始。比如 ^A 匹配以 A 字母开头的行。&lt;br /&gt;$     不匹配任何字符，用来表示一行的结束。比如 A$ 匹配以 A 字母结尾的行。&lt;br /&gt;|      或者表达式&lt;br /&gt;*     任何个数&lt;br /&gt;+    至少一个&lt;br /&gt;?     最多一个&lt;br /&gt;&lt;p&gt;()    表达式分组&lt;/p&gt;[]    范围，字符集&lt;br /&gt;{}  计数器&lt;br /&gt;\     转义&lt;br /&gt;&lt;br /&gt;[括号表达式]&lt;br /&gt;[]方括号表示单个字符或者集合。比如 [ABC] 匹配任何含 A 或者 B 或者 C 的字符串。&lt;br /&gt;如果方括号中首个字符是 ^ 的话，那么这个表达式表示匹配除了这些指定字符以外的字符串。比如 [^ABC] 将匹配不包含 A 和 B 和 C 的字符串。&lt;br /&gt;&lt;br /&gt;[:digit:]          数字 0-9, 等价于 [0-9]&lt;br /&gt;[:xdigit:]        16 进制数字 0-9, A-F, a-f.&lt;br /&gt;[:alnum:]       字符数字 0-9 或者 A-Z 或者 a-z. 等价于 [0-9A-Za-z]&lt;br /&gt;[:alpha:]        字母 A-Z 或者 a-z. 等价于 [A-Za-z]&lt;br /&gt;[:blank:]        空白字符，仅空格、TAB.&lt;br /&gt;[:punct:]        Punctuation symbols . , " ' ? ! ; :&lt;br /&gt;[:print:]         任何可打印字符，包括空格.&lt;br /&gt;[:space:]       任何空白字符，空格、tab、换行、回车等.&lt;br /&gt;[:graph:]       可打印字符，除了空格&lt;br /&gt;[:upper:]       大写字母 A-Z. [A-Z]&lt;br /&gt;[:lower:]       小写字母 a-z. [a-z]&lt;br /&gt;[:cntrl:]         任何非打印字符&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;()                表达式组，会被捕获。&lt;br /&gt;(.*)             0个任何个数任何字符。也就是任何东西!&lt;br /&gt;(n|a)           n 或者 a&lt;br /&gt;[^a-z]        除了 a 到 z 之外的任何字符串.&lt;br /&gt;                  注： ^ 作为例外规则仅在 [] 中的第一个字符位置的时候才起作用。不能用做 ^undesired_word 或者 ^(undesired_phrase)。&lt;br /&gt;&lt;br /&gt;[_4^a-zA-Z]    下划线、4、^、大小写字母。这个 ^ 作为普通字符。&lt;br /&gt;&lt;br /&gt;n?        0 或者 1 个，最多一个 {0,1}&lt;br /&gt;n*        0 或者更多，任意个 {0,}&lt;br /&gt;n+        1 个或更多，至少一个 {1,}&lt;br /&gt;n{2}      指定个数&lt;br /&gt;n{2,}     不少于指定个数&lt;br /&gt;n{2,4}    在指定的个数之间&lt;br /&gt;&lt;br /&gt;?, +, * and the {} 这些计数参数不仅可用于单个字符，也适用于组()和范围[].&lt;br /&gt;&lt;br /&gt;例子:&lt;br /&gt;&lt;br /&gt;^.{2}[a-z]{1,2}_?[0-9]*([1-6]|[a-f])[^1-9]{2}a+$&lt;br /&gt;&lt;br /&gt;表示:&lt;br /&gt;&lt;br /&gt;^.{2}             = 任何 2 个字符开头,&lt;br /&gt;[a-z]{1,2}      = 跟着 1 个或者 2 个小写字母,&lt;br /&gt;_?                   = 然后是可选的下划线,&lt;br /&gt;[0-9]*             = 接着可能有数字,&lt;br /&gt;([1-6]|[a-f])    = 接着 1 到 6 之间的数字或者 a 到 f 之间的字母,&lt;br /&gt;[^1-9]{2}      = 然后是非 1-9 的字符,&lt;br /&gt;a+a+$                = 最后是至少一个 a 结尾.&lt;br /&gt;nbsp;               = 最后是至少一个 a 结尾.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;正则替换 ereg_replace():&lt;br /&gt;&lt;br /&gt;如果使用了分组，那么替换规则中可以用 \数字 引用这些分组。&lt;br /&gt;0 代表匹配到的整个字符串。1-9 按顺序代表分组，最多表示 9 个。&lt;br /&gt;分组可以嵌套，顺序按照开括号顺序计算（也就是最外层的在前）。&lt;br /&gt;&lt;br /&gt;例子：&lt;br /&gt;给 URI 字符串加上超链接：&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;[[:alpha:]]+://[^&amp;lt;&amp;gt;[:space:]]+[[:alnum:]/]&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;， &lt;/span&gt;&lt;span style="color: rgb(221, 0, 0);"&gt;&amp;lt;a href="\0"&amp;gt;\0&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 119, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;匹配日期：&lt;br /&gt;([[:digit:]]{4})-[[:digit:]]{2}-[[:digit:]]{2}&lt;br /&gt;([[:digit:]]{4})-([0]?[1-9]|[1][0-2])-([0-2]?[0-9]|[3][0-1])&lt;br /&gt;&lt;br /&gt;匹配任何 标签&lt;br /&gt;&amp;lt;[^&amp;lt;&amp;gt;]*&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;man regex&lt;br /&gt;http://www.tin.org/bin/man.cgi?section=7&amp;amp;topic=regex&lt;br /&gt;http://www.mkssoftware.com/docs/man5/regexp.5.asp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-5580534433384571219?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/5580534433384571219/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=5580534433384571219' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5580534433384571219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5580534433384571219'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2009/01/regular-expression-posix-extended.html' title='Regular Expression (POSIX Extended)'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-3972265129972582331</id><published>2009-01-10T00:55:00.001+08:00</published><updated>2009-01-10T00:57:06.698+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>ScribeFire 设置 Blogger 帐号</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Windows Live Writer 写 blog 非常好用，而且可以设置 blog，这是微软出的最好的产品。&lt;br/&gt;Ubuntu下目前没有好的替代品。因此拿 Firefox 的扩展 ScribeFire 凑合用吧，不过不能修改 blog 设置。 &lt;br/&gt;ScribeFire 设置 Blogger 帐号时，默认设置会提示失败，但没有显示任何具体信息。在试了几次之后发现一尝试登录连接就被重置，应该是我朝伟大的防火墙在起效。好在 Blogger.com 还提供 https 安全连接方式访问。 在 输入 API URL 的时候把 http 改成 https 后一切正常了。&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-3972265129972582331?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/3972265129972582331/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=3972265129972582331' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3972265129972582331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3972265129972582331'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2009/01/scribefire-blogger.html' title='ScribeFire 设置 Blogger 帐号'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-8800674423613948934</id><published>2008-12-09T00:14:00.006+08:00</published><updated>2008-12-10T00:19:23.108+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VirtualBox'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>Sun xVM VirtualBox 安装和设置</title><content type='html'>&lt;p&gt;Ubuntu 软件仓库中的 VirtualBox 是开源版本，即 virtualbox-ose, 开源版本缺少一些功能，比如 USB 支持。如果不在乎是否开源可以安装非开源版本。&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;安装&lt;/h2&gt;&lt;p&gt;我们仍然通过方便的软件源安装：&lt;br /&gt;1、添加 key：&lt;br /&gt;&lt;code&gt;wget -q http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc -O- | sudo apt-key add -&lt;/code&gt;&lt;br /&gt;2、添加软件源：&lt;br /&gt;&lt;code&gt;deb http://download.virtualbox.org/virtualbox/debian intrepid non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian hardy non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian gutsy non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian dapper non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian lenny non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian etch non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian sarge non-free&lt;br /&gt;deb http://download.virtualbox.org/virtualbox/debian xandros4.0-xn non-free&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;设置&lt;/h2&gt;&lt;p&gt;1、要把当前用户加到 vboxusers 组中才能启动 virtualbox：&lt;br /&gt;系统 -&amp;gt; 系统管理 -&amp;gt; 用户和组。先解锁，然后点管理组， 选择 vboxusers 组的属性，加入 当前用户到这个组。&lt;br /&gt;或者命令帮当前用户加到 vboxusers 组：&lt;br /&gt;&lt;code&gt;sudo adduser $USER vboxusers&lt;/code&gt;&lt;br /&gt;2、使用 USB 设备：&lt;br /&gt;需要 vboxusers 用户能够存取 /dev/udev 设备权限&lt;br /&gt;让所有用户都有权限访问 usb, 但是不安全, 编辑 /etc/fstab 加上：&lt;br /&gt;&lt;code&gt;# 对所有用户开放USB设备的读写权限&lt;br /&gt;none /proc/bus/usb usbfs devmode=666 0 0&lt;/code&gt;&lt;br /&gt;更好的方法： 8.04 hardy 编辑 /etc/udev/rules.d/40-basic-permissions.rules&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# USB devices (usbfs replacement)&lt;br /&gt;SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0664", GROUP="vboxusers"&lt;br /&gt;SUBSYSTEM=="usb_device",                MODE="0664", GROUP="vboxusers"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;3、编辑 /etc/init.d/mountdevsubfs.sh&lt;br /&gt;找到 Magic to make /proc/bus/usb work，把下面几行的注释去掉&lt;br /&gt;&lt;code&gt;mkdir -p /dev/bus/usb/.usbfs&lt;br /&gt;domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644&lt;br /&gt;ln -s .usbfs/devices /dev/bus/usb/devices&lt;br /&gt;mount --rbind /dev/bus/usb /proc/bus/usb&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;重启后就可使用 usb&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;无法捕获键盘和鼠标输入, 安装 scim-bridge-client-qt&lt;br /&gt;&lt;code&gt; sudo apt-get install scim-bridge-client-qt&lt;/code&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;参考资料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.virtualbox.org/wiki/Linux_Downloads"&gt;Download VirtualBox for Linux Hosts&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-8800674423613948934?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/8800674423613948934/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=8800674423613948934' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8800674423613948934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8800674423613948934'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/12/sun-virtualbox.html' title='Sun xVM VirtualBox 安装和设置'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2584161042959551333</id><published>2008-12-08T23:58:00.005+08:00</published><updated>2008-12-09T00:21:46.834+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wine'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>IEs4Linux 安装</title><content type='html'>&lt;p&gt;&lt;/p&gt;IEs 4 Linux 使用 Wine 模拟器运行。&lt;br /&gt;1、先安装 wine, 如果没有安装， 先按 &lt;a href="http://dataplanet.blogspot.com/2008/12/wine.html"&gt;Wine 安装&lt;/a&gt; 这篇文档安装 Wine。另外需要 cabextract&lt;br /&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install wine cabextract&lt;/code&gt;&lt;br /&gt;2、下载和安装 IEs 4 Linux:&lt;br /&gt;&lt;code&gt;wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz&lt;br /&gt;tar zxvf ies4linux-latest.tar.gz&lt;br /&gt;cd ies4linux-*&lt;br /&gt;./ies4linux&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考资料:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://dataplanet.blogspot.com/2008/12/wine.html"&gt;Wine 安装&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tatanka.com.br/ies4linux/page/Installation:Ubuntu"&gt;IEs 4 Linux&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2584161042959551333?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2584161042959551333/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2584161042959551333' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2584161042959551333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2584161042959551333'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/12/ies4linux.html' title='IEs4Linux 安装'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-6951619902736288062</id><published>2008-12-08T23:33:00.004+08:00</published><updated>2008-12-09T00:22:04.070+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Wine'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>wine 安装</title><content type='html'>软件仓库中的 wine 升级比较慢，使用 wine 官方源。&lt;br /&gt;&lt;br /&gt;图形方式：&lt;br /&gt;1、打开 系统-&amp;gt; 系统管理 -&amp;gt; 软件源， 选择“第三方软件”， 按添加，加入对应版本的源：&lt;br /&gt;&lt;b&gt;Ubuntu Intrepid (8.10):&lt;/b&gt;&lt;br /&gt;&lt;code&gt;deb http://wine.budgetdedicated.com/apt intrepid main #WineHQ - Ubuntu 8.10 "Intrepid Ibex"&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Ubuntu Hardy (8.04):&lt;/b&gt;&lt;br /&gt;&lt;code&gt;deb http://wine.budgetdedicated.com/apt hardy main #WineHQ - Ubuntu 8.04 "Hardy Heron"&lt;/code&gt;&lt;br /&gt;2、下载 key: http://wine.budgetdedicated.com/apt/Scott%20Ritchie.gpg 在软件源中选择“身份验证”，按“导入密钥文件...”&lt;br /&gt;&lt;br /&gt;-------- NB 的分割线 --------&lt;br /&gt;&lt;br /&gt;命令行方式添加：&lt;br /&gt;1、导入密钥文件：&lt;br /&gt;&lt;code&gt;wget -q http://wine.budgetdedicated.com/apt/387EE263.gpg -O- | sudo apt-key add -&lt;/code&gt;&lt;br /&gt;2、添加软件源：&lt;br /&gt;&lt;b&gt;Ubuntu Intrepid (8.10):&lt;/b&gt;&lt;br /&gt;&lt;code&gt;sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/intrepid.list -O /etc/apt/sources.list.d/winehq.list&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Ubuntu Hardy (8.04):&lt;/b&gt;&lt;br /&gt;&lt;code&gt;sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/hardy.list -O /etc/apt/sources.list.d/winehq.list&lt;/code&gt;&lt;br /&gt;3、更新软件源，安装 wine：&lt;br /&gt;&lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install wine&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;参考资料：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.winehq.org/site/download-deb"&gt;Wine HQ&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-6951619902736288062?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/6951619902736288062/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=6951619902736288062' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/6951619902736288062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/6951619902736288062'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/12/wine.html' title='wine 安装'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-4494240505405099660</id><published>2008-12-02T17:43:00.003+08:00</published><updated>2008-12-02T18:01:09.150+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux 命令'/><title type='text'>sort 排序 tab 分隔的文件</title><content type='html'>sort 排序，默认空白（空格，tab）都分开字段。想要在某列上排序 tab 分隔文件，这时候空格不应该作为分隔符。&lt;br /&gt;例子文件：&lt;br /&gt;&lt;code&gt;example.txt:&lt;br /&gt;A    2    1&lt;br /&gt;B    1 0    341&lt;br /&gt;C    3    231&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;假设排列 第3字段:&lt;br /&gt;sort -k 3 -t "\t" example.txt 报错&lt;br /&gt;sort -k 3 -t ‘\t’ example.txt 报错&lt;br /&gt;sort -k 3 -t \t example.txt 没报错，可是结果不正确&lt;br /&gt;解决方法：&lt;br /&gt;&lt;code&gt;TAB=`echo -e '\t'`; sort -k 3 -t "$TAB" example.txt&lt;/code&gt;&lt;br /&gt;或者&lt;br /&gt;&lt;code&gt;sort -k 3 -t $'\t' example.txt&lt;/code&gt;&lt;br /&gt;再或者，shell 里可以输入控制字符的，按 ctrl-v, 然后 tab 键就能输入 tab 字符,汗...&lt;br /&gt;&lt;code&gt;sort -k 3 -t "[ctrl-v]+[tab]" example.txt&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-4494240505405099660?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/4494240505405099660/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=4494240505405099660' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4494240505405099660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4494240505405099660'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/12/sort-tab.html' title='sort 排序 tab 分隔的文件'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-7087706575372684663</id><published>2008-11-19T16:10:00.004+08:00</published><updated>2008-12-09T00:10:34.247+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='输入法'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>ubuntu 上安装 ibus 输入法</title><content type='html'>&lt;h2&gt;ibus 输入法的安装&lt;/h2&gt;&lt;br /&gt;deb 包安装：&lt;br /&gt;到其项目网站下载 deb 包。&lt;br /&gt;ubuntu 8.04: &lt;a href="http://archive.ubuntu.org.cn/ubuntu-cn/dists/hardy/main/binary-i386/ibus/"&gt;http://archive.ubuntu.org.cn/ubuntu-cn/dists/hardy/main/binary-i386/ibus/&lt;/a&gt;&lt;br /&gt;ubuntu 8.10: &lt;a href="http://archive.ubuntu.org.cn/ubuntu-cn/dists/intrepid/main/binary-i386/ibus/"&gt;http://archive.ubuntu.org.cn/ubuntu-cn/dists/intrepid/main/binary-i386/ibus/&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;共 3 个包， ibus 是输入法平台， ibus-pinyin 是拼音输入法， ibus-table 是五笔等其他输入法。python-dbus 是 ibus 依赖的包，ubuntu 系统中有，但版本较低，可能需要安装这个。&lt;br /&gt;依次安装 python-dbus, ibus, 和 ibus-pinyin 或者 ibus-table 即可。&lt;br /&gt;&lt;br /&gt;从软件源安装：&lt;br /&gt;加入源，ibus目前还没纳入官方源：&lt;br /&gt;deb http://ubuntu.cn99.com/ubuntu-cn/ hardy main restricted universe multiverse&lt;br /&gt;8.10 把 hardy 改为 intrepid&lt;br /&gt;&lt;br /&gt;更新源：&lt;br /&gt;&lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;然后搜索软件包&lt;br /&gt;&lt;code&gt;apt-cache search ibus |grep ^ibus&lt;br /&gt;ibus - iBus - Intelligent Input Bus for Linux / Unix OS&lt;br /&gt;ibus-pinyin - ibus-pinyin&lt;br /&gt;ibus-table - IBus-Table&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;安装 ibus：&lt;br /&gt;&lt;code&gt;sudo apt-get install ibus&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;安装输入法：&lt;br /&gt;&lt;code&gt;sudo apt-get install ibus-pinyin&lt;/code&gt;&lt;br /&gt;或者&lt;br /&gt;sudo apt-get install ibus-table&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;安装完后启用 ibus：&lt;br /&gt;&lt;code&gt;im-switch -s ibus&lt;/code&gt;&lt;br /&gt;注销用户，重新登录。&lt;br /&gt;&lt;br /&gt;ibus 图标会出现在通知栏。这时候按 ctrl+空格会提示没有安装任何输入法。&lt;br /&gt;&lt;br /&gt;右键--&amp;gt;首选项（或运行 ibus-setup）调出选项，在“输入法引擎”里启用需要的输入法即可。&lt;br /&gt;&lt;br /&gt;项目主页： &lt;a href="http://code.google.com/p/ibus/"&gt;http://code.google.com/p/ibus/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-7087706575372684663?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/7087706575372684663/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=7087706575372684663' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7087706575372684663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7087706575372684663'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/ubuntu-ibus.html' title='ubuntu 上安装 ibus 输入法'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2685884666325102188</id><published>2008-11-17T00:46:00.002+08:00</published><updated>2008-12-09T00:10:01.928+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='系统设置'/><category scheme='http://www.blogger.com/atom/ns#' term='crontab'/><title type='text'>crontab + rhythmbox 定时播放音乐</title><content type='html'>直接用 rhythmbox 是不行的，因为需要图形，cron 仅设置了少数几个变量。&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# 每天7点整运行，设置显示设备，启动 rhythmbox, 等待加载完成，开始播放&lt;br /&gt;0 7 * * 1-5 export DISPLAY=:0 &amp;amp;&amp;amp; rhythmbox-client &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; rhythmbox-client --play&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2685884666325102188?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2685884666325102188/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2685884666325102188' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2685884666325102188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2685884666325102188'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/crontab-rhythmbox.html' title='crontab + rhythmbox 定时播放音乐'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-1983611005268638014</id><published>2008-11-14T11:24:00.005+08:00</published><updated>2008-11-16T23:58:16.064+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='系统设置'/><category scheme='http://www.blogger.com/atom/ns#' term='crontab'/><title type='text'>Crontab 详解</title><content type='html'>主要信息来源于 &lt;code&gt;info crontab&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;crontab 要做的事就是：“在指定日期指定时间运行指定的命令”。每个用户都有自己的 crontab, crontab 里的每个命令都以 crontab 拥有者的身份运行。&lt;br /&gt;&lt;br /&gt;空行、前导空格和制表符(tab)都会被忽略。 首个非空白字符是 # 的行是注释。注意：和命令同一行的 # 不会当作注释，会当成命令的一部分。在设置环境变量的行也是同样的。也就是说，&lt;b&gt;注释是单独成行的&lt;/b&gt;。&lt;br /&gt;&lt;br /&gt;crontab 里有效的行可以是 设置环境变量 或者 cron 命令。环境变量设置类似于: &lt;code&gt;name = value&lt;/code&gt; “=” 两边的空格可选（这点和 bash 不同， bash 中变量赋值=号两边不能有空格）。如果想要在值中保留前后空格，可以用单引号或者双引号包含起来。注意，这里设置的值不会被环境解析和替代，也就是所谓变量不会被展开。比如：&lt;code&gt;PATH = $HOME/bin:$PATH&lt;/code&gt; 不会像预期一样工作。&lt;br /&gt;&lt;br /&gt;cron 守护进程只设置了少数几个环境变量。 SHELL 设置为 /bin/sh， LOGNAME 和 HOME 设置为 用户相关的目录 (来自 /etc/passwd 相关的信息), PATH 设置为 “/usr/bin:/bin“。 HOME, SHELL, PATH 可以在 crontab 中重新设置，LOGNAME 是 job 运行的用户， 无法被改变。&lt;br /&gt;(注： LOGNAME 在 BSD 系统上叫做 USER, 其他系统上 也设置了 USER 变量)&lt;br /&gt;&lt;br /&gt;除了 LOGNAME, HOME 和 SHELL, 如果在当前的 crontab 中因为任何原因要发送命令运行结果的邮件， cron 会查找 MAILTO 这个变量. 如果定义了 MAILTO 变量（并且非空），邮件就会发送给这个用户。MAILTO 可以指定多个接收人，用逗号 "," 分隔。如果 MAILTO 定义成空 (MAILTO="")，将不会发送任何邮件。否则邮件将发送给 crontab 所属的用户。&lt;br /&gt;&lt;b&gt;特性：如果 crontab 中的命令有任何输出结果，cron 就会发送邮件把输出发送给用户，如果 MAILTO="" 将关闭这个特性不会发送邮件。&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;默认情况下， cron 发送邮件使用的 "Content-Type:" 邮件头是"text/plain"， 并带有"charset=" 参数来设置到 crond 启动所在的区域字符集。比如，LC_* 环境变量指定的区域 或者 如果没有 LC_* 环境变量就使用默认系统区域。你可以为发送到 mail 的 cron job 的输出使用不同的字符编码，通过在 crontab 中设置 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 变量为正确的 mail 头信息。&lt;br /&gt;&lt;br /&gt;------------ 小节分割线 ---------------&lt;br /&gt;&lt;br /&gt;cron 命令格式是非常的 V7 标准 - -; 也带有向前兼容的数字扩展。每行有 5 个时间和日期字段，跟着是命令，然后是换行（"\n")。系统级的 crontab (/etc/crontab) 使用相同格式， 除了在时间日期之后，命令之前指定了一个用于执行命令的用户名。字段可以用一个或者多个空格或者tab分隔。&lt;br /&gt;&lt;br /&gt;当分钟、小时和月份匹配当前时间，并且两个天的字段（几号或者星期几）中至少一个匹配当前时间（看下面的注释！）， cron 就开始执行命令. cron 每分钟都检查一次。时间和日期的字段：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;字段       允许的值&lt;br /&gt;----       --------&lt;br /&gt;分钟       0-59&lt;br /&gt;小时       0-23&lt;br /&gt;日         1-31&lt;br /&gt;月         1-12 (或者英文名称)&lt;br /&gt;星期       0-7 (0 和 7 都是星期天，或者使用英文名称)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;字段可以使用星号(*)，总是代表“first-last”，也就是所有的值。&lt;br /&gt;&lt;br /&gt;允许数字范围。范围就是2个数字之间用连字号(-)连接, 包括这两个数字。 比如， 小时字段 8-11 表示在 8, 9, 10 和 11 点执行。&lt;br /&gt;&lt;br /&gt;也允许列表。列表是一组数字（或者范围），由逗号(,)分隔。比如 “1,2,5,9”， “0-4,8-12”。&lt;br /&gt;&lt;br /&gt;步进值可以和范围结合。在范围后跟着“/数字”指定从范围中跳过指定数字。比如，小时字段“0-23/2”可以用来指定每几小时执行（V7 标准另一写法是 “0,2,4,6,8,10,12,14,16,18,20,22”）。步进当然也允许跟在星号后，所以如果你想要的是“每2小时”，直接用“*/2”就可以了。&lt;br /&gt;&lt;br /&gt;月份和星期可以使用英文名称。使用星期或者月份的前3个字母的缩写（无论大小写）。不能在范围或者列表中使用英文名称。&lt;br /&gt;&lt;br /&gt;第6个字段（也就是这一行的剩余部分）就是指定要运行的命令了。整个命令部分，到换行(\n)或者 % 字符，会交给 /bin/sh 或者 crontab 文件里 SHELL 变量指定的 shell 来执行。命令中的百分号(%)，除了加上反斜杠(\)转义的，会被转为换行符，并且第一个 % 之后的所有数据都会发送给命令当作标准输入。这里没办法像 shell 跟着 "\" 一样把命令写成多行的。&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;命令执行的天可以由2个字段来指定 －－ 几号和星期几。如果2个都有限制（不是 *)，那么只要其中一个匹配当前时间命令就会执行。比如：“30 4 1,15 * 5” 会导致命令在每月1号和15号加上每个星期五运行。&lt;br /&gt;&lt;br /&gt;以下 8 个特殊的字符串可以替代开头的 5 个字段：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;字符串        含义&lt;br /&gt;------        ----&lt;br /&gt;@reboot        启动时运行一次&lt;br /&gt;@yearly        每年运行一次，“0 0 1 1 *”&lt;br /&gt;@annually      (同 @yearly)&lt;br /&gt;@monthly       每月运行一次，“0 0 1 * *”&lt;br /&gt;@weekly        每周运行一次，“0 0 * * 0”&lt;br /&gt;@daily         每天运行一次，“0 0 * * *”&lt;br /&gt;@midnight      (同 @daily)&lt;br /&gt;@hourly        每小时运行一次，“0 * * * *”&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;例子：&lt;br /&gt;&lt;code&gt;&lt;br /&gt;# 使用 /bin/bash 来运行命令, 替代默认的 /bin/sh&lt;br /&gt;SHELL=/bin/bash&lt;br /&gt;# 设定发送运行结果给 “ken”, 而不管这个 crontab 是谁的&lt;br /&gt;MAILTO=ken&lt;br /&gt;#&lt;br /&gt;# 每天 00:05 运行，输出重定向到 用户目录的下的 tmp/out 文件，错误也重定向到这个文件&lt;br /&gt;5 0 * * *       $HOME/bin/daily.job &amp;gt;&amp;gt; $HOME/tmp/out 2&amp;gt;&amp;amp;1&lt;br /&gt;# 每月 1 号的 14：15 -- 输出发送给 ken(上面 MAILTO 指定的接收者)&lt;br /&gt;15 14 1 * *     $HOME/bin/monthly&lt;br /&gt;# 每个工作日 22:00 运行, 这条命令就是定时发邮件，骚扰 Rock, %都会变成换行，第一个 % 后的数据都作为标准输入给 mail&lt;br /&gt;0 22 * * 1-5    mail -s "It's 10pm" rock%Rock,%%Where are your kids?%&lt;br /&gt;# 每天每2小时在23分时运行&lt;br /&gt;23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"&lt;br /&gt;# 每周日 04:05 运行&lt;br /&gt;5 4 * * sun     echo "run at 5 after 4 every sunday"&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;再说几句总结：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;指定星期时， 0 和 7 都会被当作星期天。 BSD 和 ATT 貌似不这么认为。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;列表和范围可以在同一个字段并存。 但是“1-3,7-9”会被 ATT 或 BSD cron 拒绝 －－ 他们只想看到 “1-3” 或者 “7,8,9”。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;范围可以包括步进，因此 “1-9/2” 等同于 “1,3,5,7,9”。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;月份和星期可以用名称。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;可以在 crontab 中设置环境变量。 BSD 或 ATT 中，交给子进程的环境变量来基本来自 /etc/rc。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;命令的输出发送给 crontab 的拥有者（BSD不会这么做），可以发送给其他人（SysV 不能这么干），或者可以关闭这个特性根本不发送邮件（SysV 还是不能这么干）。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;所有出现在前面 5 个字段位置 @ 命令是扩展。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;---- 到此结束的分割线 ----&lt;br /&gt;&lt;p&gt;看到这里说明你很有耐心很想了解 crontab 设置……以上就那么多， 转载请注明来源，谢谢！&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-1983611005268638014?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/1983611005268638014/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=1983611005268638014' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1983611005268638014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1983611005268638014'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/crontab.html' title='Crontab 详解'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2974169321064887581</id><published>2008-11-13T22:42:00.001+08:00</published><updated>2008-11-13T22:48:15.422+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>从软件源中安装 Code::Blocks</title><content type='html'>Code::Blocks 是开源的跨平台的免费的 C++ IDE， 使用 wxWidgets&lt;br /&gt;&lt;br /&gt;1、加入第三方源公钥&lt;br /&gt;&lt;code&gt;wget -q http://apt.wxwidgets.org/key.asc -O- | sudo apt-key add -&lt;br /&gt;wget -q http://lgp203.free.fr/public.key -O- | sudo apt-key add -&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;2、添加软件源&lt;br /&gt;系统 -&gt; 软件源 -&gt; 第三方软件， 添加:&lt;br /&gt;&lt;code&gt;deb http://apt.wxwidgets.org/ hardy-wx main&lt;br /&gt;deb http://lgp203.free.fr/ubuntu/ hardy universe&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;hardy 是 ubuntu 8.04, 其他版本修改成对应的名称&lt;br /&gt;&lt;br /&gt;3、安装&lt;br /&gt;&lt;code&gt;sudo apt-get update&lt;br /&gt;sudo apt-get install codeblocks&lt;/code&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2974169321064887581?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2974169321064887581/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2974169321064887581' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2974169321064887581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2974169321064887581'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/codeblocks.html' title='从软件源中安装 Code::Blocks'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-1023876646354249846</id><published>2008-11-13T14:27:00.005+08:00</published><updated>2008-11-22T13:02:17.817+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName</title><content type='html'>启动 Apache 经常出现警告&lt;br /&gt;Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName&lt;br /&gt;&lt;br /&gt;使用 hostname 设置主机名，仅当前会话中有效：&lt;br /&gt;&lt;code&gt;sudo hostname yourhostname&lt;/code&gt; &lt;br /&gt;想永久生效修改这个：&lt;br /&gt;&lt;code&gt;sudo gedit /etc/hostname&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;或者&lt;br /&gt;在 httpd.conf 中加入 ServerName 指令&lt;br /&gt;&lt;code&gt;ServerName 127.0.0.1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;参阅：http://httpd.apache.org/docs/2.2/mod/core.html#servername&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-1023876646354249846?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/1023876646354249846/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=1023876646354249846' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1023876646354249846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1023876646354249846'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/httphttpd.html' title='Could not reliably determine the server&apos;s fully qualified domain name, using 127.0.1.1 for ServerName'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-1877483592917243090</id><published>2008-11-12T15:55:00.003+08:00</published><updated>2008-11-13T14:19:18.059+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>Ubuntu 8.04 升级到 8.10 的问题</title><content type='html'>问题1： 再也无法打开 软件源， 在 终端下运行 &lt;code&gt;gksu software-properties-gtk&lt;/code&gt; 出现 FutureWarning: apt API not stable yet&lt;br /&gt;google 了一下，运行 &lt;code&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get remove --purge software-properties-gtk &amp;amp;&amp;amp; sudo apt-get install software-properties-gtk&lt;/code&gt; 删除软件源管理器再安装，问题依旧。&lt;br /&gt;打开新立得，发现很多软件版本都不是 intrepid 的。 可能我使用了第三方源，导致更新问题。 更改 apt 到 intrepid 版本，安装更新后，软件源管理界面终于打开了。&lt;br /&gt;&lt;br /&gt;问题2：更新管理器总是出现部分升级选项，但又无法安装。运行 &lt;code&gt;sudo apt-get dist-upgrade&lt;/code&gt; 给我列了一大堆要安装的包，300多兆，让慢慢它下去吧。&lt;br /&gt;&lt;br /&gt;更新完毕，终于一切正常了 ：）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-1877483592917243090?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/1877483592917243090/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=1877483592917243090' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1877483592917243090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1877483592917243090'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/ubuntu-804-810.html' title='Ubuntu 8.04 升级到 8.10 的问题'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-7168353807192585932</id><published>2008-11-11T15:16:00.006+08:00</published><updated>2008-11-14T12:30:40.989+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Evolution'/><category scheme='http://www.blogger.com/atom/ns#' term='系统设置'/><title type='text'>Evolution 使用 IMap 收发 Exchange 的设置</title><content type='html'>&lt;p&gt;&lt;/p&gt;Evolution 可以同过 exchange 插件访问 Exchange. 也可以通过 IMap 方式访问 Exchange.&lt;br /&gt;&lt;br /&gt;首选项 -&gt; 邮件帐户 -&gt; 添加&lt;br /&gt;填好 邮件地址， 前进， 然后 服务器类型 可以选择 IMAP。&lt;br /&gt;&lt;ol&gt;&lt;li&gt;服务器填 exchange 地址， 在 Outlook 设置好后，查看帐户就能看到这个地址。&lt;/li&gt;&lt;li&gt;用户名就是域上的用户名，和 Outlook 一样。&lt;/li&gt;&lt;li&gt;认证类型，点一下检查支持的类型，通常 Windows 网路是 NTLM/SPA&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;前进，选择需要的选项，这样收部分就完成了。&lt;br /&gt;&lt;br /&gt;前进，这部分设置发送邮件。通常 SMTP, 服务器地址同 exchange 服务器地址，用户名一样&lt;br /&gt;&lt;br /&gt;打完收工。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-7168353807192585932?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/7168353807192585932/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=7168353807192585932' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7168353807192585932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7168353807192585932'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/evolution-imap-exchange.html' title='Evolution 使用 IMap 收发 Exchange 的设置'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-5026706841964753307</id><published>2008-11-03T11:28:00.001+08:00</published><updated>2008-11-12T16:08:04.340+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 安装升级'/><title type='text'>Ubuntu 发行版本升级</title><content type='html'>Ubuntu 发行版本升级:&lt;br /&gt;比如从 8.04 升级到 8.10&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo update-manager -dc&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;sudo update-manager --help&lt;br /&gt;Usage: update-manager [options]&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  -h, --help            show this help message and exit&lt;br /&gt;  -V, --version         显示版本然后退出&lt;br /&gt;  -c, --check-dist-upgrades&lt;br /&gt;                        检测新版本发布&lt;br /&gt;  -d, --devel-release   验证是否能够升级到最新版本&lt;br /&gt;  -p, --proposed        尝试进行版本升级&lt;br /&gt;  --dist-upgrade, --dist-ugprade&lt;br /&gt;                        尝试进行版本升级&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-5026706841964753307?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/5026706841964753307/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=5026706841964753307' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5026706841964753307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5026706841964753307'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/11/ubuntu.html' title='Ubuntu 发行版本升级'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-1662785712146936684</id><published>2008-03-16T16:19:00.001+08:00</published><updated>2008-03-16T16:19:16.086+08:00</updated><title type='text'>Hello, world!</title><content type='html'>I am on the intarweb!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-1662785712146936684?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/1662785712146936684/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=1662785712146936684' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1662785712146936684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/1662785712146936684'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2008/03/hello-world.html' title='Hello, world!'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2912952099172335695</id><published>2007-11-22T23:26:00.001+08:00</published><updated>2007-11-22T23:26:44.985+08:00</updated><title type='text'>fork()子进程和父进程共享的资源</title><content type='html'>&lt;p&gt;子进程和父进程共享很多资源，除了打开文件之外，很多父进程的其他性质也由子进程继承：&lt;/p&gt;  &lt;p&gt;&amp;#x2022; 实际用户ID、实际组ID、有效用户ID、有效组ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 添加组ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 进程组ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 对话期ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 控制终端。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 设置-用户-ID标志和设置-组-ID标志。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 当前工作目录。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 根目录。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 文件方式创建屏蔽字。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 信号屏蔽和排列。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 对任一打开文件描述符的在执行时关闭标志。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 环境。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 连接的共享存储段。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 资源限制。 &lt;/p&gt;  &lt;p&gt;父、子进程之间的区别是： &lt;/p&gt;  &lt;p&gt;&amp;#x2022; fork的返回值。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 进程ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 不同的父进程ID。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 子进程的tms_utime,tms_stime,tms_cutime以及tms_ustime设置为0。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 父进程设置的锁，子进程不继承。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 子进程的未决告警被清除。 &lt;/p&gt;  &lt;p&gt;&amp;#x2022; 子进程的未决信号集设置为空集。&lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2912952099172335695?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2912952099172335695/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2912952099172335695' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2912952099172335695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2912952099172335695'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/11/fork.html' title='fork()子进程和父进程共享的资源'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-18766596857822831</id><published>2007-11-03T15:20:00.002+08:00</published><updated>2008-11-12T16:10:26.028+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>让Eclipse显示JVM当前内存使用量</title><content type='html'>&lt;p&gt;更新：Eclipse 有对应的选项...  &lt;br /&gt;Windows -&amp;gt; Preferences... -&amp;gt; General   &lt;br /&gt;勾选 Show heap status 即可。&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;让Eclipse显示JVM当前内存使用量：&lt;/p&gt;  &lt;p&gt;1、在Eclipse根目录下建立一个文件，文件名options，文件内容org.eclipse.ui/perf/showHeapStatus=true&lt;/p&gt;  &lt;p&gt;2、用这条命令启动Eclipse：&lt;/p&gt;  &lt;p&gt;E:\eclipse3.1\eclipse.exe -debug options -vm javaw.exe&lt;/p&gt;  &lt;p&gt;或者直接右键Eclipse的快捷方式，在"目标"中填入这行。&lt;/p&gt;  &lt;p&gt;3、启动Eclipse，就可以看到下面的状态栏会显示当前JVM内存使用量，另外还可以强制进行垃圾收集。&lt;/p&gt;  &lt;p&gt;4、可以使用 eclipse.ini 替代命令行参数，每个参数名或者参数值单独一行&lt;/p&gt;  &lt;p&gt;-debug   &lt;br /&gt;options    &lt;br /&gt;-showsplash    &lt;br /&gt;org.eclipse.platform    &lt;br /&gt;--launcher.XXMaxPermSize    &lt;br /&gt;256    &lt;br /&gt;-vmargs    &lt;br /&gt;-Xms64m    &lt;br /&gt;-Xmx256m&lt;/p&gt;  &lt;p&gt;可以更改 JVM 堆和栈的大小.   &lt;br /&gt;如果在 eclipse.ini 中用 -vm 参数，必须些全路径指定 java.exe 或者 javaw.exe&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-18766596857822831?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/18766596857822831/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=18766596857822831' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/18766596857822831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/18766596857822831'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/11/eclipsejvm.html' title='让Eclipse显示JVM当前内存使用量'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2795136512772614618</id><published>2007-07-10T23:31:00.000+08:00</published><updated>2007-07-18T01:06:54.863+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='创意'/><category scheme='http://www.blogger.com/atom/ns#' term='视频'/><title type='text'>非常有创意的捐血慈善广告</title><content type='html'>&lt;p&gt;&lt;br /&gt;非常有创意的捐血慈善广告。&lt;br /&gt;将播放器的进度条模拟成抽血的血管。&lt;br /&gt;当5秒之后视频中的护士和你道谢后拿起这个血管。&lt;br /&gt;广告形式中的文案也很具有煽动性。&lt;br /&gt;“对你来说只是一个短暂时刻，但对我们来说可能意味着一个生命。”&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" height="355" width="426"&gt;&lt;param name="_cx" value="11271"&gt;&lt;param name="_cy" value="9393"&gt;&lt;param name="FlashVars" value=""&gt;&lt;param name="Movie" value="http://kenchou77.googlepages.com/5segons_en.swf"&gt;&lt;param name="Src" value="http://kenchou77.googlepages.com/5segons_en.swf"&gt;&lt;param name="WMode" value="Window"&gt;&lt;param name="Play" value="0"&gt;&lt;param name="Loop" value="-1"&gt;&lt;param name="Quality" value="High"&gt;&lt;param name="SAlign" value=""&gt;&lt;param name="Menu" value="-1"&gt;&lt;param name="Base" value=""&gt;&lt;param name="AllowScriptAccess" value=""&gt;&lt;param name="Scale" value="ShowAll"&gt;&lt;param name="DeviceFont" value="0"&gt;&lt;param name="EmbedMovie" value="0"&gt;&lt;param name="BGColor" value=""&gt;&lt;param name="SWRemote" value=""&gt;&lt;param name="MovieData" value=""&gt;&lt;param name="SeamlessTabbing" value="1"&gt;&lt;param name="Profile" value="0"&gt;&lt;param name="ProfileAddress" value=""&gt;&lt;param name="ProfilePort" value="0"&gt;&lt;param name="AllowNetworking" value="all"&gt;&lt;param name="AllowFullScreen" value="false"&gt;&lt;embed src="http://kenchou77.googlepages.com/5segons_en.swf" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" height="355" width="426"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2795136512772614618?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2795136512772614618/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2795136512772614618' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2795136512772614618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2795136512772614618'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/07/blog-post.html' title='非常有创意的捐血慈善广告'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-5206522897838191594</id><published>2007-07-02T10:28:00.000+08:00</published><updated>2007-07-02T10:31:12.884+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><title type='text'>Zend Framework 1.0.0 发布</title><content type='html'>&lt;a href="http://framework.zend.com/"&gt;framework.zend.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Zend Framework                                                             NEWS&lt;br /&gt;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||&lt;br /&gt;&lt;br /&gt;=RELEASE 1.0.0 / 30-Jun-2007 / based on revision 5541 =&lt;br /&gt;- Zend_Cache&lt;br /&gt;ZF-1583 Zend_Cache_Backend_APC should be Zend_Cache_Backend_Apc&lt;br /&gt;ZF-1606 Zend_Cache does not allow using ZendPlatform cache backend&lt;br /&gt;- Zend_Controller&lt;br /&gt;ZF-778  _redirect() needs to use absolute URIs?&lt;br /&gt;ZF-1439 Request_Http Should check REDIRECT_URL before REQUEST_URI&lt;br /&gt;ZF-1444 allow to set noController globally&lt;br /&gt;ZF-1456 Incorrect behavior in ViewRenderer when exception is thrown&lt;br /&gt;ZF-1485 Prevent unnecessary ViewRenderer instanciation&lt;br /&gt;ZF-1493 default controller class is different from class for specific modules&lt;br /&gt;ZF-1495 when useDefaultControllerAlways is true, a bad view can be selected&lt;br /&gt;ZF-1503 ViewRenderer calls methods not in Zend_View_Interface&lt;br /&gt;ZF-1553 ViewRenderer by postdispatch not disabled by invokeArgs setting&lt;br /&gt;ZF-1571 Wrong method call in zend.controller.plugins.html examples&lt;br /&gt;ZF-1572 Missing parameter in zend.controller.actionhelpers.html example code&lt;br /&gt;ZF-1640 Wrong example in 7.5.5. Base URL and subdirectories&lt;br /&gt;ZF-1642 Can't overwrite headers with setHeader&lt;br /&gt;ZF-1643 Zend_Controller Unit Tests failing&lt;br /&gt;ZF-1649 Plugin broker should attempt to catch plugin exceptions&lt;br /&gt;ZF-1650 Add stack order to plugin broker&lt;br /&gt;ZF-1654 ViewRenderer and finding view scripts&lt;br /&gt;- Zend_Db&lt;br /&gt;ZF-884  SQLite: result set contains correlation names in keys&lt;br /&gt;ZF-1518 Silent failure from describeTable() when schema is wrong&lt;br /&gt;ZF-1563 QuoteInto doesn't work with Sqlite&lt;br /&gt;- Zend_Db_Adapter_Db2&lt;br /&gt;ZF-1648 Fixed DB2 Util tests that get the schema used to qualify a name&lt;br /&gt;- Zend_Db_Table&lt;br /&gt;ZF-1634 The findParentBy() fails to extract the correct class&lt;br /&gt;ZF-1625 Mistakes in Relationships code examples&lt;br /&gt;ZF-1645 createRow() should omit identity columns from data&lt;br /&gt;- Zend_Debug&lt;br /&gt;ZF-1602 Data not in UTF-8 is stripped by htmlentities()&lt;br /&gt;- Zend_Filter / Zend_Validate&lt;br /&gt;ZF-1641 PCRE UTF-8 Support Unavailable on Some Platforms&lt;br /&gt;ZF-1646 Cache result check for UTF-8 and Unicode support in PCRE&lt;br /&gt;- Zend_Gdata&lt;br /&gt;ZF-1644 Order of parameters in FeedLink and EntryLink is not optimal&lt;br /&gt;ZF-1653 author and published-min/published-max missing from Gdata_Query&lt;br /&gt;- Zend_Loader&lt;br /&gt;ZF-1512 loadClass() fails when $dirs contains '.'&lt;br /&gt;- Zend_Log&lt;br /&gt;ZF-1627 Incorrect example in the manual for Zend_Log_Writer_Db&lt;br /&gt;- Zend_Mail&lt;br /&gt;ZF-1622 Safe-Mode Warning in Zend_Mail while sending mails with mail()&lt;br /&gt;- Zend_Memory&lt;br /&gt;ZF-1261 AccessController.php missing require_once for the class it implements&lt;br /&gt;- Zend_Pdf&lt;br /&gt;ZF-1657 Zend_Pdf_Filter interface violates coding standard&lt;br /&gt;- Zend_Registry&lt;br /&gt;ZF-1613 Zend_Registry::setClassName() should load specified class&lt;br /&gt;- Zend_Search_Lucene&lt;br /&gt;ZF-1561 Wrong returned result in comparison to Luke toolbox&lt;br /&gt;ZF-1655 Common_TextNum analyzer skips zeroz, 8 and 9&lt;br /&gt;- Zend_Session&lt;br /&gt;ZF-1610 Zend_Session::rememberMe() can not modify the session cookie lifetime&lt;br /&gt;- Zend_Translate&lt;br /&gt;ZF-1635 Wrong translate() and isTranslated() translation check&lt;br /&gt;ZF-1647 Typo in Zend_Translate documentation&lt;br /&gt;- Zend_View&lt;br /&gt;ZF-1542 FormLabel View Helper silently ignores third parameter&lt;br /&gt;ZF-1568 Zend_View_Helper_FormCheckbox values&lt;br /&gt;- Zend_XmlRpc_Client&lt;br /&gt;ZF-1566 Class 'Zend_Xml_Rpc_Value_Exception' not found&lt;br /&gt;ZF-1637 fatal error if server does not return a response&lt;br /&gt;- Total of 46 issues resolved; for a detailed list, see the changelog&lt;br /&gt;in the issue tracker at http://framework.zend.com/issues&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-5206522897838191594?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/5206522897838191594/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=5206522897838191594' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5206522897838191594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5206522897838191594'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/07/zend-framework-100.html' title='Zend Framework 1.0.0 发布'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-5603204495015412903</id><published>2007-05-29T20:01:00.000+08:00</published><updated>2007-05-29T20:18:17.142+08:00</updated><title type='text'>Zend Framework 1.0.0 RC1 released</title><content type='html'>1.0第一个候选版本，55&lt;br /&gt;下个版本将会在六月中旬放出来。&lt;br /&gt;&lt;br /&gt;Download it from &lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://framework.zend.com/" target="_blank"&gt;http://framework.zend.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the home stretch toward 1.0!  Everyone has worked very hard for&lt;br /&gt;many months, and we are very close to finishing what we set out to do&lt;br /&gt;with Zend Framework 1.0.  This Release Candidate is intended to show the&lt;br /&gt;complete set of features Zend Framework 1.0 has.  Following the final&lt;br /&gt;1.0 release, Zend Framework will continue to grow and improve, but there&lt;br /&gt;will be a great emphasis on maintaining backward-compatibility.  That&lt;br /&gt;has been the mission of Zend Framework from the beginning, to provide a&lt;br /&gt;professional web framework with quality and stability.&lt;br /&gt;&lt;br /&gt;There are a few noteworthy additions in this release, but some of these&lt;br /&gt;impact backward-compatibility:&lt;br /&gt;&lt;br /&gt;- Zend_Controller has a new feature called the ViewRenderer, which makes&lt;br /&gt;it very easy to design controller actions.  See docs for the new usage;&lt;br /&gt;there is a section in the Controller Migration section for updating your&lt;br /&gt;MVC applications.&lt;br /&gt;&lt;br /&gt;- Zend_Gdata has a new object-oriented usage, making this client very&lt;br /&gt;similar to the interface of Gdata clients for other programming&lt;br /&gt;languages.  However, support for Google Calendar is unfinished and&lt;br /&gt;remains in the incubator.&lt;br /&gt;&lt;br /&gt;- Zend_Db statement classes now have a consistent interface and common&lt;br /&gt;classes and exceptions across all database adapters; however, binding&lt;br /&gt;query parameters and results to PHP variables by reference has a bug&lt;br /&gt;(logged as ZF-1440).&lt;br /&gt;&lt;br /&gt;- Zend_Filter_Input is a new class with an old name.  This provides a&lt;br /&gt;solution for declaring rules to filter and validate groups of data, and&lt;br /&gt;it serves as a "cage" from which only values that pass your validation&lt;br /&gt;rules can be retrieved.&lt;br /&gt;&lt;br /&gt;- Zend_Service_StrikeIron is a new web service client in the incubator.&lt;br /&gt;&lt;br /&gt;There have been 90 issues fixed in this release since 0.9.3.  See the&lt;br /&gt;changelog for a list of issues addressed in Release 1.0.0RC1:&lt;br /&gt;&lt;a onclick="return top.js.OpenExtLink(window,event,this)" href="http://framework.zend.com/changelog" target="_blank"&gt;http://framework.zend.com&lt;wbr&gt;/changelog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The next release will be in mid-June, and it will likely be a second&lt;br /&gt;release candidate.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-5603204495015412903?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/5603204495015412903/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=5603204495015412903' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5603204495015412903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/5603204495015412903'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/05/zend-framework-100-rc1-released.html' title='Zend Framework 1.0.0 RC1 released'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-3807339197981525937</id><published>2007-03-31T17:56:00.000+08:00</published><updated>2008-11-19T05:16:00.919+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><title type='text'>Blogger: 使用Picasa Web Albums</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s4Vg-1g_MuU/Rg4xt-bJdoI/AAAAAAAAAEY/kwumO5OJSdU/s1600-h/HitchhikersGuideMarvin3_300x298.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_s4Vg-1g_MuU/Rg4xt-bJdoI/AAAAAAAAAEY/kwumO5OJSdU/s400/HitchhikersGuideMarvin3_300x298.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5048026898249643650" /&gt;&lt;/a&gt;&lt;br /&gt;picasa相册空间已经自动升级到1G.&lt;br /&gt;Blogger使用picasa相册作为存储空间了吗？测试一下.&lt;br /&gt;&lt;br /&gt;原文:&lt;br /&gt;http://buzz.blogger.com/2007/03/blogger-and-picasa-web-albums.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-3807339197981525937?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/3807339197981525937/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=3807339197981525937' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3807339197981525937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3807339197981525937'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/03/blogger-picasa-web-albums.html' title='Blogger: 使用Picasa Web Albums'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_s4Vg-1g_MuU/Rg4xt-bJdoI/AAAAAAAAAEY/kwumO5OJSdU/s72-c/HitchhikersGuideMarvin3_300x298.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-467540870678103337</id><published>2007-03-22T17:59:00.000+08:00</published><updated>2008-11-19T05:16:01.138+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='折纸'/><title type='text'>A4纸折CD套</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_s4Vg-1g_MuU/RgJTr5BO63I/AAAAAAAAAD0/Yog31fHCDWY/s1600-h/Double+CD+case.jpg"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_s4Vg-1g_MuU/RgJTr5BO63I/AAAAAAAAAD0/Yog31fHCDWY/s400/Double+CD+case.jpg" alt="Double CD case" id="BLOGGER_PHOTO_ID_5044686546113850226" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A4纸折CD套（放两张）&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;1.第一步很关键，线要对齐，不要误差太大了&lt;br /&gt;2.第三步折两个小折角的时候要保持两边的距离相等，这样后面对得齐&lt;br /&gt;3.第三步时可以把你的光盘的一条边（切线）紧贴中线，另一端头作为折小折角时的参考，这样可以较精确地控制CD套的大小（自己体会一下吧）&lt;br /&gt;4.第五步中是把d的那个直角沿水平线平行放入b的"小套子”中&lt;br /&gt;注：A3纸折CD套是A4的二分之一适合放小的CD-R。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-467540870678103337?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/467540870678103337/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=467540870678103337' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/467540870678103337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/467540870678103337'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/03/a4cd.html' title='A4纸折CD套'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_s4Vg-1g_MuU/RgJTr5BO63I/AAAAAAAAAD0/Yog31fHCDWY/s72-c/Double+CD+case.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-188060946863504986</id><published>2007-03-18T16:50:00.000+08:00</published><updated>2007-03-28T21:26:34.819+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><title type='text'>ANNOUNCE: Zend Framework 0.9.0 发布</title><content type='html'>下载地址：&lt;a href="http://framework.zend.com/"&gt;http://framework.zend.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;这是首个beta版本发布。这是Zend Framework项目的一个里程碑，因为beta状态确定了Zend Framework 1.0 的特性，我们会采用向后兼容和接口的稳定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-188060946863504986?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/188060946863504986/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=188060946863504986' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/188060946863504986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/188060946863504986'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/03/announce-zend-framework-090.html' title='ANNOUNCE: Zend Framework 0.9.0 发布'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-8265499646155304702</id><published>2007-03-07T15:16:00.000+08:00</published><updated>2007-03-07T15:17:34.099+08:00</updated><title type='text'>人的性格是不是基因决定的</title><content type='html'>◇◇新语丝(www.xys.org)(xys.dxiong.com)(xys.3322.org)(xys.xlogit.com)◇◇&lt;br /&gt;&lt;br /&gt;                   人的性格是不是基因决定的？&lt;br /&gt;&lt;br /&gt;                         ·方舟子·&lt;br /&gt;&lt;br /&gt;   国内第一部武侠动画片正在热播，有人认为该片“内容低级，充满了暴力、&lt;br /&gt;情色、脏口、恐吓、威胁”，孩子们长期观看，“会产生很严重的不良影响”，&lt;br /&gt;因此请求停播该片。但有一位被称为“童话大王”的儿童文学作家对此很不以为&lt;br /&gt;然，对记者表示：“我认为一个孩子怎么样，基本上是遗传基因决定的。后天环&lt;br /&gt;境对孩子的影响有多大我不是很清楚，但是父母是怎样的，一个孩子基本上就应&lt;br /&gt;该是怎样的了。”&lt;br /&gt;&lt;br /&gt;   如果不是记者转述有误的话，“童话大王”的这个评论是自相矛盾的。既然&lt;br /&gt;他不清楚环境的影响有多大，又何以能够断言一个孩子的性格基本上是遗传基因&lt;br /&gt;决定的呢？&lt;br /&gt;&lt;br /&gt;   “童话大王”的观点，是属于所谓遗传决定论。一个人的性格是基本上先天&lt;br /&gt;决定的，还是受环境的影响后天使然的，曾经是一个争论不休的问题。遗传决定&lt;br /&gt;论向来被认为是反动的、保守的，环境决定论则被认为是进步的、开明的。争论&lt;br /&gt;虽然激烈，在以前却缺乏严谨而客观的科学研究，或者是出于社会偏见，或者是&lt;br /&gt;出于美好的愿望。近二十年来，才有了比较可靠的科学研究，可以对基因、环境&lt;br /&gt;对人的性格的影响下一个结论。&lt;br /&gt;&lt;br /&gt;   在遗传学上，要研究基因与环境的关系，可以设计一个简单的实验：让有着&lt;br /&gt;相同的基因组的个体（也就是所谓克隆）控制在不同的环境中生长，比较其结果。&lt;br /&gt;同卵孪生子有着相同的基因组，是很好的实验材料，但是我们却无法拿人来做这&lt;br /&gt;种控制实验，只能进行调查统计。&lt;br /&gt;&lt;br /&gt;   这有两种办法。一种是比较同卵孪生子和异卵孪生子的异同。同卵孪生子是&lt;br /&gt;由同一个受精卵分裂发育来的，他们的基因组相同，遗传相似程度达到100％。&lt;br /&gt;异卵孪生子则是两个（或更多个）卵分别被两个（或更多个）精子受精产生的不&lt;br /&gt;同受精卵分别发育而来的，虽然他们在同一时间位于同一子宫，但是他们的遗传&lt;br /&gt;相似程度与同一对父母在不同时间生下的两个孩子是一样的，平均为50％。如果&lt;br /&gt;某种行为特征在同卵孪生子之间的相似程度并不比异卵孪生子高，那么我们可以&lt;br /&gt;认为这种特征的遗传程度很弱。反之，如果同卵孪生子在某种行为特征的相似程&lt;br /&gt;度高于异卵孪生子，那么它就很可能是受到遗传影响的。&lt;br /&gt;&lt;br /&gt;   另一种方法是比较出生后不久就被分开在不同家庭抚养的同卵孪生子和在同&lt;br /&gt;一个家庭抚养的同卵孪生子。这个办法的依据是认为在不同家庭抚养的孪生子有&lt;br /&gt;不同的生长环境，因此其相似性就可认为是由于有相同的基因导致的。这个依据&lt;br /&gt;并不完全可靠，因为孪生子在被分开抚养之前，至少已有九个月的时间是处于相&lt;br /&gt;同的环境中的（母亲的子宫），而且在不同的家庭抚育，并不等于其生长环境就&lt;br /&gt;完全不同，其中完全有可能有很相同的环境因素。&lt;br /&gt;&lt;br /&gt;   不管采用哪一种方法，都不能只比较个案，而必须对大量的孪生子做调查、&lt;br /&gt;统计。在世界上，已有多项这种调查，其中最大的一项是美国明尼苏答大学的研&lt;br /&gt;究人员负责的，他们共研究了8000多对同卵孪生子和异卵孪生子，包括130多对&lt;br /&gt;在不同的家庭长大的同卵孪生子。他们之所以能找到这么多被分开抚育的同卵孪&lt;br /&gt;生子，得益于美国历史上一个悲惨的时期：上个世纪三、四十年代的经济大萧条&lt;br /&gt;迫使许多贫苦家庭把刚出生的孪生子分开送人抚养。以后很可能再难以有这样的&lt;br /&gt;研究机会。&lt;br /&gt;&lt;br /&gt;   研究者对孪生子进行了深入具体的面试，以了解其生活环境，对社会、宗教、&lt;br /&gt;哲学问题的看法，并用一系列心理测试判断其职业兴趣、思维能力和性格倾向。&lt;br /&gt;结果表明，同卵孪生子的性格相似程度明显大于异卵孪生子。明尼苏答大学的研&lt;br /&gt;究结果是，一起长大的同卵孪生子的相关性平均为0.46（0表示两个人没有一点&lt;br /&gt;相似之处，1表示两个人完全相同），分开长大的同卵孪生子，这一数字为0.45。&lt;br /&gt;这说明同卵孪生子的性格相关程度，与他们是否在相同还是不同的环境长大无关。&lt;br /&gt;分开长大的异卵孪生子的性格相关程度平均为0.26，大约是同卵孪生子的一半，&lt;br /&gt;这与他们的遗传相似程度是同卵孪生子的一半相符。从同卵孪生子和异卵孪生子&lt;br /&gt;得到的相关性可以用于计算遗传差异与性格差异的相关性。平均来说，大约50％&lt;br /&gt;的性格差异是由于遗传差异导致的，或者说，遗传因素对性格的影响大约占了一&lt;br /&gt;半。遗传学家把这个数字称为遗传率。如果性状差异是完全由遗传差异引起的，&lt;br /&gt;遗传率为1，如果性状差异与遗传差异毫无关系，遗传率为0。其他的类似研究的&lt;br /&gt;结果，所得到的性格遗传率，一般在0.2-0.5之间。&lt;br /&gt;&lt;br /&gt;   由此可见，遗传决定论和环境决定论都是错误的，遗传因素和环境因素对性&lt;br /&gt;格的影响大约同等重要。两个人的遗传差异越大，环境越不同，性格差异也就会&lt;br /&gt;越大。而两个人的性格相似主要是由于相似的遗传因素引起的，环境的影响很小。&lt;br /&gt;但是我们必须记住，遗传因素和环境因素实际上是无法截然分开的，而是混杂在&lt;br /&gt;一起、交互发生作用的，从这个意义上说，区分影响性格的因素有多少属于遗传&lt;br /&gt;的影响，有多少属于环境的影响，是不可能的。简单地说，遗传、环境，以及经&lt;br /&gt;常被忽视的随机因素，都对人性有重要的影响。&lt;br /&gt;&lt;br /&gt;   达尔文曾经深刻地指出，那些顽固地坚持遗传决定论、认为一切都是天生注&lt;br /&gt;定的人，实际上是在推卸社会责任：“如果穷人的惨状不是自然法则而是我们的&lt;br /&gt;制度导致的，那么我们的罪过就会很大。”“童话大王”本人的童话作品也曾经&lt;br /&gt;遭受批评，认为它们不适合儿童阅读，会对儿童的生长产生不良影响。这也许可&lt;br /&gt;以解释为什么他明知自己并不了解后天环境的影响有多大，却要断言儿童的性格&lt;br /&gt;基本上是遗传基因决定的。暴力动画片、另类童话是否会对儿童产生不良影响当&lt;br /&gt;然可以讨论，但是不应该因此一概否定儿童的成长会受不良环境的影响。编导、&lt;br /&gt;作家在向儿童推销自己的作品时，还是要多一点社会责任感。&lt;br /&gt;&lt;br /&gt;2007.2.28&lt;br /&gt;&lt;br /&gt;（《经济观察报》2007.3.5.）&lt;br /&gt;&lt;br /&gt;(XYS20070305)&lt;br /&gt;&lt;br /&gt;◇◇新语丝(www.xys.org)(xys.dxiong.com)(xys.3322.org)(xys.xlogit.com)◇◇&lt;br /&gt;&lt;br /&gt;http://xys.3322.org/xys/netters/Fang-Zhouzi/jingji/gene.txt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-8265499646155304702?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/8265499646155304702/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=8265499646155304702' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8265499646155304702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8265499646155304702'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/03/blog-post.html' title='人的性格是不是基因决定的'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-52450627543478478</id><published>2007-03-07T14:59:00.000+08:00</published><updated>2007-03-07T15:04:30.201+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='历史'/><category scheme='http://www.blogger.com/atom/ns#' term='宗教'/><title type='text'>Christianism 基督教历史常识</title><content type='html'>基督教Christian分三种:&lt;br /&gt;东正教Orthodox(From Greek orthodoxos, "of the right opinion")&lt;br /&gt;天主教Catholicism,即罗马天主教&lt;br /&gt;新教Protestantism,也俗称基督教(狭义)&lt;br /&gt;&lt;br /&gt;上面这三种和犹太教、伊斯兰教都是信上帝God的，同源于犹太教。&lt;br /&gt;&lt;br /&gt;最初，犹太教的人陆续编出了Bible这本书，说上帝对犹太人如何如何好，因为犹太是上帝的“选民”，不是选举的人，而是选中的人，只要信主，死后可以上天堂。书中并预测未来会有救世主降临。&lt;br /&gt;大概公元１年左右，有人宣称救世主出现了，就是耶稣。并且，关于他的书层出不穷，也编入Bible中，称为 New Testament 新约，顺手把以前的Bible叫做旧约Old Testament。这就是基督教。在新约中，上帝不再只关注犹太人，而是愿意普渡众生。所有人只要信主就可以上天堂。这个新约没有门槛，所以很快传播开来了。特别是耶稣只反对不受信用的人，不反抗当时的罗马统治，深得罗马人的喜爱。当然，犹太人反对这个说法。&lt;br /&gt;６００年后，阿拉伯半岛麦加城的穆罕默德创办了伊斯兰教。教义古兰经中，耶稣只是２９个先知之一，而穆罕默德是最大的且最后的先知。&lt;br /&gt;基督教发展之后，分成东西两派，就是东正教和天主教。都赞美圣母玛丽亚并崇拜上帝。后来天主教中出现了新教，把圣母放到一边，只关心耶稣。所以这个教也称作 “耶稣教”。当时美洲是欧洲人流放犯人的地方，这派中一些教徒在欧洲被欺负得活不下去了，又不想改变信仰，听说海外有块新大陆，就乘五月花May Flower号船偷渡到这里来(1620年)，在当地印地安人的帮助之下安了家，所以在收获的季节举办了“感恩节”Thanks Giving.当然，也许还有许多偷渡死掉的，我们就不知道了。&lt;br /&gt;也就是因为先到这里的是一些新教坚贞分子，所以这个教派在美洲传输开来。美国可能有60%的人信仰这个教派。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xys.3322.org/forum/db/14.html"&gt;http://xys.3322.org/forum/db/14.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-52450627543478478?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/52450627543478478/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=52450627543478478' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/52450627543478478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/52450627543478478'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/03/christianism.html' title='Christianism 基督教历史常识'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-7370314263845096917</id><published>2007-02-26T22:10:00.000+08:00</published><updated>2007-02-26T22:17:40.459+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='How to'/><category scheme='http://www.blogger.com/atom/ns#' term='视频'/><title type='text'>如何打结 mp3 player knot</title><content type='html'>&lt;p&gt;非常简单&lt;/p&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/kgku_EHiCsU"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/kgku_EHiCsU" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=kgku_EHiCsU"&gt;http://www.youtube.com/watch?v=kgku_EHiCsU&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-7370314263845096917?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/7370314263845096917/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=7370314263845096917' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7370314263845096917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7370314263845096917'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/02/mp3-player-knot.html' title='如何打结 mp3 player knot'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-4086347867133945403</id><published>2007-02-21T18:44:00.000+08:00</published><updated>2007-03-22T18:17:53.375+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='折纸'/><category scheme='http://www.blogger.com/atom/ns#' term='视频'/><title type='text'>折纸星星 Make Origami Paper Stars</title><content type='html'>&lt;embed src="http://www.metacafe.com/fplayer/299016/make_origami_paper_stars.swf" width="400" height="345" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.metacafe.com/watch/299016/make_origami_paper_stars/"&gt;Make Origami Paper Stars&lt;/a&gt; - &lt;a href='http://www.metacafe.com/'&gt;The funniest videos clips are here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-4086347867133945403?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/4086347867133945403/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=4086347867133945403' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4086347867133945403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4086347867133945403'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/02/make-origami-paper-stars.html' title='折纸星星 Make Origami Paper Stars'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-7999264630715061829</id><published>2007-02-20T16:56:00.000+08:00</published><updated>2007-02-26T22:20:49.427+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='视频'/><title type='text'>用发卡开手铐 Unlock Handcuffs With A Bobby Pin</title><content type='html'>&lt;embed src="http://www.metacafe.com/fplayer/429128/unlock_handcuffs_with_a_bobby_pin_trick_revealed.swf" width="400" height="345" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.metacafe.com/watch/429128/unlock_handcuffs_with_a_bobby_pin_trick_revealed/"&gt;Unlock Handcuffs With A Bobby Pin! Trick Revealed! - video powered by Metacafe&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-7999264630715061829?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/7999264630715061829/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=7999264630715061829' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7999264630715061829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7999264630715061829'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/02/unlock-handcuffs-with-bobby-pin.html' title='用发卡开手铐 Unlock Handcuffs With A Bobby Pin'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-2361688450423540378</id><published>2007-02-18T13:15:00.000+08:00</published><updated>2008-11-19T05:16:01.378+08:00</updated><title type='text'>Lunar new year 2007</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RdfhK977bWI/AAAAAAAAAB4/pFUp48O0uy4/s1600-h/lunarnewyear07.gif"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RdfhK977bWI/AAAAAAAAAB4/pFUp48O0uy4/s320/lunarnewyear07.gif" alt="" id="BLOGGER_PHOTO_ID_5032738687150681442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;2007 春节快乐&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-2361688450423540378?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/2361688450423540378/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=2361688450423540378' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2361688450423540378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/2361688450423540378'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/02/lunar-new-year-2007.html' title='Lunar new year 2007'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_s4Vg-1g_MuU/RdfhK977bWI/AAAAAAAAAB4/pFUp48O0uy4/s72-c/lunarnewyear07.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-4157769911040174524</id><published>2007-01-22T17:38:00.000+08:00</published><updated>2007-01-22T17:40:05.870+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>FireBug 控制台函数说明</title><content type='html'>原文地址：&lt;a href="http://www.joehewitt.com/software/firebug/docs.php"&gt;http://www.joehewitt.com/software/firebug/docs.php&lt;/a&gt;  &lt;blockquote&gt; &lt;a href="http://www.joehewitt.com/software/firebug/"&gt;FireBug&lt;/a&gt; 是一个非常实用的JavaScript以及DOM查看调试工具，是 Firefox 的一个插件。使用 FireBug 调试 AJAX 应用非常方便，终于可以告别 alert 时代了！ &lt;/blockquote&gt;  &lt;h2&gt;Console Logging 函数&lt;/h2&gt;  &lt;p&gt;FireBug 为所有 Web 页面提供了一个 console 对象。这个对象有以下函数：&lt;/p&gt;  &lt;h3&gt;Logging 基础&lt;/h3&gt;  &lt;div&gt;&lt;b&gt;console.log("message" [,objects])&lt;/b&gt; - 将一个字符串打印到控制台。字符串可以包含任何“String Formatting”小节描述的模式。字符串后面的对象应该用来取代之前字符串中的模式。（译者注：大家用过C里面 printf 吧，效果基本是一样的。）&lt;/div&gt;  &lt;h3&gt;Logging 等级&lt;/h3&gt;  &lt;p&gt;通常根据不同的等级来区分Logging的严重程度是很有帮助的。FireBug 提供了4个等级。为了达到视觉分离的效果，这些函数与 &lt;code&gt;log&lt;/code&gt; 不同的地方就是它们在被调用的时候会自动包含一个指向代码行数的链接。&lt;/p&gt;  &lt;div&gt;&lt;b&gt;console.debug("message" [,objects])&lt;/b&gt; - 记录一个 debug 消息。&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.info("message" [,objects])&lt;/b&gt; - 记录一个信息.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.warn("message" [,objects])&lt;/b&gt; - 记录一个警告.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.error("message" [,objects])&lt;/b&gt; - 记录一个错误.&lt;/div&gt;  &lt;h3&gt;断言&lt;/h3&gt;  &lt;p&gt;断言是一条确保代码规则的非常好的途径。console 对象包含了一系列各种类型的断言函数，并且允许你编写自己的断言函数。&lt;/p&gt;  &lt;div&gt;&lt;b&gt;console.assert(a, "message" [,objects])&lt;/b&gt; - Asserts that an &lt;code&gt;a&lt;/code&gt; is true.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertEquals(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is equal to &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotEquals(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not equal to &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertGreater(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is greater than &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotGreater(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not greater than &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertLess(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is less than &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotLess(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not less than &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertContains(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is in the array &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotContains(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not in the array &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertTrue(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is equal to &lt;code&gt;true&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertFalse(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is equal to &lt;code&gt;false&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertNull(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is equal to &lt;code&gt;null&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotNull(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not equal to &lt;code&gt;null&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertUndefined(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is equal to &lt;code&gt;undefined&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotUndefined(a, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not equal to &lt;code&gt;undefined&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertInstanceOf(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is an instance of type &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotInstanceOf(a, b, "message" [,objects])&lt;/b&gt; - Asserts that &lt;code&gt;a&lt;/code&gt; is not an instance of type &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.assertTypeOf(a, b, "message" [,objects])&lt;/b&gt; - Asserts that the type of &lt;code&gt;a&lt;/code&gt; is equal to the string &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.assertNotTypeOf(a, b, "message" [,objects])&lt;/b&gt; - Asserts that the type of &lt;code&gt;a&lt;/code&gt; is not equal to the string &lt;code&gt;b&lt;/code&gt;.&lt;/div&gt;  &lt;h3&gt;测量（Measurement）&lt;/h3&gt;  &lt;p&gt;下面的一些函数可以让你方便的测量你的一些代码。&lt;/p&gt;  &lt;div&gt;&lt;b&gt;console.trace()&lt;/b&gt; - 记录执行点的堆栈信息。&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.time("name")&lt;/b&gt; - 根据 name 创建一个唯一的计时器。&lt;/div&gt; &lt;div&gt;&lt;b&gt;console.timeEnd("name")&lt;/b&gt; - 根据 name 停止计时器，并且记录消耗的时间，以毫秒为单位。&lt;/div&gt;  &lt;div&gt;&lt;b&gt;console.count("name")&lt;/b&gt; - 记录该行代码执行的次数。&lt;/div&gt;  &lt;h2&gt;字符串格式化&lt;/h2&gt;  &lt;p&gt;所有 console 的 logging 函数都可以通过以下模式格式化字符串：  &lt;/p&gt;&lt;div&gt;&lt;b&gt;%s&lt;/b&gt; - 将对象格式化为字符串。&lt;/div&gt; &lt;div&gt;&lt;b&gt;%d, %i, %l, %f&lt;/b&gt; - 将对象格式化为数字。&lt;/div&gt;  &lt;div&gt;&lt;b&gt;%o&lt;/b&gt; - 将对象格式化成一个指向 inspector 的超链接。&lt;/div&gt; &lt;div&gt;&lt;b&gt;%1.o, %2.0, etc..&lt;/b&gt; - 将对象格式化成包含自己属性的可交互的表格。&lt;/div&gt; &lt;div&gt;&lt;b&gt;%.o&lt;/b&gt; - 将对象格式化成具有自身属性的一个数组。&lt;/div&gt; &lt;div&gt;&lt;b&gt;%x&lt;/b&gt; - 将对象格式化成一个可交互的 XML 树形结构。&lt;/div&gt;  &lt;div&gt;&lt;b&gt;%1.x, %2.x, etc..&lt;/b&gt; - 将对象格式化成一个可交互的 XML 数型结构，并且展开 &lt;i&gt;n&lt;/i&gt; 层节点。&lt;/div&gt;  &lt;p&gt;如果你需要一个真实的 % 符号，你可以通过一个转移符号就像这样 "\%"。  &lt;/p&gt;&lt;h2&gt;命令行函数&lt;/h2&gt;  &lt;p&gt;内建的命令行函数可以通过以下命令行使用： &lt;/p&gt;  &lt;div&gt;&lt;b&gt;$("id")&lt;/b&gt; - document.getElementById() 的简写。（译者注：跟 prototype.js 学来的吧？）&lt;/div&gt;  &lt;div&gt;&lt;b&gt;$$("css")&lt;/b&gt; - 返回一个符合 CSS 选择器的元素数组。&lt;/div&gt; &lt;div&gt;&lt;b&gt;$x("xpath")&lt;/b&gt; - 返回一个符合 XPath 选择器的元素数组。&lt;/div&gt; &lt;div&gt;&lt;b&gt;$0&lt;/b&gt; - 返回最近被检查（inspected）的对象。&lt;/div&gt; &lt;div&gt;&lt;b&gt;$1&lt;/b&gt; - 返回最近被检查（inspected）的下一个对象。&lt;/div&gt; &lt;div&gt;&lt;b&gt;$n(5)&lt;/b&gt; - 返回最近被检查的第n个对象。&lt;/div&gt;  &lt;div&gt;&lt;b&gt;inspect(object)&lt;/b&gt; - 将对象显示在 Inspector 中。&lt;/div&gt; &lt;div&gt;&lt;b&gt;dir(object)&lt;/b&gt; - 返回一个对象的属性名数组。（译者注：跟 Python 学的？）&lt;/div&gt; &lt;div&gt;&lt;b&gt;clear()&lt;/b&gt; - 清除控制台信息。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-4157769911040174524?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/4157769911040174524/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=4157769911040174524' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4157769911040174524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/4157769911040174524'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/01/firebug.html' title='FireBug 控制台函数说明'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-8193897190439382596</id><published>2007-01-22T16:06:00.001+08:00</published><updated>2008-11-19T05:16:02.013+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='数据结构'/><title type='text'>分类算法:在数据库中存储层次数据</title><content type='html'>&lt;h1 id="title"&gt;在数据库中存储层次数据&lt;/h1&gt;&lt;br /&gt;&lt;h4&gt;作者：&lt;a href="http://www.sitepoint.com/authorcontact/299/1105"&gt;Gijs Van Tulder&lt;/a&gt; 翻译：&lt;a href="http://wiki.nirvanastudio.org/wiki/ShiningRay"&gt;ShiningRay&lt;/a&gt; @ &lt;a href="http://www.nirvanastudio.org/"&gt;NirvanaStudio&lt;/a&gt; &lt;/h4&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;无论你要构建自己的论坛，在你的网站上发布消息还是书写自己的&lt;a href="http://www.sitepoint.com/print/%5C%22/glossary.php?q=C#term_28%5C%22" class="glossary" title="A cms or Content Management System is an application designed to store format reproduce and manage web data"&gt;cms&lt;/a&gt; &lt;span class="tiny"&gt;[1]&lt;/span&gt;程序，你都会遇到要在数据库中存储层次数据的情况。同时，除非你使用一种像&lt;a href="http://www.sitepoint.com/print/%5C%22/glossary.php?q=X#term_3%5C%22" class="glossary" title="eXtensible Markup Language or XML is a text markup language designed for the easy sharing of data"&gt;XML&lt;/a&gt; &lt;span class="tiny"&gt;[2]&lt;/span&gt;的数据库，否则关系数据库中的表都不是层次结构的，他们只是一个平坦的列表。所以你必须找到一种把层次数据库转化的方法。&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;存储树形结构是一个很常见的问题，他有好几种解决方案。主要有两种方法：邻接列表模型和改进前序遍历树算法&lt;/p&gt;&lt;br /&gt;&lt;p&gt;在本文中，我们将探讨这两种保存层次数据的方法。我将举一个在线食品店树形图的例子。这个食品店通过类别、颜色和品种来组织食品。树形图如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VAq5TiI/AAAAAAAAAAM/jF8m59RbyCs/s1600-h/sitepoint_tree.gif"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VAq5TiI/AAAAAAAAAAM/jF8m59RbyCs/s320/sitepoint_tree.gif" alt="" id="BLOGGER_PHOTO_ID_5022770687265820194" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;本文包含了一些代码的例子来演示如何保存和获取数据。我选择&lt;a href="http://www.sitepoint.com/print/%5C%22/glossary.php?q=P#term_1%5C%22" class="glossary" title="PHP, or hypertext preprocessor is an open source server-side programming language"&gt;PHP&lt;/a&gt; &lt;span class="tiny"&gt;[3]&lt;/span&gt;来写例子，因为我常用这个语言，而且很多人也都使用或者知道这个语言。你可以很方便地把它们翻译成你自己用的语言。&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;邻接列表模型(The Adjacency List Model)&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;我们要尝试的第一个--也是最优美的--方法称为"邻接列表模型"或称为"递归方法"。它是一个很优雅的方法因为你只需要一个简单的方法来在你的树中进行迭代。在我们的食品店中，邻接列表的表格如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VAq5TjI/AAAAAAAAAAU/Yfd2Y4gW6lI/s1600-h/table01.gif"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VAq5TjI/AAAAAAAAAAU/Yfd2Y4gW6lI/s320/table01.gif" alt="" id="BLOGGER_PHOTO_ID_5022770687265820210" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如你所见，对每个节点保存一个"父"节点。我们可以看到"&lt;a href="http://www.sitepoint.com/print/%5C%22/glossary.php?q=P#term_50%5C%22" class="glossary" title="The extension application repository - a framework and distribution system for reusable php components"&gt;Pear&lt;/a&gt; &lt;span class="tiny"&gt;[4]&lt;/span&gt;"是"Green"的一个子节点，而后者又是"Fruit"的子节点，如此类推。根节点，"Food"，则他的父节点没有值。为了简单，我只用了"title"值来标识每个节点。当然，在实际的数据库中，你要使用数字的ID。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;显示树&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;现在我们已经把树放入数据库中了，得写一个显示函数了。这个函数将从根节点开始--没有父节点的节点--同时要显示这个节点所有的子节点。对于这些子节点，函数也要获取并显示这个子节点的子节点。然后，对于他们的子节点，函数还要再显示所有的子节点，然后依次类推。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;也许你已经注意到了，这种函数的描述，有一种普遍的模式。我们可以简单地只写一个函数，用来获得特定节点的子节点。这个函数然后要对每个子节点调用自身来再次显示他们的子节点。这就是"递归"机制，因此称这种方法叫"递归方法"。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;// $parent 是我们要查看的子节点的父节点&lt;br /&gt;// $level 会随着我们深入树的结构而不断增加，&lt;br /&gt;// 用来显示一个清晰的缩进格式&lt;br /&gt;function display_children($parent, $level) {&lt;br /&gt;  // 获取$parent的全部子节点&lt;br /&gt;  $result = mysql_query('SELECT title FROM tree ' . 'WHERE parent="' . $parent . '";');&lt;br /&gt;&lt;br /&gt;  // 显示每个节点&lt;br /&gt;  while ($row = mysql_fetch_array($result)) {&lt;br /&gt;    // 缩进并显示他的子节点的标题&lt;br /&gt;    echo str_repeat(' ',$level).$row['title']."\n";&lt;br /&gt;&lt;br /&gt;    // 再次调用这个函数来显着这个子节点的子节点&lt;br /&gt;    display_children($row['title'], $level+1);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;要实现整个树，我们只要调用函数时用一个空字符串作为 $parent 和 $level = 0: display_children('',0); 函数返回了我们的食品店的树状图如下：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;  Food&lt;br /&gt;  Fruit&lt;br /&gt;  Red&lt;br /&gt;  Cherry&lt;br /&gt;  Yellow&lt;br /&gt;  Banana&lt;br /&gt;  Meat&lt;br /&gt;  Beef&lt;br /&gt;  Pork&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;注意如果你只想看一个子树，你可以告诉函数从另一个节点开始。例如，要显示"Fruit"子树，你只要 display_children('Fruit',0); &lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Path to a Node节点的路径&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;利用差不多的函数，我们也可以查询某个节点的路径如果你只知道这个节点的名字或者ID。例如，"Cherry"的路径是"Food"&amp;gt; "Fruit"&amp;gt;"Red"。要获得这个路径，我们的函数要获得这个路径，这个函数必须从最深的层次开始："Cheery"。但后查找这个节点的父节点，并添加到路径中。在我们的例子中，这个父节点是"Red"。如果我们知道"Red"是"Cherry"的父节点。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;// $node 是我们要查找路径的那个节点的名字&lt;br /&gt;function get_path($node) {&lt;br /&gt;  // 查找这个节点的父节点&lt;br /&gt;  $result = mysql_query('SELECT parent FROM tree ' . 'WHERE title="' . $node . '";');&lt;br /&gt;  $row = mysql_fetch_array($result);&lt;br /&gt;&lt;br /&gt;  // 在这个&lt;a href="http://www.sitepoint.com/print/%5C%22/glossary.php?q=%23#term_72%5C%22" class="glossary" title="An array is single variable with compartments each of which can hold a value"&gt;array&lt;/a&gt; &lt;span class="tiny"&gt;[5]&lt;/span&gt; 中保存数组&lt;br /&gt;  $path = array();&lt;br /&gt;&lt;br /&gt;  // 如果 $node 不是根节点，那么继续&lt;br /&gt;  if ($row['parent']!='') {&lt;br /&gt;    // $node 的路径的最后一部分是$node父节点的名称&lt;br /&gt;    $path[] = $row['parent'];&lt;br /&gt;&lt;br /&gt;    // 我们要添加这个节点的父节点的路径到现在这个路径&lt;br /&gt;    $path = array_merge(get_path($row['parent']), $path);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // 返回路径&lt;br /&gt;  return $path;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这个函数现在返回了指定节点的路径。他把路径作为数组返回，这样我们可以使用&lt;code&gt;print_r(get_path('Cherry'));&lt;/code&gt; 来显示，其结果是：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;Array&lt;br /&gt;  (&lt;br /&gt;  [0] =&amp;gt; Food&lt;br /&gt;  [1] =&amp;gt; Fruit&lt;br /&gt;  [2] =&amp;gt; Red&lt;br /&gt;  )&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;不足&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;正如我们所见，这确实是一个很好的方法。他很容易理解，同时代码也很简单。但是邻接列表模型的缺点在哪里呢？在大多数编程语言中，他运行很慢，效率很差。这主要是"递归"造成的。我们每次查询节点都要访问数据库。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;每次数据库查询都要花费一些时间，这让函数处理庞大的树时会十分慢。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;造成这个函数不是太快的第二个原因可能是你使用的语言。不像Lisp这类语言，大多数语言不是针对递归函数设计的。对于每个节点，函数都要调用他自己，产生新的实例。这样，对于一个4层的树，你可能同时要运行4个函数副本。对于每个函数都要占用一块内存并且需要一定的时间初始化，这样处理大树时递归就很慢了。&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;改进前序遍历树&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;现在，让我们看另一种存储树的方法。递归可能会很慢，所以我们就尽量不使用递归函数。我们也想尽量减少数据库查询的次数。最好是每次只需要查询一次。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我们先把树按照水平方式摆开。从根节点开始（"Food"），然后他的左边写上1。然后按照树的顺序（从上到下）给"Fruit"的左边写上2。这样，你沿着树的边界走啊走（这就是"遍历"），然后同时在每个节点的左边和右边写上数字。最后，我们回到了根节点"Food"在右边写上18。下面是标上了数字的树，同时把遍历的顺序用箭头标出来了。&lt;/p&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR39Qq5ToI/AAAAAAAAAA8/jqghSFKS1zo/s1600-h/sitepoint_numbering.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR39Qq5ToI/AAAAAAAAAA8/jqghSFKS1zo/s320/sitepoint_numbering.gif" alt="" id="BLOGGER_PHOTO_ID_5022771378755554946" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.nirvanastudio.org/wp-content/uploads/2006/04/sitepoint_numbering.gif"&gt; &lt;/a&gt;&lt;br /&gt;&lt;p&gt;我们称这些数字为左值和右值（如，"Food"的左值是1，右值是18）。正如你所见，这些数字按时了每个节点之间的关系。因为"Red"有3和6 两个值，所以，它是有拥有1-18值的"Food"节点的后续。同样的，我们可以推断所有左值大于2并且右值小于11的节点，都是有2-11的 "Food"节点的后续。这样，树的结构就通过左值和右值储存下来了。这种数遍整棵树算节点的方法叫做"改进前序遍历树"算法。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;在继续前，我们先看看我们的表格里的这些值：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VQq5TlI/AAAAAAAAAAk/2MYDtwm7ew0/s1600-h/table02.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VQq5TlI/AAAAAAAAAAk/2MYDtwm7ew0/s320/table02.gif" alt="" id="BLOGGER_PHOTO_ID_5022770691560787538" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;注意单词"left"和"right"在SQL中有特殊的含义。因此，我们只能用"lft"和"rgt"来表示这两个列。（译注--其实Mysql 中可以用"`"来表示，如"`left`"，MSSQL中可以用"[]"括出，如"[left]"，这样就不会和关键词冲突了。）同样注意这里我们已经不需要"parent"列了。我们只需要使用lft和rgt就可以存储树的结构。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;获取树&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如果你要通过左值和右值来显示这个树的话，你要首先标识出你要获取的那些节点。例如，如果你想获得"Fruit"子树，你要选择那些左值在2到11的节点。用SQL语句表达：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这个会返回：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VQq5TmI/AAAAAAAAAAs/S6R5wF2lAUk/s1600-h/table03.gif"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VQq5TmI/AAAAAAAAAAs/S6R5wF2lAUk/s320/table03.gif" alt="" id="BLOGGER_PHOTO_ID_5022770691560787554" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;好吧，现在整个树都在一个查询中了。现在就要像前面的递归函数那样显示这个树，我们要加入一个ORDER BY子句在这个查询中。如果你从表中添加和删除行，你的表可能就顺序不对了，我们因此需要按照他们的左值来进行排序。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;就只剩下缩进的问题了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;要显示树状结构，子节点应该比他们的父节点稍微缩进一些。我们可以通过保存一个右值的一个栈。每次你从一个节点的子节点开始时，你把这个节点的右值添加到栈中。你也知道子节点的右值都比父节点的右值小，这样通过比较当前节点和栈中的前一个节点的右值，你可以判断你是不是在显示这个父节点的子节点。当你显示完这个节点，你就要把他的右值从栈中删除。要获得当前节点的层数，只要数一下栈中的元素。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;function display_tree($root) {&lt;br /&gt;  // 获得$root节点的左边和右边的值&lt;br /&gt;  $result = mysql_query('SELECT lft, rgt FROM tree ' . 'WHERE title="' . $root . '";');&lt;br /&gt;  $row = mysql_fetch_array($result);&lt;br /&gt;  &lt;br /&gt;  // 以一个空的$right栈开始&lt;br /&gt;  $right = array();&lt;br /&gt;  &lt;br /&gt;  // 现在，获得$root节点的所有后序&lt;br /&gt;  $result = mysql_query('SELECT title, lft, rgt FROM tree ' .&lt;br /&gt;  'WHERE lft BETWEEN '.$row['lft'].' AND '.&lt;br /&gt;  $row['rgt'].' ORDER BY lft ASC;');&lt;br /&gt;  &lt;br /&gt;  // 显示每一行&lt;br /&gt;  while ($row = mysql_fetch_array($result)) {&lt;br /&gt;    // 检查栈里面有没有元素&lt;br /&gt;    if (count($right)&amp;gt;0) {&lt;br /&gt;      // 检查我们是否需要从栈中删除一个节点&lt;br /&gt;      while ($right[count($right)-1]&amp;lt;$row['rgt']) {&lt;br /&gt;      array_pop($right);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // 显示缩进的节点标题&lt;br /&gt;  echo str_repeat(' ',count($right)).$row['title']."\n";&lt;br /&gt;  &lt;br /&gt;  // 把这个节点添加到栈中&lt;br /&gt;  $right[] = $row['rgt'];&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如果运行这段代码，你可以获得和上一部分讨论的递归函数一样的结果。而这个函数可能会更快一点：他不采用递归而且只是用了两个查询&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;节点的路径&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;有了新的算法，我们还要另找一种新的方法来获得指定节点的路径。这样，我们就需要这个节点的祖先的一个列表。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;由于新的表结构，这不需要花太多功夫。你可以看一下，例如，4-5的"Cherry"节点，你会发现祖先的左值都小于4，同时右值都大于5。这样，我们就可以使用下面这个查询：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;SELECT title FROM tree WHERE lft &amp;lt; 4 AND rgt &amp;gt; 5 ORDER BY lft ASC;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;注意，就像前面的查询一样，我们必须使用一个ORDER BY子句来对节点排序。这个查询将返回：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&lt;br /&gt;  +-------+&lt;br /&gt;  | title |&lt;br /&gt;  +-------+&lt;br /&gt;  | Food  |&lt;br /&gt;  | Fruit |&lt;br /&gt;  | Red   |&lt;br /&gt;  +-------+&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我们现在只要把各行连起来，就可以得到"Cherry"的路径了。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;有多少个后续节点？How Many Descendants&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如果你给我一个节点的左值和右值，我就可以告诉你他有多少个后续节点，只要利用一点点数学知识。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;因为每个后续节点依次会对这个节点的右值增加2，所以后续节点的数量可以这样计算：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;descendants = (right - left - 1) / 2&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;利用这个简单的公式，我可以立刻告诉你2-11的"Fruit"节点有4个后续节点，8-9的"Banana"节点只是1个子节点，而不是父节点。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;自动化树遍历&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;现在你对这个表做一些事情，我们应该学习如何自动的建立表了。这是一个不错的练习，首先用一个小的树，我们也需要一个脚本来帮我们完成对节点的计数。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;让我们先写一个脚本用来把一个邻接列表转换成前序遍历树表格。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;function rebuild_tree($parent, $left) {&lt;br /&gt;  // 这个节点的右值是左值加1&lt;br /&gt;  $right = $left+1;&lt;br /&gt;  &lt;br /&gt;  // 获得这个节点的所有子节点&lt;br /&gt;  $result = mysql_query('SELECT title FROM tree '.&lt;br /&gt;  'WHERE parent="'.$parent.'";');&lt;br /&gt;&lt;br /&gt;  while ($row = mysql_fetch_array($result)) {&lt;br /&gt;    // 对当前节点的每个子节点递归执行这个函数&lt;br /&gt;    // $right 是当前的右值，它会被rebuild_tree函数增加&lt;br /&gt;    $right = rebuild_tree($row['title'], $right);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // 我们得到了左值，同时现在我们已经处理这个节点我们知道右值的子节点&lt;br /&gt;  mysql_query('UPDATE tree SET lft='.$left.', rgt='.&lt;br /&gt;  $right.' WHERE title="'.$parent.'";');&lt;br /&gt;  &lt;br /&gt;  // 返回该节点的右值+1&lt;br /&gt;  return $right+1;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;这是一个递归函数。你要从&lt;code&gt;rebuild_tree('Food',1);&lt;/code&gt; 开始，这个函数就会获取所有的"Food"节点的子节点。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如果没有子节点，他就直接设置它的左值和右值。左值已经给出了，1，右值则是左值加1。如果有子节点，函数重复并且返回最后一个右值。这个右值用来作为"Food"的右值。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;递归让这个函数有点复杂难于理解。然而，这个函数确实得到了同样的结果。他沿着树走，添加每一个他看见的节点。你运行了这个函数之后，你会发现左值和右值和预期的是一样的（一个快速检验的方法：根节点的右值应该是节点数量的两倍）。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;添加一个节点&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我们如何给这棵树添加一个节点？有两种方式：在表中保留"parent"列并且重新运行&lt;code&gt;rebuild_tree()&lt;/code&gt; 函数--一个很简单但却不是很优雅的函数；或者你可以更新所有新节点右边的节点的左值和右值。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;第一个想法比较简单。你使用邻接列表方法来更新，同时使用改进前序遍历树来查询。如果你想添加一个新的节点，你只需要把节点插入表格，并且设置好parent列。然后，你只需要重新运行&lt;code&gt;rebuild_tree()&lt;/code&gt; 函数。这做起来很简单，但是对大的树效率不高。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;第二种添加和删除节点的方法是更新新节点右边的所有节点。让我们看一下例子。我们要添加一种新的水果--"Strawberry"，作为"Red" 的最后一个子节点。首先，我们要腾出一个空间。"Red"的右值要从6变成8，7-10的"Yellow"节点要变成9-12，如此类推。更新"Red" 节点意味着我们要把所有左值和右值大于5的节点加上2。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;我们用一下查询：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;UPDATE tree SET rgt=rgt+2 WHERE rgt&amp;gt;5;&lt;br /&gt;  UPDATE tree SET lft=lft+2 WHERE lft&amp;gt;5;&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;现在我们可以添加一个新的节点"Strawberry"来填补这个新的空间。这个节点左值为6右值为7。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;INSERT INTO tree SET lft=6, rgt=7, title='Strawberry';&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;如果我们运行&lt;code&gt;display_tree()&lt;/code&gt; 函数，我们将发现我们新的"Strawberry"节点已经成功地插入了树中：&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;code&gt;  Food&lt;br /&gt;  Fruit&lt;br /&gt;  Red&lt;br /&gt;  Cherry&lt;br /&gt;  Strawberry&lt;br /&gt;  Yellow&lt;br /&gt;  Banana&lt;br /&gt;  Meat&lt;br /&gt;  Beef&lt;br /&gt;  Pork&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;缺点&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;首先，改进前序遍历树算法看上去很难理解。它当然没有邻接列表方法简单。然而，一旦你习惯了左值和右值这两个属性，他就会变得清晰起来，你可以用这个技术来完成临街列表能完成的所有事情，同时改进前序遍历树算法更快。当然，更新树需要很多查询，要慢一点，但是取得节点却可以只用一个查询。&lt;/p&gt;&lt;br /&gt;&lt;h5&gt;总结&lt;/h5&gt;&lt;br /&gt;&lt;p&gt;你现在已经对两种在数据库存储树方式熟悉了吧。虽然在我这儿改进前序遍历树算法性能更好，但是也许在你特殊的情况下邻接列表方法可能表现更好一些。这个就留给你自己决定了&lt;/p&gt;&lt;br /&gt;&lt;p&gt;最后一点：就像我已经说得我部推荐你使用节点的标题来引用这个节点。你应该遵循数据库标准化的基本规则。我没有使用数字标识是因为用了之后例子就比较难读。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;进一步阅读&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;数据库指导 Joe Celko写的更多关于SQL数据库中的树的问题： &lt;a href="http://www.sitepoint.com/print/%5C%22http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html%5C%22" class="sublink" rel="external"&gt;http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html&lt;/a&gt; &lt;span class="tiny"&gt;[6]&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;另外两种处理层次数据的方法： &lt;a href="http://www.sitepoint.com/print/%5C%22http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html%5C%22" class="sublink" rel="external"&gt;http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html&lt;/a&gt; &lt;span class="tiny"&gt;[7]&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Xindice, "本地XML数据库": &lt;a href="http://www.sitepoint.com/print/%5C%22http://xml.apache.org/xindice/%5C%22" class="sublink" rel="external"&gt;http://xml.apache.org/xindice/&lt;/a&gt; &lt;span class="tiny"&gt;[8]&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;递归的一个解释: &lt;a href="http://www.sitepoint.com/print/%5C%22http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html%5C%22" class="sublink" rel="external"&gt;http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html&lt;/a&gt; &lt;span class="tiny"&gt;[9]&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p class="tiny"&gt;[1] /glossary.php?q=C#term_28&lt;br /&gt;  [2] /glossary.php?q=X#term_3&lt;br /&gt;  [3] /glossary.php?q=P#term_1&lt;br /&gt;  [4] /glossary.php?q=P#term_50&lt;br /&gt;  [5] /glossary.php?q=%23#term_72&lt;br /&gt;  [6] http://searchdatabase.techtarget.com/tip/1,289483,sid13_gci537290,00.html&lt;br /&gt;  [7] http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html&lt;br /&gt;  [8] http://xml.apache.org/xindice/&lt;br /&gt;  [9] http://www.strath.ac.uk/IT/Docs/Ccourse/subsection3_9_5.html&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-8193897190439382596?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/8193897190439382596/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=8193897190439382596' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8193897190439382596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/8193897190439382596'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/01/blog-post.html' title='分类算法:在数据库中存储层次数据'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_s4Vg-1g_MuU/RbR3VAq5TiI/AAAAAAAAAAM/jF8m59RbyCs/s72-c/sitepoint_tree.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-3467071365607155669</id><published>2007-01-22T15:03:00.000+08:00</published><updated>2007-01-22T15:47:31.770+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>Zend framwork Components Roadmap</title><content type='html'>&lt;div class="roadmap"&gt;             &lt;h2&gt;Components Roadmap&lt;/h2&gt;          &lt;br /&gt;          &lt;p&gt;                 Here you will find an overview of the direction of framework development                 with respect to upcoming releases and affected framework components.             &lt;/p&gt;          &lt;br /&gt;          &lt;h3&gt;Zend Framework 1.0.0 Release Candidate (RC1)&lt;/h3&gt;             &lt;p&gt;                 We are currently targeting development in many areas for a 1.0.0 release candidate,                 and these are outlined below by components grouped by purpose.                 &lt;a href="http://framework.zend.com/issues/secure/BrowseProject.jspa"&gt;View the outstanding issues in Zend Framework&lt;/a&gt;             &lt;/p&gt;              &lt;h4&gt;Authentication &amp; Authorization&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Acl&lt;/li&gt;&lt;li&gt;Zend_Authentication&lt;/li&gt;&lt;li&gt;Zend_Session&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Core Infrastructure&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Cache, Zend_Config, Zend_Console_Getopt, Zend_Filter, Zend_Log, Zend_Memory&lt;/li&gt;&lt;li&gt;Zend_Registry, Zend_Validate&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Databases&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Db&lt;/li&gt;&lt;li&gt;Zend_Db_Table&lt;/li&gt;&lt;li&gt;Zend_Db_Xml&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Documentation&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Improved correctness, readability, and more examples&lt;/li&gt;&lt;li&gt;Additional coverage by translation teams&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Internationalization (i18n) &amp;amp; Localization (l10n)&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Locale&lt;/li&gt;&lt;li&gt;Zend_Date, Zend_Calendar&lt;/li&gt;&lt;li&gt;Zend_Translate&lt;/li&gt;&lt;li&gt;Zend_Currency, Zend_Measure&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Mail, Formats, &amp; Search&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Json, Zend_Pdf&lt;/li&gt;&lt;li&gt;Zend_Mail, Zend_Mime&lt;/li&gt;&lt;li&gt;Zend_Search_Lucene&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Model-View-Controller (MVC)&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Zend_Controller, Zend_Controller_Action, Zend_Controller_Dispatcher, Zend_Controller_Plugin, Zend_Controller_RewriteRouter, Zend_View&lt;/li&gt;&lt;li&gt;Zend_Http_Request, Zend_Http_Response&lt;/li&gt;&lt;/ul&gt;              &lt;h4&gt;Web &amp;amp; Web Services&lt;/h4&gt;             &lt;ul&gt;&lt;li&gt;Consuming services: Zend_Feed, Zend_Rest_Client, Zend_Service, Zend_XmlRpc_Client, Zend_Gdata, Zend_Http_Client&lt;/li&gt;&lt;li&gt;Exposing services: Zend_Http_Server, Zend_Rest_Server, Zend_Server_Documentor, Zend_Server_Reflection, Zend_Soap_Server, Zend_XmlRpc_Server&lt;/li&gt;&lt;li&gt;Zend_Uri&lt;/li&gt;&lt;/ul&gt;          &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-3467071365607155669?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/3467071365607155669/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=3467071365607155669' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3467071365607155669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3467071365607155669'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/01/zend-framwork-components-roadmap.html' title='Zend framwork Components Roadmap'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-879235596705068678</id><published>2007-01-01T20:41:00.000+08:00</published><updated>2007-01-01T20:52:36.378+08:00</updated><title type='text'>Happy new year!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.google.com/logos/newyear07res.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px;" src="http://www.google.com/logos/newyear07res.gif" alt="" border="0" /&gt;&lt;/a&gt;2007新年&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-879235596705068678?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/879235596705068678/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=879235596705068678' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/879235596705068678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/879235596705068678'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2007/01/happy-new-year.html' title='Happy new year!'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-835364526533228098</id><published>2006-12-23T12:47:00.001+08:00</published><updated>2009-05-02T20:08:17.498+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>一些有用的 FireFox 扩展</title><content type='html'>&lt;ul&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/1865/"&gt;Adblock Plus&lt;/a&gt; 广告已成往事！&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/2410/"&gt;Foxmarks Bookmark Synchronizer&lt;/a&gt; 书签同步，方便在多台机器上使用书签，比如在公司和家里。你会爱上书签的：）&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/2464/"&gt;FoxyProxy&lt;/a&gt; + &lt;a href="http://tor.eff.org/"&gt;Tor&lt;/a&gt; 通过代理浏览网页。FoxyProxy 可以依据规则设置某些页面通过代理浏览，不用再来回切换代理设置啦！Tor 是洋葱代理(数据经过节点都会加密，最终像洋葱一样一层一层，形象吧)，某人有句名言：操GFW前记得戴tor。&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/1320/"&gt;Gmail Manager&lt;/a&gt; Gmail管理，支持多个帐号&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/189/"&gt;GooglePreview&lt;/a&gt; 在Google搜索结果页插入缩略图&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/1419/"&gt;IE Tab&lt;/a&gt; 可以使用嵌入IE内核浏览。对付那些糟糕的IE only站点。(注：IE Tab 存在内存泄露，可以使用&lt;a href="https://addons.mozilla.org/firefox/1429/"&gt;IE View Lite&lt;/a&gt;替代，在IE中打开当前页面)&lt;/li&gt;&lt;li&gt;&lt;strike&gt;&lt;a href="https://addons.mozilla.org/firefox/722/"&gt;NoScript&lt;/a&gt; 提供额外的安全保护，禁止JavaScript脚本运行。根据您的选择，只允许受信任的站点启用JavaScript。&lt;/strike&gt;&lt;span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry"&gt; (鉴于作者的做法和用心，决定不再使用此扩展，参见Adblock Plus作者的&lt;a href="http://adblockplus.org/blog/attention-noscript-users"&gt;blog&lt;/a&gt;）&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/4258/"&gt;Tab Effect&lt;/a&gt; 标签3D特效,Coooool! &lt;a href="http://www.youtube.com/watch?v=tO8yfVkBVvM"&gt;看看效果&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;开发人员工具：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/1843/"&gt;FireBug&lt;/a&gt; JavaScript 调试工具，可以单步跟踪，可以显示XMLHttpRequests，调试AJAX利器，开发人员必备。&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-CN/firefox/addon/6149"&gt;FirePHP&lt;/a&gt; FireBug 插件，为 php 应用程序提供调试和日志功能。&lt;/li&gt;&lt;li&gt;&lt;a href="http://users.skynet.be/mgueury/mozilla/"&gt;Html Validator&lt;/a&gt; HTML 语法校验。mozilla 上的版本有点老， 目前 0.8 系列版本工作得很好。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/539/"&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/firefox/60/"&gt;Web Developer Toolbar &lt;/a&gt;可以调试目前浏览网站的Cookies，CSS，图片，页面信息，窗口大小，还可以查看源代码，还有实用的工具。&lt;a href="https://addons.mozilla.org/firefox/722/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-835364526533228098?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/835364526533228098/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=835364526533228098' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/835364526533228098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/835364526533228098'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2006/12/firefox.html' title='一些有用的 FireFox 扩展'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-897659220468968877</id><published>2006-12-21T00:44:00.000+08:00</published><updated>2008-11-19T05:16:02.155+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Science'/><category scheme='http://www.blogger.com/atom/ns#' term='Physics'/><title type='text'>The Gauss Rifle 高斯步枪:磁直线加速器</title><content type='html'>&lt;div&gt;原帖: http://aminghome.blogspot.com/2006/12/gauss-rifle.html&lt;br /&gt;&lt;/div&gt;&lt;p style="text-align: center;"&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Z7CyPtF0ChA"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/Z7CyPtF0ChA" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;这是一个非常简单的玩具，利用磁场的连锁加速来高速发射一粒钢珠。这个玩具很容易做，只要几分钟，也很容易解释和理解，很有观赏性。&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_uIOalUYSx-g/RYO3YLngz3I/AAAAAAAAAD0/lnFjvsSeSwU/s320/one_frame_slomo5.jpg" alt="" id="BLOGGER_PHOTO_ID_5009048836629385074" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;简单的材料：我们需要一根在顶部带有小槽的木尺,一粒钢珠可以在槽中轻易滚动。任何一块带槽的木头或者铜或铝都可以。我们选则木尺，是因为在我们家或者学校周围或者当地文具商店很容易找到。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_uIOalUYSx-g/RYO39rngz5I/AAAAAAAAAEE/10Ibv00KZ28/s320/small_materials.jpg" alt="" id="BLOGGER_PHOTO_ID_5009049480874479506" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;我们需要一些胶带纸.同样，几乎任何一种都行。这里我们用Scotch牌的透明胶带,用乙烯电胶布也可以。&lt;br /&gt;&lt;br /&gt;我们需要四个磁铁块. 任何类型的都可以，但是用磁力越强的磁铁，钢珠就会加速越快。这里我们用超强镀金钕铁硼磁铁，在我们的其它项目中用到过。&lt;br /&gt;&lt;br /&gt;我们还需要九粒钢珠、直径与磁铁的高度相当。 我们用五/8英寸口径的镀镍钢球。&lt;br /&gt;&lt;br /&gt;我们最后需要一把锋利的刀来切割胶带纸。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_uIOalUYSx-g/RYO4NLngz6I/AAAAAAAAAEM/KuS9GfwGLfc/s320/small_first_magnet.jpg" alt="" id="BLOGGER_PHOTO_ID_5009049747162451874" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;我们先贴第一磁铁到尺子的在2.5英寸处。距离有点乱--我们想让所有四个磁石放在同一尺寸内，便于以后距离的计算。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_uIOalUYSx-g/RYO4g7ngz7I/AAAAAAAAAEU/RlIx_NfKC4I/s320/small_cut_the_tape.jpg" alt="" id="BLOGGER_PHOTO_ID_5009050086464868274" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;用刀片修剪多余部分胶带纸时，要小心，因为刀片会被磁铁吸引。&lt;br /&gt;&lt;br /&gt;这很重要，防止磁铁碰撞在一起， 他们是用脆性材料烧结的像陶瓷一样易碎。把尺子暂时固定在桌子上，防止跳起来，然后把下一个磁铁固定到尺子上。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_uIOalUYSx-g/RYO4ubngz8I/AAAAAAAAAEc/i_JHkwa2MwI/s320/small_two_magnets.jpg" alt="" id="BLOGGER_PHOTO_ID_5009050318393102274" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;四个磁铁都固定好后，就可以开始给高斯步枪装弹了。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_uIOalUYSx-g/RYO47bngz9I/AAAAAAAAAEk/-KH9KjFhCq0/s320/small_all_magnets.jpg" alt="" id="BLOGGER_PHOTO_ID_5009050541731401682" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;每块磁铁的右边放两粒钢珠，小心不要掉下来。&lt;br /&gt;&lt;br /&gt;高斯枪发射：设置一粒钢珠在最左边的磁铁的导轨上，滚动球。越靠近磁铁，它受磁铁吸引越大，开始自己滚动撞击磁铁。&lt;br /&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_uIOalUYSx-g/RYO5JLngz-I/AAAAAAAAAEs/N8HtzDIycHg/s320/small_ready_to_fire.jpg" alt="" id="BLOGGER_PHOTO_ID_5009050777954602978" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;高斯枪发射时，过程太快，看不清楚，右边的钢珠以相当的力量射出。我们这个一尺长的版本的高斯枪速度不够快，不会有什么伤害，你可以用你的手或脚作为目标。&lt;br /&gt;&lt;br /&gt;这是如何做到的呢?&lt;br /&gt;&lt;br /&gt;当你滚动第一个球，为第一块磁铁所吸引，一相当的力量击中磁块，我们称这个动能为“一个单位”。&lt;br /&gt;&lt;br /&gt;钢珠的动能传递到磁铁，磁铁再传递到下一粒钢珠，再传递到另一个，像打台球一样。第三个球获得了“一个单位”的动能在运动，受到第二块磁铁的吸引加速，当它命中第二块磁铁时，速度差不多是原来的两倍了。&lt;br /&gt;&lt;br /&gt;第三球撞击后，第五球以“二个单位”的动能飞出，同样加速撞击第三磁块，获得“三个单位”的动能，到第七个球撞击第四磁块，加速结束，这样累加起来，共获得了4个单位的动能，并传递给最后一个球，以4倍动能飞出命中目标。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;从另一角度看机理&lt;br /&gt;&lt;br /&gt;当装置设置好准备启动，我们看到有4个球紧贴着磁块。这些球处在物理学家称之为“磁场”的状态中，把它们从磁铁移开需要能量。&lt;br /&gt;&lt;br /&gt;但是所有这些球都有另外一个球贴着它，这第二个球不在“磁场”中，它们在离磁块5/8英寸的位置，它们比贴着磁块的球，更容易移动。&lt;br /&gt;&lt;br /&gt;假如我们要把贴着磁块的球移动到5/8英寸的位置，我们需要加能量到球上。球被以相当的力拉向磁块，我们放手的话，球的动能就又回来了。&lt;br /&gt;&lt;br /&gt;高斯枪发射后，状态就不一样了。现在有两个球紧贴磁块。磁块两边都有一个球。每个球都在“磁场”中，释放了处在离磁铁5/8英寸的位置所储存的能量，这个能量被传递给了最后一个球，用来摧毁目标。&lt;br /&gt;&lt;br /&gt;速度与动能&lt;br /&gt;&lt;br /&gt;一 个物体的动能定义为：1/2质量乘以速度的平方。由于每块磁块的推动，动能线形增加，但速度并不是线形增加。假如我有4个磁块，动能是4，但速度增加的是 动能的平方根。因此我们增加磁块，速度每次增加的量很小。球滚动的距离和破坏力是一个动能方程，因此也是一个磁块多少的方程。&lt;br /&gt;&lt;br /&gt;我们可以不断放大，直到最后的动能使磁铁被冲击力粉碎。这之后，再增加磁块，就没有什么作用了。&lt;br /&gt;&lt;br /&gt;为什么圆形轨道不会成为永动装置？&lt;br /&gt;&lt;br /&gt;假如用圆形轨道，我们是不是将得到免费能源,或者可以永远加速？&lt;br /&gt;&lt;br /&gt;引用一句名言回答：“&lt;span style="font-weight: bold;"&gt;在世界上分两种人--一种理解热力学第二定律，一种不理解。&lt;/span&gt;”&lt;br /&gt;&lt;br /&gt;假设你已经建了一个圆形轨道，在每个磁块后放了两个球。当最后一个球释放，碰到磁块，这个磁块有两个球在磁场中，就没有能量从这个磁块贡献出来。&lt;br /&gt;&lt;br /&gt;翻译自：http://www.scitoys.com/scitoys/scitoys/magnets/gauss.html&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-897659220468968877?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/897659220468968877/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=897659220468968877' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/897659220468968877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/897659220468968877'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2006/12/gauss-rifle.html' title='The Gauss Rifle 高斯步枪:磁直线加速器'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_uIOalUYSx-g/RYO3YLngz3I/AAAAAAAAAD0/lnFjvsSeSwU/s72-c/one_frame_slomo5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-7674988586681096855</id><published>2006-12-21T00:19:00.000+08:00</published><updated>2006-12-21T00:21:54.828+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='设计模式'/><title type='text'>模式的数学定义</title><content type='html'>转自 &lt;a href="http://axgle.com/?p=193"&gt;axgle&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;模式(pattern),是个很普遍的概念.设计模式里讲模式,正则表达式中也说模式.那么模式到底如何定义呢?&lt;br /&gt;我想用数学中的集合来给模式下一个定义:&lt;br /&gt;&lt;strong&gt;给定集合U,若存在映射F,使得S=F(U)并且S⊆U,则映射F就是集合U上的一个模式(pattern).&lt;/strong&gt;&lt;br /&gt;上面用数学语言描述,是最精确的,但往往不符合人们的直觉;而若用直觉性的例子来描述,则又欠准确.注意,我下面就用例子来描述:&lt;br /&gt;考虑一下我们的”需求”,按照模式的定义,人类的需求就是一种模式:对于任意事物U,存在需求F,使得S=F(U)并且S⊆U.这是什么意思?&lt;br /&gt;通俗的说,我们人类面对的是千千万万,无穷无尽的东西,但我们并不对所有的东西感兴趣,所以只筛选我们需要的一部分.正是在需求的模式下,让我们去匹配和寻找我们想要的东西,所以说,需求是一种模式.&lt;br /&gt;同样的,设计模式也是模式,正则表达式中的模式也是模式,都符合我对模式的数学定义.&lt;br /&gt;根据模式的定义可以看出,在模式的作用下,集合S⊆U,换句话说,集合S是集合U的子集.奇妙的事情就发生在这里:自由与束缚的悖论由此产生…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-7674988586681096855?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/7674988586681096855/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=7674988586681096855' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7674988586681096855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/7674988586681096855'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2006/12/blog-post.html' title='模式的数学定义'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5882547617466196949.post-3444336408323659748</id><published>2006-12-21T00:18:00.000+08:00</published><updated>2006-12-21T00:19:01.554+08:00</updated><title type='text'>Hello, world!</title><content type='html'>print "Hello, world!";&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5882547617466196949-3444336408323659748?l=dataplanet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dataplanet.blogspot.com/feeds/3444336408323659748/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5882547617466196949&amp;postID=3444336408323659748' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3444336408323659748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5882547617466196949/posts/default/3444336408323659748'/><link rel='alternate' type='text/html' href='http://dataplanet.blogspot.com/2006/12/hello-world.html' title='Hello, world!'/><author><name>Ken</name><uri>http://www.blogger.com/profile/06430691123919018834</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp3.blogger.com/_s4Vg-1g_MuU/R7Lg1-6IaWI/AAAAAAAAAcw/V1c0sM7Cto0/S220/HitchhikersGuideMarvin_128x128.jpg'/></author><thr:total>0</thr:total></entry></feed>
