<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>codeplayer</title>
    <description>http://codeplayer.blogspot.com</description>
    <link>http://codeplayer.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>实现一个 django 的 url dispatcher</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109898" style="color:red;">http://codeplayer.javaeye.com/blog/109898</a>&nbsp;
          发表时间: 2007年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          心血来潮，实现了一个 django 的 url dispatcher，比想象中简单多了。<br /><a href="http://djangodispatcher.googlecode.com/svn/trunk/mapper.py">http://djangodispatcher.googlecode.com/svn/trunk/mapper.py</a><br /><a href="http://djangodispatcher.googlecode.com/svn/trunk/test.py">http://djangodispatcher.googlecode.com/svn/trunk/test.py</a><br /><br />实际实现功能的代码才2、30行，功能基本完整，包括分层次的url配置，和发生异常时帮助调试用的一些信息。<br /><br />PS：发现最近爱上了 Test Driven.
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109898#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Jun 2007 17:22:14 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109898</link>
        <guid>http://codeplayer.javaeye.com/blog/109898</guid>
      </item>
      <item>
        <title>如何在醉酒的情况下编写正确的程序</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109899" style="color:red;">http://codeplayer.javaeye.com/blog/109899</a>&nbsp;
          发表时间: 2007年06月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          答案很简单：Test Driven。<br />哈哈，这个（<a href="http://code.google.com/p/pylifegame/">http://code.google.com/p/pylifegame/</a>）就是好例子！<br />醉了，不多说了，自己看去，我要睡觉去了，嗯 ...
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109899#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Jun 2007 09:12:30 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109899</link>
        <guid>http://codeplayer.javaeye.com/blog/109899</guid>
      </item>
      <item>
        <title>Faint! 和我同名的编辑器</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109900" style="color:red;">http://codeplayer.javaeye.com/blog/109900</a>&nbsp;
          发表时间: 2007年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="center"><a href="http://www.haskell.org/yi/Yi.html"><strong><span style="font-size:130%;">Yi</span></strong></a></p><br />Yi is a text editor written and extensible in Haskell. The goal of Yi is to provide a flexible, powerful and correct editor core dynamically scriptable in Haskell.
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109900#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Jun 2007 04:18:48 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109900</link>
        <guid>http://codeplayer.javaeye.com/blog/109900</guid>
      </item>
      <item>
        <title>原来 pickle 这么有意思</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109901" style="color:red;">http://codeplayer.javaeye.com/blog/109901</a>&nbsp;
          发表时间: 2007年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://peadrop.com/blog/2007/06/18/pickle-an-interesting-stack-language/">Pickle: An interesting stack language</a><br />原来 pickle 本身就是就是一个微型的基于栈的语言，呵呵，有点意思。<br />研究一下 pickle.py 和 pickletools.py ，可以看到更细节的东西。
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109901#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Jun 2007 03:31:23 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109901</link>
        <guid>http://codeplayer.javaeye.com/blog/109901</guid>
      </item>
      <item>
        <title>翻译了这篇文章</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109902" style="color:red;">http://codeplayer.javaeye.com/blog/109902</a>&nbsp;
          发表时间: 2007年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a name="python-3000" href="http://wiki.woodpecker.org.cn/moin/Py3000StatusUpdate#id17" class="toc-backref" id="python-3000">Python 3000 进度报告</a><br />也可以从 guido 的中文 blog 看到：<a href="http://blog.csdn.net/gvanrossum/archive/2007/06/20/1658829.aspx">http://blog.csdn.net/gvanrossum/archive/2007/06/20/1658829.aspx</a>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109902#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Jun 2007 03:27:51 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109902</link>
        <guid>http://codeplayer.javaeye.com/blog/109902</guid>
      </item>
      <item>
        <title>Python 3000 Status Update (Long!)</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109903" style="color:red;">http://codeplayer.javaeye.com/blog/109903</a>&nbsp;
          发表时间: 2007年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.artima.com/weblogs/viewpost.jsp?thread=208549">Python 3000 Status Update (Long!)</a> by Guido van Rossum """<br /><strong>Summary</strong><br />Here's a long-awaited update on where the Python 3000 project stands. We're looking at a modest two months of schedule slip, and many exciting new features. I'll be presenting this in person several times over the next two months.<br />"""
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109903#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 19 Jun 2007 08:41:52 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109903</link>
        <guid>http://codeplayer.javaeye.com/blog/109903</guid>
      </item>
      <item>
        <title>老子毕业了</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/109904" style="color:red;">http://codeplayer.javaeye.com/blog/109904</a>&nbsp;
          发表时间: 2007年06月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://picasaweb.google.com/yi.codeplayer/070608">http://picasaweb.google.com/yi.codeplayer/070608</a><br /><br /><br /><img src="http://lh6.google.com/image/yi.codeplayer/Rmlv-LQQLXI/AAAAAAAAAEU/423ul6UtTDo/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20005.jpg?imgmax=512" /><br /><img src="http://lh5.google.com/image/yi.codeplayer/Rmlzc7QQLhI/AAAAAAAAAFo/PBd5rwh1KOM/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20015.jpg?imgmax=288" /><br /><img src="http://lh5.google.com/image/yi.codeplayer/Rmlys7QQLgI/AAAAAAAAAFc/LJtHUc00iHg/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20014.jpg?imgmax=288" /><br /><img src="http://lh6.google.com/image/yi.codeplayer/RmlzuLQQLiI/AAAAAAAAAFw/F2E--aoUcA4/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20016.jpg?imgmax=288" /><br /><img src="http://lh5.google.com/image/yi.codeplayer/RmlyQ7QQLfI/AAAAAAAAAFU/9oWUzy0bfVc/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20013.jpg?imgmax=288" /><br /><img src="http://lh4.google.com/image/yi.codeplayer/Rml5YrQQLnI/AAAAAAAAAGw/JziZHS0IDeg/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20021.jpg?imgmax=288" /><br /><img src="http://lh4.google.com/image/yi.codeplayer/Rml-brQQMOI/AAAAAAAAALo/8u55Fz0TjUs/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20060.jpg?imgmax=288" /><br /><img src="http://lh6.google.com/image/yi.codeplayer/Rml-nLQQMQI/AAAAAAAAAL4/5g0YrKSybM8/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20062.jpg?imgmax=288" /><br /><img src="http://lh3.google.com/image/yi.codeplayer/Rml8ibQQL9I/AAAAAAAAAJg/i1Xoy4znGPk/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20043.jpg?imgmax=288" /><br /><img src="http://lh5.google.com/image/yi.codeplayer/Rml_c7QQMaI/AAAAAAAAANI/dc_1YSpT1Bw/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20073.jpg?imgmax=288" /><br /><img src="http://lh4.google.com/image/yi.codeplayer/RmmCNrQQM2I/AAAAAAAAAQo/ICgcSN1lOMw/%E5%AD%A6%E5%A3%AB%E6%9C%8D070608%20101.jpg?imgmax=288" />
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/109904#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 08 Jun 2007 16:32:13 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/109904</link>
        <guid>http://codeplayer.javaeye.com/blog/109904</guid>
      </item>
      <item>
        <title>SQLAlchemy Examples</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/86395" style="color:red;">http://codeplayer.javaeye.com/blog/86395</a>&nbsp;
          发表时间: 2007年06月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看 SQLAlchemy 自带的 zblog 的例子，可以看到 SQLAlchemy 一些非常有用的特性。<br /><br /><p><strong>文章相关评论数统计</strong></p><p>比如显示文章列表的同时我们希望获得相关文章的评论数，如果是用 django 那就只能放弃 ORM 的好处自己去执行 sql 语句了，否则就只会导致 n+1 条 SQL 语句的执行。<br />在 SQLAlchemy 中你可以把任意的 select 语句映射到一个 class ，这样就可以用一条 SQL 语句搞定，还能获得 ORM 的好处，下面是原封不动拷过来的代码（只调整了下格式）：</p><pre>   # Post mapper, these are posts within a blog.<br />  # since we want the count of comments for each post,<br />  # create a select that will get the posts<br />  # and count the comments in one query.<br />  posts_with_ccount = select(<br />      [c for c in tables.posts.c if c.key != 'body'] + [<br />          func.count(tables.comments.c.comment_id).label('comment_count')<br />      ],<br />      from_obj = [<br />          outerjoin(tables.posts, tables.comments)<br />      ],<br />      group_by=[<br />          c for c in tables.posts.c if c.key != 'body'<br />      ]<br />      ) .alias('postswcount')<br /><br />  # then create a Post mapper on that query.<br />  # we have the body as "deferred" so that it loads only when needed,<br />  # the user as a Lazy load, since the lazy load will run only once per user and<br />  # its usually only one user's posts is needed per page,<br />  # the owning blog is a lazy load since its also probably loaded into the identity map<br />  # already, and topics is an eager load since that query has to be done per post in any<br />  # case.<br />  mapper(Post, posts_with_ccount, properties={<br />      'id':posts_with_ccount.c.post_id,<br />      'body':deferred(tables.posts.c.body),<br />      'user':relation(user.User, lazy=True,<br />               backref=backref('posts', cascade="all, delete-orphan")),<br />      'blog':relation(Blog, lazy=True,<br />               backref=backref('posts', cascade="all, delete-orphan")),<br />      'topics':relation(TopicAssociation, lazy=False, private=True,<br />               association=Topic, backref='post')<br />  }, order_by=[desc(posts_with_ccount.c.datetime)])</pre><br /><strong>树形评论</strong><br />映射如下：<br /><pre>   # comment mapper.  This mapper is handling a hierarchical relationship on itself,<br />  # and contains<br />  # a lazy reference both to its parent comment and its list of child comments.<br />  mapper(Comment, tables.comments, properties={<br />      'id':tables.comments.c.comment_id,<br />      'post':relation(Post, lazy=True,<br />               backref=backref('comments', cascade="all, delete-orphan")),<br />      'user':relation(user.User, lazy=False,<br />               backref=backref('comments', cascade="all, delete-orphan")),<br />      'parent':relation(Comment,<br />               primaryjoin=tables.comments.c.parent_comment_id==tables.comments.c.comment_id,<br />               foreignkey=tables.comments.c.comment_id, lazy=True, uselist=False),<br />      'replies':relation(Comment,<br />               primaryjoin=tables.comments.c.parent_comment_id==tables.comments.c.comment_id,<br />               lazy=True, uselist=True, cascade="all"),<br />  })<br /></pre><br />很多时候我们需要一次性获取对应一个文章的所有评论，可以用一条 select 先把数据取出，然后手动建立树形结构：<br /><pre># we define one special find-by for the comments of a post, which is going to make its own<br /># "noload" mapper and organize the comments into their correct hierarchy in one pass. hierarchical<br /># data normally needs to be loaded by separate queries for each set of children, unless you<br /># use a proprietary extension like CONNECT BY.<br />def find_by_post(post):<br />  """returns a hierarchical collection of comments based on a given criterion.<br />  uses a mapper that does not lazy load replies or parents, and instead<br />  organizes comments into a hierarchical tree when the result is produced.<br />  """<br />  q = session().query(Comment).options(noload('replies'), noload('parent'))<br />  comments = q.select_by(post_id=post.id)<br />  result = []<br />  d = {}<br />  for c in comments:<br />      d[c.id] = c<br />      if c.parent_comment_id is None:<br />          result.append(c)<br />          c.parent=None<br />      else:<br />          parent = d[c.parent_comment_id]<br />          parent.replies.append(c)<br />          c.parent = parent<br />  return result<br /><br />Comment.find_by_post = staticmethod(find_by_post)<br /></pre>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/86395#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 02 Jun 2007 18:47:51 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/86395</link>
        <guid>http://codeplayer.javaeye.com/blog/86395</guid>
      </item>
      <item>
        <title>multitask and Hive</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/84844" style="color:red;">http://codeplayer.javaeye.com/blog/84844</a>&nbsp;
          发表时间: 2007年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://o2s.csail.mit.edu/o2s-wiki/multitask"><strong>multitask</strong></a><br />multitask allows Python programs to use generators (aka coroutines) to perform cooperative multitasking and asynchronous I/O. Applications written using multitask consist of a set of cooperating tasks that yield to a shared task manager whenever they perform a (potentially) blocking operation, such as I/O on a socket or getting data from a queue. The task manager temporarily suspends the task (allowing other tasks to run in the meantime) and then restarts it when the blocking operation is complete. Such an approach is suitable for applications that would otherwise have to use select() and/or multiple threads to achieve concurrency.<br /><a href="http://www.oluyede.org/blog/2007/05/29/producerconsumer-with-multitask-library/">Producer/Consumer with multitask library </a><br /><br /><a href="http://cheeseshop.python.org/pypi/Hive"><strong>Hive</strong></a><br />This is a basic concurrency module that uses only dependencies available in the Python 2.5 standard library. It allows the creation of a jobfile for uses to queue work that any number of worker processes with access to the jobfile can pull from the queue and run.<br /><br />看到这两个库很快就联想到曾经写过的<a href="http://codeplayer.blogspot.com/2006/09/python25-yield-stacklesspython.html">那段代码</a>，python2.5 增强的 yield 表达式所蕴涵的 continuation 的能力似乎终于有人拿它来发挥点实际作用了。
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/84844#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 May 2007 04:40:10 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/84844</link>
        <guid>http://codeplayer.javaeye.com/blog/84844</guid>
      </item>
      <item>
        <title>Polymorphic Associations in Rails</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/84845" style="color:red;">http://codeplayer.javaeye.com/blog/84845</a>&nbsp;
          发表时间: 2007年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://techspot.zzzeek.org/?p=13" title="Permanent Link to Polymorphic Associations with SQLAlchemy" rel="bookmark">Polymorphic Associations with SQLAlchemy</a><br /><a href="http://techspot.zzzeek.org/">SQLAlchemy 老大</a>展示怎么用 <a href="http://www.sqlalchemy.org">sqlalchemy </a>实现 rails 的 <a href="http://wiki.rubyonrails.com/rails/pages/UnderstandingPolymorphicAssociations">Polymorphic Associations </a><br />顺便看了下 Rails 所谓<a href="http://wiki.rubyonrails.com/rails/pages/UnderstandingPolymorphicAssociations">Polymorphic Associations </a>的介绍，才发现其实就是我很早就<a href="http://codeplayer.blogspot.com/2006/09/django-contribs-contenttype.html">介绍过</a>的 django 的 content-type app 所干的事情，app 就是插件的意思。
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/84845#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 May 2007 04:28:47 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/84845</link>
        <guid>http://codeplayer.javaeye.com/blog/84845</guid>
      </item>
      <item>
        <title>Python and vim: Two great tastes that go great together</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/83411" style="color:red;">http://codeplayer.javaeye.com/blog/83411</a>&nbsp;
          发表时间: 2007年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.tummy.com/Community/Presentations/vimpython-20070225/vim.html">Python and vim: Two great tastes that go great together</a><br /><br />用 python 扩展 vim ，想法倒是不新，不过第一次看到 tutotial 。<br /><br />记得 tocer 说过要用 python 写个 vim 库的，不知道有没有进展哈，呵呵。
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/83411#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 May 2007 08:29:34 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/83411</link>
        <guid>http://codeplayer.javaeye.com/blog/83411</guid>
      </item>
      <item>
        <title>Evolution of a Python programmer</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/83412" style="color:red;">http://codeplayer.javaeye.com/blog/83412</a>&nbsp;
          发表时间: 2007年05月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://dis.4chan.org/read/prog/1180084983/">http://dis.4chan.org/read/prog/1180084983/</a><br /><br />哈哈，有点意思，再加一个：<br /><br />Python 2.5 programmer:<br /><pre>def fact(x):<br />    return x * fact(x - 1) if x > 1 else 1<br />print fact(6)<br /></pre>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/83412#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 May 2007 07:51:31 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/83412</link>
        <guid>http://codeplayer.javaeye.com/blog/83412</guid>
      </item>
      <item>
        <title>Elixir Examples</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/81999" style="color:red;">http://codeplayer.javaeye.com/blog/81999</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有的时候在 blog 里写 wiki，有的时候在 wiki 里写 blog，有的时候在 blog 里发在 wiki 里写的 blog ;-)
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/81999#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 18:57:31 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/81999</link>
        <guid>http://codeplayer.javaeye.com/blog/81999</guid>
      </item>
      <item>
        <title>多重继承真是好哇</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/82000" style="color:red;">http://codeplayer.javaeye.com/blog/82000</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          写 model 的时候发现有些东西在重复，第一反应就是写个基类，把这些重复的东西拿出来，然而 Model 类之间继承却不是那么方便的，应该会影响到 ORM 的行为。<br />怎么办呢？幸好 python 有多重继承。<br />下面就是项目中做这些重复事情的类：<br /><pre>class ModelMixin(object):<br />    def save(self):<br />        if not self.id: # creation time<br />            if hasattr(self, 'pubdate'):<br />                self.pubdate = datetime.now()<br />            if hasattr(self, 'pubtime'):<br />                self.pubtime = datetime.now()<br /><br />        if hasattr(self, 'updatedate'):<br />            self.updatedate = datetime.now()<br />        if hasattr(self, 'updatetime'):<br />            self.updatetime = datetime.now()<br />        if hasattr(self, 'number'): # 今天第几次发布<br />            self.number = self.__class__.objects.filter(pubdate=datetime.now()).count()+1<br /><br />        if hasattr(self, 'before_save'):<br />            self.before_save()<br />        super(ModelMixin, self).save()<br />        if hasattr(self, 'after_save'):<br />            self.after_save()<br /></pre><br />注意：django 将废弃 auto_add 和 auto_now 这些东西，认为太 magic ，建议在 save 中处理，所以上面这个类就更有用了。<br /><br />怎么用呢？<br /><pre>class Product(ModelMixin, models.Model):<br />    pubdate = models.DateField(u'...', editable=False)<br />    number = models.IntegerField(u'...', editable=False)<br />    ...<br /></pre><br />这样 pubdate 和 number 自然就有了相应的含义了。另外 ModelMixin 还定义了 before_save 和 after_save 的钩子，具体 model 可以在这两个方法里放点代码，比如：<br /><pre>    def before_save(self):<br />        self.totalprice = self.count * self.product.unitprice<br /><br />...<br /><br />    def after_save(self):<br />        if self._create:<br />            p = OutProduct(postuser=self.postuser,count=1,<br />                    pubdate=self.pubdate,mainproduct=self)<br />            p.save()<br /></pre><br />这些都是项目中直接拷出来的代码，具体意思你就慢慢猜吧，呵呵。<br /><br />多重继承的实现其实是个还算复杂的过程，复杂的多重继承也会产生一些奇特的行为，不过基本上只要遵守一些良好的习惯（比如常用 super ，虽然写起来有些繁琐），了解一些多重继承的基本原理，基本上不会遇到什么奇怪的问题了。<br />关于 python 多重继承的实现，请看：<a href="http://www.python.org/download/releases/2.3/mro/">The Python 2.3 Mehod Resolution Order</a>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/82000#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 18:30:26 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/82000</link>
        <guid>http://codeplayer.javaeye.com/blog/82000</guid>
      </item>
      <item>
        <title>newforms 太好用了</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/82001" style="color:red;">http://codeplayer.javaeye.com/blog/82001</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          建一个项目 newformstutorials ，建一个 app blog ，在 blog 的 models 中定义个：<br /><pre>class Article(models.Model):<br />    title = models.CharField(u'标题', maxlength=255)<br />    author = models.CharField(u'作者', maxlength=20)<br />    hits = models.IntegerField(u'点击数', default=0, editable=False)<br />    content = models.TextField(u'内容')<br /></pre><br />配置好数据库，把 newformstutorials.blog 加到 INSTALLED_APPS，manage.py syncdb，然后 manage.py shell ，然后：<br /><pre>In [1]: import django.newforms as forms<br /><br />In [2]: from newformstutorials.blog.models import Article<br /><br />In [3]: ArticleForm = forms.form_for_model(Article)<br /><br />In [4]: form = ArticleForm()<br /><br />In [5]: print unicode(form)<br /><tr><th><label for="id_title">标题:</label></th><td><input name="title" maxlength="255" id="id_title" type="t<br />ext" /></td></tr><br /><tr><th><label for="id_author">作者:</label></th><td><input id="id_author" type=<br />"text" name="author" maxlength="20" /></td></tr><br /><tr><th><label for="id_content">内容:</label></th><td><textarea id="id_content"<br />rows="10" cols="40" name="content"></td></tr><br /><br />In [6]: print form.as_ul()<br /><li><label for="id_title">标题:</label> <input name="t<br />itle" maxlength="255" id="id_title" type="text" /></li><br /><li><label for="id_author">作者:</label> <input id="id_author" type="text" name=<br />"author" maxlength="20" /></li><br /><li><label for="id_content">内容:</label> <textarea id="id_content" rows="10" co<br />ls="40" name="content"></li><br /></pre><br />一个空白的 form 就这样出来了，这就是个添加文章的表单，让我们用这个表单来加点数据吧：<br /><pre>In [7]: form = ArticleForm({'title':'some title','author':'huangyi'})<br /><br />In [8]: form.is_valid()<br />Out[8]: False<br /><br />In [9]: form.errors<br />Out[9]: {'content': [u'This field is required.']}<br /><br />In [10]: form = ArticleForm({'title':'some title','author':'huangyi', 'content':<br />'some contents...'})<br /><br />In [11]: form.is_valid()<br />Out[11]: True<br /><br />In [12]: article = form.save(commit=True)<br /></pre><br />OK，数据就这样保存了，我们再来试试数据更新的页面吧：<br /><pre>In [13]: ChangeForm = forms.form_for_instance(article)<br /><br />In [14]: form = ChangeForm()<br /><br />In [15]: print unicode(form)<br /><tr><th><label for="id_title">标题:</label></th><td><input name="title" maxlength="255" id="id_title" type="t<br />ext" value="some title" /></td></tr><br /><tr><th><label for="id_author">作者:</label></th><td><input id="id_author" type=<br />"text" name="author" value="huangyi" maxlength="20" /></td></tr><br /><tr><th><label for="id_content">内容:</label></th><td><textarea id="id_content"<br />rows="10" cols="40" name="content">some contents...</td></tr><br /><br />In [16]: form = ChangeForm({'title':'another title', 'author':'huangyi', 'conten<br />t':'other contents...'})<br />In [17]: form.is_valid()<br />Out[17]: True<br /><br />In [18]: form.save()<br />Out[18]: <article: article object><br /><br />In [19]: article = Article.objects.get(id=article.id)<br /><br />In [20]: article.title<br />Out[20]: 'another title'<br /></article:></pre>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/82001#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 17:40:20 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/82001</link>
        <guid>http://codeplayer.javaeye.com/blog/82001</guid>
      </item>
      <item>
        <title>django newforms admin</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/81645" style="color:red;">http://codeplayer.javaeye.com/blog/81645</a>&nbsp;
          发表时间: 2007年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          又用 django 做了个项目，因为主要都是后台的东西，所以决定启用 django 的 <a href="http://code.djangoproject.com/wiki/NewformsAdminBranch">newforms admin 分支</a>！(不过这里我不是推荐大家现在就开始用 newforms admin 分支，如果没有把握，最好是抱着玩玩的态度先，我在开发过程中就改掉它好几个bug)<br />
<br />
newforms admin 分支是用 newforms 来重构 admin 模块，也顺便改变了一些设计决策，大大增强了 admin 的可定制性。首先 newforms 的应用，成功分离了 db field、form field、widget 三个部分，db field 属于 ORM ，主要负责 model 相关的事务，form field 主要处理用户输入数据的验证，widget 负责渲染ui，似乎这里面还透着 MVC 的影子呢 ;-)<br />
newforms admin中可以方便地对 widget 进行替换，怎一个爽字了得。<br />
另外，新的 admin 把 admin 部分的定义从 model 中分离出来了，似乎写起来要麻烦点，不过好处也是显而易见的，首先是 model 定义更整洁了，其次新的 admin 设计成了一种重用性更好的形式，用得好的话还能省下不少代码呢，而且能够完成一些以前的 admin 很难完成的任务。<br />
新 admin 的核心在于 AdminSite 和 AdminModel，AdminSite 负责一些全局性的事务，比如首页，用户登录登出改密码权限控制，和model的注册，AdminModel 负责单个 model 的相关管理页面。 这样做的好处是你可以继承这两个类，覆盖掉一些合适的方法，你基本上可以为所欲为。<br />
比如，我在这个项目中就写了这么几个自定义的 admin 类：<br />
<pre><br />class CustomAdmin(admin.ModelAdmin):<br />    def before_save(self, request, instance, form, change=False):<br />        pass<br /><br />    def save_add(self, request, model, form, post_url_continue):<br />        def custom_save(form, commit=False):<br />            instance = model()<br />            new_object = forms.save_instance(form, instance,<br />                    fail_message='created', commit=False)<br />            self.before_save(request, new_object, form)<br />            if commit:<br />                new_object.save()<br />                for f in model._meta.many_to_many:<br />                    if f.name in form.cleaned_data:<br />                        setattr(new_object, f.attname, form.cleaned_data[f.name])<br />            return new_object<br />        form.__class__.save = custom_save<br />        return super(CustomAdmin, self).save_add(request, model, form,<br />                    post_url_continue)<br /><br />    def save_change(self, request, model, form):<br />        def custom_save(form, commit=False):<br />            from copy import copy<br />            new_object = forms.save_instance(form,<br />                    copy(form.original_object),<br />                    fail_message='changed', commit=False)<br />            self.before_save(request, new_object, form, change=True)<br />            if commit:<br />                new_object.save()<br />                for f in model._meta.many_to_many:<br />                    if f.name in form.cleaned_data:<br />                        setattr(new_object, f.attname, form.cleaned_data[f.name])<br />            return new_object<br />        form.__class__.save = custom_save<br />        return super(CustomAdmin, self).save_change(request, model, form)</pre>
<br />
大家应该可以看得出来，这个 admin 提供了 before_save 的钩子（当然你也可以提供 after)save 不过我这里暂时只需要 before_save），你可以继承它然后在这个方法里写些代码，就得在 model 保存之前得到执行。你可能要问，为什么不直接定义 Model 的 save 方法呢？答案很简单 Model 不知道 request 和 form 的存在！<br />
在 before_save 中你就可以做些很有意思的事情了，比如自动把 model 中某个字段设置成当前登录用户！这个定制需求其实很早就提出来了，以前的解决方案是写个 middleware 把 request 放到 threadlocal 中去，然后在 model 中通过 threadlocal 获取当前请求的 request ，能用，但是很麻烦也很丑。现在用这个 before_save 可以轻松实现：<br />
<pre>class AutoUserAdmin(CustomAdmin):<br />    user_field_name = 'postuser'<br />    def before_save(self, request, instance, form, change=False):<br />        setattr(instance, self.user_field_name, request.user)<br />        super(AutoUserAdmin, self).before_save(request, instance, form, change)<br /></pre>
<br />
当然你也可以继承这个 AutoUserAdmin ，写上你自己的 user_field_name ，太简单了。<br />
还有一个常见的定制需求就是限制登录用户只能看到自己发布的信息，看不到更不能修改别人发布的信息。 在上面这个 AutoUserAdmin 的基础上做：<br />
<pre>class RestrictUserAdmin(AutoUserAdmin):<br />    def queryset(self, request):<br />        queries = {self.user_field_name:request.user}<br />        return super(RestrictUserAdmin, self).queryset(request).\<br />                filter(**queries)<br /></pre>
<br />
是不是超简单？呵呵。<br />
另外别忘了 python 还支持传说中的多重继承，意味着你可以同时继承多个 admin 类，并拥有多个 admin 类的组合功能。比如我这里定制了一个支持文件上传的 admin（newforms 和 newforms admin 暂时都还没有把文件上传相关的东西加进去，只能自己写），我把它叫做 FileUploadAdmin ，现在我希望我的 admin 能同时拥有 RestrictUserAdmin 和 FileUploadAdmin 的功能，没问题：<br />
<pre>class CommonAdmin(FileUploadAdmin, AutoUserAdmin):<br />    date_hierarchy = 'pubdate'<br />    list_per_page = 15<br />    ordering = ('-id',)<br /></pre>
<br />
当然我还在里面定义了一些通用的（当然是对于我自己的项目来说） admin 配置。<br />
然后怎么把这些 admin 应用到 model 上去呢？<br />
<pre>class ProductAdmin(CommonAdmin):<br />    list_display = ('__str__', 'type', 'unitname', 'unitprice',<br />        'qsinfo', 'postuser', 'pubdate', 'image_view')<br />    list_filter = ('type', 'pubdate')<br />)<br />admin.site.register(Product, ProductAdmin)<br /></pre>
<br />
上面的代码虽然不错，不过我还是嫌麻烦，实际上我是这么写的：<br />
<pre>admin.site.register(Product,<br />    CommonAdmin,<br />    list_display = ('__str__', 'type', 'unitname', 'unitprice',<br />        'qsinfo', 'postuser', 'pubdate', 'image_view'),<br />    list_filter = ('type', 'pubdate'),<br />    section_name = '通用',<br />)<br /></pre>
<br />
不过要让上面的代码正常运行，还需要对 django newforms admin 分支的代码做一点小改动即可，在文件 django/contrib/admin/sites.py 中大约 73 行的位置，<br />
<pre>          # TODO: Handle options</pre>
<br />
的下面加上：<br />
<pre>          # it works<br />        if options:<br />            admin_class = type(admin_class.__name__, (admin_class,),<br />                    options)</pre>
<br />
实际上，使用 django 乃至 python 最大的快乐就是别人写的代码你都可以轻松看懂，这难道不是作为程序员最大的快乐吗？ ;-)<br />
<br />
如果你现在开始用 django newforms admin 分支的话，估计遇到的大部分问题都是和 unicode 有关（因为我遇到的就是这样的），这是因为目前 django 的开发 和 python 本身的开发一样，都处在整体向 unicode 迁移的过程之中，当前最大的矛盾就是 ORM 使用的是普通字符串(也就是 python3000中所谓字节数组)，而 newforms 却开始整体使用 unicode 了，这常常带来麻烦。如果你在基于 django 最新的 svn 版本开发，那一定要看一下 <a href="http://code.djangoproject.com/wiki/UnicodeBranch">Unicode 分支</a>了，里面说到了如何使让你的程序顺利过渡到 unicode ，祝大家过渡快乐 ;-)
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/81645#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 May 2007 16:52:59 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/81645</link>
        <guid>http://codeplayer.javaeye.com/blog/81645</guid>
      </item>
      <item>
        <title>python3000与接口</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/80205" style="color:red;">http://codeplayer.javaeye.com/blog/80205</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &quot;&quot;&quot;<br />
要编写复杂软件又不至于一败涂地的唯一方法就是用定义清晰的接口把若干简单模块组合起来。<br />
&quot;&quot;&quot;<br />
抽象的说，其实接口、契约、协议、界面等等概念说的差不多都是一个意思。<br />
作为如此流行的被大规模使用的语言，python 一直没有这么个东西的标准实现，实在是一种遗憾，当然第三方的实现 zope.interface 其实早就在 zope 和 twisted 中大量应用了。<br />
<br />
python 3000 中正在讨论的：<br />
<a href="http://www.python.org/dev/peps/pep-3119">pep 3119 Introducing Abstract Base Classes</a>；<br />
<a href="http://www.python.org/dev/peps/pep-3124">pep 3124 Overloading, Generic Functions, Interfaces, and Adaptation</a>；<br />
（还有 <a href="http://www.python.org/dev/peps/pep-3133">pep 3133 Introducing Roles </a>，不过暂时没看出它和 Abstracet Base Class 有啥大区别）<br />
希望向 python 中引入一些类型约束的能力，配合上已经被接受的 <a href="http://www.python.org/dev/peps/pep-3107">PEP 3107 Function Annotations </a>提议的语法，真是对 python 非常好的补充。<br />
甚至对其他动态语言也是非常好的一个启示！<br />
<br />
另外，啄木鸟上有<a href="http://wiki.woodpecker.org.cn/moin/Python3000"> python3000 页面</a>，欢迎大家在上面添加自己的想法 ;-)
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/80205#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 May 2007 14:35:11 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/80205</link>
        <guid>http://codeplayer.javaeye.com/blog/80205</guid>
      </item>
      <item>
        <title>好久没写blog了</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/80206" style="color:red;">http://codeplayer.javaeye.com/blog/80206</a>&nbsp;
          发表时间: 2007年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>好久没写 blog 了，现在毕业论文终于敲定，可以长舒一口气 ;-)</p><p>写论文的时候，rst 可真是帮我不少忙，不过学校规定得交 doc 的版本，包括论文的格式什么的都是针对 msword 来说的，只好用 rst 生成 html ，然后拷贝到 msword。看到同学直接在 msword 里写论文，最后再痛苦地调整格式，窃喜 ;-)</p><p>继续我们可爱的python的写作，不过写到现在感觉自己还是不习惯写入门的东西，总是不自觉地想用最简洁的语言把所有东西都说出来（不过这倒符合python的哲学 = =" ），只好努力压下许多 python 的好东东了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/80206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 May 2007 13:48:10 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/80206</link>
        <guid>http://codeplayer.javaeye.com/blog/80206</guid>
      </item>
      <item>
        <title>新的 pep ！</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/67460" style="color:red;">http://codeplayer.javaeye.com/blog/67460</a>&nbsp;
          发表时间: 2007年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          虽然我发晚了一点，但还是很值得一看的 PEP ;-)
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/67460#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 02 Apr 2007 07:31:12 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/67460</link>
        <guid>http://codeplayer.javaeye.com/blog/67460</guid>
      </item>
      <item>
        <title>突破 gwf 的封锁 访问 blogger 的通用方法</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/67461" style="color:red;">http://codeplayer.javaeye.com/blog/67461</a>&nbsp;
          发表时间: 2007年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          根据<a href="http://www.gseeker.com/50226711/blogspoteeaeie070328ie_78129.php">这篇文章</a>给出的好办法，<a href="http://www.gseeker.com/50226711/ieblogspotaeaeieeeie_85030.php">据说</a> ie 下也可以用。<br />简单得说就是先下载<a href="http://www.kenwong.cn/wp-content/proxy.pac">这个代理文件</a>，比如说你保存在 c:/proxy.pac，然后在 firefox 中 选项 -&gt; 高级 -&gt; 连接配置 -&gt; 自动配置代理url ，填入 file:///c:/proxy.pac 。<br />如果有任何疑问看上面的连接以获得详细的配置办法！
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/67461#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 31 Mar 2007 17:32:26 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/67461</link>
        <guid>http://codeplayer.javaeye.com/blog/67461</guid>
      </item>
      <item>
        <title>trying out PyPy</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/67462" style="color:red;">http://codeplayer.javaeye.com/blog/67462</a>&nbsp;
          发表时间: 2007年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对 pypy 的简单试验，惊叹其优化的智能！
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/67462#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 30 Mar 2007 08:01:03 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/67462</link>
        <guid>http://codeplayer.javaeye.com/blog/67462</guid>
      </item>
      <item>
        <title>[有趣]Invasion Of The Dynamic Language Weenies</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/66211" style="color:red;">http://codeplayer.javaeye.com/blog/66211</a>&nbsp;
          发表时间: 2007年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.hacknot.info/hacknot/action/showEntry?eid=93">Invasion Of The Dynamic Language Weenies</a><br />这文章很是耐人寻味，嘿嘿 ;-)
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/66211#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 Mar 2007 01:58:22 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/66211</link>
        <guid>http://codeplayer.javaeye.com/blog/66211</guid>
      </item>
      <item>
        <title>字典与动态语言</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/61962" style="color:red;">http://codeplayer.javaeye.com/blog/61962</a>&nbsp;
          发表时间: 2007年03月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          字典（或者叫哈希表、关联数组..）与动态语言的渊源可谓极深。动态语言之所以动态，归根结底是因为把对变量的求值放在了运行时完成而非静态语言的编译时确定。动态语言程序中众多的不同层次的名字空间（或者说作用范围）其实就是一个个的字典，变量名为 key，对象为 value。<br />    而对变量求值的过程就是对所在名字空间查找的过程，根据变量名，找出相应的对象，有时候在局部名字空间中没找到，还可能会自动跑到外部名字空间或是全局名字空间去找。<br />    对于支持 OO 的动态语言，对对象的实现其实也都是字典，属性名为 key，属性值为 value ，属性的获取也就变成了对字典的查找。有时子类中找不到还会到父类中去找，这也就是动态语言对继承的实现。<br />    javascript 的 prototype 可能是动态语言实现继承最直接最简洁的方式了。python 为 OO 加了几个新语法，新概念，还有对多重继承的支持，不过本质上其实还差不多。<br />    字典的核心地位在 lua、javascript 中表现得最为明显，在 javascript 中字典和 object 其实就是同义词；在 python 中其实也不难找到字典的身影：locals()、globals()、还有(几乎)所有对象都有的 __dict__ 属性；ruby 这样的语言中这一点会藏得深一些。<br />    【以下为个人感受】<br />    字典是动态语言的灵魂，要使用好动态语言首先肯定是要认清这一点的，不过在实际软件开发中像 lua 一样直面字典编程未免太简陋了一些，javascript 稍微好点，python 完美，而 ruby 过了。
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/61962#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 19 Mar 2007 10:18:22 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/61962</link>
        <guid>http://codeplayer.javaeye.com/blog/61962</guid>
      </item>
      <item>
        <title>django and non programmers</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/60769" style="color:red;">http://codeplayer.javaeye.com/blog/60769</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了<a href="http://www.wilsonminer.com/posts/2006/may/09/are-you-generic/">Are You Generic?</a>，<a href="http://www2.jeffcroft.com/blog/2006/may/02/django-non-programmers/">Django for non-programmers</a> 两篇文章。<br />django 真是设计人员的福音啊！
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/60769#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 07:59:14 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/60769</link>
        <guid>http://codeplayer.javaeye.com/blog/60769</guid>
      </item>
      <item>
        <title>pypy 介绍</title>
        <author>huangyiiiiii</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://codeplayer.javaeye.com">huangyiiiiii</a>&nbsp;
          链接：<a href="http://codeplayer.javaeye.com/blog/59388" style="color:red;">http://codeplayer.javaeye.com/blog/59388</a>&nbsp;
          发表时间: 2007年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前面写过篇<a href="http://codeplayer.blogspot.com/2006/12/python-virtual-machines.html">介绍 pypy 的文章</a>了，不过感觉有些东西还说得不够清楚也不够准确。<br /><br />pypy 分为两部分：一个 python 的实现 和 一个编译器。<br />pypy 这名字说的就是这第一部分：用python实现的python。但其实这么说并不准确，准确得说应该是用 rpython 实现的 python ，rpython 是 python 的一个子集，不过不要搞混了，虽然 rpython 不是完整的 python ，但用 rpython 写的这个 python 实现却是可以解释完整的 python 语言。<br />那为什么要用 rpython 来写这个 python 实现呢，这其实就涉及到了 pypy 的第二部分：编译器。<br />这是一个编译 rpython 的编译器，或者说这个编译器有一个 rpython 的前端，目前也只有这么一个前端，不过它的后端却是不少，也就是说这个编译器支持许多的目标语言，比较重要的有：c, cli, javascript ...<br />而当我们把这两部分合起来看的时候，就能够发现 pypy 最重大的意义所在，当我们用这个编译器来编译这个用 rpython 写的 python 实现，我们能够得到什么呢？一个 c 写的 python 实现，一个用 .net 写的 python 实现（不过目前的 cli 后端还不能用来编译这个 python 实现） ...<br /><br />我想这个介绍应该是比较简要了，pypy 的这两个大部分中都包含有许多有趣的内容，等玩得多些了再来介绍吧。<br /><br />[update] 刚看到<a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/e93d54b945f58140/77ef3b267138d946?lnk=gst&amp;q=pypy&amp;rnum=5#77ef3b267138d946"> pypy 0.99 发布的声明</a>，其中说到编译后的解释器性能 <span class="fixed_width" style="font-family:Courier, Monospaced;">twice the speed of the 0.9 release, overall 2-3 slower than CPython 。并且：<br /></span><span class="fixed_width" style="font-family:Courier, Monospaced;">It is now possible to translate the <b style="color: black; background-color: rgb(255, 255, 102);">PyPy</b> interpreter to run on the .NET platform .<br /></span><span class="fixed_width" style="font-family:Courier, Monospaced;">the JavaScript backend has evolved to a point where it can be used to write AJAX web applications with it.<br /><br />WOW!<br /></span>
          <br/>
          <span style="color:red;">
            <a href="http://codeplayer.javaeye.com/blog/59388#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 Mar 2007 09:29:03 +0800</pubDate>
        <link>http://codeplayer.javaeye.com/blog/59388</link>
        <guid>http://codeplayer.javaeye.com/blog/59388</guid>
      </item>
  </channel>
</rss>