<?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>Drink Java</title>
	<atom:link href="http://drinkjava.net/feed" rel="self" type="application/rss+xml" />
	<link>http://drinkjava.net</link>
	<description>只为成功找出路，不为失败找借口。</description>
	<lastBuildDate>Thu, 29 Jul 2010 01:42:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>五个方法成为更好的程序员</title>
		<link>http://drinkjava.net/2010/07/%e4%ba%94%e4%b8%aa%e6%96%b9%e6%b3%95%e6%88%90%e4%b8%ba%e6%9b%b4%e5%a5%bd%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%91%98.html</link>
		<comments>http://drinkjava.net/2010/07/%e4%ba%94%e4%b8%aa%e6%96%b9%e6%b3%95%e6%88%90%e4%b8%ba%e6%9b%b4%e5%a5%bd%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%91%98.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 01:42:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net相关]]></category>
		<category><![CDATA[Java相关]]></category>
		<category><![CDATA[开发相关]]></category>
		<category><![CDATA[杂侃]]></category>
		<category><![CDATA[程序员]]></category>
		<category><![CDATA[软件开发]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=111</guid>
		<description><![CDATA[对我来说，一个好的程序员应该是努力去追求尽可能无错的高质量的符合需求的代码实现。 一些人也许认为好的程序员是那些懂得多门编程语言，懂得很牛技术的程序员，是的，这在某些情况下是对的。但归根到底，无论你用什么样的技术，什么样的语言，所有的程序被写出来，其功能都要符合需求以及尽可能地健壮无错和高质量。  我们可以想像一下，如果一个能力普通的程序员有足够多的时间来做测试，那么，其也可以保证他的代码的质量。所以，有一种观点这样认为——要达到质量高的代码只需要有足够多的时间来做测试。这对于以结果为导向的商业软件开发中是可以理解的（我们可以看到那些制汽车的产商在汽车测试上花费的精力和时间就可以明白这一道理）。
但是，很明显，所有的已经开发出来项目都是在不完美的条件下开发出来的，一般来说，几乎所有的项目都是在最大化程序员软件的开发速度。而且，很多情况下，我们似乎对深度测试和压力测试并不是很关心，所以，我们总是在祈祷并期望那些赶工出来的代码可以正常工作，尤其是在上线的时候，这种唯心主义的价值观更为强烈。  其实，开发速度和软件产品质量并不矛盾。好的程序员并一定是技术强的程序员，而是那些可以在不完美的工作环境下保证软件质量和工作效率的程序员。下面是是五个程序员可以在这种不完美的情况下做得更好的观点（它们都和语言和技术没什么关系，只不过是一种你的工作行为，能够和所有的行业相通），这五个观点也许可以让你成为这样的好程序员。
 

寻找不同观点：程序员好像并不喜欢技术上有异见的人，他们特别喜欢争论各自的技术观点。但是，他们忽略了不同观点的价值。任何事情都有好有坏，我们应该学会在不同观点中学习和平衡。这样才会更多的了解编程和技术。要经常在做事之前问自己和别人，这么做对不对？做完事后问自己，还可不可以改进？努力去寻找别的不同的观点或方法。程序员应该经常上网，经常和同事讨论不同的实现方法，不同的技术观点，这样才能取长补短。然而，在实际工作中，我发现程序员们并不喜欢互相请教，因为请教的人怕别人看不起他，而被请教的人总是先贬低对方的能力，哎……（参看《十个让你变成糟糕的程序员的行为》），如果有这样的文化氛围的话，那也没有关系。上网吧，网上的人谁也不认识谁，可以尽情地问一些愚蠢的问题。呵呵。总之，一定要明白，如果某些事情只有一个观点，那么你一定要怀疑一下了，没有观点和技术方案的比较，没有百花齐放的情况，你就无法知道是否还有更好的东西。真正的和谐不是只有一种声音，真正的和谐而是在不同的观点声音下取长补短，百家争鸣（参看《十条不错的编程观点》）。否则，你永远都不会接受到新的观点，也就无法进步和成长了。

 

千万别信自己的代码: 在任何时候，一定要高度怀疑自己的代码。很多时候，错误总是自己造成的。所以，当出现问题的时候，要学会review代码中所有的可疑点，千万别觉得某段代码很简单，可以略过。事实证明，很多疏忽大意都是在阴沟里翻的船，都是那些很低级的错误。在查错的过程中，切忌过早下结论，切忌四处乱改（参看《各种流行的编程风格》），停下来，想一想，会是哪儿的代码有重大嫌疑，然后查看一下代码，捋一捋程序的逻辑（参看《橡皮鸭程序调试法》），调试并验证一下程序的逻辑和变量在运行时是否是正确的。很多时候，对于那些难缠的问题，最后解决了总是因为我们开始认真回头审视所有的代码。只有对自己的代码保持着高度的怀疑，这样我们才会想着如何让其运行得更好更稳定，也会让我们在单元测试中下更多的功夫，这样才能更能在那忙碌的环境中节省时间。相信我，在集成测试中fix bug的成本要比在单元测试Fix bug的成本大得多的多。一个简单的例子就是memory leak。程序员对自己的程序需要有忧患意识，这样才会越来越成熟，而自己的能力也会越来越强。

 

思考和放松: 做事前多想一想，这样做事的时候就不会不顾此失彼，手忙脚乱，一旦事情一乱，你的心情也会更乱，于是，事情也就会更乱。最后，你只得重写，这种事情太多了。而且，在工作中要学会享受，要学会放松心情，我并不是让你工作的时候聊QQ，我只是说，有时候，心态过于紧张，压力过大，你的工作成果反而更不好，从而又反过来造成新一轮的焦虑和紧张。我个人认为，思考和放松是可以完美统一的，思考其实就是一种放松，停下来，休息一下，回头看看走过的路，喝口水，登个高，看看过去走的对不对？总体是个什么样？总结一下，然后看看前路怎么样好走，这会你才会越走越好，越走越快。好的程序员都不是那种埋头苦干的人，好的程序员总是那些善于总结成败得失，善于思考，善于调整，善于放松的人（参看《优秀程序员的十个习惯》）。不然，我能看到的情形是，你很快地把事干完，回到家刚坐下来，老板或是客户就打电话来告诉你你的程序出问题了。总之，深思熟虑，动作会很慢，但是你可以保证你工作成果的质量，反而能让你更多的节约时间。

 

学习历史，跟上时代: 如果你是从十年前开始编程的，那么，今天的这门语言或是技术会有很多很多的改进和改善。你以前开发一个功能或函数，今天早已被集成时了语言中，而且做得比你的版本要好得多。以前你需要100行代码完成的事情，今天只需要1行代码。这样的事情在未来还会发生，所以，今天的你一定要学会如何跟上时代。但是，你也不要放弃历史，我现在看到很多程序员对一些现代的语言和技术使用的非常好，他们可以很容易地跟上时代。但不要忘了，计算机世界的技术更新和技术淘汰也是非常猛的。所以，你一定要学习历史，这些历史不是产商的历史，而是整个计算机文化的历史（参见《Unix传奇》）。只有通过历史，你才能明白历史上出现的问题，新技术出来的原因，这样才能够对今天的这些新的技术更了解，也才能明白明天的方向在哪里。学习历史和跟上时代都是相当重要的。使用新型的技术，停下来接受培训，可以让你工作得更快，更高效（参看《未来五年程序员需要掌握的10项技能》）。而学习和总结历史，才会让你在纷乱的世界中找到方向。

 

积极推动测试活动: 只有测试才能证明软件可以正常工作，只有测试才能保证软件的质量。无论什么产品，都需要经过或多或少的测试。测试地充分的产品或模块，你会发现其质量总是那么好，测试的不充的产品，质量总是那么次。德系汽车，日系汽车质量怎么样，关键还是在于怎么去测试的，测试的是否充分。所以，在你开发软件的过程中，如果你说你的程序写地好，质量高，那么请你拿出实实在在的测试报告。在整个软件开发过程中，做为一个好的程序员，你应该积极地在各个环节推动项目组进行测试活动。不要以为技术需求阶段和设计阶段不需要测试，一样的，只要你要release什么，release的这个东西都需要进行测试。技术需求怎么做测试？用户案例就是测试案例。在软件开发的整个过程中，保证产品质量有时候比实现需求更重要，尤其是那些非常重要甚至人命关天的产品。

上面这些五个观点都是可能让你在不完美的工作环境中可以工作得更好，更快，更高效，希望能够对你有用。另外，也欢迎你留下你的观点！
注：本文转自http://coolshell.cn/?p=2606
]]></description>
			<content:encoded><![CDATA[<p>对我来说，一个好的程序员应该是努力去追求尽可能无错的高质量的符合需求的代码实现。 一些人也许认为好的程序员是那些懂得多门编程语言，懂得很牛技术的程序员，是的，这在某些情况下是对的。但归根到底，无论你用什么样的技术，什么样的语言，所有的程序被写出来，其功能都要符合需求以及尽可能地健壮无错和高质量。  我们可以想像一下，如果一个能力普通的程序员有足够多的时间来做测试，那么，其也可以保证他的代码的质量。所以，有一种观点这样认为——要达到质量高的代码只需要有足够多的时间来做测试。这对于以结果为导向的商业软件开发中是可以理解的（我们可以看到那些制汽车的产商在汽车测试上花费的精力和时间就可以明白这一道理）。</p>
<p>但是，很明显，所有的已经开发出来项目都是在不完美的条件下开发出来的，一般来说，几乎所有的项目都是在最大化程序员软件的开发速度。而且，很多情况下，我们似乎对深度测试和压力测试并不是很关心，所以，我们总是在祈祷并期望那些赶工出来的代码可以正常工作，尤其是在上线的时候，这种唯心主义的价值观更为强烈。  其实，开发速度和软件产品质量并不矛盾。<strong>好的程序员并一定是技术强的程序员，而是那些可以在不完美的工作环境下保证软件质量和工作效率的程序员</strong>。下面是是五个程序员可以在这种不完美的情况下做得更好的观点（它们都和语言和技术没什么关系，只不过是一种你的工作行为，能够和所有的行业相通），这五个观点也许可以让你成为这样的好程序员。</p>
<p><strong> </strong></p>
<ul>
<li><strong>寻找不同观点：</strong>程序员好像并不喜欢技术上有异见的人，他们特别喜欢争论各自的技术观点。但是，他们忽略了不同观点的价值。任何事情都有好有坏，我们应该学会在不同观点中学习和平衡。这样才会更多的了解编程和技术。要经常在做事之前问自己和别人，这么做对不对？做完事后问自己，还可不可以改进？努力去寻找别的不同的观点或方法。程序员应该经常上网，经常和同事讨论不同的实现方法，不同的技术观点，这样才能取长补短。然而，在实际工作中，我发现程序员们并不喜欢互相请教，因为请教的人怕别人看不起他，而被请教的人总是先贬低对方的能力，哎……（参看《<a rel="bookmark" href="http://coolshell.cn/?p=1081">十个让你变成糟糕的程序员的行为</a>》），如果有这样的文化氛围的话，那也没有关系。上网吧，网上的人谁也不认识谁，可以尽情地问一些愚蠢的问题。呵呵。总之，一定要明白，如果某些事情只有一个观点，那么你一定要怀疑一下了，没有观点和技术方案的比较，没有百花齐放的情况，你就无法知道是否还有更好的东西。真正的和谐不是只有一种声音，真正的和谐而是在不同的观点声音下取长补短，百家争鸣（参看《<a rel="bookmark" href="http://coolshell.cn/?p=2424" target="_blank">十条不错的编程观点</a>》）。否则，你永远都不会接受到新的观点，也就无法进步和成长了。</li>
</ul>
<p><strong> </strong></p>
<ul>
<li><strong>千万别信自己的代码</strong>: 在任何时候，一定要高度怀疑自己的代码。很多时候，错误总是自己造成的。所以，当出现问题的时候，要学会review代码中所有的可疑点，千万别觉得某段代码很简单，可以略过。事实证明，很多疏忽大意都是在阴沟里翻的船，都是那些很低级的错误。在查错的过程中，切忌过早下结论，切忌四处乱改（参看《<a rel="bookmark" href="http://coolshell.cn/?p=2058" target="_blank">各种流行的编程风格</a>》），停下来，想一想，会是哪儿的代码有重大嫌疑，然后查看一下代码，捋一捋程序的逻辑（参看《<a rel="bookmark" href="http://coolshell.cn/?p=1719">橡皮鸭程序调试法</a>》），调试并验证一下程序的逻辑和变量在运行时是否是正确的。很多时候，对于那些难缠的问题，最后解决了总是因为我们开始认真回头审视所有的代码。只有对自己的代码保持着高度的怀疑，这样我们才会想着如何让其运行得更好更稳定，也会让我们在单元测试中下更多的功夫，这样才能更能在那忙碌的环境中节省时间。相信我，在集成测试中fix bug的成本要比在单元测试Fix bug的成本大得多的多。一个简单的例子就是memory leak。程序员对自己的程序需要有忧患意识，这样才会越来越成熟，而自己的能力也会越来越强。</li>
</ul>
<p><strong> </strong></p>
<ul>
<li><strong>思考和放松</strong>: 做事前多想一想，这样做事的时候就不会不顾此失彼，手忙脚乱，一旦事情一乱，你的心情也会更乱，于是，事情也就会更乱。最后，你只得重写，这种事情太多了。而且，在工作中要学会享受，要学会放松心情，我并不是让你工作的时候聊QQ，我只是说，有时候，心态过于紧张，压力过大，你的工作成果反而更不好，从而又反过来造成新一轮的焦虑和紧张。我个人认为，<strong>思考和放松是可以完美统一的</strong>，思考其实就是一种放松，停下来，休息一下，回头看看走过的路，喝口水，登个高，看看过去走的对不对？总体是个什么样？总结一下，然后看看前路怎么样好走，这会你才会越走越好，越走越快。好的程序员都不是那种埋头苦干的人，好的程序员总是那些善于总结成败得失，善于思考，善于调整，善于放松的人（参看《<a href="http://coolshell.cn/?p=222" target="_blank">优秀程序员的十个习惯</a>》）。不然，我能看到的情形是，你很快地把事干完，回到家刚坐下来，老板或是客户就打电话来告诉你你的程序出问题了。总之，深思熟虑，动作会很慢，但是你可以保证你工作成果的质量，反而能让你更多的节约时间。</li>
</ul>
<p><strong> </strong></p>
<ul>
<li><strong>学习历史，跟上时代</strong>: 如果你是从十年前开始编程的，那么，今天的这门语言或是技术会有很多很多的改进和改善。你以前开发一个功能或函数，今天早已被集成时了语言中，而且做得比你的版本要好得多。以前你需要100行代码完成的事情，今天只需要1行代码。这样的事情在未来还会发生，所以，今天的你一定要学会如何跟上时代。但是，你也不要放弃历史，我现在看到很多程序员对一些现代的语言和技术使用的非常好，他们可以很容易地跟上时代。但不要忘了，计算机世界的技术更新和技术淘汰也是非常猛的。所以，你一定要学习历史，这些历史不是产商的历史，而是整个计算机文化的历史（参见《<a rel="bookmark" href="http://coolshell.cn/?p=2322" target="_blank">Unix传奇</a>》）。只有通过历史，你才能明白历史上出现的问题，新技术出来的原因，这样才能够对今天的这些新的技术更了解，也才能明白明天的方向在哪里。学习历史和跟上时代都是相当重要的。使用新型的技术，停下来接受培训，可以让你工作得更快，更高效（参看《<a rel="bookmark" href="http://coolshell.cn/?p=511" target="_blank">未来五年程序员需要掌握的10项技能</a>》）。而学习和总结历史，才会让你在纷乱的世界中找到方向。</li>
</ul>
<p><strong> </strong></p>
<ul>
<li><strong>积极推动测试活动</strong>: 只有测试才能证明软件可以正常工作，只有测试才能保证软件的质量。无论什么产品，都需要经过或多或少的测试。测试地充分的产品或模块，你会发现其质量总是那么好，测试的不充的产品，质量总是那么次。德系汽车，日系汽车质量怎么样，关键还是在于怎么去测试的，测试的是否充分。所以，在你开发软件的过程中，如果你说你的程序写地好，质量高，那么请你拿出实实在在的测试报告。在整个软件开发过程中，做为一个好的程序员，你应该积极地在各个环节推动项目组进行测试活动。不要以为技术需求阶段和设计阶段不需要测试，一样的，只要你要release什么，release的这个东西都需要进行测试。技术需求怎么做测试？用户案例就是测试案例。在软件开发的整个过程中，保证产品质量有时候比实现需求更重要，尤其是那些非常重要甚至人命关天的产品。</li>
</ul>
<p>上面这些五个观点都是可能让你在不完美的工作环境中可以工作得更好，更快，更高效，希望能够对你有用。另外，也欢迎你留下你的观点！</p>
<p><span style="color: #ff0000;">注：本文转自</span><a href="http://coolshell.cn/?p=2606"><span style="color: #ff0000;">http://coolshell.cn/?p=2606</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/07/%e4%ba%94%e4%b8%aa%e6%96%b9%e6%b3%95%e6%88%90%e4%b8%ba%e6%9b%b4%e5%a5%bd%e7%9a%84%e7%a8%8b%e5%ba%8f%e5%91%98.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如果避免产生赋值语句</title>
		<link>http://drinkjava.net/2010/07/%e5%a6%82%e6%9e%9c%e9%81%bf%e5%85%8d%e4%ba%a7%e7%94%9f%e8%b5%8b%e5%80%bc%e8%af%ad%e5%8f%a5.html</link>
		<comments>http://drinkjava.net/2010/07/%e5%a6%82%e6%9e%9c%e9%81%bf%e5%85%8d%e4%ba%a7%e7%94%9f%e8%b5%8b%e5%80%bc%e8%af%ad%e5%8f%a5.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 10:53:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net相关]]></category>
		<category><![CDATA[Java相关]]></category>
		<category><![CDATA[Linux相关]]></category>
		<category><![CDATA[web前端技术]]></category>
		<category><![CDATA[开发相关]]></category>
		<category><![CDATA[数据库相关]]></category>
		<category><![CDATA[赋值语句]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=109</guid>
		<description><![CDATA[我在之前的文章里谈论过赋值语句的危害性。 使用赋值语句会使程序变的冗长，更难理解。但事实上，赋值语句对编程来说是一种基本语句，想限制它的使用几乎是不可能的。幸运的是，我们实际上是能做到的，下面我就会向你展示如何去做。
用正确的方式初始化
// 错误       &#124;  // 正确
int x;        &#124;
// ...        &#124;  // ...
x = init();   &#124;  int x = init();

“正确”方式的主要优点是你能很方便的浏览x的定义的同时知道它的值。这样也能保证x始终处在一个固定变量状态，大多数的编译器都能检测到这种状态。其次，这样可以使代码减少冗余。
“错误”方式之所以存在完全是因为很多老式的编程语言都强制要求在程序的开始处先声明变量。这样编译器好处理。但现在这已经不是问题了，即使在C语言里。
构造新数据
// 错误          &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>我在之前的文章里谈论过<a href="http://www.loup-vaillant.fr/articles/assignment">赋值语句的危害性</a>。 使用赋值语句会使程序变的冗长，更难理解。但事实上，赋值语句对编程来说是一种基本语句，想限制它的使用几乎是不可能的。幸运的是，我们实际上是能做到的，下面我就会向你展示如何去做。</p>
<h2>用正确的方式初始化</h2>
<pre><code>// 错误       |  // 正确
int x;        |
// ...        |  // ...
x = init();   |  int x = init();
</code></pre>
<p>“正确”方式的主要优点是你能很方便的浏览<code>x</code>的定义的同时知道它的值。这样也能保证<code>x</code>始终处在一个固定变量状态，大多数的编译器都能检测到这种状态。其次，这样可以使代码减少冗余。</p>
<p>“错误”方式之所以存在完全是因为很多老式的编程语言都强制要求在程序的开始处先声明变量。这样编译器好处理。但现在这已经不是问题了，即使在C语言里。</p>
<h2>构造新数据</h2>
<pre><code>// 错误          |  // 正确
int x = init();  |  int x = init();
// ...           |  // ...
x = something(); |  int y = something();
</code></pre>
<p>这样做很重要。它能保证变量被定义后不会被改变。不留任何机会。<code>x</code>的值我们可以保证它是通过<code>init()</code>初始化的值。</p>
<p>人们使用“错误”方式一般有两个原因：高效和简洁。效率并不是个问题，现代编译器能够通过给变量重新分配地址来优化性能。而由于简洁而导致的语义模糊是得不偿失的。</p>
<h2>用函数，不要用过程</h2>
<pre><code>// 错误                  |  // 正确
void to_utf8(string s);  |  string to_utf8(string s);
                         |
// ...                   |  // ...
                         |
string s1 = latin();     |  use_string(to_utf8(latin()))
to_utf8(s1);             |
use_string(s1);          |
</code></pre>
<p>“正确”方式使用的是一个普通的数字函数：它接受输入值，返回计算后的值。另一边，“错误”方式使用了<em>过程</em>。跟函数不一样，过程不仅会影响返回的结果，还能影响其它数据，例如，过程中可以修改它的参数值。这会使这些参数很容易被污染。</p>
<p>所以，当能够使用函数的时候，尽量不要使用过程。你的程序这样会变得更简单。这种技巧可以让你避免去思考如何<em>去做</em>(变换一个字符串)，而是如何<em>被做</em>(一个变换了的字符串)。要着眼于最终结果，而不是处理过程。</p>
<p>“错误”方式之所以存在完全是由于许多老的编程语言很难处理复杂的返回值。你只能返回单个数字。所以，当需要一个内容更丰富的返回值时，你只能在过 程中达到这个目的。而真正的返回值通常是一些简单的错误标号代码。然而现在不同了，返回复杂的结果已经不再是个问题。即使是在C语言里你也可以返回复杂的 结果。</p>
<h2>固化你的对象</h2>
<p>在很多的入门级的介绍面向对象编程的课程中，你能看到这样一个著名的二维坐标的例子：</p>
<pre><code>// 非常非常错误
class Point
{
public:
  // constructor
  Point() { x = 0; y = 0; }

  float get_x() { return x; }
  float get_y() { return y; }

  void set_x(float new_x) { x = new_x; }
  void set_y(float new_y) { y = new_y; }

  move(Point p) {
    x = x + p.x;
    y = y + p.y;
  }
private:
  float x; float y;
};
</code></pre>
<p>这样设计的原因很简单：你可以通过构造函数创建一个新的坐标，然后通过<code>set_x()</code> 和 <code>set_y()</code>进行初始化。内部数据是经过封装的(<code>private</code>)，只能通过<code>get_x()</code> 和 <code>get_y()</code>来访问。还有个好处是，你可以通过<code>move()</code>方法来移动这个坐标点。</p>
<p>然而，从代码本身看，却是没必要的复杂化了，而且有几个主要的错误：</p>
<ul>
<li>构造函数直接把<code>x</code> 和 <code>y</code> 初始化成0了。如果你希望它是其它值，你还需要手工的设置。你不能<em>初始时做到这些</em>。</li>
<li>操作一个点的缺省方法就是修改它。这是一种赋值操作。你被限制了<em>创建一个新值</em>。</li>
<li><code>set_x()</code>, <code>set_y()</code>, 和 <code>move()</code> 方法现场修改这个对象。这些是<em>过程</em>, 不是<em>函数</em>。</li>
<li><code>x</code> (和 <code>y</code>) 是私有的，但你可以通过<code>get_x()</code> 和 <code>set_x()</code>操作它们。所以，你认为你是封装了它们，而实际上没有。</li>
<li><code>move()</code>这个方法不需要放在<code>Point</code>类里。放在类里使类的体积变大，影响理解和使用。</li>
</ul>
<p>正确的设计更简单，而且不失功能：</p>
<pre><code>// 正确的
class Point
{
public:
  // constructor
  Point (float x, float y) {
    _x = x; _y = y;
  }

  x() { return x; }
  y() { return y; }

private:
  float _x; float _y
}

Point move(Point p1, Point p2) {
  return Point(p1.x() + p2.x(),
               p1.y() + p2.y());
}
</code></pre>
<p>另外，如果你愿意，你可以把<code>_x</code> 和 <code>_y</code>声明成public和常量。</p>
<h2>使用纯功能性数据结构</h2>
<p>从上面的介绍里我们说明了应该<em>构建新数据</em>。这个建议即使是大数据结构也是有效的。意外吗，它并不是像你想象的那样失去作用。有时候你为了避免每次都拷贝整个数据结构，你可能要使用修改操作。而数组和hash table就是属于这种情况的。</p>
<p>这种情况下你应该是使用我们所谓的<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Purely_functional">纯功能性数据结构</a>。如果你想对这有所了解，<a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.64.3080&amp;rep=rep1&amp;type=pdf">Chris Okasaki’s thesis</a> (也是同名著作)是个好的教材。这里，我只给大家简单的讲讲linked list。</p>
<p>一个链接表要么是个空表，要么是其中有个单元格存着一个指向另一个表的指针。</p>
<pre><code>┌───┬───┐   ┌───┬───┐
│ x │  ───&gt; │ y │  ───&gt; empty
└───┴───┘   └───┴───┘
</code></pre>
<p>这样的数据结构如果在ML语言里是很好设计出来的，但在以类为基础的语言里会稍微有点复杂：</p>
<pre><code>-- Haskell
-- A list is either the Empty list,
-- or it contains an Int and a List
data List = Empty
          | NotEmpty Int List

-- utility functions

is_empty Empty         = true
is_empty NotEmpty x xs = false

head Empty         = error
head NotEmpty x xs = x

tail Empty         = error
tail notEmpty x xs = xs
</code></pre>
<pre><code>// Java(ish)
class List
{
public:
  // constructors
  List() { _is_empty = true; }
  List(int i, List next) {
    _i        = i;
    _next     = next;
    _is_empty = false;
  }

  bool is_empty() { return _is_empty; }

  int head() {
    if (_is_empty) error();
    return _i;
  }

  List tail() {
     if (_is_empty) error();
     return _next;
  }

private:
  int  _i;
  List _next;
  bool _is_empty;
}
</code></pre>
<p>你可以看到，现在这个List类是不可变的。我们不能修改<code>List</code>对象。我们只能在现有的对象外新建新的List。 <em>这很容易</em>。因为当你构建一个新List时，它会共享现有的大多数的单元。假设我们有个list <code>l</code>，和一个整数<code>i</code>：</p>
<pre><code>    ┌───┬───┐   ┌───┬───┐
l = │ x │  ───&gt; │ y │  ───&gt; empty
    └───┴───┘   └───┴───┘

i = 42
</code></pre>
<p>此时，在l的顶部加入<code>i</code>，这样就会产生一个新的list <code>l2</code>：</p>
<pre><code>     ┌───┬───┐
l2 = │ i │   │
     └───┴─│─┘
           │
           │   ┌───┬───┐   ┌───┬───┐
l  =       └──&gt;│ x │  ───&gt; │ y │  ───&gt; empty
               └───┴───┘   └───┴───┘
</code></pre>
<p>或者，在代码里：</p>
<pre><code>List l  = List(x, List(y, List()));
int  i  = 42;

List l2 = List(i, l); // cheap
</code></pre>
<p><code>l</code> 仍然存在，不可变，而新建的<code>l2</code>只是多了一个新建的单元。类似的，删除顶部的元素也是不费任何资源的容易。</p>
<h2>当我们不能这样做时</h2>
<p>有时，你不能避免赋值操作，或者受其它因素限制。也许是你需要更高的效率，你必须修改数据状态来优化程序。或者由于一些外界因素影响，比如一个用户。或者由于你使用的语言不能<a href="http://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29">自动处理内存使用</a>，这些都会阻止你使用<em>纯功能性的数据结构</em>。</p>
<p>这种情况下你所能做的最好的方式是隔离那些程序中不合规范的代码(那些使用赋值语句的代码)。比如说，你想给一个数组排序，你必须用quicksort。Quicksort严重的依赖于变换转移操作，但是你可以隐藏这些操作：</p>
<pre><code>array pure_sort (array a)
{
  array a2 = copy(a);
  quicksort(a2); // modify a2, nothing else
  return a2;
}
</code></pre>
<p>于是，当<code>pure_sort()</code>这个内部函数不能按照我的建议的去写时，影响并不大，因为它被限制在函数内了。最终，<code>pure_sort()的</code> 行为就像是个普通的<em>函数</em>了。</p>
<p>相反的，当你与其它业务有交互时，要小心的将交互部分的代码和运算部分的代码分隔开。比如你要写段在屏幕上画个点的程序，而且能根据鼠标的移动而移动。写出来可能会是这样：</p>
<pre><code>// 错误

Point p(0, 0);
wile(true) // loop forever
{
  p = move(p, get_mouse_movement());

  if (p.x() &lt; 0   ) p = Point(0    , p.y());
  if (p.x() &gt; 1024) p = Point(1024 , p.y());
  if (p.y() &lt; 0   ) p = Point(p.x(), 0    );
  if (p.y() &gt; 768 ) p = Point(p.x(), 768  );

  draw(p);
}
</code></pre>
<p>这里有个错误，它在主程序里对越界坐标进行了检查。更好的方式是这样：</p>
<pre><code>// 正确

point smart_move(point p, point mouse_movement)
{
  float x = p.x() &lt; 0    ? 0
          : p.x() &gt; 1024 ? 1024
          :                p.x();

  float y = p.y() &lt; 0   ? 0
          : p.y() &gt; 768 ? 768
          :               p.y();

  return Point(x, y);
}

// 主程序
Point p(0, 0);
wile(true) // loop forever
{
  p = smart_move(p, get_mouse_movement());
  draw(p);
}
</code></pre>
<p>现在，主程序变得更简单了。运算部分，<code>smart_move()</code>，可以进行单独测试，甚至可以在其它地方重用。 现在，如果你不喜欢这样的三元操作的语法，不想按我介绍的规则，不去<em>构造新数据</em>：</p>
<pre><code>// 这样也不是很差

point smart_move(point p, point mouse_movement)
{
  float x = p.x();
  float y = p.y();

  if (x &lt; 0   ) x = 0;
  if (x &gt; 1024) x = 1024;
  if (y &lt; 0   ) y = 0;
  if (y &gt; 768 ) y = 768;

  return Point(x, y);
}
</code></pre>
<p>不管你怎么写，<code>smart_move()</code>始终应该是个<em>函数</em>。</p>
<h2>结论</h2>
<p>我说的这些都是关于降低耦合的技巧。每个程序都应该有很清晰的内部边界。每个模块应暴露最少量的接口。这能使程序更易于理解和使用。避免使用赋值语句，坚持对象恒定的原则能使接口清晰明确。但这也不是银弹，这只是辅助手段。很有用的辅助手段。</p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/07/%e5%a6%82%e6%9e%9c%e9%81%bf%e5%85%8d%e4%ba%a7%e7%94%9f%e8%b5%8b%e5%80%bc%e8%af%ad%e5%8f%a5.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu 10.04源 更新源列表</title>
		<link>http://drinkjava.net/2010/07/ubuntu-10-04%e6%ba%90-%e6%9b%b4%e6%96%b0%e6%ba%90%e5%88%97%e8%a1%a8.html</link>
		<comments>http://drinkjava.net/2010/07/ubuntu-10-04%e6%ba%90-%e6%9b%b4%e6%96%b0%e6%ba%90%e5%88%97%e8%a1%a8.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 02:54:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Linux相关]]></category>
		<category><![CDATA[行业动态]]></category>
		<category><![CDATA[ubuntu10.04 源]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=106</guid>
		<description><![CDATA[
Ubuntu  10.04 已经发布了
1.sudo gedit   /etc/apt/sources.list
编辑你的源列表，将原来的内容全部删除，添加下面列表中最适合你的源（注意不要全部添加），选择一个最合适你的即可，复制到你的列表中，然后保存列表。
2.sudo apt-get update   更新源列表信息
可以在运行“sudo   apt-get update ”时查看一下错误信息，把不能连接的源删除再重新运行“sudo apt-get  update ”。
3.sudo apt-get upgrade  升  级
或者用ubuntu自带的更新管理器升级也可
Ubuntu 10.04源列表：
台湾
代码:
deb http://tw.archive.ubuntu.com/ubuntu/ lucid main universe  restricted multiverse
deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid main universe  restricted multiverse
deb http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe  main multiverse restricted
deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe  main [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>Ubuntu  10.04 已经发布了<br />
1.sudo gedit   /etc/apt/sources.list<br />
编辑你的源列表，将原来的内容全部删除，添加下面列表中最适合你的源（注意不要全部添加），选择一个最合适你的即可，复制到你的列表中，然后保存列表。<br />
2.sudo apt-get update   更新源列表信息<br />
可以在运行“sudo   apt-get update ”时查看一下错误信息，把不能连接的源删除再重新运行“sudo apt-get  update ”。<br />
3.sudo apt-get upgrade  升  级<br />
或者用ubuntu自带的更新管理器升级也可<br />
Ubuntu 10.04源列表：<br />
台湾<br />
代码:</p>
<p>deb http://tw.archive.ubuntu.com/ubuntu/ lucid main universe  restricted multiverse<br />
deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe  main multiverse restricted<br />
deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-security universe  main multiverse restricted<br />
deb http://tw.archive.ubuntu.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb-src http://tw.archive.ubuntu.com/ubuntu/ lucid-updates universe  main multiverse restricted</p>
<p>SRT Sources<br />
代码:</p>
<p>deb http://ubuntu.srt.cn/ubuntu/ lucid main restricted universe  multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-security main restricted  universe multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-updates main restricted  universe multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-proposed main restricted  universe multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-backports main restricted  universe multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid main restricted universe  multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-security main restricted  universe multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-updates main restricted  universe multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-proposed main restricted  universe multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-backports main restricted  universe multiverse</p>
<p>网易（速度很快）<br />
代码:</p>
<p>deb http://mirrors.163.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirrors.163.com/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://mirrors.163.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>ubuntu官方上海源，提供 Kernel，Hiweed，ubuntu<br />
代码:</p>
<p>deb http://mirror.rootguide.org/ubuntu/ lucid main universe  restricted multiverse<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-security universe  main multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-proposed universe  main multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-backports universe  main multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-backports universe  main multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-updates universe  main multiverse restricted</p>
<p>搜狐<br />
代码:</p>
<p>deb http://mirrors.shlug.org/ubuntu/ lucid main universe  restricted multiverse<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-security universe  main multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-proposed universe  main multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-backports universe  main multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>骨头源，骨头源是bones7456架设的一个Ubuntu源 ，提供ubuntu,deepin<br />
代码:<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-security universe main multiverse  restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-updates universe main multiverse  restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-proposed universe main multiverse  restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>lupaworld 源，提供  ArchLinux，Everest，FreeBSD，Fedora，LFS，Magiclinux，Mandriva，OpenOffice，openSUSE，Puppy，Red  Hat，Slitaz，Turbolinux，Ubuntu，中标普华<br />
deb http://mirror.lupaworld.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirror.lupaworld.com/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://mirror.lupaworld.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirror.lupaworld.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirror.lupaworld.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirror.lupaworld.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirror.lupaworld.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirror.lupaworld.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirror.lupaworld.com/ubuntu/ lucid-backports universe  main multiverse restricted<br />
deb-src http://mirror.lupaworld.com/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>rootguide源，ubuntu官方上海源，提供 Kernel，Hiweed，ubuntu<br />
deb http://mirror.rootguide.org/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid main universe  restricted multiverse<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirror.rootguide.org/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-backports universe  main multiverse restricted<br />
deb-src http://mirror.rootguide.org/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>网易开源镜像站,提供 FreeBSD，OpenBSD，archlinux，centos，cygwin，debian，fedora，gentoo，kernel，openSUSE，slackware，ubuntu<br />
deb http://mirrors.163.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirrors.163.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://mirrors.163.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirrors.163.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.163.com/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>搜狐开源镜像站，提供  CPAN，FreeBSD，NetBSD，OpenBSD，apache，archlinux，centos，cygwin，dag，debian，fedora，gentoo，kernel，lfs，mysql，nginx，openSUSE，php，rpmfusion，slackware，ubuntu<br />
deb http://mirrors.shlug.org/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirrors.shlug.org/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.shlug.org/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>搜狐开源镜像站，提供  CPAN，FreeBSD，NetBSD，OpenBSD，apache，archlinux，centos，cygwin，dag，debian，fedora，gentoo，kernel，lfs，mysql，nginx，openSUSE，php，rpmfusion，slackware，ubuntu<br />
deb http://mirrors.sohu.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://mirrors.sohu.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://mirrors.sohu.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://mirrors.sohu.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://mirrors.sohu.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://mirrors.sohu.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://mirrors.sohu.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://mirrors.sohu.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.sohu.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://mirrors.sohu.com/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>网易开源镜像站,提供 FreeBSD，OpenBSD，archlinux，centos，cygwin，debian，fedora，gentoo，kernel，openSUSE，slackware，ubuntu<br />
deb http://ubuntu.cn99.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://ubuntu.cn99.com/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://ubuntu.cn99.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb-src http://ubuntu.cn99.com/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://ubuntu.cn99.com/ubuntu/ lucid-updates universe main  multiverse restricted<br />
deb http://ubuntu.cn99.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb-src http://ubuntu.cn99.com/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://ubuntu.cn99.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.cn99.com/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.cn99.com/ubuntu/ lucid-updates universe main  multiverse restricted</p>
<p>骨头源，提供ubuntu,deepin<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid main universe restricted  multiverse<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid main universe restricted  multiverse<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-security universe main multiverse  restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-security universe main  multiverse restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-updates universe main multiverse  restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-proposed universe main multiverse  restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-proposed universe main  multiverse restricted<br />
deb http://ubuntu.srt.cn/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-backports universe main  multiverse restricted<br />
deb-src http://ubuntu.srt.cn/ubuntu/ lucid-updates universe main  multiverse restricted</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/07/ubuntu-10-04%e6%ba%90-%e6%9b%b4%e6%96%b0%e6%ba%90%e5%88%97%e8%a1%a8.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Studio 2010 网剧第二集</title>
		<link>http://drinkjava.net/2010/04/visual-studio-2010-%e7%bd%91%e5%89%a7%e7%ac%ac%e4%ba%8c%e9%9b%86.html</link>
		<comments>http://drinkjava.net/2010/04/visual-studio-2010-%e7%bd%91%e5%89%a7%e7%ac%ac%e4%ba%8c%e9%9b%86.html#comments</comments>
		<pubDate>Wed, 14 Apr 2010 05:14:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[行业动态]]></category>
		<category><![CDATA[vs2010]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=102</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="618" height="435" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://player.ku6.com/refer/8Bf2fTOqBcgn9GXP/v.swf" /><embed type="application/x-shockwave-flash" width="618" height="435" src="http://player.ku6.com/refer/8Bf2fTOqBcgn9GXP/v.swf"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/04/visual-studio-2010-%e7%bd%91%e5%89%a7%e7%ac%ac%e4%ba%8c%e9%9b%86.html/feed</wfw:commentRss>
		<slash:comments>439</slash:comments>
		</item>
		<item>
		<title>解决 ASP.NET URL重写之后使用URL传中文参数出现乱码</title>
		<link>http://drinkjava.net/2010/04/%e8%a7%a3%e5%86%b3-asp-net-url%e9%87%8d%e5%86%99%e4%b9%8b%e5%90%8e%e4%bd%bf%e7%94%a8url%e4%bc%a0%e4%b8%ad%e6%96%87%e5%8f%82%e6%95%b0%e5%87%ba%e7%8e%b0%e4%b9%b1%e7%a0%81.html</link>
		<comments>http://drinkjava.net/2010/04/%e8%a7%a3%e5%86%b3-asp-net-url%e9%87%8d%e5%86%99%e4%b9%8b%e5%90%8e%e4%bd%bf%e7%94%a8url%e4%bc%a0%e4%b8%ad%e6%96%87%e5%8f%82%e6%95%b0%e5%87%ba%e7%8e%b0%e4%b9%b1%e7%a0%81.html#comments</comments>
		<pubDate>Fri, 09 Apr 2010 04:02:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[.Net相关]]></category>
		<category><![CDATA[web前端技术]]></category>
		<category><![CDATA[开发相关]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[URL]]></category>
		<category><![CDATA[中文参数]]></category>
		<category><![CDATA[乱码]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=95</guid>
		<description><![CDATA[这个问题是很早做项目的时候遇到的，今天同事也遇到这个问题，问到我，只记得大概，忘记具体怎么写了，费了好大力气才在以前杂乱的代码中找到了解决方法。
主要就是先编码 在根据编码后的url来考虑重写规则的配置 最后在获得时再解码
js端用escape(url)和unescape(url)
后台用server.urlencode(url)和server.urldecode(url)
 
js前台： var url = &#8220;../AjaxPages/AllAnnualRest.aspx?rid=&#8221; + Math.random() +&#8221;&#38;User=&#8221; + escape(user);
后台：     string User = Server.UrlDecode(Request.QueryString["User"]);
乱码问题解决
]]></description>
			<content:encoded><![CDATA[<p>这个问题是很早做项目的时候遇到的，今天同事也遇到这个问题，问到我，只记得大概，忘记具体怎么写了，费了好大力气才在以前杂乱的代码中找到了解决方法。</p>
<p>主要就是先编码 在根据编码后的url来考虑重写规则的配置 最后在获得时再解码</p>
<p>js端用escape(url)和unescape(url)<br />
后台用server.urlencode(url)和server.urldecode(url)<br />
 <br />
js前台： var url = &#8220;../AjaxPages/AllAnnualRest.aspx?rid=&#8221; + Math.random() +&#8221;&amp;User=&#8221; + escape(user);<br />
后台：     string User = Server.UrlDecode(Request.QueryString["User"]);</p>
<p>乱码问题解决</p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/04/%e8%a7%a3%e5%86%b3-asp-net-url%e9%87%8d%e5%86%99%e4%b9%8b%e5%90%8e%e4%bd%bf%e7%94%a8url%e4%bc%a0%e4%b8%ad%e6%96%87%e5%8f%82%e6%95%b0%e5%87%ba%e7%8e%b0%e4%b9%b1%e7%a0%81.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery中的事件</title>
		<link>http://drinkjava.net/2010/04/jquery%e4%b8%ad%e7%9a%84%e4%ba%8b%e4%bb%b6.html</link>
		<comments>http://drinkjava.net/2010/04/jquery%e4%b8%ad%e7%9a%84%e4%ba%8b%e4%bb%b6.html#comments</comments>
		<pubDate>Thu, 08 Apr 2010 02:51:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[心情日记]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[web前端技术]]></category>
		<category><![CDATA[事件]]></category>

		<guid isPermaLink="false">http://drinkjava.net/2010/04/jquery%e4%b8%ad%e7%9a%84%e4%ba%8b%e4%bb%b6.html</guid>
		<description><![CDATA[一、事件 
1 加载DOM 
$(document).ready(function(){//&#8230;})
    DOM加载完毕后执行，在可重复使用上区别于window.onload=function(){//&#8230;}
$(window).load(function(){//&#8230;})
    window内所有对象加载完毕后执行，几等同window.onload=function(){//&#8230;}。也可针对selector使用此方法
另：$(document).ready(function(){//&#8230;})的简写方式：$(function(){//&#8230;}) 或$().ready(function(){//&#8230;})
2 事件绑定 
$(&#8220;selector&#8221;).bind()
    为元素绑定事件，格式：bind(type[,data],fn)，可多次调用
    type事件类型包括：blur, focus, load, resize, scroll, unload, click, dbclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error或者自定义事件
    简写方法：$(&#8220;selector&#8221;).bind(type,function(){//&#8230;})等价于$(&#8220;selector&#8221;).type(function(){//&#8230;})
    可传递data参数以供unbind特定事件之用
$(&#8220;selector&#8221;).is()
    [...]]]></description>
			<content:encoded><![CDATA[<p>一、事件 </p>
<p>1 加载DOM </p>
<p>$(document).ready(function(){//&#8230;})<br />
    DOM加载完毕后执行，在可重复使用上区别于window.onload=function(){//&#8230;}<br />
$(window).load(function(){//&#8230;})<br />
    window内所有对象加载完毕后执行，几等同window.onload=function(){//&#8230;}。也可针对selector使用此方法</p>
<p>另：$(document).ready(function(){//&#8230;})的简写方式：$(function(){//&#8230;}) 或$().ready(function(){//&#8230;})</p>
<p>2 事件绑定 </p>
<p>$(&#8220;selector&#8221;).bind()<br />
    为元素绑定事件，格式：bind(type[,data],fn)，可多次调用<br />
    type事件类型包括：blur, focus, load, resize, scroll, unload, click, dbclick, mousedown, mouseup, mousemove, mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress, keyup, error或者自定义事件<br />
    简写方法：$(&#8220;selector&#8221;).bind(type,function(){//&#8230;})等价于$(&#8220;selector&#8221;).type(function(){//&#8230;})<br />
    可传递data参数以供unbind特定事件之用</p>
<p>$(&#8220;selector&#8221;).is()<br />
    判断方法</p>
<p>（外：方法多次重用可定义局部变量 var $x = $(&#8220;selector&#8221;).方法()）</p>
<p>3 合成事件 </p>
<p>$(&#8220;selector&#8221;).hover(enter,leave)<br />
    模拟光标悬停事件，鼠标进入时触发enter事件，鼠标移出时触发leave事件（代替的是bind(&#8220;mouseenter&#8221;)和 bind(&#8220;mouseleave&#8221;)）<br />
    使用方法：$(&#8220;selector&#8221;).hover(function(){//enter case&#8230;},function(){//leave case&#8230;})<br />
    （外：IE6不支持除a标签外css的:hover伪类的问题——可用此hover事件作为hack来解决）</p>
<p>$(&#8220;selector&#8221;).toggle(fn1,fn2,&#8230;,fnN)<br />
    模拟鼠标连续单击事件，按照单击顺序按次序循环执行事件<br />
    使用方法：$(&#8220;selector&#8221;).toggle(function(){//case1&#8230;},function() {//case2&#8230;},&#8230;,function(){//caseN})<br />
    特殊用法：切换元素可见状态，如元素隐藏，单击toggle触发元素可使之可见；元素可见，单击toggle触发元素使之隐藏<br />
P108例：</p>
<p><<br />
script<br />
></p>
<p>$(<br />
function<br />
(){<br />
$(<br />
&#8221;<br />
panel h5.head<br />
&#8221;<br />
).toggle(<br />
function<br />
(){<br />
$(<br />
this<br />
).next().toggle();<br />
},<br />
function<br />
(){<br />
$(<br />
this<br />
).next().toggle();<br />
})<br />
})</p>
<p></<br />
script<br />
></p>
<p>4 事件冒泡 </p>
<p>$(&#8220;selector&#8221;).bind(&#8220;type&#8221;,function(event){//event:事件对象&#8230;})<br />
    event事件对象：只有此函数内部才能访问到，事件处理函数执行完毕后，事件对象就被销毁</p>
<p>event.stopPropagation()<br />
    在函数最后用来停止事件冒泡<br />
P111例：</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8216;<br />
span<br />
&#8216;<br />
).bind(<br />
&#8221;<br />
click<br />
&#8221;<br />
,<br />
function<br />
(event){</p>
<p>var<br />
 txt<br />
=<br />
 $(<br />
&#8216;<br />
msg<br />
&#8216;<br />
).html()<br />
+</p>
<p>&#8221;</p>
<p>内层span元素被单击</p>
<p>&#8221;<br />
;<br />
$(<br />
&#8216;<br />
#msg<br />
&#8216;<br />
).html(txt);<br />
event.stopPropagation();<br />
})</p>
<p></<br />
script<br />
></p>
<p>event.preventDefault()<br />
    阻止元素默认行为<br />
例：验证表单（input为空阻止提交并提示）</p>
<p><<br />
script<br />
></p>
<p>$(<br />
function<br />
(){<br />
$(<br />
&#8221;<br />
#submit<br />
&#8221;<br />
).bind(<br />
&#8221;<br />
click<br />
&#8221;<br />
,<br />
function<br />
(event){</p>
<p>var<br />
 username<br />
=<br />
$(<br />
&#8221;<br />
#username<br />
&#8221;<br />
).val();</p>
<p>if<br />
(username<br />
==<br />
&#8220;&#8221;<br />
){<br />
$(<br />
&#8221;<br />
#msg<br />
&#8221;<br />
).html(<br />
&#8221;</p>
<p> 文本框的值不能为空</p>
<p>&#8221;<br />
);<br />
event.preventDefault();<br />
}<br />
});<br />
})</p>
<p></<br />
script<br />
></p>
<p>return false;<br />
    同时对对象事件停止冒泡和默认行为，等价于同时调用stopPrapagation()和preventDefault()</p>
<p>（外：事件捕获和事件冒泡是相反的过程，事件捕获是从DOM顶端往下开始触发，jQuery不支持，故本书从略）</p>
<p>5 事件对象的属性 </p>
<p>event.type<br />
    获取事件类型<br />
例：</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8221;<br />
a<br />
&#8221;<br />
).click(<br />
function<br />
(event){<br />
alert(event.type);</p>
<p>return</p>
<p>false<br />
;<br />
})</p>
<p></<br />
script<br />
></p>
<p>上面返回&#8221;click&#8221;</p>
<p>event.target<br />
    获取触发事件的元素<br />
例：</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8221;<br />
a[href=http://google.com]<br />
&#8221;<br />
).click(<br />
function<br />
(){<br />
alert(event.target.href);</p>
<p>return</p>
<p>false<br />
;<br />
})</p>
<p></<br />
script<br />
></p>
<p>上面返回&#8221;http://google.com&#8221;</p>
<p>event.relatedTarget<br />
    访问事件相关元素</p>
<p>event.pageX / event.pageY<br />
    获取光标相对于页面的x坐标和y坐标</p>
<p>event.which<br />
    在鼠标单击事件中获取鼠标的左、中、右键；在键盘事件中获取键盘的按键（返回值1=鼠标左键；2=鼠标中键；3=鼠标右键）</p>
<p>event.metaKey<br />
    键盘事件中获取<ctrl>按键</p>
<p>event.originalEvent<br />
    指向原始的事件对象</p>
<p>6 移除事件 </p>
<p>$(&#8220;selector&#8221;).unbind()<br />
    移除元素上的事件，格式：$(&#8220;selector&#8221;).unbind([type][,data]);（如果没有参数，则删除所有绑定的事件；如果提供了事件类型参数，则只删除该类型的绑定事件；如果把在绑定时传递的处理函数作为第二个参数，则只有这个特定的事件处理函数会被删除）<br />
例： </p>
<p><<br />
script<br />
></p>
<p>$(<br />
function<br />
(){<br />
$(<br />
&#8216;<br />
#btn<br />
&#8216;<br />
).bind(<br />
&#8221;<br />
click<br />
&#8221;<br />
,myFun1<br />
=<br />
function<br />
(){<br />
//<br />
先绑定</p>
<p>$(<br />
&#8216;<br />
#test<br />
&#8216;<br />
).append(<br />
&#8221;<br />
&#8230;<br />
&#8221;<br />
);<br />
});<br />
})</p>
<p></<br />
script<br />
></p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8216;<br />
#delOne<br />
&#8216;<br />
).click(<br />
function<br />
(){<br />
$(<br />
&#8216;<br />
#btn<br />
&#8216;<br />
).unbind(<br />
&#8221;<br />
click<br />
&#8221;<br />
,myFun1);<br />
//<br />
后删除</p>
<p>})</p>
<p></<br />
script<br />
></p>
<p>$(&#8220;selector&#8221;).one()<br />
    绑定一个触发一次即被删除的事件，格式：$(&#8220;selector&#8221;).one(type[,data],fn);</p>
<p>7 模拟操作 </p>
<p>$(&#8220;selector&#8221;).trigger(&#8220;type&#8221;);<br />
    模拟用户交互动作，简写方法：$(&#8220;#selector&#8221;).type(); 格式：$(&#8220;selector&#8221;).trigger(type[,data])<br />
例：用单击替代鼠标经过</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8221;<br />
selector<br />
&#8221;<br />
).mouseover(<br />
function<br />
{<br />
//<br />
&#8230;});</p>
<p>$(<br />
&#8221;<br />
selector2<br />
&#8221;<br />
).click(<br />
function<br />
(){<br />
$(<br />
&#8221;<br />
selector<br />
&#8221;<br />
).trigger(<br />
&#8221;<br />
mouseover<br />
&#8221;<br />
);<br />
//<br />
或者$(&#8220;selector&#8221;).mouseover()</p>
<p>})</p>
<p></<br />
script<br />
></p>
<p>自定义事件的例子</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8221;<br />
selector<br />
&#8221;<br />
).bind(<br />
&#8221;<br />
myClick<br />
&#8221;<br />
,<br />
function<br />
(){<br />
//<br />
&#8230;});    //绑定自定义事件</p>
<p>$(<br />
&#8221;<br />
selector<br />
&#8221;<br />
).trigger(<br />
&#8221;<br />
myClick<br />
&#8221;<br />
);<br />
//<br />
触发自定义事件</p>
<p></<br />
script<br />
></p>
<p>$(&#8220;selector&#8221;).trigger(type[,data])<br />
    可以数组形式传递参数给回调函数<br />
P119 例：</p>
<p><<br />
script<br />
></p>
<p>$(<br />
&#8221;<br />
#btn<br />
&#8221;<br />
).bind(<br />
&#8221;<br />
myClick<br />
&#8221;<br />
,<br />
function<br />
(event,message1,message2){<br />
$(<br />
&#8221;<br />
#test<br />
&#8221;<br />
).append(<br />
&#8221;</p>
<p>
&#8221;<br />
+<br />
message1<br />
+<br />
message2<br />
+<br />
&#8221;
</p>
<p>&#8221;<br />
);<br />
});<br />
$(<br />
&#8221;<br />
#btn<br />
&#8221;<br />
).trigger(<br />
&#8221;<br />
myClick<br />
&#8221;<br />
, [<br />
"<br />
我的自定义<br />
"<br />
,<br />
"<br />
事件<br />
"<br />
]);</p>
<p></<br />
script<br />
></p>
<p>8 其他用法 </p>
<p>$(&#8220;selector&#8221;).bind(&#8220;type1 type2&#8243;,function(){//&#8230;})<br />
    一次性绑定多个事件类型<br />
P119值得一看的例子</p>
<p><<br />
script<br />
></p>
<p>$(<br />
function<br />
(){<br />
$(<br />
&#8221;<br />
div<br />
&#8221;<br />
).bind(<br />
&#8221;<br />
mouseover mouseout<br />
&#8221;<br />
,<br />
function<br />
(){<br />
$(<br />
this<br />
).toggleClass(<br />
&#8221;<br />
over<br />
&#8221;<br />
);<br />
//<br />
切换class</p>
<p>});<br />
})</p>
<p></<br />
script<br />
></p>
<p>$(&#8220;selector&#8221;).bind(&#8220;type.命名空间&#8221;,function(){//&#8230;})<br />
    为多个事件添加事件命名空间，便于管理，删除命名空间后，命名空间下的事件同时删除，如：<br />
$(&#8220;div&#8221;).bind(&#8220;mouseover.plugin&#8221;,function(){//&#8230;})<br />
$(&#8220;div&#8221;).bind(&#8220;click.plugin&#8221;,function(){//&#8230;})<br />
$(&#8220;div&#8221;).unbind(&#8220;.plugin&#8221;);</p>
<p>$(&#8220;selector&#8221;).trigger(&#8220;type!&#8221;)<br />
    &#8220;!&#8221;用来选择匹配不包含在命名空间中的type方法</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/bienfantaisie/archive/2010/04/02/5443405.aspx</p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/04/jquery%e4%b8%ad%e7%9a%84%e4%ba%8b%e4%bb%b6.html/feed</wfw:commentRss>
		<slash:comments>685</slash:comments>
		</item>
		<item>
		<title>关于 HTML5，开发者可以期待什么？</title>
		<link>http://drinkjava.net/2010/03/about_html5.html</link>
		<comments>http://drinkjava.net/2010/03/about_html5.html#comments</comments>
		<pubDate>Mon, 22 Mar 2010 14:01:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[行业动态]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[web前端技术]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=91</guid>
		<description><![CDATA[关于 HTML5，开发者可以期待什么？

Web 开发者对 HTML5 的期待越来越强烈，作为一个以文档为中心的置标协议，HTML 越来越不能满足现代 Web  应用的需要，何况，这个协议已经有超过 10 年没有更新了。HTML5 旨在解决 Web 中的交互，媒体，本地操作等问题，一些浏览器已经尝试支持 HTML5  的一些功能，而开发者们有望最终从那些  Web 插件中得到解脱。
不过，需要指出的是，尽管一些重量级 Web 技术厂家，象 Apple，Google， Mozilla 基金会， Vimeo，YouTube  已经开始支持这个新标准，但W3C 表示，HTML5 前面的路还很长，它的一些细则目前还存在争议，主流的 Web 在转至 HTML5  之前还要经过很长的时间，而开发者们也不得不面临两难的境地，就是如何使用现在的技术设计出富 Web 应用，同时又为今后的 HTML5 做好准备。
富 Web 的现代 HTML
富 Web 应用和 HTML 之间并不般配，Web 之父 Tim Berners-Lee 这样看待  HTML，它是一种用来创建平台独立的超文本文档的置标语言，随着 XHTML 的诞生，W3C 也将网页视为文档。
这样那些视 [...]]]></description>
			<content:encoded><![CDATA[<h2><a rel="bookmark" href="http://drinkjava.net/2010/03/about_html5.html">关于 HTML5，开发者可以期待什么？</a></h2>
<div>
<p>Web 开发者对 HTML5 的期待越来越强烈，作为一个以文档为中心的置标协议，HTML 越来越不能满足现代 Web  应用的需要，何况，这个协议已经有超过 10 年没有更新了。HTML5 旨在解决 Web 中的交互，媒体，本地操作等问题，一些浏览器已经尝试支持 HTML5  的一些功能，而开发者们有望最终从那些  Web 插件中得到解脱。</p>
<p>不过，需要指出的是，尽管一些重量级 Web 技术厂家，象 Apple，Google， Mozilla 基金会， Vimeo，YouTube  已经开始支持这个新标准，但W3C 表示，HTML5 前面的路还很长，它的一些细则目前还存在争议，主流的 Web 在转至 HTML5  之前还要经过很长的时间，而开发者们也不得不面临两难的境地，就是如何使用现在的技术设计出富 Web 应用，同时又为今后的 HTML5 做好准备。</p>
<h3>富 Web 的现代 HTML</h3>
<p>富 Web 应用和 HTML 之间并不般配，Web 之父 Tim Berners-Lee 这样看待  HTML，它是一种用来创建平台独立的超文本文档的置标语言，随着 XHTML 的诞生，W3C 也将网页视为文档。</p>
<p>这样那些视 Web 为应用平台的开发者十分恼火，2004年，Apple， Mozilla 基金会和 Opera  成立了一个超文本应用技术工作组（WHATWG），寻求创建一个 W3C 之外的标准组织，以打造一个更适合应用的 Web。</p>
<p>2007年，他们的 XHTML2 陷入永无止境的纷争之中，后来，W3C经投票决定吸纳 WHATWG 的工作成果，并作为 HTML5 的标准，这时，即使  Tim Berners-Lee 也对面向应用的 Web 伸出橄榄枝，他说，现在看来，我们面向 XML 所做的那些努力是无效的。</p>
<p>这并非说纯净的 XML 语法已死，虽然 HTML 的发展方向已改，但在 HTML5 发展的同时，XHTML5 也在同步进行中，区别在于，XHTML  将适用于那些已经向 XML 转换的人，而对于普通开发者，则不一定使用 XHTML。</p>
<h3>HTML5: 标签的改变</h3>
<p>HTML5 吸取了 XHTML 2 的一些建议，包括一些用来改善文档结构的功能，比如，新的 HTML 标签 header, footer, dialog,  aside, fugure 等的使用，将使内容创作者更加语义地创建文档，之前的开发者在这些场合是一律使用 div 的。</p>
<p>HTML5 还包含了一些将内容和展示分离的努力，开发者们也许会惊讶，b 和 i  标签依然存在，但它们的意义已经和之前有所不同，这些标签的意义只是为了将一段文字标识出来，而不是为了为它们设置粗体或斜体式样。  u，font，center，strike 这些标签则被完全去掉了。</p>
<p>新标准适用了一些全新的表单输入对象，包括日期，URL，Email 地址，其它的对象则增加了对非拉丁字符的支持。HTML5  还引入了微数据，一种使用机器可以识别的标签标注内容的方法，使语义 Web  的处理更为简单。总的来说，这些与结构有关的改进使内容创建者可以创建更干净，更容易管理的网页，这样的网页对搜索引擎，对读屏软件等更为友好。</p>
<h3>实现基于标准的富Web</h3>
<p>然而，HTML5 最令人振奋的是那些让开发者们实现富应用的新 API，诸如图形，动画，多媒体，在HTML5 之前，这些功能的实现需要  Flash，RealMdeia，QuikTime 一类的插件，这些插件技术不仅容易带来安全隐患，而且它的受众是受限的。</p>
<p>HTML5 通过使用相应的置标语言解决了这些问题，内容创建者可以使用类似 MathML 以及 SVG 之类的语言实现数学公式和图形的创建，这些语言比  Flash， Silverlight 一类的格式更容易跨平台使用。</p>
<p>Web 开发者们更会为 HTML5 的 audio 和 ideo 标签欢呼，这些标签让 Web  页面轻松实现媒体的嵌入，它们的编码标准是中立的，意味着浏览器厂商可以自己使用何种编码输出媒体，而它的 video 标签更将使那些不支持 Flash  的移动浏览器获益匪浅。</p>
<p>Canvs 标签会让交互式 Web 图形更上层楼，开发者可以使用 JavaScript 操作 canvas  中的对象，实现实时的交互式图形操作，甚至实现交互式游戏。除了这些可以看到的变化，HTML5 还引入基于浏览器的程序缓存，将应用数据在本地缓存（就像之前的  Google Gears 插件），这不仅能加速 Web 程序的运行，还可以使一些程序在离线时仍可使用。事实上，Google 现在慢慢取消对 Gears  的支持，全面转向 HTML5。</p>
<h3>浏览器插件：还不至于死</h3>
<p>尽管 HTML5 推出了这么多新功能，但不要指望那些插件会一夜消失，纯粹的 HTML5  要实现目前这个插件世界的全部功能还要很长的时间，更不要说那些需要继续支持的旧系统。比如，虽然 Vimeo 和 YouTube 已经开始使用 video  标签输出视频，然而事情并不是那么简单，W3C 还没有确定使用何种编码方案，这意味着，那些视频并不能保证在任何设备上都能看。比如 Apple， Google  以及微软都主推 H.264 编码，而开源的 Firefox 则不愿意，因为存在许可问题。</p>
<p>另外，并不是所有旧系统都会以 HTML5 重写，比如，尽管 Google 自己都不再看好 Google Gears 而主推 HTML5，但 Gooel  承认，HTML5 并不能实现 Google Gears 的全部功能，将基于 Google Gears 的应用转换为纯 HTML5 是不可能简单实现的。</p>
<p>最后，五花八门的浏览器也会阻碍 Web 开发者们向 HTML5 转移，IE6，旧版本的 Firefox，Opera，Safari 都不支持  HTML5，因此，除非，绝大多数人的浏览器都升级到最新状态，否则，面向 HTML5 的开发仍将面临各种困境。</p>
<h3>早期采用者</h3>
<p>尽管微软已经表示，IE9 会支持 HTML5，但他们对此事也抱谨慎态度，微软认为，在  HTML5 标准都未确立的今天，说自己的浏览器支持多数 HTML5 功能是不妥的。事实上，任何组织都不可能比 W3C 更清楚 HTML5 的进度，而 W3C  认为，HTML5 标准仍未成熟，功能确立要到2011年前才能完成，即使到了那时，将这些东西确立为标准也需要到2022年，也就是说，XHTML1.1 到  HTML5 大约要15年。</p>
<p>不管怎么说，HTML5 将是未来 5 到 10  年最前沿的技术，那些早期采用这可以在网络中找到大量的体验站点，目前，体验 HTML5 的最好浏览器是那些基于 Webkit 引擎的浏览器，如 Chrome 和  Safari，Firefox 不太流畅。Web 开发者们可以使用目前的 HTML5 草案创建试验站点，当然在当前浏览器分布体系下，还会有些问题，线上最好的  HTML5 开发资源是。</p>
<h3>HTML5 体验站点</h3>
<table border="0">
<tbody>
<tr>
<td><a href="https://bespin.mozilla.com/" target="_blank">Mozilla Bespin</a></td>
<td>An in-browser programmer’s editor written using HTML technologies</td>
</tr>
<tr>
<td><a href="http://www.youtube.com/html5" target="_blank">YouTube</a></td>
<td>YouTube’s HTML5 player offers experimental HTML5 support</td>
</tr>
<tr>
<td><a href="http://www.vimeo.com/blog:268" target="_blank">Vimeo</a></td>
<td>Vimeo movies offer a link at the bottom for switching to an HTML5 player  (Chrome, Safari, IE+Chrome Frame)</td>
</tr>
<tr>
<td><a href="http://merged.ca/iphone/html5-geolocation" target="_blank">Merge Design</a></td>
<td>An HTML5 geolocation demo</td>
</tr>
<tr>
<td><a href="http://webkit.org/demos/sticky-notes/index.html" target="_blank">Sticky  Notes</a></td>
<td>A demonstration of HTML5 client-side storage</td>
</tr>
<tr>
<td><a href="http://devfiles.myopera.com/articles/650/step_4_enemies.htm" target="_blank">Wolfenstein 3D</a></td>
<td>Demo using the canvas tag (with <a href="http://dev.opera.com/articles/view/creating-pseudo-3d-games-with-html-5-can-1/" target="_blank">how-to</a>) — works in Firefox 3.6</td>
</tr>
<tr>
<td><a href="http://ryandoherty.net/clouserwsoundboard/" target="_blank">ClouserW  Soundboard</a></td>
<td>An HTML5 sound board showing off multimedia capabilities</td>
</tr>
<tr>
<td><a href="http://wave.google.com/" target="_blank">Google Wave</a></td>
<td>Google Wave relies on HTML5 for some of its features</td>
</tr>
<tr>
<td><a href="http://www.freeciv.net/" target="_blank">FreeCiv</a></td>
<td>A game implemented in HTML5</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/03/about_html5.html/feed</wfw:commentRss>
		<slash:comments>366</slash:comments>
		</item>
		<item>
		<title>直逼 Flash 的流畅感：jQuery 运动特效展示</title>
		<link>http://drinkjava.net/2010/03/flash-vs-jquery.html</link>
		<comments>http://drinkjava.net/2010/03/flash-vs-jquery.html#comments</comments>
		<pubDate>Thu, 04 Mar 2010 05:40:20 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web前端技术]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Jquery]]></category>
		<category><![CDATA[jQuery特效]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=87</guid>
		<description><![CDATA[围剿 Flash 的不仅有 HTML 5，还有 JavaScript，著名的 JavaScript 框架 jQuery 在运动特效方面已经越来越流畅，有时候你需要点一下右键来确认它不是 Flash。本文介绍了10个非常出色的 jQuery 运动特效，这些效果可以更有效地展示你的内容。
1. 流感导航菜单
下面的导航菜单，当鼠标在上面移动的时候，会很流畅地垂下解释菜单，当你将鼠标在上面快速左右移动的时候，会怀疑这是 Flash。
 
2. 转花灯
Roundabout 是一个 jQuery 插件，可以将一组 HTML 对象转换为旋转花灯的效果。
 
3. 拉洋片
拉洋片也许是 jQuery 最拿手的效果了。该效果在遇到 JavaScript 被禁用的场合会自动降级使用。
 
4. jQuery Quicksand 插件
这个让人赞叹的插件，可以对一组 HTML 对象重新洗牌，效果非常出众。
 
5. 导航滑块
这种风格的导航已经见于很多站点，鼠标在导航菜单上移动的时候，一个高亮指示条随着鼠标滑动，指示当前的导航位置。
 
6. 文字的移动纹理
在文字上，显示移动的纹理，效果美轮美奂。原理是，做一个带透明文字的 PNG 图像放在一个容器里，容器的背景放一张图案，用 jQuery 移动容器的背景，很简单，不过，不支持 IE6，因为 IE6 不支持 PNG。
 
7. jDiv: jQuery 导航 Tab
一个可以显示丰富内容的下拉导航菜单（演示要翻墙）。
 
8. 基于 CSS3 和 [...]]]></description>
			<content:encoded><![CDATA[<p>围剿 Flash 的不仅有 HTML 5，还有 JavaScript，著名的 JavaScript 框架 jQuery 在运动特效方面已经越来越流畅，有时候你需要点一下右键来确认它不是 Flash。本文介绍了10个非常出色的 jQuery 运动特效，这些效果可以更有效地展示你的内容。</p>
<h3>1. 流感导航菜单</h3>
<p>下面的导航菜单，当鼠标在上面移动的时候，会很流畅地垂下解释菜单，当你将鼠标在上面快速左右移动的时候，会怀疑这是 Flash。</p>
<p><a href="http://addyosmani.com/resources/fluid-menu/fluid-menu.html"><img src="http://devsnippets.com/img/jquery-magic/jquery-01.jpg" alt="Fluid   Navigation – How to create an informative menu-bar with   jQuery &amp;  CSS" /> </a></p>
<h3>2. 转花灯</h3>
<p>Roundabout 是一个 jQuery 插件，可以将一组 HTML 对象转换为旋转花灯的效果。</p>
<p><a href="http://fredhq.com/projects/roundabout/#demo"><img src="http://devsnippets.com/img/jquery-magic/jquery-02.jpg" alt="Move   Elements with Style" /> </a></p>
<h3>3. 拉洋片</h3>
<p>拉洋片也许是 jQuery 最拿手的效果了。该效果在遇到 JavaScript 被禁用的场合会自动降级使用。</p>
<p><a href="http://www.sohtanaka.com/web-design/examples/image-slider/"><img src="http://devsnippets.com/img/jquery-magic/jquery-03.jpg" alt="Automatic Image Slider w/ CSS &amp; jQuery" /> </a></p>
<h3>4. jQuery Quicksand 插件</h3>
<p>这个让人赞叹的插件，可以对一组 HTML 对象重新洗牌，效果非常出众。</p>
<p><a href="http://razorjack.net/quicksand/demos/one-set-clone.html"><img src="http://devsnippets.com/img/jquery-magic/jquery-04.jpg" alt="jQuery   Quicksand Plugin" /> </a></p>
<h3>5. 导航滑块</h3>
<p>这种风格的导航已经见于很多站点，鼠标在导航菜单上移动的时候，一个高亮指示条随着鼠标滑动，指示当前的导航位置。</p>
<p><a href="http://css-tricks.com/examples/MagicLine/"><img src="http://devsnippets.com/img/jquery-magic/jquery-05.jpg" alt="jQuery   Magic Line Sliding Style Navigation" /> </a></p>
<h3>6. 文字的移动纹理</h3>
<p>在文字上，显示移动的纹理，效果美轮美奂。原理是，做一个带透明文字的 PNG 图像放在一个容器里，容器的背景放一张图案，用 jQuery 移动容器的背景，很简单，不过，不支持 IE6，因为 IE6 不支持 PNG。</p>
<p><a href="http://www.gayadesign.com/scripts/textmovingbg/"><img src="http://devsnippets.com/img/jquery-magic/jquery-06.jpg" alt="Text   with Moving Backgrounds" /> </a></p>
<h3>7. jDiv: jQuery 导航 Tab</h3>
<p>一个可以显示丰富内容的下拉导航菜单（演示要翻墙）。</p>
<p><a href="http://www.skyrocketlabs.com/categories/tutorials/jdiv/demo/index.html"><img src="http://devsnippets.com/img/jquery-magic/jquery-07.jpg" alt="jDiv: A   jQuery navigation menu alternative" /> </a></p>
<h3>8. 基于 CSS3 和 jQuery 的半透明导航系统</h3>
<p>鼠标在导航菜单上移动，显示半透明的指示图标。CSS3 做这个实在太容易了。</p>
<p><a href="http://demo.tutorialzine.com/2010/01/halftone-navigation-menu-jquery-css/demo.html"><img src="http://devsnippets.com/img/jquery-magic/jquery-08.jpg" alt="Halftone Navigation Menu With jQuery &amp; CSS3" /> </a></p>
<h3>9. 云台式拉洋片</h3>
<p>常规的拉洋片效果要么左到右，要么右到左，或者垂直上下，这个 jQuery 效果可以象云台那样扫镜头。</p>
<p><a href="http://s3.amazonaws.com/buildinternet/live-tutorials/panning-slideshow/panning-slideshow.htm"><img src="http://devsnippets.com/img/jquery-magic/jquery-09.jpg" alt="Animate  Panning Slideshow with jQuery" /> </a></p>
<h3>10. SlideDeck</h3>
<p>SlideDeck 是一种新颖的内容展示方式，有点类似 Outlook 的手风琴菜单，但视觉效果和用户体验更好一些。</p>
<p><a href="http://www.slidedeck.com/"><img src="http://devsnippets.com/img/jquery-magic/jquery-10.jpg" alt="SlideDeck" /> </a></p>
<p>本文来源：<a href="http://devsnippets.com/article/10-jquery-transition-effects.html">http://devsnippets.com/article/10-jquery-transition-effects.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/03/flash-vs-jquery.html/feed</wfw:commentRss>
		<slash:comments>679</slash:comments>
		</item>
		<item>
		<title>Web 设计中的 5 个最具争议性的话题</title>
		<link>http://drinkjava.net/2010/03/web-%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84-5-%e4%b8%aa%e6%9c%80%e5%85%b7%e4%ba%89%e8%ae%ae%e6%80%a7%e7%9a%84%e8%af%9d%e9%a2%98.html</link>
		<comments>http://drinkjava.net/2010/03/web-%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84-5-%e4%b8%aa%e6%9c%80%e5%85%b7%e4%ba%89%e8%ae%ae%e6%80%a7%e7%9a%84%e8%af%9d%e9%a2%98.html#comments</comments>
		<pubDate>Thu, 04 Mar 2010 02:08:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web前端技术]]></category>
		<category><![CDATA[开发相关]]></category>
		<category><![CDATA[web设计]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=83</guid>
		<description><![CDATA[新闻来源:line25.com
在 Web 空前繁荣的今天，有关 Web 设计中的各种观点很多会成为话题，有的很快达成一致，有的则一直争议下去，本文讲述 Web 设计中的 5 大经典争议，这些争议从它们诞生的那天起，就被正反两方争得不亦乐乎。
争议之一：链接是否应该在新窗口打开

正方:
外部链接应该始终从新窗口打开，当你浏览一个站点的时候，点击了一个链接，却被带到另外一个站点，你在这个站点的会话也因此丢失，这实在令人恼怒。因此，站点内的链接可以在现有窗口打开，而站点外链接则应该在新窗口打开。
反方:
作为 Web 设计师，我们不该控制用户的行为，一个链接是否在新窗口打开，应该是用户自己的选择。剥夺用户的控制权，在用户的桌面上打开一堆窗口或标签，这才是真正让人恼怒的事。如果用户想打开新窗口，他们可以自己选择，而对非熟练用户，新窗口让他们丢失了“后退”按钮更让他们无所适从。
和事佬:
总体来讲，应该避免使用新窗口打开链接，但在某些场合，如打开购物车中的帮助链接，打开一个非 html 文件（如 PDF 文件），应该使用新窗口。为了提高易用性，最好在需要打开新窗口的地方，用一个小图标提示一下。
争议之二：在链接中应该使用诸如“Click here” 一类的笼统词汇吗？

正方:
事实证明，“Click here” 比描述性的链接更容易获得点击，因此应该使用该词汇以获得更好的点击率。
反方:
“Click here” 一类的链接损害 Web 的易用性，用户在点击之前，只能通过周围的上下文关系猜测这个链接是做什么的。Quality guidelines 建议，任何链接文字都应该明确描述该链接的目的。
和事佬:
为了提高站点的易用性，可访问性和 SEO 性能，应该始终使用描述性链接。很有趣听到有人说 “Click here” 比描述性链接可以获得更多点击率，不知道那些点击进来的人是不是看两眼就离开了。
争议之三：使用该继续使用 &#60;b&#62; 和 &#60;i&#62; 两个标签?

正方：
如果你仅仅想把一个词设为粗体，而这个词并没有强调表示重要的意思，应该使用 &#60;b&#62; 标签，不该用 &#60;strong&#62; 标签，读屏软件对 &#60;b&#62; 和&#60;i&#62; 标签有不同的发音，而 HTML5 规范中仍包含这两个标签。
反方:
这两个标签的作用是将文字设置为粗体或斜体，从语义角度看，任何装饰性的东西都应该使用 CSS 实现，如果要强调一个词语，应该使用 &#60;strong&#62; 或 &#60;em&#62; 标签。
和事佬：
&#60;b&#62; 和 &#60;i&#62; 标签不应该用于修饰文字的式样，这些视觉的修饰应该交由 CSS 处理。如果要强调一个词汇或语句，应该使用 &#60;strong&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>新闻来源:line25.com<br />
在 Web 空前繁荣的今天，有关 Web 设计中的各种观点很多会成为话题，有的很快达成一致，有的则一直争议下去，本文讲述 Web 设计中的 5 大经典争议，这些争议从它们诞生的那天起，就被正反两方争得不亦乐乎。</p>
<p>争议之一：链接是否应该在新窗口打开<br />
<img src="http://line25.com/wp-content/uploads/2010/debates/new-window.jpg" alt="" /><br />
正方:<br />
外部链接应该始终从新窗口打开，当你浏览一个站点的时候，点击了一个链接，却被带到另外一个站点，你在这个站点的会话也因此丢失，这实在令人恼怒。因此，站点内的链接可以在现有窗口打开，而站点外链接则应该在新窗口打开。<br />
反方:<br />
作为 Web 设计师，我们不该控制用户的行为，一个链接是否在新窗口打开，应该是用户自己的选择。剥夺用户的控制权，在用户的桌面上打开一堆窗口或标签，这才是真正让人恼怒的事。如果用户想打开新窗口，他们可以自己选择，而对非熟练用户，新窗口让他们丢失了“后退”按钮更让他们无所适从。<br />
和事佬:<br />
总体来讲，应该避免使用新窗口打开链接，但在某些场合，如打开购物车中的帮助链接，打开一个非 html 文件（如 PDF 文件），应该使用新窗口。为了提高易用性，最好在需要打开新窗口的地方，用一个小图标提示一下。<br />
争议之二：在链接中应该使用诸如“Click here” 一类的笼统词汇吗？<br />
<img src="http://line25.com/wp-content/uploads/2010/debates/click-here.jpg" alt="" /><br />
正方:<br />
<a href="http://dustincurtis.com/you_should_follow_me_on_twitter.html">事实证明</a>，“Click here” 比描述性的链接更容易获得点击，因此应该使用该词汇以获得更好的点击率。<br />
反方:<br />
“Click here” 一类的链接损害 Web 的易用性，用户在点击之前，只能通过周围的上下文关系猜测这个链接是做什么的。<a href="http://www.w3.org/QA/Tips/noClickHere">Quality guidelines</a> 建议，任何链接文字都应该明确描述该链接的目的。<br />
和事佬:<br />
为了提高站点的易用性，可访问性和 SEO 性能，应该始终使用描述性链接。很有趣听到有人说 “Click here” 比描述性链接可以获得更多点击率，不知道那些点击进来的人是不是看两眼就离开了。<br />
争议之三：使用该继续使用 &lt;b&gt; 和 &lt;i&gt; 两个标签?<br />
<img src="http://line25.com/wp-content/uploads/2010/debates/b-i.jpg" alt="" width="500" height="200" /></p>
<p><strong>正方：</strong></p>
<p>如果你仅仅想把一个词设为粗体，而这个词并没有强调表示重要的意思，应该使用 &lt;b&gt; 标签，不该用 &lt;strong&gt; 标签，读屏软件对 &lt;b&gt; 和&lt;i&gt; 标签有不同的发音，而 HTML5 规范中仍包含这两个标签。</p>
<p><strong>反方:</strong></p>
<p>这两个标签的作用是将文字设置为粗体或斜体，从语义角度看，任何装饰性的东西都应该使用 CSS 实现，如果要强调一个词语，应该使用 &lt;strong&gt; 或 &lt;em&gt; 标签。</p>
<p><strong>和事佬：</strong></p>
<p>&lt;b&gt; 和 &lt;i&gt; 标签不应该用于修饰文字的式样，这些视觉的修饰应该交由 CSS 处理。如果要强调一个词汇或语句，应该使用 &lt;strong&gt; 或 &lt;em&gt; 标签。只有在那些没有别的标签可用的场合，才可以考虑 &lt;b&gt; 和 &lt;i&gt; 。<br />
争议之四：站点 Logo 是否因出现在 &lt;h1&gt; 标签中?<br />
<img src="http://line25.com/wp-content/uploads/2010/debates/h1.jpg" alt="" /></p>
<p><strong>正方s:</strong></p>
<p>Logo 不应包围在标题标签中，标题标签应该包含这个页面的标题或描述性内容，这是 SEO 的最佳方式，否则，站点中的每个页的标题岂不是全变成公司名字了？</p>
<p><strong>反方:</strong></p>
<p>一个站点最明显的标志是它的 Logo， 而 &lt;h1&gt; 是一个页面最顶级的标题，将 Logo 包围其中很自然，这样，即使没有 CSS 人们也很容易该明白这个页面的结构。</p>
<p><strong>和事佬:</strong></p>
<p>标题标签的作用是描述内容的层级结构，如果一个站点有一个描述站点内容的标题，应该放在 &lt;h1&gt; 中，否则，第二级结构或描述性的对象，就是 Logo。<br />
争议之五：是否应该支持 IE6？<br />
<img src="http://line25.com/wp-content/uploads/2010/debates/ie6.jpg" alt="" /><br />
正方:<br />
IE6 现在仍占有 <a href="http://www.w3schools.com/browsers/browsers_stats.asp">10%</a> 的市场份额（在国内更高-译者注），因此，网站毫无疑问应该支持 IE6。世界上仍然有很多公司的系统仍需使用 IE6 访问，另外，还有很多人根本不知道怎么升级他们的浏览器。<br />
反方:<br />
IE6 已经过时，不支持最新的 Web 技术，它给在线用户带来安全隐患，也是众多 Web 开发设计师的噩梦。包括 YouTube 在内的大型站点已经<a href="http://mashable.com/2010/02/23/youtube-ie6/">停止支持 IE6</a>。你也不例外。<br />
和事佬:<br />
IE6 毫无疑问在衰退，随着大公司对它的抛弃，它的死亡可能来得比预期还快，是否支持 IE6 要看的具体情况，可以考虑为 IE6 用户提供最基本的页面格式，而不必为它挣扎。</p>
<p>本文来源：<a href="http://line25.com/articles/top-5-web-design-debates-that-cause-the-most-riots">http://line25.com/articles/top-5-web-design-debates-that-cause-the-most-riots</a></p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/03/web-%e8%ae%be%e8%ae%a1%e4%b8%ad%e7%9a%84-5-%e4%b8%aa%e6%9c%80%e5%85%b7%e4%ba%89%e8%ae%ae%e6%80%a7%e7%9a%84%e8%af%9d%e9%a2%98.html/feed</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
		<item>
		<title>招聘 搜索引擎开发 &amp; 网页设计</title>
		<link>http://drinkjava.net/2010/02/job-search-engine-development.html</link>
		<comments>http://drinkjava.net/2010/02/job-search-engine-development.html#comments</comments>
		<pubDate>Mon, 01 Feb 2010 03:27:40 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[开发相关]]></category>
		<category><![CDATA[招聘]]></category>
		<category><![CDATA[搜索引擎开发]]></category>
		<category><![CDATA[网页设计]]></category>

		<guid isPermaLink="false">http://drinkjava.net/?p=77</guid>
		<description><![CDATA[一个朋友在招聘，感兴趣的可以他联系。
搜索引擎开发工程师（1人）
工作地：台州
职位描述:
1.负责搜索引擎系统相关开发
2.负责搜索引擎的日常维护和优化
职位要求:
1.一年以上开发经验
2.熟练掌握java或c#，精通面向对象技术
3.熟悉Lucene , Heritrix等开源搜索引擎框架
4.具有较强的算法设计能力，熟悉数据结构
5.了解中文分词原理，最好熟悉业界各种开源中文分词组件
6.具有良好的学习能力及工作责任心，良好的沟通能力和团队合作精神
7.热爱软件开发,关心开源软件社区的最新动态
网页设计师（1人）
工作地：台州
职位描述:
1.负责网站页面设计
2.与后台工程师合作完成网站系统
职位要求:
1.熟练掌握HTML/XHTML,CSS,Ajax等前端技术
2.熟练DIV+CSS网站布局，熟悉Web标准
3.熟悉Photoshop或其他绘图软件
4.熟悉java,c#,php,python等一种后台语言
5.具有良好的学习能力及工作责任心，良好的沟通能力和团队合作精神
以上职位，薪金面议。
简历请发至：nffish@gmail.com 注明应聘职位
欢迎转载
]]></description>
			<content:encoded><![CDATA[<h3><span style="color: #ff0000;">一个朋友在招聘，感兴趣的可以他联系。</span></h3>
<p><strong>搜索引擎开发工程师（1人）</strong></p>
<p>工作地：台州</p>
<p>职位描述:<br />
1.负责搜索引擎系统相关开发<br />
2.负责搜索引擎的日常维护和优化</p>
<p>职位要求:<br />
1.一年以上开发经验<br />
2.熟练掌握java或c#，精通面向对象技术<br />
3.熟悉Lucene , Heritrix等开源搜索引擎框架<br />
4.具有较强的算法设计能力，熟悉数据结构<br />
5.了解中文分词原理，最好熟悉业界各种开源中文分词组件<br />
6.具有良好的学习能力及工作责任心，良好的沟通能力和团队合作精神<br />
7.热爱软件开发,关心开源软件社区的最新动态</p>
<p><strong>网页设计师（1人）</strong></p>
<p>工作地：台州</p>
<p>职位描述:<br />
1.负责网站页面设计<br />
2.与后台工程师合作完成网站系统</p>
<p>职位要求:<br />
1.熟练掌握HTML/XHTML,CSS,Ajax等前端技术<br />
2.熟练DIV+CSS网站布局，熟悉Web标准<br />
3.熟悉Photoshop或其他绘图软件<br />
4.熟悉java,c#,php,python等一种后台语言<br />
5.具有良好的学习能力及工作责任心，良好的沟通能力和团队合作精神</p>
<p>以上职位，薪金面议。<br />
简历请发至：nffish@gmail.com 注明应聘职位<br />
欢迎转载</p>
]]></content:encoded>
			<wfw:commentRss>http://drinkjava.net/2010/02/job-search-engine-development.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
