<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>听雨歌楼</title>
    <description>I'm not disposable
我不是一次性的</description>
    <link>http://arust.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>第一次升级 FreeBSD</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/222366" style="color:red;">http://arust.javaeye.com/blog/222366</a>&nbsp;
          发表时间: 2008年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">开始新工作了，又可以继续玩我喜欢的 FreeBSD 了。因为电脑上只有 FreeBSD 6.2 的 iso 镜像，所以安装好系统以后必须升级到最新的 7.0。这也是我第一次尝试升级 FreeBSD。照着手册一步步操作：<br /><br />1.更新源代码<br />为了更新能够快点完成，首先要找个快点的镜像，修改 stable-cvsup 文件，需要修改两个地方：<br />我在北京，cvsup5这个镜像离我最近，常用的cvsuphost可以查看 <a href="http://www.freebsdchina.org/mirrors.php" target="_blank">http://www.freebsdchina.org/mirrors.php</a><br />*default host=cvsup5.cn.FreeBSD.org<br /><br />用来玩还是新鲜一点的版本比较合适，升级到 FreeBSD 7.0-STABLE<img src="/images/smiles/icon_smile.gif"/><br />*default release=cvs tag=RELENG_7<br /><br />设置好以后就可以开始下载源代码了，用了大概一个小时。使用系统自带的csup，用起来和 CVSup 一样，不过有很多老古板坚持使用 CVSup。<img src="/images/smiles/icon_twisted.gif"/><br />csup -g -L 2 stable-supfile<br /><br />2.开始make<br />有了源代码就可以开始升级了：<br />编译基本系统<br /># make buildworld<br />编译和安装新内核<br /># cd /usr/src<br /># make buildkernel KERNCONF=MYKERNEL<br /># make installkernel KERNCONF=MYKERNEL<br />重启后进入单用户模式<br /># reboot<br />安装系统，并合并配置文件<br /># mergemaster -p<br /># cd /usr/src<br /># make installworld<br /># mergemaster<br /># shutdown -r now<br /><br />升级完成，一切顺利<img src="/images/smiles/icon_biggrin.gif"/><br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/222366#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 31 Jul 2008 16:47:49 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/222366</link>
        <guid>http://arust.javaeye.com/blog/222366</guid>
      </item>
      <item>
        <title>优雅的二维数组循环赋值</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/179797" style="color:red;">http://arust.javaeye.com/blog/179797</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">最近在 C++ 博客上看到了一段优雅的二维数组赋值代码，学习了一下。<br />作者为了实现图片中特定效果的二维数组，参考迷宫问题设计了一个优雅的算法，算法的基本思想就是对二维数组按照从外到内的方式赋值，在赋值的过程中加入了对二维数组边界的判断，只需要一层循环就可以实现。整个赋值过程和四冲程发动机工作原理有点类似，循环往复，各种变量之间此消彼长，代码如下：<br /><br /><pre name="code" class="C">const int ROW__ = 10;
const int COL__ = 10;
int mat[ROW__][COL__];

struct Position
{
	int nRow;
	int nCol;
};

int main(int argc, char* argv[])
{
	Position offset[4];
	//从左至右，行号不变，列号加一
	offset[0].nRow = 0;
	offset[0].nCol = 1;
	//从上至下，行号加一，列号不变
	offset[1].nRow = 1;
	offset[1].nCol = 0;
	//从右至左，行号不变，列号减一
	offset[2].nRow = 0;
	offset[2].nCol = -1;
	//从下至上，行号减一，列号不变
	offset[3].nRow = -1;
	offset[3].nCol = 0;

	Position curPos;
	curPos.nRow = 0;
	curPos.nCol = 0;
	mat[0][0] = 1;

	int nOffset = 0;

	Position tempPos;
	for (int i = 1; i &lt; ROW__*COL__; i++)
	{
		// nOffset % 4 ------> 右->下->左->上 循环
		tempPos.nRow = curPos.nRow + offset[nOffset % 4].nRow;
		tempPos.nCol = curPos.nCol + offset[nOffset % 4].nCol;

		if (tempPos.nRow >= ROW__ || tempPos.nRow &lt; 0
				|| tempPos.nCol >= COL__ || tempPos.nCol &lt; 0 // 不超过边界
				|| mat[tempPos.nRow][tempPos.nCol] > 0) // 已经有值
		{
			i--;
			nOffset++;
			continue;
		}	

		curPos = tempPos;
		mat[curPos.nRow][curPos.nCol] = i + 1;
	}
	
	return 0;
}</pre><br /><br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/179797#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Apr 2008 10:43:02 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/179797</link>
        <guid>http://arust.javaeye.com/blog/179797</guid>
      </item>
      <item>
        <title>灵机一动</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/158129" style="color:red;">http://arust.javaeye.com/blog/158129</a>&nbsp;
          发表时间: 2008年01月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium"><br />前几天在阅读PuTTY密钥生成器说明书的时候受到启发，想到了一个关于MD5的问题。MD5散列算法的结果集合空间是2^128，如果假设MD5算法是完美的，那么对任意一个128位长度的二进制串进行散列计算之后，所得的散列值不会有重复的，同时对这些散列值排序之后，肯定会和0~2^128-1这些数字一一对应。既然如此，那么对任意一个256位长度的二进制串进行散列计算会有什么结果呢？384位呢？512位呢？根据抽屉原理，对256位长度的二进制串进行散列计算后，一定会产生冲突。如果能够发现这隐藏于冲突中的规律，也就是破解散列算法的一把钥匙。<img src="/images/smiles/icon_smile.gif"/><br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/158129#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Jan 2008 18:17:50 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/158129</link>
        <guid>http://arust.javaeye.com/blog/158129</guid>
      </item>
      <item>
        <title>[转]10 types of programmers you’ll encounter in the field</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/148670" style="color:red;">http://arust.javaeye.com/blog/148670</a>&nbsp;
          发表时间: 2007年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: 12pt">Programmers enjoy a reputation for being peculiar people. In fact, even within the development community, there are certain programmer archetypes that other programmers find strange. Here are 10 types of programmers you are likely to run across. Can you think of any more?<br /><br />#1: Gandalf<br /><br />This programmer type looks like a short-list candidate to play Gandalf in The Lord of the Rings. He (or even she!) has a beard halfway to his knees, a goofy looking hat, and may wear a cape or a cloak in the winter. Luckily for the team, this person is just as adept at working magic as Gandalf. Unluckily for the team, they will need to endure hours of stories from Gandalf about how he or she to walk uphill both ways in the snow to drop off the punch cards at the computer room. The Gandalf type is your heaviest hitter, but you try to leave them in the rear and call them up only in times of desperation.<br /><br />#2: The Martyr<br /><br />In any other profession, The Martyr is simply a “workaholic.” But in the development field, The Martyr goes beyond that and into another dimension. Workaholics at least go home to shower and sleep. The Martyr takes pride in sleeping at the desk amidst empty pizza boxes. The problem is, no one ever asked The Martyr to work like this. And he or she tries to guilt-trip the rest of the team with phrases like, “Yeah, go home and enjoy dinner. I’ll finish up the next three week’s worth of code tonight.”<br /><br />#3: Fanboy<br /><br />Watch out for Fanboy. If he or she corners you, you’re in for a three-hour lecture about the superiority of Dragonball Z compared to Gundam Wing, or why the Playstation 3 is better than the XB 360. Fanboy’s workspace is filled with posters, action figures, and other knick-knacks related to some obsession, most likely imported from Japan. Not only are Fanboys obnoxious to deal with, they often put so much time into the obsession (both in and out of the office) that they have no clue when it comes to doing what they were hired to do.<br /><br />#4: Vince Neil<br /><br />This 40-something is a throwback to 1984 in all of the wrong ways. Sporting big hair, ripped stonewashed jeans, and a bandana here or there, Vince sits in the office humming Bon Jovi and Def Leppard tunes throughout the workday. This would not be so bad if “Pour Some Sugar on Me” was not so darned infectious.<br /><br />Vince is generally a fun person to work with, and actually has a ton of experience, but just never grew up. But Vince becomes a hassle when he or she tries living the rock ‘n roll lifestyle to go with the hair and hi-tops. It’s fairly hard to work with someone who carries a hangover to work every day.<br /><br />#5: The Ninja<br /><br />The Ninja is your team’s MVP, and no one knows it. Like the legendary assassins, you do not know that The Ninja is even in the building or working, but you discover the evidence in the morning. You fire up the source control system and see that at 4 AM, The Ninja checked in code that addresses the problem you planned to spend all week working on, and you did not even know that The Ninja was aware of the project! See, while you were in Yet Another Meeting, The Ninja was working.<br /><br />Ninjas are so stealthy, you might not even know their name, but you know that every project they’re on seems to go much more smoothly. Tread carefully, though. The Ninja is a lone warrior; don’t try to force him or her to work with rank and file.<br /><br />#6: The Theoretician<br /><br />The Theoretician knows everything there is to know about programming. He or she can spend four hours lecturing about the history of an obscure programming language or providing a proof of how the code you wrote is less than perfectly optimal and may take an extra three nanoseconds to run. The problem is, The Theoretician does not know a thing about software development. When The Theoretician writes code, it is so “elegant” that mere mortals cannot make sense of it. His or her favorite technique is recursion, and every block of code is tweaked to the max, at the expense of timelines and readability.<br /><br />The Theoretician is also easily distracted. A simple task that should take an hour takes Theoreticians three months, since they decide that the existing tools are not sufficient and they must build new tools to build new libraries to build a whole new system that meets their high standards. The Theoretician can be turned into one of your best players, if you can get him or her to play within the boundaries of the project itself and stop spending time working on The Ultimate Sorting Algorithm.<br /><br />#7: The Code Cowboy<br /><br />The Code Cowboy is a force of nature that cannot be stopped. He or she is almost always a great programmer and can do work two or three times faster than anyone else. The problem is, at least half of that speed comes by cutting corners.  The Code Cowboy feels that checking code into source control takes too long, storing configuration data outside of the code itself takes too long, communicating with anyone else takes too long… you get the idea.<br /><br />The Code Cowboy’s code is a spaghetti code mess, because he or she was working so quickly that the needed refactoring never happened. Chances are, seven pages’ worth of core functionality looks like the “don’t do this” example of a programming textbook, but it magically works. The Code Cowboy definitely does not play well with others. And if you put two Code Cowboys on the same project, it is guaranteed to fail, as they trample on each other’s changes and shoot each other in the foot.<br /><br />Put a Code Cowboy on a project where hitting the deadline is more important than doing it right, and the code will be done just before deadline every time. The Code Cowboy is really just a loud, boisterous version of The Ninja. While The Ninja executes with surgical precision, The Code Cowboy is a raging bull and will gore anything that gets in the way.<br /><br />#8: The Paratrooper<br /><br />You know those movies where a sole commando is air-dropped deep behind enemy lines and comes out with the secret battle plans? That person in a software development shop is The Paratrooper. The Paratrooper is the last resort programmer you send in to save a dying project. Paratroopers lack the patience to work on a long-term assignment, but their best asset is an uncanny ability to learn an unfamiliar codebase and work within it. Other programmers might take weeks or months to learn enough about a project to effectively work on it; The Paratrooper takes hours or days. Paratroopers might not learn enough to work on the core of the code, but the lack of ramp-up time means that they can succeed where an entire team might fail.<br /><br />#9: Mediocre Man<br /><br />“Good enough” is the best you will ever get from Mediocre Man. Don’t let the name fool you; there are female varieties of Mediocre Man too. And he or she always takes longer to produce worse code than anyone else on the team. “Slow and steady barely finishes the race” could describe Mediocre Man’s projects. But Mediocre Man is always just “good enough” to remain employed.<br /><br />When you interview this type, they can tell you a lot about the projects they’ve been involved with but not much about their actual involvement. Filtering out the Mediocre Man type is fairly easy: Ask for actual details of the work they’ve done, and they suddenly get a case of amnesia. Let them into your organization, though, and it might take years to get rid of them.<br /><br />#10: The Evangelist<br /><br />No matter what kind of environment you have, The Evangelist insists that it can be improved by throwing away all of your tools and processes and replacing them with something else. The Evangelist is actually the opposite of The Theoretician. The Evangelist is outspoken, knows an awful lot about software development, but performs very little actual programming.<br /><br />The Evangelist is secretly a project manager or department manager at heart but lacks the knowledge or experience to make the jump. So until The Evangelist is able to get into a purely managerial role, everyone else needs to put up with his or her attempts to revolutionize the workplace.</span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/148670#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 16 Dec 2007 12:38:07 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/148670</link>
        <guid>http://arust.javaeye.com/blog/148670</guid>
      </item>
      <item>
        <title>Subversion与CVS的对比——功能性对比</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/148073" style="color:red;">http://arust.javaeye.com/blog/148073</a>&nbsp;
          发表时间: 2007年12月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium"><strong>一、Subversion包含绝大部分CVS功能</strong><br /><br />Subversion 作为CVS 的重写版和改进版，其目标就是作为一个更好的版本控制软件，取代目前流行的CVS。Subversion 的主要开发人员都是业界知名的CVS 专家。Subversion支持绝大部分的CVS 功能/命令；Subversion 的命令风格和界面也与CVS 非常接近。当然，不同的地方正是对CVS 的改进。<br /><br /><strong>二、全局性的版本编号</strong><br /><br />一个新的版本，并得到一个自增量的版本号N+1，该版本号并不针对某个特定的文件，而是全局性的、针对整个版本库的。因此，我们可以将Subversion 的版本库看作是一个文件系统或文件目录树的数组。<br /><br />从技术的角度来说，在Subversion 中，“文件foo.c 的第5 版本”这个说法是错误的；正确的说法应该是：”文件foo.c 在版本库被修改了5 次，即执行5 次commit 后是什么样子？”。显然，在Subversion 中，版本库被修改5 次后foo.c 的内容，和被修改了6 次后foo.c 的内容很可能完全一样，因为版本库的第6 次修改很可能只修改了版本库的其他部分，而并没有对foo.c 的进行修改。相反，在CVS 中，文件foo.c 的第1.1 版本和第1.2 版本总是不同的。<br /><br />Subversion 的全局性版本编号为Subversion 带来了诸多的优势：如对目录或文件执行拷贝，无论涉及多少文件，Subversion 不需要对单个文件依次执行拷贝命令，仅仅需要建立一个指向相应的全局版本号的一个指针即可。<br /><br /><strong>三、目录的版本控制</strong><br /><br />CVS 只能对文件进行版本控制，不能对目录进行版本控制，因此CVS 没有任何关于文件“移动”（move） 操作的概念。当人为进行文件移动操作时，CVS 只能注意到，一个文件在一个位置被删除了，而在一个新位置创建了另外一个文件。由于它不会连接两个操作，因此也很容易使文件历史轨迹丢失。设置 CVS 存储库时，必须非常谨慎地为每个文件选择准确的位置，因为在设置之后，几乎就要一直使用这个位置了。<br /><br />同样由于CVS 不记录目录的版本历史，CVS 不支持对文件的“重命名”（rename），人为的对文件进行重命名会使得命名前后的文件失去历史联系，而记录历史本来是版本管理的主要目的。<br /><br />还有，CVS 不支持对文件的“拷贝”（copy），人为的拷贝对CVS 而言，只能看到新的文件的增加，而不能记录拷贝源文件和目标文件之间的联系。<br /><br />综上所述，缺乏对文件“移动”、“重命名”、“拷贝”的支持的根源在于CVS 不能记录目录的版本历史，而这些操作在当前的软件开发过程中经常发生，这正是Subversion被开发并取代CVS 的主要原因之一。<br /><br />Subversion 将目录作为一类特殊的文件来处理（事实上，从文件系统的角度来看，目录确实是一类特殊的文件，当目录中的子目录/文件被删除、重命名、或新的子目录/文件被创建时，目录的内容将发生改变）。因此，Subversion 象记录普通文件的修改历史一样记录对目录的修改历史，当发生文件/目录的移动、重命名或拷贝操作时，Subversion 能够准确记录操作前后的历史联系。同样，象对文件的不同历史版本进行比较一样，Subversion支持对目录的不同历史版本的比较，清晰展现目录的变化历史。<br /><br /><strong>四、原子性提交</strong><br /><br />从使用者的角度来看，CVS 和Subversion 都支持对多个文件修改的批量提交，但二者在实现方式上存在本质的区别。<br /><br />CVS 采用线性、串行的批量提交，即依次地，一个接一个地执行提交，每成功提交一个文件，该文件的一个新的版本即被记录到版本库中，提交时用户提供的日志信息被重复地存储到每一个被修改的文件的版本历史中。<br /><br />CVS 串行批量提交模式的弊端在于 － 当任何原因造成批量操作的中断时（典型原因包括：网络中断、客户端死机等），版本库往往处于一个不一致的状态：原本应该全部入库的文件只有一部分入库，很有可能版本库中的最新版本不能顺利编译，更为严重的是，随着其他的用户执行cvs update 操作，该不一致性将迅速在开发团队中扩散，从而严重影响团队的开发效率，并存在质量隐患。另外，假如该批量提交的中断没有被及时发现，开发团队往往要花更多的时间进行软件调试和排错。<br /><br />CVS 即使在批量提交不发生中断时也会造成不一致：假设用户A 启动一个需要较长时间才能完成的批量提交；与此同时，用户B 执行cvs update 操作。此时，用户B 很有可能得到一个不一致的更新，即用户B 通过“更新”操作，得到用户A 的部分修改文件。<br /><br />Subversion 彻底消除了CVS 的以上弊端。无论批量提交包含多少文件修改，只有当全部文件修改都成功入库，该提交才变得有效，才对其他用户可见；否则，无论任何原因造成中断，Subversion 都会自动执行“回滚”（rollback）操作。换一个说法，Subversion 保证所有的修改要么全部入库生效，要么一个也不入库，即对版本库不作任何的修改。这就是Subversion 的原子性提交（atomic commit）。<br /><br />由于Subversion 的原子性提交特性和全局版本编号方式，当提交成功完成时，一个唯一的、新的全局版本编号产生，而提交时用户提供的日志信息与该新的版本编号关联，只进行一次存储（区别于CVS 的按文件重复存储）。<br /><br /><strong>五、支持变更集概念</strong><br /><br />由于Subversion 的所有提交是原子性的，每次成功提交形成的唯一的全局版本号对应此次批量提交的所有文件修改，也就是说，一个Subversion 版本号其实对应了一个逻辑上的变更集（change set），该变更集可能对应于对一个BUG 的修复，或者对应于对一个已有功能的改进，或者对应于一个新功能的实现。可以说，变更集是一个软件开发活动的逻辑结果，该变更集可以通过其对应的版本号在软件开发的其他过程中（如软件合并/集成过程，软件发布管理，变更管理系统，缺陷追踪系统）被引用。因此，Subversion 将版本管理从单纯的、单个的文件修改的层次通过逻辑上的抽象，上升到更便于理解和交流的开发活动的层次。<br /><br /><strong>六、差异化的二进制文件处理</strong><br /><br />由于历史原因，CVS 主要是为早期的程序员设计的，CVS 能够有效处理文本文件（或ASCII文件，源代码文件），可以对文本文件进行差异化的存储、新旧版本的比较，文件合并等；但对于二进制文件，CVS 则明显力不从心。在CVS 的版本库中，对于二进制文件的历史版本，CVS 唯一能做的就是对不同的版本进行独立的、冗余的存储，哪怕版本之间其实只存在微小的差异。举例而言，一个10M 的二进制文件（照片、图形文件、机械设计文件、电子设计文件）假如每周修改一次，无论每次修改的大小，一年下来，仅该文件就要消耗500M 以上的存储空间。而且，客户端每次获取该文件的新版本都要消耗10M 的网络流量。<br /><br />对于目前的开发团队，无论是软件开发，Web 站点的开发，手机等电子产品的研发，需要进行版本管理的不仅是源代码等文本文件，还需要管理需求文档、设计文档、测试文档、用户手册，图形图像文件，机械/电子设计文件等诸多的二进制文件，CVS 显然不是一个好的选择。<br /><br />与CVS 不同，Subversion 采用统一的二进制差异算法（binary differencing algorithm），即对文本文件和二进制文件采用相同的差异比较算法，并以相同的方式在版本库中进行存储：每次提交后版本库中只存储相对于先前版本的差异，从而可以节省大量的存储空间。<br /><br />该二进制差异算法不仅应用在版本的存储上，更为重要的是，Subversion 对二进制文件与文本文件一视同仁，当客户端需要获取新的版本时（如执行svn update），在网络上只有版本的差异被传输，从而大大减少对网络带宽的消耗。更多细节参见“七、双向的差异化－压缩网络传输”。 <br /><br /><strong>七、 双向的差异化－压缩网络传输</strong><br /><br />如上所述，CVS 对二进制文件不能进行有效的差异化处理。对于文本文件，CVS 仅仅支持单向的差异化传输：从CVS 服务器到客户端的传输是差异化的，即执行cvs update 时，只有差异的部分从服务器传输到客户端；而当执行cvs commit 时，无论代码变化多少，CVS 都需要从客户端向服务器完整传输被修改文件的全部内容，不能只传输差异。<br /><br />相反，无论是文本文件还是二进制文件，Subversion 都进行双向的差异化传输，并且差异化内容还要进行压缩/解压缩的过程：在服务器端获取差异显而易见，与CVS 类似；Subversion 在客户端获取差异的秘密在于 — Subversion 在客户端的工作拷贝中隐含了每个文件的一个“只读的、干净的”副本（该副本隐藏在隐含目录.svn 里，通常不可见，该副本还有更多的妙用，参见“十二、更多的本地/离线操作”），通过比较用户在客户端的修改和该隐含的副本，Subversion 获取需要真正传送到服务器的差异，并对差异进行压缩后才进行网络传输。<br /><br />对CVS 而言，操作的成本（网络带宽消耗是最大的操作成本）与被修改的文件的大小成比例，而与修改本身的大小无关；对Subversion 而言，操作成本只与修改本身的大小成比例，而与被修改的文件的大小无关。因此，与CVS 相比，Subversion 消耗更少的网络带宽（以客户端的存储空间换取更少的带宽消耗在目前的计算环境下应该是个相当不错的选择！）。Subversion 更加适合基于互联网（或广域网）进行协作开发的地理上分布的团队 ——版本服务器集中、单一；客户端广泛分布。<br /><br /><strong>八、高效、快捷创建分支和基线</strong><br /><br />CVS 和Subversion 都支持分支（branch）和基线（tag），通过分支与合并，可以有效支持大项目的并行开发模式；通过基线管理，可以准确标识一组文件的版本，有效进行软件发布管理和必要时的历史回溯。<br /><br />但CVS 和Subversion 在实现分支和基线的方式上存在很大的不同。CVS 在创建分支的时候，需要对所有进行分支的文件进行依次的操作，因此分支的建立成本（主要是建立分支所需的时间，或消耗的计算资源）与参与分支的文件数量成比例，项目越大，版本库越大，文件越多，分支的建立成本越高；基线（tag）的建立与此类似。<br /><br />Subversion 的分支和基线是通过执行“拷贝”来建立的：回想一下在没有引入版本管理工具的时候我们是如何进行所谓的“分支”和“基线”管理的？答案显然是“拷贝” — 我们通过“拷贝”或“备份”来建立基线；同样，为支持多个开发人员可以同时进行开发，我们为每个开发人员创建一份“拷贝”。由此看来，Subversion 通过“拷贝”来建立分支和基线显得非常自然，有点“返朴归真”的意思。<br /><br />由于Subversion 的全局版本号特性，Subversion 中分支或基线的创建过程，或Subversion中的“拷贝”过程，真正的操作是在版本库中创建一个到某一全局版本号的指针（pointer），不再需要针对众多的单个文件依次执行操作。因此，该操作的成本为一个很小的常数，与项目大小，版本库大小，文件数目的多少无关；并且，分支或基线的建立不需要进行版本的冗余存储，新建立的分支或基线基本不占用版本库空间，分支的后续存储空间的开销也只与修改的大小有关。<br /><br /><strong>九、集成Apache Web Server，提供更多的特性</strong><br /><br />Subversion 通过与Apache Web Server 的集成，可以提供基于http/https 协议的版本库访问机制，从而支持Subversion 跨越防火墙的安全访问。除此以外，Subversion 还可以利用更多的Apache 特性，包括但不限于：Apache 丰富的用户认证机制（包括通过LDAP服务器如Windows Active Directory 服务器的用户认证），基于目录路径的精细粒度的访问控制，对传输的网络流量进行压缩/解压缩，浏览版本库目录结构等等。<br /><br /><strong>十、支持WebDAV</strong><br /><br />WebDAV（Web-based Distributed Authoring and Versioning）是一种基于 HTTP 1.1 协议的通信协议.它扩展了HTTP 1.1，在GET、POST、HEAD 等几个HTTP 标准方法以外添加了一些新的方法，使应用程序可直接对Web Server 直接读写，并支持写文件锁定(Locking)及解锁(Unlock)，还可以支持文件的版本控制。<br /><br />Microsoft windows2000/XP 及IE, Office 还有Adobe/MicroMedia 的DW 等都支持WebDAV，这又大大增强了Web 应用的价值，以及效能。对于需要大量发布内容的用户而言，应用WebDAV 可以降低对CMS 系统的依赖，而且能够更自由的进行创作。上传、下载变得轻松自如。<br /><br />Subversion 通过与Apache Web Server 的集成，支持WebDAV 协议，使得业务用户（business users）或非技术用户在不安装任何版本管理客户端的情况下轻松访问Subversion 版本库，不改变业务用户已有使用习惯，支持分布的业务用户对文档的评审、修改并实现版本控制，真正将软件开发的生命周期从开发/技术团队扩展到项目的全部干系人（stakeholder），避免通过电子邮件传递文档的混乱与无序、通过Windows 操作系统共享造成的安全漏洞、病毒攻击、历史版本被覆盖或丢失、审计困难等诸多典型问题。<br /><br /><strong>十一、更好的冲突标识与处理</strong><br /><br />CVS 和Subversion 都支持通过分支与合并进行并行开发，并可以自动检测到合并时的冲突（conflicts），并在合并结果中以&lt;&lt;&lt;&lt;&lt;&lt; … >>>>>>标识合并的冲突部分。<br /><br />在CVS 中，经常会出现由于用户的疏忽（如，没有注意到冲突，或没有完全处理好冲突）而将仍然带有&lt;&lt;&lt;&lt;&lt;&lt; … >>>>>>冲突标识符号的文件直接进行提交（commit），从而在版本库中产生垃圾版本。<br /><br />Subversion 有效解决了CVS 的以上问题：Subversion 记录并保持文件的冲突状态，只有当用户明确执行svn resolved 命令后，该冲突状态标识才被复位，该文件才能被提交，从而大大减少了将仍然带有&lt;&lt;&lt;&lt;&lt;&lt; … >>>>>>冲突标识符号的文件直接进行提交的可能性。<br /><br /><strong>十二、 更多的本地/离线操作</strong><br /><br />众所周知，CVS 客户端的工作拷贝中包含了一个隐含目录CVS，该目录中记录了客户端需要的一些管理信息；与此类似，Subversion 的客户端工作拷贝中也包含了一个隐含目录.svn，该目录中同样记录了客户端需要的一些管理信息，如版本库URL，当前访问版本号等。<br /><br />与CVS 不同的是，Subversion 的.svn 目录中还包含了工作拷贝中每一个文件的一个“只读的、干净的”副本。正是由于该副本的存在，使得Subversion 与CVS 相比，可以执行更多的本地/离线操作，即某些操作不需要访问版本库服务器，因此不需要存在从客户端到服务器的网络链接，当然也不消耗任何网络带宽，这进一步增强了Subversion 对广域网的友好支持。<br /><br />Subversion 的以下命令可以进行离线操作：<br />svn status － 显示工作拷贝上的本地修改概况；<br />svn diff －显示工作拷贝上的本地修改细节，比较修改前后的内容；<br />svn revert － 撤销工作拷贝上的本地修改；<br /><br /><strong>十三、 对符号链接进行版本管理</strong><br /><br />在Unix 文件系统中，符号链接（symbolic links，包括硬链接和软链接）是一种重要的文件系统元素。CVS 不能对符号链接进行版本管理；Subversion 则可以对符号链接进行版本管理。<br /><br /><strong>十四、 元数据管理</strong><br /><br />与CVS 相比，Subversion 增加了元数据（metadata）管理机制。即可以对版本库中的文件或目录附加任意的“属性”（property），并记录属性的变化历史，也就是对元数据进行版本管理。一个Subversion 属性是一个“属性名称/属性值”的二元组，如“BugNumber= 100”就是一个属性，可以将该属性附加到版本N 上，以说明版本N 改正了编号为100的BUG。<br /><br />Subversion 元数据的目的是提供附件的信息以满足流程或过程自动化的需要，以增强Subversion 的管理能力和自动化程度。Subversion 自身就通过“属性”来存储一些特殊的信息。一个使用Subversion 元数据的例子：可以在一些批处理的脚本程序或Subversion的钩子程序（hooks）中创建、访问、修改“属性”元数据来满足流程自动化的要求。</span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/148073#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Dec 2007 14:01:47 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/148073</link>
        <guid>http://arust.javaeye.com/blog/148073</guid>
      </item>
      <item>
        <title>中国百姓上了五种当：房产、就业、教育和涨工资及买车</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/137556" style="color:red;">http://arust.javaeye.com/blog/137556</a>&nbsp;
          发表时间: 2007年11月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">中国百姓上了五种当：房产、就业、教育和涨工资及买车<br /><br />为什么中国人执迷不悟？？最后脑袋怎么掉的都不知道！ 但一代一代的中国人不顾家破人亡，妻离子散还是要像朝圣一样的上当呢？我不做过多的说明，因为自古以来这片土地上的统治者们都把思想禁锢和愚民说教作为统治的利器。所以一代一代的中国人就这样永远失去创造力，永远失去过上幸福日子的可能。直到多年以后我们的子孙后代再次被人推进毒气室！我们的子孙后代再次被侵略者的炮弹炸成碎片，被人像猪狗一样屠杀的时候，我们还能瞑目吗？因为我们二战的苦难是清朝所有人遗留给我们的，而我们子孙将要承受的苦难则是我们今天的愚蠢留给他们的！<br /><br />第一大当：房产！<br /><br />买房意味着什么？意味着你拥有了一个属于自己的房子。是的，你是这样以为，但是在中国你并无法拥有这个房子，只是租给你而已。因为中国只有把土地使用权租借给你70年(有的地方是50年)。而房子通常情况下30年左右就会遇上拆迁或者旧房改造。也就是说你花了买房的钱，却只能得到租房的实际效果。当然这还不是最坏的。最坏的是，当几十年后你发觉上当了！有一群流氓冲进你用一辈子积蓄“买”下的房子，画上一个大大的“拆”字！然后把你的家当全部当垃圾一样的仍出门外，不顾你的苦苦哀求，甚至还在报纸上给你按一个“钉子户”的臭名，任大众辱骂的时候你就会知道什么叫做绝望！<br /><br />形容中国的房地产有一个很有名的笑话是这样写的：<br /><br />以前，有个地主有很多地，找了很多长工干活，地主给长工们盖了一批团结楼住着，一天，地主的谋士对地主说：东家，长工们这几年手上有点钱了，他们住你的房子，每月交租子，不划算，反正他们永远住下去，你干脆把房子卖给他们起个名堂叫做-----公房出售！告诉他们房子永远归他们了，可以把他们这几年攒的钱收回来，地主说：不错，那租金怎么办？谋士说：照收不误，起个日本名儿，叫物业费！地主很快实行了，赚了好多钱，长工们那个高兴啊！<br /><br />过了几年，地主的村子发展成城镇了，有钱人越来越多，没地方住，谋士对地主说：东家，长工们这几年手上又有钱了，咱们给他们盖新房子，起个名堂叫做旧城改造，他们把手上的钱给我们，我们拆了房子盖新的，叫他们再买回去，可以多盖一些卖给别人，地主又实行了，这次，有些长工们不高兴了，地主的家丁派上用途了，长工们打掉牙只好往肚子里咽，地主又赚了好多钱。<br /><br />又过了几年，地主的村子发展成大城市了，有钱人更多了，地主的土地更值钱了，谋士对地主说：东家，咱们把这些长工的房子拆了，在这个地方建别墅，拆出来的地盖好房子卖给那些有钱的大款还能赚一笔，地主说：长工们不干怎么办？谋士说：咱给他们钱多点儿，起个名堂叫货币化安置，咱再到咱们的猪圈旁边建房子，起个名堂叫经济适用房，给他们修个马车道让他们到那边买房住，地主说：他们钱不够怎么办？谋士说：从咱家的钱庄借前给他们，一年6分利，咱这钱还能生钱崽，又没风险，地主又实行了，长工们拿到钱，地主的经济适用房到现在才建了一间，长工们只好排队等房子，直到现在，还等着呢------<br /><br />于是，长工们开始闹事了，地主有点慌，忙问谋士怎么办？谋士说：赶紧通知长工们，房子要跌价了，别买了，租房住吧，正好把我们的猪圈租给他们，结果，这么多年后，长工们的钱全没了，还在租房住，直到永远！<br /><br />这个笑话虽然有点夸张，但实际上这何尝又不是事实呢？有人说既然如此？为什么中国人还要买房？疯了一样的买？？？ 为什么？还不是愚民教育的结果，就好象60年代，鼓吹人们必须购买三大件：手表、缝纫机、自行车才算是“成功人士”才可嫁人娶妻。70年代鼓吹人们必须购买新四大件：电视，冰箱，洗衣机，装电话才算是“出人头地”才可娶妻生子一样，记得当年装电话可是要几千块钱一部啊(人均收入不到200的小城)，而北京上海更有上万一部的时候。还得排队买号搭人情，和今天的买房又何其相似？<br /><br />而今天所有的狗屁学者又开始了这一套愚弄百姓的旧招：“白领一族新标准”，“成功人士新选择”X环X路小户型，X环X路商住型。其实都是狗屁。收了你几十万后，还得每个月收你租金(新物业费)，银行利息，以及各种巧立名目的加息、政策等等等等。总之不怕你不被整死，就怕你死得不够惨！老百姓咋就怎么乐于上当，而且百上不厌呢？我真是气得浑身都湿了！<br /><br />第二大当：就业！<br /><br />当有人终于开始感叹：当年当知青就是做了一回傻*的时候，当有人下岗之后感到没有生路，只能静坐抗议却无人理会，只能沦落街头还被人编首歌嘲笑着“人生豪迈，重头再来”的时候。你可曾想过！他们也曾经和今天的“白领”一样风光！他们的收入和地位也曾经让周围的人艳羡不已？你可曾想过20年后的今天！你一样会和他们一样沦落街头，众叛亲离？！<br /><br />有人说嘿！你不知道有失业保险，养老保险，XX保险么？呵呵，我在北京漂泊N年，交了无数保险大概有好几万吧，但失业的时候跑断腿也没人给我啥保险，反而很多保险都被冻结了说我交得断断续续的，我简直又气得……这还不算，你以为你到了60岁真的就可以拿到养老保险了吗？狗屁！天上又不会掉钱！今天的老年人拿的退休金是我们在挣！而今天30-40岁的人通常都有好几个兄弟姐妹！意思就是，今天的老年人能在60岁拿到养老保险是因为有5个人供一个老人！而我们这一代老去之后则是一个人供我们两个老人！钱从哪里来？没得来！您要是能活到90岁估计能领到一些养老保险，嘿保重吧您。<br /><br />然而即使是这样，家长们还是疯了一样的把孩子往各种企事业国有单位里送，我身边就经常有这样的例子。我老家一个远房亲戚，找关系拖朋友，花了七万块钱通过公开招聘把儿子送进了交警队，干上的合同制警察。一个月拿800块。结果第三年被竞争上岗给刷下来了。一家人哭哭啼啼，我说刷了好，你上那班一辈子挣不回那七万，赶紧先洗洗睡，改明再凑点钱做小生意去吧！没准还能赚点。<br /><br />当年我毕业的时候，我妈也是领着我抱着钱，把我往XX部送。我一看负责招工那人那德行，就忍不住的恶心，再一看薪水，妈呀，我这不是白干10年不吃不喝才拿回“成本”。还混个屁！所以我私下威胁了那家伙一把，吓得那个大腹便便的X科长再也不敢招收我。我才得已：“离家出走”。<br /><br />我就想不明白？中国人咋就这么傻？这么迷信“国”字呢？醒醒吧，思维正常一点行不？别成天跟一傻X一样。做事之前自己算算合算不合算成不？<br /><br />还有那些年纪轻轻的小白领们，找工作最好把薪水要高点，别要医疗保险和啥保险，然后自己把钱存起来。将来用得着。<br /><br />第三大当：教育！<br /><br />一张文凭值多少钱？一张文凭值多少钱？一张文凭值多少钱？印刷成本两块钱顶了天了。一个老师工资多少？嘿，两个学生的学费足够一学期了！一个班的书本印刷多少钱？两个学生的足够了！一个班房租多少钱一学期？嘿嘿两个学生足够了。！嘿！中国教育你凭啥收那么多钱！？<br /><br />嘿！百姓们！我们为啥要上当？因为从小统治阶级就告诉我们考上“秀才”才光荣。哦对不起我说错了，是考上“大学”才光荣。但老百姓从来不去想一想为什么光荣？为什么光荣…… 大学秀才又怎样还不是废物！<br /><br />你知道你的孩子是什么人在教么？在中国一般是无法适应社会的人才会沦为一个教师，举个例子。前段时间我因为一个项目的关系，找了几个大学的硕士生做程序。结果有几个人笨得很猪一样，完全不给你考虑，非得你守着才干活，而且给个文件明显有一个错别字，Y也不给改，等你发现了还跟你较真，是这不是他的错，是你给的就是错的。一点责任感，一都不会考虑究竟是为了做事而做事还是为了做好一件事而做事。我还是很心平气和的给他们讲道理：“你们必须学会为别人思考，思考别人想要什么结果再去做事情。否则无法在社会上生存。”结果那几个傻*说：“我们才不要去社会上，我们考试成绩好得很，学校要我们留校做老师。再说了本来我们就没什么错，你怎么安排我们怎么做，你不安排我们就不做。这是我们的尊严和原则。”我说：“如果你去守门，老板没安排你下班的时候锁好仓库你就不锁了吗？”他们几个傻*居然还在那里笑。同志们，您心寒吗？以后您的孩子就是在这个的傻*下学习和成长。您放心么？、<br /><br />难怪现在读大学的同居，逃课，打架，自杀…… 但家长们还是愿意花钱把孩子送进“学校”去。而且是花一辈子的钱。甚至穷到卖血也要去把孩子关在一个啥啥学不到的“疯人院”里。同胞们？你们醒醒好吗？求你们了。我已经气得……<br /> <br />第四大当：涨工资！<br /> <br />涨工资了，好像很多人在高兴，完全错了。有些人是涨了，或许能暂时补上市场的差价补偿，但很多是无法补上的，更不用说无收入的群体了！他们根本无私毫补偿，但补偿了工资的你也别高兴得太早了，从涨工资的前一刻起，意味着你的以前的储蓄又全部再次贬值，这可是你一生的努力，钱去哪了？不想多说你也懂！<br /><br />第五大当：买车！<br /><br />中国人疯了吗？买车？为什么要买车？？？当然您有了钱花不光了，您爱怎么买怎么买，买车买房，反正油价怎么涨你也花不完钱，房子要拆迁你也不心疼。但是大多数老百姓呢？<br /><br />我以前有个同事傻得很猪一样，住北二环，公司西直门那里。每天坐地铁上班最多半小时。可Y非得买一二手夏利，跟猪一样的每天早上8点开始在路上堵着，然后一点一点的挪到公司。嘿，一个月停车费都不少。可人家就觉得开了车自己身份高级一点。其实就是愚蠢，别说你开个夏利，就是开个奥迪我也没见谁对谁三磕九拜。除了显得自己比别人傻*一点外完全没有别的作用。<br /><br />还有一次，我遇见一个月收入擦一4000的小姑娘，在计划贷款买车。于是我就问她：“小姑娘，你又没做生意，自己按时上班，地铁又方便，买车干什么呢？”Y想了半天，实在估计也想不出什么理由来了就说：“有时候去超市买东西吧，打车又觉得近了点不划算，走路又远了点。所以自己开车去了！”听得我差点没恶心死。你Y开车去超市买个方便面不觉得恶心么？装备了大哥大去拣垃圾，也是拣垃圾的！别以为买了车能证明什么，如果一定要找贱。我看还不如直接在自己脸上刻一“屎”字来得直接。<br /><br />比如我现在自己做生意，很忙，一天大概要跑4-5个地方，见很多客户。但我就不买车，为什么？我打车随招即来，打完就走，不用担心停车没地方，不用担心挂了碰了，不用担心被贼偷了绑了，无论挂风下雨都有司机。万一碰着个堵车还可以下车坐地铁。一年也就一万多块RMB！要买一车！一年停车费都得一万多！这不是傻*么？？？<br /><br />说别买车别买车，可就有无数的人疯了一样的去贷款买？一定要嫌自己将来死得不够惨似的！买吧，买完了加息了不是？油价涨疯了不是？停车又贵了不是？后悔了不是？新车一上路就掉价了卖也卖不掉了不是？？？<br /><br />告诉你，油价还得涨。一定要涨到和美圆一样的油价。嘿嘿！您拿老美1/10的收入，养和人家一个价的汽油。我看您还得瑟不。<br /><br />最后说一句，每个人都不傻，都是从小被愚民教育给弄啥了。傻点不要紧，但性命悠关的事儿您还是紧着点，多盘算盘算经济利益之间的关系！别到头来，房产一跌，油价一涨，交了半辈子钱拿了毕业证还是啥啥不会干，交了几十年苛捐杂税还啥啥福利没有。您亏的可不仅仅是差价几十万(不懂经济学的可以去学一下，房价和收入的关系。这里我就不罗嗦地阐述了。)到时候您就只能去政府门口静坐上吊。可要真上吊也没人替您收尸！！！<br /><br />有人还说什么？哎呀没办法，难道不住了，不买车啦，公车好挤呀。我说全是愚民教育出来的虚荣心在做怪。您看看我，租一个房子住才一千多块一个月，也就相当于有些人的物业费。如果要结婚我还租得起3-4千的，家具装修一应具全。而且还哪方便我住哪儿。不想搬就长期租。也和交物业费一个样。还白白省出还银行贷款、利息、首付一大堆。俺有事就打车，没事就地铁，一年一万顶天了，还省了车库费，停车费，罚款等一堆，油价涨到10块俺也乐呵，也不耽误事。俺大学没念完就跑了，一边自学一边自己钻研市场出策划跑业务，不也同样可以进外资企业，上市企业做经理么？还省出好几万学费来。<br /><br />当然有的人会说：“你Y连个房子都不买，指定结不了婚。”我心想：“我是没有，您以为您有啊？”有人说租房子不划算，租完了还是别人的，嘿嘿，你以为买房子还了几十年贷款，还清了就是你的了啊？</span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/137556#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Nov 2007 12:50:33 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/137556</link>
        <guid>http://arust.javaeye.com/blog/137556</guid>
      </item>
      <item>
        <title>文泉驿</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/133436" style="color:red;">http://arust.javaeye.com/blog/133436</a>&nbsp;
          发表时间: 2007年10月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">现在开源真是流行，连中文字体都有开源的，而且还挺好看的，不比微软雅黑差多少，真是不错。主页：http://wenq.org/<br />PS. 文泉驿如果使用 BSD 协议就更好了<img src="/images/smiles/icon_biggrin.gif"/></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/133436#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 19 Oct 2007 15:20:16 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/133436</link>
        <guid>http://arust.javaeye.com/blog/133436</guid>
      </item>
      <item>
        <title>FreeBSD 6.2 上安装 GCC 4.2.1</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/127658" style="color:red;">http://arust.javaeye.com/blog/127658</a>&nbsp;
          发表时间: 2007年09月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">最近在 FreeBSD 6.2 上安装了最新版的 GCC 4.2.1。不过为了卸载的时候方便，我把它安装在一个单独的目录下，将来不需要的时候可以方便的删除整个目录。<br />GCC安装的过程很简单，只是编译的时间有点长。首先去http://gcc.gnu.org/下载源代码，因为我只需要C和C++编译器，所以只下载了gcc-core-4.2.1.tar和gcc-g++-4.2.1.tar。下载完以后首先解压gcc-core-4.2.1.tar，然后再解压gcc-g++-4.2.1.tar到同一个目录。GCC的安装说明建议再建立一个目标目录（objdir），与源代码所在的目录（srcdir）分开。做完这些以后，进入目标目录，使用源目录中的configure来进行安装前的配置，详细的配置参数在安装说明里写得很清楚，我只对安装的路径和需要支持的语言进行了配置<br /><br />configure --prefix=/usr/local/gcc-4.2.1 --enable-languages=c,c++<br /><br />配置好以后，对就可以make了，不过FreeBSD自带的make会出错，所以还是使用gmake。<br />经过一个小时左右的时间，GCC4.2.1编译完成，再用gmake install把编译好的GCC安装到指定的目录下。整个安装过程就结束了。<img src="/images/smiles/icon_biggrin.gif"/></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/127658#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Sep 2007 17:05:34 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/127658</link>
        <guid>http://arust.javaeye.com/blog/127658</guid>
      </item>
      <item>
        <title>去掉PowerDesigner 12 的日期提示</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/124954" style="color:red;">http://arust.javaeye.com/blog/124954</a>&nbsp;
          发表时间: 2007年09月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">最近Sybase推出了新版的PowerDesigner 12.5，立刻下载了试用版，很好用，不过只能用30天，在网上查了一下，原来可以去掉这个限制：<br /><br />安装好软件以后，找到安装目录下的pdflm12.dll文件，使用二进制编辑器打开此文件，查找：<br /><br />83 C4 14 8B 85 E4 FE FF FF<br /><br />将此字符串改为<br /><br />83 C4 14 33 C0 90 90 90 90。<br /><br />运行PowerDesigner之后，可以发现已经没有剩余试用天数的提示了。不过打开帮助菜单，进入关于对话框后，还是会有试用版的提示，不过不影响使用<img src="/images/smiles/icon_biggrin.gif"/></span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/124954#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Sep 2007 13:08:51 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/124954</link>
        <guid>http://arust.javaeye.com/blog/124954</guid>
      </item>
      <item>
        <title>同时运行多个tomcat</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/123828" style="color:red;">http://arust.javaeye.com/blog/123828</a>&nbsp;
          发表时间: 2007年09月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: medium">最近因为工作所需，要在一台服务器上同时运行两个tomcat，jakarta-tomcat-5.0.28和apache-tomcat-5.5.23，各自使用的JDK版本也不同，分别是jdk1.4和jdk1.5，下面开始进行设置<br /><br />一、设置JDK<br />打开tomcat-5.0.28下bin目录的startup.bat文件，在开始添加：<br />set JAVA_HOME=D:\Java\jdk1.5.0<br /><br />打开tomcat-5.5.23下bin目录的startup.bat文件，在开始添加：<br />set JAVA_HOME=D:\Java\jdk1.5.0<br /><br />二、修改端口<br />要使多个tomcat能同时运行，只要让每个tomcat的端口互不相同就可以了，这个很简单，打开conf目录下的server.xml文件，找到默认为8005、8080、8009的这几个端口值，几个tomcat改成互不相同的值就可以了。<br /><br />&lt;Server port="8005" shutdown="SHUTDOWN"><br /><br /><br />&lt;Connector port="8080" maxHttpHeaderSize="8192"<br />               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />               enableLookups="false" redirectPort="8443" acceptCount="100"<br />               connectionTimeout="20000" disableUploadTimeout="true" <br />               URIEncoding="UTF-8"/><br /><br /><br />&lt;Connector port="8009" <br />               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" <br />               URIEncoding="UTF-8"/><br /><br />修改完成以后，运行startup.bat文件就可以启动tomcat了</span>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/123828#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Sep 2007 15:29:08 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/123828</link>
        <guid>http://arust.javaeye.com/blog/123828</guid>
      </item>
      <item>
        <title>有必要设操作系统环境变量吗？</title>
        <author>arust</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arust.javaeye.com">arust</a>&nbsp;
          链接：<a href="http://arust.javaeye.com/blog/123233" style="color:red;">http://arust.javaeye.com/blog/123233</a>&nbsp;
          发表时间: 2007年09月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3" face="Verdana">几乎所有和Java有关的书，一提到搭建Java的运行环境，言必称设置JAVA_HOME等乱七八糟的操作系统环境变量。在网上很多所谓高手写的文章也是如出一辙，结果搞得很多Java初学者晕头转向，往往照做以后还是会出现问题，又不知道是哪个环节出错，浪费大量的时间和精力，我也是其中之一。</font></p>
<p><font size="3" face="Verdana">后来仔细看了一些软件的文档后，发现并没有提到设置操作系统环境变量之类的内容。使用Java编写的程序只要有Java虚拟机就可以运行，设置环境变量的目的只是让程序知道JVM的位置所在。所以，只要能让程序找到JVM，操作系统环境变量其实是可以不用设置的，尤其在系统上安装了多个不同版本的JDK之后，设置了反而会出现问题，至少到目前为止，我用过的eclipse，tomcat，geronimo，robocode等等软件都不用按照那些复杂的方式设置什么环境变量，就可以很好的运行。因为这些软件都有相应的启动脚本，或者配置文件，在其中加入需要的JDK或JRE所在的目录就行了。例如：eclipse的目录下就有一个eclipse.ini文件，用文本编辑工具打开后，在开始加上</font></p>
<p><font size="3" face="Verdana">
-vm
C:\jdk1.5.0\bin\javaw.exe</font></p>
<p><font size="3" face="Verdana">
启动eclipse的时候就不会提示找不到Java虚拟机了，而且还可以在一个系统下安装多个JDK而不冲突。Tomcat的设置方法也是类似的，在其bin目录下，编辑startup.bat文件，开始处加上
</font></p>
<p><font size="3" face="Verdana">
set JAVA_HOME=C:\jdk1.5.0
</font></p>
<p><font size="3" face="Verdana">
就行了。不过如果在linux操作系统下，就要在startup.sh脚本中加上类似
</font></p>
<p><font size="3" face="Verdana">
export JAVA_HOME=/opt/jdk1.5.0
</font></p>
<p><font size="3" face="Verdana">
这样的语句。
</font></p>
<p><font size="3" face="Verdana">
<p><font size="3" face="Verdana">网上的文章大多数是转来转去，同样一篇文章可以出现在无数个技术网站上，这样的一些文章表面看起来是步骤清楚，甚至图文并茂，实践性强，但是涉及到一些基本的原理时往往语焉不详，初学者不假思索地照做反而是误入歧途，南辕北辙。与其找这样的一些垃圾文章来看，不如看看软件附带的文档，很多问题都可以在其中找到答案。</font></p></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://arust.javaeye.com/blog/123233#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Sep 2007 13:59:00 +0800</pubDate>
        <link>http://arust.javaeye.com/blog/123233</link>
        <guid>http://arust.javaeye.com/blog/123233</guid>
      </item>
  </channel>
</rss>