﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Read Sean-随笔分类-The Other Side</title><link>http://www.blogjava.net/sean/category/39.html</link><description>Read me, read Sean.</description><language>zh-cn</language><lastBuildDate>Fri, 02 May 2008 10:06:12 GMT</lastBuildDate><pubDate>Fri, 02 May 2008 10:06:12 GMT</pubDate><ttl>60</ttl><item><title>So long, Ubuntu!</title><link>http://www.blogjava.net/sean/archive/2008/05/02/197760.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 02 May 2008 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/05/02/197760.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/197760.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/05/02/197760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/197760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/197760.html</trackback:ping><description><![CDATA[
		<br />最近在家休息，想来Ubuntu新的LTS版本8.04已经出来一周多了，试试看吧，正好想给家里的服务器来一次升级，未曾想这一试让我彻底和Ubuntu说了bye bye。<br /><br />我的主打机器是一台T43，在3月下旬，这台ThinkPad就彻底从Ubuntu变脸成了Arch Linux，运行至今，十分稳定，要速度有速度，要功能有功能，简单而强大，让人爱不释手。我家里有一台"老"机器，AMD Athlon 2500+ / 512M，先后装过SuSE、Fedora、CentOS、Debian、Ubuntu 7.10，由于很长一段时间以来都比较忙，没时间去折腾，在最后这次开刀之前，定格在了Gusty Gibbon。<br /><br />说回这次开刀。趁休假有时间，我打算再整理/升级一下这台服务器，正好Ubuntu 8.04 LTS出来，冲着省事（平时难有时间去折腾）和LTS，我想这应该还是比较自然的一个选择。安装过程很顺利，该找到的硬件都找到，一切都还像是Ubuntu在7.10基础上正常的一次升级版，谁知刚配置完几个我常用的应用程序/服务，就遇到了严重的问题：系统会随机（通常几分钟时间）锁住，没有反应，键盘灯和鼠标灯还有反应，但是屏幕定格，Ctrl-Alt-Backspace或者Ctrl-Alt-F1等等，都不管用了，什么提示都没有。硬件问题？不像啊，之前的Gusty跑得很好。网上一搜，好家伙，还是普遍现象：<br /><br /><a target="_blank" title="http://ubuntuforums.org/showthread.php?t=768200" href="http://ubuntuforums.org/showthread.php?t=768200">http://ubuntuforums.org/showthread.php?t=768200</a><br /><br />没想到拿LTS的正式ISO安装，还是无奈的做了一次小白鼠，对Ubuntu印象因此大打折扣。算了吧，装回熟悉的Debian，一切又恢复安静。从今天起，我的Linux推荐榜调整为：公司服务器 - CentOS、个人服务器 - Debian、个人桌面 - Arch Linux。<br /><br />So long, Ubuntu!<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/197760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-05-02 17:35 <a href="http://www.blogjava.net/sean/archive/2008/05/02/197760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[快讯] 阿森纳客场2-0淘汰AC米兰昂首进军冠军杯八强</title><link>http://www.blogjava.net/sean/archive/2008/03/05/183825.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 04 Mar 2008 21:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/05/183825.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/183825.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/05/183825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/183825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/183825.html</trackback:ping><description><![CDATA[
		<br />啥也不说了，开心！<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/183825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-03-05 05:39 <a href="http://www.blogjava.net/sean/archive/2008/03/05/183825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Apache Harmony 5.0 reaches M5</title><link>http://www.blogjava.net/sean/archive/2008/02/29/183052.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 29 Feb 2008 15:28:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/29/183052.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/183052.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/29/183052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/183052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/183052.html</trackback:ping><description><![CDATA[
		<br />就在2月的最后一天，Apache Harmony发布了5.0的第5个milestone: <a target="_blank" title="http://harmony.apache.org/" href="http://harmony.apache.org/">http://harmony.apache.org/</a><br /><br />为默默耕耘的人鼓掌。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/183052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-29 23:28 <a href="http://www.blogjava.net/sean/archive/2008/02/29/183052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>球场暴力 惨不忍睹</title><link>http://www.blogjava.net/sean/archive/2008/02/24/181753.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 24 Feb 2008 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/24/181753.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/181753.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/24/181753.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/181753.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/181753.html</trackback:ping><description><![CDATA[
		<br />本赛季状态渐佳，外号"禁区之狐"的阿森纳小将Eduardo在英超客场对阵Birmingham City中惨遭暗害：<br /><br />(<a title="http://www.blogjava.net/sean/archive/2008/02/24/181750.html" href="/sean/archive/2008/02/24/181750.html">由于实在太过血腥，不忍心放在首页，请点击查看</a>)<br /><br />在此强烈谴责Martin Taylor这次不负责任的野蛮铲球，只给你红牌实在太轻了。让我们共同为Eduardo祈祷，祝愿他早日康复！也希望绿茵场上不要再发生类似的惨剧。足球应该是给人带来快乐的，不是人身伤害。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/181753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-24 13:22 <a href="http://www.blogjava.net/sean/archive/2008/02/24/181753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eduardo被铲瞬间</title><link>http://www.blogjava.net/sean/archive/2008/02/24/181750.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 24 Feb 2008 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/24/181750.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/181750.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/24/181750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/181750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/181750.html</trackback:ping><description><![CDATA[
		<br />
		<img src="http://www.blogjava.net/images/blogjava_net/sean/football/Eduardo_0.jpg" alt="Eduardo_0.jpg" border="0" height="300" width="400" />
		<br />
		<br />
		<img src="http://www.blogjava.net/images/blogjava_net/sean/football/Eduardo_1.jpg" alt="Eduardo_1.jpg" border="0" height="300" width="400" />
		<br />
		<br />
		<img src="http://www.blogjava.net/images/blogjava_net/sean/football/Eduardo_2.jpg" alt="Eduardo_2.jpg" border="0" height="300" width="400" />
		<br />
		<br />
		<img src="http://www.blogjava.net/images/blogjava_net/sean/football/Eduardo_3.jpg" alt="Eduardo_3.jpg" border="0" height="400" width="400" />
		<br />
		<br />
		<img src="http://www.blogjava.net/images/blogjava_net/sean/football/Eduardo_4.jpg" alt="Eduardo_4.jpg" border="0" height="300" width="400" />
		<br />
		<br />
		<br />
		<br />
<img src ="http://www.blogjava.net/sean/aggbug/181750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-24 13:16 <a href="http://www.blogjava.net/sean/archive/2008/02/24/181750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] 开源数据库PostgreSQL正式发布8.3版</title><link>http://www.blogjava.net/sean/archive/2008/02/07/179424.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 07 Feb 2008 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/07/179424.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/179424.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/07/179424.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/179424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/179424.html</trackback:ping><description><![CDATA[
		<br />经过1月3日和1月18日两轮RC后，PostgreSQL 8.3终于在本月初正式发布了。该版本有很多功能和性能上的重大提升，包括全文搜索、新的数据类型(XML、ENUM、UUID等)、并发autovacuum、异步提交等等，以及对Windows平台更好的支持，如SSPI和VC++等。<br /><br />官方声明: <a target="_blank" title="http://www.postgresql.org/about/news.918" href="http://www.postgresql.org/about/news.918">http://www.postgresql.org/about/news.918</a><br />Release Notes: <a target="_blank" title="http://www.postgresql.org/docs/8.3/static/release-8-3.html" href="http://www.postgresql.org/docs/8.3/static/release-8-3.html">http://www.postgresql.org/docs/8.3/static/release-8-3.html</a><br />各版本功能对照: <a target="_blank" title="http://www.postgresql.org/about/featurematrix" href="http://www.postgresql.org/about/featurematrix">http://www.postgresql.org/about/featurematrix</a><br />下载: <a target="_blank" title="http://www.postgresql.org/ftp/" href="http://www.postgresql.org/ftp/">http://www.postgresql.org/ftp/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/179424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-02-07 10:04 <a href="http://www.blogjava.net/sean/archive/2008/02/07/179424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] 会Java？学Groovy？这里有篇很好的介绍/演示 </title><link>http://www.blogjava.net/sean/archive/2008/01/27/178036.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 27 Jan 2008 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/01/27/178036.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/178036.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/01/27/178036.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/178036.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/178036.html</trackback:ping><description><![CDATA[
		<br />如果你有一定的Java基础，想快速的尝尝动态语言的味道，Groovy是个自然的过渡选择。今天无意中看到一篇介绍Groovy的文章，很短，也很有趣，从一个典型的Java程序开始，一步一步"Groovy化"，最终改造成一个完整的Groovy程序：<br /><a target="_blank" href="http://java.dzone.com/news/java-groovy-few-easy-steps"><br />http://java.dzone.com/news/java-groovy-few-easy-steps</a><br /><br />如果你对当下动态语言的现状有所了解，那你多半已经知道能在JVM中运行的动态语言，远不止Groovy一种，那么什么理由会让你选择Groovy而非Jython、JRuby或者其他类似的语言呢？笔者认为主要还是编码习惯和风格，Groovy是这些语言中最接近Java的。Jython和JRuby都是从其他成功的动态语言"移植"过来，带有明显的Python、Ruby语法特征和习惯。选择Jython或者JRuby的朋友，我想大都是原本就有Python或者Ruby的基础，舍不得Python和Ruby的一些很方便的语法和编码风格/习惯/哲学，或者干脆就是为了将Python和Ruby世界的一些框架引入到Java中，或者说是让Python/Ruby应用能够更好的利用Java平台已有的资源。如果你在动态语言上没有这方面的需求，只是为了让你的Java应用更动态，选择Jython或者JRuby只能是凭空增加学习难度。要知道，Python和Ruby都是很有特点、很有个性的语言（其实Java又何尝不是），要从Java的思维和哲学，转向Python/Ruby的思维和哲学，并不是那么容易做到和做好的。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/178036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-01-27 17:14 <a href="http://www.blogjava.net/sean/archive/2008/01/27/178036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Linux下挂载中文Windows共享目录</title><link>http://www.blogjava.net/sean/archive/2008/01/18/176166.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 18 Jan 2008 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/01/18/176166.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/176166.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/01/18/176166.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/176166.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/176166.html</trackback:ping><description><![CDATA[
		<br />使用Linux很便利的一个地方，就是它把所有资源都按照文件的方式抽象出来，于是我们在读写任何外部资源时，都像是操作本地普通文件一样。访问Windows共享，除了在Nautilus/Konquerer使用smb://，或者命令行使用smbclient之外，当然还有更cool的方式，那就是smbmount。<br /><br />在Ubuntu下使用smbmount，需要安装smbfs包，通过sudo apt-get install smbfs即可。调用方法如下，新建/share目录后：<br />$ [sudo] smbmount //10.10.10.10/share /share -o username=&lt;user_name&gt;,password=&lt;password&gt;,codepage=cp936,iocharset=ut8<br /><br />注意最后两个参数，Linux默认是UTF-8编码，中文Windows则是GBK，按codepage划分，也就是cp936。如果你的环境和上述不一致，则需要相应的修改codepage和iocharset参数。成功以后，我们就可以通过熟悉的ls, cp, cat, less, more, mv, zip, tar, rm, rename, nano, vi等等我们在Linux下已经习以为常的方式来操作了，就和本地文件夹一样。<br /><br />如果想在Linux启动时自动把Windows共享挂进来，则可以修改/etc/fstab，增加如下内容：<br />//10.10.10.10/share /share smbfs username=&lt;user_name&gt;,password=&lt;password&gt;,codepage=cp936,iocharset=ut8,umask=000 0 0<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/176166.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-01-18 12:54 <a href="http://www.blogjava.net/sean/archive/2008/01/18/176166.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三年了</title><link>http://www.blogjava.net/sean/archive/2008/01/13/174992.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 13 Jan 2008 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/01/13/174992.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/174992.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/01/13/174992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/174992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/174992.html</trackback:ping><description><![CDATA[
		<br />不知不觉中，从我在BlogJava第一篇随笔至今，BlogJava已经伴随我走过了三个年头。不由得感慨：时间过得真快。<br /><br />前不久刚看完Coen兄弟的新片 No Country for Old Men (<a href="http://www.douban.com/subject/1857099/">豆瓣</a>)，挺打动我的。我们每天都在变老，世界也似乎注定会有一天变成我们不认识、也无力改变的样子，没有原因，没有目的。从混沌中来，还得回到混沌中去。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/174992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-01-13 16:58 <a href="http://www.blogjava.net/sean/archive/2008/01/13/174992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] Office 2003 Service Pack Disables Older File Formats</title><link>http://www.blogjava.net/sean/archive/2008/01/02/172311.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 02 Jan 2008 13:33:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/01/02/172311.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/172311.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/01/02/172311.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/172311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/172311.html</trackback:ping><description><![CDATA[
		<br />
		<a title="http://it.slashdot.org/article.pl?sid=08/01/01/137257" href="http://it.slashdot.org/article.pl?sid=08/01/01/137257">http://it.slashdot.org/article.pl?sid=08/01/01/137257</a>
		<br />(来自Slashdot社区的文章链接)<br /><br />M$ Office 2003 SP3将取消对一部分老Office文件格式的支持，官方的说法是这些文件格式不够安全。本来就是二进制格式的文件了，隔几年你就搞个新的不兼容的格式，这是要存用户的数据还是你的数据啊？逼(诱?)大家升级？<br /><br />我本人不用M$ Office，但我周围许多人在用，而且大都很热衷于尝试新的版本。我想问问还在继续使用M$ Office的朋友，如果10年后，你今天写下的文档，再无法用市面上找的到的工具打开，你还会继续放心的使用今天这个工具吗？<br /><br />如果工具有bug、不安全，那你就做个没bug、安全的工具，别老拿文件格式当幌子，这不是祸祸人么？<br /><br /><br />另一篇挺有趣的文章:<br /><a href="http://www.vanwensveen.nl/rants/microsoft/IhateMS.html">Why I hate Microsoft</a><br /><a title="Why I Hate Microsoft" href="http://www.vanwensveen.nl/rants/microsoft/IhateMS.html"><br /></a><br /><img src ="http://www.blogjava.net/sean/aggbug/172311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2008-01-02 21:33 <a href="http://www.blogjava.net/sean/archive/2008/01/02/172311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《Gloomy Sunday - Ein Lied von Liebe und Tod》 - 力荐</title><link>http://www.blogjava.net/sean/archive/2007/12/30/171732.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 30 Dec 2007 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/12/30/171732.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/171732.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/12/30/171732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/171732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/171732.html</trackback:ping><description><![CDATA[
		<br />"Gloomy Sunday"原本是一首钢琴曲的名字，"忧郁的星期天"，据说N多人听过之后选择了在这首曲子的陪伴下结束自己的生命。而今天要向大家推荐的，是一部由匈牙利、法国和德国联合拍摄的电影: 《Gloomy Sunday - Ein Lied von Liebe und Tod (忧郁星期天 - 爱与死之歌)》。故事有关爱情、自由、尊严，讲述的是二战大背景下发生在布达佩斯的一段凄美的故事，情节饱满、张驰有度，是一部近年来难得一见的佳作。<br /><br /><img src="http://lobelia.douban.com/mpic/s1326063.jpg" /><br /><br />影片一开始，映入大家眼帘的，是美丽的布达佩斯和流经这里的多瑙河：镜头从Budavári palota(城堡山)、Erzsébet híd(伊丽莎白桥)一直拍到Gellért hegy(<font size="-1"></font>盖雷尔特山)脚下的Szabadság híd(自由桥)，德国大使馆的车队正从这里经过。Szabó餐厅内的人们正在紧张的准备晚宴，今天他们的客人，是半个世纪以前，在布达佩斯从纳粹手下"解救"了上千名匈牙利犹太人的前德国军官Hans Wieck，今天是他80岁生日，带着他的妻子故地重游，重温当年的记忆。晚餐开始，插着80岁标签的肉卷上桌，Hans招呼一旁的小提琴手，让他表演那首名曲，也就是"Gloomy Sunday"，一桌人一边用餐一边欣赏着动听的音乐。这时Hans的目光集中到了摆放在钢琴上的一张黑白照片，照片上是一位端庄美丽的女人，似乎想起了什么，突然表情僵硬，倒在地板上猝死，故事由此展开。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/171732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-12-30 17:36 <a href="http://www.blogjava.net/sean/archive/2007/12/30/171732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hello, Gusty Gibbon!</title><link>http://www.blogjava.net/sean/archive/2007/12/22/169664.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 22 Dec 2007 15:57:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/12/22/169664.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/169664.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/12/22/169664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/169664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/169664.html</trackback:ping><description><![CDATA[
		<br />前段时间工作比较忙，想来Gusty Gibbon也已经出来2个月了，还没来得及好好把玩，这周终于有点时间和精力把它下载下来安装到本本上。<br /><br />这个版本用下来最直接的感受有两点：<br />1- 默认的中文字体支持更好了，一方面字体的处理更加协调一致，不像之前默认时经常中文字符一大一小的，默认采用英文字体时对中文的显示也做的不错。<br />2- Compiz和Beryl复和之后，成了Ubuntu新的标配，省得大家费力折腾从其他的apt源或者源码安装了。<br /><br />当然了，其他细微的改进还有很多，比如Pidgin、默认的ntfs-3g、keyring的处理、闭源的驱动和codecs等等。总的来说，Gusty Gibbon在Feisty Fawn基础上，更加成熟，也让我们对明年4月的Hardy Heron这个在6.06之后第二个LTS版本有了更多的期待。<br /><br />这里有一个截图，很多东东还没有装，基本上也没花太多时间去hack，感觉就已经挺漂亮，也挺好用的了，呵呵:<br /><img src="http://www.blogjava.net/images/blogjava_net/sean/screenshot_20071222.png" alt="screenshot_20071222.png" border="0" height="420" width="560" /><br /><br />BTW，AWN(Avant Window Navigator)已经确认会包含在明年8.04(Hardy Heron)默认的apt源中，这对AWN fans们，以及所有喜欢"eye candy"但又不愿花时间去折腾的朋友们来说，无疑是个好消息。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/169664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-12-22 23:57 <a href="http://www.blogjava.net/sean/archive/2007/12/22/169664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django: Up and Running</title><link>http://www.blogjava.net/sean/archive/2007/11/28/163589.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 27 Nov 2007 16:57:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/11/28/163589.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/163589.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/11/28/163589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/163589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/163589.html</trackback:ping><description><![CDATA[
		<br />算到现在，已经有将近半年没有写过技术文章了，手痒痒，于是拿Django来说事，希望最终的产出能够做成一个简短易懂的Django快速起步，让初次接触Django的朋友能够在最短的时间内了解Django的基本概念和结构。<br /><br />
Django是使用Python实现的一个基于MVC的web应用框架，类似Ruby世界的Ruby on
Rails。如果你是通过Google搜到这篇文章，那么说明你已经对Django有所耳闻，并且愿意了解更多Django相关的信息。我在这里就不多废
话Ruby vs Python或者Rails vs Django，直奔主题。<br /><br />
在写这篇文章时，最新的CPython版本为2.5.1，Django版本为0.96，如无特别说明，本文所有介绍和示例均以此环境为准。<br /><br />
0- 在开始之前，首先当然是安装一个基本能用的开发环境。<br /><br />
如果你的操作系统是Linux或者其他类Unix系统，很可能已经预装了Python，可以在命令行执行python -V查看Python版本。如果你是Windows操作系统，或者想尝试不同版本的Python，那么可以到<a href="http://www.python.org/" target="_blank">http://www.python.org/</a>下载相应的安装包进行安装。<br /><br />
有了Python以后，到<a href="http://www.djangoproject.com/" target="_blank">http://www.djangoproject.com/</a>下载Django，解压以后，cd到解压出来的目录，执行python setup.py install。<br /><br />
为了能够做出一个基本的多层web应用，还需要安装一个数据库，如果没有特别喜好和偏向，推荐PostgreSQL，可以在<a href="http://www.postgresql.org/" target="_blank">http://www.postgresql.org/</a>找到合适的版本下载和安装。<br /><br />
我们还缺少一个数据库驱动，在<a href="http://www.initd.org/pub/software/psycopg/" target="_blank">http://www.initd.org/pub/software/psycopg/</a>可以找到用于连接PostgreSQL的psycopg2，安装方法类似Django。<br /><br />
1- django-admin.py startproject<br /><br />
所有环境OK以后，我们开始动手把玩Django，首先找一个干净的目录，执行<br />
$ python django-admin.py startproject hello<br /><br />
上面这行命令会新建一个hello子目录，包含以下文件：<br />
__init.py__: 表示该目录存放Python程序<br />
manage.py: 提供Django项目相关的管理操作<br />
settings.py: 相当于该Django项目的全局设置<br />
urls.py: 用于配置URL映射，基本上就是通过正则表达式指定不同URL由相应的view方法相应<br /><br />
2- manage.py runserver<br /><br />
至此我们已经搭起了一个基本的Django项目框架，执行<br />
$ python manage.py runserver<br />
命令行会提示在8000端口运行一个开发用的web server，转到浏览器的<a href="http://localhost:8000/" target="_blank">http://localhost:8000/</a>即可看到It worked!的提示信息。你也可以指定端口号，方法是python manage.py runserver XXXX。<br /><br />
3- settings.py<br /><br />
接下来我们做一个完整的从model/数据库到view/template的例子。修改settings.py:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><span style="color: rgb(0, 0, 0);">DATABASE_ENGINE </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">postgresql_psycopg2</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />DATABASE_NAME </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">hello</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> Your db name</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">DATABASE_USER </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">postgres</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> Your db user</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">DATABASE_PASSWORD </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">********</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> Your db password</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">DATABASE_HOST </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">''</span><span style="color: rgb(0, 0, 0);"><br />DATABASE_PORT </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">''</span><span style="color: rgb(0, 0, 0);"><br /><br />INSTALLED_APPS </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.auth</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.contenttypes</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.sessions</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.sites</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">hello</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> Our new project</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">) </span></div><br />
4- models.py<br /><br />
新建models.py:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> datetime </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> datetime<br /></span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> django.db </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> models<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Book(models.Model):<br />    isbn        </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.SlugField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">)<br />    title       </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.CharField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">)<br />    author      </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.CharField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">)<br />    description </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.TextField(blank</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">True,null</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">True)<br />    published   </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.DateTimeField(default</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">datetime.now)<br /></span></div>这里我们从django.db.models.Model继承我们的model类Book，同时还用到了models中现成的字段类，如
SlugField、CharField、TextField、DateTimeField等。大家比较陌生的恐怕是SlugField，这个基本上类似
CharField，不过增加了其内容需要符合URL要求的限制条件。<br /><br />
执行下面的命令测试数据库脚本的生成:<br />
$ python manage.py sql hello<br />
应该看到如下输出结果:<br />
BEGIN;<br />
CREATE TABLE "hello_book" (<br />
"id" serial NOT NULL PRIMARY KEY,<br />
"isbn" varchar(20) NOT NULL,<br />
"title" varchar(200) NOT NULL,<br />
"author" varchar(200) NOT NULL,<br />
"description" text NULL,<br />
"published" timestamp with time zone NOT NULL<br />
);<br />
COMMIT;<br /><br />
确认无误后可以通过下面的命令提交到数据库:<br />
$ python manage.py syncdb<br />
其间会要求我们创建一个管理员账号，如果暂时不打算做admin页面，可以跳过。<br /><br />
5- views.py<br /><br />
model有了之后，接下来我们就可以开始画视图了。由于篇幅和时间有限，我仅简单介绍一下Django的template，然后实现一个最基本的图书清单页面。<br /><br />
首先定义图书清单的URL，在urls.py中:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> django.conf.urls.defaults </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"><br /><br />urlpatterns </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> patterns(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">hello.views</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    (r</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">^hello/books/$</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">book_list</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">),<br />)<br /></span></div>含义为hello/books/这个URI资源对应的相应view方法为hello.views.book_list。<br /><br />
新建templates目录，然后新建books.html:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">html  </span><span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">="http://www.w3.org/1999/xhtml"</span><span style="color: rgb(255, 0, 0);"> lang</span><span style="color: rgb(0, 0, 255);">="zh-cn"</span><span style="color: rgb(255, 0, 0);"> xml:lang</span><span style="color: rgb(0, 0, 255);">="zh-cn"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ title|escape }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">h2</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ title }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">h2</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">table </span><span style="color: rgb(255, 0, 0);">border</span><span style="color: rgb(0, 0, 255);">="1"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">ISBN</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">书名</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">作者</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">出版日期</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">th</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  {% for book in books %}<br />  </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ book.isbn }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ book.title }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ book.author }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">{{ book.published }}</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">td</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">tr</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />  {% endfor %}<br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">table</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div>Django模板的语法是{{}}表示引用，{%%}表示代码，使用起来也很直观，甚至支持UNIX风格的filter，如这里的{{ title|escape }}。<br /><br />
新建views.py:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> hello.models </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> django.shortcuts </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> render_to_response<br /><br /></span><span style="color: rgb(0, 0, 255);">def</span><span style="color: rgb(0, 0, 0);"> book_list(request):<br />    title </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Book List</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />    books </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> Book.objects.all()<br />    </span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);"> render_to_response(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">books.html</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, {</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> : title, </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">books</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> : books})<br /></span></div>最终页面上的内容，通过title和books两个参数传递给tempate(books.html)处理。<br /><br />
修改settings.py:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">TEMPLATE_DIRS </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/opt/PROJECTS/Django/hello/templates/</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />)</span></div>指定templates目录位置，注意需要使用绝对路径和'/'，无论是Unix还是Windows系统。<br /><br />
我们手工造一些数据之后，就可以通过<a href="http://localhost:8000/hello/books/" target="_blank">http://localhost:8000/hello/books/</a>访问我们用Django实现的这个简单页面了。<br /><br />
6- What's next<br /><br />
通过上面的简单介绍，相信哪怕是初次接触Django的朋友，也能够对Django有一个初步的认识。其实Django并不难学，并且随着学习的深入，你一定能发现更多的惊喜，不论是来自Django本身，还是Python及其庞大的第三方类库。<br /><br />
如果有时间，建议尝试一下Django的admin pages，即为我们的model提供自动化、网页化的增删改查操作。启用方法如下：<br /><br />
修改models.py (增加class Admin):<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> datetime </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> datetime<br /></span><span style="color: rgb(0, 0, 255);">from</span><span style="color: rgb(0, 0, 0);"> django.db </span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);"> models<br /><br /></span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Book(models.Model):<br />    isbn        </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.SlugField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">20</span><span style="color: rgb(0, 0, 0);">)<br />    title       </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.CharField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">)<br />    author      </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.CharField(maxlength</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">200</span><span style="color: rgb(0, 0, 0);">)<br />    description </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.TextField(blank</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">True,null</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">True)<br />    published   </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> models.DateTimeField(default</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">datetime.now)<br />    </span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> Admin:<br />        </span><span style="color: rgb(0, 0, 255);">pass</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br />
修改settings.py和urls.py，加入admin支持:<br />[settings.py]<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">INSTALLED_APPS </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.auth</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.contenttypes</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.sessions</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.sites</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.admin</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">hello</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />)</span></div>[urls.py]<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">urlpatterns </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> patterns(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">hello.views</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    (r</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">^hello/books/$</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">book_list</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">),<br />    (r</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">^hello/admin/</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, include(</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">django.contrib.admin.urls</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">)),<br />)<br /></span></div><br />Note:<br />
# 为了成功运行admin pages，需要首先执行python manage.py syncdb admin以创建django_admin_log表。<br />
# 如果前面跳过了创建管理员步骤，简单的方法可以删掉auth_user表，然后python manage.py syncdb重建。<br /><br />
按照我们urls.py的配置，admin pages可以通过<a href="http://localhost:8000/hello/admin/" target="_blank">http://localhost:8000/hello/admin/</a>访问。Enjoy!<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/163589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-11-28 00:57 <a href="http://www.blogjava.net/sean/archive/2007/11/28/163589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>是什么成就了费天王今天的辉煌</title><link>http://www.blogjava.net/sean/archive/2007/11/18/161475.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 18 Nov 2007 15:38:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/11/18/161475.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/161475.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/11/18/161475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/161475.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/161475.html</trackback:ping><description><![CDATA[
		<br />最近这段时间，Roger Federer这个名字，"出镜率"相当的高，尤其是在上海：先是地铁中铺天盖地的剃须产品广告(广告中出现的三位主角，恰好都是我喜欢和欣赏的)，其次当然就是大师杯。<br /><br />
2007上海网球大师杯最后两天的比赛多少让人有些意想不到：费天王的粉丝们当然很开心，费天王虽然首场比赛失利，但后面的每场比赛都展现着他的独有风
范，赢得干净漂亮；相对中立的球迷们可能就要抱怨比赛不够精彩和跌宕起伏了，原本被寄予厚望的巅峰对决：Federer和Nadal，以及最后的决赛，都
呈现出"一边倒"的态势，纳豆和今年大师杯的黑马Ferrer这两位西班牙选手，面对天王的出色发挥，都显得有些"找不着北"。<br /><br />
是什么成就了费天王今天的辉煌？技术层面的东西我不想说太多，除去网球这项运动本身的技术细节，Federer身上的一些冠军特质，也是值得我们好好品味：<br /><br />
首先，热爱自己从事的工作。Federer对网球的热爱，只要你看过他的比赛，就不会质疑。<br />
其次，尊重自己的工作/事业和对手。正是这种尊重，为费天王赢来所有人，包括手下败将在内的尊敬。<br />
再次，对胜利的渴望。看Federer的比赛，尤其是大赛，你能够明显感觉到他对胜利的渴望，每个关键球都透露出一种狠劲。<br />
再有，内敛和对自己情绪的控制。Federer刚出道时其实脾气很暴躁，发挥也不稳定，但是随着时间的推移，他身上逐渐成长出一种特有的内敛和自信。<br />
最后，超乎寻常的稳定和跑位。为什么看Federer打球总觉得他是那么"轻松"而"优雅"，而对手总是陷入被动？除了善于观察和控制对手之外，他总能保持超高的稳定性和预判，保证自己出球落点的同时，已经在为下一步回击做准备了，比赛起来，当然游刃有余。<br /><br />
Herzlichen Glückwunsch an Roger Federer!<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/161475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-11-18 23:38 <a href="http://www.blogjava.net/sean/archive/2007/11/18/161475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[记忆碎片] 手机、大假、加班、台风、母爱</title><link>http://www.blogjava.net/sean/archive/2007/10/08/151167.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 08 Oct 2007 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/10/08/151167.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/151167.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/10/08/151167.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/151167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/151167.html</trackback:ping><description><![CDATA[
		<br />V8来了，经不住诱惑，造型、做工、Linux核心......<br />
十一来了，不想出门，因为到处是人......<br />
Bug来了，操刀杀虫，一天不行两天，两天不行三天......<br />
罗莎来了，这个没有"正面袭击"上海的家伙，却比"正面袭击"上海的韦帕来得更加生猛......<br />
老妈来了，一起来的，还有蹄花，和家乡的味道......<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/151167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-10-08 21:51 <a href="http://www.blogjava.net/sean/archive/2007/10/08/151167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>魔兽世界第二部资料片Wrath of the Lich King正式宣布</title><link>http://www.blogjava.net/sean/archive/2007/08/04/134373.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 04 Aug 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/08/04/134373.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/134373.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/08/04/134373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/134373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/134373.html</trackback:ping><description><![CDATA[
		<br />
详见:<br /><a href="http://www.worldofwarcraft.com/wrath/" target="_blank">http://www.worldofwarcraft.com/wrath/</a><br /><br />回过头来看看魔兽世界中国大陆的代理商九城，到现在连第一部资料片The Burning Crusade还没有推出，唉。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/134373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-08-04 10:37 <a href="http://www.blogjava.net/sean/archive/2007/08/04/134373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 亨利加盟巴萨后首场比赛和首粒进球视频</title><link>http://www.blogjava.net/sean/archive/2007/07/28/132970.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 28 Jul 2007 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/07/28/132970.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/132970.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/07/28/132970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/132970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/132970.html</trackback:ping><description><![CDATA[
		<br />
巴萨与邓迪联的热身赛精彩回放:<br /><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/8Ljp2kwJv0g" /><param name="wmode" value="transparent" /><embed src="http://www.youtube.com/v/8Ljp2kwJv0g" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object><br /><a href="http://www.youtube.com/watch?v=8Ljp2kwJv0g" target="_blank">http://www.youtube.com/watch?v=8Ljp2kwJv0g</a><br /><br />
亨利点球绝杀:<br /><object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/P5gPeNdYYwc" /><param name="wmode" value="transparent" /><embed src="http://www.youtube.com/v/P5gPeNdYYwc" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object><br /><a href="http://www.youtube.com/watch?v=P5gPeNdYYwc" target="_blank">http://www.youtube.com/watch?v=P5gPeNdYYwc</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/132970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-07-28 13:19 <a href="http://www.blogjava.net/sean/archive/2007/07/28/132970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> An open letter by Thierry Henry</title><link>http://www.blogjava.net/sean/archive/2007/06/24/125982.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 24 Jun 2007 14:18:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/06/24/125982.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/125982.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/06/24/125982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/125982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/125982.html</trackback:ping><description><![CDATA[
		<br />
		<a href="http://www.thesun.co.uk/article/0,,2002390000-2007281078,00.html" target="_blank">http://www.thesun.co.uk/article/0,,2002390000-2007281078,00.html</a>
		<br />
		<br />
No more *free* EPL in mainland China + Henry leaves Arsenal for Barcelona, coincidence?<br /><br />
This seems to be another reason for me to embrace La Liga and FC
Barcelona. All my best wishes for Henry to start a new legend at Camp
Nou.<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/125982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-06-24 22:18 <a href="http://www.blogjava.net/sean/archive/2007/06/24/125982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> [Tips] When ANT is not enough, JRuby to the rescue!</title><link>http://www.blogjava.net/sean/archive/2007/06/18/124859.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 17 Jun 2007 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/06/18/124859.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/124859.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/06/18/124859.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/124859.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/124859.html</trackback:ping><description><![CDATA[
		<br />
随着项目越来越大，你的ANT脚本变得越来越臃肿，越来越依赖antcontrib来实现构建逻辑？不想放弃对构建过程和产出做精细的控制？恨不得自己写ANT Task？<br /><br />
等一等，在你考虑转向Maven或者真正卷起袖子开始研究ANT Task的API之前，先听我向你推荐Ruby/JRuby。相信我，也许这才是你真正需要的。<br /><br />
在我看来构建脚本最主要的要求是表达能力和控制能力，表达能力是我们应该能够很方便的告诉它我们要它做什么，而控制能力是我们告诉它如何去做，除了必要的
构建命令的参数、依赖关系之外，它应该能够理解我们其他一些特殊要求。在项目相对简单时，ANT的XML格式的"脚本语言"能够比较好的表达构建者的要
求，至少比纯Java的方式更加简单清晰，于是几乎从它诞生之日就成为Java领域当仁不让的头号构建工具。但是ANT也有它不够用的时候，尤其在控制能
力上，为了实现实际使用中越来越复杂越来越精细的对构建过程和产出的要求，ANT的使用者们开始对ANT进行扩展，最具影响力的"非官方"扩展可能就是
antcontrib了，很多实际Java项目的构建文件中我们都能够找到它的影子。但是一堆taskdef和<variable><substring><stringutil><length><math>之类的夹杂在ANT脚本里，怎么看怎么觉得别扭，也严重影响构建脚本的可读性。<br /><br />
我发现我需要的是一个具有完整功能脚本语言来写我的构建逻辑：一方面它要足够简单，我需要清晰的表达我的意图，另一方面当我需要的时候它要足够强大来帮我实现精细的控制。我自然而然想到Ruby。<br /><br />
由于Ruby是一个功能完整的工具，完全自己写Ruby脚本来调用Java自己的构建工具如javac、jar等等并非不可能，但是既然已经有人做了轮
子，我们拿来用就是了，大不了自己再改装一下，也少走些弯路。时下比较流行的解决方案有Buildr、Raven、Rant和Antwrap，它们各有特
点，大家可以根据需要进行选择。<br /><br />
我最终选了其中最"轻量"的Antwrap，原因嘛，我不想学新的API，我已经熟悉ANT常用的Task，而且我希望尽可能多的自己控制构建的过程和产
出。Antwrap最能够满足我的需要。而前不久JRuby刚刚发布了1.0版，这样一来Ruby和Java的跨界引用变得更加容易，Ruby的实现自然
就选择了JRuby。<br /><br />
安装JRuby和Antwrap相当容易，只要把下载的jruby-bin-1.0.tar.gz/.zip解压到本地，确保JAVA_HOME和
CLASSPATH的配置，然后gem install Antwrap (选择Java版)
即可。为了顺利加载Antwrap，需要在CLASSPATH中包含ANT的ant.jar和ant-launcher.jar。(当然，如果想更加方便
的share你的成果，可以把ant的文件拷贝到jruby目录下，在jruby的启动脚本加入必要的export/set命令，然后打包，这样别人只要
从你提供的zip包解压出来即可使用。)<br /><br />
为了给大家一个直观的感觉，举个简单的例子(貌似BlogJava没有提供对Ruby代码的默认支持，大家将就看吧)：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 128);"> 1</span> <span style="color: rgb(0, 0, 0);">require </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">rubygems</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">gem </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">Antwrap</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">require </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">antwrap</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">@ant</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">AntProject.</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">SampleAntwrapBuild</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, :basedir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">@cvsroot</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">:pserver:cvsuser:password@10.10.10.1/cvsrepo/SampleProduct</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">def cvscheckout<br /></span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">    @ant.cvs(<br /></span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">        :cvsroot</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{@cvsroot}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">        :command</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">checkout -A</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);">        :</span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">        :dest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">        :compressionlevel</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">def cvsupdate<br /></span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);">    @ant.cvs(<br /></span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">        :cvsroot</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{@cvsroot}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">        :command</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">update -A -d</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">        :</span><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">        :dest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">        :compressionlevel</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">9</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">def compile(project_name)<br /></span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">    @ant.javac(<br /></span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">        :srcdir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}/src</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">        :destdir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">        :target</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">1.5</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">        :encoding</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">GBK</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);">    @ant.copy(    :todir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">        fileset(:dir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}/src</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">            exclude(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">**/*.java</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">        end<br /></span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">    end<br /></span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">    @ant.jar(<br /></span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">        :destfile</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">build/#{project_name}.jar</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">        :basedir</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">cvsoriginal/#{project_name}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, <br /></span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">        :manifest</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">MANIFEST.MF</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);">        exclude(:name</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">src/**</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br /></span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">    end<br /></span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);"># to actually call your target<br /></span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ARGV.empty</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 0, 0);">    puts </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Usage: jruby #{$0} [target]</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 0, 0);">    eval ARGV[</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">]<br /></span><span style="color: rgb(0, 128, 128);">50</span> <span style="color: rgb(0, 0, 0);">end<br /></span><span style="color: rgb(0, 128, 128);">51</span> <span style="color: rgb(0, 0, 0);"></span></div><br /></math></length></stringutil></substring></variable>可以看到几乎都是我们熟悉的ANT Task，只是更加紧凑更加灵活，一旦掌握了最最基本的Ruby语法，用它写出功能强大的构建脚本可以说是分分钟搞定。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/124859.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-06-18 00:39 <a href="http://www.blogjava.net/sean/archive/2007/06/18/124859.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Ubuntu Feisty中修改nm-applet默认网络连接</title><link>http://www.blogjava.net/sean/archive/2007/05/13/117197.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 13 May 2007 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/05/13/117197.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/117197.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/05/13/117197.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/117197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/117197.html</trackback:ping><description><![CDATA[
		<br />
不知道大家注意到没有，Ubuntu Feisty自带的nm-applet有一个小毛病：一旦你通过它连上某个无线网络之后，不管你是不是点错了，或者说是不是真的需要保留这个连接的信息，它都会记录下这个网络ID，今后如果检测到这个网络，根据它自己排的优先级（最后一次成功连接，但有时候不准，或者说有可能在来回切换时不小心被弄乱），如果它排在前面，就会自动连上去，就算你手动选择另一个，它还是不依不饶的切回它认定的那一个。<br /><br />
遇到这个情况，我想许多朋友大概和我一样，在它提供的上下文菜单找，不过GNOME的界面哲学使得界面菜单直接提供的信息和高级功能很有限，或者到类似 /etc/*、~/.*/之类的地方找相关配置文件，但是实际上它也不是那么"传统"，因为nm-applet使用GConf来记录配置信息：<br /><br />
在命令行输入gconf-editor，打开GConf编辑器，定位到system -&gt; networking -&gt; wireless -&gt; networks，这个目录下记录了所有nm-applet使用的无线网络ID和相关配置信息，如果有不希望保留的配置，直接进到相关目录，右键逐个点击右面的key-value条目，Unset Key，完成以后就可以让nm-applet"忘掉"这个无线网络连接。当然，通过这个小工具，你也可以手工对某组具体的key-value做修改。<br /><br />
这件事也让我联想起Linus Torvalds不止一次（也包括不少KDE的死忠）对GNOME的微词：尽可能让用户自己掌控，还是尽可能帮用户拿主意？这是个问题。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/117197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-05-13 23:34 <a href="http://www.blogjava.net/sean/archive/2007/05/13/117197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>令人惊喜的Feisty，让人失望的Evolution</title><link>http://www.blogjava.net/sean/archive/2007/04/27/114214.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 27 Apr 2007 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/04/27/114214.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/114214.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/04/27/114214.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/114214.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/114214.html</trackback:ping><description><![CDATA[
		<br />
上个周末的时候安装了最新的Ubuntu Feisty Fawn，给用了很久的Dapper来了一次彻底升级。第一印象是眼前一亮，打开默认自带的Compiz，对用惯了传统桌面系统的用户而言，毫不夸张的说，是全新的桌面体验。<br /><br />
花了个把小时样子简单调整了更新源、中文输入法、字体、区域选项等等，还上了比Compiz更强的Beryl，开始全面试用。经过一周的使用，包括工作和其他应用，感觉确实比6.06进步不少，尤其在桌面方面，比较明显的改善有：<br /><br />
1- 默认就支持Compiz，同时安装Beryl也非常容易。<br />
2- Shell中敲命令，如果出现尚未安装的常见软件包，会提示安装信息。<br />
3- Gaim默认增加了QQ支持。<br />
4- 新的NetworkManager Applet 0.6.4使得无线连接管理变得简单、直观、而且相当方便。<br />
5- OpenOffice.org更加完善，对中文支持更加友好，尤其是在中文字体宽度计算上的问题得到了解决。<br /><br />
总的来说，已经足够胜任日常工作的需要，而且十分简单易用。当然了，有些遗憾的是默认的邮件客户端Evolution并不能让人满意：<br /><br />
我原本一直使用Thunderbird，这次想给Evolution一次机会表现一下，它却不那么争气。本以为Novell和MS的东西集成应该不错，但是除了对日历、会议邀请的支持还算是亮点之外，并没有发现什么过人之处，而对TNEF的支持就有点贻笑大方了，Thunderbird都能正确处理的Winmail.dat附件，在Evolution下基本就是一个字：挂，连另存然后外部tnef处理都无法搞定，因为出来的东西已经不是tnef格式，搞不懂Evolution为什么要做这一层额外的处理。<br /><br />
于是准备切回Thunderbird，更令人感到困惑的事情出现了：在Evolution下辛辛苦苦录入的联系人信息，居然无法导出一个简简单单的CSV，而只能是vCard。界面上没有其他选项，命令行倒是有一个导出工具可以指定--format=csv，不过很不幸，上来就是core dump，晕倒。本来简简单单的东西，何必复杂化。还好vCard本身还是文本，处理一下也不难，但感觉怪怪的，心中难免不爽，对Evolution和Novell的印象大打折扣。<br /><br />
顺便表扬一下SWT/Eclipse，在Ubuntu Feisty下跑起来真的是无缝，界面风格完全就是一个native的应用程序，开启Beryl效果之后，连Tooltip都跟着"炫"了起来，让人越看越喜欢，Evolution带来的不愉快也就自然而然抛在脑后了。<br /><br />
今天，你Feisty了吗？<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/114214.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-04-27 22:25 <a href="http://www.blogjava.net/sean/archive/2007/04/27/114214.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[愚公移山] 团队CVS资源库从CVSNT迁移到Linux</title><link>http://www.blogjava.net/sean/archive/2007/04/14/110640.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 14 Apr 2007 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/04/14/110640.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/110640.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/04/14/110640.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/110640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/110640.html</trackback:ping><description><![CDATA[
		<br />
昨天(周五)大家下班后，一个人留在公司，把核心产品开发团队使用了整整1年的CVS资源库从CVSNT移到了Linux平台下，原本以为会很简单很顺利，因为之前类似的移植并不是没有做过，所以预估的时间包括验证在内是1~2个小时，不过最终却花掉4个小时。怎么回事呢？且听我慢慢道来。<br /><br />
经过1年的积累，资源库有400多M，大大小小的Java项目有206个之多。按照最初的计划，移植只需要原封不动的把资源库目录整个从CVSNT服务器拷贝到Linux服务器即可，所以资源库大小和项目多少本来不是啥大问题，但谁料半路却杀出个程咬金：.jar文件在新的资源库checkout到本地后无法正常使用，这还了得？<br /><br />
仔细一看，乖乖，原本"Binary"的文件，在新的资源库下，却变成了"ASCII -kkv"，不仅是.jar，其他的二进制文件如.jpg, .exe之类的也是同样的问题。第一反应是CVSNT和Unix经典的CVS在处理RCS文件时还是有些不同，以至于原本在CVSNT下文件类别的标记信息如"Binary"在移植过程中丢失了，变成默认的文本类型。之前有朋友提醒的.doc文件移植后无法打开应该也是同样问题。怎么办？一个文件一个文件的改？肯定不现实。<br /><br />
一种方案是把所有出现的二进制文件类型/后缀名找出来，然后在服务器端批量删除(Linux下写个脚本来做这件事并不难)，客户端这边从原资源库checkout最新版本，重定向资源库URL到新的资源库，同步，提交。这招比较狠，但最终没有用，因为在浏览现有资源库时，发现还有不少其他问题，如classes文件夹被加到版本控制中，类似还有.settings文件夹，甚至Thumbs.db，不一而足。时间有限，与其每个Java项目去找一遍，整理出需要删除的文件(夹)清单，然后写脚本，然后强行资源库重定向，不如一步一个脚印把现有资源库的所有Java项目捋一遍，至少心里踏实。于是一狠心、一咬牙，有洁癖的我开始了漫长的"愚公移山"：一个项目接一个项目，遇到Binary文件，服务器删之，客户端checkout后从原来的地方拷贝过来，必要的地方加上.cvsignore，再添加提交。*<br /><br />
经过4个小时的努力，终于大功告成：自动编译脚本正确运行，构建成功，客户端IDE(Eclipse)从新的资源库checkout，编译通过，没有红叉。<br /><br />
后记：自己认为计划得再好的事情，真正去做的时候，总还是会遇到这样那样的问题和意想不到的状况，这件事也告诉我自己其实我的前期准备远不够充分，算是自食其果吧。有没有更好的办法，我觉得肯定有，但是在特定的情况下(时间/效率/目标)，我相信我的方法还是能够让我自己满意的。还有一点提醒所有CVS的用户，不该提交的文件，最好第一时间加到.cvsignore。子曾经曰过：“纠正错误，时间最早，代价越小”。<br /><br />
* <em>请勿不假思索的模仿，这样做会丢失掉这些文件的历史版本信息，如果删除的时候不小心，同时还会把历史上存在过的同类型文件删掉。我这里之所以可以这么做，是因为我们的实际情况对这些二进制文件不需要保留历史信息。</em><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/110640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-04-14 14:54 <a href="http://www.blogjava.net/sean/archive/2007/04/14/110640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>刚才见面，就说再见: 小记Subversion试用心得</title><link>http://www.blogjava.net/sean/archive/2007/03/14/103899.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 14 Mar 2007 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/03/14/103899.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/103899.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/03/14/103899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/103899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/103899.html</trackback:ping><description><![CDATA[<br />
由于工作需要，最近在Linux服务器上试用Subversion，如果一切顺利，全公司的文档都将交给Subversion管理。我承认我对Subversion一直存在偏见，但为了给大家一个交代，还是硬着头皮小试了一下。结果运行数天以后，终于还是回到了CVS的老路上。<br />
<br />
Subversion的优点就不在这里重复了，网上很多介绍文章，也有很多忠实粉丝，不过没办法，我还是更喜欢CVS的简单和直接。熟悉Unix和类Unix系统的朋友一定有同感，CVS更加符合Unix的思维和解决问题的方式。<br />
让我们最终放弃Subversion主要有以下大大小小的原因：<br />
1- 一个新建的几乎是空的资源库，打包后大小即有39MB上下; << 经核实错怪SVN了，实测完全空白的资源库124K，向大家道歉！<br />
2- 资源库几乎是以一种完全不透明的方式存储用户资源库文件;<br />
3- 没有一个官方的、安全可靠的方式彻底删除一个误提交的文件，一旦提交上去，你的资源库将永远背着这个包袱; &lt;&lt; 这一条实在让我无法忍受。<br />
<br />
对于最后一条，官方说法是提供了一个svndumpfilter的方式，先把资源库dump出来，然后pipe到svndumpfilter过滤掉匹配的文件，最后再load回去。这几乎就是给我们判了死刑：dump文件动辄就会是好几个G，且随着时间增长，或者错误提交持续出现在超大型文件上，要完成这个dump和filter，以及周期性的备份，将要吃掉多少资源，不敢想象；svndumpfilter不支持wildcast，且这个字符串匹配由于是整个dump文件pipe到svndumpfilter，无法保证精确制导，尤其在生产环境，敏感文件被上传、有效文件被误删或者资源库遭到破坏的后果是很严重滴。<br />
<br /><br /><img src ="http://www.blogjava.net/sean/aggbug/103899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-03-14 23:07 <a href="http://www.blogjava.net/sean/archive/2007/03/14/103899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 无意中发现一个互联网上共享文件的好地方</title><link>http://www.blogjava.net/sean/archive/2007/02/24/100436.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 23 Feb 2007 18:36:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/24/100436.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/100436.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/24/100436.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/100436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/100436.html</trackback:ping><description><![CDATA[<br />
<a href="http://www.ohshare.com/" target="_blank">http://www.ohshare.com/</a><br />
<br />
文件大小限制在80M，没什么特别的要求，直接上传即可，据称超过30天没有下载的文件可能被删除，不过对于一般性的临时网络硬盘使用，已经足够了。<br />
<br />
我试用了一下，速度还可以，大家可以试试下面这个下载链接：<br />
<br />
<a href="http://dl8.ohshare.com/d/9417066/1172241028/ruby_1.8.5_p12.tar.gz" target="_blank">http://dl8.ohshare.com/d/9417066/1172241028/ruby_1.8.5_p12.tar.gz</a><br />
<br /><br />
<img src ="http://www.blogjava.net/sean/aggbug/100436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-24 02:36 <a href="http://www.blogjava.net/sean/archive/2007/02/24/100436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[阅读] 丰田模式在新时代的挑战</title><link>http://www.blogjava.net/sean/archive/2007/02/16/100068.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 16 Feb 2007 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/16/100068.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/100068.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/16/100068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/100068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/100068.html</trackback:ping><description><![CDATA[<br />
<a href="http://www.nytimes.com/2007/02/15/business/worldbusiness/15toyota.html" target="_blank">http://www.nytimes.com/2007/02/15/business/worldbusiness/15toyota.html</a><br />
<br />
来自纽约时报的文章: &quot;The &lsquo;Toyota Way&rsquo; Is Translated for a New Generation of Foreign Managers&quot;。在丰田全球扩张的过程中，在全球各地都建立了分支机构和生产工厂，雇佣了大量当地的工人和管理人员，如何将丰田多年积累的所谓&ldquo;丰田模式&rdquo;贯彻到所有海外工厂的日常管理，成为了一项颇具挑战的工作。<br />
<br />
丰田模式，如果我的理解没有错，其最核心最基本的概念是&ldquo;集体思考&rdquo;，强调可视性和持续改进。展开来说，比较有趣的几点：<br />
1- 问题是大家共同的，有问题大家一起解决。<br />
2- 在出现问题的现场解决问题而不是在办公桌。<br />
3- 任何人都可以指手画脚，发现质量问题，工人有权直接停掉生产线。<br />
4- 持续发现问题并解决。<br />
5- 建立共识。<br />
6- 对人，尤其是一线工人的尊重。<br />
7- 危机意识。<br />
<br />
&ldquo;丰田模式&rdquo;有很多概念来自日本本土文化，并不能简单的复制。如今很多生产企业已经在活学活用丰田模式，把适用的部分应用到日常的开发工作中。那么对于软件开发的企业和团队，有什么可以借鉴的经验？<br />
<br />
对于一个团队的软件产品或者项目组产出的代码/文档等提交件，首先是共同拥有，功劳是大家的，出现的问题也是大家的；其次是大家需要一个很方便很直接的途径看到团队的目标和当前的问题；对于发现的问题，团队任何人都有权指手画脚，甚至叫停整个开发来解决这些问题。<br />
<br />
只有共同拥有和担当，才能最大化团队所有人的责任感和成就感；只有大家都清楚的看到共同的目标，看到需要面对的困难和问题，才能有目的的工作；当有人发现团队出现问题，遇到困难，必须有一个合理的途径报告和解决。并且一个团队应该有这种鼓励和包容&ldquo;指手画脚&rdquo;的文化，鼓励大家发现问题，持续改进。<br />
<br />
这里面可能最难被接受的一点就是任何人都可以对发现的问题指手画脚并不惜停掉整个开发。这一开始看上去有些过激，但是细想起来则很有深意：叫停的权力带来的最直接的好处是最终产品和提交件的质量，可能有不少人认为软件质量并没有那么严重，或者觉得为了一点点质量问题影响整个进度不值得，但是叫停的权力的真正威力来自它隐含的东西。当所有人都明白质量的重要性，也都明白一旦停产，带来的严重后果就是整个进度的delay，整个团队的效率和产出都会受到牵连，大家就会很小心的遵守开发的规范，大家对待自己的产出也更加有责任感，让&ldquo;坏分子&rdquo;和&ldquo;懒惰&rdquo;无处容身。一旦叫停的权力成为团队文化的一部分，团队也就自然而然走上了持续改进的道路。<br />
<br/>
<br/><img src ="http://www.blogjava.net/sean/aggbug/100068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-16 17:39 <a href="http://www.blogjava.net/sean/archive/2007/02/16/100068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[公告] 本blog已正式在JavaEye开通分号</title><link>http://www.blogjava.net/sean/archive/2007/02/10/99123.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 10 Feb 2007 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/10/99123.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/99123.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/10/99123.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/99123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/99123.html</trackback:ping><description><![CDATA[
		<br />
自从笔者在BlogJava开blog以来，承蒙大家的支持和鼓励，两年的时间内随笔已经接近400篇，当然也要感谢dudu为大家无偿的提供了包括博客园在内的人气blog空间。<br /><br />
为了更好的服务于我的读者，与更多热爱Java热爱技术的朋友分享我的心得体会、交流经验，我已在JavaEye开通分号，从现在起，我的这两个blog将同步更新。欢迎大家bookmark我的新地址：<a href="http://readsean.javaeye.com/">http://readsean.javaeye.com/</a>[<a href="http://readsean.javaeye.com/blog/rss_blog/sean_gao">rss</a>]。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/99123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-10 13:19 <a href="http://www.blogjava.net/sean/archive/2007/02/10/99123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[阅读] As the world warms</title><link>http://www.blogjava.net/sean/archive/2007/02/06/98450.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 06 Feb 2007 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/06/98450.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/98450.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/06/98450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/98450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/98450.html</trackback:ping><description><![CDATA[<br/>
春节快到了，现在按农历应该是六九吧？可这哪像是冬天？上海昨天白天气温竟高达21摄氏度，甚至有报道说今天达到了历史性的23度！近两年我们时不时就能看到世界各地越来越多的出现反常的天气状况的报道，这究竟是不是全球气候变暖在作祟，科学家们目前似乎还并不能给出一个一致的肯定或否定的答案。但我觉得，如果硬要说这个天气纯属自然规律，和人类活动一点关系都没有，多少有些牵强，至少有点不负责任。来看News.com提供的一组图片（含文字说明）：<br/>
<br/>
<a href="http://news.com.com/2300-11395_3-6156279-1.html" target="_blank">http://news.com.com/2300-11395_3-6156279-1.html</a><br/>
<br/>
其中第五张是NASA航拍的马尔代夫群岛（拍的真漂亮），平均海拔在1米左右，如果真如部分科学家预言的那样，本世纪海平面上升7~23英寸（1英寸约合25.4毫米），这样一个美丽的旅游度假胜地会变成什么样子？（按照预期，2400年海平面平均将上升1米。）<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/98450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-06 23:48 <a href="http://www.blogjava.net/sean/archive/2007/02/06/98450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[一点一滴学英语] 20070202</title><link>http://www.blogjava.net/sean/archive/2007/02/02/97695.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 02 Feb 2007 15:30:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/02/97695.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/97695.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/02/97695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/97695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/97695.html</trackback:ping><description><![CDATA[<br/>
"The truth is more important than the facts."<br/>
 - Frank Lloyd Wright<br/>
<br/>
Frank Lloyd Wright是美国著名的建筑大师，坐落于曼哈顿的纽约古根海姆博物馆即是出自Wright之手。这句话说的是：真理比事实更加重要，你可以罗列出一大推甚至无数的事实，但不管这些事实有多少，也比不上一个朴实无华的真理来得更有价值。这有点像我们现在面临的信息爆炸，不管这些信息是否都是事实，如果无法从海量的信息中得到有价值的部分，不论信息获取多么便捷简单，也没什么用。或者再换个例子，我们很多企业级的应用中每天都在产生记录企业活动的数据，如果没有一个强大的BI (Business Intelligence)对这些数据进行分析和挖掘，这些数据可能永远都是一堆0和1，无人问津，最后被所有人遗忘。<br/>
<br/>
<img border="none" src="http://www.guggenheim.org/images/the_building_1.jpg"/><br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/97695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-02 23:30 <a href="http://www.blogjava.net/sean/archive/2007/02/02/97695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我可以谦卑而虚心，但我不能什么都不说。</title><link>http://www.blogjava.net/sean/archive/2007/02/02/97396.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 01 Feb 2007 17:13:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/02/97396.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/97396.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/02/97396.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/97396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/97396.html</trackback:ping><description><![CDATA[<br/>
几乎每次下班回家，都能在轨道交通站台的广告牌上看到这一句出自姚明的话，以至于不用费心回想便可以脱口而出。我不喜欢篮球，也不是姚明的"粉丝"，但我对这句话印象十分深刻。我想我之所以能够如此清晰的记住这句话，还有更深层次的原因，那就是这句话引起了我内心的共鸣。<br/>
<br/>
有人说我是一个自视甚高、自命不凡的人，对待他人也是冷漠多过热情。不知道这个能不能和"不合群"划等号，但确实反映了我个性的一个方面。我追求完美，喜欢条理，希望得到认可，注重实际，对自己高标准严要求，对别人也有很高的期望。我自己并没有觉得什么不对，可能有时候有些锋芒毕露、吹毛求疵吧，别人并不一定能够接受。说真的，夹起尾巴做人也许被很多人奉为职场上需要恪守的原则，我也可以低调再低调，但是我认为该说的、该做的，我也会去说、去做。我曾经尝试退缩，尝试回避一些表达自己想法和不满的念头，但最终不但没有收到任何积极的效果，反倒是让我后悔没有第一时间说出来。<br/>
<br/>
我喜欢什么事大家都挑明了说，如果谁觉得我有什么地方做得不好，可以提出来，我虚心接受，有则改之无则加勉；同样，我认为谁有什么地方值得改进，我也希望可以向他/她提出，而不必担心被他/她误解或者造成不必要的不愉快。有人提意见，至少代表他/她还care，如果有一天，大家都不提意见了，也就意味着大家对别人，对周围发生的事不再care，别人怎样，对他/她已经没有所谓。如果这个"别人"和这个"周围发生的事"和一个团队有关，那么也就意味着这个团队出现了沟通和信任上的危机，至少是失去了本可以更加健康发展的动力。<br/>
<br/>
我可以谦卑而虚心，但我不能什么都不说。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/97396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-02 01:13 <a href="http://www.blogjava.net/sean/archive/2007/02/02/97396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] CVSNT到Linux平台的资源库无障碍迁移</title><link>http://www.blogjava.net/sean/archive/2007/02/02/97394.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 01 Feb 2007 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/02/97394.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/97394.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/02/97394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/97394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/97394.html</trackback:ping><description><![CDATA[<br/>
一直误以为CVSNT和Linux下的CVS不兼容，至少没那么"无缝"，事实证明一切真的很简单，以下就是从CVSNT迁出一个资源库到Ubuntu下的全部步骤：<br/>
<br/>
1- 通过Samba或者其他方式将CVSNT资源库整个目录，包括CVSROOT子目录，拷贝到Ubuntu文件系统中，chown，chmod。<br/>
2- 在Ubuntu下编辑/etc/xinetd.d/cvspserver，在cvsargs增加--allow-root [YOUR CVS PATH]，每一个资源库均写在这里，以空格分隔。<br/>
3- 命令行执行sudo /etc/init.d/xinetd restart。<br/>
<br/>
迁移后的资源库即可使用了，包括历史修订记录、标签等等信息均完整保留，并不要求新的资源库用户和老资源库用户一致。这就是CVS值得我们叫好的地方，一切都那么简单、直接、好用。可能需要注意一下的是encoding，如果两边的encoding不一致，而文件名或目录名出现非ASCII字符的话，可能出现无法同步或者部分文件丢失的现象，文件内容出现非ASCII字符则不影响。<br/>
<br/>
See Also: <a href="http://www.blogjava.net/sean/archive/2006/09/17/70145.html" target="_blank">[Tips] 在Ubuntu Linux 6.06 LTS (Dapper Drake)上安装CVS服务</a><br/>
<br/>
<br/>

<img src ="http://www.blogjava.net/sean/aggbug/97394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sean/" target="_blank">大胃</a> 2007-02-02 00:24 <a href="http://www.blogjava.net/sean/archive/2007/02/02/97394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>