<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>　膘叔　　簡單人生</title>
		<link>http://www.52cd.net/</link>
		<description>幻想指点江山，梦中激扬文字（&lt;a href=&quot;http://www.cnitblog.com/neatstudio/&quot;&gt;飞天小肥猪的简单人生&lt;/a&gt;）</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Tue, 14 Oct 2008 02:58:53 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.52cd.net/show-301-1.shtml</guid>
			<title>谈谈Unicode编码，简要解释UCS、UTF、BMP、BOM等名词[转摘]</title>
			<author>gouki</author>
			<description><![CDATA[<p>同样，翻出以前的文章，当然，也是转贴的，不过对于PHP开发人员来说，BOM这个问题应该算是很严重的，经常性会遇到header already sent，但就是找不到有输出。什么原因呢？BOM应该占了很大的比例。所以还是翻出老文章，再加强一下记忆。</p>
<hr width="100%" size="2" />
<p>来源：http://www.goalercn.com/html/tech/program/c/157.html&nbsp;&nbsp;&nbsp; 作者：未知&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; 这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念，增进知识，类似于打RPG游戏的升级。整理这篇文章的动机是两个问题： <br />
<br />
问题一： <br />
使用Windows记事本的&ldquo;另存为&rdquo;，可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。同样是txt文件，Windows是怎样识别编码方式的呢？ <br />
<br />
我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节，分别是FF、FE（Unicode）,FE、FF（Unicode big endian）,EF、BB、BF（UTF-8）。但这些标记是基于什么标准呢？ <br />
<br />
问题二： <br />
最近在网上看到一个ConvertUTF.c，实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)、GBK、UTF-8这些编码方式，我原来就了解。但这个程序让我有些糊涂，想不起来UTF-16和UCS2有什么关系。 <br />
查了查相关资料，总算将这些问题弄清楚了，顺带也了解了一些Unicode的细节。写成一篇文章，送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂，但要求读者知道什么是字节，什么是十六进制。 <br />
<br />
0、big endian和little endian<br />
big endian和little endian是CPU处理多字节数的不同方式。例如&ldquo;汉&rdquo;字的Unicode编码是6C49。那么写到文件里时，究竟是将6C写在前面，还是将49写在前面？如果将6C写在前面，就是big endian。还是将49写在前面，就是little endian。 <br />
<br />
&ldquo;endian&rdquo;这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开，由此曾发生过六次叛乱，其中一个皇帝送了命，另一个丢了王位。 <br />
<br />
我们一般将endian翻译成&ldquo;字节序&rdquo;，将big endian和little endian称作&ldquo;大尾&rdquo;和&ldquo;小尾&rdquo;。 <br />
<br />
1、字符编码、内码，顺带介绍汉字编码<br />
字符必须编码后才能被计算机处理。计算机使用的缺省编码方式就是计算机的内码。早期的计算机使用7位的ASCII编码，为了处理汉字，程序员设计了用于简体中文的GB2312和用于繁体中文的big5。 <br />
<br />
GB2312(1980年)一共收录了7445个字符，包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7，低字节从A1-FE，占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。 <br />
<br />
GB2312支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号，它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字，同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平台必须支持GB18030，对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。 <br />
<br />
从ASCII、GB2312、GBK到GB18030，这些编码方法是向下兼容的，即同一个字符在这些方案中总是有相同的编码，后面的标准支持更多的字符。在这些编码中，英文和中文可以统一地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼，GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。 <br />
<br />
有的中文Windows的缺省内码还是GBK，可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符，普通人是很难用到的，通常我们还是用GBK指代中文Windows内码。 <br />
<br />
这里还有一些细节： <br />
<br />
GB2312的原文还是区位码，从区位码到内码，需要在高字节和低字节上分别加上A0。 <br />
<br />
在DBCS中，GB内码的存储格式始终是big endian，即高位在前。 <br />
<br />
GB2312的两个字节的最高位都是1。但符合这个条件的码位只有128*128=16384个。所以GBK和GB18030的低字节最高位都可能不是1。不过这不影响DBCS字符流的解析：在读取DBCS字符流时，只要遇到高位为1的字节，就可以将下两个字节作为一个双字节编码，而不用管低字节的高位是什么。 <br />
<br />
2、Unicode、UCS和UTF<br />
前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。而Unicode只与ASCII兼容（更准确地说，是与ISO-8859-1兼容），与GB码不兼容。例如&ldquo;汉&rdquo;字的Unicode编码是6C49，而GB码是BABA。 <br />
<br />
Unicode也是一种字符编码方法，不过它是由国际组织设计，可以容纳全世界所有语言文字的编码方案。Unicode的学名是&quot;Universal Multiple-Octet Coded Character Set&quot;，简称为UCS。UCS可以看作是&quot;Unicode Character Set&quot;的缩写。 <br />
<br />
根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载：历史上存在两个试图独立设计Unicode的组织，即国际标准化组织（ISO）和一个软件制造商的协会（unicode.org）。ISO开发了ISO 10646项目，Unicode协会开发了Unicode项目。 <br />
<br />
在1991年前后，双方都认识到世界不需要两个不兼容的字符集。于是它们开始合并双方的工作成果，并为创立一个单一编码表而协同工作。从Unicode2.0开始，Unicode项目采用了与ISO 10646-1相同的字库和字码。 <br />
<br />
目前两个项目仍都存在，并独立地公布各自的标准。Unicode协会现在的最新版本是2005年的Unicode 4.1.0。ISO的最新标准是10646-3:2003。 <br />
<br />
UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码，是由UTF(UCS Transformation Format)规范规定的，常见的UTF规范包括UTF-8、UTF-7、UTF-16。 <br />
<br />
IETF的RFC2781和RFC3629以RFC的一贯风格，清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。我总是记不得IETF是Internet Engineering Task Force的缩写。但IETF负责维护的RFC是Internet上一切规范的基础。 <br />
<br />
3、UCS-2、UCS-4、BMP<br />
<br />
UCS有两种格式：UCS-2和UCS-4。顾名思义，UCS-2就是用两个字节编码，UCS-4就是用4个字节（实际上只用了31位，最高位必须为0）编码。下面让我们做一些简单的数学游戏： <br />
<br />
UCS-2有2^16=65536个码位，UCS-4有2^31=2147483648个码位。 <br />
<br />
UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows)，每行包含256个cells。当然同一行的cells只是最后一个字节不同，其余都相同。 <br />
<br />
group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中，高两个字节为0的码位被称作BMP。 <br />
<br />
将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节，就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。 <br />
<br />
4、UTF编码<br />
<br />
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下： <br />
<br />
UCS-2编码(16进制)&nbsp; UTF-8 字节流(二进制)&nbsp; <br />
0000 - 007F&nbsp; 0xxxxxxx&nbsp; <br />
0080 - 07FF&nbsp; 110xxxxx 10xxxxxx&nbsp; <br />
0800 - FFFF&nbsp; 1110xxxx 10xxxxxx 10xxxxxx&nbsp; <br />
<br />
例如&ldquo;汉&rdquo;字的Unicode编码是6C49。6C49在0800-FFFF之间，所以肯定要用3字节模板了：1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是：0110 110001 001001， 用这个比特流依次代替模板中的x，得到：11100110 10110001 10001001，即E6 B1 89。 <br />
<br />
读者可以用记事本测试一下我们的编码是否正确。 <br />
<br />
UTF-16以16位为单元对UCS进行编码。对于小于0x10000的UCS码，UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码，定义了一个算法。不过由于实际使用的UCS2，或者UCS4的BMP必然小于0x10000，所以就目前而言，可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案，UTF-16却要用于实际的传输，所以就不得不考虑字节序的问题。 <br />
<br />
5、UTF的字节序和BOM<br />
UTF-8以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如收到一个&ldquo;奎&rdquo;的Unicode编码是594E，&ldquo;乙&rdquo;的Unicode编码是4E59。如果我们收到UTF-16字节流&ldquo;594E&rdquo;，那么这是&ldquo;奎&rdquo;还是&ldquo;乙&rdquo;？ <br />
<br />
Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是&ldquo;Bill Of Material&rdquo;的BOM表，而是Byte Order Mark。BOM是一个有点小聪明的想法： <br />
<br />
在UCS编码中有一个叫做&quot;ZERO WIDTH NO-BREAK SPACE&quot;的字符，它的编码是FEFF。而FFFE在UCS中是不存在的字符，所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前，先传输字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;。 <br />
<br />
这样如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。因此字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;又被称作BOM。 <br />
<br />
UTF-8不需要BOM来表明字节顺序，但可以用BOM来表明编码方式。字符&quot;ZERO WIDTH NO-BREAK SPACE&quot;的UTF-8编码是EF BB BF（读者可以用我们前面介绍的编码方法验证一下）。所以如果接收者收到以EF BB BF开头的字节流，就知道这是UTF-8编码了。 <br />
<br />
Windows就是使用BOM来标记文本文件的编码方式的。 <br />
<br />
6、进一步的参考资料<br />
本文主要参考的资料是 &quot;Short overview of ISO-IEC 10646 and Unicode&quot; (http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html)。 <br />
<br />
我还找了两篇看上去不错的资料，不过因为我开始的疑问都找到了答案，所以就没有看： <br />
<br />
&nbsp; 1.&quot;Understanding Unicode A general introduction to the Unicode Standard&quot; (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter04a) <br />
&nbsp; 2.&quot;Character set encoding basics Understanding character set encodings and legacy encodings&quot; (http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&amp;item_id=IWS-Chapter03) <br />
&nbsp;</p>
<hr width="100%" size="2" />
<p>顺便说一下：记事本保存成UTF8默认是带BOM的，好象没有办法去掉；editplus在选项里可以进行选择：始终带BOM，智能识别，不带BOM这些选项。所以，尽量是选择不带BOM比较好。</p>]]></description>
			<link>http://www.52cd.net/show-301-1.shtml</link>
			<category domain="http://www.52cd.net/category-1-1.shtml">PHP</category>
			<pubDate>2008-10-13 10:13</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-304-1.shtml</guid>
			<title>关于PHP版本升级的一些相关问题</title>
			<author>gouki</author>
			<description><![CDATA[<p>PHP版本一直在更新，同样我们的代码也会随着服务器上的PHP版本的更新而不得不进行更改，但每次PHP的更新，几乎只是显示fix了多少多少BUG，但究竟会在版本升级的时候带来哪些问题，自己一点也不清楚 。</p>
<p>其实翻开PHP的手册，你也能找到这些，现在方便了，到我的博客上下载乔楚编译的最新的手册，翻开左侧树的最后一个节点：Appendices，找到：</p>
<p align="center"><a href="http://www.52cd.net/attachment.php?id=178" target="_blank"><img src="http://www.52cd.net/attachments//date_200810/3adf57681c1bf8cdb534bf02af5b2e95.jpg" border="0" alt="大小: 11.61 K&#13;尺寸: 305 x 89&#13;浏览: 14 次&#13;点击打开新窗口浏览全图" width="305" height="89" /></a></p>
<p>展开这三个节点，你会看到在版本更新的时候，PHP的核心加了哪些方法，去除了哪些函数（事实上这很重要，或许在你以前的项目里一直在采用XXX方法，但新版本去掉了，很可能你的程序就不能再运行了。。。）</p>
<p>当然你更应该看的是：Changes in reference handling，这里面介绍的是一些老的代码写法和应用在新的代码里会出错的例子，如果你的代码里沿用了这些旧的方法，那么，你先考虑一下升级的代价吧。</p>]]></description>
			<link>http://www.52cd.net/show-304-1.shtml</link>
			<category domain="http://www.52cd.net/category-1-1.shtml">PHP</category>
			<pubDate>2008-10-12 22:00</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-300-1.shtml</guid>
			<title>两年前写的php之call_user_func_array的简易用法</title>
			<author>gouki</author>
			<description><![CDATA[<p>几年前写的东西了，翻出来重贴一下，呵呵</p>
<hr width="100%" size="2" />
<p>今天在群里面，有个叫lewis的在问call_user_func_array的用法，因为之前一直没有用过，也不能说什么，于是看一下手册，发现是这么写的：</p>
<h1><a name="function.call-user-func-array"></a>call_user_func_array</h1>
<div class="refnamediv"><a name="AEN50629"></a>
<p>(PHP 4 &gt;= 4.0.4, PHP 5)</p>
call_user_func_array&nbsp;--&nbsp; Call a user function  given with an array of parameters</div>
<div class="refsect1"><a name="AEN50632"></a>
<h2>Description</h2>
mixed <strong class="methodname">call_user_func_array</strong> (  callback function, array param_arr )<br />
<br />
<p>Call a user defined function given by <var class="parameter">function</var>,  with the parameters in <var class="parameter">param_arr</var>.  <br />
然后还有一个例子：</p>
<p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;debug(</span><span class="vars">$var</span><span>,&nbsp;</span><span class="vars">$val</span><span>)&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;***DEBUGGING\nVARIABLE:&nbsp;$var\nVALUE:&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(</span><span class="func">is_array</span><span>(</span><span class="vars">$val</span><span>)&nbsp;||&nbsp;</span><span class="func">is_object</span><span>(</span><span class="vars">$val</span><span>)&nbsp;||&nbsp;</span><span class="func">is_resource</span><span>(</span><span class="vars">$val</span><span>))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_r(<span class="vars">$val</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;\n$val\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;***\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$c</span><span>&nbsp;=&nbsp;mysql_connect();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$host</span><span>&nbsp;=&nbsp;</span><span class="vars">$_SERVER</span><span>[</span><span class="string">&quot;SERVER_NAME&quot;</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>call_user_func_array(<span class="string">'debug'</span><span>,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">&quot;host&quot;</span><span>,&nbsp;</span><span class="vars">$host</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>call_user_func_array(<span class="string">'debug'</span><span>,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">&quot;c&quot;</span><span>,&nbsp;</span><span class="vars">$c</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>call_user_func_array(<span class="string">'debug'</span><span>,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">&quot;_POST&quot;</span><span>,&nbsp;</span><span class="vars">$_POST</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
相信看了例子之后应该有点明白了吧？<br />
我自己是这么理解这个函数的，如果说的不对，还望各位高手不要耻笑：<br />
&nbsp;&nbsp;&nbsp;&nbsp;  该函数真正的用法有点类似于函数重载，因为他的第一个参数是字符型的，也就是函数的名称，第二个参数是数组，我们可以当成该函数的各个参数，而事实上也就是这么用的，如果你看过我的前一篇文章：<a href="/neatstudio/archive/2006/07/21/13949.html" id="viewpost1_TitleUrl" class="postTitle2">PHP的伪重载</a>  ，或许你能够理解，正是因为这个函数的存在，我发现函数重载也可以这样运用：</p>
<p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*&nbsp;例子写完后，本来认为完事了，结果遇到有人问call_user_func_array(),看了一下手册</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*&nbsp;原来，我上面的那个test函数还可以精简成如下的例子，</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;otest1&nbsp;(</span><span class="vars">$a</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>(&nbsp;</span><span class="string">'一个参数'</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;otest2&nbsp;(&nbsp;</span><span class="vars">$a</span><span>,&nbsp;</span><span class="vars">$b</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>(&nbsp;</span><span class="string">'二个参数'</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;otest3&nbsp;(&nbsp;</span><span class="vars">$a</span><span>&nbsp;,</span><span class="vars">$b</span><span>,</span><span class="vars">$c</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>(&nbsp;</span><span class="string">'三个啦'</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;otest&nbsp;()&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$args</span><span>&nbsp;=&nbsp;func_get_args();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$num</span><span>&nbsp;=&nbsp;func_num_args();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;call_user_func_array(&nbsp;<span class="string">'otest'</span><span>.</span><span class="vars">$num</span><span>,&nbsp;</span><span class="vars">$args</span><span>&nbsp;&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>otest(1,2);&nbsp;&nbsp;</span></li>
</ol>
</div>
看到不？而我最初的写法，在<a href="/neatstudio/archive/2006/07/21/13949.html" id="viewpost1_TitleUrl" class="postTitle2">PHP的伪重载</a>一文中有所提及，仅作参考。。。。<br />
<br />
这些只是call_user_func_array的简易用法，在PHP4下测试过，而手册中还有一些将第一个参数当成数组来传入的例子，我在PHP4下是没有办法运行的，也许PHP5可以吧，但我不用PHP5的，也没有办法解释什么。谢谢各位</p>
<hr width="100%" size="2" />
以前一直用PHP4的，现在用PHP5了，关于这个函数，大家可以看看thinkphp的functions.php中的getInstance方法，也是一个很好的诠释哦。
<p>&nbsp;</p>
</div>]]></description>
			<link>http://www.52cd.net/show-300-1.shtml</link>
			<category domain="http://www.52cd.net/category-1-1.shtml">PHP</category>
			<pubDate>2008-10-12 13:04</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-303-1.shtml</guid>
			<title>最新PHP手册，英文版，含回复，感谢乔楚</title>
			<author>gouki</author>
			<description><![CDATA[<p>感谢乔楚(honestQiao)对最新的PHP手册进行了编译，并为我们免费提供。<br />
在这里我就不称呼乔楚为乔XX了，乔楚，资深UNIX工程师，PHP高级开发人员，国内最初的smartTemplate里也有他的功劳（好象是这个吧，没记错应该），如今，他又为我们提供了这样一个手册，方便PHP开发人员。</p>
<p>大家一起为我们的乔楚鼓掌。谢谢</p>
<p>下载地址为：<a href="./attachment/php_manual_en.docs.chm">php_manual_en.docs.chm</a></p>]]></description>
			<link>http://www.52cd.net/show-303-1.shtml</link>
			<category domain="http://www.52cd.net/category-1-1.shtml">PHP</category>
			<pubDate>2008-10-11 23:42</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-299-1.shtml</guid>
			<title>MYSQL官方的文章：几种无限分类的算法……</title>
			<author>gouki</author>
			<description><![CDATA[<p>我只贴一种，其余的去看：<a href="http://dev.mysql.com/tech-resources/articles/hierarchical-data.html">http://dev.mysql.com/tech-resources/articles/hierarchical-data.html</a></p>
<h3>The Adjacency List Model</h3>
<p>Typically the example categories shown above will be stored in a table like  the following (I'm including full CREATE and INSERT statements so you can follow  along):</p>
<pre>CREATE TABLE category(<br />category_id INT AUTO_INCREMENT PRIMARY KEY,<br />name VARCHAR(20) NOT NULL,<br />parent INT DEFAULT NULL);<br /><br /><br />INSERT INTO category<br />VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),<br />(4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),<br />(7,'MP3 PLAYERS',6),(8,'FLASH',7),<br />(9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);<br /><br />SELECT * FROM category ORDER BY category_id;<br /><br />+-------------+----------------------+--------+<br />| category_id | name                 | parent |<br />+-------------+----------------------+--------+<br />|           1 | ELECTRONICS          |   NULL |<br />|           2 | TELEVISIONS          |      1 |<br />|           3 | TUBE                 |      2 |<br />|           4 | LCD                  |      2 |<br />|           5 | PLASMA               |      2 |<br />|           6 | PORTABLE ELECTRONICS |      1 |<br />|           7 | MP3 PLAYERS          |      6 |<br />|           8 | FLASH                |      7 |<br />|           9 | CD PLAYERS           |      6 |<br />|          10 | 2 WAY RADIOS         |      6 |<br />+-------------+----------------------+--------+<br />10 rows in set (0.00 sec)</pre>
<p>In the adjacency list model, each item in the table contains a pointer to its  parent. The topmost element, in this case electronics, has a NULL value for its  parent. The adjacency list model has the advantage of being quite simple, it is  easy to see that FLASH is a child of mp3 players, which is a child of portable  electronics, which is a child of electronics. While the adjacency list model can  be dealt with fairly easily in client-side code, working with the model can be  more problematic in pure SQL.</p>
<h3>Retrieving a Full Tree</h3>
<p>The first common task when dealing with hierarchical data is the display of  the entire tree, usually with some form of indentation. The most common way of  doing this is in pure SQL is through the use of a self-join:</p>
<pre>SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4<br />FROM category AS t1<br />LEFT JOIN category AS t2 ON t2.parent = t1.category_id<br />LEFT JOIN category AS t3 ON t3.parent = t2.category_id<br />LEFT JOIN category AS t4 ON t4.parent = t3.category_id<br />WHERE t1.name = 'ELECTRONICS';<br /><br />+-------------+----------------------+--------------+-------+<br />| lev1        | lev2                 | lev3         | lev4  |<br />+-------------+----------------------+--------------+-------+<br />| ELECTRONICS | TELEVISIONS          | TUBE         | NULL  |<br />| ELECTRONICS | TELEVISIONS          | LCD          | NULL  |<br />| ELECTRONICS | TELEVISIONS          | PLASMA       | NULL  |<br />| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS  | FLASH |<br />| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS   | NULL  |<br />| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL  |<br />+-------------+----------------------+--------------+-------+<br />6 rows in set (0.00 sec)</pre>]]></description>
			<link>http://www.52cd.net/show-299-1.shtml</link>
			<category domain="http://www.52cd.net/category-9-1.shtml">DataBase</category>
			<pubDate>2008-10-11 23:04</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-298-1.shtml</guid>
			<title>apache rewrite 详解</title>
			<author>gouki</author>
			<description><![CDATA[<p>懒得写上什么，apache的rewrite一向是最让人头疼的。这是我几年前找的文章，继续转贴一下，毕竟以前的BLOG我也不知道能够被保留多久， 这个毕竟是自己的，只要没啥意外，会一直保留着的。<br />
<br />
收藏自：竹笋炒肉</p><br /><br /><a href="http://www.52cd.net/show-298-1.shtml" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.52cd.net/show-298-1.shtml</link>
			<category domain="http://www.52cd.net/category-3-1.shtml">Software</category>
			<pubDate>2008-10-11 23:01</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-297-1.shtml</guid>
			<title>SQL语句导入导出大全(转)</title>
			<author>gouki</author>
			<description><![CDATA[<p>备份资料：Copy from ---&gt; http://php.mydict.com/ziliao/7/2006_05/SQLYuJuDaoRuDaoChuDaQuan3016_1.html</p>
<p><br />
<br />
/******* 导出到excel<br />
EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S&quot;GNETDATA/GNETDATA&quot; -U&quot;sa&quot; -P&quot;&quot;'<br />
<br />
/*********** 导入Excel<br />
SELECT * <br />
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',<br />
'Data Source=&quot;c:\test.xls&quot;;User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions</p>
<p>更多看详细。。。</p><br /><br /><a href="http://www.52cd.net/show-297-1.shtml" target="_blank">阅读全文</a><br /><br />]]></description>
			<link>http://www.52cd.net/show-297-1.shtml</link>
			<category domain="http://www.52cd.net/category-9-1.shtml">DataBase</category>
			<pubDate>2008-10-11 22:54</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-296-1.shtml</guid>
			<title>感慨</title>
			<author>gouki</author>
			<description><![CDATA[<p>晚上，加班，开会，讨论，回家，打车，没钱，银行，取钱，失败，汗颜，凄凉，绝望，电话，转机，掏光，感慨</p>]]></description>
			<link>http://www.52cd.net/show-296-1.shtml</link>
			<category domain="http://www.52cd.net/category-5-1.shtml">Misc</category>
			<pubDate>2008-10-10 23:58</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-295-1.shtml</guid>
			<title>最近一周IN语</title>
			<author>gouki</author>
			<description><![CDATA[<p>美女就象胡椒面，哪里人气不旺就撒一点，保证管用<br />
到老年有几个明显的特征：一是记忆减退，二是&hellip;&hellip;二已不记得了<br />
什么时候才能像蜗牛一样，掌握自己的节奏，拥有自己的房子，走着自己的路<br />
现代人的学习观：父母是教科书，朋友是参考书，爱人是工具书，邻居是报纸杂志，美女是画报<br />
肥胖、金钱、自满有碍记忆力<br />
狡猾和聪明的差距不是在智力上，而是在道德上<br />
女人说&ldquo;女人难当&rdquo;这句话前，最好还是先听听结了婚的男人怎么说<br />
这是我的名片，后面有我的电话，没事别打<br />
爱情中的玫瑰，整好了是动力，整不好是核动力<br />
快乐不是因为拥有的多，而是因为计较的少<br />
一个女人会为未来担心，直到找到丈夫为止；一个男人从来不会为未来担心，直到找到妻子为止<br />
幸福生活九字经：有希望，有事干，有人爱<br />
孩子，别哭，爸爸带你到市场看别人吃糖<br />
视爱情为生活奢侈品，有最好，没有也能活<br />
富人拿出1000块给穷人和穷人拿出最后一块钱给富人，两者是不同的，前者把对方当朋友，后者把对方当兄弟<br />
女人评判男人是看他开的车。男人评判汽车是看它是否吸引女人<br />
你有什么不开心的事，说出来让大家开心一下<br />
一父亲感慨两代人之间的代沟：刚刚适应了儿子的长发，他又剃了光头<br />
我一直跑一直跑，把悲伤都伤化汗水，这样，就不会有多余的眼泪流出来了<br />
如果你同时爱几个人，说明你年轻，如果你只爱一个人，那么你老了，如果你谁也不爱，你已获得重生<br />
不要让自己的理智和感情赛跑，适得其反的是越克制理智，感情就越一路领先<br />
等待太久得来的东西多半已经不是当初自己想要的了。<br />
你中意的人，就像你手里握的一只小鸟，抓得松，怕飞走，抓得紧，捏死了<br />
冷漠，有时候并不是无情，而是一种避免被伤害的工具<br />
高峰期感受了一把地铁才知道原来人是软体动物<br />
若问车票何处有，站长遥指黄牛村<br />
令人不能自拔的，除了牙齿还有爱情<br />
不要相信一见钟情，因为你不能一眼看出对方挣多少钱<br />
鲜花往往不属于赏花的人，而属于牛粪<br />
30岁到秋天还伤感的人是疯子，要么是傻子，至少还是个孩子<br />
把握时令，创造时运，成龙成凤，要有自信；态度端正，不要卖命；身体要紧，不要生病；好吃好玩，欢度国庆<br />
无论是蕾丝内衣还是工作报告，简洁的都是最好的<br />
我们每天都和一些人擦肩而过，是因为地球上的人太多了<br />
签任何合同之前至少看三遍&mdash;&mdash;最具挑战性的合同是婚约<br />
苦不苦，为了工资泪飞舞；累不累，为了工作心操碎；烦不烦，大量任务做不完；好不好，拿到钞票见分晓</p>]]></description>
			<link>http://www.52cd.net/show-295-1.shtml</link>
			<category domain="http://www.52cd.net/category-12-1.shtml">Catchword</category>
			<pubDate>2008-10-09 09:29</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-294-1.shtml</guid>
			<title>关于尿布的选用［续］</title>
			<author>gouki</author>
			<description><![CDATA[<p>在8月7日的时候，我写了一篇<a href="http://www.neatcn.com/show-179-1.shtml">关于尿布的选用</a>，那时候，我们还没有开始使用好奇，现在开始使用了，也可以为这篇使用结尾一下<br />
<br />
好奇的尿片，我们买的是男女通用的（不是买的，是别人送的），长度没有妈咪宝贝的长，略显有点短，不过，一夜过后，好奇尿片的表面也还是干干的。这点妈咪宝贝和帮宝适都不如它，过了一夜，这两种尿片的外部都有点湿，仿佛是渗过来一样。</p>
<p>但同样的，这两种尿片都是宣称自己的透气性好，所以我也没有办法确定是因为好奇的尿片透气性不好呢，还是它更加强劲。</p>
<p>嘘嘘乐嘛。就不提了，除了那个颜色可以随着尿液的增多而逐渐变化，可以更清晰的了解尿片里尿液的存量，这点是确实不错。</p>
<p>PS：今年我老婆的朋友想过来玩，问到需要什么东西，想送给小孩，最后说，还是送尿片吧，比较实用，老婆随口说不要送嘘嘘乐哦，朋友笑起来了，当年你们送的就是嘘嘘乐呀。汗一下，不过几年前，我们都不了解这些东西哪个最好，也没有什么经验。呵呵<img border="0" alt="" src="http://www.neatcn.com/images/smiles/shine.gif" /></p>
<p>&nbsp;</p>]]></description>
			<link>http://www.52cd.net/show-294-1.shtml</link>
			<category domain="http://www.52cd.net/category-11-1.shtml">Baby</category>
			<pubDate>2008-10-08 09:18</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-293-1.shtml</guid>
			<title>病中的 eBay［来自dbanotes.net］</title>
			<author>gouki</author>
			<description><![CDATA[<p>在dbanotes.net看到这篇最新的文章，也算是有一点点感慨吧。</p>
<hr width="100%" size="2" />
<p>电子商务巨头 eBay 有恙，病在腠理，不治将恐深。已经好久不写针对竞争对手公司的评论了，但《福布斯》<a target="_blank" href="http://www.techweb.com.cn/business/2008-10-07/369081_1.shtml">这篇文章</a>真的让人感触良多。</p>
<h4>硅谷的 IBM</h4>
<p>谁的会议多，谁的效率低下:</p>
<blockquote>公司内部流传着一个笑话，说eBay已经成了&quot;硅谷的IBM&quot;。20年前，IBM的官僚作风最终导致了公司风光不在，而这一比喻 正是对eBay当前状况的真实写照。一些现任和前任eBay员工纷纷在采访中抱怨说，<font color="#ff0000">eBay总是有开不完的会，公司太看中幻灯片的演示而忽视了真正的创 新</font>。他们说，<font color="#0000ff">eBay成了 &quot;商业咨询师&quot;的聚集地，但是这些人大都是&quot;纸上谈兵&quot;，根本没有与客户进行深入的接触，而且缺乏技术眼光，行为方式过于保守，而真正工程师却只能在一旁 听候指挥</font>。</blockquote>
<h4>不吃自己的狗粮</h4>
<p>eBay 管理人员不用自己的产品，自然也就无从知道用户的感受:</p>
<blockquote>&quot;<font color="#ff0000">eBay的管理人员都很聪明，但是这些聪明人却从来都不用eBay，也没有花费足够的时间来研究他人是如何使用eBay的</font>。&quot; </blockquote>
<h4>电子商务公司需要技术高层</h4>
<blockquote>除了刚刚加盟前网景公司联合创始人马克-安德森(Marc Andreessen)之外，eBay公司的最高管理层中找不到任何的拥有技术背景的人。</blockquote>
<p>尽管有些问题，但是 eBay 仍然是需要我们仰视。</p>
<p>--EOF--</p>
<hr />
<p><strong>相关文章|Related Articles</strong></p>
<ul>
    <li><a target="_blank" href="http://www.dbanotes.net/database/ebay_storage.html">eBay 的数据量</a> - Nov  1, 2006</li>
    <li><a target="_blank" href="http://www.dbanotes.net/web/ebay_application_server.html"> eBay 的应用服务器规模</a> - Nov 26, 2006</li>
    <li><a target="_blank" href="http://www.dbanotes.net/database/ebay_database_scale_out.html">eBay 的数据库分布扩展架构</a> - Jul  6, 2007</li>
    <li><a target="_blank" href="http://www.dbanotes.net/arch/ebay_db_scale_out.html">eBay 的数据层扩展经验</a> - Nov  7, 2007</li>
</ul>
<p>原文来自：<a target="_blank" href="http://www.dbanotes.net/review/ebay_problem.html">http://www.dbanotes.net/review/ebay_problem.html</a></p>
<p>PS：部份文字的颜色是我自己更新的，与dbanotes的原文无关。谢谢</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.52cd.net/show-293-1.shtml</link>
			<category domain="http://www.52cd.net/category-7-1.shtml">Ideas</category>
			<pubDate>2008-10-08 09:09</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-292-1.shtml</guid>
			<title>小家伙剃了个小光头</title>
			<author>gouki</author>
			<description><![CDATA[<p>小家伙今天理了个小光头，不过还不算是太光，外婆不让。唉。胎毛还是留了点在头上。</p>
<p>上张照片。。。</p><br /><br /><b>图片附件(缩略图):</b><br /><a href="http://www.52cd.net/attachment.php?id=177" target="_blank"><img src="http://www.52cd.net/attachments/date_200810/thumb_beb0214fb45da369c729f7b9697f35ba.jpg" border="0" alt="大小: 796.88 K&#13;尺寸: 500 x 375&#13;浏览: 39 次&#13;点击打开新窗口浏览全图" width="500" height="375" /></a>]]></description>
			<link>http://www.52cd.net/show-292-1.shtml</link>
			<category domain="http://www.52cd.net/category-11-1.shtml">Baby</category>
			<pubDate>2008-10-07 11:46</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-291-1.shtml</guid>
			<title>精通MYSQL数据库——连载十二</title>
			<author>gouki</author>
			<description><![CDATA[<div style="" class="Section0">
<p class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">三大范式：第一范式，第二范式，第三范式，听着名字就很恐怖。但其实现在的人都被这个所谓的第三范式折腾死了，有事没事就拿出来涮涮，究竟怎么理解这些呢？一个一个慢慢的介绍。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">数据库理论家们为数据库的设计1对N，N对N这种问题总结出了一个通用的解决方案，只需一步一步地三个范式（Normal&nbsp;Form）的规则应用到自己的数据库上就可以了。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第一范式的规则：</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">1、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">内容相似的数据必须&ldquo;消除&rdquo;（所谓消除，即再创建一个表来存储他们）</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">2、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">必须为每一组相关数组分别创建一个数据表</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">3、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">每条数据记录必须用一个主键来标识</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">第一条</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">规则，看上去就比较适用于1对多的情况</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">第二条</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">规则就不太好控制了，很多人认为第二条规则很难理解，数据的相关度，很难简单的描述清楚</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">第三条</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">规则其实是一个实践经验，它的意思是数据表里的第一个数据行都应该包括一个独一无二的标识符作为索引。在使用MYSQL的时候，我们大多采用了自增字段来作为主键，但并非只有整数的自增字段才能作为索引，只要是独一无二的数据列，都可以用来做索引，之所以采用自增列，那是因为：1、不需要主动插入值2、整数列的时间和空间效率相对比其他类型的要高。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第二范式的规则：</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">1、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">只要数据列里的内容出现重复，就意味着应该把数据表拆分为多个子表</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">2、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">拆分形成的数据表必须用外键关联起来</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第二范式，其实是在第一范式的基础上再进行一个拆分。指的就是第一范式规则的第二条内容。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">外键关系在第二范式里显得特别重要，是因为第二范式时，数据会拆得更细，如果没有外键关联，恐怕数据就找不回来了。外键相当于我们日常所说的：交叉引用，对开发人员来说相当于指针。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第三范式的规则</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第三范式只有一条规则：与主键没有直接关系的数据列必须&ldquo;消除&rdquo;</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">其实也就是把第二范式再分解，再建表。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">可想而知，等到真正把一堆数据完全按照第三范式来进行设计的时候，恐怕在数据库里也就只能看到一堆ID了，数据呢？数据在哪里？通过外键，外键的外键，外键的外键的外键来慢慢的一个一个搜索吧。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">对于MYSQL&nbsp;4.1以下的版本，第三范式是会要了他们的命的，foreign&nbsp;key功能的不完善，让MYSQL&nbsp;4.1以下版本，基本不适合第三范式，能用到第二范式设计时，数据表的效率已经几乎不能保证了。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">这三个范式是著名学者E.F.Codd最先提出来的，后人在此基础&nbsp;上对大到数学集合理论、小到关系数据库设计细节等诸多方面进行了研究和探索。如果对这方面有兴趣的朋友，还是多找找相关的书籍看看为好。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">如果你的性子比较急，那么你可以尝试按照下面的方法来进行：</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">1、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">设计数据库的时候，一定要给自己充足的时间，如果等到数据库充满了数据，而程序也几乎开发完毕时，才发现数据库设计有缺陷，那么花费的代价就太大了</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">2、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">如果发现自己创建的表的数据列有序号，如name1,name2等，那一般就意味着还有更好的解决方案没有采用。可以考虑多创建一个表，而把这些分拆开。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">3、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">第一时间往数据库里多插点测试数据，如果发现冗余量很大，往往就是表需要分拆的信号</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">4、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">设计时应该注意数据与数据之间的关联及引用关系</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">5、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">对于设计完的数据库，应该自己尝试写SQL语句，看看能否达到你预想的目标，如果达不到，那就要考虑是否设计的有问题。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';">6、</span><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">如果你还是等不急，根据你的需要，到网上找找有没有类似的示例数据库，可以考虑拿来作借鉴。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">说了这么多时间的范式，最后再说说他们的优缺点吧</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">缺点：数据表的个数越多，也就相对证明了从表单里获取数据并往表里插的时候，复杂性非常大，给开发人员会带来很大的困扰。同样，表多了，查询结果时，从中提取相关数据生成查询结果的复杂性也就越大；数据库的容量随着表的拆分量的增大而增大（不过现在也不是什么矛盾了，硬盘的价格几乎也快到了白菜价了，这点可以被忽略）</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><font face="宋体">优点：严格按照范式设计出来的数据库，能够提供最丰富、最灵活的查询选项，人们往往都是在等到必须使用一种新的查询或者必须对数据进行一种新的分类时才会真正意识到这一点，但可惜的是，这些新需求往往都是出现在数据库已投入运行数月之后，到时候再改数据库，代价非常大。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p><hr width="100%" size="2" />
现在工作有点忙，连载不会忘记，但更新频率会放慢，毕竟全部都是手工打出来的字。</o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p>不会象写小说那样太监掉的，毕竟这个东西对我自己来说，也是一种学习</o:p></span></p>
<p style="text-indent: 21pt; text-align: justify;" class="0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p>给自己加油，为自己打气。也谢谢大家的支持</o:p></span></p>
</div>]]></description>
			<link>http://www.52cd.net/show-291-1.shtml</link>
			<category domain="http://www.52cd.net/category-9-1.shtml">DataBase</category>
			<pubDate>2008-10-06 23:59</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-290-1.shtml</guid>
			<title>收到一张受刺激的图片</title>
			<author>gouki</author>
			<description><![CDATA[<p>同事发给我一张图片，让我大受刺激啊。我是没有那么多钱买那台电脑了，现在是寄希望于我同学，黑黑，不过，现在好象有一款神舟不错，就是最近的那批优雅Q系列，值得考虑一下，反正应该是比EEEPC会好上很多，重量是1.2KG，考虑中，160G硬盘呢，就是不知道散热怎么样。。。</p>
<p>传上那样受刺激的图片先</p><br /><br /><b>图片附件(缩略图):</b><br /><a href="http://www.52cd.net/attachment.php?id=176" target="_blank"><img src="http://www.52cd.net/attachments/date_200810/thumb_3ea5ae4ba8ccdf260f5ed6c92e243a6c.jpg" border="0" alt="大小: 294.34 K&#13;尺寸: 498 x 376&#13;浏览: 45 次&#13;点击打开新窗口浏览全图" width="498" height="376" /></a>]]></description>
			<link>http://www.52cd.net/show-290-1.shtml</link>
			<category domain="http://www.52cd.net/category-5-1.shtml">Misc</category>
			<pubDate>2008-10-05 07:50</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-289-1.shtml</guid>
			<title>杂谈二</title>
			<author>gouki</author>
			<description><![CDATA[<p>博客本来就是用来记录内心想法的东西，只是我的博客可能记录的技术类的东西相对较多，国庆期间嘛，心思也不在技术上，于是就有了杂谈。</p>
<p>美国众议院、参议院终于同意了救市方案，7000亿美金，听起来很恐怖，可惜股市还是下跌了，恐怕华尔街那些人就非常开心了，压力会小一点了。我在上篇杂谈里就说过，不希望会有这种事情发生，毕竟有第一次也就会有第二次。布什在促进这件事成功，是因为不想留下污点？个人认为。两个竞选者促进成功，是因为这样可以在上台后压力小一点，反正用的钱又不是我的，也不是我下令的，责任不在我身上。可惜对于美国这种物权法很看中的国家来说，民众是怎么想的？7000亿，要纳多少税？在用自己的钱救市，心里是迷惘多一点还是期盼多一点？我交出去的钱，终于派上用场了？可惜，华尔街人应该也在想，怕啥，再怎么样，还是会有人帮我的。。。</p>
<p>除开经济，恐怕搞技术的人这两天都在关注着GOOGLE推出的在线备份MYSQL的innodb数据库？<a href="http://rdc.taobao.com/blog/dba/html/209_innodb_backup_online_dc.html">这里</a>提到了，<a href="http://zhaolinjnu.blog.sohu.com/101183896.html">这里</a>也提到了，其实讲的都是<a href="http://code.google.com/p/google-mysql-tools/wiki/InnodbFreeze">GOOLE CODE</a>上的内容，谁来做小白鼠？短时间内谁敢用？估计还是要过段时间了，不过，这毕竟是一个想法，以后这种类似的东西会越来越多的吧？</p>
<p>再说说软件，思维导图，应该算是最近一段时间比较流行的东西了，思维导图是国内人员的翻译，详细介绍如下：
<div class="codeText">
<div class="codeHead"><span><span>什么是MindManager？</span></span></div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>&nbsp;</span></span></li>
    <li class=""><span>MindManager是一个创造、管理和交流思想的通用标准，其可视化的绘图软件有着直观、友好的用户界面和丰富的功能，这将帮助您有序地组织您的思维、资源和项目进程。&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>MindManager也是一个易于使用的项目管理软件，能很好提高项目组的工作效率和小组成员之间的协作性。它作为一个组织资源和管理项目的方法，可从脑图的核心分枝派生出各种关联的想法和信息。&nbsp;&nbsp;</span></li>
    <li class="alt"><span>MindManager可以使讨论和计划的过程从根本上发生变化，促进实现你的思想和方案。&nbsp;&nbsp;</span></li>
    <li class=""><span>在一般的传统的讨论中至少包含四个步骤：&nbsp;&nbsp;</span></li>
    <li class="alt"><span>1、从图表或白板上获得思想&nbsp;&nbsp;</span></li>
    <li class=""><span>2、转录成为很难阅读的电子版&nbsp;&nbsp;</span></li>
    <li class="alt"><span>3、在组织信息资料的过程中不可避免的要损失某些思想的重要关系&nbsp;&nbsp;</span></li>
    <li class=""><span>4、通过印刷品或者电子邮件分发资料&nbsp;&nbsp;</span></li>
    <li class="alt"><span>时间和资源在重复的信息中被浪费了，同事们很难理解会议的结果。&nbsp;&nbsp;</span></li>
    <li class=""><span>但是，MindManager软件改变了研讨过程，只通过以下两个步骤就可以在同一页中显示出每个人的观点，从而避免了不必要的重复性的工作。&nbsp;&nbsp;</span></li>
    <li class="alt"><span>1、迅速的以可视化形式获取和组织思想，促进团队内的协作和个体积极性。&nbsp;&nbsp;</span></li>
    <li class=""><span>2、能够直接分发会议记录，比以往更快的落实各种设想。&nbsp;&nbsp;</span></li>
    <li class="alt"><span>点击&ldquo;输出&rdquo;（export），可以得到PDF、Word、Powerpoint、HTML和图片格式文件。&nbsp;&nbsp;</span></li>
</ol>
</div>
cnbeta上面有详细介绍，上面的也是COPY而来，地址为：http://www.cnbeta.com/articles/66193.htm，除了这个软件，另外这五款软件也是不错的，值得下载使用，我没有用过，但是看名称和介绍，就知道应该是值得用用：<a href="http://www.cnbeta.com/articles/66188.htm">5个最出色必须拥有的windows xp 管理插件</a></p>]]></description>
			<link>http://www.52cd.net/show-289-1.shtml</link>
			<category domain="http://www.52cd.net/category-5-1.shtml">Misc</category>
			<pubDate>2008-10-04 19:03</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-288-1.shtml</guid>
			<title>精通MYSQL数据库——连载十一</title>
			<author>gouki</author>
			<description><![CDATA[<p>一个好的数据库设计应该符合以下几点要求：<br />
1、数据表里没有重复冗余的数据（如果总是往里面插入同样的数据，那应该是设计上有问题，当然现在在利用空间换时间的时候，多数人还是保留了这样的想法）<br />
2、数据表里没有column1,column2,column3&hellip;&hellip;这类没有明确意义的字段，因为这样会让后来人摸不清头脑<br />
3、数据表占用的空间越小越好<br />
4、使用频率高的数据表的查询，应该都能以简单高效的方式执行（表内数据少的时候，你就是10几个left join,你可能都感觉不出什么，但数据量一大，你一个left join都会让你感觉到速度慢下来，如果最初设计时没有满足这个要求，那么，以后想改可能也没有机会了）<br />
这些也只是一些总的原则，也只是简单的介绍，以后会详细说明，当然上面这几点并非完全正确，就象第三范式，这是一个标准，但这个标准真的就是最好的吗？并非如此，但我们现在是在讲设计数据库，它好不好，目前不讲。以后一起讨论<br />
<br />
为MYSQL的数据库和数据表甚至字段起名字还是有讲究的，最重要的是，千万不要使用保留关键字，而且有一些单词很奇怪，在4.0里面并不是关键字，但升级后，却变成了关键字。<br />
详细的关键字列表请看：<a href="http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#reserved-words">MYSQL手册中保留字部分</a><br />
对于一个完整的设计应该注意以下几项：<br />
1、由于MYSQL对数据列的命名不区分大小写，而对库名和表名区分大小写，因此为了规范和统一，请使用同样的规则，不要象程序代码那样来个骆驼命名啥的，这样只会给开发带来困难，建议是全部采用小写，移植、升级都方便<br />
2、不要采用特殊字符或者中文，MYSQL对于多字节的处理并不十分完美，虽然支持中文建库、建表等，但实在不建议使用，如果你的服务器对中文支持不好，可能建库的时候就会是乱码，字段里，明明看到有值就是查不出，所以，为了规范，还是采用英文，26个字母的排列组合，没有那么复杂的。<br />
3、数据库、表、字段的长度请不要超过64个字符，<br />
4、表名和数据列名，请尽量采用有意义的名称，不要出现上文提到的那种column1,colnmn2之类的，时间长了，你自己都可能不知道是什么意思<br />
5、给字段命名，需要有规范，因为这样会减少粗心带来的错误，比如username,user_name，如果分在各个表里，恐怕你每次写程序的时候，都得再检查一遍吧？对于由多个单词组成的字段，要么全部加下划线，要么全部不加，这样也比较有利于开发和维护<br />
6、数据列的单复数，原因和5一样，要么全部单数，要么全部复数，一会单数一会复数的，开发和维护的时候，你就得盯着数据表来进行了。<br />
<br />
数据库的设计是一件很复杂的事情，要在短时间内把一批数据分割开，并存储到数据库中，还得为开发人员提供足够的优化空间，不是一天两天就能完成的，当然现在有很多这样的工具，比如powerdesign（PD），在设计完后，还能导出数据库，确实是挺方便，但这样的软件，价格就太高了，不是我们所买得起的。<br />
平时，我们还是使用WPS的电子表格，或者openoffice的电子表格功能，设计好数据表（电子表格最大的好处就是有几乎无穷的sheet，可以让你把一个很大的库放在这些sheet里），而且，几乎每台电脑上都会有这样的工具，便于交流。这样可以在最初的阶段对于一些数据列进行安排（没办法建立索引的，只是简单的用来布局，检查设计上是否有缺陷）<br />
<br />
对于管理MYSQL，也有很多工具，比较常见的，就是：phpMyadmin；MYSQL自已也提供过，好象是mysqlFront?记不太清，现在我自己用的是navicat for mysql lite ，不用钱的东西都是好的。虽然在国内，大家都了解软件业的行情。自己也处于软件业的下游，能够使用正版，还是使用一下正版吧。不能使用正版的，找找免费版。<br />
在我看的书上，它介绍说openoffice里其实还隐藏着连接数据库这个功能的，而且可以能够象创建视图一样来创建SQL，这个功能不错，我以后要好好看看，如果确实有用，那我WPS也不装了，直接使用openoffice。<br />
不过，最常用的，最方便的，还是使用phpmyadmin，它实在是居家旅行、杀人灭口之大杀器。</p>]]></description>
			<link>http://www.52cd.net/show-288-1.shtml</link>
			<category domain="http://www.52cd.net/category-9-1.shtml">DataBase</category>
			<pubDate>2008-10-03 07:06</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-287-1.shtml</guid>
			<title>国庆休闲看电影</title>
			<author>gouki</author>
			<description><![CDATA[<p>国庆在家里，几乎没有时间写什么东西，也就看看电影放松一下，写代码的时候总是被小孩哭声打断，而看电影则没有这样的困扰。<br />
对于动画片还是一象的有爱好，好莱坞的动画片也越来越吸引人了，这两天看的是《霍顿与无名氏》，3D方面，中国短时间内是比不上美国了。<br />
国内注重的是个人修养，有3D制作能力的人，不是很懂艺术，有艺术细胞的人，不懂3D。大多数有艺术细胞的人，都还是采用电脑来制作插画等。兔斯基也是这样而出名的，但几乎没有3D的东西出现。<br />
最近几年看过的动画片有：《超人总动员》《汽车总动员》《篱笆墙外》《马达加斯加》《忍者神龟》等，实在太多了，并非总有的动画片都是那样的娱乐和搞笑，象《僵尸新娘》就很有好莱坞大片风范，《功夫熊猫》则有动作片风范，当然即使这样，片中也总还是存在了一些娱乐元素。<br />
正如很多人说的：国外的动画片是给8岁~80岁的人看的，国内的动画片是给3~8岁的人看的。<br />
《奥特曼》吸引了几代人？现在又改成了《灰太狼和喜羊羊》了，我实在看不出，这样的动画片为什么能够拿大奖，或许，这就是代沟吧。<br />
现在很多FLASH都在制作《80年出生的所怀念的事》，动画片也是其中一项，国内国外都有，什么一休啦、希曼希瑞啦，花仙子，蓝精灵啥的。国内的黑猫警长，葫芦兄弟啥的。有多少人记得现在的动画片？<br />
今年的《风云》我没有去看，是因为正好小孩出生，也没有时间去看。或许不错吧。。。<br />
记得小时候动画最多的还是上海美影的，什么牧童、鱼盆啥的。最长的应该是《天书奇谭》吧，忘了是哪个制片厂出的了。<br />
看过的朋友请留言，记忆中最多的动画片。呵呵</p>]]></description>
			<link>http://www.52cd.net/show-287-1.shtml</link>
			<category domain="http://www.52cd.net/category-5-1.shtml">Misc</category>
			<pubDate>2008-10-02 10:32</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-286-1.shtml</guid>
			<title>杂谈</title>
			<author>gouki</author>
			<description><![CDATA[<p>又是一年十月一日，同样的，祝福大家国庆快乐<br />
平时没有什么休假的朋友们，可以乘着长假出去走走，难得回家的朋友也可以乘此机会回家看看</p>
<p>听说，从明年开始也要取消国庆长假了，如果这项提议转为事实，那么以后出行的机会又要少上很多，那些单位年假不多的人，又要痛哭了。</p>
<p>除此之外，新闻里报道美国国会在投票7000亿救市的时候，选择了否诀，个人认为这是一个明智的决定，如果真的同意了，那么有了第一次就会有第二次，虽说经济和政治挂钩，但政治不应该去主动的影响经济，顺其自然，不过这次也算是全球性的影响。我们国家可能损失会更大。</p>
<p>光靠一两个救市是没有用的，而应该让民众感觉到对市场的放心。乱就一个字</p>
<p>世事无常，今年的灾害特别多，可能也是与全球变暖有关吧，少开点空调，少有点污染，世界将会变得清静。</p>
<p>不多废话</p>
<p>希望明年的国庆会更好，朋友们，快乐！</p>]]></description>
			<link>http://www.52cd.net/show-286-1.shtml</link>
			<category domain="http://www.52cd.net/category-5-1.shtml">Misc</category>
			<pubDate>2008-10-01 07:07</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-285-1.shtml</guid>
			<title>JS取当时间的一个很妖的方法</title>
			<author>gouki</author>
			<description><![CDATA[<h1>关于new Date().getTime()的简写方式.</h1>
<p>原文来自cssrain，只取了其中的一小部分。http://www.cssrain.cn/demo/3/newDate.html</p>
<div align="left">小结：<br />
（1）getTime（new Date.getTime 方法）<br />
返回指定的 Date 对象自 1970 年 1 月 1 日午夜（通用时间）以来的毫秒数。当比较两个或更多个 Date 对象时，使用此方法表示某一特定时刻。<br />
返回值类型：Number -- 一个整数。<br />
<br />
（2）<br />
function now(){<br />
return +new Date;<br />
}<br />
jQuery 源代码里就是使用的  +new Date ;<br />
<br />
(3)<br />
用来判断 google 浏览器：<br />
if( !isNaN(Date.parse(&quot;1970.01.01&quot;)) ){<br />
alert(&quot;This is Google Chrome!&quot;);<br />
}else{<br />
alert(&quot;This is NOT!&quot;);<br />
}</div>
<pre>结果：1和2的结果是一样的。但这个number是13位的number，和PHP中的时间戳并非同一个意义</pre>]]></description>
			<link>http://www.52cd.net/show-285-1.shtml</link>
			<category domain="http://www.52cd.net/category-2-1.shtml">Javascript</category>
			<pubDate>2008-09-30 22:55</pubDate>
		</item>
		<item>
			<guid>http://www.52cd.net/show-284-1.shtml</guid>
			<title>祝贺：微软也开源 将采用jQuery JavaScript库</title>
			<author>gouki</author>
			<description><![CDATA[<p><strong>微软和诺基亚正式宣布支持开源的 jQuery JavaScript库，另外，微软还称他们将把jQuery作为Visual Studio工具集的一部分。</strong>他将提供包括jQuery的智能提示，代码片段，示例，文档编制等内容在内的功能。微软和诺基亚将长期成为jQuery的用户成员，其他成员还有Google, Intel, IBM, Intuit, 路透社等。</p>]]></description>
			<link>http://www.52cd.net/show-284-1.shtml</link>
			<category domain="http://www.52cd.net/category-2-1.shtml">Javascript</category>
			<pubDate>2008-09-29 20:08</pubDate>
		</item>
	</channel>
</rss>
