<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>WilliamGates Blog &#187; 技术心得</title>
	<atom:link href="http://blog.williamgates.biz/category/tech/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.williamgates.biz</link>
	<description>四片叶子的三叶草</description>
	<lastBuildDate>Tue, 02 Mar 2010 13:30:16 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</title>
		<link>http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/</link>
		<comments>http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 07:51:22 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Directory Opus]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=343</guid>
		<description><![CDATA[　　Directory Opus 是一个非常优秀的文件管理器，可以替代windows的Explorer，作为系统的默认资源管理器。
　　DO作为一个功能和反破解都下了功夫的精品软件，一直以来没有很好的破解手段，主要破解方法都是通过real key安装证书，并通过crack一个文件来防止联网验证证书。但是v9.1.1.8 Build 3352没有适合的crack，只有real key，所以要小心地防止它自动升级（其实也包括了联网验证），一般使用的方法是防火墙阻挡，我没有网络防火墙，一般就是在它的选项里禁止自动升级而已。
　　重装系统之后装上DO，把自动更新关掉，但事实证明仅仅关掉一次是不行的，我不小心中招了——DO自动更新，并且宣告我的证书为非法。卸掉重装，效果依然，这个real key已经不被DO接受了。
　　怎么办呢？难道再重装一次系统？仔细想来，肯定是DO卸载的时候留下了一些痕迹，标识了已知的证书黑名单。但是这些痕迹在哪里呢？
　　经过一些错误的尝试（中文网页往往只收录了我下面要说的方法的一小部分，而且是没用的那一部分，很有误导效果），终于找到了合适的方法，转载并翻译如下：

第一步，准备工作：

用防火墙或者Host文件（%systemroot%\system32\drivers\etc\hosts）阻挡以下地址:

127.0.0.1 gpsoftware.com.au
127.0.0.1 www.gpsoftware.com.au


重启
测试一下，ping以上地址是否都是127.0.0.1

第二步，卸载DO（如果你已经卸载过就不用了）
第三步，查找并删除注册表中所有含有 &#8220;gpsoftware&#8221; 和  &#8220;dopus&#8221; 的键值和主键
第四步，清除注册表中的黑名单

删除下列主键项下的所有子键，不删除主键本身

HKEY_CURRENT_USER\Control Panel\International\Time
HKEY_CURRENT_USER\Software\Microsoft\Clock
HKEY_CURRENT_USER\Software\Microsoft\File Manager\Settings
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\TrashInfo\
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\DlgInfo\
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\App Management\AppDataBucket\
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DesktopInterfaceMethod\


测试，在注册表中搜索{CBE4B0D2-C4FC-45E3-976C-7D2E951DD34B}，如果已经没有结果，那么注册表清除完毕

第五步，清除文件黑名单

删除 C:\windows\system32\inf32 目录下的所有文件，但保留该目录
删除以下文件

%programfiles%\GPSoftware\Directory Opus\dopus.dat
%appdata%\GPSoftware\Directory Opus\dopus.dat
%windir%\xpcc37.log
%windir%\system32\argtmp39.dll
%Systemroot%\Documents and Settings\All Users\Application Data\GPSoftware\Directory Opus\dopus.cert




这样就清理完成了，断网后再次安装DO，证书就会被接受了。
说明：

关于第一步，有说法是现在DO在代码里已经写死了IP地址，不再需要解析，所以第一步本身并不保险，建议怕麻烦的人直接使用网络防火墙禁止DO的一切网络访问，不怕麻烦的，像我一样关闭DO的自动升级就行了（首选项-其他-选项-自动检查程序更新），关掉之后重启，再检查一下是否又复原，如果复原的话再关，一般不需要超过2次。反正被验证了大不了按以上方法搞回来。
关于第二步，事实证明DO的卸载程序还是很厚道的，所有非注册表内容都删掉了，所以不要自作聪明用专门的卸载软件去卸它，反而效果不好。
关于第三步，原作者说可能不需要，经我测试的确是没用的。
关于第四步，要注意的是“默认”本身也是一个键值，但没法也不必删掉
关于第五步，经测试v9.1.1.8 Build 3352不存在以上文件残留


　　这个方法本来就是针对旧版本写的，至少9.1.1.8版本目前只需要做第三、四步就可以了。本方法不一定适用于更新的版本，请注意。


No related posts.]]></description>
			<content:encoded><![CDATA[<p>　　<a href="http://www.gpsoft.com.au/">Directory Opus</a> 是一个非常优秀的文件管理器，可以替代windows的Explorer，作为系统的默认资源管理器。<br />
　　DO作为一个功能和反破解都下了功夫的精品软件，一直以来没有很好的破解手段，主要破解方法都是通过real key安装证书，并通过crack一个文件来防止联网验证证书。但是v9.1.1.8 Build 3352没有适合的crack，只有real key，所以要小心地防止它自动升级（其实也包括了联网验证），一般使用的方法是防火墙阻挡，我没有网络防火墙，一般就是在它的选项里禁止自动升级而已。<br />
　　重装系统之后装上DO，把自动更新关掉，但事实证明仅仅关掉一次是不行的，我不小心中招了——DO自动更新，并且宣告我的证书为非法。卸掉重装，效果依然，这个real key已经不被DO接受了。<br />
　　怎么办呢？难道再重装一次系统？仔细想来，肯定是DO卸载的时候留下了一些痕迹，标识了已知的证书黑名单。但是这些痕迹在哪里呢？<br />
　　经过一些错误的尝试（中文网页往往只收录了我下面要说的方法的一小部分，而且是没用的那一部分，很有误导效果），终于找到了合适的方法，转载并翻译如下：<br />
<span id="more-343"></span></p>
<blockquote><p>第一步，准备工作：</p>
<ul>
<li>用防火墙或者Host文件（%systemroot%\system32\drivers\etc\hosts）阻挡以下地址:

<div class="wp_syntax"><div class="code"><pre class="whois" style="font-family:monospace;"><span style="color: #804040;">127.0.0.1</span> gpsoftware.com.au
<span style="color: #804040;">127.0.0.1</span> www.gpsoftware.com.au</pre></div></div>

</li>
<li>重启</li>
<li>测试一下，ping以上地址是否都是127.0.0.1</li>
</ul>
<p>第二步，卸载DO（如果你已经卸载过就不用了）</p>
<p>第三步，查找并删除注册表中所有含有 &#8220;gpsoftware&#8221; 和  &#8220;dopus&#8221; 的键值和主键</p>
<p>第四步，清除注册表中的黑名单</p>
<ul>
<li>删除下列主键项下的所有子键，不删除主键本身

<div class="wp_syntax"><div class="code"><pre class="reg" style="font-family:monospace;"><span style="color: #800000;">HKEY_CURRENT_USER</span>\Control Panel\International\Time
<span style="color: #800000;">HKEY_CURRENT_USER</span>\Software\Microsoft\Clock
<span style="color: #800000;">HKEY_CURRENT_USER</span>\Software\Microsoft\File Manager\Settings
<span style="color: #800000;">HKEY_CURRENT_USER</span>\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\TrashInfo\
<span style="color: #800000;">HKEY_CURRENT_USER</span>\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\DlgInfo\
<span style="color: #800000;">HKEY_LOCAL_MACHINE</span>\Software\Microsoft\Windows\CurrentVersion\App Management\AppDataBucket\
<span style="color: #800000;">HKEY_LOCAL_MACHINE</span>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\DesktopInterfaceMethod\</pre></div></div>

</li>
<li>测试，在注册表中搜索{CBE4B0D2-C4FC-45E3-976C-7D2E951DD34B}，如果已经没有结果，那么注册表清除完毕</li>
</ul>
<p>第五步，清除文件黑名单</p>
<ul>
<li>删除 C:\windows\system32\inf32 目录下的所有文件，但保留该目录</li>
<li>删除以下文件

<div class="wp_syntax"><div class="code"><pre class="dos" style="font-family:monospace;"><span style="color: #33cc33;">%</span><span style="color: #448888;">programfiles</span><span style="color: #33cc33;">%</span>\GPSoftware\Directory Opus\dopus.dat
<span style="color: #33cc33;">%</span><span style="color: #448888;">appdata</span><span style="color: #33cc33;">%</span>\GPSoftware\Directory Opus\dopus.dat
<span style="color: #33cc33;">%</span><span style="color: #448888;">windir</span><span style="color: #33cc33;">%</span>\xpcc37.log
<span style="color: #33cc33;">%</span><span style="color: #448888;">windir</span><span style="color: #33cc33;">%</span>\system32\argtmp39.dll
<span style="color: #33cc33;">%</span><span style="color: #448888;">Systemroot</span><span style="color: #33cc33;">%</span>\Documents and Settings\All Users\Application Data\GPSoftware\Directory Opus\dopus.cert</pre></div></div>

</li>
</ul>
</blockquote>
<p>这样就清理完成了，断网后再次安装DO，证书就会被接受了。</p>
<p>说明：</p>
<blockquote><ul>
<li>关于第一步，有说法是现在DO在代码里已经写死了IP地址，不再需要解析，所以第一步本身并不保险，建议怕麻烦的人直接使用网络防火墙禁止DO的一切网络访问，不怕麻烦的，像我一样关闭DO的自动升级就行了（首选项-其他-选项-自动检查程序更新），关掉之后重启，再检查一下是否又复原，如果复原的话再关，一般不需要超过2次。反正被验证了大不了按以上方法搞回来。</li>
<li>关于第二步，事实证明DO的卸载程序还是很厚道的，所有非注册表内容都删掉了，所以不要自作聪明用专门的卸载软件去卸它，反而效果不好。</li>
<li>关于第三步，原作者说可能不需要，经我测试的确是没用的。</li>
<li>关于第四步，要注意的是“默认”本身也是一个键值，但没法也不必删掉</li>
<li>关于第五步，经测试v9.1.1.8 Build 3352不存在以上文件残留</li>
</ul>
</blockquote>
<p>　　这个方法本来就是针对旧版本写的，至少9.1.1.8版本目前只需要做第三、四步就可以了。本方法不一定适用于更新的版本，请注意。</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>NOD32升级服务器——WG个人提供</title>
		<link>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/</link>
		<comments>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 03:23:37 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[LilyStudio]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[NOD32]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>
		<category><![CDATA[服务]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=322</guid>
		<description><![CDATA[　　试着公布一下我自己建的NOD32升级服务器（仅限v3，测试阶段，可能不稳定，随时可能改密码）：

　　地址：http://nod32.williamgates.biz
　　用户名：williamgates
　　密码：nodnod

　　密码可能常常修改，修改规则未定，一旦不能升级请及时来看本帖，所有修改都将在本帖发布。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
Reload
]]></description>
			<content:encoded><![CDATA[<p>　　试着公布一下我自己建的NOD32升级服务器（仅限v3，测试阶段，可能不稳定，随时可能改密码）：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">　　地址：http://nod32.williamgates.biz
　　用户名：williamgates
　　密码：nodnod</pre></div></div>

<p>　　密码可能常常修改，修改规则未定，一旦不能升级请及时来看本帖，所有修改都将在本帖发布。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
<li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2009/02/wg-nod32-update-server/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>在虚拟主机上架设NOD32升级服务器</title>
		<link>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/</link>
		<comments>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 03:16:00 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[HostMonster]]></category>
		<category><![CDATA[NOD32]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=317</guid>
		<description><![CDATA[　　常给朋友和同事推荐NOD32，但是给他们装的时候往往没有升级服务器可用，他们既不会自己上网去搜索一些免费的升级地址，我也不大方便把drl的服务器给他们用——于是决定自己架设一个。
　　自己没有架在公众网的服务器，只有虚拟主机，到底能不能做到呢？下面就以我的HostMonster主机为例，来一步步尝试。
　　所需条件：支持SSH、cron的主机。
　　一、安装unrar
　　nod32升级的第一步就是下载update.ver文件，这是一个更新包的列表文件，用于增量升级。要命的是这个文件是rar包——天知道他们怎么想的——绝大多数商业的虚拟主机由于版权的原因不可能预装rar，所以我们只能自己装一个。
　　首先创建一个目录，建议在public_html之外，即无法通过apache访问到的目录，用于存放rarlinux程序文件。然后从官方网站下载rarlinux

http://www.rarlab.com/rar/rarlinux-3.6.0.tar.gz

　　解压

tar zxvf rarlinux-3.6.0.tar.gz

　　这里要注意的是，Debian系统用3.6以下或以上的版本都会出现库文件错误，只有3.6不需要任何折腾就能使用，反正只是用来解压缩一个文件，还是老老实实用3.6吧。
　　解压之后得到rar目录，unrar就在目录中，无须安装，由于没有权限，就不要用make install了，反正不安装也能用。
　　二、编写升级脚本
　　这里使用php脚本自动从升级服务器下载文件，假设wget在系统中路径是/usr/bin/wget，unrar（刚才解压出来的地址）是/home/rar/unrar，我们升级文件的绝对路径为/home/public_html/nod32/，实际公开的地址是nod32.a.com，上层升级服务器是nod32.b.com/nod32/，用户名a，密码b（以上全都是虚构），那么脚本如下（抄袭自drl的jindui，根据我的情况略有修改，并修改了一处BUG）

　　文件&#8221;v3.php&#8221;

&#60; ? 
$base='/home/public_html/nod32/';
$LOCALDIR = $base;
$UPDATEDIR = $base;
$TEMPDIR = $base.'tmp/';
$WGET = &#34;/usr/bin/wget  --user-agent='ESS Update (Windows; U; 32bit; VDB 1924; BPC 3; OS: 6.0.6000 SP 0.0 NT; CH 1.1; LNG 1033; x32c;' &#34;;
$UNRAR = '/home/rar/unrar';
$UPDATE_SERVER = 'http://nod32.b.com/'; 
$updateurl=&#34;${UPDATE_SERVER}/nod32/update.ver&#34;;
&#160;
include&#40;&#34;nod32.php&#34;&#41;;
?&#62;

　　文件&#8221;nod32.php&#8221;

&#60; ? 
$UNRAR = '/home/rar/unrar';
$update=&#34;${UPDATEDIR}update.ver&#34;;
$updatetmp=&#34;${UPDATEDIR}update.tmp&#34;;
$USER = 'a';
$PASS = 'b';
&#160;
&#160;
//$ignore = array('fr.nup', 'ge.nup', 'it.nup', 'jp.nup', 'pl.nup', 'pt.nup', [...]]]></description>
			<content:encoded><![CDATA[<p>　　常给朋友和同事推荐NOD32，但是给他们装的时候往往没有升级服务器可用，他们既不会自己上网去搜索一些免费的升级地址，我也不大方便把drl的服务器给他们用——于是决定自己架设一个。<br />
　　自己没有架在公众网的服务器，只有虚拟主机，到底能不能做到呢？下面就以我的HostMonster主机为例，来一步步尝试。<br />
　　所需条件：支持SSH、cron的主机。</p>
<p>　　一、安装unrar<br />
　　nod32升级的第一步就是下载update.ver文件，这是一个更新包的列表文件，用于增量升级。要命的是这个文件是rar包——天知道他们怎么想的——绝大多数商业的虚拟主机由于版权的原因不可能预装rar，所以我们只能自己装一个。<br />
　　首先创建一个目录，建议在public_html之外，即无法通过apache访问到的目录，用于存放rarlinux程序文件。然后从官方网站下载rarlinux</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http:<span style="color: #000000; font-weight: bold;">//</span>www.rarlab.com<span style="color: #000000; font-weight: bold;">/</span>rar<span style="color: #000000; font-weight: bold;">/</span>rarlinux-3.6.0.tar.gz</pre></div></div>

<p>　　解压</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">tar</span> zxvf rarlinux-3.6.0.tar.gz</pre></div></div>

<p>　　这里要注意的是，Debian系统用3.6以下或以上的版本都会出现库文件错误，只有3.6不需要任何折腾就能使用，反正只是用来解压缩一个文件，还是老老实实用3.6吧。<br />
　　解压之后得到rar目录，unrar就在目录中，无须安装，由于没有权限，就不要用make install了，反正不安装也能用。</p>
<p>　　二、编写升级脚本<br />
　　这里使用php脚本自动从升级服务器下载文件，假设wget在系统中路径是/usr/bin/wget，unrar（刚才解压出来的地址）是/home/rar/unrar，我们升级文件的绝对路径为/home/public_html/nod32/，实际公开的地址是nod32.a.com，上层升级服务器是nod32.b.com/nod32/，用户名a，密码b（以上全都是虚构），那么脚本如下（抄袭自drl的jindui，根据我的情况略有修改，并修改了一处BUG）<br />
<span id="more-317"></span><br />
　　文件&#8221;v3.php&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ? 
<span style="color: #000088;">$base</span><span style="color: #339933;">=</span><span style="color: #0000ff;">'/home/public_html/nod32/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$LOCALDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UPDATEDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$TEMPDIR</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$base</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'tmp/'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$WGET</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;/usr/bin/wget  --user-agent='ESS Update (Windows; U; 32bit; VDB 1924; BPC 3; OS: 6.0.6000 SP 0.0 NT; CH 1.1; LNG 1033; x32c;' &quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UNRAR</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/home/rar/unrar'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$UPDATE_SERVER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://nod32.b.com/'</span><span style="color: #339933;">;</span> 
<span style="color: #000088;">$updateurl</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATE_SERVER}</span>/nod32/update.ver&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nod32.php&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>　　文件&#8221;nod32.php&#8221;</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ? 
<span style="color: #000088;">$UNRAR</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/home/rar/unrar'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$update</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATEDIR}</span>update.ver&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$updatetmp</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">${UPDATEDIR}</span>update.tmp&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$USER</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'a'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$PASS</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'b'</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">//$ignore = array('fr.nup', 'ge.nup', 'it.nup', 'jp.nup', 'pl.nup', 'pt.nup', 'sk.nup', 'sp.nup', 'hr.nup', 'hu.nup', 'nl.nup'); </span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$LOCALDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$LOCALDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$UPDATEDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$UPDATEDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">is_dir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$TEMPDIR</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> 
    <span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$TEMPDIR</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">//copy($update,$updatetmp);</span>
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$WGET</span> -t 15 -T 60 -N -nH -nd -P <span style="color: #006699; font-weight: bold;">$UPDATEDIR</span> <span style="color: #006699; font-weight: bold;">$updateurl</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #666666; font-style: italic;">/*$md51=exec(&quot;md5 -q $update&quot;);
$md52=exec(&quot;md5 -q $updatetmp&quot;);
unlink($updatetmp);
&nbsp;
if($md51==$md52) {
         echo &quot;no update need   !&quot;;
        exit;
&nbsp;
}*/</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Failed while downloading update.ver.'</span><span style="color: #339933;">;</span> 
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$UNRAR</span> x -y -o+ <span style="color: #006699; font-weight: bold;">{$UPDATEDIR}</span>update.ver <span style="color: #006699; font-weight: bold;">{$TEMPDIR}</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">file_get_contents</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$TEMPDIR}</span>update.ver&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/file=(\/[\/a-z0-9\-\_\.]+)\W+size=([0-9]+)\W/ise&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$matches</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$list</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$num</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #666666; font-style: italic;">//这句话我修改了一下，将字符串开头的&quot;/&quot;去掉了</span>
<span style="color: #666666; font-style: italic;">//否则地址会有两个&quot;/&quot;，造成文件大小无法比对，每次都会重新下载全部的文件）</span>
    <span style="color: #000088;">$size</span><span style="color: #339933;">=</span><span style="color: #000088;">$matches</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$num</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$filesize</span><span style="color: #339933;">=</span><span style="color: #990000;">filesize</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$base</span><span style="color: #339933;">.</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$size</span><span style="color: #339933;">!=</span><span style="color: #000088;">$filesize</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$list</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$UPDATE_SERVER}</span><span style="color: #006699; font-weight: bold;">$file</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;the file size of   <span style="color: #006699; font-weight: bold;">$file</span>  is same, skip <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">/*
preg_match_all(&quot;/file=(.+?)\n/ie&quot;, $content, $matches); 
&nbsp;
$list = ''; 
foreach($matches[1] as $match) { 
    $match = trim($match); 
    $last = substr($match, -6); 
&nbsp;
    if (!in_array($last, $ignore)) 
        $list .= &quot;{$UPDATE_SERVER}$match\r\n&quot;; 
} */</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#file_put_contents('list.txt', $list); 
</span><span style="color: #000088;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;list.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;w&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #339933;">,</span> <span style="color: #000088;">$list</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">exec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$WGET</span> --http-user=<span style="color: #006699; font-weight: bold;">$USER</span> --http-passwd=<span style="color: #006699; font-weight: bold;">$PASS</span> -t 15  -T 60 -m -nH -P <span style="color: #006699; font-weight: bold;">$LOCALDIR</span> -i list.txt&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$output</span><span style="color: #339933;">,</span> <span style="color: #000088;">$ret</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$ret</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Failed while downloading files.'</span><span style="color: #339933;">;</span> 
    <span style="color: #990000;">exit</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span> 
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Updated successfully.'</span><span style="color: #339933;">;</span> 
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>　　现在从浏览器访问v3.php（这两个脚本无所谓放在哪里，只要是能通过apache访问到的目录就行，建议单独设置目录以便我们下面说的安全保护），就已经可以成功下载文件了。</p>
<p>　　三、安全保护<br />
　　为了不让普通用户主动运行升级脚本，也不让别人可以查看你的上层升级服务器的地址，我选择了密码保护，直接在HostMonster的控制面板里设置就行了，否则自己写文件有点麻烦。对你存放v3.php和nod32.php的目录设置一个用户名和密码，我们这里假设用户名是abc，密码是123。将一个单独的子域名（例如abc.a.com）指向这个目录。用浏览器访问就会弹出提示输入用户名密码的对话框。这无所谓，反正我们只要用lynx就行——一个Linux命令行下的浏览器（其实wget也行）。<br />
　　运行这个命令</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">lynx</span> <span style="color: #660033;">-cfg</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #660033;">-source</span> <span style="color: #660033;">-auth</span>=abc:<span style="color: #000000;">123</span> http:<span style="color: #000000; font-weight: bold;">//</span>abc.a.com<span style="color: #000000; font-weight: bold;">/</span>v3.php</pre></div></div>

<p>　　其中-cfg参数是指定配置文件，这里指定为空（否则会出错），-source表示纯字符串输出，-auth是密码验证的功能。<br />
　　可以看到输出一串结果，说明下载成功或者文件已存在不用下载。<br />
　　然后用同样的方法对下载来的文件存放的目录即本例中的/home/public_html/nod32/设置一个密码，是用来发布给别人升级时用的，记得不要和前面那个一样哦。</p>
<p>　　四、定时运行任务<br />
　　要让php脚本定时运行，虽然也可以用CGI方式运行php，但是我还是倾向于用浏览器，这样较为安全。<br />
　　编写一个nod32.sh文件（假设你的sh在/bin/，lynx在/usr/bin/，不清楚的话可以用whereis sh查到），同样放在apache无法取到的目录下，假设还是放在/home/rar/</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">lynx</span> <span style="color: #660033;">-cfg</span>=<span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #660033;">-source</span> <span style="color: #660033;">-auth</span>=abc:<span style="color: #000000;">123</span> http:<span style="color: #000000; font-weight: bold;">//</span>abc.a.com<span style="color: #000000; font-weight: bold;">/</span>v3.php</pre></div></div>

<p>　　然后在虚拟主机的控制面板里设置Cron任务，更新频率每12小时吧，命令为</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">sh</span> <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>rar<span style="color: #000000; font-weight: bold;">/</span>nod32.sh</pre></div></div>

<p>　　这样就完成了，你的程序会自动定时去上层服务器下载升级文件并存放在/home/public_html/nod32/，你只需要设置nod32.a.com指向该目录，就可以公开发布这个地址了。</p>
<p>　　最后，公布一下我自己建的<a href="http://blog.williamgates.biz/2009/02/wg-nod32-update-server/">NOD32升级服务器</a><br />
　　</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
<li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2009/02/setup-nod32-update-server-on-hostmonster/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让WordPress的私有文章（private post）所属的tags和categories显示出来</title>
		<link>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/</link>
		<comments>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/#comments</comments>
		<pubDate>Wed, 17 Dec 2008 08:23:21 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=182</guid>
		<description><![CDATA[　　Wordpress有private post的功能，但是一个post一旦作为private被save而不是public，则不会在数据库中进行计数（不算在已发的文章中）。这里讨论了这个问题。
　　现在问题在于，如果一个tag或者category只含有private post，那么它的计数是0，被认为是不含有文章从而不会被显示出来，哪怕是登录以后有权限看private post的情况下也是如此。这里，Wordpress的support forum的一个Moderator建议应该修改wp-includes中的taxonomy.php里的此处

function _update_post_term_count&#40; $terms &#41; &#123;
	global $wpdb;
&#160;
	foreach &#40; &#40;array&#41; $terms as $term &#41; &#123;
		$count = $wpdb-&#62;get_var&#40; $wpdb-&#62;prepare&#40; &#34;SELECT COUNT(*) FROM $wpdb-&#62;term_relationships, $wpdb-&#62;posts WHERE $wpdb-&#62;posts.ID = $wpdb-&#62;term_relationships.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = %d&#34;, $term &#41; &#41;;
		$wpdb-&#62;update&#40; $wpdb-&#62;term_taxonomy, compact&#40; 'count' &#41;, array&#40; 'term_taxonomy_id' =&#62; $term &#41; &#41;;
	&#125;
&#125;

　　看起来似乎在 post_status [...]]]></description>
			<content:encoded><![CDATA[<p>　　Wordpress有private post的功能，但是一个post一旦作为private被save而不是public，则不会在数据库中进行计数（不算在已发的文章中）。<a href="http://trac.wordpress.org/ticket/5270">这里</a>讨论了这个问题。<br />
　　现在问题在于，如果一个tag或者category只含有private post，那么它的计数是0，被认为是不含有文章从而不会被显示出来，哪怕是登录以后有权限看private post的情况下也是如此。<a href="http://wordpress.org/support/topic/221210">这里</a>，Wordpress的support forum的一个Moderator建议应该修改wp-includes中的taxonomy.php里的此处</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> _update_post_term_count<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$terms</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">global</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span> <span style="color: #000088;">$terms</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$count</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get_var</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">prepare</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;SELECT COUNT(*) FROM <span style="color: #006699; font-weight: bold;">$wpdb-&gt;term_relationships</span>, <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span> WHERE <span style="color: #006699; font-weight: bold;">$wpdb-&gt;posts</span>.ID = <span style="color: #006699; font-weight: bold;">$wpdb-&gt;term_relationships</span>.object_id AND post_status = 'publish' AND post_type = 'post' AND term_taxonomy_id = <span style="color: #009933; font-weight: bold;">%d</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">update</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$wpdb</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">term_taxonomy</span><span style="color: #339933;">,</span> <span style="color: #990000;">compact</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'count'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'term_taxonomy_id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$term</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>　　看起来似乎在 <code>post_status = 'publish'</code> 后面加一个 <code>OR post_status = 'private'</code> 就行了，但实际上没效果。为什么呢？这是往数据库中写的时候用来计数的，不是用来显示的；当我们已经有private post，修改这里并不会让本来被认为是空着的tag和category变得有数字。<br />
<span id="more-182"></span><br />
　　解决方案在<a href="http://wordpress.org/support/topic/175406">这里</a>，修改wp-includes中的category-template.php，<code>function wp_tag_cloud( $args = '' )</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> get_tags<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'count'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'DESC'</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Always query top tags</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$tags</span> <span style="color: #339933;">=</span> get_tags<span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'hide_empty'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'count'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'DESC'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// Always query top tags</span></pre></div></div>

<p>　　也就是给 <code>get_tags()</code> （这其实是taxonomy.php里 <code>get_term()</code> 的一个封装，所以参数也一样)加上一个参数 <code>'hide_empty' => 0</code> ，即显示被认为是空的tag。<br />
　　category也一样做就可以了，同样是category-template.php里，修改 <code>function wp_list_categories( $args = '' ) </code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$defaults</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
		<span style="color: #0000ff;">'show_option_all'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'orderby'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'ASC'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'show_last_update'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'style'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'list'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'show_count'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'hide_empty'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'use_desc_for_title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'child_of'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'feed'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'feed_type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'feed_image'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'exclude'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'current_category'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'hierarchical'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'title_li'</span> <span style="color: #339933;">=&gt;</span> __<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">'Categories'</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #0000ff;">'echo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'depth'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
	<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　把 <code>'hide_empty' => 1</code> 改成0即可。<br />
　　当然，如果需要只让有权限看private post的用户看到这些变化，只要给前面两处修改加上 <code>if(current_user_can("read_private_posts")) </code> 这样的判断就行了。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/12/show-tags-and-categories-only-have-private-post-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>宇瞻钢铁侠优盘（AH321，群联Phsion UP14 PS2232）量产经历和教训</title>
		<link>http://blog.williamgates.biz/2008/12/phsion-ps2232-up14-mass-production/</link>
		<comments>http://blog.williamgates.biz/2008/12/phsion-ps2232-up14-mass-production/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 06:59:54 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[优盘]]></category>
		<category><![CDATA[宇瞻]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[硬件]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=164</guid>
		<description><![CDATA[具体来说，我的是群联UP14主控，三星双芯片，8G的宇瞻钢铁侠
先说结论：
1、近期新买的钢铁侠请不要量产！！！
2、群联量产工具的版本号混乱是一些转发的人误解造成
买来之后的测试



请注意，版本号为奇怪的1.06.00
这个版本号的量产工具并未出现在网络上，网络上最新的是1.05.00

经过各版本量产工具的实验，首先得出了量产工具版本号的结论：
版本号是量产工具的文件名所标识的，不是配置工具的文件名
1、1.05.00，这是目前（截至2008年12月2日）网上出现的最新的版本
http://bbs.mydigit.cn/read.php?tid=60779
2、1.02.00，这个版本并不难找但被很多人误解了，网上传播的多写作它的配置工具的版本号
http://bbs.mydigit.cn/read.php?tid=60541
它的配置工具叫做ParamEdt-F1-v1.0.20.3.exe，于是被误传为1.0.20.3版
实际上1.96版的配置工具叫做ParamEdt-F1-v1.0.20.2.exe，1.05版的配置工具叫做ParamEdt-F1-v1.0.20.3.exe
真正的版本号是1.02版的量产程序名PS2232_F1_B4_V102_0A.exe，即1.02.00（或是0A？）
3、1.96.00，旧版本也是使用最广的版本。这的确是不同于前两者的版本编号方式。
http://bbs.mydigit.cn/read.php?tid=31113
我量产了这三种版本，其中1.02.00不能成功，总是停在重插上后的testing状态，测试了好久也没反应
1.05.00的测试结果

1.96.00的测试结果

很明显可见，速度是1.06.00>1.05.00>1.96
1.06除了最高读取略差一点点，稳定性、写速度特别是小文件的写速度都是远远高于1.05的
但是网上又找不到1.06的工具，再也没法刷回1.06去了……
于是得出了开头的结论，请大家近期买回钢铁侠，用量产工具读取版本号发现是1.06.00的，请勿再量产
量产未必比出厂状态更快，这就是我得来的教训——反正拿到手上不量产也安不下心，总会做这个小白鼠的
我还是等1.06在网上放出来吧……


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>具体来说，我的是群联UP14主控，三星双芯片，8G的宇瞻钢铁侠</p>
<p>先说结论：<br />
1、近期新买的钢铁侠请不要量产！！！<br />
2、群联量产工具的版本号混乱是一些转发的人误解造成</p>
<p>买来之后的测试<br />
<img src="http://blog.williamgates.biz/wp-content/uploads/2008/12/samsung.png" alt="" title="samsung" width="458" height="440" class="alignnone size-full wp-image-165" /></p>
<p><img src="http://blog.williamgates.biz/wp-content/uploads/2008/12/ps2232_10600.png" alt="" title="ps2232_10600" class="alignnone size-full wp-image-166" /></p>
<p><img src="http://blog.williamgates.biz/wp-content/uploads/2008/12/10600.png" alt="" title="10600" width="500" height="486" class="alignnone size-full wp-image-171" /></p>
<p>请注意，版本号为奇怪的1.06.00<br />
这个版本号的量产工具并未出现在网络上，网络上最新的是1.05.00<br />
<span id="more-164"></span><br />
经过各版本量产工具的实验，首先得出了量产工具版本号的结论：<br />
版本号是量产工具的文件名所标识的，不是配置工具的文件名</p>
<p>1、1.05.00，这是目前（截至2008年12月2日）网上出现的最新的版本<br />
<a href="http://bbs.mydigit.cn/read.php?tid=60779">http://bbs.mydigit.cn/read.php?tid=60779</a></p>
<p>2、1.02.00，这个版本并不难找但被很多人误解了，网上传播的多写作它的配置工具的版本号<br />
<a href="http://bbs.mydigit.cn/read.php?tid=60541">http://bbs.mydigit.cn/read.php?tid=60541</a><br />
它的配置工具叫做ParamEdt-F1-v1.0.20.3.exe，于是被误传为1.0.20.3版<br />
实际上1.96版的配置工具叫做ParamEdt-F1-v1.0.20.2.exe，1.05版的配置工具叫做ParamEdt-F1-v1.0.20.3.exe<br />
真正的版本号是1.02版的量产程序名PS2232_F1_B4_V102_0A.exe，即1.02.00（或是0A？）</p>
<p>3、1.96.00，旧版本也是使用最广的版本。这的确是不同于前两者的版本编号方式。<br />
<a href="http://bbs.mydigit.cn/read.php?tid=31113">http://bbs.mydigit.cn/read.php?tid=31113</a></p>
<p>我量产了这三种版本，其中1.02.00不能成功，总是停在重插上后的testing状态，测试了好久也没反应</p>
<p>1.05.00的测试结果<br />
<img src="http://blog.williamgates.biz/wp-content/uploads/2008/12/ps2232_10500.png" alt="" title="ps2232_10500" width="474" height="572" class="alignnone size-full wp-image-168" /></p>
<p>1.96.00的测试结果<br />
<img src="http://blog.williamgates.biz/wp-content/uploads/2008/12/ps2232_19600.png" alt="" title="ps2232_19600" width="474" height="572" class="alignnone size-full wp-image-169" /></p>
<p>很明显可见，速度是1.06.00>1.05.00>1.96<br />
1.06除了最高读取略差一点点，稳定性、写速度特别是小文件的写速度都是远远高于1.05的<br />
但是网上又找不到1.06的工具，再也没法刷回1.06去了……<br />
于是得出了开头的结论，请大家近期买回钢铁侠，用量产工具读取版本号发现是1.06.00的，请勿再量产<br />
量产未必比出厂状态更快，这就是我得来的教训——反正拿到手上不量产也安不下心，总会做这个小白鼠的<br />
我还是等1.06在网上放出来吧……</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/12/phsion-ps2232-up14-mass-production/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress+WP-SuperCache之中文tag的Permalink问题全解析</title>
		<link>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/</link>
		<comments>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 04:50:17 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=152</guid>
		<description><![CDATA[　　WordPress的中文支持有问题，特别是在使用Permalink的时候，这个大家都知道。本文将分析其中的原因和网上流传的多种解决方案，并给出一个具体的解决结论。
　　这个问题主要表现为，在默认情况下，Wordpress对于形如这样的链接（链接1）：
　　

www.example.com/tag/中文

　　不能正常访问，会产生404或500错误，或者其他的错误。
　　而对于这样的链接（链接2）：
　　

www.example.com/?tag=中文

　　WordPress就能够正确解析。
　　原因：参见这篇文章和这篇文章，这是URL编码问题造成的。对于上面的链接1，这是一个PathInfo，对于链接2，这是一个QueryString。事实证明，对于UTF-8的页面，IE和FF都会正确发送PathInfo和QueryString（而不像有些文章中说的，他们在不同的设置下会有错误的反应），但服务器端，IIS会将PathInfo转换成GBK编码从而造成错误，于是Windows下的此类问题只需要转回来就行了；但是Linux下，Apache不支持中文PathInfo，要么通过这篇文章中的方法来对Apache进行改造，要么只能像我一样，Linux主机无法使用中文permalink。于是，我们只能寻找绕路的方法。

　　解决方案分析：
　　一、转换编码（参见这篇文章）
　　原理是，IIS会将PathInfo中的UTF-8转换成GBK，而QueryString中就不会转换，故而为了使用Permalink，采用以下方法：
　　打开wp-includesclasses.php文件，找到第44行和第50行：

if &#40; isset&#40;$_SERVER&#91;'PATH_INFO'&#93;&#41; &#41;
  $pathinfo = $_SERVER&#91;'PATH_INFO'&#93;;
else
  $pathinfo = '';
$pathinfo_array = explode&#40;'?', $pathinfo&#41;;
$pathinfo = str_replace&#40;&#34;%&#34;, &#34;%25&#34;, $pathinfo_array&#91;0&#93;&#41;;
$req_uri = $_SERVER&#91;'REQUEST_URI'&#93;;

改为

if &#40; isset&#40;$_SERVER&#91;'PATH_INFO'&#93;&#41; &#41;
  $pathinfo = mb_convert_encoding&#40;$_SERVER&#91;'PATH_INFO'&#93;, &#34;UTF-8&#34;, &#34;GBK&#34;&#41;;
else
  $pathinfo = '';
$pathinfo_array = explode&#40;'?', $pathinfo&#41;;
$pathinfo = str_replace&#40;&#34;%&#34;, &#34;%25&#34;, $pathinfo_array&#91;0&#93;&#41;;
$req_uri = mb_convert_encoding&#40;$_SERVER&#91;'REQUEST_URI'&#93;, &#34;UTF-8&#34;, &#34;GBK&#34;&#41;;

　　局限：只对Windows主机、且必须是Windows下的IIS主机有效。
　　二、修改rewrite.php（参见这篇文章）
　　这是网上最常见的方法，原理是，让WordPress在对其他内容使用Permalink的时候，对tag不使用，而使用链接2的QueryString模式发送中文编码：

1
2
3
4
5
6
7
8
function get_tag_permastruct&#40;&#41; &#123;
if &#40;isset&#40;$this-&#62;tag_structure&#41;&#41; &#123;
return $this-&#62;tag_structure;
&#125;
if &#40;empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123; //-----this line need [...]]]></description>
			<content:encoded><![CDATA[<p>　　WordPress的中文支持有问题，特别是在使用Permalink的时候，这个大家都知道。本文将分析其中的原因和网上流传的多种解决方案，并给出一个具体的解决结论。<br />
　　这个问题主要表现为，在默认情况下，Wordpress对于形如这样的链接（链接1）：<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/tag/中文</pre></div></div>

<p>　　不能正常访问，会产生404或500错误，或者其他的错误。<br />
　　而对于这样的链接（链接2）：<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/?tag=中文</pre></div></div>

<p>　　WordPress就能够正确解析。</p>
<p>　　原因：参见<a href="http://akun-007.javaeye.com/blog/222624">这篇文章</a>和这篇文章，这是URL编码问题造成的。对于上面的链接1，这是一个PathInfo，对于链接2，这是一个QueryString。事实证明，对于UTF-8的页面，IE和FF都会正确发送PathInfo和QueryString（而不像有些文章中说的，他们在不同的设置下会有错误的反应），但服务器端，IIS会将PathInfo转换成GBK编码从而造成错误，于是Windows下的此类问题只需要转回来就行了；但是Linux下，Apache不支持中文PathInfo，要么通过<a href="http://www.iceboy.cn/show-15-1.html">这篇文章</a>中的方法来对Apache进行改造，要么只能像我一样，<strong>Linux主机无法使用中文permalink</strong>。于是，我们只能寻找绕路的方法。<br />
<span id="more-152"></span><br />
　　解决方案分析：<br />
　　一、转换编码（参见<a href="http://www.bolarn.com/index.php/2008/01/26/52/">这篇文章</a>）<br />
　　原理是，IIS会将PathInfo中的UTF-8转换成GBK，而QueryString中就不会转换，故而为了使用Permalink，采用以下方法：<br />
　　打开wp-includesclasses.php文件，找到第44行和第50行：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;%25&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo_array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$req_uri</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'PATH_INFO'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
  <span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'?'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$pathinfo</span> <span style="color: #339933;">=</span> <span style="color: #990000;">str_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;%&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;%25&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$pathinfo_array</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$req_uri</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mb_convert_encoding</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REQUEST_URI'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;GBK&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　局限：只对Windows主机、且必须是Windows下的IIS主机有效。</p>
<p>　　二、修改rewrite.php（参见<a href="http://www.allove.org/index.php/archives/wordpress-tags.html">这篇文章</a>）<br />
　　这是网上最常见的方法，原理是，让WordPress在对其他内容使用Permalink的时候，对tag不使用，而使用链接2的QueryString模式发送中文编码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> get_tag_permastruct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//-----this line need change------</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">tag_structure</span> <span style="color: #339933;">=</span> ”<span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>把第5行改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>　　局限：没有起到Permalink的“漂亮”作用，如果不能自己修改WP的文件就没办法了。</p>
<p>　　三、修改tag base（参见<a href="http://www.myfcys.cn/blog/index.php/2008.05/15">这篇文章</a>，经过我研究改造）<br />
　　原理同上，只要让WordPress在打开了Permalink功能后继续对tag不理不问就行了。那么，欺骗WordPress，让它用链接2的格式来显示Permalink，可行么？可行，因为WordPress可以自定义Permalink的形式：<br />
　　在WordPress的 Settings &#8211; Permalinks &#8211; Tag base 中填上<br />
　　</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">/</span>?tag<span style="color: #339933;">=</span></pre></div></div>

<p>　　注意&#8221;"不能少，引用原文中的写法不对。另外要注意每次输入&#8221;"，WP都会再次转义为&#8221;\&#8221;，所以每次点提交都会把&#8221;"翻一倍，点两次就是&#8221;\\&#8221;，所以不要多点，一次就对了。<br />
　　这个方法的结果是使得链接变成这个样子<br />
 　　</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;">www.example.com/?tag=/中文/</pre></div></div>

<p>　　多出来的斜杠对于服务器丝毫没有影响，还是被视为QueryString，效果同上。<br />
　　局限是链接变得更加不好看了，更为致命的是插件生成的Sitemap中，tag链接会变成错误的形式，如果你很在乎Sitemap，请不要使用这个方法，除非你真的无法修改自己的rewrite.php文件。</p>
<p>　　但是当你使用WP-SuperCache或者类似的缓存插件时，它会加入自己的rewrite规则，所有请求先由自己判断，不在缓存中或者不符合缓存规则才交由WordPress处理。但问题在于，它不支持中文URL的解析，哪怕是QueryString也不行。于是我们必须绕过它。<br />
　　这是WP-SuperCache在.htaccess文件里所添加的rewrite规则</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">RewriteEngine On
RewriteBase /
&nbsp;
RewriteCond %<span class="br0">&#123;</span>REQUEST_METHOD<span class="br0">&#125;</span> !=POST
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*s=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*p=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*attachment_id=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*wp-subscription-manager=.*
RewriteCond %<span class="br0">&#123;</span>HTTP_COOKIE<span class="br0">&#125;</span> !^.*<span class="br0">&#40;</span>comment_author_|wordpress|wp-postpass_<span class="br0">&#41;</span>.*$
RewriteCond %<span class="br0">&#123;</span>HTTP:Accept-Encoding<span class="br0">&#125;</span> gzip
RewriteCond %<span class="br0">&#123;</span>DOCUMENT_ROOT<span class="br0">&#125;</span>/wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html.gz -f
RewriteRule ^<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> /wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html.gz <span class="br0">&#91;</span>L<span class="br0">&#93;</span>
&nbsp;
RewriteCond %<span class="br0">&#123;</span>REQUEST_METHOD<span class="br0">&#125;</span> !=POST
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*s=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*p=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*wp-subscription-manager=.*
RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*attachment_id=.*
RewriteCond %<span class="br0">&#123;</span>HTTP_COOKIE<span class="br0">&#125;</span> !^.*<span class="br0">&#40;</span>comment_author_|wordpress|wp-postpass_<span class="br0">&#41;</span>.*$
RewriteCond %<span class="br0">&#123;</span>DOCUMENT_ROOT<span class="br0">&#125;</span>/wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html -f
RewriteRule ^<span class="br0">&#40;</span>.*<span class="br0">&#41;</span> /wp-content/cache/supercache/%<span class="br0">&#123;</span>HTTP_HOST<span class="br0">&#125;</span>/$<span style="color: #cc66cc;">1</span>/index.html <span class="br0">&#91;</span>L<span class="br0">&#93;</span></pre></div></div>

<p>　　我们要做的就是不让它去判断中文tag链接，在两个 RewriteCond %{REQUEST_METHOD} !=POST 后面分别加入这样一句：</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">RewriteCond %<span class="br0">&#123;</span>QUERY_STRING<span class="br0">&#125;</span> !.*tag=.*</pre></div></div>

<p>　　含义是如果QueryString中含有tag字样，请不要解析（交给下一条规则，一般来说就是WordPress的index.php了）。</p>
<p>　　结论：<br />
　　Windows+IIS主机下，通过方案一可以完美解决中文tag问题<br />
　　Linux+Apache主机下，<strong>不能使用中文Permalink</strong>，除非修改Apache，否则只有用方案二和方案三绕行。<br />
　　方案二是较为推荐的方法，但是搭配WP-SuperCache使用的时候，需要自己在.htaccess文件中加入一条不处理tag链接的规则。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/07/the-end-of-pep-enlish/' rel='bookmark' title='Permanent Link: 人教版的秒速五厘米——80后共同的青春童话'>人教版的秒速五厘米——80后共同的青春童话</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/08/url-encoding-problem-in-wordpress-with-wp-super-cache/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(三)日常使用</title>
		<link>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/</link>
		<comments>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 06:45:29 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=132</guid>
		<description><![CDATA[　　第一眼看到CPG的界面，会觉得像一个论坛，这也是它的多层分类的结构决定的。与一些相册网站不同，CPG可以有无限级的分类，这样就如同与一个论坛有诸多版面，版面还有子版面，等等。理解了这个概念，我们才能开始日常的管理和使用。
　　作为管理员登录CPG的时候，有两种模式，一种是让你观看普通会员的界面的会员模式，另一种则是默认的管理模式，只有在管理模式才可以看到类别、相册、会员等管理按钮。下面主要就来讲讲这些管理功能。

　　一、类别
　　要上传图片，要选择所传到的相册；要建立相册，首先要建立类别。在“类别”菜单中，我们可以建立、修改类别，还可以修改类别在页面中显示的顺序，还可以修改类别的详细属性（点击类别后面的“e”图标），其中很重要的一点是类别缩略图，是该类别显示时的标题缩略图，如果不想你的类别是自动的最后一幅上传图作为标题图，就自己修改一下吧。
　　二、相册
　　在此界面建立和修改相册。先选择一个类别，会显示出其下现有的相册。点新增，然后在下面的文本框输入相册名，把所有的相册都建立和修改好，再点修改，这样比较方便。注意，普通会员不能建立相册更不能建立分类，只能上传到管理员预先建好的相册（须打开群设置中的“允许公用相册上传”，并且该特定的相册必须在属性中“允许访客上传图片”）或者会员自己所有的相册中。
　　三、用户管理
　　群、会员、限制会员这三项都是用来进行用户管理的，第一个“群”应该译作“用户组”更为合适。在这里你可以修改各个用户组的设置，其中默认的四个组是不能被删除的；空间配额可以决定该组可以上传的所有图片总容量；上传方法中的字段数量表示一次可以上传多少个文件。会员界面也是大概的用法，把组和会员的关系刚好理解为分类与相册的关系就好了。
　　四、批量上传
　　这可能是最常用的功能之一了，因为除非你拥有很快的网络速度，并且要传的图片不太多，否则用普通的上传功能是非常麻烦的。在这里首先要说一说CPG的文件管理结构，CPG的数据库记录加入其中的图片的路径，而具体图片怎样存放是用户管理的。默认所有的相册都在CPG自己目录下的albums目录下，其中userpics目录是默认的用户个人相册的目录，而我在albums目录下又自己建了一个albums目录，用来存放公用相册。个人建议严格地按照你的类型、相册的结构来布置文件夹结构，另外注意尽量不要使用双字节目录名（中文、日文都不可以）。
　　建好目录结构之后，向欲存放某相册的目录上传这个相册的所有文件，然后到CPG中点击批量上传（只有管理员才有此功能），会出现你CPG目录下的目录结构，一层层找到你刚刚上传的目录（不用选择任何文件），点击OK，就开始自动建立图片的缩略图和中型图（这两者的设置请见上一篇文章）缩略图和中型图都保存在原图同样的目录下，有设置项里规定的名字。要提醒的是，如果你的主机支持使用ImageMagicK，会大幅度提高生成缩略图的速度，而且还能突破GD2的内存极限（GD2在我的主机上对付4096*4096的图就常常生成不了，另外有传闻说php5+Zend对GD2支持不好）。等表格的右边一栏中所有图片都显示完，在右上角选择你要加入这些图片的相册，点击确定，则开始写入数据库的工作。每一个图片成功加入后，表格右边会显示OK，这与上一步是速度差不多的过程，我一般添加100多幅漫画要2-3分钟不等。等全部都显示出OK的图样后，就完成了批量上传，去相册目录看看吧。
　　五、管理功能
　　这里是进行批量的数据库处理的界面，可以批量更新图片的信息、批量重新生成缩略图，这对于更改过缩略图设置的人来说非常有用，所有旧的图片的缩略图也将按照你的新设置重新生成一遍。其他功能也都写得很清楚，就不详述了。
　　六、会员模式
　　普通会员的功能，大致包括向自己的相册上传图片，向允许上传的功用相册上传图片等。这些上传方式与普通的相册系统、论坛系统都差别不大，而普通会员的相册管理功能其实就是简化了的管理员的管理界面，就不再介绍了。
　　还是做个广告，大家可以到photo.williamgates.biz去看这样经过多层分类的相册系统，如果在使用中有什么不懂的可以给我留言，我发现CPG的中文材料实在是太少了，只有一两个中文论坛以及官方论坛中的中文版面，内容都不太多。
　　下次将真正进入有技术含量的部分，介绍mod和plugin以及我使用并且修改过的几个Mod。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　第一眼看到CPG的界面，会觉得像一个论坛，这也是它的多层分类的结构决定的。与一些相册网站不同，CPG可以有无限级的分类，这样就如同与一个论坛有诸多版面，版面还有子版面，等等。理解了这个概念，我们才能开始日常的管理和使用。<br />
　　作为管理员登录CPG的时候，有两种模式，一种是让你观看普通会员的界面的会员模式，另一种则是默认的管理模式，只有在管理模式才可以看到类别、相册、会员等管理按钮。下面主要就来讲讲这些管理功能。<br />
<span id="more-132"></span><br />
　　一、类别<br />
　　要上传图片，要选择所传到的相册；要建立相册，首先要建立类别。在“类别”菜单中，我们可以建立、修改类别，还可以修改类别在页面中显示的顺序，还可以修改类别的详细属性（点击类别后面的“e”图标），其中很重要的一点是类别缩略图，是该类别显示时的标题缩略图，如果不想你的类别是自动的最后一幅上传图作为标题图，就自己修改一下吧。</p>
<p>　　二、相册<br />
　　在此界面建立和修改相册。先选择一个类别，会显示出其下现有的相册。点新增，然后在下面的文本框输入相册名，把所有的相册都建立和修改好，再点修改，这样比较方便。注意，普通会员不能建立相册更不能建立分类，只能上传到管理员预先建好的相册（须打开群设置中的“允许公用相册上传”，并且该特定的相册必须在属性中“允许访客上传图片”）或者会员自己所有的相册中。</p>
<p>　　三、用户管理<br />
　　群、会员、限制会员这三项都是用来进行用户管理的，第一个“群”应该译作“用户组”更为合适。在这里你可以修改各个用户组的设置，其中默认的四个组是不能被删除的；空间配额可以决定该组可以上传的所有图片总容量；上传方法中的字段数量表示一次可以上传多少个文件。会员界面也是大概的用法，把组和会员的关系刚好理解为分类与相册的关系就好了。</p>
<p>　　四、批量上传<br />
　　这可能是最常用的功能之一了，因为除非你拥有很快的网络速度，并且要传的图片不太多，否则用普通的上传功能是非常麻烦的。在这里首先要说一说CPG的文件管理结构，CPG的数据库记录加入其中的图片的路径，而具体图片怎样存放是用户管理的。默认所有的相册都在CPG自己目录下的albums目录下，其中userpics目录是默认的用户个人相册的目录，而我在albums目录下又自己建了一个albums目录，用来存放公用相册。个人建议严格地按照你的类型、相册的结构来布置文件夹结构，另外注意尽量不要使用双字节目录名（中文、日文都不可以）。<br />
　　建好目录结构之后，向欲存放某相册的目录上传这个相册的所有文件，然后到CPG中点击批量上传（只有管理员才有此功能），会出现你CPG目录下的目录结构，一层层找到你刚刚上传的目录（不用选择任何文件），点击OK，就开始自动建立图片的缩略图和中型图（这两者的设置请见<a href="http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/">上一篇文章</a>）缩略图和中型图都保存在原图同样的目录下，有设置项里规定的名字。要提醒的是，如果你的主机支持使用ImageMagicK，会大幅度提高生成缩略图的速度，而且还能突破<a href="http://www.boutell.com/gd/">GD2</a>的内存极限（GD2在我的主机上对付4096*4096的图就常常生成不了，另外有传闻说php5+Zend对GD2支持不好）。等表格的右边一栏中所有图片都显示完，在右上角选择你要加入这些图片的相册，点击确定，则开始写入数据库的工作。每一个图片成功加入后，表格右边会显示OK，这与上一步是速度差不多的过程，我一般添加100多幅漫画要2-3分钟不等。等全部都显示出OK的图样后，就完成了批量上传，去相册目录看看吧。</p>
<p>　　五、管理功能<br />
　　这里是进行批量的数据库处理的界面，可以批量更新图片的信息、批量重新生成缩略图，这对于更改过缩略图设置的人来说非常有用，所有旧的图片的缩略图也将按照你的新设置重新生成一遍。其他功能也都写得很清楚，就不详述了。</p>
<p>　　六、会员模式<br />
　　普通会员的功能，大致包括向自己的相册上传图片，向允许上传的功用相册上传图片等。这些上传方式与普通的相册系统、论坛系统都差别不大，而普通会员的相册管理功能其实就是简化了的管理员的管理界面，就不再介绍了。</p>
<p>　　还是做个广告，大家可以到<a href="http://photo.williamgates.biz">photo.williamgates.biz</a>去看这样经过多层分类的相册系统，如果在使用中有什么不懂的可以给我留言，我发现CPG的中文材料实在是太少了，只有一两个中文论坛以及官方论坛中的中文版面，内容都不太多。<br />
　　下次将真正进入有技术含量的部分，介绍mod和plugin以及我使用并且修改过的几个Mod。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/04/coppermine-photo-gallery-03/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>升级WordPress到2.5</title>
		<link>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/</link>
		<comments>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 13:04:48 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[折腾]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/?p=131</guid>
		<description><![CDATA[　　我们可爱可恨的主机商终于解决了MySQL的问题，他们终于肯掏钱往集群里填服务器了……连续大概一个月的巨慢速度终于告别，我也可以升级WordPress了。
　　其实这个Blog的WordPress是在主机速度最慢的时候升级的，另一个Blog才是今天升级的。具体升级步骤我就不说了，网上到处都是，把两次升级的经验并在一起说说吧。
　　一、修改文件
　　解决中文Tag支持的mod依然可用（也就是说WordPress依然不准备解决这个问题），即修改wp-includes目录下的rewrite.php中的 function get_tag_permastruct() 中的

if &#40;empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123;

改为

if &#40;!empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123;

　　我自创的“让text widget在标题中显示图标”，需要有一些改变：

wp-includes目录下的widgets.php中的 function wp_widget_text_control($widget_args) 中的

$title = strip_tags&#40;stripslashes&#40;$widget_text&#91;'title'&#93;&#41;&#41;;

改为

$title = stripslashes&#40;$widget_text&#91;'title'&#93;&#41;;

而把这句

$title = attribute_escape&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;;

改为

$title = format_to_edit&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;;

　　可以看出来，函数的参数和语句都与2.3.3不同了。
　　二、自动升级插件
　　这个插件叫做wordpress-automatic-upgrade，它可以大幅度简化你升级WordPress的过程，对我们这种上传下载都缓慢的国内用户更是如此。
　　它的全部操作都在WordPress的控制面板中完成，只要激活该插件，然后在Manage的wordpress automatic upgrade项里一直点下一步就好了。它会自动备份好你的文件、数据库并提供链接给你下载；会自动禁用你的所有插件、关闭你的blog并且自动下载最新版本的wordpress，更新所有的文件，最后恢复所有的插件和被暂时关闭的blog。一切都按照指引做就好了，完全不用从FTP上传下载任何东西，非常方便快捷。
　　要注意的是，它的备份文件功能只备份WordPress本身的文件，也就是说不包括content目录。你自己上传的插件、图片和其他内容还请自己下载备份。
　　好了，来享用你的WP 2.5吧，我觉得最好用的功能是插件自动升级和tag管理，另外后台管理界面的大变脸让人觉得很不错，并且后台似乎也加上了一定的缓存，可能是SQL查询缓存等，后台的速度和整个网站的速度都有一定提高。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　我们可爱可恨的主机商终于解决了MySQL的问题，他们终于肯掏钱往集群里填服务器了……连续大概一个月的巨慢速度终于告别，我也可以升级WordPress了。<br />
　　其实这个Blog的WordPress是在主机速度最慢的时候升级的，另一个Blog才是今天升级的。具体升级步骤我就不说了，网上到处都是，把两次升级的经验并在一起说说吧。</p>
<p>　　一、修改文件<br />
　　解决中文Tag支持的mod依然可用（也就是说WordPress依然不准备解决这个问题），即修改wp-includes目录下的rewrite.php中的 <code>function get_tag_permastruct()</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>　　我自创的<a href="http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/">“让text widget在标题中显示图标”</a>，需要有一些改变：<br />
<span id="more-131"></span><br />
wp-includes目录下的widgets.php中的 <code>function wp_widget_text_control($widget_args)</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$widget_text</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$widget_text</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>而把这句</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> attribute_escape<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> format_to_edit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　可以看出来，函数的参数和语句都与2.3.3不同了。</p>
<p>　　二、自动升级插件<br />
　　这个插件叫做<a href="http://wordpress.org/extend/plugins/wordpress-automatic-upgrade/">wordpress-automatic-upgrade</a>，它可以大幅度简化你升级WordPress的过程，对我们这种上传下载都缓慢的国内用户更是如此。<br />
　　它的全部操作都在WordPress的控制面板中完成，只要激活该插件，然后在Manage的wordpress automatic upgrade项里一直点下一步就好了。它会自动备份好你的文件、数据库并提供链接给你下载；会自动禁用你的所有插件、关闭你的blog并且自动下载最新版本的wordpress，更新所有的文件，最后恢复所有的插件和被暂时关闭的blog。一切都按照指引做就好了，完全不用从FTP上传下载任何东西，非常方便快捷。<br />
　　要注意的是，它的备份文件功能只备份WordPress本身的文件，也就是说不包括content目录。你自己上传的插件、图片和其他内容还请自己下载备份。</p>
<p>　　好了，来享用你的WP 2.5吧，我觉得最好用的功能是插件自动升级和tag管理，另外后台管理界面的大变脸让人觉得很不错，并且后台似乎也加上了一定的缓存，可能是SQL查询缓存等，后台的速度和整个网站的速度都有一定提高。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/04/update-wordpress-to-ver25/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>虚拟主机空间打开Zend Optimizer的相关问题</title>
		<link>http://blog.williamgates.biz/2008/03/enable-zend-optimizer-for-website-host/</link>
		<comments>http://blog.williamgates.biz/2008/03/enable-zend-optimizer-for-website-host/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 04:48:38 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[IPowerWeb]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/03/23/130</guid>
		<description><![CDATA[　　还记得我在这篇文章里提到过IPowerWeb的空间不支持php5打开Zend Optimizer么？现在看起来是我搞错了，但是IPowerWeb给的默认值是不打开Zend Optimizer的，就是因为这一点害得我研究了半天。
　　首先，由于IPowerWeb的MySQL主机前一段时间的问题，数据库访问慢得要命，我不得不把环境换成php5，换上WordPress的mysqli数据库连接，于是我面临在php5下面打开Zend Optimizer的挑战。挑战在于，由于服务商没有提供默认打开Zend Optimizer的配置文件，我根本不知道Zend Optimizer的路径……

　　首先，尝试用php4环境下的IPower提供的默认配置文件，内容是

&#91;Zend&#93;
zend_optimizer.optimization_level=15
zend_optimizer.encoder_loader=0
zend_extension_manager.optimizer=/usr/local/Zend/Zend-2.5.7/lib/Optimizer-2.5.7
zend_extension_manager.optimizer_ts=/usr/local/Zend/Zend-2.5.7/lib/Optimizer_TS-2.5.7
zend_extension=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager_TS.so

　　从phpinfo的显示来看，似乎是成功了，但是总觉得不爽，总觉得哪里有问题。
　　突然想到一招，用phpspy可以看到自己主机空间的其他目录，而不是被chroot在自己的根目录里。果然，进入/usr/local/Zend/，看到Zend-2.5.7，Zend-2.6.2，lib等目录。进入lib，发现有各个版本的Optimizer目录，这些目录下还有对应不同php版本的目录。于是就简单了，查一查zend_extension和zend_extension_manager.optimizer这两个设置项的含义就明白了，zend_extension是为了引用extension_manager，而zend_extension_manager.optimizer指示extension_manager调用Zend Optimizer。于是我写上

&#91;Zend&#93;
zend_optimizer.optimization_level=511
zend_optimizer.encoder_loader=0
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.2.0
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.2.0

　　那个511是我个人觉得合适的值，这个值的含义很容易搜到，就不详述了。注意zend_extension_manager.optimizer不能写到具体的.so文件，只能写到相应版本的Optimizer目录，连下面的php版本对应的目录都不能写进去。
　　事实证明，IPowerWeb提供的php4环境下的默认值虽然能用，但也不如我上面这个来得好。上面这个对php4和5都通用。
　　最后你应该看到phpinfo里面有这样的内容（版本可能有不同）

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
　　with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies
　　with Zend Optimizer v3.2.0, Copyright (c) 1998-2006, by Zend Technologies

　　这样就大功告成了。
　　所以以后如果虚拟主机有什么扩展软件等需要查询安装地址（例如ImageMagicK），就用phpspy上到主机的根目录去查查路径就好了。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　还记得我在<a href="http://blog.williamgates.biz/2008/02/goodbye-icp-records-06/">这篇文章</a>里提到过IPowerWeb的空间不支持php5打开Zend Optimizer么？现在看起来是我搞错了，但是IPowerWeb给的默认值是不打开Zend Optimizer的，就是因为这一点害得我研究了半天。</p>
<p>　　首先，由于IPowerWeb的MySQL主机前一段时间的问题，数据库访问慢得要命，我不得不把环境换成php5，换上<a href="http://michaelshadle.com/category/development/wordpress/">WordPress的mysqli数据库连接</a>，于是我面临在php5下面打开Zend Optimizer的挑战。挑战在于，由于服务商没有提供默认打开Zend Optimizer的配置文件，我根本不知道Zend Optimizer的路径……<br />
<span id="more-130"></span><br />
　　首先，尝试用php4环境下的IPower提供的默认配置文件，内容是</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;"><span class="br0">&#91;</span>Zend<span class="br0">&#93;</span>
zend_optimizer.optimization_level=<span style="color: #cc66cc;">15</span>
zend_optimizer.encoder_loader=<span style="color: #cc66cc;">0</span>
zend_extension_manager.optimizer=/usr/local/Zend/Zend-2.5.7/lib/Optimizer-2.5.7
zend_extension_manager.optimizer_ts=/usr/local/Zend/Zend-2.5.7/lib/Optimizer_TS-2.5.7
zend_extension=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager_TS.so</pre></div></div>

<p>　　从phpinfo的显示来看，似乎是成功了，但是总觉得不爽，总觉得哪里有问题。</p>
<p>　　突然想到一招，用<a href="http://www.4ngel.net/project/phpspy.htm">phpspy</a>可以看到自己主机空间的其他目录，而不是被chroot在自己的根目录里。果然，进入/usr/local/Zend/，看到Zend-2.5.7，Zend-2.6.2，lib等目录。进入lib，发现有各个版本的Optimizer目录，这些目录下还有对应不同php版本的目录。于是就简单了，查一查zend_extension和zend_extension_manager.optimizer这两个设置项的含义就明白了，zend_extension是为了引用extension_manager，而zend_extension_manager.optimizer指示extension_manager调用Zend Optimizer。于是我写上</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;"><span class="br0">&#91;</span>Zend<span class="br0">&#93;</span>
zend_optimizer.optimization_level=<span style="color: #cc66cc;">511</span>
zend_optimizer.encoder_loader=<span style="color: #cc66cc;">0</span>
zend_extension=/usr/local/Zend/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/lib/ZendExtensionManager_TS.so
zend_extension_manager.optimizer=/usr/local/Zend/lib/Optimizer-3.2.0
zend_extension_manager.optimizer_ts=/usr/local/Zend/lib/Optimizer_TS-3.2.0</pre></div></div>

<p>　　那个511是我个人觉得合适的值，这个值的含义很容易搜到，就不详述了。注意zend_extension_manager.optimizer不能写到具体的.so文件，只能写到相应版本的Optimizer目录，连下面的php版本对应的目录都不能写进去。<br />
　　事实证明，IPowerWeb提供的php4环境下的默认值虽然能用，但也不如我上面这个来得好。上面这个对php4和5都通用。<br />
　　最后你应该看到phpinfo里面有这样的内容（版本可能有不同）</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
　　with Zend Extension Manager v1.0.11, Copyright (c) 2003-2006, by Zend Technologies
　　with Zend Optimizer v3.2.0, Copyright (c) 1998-2006, by Zend Technologies</pre></div></div>

<p>　　这样就大功告成了。</p>
<p>　　所以以后如果虚拟主机有什么扩展软件等需要查询安装地址（例如<a href="http://www.imagemagick.org">ImageMagicK</a>），就用phpspy上到主机的根目录去查查路径就好了。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/03/enable-zend-optimizer-for-website-host/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(二)部署与设置</title>
		<link>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/</link>
		<comments>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 07:10:03 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/03/08/128</guid>
		<description><![CDATA[　　从今天开始介绍我安装CPG（开发者自己喜欢用这个简称，我也乐得）和配置为己用的整个过程。先说基本的部署与配置（今天不涉及代码修改）。
　　一、部署
　　从sourceforge下载CPG，解压缩，全部上传至你的主机，把albums和include两个目录chmod为777（官方文档说这很重要，但是对于IPower这样脚本执行者权限很高的主机是无所谓的）。建好数据库，最后运行http://your_server/coppermine_dir/install.php这个页面进行安装。都是安装php程序常见的步骤，很简单。
　　二、设置
　　作为管理员登录后，可以看到比普通用户多出来的一层菜单，其中第一项就是“设定”。这个设置菜单异常庞杂（因为不像WordPress有多层设置页面，CPG只有这一个）。下面我们就来讲解一下设置，主要是对一些重要的、可能需要自定义的选项。

基本设定
请根据自己情况修改：相册名称，CPG 的网址，时区跟 GMT 的差别

语言 &#038; 编码设定
语言：Chinese_gb，注意对非IE浏览器可能默认语言无效，用户可能需要自己在页面上选择语言
如果翻译的字句不存在使用英文替回：请务必打开
文字编码：保持UTF-8不要改变
显示语言列表：建议打开，CPG的lang目录下的语言文件不用全部上传，上传你认为需要的即可，上传了的会显示在这个列表里

风格设定
风格：选择所用的theme，上传在CPG的themes目录，可以用前面提到的下载页面下载更多的theme
自定义的菜单连接/自定义菜单的网址：可以在菜单中添加自定义项，前者是显示的名称，后者是实际的URL，既可以是CPG系统内的链接（如链接向插件控制面板，默认这个面板只能手动在浏览器栏输入网址访问），也可以链接到其他的网站，例如其他的附属站点
自定义标头的路径/自定义页尾的路径：可以在页首和页尾插入自定义html内容，最常见的用法应该是放置广告

相册目录显示
类别显示的层次数量：“catalist”也就是”类别“这个table里面显示的分类层次，例如我的相册这个值就是3，显示3层分类级别
缩略图像素：显示缩略图的框子的大小，取长宽中的较大者。这个值推荐跟下面要提到的生成缩略图的像素一样
主页的内容：自定义主体table中的内容，例如类别列表，相册列表，随机图片，热门图片等等。其中“anycontent”可以用于显示你自己所需要的内容（事先保存好的“anycontent.php”文件），最常见的用法仍然是广告，但是不能用于单张图片浏览界面，所以我干脆采用了另一种方法加入广告，在这个系列以后的文章中会提到

图片及缩略图设定
缩略图最大尺寸：生成缩略图时的最大尺寸（长宽中较大者），不同于前面的显示尺寸
建立中级图片：是否生成Normal文件，即中型图（类似于Yupoo等网站的功能），对于像我这样要传大型图片的使用还是很方便的，在其他论坛分享或者在相册中浏览的时候使用中型图，点击进入才能看到原图，这样速度和效果都能达到最好
中级图片/影片的最大尺寸：我把这里设成了1024，这样直接在论坛贴中型图地址就可以了，很方便

　　通过以上的修改，你的CPG应该就可以正常使用了。下一篇将讲解上传、修改和管理图片等日常功能。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　从今天开始介绍我安装CPG（开发者自己喜欢用这个简称，我也乐得）和配置为己用的整个过程。先说基本的部署与配置（今天不涉及代码修改）。</p>
<p>　　一、部署<br />
　　从<a href="http://sourceforge.net/project/showfiles.php?group_id=89658">sourceforge</a>下载CPG，解压缩，全部上传至你的主机，把albums和include两个目录chmod为777（官方文档说这很重要，但是对于IPower这样脚本执行者权限很高的主机是无所谓的）。建好数据库，最后运行http://your_server/coppermine_dir/install.php这个页面进行安装。都是安装php程序常见的步骤，很简单。</p>
<p>　　二、设置<br />
　　作为管理员登录后，可以看到比普通用户多出来的一层菜单，其中第一项就是“设定”。这个设置菜单异常庞杂（因为不像WordPress有多层设置页面，CPG只有这一个）。下面我们就来讲解一下设置，主要是对一些重要的、可能需要自定义的选项。<br />
<span id="more-128"></span></p>
<ul>基本设定</p>
<li>请根据自己情况修改：相册名称，CPG 的网址，时区跟 GMT 的差别</li>
</ul>
<ul>语言 &#038; 编码设定</p>
<li>语言：Chinese_gb，注意对非IE浏览器可能默认语言无效，用户可能需要自己在页面上选择语言</li>
<li>如果翻译的字句不存在使用英文替回：请务必打开</li>
<li>文字编码：保持UTF-8不要改变</li>
<li>显示语言列表：建议打开，CPG的lang目录下的语言文件不用全部上传，上传你认为需要的即可，上传了的会显示在这个列表里</li>
</ul>
<ul>风格设定</p>
<li>风格：选择所用的theme，上传在CPG的themes目录，可以用前面提到的下载页面下载更多的theme</li>
<li>自定义的菜单连接/自定义菜单的网址：可以在菜单中添加自定义项，前者是显示的名称，后者是实际的URL，既可以是CPG系统内的链接（如链接向插件控制面板，默认这个面板只能手动在浏览器栏输入网址访问），也可以链接到其他的网站，例如其他的附属站点</li>
<li>自定义标头的路径/自定义页尾的路径：可以在页首和页尾插入自定义html内容，最常见的用法应该是放置广告</li>
</ul>
<ul>相册目录显示</p>
<li>类别显示的层次数量：“catalist”也就是”类别“这个table里面显示的分类层次，例如我的相册这个值就是3，显示3层分类级别</li>
<li>缩略图像素：显示缩略图的框子的大小，取长宽中的较大者。这个值推荐跟下面要提到的生成缩略图的像素一样</li>
<li>主页的内容：自定义主体table中的内容，例如类别列表，相册列表，随机图片，热门图片等等。其中“anycontent”可以用于显示你自己所需要的内容（事先保存好的“anycontent.php”文件），最常见的用法仍然是广告，但是不能用于单张图片浏览界面，所以我干脆采用了另一种方法加入广告，在这个系列以后的文章中会提到</li>
</ul>
<ul>图片及缩略图设定</p>
<li>缩略图最大尺寸：生成缩略图时的最大尺寸（长宽中较大者），不同于前面的显示尺寸</li>
<li>建立中级图片：是否生成Normal文件，即中型图（类似于Yupoo等网站的功能），对于像我这样要传大型图片的使用还是很方便的，在其他论坛分享或者在相册中浏览的时候使用中型图，点击进入才能看到原图，这样速度和效果都能达到最好</li>
<li>中级图片/影片的最大尺寸：我把这里设成了1024，这样直接在论坛贴中型图地址就可以了，很方便</li>
</ul>
<p>　　通过以上的修改，你的CPG应该就可以正常使用了。下一篇将讲解上传、修改和管理图片等日常功能。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/03/coppermine-photo-gallery-02/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>一个优秀的php相册系统——Coppermine Photo Gallery(一)基本介绍</title>
		<link>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/</link>
		<comments>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/#comments</comments>
		<pubDate>Sat, 23 Feb 2008 15:32:24 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[CPG]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/23/127</guid>
		<description><![CDATA[　　有了限制较少的虚拟主机，就琢磨着搞一个php的相册系统玩玩。经过在SF上查找比对，找到一个符合我要求的：Coppermine Photo Gallery。
基本架构/系统要求：
PHP (4.1.0 or better)
MySQL (3.23.23 or better; 4.x recommended)
either GD or ImageMagick (any version)

基本特性：	
自动生成缩略图、缩略图可设置大小、中型图功能（中等大小的预览图，非常有用）
多种上传方式，可以FTP批量上传再用网页导入，也可以上传压缩包
强大的皮肤、模板和自定义显示功能，页面上每个元素都可以轻松用配置文件修改
相册无限层分类
多用户，权限、组功能
公开、私人相册，密码保护相册
多语言，包括中文
支持多种媒体格式，包括视频
留言、投票、评分系统
对收藏的图片批量打包下载

　　还有重要的一点是较为广泛的用户群，产生了较多的mod、plugin，有些非常有用（这个系列的后续文章会介绍）。
　　我最看重的功能包括批量上传、自定义缩略图大小、中型图功能（对于论坛贴图，贴中型图，链接到原图，是非常好的方式，类似于yupoo等网站的分享功能）、中文界面、多用户（包括权限、组、密码保护相册等）。
　　今天就这么简单一说吧，明天再来详细介绍安装部署和一些修改技巧。大家可以到我的相册photo.williamgates.biz来看看效果


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　有了限制较少的虚拟主机，就琢磨着搞一个php的相册系统玩玩。经过在SF上查找比对，找到一个符合我要求的：<a href="http://coppermine-gallery.net/">Coppermine Photo Gallery</a>。
<ul>基本架构/系统要求：</p>
<li>PHP (4.1.0 or better)</li>
<li>MySQL (3.23.23 or better; 4.x recommended)</li>
<li>either GD or ImageMagick (any version)</li>
</ul>
<ul>基本特性：	</p>
<li>自动生成缩略图、缩略图可设置大小、<strong>中型图功能</strong>（中等大小的预览图，非常有用）</li>
<li>多种上传方式，可以<strong>FTP批量上传</strong>再用网页导入，也可以上传压缩包</li>
<li>强大的<strong>皮肤、模板</strong>和自定义显示功能，页面上每个元素都可以轻松用配置文件修改</li>
<li>相册无限层分类</li>
<li>多用户，权限、组功能</li>
<li>公开、<strong>私人相册，密码保护相册</strong></li>
<li>多语言，包括<strong>中文</strong></li>
<li>支持多种媒体格式，包括视频</li>
<li>留言、投票、评分系统</li>
<li>对收藏的图片批量打包下载</li>
</ul>
<p>　　还有重要的一点是较为广泛的用户群，产生了较多的mod、plugin，有些非常有用（这个系列的后续文章会介绍）。<br />
　　我最看重的功能包括批量上传、自定义缩略图大小、中型图功能（对于论坛贴图，贴中型图，链接到原图，是非常好的方式，类似于yupoo等网站的分享功能）、中文界面、多用户（包括权限、组、密码保护相册等）。<br />
　　今天就这么简单一说吧，明天再来详细介绍安装部署和一些修改技巧。大家可以到我的相册<a href="http://photo.williamgates.biz/">photo.williamgates.biz</a>来看看效果</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/coppermine-photo-gallery-01/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>巧用FTPRush删除Linux主机上的乱码文件</title>
		<link>http://blog.williamgates.biz/2008/02/use-ftprush-to-delete-files-with-chaos-code-name/</link>
		<comments>http://blog.williamgates.biz/2008/02/use-ftprush-to-delete-files-with-chaos-code-name/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 07:59:40 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/03/124</guid>
		<description><![CDATA[　　如你所知，折腾的人永远有折腾得的事情好做，比如我今天想要试试看IPower的解压功能，一不小心解了一个中文名的文件到了用户根目录，解压出文件权限是644，文件名是一堆乱码……用FTPRush删除无效，重命名无效，移动也无效；PhpSpy的文件管理功能删除、重命名、移动也全都无效。
　　网上搜索Linux下删除乱码文件的方法，内容一大堆，但无一不需要使用Shell；唯一我可以使用的办法，就是用PhpSpy执行命令，用输入输出重定向来把ls输出的文件名直接导给rm命令；但是怎么试验都不成功，毕竟我只能执行一行命令，没法用vi（需要编辑ls生成的文件）。后来偶然看到有人说FTP可以删除，我试过了没用啊？难道有什么地方忽略了？
　　我突然想到我的FTPRush是Unicode版的，而FTPRush的列表命令有一个编码的选择。打开工具-站点管理窗口-双击你的站点-目录列表方式-站点目录的字符集-选择WE/latin1(850)（大部分没有设置过locale的主机应该是这样），然后再登录FTP，发现乱码变了样子；删除之，一下子就成功了！
　　结论：用FTP方式可以删除大部分乱码文件，除非有真正的系统不能接受的字符；但是删除的时候要确保你列出的文件名是正确的，这时候就需要把列表方式的编码设置正确。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　如你所知，折腾的人永远有折腾得的事情好做，比如我今天想要试试看IPower的解压功能，一不小心解了一个中文名的文件到了用户根目录，解压出文件权限是644，文件名是一堆乱码……用FTPRush删除无效，重命名无效，移动也无效；<a href="http://www.4ngel.net/project/phpspy.htm">PhpSpy</a>的文件管理功能删除、重命名、移动也全都无效。<br />
　　网上搜索Linux下删除乱码文件的方法，内容一大堆，但无一不需要使用Shell；唯一我可以使用的办法，就是用<a href="http://www.4ngel.net/project/phpspy.htm">PhpSpy</a>执行命令，用输入输出重定向来把ls输出的文件名直接导给rm命令；但是怎么试验都不成功，毕竟我只能执行一行命令，没法用vi（需要编辑ls生成的文件）。后来偶然看到有人说FTP可以删除，我试过了没用啊？难道有什么地方忽略了？<br />
　　我突然想到我的FTPRush是Unicode版的，而FTPRush的列表命令有一个编码的选择。打开<strong>工具</strong>-<strong>站点管理窗口</strong>-双击你的站点-<strong>目录列表方式</strong>-<strong>站点目录的字符集</strong>-选择<strong>WE/latin1(850)</strong>（大部分没有设置过locale的主机应该是这样），然后再登录FTP，发现乱码变了样子；删除之，一下子就成功了！<br />
　　结论：用FTP方式可以删除大部分乱码文件，除非有真正的系统不能接受的字符；但是删除的时候要确保你列出的文件名是正确的，这时候就需要把列表方式的编码设置正确。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/use-ftprush-to-delete-files-with-chaos-code-name/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>再见了,ICP备(六)虚拟主机的其他应用以及与IPowerWeb空间的php.ini相关的各种问题</title>
		<link>http://blog.williamgates.biz/2008/02/goodbye-icp-records-06/</link>
		<comments>http://blog.williamgates.biz/2008/02/goodbye-icp-records-06/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 06:45:27 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[IPowerWeb]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/01/121</guid>
		<description><![CDATA[　　买了虚拟主机，除了放Blog，还可以做些什么用？IPowerWeb的空间看起来还不错，用起来有哪些毛病，怎么解决？下面我们来讲这些问题。
　　一、虚拟主机的其他应用
　　除了Blog，php空间当然可以有点别的用处，比如：
　　1、网盘
　　1500G容量的空间，当然可以用来存放点东西，但是php下的网盘程序或者是文件分享程序（区别在于是否提供提取码，供别人下载），基本上没有特别著名和权威的。
　　如果要用有提取码的，我推荐使用“拓网文件上传共享系统V1.0”（该公司现在似乎已经遗忘了这个php产品，已经全面转向asp产品了），这个东西的免费版可以从网上随意下到，但是不支持用户管理（也就是谁都可以上传，建议在上传页面用.htaccess文件设一个密码）。它提供了上传、管理文件和提取码的功能。
　　如果只是要一个自己保存文件的东西，这个更适合：Uploader，搜索“Uploader Samoa汉化版”即可下载到。这个提供了用户管理，但是不提供给别人下载的功能，只是自己使用而已；但是你可以通过直接提供地址、或者使用WordPress的WP-DownloadManager插件来实现类似于提取的下载。
　　注意，要上传文件，请确保php.ini中的file_uploads为ON，并且以下几项最好达到或者超过我所说的数值：

max_execution_time = 600
max_input_time = 180
memory_limit = 64M
post_max_size = 210M
upload_max_filesize = 200M

　　2、WebFTP
　　顾名思义就是在网页上使用的FTP软件，但是我高估了它的作用，以为”保存到本地“的功能意味着可以”保存到服务器“，结果在服务器上安装之后，发现还是只能下载到我的电脑上，实现”从一台服务器下载另一台服务器的文件“还需要别的方法（下面会说）。
　　虽然如此，但精致的界面和功能还是让我想要推荐一下这个软件：net2ftp，我觉得其实可以在校园网或者单位内网安装这个东西，可以省去大部分人使用FTP客户端的麻烦。

　　3、文件转移
　　我想从英国的主机商那里把我以前上传的一些文件转移过来（好几G，下载到本地再上传到美国估计要几天时间），条件是：

两台主机之间对传很快，控制者（我）进行中转则很慢
两者的FTP都不支持FXP
两者都是php空间，所有的文件都可以通过http或者FTP来下载
两者都不提供SSH

　　这种时候应该怎么让做呢？首先想到的是上面那个网页FTP，但是不如人愿；然后想到的是利用Cron来调用wget，但是IPower控制面板中的Cron似乎在权限上做了一点限制（或者是我不会用吧），未能成功；第三想到的是利用php调用系统命令，或者php自己的下载功能来下载，但我是php代码盲，看懂一半还行，写几乎一句都写不出来，所以决定上网寻找已经做好的工具……还真有
　　（1）Rapidget（也叫a2b)
　　这个玩意明确写着唯一的功能就是在一个服务器上，从另一个服务器下载文件……非常小巧，但做得很不错，能自己选择保存路径、能使用代理、还有进度条，唯一的问题是它是基于php的自身函数来下载文件的，所以受php.ini中文件大小、运行时间和内存等的限制。由于网上已经很难下载到，连作者都不提供下载了，所以我放上来给大家。
　　（2）PhpSpy
　　这是一个php后门程序，可以管理文件，最重要的是可以执行命令。所以把这个程序上传，并且上传一个URL.dat的要下载文件的文件名列表（用FTPRush在源FTP上列出），用

wget -i URL.dat -B http://Example.com/example/

　　就好了，其中-i表示从文件读取要下载的文件链接；-B从文件读取的链接需要加上前缀（因为我在URL.dat里只放了文件名）。这个方法比前一个方法更适合于下载大量文件，而且由于调用系统命令，不受php的内存等限制。但过于多的文件还是要考虑超时问题，建议把php.ini中的超时设长一点，并且以此不要下载太多的文件。下载地址http://www.4ngel.net/
　　我就是用了这第二种方法，一个小时不到就把4G多的文件转移过来了。两者之间对传的速度超过2M/s（Rapidget测的）。
　　当然，php空间可以装论坛、CMS等各种玩意，这些东西网上广为流传，我这里就不介绍了。
　　二、IPowerWeb空间的Bug
　　1、Zend问题
　　我知道旧版本的Zend和php5不兼容，所以当你选择php版本为php5的时候，默认的php.ini文件中没有Zend一项，而且IPower提供的Zend模块也不够新，加上了Zend的内容估计也不能运行。
　　但是php4默认不开Zend也太不够厚道了，但是当你选了php5再改回php4的时候，默认的文件就有Zend这一项了，我也不知道怎么搞的……反正无论如何，如果你发现自己的站点没有打开Zend，在php.ini的末尾加入以下内容（路径仅适用于IPowerWeb的虚拟主机，其他空间请自行修改路径）

&#91;Zend&#93;
zend_optimizer.optimization_level=15
zend_extension_manager.optimizer=/usr/local/Zend/Zend-2.5.7/lib/Optimizer-2.5.7
zend_extension_manager.optimizer_ts=/usr/local/Zend/Zend-2.5.7/lib/Optimizer_TS-2.5.7
zend_extension=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager_TS.so

　　2、phpMyAdmin问题
　　IPowerWeb空间的瓶颈似乎在Web服务器和MySQL服务器之间的连接，从Web服务器登录数据库实在是缓慢，导致装在Web服务器中的phpMyAdmin（比如WordPress的WP-phpMyAdmin插件）几乎从来不能正常运行。我的建议是：一、用IPower控制面板中的那个phpMyAdmin，反正默认都是UTF8，用起来也没啥问题；二、像我一样喜欢追求新版本的，请自行修改php.ini以提供够大的内存和够长的超时时间……(要修改的条目前面已经说过了）
　　3、Session问题
　　这是最致命的问题，当你装上我这里提到的Uploader，”拓网上传系统“和WP-phpMyAdmin之后会发现，前者如果不记录登陆状况就会自动跳出，后两者根本无法登陆，我仔细研究发现是session无法启用的问题。但是上网搜遍了，都说session问题是php.ini中配置的问题，但是这么专业的公司怎么会在默认配置文件中写错呢？
　　事实证明，不要迷信权威，要自己试验，我把[Session]节中的session.save_path由默认的var/tmp-sessions(好象是这个，忘了）改成了我在虚拟主机的web根目录下建的一个目录，并且把权限改为777，果然能用了！看来，要在IPower空间中使用session，请自行建立一个目录并且把完整地址（控制面板中左栏显示的很长的那个Linux下的完整地址）设为session.save_path。
　　至此，整个IPowerWeb空间已经搞定，我的Blog也运行自如了，最后一集是感慨和废话……敬请期待。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　买了虚拟主机，除了放Blog，还可以做些什么用？IPowerWeb的空间看起来还不错，用起来有哪些毛病，怎么解决？下面我们来讲这些问题。</p>
<p>　　一、虚拟主机的其他应用<br />
　　除了Blog，php空间当然可以有点别的用处，比如：</p>
<p>　　1、网盘<br />
　　1500G容量的空间，当然可以用来存放点东西，但是php下的网盘程序或者是文件分享程序（区别在于是否提供提取码，供别人下载），基本上没有特别著名和权威的。<br />
　　如果要用有提取码的，我推荐使用“拓网文件上传共享系统V1.0”（<a href="http://www.topwang.com/">该公司</a>现在似乎已经遗忘了这个php产品，已经全面转向asp产品了），这个东西的免费版可以从网上随意下到，但是不支持用户管理（也就是谁都可以上传，建议在上传页面用.htaccess文件设一个密码）。它提供了上传、管理文件和提取码的功能。<br />
　　如果只是要一个自己保存文件的东西，这个更适合：Uploader，搜索“Uploader Samoa汉化版”即可下载到。这个提供了用户管理，但是不提供给别人下载的功能，只是自己使用而已；但是你可以通过直接提供地址、或者使用WordPress的<a href="http://lesterchan.net/portfolio/programming.php">WP-DownloadManager</a>插件来实现类似于提取的下载。<br />
　　注意，要上传文件，请确保php.ini中的<code>file_uploads</code>为ON，并且以下几项最好达到或者超过我所说的数值：</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;">max_execution_time = <span style="color: #cc66cc;">600</span>
max_input_time = <span style="color: #cc66cc;">180</span>
memory_limit = 64M
post_max_size = 210M
upload_max_filesize = 200M</pre></div></div>

<p>　　2、WebFTP<br />
　　顾名思义就是在网页上使用的FTP软件，但是我高估了它的作用，以为”保存到本地“的功能意味着可以”保存到服务器“，结果在服务器上安装之后，发现还是只能下载到我的电脑上，实现”从一台服务器下载另一台服务器的文件“还需要别的方法（下面会说）。<br />
　　虽然如此，但精致的界面和功能还是让我想要推荐一下这个软件：<a href="http://www.net2ftp.com/">net2ftp</a>，我觉得其实可以在校园网或者单位内网安装这个东西，可以省去大部分人使用FTP客户端的麻烦。<br />
<span id="more-121"></span><br />
　　3、文件转移<br />
　　我想从英国的主机商那里把我以前上传的一些文件转移过来（好几G，下载到本地再上传到美国估计要几天时间），条件是：
<ul>
<li>两台主机之间对传很快，控制者（我）进行中转则很慢</li>
<li>两者的FTP都不支持FXP</li>
<li>两者都是php空间，所有的文件都可以通过http或者FTP来下载</li>
<li>两者都不提供SSH</li>
</ul>
<p>　　这种时候应该怎么让做呢？首先想到的是上面那个网页FTP，但是不如人愿；然后想到的是利用Cron来调用wget，但是IPower控制面板中的Cron似乎在权限上做了一点限制（或者是我不会用吧），未能成功；第三想到的是利用php调用系统命令，或者php自己的下载功能来下载，但我是php代码盲，看懂一半还行，写几乎一句都写不出来，所以决定上网寻找已经做好的工具……还真有<br />
　　（1）Rapidget（也叫a2b)<br />
　　这个玩意明确写着唯一的功能就是在一个服务器上，从另一个服务器下载文件……非常小巧，但做得很不错，能自己选择保存路径、能使用代理、还有进度条，唯一的问题是它是基于php的自身函数来下载文件的，所以受php.ini中文件大小、运行时间和内存等的限制。由于网上已经很难下载到，连作者都不提供下载了，所以我放上来给大家。Note: There is a file embedded within this post, please visit this post to download the file.</p>
<p>　　（2）PhpSpy<br />
　　这是一个php后门程序，可以管理文件，最重要的是可以执行命令。所以把这个程序上传，并且上传一个URL.dat的要下载文件的文件名列表（用FTPRush在源FTP上列出），用</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-i</span> URL.dat <span style="color: #660033;">-B</span> http:<span style="color: #000000; font-weight: bold;">//</span>Example.com<span style="color: #000000; font-weight: bold;">/</span>example<span style="color: #000000; font-weight: bold;">/</span></pre></div></div>

<p>　　就好了，其中-i表示从文件读取要下载的文件链接；-B从文件读取的链接需要加上前缀（因为我在URL.dat里只放了文件名）。这个方法比前一个方法更适合于下载大量文件，而且由于调用系统命令，不受php的内存等限制。但过于多的文件还是要考虑超时问题，建议把php.ini中的超时设长一点，并且以此不要下载太多的文件。下载地址http://www.4ngel.net/<br />
　　我就是用了这第二种方法，一个小时不到就把4G多的文件转移过来了。两者之间对传的速度超过2M/s（Rapidget测的）。</p>
<p>　　当然，php空间可以装论坛、CMS等各种玩意，这些东西网上广为流传，我这里就不介绍了。</p>
<p>　　二、IPowerWeb空间的Bug<br />
　　1、Zend问题<br />
　　我知道旧版本的Zend和php5不兼容，所以当你选择php版本为php5的时候，默认的php.ini文件中没有Zend一项，而且IPower提供的Zend模块也不够新，加上了Zend的内容估计也不能运行。<br />
　　但是php4默认不开Zend也太不够厚道了，但是当你选了php5再改回php4的时候，默认的文件就有Zend这一项了，我也不知道怎么搞的……反正无论如何，如果你发现自己的站点没有打开Zend，在php.ini的末尾加入以下内容（路径仅适用于IPowerWeb的虚拟主机，其他空间请自行修改路径）</p>

<div class="wp_syntax"><div class="code"><pre class="xorg_conf" style="font-family:monospace;"><span class="br0">&#91;</span>Zend<span class="br0">&#93;</span>
zend_optimizer.optimization_level=<span style="color: #cc66cc;">15</span>
zend_extension_manager.optimizer=/usr/local/Zend/Zend-2.5.7/lib/Optimizer-2.5.7
zend_extension_manager.optimizer_ts=/usr/local/Zend/Zend-2.5.7/lib/Optimizer_TS-2.5.7
zend_extension=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager.so
zend_extension_ts=/usr/local/Zend/Zend-2.5.7/lib/ZendExtensionManager_TS.so</pre></div></div>

<p>　　2、phpMyAdmin问题<br />
　　IPowerWeb空间的瓶颈似乎在Web服务器和MySQL服务器之间的连接，从Web服务器登录数据库实在是缓慢，导致装在Web服务器中的phpMyAdmin（比如WordPress的WP-phpMyAdmin插件）几乎从来不能正常运行。我的建议是：一、用IPower控制面板中的那个phpMyAdmin，反正默认都是UTF8，用起来也没啥问题；二、像我一样喜欢追求新版本的，请自行修改php.ini以提供够大的内存和够长的超时时间……(要修改的条目前面已经说过了）</p>
<p>　　3、Session问题<br />
　　这是最致命的问题，当你装上我这里提到的Uploader，”拓网上传系统“和WP-phpMyAdmin之后会发现，前者如果不记录登陆状况就会自动跳出，后两者根本无法登陆，我仔细研究发现是session无法启用的问题。但是上网搜遍了，都说session问题是php.ini中配置的问题，但是这么专业的公司怎么会在默认配置文件中写错呢？<br />
　　事实证明，不要迷信权威，要自己试验，我把[Session]节中的session.save_path由默认的var/tmp-sessions(好象是这个，忘了）改成了我在虚拟主机的web根目录下建的一个目录，并且把权限改为777，果然能用了！看来，要在IPower空间中使用session，请自行建立一个目录并且把完整地址（控制面板中左栏显示的很长的那个Linux下的完整地址）设为session.save_path。</p>
<p>　　至此，整个IPowerWeb空间已经搞定，我的Blog也运行自如了，最后一集是感慨和废话……敬请期待。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/goodbye-icp-records-06/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>再见了,ICP备(五)WordPress的优化、修复、备份和其他技巧</title>
		<link>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/</link>
		<comments>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 05:09:44 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/02/01/120</guid>
		<description><![CDATA[　　经过前几篇的过程，现在的WordPress已经能正常使用了，但是也许我们还需要进一步优化一下，解决一些问题。
　　一、WordPress的非必要插件
　　主要是指对Blog进行美化或者SEO的插件，我用了以下几个：

All in One SEO Pack：通过自动修改你的页面title，自动添加meta等功能来实现搜索引擎优化
Google XML Sitemaps：通过自动生成XML Sitemaps（不仅仅针对Google）而对搜索引擎进行优化
WP-DownloadManager：非常强大的下载管理工具，我最喜欢的功能是可以随意添加服务器上存在的文件进行管理（从而不必通过http上传，FTP上传也可）；生成统一的下载页面等等

　　Blog的人气除了来自于朋友的访问，搜索引擎也是很重要的一点，我的Blog就常年有一半左右的访问来自Google的链接，主要关键字是Squid和百合驿站 :)
　　二、WordPress的复杂化
　　什么是复杂化，看到classicning的blog你就明白了……这里指的就是添加各种widgets，在WordPress 2.3中，通过后台管理方便地添加widgets已经是不需要任何技术的事情，但是你想不想让各网站的widgets以及你blog内置的widgets风格统一？请看几点注意事项：

　　1、内置>Javascript>Flash
　　对于web2.0网站，往往提供Flash和Javascript的widgets，但是由于新版本的Flash浏览器插件的安全设置，一般的嵌入方法会导致出现一层虚框，既影响美观又可能导致页面排版问题，而特殊的嵌入方法不仅麻烦，兼容也可能有一点点小问题。所以尽量使用内置的RSS widget达到你要的效果（如饭否就提供消息的RSS，直接用内置RSS widget读取最好），如果rss不能满足你的需要（例如饭否的“好友信息“，我现在用的就是），或者根本不提供rss（例如豆瓣），非要嵌入该网站自己的widget的时候，请尽量使用Javascript的版本。
　　2、注意网站widget的格式
　　很多网站（例如豆瓣）都提供了自定义widget的功能，这里要注意配置好自己的widget，要和sidebar风格协调统一，例如底色、长宽等。我现在的豆瓣插件就设置成尽量长宽和sidebar协调，看起来比classicning那个就要舒服一些……
　　3、修改代码让text widget显示图标
　　想像我一样让各个网站的图标显示在WordPress内置的text widget的标题中？请打开wp-includes下的widgets.php文件（建议用WordPress自己的编辑工具），修改这个函数 function wp_widget_text_control($number) 的内容，把

$newoptions&#91;$number&#93;&#91;'title'&#93; = strip_tags&#40;stripslashes&#40;$_POST&#91;&#34;text-title-$number&#34;&#93;&#41;&#41;;

改为

$newoptions&#91;$number&#93;&#91;'title'&#93; = stripslashes&#40;$_POST&#91;&#34;text-title-$number&#34;&#93;&#41;;

把

$title = attribute_escape&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;;

改为

$title = format_to_edit&#40;$options&#91;$number&#93;&#91;'title'&#93;&#41;;

　　试试看，在text widget的标题中，输入

&#60;img src='你的ico文件地址' /&#62; 你需要的标题（例如 ”WilliamGates的豆瓣”）

　　就可以显示图标了。图标可以通过用FireFox打开该网站，右键点击页面，选”查看页面信息“里面的”媒体“来获得。
　　三、WordPress的修复
　　昨天DlzM突然告诉我他的blog无法登陆了，进入后台管理就一片空白，页面无输出。我一开始怀疑是UTF8标题的问题（网上搜索都这么说），检查了所有的文件，都是WordPress原版，没有修改的痕迹。在数据库里把blog标题改成英文，也没有效果。DlzM坚持说是他的theme的问题，我就抱着试试看的心理，在数据库里把theme改成了default，没想到真的可以了。
　　国外的很多theme对中文的支持都有问题，而且据说现在开始流行在WordPress Theme中放置恶意代码的阴险行为，所以有人建议大家不要随意下载第三方Theme和Plugin……我的建议是，尽量到这个theme或者plugin的作者网站，或者wordpress.org去下载；下载来之后，看一看head.php里面有没有什么特别的代码，以防万一。
　　四、WordPress的备份
　　有了上次丢数据的惨痛经历，以后决定好好备份WordPress。备份方法有很多种，我推荐这几个一起使用：
　　1、WordPress Database Backup
　　这是一个WordPress的插件，主页在www.ilfilosofo.com/blog/wp-db-backup，它会自动加入WordPress的原始表，并且询问你是否要加入统一数据库下面的其他表（主要为其他插件自己建立的表，建议一起备份）；利用WordPress内建的Cron模块，可以定时备份（但有传言说这个功能有Bug，会导致莫名其妙的极高的CPU占用率，慎用）；可以选择备份文件是下载到本地、保存在服务器还是发到邮箱。个人建议手动备份，每个月一次就够了。
　　2、WordPress内建导出功能
　　WordPress自己的导出功能可以导出整个数据库中的文章、留言、分类和Blogroll为一个XML文件（WordPress称之为WXR），基本上和备份数据库差不多了；导入的时候是一个全新的干净的数据库，符合我的数据洁癖；一个特殊的应用是，在进行批量帖子修改（例如前面提到过的批量修改帖子内的链接）时，直接对这个文件进行查找替换就可以了，比数据库的修改要方便，也安全。另外就是编码问题上，比数据库容易修改，毕竟对一个文本文件彻底转编码比对一个数据库转编码要方便（数据库导出时如果就是乱码，很可能再也无法正确导入）。这个功能用起来很方便，建议每周备份。
　　3、phpMyAdmin的备份功能
　　这是最传统的方法，当然还有更传统的Dump命令，省省吧（在我以前的文章中提到过用命令的方式导出和导入数据库，特殊情况下必须用那样的方法）。我推荐用WP-phpMyAdmin插件来备份，虽然没有什么理论根据，但实践证明它备份出来的数据库是我以前诸次导入中最容易成功的。这个最麻烦，建议每次升级WordPress的时候备份，备份之后一定要在本地导入试试看，确保不是乱码再动手升级。
　　我知道这篇是这个系列中最没什么营养的……下一篇是IPower空间的一些固有问题和解决方案。


Related posts:人教版的秒速五厘米——80后共同的青春童话
]]></description>
			<content:encoded><![CDATA[<p>　　经过前几篇的过程，现在的WordPress已经能正常使用了，但是也许我们还需要进一步优化一下，解决一些问题。</p>
<p>　　一、WordPress的非必要插件<br />
　　主要是指对Blog进行美化或者SEO的插件，我用了以下几个：
<ul>
<li><a href="http://wp.uberdose.com/2007/03/24/all-in-one-seo-pack/">All in One SEO Pack</a>：通过自动修改你的页面title，自动添加meta等功能来实现搜索引擎优化</li>
<li><a href="http://www.arnebrachhold.de/redir/sitemap-home/">Google XML Sitemaps</a>：通过自动生成XML Sitemaps（不仅仅针对Google）而对搜索引擎进行优化</li>
<li><a href="http://lesterchan.net/portfolio/programming.php">WP-DownloadManager</a>：非常强大的下载管理工具，我最喜欢的功能是可以随意添加服务器上存在的文件进行管理（从而不必通过http上传，FTP上传也可）；生成统一的下载页面等等</li>
</ul>
<p>　　Blog的人气除了来自于朋友的访问，搜索引擎也是很重要的一点，我的Blog就常年有一半左右的访问来自Google的链接，主要关键字是Squid和百合驿站 :)</p>
<p>　　二、WordPress的复杂化<br />
　　什么是复杂化，看到<a href="http://www.classicning.com/blog/">classicning</a>的blog你就明白了……这里指的就是添加各种widgets，在WordPress 2.3中，通过后台管理方便地添加widgets已经是不需要任何技术的事情，但是你想不想让各网站的widgets以及你blog内置的widgets风格统一？请看几点注意事项：<br />
<span id="more-120"></span><br />
　　1、内置>Javascript>Flash<br />
　　对于web2.0网站，往往提供Flash和Javascript的widgets，但是由于新版本的Flash浏览器插件的安全设置，一般的嵌入方法会导致出现一层虚框，既影响美观又可能导致页面排版问题，而特殊的嵌入方法不仅麻烦，兼容也可能有一点点小问题。所以尽量使用内置的RSS widget达到你要的效果（如饭否就提供消息的RSS，直接用内置RSS widget读取最好），如果rss不能满足你的需要（例如<a href="http://www.fanfou.com">饭否</a>的“好友信息“，我现在用的就是），或者根本不提供rss（例如<a href="http://www.douban.com">豆瓣</a>），非要嵌入该网站自己的widget的时候，请尽量使用Javascript的版本。</p>
<p>　　2、注意网站widget的格式<br />
　　很多网站（例如豆瓣）都提供了自定义widget的功能，这里要注意配置好自己的widget，要和sidebar风格协调统一，例如底色、长宽等。我现在的豆瓣插件就设置成尽量长宽和sidebar协调，看起来比<a href="http://www.classicning.com/blog/">classicning</a>那个就要舒服一些……</p>
<p>　　3、修改代码让text widget显示图标<br />
　　想像我一样让各个网站的图标显示在WordPress内置的text widget的标题中？请打开wp-includes下的widgets.php文件（建议用WordPress自己的编辑工具），修改这个函数 <code>function wp_widget_text_control($number)</code> 的内容，把</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$newoptions</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">strip_tags</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;text-title-<span style="color: #006699; font-weight: bold;">$number</span>&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$newoptions</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;text-title-<span style="color: #006699; font-weight: bold;">$number</span>&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>把</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> attribute_escape<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$title</span> <span style="color: #339933;">=</span> format_to_edit<span style="color: #009900;">&#40;</span><span style="color: #000088;">$options</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$number</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>　　试试看，在text widget的标题中，输入</p>

<div class="wp_syntax"><div class="code"><pre class="html4strict" style="font-family:monospace;"><span style="color: #009900;">&lt;<span style="color: #000000; font-weight: bold;">img</span> <span style="color: #000066;">src</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">'你的ico文件地址'</span> <span style="color: #66cc66;">/</span>&gt;</span> 你需要的标题（例如 ”WilliamGates的豆瓣”）</pre></div></div>

<p>　　就可以显示图标了。图标可以通过用FireFox打开该网站，右键点击页面，选”查看页面信息“里面的”媒体“来获得。</p>
<p>　　三、WordPress的修复<br />
　　昨天<a href="http://www.dlzm.net">DlzM</a>突然告诉我他的blog无法登陆了，进入后台管理就一片空白，页面无输出。我一开始怀疑是UTF8标题的问题（网上搜索都这么说），检查了所有的文件，都是WordPress原版，没有修改的痕迹。在数据库里把blog标题改成英文，也没有效果。DlzM坚持说是他的theme的问题，我就抱着试试看的心理，在数据库里把theme改成了default，没想到真的可以了。<br />
　　国外的很多theme对中文的支持都有问题，而且据说现在开始流行在WordPress Theme中放置恶意代码的阴险行为，所以有人建议大家不要随意下载第三方Theme和Plugin……我的建议是，尽量到这个theme或者plugin的作者网站，或者wordpress.org去下载；下载来之后，看一看head.php里面有没有什么特别的代码，以防万一。</p>
<p>　　四、WordPress的备份<br />
　　有了上次丢数据的惨痛经历，以后决定好好备份WordPress。备份方法有很多种，我推荐这几个一起使用：<br />
　　1、WordPress Database Backup<br />
　　这是一个WordPress的插件，主页在<a href="http://www.ilfilosofo.com/blog/wp-db-backup">www.ilfilosofo.com/blog/wp-db-backup</a>，它会自动加入WordPress的原始表，并且询问你是否要加入统一数据库下面的其他表（主要为其他插件自己建立的表，建议一起备份）；利用WordPress内建的Cron模块，可以定时备份（但有传言说这个功能有Bug，会导致莫名其妙的极高的CPU占用率，慎用）；可以选择备份文件是下载到本地、保存在服务器还是发到邮箱。个人建议手动备份，每个月一次就够了。</p>
<p>　　2、WordPress内建导出功能<br />
　　WordPress自己的导出功能可以导出整个数据库中的文章、留言、分类和Blogroll为一个XML文件（WordPress称之为WXR），基本上和备份数据库差不多了；导入的时候是一个全新的干净的数据库，符合我的数据洁癖；一个特殊的应用是，在进行批量帖子修改（例如前面提到过的批量修改帖子内的链接）时，直接对这个文件进行查找替换就可以了，比数据库的修改要方便，也安全。另外就是编码问题上，比数据库容易修改，毕竟对一个文本文件彻底转编码比对一个数据库转编码要方便（数据库导出时如果就是乱码，很可能再也无法正确导入）。这个功能用起来很方便，建议每周备份。</p>
<p>　　3、phpMyAdmin的备份功能<br />
　　这是最传统的方法，当然还有更传统的Dump命令，省省吧（在我<a href="http://blog.williamgates.biz/2006/11/01/38">以前的文章</a>中提到过用命令的方式导出和导入数据库，特殊情况下必须用那样的方法）。我推荐用WP-phpMyAdmin插件来备份，虽然没有什么理论根据，但实践证明它备份出来的数据库是我以前诸次导入中最容易成功的。这个最麻烦，建议每次升级WordPress的时候备份，备份之后一定要在本地导入试试看，确保不是乱码再动手升级。</p>
<p>　　我知道这篇是这个系列中最没什么营养的……下一篇是IPower空间的一些固有问题和解决方案。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/07/the-end-of-pep-enlish/' rel='bookmark' title='Permanent Link: 人教版的秒速五厘米——80后共同的青春童话'>人教版的秒速五厘米——80后共同的青春童话</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/02/goodbye-icp-records-05/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>再见了,ICP备(四)恢复Blog数据和修正域名指向</title>
		<link>http://blog.williamgates.biz/2008/01/goodbye-icp-records-04/</link>
		<comments>http://blog.williamgates.biz/2008/01/goodbye-icp-records-04/#comments</comments>
		<pubDate>Wed, 30 Jan 2008 15:14:29 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[IPowerWeb]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/01/30/119</guid>
		<description><![CDATA[　　昨天说到安装配置好了WordPress，下一步的工作就是尽量恢复原来的数据了。DlzM选择了重新开始一个全新的blog，而我也觉得原来的数据库非常混乱（我有数据洁癖），决定手工添加旧文章，至于以前的留言……再说吧。
　　一、恢复Blog数据
　　1、文章
　　数据库备份下来的部分，在本地开一个Apache+MySQL，装上WordPress就能看到了。我不仅没有用数据库导入的功能，而且也不想用WordPress自身的导入功能，因为上次备份的WordPress版本太旧，我不想升级数据库那样折腾（不要问我为什么，我有数据洁癖）。当然最主要的原因是我希望把所有的文章略加编辑——我去掉了所有的more标签（也就是说在Blog主页和RSS上，所有的文章都将全文显示），给每篇文章加上了tag并重新考虑了分类，给每篇文章重写了Slug，并且重新上传了所有图片、修改了图片地址——这都是为了一个全新的、干净的Blog。我觉得这些修改让我很满意，不知道各位老读者觉得如何（特别是全文显示）。最后一个原因是，我想重读自己的文章，很多东西，我真的不知道是自己写的……各位不妨试试看，读一读你两年前写的文章，看看是什么感觉。
　　没有备份下来的部分，经某人（因为我忘了到底是谁）提醒，从RSS阅读器中抓取，感谢classicning提供了一个抓虾的地址，但是由于当时我的RSS不是全文的，还是丢失了一篇文章：答plioild点名的文章。没办法……另外由于我所有的影评、散文相关的图片都上传到Yupoo了，所以也只丢了一幅图片：百合ID返璞归真的纪念截图。另外，我没有加入两篇旧文章，一篇是NOD32安装教程，一篇是百合工作室服务恢复，这两篇内容都过时了，要说纪念价值，比它们有纪念价值的也很多（当然，懒的上传那几十幅图片也是一个原因）。顺便一说，我想把校园网的NOD32升级服务器换成3.0的，又要写教程了……
　　2、留言
　　由于彻底地丢失了07年6月30日以后的留言、之前的留言我也无力全部手工恢复，于是只选择了其中比较有意义的一些，比如各位老朋友的第一次留言之类的，我冒充各位留了言然后修改时间（懒得进数据库改IP了，否则更真实），正是因为所有留言都是一个IP，WordPress说我发得太多，逼得我只能重新拨号上网换个IP才能继续留言……
　　3、其他
　　所有的选项都是我手动改的；所有的友情链接(WordPress把它们称作Blogroll)都来自我的鲜果导出的OPML。顺便一说，我认识的人，想交换链接的请随意留言。

　　二、修正域名指向
　　因为lilystudio.org这个域名的管理人是Rufev，让他把子域名指过来还需要一段时间（况且他还忘了这茬，又拖了一天），而我等不及域名改过来就恢复了数据，所以一开始Blog地址、帖子的Permalink和图片地址都是dlzm.ipower.com这个域名下的某个子目录，要修改这些是一个挺麻烦的问题；但更麻烦的是，IPower的控制面板根本没有一个国内主机那样写着“域名绑定“的选项，到底该怎么设置？于是新一轮的折腾开始了……
　　1、与域名设置的战斗
　　首先，我设想了让一个域名能指向一个虚拟主机的某个特定子目录的各种方法：

转移域名注册商(Registrar Transfer)
修改Name Server记录
转向(Redirect)
“假想域名管理”（自创词汇）

　　第一种方法就是说把注册商转移为IPower，这是最彻底的方法，但这个域名不属于我，不可能把整个域名都转过来；第二种方法，是指修改这个域名的管理服务器，也就是”付费给A公司，在B公司管理域名“，国内很少有公司提供这种服务，国外很常见，我的STRATO直接在控制面板里提供了这样的功能（这是当然的，它的域名管理比IPower都要厉害，就是贵了点……），但基于同样的原因——域名不属于我，而子域名是不能单独修改NS记录的；第三种方法是指，在该域名现在的注册商的控制面板中，将域名Redirect过来到某个目录。这是常用的方法，实质上是域名指向注册商的某个专项页，再转移过来，有的域名商比如STRATO做得好，能隐藏转向，这样在地址栏都看不出问题。但这不是彻底的方法，速度、与WordPress的兼容上都有问题，严重的话会导致某些php程序根本不能使用；最后是我自己设想的一个办法，虽然控制面板里明确说了，要让一个域名指向这个虚拟主机的某个目录，必须是IPower管理的域名（也就是上面说的第一、二种方法）。但是我猜想，如果强行添加会不会有效呢？当然在真正有权管理的控制面板中（lilystudio.org的真正注册商），也要做一些修改。

修改该域名真正注册商控制面板中的设置，将域名的IP指向IPower提供的绑定用IP（和MySQL的主机一样，也藏在非常难找到的地方）
在IPower控制面板的Domain Pointing Manager中，添加一个域名lilystudio.org，指向我的blog的目录
如果你只拥有一个子域名（比如我拥有williamgates.liystudio.org），想要让它直接指向这个Blog，那么现在就已经完成了
如果你拥有整个域名（比如DlzM拥有dlzm.net），那么请在第一步中将整个域名而不是子域名指向IPower的IP，并且在第二步之后，继续在IPower中为dlzm.net添加子域名并且指向你要的目录。
修改DNS指向需要几分钟到24小时不等的时间才会传到你上网所使用的DNS；但是在虚拟主机控制面板这边的修改，瞬间生效

　　是的，一切就像实际上修改了Name Server一样，就像IPower在管理这些域名一样。当你把一个域名，不管是整个域名还是子域名指向IPower的IP，就等于授权它来管理这个域名，我不知道它到底是基于DNS的设置，还是基于服务器上的技巧（例如Apache的某种模块），但结果就是你完全可以在IPower这边顺利的使用了，就像域名在这里注册一样。对于我的域名来说，IPower认为*.lilystudio.org都归于我这个目录，但由于只有blog.williamgates.biz会被解析成IPower管辖下的IP，所以只有williamgates.lilystuido.org会转到我这个Blog来。我把这个方法称为“假想域名管理”，我推断绝大多数允许多站点（参看前面选购部分的对比）的国外虚拟主机，都可以并且应当这样使用。（这让我想到美国的长臂管辖，管判不管执行，只有财产到了美国境内（也就是域名指向了IPower管辖的IP），才真正受到执行）
　　2、与URL的战斗
　　域名指过来了，但是Blog里所有的URL都是旧的地址，所有链接都打不开，怎么办？
　　首先，在WordPress的Options-General，修改WordPress address (URL)和Blog address (URL)这两项为新的地址，这样所有的动态页面的链接都对了。
　　你点击文章，但是显示404，这是为什么？因为所有的Permalink都不正确，静态页面还需要修改。进入Options-Permalinks，点击那个“Update Permalink Structure”的按钮（我是偶然发现这个方法的），所有的rewrite规则都将被自动修改（当然，WordPress需要有写.htaccess的权限）。另外，如果你使用了WP-Cache或者WP-SuperCache插件（比如我），请关闭它再打开，它也会自动修改一遍.htaccess，并且请到它的设置页面去清除、重建所有的缓存。
　　最后是最艰难的，文章中的旧链接，数据库中旧的上载文件记录，怎么办？用phpMyAdmin打开数据库，搜索你的旧地址，你会发现他们基本上都在Post表中（我是这时候才知道，该死的WordPress没有上载文件表，所有通过它上传的文件都和文章混在一个表中，难怪我们的文章ID不一定连续……），于是我们执行这样的SQL语句：

UPDATE 表名 SET 字段名=REPLACE&#40;字段名,'原来的内容','替换后的内容'&#41;;

　　记得把你找到的所有含有旧链接的字段都执行一遍（不仅仅是content，因为还有图片的地址呢）。对于其他表中查找出的旧链接，总量一般不大、可能有特殊情况，所以建议手动一条条改（我只有一条）。
　　至此，不仅是WordPress本身，整个Blog已经重建完成，可以自如地使用了。下一集是与其他各种乱七八糟Bug的战斗……


Related posts:Reload
Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　昨天说到安装配置好了WordPress，下一步的工作就是尽量恢复原来的数据了。<a href="http://www.dlzm.net">DlzM</a>选择了重新开始一个全新的blog，而我也觉得原来的数据库非常混乱（我有数据洁癖），决定手工添加旧文章，至于以前的留言……再说吧。</p>
<p>　　一、恢复Blog数据<br />
　　1、文章<br />
　　数据库备份下来的部分，在本地开一个Apache+MySQL，装上WordPress就能看到了。我不仅没有用数据库导入的功能，而且也不想用WordPress自身的导入功能，因为上次备份的WordPress版本太旧，我不想升级数据库那样折腾（不要问我为什么，我有数据洁癖）。当然最主要的原因是我希望把所有的文章略加编辑——我去掉了所有的more标签（也就是说在Blog主页和RSS上，所有的文章都将全文显示），给每篇文章加上了tag并重新考虑了分类，给每篇文章重写了Slug，并且重新上传了所有图片、修改了图片地址——这都是为了一个全新的、干净的Blog。我觉得这些修改让我很满意，不知道各位老读者觉得如何（特别是全文显示）。最后一个原因是，我想重读自己的文章，很多东西，我真的不知道是自己写的……各位不妨试试看，读一读你两年前写的文章，看看是什么感觉。<br />
　　没有备份下来的部分，经某人（因为我忘了到底是谁）提醒，从RSS阅读器中抓取，感谢<a href="http://www.classicning.com/blog/">classicning</a>提供了一个抓虾的地址，但是由于当时我的RSS不是全文的，还是丢失了一篇文章：答<a href="http://my.donews.com/phio/">plioild</a>点名的文章。没办法……另外由于我所有的影评、散文相关的图片都上传到Yupoo了，所以也只丢了一幅图片：<a href="http://blog.williamgates.biz/2007/08/24/112">百合ID返璞归真</a>的纪念截图。另外，我没有加入两篇旧文章，一篇是NOD32安装教程，一篇是百合工作室服务恢复，这两篇内容都过时了，要说纪念价值，比它们有纪念价值的也很多（当然，懒的上传那几十幅图片也是一个原因）。顺便一说，我想把校园网的NOD32升级服务器换成3.0的，又要写教程了……</p>
<p>　　2、留言<br />
　　由于彻底地丢失了07年6月30日以后的留言、之前的留言我也无力全部手工恢复，于是只选择了其中比较有意义的一些，比如各位老朋友的第一次留言之类的，我冒充各位留了言然后修改时间（懒得进数据库改IP了，否则更真实），正是因为所有留言都是一个IP，WordPress说我发得太多，逼得我只能重新拨号上网换个IP才能继续留言……</p>
<p>　　3、其他<br />
　　所有的选项都是我手动改的；所有的友情链接(WordPress把它们称作Blogroll)都来自我的<a href="http://www.xianguo.com/">鲜果</a>导出的OPML。顺便一说，我认识的人，想交换链接的请随意留言。<br />
<span id="more-119"></span><br />
　　二、修正域名指向<br />
　　因为lilystudio.org这个域名的管理人是<a href="http://blog.rufev.net/">Rufev</a>，让他把子域名指过来还需要一段时间（况且他还忘了这茬，又拖了一天），而我等不及域名改过来就恢复了数据，所以一开始Blog地址、帖子的Permalink和图片地址都是dlzm.ipower.com这个域名下的某个子目录，要修改这些是一个挺麻烦的问题；但更麻烦的是，IPower的控制面板根本没有一个国内主机那样写着“域名绑定“的选项，到底该怎么设置？于是新一轮的折腾开始了……</p>
<p>　　1、与域名设置的战斗<br />
　　首先，我设想了让一个域名能指向一个虚拟主机的某个特定子目录的各种方法：
<ul>
<li>转移域名注册商(Registrar Transfer)</li>
<li>修改Name Server记录</li>
<li>转向(Redirect)</li>
<li>“假想域名管理”（自创词汇）</li>
</ul>
<p>　　第一种方法就是说把注册商转移为IPower，这是最彻底的方法，但这个域名不属于我，不可能把整个域名都转过来；第二种方法，是指修改这个域名的管理服务器，也就是”付费给A公司，在B公司管理域名“，国内很少有公司提供这种服务，国外很常见，我的<a href="http://www.strato-hosting.co.uk/">STRATO</a>直接在控制面板里提供了这样的功能（这是当然的，它的域名管理比IPower都要厉害，就是贵了点……），但基于同样的原因——域名不属于我，而子域名是不能单独修改NS记录的；第三种方法是指，在该域名现在的注册商的控制面板中，将域名Redirect过来到某个目录。这是常用的方法，实质上是域名指向注册商的某个专项页，再转移过来，有的域名商比如<a href="http://www.strato-hosting.co.uk/">STRATO</a>做得好，能隐藏转向，这样在地址栏都看不出问题。但这不是彻底的方法，速度、与WordPress的兼容上都有问题，严重的话会导致某些php程序根本不能使用；最后是我自己设想的一个办法，虽然控制面板里明确说了，要让一个域名指向这个虚拟主机的某个目录，必须是IPower管理的域名（也就是上面说的第一、二种方法）。但是我猜想，如果强行添加会不会有效呢？当然在真正有权管理的控制面板中（lilystudio.org的真正注册商），也要做一些修改。
<ol>
<li>修改该域名真正注册商控制面板中的设置，将域名的IP指向IPower提供的绑定用IP（和MySQL的主机一样，也藏在非常难找到的地方）</li>
<li>在IPower控制面板的Domain Pointing Manager中，添加一个域名lilystudio.org，指向我的blog的目录</li>
<li>如果你只拥有一个子域名（比如我拥有williamgates.liystudio.org），想要让它直接指向这个Blog，那么现在就已经完成了</li>
<li>如果你拥有整个域名（比如DlzM拥有dlzm.net），那么请在第一步中将整个域名而不是子域名指向IPower的IP，并且在第二步之后，继续在IPower中为dlzm.net添加子域名并且指向你要的目录。</li>
<li>修改DNS指向需要几分钟到24小时不等的时间才会传到你上网所使用的DNS；但是在虚拟主机控制面板这边的修改，瞬间生效</li>
</ol>
<p>　　是的，一切就像实际上修改了Name Server一样，就像IPower在管理这些域名一样。当你把一个域名，不管是整个域名还是子域名指向IPower的IP，就等于授权它来管理这个域名，我不知道它到底是基于DNS的设置，还是基于服务器上的技巧（例如Apache的某种模块），但结果就是你完全可以在IPower这边顺利的使用了，就像域名在这里注册一样。对于我的域名来说，IPower认为*.lilystudio.org都归于我这个目录，但由于只有blog.williamgates.biz会被解析成IPower管辖下的IP，所以只有williamgates.lilystuido.org会转到我这个Blog来。我把这个方法称为“假想域名管理”，我推断绝大多数允许多站点（参看前面选购部分的对比）的国外虚拟主机，都可以并且应当这样使用。（这让我想到美国的长臂管辖，管判不管执行，只有财产到了美国境内（也就是域名指向了IPower管辖的IP），才真正受到执行）</p>
<p>　　2、与URL的战斗<br />
　　域名指过来了，但是Blog里所有的URL都是旧的地址，所有链接都打不开，怎么办？<br />
　　首先，在WordPress的Options-General，修改WordPress address (URL)和Blog address (URL)这两项为新的地址，这样所有的动态页面的链接都对了。<br />
　　你点击文章，但是显示404，这是为什么？因为所有的Permalink都不正确，静态页面还需要修改。进入Options-Permalinks，点击那个“Update Permalink Structure”的按钮（我是偶然发现这个方法的），所有的rewrite规则都将被自动修改（当然，WordPress需要有写.htaccess的权限）。另外，如果你使用了WP-Cache或者WP-SuperCache插件（比如我），请关闭它再打开，它也会自动修改一遍.htaccess，并且请到它的设置页面去清除、重建所有的缓存。<br />
　　最后是最艰难的，文章中的旧链接，数据库中旧的上载文件记录，怎么办？用phpMyAdmin打开数据库，搜索你的旧地址，你会发现他们基本上都在Post表中（我是这时候才知道，该死的WordPress没有上载文件表，所有通过它上传的文件都和文章混在一个表中，难怪我们的文章ID不一定连续……），于是我们执行这样的SQL语句：</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">UPDATE</span> 表名 <span style="color: #993333; font-weight: bold;">SET</span> 字段名<span style="color: #66cc66;">=</span><span style="color: #993333; font-weight: bold;">REPLACE</span><span style="color: #66cc66;">&#40;</span>字段名<span style="color: #66cc66;">,</span><span style="color: #ff0000;">'原来的内容'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'替换后的内容'</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>　　记得把你找到的所有含有旧链接的字段都执行一遍（不仅仅是content，因为还有图片的地址呢）。对于其他表中查找出的旧链接，总量一般不大、可能有特殊情况，所以建议手动一条条改（我只有一条）。</p>
<p>　　至此，不仅是WordPress本身，整个Blog已经重建完成，可以自如地使用了。下一集是与其他各种乱七八糟Bug的战斗……</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
<li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/01/goodbye-icp-records-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再见了,ICP备(三)重新部署WordPress以及IPowerWeb空间使用方法</title>
		<link>http://blog.williamgates.biz/2008/01/goodbye-icp-records-03/</link>
		<comments>http://blog.williamgates.biz/2008/01/goodbye-icp-records-03/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 14:09:57 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[IPowerWeb]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2008/01/29/118</guid>
		<description><![CDATA[　　这两件事情本想分开来说，但发现我在部署过程中的大部分问题都是要在WordPress和IPowerWeb控制面板两边一起解决的，所以就合在一起写了。
　　一、IPowerWeb的vDeck控制面板
　　这个vDeck3.0是IPowerWeb公司近期才换上的，是他们主页上介绍的一大卖点。登陆上这个控制面板，发现比国内主机强得太多了，光图标就一堆，除了可以管理域名、FTP帐号、MySQL数据库、硬盘空间和文件等常见功能以外，还有文件打包上传下载，Email系统（附赠2500个Email帐号），在线网页编辑工具、整站建设工具等国内虚拟主机没有或很贵的空间才有的功能；最厉害的是，还能添加Cron任务，修改.htaccess文件，编辑php.ini文件，甚至能设置php的版本!各种原本不支持的模块，比如Zend之类，都可以手动修改配置文件来加上。基本上来说，实现了Linux命令行下控制服务器最常用的一些功能，真正是所谓”虚拟主机“。与国内的空间比起来，实在不是一种类型的东西；即使与我用过的英国Strato比起来，也要强大许多。
　　但是也有一个缺点，像大部分”美国式“的软件一样，这里没有详细的介绍和合理的菜单分类，你要做的就是一层层的仔细查找，最好能阅读IPower的整个知识库（我就这么做了），美国果然是人贵技术便宜，宁可写一大堆复杂的知识库，也不愿意派一个人来解答你的问题……总之整个界面复杂，不够人性化，越是重要的东西越是藏在找不到的地方，还需要复杂的知识才能把它玩得转……下面要说的整个部署过程，可以说都是和这个复杂的虚拟主机作斗争的过程。
　　二、WordPress的基本安装部署
　　这里提供php4/5的版本选择，MySQL和Apache也是最新版本，再也没有在国内主机那种催着主机商升级MySQL的痛苦了。但是美国人不明白最新的未必是最好的，这些最新的版本也带来不少麻烦。下面我们就来看看WordPress的安装经历。
　　首先，从wordpress.org下载最新版本的WordPress，解压后上传；在控制面板里新建一个数据库，把用户名密码写在WordPress的配置文件里；然后在浏览器地址栏输入install.php的具体地址，一回车……唉？500 Error？
　　1、与数据库连接的战斗
　　上网搜索WordPress 500 Error，到处都是讲解如何连接数据库的，这个我也会啊……然后想想，是不是这个空间的数据库特别一点呢？在控制面板中四处翻看，发现数据库的最下面有一行小字：Database is on ***.ipowermysql.com。哦，原来数据库和Web服务器不在一台主机上，但是我发现这个域名不要说ping，连DNS解析都解析不出来，于是我登陆控制面板里提供的phpMyAdmin，发现phpMyAdmin所认出的主机是一长串奇怪的域名；我ping这个域名，得到一个IP地址，但是把这两个域名和IP地址填入WordPress配置文件，看到的都是500 Error。
　　2、与CGI选项的战斗
　　一上来就受挫折，我静下来思考，决定放上探针看看基本的服务器环境。没想到php探针也不能运行！于是我开始怀疑不是数据库的问题，而是php本身的问题。在控制面板里四处找找看，发现CGI写着Inactive，但是php不是一定要用CGI方式运行啊，而且心目中CGI总是不稳定、不安全和主机商不肯提供的功能，跟我的php不能运行何干……但是当我抱着试试看的心态打开CGI的时候，发现php终于能够运行了——这个虚拟主机，默认是不打开动态页面功能的！也就是说，如果你不知道在这里打开这个选项，你等于买了个HTM空间……
　　成功运行php后，经过实验证明，数据库主机应该是那个ipowermysql，不能DNS解析的主机但是能正常用，够牛。像装普通软件一样安装好WordPress，就可以用了。
　　小结：IPowerWeb的虚拟主机，一上来请先打开CGI支持；数据库主机在（你的用户名）.ipowermysql.com上。

　　三、WordPress的设置、插件和Theme
　　首先修改了WordPress的基本设置，然后换上了这个一直想用的Theme:GlossyBlue，并且上传了我以前用的各种插件。下面问题就来了：
　　1、与Google Analytics以及Theme的战斗
　　好久不用Google AdSense和Google Analytics了，登上去一看，发现都换了新的代码和管理方式。设计和配置了几个广告，还有分析代码，放到了页面上。一部分广告用WordPress的Widgets功能放到了Sidebar，还有一个通过修改single.php放在了每篇文章的底部。Google Analytics代码按我的习惯，放在了footer.php里面。乍看起来没什么问题，但是不经意间打开IE（我平时用FireFox），发现最下面的三栏变成与页面等宽了（越出了整个Blog主体的边界），很难看，想来想去找不到问题所在。
　　这次又像数据库和CGI的问题一样，犯了一个连环故障的错误，我猜想到是加入的Analytics代码的问题，于是把代码放到了Sidebar里面，但是偷懒没有给这个Text Widget加上标题。结果不管我怎么修改，哪怕删掉所有的留言（让变宽的第二栏保持空白）还是这样，我甚至怀疑是Theme自己的Bug，研读了全部的CSS也没有找到问题所在。于是我决定去掉AdSense和Analytics代码，结果恢复正常了，我这才想到，Text Widget的标题也许不仅仅是一个标题而已？经过实验才发现，当你给Text Widget加了标题，WordPress会自动多加一层div，这样就与下面的footer互不干扰了；否则不管是放在Sidebar还是footer，Google Analytics的新版本代码都会在IE里显示成一个空白行，从而影响整个页面的布局。
　　但是我现在还是不愿意加上一个标题，我把代码藏在其他的地方了……你猜在哪？
　　2、与中文tag链接的战斗
　　WordPress新加入的tag功能是一大卖点，也是WP用户一直眼馋别的Blog系统的重要原因（当然，有插件可以实现tag，但总不比内建的来得好）。但是我以前的主机开开停停，我从没注意过这样一个现象——点击标签云中的中文标签，是无法找到页面的！上网搜索，原来需要修改wp-includes里的rewrite.php，把函数 function get_tag_permastruct() 中的

if &#40;empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123;

改为

if &#40;!empty&#40;$this-&#62;permalink_structure&#41;&#41; &#123;

　　就可以了。
　　3、与Cryptographp的战斗
　　Cryptographp是一个著名的基于php和GD库的验证码生成器，基于它开发的WP插件也叫Cryptographp，用于防止垃圾留言。我用它已经很长时间了，更换到这个主机之后，我用了最新的版本，还特意换了一幅背景图以便和这个主题的颜色相配。但是很快我发现，虽然它能正常的显示出验证码，但是不管你输入什么，都无法留言，显示”Wrong anti-spam word.“。上网搜索，只得知在K2下，theme里面的true和false是颠倒的（黑白颠倒？），但我没有用K2啊……
　　我只能怀疑Cryptographp的最新版本和WordPress兼容有问题，于是换了一个验证码更容易看懂也更容易配置的插件：Did You Pass Math?，但可笑的是我居然没有注意到它的输入框在哪（在留言内容的下面，不方便），以为它没起作用，就又下载了了一个据说是它的变态加强版的Challenge，这个可以自由放置输入框、自由设置问题格式，也可以把问题变得非常复杂……但是我觉得没必要了，虽然我知道绝大多数验证码都容易被程序破解，Cryptographp产生的那些才算有点安全——但现在的加法题我也很满意了。
　　小结：新版的Google Analytics和AdSense代码在使用的时候，请务必在外面加上一层div；WordPress 2.3.2下，要想使用中文tag请修改rewrite.php文件；Cryptographp在WordPress 2.3.2下不能正常使用，Challenge是一个不错的选择。
　　附上我使用的WordPress插件列表：

AJAX Comments：让留言过程AJAX化，只是更好看一点而已（最新版本收费了，免费的最后一个版本是2.08）
Challenge：生成验证码问题
Viper&#8217;s Video Quicktags：方便地在文章中添加YouTube等flv来源
WordPress Database Backup：数据库备份，支持WordPress的内建Cron功能，但是在我以前的主机上备份出乱码，现在好用了
WP-FileManager：文件管理器，鸡肋，我本来是想用来批量修改图片地址的（但是没这功能）
WP-phpMyAdmin：在WP内运行的phpMyAdmin，没什么特别的，但是用起来比另开一个方便
WP Super Cache：生成静态页面，提高访问速度，这个插件比较麻烦，涉及mod_rewrite，有些主机不支持，而且支持了也有很多人不会用……所以建议慎用，用前请仔细阅读它自己的说明

　　至此，整个WordPress好歹能运行了。下面要做的就是恢复文章，以及无穷无尽的各种Bug。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　这两件事情本想分开来说，但发现我在部署过程中的大部分问题都是要在WordPress和IPowerWeb控制面板两边一起解决的，所以就合在一起写了。</p>
<p>　　一、IPowerWeb的vDeck控制面板<br />
　　这个vDeck3.0是IPowerWeb公司近期才换上的，是他们主页上介绍的一大卖点。登陆上这个控制面板，发现比国内主机强得太多了，光图标就一堆，除了可以管理域名、FTP帐号、MySQL数据库、硬盘空间和文件等常见功能以外，还有文件打包上传下载，Email系统（附赠2500个Email帐号），在线网页编辑工具、整站建设工具等国内虚拟主机没有或很贵的空间才有的功能；最厉害的是，还能添加Cron任务，修改.htaccess文件，编辑php.ini文件，甚至能设置php的版本!各种原本不支持的模块，比如Zend之类，都可以手动修改配置文件来加上。基本上来说，实现了Linux命令行下控制服务器最常用的一些功能，真正是所谓”虚拟主机“。与国内的空间比起来，实在不是一种类型的东西；即使与我用过的英国<a href="http://www.strato-hosting.co.uk/">Strato</a>比起来，也要强大许多。<br />
　　但是也有一个缺点，像大部分”美国式“的软件一样，这里没有详细的介绍和合理的菜单分类，你要做的就是一层层的仔细查找，最好能阅读IPower的整个知识库（我就这么做了），美国果然是人贵技术便宜，宁可写一大堆复杂的知识库，也不愿意派一个人来解答你的问题……总之整个界面复杂，不够人性化，越是重要的东西越是藏在找不到的地方，还需要复杂的知识才能把它玩得转……下面要说的整个部署过程，可以说都是和这个复杂的虚拟主机作斗争的过程。</p>
<p>　　二、WordPress的基本安装部署<br />
　　这里提供php4/5的版本选择，MySQL和Apache也是最新版本，再也没有在国内主机那种催着主机商升级MySQL的痛苦了。但是美国人不明白最新的未必是最好的，这些最新的版本也带来不少麻烦。下面我们就来看看WordPress的安装经历。<br />
　　首先，从<a href="http://www.wordpress.org/">wordpress.org</a>下载最新版本的WordPress，解压后上传；在控制面板里新建一个数据库，把用户名密码写在WordPress的配置文件里；然后在浏览器地址栏输入install.php的具体地址，一回车……唉？500 Error？</p>
<p>　　1、与数据库连接的战斗<br />
　　上网搜索WordPress 500 Error，到处都是讲解如何连接数据库的，这个我也会啊……然后想想，是不是这个空间的数据库特别一点呢？在控制面板中四处翻看，发现数据库的最下面有一行小字：Database is on <del datetime="2008-01-29T11:31:37+00:00">***</del>.ipowermysql.com。哦，原来数据库和Web服务器不在一台主机上，但是我发现这个域名不要说ping，连DNS解析都解析不出来，于是我登陆控制面板里提供的phpMyAdmin，发现phpMyAdmin所认出的主机是一长串奇怪的域名；我ping这个域名，得到一个IP地址，但是把这两个域名和IP地址填入WordPress配置文件，看到的都是500 Error。</p>
<p>　　2、与CGI选项的战斗<br />
　　一上来就受挫折，我静下来思考，决定放上探针看看基本的服务器环境。没想到php探针也不能运行！于是我开始怀疑不是数据库的问题，而是php本身的问题。在控制面板里四处找找看，发现CGI写着Inactive，但是php不是一定要用CGI方式运行啊，而且心目中CGI总是不稳定、不安全和主机商不肯提供的功能，跟我的php不能运行何干……但是当我抱着试试看的心态打开CGI的时候，发现php终于能够运行了——这个虚拟主机，默认是不打开动态页面功能的！也就是说，如果你不知道在这里打开这个选项，你等于买了个HTM空间……</p>
<p>　　成功运行php后，经过实验证明，数据库主机应该是那个ipowermysql，不能DNS解析的主机但是能正常用，够牛。像装普通软件一样安装好WordPress，就可以用了。<br />
　　小结：IPowerWeb的虚拟主机，一上来请先打开CGI支持；数据库主机在（你的用户名）.ipowermysql.com上。<br />
<span id="more-118"></span><br />
　　三、WordPress的设置、插件和Theme<br />
　　首先修改了WordPress的基本设置，然后换上了这个一直想用的Theme:<a href="http://www.ndesign-studio.com/resources/wp-themes/glossyblue/">GlossyBlue</a>，并且上传了我以前用的各种插件。下面问题就来了：</p>
<p>　　1、与Google Analytics以及Theme的战斗<br />
　　好久不用<a href="https://www.google.com/adsense/">Google AdSense</a>和<a href="https://www.google.com/analytics/">Google Analytics</a>了，登上去一看，发现都换了新的代码和管理方式。设计和配置了几个广告，还有分析代码，放到了页面上。一部分广告用WordPress的Widgets功能放到了Sidebar，还有一个通过修改single.php放在了每篇文章的底部。Google Analytics代码按我的习惯，放在了footer.php里面。乍看起来没什么问题，但是不经意间打开IE（我平时用FireFox），发现最下面的三栏变成与页面等宽了（越出了整个Blog主体的边界），很难看，想来想去找不到问题所在。<br />
　　这次又像数据库和CGI的问题一样，犯了一个连环故障的错误，我猜想到是加入的Analytics代码的问题，于是把代码放到了Sidebar里面，但是偷懒没有给这个Text Widget加上标题。结果不管我怎么修改，哪怕删掉所有的留言（让变宽的第二栏保持空白）还是这样，我甚至怀疑是Theme自己的Bug，研读了全部的CSS也没有找到问题所在。于是我决定去掉AdSense和Analytics代码，结果恢复正常了，我这才想到，Text Widget的标题也许不仅仅是一个标题而已？经过实验才发现，当你给Text Widget加了标题，WordPress会自动多加一层div，这样就与下面的footer互不干扰了；否则不管是放在Sidebar还是footer，Google Analytics的新版本代码都会在IE里显示成一个空白行，从而影响整个页面的布局。<br />
　　但是我现在还是不愿意加上一个标题，我把代码藏在其他的地方了……你猜在哪？</p>
<p>　　2、与中文tag链接的战斗<br />
　　WordPress新加入的tag功能是一大卖点，也是WP用户一直眼馋别的Blog系统的重要原因（当然，有插件可以实现tag，但总不比内建的来得好）。但是我以前的主机开开停停，我从没注意过这样一个现象——点击标签云中的中文标签，是无法找到页面的！上网搜索，原来需要修改wp-includes里的rewrite.php，把函数 <code>function get_tag_permastruct()</code> 中的</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>改为</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">permalink_structure</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span></pre></div></div>

<p>　　就可以了。</p>
<p>　　3、与Cryptographp的战斗<br />
　　Cryptographp是一个著名的基于php和GD库的验证码生成器，基于它开发的WP插件也叫Cryptographp，用于防止垃圾留言。我用它已经很长时间了，更换到这个主机之后，我用了最新的版本，还特意换了一幅背景图以便和这个主题的颜色相配。但是很快我发现，虽然它能正常的显示出验证码，但是不管你输入什么，都无法留言，显示”Wrong anti-spam word.“。上网搜索，只得知在<a href="http://getk2.com/">K2</a>下，theme里面的true和false是颠倒的（黑白颠倒？），但我没有用K2啊……<br />
　　我只能怀疑Cryptographp的最新版本和WordPress兼容有问题，于是换了一个验证码更容易看懂也更容易配置的插件：<a href="http://www.herod.net/dypm/">Did You Pass Math?</a>，但可笑的是我居然没有注意到它的输入框在哪（在留言内容的下面，不方便），以为它没起作用，就又下载了了一个据说是它的变态加强版的<a href="http://lordchaos.dominatus.net/wordpress-plugin-challenge">Challenge</a>，这个可以自由放置输入框、自由设置问题格式，也可以把问题变得非常复杂……但是我觉得没必要了，虽然我知道绝大多数验证码都容易被程序破解，Cryptographp产生的那些才算有点安全——但现在的加法题我也很满意了。<br />
　　小结：新版的Google Analytics和AdSense代码在使用的时候，请务必在外面加上一层div；WordPress 2.3.2下，要想使用中文tag请修改rewrite.php文件；Cryptographp在WordPress 2.3.2下不能正常使用，Challenge是一个不错的选择。<br />
　　附上我使用的WordPress插件列表：</p>
<ul>
<li><a href="http://ajax-comments.dev.rain.hu/">AJAX Comments</a>：让留言过程AJAX化，只是更好看一点而已（最新版本收费了，免费的最后一个版本是2.08）</li>
<li><a href="http://lordchaos.dominatus.net/wordpress-plugin-challenge">Challenge</a>：生成验证码问题</li>
<li><a href="http://www.viper007bond.com/wordpress-plugins/vipers-video-quicktags/">Viper&#8217;s Video Quicktags</a>：方便地在文章中添加YouTube等flv来源</li>
<li><a href="http://www.ilfilosofo.com/blog/wp-db-backup">WordPress Database Backup</a>：数据库备份，支持WordPress的内建Cron功能，但是在我以前的主机上备份出乱码，现在好用了</li>
<li><a href="http://johannesries.de/webwork/wp-filemanager/">WP-FileManager</a>：文件管理器，鸡肋，我本来是想用来批量修改图片地址的（但是没这功能）</li>
<li><a href="http://wordpress.designpraxis.at/">WP-phpMyAdmin</a>：在WP内运行的phpMyAdmin，没什么特别的，但是用起来比另开一个方便</li>
<li><a href="http://ocaoimh.ie/wp-super-cache/">WP Super Cache</a>：生成静态页面，提高访问速度，这个插件比较麻烦，涉及mod_rewrite，有些主机不支持，而且支持了也有很多人不会用……所以建议慎用，用前请仔细阅读它自己的说明</li>
</ul>
<p>　　至此，整个WordPress好歹能运行了。下面要做的就是恢复文章，以及无穷无尽的各种Bug。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2008/01/goodbye-icp-records-03/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Gregarius+Resco Neeews打造Palm上的RSS阅读解决方案</title>
		<link>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/</link>
		<comments>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/#comments</comments>
		<pubDate>Tue, 20 Nov 2007 12:46:53 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Palm]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Gregarius]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[treo]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2007/11/20/115</guid>
		<description><![CDATA[　　想从Palm上看瘾科技？想用手机关注三表和和菜头？Palm上的RSS阅读软件不多，中文阅读更是困难无比。中国人用Palm上阅读中文RSS FEED，最主要的难题在于：
    　　1、Palm内核不支持UTF-8，无法读取UTF-8编码的RSS。
    　　2、国内手机上网慢、贵、限流量，如果下载所有的图片，简直就是自虐和烧钱行为（特别是看瘾科技的时候）。
    　　3、Palm上的Java支持很差，很多现在流行的方式，例如维信(我没用过，挺感兴趣)，以及各种大众化的Java软件均不适用于Palm，即使有Palm版本的(如掌讯通)也只有极少的功能。
　　在Palm上阅读RSS，常用的方法不外乎：

　　方案一：Blazer+Google Reader
　　Blazer就是Palm上官方自带的Web浏览器，它与鲜果不兼容，而且考虑到技术水平和翻墙的用途，Google Reader无疑是最好的选择。
    　　优点：
    　　1、阅读进度与PC同步，在手机上看过的PC上就不会再提示你没看过
    　　2、可以标记某些Item为Starred，这样就加强了与PC的同步（DlzM提供的方法，例如你看到一篇文章，想看其中的图片，可以加星然后到电脑上看）
    　　3、对RSS Feed的兼容性最强
    　　缺点：
    　　1、虽然可以控制某副图片是否下载，但如果该图片带链接，点击后就直接访问了该链接，无法控制该图片的下载
    　　2、加星看图片的方式毕竟不方便
    　　3、毕竟是浏览器阅读，Google Reader并非是为移动设备设计的，版面不好看，且操纵不方便，最关键的是不能管理来源，即不能修改也不能添加RSS Feed
　　方案二：QuickNews
　　QuickNews是Palm上的老牌RSS阅读软件，特性包括图片的单独下载、Podcast支持（在中国用手机下载Podcast简直就是给移动注资）、代理支持（也就是说支持CMWAP）以及对不同Feed较好的兼容性。
　　缺点非常明显，由于绝对不支持UTF-8，除非在源上作处理，否则根本无法阅读绝大部分中文RSS。
　　方案三：Gregarius+Resco Neeews
　　这才是我们要说的重头戏，既然QuickNews什么都好，就是不能读UTF-8的中文页面，那我们就需要找一个能解决这一问题、还能拥有它其他功能的方案来。
　　Gregarius是著名的基于php的RSS聚合器，功能就是将你所设定的来源聚合在一起，以HTM或者XML方式输出，对于普通用户来说，其实作用和Google Reader差不多，但是Google Reader不提供XML输出。
　　Resco Neeews是Palm [...]]]></description>
			<content:encoded><![CDATA[<p>　　想从Palm上看<a href="http://cn.engadget.com/">瘾科技</a>？想用手机关注<a href="http://www.wangxiaofeng.net/">三表</a>和<a href="http://www.hecaitou.net/">和菜头</a>？Palm上的RSS阅读软件不多，中文阅读更是困难无比。中国人用Palm上阅读中文RSS FEED，最主要的难题在于：</p>
<p>    　　1、Palm内核不支持UTF-8，无法读取UTF-8编码的RSS。<br />
    　　2、国内手机上网慢、贵、限流量，如果下载所有的图片，简直就是自虐和烧钱行为（特别是看瘾科技的时候）。<br />
    　　3、Palm上的Java支持很差，很多现在流行的方式，例如<a href="https://cn.widsets.com/">维信</a>(我没用过，挺感兴趣)，以及各种大众化的Java软件均不适用于Palm，即使有Palm版本的(如掌讯通)也只有极少的功能。</p>
<p>　　在Palm上阅读RSS，常用的方法不外乎：<br />
<span id="more-115"></span><br />
　　<strong>方案一：Blazer+Google Reader</strong><br />
　　Blazer就是Palm上官方自带的Web浏览器，它与<a href="http://www.xianguo.com/">鲜果</a>不兼容，而且考虑到技术水平和翻墙的用途，Google Reader无疑是最好的选择。</p>
<p>    　　优点：<br />
    　　1、阅读进度与PC同步，在手机上看过的PC上就不会再提示你没看过<br />
    　　2、可以标记某些Item为Starred，这样就加强了与PC的同步（<a href="http://www.dlzm.net/">DlzM</a>提供的方法，例如你看到一篇文章，想看其中的图片，可以加星然后到电脑上看）<br />
    　　3、对RSS Feed的兼容性最强</p>
<p>    　　缺点：<br />
    　　1、虽然可以控制某副图片是否下载，但如果该图片带链接，点击后就直接访问了该链接，无法控制该图片的下载<br />
    　　2、加星看图片的方式毕竟不方便<br />
    　　3、毕竟是浏览器阅读，Google Reader并非是为移动设备设计的，版面不好看，且操纵不方便，最关键的是不能管理来源，即不能修改也不能添加RSS Feed</p>
<p>　　<strong>方案二：QuickNews</strong><br />
　　<a href="http://standalone.com/palmos/quick_news/">QuickNews</a>是Palm上的老牌RSS阅读软件，特性包括图片的单独下载、Podcast支持（在中国用手机下载Podcast简直就是给移动注资）、代理支持（也就是说支持CMWAP）以及对不同Feed较好的兼容性。<br />
　　缺点非常明显，由于绝对不支持UTF-8，除非在源上作处理，否则根本无法阅读绝大部分中文RSS。</p>
<p>　　<strong>方案三：Gregarius+Resco Neeews</strong><br />
　　这才是我们要说的重头戏，既然QuickNews什么都好，就是不能读UTF-8的中文页面，那我们就需要找一个能解决这一问题、还能拥有它其他功能的方案来。<br />
　　<a href="http://gregarius.net/">Gregarius</a>是著名的基于php的RSS聚合器，功能就是将你所设定的来源聚合在一起，以HTM或者XML方式输出，对于普通用户来说，其实作用和Google Reader差不多，但是Google Reader不提供XML输出。<br />
　　<a href="http://www.resco.net/palm/neeews/">Resco Neeews</a>是Palm 上RSS阅读软件的后起之秀，我是从它最初的测试版一直跟进到现在的，直到前段时间它的最新版本支持了图片的单独下载（点击图片可以选择），我才决定构建这一套解决方案。他最大的特点，是可以读取经过某种处理的UTF-8的RSS，具体是什么原理，我也没有明白，不排除是我所说的“某种处理”会根据 HTTP Request中的编码请求决定发出的编码吧。这种“处理”就是第三方的Feed托管，例如<a href="http://www.feedburner.com/">FeedBurner</a>，但是它被盾了；<a href="http://www.feedsky.com/">FeedSky</a>我没试过，不清楚是否有效。求人不如求己，我决定自己搭建一个Feed托管，最方便的办法就是用Gregarius了。我们来看看步骤</p>
<p>Gregarius部分：<br />
　　1、你需要一个php空间，最好有Cron Job的功能（Linux下的定时执行）。我用了英国的STRATO空间，因为便宜啊（一英镑一年……），而且在国外的好处还在于，我们的聚合器可以随意读取任何Feed（例如FeedBurner的）而不受大墙的限制，这也是新式的翻墙方式吧……<br />
　　2、下载最新版本的Gregarius，并且上传到服务器，不用修改任何配置文件，安装程序会帮你做一切，它会询问你数据库用户名和密码，管理员用户名和密码等等。<br />
　　3、假设你上传到的地址是http://example.com/Gregarius,则访问http://example.com/Gregarius/install.php进行安装。<br />
　　4、如果出现500错误，说明你的空间可能跟我一样没有打开mod_rewrite，请你删除服务器上Gregarius目录下的.htaccess 文件，并且访问http://example.com/gregarius/admin/index.php?domain=config，把 rss.output.usemodrewrite关掉。<br />
　　5、访问Gregarius，修改配置（可以用中文），加入Feed（可以导入OPML），然后你就获得了一个运作正常的RSS聚合器，一个你自己的Blog门户（你可以用它来代替Google Reader等阅读器，平时在PC上也可以阅读）。<br />
　　6、打开RSS输出。Gregarius默认不提供RSS输出，请到Gregarius的插件中打开RSS View插件，这样在页面的底部就会出现RSS和ATOM链接，整个聚合器、每个分类和每个源都分别有一个RSS输出。<br />
　　7、你需要有一个自动更新的方式。Gregarius默认的更新方式是，每当浏览器打开它的页面长达一定时间的时候，就开始更新。这个值可以在设置中通过rss.config.refreshafter来修改。但由于我们要用手机阅读，这显然不是一个好的办法。最笨的办法莫过于用手机访问Gregarius的首页，然后点一下更新，不过如果你没有Cron Job（或者其他任何可以定时访问某个地址的服务器），可能也只能这样了。<br />
　　利用Cron Job自动更新的方法：设置一个Cron命令为</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-O</span> - <span style="color: #660033;">-q</span> http:<span style="color: #000000; font-weight: bold;">//</span>example.com<span style="color: #000000; font-weight: bold;">/</span>gregarius<span style="color: #000000; font-weight: bold;">/</span>update.php</pre></div></div>

<p>　　其中wget是一个简易http/ftp Client，-O表示输出到特定文件，-表示输出到的这个文件不存在（即不输出），-q表示安静模式（不在shell下返回结果）。然后设置更新频率（我设为四小时一次），其他的自己看着办就行了。如果是需要你自己输入完整命令的方式（shell下的方式），大家可以上网去搜索Cron php，可以找到Cron命令的完整使用方式。</p>
<p>Neeews部分：<br />
　　1、你需要有一台能上网的Palm设备（废话），我的是Treo680。<br />
　　2、安装Neeews（网上到处都有Resco全套软件的Keygen，而且Resco财大气粗，多年不换key的生成方式……Keygen我不方便提供）<br />
　　3、新建Newspaper，加入相应的Feed，我个人建议对你在Gregarius中的每个分类建立一个Newspaper，这样不需要添加很多 Feed，也不需要把所有Feed堆在一起造成难以阅读。例如我的分类就是Blogs（朋友的Blog）,Blogs-other（名人的Blog）， tech（瘾科技和奇趣发现），等等等等。<br />
　　4、修改设置，记得设置所有的Newspaper都为“Show Images”，在全局设置中的“Image Options”中，选上“Offline mode”。前者的作用是在更新的时候显示出图片的图标，后者的作用是只要没有进行更新，每次进入Newspaper的时候不重新下载图片。<br />
　　5、每次更新的时候，记得在更新完内容、开始下载图片的时候，点左上角的小叉停止下载图片，然后在浏览的时候看到想要看的图片，点击图标，然后选择Download Image即可。</p>
<p>　　Ok，现在你可以在手机上享受阅读RSS的乐趣了。我的Gregarius的地址：rss.williamgates.biz ，大家可以去看看效果。</p>
<p>　　当然还有更好的办法，自己写一个聚合器，可以转换编码，可以针对不同的来源Feed做不同的处理，还可以下载图片到聚合器的服务器上并且修改大小来适应手机（可以避免163等的反盗链，又可以减少手机的流量）。我已经用C#写了一个并且成功运行了一年多了，但是服务器在我们校园网内，暂时无法从校外访问，我在校外也没有asp.net的服务器，所以也就没有使用这个办法。而且我的程序也有一些不足，其中我说的修改图片大小的功能还没做，对某些来源的处理不如Gregarius优秀，有的时候还要借用FeedBurner和FeedSky进行一次预转换才能完美读取。明年等我考过研，我会重新和完善这个程序，到时候也许我们就拥有更好的解决方案了。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2007/11/gregarius-neeews-read-rss/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Treo650通过蓝牙接收任何类型文件的解决之道——Softick Bluetooth Commander</title>
		<link>http://blog.williamgates.biz/2007/02/treo-receive-any-file-type-with-bluetooth/</link>
		<comments>http://blog.williamgates.biz/2007/02/treo-receive-any-file-type-with-bluetooth/#comments</comments>
		<pubDate>Mon, 19 Feb 2007 13:13:59 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Palm]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[treo]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2007/02/19/60</guid>
		<description><![CDATA[　　今天要把另一台手机(三星D608)上的文件传给Treo650，文件是mp4，直接用蓝牙传输Treo不接受，接收完后提示数据格式不支持。这是老问题了，我一直没有找到解决的办法，今天决定研究一下。
　　先是搜到了这个BlueFiles，但是它似乎只是类似CardExport，只能把Palm变成一个类似U盘的东西让别的设备来访问而以，接收别的设备发来的文件时，还是不能接受Palm系统默认不识别的格式。
　　然后很偶然地看到一个软件，和BlueFiles一样也是Softick出的，但是0day没有出过——Softick Bluetooth Commander 。根据介绍，它可以浏览、管理本机和其他所有蓝牙连接设备的文件，并且进行复制、粘贴等操作。试用了一下它的1.02版，发现很好用，可以解决我的问题了，只要访问D608的共享内容，把文件复制到Palm的卡上就好了，简单、快捷。


　　我下载的是官方的试用版，后来搜索才知道，1.02以前不支持中文目录，故不能用于D608(它的目录都是中文)，以后想要长期用这个软件怎么办呢？翻遍了网上居然难求一个破解，DRL也仅有一位朋友上过1.00的破解。
　　但是我发现了这个：照猫画虎地破解了Softick Bluetooth Commander，此君给出了方案，于是我对照1.00的破解，修改1.02版本的程序成功。
现在附上修改好的文件以及必须装的一个附件，只安装这两个就可以用了


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　今天要把另一台手机(三星D608)上的文件传给Treo650，文件是mp4，直接用蓝牙传输Treo不接受，接收完后提示数据格式不支持。这是老问题了，我一直没有找到解决的办法，今天决定研究一下。<br />
　　先是搜到了这个<a href="http://www.softick.com/bluefiles/">BlueFiles</a>，但是它似乎只是类似CardExport，只能把Palm变成一个类似U盘的东西让别的设备来访问而以，接收别的设备发来的文件时，还是不能接受Palm系统默认不识别的格式。<br />
　　然后很偶然地看到一个软件，和BlueFiles一样也是Softick出的，但是0day没有出过——<a href="http://www.softick.com/commander/">Softick Bluetooth Commander</a> 。根据介绍，它可以浏览、管理本机和其他所有蓝牙连接设备的文件，并且进行复制、粘贴等操作。试用了一下它的1.02版，发现很好用，可以解决我的问题了，只要访问D608的共享内容，把文件复制到Palm的卡上就好了，简单、快捷。<br />
<span id="more-60"></span><br />
<img src='http://blog.williamgates.biz/wp-content/uploads/2008/01/commander_screen.gif' alt='commander_screen.gif' /></p>
<p>　　我下载的是官方的试用版，后来搜索才知道，1.02以前不支持中文目录，故不能用于D608(它的目录都是中文)，以后想要长期用这个软件怎么办呢？翻遍了网上居然难求一个破解，DRL也仅有一位朋友上过1.00的破解。<br />
　　但是我发现了这个：<a href="http://joystyle.spaces.live.com/blog/cns!72E3E59C808D926B!652.entry">照猫画虎地破解了Softick Bluetooth Commander</a>，此君给出了方案，于是我对照1.00的破解，修改1.02版本的程序成功。</p>
<p>现在附上修改好的文件以及必须装的一个附件，只安装这两个就可以用了<br />
Note: There is a file embedded within this post, please visit this post to download the file.</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2007/02/treo-receive-any-file-type-with-bluetooth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>迁移和升级WordPress的心得</title>
		<link>http://blog.williamgates.biz/2006/11/move-and-upgrade-wordpress-205/</link>
		<comments>http://blog.williamgates.biz/2006/11/move-and-upgrade-wordpress-205/#comments</comments>
		<pubDate>Wed, 01 Nov 2006 13:23:42 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/11/01/38</guid>
		<description><![CDATA[　　最近搬迁了我的BLog，从校内自己拥有的服务器转移到公网仅支持php/MySQL的空间，从WordPress2.0.4升级为2.0.5，MySQL从5.0.21转移到3.23.58，其间遇到不少麻烦，也学得一些技巧，下面简单谈谈心得。
　　一、数据库的备份
　　从自己的服务器上备份数据库，本以为是很容易的事情，谁知却总也无法在phpMyAdmin中导入，用另外的方法（后文提到）导入时，看到的所有文章都是乱码。后来发现，WordPress默认的数据库编码是UTF-8，而我用的图形化MySQL管理器Navicat MySQL默认的数据库联接虽然显示的是UTF-8，但事实上还是需要手动设置：Connection Properties-Advanced，把Use MySQL character set的钩去掉，然后选择Encoding为UTF-8，然后联接数据库，再开始备份(用Export Wizard)出来的SQL文件就不是乱码了。网上所说的修改SQL文件、用Word打开等等方法，全都是不必要的。

　　备份以下几个表

williamgates_categories
williamgates_comments
williamgates_linkcategories
williamgates_post2cat
williamgates_posts

　　建议不要备份其他表(会导致一些问题，建议你把其他表的内容自己手动在新blog中重新设置一下)。要注意的是，我的表前缀是williamgates，这个要在wp-config.php中设置

$table_prefix  = 'williamgates_';

　　这是你一开始安装WordPress时选择的设置，一般来说没有我这种情况。
　　二、数据库的导入
　　要导入数据库的时候，碰到了新的麻烦。使用公网新空间提供的phpMyAdmin，运行SQL文件总是提示出错。这篇和这篇文章提供了解决办法。
　　事实证明，mysqldump出来的数据库是乱码(所以我用了图形管理端来备份)，但是php代码写的导入功能还是非常有用的：

&#60; ?php `mysql -uroot -pxxxxxx dbname &#60;db.sql`?&#62;

　　其中-u表示用户名是root，-p表示密码是xxxxxx，dbname是数据库名，db.sql是SQL文件的名称（注意在apache中运行的时候区分大小写，且前面的左尖括号后面必须有空格）
　　把这个php和sql上传到空间，再访问这个php的地址，很快就导入了，再看看自己的blog，嘿嘿，已经全都好了。
　　要注意的是，导入前建议清空我前面建议的几个表，其他表不要动，否则会导致用户管理上的某些奇怪问题(有时候没有第一行的表没法被写入)。
　　三、WordPress的重新配置和升级
　　首先要在导入数据库前安装好wp2.0.4(与迁移前同版本)，由于我建议不要备份设置，所以所有的设置你都需要自己修改，注意这两个：

WordPress address (URI): 
Blog address (URI):

　　肯定是要修改的
　　然后在进行了上一步导入数据后，下载2.0.5(在我部署好之后8个小时就发布了新版，真不给面子)，然后删除原来的文件，并且运行wp-admin/upgrade.php，就升级好了。原来的blog里的上载文件可以在升级前或者升级后复制过来，都一样的。
　　(升级教程见http://codex.wordpress.org/Upgrading_WordPress)
　　四、新空间的维护和备份
　　新的空间里，要使用WordPress Database Backup(在我的旧空间无法使用，原因不明)，以后数据库导出就用它就可以了(最好不要用php代码和phpMyAdmin的导出功能。特别是在我的服务商提供的MySQL和phpMyAdmin版本都极为陈旧的情况下……)
　　另外建议时常备份自己的数据库、上载文件甚至整个blog，毕竟部署一次还是很痛苦的，特别是像我这样喜欢自定义的人(要注意备份theme下面自己捣鼓修改的页面文件)。


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　最近搬迁了我的BLog，从校内自己拥有的服务器转移到公网仅支持php/MySQL的空间，从WordPress2.0.4升级为2.0.5，MySQL从5.0.21转移到3.23.58，其间遇到不少麻烦，也学得一些技巧，下面简单谈谈心得。</p>
<p>　　一、数据库的备份<br />
　　从自己的服务器上备份数据库，本以为是很容易的事情，谁知却总也无法在phpMyAdmin中导入，用另外的方法（后文提到）导入时，看到的所有文章都是乱码。后来发现，WordPress默认的数据库编码是UTF-8，而我用的图形化MySQL管理器Navicat MySQL默认的数据库联接虽然显示的是UTF-8，但事实上还是需要手动设置：Connection Properties-Advanced，把Use MySQL character set的钩去掉，然后选择Encoding为UTF-8，然后联接数据库，再开始备份(用Export Wizard)出来的SQL文件就不是乱码了。网上所说的修改SQL文件、用Word打开等等方法，全都是不必要的。<br />
<span id="more-38"></span><br />
　　备份以下几个表</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">williamgates_categories
williamgates_comments
williamgates_linkcategories
williamgates_post2cat
williamgates_posts</pre></div></div>

<p>　　建议不要备份其他表(会导致一些问题，建议你把其他表的内容自己手动在新blog中重新设置一下)。要注意的是，我的表前缀是williamgates，这个要在wp-config.php中设置</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">$table_prefix  <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'williamgates_'</span>;</pre></div></div>

<p>　　这是你一开始安装WordPress时选择的设置，一般来说没有我这种情况。</p>
<p>　　二、数据库的导入<br />
　　要导入数据库的时候，碰到了新的麻烦。使用公网新空间提供的phpMyAdmin，运行SQL文件总是提示出错。<a href="http://www.ooso.net/index.php/archives/224">这篇</a>和<a href="http://www.ooso.net/index.php/archives/186">这篇</a>文章提供了解决办法。<br />
　　事实证明，mysqldump出来的数据库是乱码(所以我用了图形管理端来备份)，但是php代码写的导入功能还是非常有用的：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php `<span style="color: #990000;">mysql</span> <span style="color: #339933;">-</span>uroot <span style="color: #339933;">-</span>pxxxxxx dbname <span style="color: #339933;">&lt;</span>db<span style="color: #339933;">.</span>sql`<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>　　其中-u表示用户名是root，-p表示密码是xxxxxx，dbname是数据库名，db.sql是SQL文件的名称（注意在apache中运行的时候区分大小写，且前面的左尖括号后面必须有空格）<br />
　　把这个php和sql上传到空间，再访问这个php的地址，很快就导入了，再看看自己的blog，嘿嘿，已经全都好了。<br />
　　要注意的是，导入前建议清空我前面建议的几个表，其他表不要动，否则会导致用户管理上的某些奇怪问题(有时候没有第一行的表没法被写入)。</p>
<p>　　三、WordPress的重新配置和升级<br />
　　首先要在导入数据库前安装好wp2.0.4(与迁移前同版本)，由于我建议不要备份设置，所以所有的设置你都需要自己修改，注意这两个：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">WordPress address (URI): 
Blog address (URI):</pre></div></div>

<p>　　肯定是要修改的</p>
<p>　　然后在进行了上一步导入数据后，下载2.0.5(在我部署好之后8个小时就发布了新版，真不给面子)，然后删除原来的文件，并且运行wp-admin/upgrade.php，就升级好了。原来的blog里的上载文件可以在升级前或者升级后复制过来，都一样的。<br />
　　(升级教程见http://codex.wordpress.org/Upgrading_WordPress)</p>
<p>　　四、新空间的维护和备份<br />
　　新的空间里，要使用WordPress Database Backup(在我的旧空间无法使用，原因不明)，以后数据库导出就用它就可以了(最好不要用php代码和phpMyAdmin的导出功能。特别是在我的服务商提供的MySQL和phpMyAdmin版本都极为陈旧的情况下……)<br />
　　另外建议时常备份自己的数据库、上载文件甚至整个blog，毕竟部署一次还是很痛苦的，特别是像我这样喜欢自定义的人(要注意备份theme下面自己捣鼓修改的页面文件)。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/11/move-and-upgrade-wordpress-205/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>部署Squid3.0的心得</title>
		<link>http://blog.williamgates.biz/2006/08/setup-squid/</link>
		<comments>http://blog.williamgates.biz/2006/08/setup-squid/#comments</comments>
		<pubDate>Sun, 13 Aug 2006 15:32:32 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/08/13/34</guid>
		<description><![CDATA[部署的是squid-3.0.PRE4.tar.gz，不加iptables，不使用任何外加插件
下面不是部署全过程，只是一点心得
一、configure的时候要注意参数

如果要使用HTTPS，要加上&#8211;enable-ssl（我加了才发现用不到……）
如果要在定义ACL的时候使用arp选项（即使用MAC地址来判定用户）需要加上&#8211;enable-arp-acl
如果要允许解析的URL中出现下划线，要加上&#8211;enable-underscore，因为默认情况下Squid会认为带下划线的URL是非法的，并拒绝访问该地址。这个我没试过

二、ACL配置
如果不加载第三方工具，ACL配置是Squid中唯一的访问控制方法。这个东西的功能其实跟CCProxy的身份控制差不多（但是没有用户名密码认证功能），但是配置起来要更复杂也更强大。

配置格式：acl aclname acltype string1


常用的定义类型：
src      ip-address/netmask
src      addr1-addr2/netmask
用来源的IP地址定义，一个ip#即mask方式就是网络，cidr方式就是单个ip
acl aclname dst      ip-address/netmask
目标地址
acl aclname arp      mac-address
后悔编译的时候没加&#8211;enable-arp-acl参数，这个功能很有用的
acl aclname dstdomain   .foo.com
类似于CCProxy的访问限制，例如可以限制只能访问.cn的站点、不能访问.xxx的站点等等
acl aclname dstdom_regex [-i] xxx
用正则，不过……谁这么无聊呢……
acl aclname http_status 200 301 500- 400-403
根据HTTP Response返回值，这个很有效，比如规定302Moved就不访问
acl aclname port
端口
acl aclname proto
协议
acl aclname method
方式，例如只能GET不能CONNECT

acl aclname [...]]]></description>
			<content:encoded><![CDATA[<p>部署的是squid-3.0.PRE4.tar.gz，不加iptables，不使用任何外加插件<br />
下面不是部署全过程，只是一点心得</p>
<p>一、configure的时候要注意参数</p>
<ul>
<li>如果要使用HTTPS，要加上&#8211;enable-ssl（我加了才发现用不到……）</li>
<li>如果要在定义ACL的时候使用arp选项（即使用MAC地址来判定用户）需要加上&#8211;enable-arp-acl</li>
<li>如果要允许解析的URL中出现下划线，要加上&#8211;enable-underscore，因为默认情况下Squid会认为带下划线的URL是非法的，并拒绝访问该地址。这个我没试过</li>
</ul>
<p>二、ACL配置<br />
如果不加载第三方工具，ACL配置是Squid中唯一的访问控制方法。这个东西的功能其实跟CCProxy的身份控制差不多（但是没有用户名密码认证功能），但是配置起来要更复杂也更强大。</p>
<ul>
配置格式：<em>acl aclname acltype string1</em>
</ul>
<ul>
常用的定义类型：</p>
<li>src      ip-address/netmask<br />
src      addr1-addr2/netmask<br />
用来源的IP地址定义，一个ip#即mask方式就是网络，cidr方式就是单个ip</li>
<li>acl aclname dst      ip-address/netmask<br />
目标地址</li>
<li>acl aclname arp      mac-address<br />
后悔编译的时候没加&#8211;enable-arp-acl参数，这个功能很有用的</li>
<li>acl aclname dstdomain   .foo.com<br />
类似于CCProxy的访问限制，例如可以限制只能访问.cn的站点、不能访问.xxx的站点等等</li>
<li>acl aclname dstdom_regex [-i] xxx<br />
用正则，不过……谁这么无聊呢……</li>
<li>acl aclname http_status 200 301 500- 400-403<br />
根据HTTP Response返回值，这个很有效，比如规定302Moved就不访问</li>
<li>acl aclname port<br />
端口</li>
<li>acl aclname proto<br />
协议</li>
<li>acl aclname method<br />
方式，例如只能GET不能CONNECT</li>
<li>
acl aclname browser  [-i] regexp<br />
这个也太强了……限制浏览器用户代理标志类型</li>
</ul>
<p>还可以规定mime类型、响应时间等等等等……绝对强大<br />
<span id="more-34"></span><br />
我的ACL设置：<br />
很简单的设置，没有用复杂的功能限制</p>
<p>以下是默认的，直接使用了：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">acl all src 0.0.0.0<span style="color: #000000; font-weight: bold;">/</span>0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1<span style="color: #000000; font-weight: bold;">/</span>255.255.255.255
acl to_localhost dst 127.0.0.0<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8</span>
acl SSL_ports port <span style="color: #000000;">443</span> <span style="color: #000000;">563</span>
acl Safe_ports port <span style="color: #000000;">80</span>		<span style="color: #666666; font-style: italic;"># http</span>
acl Safe_ports port <span style="color: #000000;">21</span>		<span style="color: #666666; font-style: italic;"># ftp</span>
acl Safe_ports port <span style="color: #000000;">443</span> <span style="color: #000000;">563</span>	<span style="color: #666666; font-style: italic;"># https, snews</span>
acl Safe_ports port <span style="color: #000000;">70</span>		<span style="color: #666666; font-style: italic;"># gopher</span>
acl Safe_ports port <span style="color: #000000;">210</span>		<span style="color: #666666; font-style: italic;"># wais</span>
acl Safe_ports port <span style="color: #000000;">1025</span>-<span style="color: #000000;">65535</span>	<span style="color: #666666; font-style: italic;"># unregistered ports</span>
acl Safe_ports port <span style="color: #000000;">280</span>		<span style="color: #666666; font-style: italic;"># http-mgmt</span>
acl Safe_ports port <span style="color: #000000;">488</span>		<span style="color: #666666; font-style: italic;"># gss-http</span>
acl Safe_ports port <span style="color: #000000;">591</span>		<span style="color: #666666; font-style: italic;"># filemaker</span>
acl Safe_ports port <span style="color: #000000;">777</span>		<span style="color: #666666; font-style: italic;"># multiling http</span>
acl CONNECT method CONNECT</pre></div></div>

<p>以下是我修改的：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">http_access allow CONNECT all 
<span style="color: #666666; font-style: italic;">#默认是这句http_access deny CONNECT !SSL_ports</span>
<span style="color: #666666; font-style: italic;">#这样才能支持使用HTTPS地址前缀，也才能在下级生成Socks、FTP等代理</span>
acl LilyStudio src ip1 ip2
<span style="color: #666666; font-style: italic;">#两个ip地址是我要让其允许访问的</span>
http_access allow LilyStudio
http_access deny all</pre></div></div>

<p>要注意，acl 定义的name是全局的，也就是说不能重复定义一个name，即</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">acl a src 210.29.240.1
acl a src 210.29.240.2</pre></div></div>

<p>只会有后一条起作用</p>
<p>经过这样的配置，Squid就能完整地运行了，下面我们来看看在校园网内部署的时候，必不可少的二级代理的功能</p>
<p>三、二级代理的使用<br />
首先，要使用上级代理可以这样写配置文件</p>
<p><code>cache_peer <em>proxy1</em> parent  <em>port1</em> <em>port2</em> proxy-only login=<em>user</em>:<em>pwd</em> no-query default</code></p>
<ul>
<li>其中proxy1是上级代理的IP地址，port1是其http端口号，port2是icp端口号（打开的话，一般为3130，在此我们使用0，禁用</li>
<li>parent表示这是一个父代理（后面会提到兄弟代理）</li>
<li>login的作用是给上级代理的用户验证</li>
<li>proxy-only表示不进行本地缓存，直接将这个缓存服务器的内容转发给客户</li>
<li>no-query表示不发送icp信息</li>
<li>default表示这个代理是“最后的”选择，即如果所有线路都不通就发送给它，特别在不使用icp的时候有用</li>
</ul>
<p>　　Squid还支持所谓的兄弟代理（Sibling类型），对于父代理，Squid会一直向其要数据（如果没有本地缓存），等不到回应就无动作或返回超时；对于兄弟代理，Squid先从其上寻找数据，找不到则自己直接去访问数据，简而言之兄弟代理是另一个缓存而已。</p>
<p>以下这段是转的：</p>
<blockquote><p>
一般 Squid Server 运作的模式是：<br />
1. 当 Squid Server 没有资料时，会先向 Sibling 的 Squid Server 要资料，如果 Sibling 没资料，就跳过它直接向 Parent 要。<br />
2. 向 Parent 要资料，然後一直等，直到 Parent 给它资料为止(Parent 自己有的资料或上 internet 去拿)。<br />
3. 没有 Parent 时，就自己上 internet 去拿。<br />
4. 如果这三者都拿不到资料，才向用户端回报拿不到资料。 </p>
<p>　　一般而言，把网路上一层的 Squid Server  设成 Sibling 是不错的选择，因为网路上一层的 Squid Server 服务对象较多，其硬体较强，离我们比较近，速度也比较快；万一要不到资料，我们还可以自己上 internet 去拿。那什么时候设 Parent？当您的出口只有一个，或上一层 Squid Server 拿不到资料，自己也一定拿不到，只好将上一层 Squid Server 设为 Parent。 </p></blockquote>
<p>四、二级代理中的http CONNECT的问题</p>
<p>首先要确保Http_access中，</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#http_access deny CONNECT !SSL_ports</span></pre></div></div>

<p>这句话要注释掉</p>
<p>然后要写这个（查了官方FAQ才知道的）</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">never_direct allow all</pre></div></div>

<p>所有的访问都不会被直接转向，都必须通过cache_peer<br />
否则所有的GET会被发往上级代理，而CONNECT则会被发往目标地址，由于我们需要所有的情况都使用二级代理，所以需要如此设置</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/11/reload/' rel='bookmark' title='Permanent Link: Reload'>Reload</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/08/setup-squid/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>.Net下HTTP访问穿越多层代理的方法以及代理服务器的验证</title>
		<link>http://blog.williamgates.biz/2006/07/aspdotnet-through-multi-proxy/</link>
		<comments>http://blog.williamgates.biz/2006/07/aspdotnet-through-multi-proxy/#comments</comments>
		<pubDate>Thu, 13 Jul 2006 13:17:06 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[proxy]]></category>
		<category><![CDATA[代理]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/07/13/31</guid>
		<description><![CDATA[　　我们学校的网络环境是，所有的出校访问均须通过代理服务器（我们叫作sproxy），并且不能连接国外网站。为此，我想要做一个自动抓取和验证出国代理列表的WebService。我们所有的验证代理的请求，都需要通过两层代理，最终通到用来测试的网站（我使用了www.redhat.com）
　　技术上的思路是，通过连接第一层代理sproxy（支持http tunnel），给第二层代理发送GET指令，从而完成对目标网页的访问。
　　首先，通过普通的匿名透明代理的方法，是直接使用Socket发送GET命令，只不过与GET普通网站稍有不同罢了
直接访问：

GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 06 Jul 2006 15:39:53 GMT
If-None-Match: &#34;1172d9-381c-44ad2ec9&#34;
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.redhat.com
Connection: Keep-Alive
Cookie: s_vi=[CS]v1&#124;44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747

通过本机CCproxy:

GET / HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/4.0 [...]]]></description>
			<content:encoded><![CDATA[<p>　　我们学校的网络环境是，所有的出校访问均须通过代理服务器（我们叫作sproxy），并且不能连接国外网站。为此，我想要做一个自动抓取和验证出国代理列表的WebService。我们所有的验证代理的请求，都需要通过两层代理，最终通到用来测试的网站（我使用了www.redhat.com）</p>
<p>　　技术上的思路是，通过连接第一层代理sproxy（支持http tunnel），给第二层代理发送GET指令，从而完成对目标网页的访问。</p>
<p>　　首先，通过普通的匿名透明代理的方法，是直接使用Socket发送GET命令，只不过与GET普通网站稍有不同罢了</p>
<p>直接访问：</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">GET / HTTP/<span style="color: #ff0000;">1.1</span>
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 06 Jul <span style="color: #ff0000;">2006</span> <span style="color: #ff0000;">15</span>:<span style="color: #ff0000;">39</span>:<span style="color: #ff0000;">53</span> GMT
If-None-Match: <span style="color: #7f007f;">&quot;1172d9-381c-44ad2ec9&quot;</span>
User-Agent: Mozilla/<span style="color: #ff0000;">4.0</span> (compatible; MSIE <span style="color: #ff0000;">6.0</span>; Windows NT <span style="color: #ff0000;">5.2</span>; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.redhat.com
Connection: Keep-Alive
Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747</pre></div></div>

<p>通过本机CCproxy:</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">GET / HTTP/<span style="color: #ff0000;">1.0</span>
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
UA-CPU: x86
Proxy-Connection: Keep-Alive
User-Agent: Mozilla/<span style="color: #ff0000;">4.0</span> (compatible; MSIE <span style="color: #ff0000;">6.0</span>; Windows NT <span style="color: #ff0000;">5.2</span>; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: www.redhat.com
Cookie: s_vi=[CS]v1|44AAA05400004577-A170C060000008A[CE]; Apache=61.147.159.196.23241152032846747</pre></div></div>

<p>　　可以看出来，只要给代理服务器发送正确的请求地址即可，不需要程序上特殊的变化。<br />
　　事实上，对于不使用代理服务器的场合，你可以直接向某HTTP服务器发送GET /，而这在使用代理时不行，需要说明详细地址或者标明Host: www.redhat.com</p>
<p>对于两层代理，就有所不同了<br />
<span id="more-31"></span><br />
　　首先要给sproxy发送一个CONNECT指令，令其去连接某公众网代理（这里称为proxy2），然后通过这个Socket连接发送GET指令给proxy2。这里对sproxy（以后称proxy1）有一个要求，即必须支持CONNECT，也就是说必须是一个HTTP Tunnel，或者说支持HTTPS。<br />
　　由于一开始设置上的问题，我本以为返回HTTP 1.0的CCProxy不支持这样的方式，因为据说HTTP 1.0就不能支持HTTPS，连接一次，发送了数据一定会断开（一开始的测试中的确如此）。后来查阅资料才知道，HTTP 1.0只是默认不使用Connect: Keep-Alive的参数，事实上也是支持的，只要置上这个参数即可。<br />
　　但实际使用中，发现不加上这个参数也是可以的（我对proxy1没有使用这个参数，可能是.net下的Socket类自动加上了）。</p>
<p>　　经过连续数天的测试，一直不能通过，问题集中在，给proxy2发送一次CONNECT命令，Socket就会断开，无法收到数据。这是典型的不支持HTTP Tunnel的表现，但是我一直怀疑是CCproxy和学校代理服务器的问题，没有发现根源所在。<br />
　　因为我们访问sproxy需要用户名密码验证，我不得已才使用了CCProxy。后来，我又安装了一个代理服务器软件，发现其中只要使用“代理嵌套”（CCproxy叫作二级代理）的时候都需要HTTPS，我突然想到，会不会需要在CCproxy中设置？<br />
　　于是，在CCproxy的设置-高级-二级代理中把代理类型设为HTTPS，使用proxy1做上级代理，果然成功。事实上，直接连接学校代理应该也是可以的，只是我还不知道如何在代理请求中发送用户验证信息（需要将验证信息截断为多个数据包，不能直接发送）。</p>
<p>代码如下，调试通过并成功运行了十多天了：</p>
<p>后台一个类：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Get_Socket_Request_uip<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> ip<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            Encoding ASCII <span style="color: #008000;">=</span> Encoding.<span style="color: #0000FF;">Default</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//给Proxy2发送命令</span>
            <span style="color: #FF0000;">string</span> Con <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;CONNECT &quot;</span> <span style="color: #008000;">+</span> ip <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; HTTP/1.1
Connection: Keep-Alive
&nbsp;
&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> Get <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;HEAD http://www.RedHat.com/ HTTP/1.1
Host: www.RedHat.com
Pragma: no-cache
Connection: Close
&nbsp;
&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> ByteCon <span style="color: #008000;">=</span> ASCII.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>Con<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> ByteGet <span style="color: #008000;">=</span> ASCII.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>Get<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> RecvBytes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">256</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> RecvBytes2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">Byte</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">256</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span> 
            <span style="color: #FF0000;">string</span> strRetPage <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
            <span style="color: #FF0000;">string</span> strRetCon <span style="color: #008000;">=</span> null<span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//建立Socket</span>
            Socket s <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Socket<span style="color: #000000;">&#40;</span>AddressFamily.<span style="color: #0000FF;">InterNetwork</span>, SocketType.<span style="color: #0000FF;">Stream</span>, ProtocolType.<span style="color: #0000FF;">Tcp</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//连接本地CCProxy</span>
            IPAddress hostip <span style="color: #008000;">=</span> IPAddress.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;127.0.0.1&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            IPEndPoint ipend <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> IPEndPoint<span style="color: #000000;">&#40;</span>hostip, <span style="color: #FF0000;">808</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008080; font-style: italic;">//设置超时，超过了就证明这个代理无效</span>
            s.<span style="color: #0000FF;">SendTimeout</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">20000</span><span style="color: #008000;">;</span>
            s.<span style="color: #0000FF;">ReceiveTimeout</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">20000</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//这句话就是socket的Keep-Alive，我没有使用</span>
            <span style="color: #008080; font-style: italic;">//s.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true);</span>
            s.<span style="color: #0000FF;">Connect</span><span style="color: #000000;">&#40;</span>ipend<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">try</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">//发送CONNECT命令</span>
                s.<span style="color: #0000FF;">Send</span><span style="color: #000000;">&#40;</span>ByteCon, ByteCon.<span style="color: #0000FF;">Length</span>, <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Int32 bytes <span style="color: #008000;">=</span> s.<span style="color: #0000FF;">Receive</span><span style="color: #000000;">&#40;</span>RecvBytes, RecvBytes.<span style="color: #0000FF;">Length</span>, <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                strRetCon <span style="color: #008000;">=</span> strRetCon <span style="color: #008000;">+</span> ASCII.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>RecvBytes, <span style="color: #FF0000;">0</span>, bytes<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>strRetCon.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;200&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    s.<span style="color: #0000FF;">Send</span><span style="color: #000000;">&#40;</span>ByteGet, ByteGet.<span style="color: #0000FF;">Length</span>, <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                    Int32 bytes2 <span style="color: #008000;">=</span> s.<span style="color: #0000FF;">Receive</span><span style="color: #000000;">&#40;</span>RecvBytes2, RecvBytes2.<span style="color: #0000FF;">Length</span>, <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    strRetPage <span style="color: #008000;">=</span> strRetPage <span style="color: #008000;">+</span> ASCII.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>RecvBytes2, <span style="color: #FF0000;">0</span>, bytes2<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #008080; font-style: italic;">//本来这里会循环接收数据（本来发送的不是HEAD而是GET，取整个页面），后来发现有时候这会导致断线，就去掉了，只用HEAD命令取返回的HTTP Head</span>
                    <span style="color: #008080; font-style: italic;">/*while (bytes2 &gt; 0)
                    {
                        bytes2 = s.Receive(RecvBytes2, RecvBytes2.Length, 0);
                        strRetPage = strRetPage + ASCII.GetString(RecvBytes2, 0, bytes2);
                    }*/</span>
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span>
            <span style="color: #000000;">&#123;</span>
                break<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">finally</span> 
            <span style="color: #000000;">&#123;</span>
               s.<span style="color: #0000FF;">Shutdown</span><span style="color: #000000;">&#40;</span>SocketShutdown.<span style="color: #0000FF;">Both</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
               s.<span style="color: #0000FF;">Close</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">return</span> strRetPage<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

<p>前台的调用方法（已经使用证则表达式在别处的网页中抓取到待检测的代理列表，在matches数组中）：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> TestProxy<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">int</span> r <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">try</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span>Match i <span style="color: #0600FF;">in</span> matches<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #FF0000;">string</span> ip <span style="color: #008000;">=</span> i.<span style="color: #0000FF;">Result</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;${ip}&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #FF0000;">string</span> port <span style="color: #008000;">=</span> i.<span style="color: #0000FF;">Result</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;${port}&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    <span style="color: #0600FF;">try</span>
                    <span style="color: #000000;">&#123;</span>
                        <span style="color: #008080; font-style: italic;">//这里的hc是后台那个类，myhttpclient</span>
                        <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> hc.<span style="color: #0000FF;">Get_Socket_Request_uip</span><span style="color: #000000;">&#40;</span>ip <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> port<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>result.<span style="color: #0000FF;">Contains</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;200 OK&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                        <span style="color: #000000;">&#123;</span>
                            checkedproxy<span style="color: #000000;">&#91;</span>r<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> ip <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> port<span style="color: #008000;">;</span>
                            r <span style="color: #008000;">=</span> r <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
                        <span style="color: #000000;">&#125;</span>
                    <span style="color: #000000;">&#125;</span>
                    <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>TimeoutException<span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        continue<span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                    <span style="color: #0600FF;">catch</span>
                    <span style="color: #000000;">&#123;</span>
                        continue<span style="color: #008000;">;</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span>
            <span style="color: #000000;">&#123;</span>
                break<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span></pre></div></div>

<p>　　WebService代码就不给出了，就是调用这个方法而已。<br />
　　<br />
　　大家应该可以看出，这里实际上通过了三层代理（CCproxy，proxy1，proxy2），所以，如果要通过n层代理，方法也是一样的，只要一层层的CONNECT下去就行，但要求前n-1层代理都要支持HTTP tunnel。<br />
　　另外，在实际部署中使用这个程序，需要在Web.config中的system.web项下添加一行</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;httpruntime</span> <span style="color: #000066;">executionTimeout</span>=<span style="color: #ff0000;">&quot;600&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span></pre></div></div>

<p>　　否则超过10项的代理列表，几乎一定会超时的</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
<li><a href='http://blog.williamgates.biz/2009/07/struggle_or_cheat/' rel='bookmark' title='Permanent Link: 作弊的社会'>作弊的社会</a></li>
<li><a href='http://blog.williamgates.biz/2009/07/the-end-of-pep-enlish/' rel='bookmark' title='Permanent Link: 人教版的秒速五厘米——80后共同的青春童话'>人教版的秒速五厘米——80后共同的青春童话</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/07/aspdotnet-through-multi-proxy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Linux下多FTPD的共存，以及突破glftpd的chroot</title>
		<link>http://blog.williamgates.biz/2006/07/mulit-ftpd-under-linux/</link>
		<comments>http://blog.williamgates.biz/2006/07/mulit-ftpd-under-linux/#comments</comments>
		<pubDate>Sun, 09 Jul 2006 17:22:59 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[FTP]]></category>
		<category><![CDATA[glftpd]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/07/10/25</guid>
		<description><![CDATA[　　新接手一台FTP Server，其上本来的FTPD为vsftpd+ncftpd，vs做前台，仅提供匿名下载，nc做后台，仅给管理员使用。nc很不稳定，效率不高，功能单薄，我准备换成glftpd。但是糟糕的是，ncftpd原来只有一个管理员账号，所有的文件都属于这个用户，而且很多文件权限不是755，甚至只有644。有root当然可以chmod和chown，但是，原来1.5T的数据，且不是高速更新的FTP，如何chown？
　　glftpd安装的时候，被我装在了 /jail 下，选择了“封闭环境”安装。但是当我尝试把别处的目录mount到它下面的时候，就遇到权限的问题，不仅不能删除很多来自ncftpd的文件，甚至部分文件根本无法访问。最糟糕的是，glftpd下载的时候会写文件（我后来才知道可以关掉这个功能），每下载一次，它会把该文件的GID加一，以方便计算下载总数。
　　于是我们的问题就归结成了，如何让glftpd获得UID不是100（新建用户默认值）的文件的所有权？
　　翻看glftpd的文档，发现了一个本来应该不相干的内容：如何突破glftpd的chroot。我们都知道glftpd是用root启动的，但是启动后它会立刻换成较低权限的用户去运行，并且将该用户的root限定在某一个固定的目录下（在我的安装中，默认是“封闭环境”的根目录，即 /jail ）有的人需要突破这种限制，比如访问上层目录下的文件。我本来想用mount解决这个问题的，但是它的步骤说明吸引了我：


1. Change all instances of /site to /glftpd/site in your config file
把glftpd.conf配置文件中所有的路径都换成绝对路径，在此，我是 /jail/glftpd
2. Add the pwd_path and grp_path settings to the config file:
pwd_path /glftpd/etc/passwd
grp_path /glftpd/etc/group
修改passwd和group文件的路径，配置文件中默认没有这两行的
3. Change datapath from /ftp-data to /glftpd/ftp-data
还是改路径
4. Edit /glftpd/etc/passwd and change every user&#8217;s homedir from /site to /glftpd/site.
修改passwd文件，将家目录改成绝对路径
5. Edit /glftpd/ftp-data/users/default.* and change the HOMEDIR line from [...]]]></description>
			<content:encoded><![CDATA[<p>　　新接手一台FTP Server，其上本来的FTPD为vsftpd+ncftpd，vs做前台，仅提供匿名下载，nc做后台，仅给管理员使用。nc很不稳定，效率不高，功能单薄，我准备换成glftpd。但是糟糕的是，ncftpd原来只有一个管理员账号，所有的文件都属于这个用户，而且很多文件权限不是755，甚至只有644。有root当然可以chmod和chown，但是，原来1.5T的数据，且不是高速更新的FTP，如何chown？<br />
　　glftpd安装的时候，被我装在了 /jail 下，选择了“封闭环境”安装。但是当我尝试把别处的目录mount到它下面的时候，就遇到权限的问题，不仅不能删除很多来自ncftpd的文件，甚至部分文件根本无法访问。最糟糕的是，glftpd下载的时候会写文件（我后来才知道可以关掉这个功能），每下载一次，它会把该文件的GID加一，以方便计算下载总数。<br />
　　于是我们的问题就归结成了，如何让glftpd获得UID不是100（新建用户默认值）的文件的所有权？<br />
　　翻看glftpd的文档，发现了一个本来应该不相干的内容：如何突破glftpd的chroot。我们都知道glftpd是用root启动的，但是启动后它会立刻换成较低权限的用户去运行，并且将该用户的root限定在某一个固定的目录下（在我的安装中，默认是“封闭环境”的根目录，即 /jail ）有的人需要突破这种限制，比如访问上层目录下的文件。我本来想用mount解决这个问题的，但是它的步骤说明吸引了我：<br />
<span id="more-25"></span></p>
<blockquote><p>
1. Change all instances of /site to /glftpd/site in your config file<br />
把glftpd.conf配置文件中所有的路径都换成绝对路径，在此，我是 /jail/glftpd</p>
<p>2. Add the pwd_path and grp_path settings to the config file:<br />
pwd_path /glftpd/etc/passwd<br />
grp_path /glftpd/etc/group<br />
修改passwd和group文件的路径，配置文件中默认没有这两行的</p>
<p>3. Change datapath from /ftp-data to /glftpd/ftp-data<br />
还是改路径</p>
<p>4. Edit /glftpd/etc/passwd and change every user&#8217;s homedir from /site to /glftpd/site.<br />
修改passwd文件，将家目录改成绝对路径</p>
<p>5. Edit /glftpd/ftp-data/users/default.* and change the HOMEDIR line from /siteto /glftpd/site.<br />
修改新建用户的默认家目录</p>
<p>6. You also need to change paths in some help files in /glftpd/ftp-data/help,possibly some more in /glftpd/ftp-data/text.<br />
我看了所有的这些文件，应该没什么要改的</p></blockquote>
<p>后面是最关键的：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">Make a user, lets say root
site adduser root root *@127.0.0.1
site grpadd wheel root group (or root, depending on the OS you are running)
&nbsp;
Now go edit /glftpd/etc/passwd, you will see that glftpd has the 0:0 uid and gid
just give it 10:100 or 20:200 and give root 0:0, also change root's homedir -
default is /site, change it to /.
&nbsp;
Now edit the group file and move the number of glftpd to 100 or 200 and change roots to 0.</pre></div></div>

<p>　　看到了么，我就是在这发现了突破口！原来glftpd的用户也是可以自定义UID和GID的，那么我只要修改passwd文件，让所有的管理员都拥有root（这样不安全）或者原来的数据所有者（ncftpd的管理员帐户）的GID和UID就行了。我就是这么做的</p>
<p>　　这样，我既可以访问 /jail 以上的目录（/home/ftp/），不用mount了，也可以继续使用原来的数据，不用chmod和chown了。只要使用相同UID和GID的帐号，两个FTPD完全可以共存。（本来准备把所有文件下载再上传呢……谢天谢地）</p>
<p>　　要说明的是，你当然可以使用0:0做你的管理员帐号的UID和GID，但是这样不太安全，加上glftpd一直有chroot泄漏的传言（据说已修复），所以还是设定一个特定的用户为妙。另外，这样不再能使用glftpd的一个特色功能：设定用户的delown和renameown权限，因为所有用户看起来都一样了。但经过实际实验，基于路径的权限分配是没有问题的，基于flag的权限分配也很正常，但是有可能会在site who的时候，看到一个本不属于某个组的成员，显示在这组里（比如我的一个DirAdmin显示成SuperAdmin），但是不会真正拥有权限，放心。</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
<li><a href='http://blog.williamgates.biz/2009/03/all-about-procrastinators/' rel='bookmark' title='Permanent Link: 从拖延症说开去——到底谁才是被信息洪流击倒的人？'>从拖延症说开去——到底谁才是被信息洪流击倒的人？</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/07/mulit-ftpd-under-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ASP.NET应用程序的http请求超时的解决方案</title>
		<link>http://blog.williamgates.biz/2006/07/aspdotnet-timeout-solution/</link>
		<comments>http://blog.williamgates.biz/2006/07/aspdotnet-timeout-solution/#comments</comments>
		<pubDate>Sun, 09 Jul 2006 16:47:42 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/07/10/24</guid>
		<description><![CDATA[　　写后台的WebService的时候，常常碰到大规模的后台网络访问，客户端发来一个请求，程序需要处理很长时间。比如，我的代理验证程序就是这样。此时，如果禁用了web.config中的Debug模式，就会发生超时。原因来自web.config的一个设置：httpRuntime下的executionTimeout。
　　MSDN对此的解释：

executionTimeout
可选的 TimeSpan 属性。
&#160;
指定在被 ASP.NET 自动关闭前，允许执行请求的最大秒数。
&#160;
只有当 compilation 元素中的调试属性为 False 时，此超时属性才适用。若要帮助避免在调试期间关闭应用程序，请不要将此超时属性设置为较大值。
&#160;
注意
在 .NET Framework 1.0 版和 1.1 版中，默认值为 90。
默认值为“00:01:50”（110 秒）。

　　事实上，最后一句话是错误的，写成这种时间格式不能通过编译，必须写成整数形式的秒。
　　知道了问题所在，只要修改一下这个设置即可，改成

&#60;system .web&#62;
        &#60;httpruntime executionTimeout=&#34;600&#34;/&#62;
        &#60;/system&#62;

即可设置超时为600秒，对我的代理验证程序足够了


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　写后台的WebService的时候，常常碰到大规模的后台网络访问，客户端发来一个请求，程序需要处理很长时间。比如，我的代理验证程序就是这样。此时，如果禁用了web.config中的Debug模式，就会发生超时。原因来自web.config的一个设置：httpRuntime下的executionTimeout。<br />
　　MSDN对此的解释：</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">executionTimeout
可选的 TimeSpan 属性。
&nbsp;
指定在被 ASP.NET 自动关闭前，允许执行请求的最大秒数。
&nbsp;
只有当 compilation 元素中的调试属性为 False 时，此超时属性才适用。若要帮助避免在调试期间关闭应用程序，请不要将此超时属性设置为较大值。
&nbsp;
注意
在 .NET Framework 1.0 版和 1.1 版中，默认值为 90。
默认值为“00:01:50”（110 秒）。</pre></div></div>

<p>　　事实上，最后一句话是错误的，写成这种时间格式不能通过编译，必须写成整数形式的秒。<br />
　　知道了问题所在，只要修改一下这个设置即可，改成</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system</span> .web<span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;httpruntime</span> <span style="color: #000066;">executionTimeout</span>=<span style="color: #ff0000;">&quot;600&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>即可设置超时为600秒，对我的代理验证程序足够了</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/07/aspdotnet-timeout-solution/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>让WebService支持Post和Get方法</title>
		<link>http://blog.williamgates.biz/2006/05/webservice-support-get-post/</link>
		<comments>http://blog.williamgates.biz/2006/05/webservice-support-get-post/#comments</comments>
		<pubDate>Wed, 24 May 2006 01:39:36 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[WebService]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/05/24/22</guid>
		<description><![CDATA[　　在WebService的测试页面，你看到了什么？SOAP1.1/SOAP1.2/HTTP POST三种方法的测试页面，但是事实上，此时你用post方法是无法访问这个webservice的，更不用说get了。.net 2.0下的所有新建webservice默认关闭了这两种方法，是为了安全考虑。
　　但是我们有的时候不得不使用这两种方法，特别是get方法，几乎由一切软件和编程方法支持，并且可以穿越几乎所有的防火墙（除非连web访问都不让，那是中情局吧……）。那么如何让部署起来的webservice支持这种方法呢？

　　在webservice的目录下添加Web.config文件（如果已经存在就修改之），最简单的情况，我们需要这样的文件：

&#60; ?xml version=&#34;1.0&#34;?&#62;
&#60;configuration xmlns=&#34;http://schemas.microsoft.com/.NetConfiguration/v2.0&#34;&#62;
&#60;system .web&#62;
&#60;compilation defaultLanguage=&#34;c#&#34; debug=&#34;true&#34;/&#62;
&#60;webservices&#62;
&#60;protocols&#62;
&#60;add name=&#34;HttpGet&#34;/&#62;
&#60;add name=&#34;HttpPost&#34;/&#62;
&#60;/protocols&#62;
&#60;/webservices&#62;
&#60;/system&#62;
&#60;/configuration&#62;

　　如果你已经有了VS生成的Web.config，那么只需要修改或添加这么一段

&#60;webservices&#62;
&#60;protocols&#62;
&#60;add name=&#34;HttpGet&#34;/&#62;
&#60;add name=&#34;HttpPost&#34;/&#62;
&#60;/protocols&#62;
&#60;/webservices&#62;

　　这样就行了，你就可以在测试页面看到多出来一种HTTP GET的方法示例，并且也可以在程序中使用了


Related posts:Directory Opus 联网验证被封证书后，清除安装痕迹的方法
]]></description>
			<content:encoded><![CDATA[<p>　　在WebService的测试页面，你看到了什么？SOAP1.1/SOAP1.2/HTTP POST三种方法的测试页面，但是事实上，此时你用post方法是无法访问这个webservice的，更不用说get了。.net 2.0下的所有新建webservice默认关闭了这两种方法，是为了安全考虑。<br />
　　但是我们有的时候不得不使用这两种方法，特别是get方法，几乎由一切软件和编程方法支持，并且可以穿越几乎所有的防火墙（除非连web访问都不让，那是中情局吧……）。那么如何让部署起来的webservice支持这种方法呢？<br />
<span id="more-22"></span><br />
　　在webservice的目录下添加Web.config文件（如果已经存在就修改之），最简单的情况，我们需要这样的文件：</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt; ?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;configuration</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.microsoft.com/.NetConfiguration/v2.0&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;system</span> .web<span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;compilation</span> <span style="color: #000066;">defaultLanguage</span>=<span style="color: #ff0000;">&quot;c#&quot;</span> <span style="color: #000066;">debug</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;webservices<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;protocols<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;HttpGet&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;HttpPost&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/protocols<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/webservices<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/system<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/configuration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>　　如果你已经有了VS生成的Web.config，那么只需要修改或添加这么一段</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;webservices<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;protocols<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;HttpGet&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;HttpPost&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/protocols<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/webservices<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>　　这样就行了，你就可以在测试页面看到多出来一种HTTP GET的方法示例，并且也可以在程序中使用了</p>


<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/05/webservice-support-get-post/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WebService的缓存机制</title>
		<link>http://blog.williamgates.biz/2006/05/how-webservice-cache-works/</link>
		<comments>http://blog.williamgates.biz/2006/05/how-webservice-cache-works/#comments</comments>
		<pubDate>Tue, 23 May 2006 06:58:33 +0000</pubDate>
		<dc:creator>WG</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[WebService]]></category>
		<category><![CDATA[技术心得]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://blog.williamgates.biz/2006/05/23/21</guid>
		<description><![CDATA[　　WebService的缓存分为两种，一种是简单的输出缓存，一种是强大的数据缓存
　　一、输出缓存
　　输出缓存的使用非常简单，比较适用于WebService的参数比较少，结果比较单一的情况，例如股票信息，可以设置5-10秒的缓存，天气预报，则可以设置30分钟甚至数小时的缓存。使用方法是，在WebMethod属性上指定CacheDuration属性即可，例如

&#91;WebMethod&#40;Description = &#34;Test&#34;,CacheDuration=600&#41;&#93;
public string Test&#40;&#41;
&#123;
      return &#34;Test&#34;;
&#125;

　　这样，600秒内这个WebService的所有输出数据都将从缓存中读取，不会真正做数据处理，如果事务代码是访问数据库的话，现在这种方法就会比每次都访问数据库快得多。这种缓存适合初接触WebService的新手使用。
　　要注意的是，不是所有服务都适合使用这种缓存，例如每次结果都不一样的，访问数极高的服务，缓存将会变得非常大，占用很多服务器的内存，却没有实际效果。

　　二、数据缓存
　　想将你的WebService某些运行数据保存起来？如果不使用本地的数据库或者文件，那么缓存是最好的选择。这种缓存不同于上面提到的输出缓存，它需要编写代码来实现，但是相对应的，它的功能非常强大，可以存放任何类型的信息，并且你可以在任何时候检索它。
　　虽然也可以使用Application来模拟缓存，但是这需要你自己管理内存释放、用户并发问题，在.net时代已经被抛弃，WebService下的缓存使用Cache这个集合

using System.Web.Caching;
&#91;WebMethod&#40;Description = &#34;Test&#34;&#41;&#93;
public string Test&#40;&#41;
&#123;
        string Content = &#34;just4test&#34;;
&#160;
        //创建数据缓存
        Context.Cache.Insert&#40;&#34;Test&#34;, Content, null, DateTime.MaxValue,TimeSpan.Zero, CacheItemPriority.NotRemovable, null&#41;;
&#160;
       [...]]]></description>
			<content:encoded><![CDATA[<p>　　WebService的缓存分为两种，一种是简单的输出缓存，一种是强大的数据缓存</p>
<p>　　一、输出缓存<br />
　　输出缓存的使用非常简单，比较适用于WebService的参数比较少，结果比较单一的情况，例如股票信息，可以设置5-10秒的缓存，天气预报，则可以设置30分钟甚至数小时的缓存。使用方法是，在WebMethod属性上指定CacheDuration属性即可，例如</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>WebMethod<span style="color: #000000;">&#40;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Test&quot;</span>,CacheDuration<span style="color: #008000;">=</span><span style="color: #FF0000;">600</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Test<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
      <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Test&quot;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>　　这样，600秒内这个WebService的所有输出数据都将从缓存中读取，不会真正做数据处理，如果事务代码是访问数据库的话，现在这种方法就会比每次都访问数据库快得多。这种缓存适合初接触WebService的新手使用。<br />
　　要注意的是，不是所有服务都适合使用这种缓存，例如每次结果都不一样的，访问数极高的服务，缓存将会变得非常大，占用很多服务器的内存，却没有实际效果。<br />
<span id="more-21"></span><br />
　　二、数据缓存<br />
　　想将你的WebService某些运行数据保存起来？如果不使用本地的数据库或者文件，那么缓存是最好的选择。这种缓存不同于上面提到的输出缓存，它需要编写代码来实现，但是相对应的，它的功能非常强大，可以存放任何类型的信息，并且你可以在任何时候检索它。<br />
　　虽然也可以使用Application来模拟缓存，但是这需要你自己管理内存释放、用户并发问题，在.net时代已经被抛弃，WebService下的缓存使用Cache这个集合</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Web.Caching</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#91;</span>WebMethod<span style="color: #000000;">&#40;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Test&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Test<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">string</span> Content <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;just4test&quot;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">//创建数据缓存</span>
        Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Test&quot;</span>, Content, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>,TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;Test&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>　　在这里，我们使用了Context.Cache属性，Context.Cache.Insert方法用于将数据加入缓存。这个方法一共有4种重载，在这个例子中，我们使用的是功能最全面的重载版本，我们以此为例：每一个参数分别是键名（使用方法类似于Session），值，依赖性，绝对过期时间，可变过期时间，缓存优先级，缓存项目删除时的委托方法绝对过期时间是固定的，DataTime.MaxValue在这里表示永不过期；可变过期时间是一定时间内该缓存没有使用则自动失效，此处TimeSpan.Zero表示不使用可变过期。注意两者只能设置一项，如果要使用可变过期，绝对过期必须是DataTime.MaxValue，例如</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Test&quot;</span>, Content, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">FromMinutes</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>　　缓存优先级是Web服务器清理它的可能性，在此的CacheItemPriority.NotRemovable表示通常不从缓存中删除，可以理解为永久性缓存<br />
　　通过依赖性，可以监视某个文件或者其他缓存的改动，如果有变化，则此缓存失效，这非常有实用价值。例如：</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">CacheDependency de <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CacheDependency<span style="color: #000000;">&#40;</span>Server.<span style="color: #0000FF;">MapPath</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;1.xml&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Test&quot;</span>, Content, de, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>　　这样，1.xml文件被删除或者更改的时候，缓存就会失效 </p>
<p>　　三、实用举例<br />
　　实际使用中，我使用这样一段代码，当远程的某个文件更新时，必须下载到本地，而缓存负责保存该文件的文件名和修改时间，每次客户端请求文件名和时间的时候，直接从缓存读取。每次定时下载程序（另有代码）启动的时候，getFiles()方法先检查是否有新文件(与本地缓存比对），然后决定是否下载。</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Web</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Web.Services</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Web.Services.Protocols</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Xml</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Xml.Serialization</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">TestOp</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Web.Caching</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#91;</span>WebService<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">Namespace</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Test&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #000000;">&#91;</span>WebServiceBinding<span style="color: #000000;">&#40;</span>ConformsTo <span style="color: #008000;">=</span> WsiProfiles.<span style="color: #0000FF;">BasicProfile1_1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Test<span style="color: #008000;">:</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">Services</span></span>.<span style="color: #0000FF;">WebService</span>
<span style="color: #000000;">&#123;</span>
 <span style="color: #008080; font-style: italic;">//提供下载和分析功能的后台代码类，TestOP</span>
 <span style="color: #0600FF;">private</span> TestOp testOp<span style="color: #008000;">;</span>
&nbsp;
 <span style="color: #0600FF;">public</span> Test<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
 <span style="color: #000000;">&#123;</span>
 testOp <span style="color: #008000;">=</span> newTestOp<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #000000;">&#91;</span>WebMethod<span style="color: #000000;">&#40;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;下载文件&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
 <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> getFiles<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;FileName&quot;</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">string</span> FN<span style="color: #008000;">=</span>Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;FileName&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   testOp.<span style="color: #0000FF;">GetHTML</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   testOp.<span style="color: #0000FF;">GetMatch</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>FN.<span style="color: #0000FF;">CompareTo</span><span style="color: #000000;">&#40;</span>testOp.<span style="color: #0000FF;">CheckFileName</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">!=</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">try</span>
    <span style="color: #000000;">&#123;</span>
     testOp.<span style="color: #0000FF;">Download</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Time&quot;</span>, testOp.<span style="color: #0000FF;">CheckTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
     Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;FileName&quot;</span>, testOp.<span style="color: #0000FF;">CheckFileName</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
 <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;ok&quot;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #0600FF;">catch</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Ex&quot;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #0600FF;">else</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;ok&quot;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #0600FF;">else</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">try</span>
  <span style="color: #000000;">&#123;</span>
   testOp.<span style="color: #0000FF;">GetHTML</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   testOp.<span style="color: #0000FF;">GetMatch</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   testOp.<span style="color: #0000FF;">Download</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Time&quot;</span>, testOp.<span style="color: #0000FF;">CheckTime</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   Context.<span style="color: #0000FF;">Cache</span>.<span style="color: #0000FF;">Insert</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;FileName&quot;</span>, testOp.<span style="color: #0000FF;">CheckFileName</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #0600FF;">null</span>, DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
 <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;ok&quot;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #0600FF;">catch</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Ex&quot;</span><span style="color: #008000;">;</span>
 <span style="color: #000000;">&#125;</span>
 <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #000000;">&#91;</span>WebMethod<span style="color: #000000;">&#40;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;检查最新文件时间&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
 <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> CheckTime<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;Time&quot;</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">==</span><span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">try</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">getFiles</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;Time&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    DateTime.<span style="color: #0000FF;">MaxValue</span>, TimeSpan.<span style="color: #0000FF;">Zero</span>, CacheItemPriority.<span style="color: #0000FF;">NotRemovable</span>, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
   <span style="color: #0600FF;">catch</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Ex&quot;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
  <span style="color: #0600FF;">else</span>
  <span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;Time&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #000000;">&#125;</span>
&nbsp;
 <span style="color: #000000;">&#91;</span>WebMethod<span style="color: #000000;">&#40;</span>Description <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;检查最新文件名&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
 <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> CheckFileName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
 <span style="color: #000000;">&#123;</span>
  <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;FileName&quot;</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
  <span style="color: #000000;">&#123;</span>
   <span style="color: #0600FF;">try</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">getFiles</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;FileName&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
   <span style="color: #0600FF;">catch</span>
   <span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #666666;">&quot;Ex&quot;</span><span style="color: #008000;">;</span>
   <span style="color: #000000;">&#125;</span>
  <span style="color: #000000;">&#125;</span>
  <span style="color: #0600FF;">else</span>
  <span style="color: #000000;">&#123;</span>
   <span style="color: #FF0000;">string</span> result <span style="color: #008000;">=</span> Context.<span style="color: #0000FF;">Cache</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;FileName&quot;</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
   <span style="color: #0600FF;">return</span> result<span style="color: #008000;">;</span>
  <span style="color: #000000;">&#125;</span>
 <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#125;</span></pre></div></div>



<p>Related posts:<ol><li><a href='http://blog.williamgates.biz/2009/06/how-to-uninstall-directory-opus-completely/' rel='bookmark' title='Permanent Link: Directory Opus 联网验证被封证书后，清除安装痕迹的方法'>Directory Opus 联网验证被封证书后，清除安装痕迹的方法</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.williamgates.biz/2006/05/how-webservice-cache-works/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
