<?xml version="1.0"?>
<rdf:RDF
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns="http://purl.org/rss/1.0/"
>
<channel rdf:about="http://www.woodpecker.org.cn/">
	<title>Planet of Woodpecker.org.cn for CPUG</title>
	<link>http://www.woodpecker.org.cn/</link>
	<description>Planet of Woodpecker.org.cn for CPUG - http://www.woodpecker.org.cn/</description>

	<items>
		<rdf:Seq>
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.133" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.132" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/f26a0b46de1326056b63e5de.html" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0416.blog" />
			<rdf:li rdf:resource="tag:blogger.com,1999:blog-33791960.post-3012611108675636830" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0406.blog" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.125" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.126" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.124" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0400.blog" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0399.blog" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.123" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.122" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.118" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.116" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2010://2.113" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0373.blog" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.111" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0365.blog" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.110" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/805691525d188b040cf3e383.html" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.109" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.108" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.107" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/83e7f31f4250a269f724e462.html" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.102" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/1e7ca044e927f088b2b7dcdb.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/a68fb838e98dddc8d46225ed.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/294d09fa7030b69d59ee90dd.html" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.100" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/12f14ec2af4a093fe5dd3bb0.html" />
			<rdf:li rdf:resource="http://hyry.dip.jp/blogt.py?file=0346.blog" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/6085b99992092e026e068cd0.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/9079bd3e7f3753f0828b13ca.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/7a7fb58f3a6dc9e4f01f3681.html" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.94" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/d5c135a89aa3d4bbca130c4c.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/88483801857fe1047bec2c88.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/855530ad579921034a36d646.html" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.91" />
			<rdf:li rdf:resource="tag:blog.khsing.net,2009://2.75" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/f4bfd31b0e794fdfac6e755c.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/717dd0004a22991b738b654b.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/0ee5eaf862650505d9f9fdb1.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/6085b999e3691f026f068c70.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/0e77267fdba3550229388a5c.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/b07ab7fd5e16801c08244d7f.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/58e2ac4be4b34bfa83025c2f.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/bd095fdf6b28f31948540321.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/b3882cf502aeaf2fbc310998.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/94340b7b6dca48fe0bd1870a.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/7ea2908fdd613af0503d925d.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/24cfdcc47612b0c138db4917.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/31af7aec841c06db2e2e21c3.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/58e2ac4b916a5efa83025c40.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/5f29d53fa00b8dc87c1e712e.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/30999a50934dfc688435245f.html" />
			<rdf:li rdf:resource="http://blog.80s.net.cn/?p=536" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/7b72562c9b02b7e68b1399ed.html" />
			<rdf:li rdf:resource="http://hi.baidu.com/limodou/blog/item/17f00eb340a85aadd8335a53.html" />
		</rdf:Seq>
	</items>
</channel>

<item rdf:about="tag:blog.khsing.net,2010://2.133">
	<title>Gawain's Jail: 性能问题</title>
	<link>http://blog.khsing.net/2010/05/post-10.html</link>
	<content:encoded>&lt;p&gt;记点笔记：&lt;a href=&quot;http://pl.atyp.us/content/tech/servers.html&quot;&gt;High-Performance Server Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;性能问题一般因以下四个原因而起：
&lt;ol&gt;
&lt;li&gt;Data copies(数据复制)&lt;/li&gt;
&lt;li&gt;Context switches(上下文切换)&lt;/li&gt;
&lt;li&gt;Memory allocation(内存分配)&lt;/li&gt;
&lt;li&gt;Lock contention(锁争用)&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;为避免Data copies，作者使用的方法是间接使用和通过buffer descriptor来代替buffer pointer，每一个buffer descriptor由以下部分构成：
&lt;ul&gt;
&lt;li&gt;A pointer and length for the whole buffer. 一个指向整个buffer的指针和大小。&lt;/li&gt;
&lt;li&gt;A pointer and length or offset and length for the part of the buffer that's actually used. 一个指向buffer实际使用部分的指针和大小或偏移量及大小。&lt;/li&gt;
&lt;li&gt;Forward and back pointers to other descriptors in a list. 指向其他描述符的向前及向后的指针列表。&lt;/li&gt;
&lt;li&gt;a reference count. 一个引用计数。&lt;/li&gt;
&lt;/ul&gt;
但是作者并不推荐在所有情况下都这样用做，因为在描述符的链表中穿行是非常痛苦的，这个做法虽然提高了性能但是却比data copies更恶。最好的做法是标记所有较大的对象，比如说数据块，确保他们像上述那样被独立分配，这样他们就不会被复制了。另外也说了一些因避免复制而做出的更坏的事情，比如强制一个上下文切换，分解一个大的IO请求。为避免Data copies，第一个要关心的应该是如何避免额外的操作。&lt;/p&gt;</content:encoded>
	<dc:date>2010-05-11T03:48:53+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.132">
	<title>Gawain's Jail: HS: sify.com的构架</title>
	<link>http://blog.khsing.net/2010/05/hs-sifycom.html</link>
	<content:encoded>刚才看过了High Scalability的新文：&lt;a href=&quot;http://highscalability.com/blog/2010/5/10/sifycom-architecture-a-portal-at-3900-requests-per-second.html&quot;&gt;SIFY.COM ARCHITECTURE - A PORTAL AT 3900 REQUESTS PER SECOND&lt;/a&gt;。构架里有许多有意思的地方，他们在GFS上存储所有数据，没有DB，没有NoSQL，而是使用Apache Solr来做数据的索引。使用了Drools这个rule引擎来处理缓存过期的问题。文章的最后把他们在构架进化过程的问题也抛出来了，这一点很不错，弯路谁没走过，把这样的经验分享出来是相当不错的。

从抛出来所遇到的问题和解决方法来看，系统重启以解决还是相当的普遍。

&lt;div class=&quot;zemanta-pixie&quot;&gt;&lt;a class=&quot;zemanta-pixie-a&quot; href=&quot;http://reblog.zemanta.com/zemified/ae2c25f9-de37-4918-851f-760b6316b98b/&quot; title=&quot;Reblog this post [with Zemanta]&quot;&gt;&lt;img class=&quot;zemanta-pixie-img&quot; src=&quot;http://img.zemanta.com/reblog_e.png?x-id=ae2c25f9-de37-4918-851f-760b6316b98b&quot; alt=&quot;Reblog this post [with Zemanta]&quot; /&gt;&lt;/a&gt;&lt;span class=&quot;zem-script more-related pretty-attribution&quot;&gt;&lt;/span&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2010-05-11T02:55:54+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/f26a0b46de1326056b63e5de.html">
	<title>Limodou: web2py中的block支持</title>
	<link>http://hi.baidu.com/limodou/blog/item/f26a0b46de1326056b63e5de.html</link>
	<content:encoded>这两天web2py中的Thadeus Burgess与我讨论起uliweb中的模板，他想做移植，因为uliweb中的模板是来源于web2py的，但是经过我的修改支持block语法。不过就不再支持原来的{{include}}的。Thadeus Burgess进行了比较大的修改，现在已经被Massimo合并到web2py的trunk中了。对web2py感兴趣的同学可以去试试了。现在的web2py的模板既可以象以前一样使用，也可以使用block了。不过我没有把这个新的代码合并到uliweb中，因为有些功能还是不太一样，所以应该不会合并的。 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Python&quot;&gt;Python&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/f26a0b46de1326056b63e5de.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2010-05-05T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0416.blog">
	<title>HYRY 's Blog: 长假写书计划</title>
	<link>http://hyry.dip.jp/blogt.py?file=0416.blog</link>
	<content:encoded>&lt;p&gt;黄金周有7天的休息时间，为了不让这几天时间浪费掉，准备完成《用Python做科学计算》一书中的如下章节：&lt;/p&gt;&lt;p&gt;1. 完成SWIG部分，对用C语言编写扩展一章进行校对&lt;/p&gt;&lt;p&gt;2. 将FFT演示程序一章合并到频域信号处理中&lt;/p&gt;&lt;p&gt;3. 完成Mayavi的相关章节，并补充TVTK章节的部分内容&lt;/p&gt;&lt;p&gt;4. 补充traits制作界面一章的部分内容&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;希望能够顺利完成。&amp;nbsp;&lt;/p&gt;</content:encoded>
	<dc:date>2010-04-28T20:59:56+00:00</dc:date>
</item>
<item rdf:about="tag:blogger.com,1999:blog-33791960.post-3012611108675636830">
	<title>HuangYi 's Blog: 博客搬新家</title>
	<link>http://codeplayer.blogspot.com/2010/04/blog-post.html</link>
	<content:encoded>鉴于blogger常年在墙外，严重影响了发贴的心情。终于搭建了自己的博客。

http://www.yi-programmer.com/blog/

博客的成功运转跟下面这些光辉的名字是分不开，向创造这些东西的大牛们表示致敬，谢谢git，谢谢make，谢谢python，谢谢docutils，谢谢mako，谢谢pygments，谢谢latex。&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://blogger.googleusercontent.com/tracker/33791960-3012611108675636830?l=codeplayer.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content:encoded>
	<dc:date>2010-04-10T07:30:00+00:00</dc:date>
	<dc:creator>黄毅</dc:creator>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0406.blog">
	<title>HYRY 's Blog: 《用Python做科学计算》问卷调查和试读</title>
	<link>http://hyry.dip.jp/blogt.py?file=0406.blog</link>
	<content:encoded>&lt;p&gt;通过分析近一个月的留言，以及搜索《用Python做科学计算》在网络上的一些反应，我总结出以下两点：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;用Python做科学计算的潜在读者数量不大&lt;/li&gt;&lt;li&gt;阅读过电子版，对这方面很感兴趣的朋友都愿意购买纸质书&amp;nbsp;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;因此出版此书还有些困难，但是我不会放弃出版的努力。出版时间对我来说不是问题，但是可能会对想尽早读到此书的朋友们造成不便。为了让真正需要阅读此书的朋友尽早能读到，我决定有条件地向读者公开PDF电子版和源程序。&lt;/p&gt;&lt;p&gt;请将下面的问卷调查发送到我的邮箱(ruoyu0088 at gmail.com)，邮件主题中请使用&amp;ldquo;《用Python做科学计算》问卷调查&amp;rdquo;。我会根据回答情况，将当时最新的PDF文件和源代码发送给你(忙的时候，可能会需要一个星期的时间)。&lt;span&gt;请不要将您收到的电子版传到网络上，这样做会影响出版社出版本书的决定&lt;/span&gt;。(《可爱的Python》一书的电子版也有半年的沉默期)&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;1. 如果本书出版，您会购买几本？( 小于等于0将收不到电子版)&lt;/p&gt;&lt;p&gt;2. 为了防止电子版在网络上被公开，您同意我们&lt;span&gt;将您的邮件地址放在电子版的每页页眉之上&lt;/span&gt;吗？(不同意将收不到电子版) &lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 您会将电子版中发现的错误反馈给我们吗？&lt;/p&gt;&lt;p&gt;4. 您会为了学习本书安装并下载Python(x,y)吗？(有400多Mbytes，完全安装之后占用1G硬盘)，或者您愿意自己逐个安装Python的扩展库？&lt;/p&gt;&lt;p&gt;5. 请评价一下您的Python水平？&lt;/p&gt;&lt;p&gt;6. 您主要做哪方面的科学计算，或者对哪些方面感兴趣？&lt;/p&gt;&lt;p&gt;7. 请估计在您的同事、同学或者朋友中，有几位可能会购买本书？ &lt;br /&gt;&lt;/p&gt;&lt;p&gt;8. 您的职业是？&lt;/p&gt;&lt;p&gt;9. 您的姓名、年龄和所在地？&lt;/p&gt;&lt;p&gt;10. 对本书您有何意见或者建议？ &lt;br /&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2010-04-05T20:45:03+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.125">
	<title>Gawain's Jail: Sync Contacts Calendars with Mac, Google and Windows Mobile Phone</title>
	<link>http://blog.khsing.net/2010/03/sync-contacts-calendars-with-m.html</link>
	<content:encoded>&lt;p&gt;因为我的手机坏了，就从朋友手里借了个Dopod S1来用，但是和Mac同步数据就成了一个问题了。刚开始用SyncMate来同步，也还可以，但是最近总也是连不上，无法同步。找了找看到Google对Windows Mobile的同步支持也不错，就可以使Mac同步到Google，Google再同步到Windows Mobile，这样还省得带数据线了。&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;zem_slink&quot; href=&quot;http://apple.com/macosx/&quot; title=&quot;Mac OS X&quot; rel=&quot;homepage&quot;&gt;Mac OS X&lt;/a&gt; 10.6.2的Address Book可以直接和Google Contants同步，而10.5.x必须要有一个iPhone/iPod和iTunes同步才可以和Google同步（好奇怪的策略），没有iPhone/iPod的话就要Hack一下了，具体方法看&lt;a href=&quot;http://www.zaphu.com/2008/05/29/how-to-enable-mac-address-book-syncing-with-googles-gmail-contacts-without-an-iphone-or-mac/&quot;&gt;这一篇&lt;/a&gt;。10.5和10.6的同步的范围有一些差别，10.5是同步Gmail里的All contacts，而10.6里则是只同步My Contacts部分。不过这个和Google的同步好象不太靠谱，所以就有了&lt;a href=&quot;http://www.google.com/support/forum/p/Google+Mobile/thread?tid=69dae97a4171354b&amp;hl=en&quot;&gt;这一篇&lt;/a&gt;，其中有一个回复说明Google Sync Client是作为一个App client存在的，必须搭上MobileMe或者其他同步Address Book的服务才可以进行同步。下面两行就是把Google Sync Client换成了server类型，也就直接可以使用iSync的Sync Now来同步了。
&lt;/p&gt;&lt;pre&gt;sudo defaults write /System/Library/PrivateFrameworks/GoogleContactSync.framework/Resources/ClientDescription Type 'server'
sudo chmod 644 /System/Library/PrivateFrameworks/GoogleContactSync.framework/Resources/ClientDescription.plist
&lt;/pre&gt;
也可以用命令行来手动的触发同步。
&lt;pre&gt;/System/Library/PrivateFrameworks/GoogleContactSync.framework/Versions/A/Resources/gconsync --sync gconclid --register 1 --username user@gmail.com --password PASSWORD --syncmode fast
&lt;/pre&gt;
通过Console.app可以看到sync产生的log，来确认同步是不是在正常进行。
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;默认的同步间隔是1个小时，可以通过修改&lt;code&gt;~/Library/LaunchAgents/com.google.GoogleContactSyncAgent.plist&lt;/code&gt;文件来改变同步间隔。
&lt;/p&gt;&lt;pre&gt;	&amp;lt;key&amp;gt;StartInterval&amp;lt;/key&amp;gt;
	&amp;lt;integer&amp;gt;900&amp;lt;/integer&amp;gt;
&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;如此一来Mac和Google的同步就搞定了。而Windows Mobile和Google的同步就简单多了，看&lt;a href=&quot;http://www.google.com/support/mobile/bin/answer.py?answer=138636&amp;topic=14299&quot;&gt;这一篇&lt;/a&gt;就可以了。&lt;/p&gt;
&lt;p&gt;Update: 在&lt;a href=&quot;http://www.google.com/contacts&quot;&gt;Google Contacts&lt;/a&gt;里写新增用户的时候要写成&quot;名 姓&quot;的格式，名在前，姓在后，中间有空格。这样同步到Address Book里的时候姓和名的位置才是正确的。&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-25T14:34:14+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.126">
	<title>Gawain's Jail: 再说说Echofon和Tweetie</title>
	<link>http://blog.khsing.net/2010/03/talk-aboute-chofon-and-tweetie-again.html</link>
	<content:encoded>Echofon近期都作了很多的更新，基本上已经满足我的需求了。Tweetie最近也出了一次更新支持了官方RT，但是Echofon和Tweetie对于官方RT的处理是不同的。Tweetie上官方RT会被翻译成民间RT的模样，如果进行reply和repost的操作是针对RT这条Tw的人，并不是这个Tw的原始作者。而Echofon对官方RT的处理就是reply和repost都会针对Tw的原作者。相比之下Tweetie的风格更好一些，熟人之间更容易展开讨论。</content:encoded>
	<dc:date>2010-03-25T07:19:34+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.124">
	<title>Gawain's Jail: 又败家给MBP添了两条内存</title>
	<link>http://blog.khsing.net/2010/03/mbp.html</link>
	<content:encoded>&lt;p&gt;今天又败家给MBP添了两条DDR3-1066，单条2G的内存。花费660大洋。&lt;/p&gt;
&lt;p&gt;加了内存之后，再一次的验证了真理：花钱买回来的性能真不是盖的。开虚拟机那个速度快呀！原本想等到单条4G的便宜了再买，等了半年还是无望，算了还是先买两条2G爽爽吧。&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-18T03:49:12+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0400.blog">
	<title>HYRY 's Blog: 《用Python做科学计算》近况</title>
	<link>http://hyry.dip.jp/blogt.py?file=0400.blog</link>
	<content:encoded>&lt;p&gt;大约有两个月没有更新《用Python做科学计算》一书的电子版了。这两个月中，本书的内容仍然在持续增改。目前正在考虑出版此书，因此直到解决有关出版方面的问题，电子版将可能一直不进行更新。书出版后，可免费下载书中删除的章节以及源代码。&lt;/p&gt;&lt;p&gt;下面是这两个月更新情况。&lt;/p&gt;&lt;p&gt;编写工具方面：使用Bazaar进行版本管理，编写Leo脚本方便快速输入&lt;/p&gt;&lt;p&gt;书的内容方面：增加VPython，Weave，Cython，HDF5，xlrd，xlwd等内容。增加了几个频域声音信号处理算法。&lt;/p&gt;&lt;p&gt;其他：视频教程缓慢制作中。视频教程将以实例程序的运行演示和一些工具的操作说明为主。由于长期缺乏汉语交流，发现自己的语言表达能力有所下降，录制视频教程比较痛苦。&amp;nbsp;&lt;/p&gt;&lt;p&gt;由于国内的Python用户似乎不多，而且可能许多用户都是以Web开发为主，因此比较担心此书的销量，如果你有兴趣购买此书，或者了解用Python进行科学计算的一些情况的话，请在此留言，过段时间还准备搞一个问卷调查。&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-10T22:12:10+00:00</dc:date>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0399.blog">
	<title>HYRY 's Blog: 用VPython显示3D汽车模型</title>
	<link>http://hyry.dip.jp/blogt.py?file=0399.blog</link>
	<content:encoded>&lt;p&gt;这本来是《&lt;a href=&quot;http://hyry.dip.jp/pydoc&quot;&gt;用Python做科学计算&lt;/a&gt; 》中的一个章节，由于最近在考虑出版此书，因此许多更新的内容没有放到在线版本中去。&lt;/p&gt;&lt;p&gt;有朋友询问如何显示3D汽车模型，原来的程序是用pyopengl开发的，由于是公司的项目，不能开源。因此我用VPython重写了显示汽车模型部分的代码。现在将这部分内容提前放出来。包括blender的汽车模型，python源程序以及书中相关的章节。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://hyry.dip.jp/files/vpython_car.7z&quot;&gt;下载用VPython显示3D汽车模型&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-10T19:32:26+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.123">
	<title>Gawain's Jail: Tweetie and Echofon</title>
	<link>http://blog.khsing.net/2010/03/tweetie-and-echofon.html</link>
	<content:encoded>&lt;p&gt;我真正有用的twitter客户端主要就是Tweetie和Echofon，各有各的好，但是哪一个也不让我满意。如果这两个产品要是互相学习一下就好了。我希望一个twitter客户端能集如下功能于一身
&lt;ul&gt;
&lt;li&gt;展开一个用户的时候像Echofon拉出一个Drawer&lt;/li&gt;
&lt;li&gt;可以展开一个关联对话&lt;/li&gt;
&lt;li&gt;以看官方的retweete&lt;/li&gt;
&lt;li&gt;可以查看list&lt;/li&gt;
&lt;li&gt;能使用方向键来选择单个tweete.&lt;/li&gt;
&lt;li&gt;能使用快捷键进行reply,retweete,direct reply和repost的操作&lt;/li&gt;
&lt;li&gt;可以对重点用户的tweete打label或颜色标记&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-10T03:51:01+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.122">
	<title>Gawain's Jail: buzz和twitter代表的是两个方向</title>
	<link>http://blog.khsing.net/2010/03/buzztwitter.html</link>
	<content:encoded>&lt;p&gt;注意到Google Reader的People You Followed里老是有几条排在前面，这才发现GReader对目录有三种排序。
&lt;ul&gt;
&lt;li&gt;Sorted by newest.&lt;/li&gt;
&lt;li&gt;Sorted by oldest.&lt;/li&gt;
&lt;li&gt;Sorted by magic.&lt;/li&gt;
&lt;/ul&gt;
这个Sorted by Magic似乎就是别他人分享越多、评论越多就越排在前面。而这正是Buzz的策略，甚至Buzz的评论都会让文章排在前面。&lt;/p&gt;
&lt;p&gt;一个人的关注面是有限的，以前的我会把Greader清零才睡觉，但是后来我发现信息越来越多，我放弃了，开始只关注部分信息。同样的问题也发生在twitter上，起初我觉的信息量不够，follow了许多人，但是我同样发现信息量太大了，我处理不了那么多，开始unfo了不少，到了可以接受的情况。&lt;/p&gt;
&lt;p&gt;buzz的重点还是在集体的智慧，意在利用Google强大的计算能力和海量的信息，再加上集体的智慧来提供有用的信息。而twitter的重点是实时，过期的信息是不被重视的，保持信息新鲜的方法是被Retweete。&lt;/p&gt;
&lt;p&gt;有人的地方就有八卦和政治，而且人们谈论八卦和政治的热情比较高。这一点无论在twitter和buzz里都是有的，twitter的感觉是线性的，过去的就是过去的，不再回来。而buzz则不然，时空回转也不是不可能，几年前的讨论都可能被他人提起，进入你的视线，且提起陈旧或无趣题目的人也许你并没有follow。&lt;/p&gt;
&lt;p&gt;buzz带来的到底是惊喜还是搅扰？从目前看来搅扰的成份要大过惊喜。&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-09T07:27:06+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.118">
	<title>Gawain's Jail: 和出租车司机聊天</title>
	<link>http://blog.khsing.net/2010/03/post-9.html</link>
	<content:encoded>&lt;p&gt;前几天搬了次家，路上和出租车司机就聊起天了，聊的主要内容是小产权的房子。据司机说，村里在宅基地上盖房子，审批比较严，但是一旦盖出来了就是村里说了算了。要说这审批也好批，村里以建设新农村，家家户户住楼房为理由也就批下来了。刚开始呢村支书给大家分完了房了，余下的房子就在开始卖。但是村民很快就又买了几套。村支书还在想，这不是刚刚分完房，怎么又买房呢？后来才明白人家村民转手加2000就卖了，然后这村支书就直接把价码提高到了2000，让村里来挣这个钱。村里盖的房子有不少是电采暖，比之市政供暖还是较贵的，但是村里有卖地来的钱，所以就给每户村民补贴电暖。但是村里的宅基地是有限的，卖地的钱自然也是有限的，如果这样补贴，钱总是会贴没的。&lt;/p&gt;
&lt;p&gt;在中国村支书是直选的，所以自这个补贴开始之后，就没有那一届村支书敢把这个供暖补贴取消了。&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-09T04:19:17+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.116">
	<title>Gawain's Jail: 说说最近玩iPhone的事</title>
	<link>http://blog.khsing.net/2010/03/iphone.html</link>
	<content:encoded>&lt;p&gt;前些日子从朋友那里拿了一个iPhone 3G。拿过来时候基本就是个砖头，推测是一个已经刷到3.1.3的有锁版，后来还拿去e世界的电玩巴士请帮解锁，未成功。回来查了一些资料及刷机的方法，自己也刷了几次。这次经历算是给我补了一把iPhone的课。&lt;/p&gt;
&lt;p&gt;iPhone除了1代、3G、3GS的区别之外还有有锁版和无锁版的区别。有锁版一般是美国的和日本的，俗称美版和日版，应该也还有欧版的。国内的无锁版一般都是指港版。有锁和无锁的区别是有没有绑定了电信运营商，美版绑定的运营商是AT&amp;amp;T，而日版绑定的是SoftBank Mobile。正常来说绑定了运营商的iPhone只能使用绑定运营商的sim卡，然而非指定运营商的用户也想使用iPhone，于是就出现了卡贴，把一个非指定运营商的sim卡伪装成一个指定运营商的sim卡。后来有人通过软解的方式把iPhone的这一限制给破了，这个过程也就称之为解锁，但是软解的过程并不是一切顺利的，苹果也是通过更新软件的方式防止人们对iPhone进行解锁。最近的iPhone OS 3.1.3的升级就造成了iPhone 3G和3GS无法解锁的情况（我相信这只是暂时的）。目前iPhone 3G有锁版要是刷到了3.1.3并且baseband升到了05.12.01，那么得到的是一个增强版的iPod Touch。iPhone 3G升到3.1.3之后可以使用PwnageTool定制一个固件，选择不要升baseband，这样起码让iPhone 3G可以当个iPod使用。也可以刷回到3.1.2（这个过程会遇到1015的错误），再使用Blackra1n来解。&lt;/p&gt;
&lt;p&gt;iPhone用户经常会提到的一个事情就是JailBreak，称之为越狱。越狱后就可以安装许多Apple Store之外的应用程序了。&lt;/p&gt;
&lt;p&gt;iPhone用户经常会做同步操作，其实在同步的时候iTunes还会做备份的操作，如果你换了iPhone，那就可以使用&quot;从备份中恢复&quot;这一招把设置、联系人、Safari的书签等给恢复回来。但是要注意以前iPhone里的mp3、视频和买的应用程序就只能从iTunes中同步才能回来了。&lt;/p&gt;
&lt;p&gt;在iPhone的刷机过程中要特别注意恢复模式和DFU模式的区别，最大的区别是DFU模式下屏幕是全黑的。进入DFU模式的方法是如下：
&lt;ol&gt;
&lt;li&gt;关机&lt;/li&gt;
&lt;li&gt;同时按下Power+Home键不放，保持10秒&lt;/li&gt;
&lt;li&gt;松开Power键，Home继续不放，保持10秒&lt;/li&gt;
&lt;li&gt;松开Home键，进入DFU模式&lt;/li&gt;
&lt;/ol&gt;
这个操作我的建议是看着PwnageTool中的指导来做，非常的方便。&lt;/p&gt;
&lt;p&gt;就iPhone刷机升级这个事来看，没事别折腾。如果要折腾有几点忠告：
&lt;ol&gt;
&lt;li&gt;无论何时都不要刷官方的新版，除非你是无锁版的，并且不想越狱。&lt;/li&gt;
&lt;li&gt;对自己的iPhone要完全了解。是否有锁？什么型号？baseband是多少？。&lt;/li&gt;
&lt;li&gt;熟读解锁软件的各个注意事项，一定要读，看看自己的手机是不是在可破的范围之内等等。&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;</content:encoded>
	<dc:date>2010-03-01T08:28:21+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2010://2.113">
	<title>Gawain's Jail: 帮助怡帆</title>
	<link>http://blog.khsing.net/2010/01/post-8.html</link>
	<content:encoded>看到&lt;a href=&quot;http://www.ifanr.com/6104&quot;&gt;拯救怡帆：请帮助这位漂亮、坚强的女孩&lt;/a&gt;。我自己到今年5月底就会成为一名父亲，深感这样的事情是大不幸，希望怡帆能够挺过去，去拥有她应该拥有的童年。
&lt;pre&gt;
捐赠方式
1. 银行转账 
怡帆妈妈农业银行账户： 
户名：周萍 
账号：6228480010211053011 
开户行：中国农业银行北京市分行白石桥支行 
2. 支付宝 
怡帆基金支付宝账户：yifanfoundation@gmail.com 
3. 和睦家基金会 (美元捐款) 
&lt;/pre&gt;
另有网站：&lt;a href=&quot;http://www.help-yifan.org&quot;&gt;http://www.help-yifan.org&lt;/a&gt;，网站上也可以看到&lt;a href=&quot;http://www.help-yifan.org/donate.html&quot;&gt;捐款信息&lt;/a&gt;。望怡帆重返健康！</content:encoded>
	<dc:date>2010-02-22T03:45:19+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0373.blog">
	<title>HYRY 's Blog: Sphinx中文搜索插件</title>
	<link>http://hyry.dip.jp/blogt.py?file=0373.blog</link>
	<content:encoded>用Sphinx写文档很爽，&lt;a href=&quot;http://hyry.dip.jp/pydoc&quot;&gt;用Python做科学计算&lt;/a&gt; 就是用Sphinx编译的，但是Sphinx的搜索功能不支持中文，究其原因是因为它不支持中文分词，产生的索引文件searchindex.js中没有正确的中文单词索引。进行分词的程序在Sphinx目录的search.py文件中。此程序使用正则表达式将英文单词分出来，因此只需要将其中的两个使用 word_re变量地方替换为中文分词算法即可。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;为了维护方便，我没有直接修改此文件，而是做了一个扩展插件，其源程序如下：&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;pre&gt;from os import path

import re
import cPickle as pickle

from docutils.nodes import comment, Text, NodeVisitor, SkipNode

from sphinx.util.stemmer import PorterStemmer
from sphinx.util import jsdump, rpartition

from smallseg import SEG

DEBUG = False

word_re = re.compile(r'\w+(?u)')
seg = SEG()

stopwords = set(&quot;&quot;&quot;
a  and  are  as  at
be  but  by
for
if  in  into  is  it
near  no  not
of  on  or
such
that  the  their  then  there  these  they  this  to
was  will  with
&quot;&quot;&quot;.split())

if DEBUG:
    testfile = file(&quot;testfile.txt&quot;, &quot;wb&quot;)

class _JavaScriptIndex(object):
    &quot;&quot;&quot;
    The search index as javascript file that calls a function
    on the documentation search object to register the index.
    &quot;&quot;&quot;

    PREFIX = 'Search.setIndex('
    SUFFIX = ')'

    def dumps(self, data):
        return self.PREFIX + jsdump.dumps(data) + self.SUFFIX

    def loads(self, s):
        data = s[len(self.PREFIX):-len(self.SUFFIX)]
        if not data or not s.startswith(self.PREFIX) or not \
           s.endswith(self.SUFFIX):
            raise ValueError('invalid data')
        return jsdump.loads(data)

    def dump(self, data, f):
        f.write(self.dumps(data))

    def load(self, f):
        return self.loads(f.read())


js_index = _JavaScriptIndex()


class Stemmer(PorterStemmer):
    &quot;&quot;&quot;
    All those porter stemmer implementations look hideous.
    make at least the stem method nicer.
    &quot;&quot;&quot;

    def stem(self, word):
        word = word.lower()
        return word
        #return PorterStemmer.stem(self, word, 0, len(word) - 1)


class WordCollector(NodeVisitor):
    &quot;&quot;&quot;
    A special visitor that collects words for the `IndexBuilder`.
    &quot;&quot;&quot;

    def __init__(self, document):
        NodeVisitor.__init__(self, document)
        self.found_words = []

    def dispatch_visit(self, node):
        if node.__class__ is comment:
            raise SkipNode
        if node.__class__ is Text:
            words = seg.cut(node.astext().encode(&quot;utf8&quot;))
            words.reverse()
            self.found_words.extend(words)

class IndexBuilder(object):
    &quot;&quot;&quot;
    Helper class that creates a searchindex based on the doctrees
    passed to the `feed` method.
    &quot;&quot;&quot;
    formats = {
        'jsdump':   jsdump,
        'pickle':   pickle
    }

    def __init__(self, env):
        self.env = env
        self._stemmer = Stemmer()
        # filename -&gt; title
        self._titles = {}
        # stemmed word -&gt; set(filenames)
        self._mapping = {}
        # desctypes -&gt; index
        self._desctypes = {}

    def load(self, stream, format):
        &quot;&quot;&quot;Reconstruct from frozen data.&quot;&quot;&quot;
        if isinstance(format, basestring):
            format = self.formats[format]
        frozen = format.load(stream)
        # if an old index is present, we treat it as not existing.
        if not isinstance(frozen, dict):
            raise ValueError('old format')
        index2fn = frozen['filenames']
        self._titles = dict(zip(index2fn, frozen['titles']))
        self._mapping = {}
        for k, v in frozen['terms'].iteritems():
            if isinstance(v, int):
                self._mapping[k] = set([index2fn[v]])
            else:
                self._mapping[k] = set(index2fn[i] for i in v)
        # no need to load keywords/desctypes

    def dump(self, stream, format):
        &quot;&quot;&quot;Dump the frozen index to a stream.&quot;&quot;&quot;
        if isinstance(format, basestring):
            format = self.formats[format]
        format.dump(self.freeze(), stream)

    def get_modules(self, fn2index):
        rv = {}
        for name, (doc, _, _, _) in self.env.modules.iteritems():
            if doc in fn2index:
                rv[name] = fn2index[doc]
        return rv

    def get_descrefs(self, fn2index):
        rv = {}
        dt = self._desctypes
        for fullname, (doc, desctype) in self.env.descrefs.iteritems():
            if doc not in fn2index:
                continue
            prefix, name = rpartition(fullname, '.')
            pdict = rv.setdefault(prefix, {})
            try:
                i = dt[desctype]
            except KeyError:
                i = len(dt)
                dt[desctype] = i
            pdict[name] = (fn2index[doc], i)
        return rv

    def get_terms(self, fn2index):
        rv = {}
        for k, v in self._mapping.iteritems():
            if len(v) == 1:
                fn, = v
                if fn in fn2index:
                    rv[k] = fn2index[fn]
            else:
                rv[k] = [fn2index[fn] for fn in v if fn in fn2index]
        return rv

    def freeze(self):
        &quot;&quot;&quot;Create a usable data structure for serializing.&quot;&quot;&quot;
        filenames = self._titles.keys()
        titles = self._titles.values()
        fn2index = dict((f, i) for (i, f) in enumerate(filenames))
        return dict(
            filenames=filenames,
            titles=titles,
            terms=self.get_terms(fn2index),
            descrefs=self.get_descrefs(fn2index),
            modules=self.get_modules(fn2index),
            desctypes=dict((v, k) for (k, v) in self._desctypes.items()),
        )

    def prune(self, filenames):
        &quot;&quot;&quot;Remove data for all filenames not in the list.&quot;&quot;&quot;
        new_titles = {}
        for filename in filenames:
            if filename in self._titles:
                new_titles[filename] = self._titles[filename]
        self._titles = new_titles
        for wordnames in self._mapping.itervalues():
            wordnames.intersection_update(filenames)

    def feed(self, filename, title, doctree):
        &quot;&quot;&quot;Feed a doctree to the index.&quot;&quot;&quot;
        self._titles[filename] = title

        visitor = WordCollector(doctree)
        doctree.walk(visitor)

        def add_term(word, prefix='', stem=self._stemmer.stem):
            word = stem(word)
            word = word.strip(u&quot;!@#$%^&amp;amp;*()_+-*/\\\&quot;;,.[]{}&lt;pre&gt;&quot;)
            if len(word) = 1: return
            if word.encode(&quot;utf8&quot;).isalpha() and len(word)  3: return
            if word.isdigit(): return
            if word in stopwords: return
            
            try:
                float(word)
                return
            except:
                pass
                
            if DEBUG:
                testfile.write(&quot;%s\n&quot; % word.encode(&quot;utf8&quot;))
            self._mapping.setdefault(prefix + word, set()).add(filename)
       
        words = seg.cut(title.encode(&quot;utf8&quot;))
        for word in words:
            add_term(word)
                
        for word in visitor.found_words:
            add_term(word)


def load_indexer(self):
    def func(docnames):
        print &quot;############### CHINESE INDEXER ###############&quot;
        self.indexer = IndexBuilder(self.env)
        keep = set(self.env.all_docs) - set(docnames)
        try:
            f = open(path.join(self.outdir, self.searchindex_filename), 'rb')
            try:
                self.indexer.load(f, self.indexer_format)
            finally:
                f.close()
        except (IOError, OSError, ValueError):
            if keep:
                self.warn('search index couldn\'t be loaded, but not all '
                          'documents will be built: the index will be '
                          'incomplete.')
        # delete all entries for files that will be rebuilt
        self.indexer.prune(keep)
    return func

def builder_inited(app):
    if app.builder.name == 'html':
        print &quot;****************************&quot;
        app.builder.load_indexer = load_indexer(app.builder)

def setup(app):
    app.connect('builder-inited', builder_inited)
&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;这个扩展插件使用smallseg中文分词库进行中文分词。&lt;br /&gt;&lt;br /&gt;smallseg中文分词库下载地址: &lt;a href=&quot;http://code.google.com/p/smallseg &quot;&gt;http://code.google.com/p/smallseg &lt;/a&gt; &lt;br /&gt;&lt;/pre&gt;</content:encoded>
	<dc:date>2010-01-12T21:06:34+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.111">
	<title>Gawain's Jail: 终了2009</title>
	<link>http://blog.khsing.net/2009/12/2009.html</link>
	<content:encoded>&lt;p&gt;2009年又要过去了，一年又一年，日子总是追着走。&lt;/p&gt;
&lt;p&gt;从工作、学习和生活三个方面去说，2009年做的事真是不多，有些得过且过的感觉了。年初我有许多的计划，可是到了年终，细细的数来却没能完成几样。生活上值得庆祝的事情，一来办了婚礼，二来呢做了准爸爸。工作上没有值得庆祝的事，只有值得反省的事。学习上的事情，是觉的学的太慢了，而且网撒的太大，有点收不住的感觉了。&lt;/p&gt;
&lt;p&gt;2010年对自己的希望是：
&lt;ol&gt;
&lt;li&gt;做一个好爸爸。&lt;/li&gt;
&lt;li&gt;多学一门外语。&lt;/li&gt;
&lt;li&gt;把学习的重点放在计算机科学上，不要再搞民科了。要深一些！&lt;/li&gt;
&lt;li&gt;广交好友，提升RP。&lt;/li&gt;
&lt;li&gt;在人大的学习该有个了结了。&lt;/li&gt;
&lt;li&gt;多了解一些微观经济学的东西。&lt;/li&gt;
&lt;li&gt;克服拖沓症。&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;</content:encoded>
	<dc:date>2009-12-31T02:23:53+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0365.blog">
	<title>HYRY 's Blog: 用Python做科学计算有封面了</title>
	<link>http://hyry.dip.jp/blogt.py?file=0365.blog</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;p&gt;终于开始了10天的长假，准备在假期里面好好校对一下《用Python做科学计算》，并完成一些新的章节。&amp;nbsp;&lt;/p&gt;&lt;p&gt;为了感觉更加正规一些，花了点时间做了一个封面。图中的算式 e**(i*pi)+1的值等于0，是一个经典的数学公式，它将圆周率pi, 欧拉常数e, 虚数单位i, 和整数0和1，通过加法 乘法和幂运算结合起了。希望本书也能起到这种大融合的作用。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://hyry.dip.jp/blogt.py?action=album&amp;folder=blogpic&amp;img=page.jpg&quot; class=&quot;blogimglink&quot;&gt;&lt;img src=&quot;http://hyry.dip.jp/blogdb/album/blogpic/page.jpg&quot; alt=&quot; &quot; width=&quot;353&quot; height=&quot;500&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;</content:encoded>
	<dc:date>2009-12-26T13:01:48+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.110">
	<title>Gawain's Jail: Automator Proxy Toggle Shell</title>
	<link>http://blog.khsing.net/2009/12/automator-proxy-toggle-shell.html</link>
	<content:encoded>人都是被逼出来的，为翻墙方便，用Automator写了一个Service，就执行一段shell，还设置了一个快捷键。
&lt;pre&gt;
#!/bin/sh
STAT=`sudo networksetup -getwebproxy Ethernet | head -1 | cut -d: -f 2|sed 's/ //g'`
if [ &quot;$STAT&quot; == &quot;No&quot; ];then
	networksetup -setwebproxystate Ethernet on;
    /Users/guixing/bin/growlnotify -m &quot;Proxy On&quot;;
else
	networksetup -setwebproxystate Ethernet off;
    /Users/guixing/bin/growlnotify -m &quot;Proxy Off&quot;;
fi
&lt;/pre&gt;
&lt;code&gt;growlnotify&lt;/code&gt;是Growl的一个命令行工具。</content:encoded>
	<dc:date>2009-12-11T02:29:26+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/805691525d188b040cf3e383.html">
	<title>Limodou: mootools发布插件网站</title>
	<link>http://hi.baidu.com/limodou/blog/item/805691525d188b040cf3e383.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;可以在 &lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://mootools.net/forge/&quot; target=&quot;_blank&quot;&gt;http://mootools.net/forge/&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;/a&gt; 上访问到。关于网站发布的声明 &lt;a href=&quot;http://mootools.net/blog/2009/12/10/the-official-mootools-plugins-repository-is-here/&quot; target=&quot;_blank&quot;&gt;http://mootools.net/blog/2009/12/10/the-official-mootools-plugins-repository-is-here/&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;/a&gt; 。真是不错。不过等2.0还是让人心急啊。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Mootools&quot;&gt;Mootools&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/805691525d188b040cf3e383.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-12-11T00:00:00+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.109">
	<title>Gawain's Jail: Google的公共DNS服务</title>
	<link>http://blog.khsing.net/2009/12/googledns.html</link>
	<content:encoded>Google提供了公共的DNS服务，三金和老黄马上就想到了对CDN厂商的冲击。我看了下Google的&lt;a href=&quot;http://code.google.com/speed/public-dns/docs/performance.html&quot;&gt;Performance Benefits&lt;/a&gt;，记一笔。
&lt;p&gt;发生在解析服务器和其它DNS服务器的传输时间，有三个原因。
&lt;ul&gt;
&lt;li&gt; 无缓存。无缓存就要查其它的NS。&lt;/li&gt;
&lt;li&gt; 无法服务。要查的NS如果过载，就可能发生请求被丢弃或重发。&lt;/li&gt;
&lt;li&gt; 恶意的流量。DoS，重点是攻击，人为造成第二种情况甚至更严重。&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;无缓存的情况有一些数据，NS服务器拿到一个无缓存的请求，会导致至少1次的外部NS查询，一般情况会是2次以上。&lt;/p&gt;

&lt;p&gt;根据Googlebot的情况来看，平均解析时间是130ms，然而还有4-6%的请求会直接超时，这通常是UDP丢包或服务器无法到达。把丢包，死NS，NS配置错误等因素都计算进来的话，实际的解析时间是300-400ms。&lt;/p&gt;

&lt;p&gt;无缓存的情况较难避免，原因有三：
&lt;ul&gt;
&lt;li&gt;internet太大而且还在成长。新用户和新网站都在增长，并不是所有的网站都是那么的流行，所以大部分的请求都是无缓存的情况。&lt;/li&gt;
&lt;li&gt;TTL太短，这个好象是个趋势，短TTL带来的就是更多的NS请求。&lt;/li&gt;
&lt;li&gt;缓存是相对隔离的，NS大多放在LB设备下，缓存是随机的。所以就增加了无缓存的情况。&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;Google采用了一些方法，如下：
&lt;ul&gt;
&lt;li&gt; 提供足够的服务器。&lt;/li&gt;
&lt;li&gt; 避免恶意攻击。&lt;/li&gt;
&lt;li&gt; LB使用共享的缓存。&lt;/li&gt;
&lt;li&gt;预抓取名字解析。&lt;/li&gt;
&lt;li&gt; 提供全球服务。&lt;/li&gt;
&lt;/ul&gt;
其中新的东东是这个预抓取！&lt;/p&gt;</content:encoded>
	<dc:date>2009-12-04T04:24:05+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.108">
	<title>Gawain's Jail: 记一笔keep-alive和cache-control</title>
	<link>http://blog.khsing.net/2009/12/keep-alivecache-control.html</link>
	<content:encoded>以前看的时候大多走马观花，补补课，记一笔吧。
&lt;ul&gt;
&lt;li&gt;对于静态内容在HTTP Header中设置过期时间和最大时间，可以有效的使浏览器避免下载已经下载过的文件。&lt;/li&gt;
&lt;li&gt;js,css,图片什么的都是静态内容，都应该考虑cache，但是html不是静态内容。&lt;/li&gt;
&lt;li&gt;Expires和Cache-Control: max-age是资源终身鲜活的Cache控制。浏览器在过期之前不进行资源的鲜活检查。&lt;/li&gt;
&lt;li&gt;Last-Modified 和ETag则是对资源的一种描述，属于启发式的Cache控制，浏览器在检查之后再决定使用Cache与否。&lt;/li&gt;
&lt;li&gt;Expires 和Cache-Control: max-age，作用相同，设置其中一个即可，Last-Modified 和Etag也是冗余的设置，设置其中一个即可。&lt;/li&gt;
&lt;li&gt;设置Expires，Cache-Control支持率不及Expires。这个值通常设置1个月，不要超过1年。如果不知道过期时间，就设长一点，当发生变化的时候使用URL的指纹。&lt;/li&gt;
&lt;li&gt;要考虑到代理服务器的Cache情况，使用Cache-Control的public还是private。通常来说要set-cookie的地方就不要让代理Cache，所以设置为Private。&lt;/li&gt;
&lt;li&gt;代理Cache的情况还有压缩与否的问题，有两种方法，一种是把Cache-Control设置为Private，使代理服务器不Cache这些内容。另一种是设置Vary: Accept-Encoding的Header，这可以使代理Cache两种内容，压缩的与不压缩的。&lt;/li&gt;
&lt;li&gt;避免Firefox的URL哈希冲突，Firefox的URL哈希算法有8个字符的冲突边界。所以两个资源的URL差异应该在8个字符以上。&lt;/li&gt;
&lt;li&gt;设置正确的Vary Header，IE对于设置了Vary头的资源是不Cache的，有例外，Vary头的值是Accept-Encoding和User-Agent的时候可以被IE给Cache，所以要么不设Vary头，要么就对Vary头进行裁剪。&lt;/li&gt;
&lt;/ul&gt;

HTTP Keep-alive呢，重点看以下几个文档：
&lt;ul&gt;
&lt;a href=&quot;http://httpd.apache.org/docs/2.0/mod/core.html#keepalive&quot;&gt;http://httpd.apache.org/docs/2.0/mod/core.html#keepalive&lt;/a&gt;&lt;/ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/HTTP_persistent_connection&quot;&gt;http://en.wikipedia.org/wiki/HTTP_persistent_connection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Keepalive&quot;&gt;http://en.wikipedia.org/wiki/Keepalive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.opensource.org.cn/hdcola/2008/05/apachekeepalive-1.html&quot;&gt;Apache的KeepAlive设置与优化 - 老黄纸条箱&lt;/a&gt;（这篇是精华）&lt;/li&gt;

Keep-alive是指在同一个连接中发出和接收多次HTTP请求。优点是：
&lt;ul&gt;
&lt;li&gt; 使用较少的CPU和内存&lt;/li&gt;
&lt;li&gt;开启HTTP 管道&lt;/li&gt;
&lt;li&gt;减少网络拥堵&lt;/li&gt;
&lt;li&gt;在接下来的请求中，减少传输时间。&lt;/li&gt;
&lt;li&gt;错误可以被报告但是不关闭TCP连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在RFC 2617第47页里，一个用户客户端对任何服务器或代理不能维持2个以上的连接。代理可以维持2xN个连接。&lt;/p&gt;
&lt;p&gt;IE6和7使用 2个长连接，IE8使用6个，都是在60秒之后超时。
Firefox的长连接都是在300秒超时，同时使用的连接可以自定义（按每主机或总计），Opera与Firefox类似。&lt;/p&gt;</content:encoded>
	<dc:date>2009-12-02T02:34:35+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.107">
	<title>Gawain's Jail: 卧底经济学的小记(1)</title>
	<link>http://blog.khsing.net/2009/12/1.html</link>
	<content:encoded>&lt;ul&gt;&lt;li&gt;&lt;blockquote&gt;
还价能力来自于稀缺性。
&lt;/blockquote&gt;
稀缺有两种，一种是自然稀缺，另一种是人为稀缺。人为的通过政策和法律限制&quot;边际&quot;资源，造成资源的稀缺，进而提高了还价的能力。
&lt;/li&gt;
&lt;li&gt;
&lt;blockquote&gt;
如果1蒲式耳粮食值1美元，那么5蒲式耳粮食就是5美元的地租。如果1蒲式耳粮食值20万美元，那么5蒲式耳粮食就是100万美元的地租。
&lt;/blockquote&gt;
现行的货币系统，因其本身做为一种商品，其价值的不稳定，对普通大众甚至是有一定的欺骗性。许多人认为货币是稳定不变的，至少认为变化不大，而实际上货币是有时间成本的，是在不断贬值的。当存款的利率低于当年的通货澎胀率，那么把钱存在银行实际上是在赔钱。实际这个例子是在说羊毛出在羊身上，地租的差异是因为地皮的差异，但是地租的高低则是议价的结果。而且地皮的差异并不是一承不变的，比如买房的时候周围还没有地铁，但是后来地铁新建之后就改变了地皮与地皮之间的差异。
&lt;/li&gt;
&lt;/ul&gt;</content:encoded>
	<dc:date>2009-12-01T06:09:48+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/83e7f31f4250a269f724e462.html">
	<title>Limodou: UliPad 4.0发布</title>
	<link>http://hi.baidu.com/limodou/blog/item/83e7f31f4250a269f724e462.html</link>
	<content:encoded>&lt;p&gt;本来是懒得发布，因为最新更新也不是很多，不过从3.9发布到现在竟然也有1年多了，3.9发布还是在08年4月份，想不到时间过得真快啊。&lt;/p&gt;
&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;h1&gt;&lt;a name=&quot;12523f9f988a0757_links&quot;&gt;Links&lt;/a&gt;&lt;/h1&gt;
&lt;ul&gt;
    &lt;li&gt;Project:&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://code.google.com/p/ulipad&quot; target=&quot;_blank&quot;&gt;http://code.google.com/p/ulipad&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;source version:&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://ulipad.googlecode.com/files/ulipad.4.0.zip&quot; target=&quot;_blank&quot;&gt;http://ulipad.googlecode.com/files/ulipad.4.0.zip&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;windows exe version:&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://ulipad.googlecode.com/files/ulipad.4.0.py25.exe&quot; target=&quot;_blank&quot;&gt;http://ulipad.googlecode.com/files/ulipad.4.0.py25.exe&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;maillist:&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://groups.google.com/group/ulipad&quot; target=&quot;_blank&quot;&gt;http://groups.google.com/group/ulipad&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;ulipad snippets site:&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;a href=&quot;http://ulipad.appspot.com/&quot; target=&quot;_blank&quot;&gt;http://ulipad.appspot.com&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;(hosted by GAE)&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Ulipad&quot;&gt;Ulipad&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/83e7f31f4250a269f724e462.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-11-24T00:00:00+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.102">
	<title>Gawain's Jail: Wave和科技创新</title>
	<link>http://blog.khsing.net/2009/11/wave.html</link>
	<content:encoded>&lt;p&gt;周末参加了豆瓣举办的Python聚会，直播使用了Google的新产品----Wave，发现Wave真的可以把会议室给解放出来。&lt;/p&gt;
&lt;p&gt;刚刚接触到Wave的人，大多都有些失望，发现Wave和一个即时通信工具没有什么两样，只不过组的成员是不固定的。同样也没有带来想象中的信息爆炸。&lt;/p&gt;
&lt;p&gt;然而在这次聚会直播中，我们发现了Wave的真正实力，与IM相比Wave多出了这样几个功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以在任何时间把一个人拉入一个Wave中。（与其说是Wave不如说是Topic）&lt;/li&gt;
&lt;li&gt;可以对消息进行再次的编辑、删除操作。&lt;/li&gt;
&lt;li&gt;playback，回放可以让后来的人了解过程或者回顾讨论的顺序，比如讨论过程中拉了谁进来，谁说了什么话，谁修改了自己的或者别人的发言，哪句话被谁在什么时候给删除了等等，Wave让我们了解了这是一个过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;就上面这些功能就足以让我们不必到会议室进行讨论，而是直接在线上进行交流，快速的讨论，如果讨论过程中觉的某某人也应该参加这个讨论，那么就把他拉进来吧，就是这样，很简单，但是我们有会议记录，可以回放的会议记录。相对于会议室，缺少的可能是一个白板，我相信不久就会有这样的Widget出来。&lt;/p&gt;
&lt;p&gt;科技创新改变生活方式，也改变行业的规则。twitter提供了个人的即时广播电台，YouTube提供网络电视，Wave提供了网络会议室，Facebook提供了网络的社会关系。如果有一天机器人可以送快递，我们就真的可以足不出户的生活了。&lt;/p&gt;
&lt;p&gt;BTW: 当国际科技发展在改变国际友人的生活方式的同时，国内科技的发展同样的在改变国人的生活方式，比如翻墙。鬼子们通过网络(也许是免费的)看YouTube 1080p高清电影的时候，我们还在为自己1M ADSL付费。&lt;/p&gt;</content:encoded>
	<dc:date>2009-11-16T01:40:32+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/1e7ca044e927f088b2b7dcdb.html">
	<title>Limodou: Uliweb在stdyun的部署说明</title>
	<link>http://hi.baidu.com/limodou/blog/item/1e7ca044e927f088b2b7dcdb.html</link>
	<content:encoded>&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://stdyun.com&quot;&gt;stdyun&lt;/a&gt;是张沈鹏同学做的主机系统，在开始我申请了他提供了免费试用帐号，主要是想试一下Uliweb的部署。在使用过程中由于开始不太熟悉，获得了张教主的帮助，成功将uliwebproject部署成功，目前可以通过 uliweb.com.cn来访问（由于是试用期，因此可能随时关闭）。这个主机系统创建不久，目前已经开始可以租用，速度真是很快，提供ssh，mysql。下面是我将Uliweb的部署写出来，为Uliweb感兴趣的人提供一个部署的实例。所有尝试以svn中的最新版本为准。&lt;/p&gt;
&lt;p&gt;在stdyun上部署Uliweb还算方便。&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;准备工作&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;因为stdyun不提供缺省的二级域名，因此需要用户自行去注册一个域名并进行绑定。具体如何申请和绑定&lt;br /&gt;
张教主在我的问题中给了很好的回答，可以参考：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://groups.google.com/group/python-cn/browse_thread/thread/3b00351b97b6690a/bb28c5ec135d1b7b&quot;&gt;http://groups.google.com/group/python-cn/browse_thread/thread/3b00351b97b6690a/bb28c5ec135d1b7b&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;stdyun环境介绍&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;一旦你申请帐号成功，stdyun会发送给你有关ssh，mysql的信息，因此你可以使用putty进行登录。具体登录过程不再说明。&lt;/p&gt;
&lt;p&gt;stdyun已经安装好了一些环境，比如virtualenv，setuptools, easy_install。并且它所提供的python是最新的2.6.4。你可以认为在你的目录下已经有了基础的python环境了。&lt;/p&gt;
&lt;p&gt;virtualenv是一个很方便在一个受限环境下创建一个完整的python的工具，由于stdyun已经安装好了因此你不再需要安装。并且它已经被激活，所以激活这步也不用执行了。直接使用就好了。&lt;/p&gt;
&lt;p&gt;bin 目录是存放一些命令，如python，virtualenv的命令行工作，easy_install等。如果你在virtualenv下安装python模块，那么当存在scripts需要安装时，会安装到这个目录下。&lt;/p&gt;
&lt;p&gt;lib 用来放置python下的库。安装的python库源文件就放在这个目录下。&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;Uliweb软件安装&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;因为你已经有了一个完全由你控制的python 2.6的环境（Uliweb可以运行在2.6下），因此你可以按照Uliweb的安装说明进行操作，完全没有问题。这里我列出通过svn来安装的步骤，这样便于与Uliweb的svn保持同步。&lt;/p&gt;
&lt;p&gt;为了方便，你可以在$HOME目录下创建一个src的目录，然后进入这个目录，再在这个目录下通过svn获得Uliweb的代码，如：&lt;/p&gt;
&lt;p&gt;
&lt;table class=&quot;FCK__ShowTableBorders&quot; border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 
  2 
  3 
  4 
  5 &lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;mkdir&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;src&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;cd&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;src&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;svn&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;checkout&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;http&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;//&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;googlecode&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;com&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;svn&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;/&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;trunk&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;/&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;cd&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;python&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;setup&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;py&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;develop&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;这样就安装好Uliweb了。&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;创建Hello&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;让我们回到$HOME目录下&lt;/p&gt;
&lt;p&gt;
&lt;table class=&quot;FCK__ShowTableBorders&quot; border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 
  2 
  3 
&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;makeproject&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;hello&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;cd&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;hello&lt;/font&gt;
&lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;makeapp&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;Hello&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这时我们的Demo项目就建好了。&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;部署&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;stdyun是使用fastcgi模式。而Uliweb已经提供了这么一个文件，就在hello目录下。检查一下runcgi.fcgi它的执行权限是否是x。如果不是请修改：&lt;/p&gt;
&lt;p&gt;
&lt;table class=&quot;FCK__ShowTableBorders&quot; border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 
&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;chmod&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;runcgi&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;fcgi&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
不过这步一般不需要做，在最新的Uliweb代码中，通过svn检出的话应该已经是可执行权限了。&lt;/p&gt;
&lt;p&gt;然后要修改一下runcfi.fcgi，主要是第一行改为：&lt;/p&gt;
&lt;p&gt;
&lt;table class=&quot;FCK__ShowTableBorders&quot; border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td valign=&quot;top&quot; align=&quot;right&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt; 1 
&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#008000&quot;&gt;#!/home/vhost/s63/bin/python&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这里s63是我的用户编号，你要改成你自已的编号。&lt;/p&gt;
&lt;p&gt;修改完毕，然后就需要在stdyun的控制面板添加url与handler的对应关系。&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;绑定&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;进入： &lt;a href=&quot;http://stdyun.com/vhost/my&quot;&gt;http://stdyun.com/vhost/my&lt;/a&gt;&lt;br /&gt;
在下面的绑定域名处添加你申请的域名，如demo.uliweb.com.cn，然后点击绑定域名。&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img class=&quot;blogimg&quot; border=&quot;0&quot; src=&quot;http://hiphotos.baidu.com/limodou/pic/item/2fbfa9d3941b8b1a970a16b0.jpg&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;输入后进入目录绑定界面。我们想通过 demo.uliweb.com.cn来访问hello项目。配置如下：&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img class=&quot;blogimg&quot; border=&quot;0&quot; src=&quot;http://hiphotos.baidu.com/limodou/pic/item/a68fb838a15985ecd56225bd.jpg&quot; /&gt;&lt;br /&gt;
&lt;/span&gt;输入后点添加即可。&lt;/p&gt;
&lt;p&gt;然后过一会再访问你的域名。如 &lt;a target=&quot;_blank&quot; href=&quot;http://demo.uliweb.com.cn/&quot;&gt;http://demo.uliweb.com.cn&lt;/a&gt; 你会看到一个Hello, Uliweb的信息显示出来了。&lt;/p&gt;
&lt;p&gt; &lt;/p&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/1e7ca044e927f088b2b7dcdb.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-11-12T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/a68fb838e98dddc8d46225ed.html">
	<title>Limodou: uliweb.com.cn</title>
	<link>http://hi.baidu.com/limodou/blog/item/a68fb838e98dddc8d46225ed.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;&lt;span&gt;感谢张教主的帮助，不过现在还有一点点小问题，因为有些包还没装上。不过首页已经可以访问了。uliweb已经在张教主的stdyun上部署成功了。几点事项：&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
域名（我去的9host.cn申请的，.&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;com.cn&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;只要3块钱，续费要50元）&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;br /&gt;
有了域名要设置对应的IP（IP为：119.88.56.193），具体见张教主的说明(&lt;span class=&quot;Apple-style-span&quot;&gt;同时要注意修改9host的DNS时要使用IE浏览器。&lt;span&gt; &lt;span class=&quot;Apple-style-span&quot;&gt;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://groups.google.com/group/python-cn/browse_thread/thread/3b00351b97b6690a&quot;&gt;http://groups.google.com/group/python-cn/browse_thread/thread/3b00351b97b6690a#&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;/a&gt;&lt;br /&gt;
然后runcgi.py需要将后缀改为.fcgi。 不过这个我要再更新一下uliweb。&lt;span class=&quot;Apple-converted-space&quot;&gt; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
回头我会写一个更详细的uliweb在stdyun上的部署说明。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;声明，&lt;font color=&quot;#ff0000&quot;&gt;因为我使用的是免费试用，因此可能用的时间不会太长&lt;/font&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/a68fb838e98dddc8d46225ed.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-11-05T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/294d09fa7030b69d59ee90dd.html">
	<title>Limodou: Uliweb之Cache</title>
	<link>http://hi.baidu.com/limodou/blog/item/294d09fa7030b69d59ee90dd.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;在经过对beaker中的session替换之后，我终于又把cache给替换掉了。完全是自个儿重写。一方面它可以象一个dict一样工作，同时可以通过put, get来调用。使用这两个函数的好处就是可以有更多的参数。目前这个类在uliweb/lib/weto/cache.py中。&lt;/p&gt;
&lt;p&gt;创建cache&lt;/p&gt;
&lt;p&gt;import weto.cache&lt;/p&gt;
&lt;p&gt;cache = weto.cache.Cache()&lt;/p&gt;
&lt;p&gt;这样可以创建一个cache。因为没有指定Cache类的初始化参数，因此会自动以file格式创建cache。如果需要指定其它的格式和参数，可以设置：&lt;/p&gt;
&lt;p&gt;storage_type, options, expiry_time&lt;/p&gt;
&lt;p&gt;这三个参数。storage是类型，目前只支持'file', 'dbm', 'database'，分别对应三种不同的存储类型。&lt;/p&gt;
&lt;p&gt;options则根据不同的类型有所区别，比如'file'类型需要传入'data_dir'，用以指定cache保存的路径。而'database'则需要指明要使用的表名和数据库连接的一些信息。&lt;/p&gt;
&lt;p&gt;expiry_time是指定缺省的超时时间。这是当你在put时没有指定超时时间时使用的，在调用put时可以单独设定。&lt;/p&gt;
&lt;p&gt;cache.get(key)&lt;/p&gt;
&lt;p&gt;这样的调用，如果key不存在，或超时则会引发一个异常抛出CacheKeyException异常。&lt;/p&gt;
&lt;p&gt;如果不想引发异常，则可以：&lt;/p&gt;
&lt;p&gt;cache.get(key, default)&lt;/p&gt;
&lt;p&gt;其中default不能为None，这样当key不存在，则不会引发异常，返回default值。如果为None，则同get(key)的效果。&lt;/p&gt;
&lt;p&gt;cache.put(key, value, expire=None)&lt;/p&gt;
&lt;p&gt;这样可以设置一个cache。如果expire没有传入则使用缺省的超时时间。时间以秒为单位。&lt;/p&gt;
&lt;p&gt;同时为了方便函数的封装，还提供了&lt;/p&gt;
&lt;p&gt;cache.cache(key=None, expire=None)&lt;/p&gt;
&lt;p&gt;这个decorator。例如：&lt;/p&gt;
&lt;p&gt;@cache.cache(expire=15)&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;br /&gt;
def f(*args, **kwargs):&lt;/p&gt;
&lt;p&gt;或&lt;/p&gt;
&lt;p&gt;@cache.cache(key, expire=15)&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;br /&gt;
def f(*args, **kwargs):&lt;/p&gt;
&lt;p&gt;这两种都是可以的，区别在于前一个没有key参数，那它将根据函数名和参数来生成一个key，而后面则是由用户主动指定了一个key。&lt;/p&gt;
&lt;p&gt;在进行上进的改造之后，原来的beaker就删除了，这样uliweb中不再使用beaker了。同时对原uliweb.contrib.cache进行了修改，去掉了middle_cache.py，而采用让用户自行调用的机制。同时为了同app的配置功能相结合和方便用户使用，在uliweb/utils/cache.py中编写了一个get_cache()的函数，同时对Cache类的增加了page方法。&lt;/p&gt;
&lt;p&gt;get_cache()可以自动从settings中找到相应的配置。目前主通过两个secion来控制的：&lt;/p&gt;
&lt;p&gt;[CACHE]和[CACHE_STORAGE]，前者用来控制cache的类型和超时时间。后者是用来针对每一种类型来设置与存储相关的配置信息。在调用get_cache()时，你还可以传入一些参数，它的原型是：&lt;/p&gt;
&lt;p&gt;def get_cache(cache_setting_name='CACHE', cache_storage_setting_name='CACHE_STORAGE'):&lt;/p&gt;
&lt;p&gt;即可以指明使用其它的配置名，这样就可以在你的settings.ini中存放不同的cache的配置，通过get_cache来使用不同的cache机制。&lt;/p&gt;
&lt;p&gt;为什么要对Cache进行扩展，Cache.cache原来是针对函数本身和它的参数，但是这样对于view有一点问题。有些view可能通过QUERY_STRING来处理不同的传入参数，因此在url上它们不同，但是在view函数上是完全一样，因此这种只根据函数本身和参数是有问题的。因此扩展的page这个decorator使用了request.url值，它是一个完整的访问路径，包括了QUERY_STRING信息。因此为了生成静态cache，可以使用改造后的Cache类。当你调用get_cache()时返回的cache对象已经是使用了这个新的Cache类了。&lt;/p&gt;
&lt;p&gt;所以为了方便和更适合在Uliweb环境下使用，可以使用uliweb.utils.cache的get_cache()函数。例如：&lt;/p&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &lt;br /&gt;  6 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;utils&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;get_cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;get_cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#008000&quot;&gt;#使用缺省的settings.ini设置。因此需要加入uliweb.contrib.cache这个app &lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;expire&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;15&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;expose&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'/index'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;index&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;现在我把uliwebproject也添加了cache的支持，不过发现的问题是，不能简单的使用@cache.page()来对view方法进行处理。原因是：&lt;/p&gt;
&lt;p&gt;在view方法中有对cookie的处理，采用cache的方式会屏蔽掉这块处理&lt;/p&gt;
&lt;p&gt;因此在uliwebproject中并不是使用的decorator的方式，而是在view中对可以cache化的部分进行了手工处理，如：&lt;/p&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8 &lt;br /&gt;  9 &lt;br /&gt; 10 &lt;br /&gt; 11 &lt;br /&gt; 12 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;get_cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cache&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;_f&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;f&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;content&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;file&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;_f&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;render&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;content&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;to_html&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;template&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;content&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;env&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;application&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;get_view_env&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;content&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;to_html&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;content&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;application&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;template&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'show_document.html'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;locals&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;write&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;f&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;完全是手工来处理了。&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/294d09fa7030b69d59ee90dd.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-11-04T00:00:00+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.100">
	<title>Gawain's Jail: 那个洞</title>
	<link>http://blog.khsing.net/2009/11/post-7.html</link>
	<content:encoded>在Practice of System and Network Administration中有一章是Climb out of the Hole。这个洞就是：
&lt;blockquote&gt;
&lt;p&gt;一个家伙掉到了一个深到他不可能出来的洞里。他听到有人来了，然后他引起了那个人的注意。那个路人听完了他的境况，想了一会儿，也跳进了那个洞。&lt;/p&gt;
&lt;p&gt;&quot;你为什么要这样做？现在我们都被困在这儿了。&quot;&lt;/p&gt;
&lt;p&gt;&quot;呃〜至少你现在不再孤独了。&quot;那个路人说。&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded>
	<dc:date>2009-11-02T04:21:56+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/12f14ec2af4a093fe5dd3bb0.html">
	<title>Limodou: uliweb性能之优化思考</title>
	<link>http://hi.baidu.com/limodou/blog/item/12f14ec2af4a093fe5dd3bb0.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;性能与功能的确有些矛盾。因为开发uliweb更多是从功能上考虑，因此在性能上我一直没有太仔细测试和分析过。最近找了一个主机部署了一下，别人告诉我刷新一下CPU占用很高，于是我想有机会的确还是要好好搞一下。于是加了一些跟踪，发现了一些问题：&lt;/p&gt;
&lt;p&gt;1. get_apps() 的问题&lt;/p&gt;
&lt;p&gt;因为uliweb是采用app方式来组织，而且app是允许使用python的包形式。在启动时，为了查找app下的settings.ini和config.ini等信息，使用的是pkgresource的resource_filename，它是要导入才可以的。但是一个导入可能会使得加载变慢。这块的确有些问题。为了查找包的目录，因此要导入，但是后面的处理未必会使用这个包，显得有些浪费。因此我修改了这块处理。如果包是由a.b.c这样形式构成的，我会只导入a，后面两个直接根据a的目录生成一个路径。这样只要保证a的__init__.py中没有太多的耗时的代码就可以了。这样优化后减少了一些时间。&lt;/p&gt;
&lt;p&gt;2. pytz的问题&lt;/p&gt;
&lt;p&gt;因为uliweb的ORM会处理时区的问题，而且我写了一个utils/date.py模块专门来处理时区转换。因此在启动时，为了省事，我自动导入了date.py模块，它会自动导入pytz模块。但是我发现pytz的导入非常慢。这样造成整个uliweb的启动变慢。因此这块我直接去掉了，让用户自已来处理好了。&lt;/p&gt;
&lt;p&gt;3. 可能会引起问题的地方。app的__init__.py文件。因为考虑有些bind的代码会写在__init__.py中，因此在启动app时会自动导入所有app。因此如果有app在这里写了很耗时的代码会影响整个uliweb的启动速度。也许你会认为不好，不过uliweb已经提供了许多静态化的方法，如：bind和expose可以静态化，即在settings.ini中进行配置，这样__init__.py中可以是空的。&lt;/p&gt;
&lt;p&gt;这里的问题主要是由于方便性考虑产生的：采用自动化的方式，减少用户的导入或初始化的工作，结果使得处理范围扩大化，影响启动效率。&lt;/p&gt;
&lt;p&gt;注意我说的主要是启动时的效率，一旦启动不退出，效率要好一些。&lt;/p&gt;
&lt;p&gt;因此uliweb如果每次都是重新启动必然会造成性能下降，比较好的方式还是驻留式，不要每次启动。象mod_wsgi, fastcgi应该是可以支持的。是不是自带一个web server采用反向代理会更好呢？象java一样。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/12f14ec2af4a093fe5dd3bb0.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-11-02T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hyry.dip.jp/blogt.py?file=0346.blog">
	<title>HYRY 's Blog: 一个月统计</title>
	<link>http://hyry.dip.jp/blogt.py?file=0346.blog</link>
	<content:encoded>&lt;p&gt;用Google Analytics对【&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://hyry.dip.jp/pydoc&quot;&gt;用Python做科学计算&lt;/a&gt;&lt;/span&gt;】的访问量做了一个月的统计，本站和GAE站合计有786位访问者，1300人次访问，4000次页面访问。&lt;/p&gt;&lt;p&gt;搜索次数最多的关键词是&amp;ldquo;Python 科学计算&quot;和&quot;s&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;cipy&quot;。访问最多的页面是numpy和scipy的介绍。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;目前rst的源文件大小共244.7k字节。11月份的编辑重点将放在matplotlib和scipy的介绍部分。另外预计完成一篇关于在数字信号滤波器的应用的章节。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2009-10-27T22:41:06+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/6085b99992092e026e068cd0.html">
	<title>Limodou: 新的uliwiki项目</title>
	<link>http://hi.baidu.com/limodou/blog/item/6085b99992092e026e068cd0.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;今天开发了一个新的uliwiki的项目,不错是今天,我是照着&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/django-wikiapp/&quot;&gt;http://code.google.com/p/django-wikiapp/&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/a&gt;这个项目来做的,不过象界面,象处理许多都是重写的.因为原来的项目功能挺多,我目前还实现不了,比如:comment, tagging, notification, feed等.目前只是实现了一个基本的wiki的功能,用户认证还没有.但是wiki的功能基本上都全了:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;比如生成WikiWord链接,同时支持象[wiki:name message]的wikiword方式.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;使用reStructuredText格式(目前只支持这一种)&lt;/p&gt;
&lt;p&gt;编辑,删除,版本管理,恢复旧版本,查看旧版本.&lt;/p&gt;
&lt;p&gt;其中版本管理我做得比较简单,我是每次保留全部内容,而不是增量内容,主要是为了方便生成版本差异.而django-wikiapp是保存的增量内容,因此处理上要复杂一些.&lt;/p&gt;
&lt;p&gt;同时通过研究django-wikiapp发现了　&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/google-diff-match-patch/&quot;&gt;http://code.google.com/p/google-diff-match-patch/&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/a&gt;这个好东西,可以用来生成比较后的结果,并且还可以生成patch.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;下面上几张图,看下效果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3910/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是进入的首页面.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3911/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是某个页面的编辑页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3912/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是版本信息,先选中不同的版本,然后点上面的Compare按钮可以显示下面的比较结果.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3913/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这是使用了google-diff-match-patch显示的结果,还不错.&lt;/p&gt;
&lt;p&gt;现在uliwiki的地址在　&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/uliwiki/&quot;&gt;http://code.google.com/p/uliwiki/&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/a&gt;&amp;#160;有兴趣可以试试和完善它.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/6085b99992092e026e068cd0.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-18T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/9079bd3e7f3753f0828b13ca.html">
	<title>Limodou: 对《I have a dream》的回复</title>
	<link>http://hi.baidu.com/limodou/blog/item/9079bd3e7f3753f0828b13ca.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;原文：&amp;#160;&lt;a href=&quot;http://j-lite.net/blog/2009/10/17/i-have-a-dream&quot;&gt;http://j-lite.net/blog/2009/10/17/i-have-a-dream&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下是我的回复：&lt;/p&gt;
&lt;p&gt;我也不是为了争uliweb要比django强大，我也说了uliweb有自已的优势，而且我认为比django强的，但django也有它的优势。而且我也在邮件列表中多次声明，每个框架代表一种哲学，不同的哲学引来不同的用户，所以我离开django也可以说是我的哲学与django的哲学区别越来越多造成的。&lt;/p&gt;
&lt;p&gt;至于造轮的问题，因此我还是建议你有时间多了解一下uliweb。在今年9.5日的大会上我列举了自已创建的轮子的例子，比如：&lt;/p&gt;
&lt;p&gt;整个核心的处理完全是自已写的，它是一个框架的灵魂，负责整个框架的启动，组件管理(app管理)，配置管理，request和response处理，middleware的处理，这是每个框架不同于其它框架的核心，是无法复制的。如果只是简单的复制，那么这个框架存在的意义就没有了。其中整个app的详细支持是借鉴了django的思路，但是由我完善的。还有象view的处理，借鉴了web2py的思路，但是自已实现的。详细代码可以见uliweb.core.SimpleFrame.py.&lt;/p&gt;
&lt;p&gt;还有许多的模块是我自已写的：&lt;/p&gt;
&lt;p&gt;1. web2py的模板，已经被我改造增加了象编译文件目录支持，自定义tag支持，block的支持，这些都是原模板没有了，已经是uliweb化的组件了。&lt;br /&gt;
2.dispatch模块，完全是自已写的，实现类似于django signal的功能。但是整个实现是从ulipad发展来的，没有照搬任何人的东西。&lt;br /&gt;
3.i18n也是自已写的，是从ulipad发展来的。&lt;br /&gt;
4.weto是在我发现beaker这个session库有问题之后重写的，完全是uliweb的东西。&lt;br /&gt;
5.contrib下的所有组件都是我自已写的。&lt;br /&gt;
6.pyini完全是自已构思创造出来的，用于处理uliweb的配置文件。&lt;br /&gt;
7.orm这块是从头一点点构建的，也是一个框架很重要的部分。&lt;br /&gt;
8.form库也是自已一点点写的。&lt;br /&gt;
9.url映射的处理机制是使用了werkzeug的route为基础实现的，但是只是使用了它的基本功能，主要功能是uliweb实现的。&lt;/p&gt;
&lt;p&gt;一个框架主要完成的功能其实不外乎：url处理，request, response，view，orm，组件管理，配置管理，提供一些实用的扩展。因此，你可以看到，从架构设计，从组件的实现，许多方面都有uliweb自已的实现，甚至完全是uliweb自已的实现。因此从web2py，从django，从werkzeug，从sqlalchemy更多不是简单的引用，而是思想的借鉴，是更多的封装。&lt;/p&gt;
&lt;p&gt;所以，许多东西并不是简单了解就好象明白的。这是我想要澄清的地方。别人不认可uliweb没关系，很正常。但是我只是希望，评论一个东西首先要对它多少深入地了解一下，哪怕与作者交流一下也好，而是不看些表面。不仅从合理客观的角度来谈论一件事，更是不会误导别人。所以uliweb绝不是简单地组装出来的一个东西，它有自已特性甚至独一无二的东西。许多人一谈uliweb，就是从重装造轮的角度，但是他们并不了解许多uliweb上的设计的东西，也基本上没有在技术细节上的讨论，谈得很泛泛。这样对谁都不是公平的。&lt;/p&gt;
&lt;p&gt;你所说的框架其实目前pylons和tg都差不多，而uliweb也是可以，django也是可以，只不过pylons和tg可能从组件上可以直接选择，而uliweb,django是可以自已定制开发，不能直接使用。而且你所说的更接近于某些人更偏重于自已去建，比如这篇文章：&lt;/p&gt;
&lt;p&gt;http://pythonpaste.org/webob/do-it-yourself.html&lt;/p&gt;
&lt;p&gt;自已建是没有问题。因此框架更多是给那些不希望，甚至不能够自已来做这件事的人准备的。但是自已建，可能需要了解的东西更多，正如我在构建uliweb过程中，我学到了比以前简单使用框架更多的东西，我甚至做了许多以前不知道自已还可以做的事情。各有各的乐趣。&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/9079bd3e7f3753f0828b13ca.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-18T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/7a7fb58f3a6dc9e4f01f3681.html">
	<title>Limodou: 关于Webob无法支持flash文件上传问题的记录</title>
	<link>http://hi.baidu.com/limodou/blog/item/7a7fb58f3a6dc9e4f01f3681.html</link>
	<content:encoded>&lt;em&gt;根据邮件列表中的回复加工&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
1. 提出问题：&lt;br /&gt;
&lt;br /&gt;
使用webob在处理通过fancyupload上传的文件，发现会系统挂起，但只要先把request.body读出来就没有问题。因此在uliweb中，将原来使用的webob去除，改成了werkzeug来处理了。&lt;br /&gt;
&lt;br /&gt;
2. qiangninghong的试验：&lt;br /&gt;
&lt;br /&gt;
因为limodou反应的这个问题认为是cgi模块有bug导致的，所以很重要。今天晚上稍稍有点时间，写了一个测试程序来验证一下，但是发现似乎没有这样的情况？&lt;br /&gt;
&lt;br /&gt;
测试代码在这里 http://code.google.com/p/hongqnlib/source/browse/&lt;br /&gt;
&lt;br /&gt;
就是照着 FancyUpload 的 Attach File demo 页面 ( http://digitarald.de/project/fancyupload/3-0/showcase/attach-a-file/ ) 翻译了一下。运行 server.py 后，访问 http://localhost:5002/ ，上传了几个文件，都没有出现挂住的情况啊？&lt;br /&gt;
&lt;br /&gt;
难道是我的这个测试有什么问题？请 limodou 帮忙看看。&lt;br /&gt;
&lt;br /&gt;
3. 我的试验：&lt;br /&gt;
&lt;br /&gt;
我把你的程序改了一下：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8 &lt;br /&gt;  9 &lt;br /&gt; 10 &lt;br /&gt; 11 &lt;br /&gt; 12 &lt;br /&gt; 13 &lt;br /&gt; 14 &lt;br /&gt; 15 &lt;br /&gt; 16 &lt;br /&gt; 17 &lt;br /&gt; 18 &lt;br /&gt; 19 &lt;br /&gt; 20 &lt;br /&gt; 21 &lt;br /&gt; 22 &lt;br /&gt; 23 &lt;br /&gt; 24 &lt;br /&gt; 25 &lt;br /&gt; 26 &lt;br /&gt; 27 &lt;br /&gt; 28 &lt;br /&gt; 29 &lt;br /&gt; 30 &lt;br /&gt; 31 &lt;br /&gt; 32 &lt;br /&gt; 33 &lt;br /&gt; 34 &lt;br /&gt; 35 &lt;br /&gt; 36 &lt;br /&gt; 37 &lt;br /&gt; 38 &lt;br /&gt; 39 &lt;br /&gt; 40 &lt;br /&gt; 41 &lt;br /&gt; 42 &lt;br /&gt; 43 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;os&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mimetypes&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;time&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;socket&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;hashlib&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;md5&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;simplejson&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;as&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;json&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;webob&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;webob&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;exc&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;paste&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;urlparser&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;StaticURLParser&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;paste&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cascade&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;Cascade&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;logging&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;paste&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;fileapp&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;app&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;environ&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;start_response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#000000&quot;&gt;request&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;webob&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Request&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;environ&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;request&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;method&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'GET'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;filename&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;request&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;path_info&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lstrip&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'/'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;fileapp&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;FileApp&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;filename&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;#        logging.error( repr(request.body))&lt;br /&gt;&lt;/font&gt;       &lt;font color=&quot;#000000&quot;&gt;filedata&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;request&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;POST&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'Filedata'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;dict&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;status&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'1'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;name&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;filedata&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;filename&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;text&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;filedata&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;file&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;read&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'hash'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;md5&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;text&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;hexdigest&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;request&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;params&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;get&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'response'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'xml'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;webob&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;content_type&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'text/xml'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;print&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;body_file&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'&amp;lt;response&amp;gt;'&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;k&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;v&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;in&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;items&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;               &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;print&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;body_file&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; \&lt;br /&gt;                       &lt;font color=&quot;#804000&quot;&gt;&amp;quot;&amp;lt;%(k)s&amp;gt;&amp;lt;![CDATA[%(v)s]]&amp;gt;&amp;lt;/%(k)s&amp;gt;&amp;quot;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;%&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;locals&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;print&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;body_file&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'&amp;lt;/response&amp;gt;'&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;webob&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;content_type&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'application/json'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt;&lt;br /&gt;                                     &lt;font color=&quot;#000000&quot;&gt;body&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;json&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dumps&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;environ&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;start_response&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#008000&quot;&gt;#static_app = StaticURLParser('/static')&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;#app = Cascade([static_app, app], (404, 405))&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;__name__&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'__main__'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;wsgiref&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;simple_server&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;make_server&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#000000&quot;&gt;server&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;make_server&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'localhost'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;5002&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;app&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#000000&quot;&gt;server&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;serve_forever&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
分析如下：&lt;br /&gt;
&lt;br /&gt;
1. 使用你的程序的确没有问题，使用我改的程序就有问题&lt;br /&gt;
2. 两个差别在于你在调用处理前使用了一个StaticURLParser，而我改后的程序是不使用它，在app中自已处理。这样的目的并不是使用StaticURLParser不行，而是这样的做法其实是在app处理前多了一层处理，那么这层处理会影响后面的处理，掩盖问题的发生。&lt;br /&gt;
3. 在我的例子中，只要把#&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; logging.error( repr(request.body))这行的注释去了，程序就正常。&lt;br /&gt;
4. 原因就是，只要你想办法在执行request.POST['Filedata']之前执行了象request.body之类的代码，这样会引起对body的整个读取，这时读取是按Content-Length来处理的，并且会放在缓冲区中，因此后续的处理就是从这个缓冲区来的了，因此缓冲区最后有没有回车换行是没有关系的。而使用flash控件上传文件，文件体示例如下：&lt;br /&gt;
&lt;br /&gt;
ERROR:root:'------------ei4GI3ei4Ef1Ef1GI3ei4Ij5GI3GI3\r\nContent-Disposition:&lt;br /&gt;
form-data; name=&amp;quot;Filename&amp;quot;\r\n\r\na.c\r\n------------ei4GI3ei4Ef1Ef1GI3ei4Ij5GI3G&lt;br /&gt;
I3\r\nContent-Disposition: form-data; name=&amp;quot;Filedata&amp;quot;;&lt;br /&gt;
filename=&amp;quot;a.c&amp;quot;\r\nContent-Type:&lt;br /&gt;
application/octet-stream\r\n\r\n#include&lt;br /&gt;
&amp;lt;stdio.h&amp;gt;\r\n\r\n------------ei4&lt;br /&gt;
GI3ei4Ef1Ef1GI3ei4Ij5GI3GI3\r\nContent-Disposition: form-data;&lt;br /&gt;
name=&amp;quot;Upload&amp;quot;\r\n\r\nSubmit&lt;br /&gt;
Query\r\n------------ei4GI3ei4Ef1Ef1GI3ei4Ij5GI3GI3--'&lt;br /&gt;
&lt;br /&gt;
可以看到，最后是没有\r\n的。这不是浏览器的问题，是flash组件本身的问题，相关的flash的类本身的问题。但其实也不算一个问题，因为cgi的处理是基于multipart的boundary需要以\r\n结束这个假设，但这种假设在某些情况下有问题。相应的cgi的代码如下（从cgi.py中找到的703行）：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;read_lines_to_eof&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;self&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#804000&quot;&gt;&amp;quot;&amp;quot;&amp;quot;Internal: read lines until EOF.&amp;quot;&amp;quot;&amp;quot;&lt;/font&gt;&lt;br /&gt;   &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;while&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;line&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;self&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;fp&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;readline&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;lt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;16&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;line&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#000000&quot;&gt;self&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;done&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;br /&gt;           &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;break&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;       &lt;font color=&quot;#000000&quot;&gt;self&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;__write&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;line&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
就是这个readline造成的，如果没有\r\n它根本不会返回。&lt;br /&gt;
&lt;br /&gt;
因此前面的问题就是，如果不先执行request.body，则后面的request.POST['Filedata']会从流中进行读取，而不是缓冲区中，但flash正好又不返回\r\n，因此server在使用readline就停处了，造成挂起，进而引发浏览器的flash控件的超时。&lt;br /&gt;
&lt;br /&gt;
而你的例子使用了StaticURLParser，可能会进行request.body的读取，所以掩盖了这个问题。当然它到底怎么做的，我没有继续深究。因此我改了你的程序，就是为了不让其它的因素干扰，问题就暴露出来了。&lt;br /&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/7a7fb58f3a6dc9e4f01f3681.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-17T00:00:00+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.94">
	<title>Gawain's Jail: 又一次败家Canon 450D</title>
	<link>http://blog.khsing.net/2009/10/canon-450d.html</link>
	<content:encoded>&lt;p&gt;终于入手了本人的第一台数码单反机。败家记录如下：
&lt;ul&gt;
&lt;li&gt;Canon 450D单机，¥3850。&lt;/li&gt;
&lt;li&gt;Canon Lens EF 50mm f1.8 II，¥700。&lt;/li&gt;
&lt;li&gt;SanDisk Extreme III 4GM，¥150。&lt;/li&gt;
&lt;li&gt;Kenko UV，¥70。&lt;/li&gt;
&lt;li&gt;普通包一个，¥70。&lt;/li&gt;
&lt;li&gt;3'屏贴一个，送。&lt;/li&gt;
&lt;/ul&gt;
总计¥4830（免了¥10，真少啊，T_T）。
&lt;/p&gt;
&lt;p&gt;半年前，岳父给我了一个美能达X300的单反和一个VR神镜，胶片机的，还有一些很老很老的设备，比如红梅的机器。可惜，到现在一次也没有用过。&lt;/p&gt;</content:encoded>
	<dc:date>2009-10-15T09:13:47+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/d5c135a89aa3d4bbca130c4c.html">
	<title>Limodou: Uliweb中ORM的新变化</title>
	<link>http://hi.baidu.com/limodou/blog/item/d5c135a89aa3d4bbca130c4c.html</link>
	<content:encoded>最近一段时间一直在忙着ORM的优化，其中有几点：&lt;br /&gt;
&lt;br /&gt;
1.增加__table_args__的配置。它和__tablename__一样是定义在Model类中的，可以用来增加在执行Table时添加新的一些参数，如果你使用mysql，可以如下定义：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;class&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;Todo&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;__table_args__&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;dict&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mysql_engine&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'InnoDB'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;mysql_charset&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'utf8'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这样将在建表时，向Table中添加这样的信息。上面的代码将以InnoDB和utf8编码来创建todo表。&lt;br /&gt;
&lt;br /&gt;
2.增加OnInit类方法的调用。这个方法是交给用户来定义的，可以用来执行在执行完Table之后的一些初始化操作，它将在建表之前。比如：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000c0&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;classmethod&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;OnInit&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;Index&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'my_indx'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;c&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;title&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;c&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;owner&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;unique&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;True&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这样将创建以title, owner的索引，并且索引不允许重复。目前只支持索引的创建。对于简单的索引，是可以在定义Field时直接设置index=True来创建的，并不需要这种方式。这种方式可以认为就是为了创建多个字段的联合索引。&lt;br /&gt;
&lt;br /&gt;
3.考虑缺省order_by的实现。但是想用户完全可以在Model中定义相应的方法来实现，类似于django的Manager的东西，比如：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;class&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;Todo&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000c0&quot;&gt;@&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;classmethod&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;files&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;all&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;order_by&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;cls&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;c&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;title&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;desc&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
然后在使用时可以通过Todo.files()来返回按title降序排列的结果。所以使用这种方法倒是不一定要支持缺省order_by的配置项。不过有这个配置项的好处就是当需要实现通用的查询时，它可以自动生效。不过也可以考虑把结果集当成一个参数传给配置功能，总之还是有方法。&lt;br /&gt;
&lt;br /&gt;
4.最重要的一个特性。增加表的注册，并且注册的表不一定是一个Model，而是一个模块名的形式，如以下两种都是正确的注册方式：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;set_model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;tablename&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'user'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;set_model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'uliweb.contrib.auth.models.User'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;tablename&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'user'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这样注册之后，你就可以通过使用真正的表名来得到对应的Model类对象了。通过：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;User&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;get_model&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'user'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这种方式首先可以使用在关系的定义中，如：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#000000&quot;&gt;Reference&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'user'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;ManyToMany&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'user'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
对于关系定义，它可以根据表名自动导入对应的Model。而对于在程序中想直接使用某个Model，则可以通过get_model()来获取。&lt;br /&gt;
&lt;br /&gt;
但是这种get_model()的方式要依赖于set_model()的注册过程。注册有几种方式：&lt;br /&gt;
&lt;br /&gt;
1. 在导入Model文件时，随着Model的class的创建自动会调用set_model()来注册，因此只要正常导入相应的模块，就可以使用get_model()方法了。这种情况下，对通常的开发没有什么影响，用户甚至不必使用这种方式。&lt;br /&gt;
&lt;br /&gt;
2. 由框架来注入。也就是uliweb来实现。这种方式首先要求将Model信息写入到settings.ini中，比如：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;MODELS&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;user&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'uliweb.contrib.auth.models.User'&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
这样当uliweb在启动时可以自动采集注册信息。然后在orm这个app的__init__.py中执行真正的注册工作，通过调用set_model()方法。这时，注册的就不是Model了，而是字符串形式的信息。&lt;br /&gt;
&lt;br /&gt;
然后在某个地方，如views.py中使用get_model()或导入models.py时，就可以自动生效了。&lt;br /&gt;
&lt;br /&gt;
你可能会问，这有什么用呢？一般不都是直接导入来使用吗？完全够用了。&lt;br /&gt;
&lt;br /&gt;
的确，一般的程序的确是根本用不上。但是Uliweb是一个框架，它要考虑代码的复用和替换的问题。考虑一下，在你的models.py可能需要对User表进行处理，那么你会去导入它。但是有可能这个User表不适合你的应用了，你怎么办？并且这个User表不是你自已写的，而是框架或别人提供的，别人可能还要依赖于这个表。因此简单的直接修改并不一定是好办法，因为它可能不受你的控制。重新写一个可能是好办法，但是因为直接导入的原因，比如你是通过：&lt;br /&gt;
&lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;from&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;uliweb&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;contrib&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;auth&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;models&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;User&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
这可是直接hard code了，所以重新写必然还要修改导入的代码。那么要解决这个问题，可以采用的一种办法就是将外部依赖的内容配置化，和java中的注入依赖有些象。也就是我在定义自已的东西时，可能需要外部的东西，那么我并不直接导入，而是通过一种获取的方式来得到。这样工并不需要知道外部的组件的实际位置，这件事由框架来完成。因此uliweb现在实现的get_model就是为了实现这一配置化而设计的。&lt;br /&gt;
&lt;br /&gt;
其实现在，象bind，expose都已经是可以配置化的了，都可以放在settings.ini中。如果完全配置化，将可以减少启动时的导入处理，并且替换会很容易。 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/d5c135a89aa3d4bbca130c4c.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-15T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/88483801857fe1047bec2c88.html">
	<title>Limodou: pyini.py的新功能</title>
	<link>http://hi.baidu.com/limodou/blog/item/88483801857fe1047bec2c88.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p&gt;pyini.py是处理Uliweb的settings.ini的模块，今天向它添加了三个新的方法：set_var, get_var, del_var，它们的特点集中在第一个参数，它可以是'/'分开的字符串，如：'DEFAULT/flag'，它相当于：&lt;/p&gt;
&lt;p&gt;s = ini.add('DEFAULT')&amp;#160;&lt;br /&gt;
s['flag'] = True&amp;#160;&lt;/p&gt;
&lt;p&gt;注意，它只支持一层的'/'切分，如：'DEFAULT/flag/name'相当于 'DEFAULT'和'flag/name'。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/88483801857fe1047bec2c88.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-15T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/855530ad579921034a36d646.html">
	<title>Limodou: 关于《谈谈我对Uliweb的看法》的回复</title>
	<link>http://hi.baidu.com/limodou/blog/item/855530ad579921034a36d646.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;原文：&amp;#160;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://j-lite.net/blog/2009/09/28/lets-talk-about-uliweb&quot;&gt;http://j-lite.net/blog/2009/09/28/lets-talk-about-uliweb&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;回复如下：&lt;/p&gt;
&lt;p&gt;&lt;span&gt;首先感谢对Uliweb的批评。 以下要澄清：&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;1. 其实所有的框架都是大杂烩，django也不利外。而且别人做好的东西，如果没有什么问题，拿过来用当然就可以了。特别象是框架，它更多的是提供管理模式和一些工具，本身就是个大杂烩。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;2. 大一统是不可能的，正如世界上有那么多可以统一的东西为什么没有统一，如：语言，操作系统，数据库？因为多样性才是这个世界的特点。更因为人们总有不同的思念和需求。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;3. 为什么不向django和web2py做贡献？贡献我的确做过，如果你去查django和web2py相关的内容，应该还有我的名字。但是有些东西是不可调合的，比如对设计的一些看法，对一些组件的使用，这些东西我建议过，他们并不接受。所以只有以自已的方式来构造。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;重新构造也是一个很痛苦的过程，但是可以让造出来的东西完全按自已的意愿发展，也是一种不错的选择。更有一些人不建议使用框架，而是使用组件，为什么，就是不想被框架所束缚。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;而你所说的插件系统，就是uliweb实现的一个目标。uliweb的app的功能要比django还要彻底。如果有兴趣欢迎与我交流。&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/855530ad579921034a36d646.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-15T00:00:00+00:00</dc:date>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.91">
	<title>Gawain's Jail: 老婆怀孕了</title>
	<link>http://blog.khsing.net/2009/10/post-6.html</link>
	<content:encoded>十一检查出老婆怀孕了，我要做爸爸了。开出一个新的blog－&lt;a href=&quot;http://baby.khsing.net&quot;&gt;白宝宝诞生记&lt;/a&gt;，用来记录孩子从孕育的过程。我很激动！</content:encoded>
	<dc:date>2009-10-13T06:26:10+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="tag:blog.khsing.net,2009://2.75">
	<title>Gawain's Jail: 翻译了一本书中关于MacBook电池问题的解决方法</title>
	<link>http://blog.khsing.net/2009/09/macbook.html</link>
	<content:encoded>&lt;p&gt;在公司班车上闲来无事就翻了翻&lt;a href=&quot;http://www.douban.com/subject/2303791/&quot;&gt;《Mac OS X Snow Leopard - Pocket Guide》&lt;/a&gt;这本书。看了其中关于电池问题的一些解决方法就随手翻译出来了。下面是译文：&lt;/p&gt;

&lt;p&gt;MacBook的用户要面对一个桌面电脑用户所没有的问题，电池。大多数苹果电池的目标就是在300次完全充电周期之后还能提供原电池容量80%的电力（新的MacBook上是1000次）。想查看你的电池情况，第一个地方就是System Profiler-&gt;Power。&lt;/p&gt;
&lt;p&gt;System Profiler的电源部分可以看到电池在完全充电后的电池容量、充电的次数以及电池的情况。如果充电次数已经接近电池的最大利用率，那也就是考虑更换新的电池的时候了。如果你的充电次数很少，但是电池还是早泄，你可以试试下面这些招数：&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;校正电池&lt;/dt&gt;
&lt;dd&gt;在每个MacBook电池内部都有一个微控制器来告诉电脑还有多长将耗尽电力。有时，这个估算值可能和实际的性能偏差许多。要使电脑和这个控制器趋于一致，你需要重新校正电池。可以这样做，充满电池并且保持接通电源2个小时以上，然后拨掉电源。当出现电池电力严重不足的警告时，保存好你的文档，直到电脑进入睡眠状态，并且持续五个小时以上。再次接上电源充满电池。这时电池的指示器已经重新校正成功了。&lt;/dd&gt;
&lt;dt&gt;重置SMC&lt;/dt&gt;
&lt;dd&gt;SMC是系统管理控制器（System Management Controller）的缩写。这个芯片会对硬盘的减速、睡眠、唤醒和背光做出相应的反应。一个失灵的SMC可以阻止电池充电。要重置SMC（在关机之后），须先取下电池并且不接电源。按下电源键5秒。重新安回电池并且接通电源，启动电脑。这一招对于内置电池的MacBooks是无效的。对于这样的型号，关机并接通电源，然后按下左边的Shift-Control-Option和电源键5秒，重新启动电脑。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;如果上述的招术都不能恢复你的电池，差不多就该去当地的苹果专卖店或授权维修中心的时候了。如果你的电脑在保，并且你的充电次数很低。苹果也许会更改你的电池。如果你的充电次数超过了推荐值（300次，新型号是1000次），而且性能的哀减是在意料之中，你也许需要更换电池或者与低电池容量继续生活。&lt;/p&gt;
&lt;p&gt;注意：就像许多电脑制造商，苹果也有部分电池被召回。一些情况下是危险的电池被召回，另外的情况下是因为性能原因被召回。不管怎样，你都应该查查看你的电池是否在召回的范围之内。通常来说，苹果会为你更换电池，既便电脑已经过保。&lt;/p&gt;</content:encoded>
	<dc:date>2009-10-13T02:53:54+00:00</dc:date>
	<dc:creator>Guixing</dc:creator>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/f4bfd31b0e794fdfac6e755c.html">
	<title>Limodou: Uliweb被Softpedia Team收录</title>
	<link>http://hi.baidu.com/limodou/blog/item/f4bfd31b0e794fdfac6e755c.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;原文如下：&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Congratulations,&lt;br /&gt;
&lt;br /&gt;
Uliweb, one of your products, has been added to Softpedia's database of&lt;br /&gt;
software programs for Linux. It is featured with a description text,&lt;br /&gt;
screenshots, download links and technical details on this page:&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://linux.softpedia.com/get/Internet/HTTP-WWW-/Uliweb-51417.shtml&quot;&gt;http://linux.softpedia.com/get/Internet/HTTP-WWW-/Uliweb-51417.shtml&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
The description text was created by our editors, using sources such as&lt;br /&gt;
text from your product's homepage, information from its help system, the&lt;br /&gt;
PAD file (if available) and the editor's own opinions on the program&lt;br /&gt;
itself.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you feel that having your product listed on Softpedia is not a benefit&lt;br /&gt;
for you or simply need something changed or updated, please contact us via&lt;br /&gt;
email at&amp;#160;&lt;a href=&quot;mailto:webmaster@softpedia.com&quot;&gt;webmaster@softpedia.com&lt;/a&gt;&amp;#160;and we will work with you to fix any&lt;br /&gt;
problem you may have found with the product's listing.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Sincerely,&lt;br /&gt;
The Softpedia Team&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不知道算不算好事。不过Uliweb还有许多需要完善的地方，我才把0.0.1a2发布上去，过会就收到了。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/f4bfd31b0e794fdfac6e755c.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-13T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/717dd0004a22991b738b654b.html">
	<title>Limodou: Adding new feature about the URL suffix definition of an App</title>
	<link>http://hi.baidu.com/limodou/blog/item/717dd0004a22991b738b654b.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;You know, Uliweb uses expose() to define url, for example:&lt;br /&gt;
&lt;br /&gt;
@expose('/index')&lt;br /&gt;
&lt;br /&gt;
But when you want to change the url suffix for an App, you should edit every views file(of cause you can use static urls.py appoach, but I won't talk about it now). Fox example how to change '/wiki/*' to '/mywiki/*'? So I add this new feature to Uliweb, so that you can define the URL suffix for an App, just adding an entry to URL session, for example:&lt;br /&gt;
&lt;br /&gt;
[URL]&lt;br /&gt;
wiki = '/wiki'&lt;br /&gt;
&lt;br /&gt;
If you didn't define an entry for wiki app, all urls in wiki app won't be changed at all. But if you define wiki='/wiki' in settings, all urls in wiki app will be added '/wiki' automatically, even though the urls is started with '/'. So '/index' will be converted to '/wiki/index'. So for above problem, you can just change wiki='/mywiki'.&lt;br /&gt;
&lt;br /&gt;
And the entry key will be the appname, it's the same with app module name, for example: uliweb.contrib.admin, etc.&lt;br /&gt;
&lt;br /&gt;
So in this feature, you can easily change an app URL suffix.&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/717dd0004a22991b738b654b.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-13T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/0ee5eaf862650505d9f9fdb1.html">
	<title>Limodou: 如何在你的程序中象easy_install一样来安装模块</title>
	<link>http://hi.baidu.com/limodou/blog/item/0ee5eaf862650505d9f9fdb1.html</link>
	<content:encoded>在Uliweb中，用户可以自已编写App，而且这些App可能依赖于其它的模块，因此如何安装是一个问题。因此我想到利用easy_install来实现这一目的。其实很简单，找到easy_install程序，打开看一下它的实现：&lt;br /&gt;
&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
from pkg_resources import load_entry_point&lt;br /&gt;
sys.exit(&lt;br /&gt;
load_entry_point('setuptools==0.6c9', 'console_scripts', 'easy_install')()&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
于是改造一下：&lt;br /&gt;
&lt;br /&gt;
def install(packages):&lt;br /&gt;
from pkg_resources import load_entry_point&lt;br /&gt;
&lt;br /&gt;
load = load_entry_point('setuptools', 'console_scripts', 'easy_install')&lt;br /&gt;
load(packages)&lt;br /&gt;
&lt;br /&gt;
可以用了。&lt;br /&gt;
&lt;br /&gt;
使用时：&lt;br /&gt;
&lt;br /&gt;
load(['SQLAlchemy'])&lt;br /&gt;
&lt;br /&gt;
就可以安装SQLAlchemy了。 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/0ee5eaf862650505d9f9fdb1.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-13T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/6085b999e3691f026f068c70.html">
	<title>Limodou: Python Web框架代码“秀”第4题已出</title>
	<link>http://hi.baidu.com/limodou/blog/item/6085b999e3691f026f068c70.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;a href=&quot;http://wiki.woodpecker.org.cn/moin/FrameworksShow&quot; target=&quot;_blank&quot;&gt;http://wiki.woodpecker.org.cn/moin/FrameworksShow&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
第4题：CSS文件引用 静态文件的使用，在模板文件中引入default.css(内容见下面说明)&lt;br /&gt;
&lt;br /&gt;
default.css&lt;br /&gt;
&lt;br /&gt;
h1 {border:1px solid #f00;}&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/6085b999e3691f026f068c70.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-13T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/0e77267fdba3550229388a5c.html">
	<title>Limodou: SQLAlchemy 0.6快要出来了</title>
	<link>http://hi.baidu.com/limodou/blog/item/0e77267fdba3550229388a5c.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;变化真是不少，不过大部分都是代码的重构，因为用得少，所以体会并不深。不过至少我看到DDL可以象其它的表达式对象被打印了。比如：&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;pre&gt;&lt;strong&gt;&lt;span class=&quot;code-lang&quot;&gt;from&lt;/span&gt;&lt;/strong&gt; sqlalchemy.schema &lt;strong&gt;&lt;span class=&quot;code-lang&quot;&gt;import&lt;/span&gt;&lt;/strong&gt; CreateTable&lt;br /&gt;&lt;br /&gt;create = CreateTable(mytable)&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span class=&quot;code-comment&quot;&gt;# dumps the CREATE TABLE as a string&lt;br /&gt;&lt;/span&gt;&lt;/em&gt;&lt;strong&gt;&lt;span class=&quot;code-lang&quot;&gt;print&lt;/span&gt;&lt;/strong&gt; create&lt;/pre&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;这是我非常想要的。这样就可以象django一样，打印出建表的SQL语句了。现在的Uliweb用的方法有问题。考虑着什么时候换成0.6啊。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sqlalchemy.org/trac/wiki/06Migration&quot;&gt;http://www.sqlalchemy.org/trac/wiki/06Migration&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/0e77267fdba3550229388a5c.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-13T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/b07ab7fd5e16801c08244d7f.html">
	<title>Limodou: Python Web Framework代码“秀”第三题已出</title>
	<link>http://hi.baidu.com/limodou/blog/item/b07ab7fd5e16801c08244d7f.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;由&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;ubunoon&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/span&gt;出的，已经完成pylons和uliweb的实现。响应者不多啊。&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://wiki.woodpecker.org.cn/moin/FrameworksShow&quot;&gt;http://wiki.woodpecker.org.cn/moin/FrameworksShow&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Python&quot;&gt;Python&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/b07ab7fd5e16801c08244d7f.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-12T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/58e2ac4be4b34bfa83025c2f.html">
	<title>Limodou: 使用setuptools上传Uliweb版本</title>
	<link>http://hi.baidu.com/limodou/blog/item/58e2ac4be4b34bfa83025c2f.html</link>
	<content:encoded>新版本发布了，是使用setuptools发布的。有几个注意的：&lt;br /&gt;
&lt;br /&gt;
1. 要首先使用setup.py register先认证或注册新用户。那么在windows下要注意，在命令行要设置一下：&lt;br /&gt;
&lt;br /&gt;
set HOME=directory&lt;br /&gt;
&lt;br /&gt;
这个目录随便，我就设成'.'了，表示当前目录。这样，在执行完register之后就会提示你将登录信息保存在这个目录下，后面在上传时会使用保存的认证信息。&lt;br /&gt;
&lt;br /&gt;
2. 上传时使用 setup.py sdist upload&lt;br /&gt;
&lt;br /&gt;
3. 我发现如果在code.google.com/p也上传了，在下载时会先从这里下载，很有意思&lt;br /&gt;
&lt;br /&gt;
4. 测试你的安装吧。如果有问题，你可以先登录pypi，然后将相应的包删除，再上传就可以了。但是如果在code.google.com/p还有版本，要把它也删除，好在现在是可以删除了。因此建议你安装测试成功后再上传到google去。 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/58e2ac4be4b34bfa83025c2f.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-02T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/bd095fdf6b28f31948540321.html">
	<title>Limodou: Uliweb 0.0.1a1 is released!</title>
	<link>http://hi.baidu.com/limodou/blog/item/bd095fdf6b28f31948540321.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Though Uliweb is not so good for me, but I think I should release, because this is a attempt, and I'll make uliweb better and better.  So from now on, you can install Uliweb via:  easy_install Uliweb  But not need to use svn to checkout. Of cause I suggest that you use svn, because you can keep with the newest features of uliweb.&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/bd095fdf6b28f31948540321.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-02T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/b3882cf502aeaf2fbc310998.html">
	<title>Limodou: Uliweb又在大规模调整中</title>
	<link>http://hi.baidu.com/limodou/blog/item/b3882cf502aeaf2fbc310998.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;今天对Uliweb改动了不少，主要有：&lt;/p&gt;
&lt;p&gt;1. ORM进行了优化，利用了SQLAlchemy的Generative功能，可以实现象Model.filter().filter().order_by()等，多子句的形式，同时对一对多和多对多的结果也进行优化。希望文档尽快出来。&lt;/p&gt;
&lt;p&gt;2. Uliweb的结构大调整。主要是将一些对象放在uliweb/__init__.py中了。这样可以直接从uliweb进行导入，而不是uliweb.core.SimpleFrame进行导入，更加方便记忆和使用。&lt;/p&gt;
&lt;p&gt;3. 文档又有一部分进行了修改和完善。&lt;/p&gt;
&lt;p&gt;目前测试基本还正常。&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/b3882cf502aeaf2fbc310998.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-10-01T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/94340b7b6dca48fe0bd1870a.html">
	<title>Limodou: 打印出象Linux的tree命令一样的目录树结构程序</title>
	<link>http://hi.baidu.com/limodou/blog/item/94340b7b6dca48fe0bd1870a.html</link>
	<content:encoded>差点找不找了，贴出来。不过已经集成到Ulipad中了。&lt;br /&gt;
&lt;br /&gt;
&lt;img border=&quot;0&quot; src=&quot;http://hiphotos.baidu.com/limodou/pic/item/80569152a97aff220df3e342.jpg&quot; class=&quot;blogimg&quot; /&gt;&lt;br /&gt;
&lt;br /&gt;
在目录浏览窗口中的Print Directory Tree就是。执行后会将当前选中的目录结构输出到messages窗口。&lt;br /&gt;
&lt;br /&gt;
代码如下：&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;0&quot;&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt; &lt;/td&gt;
            &lt;td align=&quot;right&quot; valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font color=&quot;#000000&quot;&gt;  1 &lt;br /&gt;  2 &lt;br /&gt;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &lt;br /&gt;  6 &lt;br /&gt;  7 &lt;br /&gt;  8 &lt;br /&gt;  9 &lt;br /&gt; 10 &lt;br /&gt; 11 &lt;br /&gt; 12 &lt;br /&gt; 13 &lt;br /&gt; 14 &lt;br /&gt; 15 &lt;br /&gt; 16 &lt;br /&gt; 17 &lt;br /&gt; 18 &lt;br /&gt; 19 &lt;br /&gt; 20 &lt;br /&gt; 21 &lt;br /&gt; 22 &lt;br /&gt; 23 &lt;br /&gt; 24 &lt;br /&gt; 25 &lt;br /&gt; 26 &lt;br /&gt; 27 &lt;br /&gt; 28 &lt;br /&gt; 29 &lt;br /&gt; 30 &lt;br /&gt; 31 &lt;br /&gt; 32 &lt;br /&gt; 33 &lt;br /&gt; 34 &lt;br /&gt; 35 &lt;br /&gt; 36 &lt;br /&gt; 37 &lt;br /&gt; 38 &lt;br /&gt; 39 &lt;br /&gt; 40 &lt;br /&gt; 41 &lt;br /&gt; 42 &lt;br /&gt; 43 &lt;br /&gt; 44 &lt;br /&gt; 45 &lt;br /&gt; 46 &lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
            &lt;td valign=&quot;top&quot;&gt;
            &lt;pre&gt;&lt;font&gt;&lt;font color=&quot;#008000&quot;&gt;#! /usr/bin/env python&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;#coding=utf-8&lt;br /&gt;&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;os&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;sys&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;import&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;fnmatch&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;space&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;4&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;stack&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;{&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;0&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;''&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path_line&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;is_dir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;is_last&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;s&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;stack&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;is_dir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'/'&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;is_last&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;s&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;append&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'`-- '&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+=&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'    '&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;s&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;append&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'|-- '&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;+=&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'|   '&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;stack&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;leading&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;''&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;join&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;s&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;def&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;walk&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;skips&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'.svn'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'*.pyc'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;dirs&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;in&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;os&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;listdir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;not&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;any&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;fnmatch&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;fnmatch&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;in&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;skips&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#000000&quot;&gt;num&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;len&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dirs&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;in&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;enumerate&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;sorted&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dirs&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;cmp&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;lambda&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;cmp&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;x&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lower&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;y&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lower&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;p&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;os&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;join&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;dir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;flag&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;os&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;isdir&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;p&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;append&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;path_line&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;flag&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;i&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;num&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;-&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;flag&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;            &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;extend&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;walk&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;p&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;level&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;+&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;skips&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;skips&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;r&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;__name__&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'__main__'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;len&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;sys&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;argv&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;==&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'.'&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt;&lt;br /&gt;        &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;sys&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;argv&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;print&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;br /&gt;    &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;print&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;'\n'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;join&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;walk&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;path&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Ulipad&quot;&gt;Ulipad&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/94340b7b6dca48fe0bd1870a.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-30T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/7ea2908fdd613af0503d925d.html">
	<title>Limodou: 发起了Python Web Framework”秀“活动</title>
	<link>http://hi.baidu.com/limodou/blog/item/7ea2908fdd613af0503d925d.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;目前是在啄木鸟的wiki上创建的页面，具体内容参见：&amp;#160;&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://wiki.woodpecker.org.cn/moin/FrameworksShow&quot;&gt;http://wiki.woodpecker.org.cn/moin/FrameworksShow&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;欢迎大家来展示和出题，不过出题及回答请看相应的说明。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Python&quot;&gt;Python&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/7ea2908fdd613af0503d925d.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-30T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/24cfdcc47612b0c138db4917.html">
	<title>Limodou: Doto demo site is launched</title>
	<link>http://hi.baidu.com/limodou/blog/item/24cfdcc47612b0c138db4917.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;This is a demo site, very thanks to 头太晕, it's he provide me this site,&lt;br /&gt;
and the domain will be changed to&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://doto.letme.cn/&quot;&gt;doto.letme.cn&lt;/a&gt;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;later. Now you can&lt;br /&gt;
test it. And there is also a bug or shortcoming which I've not fixed&lt;br /&gt;
yet, that's when you register an account, you shuld click settings&lt;br /&gt;
first, this will let doto create UserProfile info. I'll fix it later.&lt;br /&gt;
&lt;br /&gt;
So hope you have fun. And Doto support share todos to others, so if&lt;br /&gt;
you have friends, you can tell him to sign up an account also, and&lt;br /&gt;
share some todos with him.&lt;br /&gt;
&lt;br /&gt;
Again, thanks, 头太晕，and this is only a demo site, so don't put&lt;br /&gt;
important things on it.&lt;br /&gt;
&lt;br /&gt;
Visit:&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.letme.cn/&quot;&gt;http://www.letme.cn&lt;/a&gt;&lt;br /&gt;
Later should be:&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://doto.letme.cn/&quot;&gt;http://doto.letme.cn&lt;/a&gt;&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/24cfdcc47612b0c138db4917.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-30T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/31af7aec841c06db2e2e21c3.html">
	<title>Limodou: 编译Python 2.5.4带zlib</title>
	<link>http://hi.baidu.com/limodou/blog/item/31af7aec841c06db2e2e21c3.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;因为找了一台Linux机器，想在项目中使用。它上面是红帽，Python还是2.3.4，这怎么能行呢？换。2.6？还是2.5吧，因为平时都是在2.5下测试的。但是编译后，执行setuptools 0.6C9有问题，说是zlib找不到。怎么回事？搜索了半天，原来要带--with-zlib=&amp;lt;zlib/include&amp;gt;的参数在执行./configure。得，还要先下载zlib。于是来到了zlib主页，下载，编译，安装。再到Python的目录，clean之，编译，安装，还是不行。怎么回事？再查，原来zlib要使用共享方式编译，晕，再clean，重新对./configure --shared，再整。终于OK了。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/31af7aec841c06db2e2e21c3.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-29T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/58e2ac4b916a5efa83025c40.html">
	<title>Limodou: 试验了一下werkzeug的上传长度设置</title>
	<link>http://hi.baidu.com/limodou/blog/item/58e2ac4b916a5efa83025c40.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;在新版本werkzeug中，处理request时可以有两个属性可以设置，一个是max_content_length，它是用来控制最大的上传内容的。还有一个是max_form_memory_size，它是用来控制读取内容所占内存的最大值。好象没看到如何控制文件大小。不过一般控制比较近似就可以了，因此可以就使用max_content_length就可以了。&lt;/p&gt;
&lt;p&gt;想试验也比较简单:&lt;/p&gt;
&lt;p&gt;from werkzeug import Request&lt;/p&gt;
&lt;p&gt;Request.max_content_length = 1 * 1024 * 1024&lt;/p&gt;
&lt;p&gt;上面的代码就是限定了最大的content大小。当然如果你使用Uliweb，你也可以导入：&lt;/p&gt;
&lt;p&gt;from uliweb.core.SimpleFrame import Request&lt;/p&gt;
&lt;p&gt;后面一样就可以了。&lt;/p&gt;
&lt;p&gt;当上传内容超出大小时，它会抛出一个异常，返回码是413的。&lt;/p&gt;
&lt;p&gt;在Doto中，我使用了FancyUpload来处理，它也可以限定上传的大小，比werkzeug要精确多了。所以可以前后端相结合。&lt;/p&gt;
&lt;p&gt;werkzeug的文档参见：&amp;#160;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://werkzeug.pocoo.org/documentation/0.5.1/wrappers.html&quot;&gt;http://werkzeug.pocoo.org/documentation/0.5.1/wrappers.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/58e2ac4b916a5efa83025c40.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-28T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/5f29d53fa00b8dc87c1e712e.html">
	<title>Limodou: Doto增加了到期时间和过滤功能</title>
	<link>http://hi.baidu.com/limodou/blog/item/5f29d53fa00b8dc87c1e712e.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;div&gt;
&lt;p&gt;今天把Doto又完善了一下，主要是增加了到期时间和过滤功能。界面如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3623/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;左上角有一个Filter，鼠标移上去就可以弹出一个窗口，有两个过滤链接，点击会刷新Todo的列表。它是使用了一个叫SmartHoverBox(&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.consideropen.com/demos/smart-hover-box/&quot;&gt;http://www.consideropen.com/demos/smart-hover-box/&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/a&gt;)的插件，这个插件是由那个《30天学习Mootools教程》的网站提供的。具体样式是我自已弄的，凑和就行。这个插件没有做成一个app，因为比较简单，就直接放在了doto app下面。对装载todo增加了对条件的处理。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;到期时间在上面可以看到在右侧有一个时间显示。采用的是timesince的显示方式。这个timesince是从django搬过来的，不过它的代码只支持现在时间大于指定时间的处理，而todo既要能显示时间过去了，也要显示还没到的时间，所以改了一点。同时在返回的结果根据是过去还是没到会显示ago或later。同时在显示时，如时过期了，时间会显示为红色。&lt;/p&gt;
&lt;p&gt;下面是详细的修改界面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://photo.zeuux.com/photo/gallery/3624/original/&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在到期日字段，左侧是timesince的显示，右侧可以直接修改，自动保存。我使用了一个mootools datepicker的插件(&lt;a target=&quot;_blank&quot; href=&quot;http://www.monkeyphysics.com/mootools/script/2/datepicker&quot;&gt;http://www.monkeyphysics.com/mootools/script/2/datepicker&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;/a&gt;)。并且在Doto中做成了一个datepicker的app。这样使用时只要选中这个app，然后在模板中使用{{use &amp;quot;datepicker&amp;quot;}}就基本可用了。当然要写具体的创建，配置参数，特别是要处理onSelect的事件，与后台进行交互。&lt;/p&gt;
&lt;/div&gt;
&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Uliweb&quot;&gt;Uliweb&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/5f29d53fa00b8dc87c1e712e.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-26T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/30999a50934dfc688435245f.html">
	<title>Limodou: SpeedyFox加速Firefox启动</title>
	<link>http://hi.baidu.com/limodou/blog/item/30999a50934dfc688435245f.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;现在我基本上都是使用chrome，除了调试web时。其中有一个很主要的原因就是:firefox启动太慢了。看到speedyfox后，安装了一下，清除时间很长，但是等执行完毕后，的确，启动飞快，果然管用。看到有些评论说不明显，我不清楚，但是我感觉的确管用。&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.crystalidea.com/speedyfox&quot;&gt;http://www.crystalidea.com/speedyfox&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/%D0%C4%C7%E9%B9%CA%CA%C2&quot;&gt;心情故事&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/30999a50934dfc688435245f.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-26T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://blog.80s.net.cn/?p=536">
	<title>80's Blog: 如何获取Flex/Actionscript3海报</title>
	<link>http://blog.80s.net.cn/?p=536</link>
	<content:encoded>&lt;p&gt;&lt;a rel=&quot;attachment wp-att-537&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=537&quot; title=&quot;as3/flex poster&quot;&gt;&lt;/a&gt;没错, 这就是网上流行的PDF版本的那套海报,AS3一张/Flex四张, 我听说很多funs都自己掏钱打印出来的, 很多小店没法打印这么大的海报, 为了方便广大开发者, 我们特意从Adobe拿了一些来送给大家.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;attachment wp-att-537&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=537&quot; title=&quot;as3/flex poster&quot;&gt;&lt;img src=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/09/dsc00742.jpg&quot; alt=&quot;as3/flex poster&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我们有以下三种途径来获取海报:&lt;/p&gt;
&lt;p&gt;&lt;img border=&quot;0&quot; width=&quot;1&quot; src=&quot;http://www.riameeting.com/files/casedesign/image/gift/DSC00742.JPG&quot; height=&quot;1&quot; /&gt;&lt;strong&gt;1.RIAMeeting聚会活动，海报将作为奖品，你来参加就有机会得到哦&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2.积极参与RIAMeeting社区线上活动（参与翻译，写文章等等），我们将赠与海报以及其它的纪念品，奖励为社区做出突出贡献的人，如果你有兴趣加入社区线上活动，包括翻译等等，请在&lt;a href=&quot;http://www.riameeting.com/community/viewthread.php?tid=31&amp;extra=page%3D1&quot;&gt;这里&lt;/a&gt;回帖，注明自己的联系方式（邮箱），以及对自己的一段简单介绍，我们将与您取得联系&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.可以以企业为单位申请海报，但企业必须具备一定的资质，且我们有数量限制，每周针对企业的海报发送不超过5个。如果您是企业形式申请，请在&lt;a href=&quot;http://www.riameeting.com/community/viewthread.php?tid=31&amp;extra=page%3D1&quot;&gt;这里&lt;/a&gt;回帖，说明您的企业名称，网址，业务范围，所用技术，开发人员规模，邮箱等等，一旦符合条件，我们将与您邮件联系，获得您的地址然后通过快递发送海报（收货方付款，您那边需要在快递到达后支付海报的运输费用）&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2009年04月15日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=533&quot; title=&quot;RIA大讲堂 - Flex开发免费培训&quot;&gt;RIA大讲堂 - Flex开发免费培训 (5)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年11月10日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=509&quot; title=&quot;Adobe ActionScript Reference&quot;&gt;Adobe ActionScript Reference (3)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年10月08日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=503&quot; title=&quot;关于JavaScript,Flash/Flex/AIR以及Silverlight/WPF&quot;&gt;关于JavaScript,Flash/Flex/AIR以及Silverlight/WPF (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年08月18日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=496&quot; title=&quot;在上海布道&quot;&gt;在上海布道 (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年08月06日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=495&quot; title=&quot;RIAMeeting[上海]第一次会议&quot;&gt;RIAMeeting[上海]第一次会议 (0)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/274308209/80steamblog/feedsky/s.gif?r=http://blog.80s.net.cn/?p=536&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/80steamblog/274308209/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/80steamblog/274308209/art01.gif&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded>
	<dc:date>2009-09-22T11:55:43+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/7b72562c9b02b7e68b1399ed.html">
	<title>Limodou: 有趣的Nutz</title>
	<link>http://hi.baidu.com/limodou/blog/item/7b72562c9b02b7e68b1399ed.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;碰巧看到有国人开发的Nutz项目，它是一个Java的项目，不好说它是什么，但是它实现了SSH相似的功能，至少作者是这样说的。SSH是什么，原本我也不清楚，后来才明白是Structs, Spring, Hibernate的缩写，我晕。作者很有激情，感觉比我强，但是对代码要求很高，其中作者的原话：&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Nutz 会是一个长期的项目，因为首先，我运营它的官网不需要什么开销，其次我个人最大的爱好就是写程序，最后，我虽然欢迎，但是并不假设有人会加入这个项目和我一起写代码。并且我向毛主席保证，我很欢迎大家通过 Email 等方式告诉我我代码哪里是需要修改的，但是要想拿到我的 svn commit 权限，除非你能证明你代码写的不比我差，否则门儿都没有。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;看来我也要象他一样，想加入Uliweb，要拿出你的证明，至少代码不比我差，否则门儿都没有。&lt;/p&gt;
&lt;p&gt;项目主页：&amp;#160;&lt;span class=&quot;Apple-converted-space&quot;&gt;&amp;#160;&lt;/span&gt;&lt;span&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/nutz/&quot;&gt;http://code.google.com/p/nutz/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/%D0%C4%C7%E9%B9%CA%CA%C2&quot;&gt;心情故事&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/7b72562c9b02b7e68b1399ed.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-22T00:00:00+00:00</dc:date>
</item>
<item rdf:about="http://hi.baidu.com/limodou/blog/item/17f00eb340a85aadd8335a53.html">
	<title>Limodou: 向mootools贡献失败了:P</title>
	<link>http://hi.baidu.com/limodou/blog/item/17f00eb340a85aadd8335a53.html</link>
	<content:encoded>&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;
&lt;p&gt;随着对mootools的使用越来越多，也对它越来越了解，也越来越喜欢。昨天看到了关于类的一些内容。于是乎我想到以前为jQuery写的一些字符串的扩展，其中有一个template的功能，它可以在字符串中定义如${0}, ${name}之类的东西，然后提供array或hash值进行替换。于是我将其贡献到mootools邮件列表。但是很不幸，人家告诉我在mootools中已经有了，叫substitute。当初我怎么就没看到呢？&lt;/p&gt;
&lt;p&gt;最终我总结是因为mootools中的许多方法的命名比较怪。比如Python中叫format，让人很明白是格式化用的。我叫template，可以很容易理解为模板。而substitute字面上是替换，不好理解。&lt;/p&gt;
&lt;p&gt;还有其它的命名，比如：inject，是注入的意思，在mootools中是将当前元素加到目标元素中去。grab是捕获的意思，是将其它元素添到到当前元素中。还有象adopt, erase, dispose等，并不是很容易理解的命名，可能会让别人学习起不是很容易。&lt;/p&gt;
&lt;p&gt;不过mootools有我所想到的非常不错，让人满意。&lt;/p&gt;
&lt;p&gt;我还需要再仔细阅读文档，刚才发现一个mootools文档的一个小bug，已经报告了。&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt; 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Mootools&quot;&gt;Mootools&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/17f00eb340a85aadd8335a53.html#comment&quot;&gt;查看评论&lt;/a&gt;</content:encoded>
	<dc:date>2009-09-20T00:00:00+00:00</dc:date>
</item>

</rdf:RDF>
