<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>　膘叔　簡單人生</title>
		<link>http://www.neatcn.com/</link>
		<description>只关心我所关心的，不在意我所不在意的</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Sat, 04 Jul 2009 10:28:50 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<guid>http://www.neatcn.com/show-751-1.shtml</guid>
			<title>PHP更改文件编码</title>
			<author>gouki</author>
			<description><![CDATA[<p>PHP更改文件编码应该算是比较简单的事情，在使用uchome项目（UTF－8）的时候，发现程序的编码好奇怪，有ANSI的，和UTF－8的。<br />
很妖的是，我在ubuntu下面打开这些ansi的文件时，由于文件中含 有中文，结果全显示乱码，编码还显示为latin1。然后拷到另外一个目录，编码显示就正常了，为CP936。<br />
由于编辑器没有批量转换功能，固此，只能使用PHP自带的功能了。。。（关键我也不会其他语言）<br />
由于转换的时候会需要判断一下编码，如果编码本身是UTF－8的，再使用mb_convert_encoding($data,'utf-8','gbk')，反而会导致乱码。。<br />
所以。。。就有了以下程序<br />
慎重申明：Dir类的rmdir有BUG，请勿使用。。。。写的时候，我没有考虑太多，如果设定了某个目录，最终是会把这个目录也会删除的，而与我事先想的。把该目录下的内容清空有误差。（当然也可以在删除后重建，但毕竟不是原来的权限了。）<br />
<br />
代码如下：</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>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$dirName</span><span>&nbsp;=&nbsp;</span><span class="string">&quot;./uchome&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$files</span><span>&nbsp;=&nbsp;Dirs::read(&nbsp;</span><span class="vars">$dirName</span><span>&nbsp;,&nbsp;true);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">foreach</span><span>(&nbsp;</span><span class="vars">$files</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$fileName</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="func">is_file</span><span>(&nbsp;</span><span class="vars">$fileName</span><span>&nbsp;)&nbsp;&amp;&amp;&nbsp;in_array(Files::extension(&nbsp;</span><span class="vars">$fileName</span><span>&nbsp;)&nbsp;,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'php'</span><span>,</span><span class="string">'html'</span><span>,</span><span class="string">'htm'</span><span>))){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$fileData</span><span>&nbsp;=&nbsp;Files::read(&nbsp;</span><span class="vars">$fileName</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$fileType</span><span>&nbsp;=&nbsp;mb_detect_encoding(</span><span class="vars">$fileData</span><span>&nbsp;,&nbsp;</span><span class="keyword">array</span><span>(</span><span class="string">'UTF-8'</span><span>,</span><span class="string">'GBK'</span><span>,</span><span class="string">'LATIN1'</span><span>,</span><span class="string">'BIG5'</span><span>))&nbsp;;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="vars">$fileType</span><span>&nbsp;==&nbsp;</span><span class="string">'CP936'</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$fileData</span><span>&nbsp;=&nbsp;mb_convert_encoding(</span><span class="vars">$fileData</span><span>&nbsp;,</span><span class="string">'utf-8'</span><span>&nbsp;,&nbsp;</span><span class="string">'gbk'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;Files::save(&nbsp;</span><span class="vars">$fileName</span><span>&nbsp;,&nbsp;</span><span class="vars">$fileData</span><span>&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;{$fileName}&nbsp;convert&nbsp;successed&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="string">&quot;&lt;br&nbsp;/&gt;&quot;</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//dir</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Dirs&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;read&nbsp;(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;,&nbsp;</span><span class="vars">$recursive</span><span>&nbsp;=&nbsp;false)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="vars">$allInfo</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$dirname</span><span>&nbsp;.=&nbsp;</span><span class="func">subStr</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>,&nbsp;-1&nbsp;)&nbsp;==&nbsp;</span><span class="string">&quot;/&quot;</span><span>&nbsp;&nbsp;?&nbsp;</span><span class="string">&quot;&quot;</span><span>&nbsp;:&nbsp;</span><span class="string">&quot;/&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$dirInfo</span><span>&nbsp;=&nbsp;</span><span class="func">glob</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;.&nbsp;</span><span class="string">&quot;*&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="vars">$recursive</span><span>&nbsp;==&nbsp;false&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$dirInfo</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$dirInfo</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$info</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="func">is_dir</span><span>(&nbsp;</span><span class="vars">$info</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">is_readable</span><span>(&nbsp;</span><span class="vars">$info</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$info</span><span>,&nbsp;0777&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//$allInfo['dirs'][]&nbsp;=&nbsp;$info;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$allInfo</span><span>[]&nbsp;=&nbsp;</span><span class="vars">$info</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::read(&nbsp;<span class="vars">$info</span><span>&nbsp;,&nbsp;true);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//$allInfo['files'][]&nbsp;=&nbsp;$info&nbsp;;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$allInfo</span><span>[]&nbsp;=&nbsp;</span><span class="vars">$info</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$allInfo</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;</span><span class="func">rmdir</span><span>&nbsp;(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="func">is_dir</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;)&nbsp;&amp;&amp;&nbsp;!</span><span class="func">is_writeable</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;,&nbsp;0666&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;false;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">is_dir</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;false;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$dirname</span><span>&nbsp;.=&nbsp;</span><span class="func">subStr</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>,&nbsp;-1&nbsp;)&nbsp;==&nbsp;</span><span class="string">&quot;/&quot;</span><span>&nbsp;&nbsp;?&nbsp;</span><span class="string">&quot;&quot;</span><span>&nbsp;:&nbsp;</span><span class="string">&quot;/&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$dirInfo</span><span>&nbsp;=&nbsp;</span><span class="func">glob</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;.&nbsp;</span><span class="string">&quot;*&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$dirInfo</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$info</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="func">is_dir</span><span>(&nbsp;</span><span class="vars">$info</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::<span class="func">rmdir</span><span>(&nbsp;</span><span class="vars">$info</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlink(&nbsp;<span class="vars">$info</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="func">rmdir</span><span>(&nbsp;</span><span class="vars">$dirname</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;</span><span class="func">mkdir</span><span>(</span><span class="vars">$dir</span><span>,&nbsp;</span><span class="vars">$mode</span><span>&nbsp;=&nbsp;0777)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!</span><span class="func">is_dir</span><span>(</span><span class="vars">$dir</span><span>)){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ret</span><span>&nbsp;=&nbsp;@</span><span class="func">mkdir</span><span>(</span><span class="vars">$dir</span><span>,&nbsp;</span><span class="vars">$mode</span><span>,&nbsp;true);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!</span><span class="vars">$ret</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">exit</span><span>(</span><span class="string">'function:mkdirs&nbsp;failed'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;true;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//file</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Files&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;read&nbsp;(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">is_readable</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$filename</span><span>,&nbsp;0644&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">file_get_contents</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;create&nbsp;(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;</span><span class="vars">$mod</span><span>&nbsp;=&nbsp;0666&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;@touch(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;==&nbsp;false){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$fp</span><span>&nbsp;=&nbsp;</span><span class="func">fopen</span><span>(&nbsp;</span><span class="vars">$filename</span><span>,&nbsp;</span><span class="string">&quot;a+&quot;</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="vars">$fp</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(&nbsp;<span class="vars">$fp</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$filename</span><span>,&nbsp;0666&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;save&nbsp;(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;</span><span class="vars">$data</span><span>&nbsp;,&nbsp;</span><span class="vars">$append</span><span>&nbsp;=&nbsp;false)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">file_exists</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self::create(<span class="vars">$filename</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$append</span><span>&nbsp;=&nbsp;false;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="vars">$append</span><span>&nbsp;==&nbsp;false&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">file_put_contents</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;</span><span class="vars">$data</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">is_writeable</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$filename</span><span>,&nbsp;0666&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">file_put_contents</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;</span><span class="vars">$data</span><span>&nbsp;,&nbsp;FILE_APPEND&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;</span><span class="func">delete</span><span>&nbsp;(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;!</span><span class="func">is_array</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$filenames</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(</span><span class="vars">$filename</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$filenames</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$filename</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="func">is_file</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;!unlink(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;)&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">chmod</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;0666&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unlink(&nbsp;<span class="vars">$filename</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;extension(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">strtolower</span><span>(</span><span class="func">pathinfo</span><span>(&nbsp;</span><span class="vars">$filename</span><span>&nbsp;,&nbsp;PATHINFO_EXTENSION&nbsp;));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
			<link>http://www.neatcn.com/show-751-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-07-03 09:40</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-750-1.shtml</guid>
			<title>FF的郁闷</title>
			<author>gouki</author>
			<description><![CDATA[<p>不记得从多久开始，我就在一直使用firefox了。</p>
<p>虽然从为一名WEB开发人员，不得不使用众多浏览器，但FF已经是我的默认浏览器。一般情况下，如果不是为了看网页效果或者使用网银，我是不会打开ie的。</p>
<p>其他的浏览器也纯粹是为了测试而使用。opera更多的是被我用来打开WAP网站，chrome则就是用来体验一下速度。（顺便说一下，chrome for ubuntu，居然不能输中文？好奇怪呀。。。。）</p>
<p>今天看到推送3.5，升级了一下，结果，打不开FF了。。</p>
<p>进程里也没有。。。</p>
<p>目前尚不清楚是因为插件的关系还是什么其他的关系。因为我有很多插件需要使用，暂时不做测试了。。。。</p>]]></description>
			<link>http://www.neatcn.com/show-750-1.shtml</link>
			<category domain="http://www.neatcn.com/category-3-1.shtml">Software</category>
			<pubDate>2009-07-02 21:53</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-749-1.shtml</guid>
			<title>gc_enabled</title>
			<author>gouki</author>
			<description><![CDATA[<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>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$usingGC</span><span>&nbsp;=&nbsp;gc_enabled();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">if</span><span>(&nbsp;</span><span class="vars">$usingGC</span><span>&nbsp;==&nbsp;false){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gc_enable();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$usingGC</span><span>&nbsp;=&nbsp;gc_enabled();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">if</span><span>(&nbsp;</span><span class="vars">$ucingGC</span><span>&nbsp;==&nbsp;true){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;gc_collect_cycles();&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>不知道效果有多明显？</p>]]></description>
			<link>http://www.neatcn.com/show-749-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-07-02 12:14</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-748-1.shtml</guid>
			<title>杂记</title>
			<author>gouki</author>
			<description><![CDATA[<p>既然标题为杂记当然记得东西也就比较杂一点<br />
1、linux<br />
刚刚装好ubuntu后，建立了一个分区，进入分区目录，想改权限为任何用户都能访问</p>
<p>所以进入命令行，用了chown -R nobody.nogroup /</p>
<p>命令中的/，前面少加了一个. ，结果。。。所有的目录权限都不正常了</p>
<p>重启后，无法访问。最后重装（虽然听说用simple mode登录后可以解决，但一来没时间，二来，我是新做的系统，重装速度会更快一点）</p>
<p>2、虚拟机</p>
<p>在ubuntu下面的虚拟机，好象不能设置为随系统启动而启动的。这不象在windows下面。当系统启动后，虚拟机也可以自动启动（虚拟机是server版，可以在每一个虚拟OS上指定是否随系统启动而启动）</p>
<p>3、虚拟机中的windows 2003登录</p>
<p>2003初装好是需要按ctrl+alt+delte登录的，但vmware中按ctrl+alt是退出焦点。vmserver2后，没有客户端访问程序了（需要单独安装）我感觉还不如1.x版呢。。。</p>
<p>所以进入后，先按Ctrl+apace，把输入法调出来，然后按着ctrl+alt，再用鼠标点击软键盘，上面的del键，进入后。gpedit.msc把登录需要ctrl+del+alt关闭</p>
<p>4、招行</p>
<p>招行登录，不能用远程连上计算机登录，只能本机登录。</p>
<p>远程后，进入大众版会显示：非法远程登录，在询问客服后才知道。。。</p>
<p>5、ubuntu下为什么要装虚拟机？</p>
<p>你以为我想啊，可是不装，QQ功能不全，网银不能使用。支付宝也不能用。凡 是要花钱的地方，ubuntu都不支持，我该怎么办？？</p>]]></description>
			<link>http://www.neatcn.com/show-748-1.shtml</link>
			<category domain="http://www.neatcn.com/category-5-1.shtml">Misc</category>
			<pubDate>2009-07-02 10:59</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-747-1.shtml</guid>
			<title>google mail 标签大更新</title>
			<author>gouki</author>
			<description><![CDATA[<p>这，其实是一个用户体验与功能协调的问题。因为以后的项目中很可能也会采用标签（如今阿猫阿狗的网站都有标签功能，但什么样的标签最好，才是个疑问）。借机参考一下<br />
<br />
新闻来源:http://google.org.cn/2009/07/02/gmail-drag-and-drop-labels/<br />
恩恩，Gmail的标签功能非常好用，估计<a href="http://google.org.cn/2009/06/24/38-tips-makes-you-gmail-master/">很多Gmail黑带高手</a>都自己建立了很多过滤器来将邮件自动通过标签来分类，再加上自定义标签颜色功能，使打开的Gmail呈现一片五颜六色之势，美不胜收。<strong>今天Google宣布继续大幅增强标签功能，新功能一个赛一个的实用。</strong> 第一：标签显示的新位置<br />
<br />
以前标签总是出现在Gmail界面的左下方，独立存在于Labels框架里，与收件箱/发件箱/加星箱（我自己起的名字&hellip;&hellip;）/草稿箱什么的分开老远。现在你可以直接将Labels框架里的常用标签给拖到上面来了，跟这个箱那个箱的排列在一起。<br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=383" target="_blank"><img src="http://www.neatcn.com/attachments/date_200907/thumb_14af5268c46924e1f750510cf39b3fa4.jpg" border="0" alt="大小: 39.45 K&#13;尺寸: 500 x 328&#13;浏览: 7 次&#13;点击打开新窗口浏览全图" width="500" height="328" /></a><br />
<br />
第二：标签的隐藏与显示<br />
<br />
如果你设置了很细致的标签造成标签泛滥，那你Gmail的左侧会拉的很长。现在你可以选择把那些不常用的标签隐藏到more下拉菜单里。<br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=384" target="_blank"><img src="http://www.neatcn.com/attachments//date_200907/d97df0d7f23bc5757a77614c562f09c1.jpg" border="0" alt="大小: 40.51 K&#13;尺寸: 427 x 347&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="427" height="347" /></a><br />
<br />
更棒的是你在Gmail Labs里添加的自定义标签颜色现在可以删除了。我的自定义标签里就有很多实验出来的配色不好的颜色，但我之前一直没找到怎么删，很苦恼。<br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=385" target="_blank"><img src="http://www.neatcn.com/attachments//date_200907/9613e28ea40e8b0cf02bcc7b2f0d217b.jpg" border="0" alt="大小: 10.44 K&#13;尺寸: 157 x 224&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="157" height="224" /></a><br />
<br />
你也可以为标签进行排序了，而不必在标签前面加序号/特殊字符的方式强制使一些常用的标签排到最上面去，比如什么&ldquo;000最重要&rdquo;、&ldquo;+++女友的信&rdquo;等等。<br />
<br />
第三：拖拽<br />
<br />
拖拽加标签，太酷了！你可以把需要加某个标签的邮件勾上，然后拖到标签上，比如这样：<br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=386" target="_blank"><img src="http://www.neatcn.com/attachments/date_200907/thumb_9e18d29a45992dbce758e582fa36cbca.png" border="0" alt="大小: 31.37 K&#13;尺寸: 500 x 90&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="500" height="90" /></a><br />
<br />
也可以反其道而行之，将标签拖到某些打钩的邮件上，比如这样：<br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=387" target="_blank"><img src="http://www.neatcn.com/attachments/date_200907/thumb_98577e8b114062ac5d22528995c8920e.png" border="0" alt="大小: 29.64 K&#13;尺寸: 500 x 90&#13;浏览: 5 次&#13;点击打开新窗口浏览全图" width="500" height="90" /></a><br />
<br />
如果你的标签在more下拉条里，一样可以做拖拽操作。<br />
<br />
所有这些更新意味着Gmail Labs里的Right-Side Labels该下岗了，你已经不需要它来帮助你节省屏幕空间了。<br />
<br />
以上这些更新将很快陆续出现在你的Gmail里。现在我这里只出现了删除自定义标签颜色，其它还都没有，估计就这几个小时了。另外如果你想第一时间体验到Gmail的新功能，别忘记使用英文版而非中文版。<br />
<br />
我知道又会有无聊的闲人留言说&ldquo;腾讯快来抄哇~~~~&rdquo;，咳咳，我先把这句话给说了，让你们这些没技术含量的人没的可说。</p>]]></description>
			<link>http://www.neatcn.com/show-747-1.shtml</link>
			<category domain="http://www.neatcn.com/category-3-1.shtml">Software</category>
			<pubDate>2009-07-02 07:08</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-746-1.shtml</guid>
			<title>Mybase</title>
			<author>gouki</author>
			<description><![CDATA[<p>我是看到这个图不错，感觉好象还行。。所以转载一下。。。</p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">原文：http://rdc.taobao.com/blog/qa/?p=2469</span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0">今天在用朋友的电脑时，无意间发现他桌面上一个很好的工具&mdash;&mdash;Mybase，现在推荐给大家。Mybase是一个功能强大且可随心所欲自定义格式的通用资 料管理器，可用于管理各种各样的信息，如：各类文档、磁盘文件、资料、名片、事件、下载的精华、收集的资料等等，即使毫无规律的资料，也一样可以管理得有 条不紊。附上几张截图，供大家参考。</p>
<p><a href="http://www.neatcn.com/attachment.php?id=382" target="_blank"><img src="http://www.neatcn.com/attachments/date_200907/thumb_f6dcfd6bb339fabe32bb89b83291c963.jpg" border="0" alt="大小: 63.27 K&#13;尺寸: 500 x 299&#13;浏览: 20 次&#13;点击打开新窗口浏览全图" width="500" height="299" /></a><br />
<br />
最近好象淘宝QA团队象抽疯一样，拼命在更新博客。这也是其中的一篇。</p>]]></description>
			<link>http://www.neatcn.com/show-746-1.shtml</link>
			<category domain="http://www.neatcn.com/category-3-1.shtml">Software</category>
			<pubDate>2009-07-01 21:25</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-745-1.shtml</guid>
			<title>PHP 5.3.0正式版发布</title>
			<author>gouki</author>
			<description><![CDATA[<p>前段时间已经把5.3的新特性介绍了一下，这里不作详细介绍了<br />
<br />
把cnbeta上的新闻原文复制一下就结束，纯粹当成新闻来看吧。<br />
<br />
URL：http://www.cnbeta.com/articles/87653.htm<br />
<br />
今天，PHP官方已经放出了下一个开发系列5.3.0正式版的下载。按照惯例，还要过一段时间才会发布正式声明。我们可以先用为快。<br />
从去年8月初放出alpha1到现在将近一年,经过3个alpha,一个beta,4个RC.5.3.0正式版已经完成。这个版本主要新加了命名空间，延迟绑定，匿名函数等新功能。一会放出官方完全新特性。</p>
<p><img alt="" src="http://www.cnbeta.com/articles/pic/sour.gif" /><strong>访问:</strong><a href="http://cvs.php.net/viewvc.cgi/php-src/UPGRADING?revision=PHP_5_3" target="_blank">http://cvs.php.net/viewvc.cgi/php-src/UPGRADING?revision=PHP_5_3</a><br />
<img alt="" src="http://www.cnbeta.com/articles/pic/down.gif" /><strong>下载:</strong><a href="http://us2.php.net/distributions/php-5.3.0.tar.bz2">http://us2.php.net/distributions/php-5.3.0.tar.bz2</a></p>]]></description>
			<link>http://www.neatcn.com/show-745-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-06-30 22:00</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-744-1.shtml</guid>
			<title>linux命令vmstat介绍</title>
			<author>gouki</author>
			<description><![CDATA[<p>还是来自于淘宝QATEAM，<a href="http://rdc.taobao.com/blog/qa/?p=2269" target="_blank" class="entry-title-link">linux命令vmstat介绍</a><br />
<br />
原文如下：<br />
通过STATSPACK收集服务器信息，主要通过收集VMSTAT的信息来展现服务器状况。VMSTAT工具是最常见的ＵＮＩＸ监控工具，可以展现给定时间间隔的服务器的状态值。<br />
一般VMSTAT工具的使用是通过两个数字参数来完成的，第一个参数是采样的时间间隔数，单位是秒，第二个参数是采样的次数。如：<br />
[oracle@localhost oracle]$vmstat 2<br />
procs &mdash;&mdash;&mdash;&ndash;memory&mdash;&mdash;&mdash;- &mdash;swap&ndash; &mdash;&ndash;io&mdash;- &ndash;system&ndash; &mdash;-cpu&mdash;-<br />
r b&nbsp;&nbsp; swpd&nbsp;&nbsp; free&nbsp;&nbsp; buff cache&nbsp;&nbsp; si&nbsp;&nbsp; so&nbsp;&nbsp;&nbsp; bi&nbsp;&nbsp;&nbsp; bo&nbsp;&nbsp; in&nbsp;&nbsp;&nbsp; cs us sy id wa<br />
0 0 195804&nbsp;&nbsp; 3812 40616 1598656&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0 1024 66976 0 0 100 0<br />
0 0 195804&nbsp;&nbsp; 3812 40616 1598656&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 12 1048 66961 0 0 100 0<br />
0 0 195804&nbsp;&nbsp; 3812 40616 1598656&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 28 1054 67067 0 0 100 0<br />
0 0 195804&nbsp;&nbsp; 3812 40616 1598656&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 0 1020 66988 0 0 100 0<br />
(注：目前系统几乎空闲，并且不同操作系统VMSTAT输出内容有所不同)<br />
目前说来，对于服务器监控有用处的度量主要有：<br />
r（运行队列）</p>
<p>pi（页导入）</p>
<p>us（用户CPU）</p>
<p>sy（系统CPU）</p>
<p>id（空闲）<br />
(如果r经常大于4 ，且id经常少于40，表示cpu的负荷很重。)</p>
<p>(如果bi，bo 长期不等于0，表示内存不足)</p>
<p>通过VMSTAT识别ＣＰＵ瓶颈<br />
r（运行队列）展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目，就会出现CPU瓶颈了</p>
<p>获得CPU个数的命令(LINUX环境)：<br />
cat /proc/cpuinfo|grep processor|wc -l<br />
当r值超过了CPU个数，就会出现CPU瓶颈，解决办法大体几种：<br />
1. 最简单的就是增加CPU个数<br />
2. 通过调整任务执行时间，如大任务放到系统不繁忙的情况下进行执行，进尔平衡系统任务<br />
3. 调整已有任务的优先级</p>
<p>通过VMSTAT识别ＣＰＵ满负荷<br />
首先需要声明一点的是，vmstat中CPU的度量是百分比的。当us＋sy的值接近100的时候，表示CPU正在接近满负荷工作。但要注意的是，CPU 满负荷工作并不能说明什么，UNIX总是试图要CPU尽可能的繁忙，使得任务的吞吐量最大化。唯一能够确定CPU瓶颈的还是r（运行队列）的值。</p>
<p>通过VMSTAT识别ＲＡＭ瓶颈<br />
数据库服务器都只有有限的RAM，出现内存争用现象是Oracle的常见问题。<br />
首先察看RAM的数量，命令如下（LINUX环境）：<br />
[oracle@oracle-db02 ~]$ free<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; total&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; shared&nbsp;&nbsp;&nbsp; buffers&nbsp;&nbsp;&nbsp;&nbsp; cached<br />
Mem:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2074924&nbsp;&nbsp;&nbsp; 2071112&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3812&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 40616&nbsp;&nbsp;&nbsp; 1598656<br />
-/+ buffers/cache:&nbsp;&nbsp;&nbsp;&nbsp; 431840&nbsp;&nbsp;&nbsp; 1643084<br />
Swap:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3068404&nbsp;&nbsp;&nbsp;&nbsp; 195804&nbsp;&nbsp;&nbsp; 2872600</p>
<p>当然可以使用top等其他命令来显示RAM。<br />
当内存的需求大于RAM的数量，服务器启动了虚拟内存机制，通过虚拟内存，可以将RAM段移到SWAP DISK的特殊磁盘段上，这样会 出现虚拟内存的页导出和页导入现象，页导出并不能说明RAM瓶颈，虚拟内存系统经常会对内存段进行页导出，但页导入操作就表明了服务器需要更多的内存了， 页导入需要从SWAP DISK上将内存段复制回RAM，导致服务器速度变慢。</p>
<p>解决的办法有几种：<br />
1. 最简单的，加大RAM<br />
2. 改小SGA，使得对RAM需求减少<br />
3. 减少RAM的需求（如：减少PGA）</p>]]></description>
			<link>http://www.neatcn.com/show-744-1.shtml</link>
			<category domain="http://www.neatcn.com/category-13-1.shtml">Linux</category>
			<pubDate>2009-06-30 20:44</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-743-1.shtml</guid>
			<title>Linux查看系统配置常用命令</title>
			<author>gouki</author>
			<description><![CDATA[<p>前两天刚刚转载完<a href="../../../show-741-1.shtml">老王的Linux杂记</a> ，结果淘宝QA团队也来了一个<a href="http://rdc.taobao.com/blog/qa/?p=2273" target="_blank" class="entry-title-link">Linux查看系统配置常用命令</a>，当然，对于这些命令来说我是多多益善。<br />
虽然不一定记得住，但，作为我的参考还是有用的。<br />
<br />
系统 # uname -a # 查看内核/操作系统/CPU信息<br />
# head -n 1 /etc/issue # 查看操作系统版本<br />
# cat /proc/cpuinfo # 查看CPU信息<br />
# hostname # 查看计算机名<br />
# lspci -tv # 列出所有PCI设备<br />
# lsusb -tv # 列出所有USB设备<br />
# lsmod # 列出加载的内核模块<br />
# env # 查看环境变量 资源<br />
# free -m # 查看内存使用量和交换区使用量<br />
# df -h # 查看各分区使用情况<br />
# du -sh  # 查看指定目录的大小<br />
# grep MemTotal /proc/meminfo # 查看内存总量<br />
# grep MemFree /proc/meminfo # 查看空闲内存量<br />
# uptime # 查看系统运行时间、用户数、负载<br />
# cat /proc/loadavg # 查看系统负载 磁盘和分区<br />
# mount | column -t # 查看挂接的分区状态<br />
# fdisk -l # 查看所有分区<br />
# swapon -s # 查看所有交换分区<br />
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)<br />
# dmesg | grep IDE # 查看启动时IDE设备检测状况 网络<br />
# ifconfig # 查看所有网络接口的属性<br />
# iptables -L # 查看防火墙设置<br />
# route -n # 查看路由表<br />
# netstat -lntp # 查看所有监听端口<br />
# netstat -antp # 查看所有已经建立的连接<br />
# netstat -s # 查看网络统计信息 进程<br />
# ps -ef # 查看所有进程<br />
# top # 实时显示进程状态 用户<br />
# w # 查看活动用户<br />
# id  # 查看指定用户信息<br />
# last # 查看用户登录日志<br />
# cut -d: -f1 /etc/passwd # 查看系统所有用户 # cut -d: -f1 /etc/group # 查看系统所有组<br />
# crontab -l # 查看当前用户的计划任务 服务<br />
# chkconfig &ndash;list # 列出所有系统服务<br />
# chkconfig &ndash;list | grep on # 列出所有启动的系统服务 程序<br />
# rpm -qa # 查看所有安装的软件包<br />
<br />
看到最后的rpm，估计淘宝QA们用的是redhat系列的产品线了，什么RH、fedora,centos吧？<br />
估计是，哈哈</p>]]></description>
			<link>http://www.neatcn.com/show-743-1.shtml</link>
			<category domain="http://www.neatcn.com/category-13-1.shtml">Linux</category>
			<pubDate>2009-06-30 20:43</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-742-1.shtml</guid>
			<title>统计一年了</title>
			<author>gouki</author>
			<description><![CDATA[<p>时间过的真快啊。<br />
一转眼，网站过了一年多了，用上统计也一年了。<br />
本来想在365天的时候，截个屏做个纪念的。结果也忘了<br />
今天已经370天了。</p>
<p>在这里再套用一下至尊宝的话：以前你叫雅虎统计，现在你叫量子统计了（原话：以前你叫人家小甜甜，现在你叫人家牛夫人。。。）</p>
<p>不过，还是做个纪念吧。。<br />
三张图。。。</p>
<div align="center"><a href="http://www.neatcn.com/attachment.php?id=379" target="_blank"><img src="http://www.neatcn.com/attachments//date_200906/ebbd96db06a881ff0968c7124d10a180.jpg" border="0" alt="大小: 10.9 K&#13;尺寸: 340 x 170&#13;浏览: 20 次&#13;点击打开新窗口浏览全图" width="340" height="170" /></a><br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=380" target="_blank"><img src="http://www.neatcn.com/attachments/date_200906/thumb_c8d7f11c5e7e7e5995c6b351181a3d80.jpg" border="0" alt="大小: 40.62 K&#13;尺寸: 500 x 180&#13;浏览: 20 次&#13;点击打开新窗口浏览全图" width="500" height="180" /></a><br />
<br />
<a href="http://www.neatcn.com/attachment.php?id=381" target="_blank"><img src="http://www.neatcn.com/attachments/date_200906/thumb_5f84572c0872c2608b4e6724b8b32ec6.jpg" border="0" alt="大小: 31.49 K&#13;尺寸: 500 x 374&#13;浏览: 18 次&#13;点击打开新窗口浏览全图" width="500" height="374" /></a></div>]]></description>
			<link>http://www.neatcn.com/show-742-1.shtml</link>
			<category domain="http://www.neatcn.com/category-5-1.shtml">Misc</category>
			<pubDate>2009-06-29 21:34</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-741-1.shtml</guid>
			<title>老王的Linux杂记</title>
			<author>gouki</author>
			<description><![CDATA[<p>作者：老王<br />
<br />
<strong>命令ps aux中的TIME是指什么时间。</strong><br />
<br />
经验主义会让我们惯性的认为这个时间是程序运行的时间，实际上如果你通过man ps查看一下手册，就会发现这个时间时间上时程序累计占用的CPU时间。<br />
<br />
<strong>如何判断64位CPU装了32位的操作系统。</strong><br />
<br />
总有一些运维人员这么干，所以不得不防。判断操作系统的位数很简单，只要使用uname -i即可，如果是32位的话，则一般显示i386，如果是64位的话，则一般显示x86_64。问题的重点在于判断CPU的位数，查看CPU的信息很简 单，无非就是cat /proc/cpuinfo，但这里哪些信息能表明位数呢？高人可以通过model name来判断，不过对多数人来说，这样的方法缺少可操作性，更好的方法是查看flags里是否有lm选项，lm选项的意思是Long Mode. (64bit Extensions, AMD&rsquo;s AMD64 or Intel&rsquo;s EM64T).，有的话就说明是64位，没有就是32位。<br />
<br />
<a target="_blank" href="http://blog.incase.de/index.php/cpu-feature-flags-and-their-meanings/">CPU feature flags and their meanings</a><br />
<br />
<strong>玩转TOP命令</strong><br />
<br />
top命令有很多方便的操作，比如执行top命令后按1键就可以展开CPU列表，按c键就可以查看命令完整路径。还可以通过shift+f或者shift+o把进程排序，更多参数通过按键h或者?查询。<br />
<br />
<strong>管道符中变量范围的问题</strong><br />
<br />
先看一个例子，先用read命令给变量赋值，再分别打印：<br />
<br />
echo &quot;a b c&quot; | read x y<br />
echo $x<br />
echo $y<br />
<br />
结果你会发现$x, $y都没有设置。<br />
<br />
echo &quot;a b c&quot; | (read x y; echo $x; echo $y)<br />
<br />
这样就OK了，这是因为管道符后面产生的变量仅在子SHELL中有效，类似的还可以采用这样的方式：<br />
<br />
echo &quot;a b c&quot; | while read x y; do<br />
&nbsp;&nbsp;&nbsp;        echo $x; echo $y<br />
done<br />
<br />
<strong>watch监控程序</strong><br />
<br />
例如用watch监控mysql：watch -n 1 mysqladmin processlist<br />
<br />
<strong>更方便的history功能</strong><br />
<br />
需要历史操作记录的时候，大家基本上都是采用history | grep ...的操作方式，实际上还有更方便的history功能，在man bash里的reverse-search-history部分能查看到相关介绍，操作方式就是Ctrl+r，然后键入部分命令就会自动查找，找到后直接 回车即可。比如说每次重启动nginx都要不厌其烦的kill -HUP `cat /path/to/nginx.pid`，通过使用reverse-search-history技巧，操作会方便快捷很多。<br />
<br />
原文地址为：http://hi.baidu.com/thinkinginlamp/blog/item/39734f4ae8346e2a09f7ef8f.html<br />
<br />
但有人对于老王验证CPU是否为64位持不同意见，认为他自己的32位CPU中也有lm，我的是xeon，也有lm，我不知道是否同样为64位CPU。。<br />
一切等某个更牛的人来解释一下吧</p>]]></description>
			<link>http://www.neatcn.com/show-741-1.shtml</link>
			<category domain="http://www.neatcn.com/category-13-1.shtml">Linux</category>
			<pubDate>2009-06-29 07:29</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-740-1.shtml</guid>
			<title>IE和FF下JS的不同点（更详细）</title>
			<author>gouki</author>
			<description><![CDATA[<p><span class="t18">
<p><span class="t18">在这里，</span><a href="http://www.neatstudio.com/show-52-1.shtml">http://www.neatstudio.com/show-52-1.shtml</a>，我也曾转载过关于IE和Firefox下event的处理，只是今天的内容会更全一些<strong><br />
</strong></p>
<p><strong>一、document.formName.item(&quot;itemName&quot;) 问题 </strong><br />
问题说明：IE下，可以使用 document.formName.item(&quot;itemName&quot;) 或 document.formName.elements [&quot;elementName&quot;]；Firefox 下，只能使用document.formName.elements[&quot;elementName&quot;]。 <br />
解决方法：统一使用document.formName.elements[&quot;elementName&quot;]。&nbsp;</p>
<p><br />
<strong>二、集合类对象问题 </strong><br />
问题说明：IE下，可以使用 () 或 [] 获取集合类对象；Firefox下，只能使用 [ ]获取集合类对象。 <br />
解决方法：统一使用 [] 获取集合类对象。</p>
<p><br />
<strong>三、自定义属性问题 </strong><br />
问题说明：IE下，可以使用获取常规属性的方法来获取自定义属性，也可以使用 getAttribute() 获取自定义属性；Firefox下，只能使用 getAttribute() 获取自定义属性。 <br />
解决方法：统一通过 getAttribute() 获取自定义属性。&nbsp;</p>
<p><br />
<strong>四、eval(&quot;idName&quot;)问题 </strong><br />
问 题说明：IE下，可以使用 eval(&quot;idName&quot;) 或 getElementById(&quot;idName&quot;) 来取得 id 为 idName 的HTML对象；Firefox下，只能使用 getElementById(&quot;idName&quot;) 来取得 id 为 idName 的HTML对象。 <br />
解决方法：统一用 getElementById(&quot;idName&quot;) 来取得 id 为 idName 的HTML对象。&nbsp;</p>
<p><br />
<strong>五、变量名与某HTML对象ID相同的问题 </strong><br />
问题说明：IE下，HTML对象的ID可以作为 document 的下属对象变量名直接使用，Firefox下则不能；Firefox下，可以使用与HTML对象ID相同的变量名，IE下则不能。 <br />
解决方法：使用 document.getElementById(&quot;idName&quot;) 代替 document.idName。最好不要取HTML对象ID相同的变量名，以减少错误；在声明变量时，一律加上var关键字，以避免歧义。&nbsp;</p>
<p><br />
<strong>六、const问题 </strong><br />
问题说明：Firefox下，可以使用const关键字或var关键字来定义常量；IE下，只能使用var关键字来定义常量。 <br />
解决方法：统一使用var关键字来定义常量。&nbsp;</p>
<p><br />
<strong>七、input.type属性问题 </strong><br />
问题说明：IE下 input.type 属性为只读；但是Firefox下 input.type 属性为读写。 <br />
解决办法：不修改 input.type 属性。如果必须要修改，可以先隐藏原来的input，然后在同样的位置再插入一个新的input元素。&nbsp;</p>
<p><br />
<strong>八、window.event问题 </strong><br />
问题说明：window.event 只能在IE下运行，而不能在Firefox下运行，这是因为Firefox的event只能在事件发生的现场使用。 <br />
解决方法：在事件发生的函数上加上event参数，在函数体内(假设形参为evt)使用 var myEvent = evt?evt:(window.event?window.event:null) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 示例： &lt;input type=&quot;button&quot; onclick=&quot;doSomething(event)&quot;/&gt;&nbsp; <br />
&lt;script language=&quot;javascript&quot;&gt;&nbsp; <br />
function doSomething(evt) {&nbsp; <br />
var myEvent = evt?evt:(window.event?window.event:null) <br />
&hellip;&nbsp; <br />
}</p>
<p><strong>九、event.x与event.y问题 </strong><br />
问题说明：IE下，even对象有x、y属性，但是没有pageX、pageY属性；Firefox下，even对象有pageX、pageY属性，但是没有x、y属性。 <br />
解决方法：var myX = event.x ? event.x : event.pageX; var myY = event.y ? event.y:event.pageY; <br />
如果考虑第8条问题，就改用myEvent代替event即可。&nbsp;</p>
<p><br />
<strong>十、event.srcElement问题 </strong><br />
问题说明：IE下，even对象有srcElement属性，但是没有target属性；Firefox下，even对象有target属性，但是没有srcElement属性。 <br />
解决方法：使用srcObj = event.srcElement ? event.srcElement : event.target; <br />
如果考虑第8条问题，就改用myEvent代替event即可。&nbsp;</p>
<p><br />
<strong>十一、window.location.href问题 </strong><br />
问题说明：IE或者Firefox2.0.x下，可以使用window.location或window.location.href；Firefox1.5.x下，只能使用window.location。 <br />
解决方法：使用 window.location 来代替 window.location.href。当然也可以考虑使用 location.replace()方法。&nbsp;</p>
<p><br />
<strong>十二、模态和非模态窗口问题 </strong><br />
问题说明：IE下，可以通过showModalDialog和showModelessDialog打开模态和非模态窗口；Firefox下则不能。 <br />
解决方法：直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。&nbsp; <br />
如 果需要将子窗口中的参数传递回父窗口，可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话，使用 var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。&nbsp;</p>
<p><strong><br />
十三、frame和iframe问题 </strong><br />
以下面的frame为例：&nbsp; <br />
&lt;frame src=&quot;<a href="http://www.devdao.com/123.html">http://www.devdao.com/123.html</a>&quot; id=&quot;frameId&quot; name=&quot;frameName&quot; /&gt;&nbsp; <br />
(1)访问frame对象 <br />
IE：使用window.frameId或者window.frameName来访问这个frame对象； <br />
Firefox：使用window.frameName来访问这个frame对象； <br />
解决方法：统一使用 window.document.getElementById(&quot;frameId&quot;) 来访问这个frame对象； <br />
(2)切换frame内容 <br />
在 IE和Firefox中都可以使用 window.document.getElementById(&quot;frameId&quot;).src = &quot;devdao.com.html&quot;或 window.frameName.location = &quot;devdao.com.html&quot;来切换frame的内容； <br />
如果需要将frame中的参数传回父窗口，可以在frame中使用parent关键字来访问父窗口。</p>
<p><strong>十四、body载入问题 </strong><br />
问题说明：Firefox的body对象在body标签没有被浏览器完全读入之前就存在；而IE的body对象则必须在body标签被浏览器完全读入之后才存在。 <br />
[注] 这个问题尚未实际验证，待验证后再来修改。 <br />
[注] 经验证，IE6、Opera9以及FireFox2中不存在上述问题，单纯的JS脚本可以访问在脚本之前已经载入的所有对象和元素，即使这个元素还没有载入完成。</p>
<p><br />
<strong>十五、事件委托方法 </strong><br />
问题说明：IE下，使用 document.body.onload = inject; 其中function inject()在这之前已被实现；在Firefox下，使用 document.body.onload = inject(); <br />
解决方法：统一使用 document.body.onload=new Function(&rsquo;inject()&rsquo;); 或者 document.body.onload = function(){/* 这里是代码 */} <br />
[注意] Function和function的区别&nbsp;</p>
<p><br />
<strong>十六、访问的父元素的区别 </strong><br />
问题说明：在IE下，使用 obj.parentElement 或 obj.parentNode 访问obj的父结点；在firefox下，使用 obj.parentNode 访问obj的父结点。 <br />
解决方法：因为firefox与IE都支持DOM，因此统一使用obj.parentNode 来访问obj的父结点。&nbsp;</p>
<p><br />
<strong>十七、cursor:hand VS cursor:pointer </strong><br />
问题说明：firefox不支持hand，但ie支持pointer ，两者都是手形指示。 <br />
解决方法：统一使用pointer。&nbsp;</p>
<p><br />
<strong>十八、innerText的问题. </strong><br />
问题说明：innerText在IE中能正常工作，但是innerText在FireFox中却不行。 <br />
解决方法：在非IE浏览器中使用textContent代替innerText。 <br />
示例： if(navigator.appName.indexOf(&quot;Explorer&quot;) &gt;-1){&nbsp; <br />
document.getElementById(&rsquo;element&rsquo;).innerText = &quot;my text&quot;;&nbsp; <br />
} else{&nbsp; <br />
document.getElementById(&rsquo;element&rsquo;).textContent = &quot;my text&quot;;&nbsp; <br />
} <br />
[注] innerHTML 同时被ie、firefox等浏览器支持，其他的，如outerHTML等只被ie支持，最好不用。&nbsp;</p>
<p><br />
<strong>十九、对象宽高赋值问题 </strong><br />
问题说明：FireFox中类似 obj.style.height = imgObj.height 的语句无效。 <br />
解决方法：统一使用 obj.style.height = imgObj.height + &lsquo;px&rsquo;;&nbsp;</p>
<p><br />
<strong>二十、Table操作问题 </strong><br />
问题说明：ie、firefox以及其它浏览器对于 table 标签的操作都各不相同，在ie中不允许对table和tr的innerHTML赋值，使用js增加一个tr时，使用appendChild方法也不管用。 <br />
解决方法： //向table追加一个空行：&nbsp; <br />
var row = otable.insertRow(-1);&nbsp; <br />
var cell = document.createElement(&quot;td&quot;);&nbsp; <br />
cell.innerHTML = &quot;&quot;;&nbsp; <br />
cell.className = &quot;XXXX&quot;;&nbsp; <br />
row.appendChild(cell); [注] 由于俺很少使用JS直接操作表格，这个问题没有遇见过。建议使用JS框架集来操作table，如JQuery。&nbsp;</p>
<p><br />
<strong>二一、ul和ol列表缩进问题 </strong><br />
消除ul、ol等列表的缩进时，样式应写成：list-style:none;margin:0px;padding:0px;&nbsp; <br />
其中margin属性对IE有效，padding属性对FireFox有效。&larr; 此句表述有误，详细见&darr; <br />
[注] 这个问题尚未实际验证，待验证后再来修改。 <br />
[注] 经验证，在IE中，设置margin:0px可以去除列表的上下左右缩进、空白以及列表编号或圆点，设置padding对样式没有影响；在 Firefox 中，设置margin:0px仅仅可以去除上下的空白，设置padding:0px后仅仅可以去掉左右缩进，还必须设置list- style:none才 能去除列表编号或圆点。也就是说，在IE中仅仅设置margin:0px即可达到最终效果，而在Firefox中必须同时设置 margin:0px、 padding:0px以及list-style:none三项才能达到最终效果。&nbsp;</p>
<p><br />
<strong>二二、CSS透明问题 </strong><br />
IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。&nbsp; <br />
FF：opacity:0.6。 <br />
[注] 最好两个都写，并将opacity属性放在下面。&nbsp;</p>
<p><br />
<strong>二三、CSS圆角问题 </strong><br />
IE：ie7以下版本不支持圆角。 <br />
FF： -moz-border-radius:4px，或者-moz-border-radius-topleft:4px;-moz- border- radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz- border- radius- bottomright:4px;。 <br />
[注] 圆角问题是CSS中的经典问题，建议使用JQuery框架集来设置圆角，让这些复杂的问题留给别人去想吧。 <br />
关于CSS中的问题实在太多了，甚至同样的CSS定义在不同的页面标准中的显示效果都是不一样的。更多的知识请参考devdao.com的文章。一个合乎发展的建议是，页面采用标准DHTML标准 编写，较少使用table，CSS定义尽量依照标准DOM，同时兼顾IE、Firefox、Opera等主流浏览器。BTW，很多情况下，FF和 Opera的CSS解释标准更贴近CSS标准，也更具有规范性。</p>
<p>虽然我对knowsky网站上的广告颇有微词，但这并不妨碍他上面的文章。原文如下：http://www.knowsky.com/536615.html，估计也是转载来的，因为我看到里面有一些排版内容有变化。</p>
</span></p>]]></description>
			<link>http://www.neatcn.com/show-740-1.shtml</link>
			<category domain="http://www.neatcn.com/category-2-1.shtml">Javascript</category>
			<pubDate>2009-06-28 21:29</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-739-1.shtml</guid>
			<title>PHP编辑器&amp;IDE简单评测之：NuSphere PhpED</title>
			<author>gouki</author>
			<description><![CDATA[<div style="" class="Section0">
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">PHPED<font face="宋体">是一款很老的</font><font face="Times New Roman">PHP</font><font face="宋体">编辑器了。在</font><font face="Times New Roman">N</font><font face="宋体">久以前他就存在，只是</font><font face="Times New Roman">4.x</font><font face="宋体">以前的版本对中文的支持并不好，当你在删除中文时，往往会发现删除了一半。</font></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><strong><span style="font-size: 10.5pt; font-family: '宋体';">PHPED<font face="宋体">的优点</font></span></strong><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">1、</span><span style="font-size: 10.5pt; font-family: '宋体';">debug<font face="宋体">功能挺强，自带的</font><font face="Times New Roman">dbglistener</font><font face="宋体">被很多编辑器所使用过</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">2、</span><span style="font-size: 10.5pt; font-family: '宋体';">Project<font face="宋体">和</font><font face="Times New Roman">workspace</font><font face="宋体">也分开了</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">3、</span><span style="font-size: 10.5pt; font-family: '宋体';">函数的定位、跳转都比较方便</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">4、</span><span style="font-size: 10.5pt; font-family: '宋体';">Search&nbsp;in&nbsp;files<font face="宋体">和</font><font face="Times New Roman">replace&nbsp;in&nbsp;files</font><font face="宋体">，更是让查找替换方便了许多</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">5、</span><span style="font-size: 10.5pt; font-family: '宋体';">自定义代码片段</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">6、</span><span style="font-size: 10.5pt; font-family: '宋体';">常用小工具：<font face="Times New Roman">ssh,dbmanager,ftp</font><font face="宋体">等</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">7、</span><span style="font-size: 10.5pt; font-family: '宋体';">函数自动完成、提示时，会同时显示该函数所在的文件、行数。</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">8、</span><span style="font-size: 10.5pt; font-family: '宋体';">作为一款<font face="Times New Roman">PHPIDE</font><font face="宋体">，也并没有忘记</font><font face="Times New Roman">HTML</font><font face="宋体">，在工具栏中有一些</font><font face="Times New Roman">HTML</font><font face="宋体">常用标记的快捷按钮</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">9、</span><span style="font-size: 10.5pt; font-family: '宋体';">帮助手册很多。查询很方便</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">10、</span><span style="font-size: 10.5pt; font-family: '宋体';">分割屏幕：在代码页很长的时候，并且需要和上文进行对比时，分割屏幕太重要了</span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><strong><span style="font-size: 10.5pt; font-family: '宋体';">PHPED<font face="宋体">的缺点</font></span></strong><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">1、</span><span style="font-size: 10.5pt; font-family: '宋体';">代码提示、自动完成有时候会失效（特别是在同一个页面里，函数定义在最底部的时候，调用此函数时，不能自动完成和提示）</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">2、</span><span style="font-size: 10.5pt; font-family: '宋体';">虚拟空格（鼠标点到哪里，就可以在哪里直接输入，或许很多人喜欢这个功能，但我非常不喜欢，让我想起了<font face="Times New Roman">delphi</font><font face="宋体">，好象也是有这个功能，开始怀疑，</font><font face="Times New Roman">PHPED</font><font face="宋体">是采用</font><font face="Times New Roman">delphi</font><font face="宋体">编写的）</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">3、</span><span style="font-size: 10.5pt; font-family: '宋体';">Debug<font face="宋体">功能对于采用</font><font face="Times New Roman">rewrite</font><font face="宋体">方式的程序好象无法测试（不知道</font><font face="Times New Roman">ZS</font><font face="宋体">等是否能够测试）</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">4、</span><span style="font-size: 10.5pt; font-family: '宋体';">不能根据文件编码自动认出文件（程序只能设定一个编码，然后打开任何文件都是以此编码来打开，打不开就建议你转，这个太烦了）</span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';">总体来说，如果不介意上面这些缺点，<font face="Times New Roman">phped</font><font face="宋体">还算是一个比较完美的编辑器。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;" class="p0"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
</div>]]></description>
			<link>http://www.neatcn.com/show-739-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-06-28 16:44</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-738-1.shtml</guid>
			<title>变形金刚2</title>
			<author>gouki</author>
			<description><![CDATA[<p>今天一大早，先赶到单位加班，然后吃饭时赶回学校上课，最后再赶到电影院看了变形金刚2。<br />
看的是译制片，看完后才发现，原来。。。还有原版片可看，但已经买了票，就算了。等期末考试完毕有空后再去看吧。<br />
<br />
片子没有想象中的精彩，但也没有不堪入目。影院里坐满了人。是我看电影以来除了《英雄》外，坐的最多的一次了吧？<br />
题外话：英雄在大光明看的，居然是坐的加座。。。<br />
<br />
堕落金刚这个人物。来的快，走的也快。身为一名长老，三下五除二就解决了。很失望。。。。<br />
<br />
如果说，擎天柱是长老，那在第一代被威震天打成那样，又太夸张了。<br />
<br />
大力神，爬个金字塔都爬不来<br />
双胞胎，原来，不全部是搞笑人物。<br />
<br />
霸天虎中那只小机器人的叛变，很让影院哄堂大笑。<br />
第七小队（突然忘了那个组是不是这个名字了）那位队长，很可爱。第一部也很可爱<br />
<br />
第一部那两个胖子不见了，我以为他们还会出现（在提到有人建了一个网站，很厉害的时候。。。）<br />
<br />
片子有点男人，柔情很少。。。听说女主角会演劳拉3，不知道会怎么样。<br />
<br />
建议有变形金刚情结的人去看看本片，不算糟糕吧。借用李安的一句话：每个男人心里都有一个机器人梦（改过的，HOHO）<br />
<br />
又听说，今年还是明年，ATOM也会重拍？好让人惊喜的事情。小时候对ATOM还是很有印象的。只是后来 不知道怎么就记忆模糊了。<br />
或许，真的老了。。。</p>]]></description>
			<link>http://www.neatcn.com/show-738-1.shtml</link>
			<category domain="http://www.neatcn.com/category-5-1.shtml">Misc</category>
			<pubDate>2009-06-27 19:20</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-737-1.shtml</guid>
			<title>杰克逊</title>
			<author>gouki</author>
			<description><![CDATA[<p>一大早打开QQ，N个群里，N个好友发消息过来：看到新闻没，杰克逊走了。</p>
<p>想起QQ好友里有一个人在搞杰克逊中文网站的，发现她的QQ签名已经改为：请不要向我打听杰克逊的消息。现在，又改为：再见.永远爱你...</p>
<p>第一次知道杰克逊是在94年左右吧。那时候看了一本书，好象介绍吉尼斯世界大全的。里面介绍说有个黑人发行了专辑破了纪录，那个人叫杰克逊</p>
<p>再然后，是在表姐结婚时，她们家买了个LD（或许现在很多人都不知道这个东西了吧。），放了杰克逊的专辑（正版的哦，LD好象没有盗版），惊讶于MTV的视觉效果和音乐的效果。。。。</p>
<p>再往后就是在学校里，几个同学迷上杰克逊，天天在拯救地球要么就是黑与白之类的。被我BS，因为同学不会英文，所以感觉他们唱的歌好奇怪。</p>
<p>再接着。。。就不是特别关心了，只是对于拯救地球这个MTV还是很喜欢。偶尔听听</p>
<p>偶然间进入一个群，居然有人在负责杰克逊中文站，也就偶尔进去猫两眼，仍然不是特别关心。</p>
<p>今天，他走了，才50岁</p>
<p>不知道该说声什么，又或许我也没有资格表达什么，还是静下心来听听拯救地球吧。</p>
<p>一路走好，在天堂中继续拯救地球</p>]]></description>
			<link>http://www.neatcn.com/show-737-1.shtml</link>
			<category domain="http://www.neatcn.com/category-5-1.shtml">Misc</category>
			<pubDate>2009-06-26 22:38</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-736-1.shtml</guid>
			<title>快速转换JSON数据</title>
			<author>gouki</author>
			<description><![CDATA[<p>这是一个jQuery的插件，它可以使得你快速将对象等转换为JSON数据，方便你进行ajax等数据交换。</p>
<p>官网地址为：<a href="http://code.google.com/p/jquery-json/">http://code.google.com/p/jquery-json/</a></p>
<p>官方也有例子：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;thing&nbsp;=&nbsp;{plugin:&nbsp;</span><span class="string">'jquery-json'</span><span>,&nbsp;version:&nbsp;1.3}; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">var</span><span>&nbsp;encoded&nbsp;=&nbsp;$.toJSON(thing);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//'{&quot;plugin&quot;:&nbsp;&quot;jquery-json&quot;,&nbsp;&quot;version&quot;:&nbsp;1.3}' </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span class="keyword">var</span><span>&nbsp;name&nbsp;=&nbsp;$.evalJSON(encoded).plugin;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&quot;jquery-json&quot; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">var</span><span>&nbsp;version&nbsp;=&nbsp;$.evalJSON(encoded).version;&nbsp;&nbsp;</span><span class="comment">//&nbsp;1.3</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>基本函数也就这个五个：</p>
<p>This plugin exposes five new functions onto the $, or jQuery object:</p>
<ul>
    <li><em><strong>toJSON</strong></em>: Serializes a javascript object, number, string, or arry into JSON.</li>
    <li><em><strong>compactJSON</strong></em>: Serializes as toJSON, but takes out some spaces, making the result that much shorter.</li>
    <li><em><strong>evalJSON</strong></em>: Converts from JSON to Javascript, quickly, and is trivial.</li>
    <li><em><strong>secureEvalJSON</strong></em>: Converts from JSON to Javascript, but does so while checking to see if the source is actually JSON, and not with other Javascript statements thrown in.</li>
    <li><em><strong>quoteString</strong></em>: Places quotes around a string, and inteligently escapes any quote, backslash, or control characters.</li>
</ul>
<p>相信会给你的项目应用带来方便。。。</p>]]></description>
			<link>http://www.neatcn.com/show-736-1.shtml</link>
			<category domain="http://www.neatcn.com/category-2-1.shtml">Javascript</category>
			<pubDate>2009-06-26 22:31</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-735-1.shtml</guid>
			<title>PHP编辑器&amp;IDE简单评测之：EditPlus</title>
			<author>gouki</author>
			<description><![CDATA[<p>我承认，我对编辑器和IDE等用的并不是很多，但我想，既然我用过、尝试过，总应该有一点自己的想法和见解吧？虽然不一定正确，但相信还是有一点点道理的吧？</p>
<p>对于工具的技巧我不会介绍的。毕竟这不属于评测范围内了。其实所说的评测，我也只是简单的列出优缺点而己。</p>
<p>用过的工具大约有phpEdit,phpEd,ultraEdit,Editplus,notepad++,notepad2,komodoEdit,ZS,Netbeans等。我仅列出我认为的优缺点，不一定对。</p>
<p>可随便扔砖</p>
<p>-----------------</p>
<p>Editplus是PHP开发者最常用的编辑器了吧（不能算IDE）</p>
<p>优点：</p>
<p>1、轻量级（1M左右）</p>
<p>2、默认的色彩搭配（函数、变量等）都挺不错，字体大小也适中</p>
<p>3、可以自定义工具，比如自定义工具为PHP手册，当你遇到不太熟悉的函数时，按下ctrl+1调用自定义工具就可以定位到手册的搜索了</p>
<p>4、stx等文件，可以方便的使用F2进行快速导航</p>
<p>5、ctrl+F11可以显示页面中的function列表</p>
<p>6、全目录搜索、正则搜索，都是比较强的</p>
<p>7、自定义浏览器和项目路径，可以按ctrl+B直接预览</p>
<p>8、有autocomplete文件（acp文件），方便快速书写（不过这需要自已去逐一编辑，但这也很正常，只有自己写的才是最适合自己用的）</p>
<p>9、保存时自动备份、保存时可以去除UTF8的BOM头（这个功能挺好）</p>
<p>10、自定义快捷键，可以按自己最熟悉最常用的习惯来定义</p>
<p>缺点：</p>
<p>1、项目管理太差（要么只能管理一个目录，要么只能管理一堆文件，load项目的时候，所有的文件全部被打开），不过鉴于它不是IDE，还是可以理解和接受的</p>
<p>2、全目录搜索后，不能全目录批量修改（或许是我要求太高了）</p>
<p>3、默认的ctrl+F11不能显示class中的function（现在好象可以了，即前面加了private等的判断）</p>
<p>4、代码折叠不够完善（是按缩进来的，如果是编辑python就没问题了）</p>
<p>5、无语法检查（虽然不是IDE,但这个其实是每个写程序的人都最期望的）</p>
<p><br />
其实，从一个编辑器来说，editplus已经算是完美的了</p>
<p>再加上，网上很多人为editplus的配置了自定义工具。例如语法检查、代码美化等等。都可以让editplus与一些轻量级的IDE媲美。</p>]]></description>
			<link>http://www.neatcn.com/show-735-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-06-25 09:45</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-734-1.shtml</guid>
			<title>javascript中的document.write</title>
			<author>gouki</author>
			<description><![CDATA[<p>这是一个来自mozilla taiwan论坛里的问题，这种情况很多人也应该是遇到过的。。。只是或许都采用了一些绕过的方法来解决的吧？<br />
<br />
问题如下：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>請問一下以下的html&nbsp;code有什麼問題嗎？&nbsp;&nbsp;</span></span></li>
    <li class=""><span>在IE下很正常，&nbsp;&nbsp;</span></li>
    <li class="alt"><span>但在Firefox裏第二行的document.write好像就不能運作了&nbsp;&nbsp;</span></li>
    <li class=""><span>而且一直顯示&quot;載入中&quot;，好像在什麼地方卡住了..&nbsp;&nbsp;</span></li>
    <li class="alt"><span>原始碼如下：&nbsp;&nbsp;</span></li>
    <li class=""><span>------------------&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;new&nbsp;document&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;!--&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;<span class="attribute">tmp</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Array(2);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>tmp[0]&nbsp;=&nbsp;new&nbsp;Array(2);&nbsp;&nbsp;</span></li>
    <li class=""><span>tmp[0][0]&nbsp;=&nbsp;&quot;lalala&quot;;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>tmp[0][1]&nbsp;=&nbsp;&quot;hahaha&quot;;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function&nbsp;test(){&nbsp;&nbsp;</span></li>
    <li class=""><span>document.write(tmp[0][0]);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(tmp[0][1]);&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>//--<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;button&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;test&quot;</span><span>&nbsp;</span><span class="attribute">onclick</span><span>=</span><span class="attribute-value">&quot;javascript:test();&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>但，事实是什么样的的？有人这样回复：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>document.write&nbsp;表示你要重寫整個頁面，所以第一個指令執行後，整個頁面已予清除，第二個指令也就不見了&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>另外，JS&nbsp;語法也不正確，應該是&nbsp;&nbsp;</span></li>
    <li class=""><span>document.open();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(...);&nbsp;&nbsp;</span></li>
    <li class=""><span>:&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.close();&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>如果不要清除網頁，可用:&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="attribute">text</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">document</span><span>.createTextNode(&quot;blah&nbsp;blah&nbsp;blah&quot;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>document.body.appendChild(text);&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>最终，这样就解决了：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;new&nbsp;document&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">title</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;text/javascript&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&lt;!--&nbsp;&nbsp;</span></li>
    <li class=""><span>var&nbsp;<span class="attribute">tmp</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">new</span><span>&nbsp;Array(2);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>tmp[0]&nbsp;=&nbsp;new&nbsp;Array(2);&nbsp;&nbsp;</span></li>
    <li class=""><span>tmp[0][0]&nbsp;=&nbsp;&quot;lalala&quot;;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>tmp[0][1]&nbsp;=&nbsp;&quot;hahaha&quot;;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>function&nbsp;test(tmp2){&nbsp;&nbsp;</span></li>
    <li class=""><span>document.open();&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.write(tmp2[0][0]);&nbsp;&nbsp;</span></li>
    <li class=""><span>document.write(tmp2[0][1]);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>document.close();&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>//--<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">head</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">input</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;button&quot;</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;test&quot;</span><span>&nbsp;</span><span class="attribute">onclick</span><span>=</span><span class="attribute-value">&quot;javascript:test(tmp);&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="tag">&lt;/</span><span class="tag-name">body</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">html</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>详细原文请查看：<a href="http://forum.moztw.org/viewtopic.php?p=41521">http://forum.moztw.org/viewtopic.php?p=41521</a></p>]]></description>
			<link>http://www.neatcn.com/show-734-1.shtml</link>
			<category domain="http://www.neatcn.com/category-2-1.shtml">Javascript</category>
			<pubDate>2009-06-24 13:50</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-733-1.shtml</guid>
			<title>$_SERVER变量的中文翻译</title>
			<author>gouki</author>
			<description><![CDATA[<p>$_SERVER变量被我们用的次数应该是最多的吧？<br />
手册中也有介绍，打开CHM手册，搜索一下就有了，在：<a name="reserved.variables">Predefined Variables章节中。<br />
要查看该变量也很方便，phpinfo()函数可以看，getenv函数也行<br />
<br />
不过，既然有人翻译了，那看中文总比看英文方便吧，虽然英文也很方便。。。。<br />
<br />
原文来自：http://www.phpweblog.net/haix/archive/2009/06/15/6703.html<br />
$_SERVER['REMOTE_ADDR'] <br />
</a></p>
<p>服务器变量 $_SERVER 详解：</p>
<p>1、<font color="#ff0000">$_SESSION['PHP_SELF']</font> -- 获取当前正在执行脚本的文件名</p>
<p>2、$_SERVER['SERVER_PROTOCOL'] -- 请求页面时通信协议的名称和版本。例如，&ldquo;HTTP/1.0&rdquo;。</p>
<p>3、<font color="#ff0000">$_SERVER['REQUEST_TIME']</font> -- 请求开始时的时间戳。从 PHP 5.1.0 起有效。<font color="#0000ff">和time函数效果一样。</font></p>
<p>4、<font color="#ff0000">$_SERVER['argv']</font> -- 传递给该脚本的参数。<font color="#0000ff">我试了下，get方法可以得到$_SERVER['argv'][0]；post方法无法给他赋值。</font></p>
<p>5、<font color="#ff0000">$_SERVER['SERVER_NAME']</font> -- 返回当前主机名。</p>
<p>6、$_SERVER['SERVER_SOFTWARE'] -- 服务器标识的字串，在响应请求时的头信息中给出。 <font color="#0000ff">如Microsoft-IIS/6.0</font></p>
<p>7、<font color="#ff0000">$_SERVER['REQUEST_METHOD']</font> -- 访问页面时的请求方法。例如：&ldquo;GET&rdquo;、&ldquo;HEAD&rdquo;，&ldquo;POST&rdquo;，&ldquo;PUT&rdquo;。</p>
<p>8、<font color="#ff0000">$_SERVER['QUERY_STRING'] </font>-- 查询（query）的字符串（URL 中第一个问号 ? 之后的内容）。</p>
<p>9、$_SERVER['DOCUMENT_ROOT'] -- 当前运行脚本所在的文档根目录。在服务器配置文件中定义。 <font color="#0000ff">如E:\server</font></p>
<p>10、$_SERVER['HTTP_ACCEPT'] -- 当前请求的 Accept: 头信息的内容。</p>
<p>11、$_SERVER['HTTP_ACCEPT_CHARSET'] -- 当前请求的 Accept-Charset: 头信息的内容。例如：&ldquo;iso-8859-1,*,utf-8&rdquo;。</p>
<p>12、$_SERVER['HTTP_ACCEPT_ENCODING'] -- 当前请求的 Accept-Encoding: 头信息的内容。例如：&ldquo;gzip&rdquo;。</p>
<p>13、$_SERVER['HTTP_ACCEPT_LANGUAGE'] -- 当前请求的 Accept-Language: 头信息的内容。例如：&ldquo;en&rdquo;。</p>
<p>14、$_SERVER['HTTP_CONNECTION'] -- 当前请求的 Connection: 头信息的内容。例如：&ldquo;Keep-Alive&rdquo;。</p>
<p>15、$_SERVER['HTTP_HOST'] -- 当前请求的 Host: 头信息的内容。</p>
<p>16、<font color="#ff0000">$_SERVER['HTTP_REFERER']</font> -- 链接到当前页面的前一页面的 URL 地址。</p>
<p>17、<font color="#ff0000">$_SERVER['HTTP_USER_AGENT']</font> -- 返回用户使用的浏览器信息。也可以使用 get_browser() 得到此信息。</p>
<p>18、$_SERVER['HTTPS'] -- 如果通过https访问，<font color="#0000ff">则被设为一个非空的值，否则返回off.</font></p>
<p>19、<font color="#ff0000">$_SERVER['REMOTE_ADDR']</font> -- 正在浏览当前页面用户的 IP 地址。</p>
<p>20、$_SERVER['REMOTE_HOST'] -- 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。<font color="#0000ff">如本地测试返回127.0.0.1</font></p>
<p>21、$_SERVER['REMOTE_PORT'] -- 用户连接到服务器时所使用的端口。<font color="#0000ff">我在本机测试没通过，不知道什么原因。 </font></p>
<p>22、$_SERVER['SCRIPT_FILENAME'] -- 当前执行脚本的绝对路径名。<font color="#0000ff">如返回E:\server\index.php</font></p>
<p>23、$_SERVER['SERVER_ADMIN'] -- 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上，则该值是那个虚拟主机的值</p>
<p>24、$_SERVER['SERVER_PORT'] -- 服务器所使用的端口。默认为&ldquo;80&rdquo;。如果使用 SSL 安全连接，则这个值为用户设置的 HTTP 端口。</p>
<p>25、$_SERVER['SERVER_SIGNATURE'] -- 包含服务器版本和虚拟主机名的字符串。</p>
<p>26、$_SERVER['PATH_TRANSLATED'] -- 当前脚本所在文件系统（不是文档根目录）的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 Apache 2 用 户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。</p>
<p>27、<font color="#ff0000">$_SERVER['SCRIPT_NAME']</font> -- 包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名（例如包含文件）。</p>
<p>28、<font color="#ff0000">$_SERVER['REQUEST_URI']</font> -- 访问此页面所需的 URI。例如，&ldquo;/index.html&rdquo;。</p>
<p>29、$_SERVER['PHP_AUTH_DIGEST'] -- 当作为 Apache 模块运行时，进行 HTTP Digest 认证的过程中，此变量被设置成客户端发送的&ldquo;Authorization&rdquo;HTTP 头内容（以便作进一步的认证操作）。</p>
<p>30、$_SERVER['PHP_AUTH_USER']-- 当 PHP 运行在 Apache 或 IIS（PHP 5 是 ISAPI）模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的用户名。</p>
<p>31、$_SERVER['PHP_AUTH_PW'] -- 当 PHP 运行在 Apache 或 IIS（PHP 5 是 ISAPI）模块方式下，并且正在使用 HTTP 认证功能，这个变量便是用户输入的密码。</p>
<p>32、$_SERVER['AUTH_TYPE']--当 PHP 运行在 Apache 模块方式下，并且正在使用 HTTP 认证功能，这个变量便是认证的类型。</p>
<p>膘叔认为，<a name="reserved.variables">更多，还是查看一下手册吧。翻译的东西永远是迟于手册的。。。</a></p>]]></description>
			<link>http://www.neatcn.com/show-733-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-06-24 09:40</pubDate>
		</item>
		<item>
			<guid>http://www.neatcn.com/show-732-1.shtml</guid>
			<title>值得一用的5.3RC4</title>
			<author>gouki</author>
			<description><![CDATA[<p>原文来自：http://www.mikespook.com/index.php/archives/352</p>
<p>不过，我感兴趣的也就两个：</p>
<p>1、延迟绑定</p>
<p>2、匿名函数</p>
<p>原文如下：</p>
<div class="storycontent">
<p>6月19日发布的<a target="_blank" href="http://www.php.net/archive/2009.php#id2009-06-19-1" onclick="javascript:pageTracker._trackPageview('/outgoing/www.php.net/archive/2009.php#id2009-06-19-1');">PHP 5.3 RC4</a> 同之前的RC版本并无很大出入，仅仅是修复bug和稳定性的改进。</p>
<p>新的一些特性，大家都讨论过了。不过我觉得还是有必要再罗嗦一下。</p>
<h1>关于命名空间</h1>
<p><a target="_blank" href="http://www.php.net/manual/en/language.namespaces.basics.php" onclick="javascript:pageTracker._trackPageview('/outgoing/www.php.net/manual/en/language.namespaces.basics.php');">namespaces</a> 多少人期待了多少年，时间长到我以为 php 不会有命名空间了。突然有消息说 5.3 含有 namespaces，并且使用很有争议的&ldquo;\&rdquo;作为分隔符号。</p>
<p>其实，没有命名空间，大家都想出了各种各样的替代方法。比如经典的&ldquo;_&rdquo;对应子目录之类的。在大家屡试不爽的时候，突然在一个小版本号升级中引入了 namespaces，实在让人摸不着头脑。不过看一下从 php4 -&gt; php5 的升级周期，或许真正的 namespaces 只有在 php6 的时候才能稳定和成熟。php 5.3 的namespaces 或许只是 perview 而已。</p>
<p>这些大家应该都是知道的，不多说了。总之 namespaces 很好用，又总之，真正用到 namespaces 的那天还很遥远。</p>
<h1>关于推迟静态绑定</h1>
<p>叫这个名字，不一定准确，我只是隐约记得 <a target="_blank" href="http://php.net/lsb" onclick="javascript:pageTracker._trackPageview('/outgoing/php.net/lsb');">Late Static Bindings</a> 是这个叫法吧。这个东西能带来一个好处，就是代码的动态性更强，越晚的绑定，越低的耦合。我遇到过这种情况，在项目中有一个类要重写其中的一些方法，但是 由于过早的绑定机制，导致不重写其中的大部分代码就不可能完成类似的任务。最后的结果是出现了种种丑陋的，难以维护的代码编写方式来实现这个本不复杂的问 题。</p>
<p>例如在php网站上提供的这个代码中：</p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family: monospace;" class="php"><span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> A <span style="color: rgb(0, 153, 0);">{</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> who<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />        <span style="color: rgb(177, 177, 0);">echo</span> <span style="color: rgb(0, 153, 0); font-weight: bold;">__CLASS__</span><span style="color: rgb(51, 153, 51);">;</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> test<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />        <span style="color: rgb(0, 0, 0); font-weight: bold;">self</span><span style="color: rgb(51, 153, 51);">::</span><span style="color: rgb(0, 64, 0);">who</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br /><span style="color: rgb(0, 153, 0);">}</span><br />&nbsp;<br /><span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> B <span style="color: rgb(0, 0, 0); font-weight: bold;">extends</span> A <span style="color: rgb(0, 153, 0);">{</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> who<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />         <span style="color: rgb(177, 177, 0);">echo</span> <span style="color: rgb(0, 153, 0); font-weight: bold;">__CLASS__</span><span style="color: rgb(51, 153, 51);">;</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br /><span style="color: rgb(0, 153, 0);">}</span><br />&nbsp;<br />B<span style="color: rgb(51, 153, 51);">::</span><span style="color: rgb(0, 64, 0);">test</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></pre>
</div>
</div>
<p>在之前的php版本中，为了让 B::test() 输出 B 这个结果，唯一的方法是在 B 类中重写 test 方法（这个时候粘贴-复制-修改是好办法）。如果这样的方法有很多，那么工作量还是很大的，特别是在维护的时候&hellip;&hellip;至少我是经常会忘记有哪些类似的代码需 要修改。<br />
有了 Last Static Bindings：</p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family: monospace;" class="php"><span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> A <span style="color: rgb(0, 153, 0);">{</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> who<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />        <span style="color: rgb(177, 177, 0);">echo</span> <span style="color: rgb(0, 153, 0); font-weight: bold;">__CLASS__</span><span style="color: rgb(51, 153, 51);">;</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> test<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />        static<span style="color: rgb(51, 153, 51);">::</span><span style="color: rgb(0, 64, 0);">who</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span> <span style="color: rgb(102, 102, 102); font-style: italic;">// Here comes Late Static Bindings</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br /><span style="color: rgb(0, 153, 0);">}</span><br />&nbsp;<br /><span style="color: rgb(0, 0, 0); font-weight: bold;">class</span> B <span style="color: rgb(0, 0, 0); font-weight: bold;">extends</span> A <span style="color: rgb(0, 153, 0);">{</span><br />    <span style="color: rgb(0, 0, 0); font-weight: bold;">public</span> static <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> who<span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />         <span style="color: rgb(177, 177, 0);">echo</span> <span style="color: rgb(0, 153, 0); font-weight: bold;">__CLASS__</span><span style="color: rgb(51, 153, 51);">;</span><br />    <span style="color: rgb(0, 153, 0);">}</span><br /><span style="color: rgb(0, 153, 0);">}</span><br />&nbsp;<br />B<span style="color: rgb(51, 153, 51);">::</span><span style="color: rgb(0, 64, 0);">test</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span></pre>
</div>
</div>
<p>如我所愿，现在的输出是 B 了，使用 static 关键字，让 who 方法的调用延迟到最后才绑定到真正的调用上。这样，就可以让代码变得简介并且容易理解。</p>
<h1>关于匿名函数</h1>
<p>匿名函数，也就是 <a target="_blank" href="http://www.php.net/manual/en/functions.anonymous.php" onclick="javascript:pageTracker._trackPageview('/outgoing/www.php.net/manual/en/functions.anonymous.php');">Anonymous functions</a> 其实并不是个完全陌生的家伙。create_function 这个函数已经给无数的程序员带来了甜蜜的感觉。只是 create_function 使用起来一点也不友好，同时字符串化的功能代码混乱难读。尤其是需要编写大段的匿名函数时，用 create_function 绝对是噩梦。现在真正意义上的匿名函数的出现，会给 php 带来什么影响呢？我觉得至少，在一些时髦的框架中会很快引入并应用这种特性，用这个语法糖去更简洁的实现一些功能。比如插件，再比如 DI&hellip;&hellip;</p>
<div class="wp_syntax">
<div class="code">
<pre style="font-family: monospace;" class="php"><span style="color: rgb(0, 0, 136);">$helloWorld</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 0); font-weight: bold;">function</span> <span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$name</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span><br />                <span style="color: rgb(177, 177, 0);">return</span> <span style="color: rgb(0, 0, 255);">&quot;Hello world! Hello <span style="color: rgb(0, 102, 153); font-weight: bold;">{$name}</span>&quot;</span><span style="color: rgb(51, 153, 51);">;</span><br /><span style="color: rgb(0, 153, 0);">}</span><span style="color: rgb(51, 153, 51);">;</span></pre>
</div>
</div>
<p>很像 javascript？也许吧！</p>
<p><strong>在不断的升级中 php 引入了很多新的功能，也提供了各种不同的体验。同时越来越庞大，学习也越来越困难。它，还能保持它的本色吗？</strong></p>
<p>&nbsp;</p>
<hr width="100%" size="2" />
关于命名空间，我实在是不能忍受，反斜杠本来就是转义的，现在变成命名空间了。。。<br />
可是有什么办法呢？ .被用掉了，::也被用掉了<br />
唉。。。<br />
匿名函数的使用往往多用于插件中，避免与原来的函数（命名）产生冲突，这是最好的方法了。<br />
延迟绑定，可以让PHP对于一些模式的使用变得更加优雅？或许这么说比较好吧
<p><strong><br />
</strong></p>
</div>]]></description>
			<link>http://www.neatcn.com/show-732-1.shtml</link>
			<category domain="http://www.neatcn.com/category-1-1.shtml">PHP</category>
			<pubDate>2009-06-24 09:35</pubDate>
		</item>
	</channel>
</rss>
