<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Woody的技术Blog</title>
	
	<link>http://cn.programmingnote.com/blog</link>
	<description>我是木头</description>
	<lastBuildDate>Sat, 21 Aug 2010 10:31:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ProgrammingNoteCN" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="programmingnotecn" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Map &amp; Reduce</title>
		<link>http://cn.programmingnote.com/blog/?p=162</link>
		<comments>http://cn.programmingnote.com/blog/?p=162#comments</comments>
		<pubDate>Wed, 04 Aug 2010 00:12:40 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Algorithm]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=162</guid>
		<description><![CDATA[Map和Reduce都是对集合的操作。Map将某个操作应用到集合中的每一个元素中去（如矩阵变换）；Reduce操作则将集合中的所有元素按照某个规则计算出一个确定的值（如行列式求值）。 这两种对集合的运算在SICP的开始部分就讲到了。简单的实现代码如下： &#40;define &#40;map-demo func list&#41; &#40;if &#40;null? list&#41; list &#40;cons &#40;func &#40;car list&#41;&#41; &#40;map-demo func &#40;cdr list&#41;&#41;&#41;&#41;&#41; &#40;define &#40;reduce-demo func list init&#41; &#40;if &#40;null? list&#41; init &#40;func &#40;car list&#41; &#40;reduce-demo func &#40;cdr list&#41; init&#41;&#41;&#41;&#41; &#160; &#40;map-demo &#40;lambda&#40;x&#41;&#40;* x 2&#41;&#41; '&#40;1 2 3&#41;&#41; ; result (2 4 6) &#40;reduce-demo * '&#40;1 2 4 8&#41; 1&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Map和Reduce都是对集合的操作。Map将某个操作应用到集合中的每一个元素中去（如矩阵变换）；Reduce操作则将集合中的所有元素按照某个规则计算出一个确定的值（如行列式求值）。<span id="more-162"></span></p>
<p>这两种对集合的运算在SICP的开始部分就讲到了。简单的实现代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="scheme" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>map<span style="color: #66cc66;">-</span>demo func <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">list</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span>func <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>map<span style="color: #66cc66;">-</span>demo func <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>reduce<span style="color: #66cc66;">-</span>demo func <span style="color: #b1b100;">list</span> init<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span>
      init
      <span style="color: #66cc66;">&#40;</span>func <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>reduce<span style="color: #66cc66;">-</span>demo func <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span> init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>map<span style="color: #66cc66;">-</span>demo <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span>x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span> x <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; result (2 4 6)</span>
<span style="color: #66cc66;">&#40;</span>reduce<span style="color: #66cc66;">-</span>demo <span style="color: #66cc66;">*</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">; result 64</span></pre></div></div>

<p>从集合的数学含义来看，元素是无序的。因此Map和Reduce都可以以任意的顺序遍历集合。由于Map和Reduce操作并不会改变原始的集合，因此可以用来进行并行计算。如果可以把一个大集合分成多个小一些的集合，可以让每个计算机对一部分元素进行Map或者Reduce运算，多个计算机同时进行，最后将每个计算机的结果合并成最终结果。</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=31" title="用Scheme实现二分检索树（Binary Search Tree） (September 23, 2008)">用Scheme实现二分检索树（Binary Search Tree）</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=65" title="生成质数表的两种算法 (October 24, 2008)">生成质数表的两种算法</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=14" title="集合作为排序的表——Scheme实现 (September 22, 2008)">集合作为排序的表——Scheme实现</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=111" title="避免在业务逻辑层中使用SQL (February 23, 2009)">避免在业务逻辑层中使用SQL</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=157" title="让人想呕吐的代码 (July 12, 2010)">让人想呕吐的代码</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=162</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>很清晰的快速排序</title>
		<link>http://cn.programmingnote.com/blog/?p=161</link>
		<comments>http://cn.programmingnote.com/blog/?p=161#comments</comments>
		<pubDate>Sun, 01 Aug 2010 23:55:25 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Algorithm]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=161</guid>
		<description><![CDATA[那本清华版《数据结构》中的快速排序算法代码被引用得太多了，当初感觉非常不好懂，两头的指针同时移动很容易把人搞晕。典型的如下： void quick_sort&#40;int data&#91;&#93;, int low, int high&#41; &#123; int i, j, pivot; if &#40;low &#60; high&#41; &#123; pivot=data&#91;low&#93;; i=low; j=high; &#160; while&#40;i&#60;j&#41; &#123; while &#40;i&#60;j &#38;&#38; data&#91;j&#93;&#62;=pivot&#41; j--; if&#40;i&#60;j&#41; data&#91;i++&#93;=data&#91;j&#93;; //将比枢轴记录小的记录移到低端 &#160; while &#40;i&#60;j &#38;&#38; data&#91;i&#93;&#60;=pivot&#41; i++; if&#40;i&#60;j&#41; data&#91;j--&#93;=data&#91;i&#93;; //将比枢轴记录大的记录移到高端 &#125; &#160; data&#91;i&#93;=pivot; //枢轴记录移到最终位置 &#160; quick_sort&#40;data,low,i-1&#41;; quick_sort&#40;data,i+1,high&#41;; &#125; &#125; 而如果写成下面这个样子的话，把partition部分改变一下写法，就容易懂多了。为了代码的简洁，我用PHP语言实现了一下： function qsort&#40;$list&#41; &#123; // [...]]]></description>
			<content:encoded><![CDATA[<p>那本清华版《数据结构》中的快速排序算法代码被引用得太多了，当初感觉非常不好懂，两头的指针同时移动很容易把人搞晕。典型的如下：<span id="more-161"></span></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">void</span> quick_sort<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> data<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> low<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> high<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
       <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">,</span> pivot<span style="color: #339933;">;</span>
       <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>low <span style="color: #339933;">&lt;</span> high<span style="color: #009900;">&#41;</span>
       <span style="color: #009900;">&#123;</span>
              pivot<span style="color: #339933;">=</span>data<span style="color: #009900;">&#91;</span>low<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
              i<span style="color: #339933;">=</span>low<span style="color: #339933;">;</span>
              j<span style="color: #339933;">=</span>high<span style="color: #339933;">;</span>
&nbsp;
              <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>j<span style="color: #009900;">&#41;</span>
              <span style="color: #009900;">&#123;</span>
                     <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>j <span style="color: #339933;">&amp;&amp;</span> data<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">&gt;=</span>pivot<span style="color: #009900;">&#41;</span>
                            j<span style="color: #339933;">--;</span>
                     <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>j<span style="color: #009900;">&#41;</span>
                            data<span style="color: #009900;">&#91;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>data<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">//将比枢轴记录小的记录移到低端</span>
&nbsp;
                     <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>j <span style="color: #339933;">&amp;&amp;</span> data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">&lt;=</span>pivot<span style="color: #009900;">&#41;</span>
                            i<span style="color: #339933;">++;</span>
                     <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">&lt;</span>j<span style="color: #009900;">&#41;</span>
                            data<span style="color: #009900;">&#91;</span>j<span style="color: #339933;">--</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>       <span style="color: #666666; font-style: italic;">//将比枢轴记录大的记录移到高端</span>
              <span style="color: #009900;">&#125;</span>
&nbsp;
              data<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span>pivot<span style="color: #339933;">;</span>         <span style="color: #666666; font-style: italic;">//枢轴记录移到最终位置</span>
&nbsp;
              quick_sort<span style="color: #009900;">&#40;</span>data<span style="color: #339933;">,</span>low<span style="color: #339933;">,</span>i<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              quick_sort<span style="color: #009900;">&#40;</span>data<span style="color: #339933;">,</span>i<span style="color: #339933;">+</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>high<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
       <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>而如果写成下面这个样子的话，把partition部分改变一下写法，就容易懂多了。为了代码的简洁，我用PHP语言实现了一下：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> qsort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// 空表排序后的结果仍然是空表</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$list</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 取出第一个元素</span>
    <span style="color: #000088;">$x</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_shift</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 在剩下部分找到所有小于等于 $x 的元素</span>
    <span style="color: #000088;">$less</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_filter</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> use<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$n</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 找到所有大于 $x 的元素</span>
    <span style="color: #000088;">$larger</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_filter</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$n</span><span style="color: #009900;">&#41;</span> use<span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$n</span> <span style="color: #339933;">&gt;</span> <span style="color: #000088;">$x</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 对两部分分别应用快速排序，并将 $x 放到正确的位置上</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span>qsort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$less</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$x</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> qsort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$larger</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 测试……</span>
<span style="color: #000088;">$list</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">18</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">3</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">10</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">13</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">9</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">8</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$list_sorted</span> <span style="color: #339933;">=</span> qsort<span style="color: #009900;">&#40;</span><span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$list_sorted</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>用到了PHP 5.3中新添加的匿名函数特性，如果你的PHP不是5.3或以上的，可以简单变通一下。</p>
<p>应用这样的思想，即使在一个没有循环结构的函数式语言里，也可以非常容易地实现。下面这个就是用Scheme语言写的快速排序算法：</p>

<div class="wp_syntax"><div class="code"><pre class="scheme" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>filter pred lst<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lst<span style="color: #66cc66;">&#41;</span>
      lst
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>filter pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>filter pred <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">define</span> <span style="color: #66cc66;">&#40;</span>qsort lst<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null?</span> lst<span style="color: #66cc66;">&#41;</span>
      lst
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span>qsort <span style="color: #66cc66;">&#40;</span>filter <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;=</span> x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span>qsort <span style="color: #66cc66;">&#40;</span>filter <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>x<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&lt;</span> x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">; 测试</span>
<span style="color: #66cc66;">&#40;</span>qsort '<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">9</span> <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">8</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">2</span> <span style="color: #cc66cc;">10</span> <span style="color: #cc66cc;">9</span> <span style="color: #cc66cc;">13</span> <span style="color: #cc66cc;">22</span> <span style="color: #cc66cc;">17</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>这样一来，快速排序的原理和实现就都显得很容易了。</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=14" title="集合作为排序的表——Scheme实现 (September 22, 2008)">集合作为排序的表——Scheme实现</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=31" title="用Scheme实现二分检索树（Binary Search Tree） (September 23, 2008)">用Scheme实现二分检索树（Binary Search Tree）</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=65" title="生成质数表的两种算法 (October 24, 2008)">生成质数表的两种算法</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=15" title="判断自然数奇偶的惊人方法 (September 22, 2008)">判断自然数奇偶的惊人方法</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=83" title="信息加密解密入门 (December 18, 2008)">信息加密解密入门</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=161</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP的interface有什么用</title>
		<link>http://cn.programmingnote.com/blog/?p=160</link>
		<comments>http://cn.programmingnote.com/blog/?p=160#comments</comments>
		<pubDate>Thu, 22 Jul 2010 14:32:32 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=160</guid>
		<description><![CDATA[在强类型的语言中，interface可以实现多态的特性，但PHP本身是个弱类型语言，那interface这个关键字有什么用？ 比如在Java里的代码： // 接口定义 public interface sayHello &#123; void sayHello&#40;String name&#41;; &#125; &#160; // 两个实现sayHello接口的类 public class Boy implements sayHello &#123; public void sayHello&#40;String name&#41; &#123; System.out.println&#40;&#38;quot;I'm a boy. Hello &#38;quot; + name + &#38;quot;.&#38;quot;); } } &#160; class Girl implements sayHello { public void sayHello(String name) { System.out.println(&#38;quot;I'm a girl. Hello &#38;quot; + name [...]]]></description>
			<content:encoded><![CDATA[<p>在强类型的语言中，interface可以实现多态的特性，但PHP本身是个弱类型语言，那interface这个关键字有什么用？<span id="more-160"></span></p>
<p>比如在Java里的代码：</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 接口定义</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> sayHello <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">void</span> sayHello<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 两个实现sayHello接口的类</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Boy <span style="color: #000000; font-weight: bold;">implements</span> sayHello <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sayHello<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">System</span>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>I<span style="color: #0000ff;">'m a boy. Hello &amp;quot; + name + &amp;quot;.&amp;quot;);
    }
}
&nbsp;
class Girl implements sayHello {
    public void sayHello(String name) {
        System.out.println(&amp;quot;I'</span>m a girl. <span style="color: #006633;">Hello</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span> <span style="color: #339933;">+</span> name <span style="color: #339933;">+</span> <span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>.<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 主程序</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Main <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        Boy boy <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Boy<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        Girl girl <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Girl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        say<span style="color: #009900;">&#40;</span>boy<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        say<span style="color: #009900;">&#40;</span>girl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> say<span style="color: #009900;">&#40;</span>sayHello p<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        p.<span style="color: #006633;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span>Woody<span style="color: #339933;">&amp;</span>quot<span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Java里通过接口统一了不同类的调用方式，但PHP完全可以不用 interface 来实现同样的功能：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Boy <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> sayHello<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;I'm a boy. Hello <span style="color: #006699; font-weight: bold;">$name</span>!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> Girl <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">function</span> sayHello<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;I'm a girl. Hello <span style="color: #006699; font-weight: bold;">$name</span>!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> say<span style="color: #009900;">&#40;</span><span style="color: #000088;">$p</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$p</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sayHello</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Woody&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$boy</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Boy<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$girl</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Girl<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
say<span style="color: #009900;">&#40;</span><span style="color: #000088;">$boy</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
say<span style="color: #009900;">&#40;</span><span style="color: #000088;">$girl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>如此看来，interface这个关键字就是多余了？</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=123" title="抓网页的PHP Class (May 11, 2009)">抓网页的PHP Class</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=90" title="限制图片宽度的插件 (December 26, 2008)">限制图片宽度的插件</a> (10)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=111" title="避免在业务逻辑层中使用SQL (February 23, 2009)">避免在业务逻辑层中使用SQL</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=144" title="这样的PHP文章令人堪忧 (January 23, 2010)">这样的PHP文章令人堪忧</a> (3)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=157" title="让人想呕吐的代码 (July 12, 2010)">让人想呕吐的代码</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=160</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Project Euler</title>
		<link>http://cn.programmingnote.com/blog/?p=159</link>
		<comments>http://cn.programmingnote.com/blog/?p=159#comments</comments>
		<pubDate>Thu, 22 Jul 2010 01:14:49 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Mathematics]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=159</guid>
		<description><![CDATA[Project Euler，欧拉计划，目前提供了近300个数学问题，可以用你能用的任何方法解题，包括各种程序语言、数学软件甚至是铅笔和纸。和ACM的Online Judge不同的是，它不需要提交源程序。每个问题都是一个具体的问题，只有一个确定答案的，计算好后提交就行了。如果答案正确，就能进入这个问题的讨论区看到别人是怎么解决的。 例如第一题是这样的： 如果我们把10以内的（n]]></description>
			<content:encoded><![CDATA[<p><a href="http://projecteuler.net">Project Euler</a>，欧拉计划，目前提供了近300个数学问题，可以用你能用的任何方法解题，包括各种程序语言、数学软件甚至是铅笔和纸。和ACM的Online Judge不同的是，它不需要提交源程序。每个问题都是一个具体的问题，只有一个确定答案的，计算好后提交就行了。如果答案正确，就能进入这个问题的讨论区看到别人是怎么解决的。</p>
<p>例如第一题是这样的：</p>
<blockquote><p>如果我们把10以内的（n<10）中能被3或者5整队自然数列出来，得到3、5、6和9，它们的和就是23。<br />
请计算出1000以内的能被3或者5整除的自然数的和。</p></blockquote>
<p>我偷个懒，用Maxima写了个函数算了一下 <img src='http://cn.programmingnote.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>
f(x):=block(
	[s:0],
	for k:1 while k&lt;x do(
		if(mod(k,3)=0 or mod(k,5)=0) then s:s+k
	),
	display(s)
);
f(1000);
</pre>
<p>这个东西里都是一些数学计算类的问题，对于学一门新的程序语言很有帮助。而且和TopCoder一样，也是一个帮助打发无聊时间的好帮手。</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=97" title="高维空间想象力 (January 28, 2009)">高维空间想象力</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=82" title="看似无尽，实则有穷 (December 17, 2008)">看似无尽，实则有穷</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=84" title="有关有理数、无理数的一个证明 (December 19, 2008)">有关有理数、无理数的一个证明</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=83" title="信息加密解密入门 (December 18, 2008)">信息加密解密入门</a> (2)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=87" title="不鼓掌的权利与囚徒困境 (December 22, 2008)">不鼓掌的权利与囚徒困境</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=159</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>恶心的代码是如何形成的</title>
		<link>http://cn.programmingnote.com/blog/?p=158</link>
		<comments>http://cn.programmingnote.com/blog/?p=158#comments</comments>
		<pubDate>Mon, 12 Jul 2010 15:15:28 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Discuz]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=158</guid>
		<description><![CDATA[上一篇我贴出了一段令人恶心的代码，自然要思考一下这样的代码是如何形成的。显示，每个人都不希望这样的代码出自自己的手中，所以我更倾向于认为这种代码的出现是一种迫不得已的结果。 嗯，忘了说了，这段代码是Discuz后台显示待审核帖子的代码。只是一个简单的界面显示，就是显示下面这些东西： 下面主要从技术角度分析一下这段代码，到底为什么会变成这样。其实这些代码主要都是界面显示，只是三个showtablerow函数，意思是显示表格中的一行。先看一下showtablerow这个函数的声明形式： function showtablerow&#40;$trstyle = '', $tdstyle = array&#40;&#41;, $tdtext = array&#40;&#41;, $return = FALSE&#41;; 为了说明一下各个参数，先看一下普通的HTML表格中的一行（tr）中究竟有哪些东西： &#60;tr attributes for tr&#62; &#60;td attributes for td 1&#62;text 1&#60;/td&#62; &#60;td attributes for td 2&#62;text 2&#60;/td&#62; ...... &#60;/tr&#62; 可以看出，为了完整地描述一个tr，需要三组参数：tr标签自己的属性、每个td标签的属性和每个td标签里的文本内容。例如： &#60;tr class=&#34;row&#34;&#62; &#60;td width=&#34;60&#34; class=&#34;cell&#34;&#62;Text 1&#60;/td&#62; &#60;td class=&#34;highlight&#34;&#62;Text 2&#60;/td&#62; &#60;/tr&#62; 使用showtablerow来生成的话，就要写成： showtablerow&#40;'class=&#34;row&#34;', array&#40;'width=&#34;60&#34; class=&#34;cell&#34;', 'class=&#34;highlight&#34;'&#41;, array&#40;'Text 1', 'Text 2'&#41;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>上一篇我贴出了一段<a href="http://cn.programmingnote.com/blog/?p=157">令人恶心的代码</a>，自然要思考一下这样的代码是如何形成的。显示，每个人都不希望这样的代码出自自己的手中，所以我更倾向于认为这种代码的出现是一种迫不得已的结果。<span id="more-158"></span></p>
<p>嗯，忘了说了，这段代码是Discuz后台显示待审核帖子的代码。只是一个简单的界面显示，就是显示下面这些东西：<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4786849740/" title="Flickr 上 ggggqqqqihc 的 2010-7-12 22-25-08"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxMzgvNDc4Njg0OTc0MF9kMThjYzBiMGYyLmpwZw%3D%3D" width="464" height="165" alt="2010-7-12 22-25-08" /></a></p>
<p>下面主要从技术角度分析一下这段代码，到底为什么会变成这样。其实这些代码主要都是界面显示，只是三个showtablerow函数，意思是显示表格中的一行。先看一下showtablerow这个函数的声明形式：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> showtablerow<span style="color: #009900;">&#40;</span><span style="color: #000088;">$trstyle</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tdstyle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$tdtext</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$return</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>为了说明一下各个参数，先看一下普通的HTML表格中的一行（tr）中究竟有哪些东西：</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;tr attributes for tr&gt;
  &lt;td attributes for td 1&gt;text 1&lt;/td&gt;
  &lt;td attributes for td 2&gt;text 2&lt;/td&gt;
  ......
&lt;/tr&gt;</pre></div></div>

<p>可以看出，为了完整地描述一个tr，需要三组参数：tr标签自己的属性、每个td标签的属性和每个td标签里的文本内容。例如：</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;tr class=&quot;row&quot;&gt;
  &lt;td width=&quot;60&quot; class=&quot;cell&quot;&gt;Text 1&lt;/td&gt;
  &lt;td class=&quot;highlight&quot;&gt;Text 2&lt;/td&gt;
&lt;/tr&gt;</pre></div></div>

<p>使用showtablerow来生成的话，就要写成：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">showtablerow<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'class=&quot;row&quot;'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'width=&quot;60&quot; class=&quot;cell&quot;'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'class=&quot;highlight&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Text 1'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Text 2'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>看上去比直接写HTML代码要精简一些，因为不需要再输入tr、td这种重复的字符了，而且通过统一的PHP函数去生成，代码格式也更加统一一些。</p>
<p>不过，这样的封装有多大的必要呢？单用HTML和CSS，外加一套界面元素规范，也同样可以生成统一的代码，看来这样的封装只是减少了一些打字次数。</p>
<p>应该意识到，HTML界面是千变万化的。上面这种封装对于显示数据的表格来说，看起来还不是很坏，但表格也可以用来起页面布局的作用，而在本文开始举的例子中，表格只是用来做布局用的。这样一来，就会出现下面这种情况：</p>
<p>td标签里可能会有大量的HTML代码，这些代码里还嵌入着许多PHP变量。由于td中的文本是以字符串的形式传入showtablerow中去的，而在字符串中加入PHP变量有两种方式，一种是把字符串用点号连接，变量插入其中——很麻烦；另一种办法是用双引号字符串，不过这样一来，HTML文本中的双引号必须要被转义一大堆——也很麻烦。于是本文开始时的噩梦就出来了……</p>
<p>所以我认为，对于这种HTML界面上的封装，并没有多大意义，反而在某些情况下会带来极大的麻烦。如果为了显示界面，只用HTML、CSS，代码也未必会复杂多少，却有了近乎无限的灵活性。</p>
<p>从另一方面说，程序应该只处理数据结构，不涉及界面的显示。这样才能做到逻辑和界面的分离，有利于代码的扩展和维护。而把界面显示的代码封装到程序中，恰恰违背了这一原则。</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=90" title="限制图片宽度的插件 (December 26, 2008)">限制图片宽度的插件</a> (10)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=144" title="这样的PHP文章令人堪忧 (January 23, 2010)">这样的PHP文章令人堪忧</a> (3)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=149" title="论坛软件应该是什么？ (April 8, 2010)">论坛软件应该是什么？</a> (9)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=77" title="自己写的Zend Framework密码校验类 (November 26, 2008)">自己写的Zend Framework密码校验类</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=10" title="用mb_strlen得到字符串长度 (September 22, 2008)">用mb_strlen得到字符串长度</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=158</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让人想呕吐的代码</title>
		<link>http://cn.programmingnote.com/blog/?p=157</link>
		<comments>http://cn.programmingnote.com/blog/?p=157#comments</comments>
		<pubDate>Mon, 12 Jul 2010 07:37:40 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=157</guid>
		<description><![CDATA[什么都不用说了，唉…… 原始图片 Related posts 避免在业务逻辑层中使用SQL (1) 脚手架是个好东西 (0) 用Scheme实现二分检索树（Binary Search Tree） (1) 用getopt解析命令行参数 (0) 用EditArea增强WordPress的源代码编辑框 (0)]]></description>
			<content:encoded><![CDATA[<p>什么都不用说了，唉……<span id="more-157"></span></p>
<p><a href="http://www.flickr.com/photos/ggggqqqqihc/4786102340/" title="Flickr 上 ggggqqqqihc 的 2010-7-12 15-40-19"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxMTYvNDc4NjEwMjM0MF85YzljYzk0OWIzLmpwZw%3D%3D" width="500" height="278" alt="2010-7-12 15-40-19" /></a></p>
<p><a href="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxMTYvNDc4NjEwMjM0MF85YzljYzk0OWIzX2IuanBn">原始图片</a></p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=111" title="避免在业务逻辑层中使用SQL (February 23, 2009)">避免在业务逻辑层中使用SQL</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=93" title="脚手架是个好东西 (January 2, 2009)">脚手架是个好东西</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=31" title="用Scheme实现二分检索树（Binary Search Tree） (September 23, 2008)">用Scheme实现二分检索树（Binary Search Tree）</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=43" title="用getopt解析命令行参数 (September 24, 2008)">用getopt解析命令行参数</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=58" title="用EditArea增强WordPress的源代码编辑框 (October 12, 2008)">用EditArea增强WordPress的源代码编辑框</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=157</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>原来可以不用FTP软件</title>
		<link>http://cn.programmingnote.com/blog/?p=156</link>
		<comments>http://cn.programmingnote.com/blog/?p=156#comments</comments>
		<pubDate>Sat, 10 Jul 2010 06:43:25 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=156</guid>
		<description><![CDATA[刚刚发现Windows 7里可以直接建立一个连接远程FTP的快捷方式，使用起来就和本地的硬盘分区一样方便。也许以前的Windows XP里也有，不过一直没有注意到罢了。下面说说怎么用，其实很简单。 通过“开始”菜单打开“计算机”，在空白处点右键，选择“添加一个网络位置”，启动向导： 两次“下一步”后，填写自己的FTP地址： 然后输入FTP的登录用户名。密码在这一步不填，等到第一次连接时再写。 最后就会在磁盘窗格里多了一个FTP的快捷方式，双击它会自动连接到FTP服务器上，和操作本地磁盘感觉差不多，可以方便地进行上传下载的操作。 Related posts 还是应该用非开源版的VirtualBox (3) 论坛软件应该是什么？ (9) 由手机版飞信所想到的 (1) 用GnuPG进行信息加密和解密 (1) 用Firebug调整网页 (0)]]></description>
			<content:encoded><![CDATA[<p>刚刚发现Windows 7里可以直接建立一个连接远程FTP的快捷方式，使用起来就和本地的硬盘分区一样方便。也许以前的Windows XP里也有，不过一直没有注意到罢了。下面说说怎么用，其实很简单。<span id="more-156"></span></p>
<p>通过“开始”菜单打开“计算机”，在空白处点右键，选择“添加一个网络位置”，启动向导：<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4779404006/" title="Flickr 上 ggggqqqqihc 的 2010-7-10 14-31-14"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxMzYvNDc3OTQwNDAwNl9jMWI1ZDc5NmYzX2IuanBn" width="604" height="516" alt="2010-7-10 14-31-14" /></a></p>
<p>两次“下一步”后，填写自己的FTP地址：<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4778770851/" title="Flickr 上 ggggqqqqihc 的 2010-7-10 14-32-06"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxMTYvNDc3ODc3MDg1MV83Y2U0NGY2YjY3X2IuanBn" width="604" height="516" alt="2010-7-10 14-32-06" /></a></p>
<p>然后输入FTP的登录用户名。密码在这一步不填，等到第一次连接时再写。<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4779404118/" title="Flickr 上 ggggqqqqihc 的 2010-7-10 14-32-44"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQwNzgvNDc3OTQwNDExOF85NzZiYmI3YmUxX2IuanBn" width="604" height="516" alt="2010-7-10 14-32-44" /></a></p>
<p>最后就会在磁盘窗格里多了一个FTP的快捷方式，双击它会自动连接到FTP服务器上，和操作本地磁盘感觉差不多，可以方便地进行上传下载的操作。<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4779404146/" title="Flickr 上 ggggqqqqihc 的 2010-7-10 14-34-53"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQwNzYvNDc3OTQwNDE0Nl85MThkOGU5MjMzX2IuanBn" width="516" height="204" alt="2010-7-10 14-34-53" /></a></p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=64" title="还是应该用非开源版的VirtualBox (October 21, 2008)">还是应该用非开源版的VirtualBox</a> (3)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=149" title="论坛软件应该是什么？ (April 8, 2010)">论坛软件应该是什么？</a> (9)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=113" title="由手机版飞信所想到的 (February 24, 2009)">由手机版飞信所想到的</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=47" title="用GnuPG进行信息加密和解密 (September 29, 2008)">用GnuPG进行信息加密和解密</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=53" title="用Firebug调整网页 (October 6, 2008)">用Firebug调整网页</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=156</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最近在玩儿的</title>
		<link>http://cn.programmingnote.com/blog/?p=155</link>
		<comments>http://cn.programmingnote.com/blog/?p=155#comments</comments>
		<pubDate>Wed, 07 Jul 2010 14:47:47 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Hobby]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=155</guid>
		<description><![CDATA[最近在玩儿两个模拟类的软件，Proteus和MultiSim。知道这两个东东的人看出来我好像对电子方面有点兴趣了，嗯，也的确是这样。Proteus用来在电脑上模拟各种单片机，MultiSim可以在上面画出各种各样的电路图，再加上任何想要的测量仪器，就可以玩儿了。 Proteus上拖出来的单片机芯片可以直接装载用Keil C编译好的程序，我拿我以前买的51单片机芯片上的程序做测试，和在Proteus中模拟出来的效果完全一样。这样用软件也可以玩儿单片机，显然成本要节省很多，而且还可以在软件里加上一个很高级的示波器看效果。 Proteus主要是可以玩玩数字电路，而MultiSim里就可以玩模拟电路了。虽然MultiSim里也可以添加处理器芯片的模型，不过怎么给它的芯片编写程序还没弄明白。现在用它来复习一下以前在物理课上学过的电路知识。因为软件中可以立刻看到结果，所以这个过程还是非常有趣的。下面这个就是刚才在MultiSim里玩的屏幕截图： Related posts 订了一个望远镜 (8)]]></description>
			<content:encoded><![CDATA[<p>最近在玩儿两个模拟类的软件，Proteus和MultiSim。知道这两个东东的人看出来我好像对电子方面有点兴趣了，嗯，也的确是这样。Proteus用来在电脑上模拟各种单片机，MultiSim可以在上面画出各种各样的电路图，再加上任何想要的测量仪器，就可以玩儿了。<span id="more-155"></span></p>
<p>Proteus上拖出来的单片机芯片可以直接装载用Keil C编译好的程序，我拿我以前买的51单片机芯片上的程序做测试，和在Proteus中模拟出来的效果完全一样。这样用软件也可以玩儿单片机，显然成本要节省很多，而且还可以在软件里加上一个很高级的示波器看效果。</p>
<p>Proteus主要是可以玩玩数字电路，而MultiSim里就可以玩模拟电路了。虽然MultiSim里也可以添加处理器芯片的模型，不过怎么给它的芯片编写程序还没弄明白。现在用它来复习一下以前在物理课上学过的电路知识。因为软件中可以立刻看到结果，所以这个过程还是非常有趣的。下面这个就是刚才在MultiSim里玩的屏幕截图：<br />
<a href="http://www.flickr.com/photos/ggggqqqqihc/4771576040/" title="Flickr 上 ggggqqqqihc 的 MultiSim"><img src="http://cn.programmingnote.com/blog/wp-content/plugins/flickr-over-gfw/get_image.php?url=aHR0cDovL2Zhcm01LnN0YXRpYy5mbGlja3IuY29tLzQxNDEvNDc3MTU3NjA0MF8yMjY2Y2M1YWNlLmpwZw%3D%3D" width="500" height="277" alt="MultiSim" /></a></p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=147" title="订了一个望远镜 (March 28, 2010)">订了一个望远镜</a> (8)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=155</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>什么叫易用？</title>
		<link>http://cn.programmingnote.com/blog/?p=154</link>
		<comments>http://cn.programmingnote.com/blog/?p=154#comments</comments>
		<pubDate>Thu, 24 Jun 2010 12:29:18 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=154</guid>
		<description><![CDATA[现在做软件的似乎经常强调“软件易用性”，就是做出来的软件让人们容易使用。意思很简单，但什么叫易用，衡量易用的标准是什么，似乎没有多少人能信心十足的说自己知道。 拿人们熟知的软件MS Word为例，很多人认为这是软件易用的典范。不过在我大学毕业要写毕业论文时，由于对排版格式要求很严格，许多人只好一点一点地选择字体字号，甚至肉眼数页码然后手工做目录，万一在做完目录需要增减内容的话，目录又要重新做，一篇论文光排版就能把人累死…… 其实Word里可以预先自定义样式，像CSS一样，只需要预先定义好各级标题、段落的格式，写的时候简单套用即可。Word也可以自己生成目录，只要把“标题 1”、“标题 2”这样的样式名应用到各个章节的标题上，Word就可以知道文章的层次结构，进而自动生成目录。这两个功能足够解决大部分排版的问题。可惜，没多少人知道Word有这些“高级功能”，更不用说使用了。 现在Discuz这个论坛程序也变得越来越复杂了，后台的各个功能选项太多，别说对新人，就是我自己都记不住哪个设置选项在什么地方。但也没什么好办法，因为功能太多了，总得有地方去管理各个功能吧。或许无论界面上怎么设计，都无法很好地解决功能的增多和保持易用之间的矛盾。 我现在反而觉得那些古老的、单单用几个配置文件去设置各个功能的软件，易用性更好。配置文件里可以把说明、例子都写进去，用户在使用软件时，只去看配置文件和使用手册就行了，不需要在一大堆对话框里找来找去，反而省时间省精力。 所以现在出来一个问题，图形界面的软件一定比非图形界面的容易使用吗？ Related posts 避免在业务逻辑层中使用SQL (1) 论坛软件应该是什么？ (9) 考虑买一个电子书阅读器 (3) 现在的论坛太多了 (1) 新的挑战 (1)]]></description>
			<content:encoded><![CDATA[<p>现在做软件的似乎经常强调“软件易用性”，就是做出来的软件让人们容易使用。意思很简单，但什么叫易用，衡量易用的标准是什么，似乎没有多少人能信心十足的说自己知道。<span id="more-154"></span></p>
<p>拿人们熟知的软件MS Word为例，很多人认为这是软件易用的典范。不过在我大学毕业要写毕业论文时，由于对排版格式要求很严格，许多人只好一点一点地选择字体字号，甚至肉眼数页码然后手工做目录，万一在做完目录需要增减内容的话，目录又要重新做，一篇论文光排版就能把人累死……</p>
<p>其实Word里可以预先自定义样式，像CSS一样，只需要预先定义好各级标题、段落的格式，写的时候简单套用即可。Word也可以自己生成目录，只要把“标题 1”、“标题 2”这样的样式名应用到各个章节的标题上，Word就可以知道文章的层次结构，进而自动生成目录。这两个功能足够解决大部分排版的问题。可惜，没多少人知道Word有这些“高级功能”，更不用说使用了。</p>
<p>现在Discuz这个论坛程序也变得越来越复杂了，后台的各个功能选项太多，别说对新人，就是我自己都记不住哪个设置选项在什么地方。但也没什么好办法，因为功能太多了，总得有地方去管理各个功能吧。或许无论界面上怎么设计，都无法很好地解决功能的增多和保持易用之间的矛盾。</p>
<p>我现在反而觉得那些古老的、单单用几个配置文件去设置各个功能的软件，易用性更好。配置文件里可以把说明、例子都写进去，用户在使用软件时，只去看配置文件和使用手册就行了，不需要在一大堆对话框里找来找去，反而省时间省精力。</p>
<p>所以现在出来一个问题，图形界面的软件一定比非图形界面的容易使用吗？</p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=111" title="避免在业务逻辑层中使用SQL (February 23, 2009)">避免在业务逻辑层中使用SQL</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=149" title="论坛软件应该是什么？ (April 8, 2010)">论坛软件应该是什么？</a> (9)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=146" title="考虑买一个电子书阅读器 (February 18, 2010)">考虑买一个电子书阅读器</a> (3)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=104" title="现在的论坛太多了 (February 18, 2009)">现在的论坛太多了</a> (1)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=116" title="新的挑战 (March 13, 2009)">新的挑战</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=154</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress 3.0去掉历史版本记录</title>
		<link>http://cn.programmingnote.com/blog/?p=153</link>
		<comments>http://cn.programmingnote.com/blog/?p=153#comments</comments>
		<pubDate>Thu, 24 Jun 2010 07:31:38 +0000</pubDate>
		<dc:creator>Woody</dc:creator>
				<category><![CDATA[Blog]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://cn.programmingnote.com/blog/?p=153</guid>
		<description><![CDATA[对于WordPress 3.0，第一件事就是看有没有能直接关闭那个非常耗费数据库空间的历史版本记录功能。不过比较遗憾，并没有在后台直接提供那个选项，所以只好自己去看源代码。 在按照以前的方法修改代码后，发现并没有去除干净，在每次刷新wp-admin/post-new.php里就会在wp_posts表里生成一条post_status为“auto-draft”的记录。检查源代码后发现，WordPress 3.0在刚一进入编写新文章的页面时（post-new.php），会自己先插入一条auto-draft的空日志，而在以前的版本里并没有这么做。在打开post-new.php里会调用下面这个函数： 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 function get_default_post_to_edit&#40; $post_type = 'post', $create_in_db = false &#41; &#123; global $wpdb; &#160; $post_title = ''; if &#40; !empty&#40; $_REQUEST&#91;'post_title'&#93; &#41; &#41; $post_title = [...]]]></description>
			<content:encoded><![CDATA[<p>对于WordPress 3.0，第一件事就是看有没有能直接关闭那个非常耗费数据库空间的历史版本记录功能。不过比较遗憾，并没有在后台直接提供那个选项，所以只好自己去看源代码。<span id="more-153"></span></p>
<p>在按照<a href="http://cn.programmingnote.com/blog/?p=107">以前的方法</a>修改代码后，发现并没有去除干净，在每次刷新wp-admin/post-new.php里就会在wp_posts表里生成一条post_status为“auto-draft”的记录。检查源代码后发现，WordPress 3.0在刚一进入编写新文章的页面时（post-new.php），会自己先插入一条auto-draft的空日志，而在以前的版本里并没有这么做。在打开post-new.php里会调用下面这个函数：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> get_default_post_to_edit<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$post_type</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'post'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$create_in_db</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$post_title</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_title'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$post_title</span> <span style="color: #339933;">=</span> esc_html<span style="color: #009900;">&#40;</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'post_title'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$post_content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$post_content</span> <span style="color: #339933;">=</span> esc_html<span style="color: #009900;">&#40;</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$post_excerpt</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'excerpt'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
		<span style="color: #000088;">$post_excerpt</span> <span style="color: #339933;">=</span> esc_html<span style="color: #009900;">&#40;</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'excerpt'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$create_in_db</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Cleanup old auto-drafts more than 7 days old</span>
		<span style="color: #000088;">$old_posts</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_col</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT ID FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span> WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) &gt; post_date&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$old_posts</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$delete</span> <span style="color: #009900;">&#41;</span>
			wp_delete_post<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$delete</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Force delete</span>
		<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> get_post<span style="color: #009900;">&#40;</span> wp_insert_post<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'post_title'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Auto Draft'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'post_type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$post_type</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'post_status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'auto-draft'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// more code....</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// more code....</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>这个函数的第二个参数$create_in_db，表示是要新建一篇文章还是编辑一篇已有的文章。注意到379行，用了一个wp_insert_post函数，那个auto-draft的空日志就是在这里被加入的。为了避免多次加入auto-draft的日志，我把它的逻辑改成了：如果当前存在一个auto-draft的日志，就直接使用它，否则就创建一个新的auto-draft的空日志。反正对我来说，以前的auto-draft的日志也没什么用。修改后的部分代码为：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>374
375
376
377
378
379
380
381
382
383
384
385
386
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$create_in_db</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// Cleanup old auto-drafts more than 7 days old</span>
	<span style="color: #000088;">$old_posts</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_col</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT ID FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span> WHERE post_status = 'auto-draft' AND DATE_SUB( NOW(), INTERVAL 7 DAY ) &gt; post_date&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$old_posts</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$delete</span> <span style="color: #009900;">&#41;</span>
		wp_delete_post<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$delete</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Force delete</span>
	<span style="color: #000088;">$post_auto_draft</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_row</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT * FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span> WHERE post_type = '<span style="color: #006699; font-weight: bold;">$post_type</span>' AND post_status = 'auto-draft' LIMIT 1&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$post_auto_draft</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$post_auto_draft</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> get_post<span style="color: #009900;">&#40;</span> wp_insert_post<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'post_title'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Auto Draft'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'post_type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$post_type</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'post_status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'auto-draft'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// more code....</span></pre></td></tr></table></div>

<p>顺便提供我修改后的文件，只适用于WordPress 3.0，最好使用文本比较工具（如WinMerge）将不同的代码段合并，而不是直接把原文件覆盖掉。<br />
<iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-5220c2323cd868b0.office.live.com/embedicon.aspx/Public/wordpress-3^_0-no-revision.zip"></iframe></p>

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://cn.programmingnote.com/blog/?p=103" title="鼓捣WordPress主题 (February 17, 2009)">鼓捣WordPress主题</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=90" title="限制图片宽度的插件 (December 26, 2008)">限制图片宽度的插件</a> (10)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=27" title="量子（雅虎）统计插件 (September 22, 2008)">量子（雅虎）统计插件</a> (4)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=36" title="禁用WordPress的版本历史功能 (September 23, 2008)">禁用WordPress的版本历史功能</a> (0)</li>
	<li><a href="http://cn.programmingnote.com/blog/?p=107" title="禁用WordPress历史版本，保留自动保存 (February 21, 2009)">禁用WordPress历史版本，保留自动保存</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://cn.programmingnote.com/blog/?feed=rss2&amp;p=153</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
