﻿<?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-随笔分类-Other Languages</title><link>http://www.blogjava.net/sean/category/18648.html</link><description>Read me, read Sean.</description><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 22:10:47 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 22:10:47 GMT</pubDate><ttl>60</ttl><item><title>[新闻] JRuby 1.1.2 发布</title><link>http://www.blogjava.net/sean/archive/2008/05/28/203452.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 28 May 2008 04:08:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/05/28/203452.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/203452.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/05/28/203452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/203452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/203452.html</trackback:ping><description><![CDATA[
		<br />JVM下的Ruby语言实现JRuby发布1.1版的第二个升级版1.1.2，这个版本最主要关注的仍然是性能，值得一提的包括：<br />
1- 启动时间大大缩短。<br />
2- YAML标记解析速度提高100x以上。<br />
3- 方法调用在性能、线程和栈深度等方面的增强。<br />4- 其他bug。<br /><br />主页: <a target="_blank" title="http://jruby.codehaus.org/" href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a><br />下载: <a target="_blank" title="http://dist.codehaus.org/jruby/" href="http://dist.codehaus.org/jruby/">http://dist.codehaus.org/jruby/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/203452.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-28 12:08 <a href="http://www.blogjava.net/sean/archive/2008/05/28/203452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] JRuby 1.1发布</title><link>http://www.blogjava.net/sean/archive/2008/04/05/190985.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 05 Apr 2008 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/04/05/190985.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/190985.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/04/05/190985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/190985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/190985.html</trackback:ping><description><![CDATA[
		<br />JVM下的Ruby语言实现JRuby正式发布1.1版，这个版本最主要关注的是性能，除此之外，值得一提的包括：<br />1- 支持将Ruby代码编译成Java Bytecode。<br />2- 将Oniguruma这个Ruby 1.9标配的正则库移植到Java。<br />3- 重构过的IO实现。<br />4- 更低的内存消耗。<br />5- 修复大量其他兼容性问题。<br /><br />主页: <a target="_blank" title="http://jruby.codehaus.org/" href="http://jruby.codehaus.org/">http://jruby.codehaus.org/</a><br />下载: <a target="_blank" title="http://dist.codehaus.org/jruby/" href="http://dist.codehaus.org/jruby/">http://dist.codehaus.org/jruby/</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/190985.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-04-05 23:01 <a href="http://www.blogjava.net/sean/archive/2008/04/05/190985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 移植Oracle数据库到PostgreSQL的要点</title><link>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 11 Mar 2008 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/11/185510.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/185510.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/185510.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/185510.html</trackback:ping><description><![CDATA[
		<br />最近尝试把一个Oracle数据库，连同构建在这个数据库上的Java应用移植到PostgreSQL环境。在移植过程中，总结了一些要点，一方面作为笔记备忘，一方面也给有类似任务需要处理而又无从下手的朋友作为参考。<br /><br />1- 首先是准备PostgreSQL环境。有条件的话，最好是找一台空闲的PC机作为测试服务器，安装Linux或BSD，然后从源码编译最新的PostgreSQL 8.3.0。编译时，通过configure指定--with-perl和--with-python以支持PL/Perl和PL/Python。因为绝大多数Linux发行版都已自带Perl和Python，不必额外安装。<br /><br />2- 如果是Windows环境，又需要Perl和Python，则必须额外安装，Python的话，可以方便的找到2.5 for Windows的安装包，Perl的话，推荐ActivePerl，相对麻烦一点，为了后面用到的一些便利的功能顺利加载，Perl版本尽量选5.8.8。<br /><br />3- 创建数据库和用户。通过initdb初始化数据目录，配置postgresql.conf指定主机IP、端口等等信息，配置pg_hba.conf指定访问权限，通过pg_ctl -D &lt;数据目录&gt; -l &lt;日志文件&gt; start启动postmaster，然后createdb、createuser创建数据库和用户。数据库建好之后，就可以createlang -d &lt;数据库名&gt; [plperl|plperlu|plpython|plpythonu]开启PL/Perl和PL/Python。具体命令行参数可通过各命令加--help查看。<br /><br />4- 安装PostgreSQL客户端pgAdminIII，最新版是1.8.2，有条件的话，也可以下载源码自己编译。<br /><br />5- 安装Oracle客户端，需要在PostgreSQL同一台机器，以便Perl用于连接数据库的DBI和Oracle驱动DBD::Oracle模块顺利安装。如果是Windows上的ActivePerl，则可以通过ppm install DBD-Oracle，如果是Linux/BSD，则可以通过CPAN来安装，如perl -MCPAN -e shell进入CPAN Shell，通过install &lt;模块名&gt;或force install &lt;模块名&gt;安装DBI和DBD::Oracle。<br /><br />6- 数据库的移植，可以选择ora2pg来帮忙，目前的版本是4.7。ora2pg是一个用于读取Oracle数据库schema、数据，并生成PostgreSQL脚本或直接导入PostgreSQL数据库的Perl工具。用法很简单，就是通过.conf文件指定数据库连接信息包括NLS_LANG、需要导出导入的schema、table、view、data等等，然后执行一个pl脚本。这是目前相对比较成熟的一个方案，但是遇到schema复杂、约束较强的数据库，需要手工处理的地方还是不少。建议不要直接写入PostgreSQL，而是生成SQL脚本，验证无误后再执行。ora2pg默认会把Oracle中名称的大写转换成小写，因为PostgreSQL在解析SQL时，除非""括起来，默认都是转成小写。schema、table、view、sequence、data等等，基本用ora2pg，加上一些手工调整即可搞定。至于function、stored procedure等，还是手工移吧，偷不得懒。除了ora2pg，其实也可以配置DBI-Link，将Oracle数据库挂到PostgreSQL数据库作为一组独立的"schema"，然后用create table xxx as select ... from ...这样的语法来倒表和数据。PostgreSQL的contrib包也附带有一个dblink，不过是连接其他PostgreSQL数据库的，如果需要连接非PostgreSQL，
还是考虑DBI-Link，任何可以通过Perl的DBI接口访问的数据库，都能link进PostgreSQL。<br /><br />7- 接下来就是Java应用本身了，我这次移的这个应用是Spring+iBatis架构的，很多SQL语句都是明文，好在DAO层的基础部分(CRUD)的SQLMap是工具自动生成，且都是符合ANSI SQL92标准的，不需要修改即可使用。其余的高级查询SQL，需要调整的地方不少，一些常见的修改列举如下：<br /><br />i. SELECT出来的column（包括子查询），如果有别名，必须加AS，比如 select null as some_column from some_table;<br />ii. PostgreSQL没有dual表，类似select 0 from dual的语句，写成select 0即可;<br />iii. DECODE函数需要重构成(case when some_column = 'some_value' then 'some_other_value' when ... then ... else 'some_default_value' end ) as some_column;<br />iv. NVL()函数，PostgreSQL中相对应的是coalesce()，其实几乎所有主流DBMS都支持coalesce，包括Oracle，这才是标准写法;<br />v. 比较日期，在PostgreSQL中，建议使用date_trunc('day', SOME_DATE) = date_trunc('day', #enteredDate#)这样的写法，其中'day'位置可选字段包括有year、month、week、hour、minute、second等等;<br />vi. SYSDATE，对应到PostgreSQL是current_timestamp，可以根据需要使用current_date;<br />vii. ROWNUM，通常我们用ROWNUM都是为了限制查询出来的记录数，PostgreSQL没有这个关键字，需要改成在SELECT语句最后添加 LIMIT语句，如LIMIT 100;<br />viii. (+)这样的外连接写法需要调整为SQL标准的 table1 [LEFT|RIGHT|FULL] OUTER JOIN table2 ON (...);<br />ix. CONNECT BY ... START WITH ... 递归查询可以参考 http: //www.postgresql.org/docs/8.3/static/tablefunc.html 的connectby()函数.<br /><br />最后再多提一点，PostgreSQL自带的过程语言是PL/pgSQL，在PostgreSQL上写function，除了用plpqsql，还支持sql、plperl(u)、plpython(u)等等。如果你对SQL天生过敏，看类似PL/pgSQL的代码都很吃力，别说是写了，你完全可以用你喜欢的语言来表达函数和存储过程的逻辑。有了PL/Python，你还怕什么呢？你几乎能做任何事。<br /><br />[更新 20080313] 把JDBC驱动的部分漏掉了，移植Java应用时，除了改SQL，还需要拿PostgreSQL的JDBC驱动放到classpath下面，如WEB-INF/lib，然后修改数据库连接URL，改成jdbc:postgresql://&lt;ip&gt;:&lt;port&gt;/&lt;dbname&gt;即可。<br /><br />[更新 20080323] 移植schema和数据时，比ora2pg更方便的一种方式是利用EnterpriseDB的Migration Tool，将Oracle的JDBC驱动ojdbc14.jar拷贝到EnterpriseDB安装路径下的jre/lib/ext下后，启动Developer Studio即可建立Oracle连接，选中schema后，可以通过右键Online Migration将schema、数据、函数包等等一次性通通导入EnterpriseDB。如果要继续往"纯"PostgreSQL移，从EDB做backup，然后到PostgreSQL下做restore，这样会丢掉函数包，因为毕竟EDB在PostgreSQL基础上做了相当改造以和Oracle兼容，不过函数包之类还是手工移比较稳妥。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/185510.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-11 23:04 <a href="http://www.blogjava.net/sean/archive/2008/03/11/185510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Sun Hires Python Experts</title><link>http://www.blogjava.net/sean/archive/2008/03/05/183819.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Tue, 04 Mar 2008 16:07:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/03/05/183819.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/183819.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/03/05/183819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/183819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/183819.html</trackback:ping><description><![CDATA[
		<br />在JRuby得到Sun的认可并成功发布1.0，已经向1.1迈进之时，比Ruby应用更广、更早出现JVM运行版本的Python也终于得到了Sun的重视：<br /><br /><a target="_blank" title="http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/" href="http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/">http://www.eweek.com/c/a/Application-Development/Sun-Hires-Python-Experts/</a><br /><br />尽管Sun官方的说法是他们会更多的应用和扶持native版的Python，相信一直饱受冷落的Jython，也多少会从中受益吧。<br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/183819.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 00:07 <a href="http://www.blogjava.net/sean/archive/2008/03/05/183819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Grails正式发布1.0版</title><link>http://www.blogjava.net/sean/archive/2008/02/07/179425.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 07 Feb 2008 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2008/02/07/179425.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/179425.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2008/02/07/179425.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/179425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/179425.html</trackback:ping><description><![CDATA[
		<br />春节期间真是好事不断啊，继<a target="_blank" title="http://www.blogjava.net/sean/archive/2008/02/07/179424.html" href="/sean/archive/2008/02/07/179424.html">PostgreSQL 8.3正式release</a>后，Grails也如约发布1.0版。作为受到Ruby on Rails启发开动的"Groovy版Rails"项目，它在设计哲学上和Rails，包括JRuby版的Rails，有着很大的不同，Rails是从头开始用Ruby完整实现从表现层到ORM所有功能，而Grails则是利用Java社区现有的成熟开源框架，如Spring、Hibernate等，在此基础上整合出一套完整的Web应用框架，有点类似Pylons和Django的区别。<br /><br />我<a target="_blank" title="http://www.blogjava.net/sean/archive/2008/01/27/178036.html" href="/sean/archive/2008/01/27/178036.html">之前一篇随笔</a>也提到过，和其它在JVM中运行的动态语言如Jython、JRuby不同的是，Groovy对于有Java基础的人们来说，学习曲线几乎是平的，上手很快，如果你同时也熟悉Spring和Hibernate等，那么Grails更是不二之选。<br /><br />官网: <a target="_blank" title="http://grails.codehaus.org/" href="http://grails.codehaus.org/">http://grails.codehaus.org/</a><br />Release Notes: <a target="_blank" title="http://grails.org/1.0+Release+Notes" href="http://grails.org/1.0+Release+Notes">http://grails.org/1.0+Release+Notes</a><br />下载: <a target="_blank" title="http://grails.codehaus.org/Download" href="http://grails.codehaus.org/Download">http://grails.codehaus.org/Download</a><br /><br /><br /><img src ="http://www.blogjava.net/sean/aggbug/179425.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:47 <a href="http://www.blogjava.net/sean/archive/2008/02/07/179425.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>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> [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>[阅读] JRuby, Groovy, and Swing</title><link>http://www.blogjava.net/sean/archive/2007/02/21/100322.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 21 Feb 2007 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/21/100322.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/100322.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/21/100322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/100322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/100322.html</trackback:ping><description><![CDATA[<br />
以下是一组相互关联、按时间先后排列的3篇blog文章，主要探讨是Swing存在的问题以及动态语言如JRuby/Groovy能否帮我们解决Swing的问题：<br />
<br />
<a href="http://rawblock.blogspot.com/2007/02/jruby-can-save-swing.html" target="_blank">JRuby can save Swing</a><br />
<a href="http://pinderkent.blogsavy.com/archives/53" target="_blank">JRuby cannot save Swing</a><br />
<a href="http://shemnon.com/speling/2007/02/groovy-can-save-swing.html" target="_blank">Groovy can save Swing</a><br />
<br />
挺有趣的，推荐大家有空读一读。<br />
<br /><br />
<img src ="http://www.blogjava.net/sean/aggbug/100322.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-21 20:03 <a href="http://www.blogjava.net/sean/archive/2007/02/21/100322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] 不同版本的Ruby实现的非官方性能测试</title><link>http://www.blogjava.net/sean/archive/2007/02/19/100208.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 19 Feb 2007 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/19/100208.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/100208.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/19/100208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/100208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/100208.html</trackback:ping><description><![CDATA[<br />
原文链接: [<a href="http://www.antoniocangiano.com/articles/2007/02/19/ruby-implementations-shootout-ruby-vs-yarv-vs-jruby-vs-gardens-point-ruby-net-vs-rubinius-vs-cardinal" target="_blank">URL</a>]<br />
<br />
Antonio Cangiano刚刚在他的blog发布了他在AMD Athlon 64 3500+, 1GB RAM的机器上做的目前常见的Ruby实现的非官方评测，包括<br />
<ul>
    <li>Ruby 1.8.5-p12 stable on Linux</li>
    <li>Ruby 1.8.5-p12 stable on Windows Vista</li>
    <li>Ruby 1.9 (Yarv) on Linux</li>
    <li>JRuby on Linux</li>
    <li>Rubinius on Linux</li>
    <li>Cardinal on Linux</li>
    <li>Gardens Point Ruby .NET on Windows Vista</li>
</ul>
几张有趣的报表：<br />
<br />
<a href="http://www.antoniocangiano.com/files/rubyvms_in_seconds.png" target="_blank">http://www.antoniocangiano.com/files/rubyvms_in_seconds.png</a><br />
<a href="http://www.antoniocangiano.com/files/average_and_median.png" target="_blank">http://www.antoniocangiano.com/files/average_and_median.png</a><br />
<a href="http://www.antoniocangiano.com/files/rubyvms_times.png" target="_blank">http://www.antoniocangiano.com/files/rubyvms_times.png</a><br />
<br /><br /><img src ="http://www.blogjava.net/sean/aggbug/100208.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-19 17:57 <a href="http://www.blogjava.net/sean/archive/2007/02/19/100208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] Top 10 Ruby on Rails performance tips</title><link>http://www.blogjava.net/sean/archive/2007/02/11/99236.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sun, 11 Feb 2007 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/11/99236.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/99236.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/11/99236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/99236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/99236.html</trackback:ping><description><![CDATA[<br />
<a href="http://www.antoniocangiano.com/articles/2007/02/10/top-10-ruby-on-rails-performance-tips" target="_blank">http://www.antoniocangiano.com/articles/2007/02/10/top-10-ruby-on-rails-performance-tips</a><br />
<br />
这是一篇关于提高RoR应用性能的文章，提高RoR性能有两个途径，一个是服务器端配置，一个是在Rails这一块的调整，此文侧重于后者。主要的内容包括：<br />
<br />
1- 在Ruby代码级别采用更优的方案；<br />
2- 充分利用缓存；<br />
3- 充分挖掘数据库潜力；<br />
4- 合理使用finder查找函数；<br />
5- 合并数据库事务；<br />
6- 控制好你的控制器，不要滥用filters和实例变量；<br />
7- 不要过度使用helpers，考虑HTML；<br />
8- 合理配置日志；<br />
9- 给你的Ruby GC打补丁；<br />
10- 不鼓吹&quot;premature optimization&quot;，但是尽可能带有性能考虑来进行编码。<br />
<br />
大家觉得对于RoR的应用，上述这些说到点子上了吗？感觉RoR在性能调优上我们积累的经验还不是很多，我有点担心，虽然上面有很多好的点子可以借鉴，文中提到的某些&quot;强心剂&quot;是否真的值得推广？尤其是针对数据库的那些&quot;quick-and-dirty&quot;的做法。
<br />
<br />
<img src ="http://www.blogjava.net/sean/aggbug/99236.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-11 12:55 <a href="http://www.blogjava.net/sean/archive/2007/02/11/99236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 使用Ruby计算MD5 checksum</title><link>http://www.blogjava.net/sean/archive/2007/02/10/99115.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Sat, 10 Feb 2007 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/10/99115.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/99115.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/10/99115.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/99115.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/99115.html</trackback:ping><description><![CDATA[<br />
很多开源框架的官方下载都会提供MD5的验证码，用于验证下载的完整性，确保用户下载的版本和发布者期望的版本是一致的，防止有人恶意篡改，尤其是存在很多镜像站点的时候。使用Unix系统的朋友可以通过命令行直接md5 + 文件名，或者md5sum + 文件名取得本地文件的md5验证码。使用Windows的朋友也能在网上找到不止一个提供MD5的工具。<br />
<br />
不过既然Ruby在Unix/Windows/Mac上都能跑，那Ruby有没有提供MD5的功能让我们可以以一致的方式取得MD5 checksum呢？答案是有。<br />
<ol class="dp-rb" start="1">
    <li class="alt"><span><span class="comment">#!/usr/bin/env&nbsp;ruby</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>require&nbsp;'digest/md5'&nbsp;&nbsp;</span></li>
    <li class="alt"><span>ARGV.<span class="keyword">each</span><span>&nbsp;</span><span class="keyword">do</span><span>&nbsp;</span><span class="variable">|f</span><span>|&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;checksum&nbsp;=&nbsp;Digest::MD5.hexdigest(<span class="builtin">File</span><span>.read(f))&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;<span class="string">&quot;#{f}:\t#{checksum}&quot;</span><span>&nbsp;&nbsp;</span></span></li>
   <li class=""><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
比如我们到<a href="http://struts.apahce.org/" target="_blank">http://struts.apahce.org/</a>下载1.2.9版本Struts的源码，下载到本地后，可以用上面的脚本获取相应的MD5码，输出为：<br />
<br />
struts-1.2.9-src.tar.gz&nbsp;&nbsp;  63ff6e570410876412f8fd97749b2415<br />
<br />
拿后面这个63ff6e570410876412f8fd97749b2415和官方网站上相应的MD5 checksum作比对看是否一致，即可认定下载到本地的版本是否完整。<br/>
<br />
<br />
<img src ="http://www.blogjava.net/sean/aggbug/99115.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 12:53 <a href="http://www.blogjava.net/sean/archive/2007/02/10/99115.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] Ruby调用WebServices(SOAP)</title><link>http://www.blogjava.net/sean/archive/2007/02/08/98633.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 08 Feb 2007 00:29:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/02/08/98633.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/98633.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/02/08/98633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/98633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/98633.html</trackback:ping><description><![CDATA[<br />
昨天试用一个WebService，需要确定是否正确安装配置，用Ruby来做真的很方便，一个本来在Java中颇为麻烦的事，到了Ruby(irb)里面，变得很简单。你要做的，就是打开irb，依次敲入以下代码：
<br />
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>require&nbsp;'soap/wsdlDriver'&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>URL&nbsp;=&nbsp;'http://somedomain/someapp/somewsdl'&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>soap_client&nbsp;=&nbsp;SOAP::WSDLDriverFactory.<span class="keyword">new</span><span>(URL).create_rpc_driver&nbsp;&nbsp;</span></span></li>
</ol>
<br />
接下来就可以直接通过soap_client访问这个WebService的方法了，如：
<br />
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>soap_client.version&nbsp;&nbsp;</span></span></li>
    <li class=""><span>soap_client.get_user_roles('user')&nbsp;&nbsp;</span></li>
</ol>
<br />
如果你指定
<br />
<ol class="dp-rb" start="1">
    <li class="alt"><span><span>soap_client.wiredump_file_base&nbsp;=&nbsp;'log_file'&nbsp;&nbsp;</span></span></li>
</ol>
<br />
系统还能帮你记录在使用WebService接口时所有发出和收到的xml消息。
<br/><img src ="http://www.blogjava.net/sean/aggbug/98633.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-08 08:29 <a href="http://www.blogjava.net/sean/archive/2007/02/08/98633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] &amp;lt;abbr&amp;gt;: 一个有趣的HTML标签</title><link>http://www.blogjava.net/sean/archive/2007/01/25/96069.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 25 Jan 2007 15:23:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/25/96069.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/96069.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/25/96069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/96069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/96069.html</trackback:ping><description><![CDATA[<br/>
<p>如果你使用Firefox或Opera并且看到我<a href="http://www.blogjava.net/sean/archive/2007/01/25/96060.html" target="_blank">上一篇随笔</a>中<abbr title="What You See Is What You Get">WYSIWYG</abbr>这一个词，你可以看到它下面是用一串点标注出来的，如果你鼠标悬停在上面，会有工具提示"What You See Is What You Get"。HTML源代码是:</p>
<p><code>
&lt;abbr title="What You See Is What You Get"&gt;WYSIWYG&lt;/abbr&gt;
</code></p>
<p>可惜微软的IE并不能正确render这个tag，尽管它是标准(X)HTML的一部分。</p>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/96069.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-01-25 23:23 <a href="http://www.blogjava.net/sean/archive/2007/01/25/96069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[链接] ASP.NET的"六大罪状"</title><link>http://www.blogjava.net/sean/archive/2007/01/25/96060.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Thu, 25 Jan 2007 15:01:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/25/96060.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/96060.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/25/96060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/96060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/96060.html</trackback:ping><description><![CDATA[<br/>

<p><a href="http://www.garrettdimon.com/archives/aspnet-vs-front-end-architecture" target="_blank">http://www.garrettdimon.com/archives/aspnet-vs-front-end-architecture</a></p>

<p>该文作者细数了他在使用ASP.NET进行开发的过程中遇到的6点不爽的地方，主要都集中在前台架构上，包括大量内联的风格标签、不同浏览器生成不同页面代码、失败的标记设计、缺乏语意一致性、服务器端label和客户端label的脱节、服务器端ID和客户端ID脱节等等。尤其当你想使用标准的CSS，构建数据结构和表现分离的清晰页面时，ASP.NET的一些默认的内部处理可以让你对ASP.NET为何这样做完全无语。比较有趣的是本文后面的回复，其中有不少与楼主同病相怜的网友，还有来自微软员工的为ASP.NET辩护的声音。</p>

<p>我一直对MS在很多设计思路和决定上心存疑虑，不明白为什么MS硬是要自成风格搞自己那一套蹩脚的所谓"规范"或"标准"，似乎在鼓励大家follow一个并不清晰、多少有些混杂无章的设计架构，其实为了方便它实现更cool的<abbr title="What You See Is What You Get">WYSIWYG</abbr>开发工具。就拿今天来说，本来我们项目定义好所有模块都按BO和UI分开，BO里面的类和UI里面的类各施其责，原则上UI依赖BO，而不是反过来，按照我的理解和期望，Windows.Forms命名空间应该是由UI层来依赖，而非BO层。很显然，因为我们的form都放在UI层，肯定是依赖Windows.Forms了，而我们尽可能把所有业务逻辑代码放到BO层。但是为了临时实现一个文本文件形式的log，因为我们的业务逻辑代码都在BO层，所以为了记录有意义的log，我们的log逻辑自然而然只能放在BO层。但是一个基本的获取程序运行路径的方法属于System.Windows.Forms.Application类，让我们不得不using System.Windows.Froms。这其实还好，我们也许不应该强求Windows.Forms一定就是只针对UI上的应用。问题是你每天都在面对类似的情况，每天都或多或少在和.NET API和框架其他部分在打架，当你使用.NET的API时间久了，自然而然你就被它带到它的那一套思路中，你的设计也就自然而然跟着它走了，业务逻辑和UI逻辑交织在一起，当你回过头来想把层次理清理顺已经成为Mission:Impossible。因为抛开MS推荐的方式，自己实现一套自认更清晰的架构，相较"官方"的blueprint设计，代价实在有些高。</p>

<p>所以虽然我没有真正开发过ASP.NET，尤其是2.0版，但我很能理解他们遇到的尴尬。</p>

<br/>
<img src ="http://www.blogjava.net/sean/aggbug/96060.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-01-25 23:01 <a href="http://www.blogjava.net/sean/archive/2007/01/25/96060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Ruby On Rails 1.2.1 已发布!</title><link>http://www.blogjava.net/sean/archive/2007/01/19/94849.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Fri, 19 Jan 2007 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/19/94849.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/94849.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/19/94849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/94849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/94849.html</trackback:ping><description><![CDATA[<br/>
虽然<a href="http://www.rubyonrails.org/" target="_blank">官方网站</a>显示最新版Rails还是1.1.6，<a href="http://rubyforge.org/frs/?group_id=307&release_id=9081" target="_blank">RubyForge</a>上已经可以下载1.2.1版。<br/>
<br/>
[UPDATE] 官方已正式宣布: <a href="http://weblog.rubyonrails.org/2007/1/19/rails-1-2-rest-admiration-http-lovefest-and-utf-8-celebrations" target="_blank">http://weblog.rubyonrails.org/2007/1/19/rails-1-2-rest-admiration-http-lovefest-and-utf-8-celebrations</a><br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/94849.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-01-19 09:20 <a href="http://www.blogjava.net/sean/archive/2007/01/19/94849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Tips] 网络不是很流畅的情况下安装rails 1.1.6 (Ubuntu Dapper Drake)</title><link>http://www.blogjava.net/sean/archive/2007/01/08/92487.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Mon, 08 Jan 2007 15:32:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/08/92487.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/92487.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/08/92487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/92487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/92487.html</trackback:ping><description><![CDATA[<br/>
由于最近国际互联网速率不是很稳定，而gem install自动默认到rubyforge下载gem安装包，由于rails依赖好几个其他的gem，而gem install需要遍历所有这些gem，所以gem install经常出出现超时的情况，怎么办呢？答案就是把相关的每个gem单独下载到本地，然后用--local选项安装。但是怎么确定你的需要哪些gem呢？<br/>
<br/>
简单说明一下rubyforge的目录结构，了解之后找起gem来就会方便很多：<br/>
&nbsp;&nbsp;&nbsp;&nbsp;http://rubyforge.org/projects/[project_name]/<br/>
# 把[project_name]替换为你要找的gem名称（不要加版本号）就能访问到该gem的主页，然后中间靠右即是跳转到下载页面的链接("Download")，排在最上面的就是最新版，注意文件扩展名，我们要找的是.gem。<br/>
<br/>
本文假定你已经apt-get install ruby1.8 ri rdoc irb，并且也已经去<a href="http://rubyforge.org/projects/rubygems/" target="_blank">http://rubyforge.org/projects/rubygems/</a>下载并安装好RubyGems。<br/>
<br/>
1- 首先下载rails gem，按照刚才提的方法，rails的gem主页在<a href="http://rubyforge.org/projects/rails/" target="_blank">http://rubyforge.org/projects/rails/</a>，目前的最新版本是1.1.6。<br/>
2- cd到下载到本地的目录，然后<br/>
&nbsp;&nbsp;&nbsp;&nbsp;$ sudo gem specification --local --version 1.1.6 rails | grep "^&nbsp;&nbsp; name:\|^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version:" # (^后分别是2个空格和8个空格)<br/>
&nbsp;&nbsp;&nbsp;&nbsp;可以看到如下结果：<br/>
----------------------------------------<br/>
&nbsp;&nbsp;name: rake<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 0.7.1<br/>
&nbsp;&nbsp;name: activesupport<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 1.3.1<br/>
&nbsp;&nbsp;name: activerecord<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 1.14.4<br/>
&nbsp;&nbsp;name: actionpack<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 1.12.5<br/>
&nbsp;&nbsp;name: actionmailer<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 1.2.5<br/>
&nbsp;&nbsp;name: actionwebservice<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version: 1.1.6<br/>
----------------------------------------<br/>
3- OK，接下来我们依次去rubyforge下载这些gem，注意actionwebservice的project name是"aws"，其余的project name和gem名称一样。<br/>
4- 依次sudo gem install --local [gem_name]，rails放在最后，即可完成安装，可以通过which rails或者rails [项目名]验证。<br/>
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/92487.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-01-08 23:32 <a href="http://www.blogjava.net/sean/archive/2007/01/08/92487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[新闻] Groovy 1.0发布</title><link>http://www.blogjava.net/sean/archive/2007/01/03/91659.html</link><dc:creator>大胃</dc:creator><author>大胃</author><pubDate>Wed, 03 Jan 2007 15:53:00 GMT</pubDate><guid>http://www.blogjava.net/sean/archive/2007/01/03/91659.html</guid><wfw:comment>http://www.blogjava.net/sean/comments/91659.html</wfw:comment><comments>http://www.blogjava.net/sean/archive/2007/01/03/91659.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sean/comments/commentRss/91659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sean/services/trackbacks/91659.html</trackback:ping><description><![CDATA[<br/>
<a href='http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there' target='_blank'>http://docs.codehaus.org/display/GROOVY/2007/01/02/Groovy+1.0+is+there</a>
<br/>
<br/>
Groovy是与Java平台无缝结合的动态语言，如今终于发布了1.0版。
<br/>
<br/>
<img src ="http://www.blogjava.net/sean/aggbug/91659.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-01-03 23:53 <a href="http://www.blogjava.net/sean/archive/2007/01/03/91659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>