<?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>才可赋斯记Blog</title>
	<atom:link href="http://hes-site.net/feed" rel="self" type="application/rss+xml" />
	<link>http://hes-site.net</link>
	<description>古池、青蛙、入水、扑通……</description>
	<lastBuildDate>Mon, 18 May 2009 14:54:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>一个简单的可间断的数字范围表示方法</title>
		<link>http://hes-site.net/archives/98.html</link>
		<comments>http://hes-site.net/archives/98.html#comments</comments>
		<pubDate>Mon, 18 May 2009 14:52:48 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[数字范围]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/98.html</guid>
		<description><![CDATA[<!-- Easy AdSenser V2.35 -->
<!-- Post[count: 2] -->
<div style="float:right;margin:12px;" ><script type="text/javascript"><!--
google_ad_client = "pub-6913680641971350";
/* 博客文章嵌入广告,234x60, 创建于 09-4-14 */
google_ad_slot = "2183054251";
google_ad_width = 234;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>




最近做的项目，需要表示一个月中有效的日期范围，这个范围可能会是不连续的几段组成，输入的形式如：
1-5, 7, 10-15, 20, …
这个数据的存储方法比较容易解决，根据不同的需求，可以有多种解决方案（如果有查询某个日子是否处于这个范围内的压力，可以使用32位Integer，用位数表示日期；如果没有这个查询的压力，可以偷懒点直接保存输入字符串）。而这种输入的归一化是个比较麻烦的事情，比如可能会有交叉重复的区间（如：1-5,4-7等），也可能会有连续的（如：1-5,6-7等），如果把这些范围简化，是件比较痛苦的事情。
最先想到的方法当然是在添加一个新的区间的方法中，就对原有区间范围进行判断，实现添加后就把列表归一化。在实现的时候，却发现判断的逻辑变得很复杂，自己也被绕进去了，根本无法确定有十足的把握该算法是正确的。最后决定把归一化的位置改变一下，添加的时候，就直接把列表添加进去，而调用另外一个归一化函数来实现范围区间的重整。这一下，实现的算法逻辑就清楚很多了。

下面是一个php的实现方案，代码很简单，稍微有点php基础的读者都应该不需要注释就能看懂实现的原理：


&#60;?php
class DaysList {
	protected $_data = array();

	private function _cmpSeg($seg1,$seg2) {
		if ($seg1[0]==$seg2[0]) {
			if ($seg1[1]==$seg2[1]) return 0;
			return ($seg1[1]&#60;$seg2[1]) ? -1 : 1;
		}
		return ($seg1[0]&#60;$seg2[0]) ? -1 : 1;
	}

	function unifyList() {
		//排序
		usort($this-&#62;_data,array($this,&#039;_cmpSeg&#039;));
		$current = reset($this-&#62;_data);
		if ($current) {
			$unified = array();
			while($next=next($this-&#62;_data)){
				$ceil = $current[1];
				$floor1 = $next[0];
				if ($floor1&#62;$ceil+1) {
					$unified[] = $current;
					$current = $next;
				} else {
					if ($floor1&#60;=$ceil+1) {
						$ceil1 = $next[1];
						if ($ceil1&#62;$ceil)
							$current[1] = $ceil1;
					}
				}
			}
			$unified[] [...]]]></description>
			<content:encoded><![CDATA[<p>最近做的项目，需要表示一个月中有效的日期范围，这个范围可能会是不连续的几段组成，输入的形式如：</p>
<pre>1-5, 7, 10-15, 20, …</pre>
<p>这个数据的存储方法比较容易解决，根据不同的需求，可以有多种解决方案（如果有查询某个日子是否处于这个范围内的压力，可以使用32位Integer，用位数表示日期；如果没有这个查询的压力，可以偷懒点直接保存输入字符串）。而这种输入的归一化是个比较麻烦的事情，比如可能会有交叉重复的区间（如：1-5,4-7等），也可能会有连续的（如：1-5,6-7等），如果把这些范围简化，是件比较痛苦的事情。</p>
<p>最先想到的方法当然是在添加一个新的区间的方法中，就对原有区间范围进行判断，实现添加后就把列表归一化。在实现的时候，却发现判断的逻辑变得很复杂，自己也被绕进去了，根本无法确定有十足的把握该算法是正确的。最后决定把归一化的位置改变一下，添加的时候，就直接把列表添加进去，而调用另外一个归一化函数来实现范围区间的重整。这一下，实现的算法逻辑就清楚很多了。</p>
<p><span id="more-98"></span></p>
<p>下面是一个php的实现方案，代码很简单，稍微有点php基础的读者都应该不需要注释就能看懂实现的原理：</p>
<pre>
<pre class="brush: php">
&lt;?php
class DaysList {
	protected $_data = array();

	private function _cmpSeg($seg1,$seg2) {
		if ($seg1[0]==$seg2[0]) {
			if ($seg1[1]==$seg2[1]) return 0;
			return ($seg1[1]&lt;$seg2[1]) ? -1 : 1;
		}
		return ($seg1[0]&lt;$seg2[0]) ? -1 : 1;
	}

	function unifyList() {
		//排序
		usort($this-&gt;_data,array($this,&#039;_cmpSeg&#039;));
		$current = reset($this-&gt;_data);
		if ($current) {
			$unified = array();
			while($next=next($this-&gt;_data)){
				$ceil = $current[1];
				$floor1 = $next[0];
				if ($floor1&gt;$ceil+1) {
					$unified[] = $current;
					$current = $next;
				} else {
					if ($floor1&lt;=$ceil+1) {
						$ceil1 = $next[1];
						if ($ceil1&gt;$ceil)
							$current[1] = $ceil1;
					}
				}
			}
			$unified[] = $current;
			$this-&gt;_data = $unified;
		}
		return $this-&gt;_data;
	}

	function toString() {
		$this-&gt;unifyList();
		$str = &#039;&#039;;
		foreach ($this-&gt;_data as $a_seg) {
			list($floor,$ceil) = $a_seg;
			$str .= &quot;, $floor&quot;;
			if ($floor&lt;$ceil) $str.=&quot;-$ceil&quot;;
		}
		return ltrim($str,&#039;, &#039;);
	}

	function add($day,$day2=null) {
		$day = (int)$day;
		if (isset($day2)) {
			$day2 = (int)$day2;
			if ($day&gt;$day2) {
				$seg = array($day2,$day);
			} else {
				$seg = array($day,$day2);
			}
		} else {
			$seg = array($day,$day);
		}
		$this-&gt;_data[] = $seg;
	}
}

//测试运行代码
$days = new DaysList();
$days-&gt;add(1);
$days-&gt;add(7,10);
$days-&gt;add(2,3);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(5);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(11,13);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(21,31);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(17);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(15);
echo $days-&gt;toString().&quot;\n&quot;;
$days-&gt;add(16);
echo $days-&gt;toString().&quot;\n&quot;;
?&gt;
</pre>
</pre>
<p>主要算法位于 DaysList 类的 unifyList 函数中。运行该php结果如下：</p>
<pre>1-3, 7-10
1-3, 5, 7-10
1-3, 5, 7-13
1-3, 5, 7-13, 21-31
1-3, 5, 7-13, 17, 21-31
1-3, 5, 7-13, 15, 17, 21-31
1-3, 5, 7-13, 15-17, 21-31</pre>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/98.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>写写blog吧</title>
		<link>http://hes-site.net/archives/97.html</link>
		<comments>http://hes-site.net/archives/97.html#comments</comments>
		<pubDate>Wed, 13 May 2009 08:27:34 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/97.html</guid>
		<description><![CDATA[&#160;&#160;&#160; 在网上与原公司的同事聊了一会儿天，他不断鼓励我去写写技术相关的博客。其实我已经在尝试着写一些文章了，但是总感觉写得不是那么一回事，一直也没告诉他我的blog的网址，是对自己写的东西确实没有什么信心吧。
我挺羡慕那些可以把一些技术描述得特别清楚的人，而每次我想写一些东西，总会磨蹭了半天，绞尽脑汁，就写了那么寥寥数十字，即使是我自己也看不懂。自己能想的、懂的，和自己能写下来的，确实不是同一回事。写东西，真的是一种能力，而我在这种能力上有很大的欠缺。
刚刚在新公司上班一周多的时间，这儿与以前不一样的一个很大的地方就是这边的文档非常正式。看着新同事们写的需求文档、功能文档、设计文档，想着同一个东西如果让我来写，还真不知道应该如何下手。如果要能适应新公司，我还真必须提高写下来的能力。
写blog是一种锻炼。希望我不久以后能克服自己心理的障碍，有自信向别人介绍，这就是我的博客！
]]></description>
			<content:encoded><![CDATA[<p>&#160;&#160;&#160; 在网上与原公司的同事聊了一会儿天，他不断鼓励我去写写技术相关的博客。其实我已经在尝试着写一些文章了，但是总感觉写得不是那么一回事，一直也没告诉他我的blog的网址，是对自己写的东西确实没有什么信心吧。</p>
<p>我挺羡慕那些可以把一些技术描述得特别清楚的人，而每次我想写一些东西，总会磨蹭了半天，绞尽脑汁，就写了那么寥寥数十字，即使是我自己也看不懂。自己能想的、懂的，和自己能写下来的，确实不是同一回事。写东西，真的是一种能力，而我在这种能力上有很大的欠缺。</p>
<p>刚刚在新公司上班一周多的时间，这儿与以前不一样的一个很大的地方就是这边的文档非常正式。看着新同事们写的需求文档、功能文档、设计文档，想着同一个东西如果让我来写，还真不知道应该如何下手。如果要能适应新公司，我还真必须提高写下来的能力。</p>
<p>写blog是一种锻炼。希望我不久以后能克服自己心理的障碍，有自信向别人介绍，这就是我的博客！</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/97.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>初接触 PostgreSQL</title>
		<link>http://hes-site.net/archives/96.html</link>
		<comments>http://hes-site.net/archives/96.html#comments</comments>
		<pubDate>Mon, 11 May 2009 07:56:08 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/96.html</guid>
		<description><![CDATA[因为工作的关系，这几天接触了一下 PostgreSQL 。对于 PostgreSQL 的大名已经闻名已久，但一直都没有机会去了解，这次终于因为工作而不得不去了解她了。
在开源关系数据库领域，MySQL一直处于高高在上的地位。但是MySQL频繁被收购，确实也让人有点担忧，特别是最近随着SUN被Oracle收购，更是让大家对MySQL的前景产生怀疑。Oracle在很久以前就想收购MySQL，但遭到了拒绝，但现在终于还是无法逃出Oracle的“魔爪”。
在这种环境下，或许 PostgreSQL 能成为大家的另一种选择吧。
]]></description>
			<content:encoded><![CDATA[<p>因为工作的关系，这几天接触了一下 PostgreSQL 。对于 PostgreSQL 的大名已经闻名已久，但一直都没有机会去了解，这次终于因为工作而不得不去了解她了。</p>
<p>在开源关系数据库领域，MySQL一直处于高高在上的地位。但是MySQL频繁被收购，确实也让人有点担忧，特别是最近随着SUN被Oracle收购，更是让大家对MySQL的前景产生怀疑。Oracle在很久以前就想收购MySQL，但遭到了拒绝，但现在终于还是无法逃出Oracle的“魔爪”。</p>
<p>在这种环境下，或许 PostgreSQL 能成为大家的另一种选择吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/96.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>今天火箭把湖人干掉了</title>
		<link>http://hes-site.net/archives/95.html</link>
		<comments>http://hes-site.net/archives/95.html#comments</comments>
		<pubDate>Tue, 05 May 2009 07:24:39 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[NBA]]></category>
		<category><![CDATA[姚明]]></category>
		<category><![CDATA[篮球]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/95.html</guid>
		<description><![CDATA[中午吃饭的时候看了第三节后半段和第四节的比赛，今天姚明发挥的真是非常不错，火箭全队也都发挥得很好，最后终于顺利在客场把湖人拿下来了。能在季后赛第二轮在客场拿下比赛，真是可喜可贺。
在这个系列赛中，或许没有人会看好火箭队，我自己也认为火箭很可能会被 4:0 淘汰出局。今天，火箭全体给了大家一个强有力的回应。一场比赛的胜负，在整个系列赛中也许说明不了什么问题，但至少能赢得大家的一些尊重。
 
以前火箭的比赛经常习惯性在第四节崩盘，但今天火箭的第四节表现非常好。一度在被湖人连续抢断，并且被反超比分的情况下，火箭队坚持了下来。姚明在第四节中段关键时间受伤，但是还是继续坚持上场，并且在上场后连续得分，让火箭重新取得了10分的领先优势，并在最后获得了整场比赛的胜利。
希望姚明今天的伤不要影响到后面的比赛，也希望火箭能给我们更多的惊喜！
]]></description>
			<content:encoded><![CDATA[<p>中午吃饭的时候看了第三节后半段和第四节的比赛，今天姚明发挥的真是非常不错，火箭全队也都发挥得很好，最后终于顺利在客场把湖人拿下来了。能在季后赛第二轮在客场拿下比赛，真是可喜可贺。</p>
<p>在这个系列赛中，或许没有人会看好火箭队，我自己也认为火箭很可能会被 4:0 淘汰出局。今天，火箭全体给了大家一个强有力的回应。一场比赛的胜负，在整个系列赛中也许说明不了什么问题，但至少能赢得大家的一些尊重。</p>
<p> <span id="more-95"></span>
<p>以前火箭的比赛经常习惯性在第四节崩盘，但今天火箭的第四节表现非常好。一度在被湖人连续抢断，并且被反超比分的情况下，火箭队坚持了下来。姚明在第四节中段关键时间受伤，但是还是继续坚持上场，并且在上场后连续得分，让火箭重新取得了10分的领先优势，并在最后获得了整场比赛的胜利。</p>
<p>希望姚明今天的伤不要影响到后面的比赛，也希望火箭能给我们更多的惊喜！</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Total Commander 7.50 beta 1 版本发布了</title>
		<link>http://hes-site.net/archives/92.html</link>
		<comments>http://hes-site.net/archives/92.html#comments</comments>
		<pubDate>Fri, 17 Apr 2009 16:09:38 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[Total Commander]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/92.html</guid>
		<description><![CDATA[今天在网上闲逛，发现挺多地方已经有 Total Commander 7.50 beta 版本的下载了，上 Total Commander 的主页看了一下版本更新信息，这次版本还是变化比较大的，下面是官方列出的改变列表：
- Full Unicode support in most functions where it is possible, including FTP, ZIP packer, and plugin interfaces
- Support for file names longer than 259 characters (up to 1022) in most file operations
- Compare by content allows to compare text files of different type, e.g. Ansi and [...]]]></description>
			<content:encoded><![CDATA[<p>今天在网上闲逛，发现挺多地方已经有 Total Commander 7.50 beta 版本的下载了，上 Total Commander 的主页看了一下版本更新信息，这次版本还是变化比较大的，下面是官方列出的改变列表：</p>
<p>- Full Unicode support in most functions where it is possible, including FTP, ZIP packer, and plugin interfaces</p>
<p>- Support for file names longer than 259 characters (up to 1022) in most file operations</p>
<p>- Compare by content allows to compare text files of different type, e.g. Ansi and UTF-8</p>
<p>- The current directory above the file lists can act as a clickable bar (&quot;breadcrumb bar&quot;)</p>
<p>- Option to show *.bar file in button bar as a popup menu instead of switching bars</p>
<p>- Show icons and subfolders in ftp connection dialog</p>
<p>- Protect the stored ftp passwords with a master password using AES256 encryption</p>
<p>- FTP, PORT mode: Allow to specify external IP address of the Internet router</p>
<p>- Start Lister, compare by content or synchronize dirs directly via command line parameters</p>
<p>- Comments (Ctrl+Z) can now have a max. length of 4095 characters, and support line breaks</p>
<p>- Synchronize dirs: Option to synchronize also empty directories, option to copy just specific file properties (like the time)</p>
<p>- Create CRC checksums now also supports the SHA1 hash format</p>
<p>- Allow to use the Windows key for user-defined hotkeys</p>
<p>- On 64-bit Windows, allow to use 64-bit shell extensions in local menu (context menu)</p>
<p>- New internal command cm_SwitchX64Redirection to turn redirection of system32 dir under 64-bit Windows on/off</p>
<p>- Internal unpacking of multi-part RAR archives, and RAR archives where the file names are encrypted</p>
<p>- Copy files/directories to multiple target directories (or lnk files pointing to directories) in one operation</p>
<p>- Quick search with search dialog: Show button which allows to show only files/dirs matching the filter</p>
<p>- Switch character encodings in Lister</p>
<p>- New internal association system, e.g. for using Total Commander from an USB stick</p>
<p>其中我最感兴趣的可能是第一条，对 Unicode 的支持了，特别是对压缩包里的文件。经常遇到一些压缩包会出现乱码文件名。不过现在还没有时间去尝试新版本，并且这个是第一个7.5系列的beta版，估计会有比较多的问题，所以还是决定等过一段时间出更稳定的版本后再替换使用新版本。喜欢尝鲜的朋友可以试试先版本，但别忘了多和大家分享一下使用心得哦。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/92.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Eclipse SVN插件比较 &#8212;&#8212; Subclipse vs. Subversive</title>
		<link>http://hes-site.net/archives/90.html</link>
		<comments>http://hes-site.net/archives/90.html#comments</comments>
		<pubDate>Fri, 27 Mar 2009 03:56:36 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[eclipse]]></category>
		<category><![CDATA[开源应用]]></category>
		<category><![CDATA[Subclipse]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Subversive]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/90.html</guid>
		<description><![CDATA[Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive ，可以说这两种插件都是非常优秀的插件，而对于使用者来说，选择使用哪种插件确实是个挺头疼的选择。
Subclipse 主页位于 http://subclipse.tigris.org/ ，与SVN（http://subversion.tigris.org/）联系紧密，我们可以称之为 SVN 官方的 eclipse 插件。而Subversive 则是 eclipse 官方的 SVN 插件，主页位于 http://www.eclipse.org/subversive/ 。
 
Subclipse 是 SVN 直接支持的项目，在很早的时候就已经出现了。而 Subversive 最先是由一个第三方公司 Polarion 开发的。早先有传闻 Subclipse 将会成为 Eclipse Foundation 成员的传闻，可是最后却出现了令人大跌眼镜的结果，Subversive 率先成为了 Eclipse 的子项目。这中间到底出现什么情况，我们就不得而知了。或许 Eclipse 与 SVN 两个都非常成功的开源项目间，某些协议出现一些争议了吧。
不管是 Subclipse 还是 Subversive ，它们使用的 SVN 连接器不外乎这两种，JavaHL 和 SVNKit ( http://svnkit.com/ )，SVNKit 是 [...]]]></description>
			<content:encoded><![CDATA[<p>Eclipse 下连接 SVN 库有两种插件 —— Subclipse 与 Subversive ，可以说这两种插件都是非常优秀的插件，而对于使用者来说，选择使用哪种插件确实是个挺头疼的选择。</p>
<p>Subclipse 主页位于 <a href="http://subclipse.tigris.org/" target="_blank">http://subclipse.tigris.org/</a> ，与SVN（<a href="http://subversion.tigris.org/" target="_blank">http://subversion.tigris.org/</a>）联系紧密，我们可以称之为 SVN 官方的 eclipse 插件。而Subversive 则是 eclipse 官方的 SVN 插件，主页位于 <a title="http://www.eclipse.org/subversive/" href="http://www.eclipse.org/subversive/" target="_blank">http://www.eclipse.org/subversive/</a> 。</p>
<p> <span id="more-90"></span>
<p>Subclipse 是 SVN 直接支持的项目，在很早的时候就已经出现了。而 Subversive 最先是由一个第三方公司 Polarion 开发的。早先有传闻 Subclipse 将会成为 Eclipse Foundation 成员的传闻，可是最后却出现了令人大跌眼镜的结果，Subversive 率先成为了 Eclipse 的子项目。这中间到底出现什么情况，我们就不得而知了。或许 Eclipse 与 SVN 两个都非常成功的开源项目间，某些协议出现一些争议了吧。</p>
<p>不管是 Subclipse 还是 Subversive ，它们使用的 SVN 连接器不外乎这两种，JavaHL 和 SVNKit ( <a title="http://svnkit.com/" href="http://svnkit.com/" target="_blank">http://svnkit.com/</a> )，SVNKit 是 Subversion 的纯 Java 连接库版本，整个连接底层都是由 Java 实现的，不需要额外的支持。而 JavaHL 则使用的是 Subversion 原生的连接库，加上了 Java 调用库。这两种连接库给人表征的感觉应该是 JavaHL 在连接稳定性和速度上应该占优，而 SVNKit 则应该更省事，适用性更广。如果非要推荐一个的话，我还是建议先选择 JavaHL，如果 JavaHL 无法在你的系统中正常工作，再选择 SVNKit 。</p>
<p>我原先使用的是 Subclipse ，后来转用了 Subversive （呵呵，我比较看重官方性，毕竟 Subversive 是 Eclipse 官方支持的项目，Subclipse 更像是一个第三方项目）。如果非要来比较两种插件的话，我只能以难分高下来做评判。说实在的，我 Google 过很多次两者比较这方面的文章，希望能让我有个很明确的抉择，就使用 Subclipse 或 Subversive ，其实最后得到的结果都是两者差不多的。写这篇文章的主要目的，不是告诉你它们两者难分高下，随便选一个就可以了，而是想总结一下自己使用它们的经验，而能指导一下应该偏向于选择哪个。</p>
<h3>Subclipse vs. Subversive</h3>
<p>从两个插件使用的易用性上来说，只能真的说是难分高下。相对来说，Subversive 可能是属于 Eclipse 官方的缘故，似乎与 Eclipse 整合方面做得更加出色，相对来说在 Eclipse 中的操作会更让人感觉舒服一些，比如项目分支布局等等。而 Subclipse 则相对来说和 Subversion 联系更加紧密，Subversion 的更新、特有功能等等这方面的支持则远远超出了 Subversive 。比如，前些天 Subversion 1.6.0 正式版本发布了，Subclipse 马上跟进了对 SVN 1.6.x 的支持，而 Subversive 却连一个能与 SVN 1.6.x 兼容的 Alpha 版本都没有放出。呵呵，其实要不是因为 SVN 1.6.x 关系，我也不会重新再关注 Subclipse 了，因为毕竟 Subversive 已经用得挺顺手了，也没出现什么问题。这次关注，又让我觉得新奇的是，Subclipse 还支持了版本分支图的查看。</p>
<p>如何选择？我想可以从这几方面考虑：</p>
<ol>
<li>Eclipse 是否是你操作 SVN 的唯一途径？如果是，偏向于选择 Subversive；如果不是，比如说像我，还要经常使用 TortoiseSVN ，则偏向与选择 Subclipse 。Subclipse 的操作更倾向于与 TortoiseSVN 习惯，而 Subversive 的操作更倾向于 Eclipse 习惯操作。</li>
<li>SVN是否是你的唯一版本管理系统（或最重要的管理系统），你是否对 SVN 的新功能、新特性比较感兴趣？如果是，偏向于选择 Subclipse ；否则，偏向于选择 Subversive。</li>
<li>你的 SVN 操作是否会比较简单？比如你是否仅仅使用的仅仅是简单的检出/提交，等等操作，也不愿意把时间花费在研究 SVN 的高级特性上。如果是，偏向于选择 Subversive，如果否，则建议选择 Subclipse 。</li>
</ol>
<p>以上几点是否可以对你选择那个插件有所帮助呢？其实这两个插件都很不错，对于我们日常使用来说，哪个都能很好完成我们的任务，如果你还是不能确定，就别再费神在这上面花工夫了，也不用再在网上寻找两者比较了，随便选一个就行了。</p>
<p>呵呵，至于我，现在决定换回 Subclipse 了。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/90.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eclipse的反编译class文件插件</title>
		<link>http://hes-site.net/archives/89.html</link>
		<comments>http://hes-site.net/archives/89.html#comments</comments>
		<pubDate>Thu, 26 Mar 2009 09:12:06 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Java Decompiler]]></category>
		<category><![CDATA[JD]]></category>
		<category><![CDATA[反编译]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/89.html</guid>
		<description><![CDATA[这几天升级了一下eclipse，顺便去查找了一下eclipse下反编译class插件 JadClipse 是否有升级了。令人欣慰的是好久没有更新的 JadClipse 终于有了更新，发布了3.4.0 preview版本。
 
主页上并没有提供新版的 JadClipse 单独的下载包，需要使用 eclipse 的 update site 来获得插件的最新版本。打开eclipse的更新管理器，添加新的 update site: http://jadclipse.sf.net/update 如果不知道如何添加新的 update site，网上有很多教程，直接搜索一下即可，这里就不再复述了。
新版的 JadClipse 改名字叫 JDT Decompiler 了，作者Johann Gyger 似乎野心勃勃，除了基于 Jad 的反编译意外，又加入了 JODE 和 JD(Java Decompiler)&#160; 的支持。Jad 和 JODE 都是很早的项目了，并且都是好多年没有更新了，对于 Java 5/6 的新特性都无能为力。
Java Decompiler 是另外一个新出现不久的 Java 反编译器，作者也一直在持续更新中，已经能够支持 Java 5 的许多新特性了。
Johann Gyger 对于 Java Decompiler 这个项目非常感兴趣，希望能把它集成到 JDT Decompiler 插件中来，见 [...]]]></description>
			<content:encoded><![CDATA[<p>这几天升级了一下eclipse，顺便去查找了一下eclipse下反编译class插件 <a href="http://jadclipse.sf.net/" target="_blank">JadClipse</a> 是否有升级了。令人欣慰的是好久没有更新的 JadClipse 终于有了更新，发布了3.4.0 preview版本。</p>
<p> <span id="more-89"></span>
<p>主页上并没有提供新版的 JadClipse 单独的下载包，需要使用 eclipse 的 update site 来获得插件的最新版本。打开eclipse的更新管理器，添加新的 update site: <a title="http://jadclipse.sf.net/update" href="http://jadclipse.sf.net/update" target="_blank">http://jadclipse.sf.net/update</a> 如果不知道如何添加新的 update site，网上有很多教程，直接搜索一下即可，这里就不再复述了。</p>
<p>新版的 JadClipse 改名字叫 JDT Decompiler 了，作者Johann Gyger 似乎野心勃勃，除了基于 Jad 的反编译意外，又加入了 JODE 和 JD(Java Decompiler)&#160; 的支持。Jad 和 JODE 都是很早的项目了，并且都是好多年没有更新了，对于 Java 5/6 的新特性都无能为力。</p>
<p><a href="http://java.decompiler.free.fr/" target="_blank">Java Decompiler</a> 是另外一个新出现不久的 Java 反编译器，作者也一直在持续更新中，已经能够支持 Java 5 的许多新特性了。</p>
<p>Johann Gyger 对于 Java Decompiler 这个项目非常感兴趣，希望能把它集成到 JDT Decompiler 插件中来，见 <a title="http://java.decompiler.free.fr/?q=node/207" href="http://java.decompiler.free.fr/?q=node/207" target="_blank">http://java.decompiler.free.fr/?q=node/207</a> 。不过 Java Decompiler 的作者 Emmanuel 对此并不感冒，同时他自己也发布了一个 Java Decompiler 的 Eclipse 插件版本 <a href="http://java.decompiler.free.fr/?q=jdeclipse" target="_blank">JD-Eclipse</a>，直接支持 Eclipse。JD-Eclipse 的 update site 地址为 <a title="http://java.decompiler.free.fr/jd-eclipse/update" href="http://java.decompiler.free.fr/jd-eclipse/update" target="_blank">http://java.decompiler.free.fr/jd-eclipse/update</a> </p>
<p>不管如何，现在 Eclipse 的反编译插件已经有了不同的选择了。当然如果以后 JD 能和 JDT Decopiler 结合起来也当然更好啦。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/89.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于php框架的看法</title>
		<link>http://hes-site.net/archives/88.html</link>
		<comments>http://hes-site.net/archives/88.html#comments</comments>
		<pubDate>Tue, 24 Mar 2009 07:05:51 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[框架]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/88.html</guid>
		<description><![CDATA[做php开发已经好多年了，但一直以来都没有真正使用过框架来开发网站。这几天正在开发一个兼职文章编辑发布系统，感觉业务逻辑有点复杂，想尝试一下使用框架来开发php的乐趣。至于框架，当然还是首选 Zend Framework 了，毕竟是 Zend 官方支持的，而且 Zend Studio 直接支持对 Zend Framework 的开发。
 
对照着Zend Framework的QuickStart教程，建立起一个简单的MVC工程，并不是件难事。其实 Zend Studio直接可以创建一个 Zend Framework 项目，更加省事。
 对php来说，使用框架挑战的不仅仅是php的开发模式，更为主要的，应该是遇到的性能问题。php的每个http请求，都需要重新初始化资源。从某种程度上来说，我们可以把每个http请求都看成是一个独立的进程，不同的请求之间是无法共用资源的。
这样的做法，可以说为php带来了无与伦比的灵活性。我们能可以把每个http请求当成一个简单的程序来写，针对相对业务逻辑比较简单的web开发来说，更是极大地提高了开发效率。并且，由于不同请求是相对独立的，每个请求完毕，都会释放所占用资源，也使得php很少出现严重的内存泄漏问题。在每个请求都可以有比较严格的资源限制，也使得php服务器很少因为几个有问题的请求，而拖垮整个服务的情况。另外，http也是一种无状态协议，php的这种特性也符合无状态的特点。正是由于这些特点，使php成为了互联网最流行的Web编程语言。
对于简单的http请求来说，php每次需要初始化的资源并不多，加上php解析器本身运行速度非常快，所以我们感觉上php的运行速度是非常快的，根本感觉不到这种机制会带来性能上的问题。而一旦使用复杂的php框架后，由于需要每次请求的时候初始化整个框架，性能的下降非常厉害。这应该是限制php框架发展的主要原因。另外各个http请求相互独立，也让php想实现跨请求的高级特性是相当困难的。
也许到将来某一天，php的框架会成为php本身的扩展库，换句话说也就是说php本身扩展支持框架。或许只有这样才能把框架的性能问题降到最低吧。这也是我之所以更加看好 Zend Framework 的主要原因了，毕竟Zend官方的东西，肯定会成为扩展库的首选，呵呵。现在，在尝试过后，还是决定先不使用这些框架了。
这一天可能非常遥远，也可能并不遥远。就目前的情况来说，我并不是十分看好用php框架来开发复杂的 Web 应用。如果说一个 Web 引用需要复杂到要使用比较复杂的框架来开发，那真应该考虑一下换一种更适合的语言来开发了（比如jsp）。
目前来说，php更加需要的可能是编程规范，以及针对各自实际项目的超轻量级框架。
]]></description>
			<content:encoded><![CDATA[<p>做php开发已经好多年了，但一直以来都没有真正使用过框架来开发网站。这几天正在开发一个兼职文章编辑发布系统，感觉业务逻辑有点复杂，想尝试一下使用框架来开发php的乐趣。至于框架，当然还是首选 Zend Framework 了，毕竟是 Zend 官方支持的，而且 Zend Studio 直接支持对 Zend Framework 的开发。</p>
<p> <span id="more-88"></span>
<p>对照着Zend Framework的QuickStart教程，建立起一个简单的MVC工程，并不是件难事。其实 Zend Studio直接可以创建一个 Zend Framework 项目，更加省事。</p>
<p> 对php来说，使用框架挑战的不仅仅是php的开发模式，更为主要的，应该是遇到的性能问题。php的每个http请求，都需要重新初始化资源。从某种程度上来说，我们可以把每个http请求都看成是一个独立的进程，不同的请求之间是无法共用资源的。</p>
<p>这样的做法，可以说为php带来了无与伦比的灵活性。我们能可以把每个http请求当成一个简单的程序来写，针对相对业务逻辑比较简单的web开发来说，更是极大地提高了开发效率。并且，由于不同请求是相对独立的，每个请求完毕，都会释放所占用资源，也使得php很少出现严重的内存泄漏问题。在每个请求都可以有比较严格的资源限制，也使得php服务器很少因为几个有问题的请求，而拖垮整个服务的情况。另外，http也是一种无状态协议，php的这种特性也符合无状态的特点。正是由于这些特点，使php成为了互联网最流行的Web编程语言。</p>
<p>对于简单的http请求来说，php每次需要初始化的资源并不多，加上php解析器本身运行速度非常快，所以我们感觉上php的运行速度是非常快的，根本感觉不到这种机制会带来性能上的问题。而一旦使用复杂的php框架后，由于需要每次请求的时候初始化整个框架，性能的下降非常厉害。这应该是限制php框架发展的主要原因。另外各个http请求相互独立，也让php想实现跨请求的高级特性是相当困难的。</p>
<p>也许到将来某一天，php的框架会成为php本身的扩展库，换句话说也就是说php本身扩展支持框架。或许只有这样才能把框架的性能问题降到最低吧。这也是我之所以更加看好 Zend Framework 的主要原因了，毕竟Zend官方的东西，肯定会成为扩展库的首选，呵呵。现在，在尝试过后，还是决定先不使用这些框架了。</p>
<p>这一天可能非常遥远，也可能并不遥远。就目前的情况来说，我并不是十分看好用php框架来开发复杂的 Web 应用。如果说一个 Web 引用需要复杂到要使用比较复杂的框架来开发，那真应该考虑一下换一种更适合的语言来开发了（比如jsp）。</p>
<p>目前来说，php更加需要的可能是编程规范，以及针对各自实际项目的超轻量级框架。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/88.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用wordpress的SyntaxHighlighter Plus插件把coolcode插件替换了</title>
		<link>http://hes-site.net/archives/68.html</link>
		<comments>http://hes-site.net/archives/68.html#comments</comments>
		<pubDate>Wed, 04 Mar 2009 12:29:13 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/68.html</guid>
		<description><![CDATA[coolcode插件已经很久没有使用了，并且使用coolcode后就不能再使用所见即所得的编辑了。如果用Live Writer来写日志，基本上是没办法使用的。
今天花了点时间去网上搜索了一下，找到了 SyntaxHighlighter Plus 插件。这个插件是基于 Alex Gorbatchev 的 SyntaxHighlighter 库的，这是一个纯粹用 JavaScript 实现的高亮显示代码的库。
测试写了一段php，效果还挺不错。
&#160;
  源代码: 

[sourcecode language=&#039;php&#039;]
function func($a) {
	return $a;
}

$abc = "test"; 

echo func($abc);
[/sourcecode]

&#160;
显示效果: 

function func($a) {
	return $a;
}

$abc = &#34;test&#34;; 

echo func($abc);

]]></description>
			<content:encoded><![CDATA[<p>coolcode插件已经很久没有使用了，并且使用coolcode后就不能再使用所见即所得的编辑了。如果用Live Writer来写日志，基本上是没办法使用的。</p>
<p>今天花了点时间去网上搜索了一下，找到了 <a href="http://wordpress.org/extend/plugins/syntaxhighlighter-plus/" target="_blank">SyntaxHighlighter Plus</a> 插件。这个插件是基于 Alex Gorbatchev 的 <a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter" target="_blank">SyntaxHighlighter</a> 库的，这是一个纯粹用 JavaScript 实现的高亮显示代码的库。</p>
<p>测试写了一段php，效果还挺不错。</p>
<p>&#160;</p>
<p>  <b>源代码: </b><br />
<blockquote>
<pre>[sourcecode language=&#039;php&#039;]
function func($a) {
	return $a;
}

$abc = "test"; 

echo func($abc);
[/sourcecode]</pre>
</blockquote>
<p>&#160;</p>
<p><b>显示效果: </b></p>
<pre class="brush: php">
function func($a) {
	return $a;
}

$abc = &quot;test&quot;; 

echo func($abc);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/68.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vista 开始菜单的项目无法使用以管理员身份运行</title>
		<link>http://hes-site.net/archives/67.html</link>
		<comments>http://hes-site.net/archives/67.html#comments</comments>
		<pubDate>Thu, 19 Feb 2009 02:20:08 +0000</pubDate>
		<dc:creator>checkfors</dc:creator>
				<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://hes-site.net/archives/67.html</guid>
		<description><![CDATA[这两天，忽然之间发现开始菜单中的项目点击右键然后选择以管理员身份运行，结果一点反应都没有，没有UAC提示框弹出，而且进程也没有工作。而直接在exe文件上点击右键以管理员身份运行却一切正常。感觉应该是lnk快捷方式的关联出问题了，所以在网上找了很多关于修复lnk文件快捷方式的文章，但都没有效果。最后在一个偶然机会看到了一篇文章，这才找到问题所在。
 
参照文章《Windows Vista 无法使用 Run as administrator 命令》，我说遇到的问题与该文章的描述一模一样：

所有的 LNK 文件均无法通过右键 — Run as administrator 方式启动 
控制面板里面的“Change Product Key”点击无效 
控制面板用户帐户里面的“Change My Environment Variables”点击无效 
控制面板用户帐户里面的“Configure Advanced User Profile Properties”点击无效 
…… 
实际上所有和LNK相关的内容，只要是以Run as administrator 方式启动的，都无效，包括使用 Windows API ShellExecute

出现问题的原因应该也是类似的：是因为有关联的右键菜单与系统冲突了。
该文章描述的是因为Tencent添加的右键菜单出现的问题，我从来不用QQ，所以肯定不是同一个扩展，那就是其他扩展出问题了。于是下载该文章中的那个工具Windows Shell Menus Manager（http://www.kztechs.com/cxtmgr），检查出现的新的右键菜单项目。基本上把怀疑都集中在了纳米机器人生产的那一项中，不管3721，先把它反注册了再说，反正那个菜单也没什么用。cxtmgr工具可以直接反注册，注意要先以管理员身份运行cxtmgr，不然可能会反注册失败。
重新试验上面的失效的功能，一切都正常了！
注：其实可以去纳米机器人的设置里面，把关联资源管理器菜单那一项选择框去掉。
]]></description>
			<content:encoded><![CDATA[<p>这两天，忽然之间发现开始菜单中的项目点击右键然后选择以管理员身份运行，结果一点反应都没有，没有UAC提示框弹出，而且进程也没有工作。而直接在exe文件上点击右键以管理员身份运行却一切正常。感觉应该是lnk快捷方式的关联出问题了，所以在网上找了很多关于修复lnk文件快捷方式的文章，但都没有效果。最后在一个偶然机会看到了一篇文章，这才找到问题所在。</p>
<p> <span id="more-67"></span>
<p>参照文章<a href="http://blog.sina.com.cn/s/blog_4560b80b0100bm07.html" target="_blank">《Windows Vista 无法使用 Run as administrator 命令》</a>，我说遇到的问题与该文章的描述一模一样：</p>
<ul>
<li>所有的 LNK 文件均无法通过右键 — Run as administrator 方式启动 </li>
<li>控制面板里面的“Change Product Key”点击无效 </li>
<li>控制面板用户帐户里面的“Change My Environment Variables”点击无效 </li>
<li>控制面板用户帐户里面的“Configure Advanced User Profile Properties”点击无效 </li>
<li>…… </li>
<li>实际上所有和LNK相关的内容，只要是以Run as administrator 方式启动的，都无效，包括使用 Windows API ShellExecute</li>
</ul>
<p>出现问题的原因应该也是类似的：是因为有关联的右键菜单与系统冲突了。</p>
<p>该文章描述的是因为Tencent添加的右键菜单出现的问题，我从来不用QQ，所以肯定不是同一个扩展，那就是其他扩展出问题了。于是下载该文章中的那个工具Windows Shell Menus Manager（<a href="http://www.kztechs.com/cxtmgr">http://www.kztechs.com/cxtmgr</a>），检查出现的新的右键菜单项目。基本上把怀疑都集中在了纳米机器人生产的那一项中，不管3721，先把它反注册了再说，反正那个菜单也没什么用。cxtmgr工具可以直接反注册，注意要先以管理员身份运行cxtmgr，不然可能会反注册失败。</p>
<p>重新试验上面的失效的功能，一切都正常了！</p>
<p>注：其实可以去纳米机器人的设置里面，把关联资源管理器菜单那一项选择框去掉。</p>
]]></content:encoded>
			<wfw:commentRss>http://hes-site.net/archives/67.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
