<?xml version="1.0"?>
<rss version="2.0">

<channel>
	<title>Planet of Woodpecker.org.cn for CPUG</title>
	<link>http://www.woodpecker.org.cn/</link>
	<language>en</language>
	<description>Planet of Woodpecker.org.cn for CPUG - http://www.woodpecker.org.cn/</description>

<item>
	<title>Nicholas Ding: Hello world!</title>
	<guid>http://cndroid.org/?p=1</guid>
	<link>http://cndroid.org/posts/1</link>
	<description>&lt;p&gt;Welcome to WordPress. This is your first post. Edit or delete it, then start blogging!&lt;/p&gt;</description>
	<pubDate>Mon, 29 Jun 2009 09:08:33 +0000</pubDate>
</item>
<item>
	<title>Moyuer's Blog: Quixote 白皮书</title>
	<guid>http://www.moyuer.cn/blog/archives/93</guid>
	<link>http://www.moyuer.cn/blog/archives/93</link>
	<description>&lt;h4&gt;简介&lt;/h4&gt;
&lt;p&gt;Quixote 是一个使用 Python 开发 Web 应用程序的框架。设计简单、灵活，程序编写快速且易于使用众多第三方 Python 模块。只要部署适当，Quixote 执行性能出色，可以支持大规模生产应用。&lt;/p&gt;
&lt;h4&gt;体系结构&lt;/h4&gt;
&lt;p&gt;Quixote 程序通常就是一个 Python 包。Quixote 将 URL 映射到一个 Python 对象的某个方法上，执行结果被返回给相应的 HTTP 请求。&lt;/p&gt;
&lt;p&gt;Quixote 可以使用以下几种方式部署：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用 Python 编写的 HTTP 服务器。这种方式配置简单，很适合局域网或小规模互联网应用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.moyuer.cn/blog/wp-content/uploads/2009/06/pythonhttp.png&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;p&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;a href=&quot;http://python.ca/scgi/&quot;&gt;SCGI&lt;/a&gt;。基于 Quixote 的程序作为守护进程运行，Web 服务器将 HTTP 请求转发给守护进程处理。SCGI 守护进程可以独立于 Web 服务器开启或关闭，这使得升级应用程序代码变得简单并且不会影响正在运行的其它 Web 站点。我们认为这是执行效率最高的部署方式。（FASTCGI 与此类似，但它协议的复杂性降低了其可靠性。）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.moyuer.cn/blog/wp-content/uploads/2009/06/scgi.png&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;p&gt;
&lt;li&gt;
&lt;p&gt;使用传统 CGI。不推荐这种方式，因为其为每个 HTTP 请求开辟新的进程、执行效率最差。SCGI 的配置并不比它复杂并且速度更快，所以使用 SCGI 是更好的选择。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.moyuer.cn/blog/wp-content/uploads/2009/06/cgi.png&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/ul&gt;
&lt;h4&gt;HTML 模板&lt;/h4&gt;
&lt;p&gt;Quixote 提供了自己的 Python 模板语言：PTL，但并不强制你使用它。&lt;/p&gt;
&lt;p&gt;PTL 使用 Python 语法生成 HTML&lt;/p&gt;
&lt;p&gt;&lt;font&gt;&lt;/font&gt;&lt;/p&gt;</description>
	<pubDate>Sun, 21 Jun 2009 15:35:08 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: python-ldap与python25以及CentOS 4.x</title>
	<guid>http://blog.khsing.net/2009/06/python-ldappython25centos-4x.html</guid>
	<link>http://blog.khsing.net/2009/06/python-ldappython25centos-4x.html</link>
	<description>&lt;p&gt;最近写的一个东东要用python25和python-ldap，但是使用的那台主机是python23、ldap2.2.x和python-ldap2.0.1。安装了一个python25，python-ldap是2.3.8，编译失败，openldap2.2太老了，python-ldap2.3.8不向下兼容了。&lt;/p&gt;
&lt;p&gt;那我就用python-ldap2.0.x，这个版本已经不提供下载了，从sf.net的cvs上拉了一份2.0.11的版本，这次倒是编过去了。用的时候出问题了&lt;/p&gt;
&lt;pre&gt;
*** glibc detected *** free(): invalid pointer: 0xb7f60728 ***
Aborted
&lt;/pre&gt;
&lt;p&gt;查来查去有三个文章有说这种情况
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mail-archive.com/python-ldap-dev@lists.sourceforge.net/msg00369.html&quot;&gt;problem using python-ldap under fcgi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/python-cdb/+bug/157251&quot;&gt;python-cdb double free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;解决之道：&lt;a href=&quot;http://www.notes.xythian.net/2007/10/24/python-cdb-032-52ubuntu2-with-python-25-causes-double-free-corruption-crash-on-dealloc/&quot;&gt;python-cdb 0.32 (-5.2ubuntu2) with Python 2.5 causes double-free corruption crash on dealloc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
主要原因是PyMem_DEL的调用已经不被推荐了，应该用PyObject_Del。所以要对两个C文件做一些改动。
&lt;/p&gt;
&lt;pre&gt;
sed -i.orig 's/PyMem_DEL/PyObject_Del/g' Modules/LDAPObject.c 
sed -i.orig 's/PyMem_DEL/PyObject_Del/g' Modules/ldapcontrol.c 
&lt;/pre&gt;
&lt;p&gt;然后再build，install就OK了&lt;/p&gt;</description>
	<pubDate>Wed, 03 Jun 2009 03:45:42 +0000</pubDate>
</item>
<item>
	<title>Gary's Blog: DIV垂直居中对齐</title>
	<guid>http://jiake.org/gary/archive/2009/05/26/div-vertical-align-middle</guid>
	<link>http://jiake.org/gary/archive/2009/05/26/div-vertical-align-middle</link>
	<description>&lt;pre&gt;&amp;lt;style&amp;gt;&lt;br /&gt;&lt;br /&gt;#image-blip {&lt;br /&gt;    width: 300px;&lt;br /&gt;    height: 300px;&lt;br /&gt;    background-color: #aaaaaa;&lt;br /&gt;    border: solid 1px #222222;&lt;br /&gt;    vertical-align: middle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#image-blip * {&lt;br /&gt;    vertical-align: middle;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;*html #image-blip span {&lt;br /&gt;    height: 100%;&lt;br /&gt;    display: inline-block;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div id=&quot;image-blip&quot;&amp;gt;&lt;br /&gt;    &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;    &amp;lt;a href=&quot;#&quot; id=&quot;blip&quot;&amp;gt;&lt;br /&gt;        &amp;lt;img src=&quot;/test.jpg&quot; /&amp;gt;&lt;br /&gt;    &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;</description>
	<pubDate>Tue, 26 May 2009 19:06:10 +0000</pubDate>
</item>
<item>
	<title>Gary's Blog: Bash Shell 快捷键</title>
	<guid>http://jiake.org/gary/archive/2009/05/21/bash-shell-shortcut</guid>
	<link>http://jiake.org/gary/archive/2009/05/21/bash-shell-shortcut</link>
	<description>&lt;pre&gt;
Ctrl + a - 跳到行首
Ctrl + b - 左移一个字符
Ctrl + c - 终端进程
Ctrl + d - 从光标处向右删除
Ctrl + e - 跳到行尾
Ctrl + f - 右移一个字符
Ctrl + k - 从光标处删除到行尾
Ctrl + l - 清屏，类似 clear 命令
Ctrl + r - 查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions 
Ctrl + z - Suspend/ Stop the command
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词
&lt;/pre&gt;</description>
	<pubDate>Thu, 21 May 2009 20:53:15 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 终端下的Spotlight</title>
	<guid>http://blog.khsing.net/2009/05/spotlight-in-terminal.html</guid>
	<link>http://blog.khsing.net/2009/05/spotlight-in-terminal.html</link>
	<description>&lt;p&gt;在终端下也可以使用spotlight----&lt;code&gt;mdfind&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;找所有metadata包含something的东东&lt;/p&gt;
&lt;pre&gt;
mdfind something
&lt;/pre&gt;
&lt;p&gt;在~/Downloads里找something&lt;/p&gt;
&lt;pre&gt;
mdfind -onlyin ~/Downloads something
&lt;/pre&gt;
&lt;p&gt;找~/Pictures下的所有图片&lt;/p&gt;
&lt;pre&gt;mdfind -onlyin ~/Pictures &quot;kMDItemKind == *image&quot;&lt;/pre&gt;
&lt;p&gt;还有&lt;code&gt;mdls&lt;/code&gt;查看文件metadata的工具&lt;/p&gt;</description>
	<pubDate>Thu, 21 May 2009 07:40:59 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 菜单栏图标的排序</title>
	<guid>http://blog.khsing.net/2009/05/sort-of-menu-bar.html</guid>
	<link>http://blog.khsing.net/2009/05/sort-of-menu-bar.html</link>
	<description>Mac OS X里菜单栏图标的顺序可以按着苹果键拖放，拖出菜单栏就删除了。</description>
	<pubDate>Tue, 19 May 2009 09:15:30 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 人生大事</title>
	<guid>http://blog.khsing.net/2009/05/biggest-thing-in-my-life.html</guid>
	<link>http://blog.khsing.net/2009/05/biggest-thing-in-my-life.html</link>
	<description>&lt;p&gt;上月29号回家开始办终身大事，直到上周末在北京的朋友同事宴请结束，我的人生大事终于办完了。&lt;/p&gt;
&lt;p&gt;老家在内蒙古阿拉善，是巴丹吉林沙漠的边缘地区。四月底五月初正是沙漠发狂的时节，这次回家也算是天公做美，竟然接连四五天都是放晴的好日子，倒有了一种秋高气爽的感觉。老家的一切基本照旧，只是随着西部大开发和重污染企业的西迁，空气和饮用水质量下降的太多。同学和朋友大多也都外出打工或学习，在家的少之又少，没见到几个。&lt;/p&gt;
&lt;p&gt;婚礼当天请了我初中的语文老师做主持人，并宣读了结婚证书。席间老师在祝福我们的同时也顺便向我老婆揭发了一下我当年的恶习。:-D&lt;/p&gt;
&lt;p&gt;来了不少的亲戚，说了不少祝福的话，也说了不少&quot;要好好过日子&quot;之类的话。结婚就是一个成人礼。&lt;/p&gt;
&lt;p&gt;在内蒙办完大事，和爸妈告别后就去了辽宁老婆的老家待客。见了许些老婆家的亲戚、朋友、同学，也听了许些祝福的话。这才回到北京招待了一下朋友同事。&lt;/p&gt;
&lt;p&gt;人生最大事，在不到20天的时间里过去了，当然了这只是一个开始。&lt;/p&gt;</description>
	<pubDate>Tue, 19 May 2009 02:53:45 +0000</pubDate>
</item>
<item>
	<title>HD 's Blog: 暂时别了，Safari4</title>
	<guid>tag:blog.opensource.org.cn,2009:/hdcola//2.492</guid>
	<link>http://blog.opensource.org.cn/hdcola/2009/05/safari4.html</link>
	<description>这段日子被鼓动使用了safari4，经过了三天的使用，终于决定回到firefox。当初被鼓动使用safari4beta的原因有四：&lt;br /&gt;1.很PP的Top Sites，确实让我回到了opera的感觉，这个功能我在ff3里也在使用&lt;br /&gt;2.稳定的表现，听说这个beta不再崩了&lt;br /&gt;3.速度和内存，不像ff哪么可怕了&lt;br /&gt;&lt;br /&gt;结果呢？今天我终于又回到了ff3了。原因如下：&lt;br /&gt;1.PP的Top Sites做的真PP，可是定制太差了，它一定要帮我算出我的Top Site来，我确实是想进另一个页面的。 :(&lt;br /&gt;2.Gmail中下来的中文附件还是????.doc，这个不知是谁的问题了，也许需要google去解决 :(&lt;br /&gt;3.看来看去，还是ff上的插件多，让人省心呀&lt;br /&gt;</description>
	<pubDate>Tue, 19 May 2009 00:33:45 +0000</pubDate>
</item>
<item>
	<title>HuangYi 's Blog</title>
	<guid>tag:blogger.com,1999:blog-33791960.post-6013772031813819174</guid>
	<link>http://codeplayer.blogspot.com/2009/04/hello.html</link>
	<description>hello&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://res1.blogblog.com/tracker/33791960-6013772031813819174?l=codeplayer.blogspot.com&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Thu, 23 Apr 2009 05:32:00 +0000</pubDate>
	<author>noreply@blogger.com (黄毅)</author>
</item>
<item>
	<title>HuangYi 's Blog: 学习Haskell</title>
	<guid>tag:blogger.com,1999:blog-33791960.post-3922551842111360395</guid>
	<link>http://codeplayer.blogspot.com/2009/04/blog-post.html</link>
	<description>&lt;div&gt;&lt;div&gt;&lt;h1&gt;学习Haskell&lt;/h1&gt;&lt;/div&gt;&lt;/div&gt;发现自己学习一门新语言的时候总是去尝试找到一个能完全表达这门语言的最小子集，然后其他的都是语法糖。比如c语言这个子集基本就是汇编语言所提供的那些东西：分支跳转指针等，python的这个子集大概是些对象、类型、属性、duck typing之类的东西。这样可以帮助记忆。haskell的这个子集里都会有些什么呢？lambda、type、typeclass，这样考虑起来 haskell 语言的核心概念还是挺少的，就是有些理论还需要学习，函数式的风格需要转换过来。&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://res1.blogblog.com/tracker/33791960-3922551842111360395?l=codeplayer.blogspot.com&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 20 Apr 2009 10:23:00 +0000</pubDate>
	<author>noreply@blogger.com (黄毅)</author>
</item>
<item>
	<title>HuangYi 's Blog: monad与状态</title>
	<guid>tag:blogger.com,1999:blog-33791960.post-4156376875170557792</guid>
	<link>http://codeplayer.blogspot.com/2009/04/monad_20.html</link>
	<description>&lt;h1&gt;monad与状态&lt;/h1&gt;&lt;br /&gt;&lt;div&gt;最近重新捡起haskell来看了看，似乎对monad和程序状态的关系有点小小的明白了。强烈希望明白人指点一下。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;话说用命令式语言写程序的时候，有明白人就强烈要求不要用全局变量不要用全局变量，其实要取消所有的全局变量也容易，不过就是增加几个参数而已，比如这样的程序：&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;int 全局变量=0;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void inc(){全局变量+=1;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void dec(){全局变量-=1;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void main(){inc(); dec();}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;改成这样就成了：&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void inc(int *变量){*变量+=1;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void dec(int *变量){*变量-=1;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void main(){int 全局变量=0; inc(&amp;amp;全局变量); dec(&amp;amp;全局变量);}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;其实说起来，搞个全局变量也就是为了让函数少写几个参数而已。参数实在太多了，大不了就搞个 struct stat 把公用的参数给包装成一个。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;函数式编程号称不准修改状态，那大不了就每次改都创建一份新的，然后返回了，这样程序就变成这样了：&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;void inc(状态,...){...; return 结果和新状态;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void dec(状态,...){...; return 结果和新状态}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;void main(){&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 初始状态;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;新状态, 返回值 = inc(初始状态,...);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;新状态2, 返回值 = dec(新状态,...);&lt;/div&gt;&lt;br /&gt;&lt;div&gt;}&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;这样所有函数都要多加一个状态参数，要多返回一个新状态。麻是麻烦点，不过据说都要玩并行计算了嘛，忍了。&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;那么可以把状态这个东西本身抽象了一下，我们用python来模拟一下吧，假设原来的程序是这样的：&lt;br /&gt;&lt;br /&gt;global_stat = []&lt;br /&gt;def inc1(stat, input):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stat+['inc1'], input+1&lt;br /&gt;&lt;br /&gt;def inc2(stat, input):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return stat+['inc2'], input+2&lt;br /&gt;&lt;br /&gt;a = 1&lt;br /&gt;new_stat, a1 = inc1(global_stat, a)&lt;br /&gt;new_stat, a2 = inc2(new_stat, a1)&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;为了简化这个问题，我们引入一个 bind 函数来进行抽象：&lt;br /&gt;&lt;br /&gt;def bind(func1, func2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def lazy_bind(stat, value):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; new_stat, return_value = func1(stat, value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; func2(new_stat, return_value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return lazy_bind&lt;br /&gt;&lt;br /&gt;# 然后就可以这样来调用 inc1,inc2...&lt;br /&gt;&lt;br /&gt;bind(inc1,&lt;br /&gt;bind(inc2,&lt;br /&gt;bind(xxx,&lt;br /&gt;...&lt;br /&gt;))...) (init_stat, defaut_value)&lt;br /&gt;&lt;br /&gt;就我们这个例子来说，后面这种方式除了让程序更加诡异以外看不出来有什么特别的好处。&lt;br /&gt;但是对于 Haskell 来说，很多基本的东西（IO）都是构建与这种类型的抽象之上，并且提供一些语法糖让代码变得更好看，这样一种抽象方式也就成为理解haskell程序很重要的一个东西了。&lt;br /&gt;而haskell之所以说能够通过这种抽象方式来隔离纯代码和有副作用的代码（比如说具体的IO操作）就我个人理解就是因为可以把有副作用的代码放到bind里面执行，从而保证 inc1、inc2 这种函数的纯粹性。&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;http://res1.blogblog.com/tracker/33791960-4156376875170557792?l=codeplayer.blogspot.com&quot; /&gt;&lt;/div&gt;</description>
	<pubDate>Mon, 20 Apr 2009 06:19:00 +0000</pubDate>
	<author>noreply@blogger.com (黄毅)</author>
</item>
<item>
	<title>Gawain's Jail: 参加CocoaHeads北京分舵的处女会</title>
	<guid>http://blog.khsing.net/2009/04/cocoaheads-1st-meeting.html</guid>
	<link>http://blog.khsing.net/2009/04/cocoaheads-1st-meeting.html</link>
	<description>&lt;p&gt;昨天下午正好在海淀就去了&lt;a href=&quot;http://cocoaheads.org&quot;&gt;CocoaHeads&lt;/a&gt;&lt;a href=&quot;http://cocoaheadsbj.org&quot;&gt;北京分舵&lt;/a&gt;的处女会（其实是1st meeting）。&lt;/p&gt;
&lt;p&gt;刚一开始就是免费送书活动----&lt;a href=&quot;http://www.douban.com/subject/2382413/&quot;&gt;《Cocoa入门－使用Objective-C》&lt;/a&gt;，因为后来书还有剩，我不仅自己拿了一本，还给朋友带了一本。暖场过程是让大家做自我介绍及活动的了解途径，发现&lt;a href=&quot;http://twiiter.com&quot;&gt;twiiter&lt;/a&gt;真的不是一般的火，很多人都是看到了&lt;a href=&quot;http://apple4.us&quot;&gt;Apple4.us&lt;/a&gt;的推来的。有位大哥热情真是高涨，从天津专程过来，可见大家欲火焚身，也可见Ben Chen同志真是为大家败火呀。场内共有三个MM，只有一位是开发人员，可见这还是个男人的世界，不过我们还是非常欢迎对Cocoa开发感兴趣不感兴趣的PLMM来调和阴阳。&lt;/p&gt;
&lt;p&gt;进入正场之后，Ben Chen手绘了Cocoa历史、OOP、MVC、GC等内容，又现场写了Demo，非常牛逼，然后Sunyong又讲了输入法相关问题。端木同学在中间插了许多有趣的故事，比如送的那本书是他一个人一个字一个字的翻写出来的（原书第二版只盖到10.2，他给盖到了10.5），结果他只在序里被提了一句，还有Mac自带的输入法比较烂，Motorola的输入法也比较烂，原因是这两个全世界输入法最烂的团队在同一栋大厦里工作等等了。&lt;/p&gt;
&lt;p&gt;处女会显的比较羞涩&lt;sup&gt;&lt;em&gt;不要联想&lt;/em&gt;&lt;/sup&gt;，不够开放，讨论也不多。不过毕竟只是处女会嘛，已经很好了。有趣的东西会越来越多的。&lt;/p&gt;
&lt;p&gt;活动的成果见：&lt;a href=&quot;http://cocoaheadsbj.org/?p=33&quot;&gt;Cocoaheads BJ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外最近我必须要闭关还债了，欠了公司好多东西，5.1前要有个了结了。&lt;/p&gt;</description>
	<pubDate>Sun, 19 Apr 2009 06:09:35 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 后悔药是没有卖的</title>
	<guid>http://blog.khsing.net/2009/04/no-regret.html</guid>
	<link>http://blog.khsing.net/2009/04/no-regret.html</link>
	<description>&lt;p&gt;刚才写了一个关于被选择文字高亮的东西，发现是我自己的错，马上把文章给删了，结果Google还是把那篇给抓走了。可见这个世界上是没有后悔药卖的。&lt;/p&gt;
&lt;p&gt;因为Mac对被选文字也是有相应的处理的，不过不是反色。之前之是颜色相近没看出来而已，后来换了一个highlight color就可以看清楚了。&lt;/p&gt;
&lt;p&gt;以下是那篇文的全篇&lt;/p&gt;
&lt;blockquote&gt;
&lt;del&gt;&lt;p&gt;很多网站在放一个问题（更多的是迷）时，会把答案的颜色和背景调成一致，想知道答案的人呢就把答案部分选中要不就看源码吧。&lt;/p&gt;
&lt;p&gt;Windows中选中文字会做反色的处理，而Mac是在上面盖了一层。然后之前的小技巧在Mac上就失效了。&lt;/p&gt;
&lt;p&gt;我很反感这种做法。&lt;/p&gt;
&lt;del&gt;
&lt;/del&gt;&lt;/del&gt;&lt;/blockquote&gt;</description>
	<pubDate>Sat, 18 Apr 2009 05:10:47 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 又是万恶的户口制度</title>
	<guid>http://blog.khsing.net/2009/04/post-4.html</guid>
	<link>http://blog.khsing.net/2009/04/post-4.html</link>
	<description>&lt;p&gt;看一条新闻：&lt;a href=&quot;http://news.sina.com.cn/c/edu/2009-04-15/133015471044s.shtml&quot;&gt;北京6月起6岁以下儿童免费体检&lt;/a&gt;。注意其中有一句是&quot;居住在北京市且具有北京市户籍的0至6岁儿童可享有这一免费服务&quot;。你妈了个逼的！我上税是上在北京了还是上到老家了。&lt;/p&gt;
&lt;p&gt;Update: 再来一条&lt;a href=&quot;http://www.bj.xinhuanet.com/bjpd_sdzx/2009-04/15/content_16262403.htm&quot;&gt;北京将对适龄妇女免费筛查宫颈癌乳腺癌&lt;/a&gt;。看看吧，受惠人群是京藉适龄妇女，怎么也脱不了户口的关系。至于费用则是&quot;两癌的检查费用由北京市、区（县）两级财政承担，子宫颈癌筛查每人按20元标准，乳腺癌筛查每人按60标准。&quot;。北京市地税局每年给我寄税单有个屁用，背面的&quot;谢谢您为北京市作出的贡献&quot;，只能是谢谢而已。&lt;/p&gt;</description>
	<pubDate>Wed, 15 Apr 2009 09:59:55 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: DNS dynamic update and Notify</title>
	<guid>http://blog.khsing.net/2009/04/dns-dynamic-update-and-notify.html</guid>
	<link>http://blog.khsing.net/2009/04/dns-dynamic-update-and-notify.html</link>
	<description>&lt;p&gt;DNS的动态更新是在RFC 2136里引入的，BIND8以后就支持了这一特性。用起来还是挺不错的。&lt;/p&gt;
&lt;p&gt;Notify机制是在RFC 1996中提出来的，也是在BIND8以后支持的，微软的DNS服务器也是支持这一特性的。&lt;/p&gt;
&lt;p&gt;Notify的工作原理是这样的：发现一个master zone的序列号发生改变之后，向该zone的所有slave发送一个变更通知。而确定slave的方法就是查NS记录，然后去掉SOA记录中的master。&lt;/p&gt;
&lt;p&gt;上面这个机制在一个有load balancer的环境里就有问题了，NS记录里只记录的是load balancer的一个虚拟IP，master的notify就不可能完整的送达所有的slave。BIND有一个&lt;code&gt;also-notify&lt;/code&gt;的参数，以解决这类问题。&lt;/p&gt;</description>
	<pubDate>Wed, 15 Apr 2009 09:23:40 +0000</pubDate>
</item>
<item>
	<title>80's Blog: RIA大讲堂 - Flex开发免费培训</title>
	<guid>http://blog.80s.net.cn/?p=533</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892662/4919905/1/item.html</link>
	<description>&lt;p&gt;&lt;strong&gt;RIA大讲堂&lt;/strong&gt;是由&lt;a target=&quot;_blank&quot; href=&quot;http://www.riameeting.com/&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#446666&quot;&gt;RIAMeeting&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;策划并且和&lt;a target=&quot;_blank&quot; href=&quot;http://www.adobe.com/&quot;&gt;&lt;strong&gt;&lt;font color=&quot;#994444&quot;&gt;Adobe&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;一起组织的针对Flex开发社区的免费培训活动，旨在让更多的RIA开发者了解并学习Flex技术，帮助大家从更深的层次上理解Flex技术，并学到实用的开发技巧。&lt;/p&gt;
&lt;p&gt;如果时间允许我会来主讲这次的培训. 这次培训的地点在北京. 其他城市暂时不会涉及.&lt;/p&gt;
&lt;p&gt;培训提纲（暂定）：&lt;/p&gt;
&lt;p&gt;第一期培训分4次，每周六培训一次（即4个周六）&lt;/p&gt;
&lt;p&gt;&lt;span&gt;课程设置：&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;Day1&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableLightGridAccent6&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;时间&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;课程&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;说明&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;上午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(9:00 – 12:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex&lt;/span&gt;&lt;span&gt;概述&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex,Flash,Flash Player,AIR&lt;/span&gt;&lt;span&gt;概述&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;了解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex Builder&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex Builder&lt;/span&gt;&lt;span&gt;工作空间&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;了解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex&lt;/span&gt;&lt;span&gt;预编译组件&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;了解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MXML&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;下午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(13:30 – 17:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;数据与事件&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;组件的数据绑定&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;处理用户事件&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;了解事件对象&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;ActionScript&lt;/span&gt;&lt;span&gt;添加事件侦听器&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;HttpService&lt;/span&gt;&lt;span&gt;获取数据&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;Day2&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableLightGridAccent6&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;时间&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;课程&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;说明&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;上午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(9:00 – 12:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;组件与布局&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;DataGrid&lt;/span&gt;&lt;span&gt;中显示数据&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;布局容器的使用&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;创建自定义的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MXML&lt;/span&gt;&lt;span&gt;组件&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;实现&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Value Object&lt;/span&gt;&lt;span&gt;类&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;下午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(13:30 – 17:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;自定义事件&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;创建自定义事件&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;创建自定义事件类&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;自定义项目渲染器&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;探索&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; Flex Bulider &lt;/span&gt;&lt;span&gt;的使用小窍门&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;Day3&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableLightGridAccent6&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;时间&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;课程&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;说明&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;上午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(9:00 – 12:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;数据验证&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;数据验证&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;使用远程对象来传输数据&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;格式化数据&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;下午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(13:30 – 17:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;拖放与过滤&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;从列表控件中拖放数据&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;E4X&lt;/span&gt;&lt;span&gt;来过滤&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;XML&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;部署&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Flex&lt;/span&gt;&lt;span&gt;和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;AIR&lt;/span&gt;&lt;span&gt;应用&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;Day4&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;0&quot; cellspacing=&quot;0&quot; class=&quot;MsoTableLightGridAccent6&quot;&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;时间&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;课程&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;说明&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;上午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(9:00 – 12:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;外部资源&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;执行导航容器&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;嵌入图像&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;嵌入字体&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;创建基于约束的布局&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MXML&lt;/span&gt;&lt;span&gt;组件应用样式&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;83&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;strong&gt;&lt;span&gt;下午&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot;&gt;(13:30 – 17:00)&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;227&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;皮肤与状态&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;259&quot; valign=&quot;top&quot;&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;结合&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Adobe CS3&lt;/span&gt;&lt;span&gt;制作组件皮肤&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;创建视图状态&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;动画：行为和特效&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;结合绘图&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;API&lt;/span&gt;&lt;span&gt;绘制图形&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;编码实现组件皮肤&lt;/span&gt;&lt;/p&gt;
&lt;p class=&quot;MsoNormal&quot;&gt;&lt;span&gt;扩展组件&lt;/span&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;主要培训对象：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;RIA开发人员&lt;/li&gt;
&lt;li&gt;对RIA技术感兴趣的在校学生&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要求：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对Flex可以是零基础，但为了更好的学习，希望你事先了解一些Flex的概念&lt;/li&gt;
&lt;li&gt;有自己的笔记本电脑，培训过程需自备电脑&lt;/li&gt;
&lt;li&gt;请安装所需软件：Flex Builder(&lt;a target=&quot;_blank&quot; href=&quot;http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email&quot;&gt;&lt;font color=&quot;#994444&quot;&gt;下载&lt;/font&gt;&lt;/a&gt;)，Flash CS4 (&lt;a target=&quot;_blank&quot; href=&quot;http://www.adobe.com/products/flash/&quot;&gt;&lt;font color=&quot;#994444&quot;&gt;下载&lt;/font&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;请愿意参加的朋友从下面的地址报名&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.riameeting.cn/register-for-schoolroom/&quot;&gt;&lt;font color=&quot;#994444&quot;&gt;http://www.riameeting.cn/register-for-schoolroom/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&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;li&gt;2008年06月16日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=483&quot; title=&quot;感谢蓝色寄来的书&quot;&gt;感谢蓝色寄来的书 (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年06月11日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=481&quot; title=&quot;Adobe Flex/Air中国行调查&quot;&gt;Adobe Flex/Air中国行调查 (2)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/ceb78ff439c5bd683f7c43de07fc813c&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/ceb78ff439c5bd683f7c43de07fc813c/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Wed, 15 Apr 2009 02:54:14 +0000</pubDate>
</item>
<item>
	<title>80's Blog: ND3D 一个超轻量级的AS3 3D Engine</title>
	<guid>http://blog.80s.net.cn/?p=531</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892663/4919905/1/item.html</link>
	<description>&lt;p&gt;ND3D是一个超轻量级的AS3 3D Engine, 它的最大特点就是轻, 全部引擎文件编译后只有10K. 最新版本为0.2&lt;/p&gt;
&lt;p&gt;基本的3D功能都满足, Mesh Loader, interactive 3DObject, Basic Light System, Custom renderer等, 当然功能上和Away3d以及Papervision3D还是没法比, 但是确实很小巧, 适合那些没有很复杂的3D场景的应用.&lt;/p&gt;
&lt;p&gt;&lt;img border=&quot;0&quot; width=&quot;1&quot; src=&quot;http://www.nulldesign.de/wp-content/uploads/2009/02/nd3d_teaser.jpg&quot; height=&quot;1&quot; /&gt;&lt;a rel=&quot;attachment wp-att-532&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=532&quot; title=&quot;nd3d_teaser.jpg&quot;&gt;&lt;img src=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/04/nd3d_teaser.jpg&quot; alt=&quot;nd3d_teaser.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;  &lt;a href=&quot;http://code.google.com/p/nd3d/&quot;&gt;Project at GoogleCode&lt;/a&gt; | &lt;a href=&quot;http://www.nulldesign.de/nd3d/docs/index.html&quot;&gt;API Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从结构上看 NV3D的结构不是很合理, 比如Camera放在了Objects package里. 比如Renderer的功能太复杂, 其实应该把不同的功能拆开进行封装等. 不过最近看到的ND3D的更新很是兴奋, 如果大家不需要过于复杂的场景和交互, 简单的3D应用ND3D基本上够用.&lt;/p&gt;
&lt;h3&gt;随机日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2005年08月03日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=241&quot; title=&quot;Macromedia手机Flash专题研讨会（台北站）&quot;&gt;Macromedia手机Flash专题研讨会（台北站） (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2004年11月08日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=142&quot; title=&quot;超越DataGrid:数据的可视化&amp;#8211;flex的Charting组件&quot;&gt;超越DataGrid:数据的可视化&amp;#8211;flex的Charting组件 (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年07月15日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=493&quot; title=&quot;[AOL China] Internship Flash Developer and Designer&quot;&gt;[AOL China] Internship Flash Developer and Designer (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2005年09月03日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=255&quot; title=&quot;永远不要忘记这一天(1945年9月3日)&quot;&gt;永远不要忘记这一天(1945年9月3日) (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年11月20日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=418&quot; title=&quot;Q&amp;A on Flex and Silverlight&quot;&gt;Q&amp;#038;A on Flex and Silverlight (0)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/e43ee1ae71aa7a7f329dadd954e6604c&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/e43ee1ae71aa7a7f329dadd954e6604c/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Wed, 08 Apr 2009 16:50:13 +0000</pubDate>
</item>
<item>
	<title>80's Blog: Papervision3d with MD2</title>
	<guid>http://blog.80s.net.cn/?p=527</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892664/4919905/1/item.html</link>
	<description>&lt;p&gt;新版本的Papervision3d已经支持MD2和3ds的文件格式了, 原来都是用away3d来做, 现在也试试papervision3d. 它现在不仅仅只是Dae和Ase文件的模型文件的导入, 现在大家选择的余地更多了一些. 下面的例子就是导入md2的实例. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;什么是MD2? 请看&lt;a target=&quot;_blank&quot; href=&quot;http://tfc.duke.free.fr/coding/md2-specs-en.html&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下面是源文件, 直接拷贝就可以看到效果了. enjoy!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/04/main.as&quot; title=&quot;main.as&quot;&gt;原文件&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2009年04月07日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=522&quot; title=&quot;Bruce Lee on my hand&quot;&gt;Bruce Lee on my hand (9)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年07月06日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=398&quot; title=&quot;a AIR exercise — 3D Photo Browser&quot;&gt;a AIR exercise — 3D Photo Browser (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月21日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=395&quot; title=&quot;第一个AIR测试&quot;&gt;第一个AIR测试 (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月20日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=394&quot; title=&quot;Papervision3D 入门 [2] 第一个Papervision3D应用&quot;&gt;Papervision3D 入门 [2] 第一个Papervision3D应用 (3)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月20日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=393&quot; title=&quot;Papervision3D 入门 [1] 配置开发环境&quot;&gt;Papervision3D 入门 [1] 配置开发环境 (0)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/21d5e5accf4fd3cf09e1fae440116f62&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/21d5e5accf4fd3cf09e1fae440116f62/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Tue, 07 Apr 2009 18:51:59 +0000</pubDate>
</item>
<item>
	<title>80's Blog: Bruce Lee on my hand</title>
	<guid>http://blog.80s.net.cn/?p=522</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892665/4919905/1/item.html</link>
	<description>&lt;p&gt;&lt;a rel=&quot;attachment wp-att-523&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=523&quot; title=&quot;%e6%9c%aa%e5%91%bd%e5%90%8d-3.jpg&quot;&gt;&lt;/a&gt;最近简单研究3D+视频的东西, 分享一下视频, 正在想能怎么应用.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;papervision3D也支持md2的导入了, 不过功能比away3d还是差一些. 基本上流行的格式都支持了.&lt;/p&gt;
&lt;p&gt;对于那些youku看不了的同学就凑活看screenshot吧&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;attachment wp-att-524&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=524&quot; title=&quot;3.jpg&quot;&gt;&lt;/a&gt;&lt;a rel=&quot;attachment wp-att-524&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=524&quot; title=&quot;3.jpg&quot;&gt;&lt;img src=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/04/3.jpg&quot; alt=&quot;3.jpg&quot; /&gt;&lt;/a&gt;&lt;a rel=&quot;attachment wp-att-523&quot; href=&quot;http://blog.80s.net.cn/?attachment_id=523&quot; title=&quot;%e6%9c%aa%e5%91%bd%e5%90%8d-3.jpg&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2009年04月08日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=527&quot; title=&quot;Papervision3d with MD2&quot;&gt;Papervision3d with MD2 (2)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年07月06日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=398&quot; title=&quot;a AIR exercise — 3D Photo Browser&quot;&gt;a AIR exercise — 3D Photo Browser (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月21日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=395&quot; title=&quot;第一个AIR测试&quot;&gt;第一个AIR测试 (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月20日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=394&quot; title=&quot;Papervision3D 入门 [2] 第一个Papervision3D应用&quot;&gt;Papervision3D 入门 [2] 第一个Papervision3D应用 (3)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年06月20日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=393&quot; title=&quot;Papervision3D 入门 [1] 配置开发环境&quot;&gt;Papervision3D 入门 [1] 配置开发环境 (0)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/047b736496dfafd049750d48b82b09e4&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/047b736496dfafd049750d48b82b09e4/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Tue, 07 Apr 2009 10:54:07 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 留学回国人太少</title>
	<guid>http://blog.khsing.net/2009/04/post-3.html</guid>
	<link>http://blog.khsing.net/2009/04/post-3.html</link>
	<description>&lt;a href=&quot;http://news.163.com/09/0402/06/55SIQ4RF0001124J.html&quot;&gt;教育部透露30年来逾百万留学生留在国外&lt;/a&gt;，这新闻想起了《论语》里的一句话：
&lt;blockquote&gt;
孔子曰：&quot;求，君子疾夫舍曰欲之，而必为之辞。丘也，闻有国有家者，不患寡而患不均，不患贫而患不安，盖均无贫，和无寡，安无倾。夫如是，&lt;strong&gt;故远人不服，则修文德以来之。&lt;/strong&gt;既来之，则安之。今由与求也，相夫子，远人不服而不能来也，邦分崩离析而不能守也，而谋动干戈于邦内，吾恐季孙之忧，不在颛臾，而在萧墙之内也。&quot;
&lt;/blockquote&gt;
人家出去了不回来到底是谁的原因？</description>
	<pubDate>Fri, 03 Apr 2009 03:57:32 +0000</pubDate>
</item>
<item>
	<title>80's Blog: Silverlight 3 新特性</title>
	<guid>http://blog.80s.net.cn/?p=521</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892666/4919905/1/item.html</link>
	<description>&lt;p&gt;上次在twitter上说了一下Silverlight3的新功能被微软的人看见后因为是NDA的内容, 马上删除了. 这次发布后就可以随便说了, 其实也就差几天的时间. &lt;img src=&quot;http://blog.80s.net.cn/wp-includes/images/smilies/icon_sad.gif&quot; alt=&quot;:(&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video/Audio&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silverlight除VC-1外还支持H.264视频格式。这是YouTube等使用的新兴业界标准格式，并在很多设备上有硬解码。Silverlight也支持AAC音频。二者都以MP4容器格式实现(如.MP4或.M4A格式文件)。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;另外还支持F4v, Adobe的高清格式. 可惜的是在3.0这个版本中Silverlight还不支持Camera. 听说下一个版本会加入, 大家还需等待一年.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GPU Acceleration&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是Silverlight 3运行时中opt-in的特性，in-browser和out-of-browser都可以。在HTML中的Silverlight tag中，添加一个EnableGPUAcceleration=true参数来启用GPU加速。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3D Support&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silverlight 3带有透视3D，对于一个父元素，你使用一个Projection attached property，如：&lt;/p&gt;
&lt;p&gt;&amp;lt;Border.Projection&amp;gt;&lt;br /&gt;
   &amp;lt;PlaneProjection x:Name=”p3” RotationY=”-30” /&amp;gt;&lt;br /&gt;
&amp;lt;/Border.Projection&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这个perspective 3D也只是将平面对象转换成立体的对象, 而非真正的3D渲染引擎. 而Silverlight中还没出现Flash中的pv3d一类的3D engines.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;strong&gt;Animation Easing&lt;/strong&gt;新加入了很多easing的function, &lt;em&gt;和Flash里的Tween类似&lt;/em&gt;.
&lt;p&gt;&lt;strong&gt;Custom Dialogs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silvelright 3现在支持SaveFileDialog。出于安全原因，我们不返回路径给开发者，相反，你可以从结果中打开文件：&lt;/p&gt;
&lt;p&gt;mySaveFileDialog.Show();&lt;br /&gt;
if (mySaveFileDialog == true)&lt;br /&gt;
  return mySaveFileDialog.OpenFile();&lt;/p&gt;
&lt;p&gt;&lt;em&gt;关于上传下载FlashPlayer10有一些新的更新. 另外我觉得如果禁止修改的, 打开文件也可以加上.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Effects&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silverlight 3中引入的Effects提供低级手段来影响视觉效果。我们内置提供阴影和模糊两个效果，你也可以创建自己的效果。自定义效果以HLSL Shaders来实现——用DirectX SDK工具编译成byte code供Silverlight 3使用。Shaders允许开发者在UI元素渲染前修改每个像素。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;如果Silverlight也支持bitmapdata的话, 那么Effects的加入会对它的绘图功能提高很多.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pixel和Media APIs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你现在可以从位图中读/写像素。这个功能有两种使用方式：in-memory位图或保存visual到位图。同时支持的还有raw audio/video API实现动态声音生成，自定义视频codec，或者alpha video channels。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;in-memory位图或保存visual到位图, 这个就是微软学习FlashPlayer的bitmap的方式加入的新功能, 效率问题还没有测试.&lt;br /&gt;
另外动态声音生成在新版本的FlashPlayer 10 也加入了.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Local Messaging&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在多个Silverlight插件间传递消息曾是个挑战。现在我们支持类似&amp;#8221;命名管道&amp;#8221;的消息，不但垮同一网页上的对象，甚至跨多浏览器的多个Silverlight实例。例如一个Chrome实例中的Silverlight和Firefox中的另一个实例通信。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Flash中用localConnection来实现, 另外Flash中的localConnection还有垃圾收集的特别功效, 这点微软好像没有加入哟 :).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Out of Browser&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;通过一个manifest对每个应用程序启用(标准Silverlight 3模板中就有这个段落，你只要uncomment它)。一个用户可以右击Silverlight内容，或者点击应用里的一个按钮来启动Silverlight out-of-browser应用。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;这个功能很不错, 可以让用户将web应用部署到本地, 增加用户对当前web应用的依赖. 不知道Adobe会不会加上, 其实就是在它的swf文件和AIR文件中做一下关联, 在发布的时候同时发布两个文件, 然后用户可以将这两个文件同时部署到Server side上. 就类似Flex中的view source功能一样.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tooling&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Silverlight 3工具会包含新的压缩算法，XAP文件的大小会缩小10~30%。&lt;/p&gt;
&lt;p&gt;感谢&lt;a target=&quot;_blank&quot; href=&quot;http://blogs.msdn.com/cqwang/archive/2009/04/01/mix09-silverlight-3.aspx&quot;&gt;Felix Wang的提供&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2009年03月03日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=519&quot; title=&quot;Silverlight toolkit&quot;&gt;Silverlight toolkit (2)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年10月24日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=507&quot; title=&quot;AOL Mail RIA Beta! base on Silverlight&quot;&gt;AOL Mail RIA Beta! base on Silverlight (2)&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年09月10日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=497&quot; title=&quot;Silverlight3.0将会支持高清的Flash Video&quot;&gt;Silverlight3.0将会支持高清的Flash Video (7)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年06月25日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=486&quot; title=&quot;CSDN（SD俱乐部第4期）下一代用户体验设计&quot;&gt;CSDN（SD俱乐部第4期）下一代用户体验设计 (1)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/8f086458aab530a1a97147368627b46d&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/8f086458aab530a1a97147368627b46d/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Thu, 02 Apr 2009 00:31:40 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 一个记录地球变化的blog</title>
	<guid>http://blog.khsing.net/2009/03/blog-1.html</guid>
	<link>http://blog.khsing.net/2009/03/blog-1.html</link>
	<description>&lt;a href=&quot;http://jackos.org&quot;&gt;Jackos&lt;/a&gt;最近整了一个专门记录地球变化的blog－－&lt;a href=&quot;http://www.think-earth.org&quot;&gt;暴风地球&lt;/a&gt;，域名是刚刚的(www.think-earth.org)。</description>
	<pubDate>Wed, 25 Mar 2009 10:27:57 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 毒的下半部分是毋还是母</title>
	<guid>http://blog.khsing.net/2009/03/post-2.html</guid>
	<link>http://blog.khsing.net/2009/03/post-2.html</link>
	<description>2会上有个人大代表提了个废除简体字的案，想起几年前有篇《简化汉字到底简化了什么》里提到的&quot;毒&quot;字。查&lt;a href=&quot;http://dict.revised.moe.edu.tw/&quot;&gt;国语辞典&lt;/a&gt;：
&lt;blockquote&gt;
毒，部首：毋，部首外筆畫：4，總筆畫：8
&lt;/blockquote&gt;
查&lt;a href=&quot;http://fawen.cn/hanyu-zidian.html&quot;&gt;汉语在线词典&lt;/a&gt;
&lt;blockquote&gt;
会意。从屮(象草木初生),毒声。本义:毒草滋生。
&lt;/blockquote&gt;
再查&lt;a href=&quot;http://zhongwen.com&quot;&gt;zhongwen.com&lt;/a&gt;的&lt;a href=&quot;http://zhongwen.com/d/172/d114.gif&quot;&gt;释意&lt;/a&gt;里有这样一句。
&lt;blockquote&gt;
bottom usually written as 母
&lt;/blockquote&gt;
&quot;下半部通常写作母&quot;，看来毒的下半部确实是毋，但无论是现行的繁体字和简体字都是写做母的。</description>
	<pubDate>Fri, 13 Mar 2009 04:10:16 +0000</pubDate>
</item>
<item>
	<title>Limodou: Jython中数组的生成</title>
	<guid>http://hi.baidu.com/limodou/blog/item/4ffd1138918cdbfab311c71d.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/4ffd1138918cdbfab311c71d.html</link>
	<description>比如在Java中有byte []，那么如果需要在Jython中传入这样的参数怎么办呢？可以使用jarray模块。如：&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;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &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;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;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;jarray&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;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;font color=&quot;#0000c0&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;10&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;20&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;]&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;a&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;=&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;jarray&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;array&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;font color=&quot;#804000&quot;&gt;'b'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;a&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;array&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'b'&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;10&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#0080c0&quot;&gt;20&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;
使用jarray.array就可以生成数组。而且它是一个通用的功能，根据第二个参数的不同，可以生成不同的类型。对于不同的类型，可以使用不同的类型代码，如：&lt;br /&gt;
&lt;br /&gt;
z Boolean&lt;br /&gt;
c char&lt;br /&gt;
b byte&lt;br /&gt;
h short&lt;br /&gt;
i int&lt;br /&gt;
l long&lt;br /&gt;
f float&lt;br /&gt;
d double&lt;br /&gt;
&lt;br /&gt;
如果要转换的没有对应的类型代码，可以直接使用类，比如：java.lang.Byte。&lt;br /&gt;
&lt;br /&gt;
不过对于byte，Python中没有分得很细，要么是字符串，要么是整数。而Java中的byte是带符号的，因此，如果你把一个16进制的字符串想转为一个Byte，怎么做？&lt;br /&gt;
&lt;br /&gt;
int('0xff', 16)&lt;br /&gt;
&lt;br /&gt;
这样得到一个整数。然后：&lt;br /&gt;
&lt;br /&gt;
java.lang.Byte(int('0xff', 16))&lt;br /&gt;
&lt;br /&gt;
但是直接使用java.lang.Byte对象来生成数组是不行的，如：&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;  3 &lt;br /&gt;  4 &lt;br /&gt;  5 &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;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;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;java&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;jarray&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;array&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;java&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lang&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Byte&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;255&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;#804000&quot;&gt;'b'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;Traceback&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;most&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;recent&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;call&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;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;File&lt;/font&gt; &lt;font color=&quot;#804000&quot;&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&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;#0080c0&quot;&gt;1&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;,&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;in&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#0000c0&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;module&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;TypeError&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;:&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;Type&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;compatible&lt;/font&gt; &lt;font color=&quot;#0000ff&quot;&gt;&lt;strong&gt;with&lt;/strong&gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;array&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;type&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
可以看到类型不对。这时可以使用java.lang.Byte的intValue()就可以了，如：&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;  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;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;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;java&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&amp;gt;&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;&amp;gt;&lt;/font&gt; &lt;font color=&quot;#000000&quot;&gt;jarray&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;array&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;java&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;lang&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;.&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Byte&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#0080c0&quot;&gt;255&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;intValue&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;#804000&quot;&gt;'b'&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;)&lt;/font&gt;&lt;br /&gt;&lt;font color=&quot;#000000&quot;&gt;array&lt;/font&gt;&lt;font color=&quot;#0000c0&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#804000&quot;&gt;'b'&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;#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;/font&gt;&lt;/pre&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
BTW: 刚看到3月9日，Jython 2.5b3发布了，修复了我以前说的关于from xxx import *的Bug。 
		
		&lt;br /&gt;&lt;b&gt;类别：&lt;/b&gt;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/category/Jython&quot;&gt;Jython&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://hi.baidu.com/limodou/blog/item/4ffd1138918cdbfab311c71d.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Fri, 13 Mar 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: StyledTextCtrl语法高亮使用的探讨</title>
	<guid>http://hi.baidu.com/limodou/blog/item/1e8ad5077200fdc57a8947c7.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/1e8ad5077200fdc57a8947c7.html</link>
	<description>原来是想投稿的，但是编辑们认为太具体了，范围太窄，没人采用。所以一直也没有发表过，也不曾公开过。不过正好有网友问到这个问题，我找了出来放到网上。从这里&lt;a href=&quot;https://www.box.net/shared/508zt4amao&quot; target=&quot;_blank&quot;&gt;下载&lt;/a&gt;。有文章和源码。&lt;br /&gt;
&lt;br /&gt;
文章描述了内置的Lexer的使用和自定义的Lexer的使用。不过它是一个精简版本，Ulipad对于自定义Lexer作了增强。有兴趣可以去看Ulipad的源码。主要是 NCustomLexer.py ，可以使自定义语法高亮更容易。同时在Ulipad的英文文档 howto_write_custom_syntax_support.htm 中我也写过如何使用它，可以看一看。另外有许多Lexer就是使用NCustomLexer来处理的都可以看，比如：&lt;br /&gt;
&lt;br /&gt;
mixins/LexerRst.py  处理reStructuredText&lt;br /&gt;
plugins/djangoproj/DjangoTMPLexer.py 处理Django模板&lt;br /&gt;
plugins/mako_plugin/MakoTMPLexer.py 处理Mako模板&lt;br /&gt;
&lt;br /&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/1e8ad5077200fdc57a8947c7.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 11 Mar 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: StyledTextCtrl不支持screen reader :(</title>
	<guid>http://hi.baidu.com/limodou/blog/item/1be4d788e30e9f9ca4c272be.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/1be4d788e30e9f9ca4c272be.html</link>
	<description>今天一位外国朋友问我的UliPad不支持screen reader，刚开始不太明白，于是我试了灵格斯，可以抓文字。但是我问了他什么叫screen reader，才搞明白screen reader大部分是给盲人和弱视的群体使用的软件，因为他们无法阅读屏幕，所以需要读屏的软件。这种软件可以把你的屏幕直接读出来，比如：鼠标的移动会有不同的声音，让你很容易就知道大概的位置。鼠标放在某个窗口就可以自动将内容读出来。他还特别告诉我了两个软件：Jaws和nvda。而且nvda是使用Python开发的。不过大部分的软件对于微软的控件支持比较好。而Ulipad是使用了Scintilla的版本StyledTextCtrl。&lt;br /&gt;
&lt;br /&gt;
那么为了测试，我下载了nvda，是从一个叫&lt;a href=&quot;http://www.mangren.org/&quot; target=&quot;_blank&quot;&gt;自强盲人网&lt;/a&gt;的地方。以前我从来没有去过这样的地方。甚至还搜到一个叫晴天小站的Blog，他的作者杨永全就是一位盲人。这里有他的一份&lt;a href=&quot;http://www.qt06.com/read.php/1.htm&quot; target=&quot;_blank&quot;&gt;介绍&lt;/a&gt;。看到他的眼睛让我有一种说不出的感觉。我感谢我现在生活得很好。&lt;br /&gt;
&lt;br /&gt;
还是说一说nvda吧。启动后，鼠标的移动有声音，自动念的中文，不过效果不是太好。放在Ulipad中不知道念得什么，反正不是文件的内容。但是使用EditPlus打开相同的内容却可以自动念。因此我想，这个可能才是那位外国朋友想要的功能。于是在google上查了一下，很早就有这个问题，说是Scintilla的1.62版本就可以解决。不过现在版本应该早就过了，但是还是有这样的问题。很失望。&lt;br /&gt;
&lt;br /&gt;
很希望Ulipad可以让帮助更多的人。 
		
		&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/1be4d788e30e9f9ca4c272be.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Mon, 09 Mar 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 备份很重要</title>
	<guid>http://blog.khsing.net/2009/03/backup-is-important.html</guid>
	<link>http://blog.khsing.net/2009/03/backup-is-important.html</link>
	<description>周末，机器硬盘挂了，只有DB做了备份，所以&lt;a href=&quot;http://blog.khsing.net&quot;&gt;blog&lt;/a&gt;还在，其他的&lt;a href=&quot;http://wiki.khsing.net&quot;&gt;wiki&lt;/a&gt;呀，&lt;a href=&quot;http://www.khsing.net&quot;&gt;www&lt;/a&gt;呀全挂了。备份真的很重要。</description>
	<pubDate>Thu, 05 Mar 2009 02:00:41 +0000</pubDate>
</item>
<item>
	<title>80's Blog: Silverlight toolkit</title>
	<guid>http://blog.80s.net.cn/?p=519</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892667/4919905/1/item.html</link>
	<description>&lt;p&gt;Silverlight toolkit是一套微软提供的control和component集合, 类似的Flex SDK中的mx package. 对大家都开发很有用, 这次在MVP Summit 2009里听了这个session, 感觉有个不少更新, 更贴近了开发者的需求, 帮助设计师和开发者进行了不少基础工作, 提高了效率. 他们最近还会加入不少的controls, 大家可以关注这个blog: &lt;a href=&quot;http://www.jeff.wilcox.name/&quot;&gt;http://www.jeff.wilcox.name/&lt;/a&gt; jeff wilcox是微软总部silverlight toolkit development team的成员.&lt;/p&gt;
&lt;p&gt;resources:&lt;/p&gt;
&lt;p&gt;download the latest version:&lt;br /&gt;
&lt;a href=&quot;http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19172&quot;&gt;http://silverlight.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=19172&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;online sample(类似Flex的components explorer):&lt;br /&gt;
&lt;a href=&quot;http://silverlight.net/samples/sl2/toolkitcontrolsamples/run/default.html&quot;&gt;http://silverlight.net/samples/sl2/toolkitcontrolsamples/run/default.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Silverlight toolkit overview part 2 chart:&lt;br /&gt;
&lt;a href=&quot;http://silverlight.codeplex.com/Wiki/View.aspx?title=Silverlight%20Toolkit%20Overview%20Part%202&amp;referringTitle=Home&quot;&gt;http://silverlight.codeplex.com/Wiki/View.aspx?title=Silverlight%20Toolkit%20Overview%20Part%202&amp;amp;referringTitle=Home&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Codeplex上的Silverlight toolkit page(这个toolkit是开源的, 大家可以看到source code, 大家不妨看看微软是怎么实现这个庞大的组件架构的, 很有帮助,另外所有的微软开源程序例如那个linux上的Silverlight - moonlight就是在这里发布的):&lt;br /&gt;
&lt;a href=&quot;http://www.codeplex.com/Silverlight&quot;&gt;http://www.codeplex.com/Silverlight&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2009年04月02日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=521&quot; title=&quot;Silverlight 3 新特性&quot;&gt;Silverlight 3 新特性 (7)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年10月24日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=507&quot; title=&quot;AOL Mail RIA Beta! base on Silverlight&quot;&gt;AOL Mail RIA Beta! base on Silverlight (2)&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年09月10日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=497&quot; title=&quot;Silverlight3.0将会支持高清的Flash Video&quot;&gt;Silverlight3.0将会支持高清的Flash Video (7)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年06月25日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=486&quot; title=&quot;CSDN（SD俱乐部第4期）下一代用户体验设计&quot;&gt;CSDN（SD俱乐部第4期）下一代用户体验设计 (1)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/d757793a08b9c5959337ec010118c792&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/d757793a08b9c5959337ec010118c792/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Mon, 02 Mar 2009 23:46:38 +0000</pubDate>
</item>
<item>
	<title>Limodou: 关于Learning Uliweb的邮件回复－－uliweb区别于其它框架的特点</title>
	<guid>http://hi.baidu.com/limodou/blog/item/4ffd1138b2d6fafab311c75b.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/4ffd1138b2d6fafab311c75b.html</link>
	<description>写得很匆忙，也有不少错字，主要是基于我对django和web2py的体验，其它的象tg, pylons实在是没有用过。贴在下面：&lt;br /&gt;
&lt;br /&gt;
－－－－－－－－－－－－－－－－－－－－－－－&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 首先向Limodou表示一下敬意。能够长期从事开源软件开发的爱好者不多，而其中大多数人往往更愿意写code而不太愿意写好文档。Limodou为 Uliweb动手著书，实在是有大气。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 关于Uliweb，想提个问题。我不止一次在Limodou介绍uliweb的片言只字里看到这样的提法：&amp;ldquo;我用过xx框架，但后来有许多设计上的观点不被接受，于是我渐渐远离了xx&amp;rdquo;。那么能否先高屋建瓴地对比一下uliweb与其它框架的不同之处、uliweb的某个特别设计又好在什么地方呢？&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
在uliweb的文档architecure.rst中我描述了uliweb的整个架构。说简单也简单，就是将app的管理机制尽可能的做到独立。一个app就是一个开发单位，这种设计并不是uliweb新创造出来的，也是在我学习了django之后学过来的。正象在书中许我地方，我也会强调某个点是从哪个框架学来的，这是很正常的。除了app的机制外，还把其它框架中我认为好的地方尽可能的集中起来，不能说uliweb就一定比其它的好，只不过从个人角度来说，我认为是不错的。&lt;br /&gt;
&lt;br /&gt;
1. app管理。 django的app管理正如你下面所写的，我认为不完善。这一点其实在邮件列表中也有多次讨论。当然也并不是大家都赞同，许多人还是认为django的好。所以，选择一个框架最重要的是先要选择它的思想，思想对路的话，你可能会接受它的缺点，但是思想不对路，你可能只看到缺点。而uliweb也是这样的，它只是我个人web开发经验（其实我的经验可能不如你们许多人，只不过我希望把我的一些开发经验通过框架形成一种重用的形式，再尽可能让大家利用这种重用来积累经验。许多框架也都是这样，但是重用与重用是不同的，有些易于重用，有些不易于重用。这就是设计上的区别了）。对于django（0.97版之后就没有怎么研究了），app只能重用象template, views, urls，而static，配置都没有重用的机制。所以uliweb在这点上做了扩展。主要原因就是一个app是开发单位，而一个功能的实现除了有模板，view的处理，url的映射，还有象css, image之类的资源文件和配置信息。这些能做到重用，才会使用app的重用更方便。这里与django的比较主要是从哪个更方便来说的。&lt;br /&gt;
&lt;br /&gt;
再说一说与web2py的比较。web2py也有阵子没有关注了，虽然我经常在看。它的app是运行单位，不是功能或开发单位。所以app之间的重用很麻烦，不符合我的要求。这是最主要我离开web2py的原因。&lt;br /&gt;
&lt;br /&gt;
2. views的方便性。这一点是从web2py来的。在web2py中不需要定义request, response等变量，可以直接使用。这就减少了象django中的要定义request参数的麻烦。也许不是一个很重要的变化，但的确可以减少代码。同时，response也是自动有一个缺省的，这样你可以直接使用，并不需要象django一样，一定要定义一个Response对象。所以这块也有简单。再有就是模板的自动映射。在web2py和uliweb中，当返回一个dict时，会自动查找一个同名的模板文件，因此非常方便。而django是要指定的，我认为麻烦一些。同时response.template可以更换模板文件。最差的也可以调用模板函数手动去处理，就和django没什么区别了。&lt;br /&gt;
&lt;br /&gt;
3. url的映射。我使用的是werkzeug的route模块。它的定义类似于django，但是它基本上不需要写正则表达式，比如&amp;lt;filename&amp;gt;这就是一个匹配，在django中是要写成正则式的，这一点比较麻烦。同时werkzeug还支持一些参数，如定义GET,POST等，可以实现REST的方式。还提供了url_for这种机制(这是后来django才有的)。所以从url的定义上，我认为django的还不够方便，许多route库都不需要定义原始的正则式。这块django做得还不够方便。&lt;br /&gt;
&lt;br /&gt;
再说一说映射。我是定义了一个decorator，可以在views中对view函数进行修饰，也支持自动生成urls.py，在urls.py中集中定义，因此没有单独的urls.py，也不存在include的功能。因为url的绑定是放在views.py中的，因此当复用app时，并不需要修改集中的urls.py(一般也没有）。另django则需要修改。&lt;br /&gt;
&lt;br /&gt;
但是web2py的方式我也不喜欢。首先它是controller/action/function的方式，你并不需要绑定url，它是固定格式。但一旦你想写的话，就是写一个route.py的文件，里面面用正则式来写如何转换。曾经我写过一个使用其它的route的模块来处理url，但是要修改核心，作者不同意。&lt;br /&gt;
&lt;br /&gt;
4. 模板。这是我在邮件列表中讨论过多次了。django的模板看上去是挺好，但是由于象if, for,基于是不能动态创建变量这种基本功能的缺失，在处理复杂处理时，而这些处理正好是为了显示才做的，非常麻烦，甚至要手写tag。现在django的tag不可谓不多了，已经是一门独立的语言了，看一看djangosnippets就知道了，有好有坏，django的团队我看是基本上不关注的。我还曾经想，会不会定期把一些好的tag合到django中去，但是没有见过有这样的行为，也许是我没有看到。为此我还写过一些tag，还有一些外国朋友问把我的expr之类的tag加入他们的项目需要什么样的license。如果django的模板稍微多一点工作，我写的许多的tag都没有存在的必要。所以我最终选择了web2py的模板。它支持python代码的嵌入，支持必要的tag，如extend, include等。语法一致，如都是放在{{}}中的。而django是使用{%%}和{{}}来区分。在web2py中都一样。同时使web2py，不用关心缩近，它会自动处理，但是要在块结束的位置加上pass，这是python的空语句。&lt;br /&gt;
&lt;br /&gt;
但是web2py的模板不支持block，我认为这是django模板中一个非常好的功能，于是我做了扩展，加上这一功能，但是这一功能我在一个web2py的邮件中作了回复，没有感兴趣。现在我还扩展了支持自定义tag，不过比较简单。因为可以使用python代码这一功能基本上不需要。你也可以向模析台注入新的方法和函数在模板中直接使用。另外web2py的模板可以编辑成py代码，象mako一样可以存在一个临时目录，不过这也是我扩展的。现在的uliweb的模板是从web2py模板发展来的，但是做了许多的改进。&lt;br /&gt;
&lt;br /&gt;
5. settings 在django中是使用python源码，很多人都喜欢。我原来也喜欢。但是前面说到了一个原因是每个app没有自已的setting，因此限制了重用的方便性。同时python源码造成它的形式会非常灵活，而不方便通过程序进行改写，如果你想写一些安装工具时，这种方式非常困难。其实许多的框架都使用ini形式的配置文件，如tg, pylons。我曾经向django建议，结果得到了很强列的反对。tg有阵子来考虑使用我的dict4ini来处理ini，不过没有使用，后来使用了ConfigObj，后来就不太清楚了。最早uliweb也是使用py文件，但是后来我还是改成了ini格式，不过可以支持基本的python语法，只不过不能使用import之类的。所以可以看成是ini与python表达式的结合。而且还支持了#coding=这种编码的定义和_()的国际化处理支持（当然要与uliweb相结合)。web2py这一点不让我满意，因为它的一个设计思想就是0配置，在我看来，一个灵活的框架与配置本来就不可分，0配置表示用户很难灵活的架建自已想要的框架，所以这也是我离开web2py的原因。再有就是web2py的作者过于强调语法的向前兼容，在我看来这是很好的，但不应是一种教条，一旦绝对化，对于以后的优化没有什么好处。&lt;br /&gt;
&lt;br /&gt;
6. ORM其实这倒没什么。web2py和django都是自已的。于是uliweb也搞了一个，基本语法是参考GAE的，许多代码是从GAE学来的，而GAE又是学Django的。不过我的低层是使用的sqlalchemy。所以语法也基本上是sqlalchemy。目前也支持manytoone, onetoone, manytomany,不过开发时间不长，还没有人使用，所以可能与其它的比不了。功能也不一样完整。不过与django的区别是：在django中，表级别的操作要通过manager，即Model.objects来操作，而Uliweb的ORM是直接Model.all()之类就可以了。因为它使用了descriptor来处理，所以可以直接在model类上进行，而django没有使用，所以不得以使用manger的方式，当然这也造成，你可以构造新的manager。不过在uliweb上想做也是可以的，就是在类上定义一个类方法就好了。web2py原来叫ORM，但是后来是认没有ORM的功能，所以改为DAL（数据库抽象层）。可比性不高。&lt;br /&gt;
&lt;br /&gt;
7. i18n。都有这功能。uliweb的i18n是自已做的，但对于翻译函数的处理是学django的。不过因为uliweb的模板可以转换为python代码，所以处理上要比django简单。而web2py的国际化处理并没有使用标准的gettext，是通过定义一个T，然后自动抽取，处理模式不同。uliweb的i18n处理学习了django的，可以从cookie,&lt;br /&gt;
session, 配置中得到语言设置。&lt;br /&gt;
&lt;br /&gt;
8. uliweb有一个form库，是自已写的。可以不用。支持象django一样的定义，校验，validator的使用，比效OO。而web2py则看上去是HTML代码与form处理的一个混合体，不是很OO。&lt;br /&gt;
&lt;br /&gt;
9. 其它uliweb的特点。有一些是别的框架已经有的：&lt;br /&gt;
&lt;br /&gt;
* django风格的middleware&lt;br /&gt;
* wsgi middleware的支持，目前测试比较少，现在的staticfiles就是一个middleware&lt;br /&gt;
* app之间可以定义依赖，放在config.ini中，这样在导入一个模板时将自动将依赖的app自动添加。而django没有这种机制。这样可以简化对settings.ini的修改。&lt;br /&gt;
* 部分地方使用pkg_resource进行处理。django从使用setuptools后来放弃了，改成原来的disutils。&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 就目前我从《Learning Uliweb》中感觉到的，貌似Uliweb的重点在于追求重用，实现这一点的手段就是settings.ini。不知道这个理解是否片面？&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 摘录《Learning Uliweb》中的一小段。&lt;br /&gt;
&amp;gt; 在前面你看到app可以有自已的settings.ini，可能你会问为什么这样设计？答案是：为了重用。在Django中你做不到，甚至django中不提供static目录的支持。那么这样的结果是：所有的app的配置信息都放在了settings.py中，所以有app相关的静态文件被放在了一起。对于单个项目是没有关系，但是一旦你想把其中的某个app拿出来复用就会非常麻烦，你可能很难找到哪些是与这个app相关的。而一个app的功能是&lt;br /&gt;
&amp;gt; 多方面的，需要的资源也是多样的，配置信息就是其中一种。因此，这就是Uliweb的设计。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
重用在其它的地方，如GUI之类的似乎要容易得多，而web开发要复杂得多，因为一个功能可能涉及到许多的内容，如css, images, template, views, url等等。虽然它们分散存在，但是却是为了完成一个功能。所以这就是uliweb对app的理解。而前面所说的app的依赖的处理也是充分了考虑重用也设计出来的。为什么软件开发做不到象盖房子那样，一方面创造性，不缺定性造成的，另一方面我认为可能还是重用性设计得不够。&lt;br /&gt;
&lt;br /&gt;
以上只是匆忙想到的，主要是个人主观感受。一个框架必然有它的思想在里面，所以uliweb不会适合每一个人。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;update 2009.3.1 又新添加了些回复，主要是针对于web2py的：&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;gt; 谢谢Limodou推心置腹的交流。我没有用过Django，近期用得多的是web2py，所以以下对Limodou提到的方面，说说我在使用web2py过程中的理解或者处理手法，请Limodou指点。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 1. 关于app的管理，或者说关于&amp;ldquo;重用&amp;rdquo;。不错，和GUI相比，WEB开发之中， 涉及到&amp;quot;css, images, template, views, url等等，虽然它们分散存在，但是却是为了完成一个功能&amp;rdquo;。而我觉得app就是包含以上各&lt;br /&gt;
&amp;gt; 个内容的超集，所以完全可以把完成某种通用功能的一批css,images,template,views等东西组织在一个通用app之中，然后其它的业务app通过类似webservice的方式来调用通用app中的内容。感觉上这样的效果也许用起来不如uliweb本身内建重用机制那么天然，但最终实际效果差不多。况且从我的个人体会来看，web开发要用到的个把css或image之类的，不就是几个文件嘛，大不了就手动copy一个副本，这样至少有一个好处是一个app按自己需求调整个把css，也不会影响到其它的app。追求重用是好，但如果过了头，那么紧耦合的一些缺点也会出现。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
重用并不表示不可以调整。就象我前面所写的，重用与重用不同，有些重用简单，有些重用要手工改许多东西。易用性的差别往往就那么一点。这么多的框架，从功能上讲那个都差不到哪里去，但是为什么有人喜欢这个，有人喜欢那个，可能就是因为这一点点。web2py的service是应用级别的重用，从更高层的划分它只是一种重用的方式。其实在许多时候我们只想要重用一些静态文件，功能，并不是一个完整的service级别的重用，因此web2py的这种重用对于这种情况很麻烦。所以效果差不多要看具体的情况，我不认为差不多。至于拷贝文件，正是许多人认为无所谓破坏了易用性。对于已经非熟的人，你怎么做都会认为无所谓，因为everything in the control，但是对于初学者这之前的差异就很大。甚至到了一些UI的交互设计上，甚至要考虑如何减少一次点击，少一次按键。也许是过头，但是如何表示这种设计就是过头了呢？何况这种设计，你可以看到，并不是很困难。许多时候，开发者多想一点，多做一点，就会给使用者非常大的方便。让别人方便我不认为是过头。而紧耦合性的缺点也只是理论上，如果有，自然要想办法去解决了。所以有问题并不可怕，这正好是设计与实用性的一个平衡问题。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 另外，如果Limodou有持续关注web2py的话，可能也已经注意到它先后发展出的T2、T3插件。简单来说就是从&amp;ldquo;模式&amp;rdquo;的高度去定义并实现了WEB开发过程当中的一些常见需求，例如用户认证、极限管理、数据搜索、分页呈现……等等。看来web2py不是不重视重用，但走的是另外一种路子，重用的是模式。&lt;br /&gt;
这些我了解得很少T2我看了一点文档。未来uliweb可能也会向这方向来走。不过我以前在blog也说过，框架应该是分层的，最底层是给平台构建人员使用的，将用来构建满足自已团队需要的环境。然后是最终用户，他们将在新的平台上进行工作。所以uliweb目前还主要在完成底层的构建，对于平台还在摸索和积累中。而web2py已经在开始提供我认为的平台层了。这是更高层的复用，这一点我并不否认。只不过要看它是以何种方式来复用，是通过app还是别的。这一点我的确没有太多了解。因为web2py的app是独立可运行的，从这一点它很难做到细粒度的功能复用。因为它里面的功能并没有分开，所以与我的要求不满足。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 2. uliweb的view方面和web2py的controller看来是差不多，就不说什么了。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 3. url映射。django的url映射要用到正则表达式，这是我从一开始就没有选择学习django的最大原因。:) 正则表达式的功能是强大，但学习起来的门槛也较高。君不见咱这python-cn列表，问django里怎么写某个URL或者问怎么写正则的邮件，多了去了。在合适的场合用正则，事半功倍；在不必要的场合用正则，自讨苦吃。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 扯远了。说回web2py的url映射，固然是固定了只能用/app/controller/function的方式，但实际使用之中也没觉得有什么不方便呀。无非就是对于那些访问了不存在的路径的请求，无法全部捕获并转到某个通用的错误处理函数罢了。也基本不影响使用，因为正常情况下用户是在我们app的菜单之中选择操作，不应该需要自己输入某个错误的URL的。在这里我没有领会到要有更灵活的url映射机制的必要性，权当是一种锦上添花的功能吧。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
web2py也支持将/app/controller/function映射为其它的url的形式，但是需要定义一个route.py，而且要使用正则式。uliweb则使用简单的route规则，比正则式要简单，所以我认为是一个比django正则式更好的方案。而且uliweb的expose函数，有一个特点，比如&lt;br /&gt;
&lt;br /&gt;
@expose&lt;br /&gt;
def index()&lt;br /&gt;
&lt;br /&gt;
可以看到，我并没有指定url，但它可以直接映射为/app/views/function，很象web2py。灵活性是功能的要求，而不是个人的要求。当然也可以看到是我的要求。虽然你不需要，但并不表示我或其它人不需要。在django中专门就url有一个说明，它说好的url是设计出来的，我很赞同。另外就是uliweb的expose支持一些方法，如是否只匹配GET或POST，可以实现REST的风格。这又可以让一些人高兴。框架虽然不会让每个人高兴，但是如何可以让更多人高兴，为什么不去做呢？我反正是很少坚持我个人的哲学（当然我也会有），但是如果改动不大，我很乐意考虑加入一个新特性。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 4. 模板。web2py的模板倒是有extend和include的指令，本来就是用于扩展缺省layout模板的。和block的效果有点接近吧。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 另外就是可能在MVC（或MTV）分层思路的角度，template里通常不应该存在太复杂的业务逻辑，所以估计不支持block的实际影响也不大。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
extend和include在django中也有。但它是文件级别的。而block是一个文件中的一部分。在web2py中处理起来很麻烦。因为它只能定义一个{{include}}。但是一个模板可能有许多地方是可以让用户来替换的，在web2py中就不方便。这并不是什么业务逻辑，这是模板替换的要求，在实际中有这样的需求。这一点是我认为django不错的。所以我也扩展了一下。对我影响很大。比如我有一个layout模板，上面有一个{{block title}}untitle{{end}}。这个意思是说我希望title是可以替换的。但是在这个模板中至少还有{{block main}}{{end}}用来输出页面的内容。因此一个页面就有两个内容可能需要替换。那么在web2py中会怎么做？&lt;br /&gt;
&lt;br /&gt;
用函数吗？如果子模板没有定义怎么办？使用block时，如果子模板没有定义相应的block，则可以使用block中原来的内容。所以block一方面是指定了可以替换的内容块，另一方面还起到提供缺省值的作用。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 5. settings。估计你说的setting是指配置文件。虽然web2py没有显式的setting机制，但事实上由于它在每次执行一个app时都会先导入所有相关的model文件，所以客观上开发者可以定义额外的model文件，在里面定义当前app范围内的配置项，当成配置文件那样使用。&lt;br /&gt;
&amp;gt; 这在web2py圈子已经是惯例了，事实上web2py的作者Massimo自己也这么干。:) 所以setting的问题应该是互相等价吧。&lt;br /&gt;
你说的model是指什么？是数据库定义的model还是什么？这一功能是与app复用相关的，但是由于web2py不支持细粒度的复用，所以这一功能对于web2py的意义不大。因为它的一个app就是一个运行单位，而且一个app内部又没有细分，所以不存在我说的情况。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 至于说web2py是否&amp;ldquo;过于&amp;rdquo;强调语法的向前兼容，这个见仁见智了。不过要看到，web2py在承诺保证对1.0版的所有语法都永远保持兼容的前提下，也以极快的速度增加新功能。手法很简单，新的东西以新的API出现，但旧的东西保持不变。我认为这很好地平衡了兼容性和扩展性。&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
这一点我曾经向作者建议过。有时候为了引入新功能，兼容性的破坏是可以接受的。甚至如果用户都说无所谓，作为开发者一定要坚持是否有必要，更何况以前的版本还有多少个人在用。是否兼容我看是要看以前的版本是否还需要继续支持，不然，没人用的东西我还坚持它作什么？现在的软件更新都很快，大家也喜欢用新的版本。特别是对于一个新生的框架，用的人没几个，考虑太多反而没有必要。所以坚持不坚持要看实际的情况，不是一成不变的。如果以前的版本仍然有许多人在用，是可以考虑兼容性的。我并没有说一定不兼容，只不过不希望兼容变成框架发展的一个限制而已。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&lt;br /&gt;
&amp;gt; 其它的好象差别不大，就不多说了。&lt;br /&gt;
&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/4ffd1138b2d6fafab311c75b.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sat, 28 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 将Learning Uliweb中的配套代码放在了uliweb-tests中了</title>
	<guid>http://hi.baidu.com/limodou/blog/item/e2c10d33496317ff1a4cffb5.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/e2c10d33496317ff1a4cffb5.html</link>
	<description>可以从 http://code.google.com/p/uliweb-tests 中找到。现在第4章已经基本完成。越往后可能进度越慢，因为一方面讲得东西会越来越多，越来越深，另一方面测试的代码会越来越复杂。 
		
		&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/e2c10d33496317ff1a4cffb5.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 25 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 使用Ulipad的Python代码渲染功能</title>
	<guid>http://hi.baidu.com/limodou/blog/item/5e6b7acbc00a0b18be09e692.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/5e6b7acbc00a0b18be09e692.html</link>
	<description>在 17xie 上已经开始了《Learning Uliweb》的写作，到目前已经进入第三章的写作，不过是最简单的Hello的讲解。那么我遇到一个问题是代码高亮怎么办。后来想起来Ulipad本身就有代码转换成HTML的功能，并且可以直接打开浏览器看到结果。所以就用它将转换代码，然后贴到web编辑器中。效果还不错。百度的Blog也可以这么干。&lt;br /&gt;
&lt;br /&gt;
使用方法：&lt;br /&gt;
&lt;br /&gt;
1. 先选中要处理的Python代码&lt;br /&gt;
2. 点右键在弹出菜单中选Convert-&amp;gt;Output to HTML Window(或在Edit菜单也可以找到Convert菜单)，这只是一个配置项，是不能输出的&lt;br /&gt;
3. 然后再点右键，在弹出菜单中选Convert-&amp;gt;Py to HTML，就可以看到弹出一个HTML窗口，有转换后的Python高亮代码。选中，拷贝就行了。&lt;br /&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/5e6b7acbc00a0b18be09e692.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Tue, 24 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>80's Blog: 80s on NewWebPick</title>
	<guid>http://blog.80s.net.cn/?p=518</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892668/4919905/1/item.html</link>
	<description>&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.80s.net.cn&quot;&gt;80s studio 2009&lt;/a&gt;已经被&lt;a target=&quot;_blank&quot; href=&quot;http://www.newwebpick.com/_webpick/webpick.php?categories=all&amp;id=25725&quot;&gt;NewWebPick&lt;/a&gt;收录, 挺荣幸.&lt;/p&gt;
&lt;p&gt;已经在首页加入了&lt;a target=&quot;_blank&quot; href=&quot;http://www.newwebpick.com/_webpick/webpick.php?categories=all&amp;id=25725&quot;&gt;NewWebPick&lt;/a&gt;的logo.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.newwebpick.com/_webpick/webpick.php?categories=all&amp;id=25725&quot;&gt;&lt;img border=&quot;0&quot; width=&quot;214&quot; src=&quot;http://www.newwebpick.com/images/nwplogo.gif&quot; height=&quot;49&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;感觉人家做设计的比较会截图, screen shot比我截的有感觉.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.80s.net.cn&quot;&gt;&lt;img border=&quot;0&quot; width=&quot;160&quot; src=&quot;http://www.newwebpick.com/sitephoto/id25725.jpg&quot; height=&quot;120&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;另外两则消息:&lt;/p&gt;
&lt;p&gt;1. &lt;a href=&quot;http://www.80s.net.cn/&quot;&gt;The Legend Returns|80s studio 2009 &lt;/a&gt;会有一些修改, 比如会支持3D动画的播放控制.&lt;/p&gt;
&lt;p&gt;2. 下月会在&lt;a target=&quot;_blank&quot; href=&quot;http://www.riameeting.cn/?p=141&quot;&gt;RIAMeeting&lt;/a&gt;上讲一下Flash 3D相关的topic. 大家有什么意见和想法请去&lt;a target=&quot;_blank&quot; href=&quot;http://www.riameeting.cn/?p=141&quot;&gt;RIAMeeting&lt;/a&gt;投票或者在下面留言&lt;/p&gt;
&lt;h3&gt;相关日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2008年10月15日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=505&quot; title=&quot;Flash CS4彩蛋&quot;&gt;Flash CS4彩蛋 (5)&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年09月28日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=502&quot; title=&quot;Open Source Flash Media Server&quot;&gt;Open Source Flash Media Server (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年09月25日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=500&quot; title=&quot;Adobe CS4 Launch Broadcast&quot;&gt;Adobe CS4 Launch Broadcast (2)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2008年09月10日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=497&quot; title=&quot;Silverlight3.0将会支持高清的Flash Video&quot;&gt;Silverlight3.0将会支持高清的Flash Video (7)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/720fcc337f291727be05a1e9c4cd1c9b&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/720fcc337f291727be05a1e9c4cd1c9b/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Mon, 23 Feb 2009 10:24:13 +0000</pubDate>
</item>
<item>
	<title>Limodou: 开始写《Learning Uliweb》</title>
	<guid>http://hi.baidu.com/limodou/blog/item/acbe94ca93575081c817682c.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/acbe94ca93575081c817682c.html</link>
	<description>地址在&lt;a href=&quot;http://www.17xie.com/book-32498995.html&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&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/acbe94ca93575081c817682c.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Mon, 23 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: pygettext不支持ngettext</title>
	<guid>http://hi.baidu.com/limodou/blog/item/f5788c100794cc06203f2e42.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/f5788c100794cc06203f2e42.html</link>
	<description>Uliweb中使用修改过的pygettext版本，但是现在发现它不支持ngettext(msg1, msg2, n)这种形式。在网上也查到了这个问题，现在许多是使用xgettext工具。之所以使用pygettext是因为它是源码的，可以方便处理模板中的翻译字符串，且不需要安装其它的软件。现在先这样用吧。 
		
		&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/f5788c100794cc06203f2e42.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 22 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 增加Timezone功能</title>
	<guid>http://hi.baidu.com/limodou/blog/item/0e35a5c22364261c0ff47747.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/0e35a5c22364261c0ff47747.html</link>
	<description>把timezone功能加进去了，结合前面我对pytz的研究，我写了一个date.py的模块，可以进行有关时区的转换。比如通过：date.set_timezone(tzname)可以设置一个缺省的时间，它可以对其它的有间函数起作用。&lt;br /&gt;
&lt;br /&gt;
几个有用的函数：&lt;br /&gt;
&lt;br /&gt;
now(tzinfo=None)可以得到当前时间&lt;br /&gt;
today(tzinfo=None)可以得到当前的日期&lt;br /&gt;
to_timezone(dt, tzinfo=None)可以将一个datetime对象转为指定的时区&lt;br /&gt;
to_date(dt, tzinfo=None)将一个datetime对象转为date对象&lt;br /&gt;
to_time(dt, tzinfo=None)将一个datetime对象转为time对象&lt;br /&gt;
to_datetime(dt, tzinfo=None, format=None)将一个date, time, datetime, string对象转为datetime对象&lt;br /&gt;
&lt;br /&gt;
以上方法当tzinfo为None时使用的是缺省的__timezone__值。而这个值是可以通过set_timezone(tzname)来设置的。&lt;br /&gt;
&lt;br /&gt;
那么这个功能是在SimpleFrame.Dispatch初始化时，根据settings.ini中的TIME_ZONE的值，调用date.set_timezone(settings.GLOBAL.TIMEZONE)来设置的。缺省是UTC时间。&lt;br /&gt;
&lt;br /&gt;
因此当你想使用这种功能时，一定要使用date提供的方法来生成时间对象。&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/0e35a5c22364261c0ff47747.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 22 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 关于pytz的一些记录(续)</title>
	<guid>http://hi.baidu.com/limodou/blog/item/987ea8ec3dfa902063d09ff7.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/987ea8ec3dfa902063d09ff7.html</link>
	<description>在昨天与了关于pytz的东西后，还是发现一些问题。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import pytz, datetime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tz = pytz.timezone('Asia/Shanghai')&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tz&lt;br /&gt;
&amp;lt;DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可以看到，它有一个&lt;strong&gt;LMT&lt;/strong&gt;，这是Local Mean Time的缩写，网上查一查意思是本地平均时。而且时间是+8:06，说明与UTC的时差不是8个小时整。先不管它，让我们转换一下试试。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d = datetime.datetime(2009,2,21,23,18,5,tzinfo=tz)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d&lt;br /&gt;
datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
好，时区与tz是一样的，没什么。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x = d.astimezone(pytz.utc)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x&lt;br /&gt;
datetime.datetime(2009, 2, 21, 15, 12, 5, tzinfo=&amp;lt;UTC&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
我们转为了UTC时区，时间上有差异，没问题。&lt;br /&gt;
&lt;br /&gt;
让我们再转回来。&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; x.astimezone(tz)&lt;br /&gt;
datetime.datetime(2009, 2, 21, 23, 12, 5, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
奇怪，看到了吧，变成了&lt;strong&gt;CST&lt;/strong&gt;了。时差也成了+8:00了。CST就是Central Standard Time的意思。但这样就造成了转换的不一致。我们应该使用CST标准才对。&lt;br /&gt;
&lt;br /&gt;
让我们再看一下：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.datetime.now(tz)&lt;br /&gt;
datetime.datetime(2009, 2, 22, 11, 11, 2, 125000, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD&amp;gt;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.time(23, 18, 5, tzinfo=tz)&lt;br /&gt;
datetime.time(23, 18, 5, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
可以看到now()函数得到的是CST的，而time传入tzinfo是LMT的。（date不支持tzinfo参数）所以我们要进行修订，怎么做，使用timezone对象的localize()方法，如：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; d = datetime.datetime(2009,2,21,23,18,5)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tz.localize(d)&lt;br /&gt;
datetime.datetime(2009, 2, 21, 23, 18, 5, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
所以我才明白pytz的文档上说的：&lt;br /&gt;
&lt;br /&gt;
Creating localtimes is also tricky, and the reason why working with local times is not recommended. Unfortunately, you cannot just pass a &amp;lsquo;tzinfo&amp;rsquo; argument when constructing a datetime.&lt;br /&gt;
&lt;br /&gt;
所以我的建议是生成带时区的时间时，一定要使用timezone.localize()来生成。不要在时间对象的构造函数中传入tzinfo的方式来实现，为些我封装了一些函数放在了uliweb/utils/date.py中。&lt;br /&gt;
&lt;br /&gt;
另外关于北京时间。在pytz中，我无法找到Asia/Beijing和GMT+8这样的时区设置，但是有些时间转换的工具却有。按理说pytz使用的是标准的时区数据库，我特意下载了查看，的确是没有。&lt;br /&gt;
&lt;br /&gt;
时区处理的确是挺麻烦的事。象有些数据库也支持这样的功能，如postgres支持set timezone的命令，这是在django中看到的。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&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/987ea8ec3dfa902063d09ff7.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 22 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 关于pytz的一些记录</title>
	<guid>http://hi.baidu.com/limodou/blog/item/1e8ad507440417ca7a8947c3.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/1e8ad507440417ca7a8947c3.html</link>
	<description>如果你的程序要考虑时区，可以使用pytz。datetime模块中有tzinfo相关的东西，但是它是一个抽象类，文档上说：&lt;br /&gt;
&lt;br /&gt;
&lt;tt class=&quot;class&quot;&gt;tzinfo&lt;/tt&gt; is an abstract base clase, meaning that this class  should not be instantiated directly. You need to derive a concrete subclass, and  (at least) supply implementations of the standard &lt;tt class=&quot;class&quot;&gt;tzinfo&lt;/tt&gt;  methods needed by the &lt;tt class=&quot;class&quot;&gt;datetime&lt;/tt&gt; methods you use. The &lt;tt class=&quot;module&quot;&gt;datetime&lt;/tt&gt; module does not supply any concrete subclasses of &lt;tt class=&quot;class&quot;&gt;tzinfo&lt;/tt&gt;. &lt;br /&gt;
&lt;br /&gt;
上面是说tzinfo是一个抽象类，不应该被直接实例化。你需要派生子类，提供相应的标准方法。datetime模块并不提供tzinfo的任何子类。&lt;br /&gt;
&lt;br /&gt;
所以你可能会使用pytz这个模块。通过easy_install可以安装。目前它的最新文档在&lt;a href=&quot;http://pytz.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
关于时区使用的几点想法：&lt;br /&gt;
&lt;br /&gt;
1. 如果你的网站可能有来自其它时区的，可能你要考虑这个问题。都是一个地区的话，还要看服务器是否与用户在一个地区，如果不在，也要考虑。&lt;br /&gt;
2. 因此，基本上要考虑服务器时区与用户时区。服务器时区可以配置在系统中，全局生效。而用户时区则与用户相关，可以由用户自已进行设置。&lt;br /&gt;
3. 在生成相关时间对象时要加入时区的信息，并在输出时进行合适的转换。&lt;br /&gt;
&lt;br /&gt;
而pytz提供了创建某个时区对象的方法，如，中国时区：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import pytz&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; pytz.country_timezones('cn')&lt;br /&gt;
['Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing', 'Asia/Urumqi', 'Asia/Kashgar']&lt;br /&gt;
&lt;br /&gt;
可以看到，中国的时区可能有：'Asia/Shanghai', 'Asia/Harbin', 'Asia/Chongqing'，最后两个不知道是什么。我们可能使用的'Asia/Shanghai'比较多。&lt;br /&gt;
&lt;br /&gt;
因此可以创建一个时区对象：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; tz = pytz.timezone('Asia/Shanghai')&lt;br /&gt;
&lt;br /&gt;
然后在创建时间对象时进行指定：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; import datetime&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.datetime.now(tz)&lt;br /&gt;
datetime.datetime(2009, 2, 21, 15, 12, 33, 906000, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD&amp;gt;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=tz)&lt;br /&gt;
datetime.datetime(2009, 2, 21, 15, 12, 33, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD&amp;gt;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.date(2009, 2, 21, tzinfo=tz)&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
TypeError: 'tzinfo' is an invalid keyword argument for this function&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; datetime.time(15, 12, 33, tzinfo=tz)&lt;br /&gt;
datetime.time(15, 12, 33, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
从上面可以看出now(), datetime(), time()都是可以指定tzinfo信息的，而date是不行的，不知道为什么。所以最好的方法是内部使用datetime对象，需要时进行时区转换，然后再输出。&lt;br /&gt;
&lt;br /&gt;
时区转换：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; utc = pytz.utc&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; n = datetime.datetime.now(tz)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; n&lt;br /&gt;
datetime.datetime(2009, 2, 21, 15, 16, 41, 843000, tzinfo=&amp;lt;DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD&amp;gt;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; new = n.astimezone(utc)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; new&lt;br /&gt;
datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=&amp;lt;UTC&amp;gt;)&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; utc.normalize(n.astimezone(utc))&lt;br /&gt;
datetime.datetime(2009, 2, 21, 7, 16, 41, 843000, tzinfo=&amp;lt;UTC&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://zh.wikipedia.org/wiki/UTC&quot; target=&quot;_blank&quot;&gt;utc&lt;/a&gt;是世界标准时间。&lt;br /&gt;
&lt;br /&gt;
上面的代码通过astimezone(utc)将中国时间转为utc标准时间，可以看到不同的时区时间已经不一样了。不过在pytz的文档上说：&lt;br /&gt;
&lt;br /&gt;
Converting between timezones also needs special attention. This also needs to use the normalize method to ensure the conversion is correct.&lt;br /&gt;
&lt;br /&gt;
要注意什么呢？是 daylight savings time，中文叫&lt;a href=&quot;http://zh.wikipedia.org/w/index.php?title=%E6%97%A5%E5%85%89%E7%AF%80%E7%B4%84%E6%99%82%E9%96%93&amp;variant=zh-cn&quot; target=&quot;_blank&quot;&gt;日光节约时间&lt;/a&gt;或夏令时。对于有采用了夏时制的要使用normzlize来处理，不采用的，直接使用astimezone来处理。所以在通常情况下使用astimezone()就足够了。&lt;br /&gt;
&lt;br /&gt;
另外pytz还提供了全部的timezone信息，如：&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from pytz import all_timezones&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; len(all_timezones)&lt;br /&gt;
559&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; from pytz import common_timezones&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; len(common_timezones)&lt;br /&gt;
393&lt;br /&gt;
&lt;br /&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/1e8ad507440417ca7a8947c3.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sat, 21 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 有趣的devthought上的天气效果</title>
	<guid>http://hi.baidu.com/limodou/blog/item/cab76c228709d1a34623e889.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/cab76c228709d1a34623e889.html</link>
	<description>&lt;a target=&quot;_blank&quot; href=&quot;http://devthought.com/&quot;&gt;devthought.com&lt;/a&gt;  真有趣，有一个天气显示的效果，不过不是与真正的天气对应。它的云彩是可以动的，并且当你把鼠标放到云彩上时，会有下雨的效果。点击右上角天气的链接会有一个说明。在说明中说到：当在这个页面上没有鼠标活动时，云彩是不会动的。它是使用mootools来实现的。非常有趣，大家可以看一看。 
		
		&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/cab76c228709d1a34623e889.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sat, 21 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: User manager test added in uliweb-tests</title>
	<guid>http://hi.baidu.com/limodou/blog/item/09ab18d8f976593233fa1c95.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/09ab18d8f976593233fa1c95.html</link>
	<description>In this test, you can see the: register, login, logout, settings(change password and change email, and portrait). Yes, this test support user portrait, and it'll automatically resize the uploaded image to (50, 50) size. There is a screenshot you can see:&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://hiphotos.baidu.com/limodou/pic/item/dbc7d1162eb19c38962b4332.jpg&quot; target=&quot;_blank&quot;&gt;
&lt;div align=&quot;center&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://hiphotos.baidu.com/limodou/pic/item/dbc7d1162eb19c38962b4332.jpeg&quot; class=&quot;blogimg&quot; /&gt;&lt;/div&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;div align=&quot;left&quot;&gt;If you want to use it, you should also install PIL package, using easy_install PIL is ok.&lt;/div&gt;
&lt;/div&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/09ab18d8f976593233fa1c95.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Tue, 17 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>80's Blog: The Legend Returns[80s Studio 2009回归]</title>
	<guid>http://blog.80s.net.cn/?p=515</guid>
	<link>http://item.feedsky.com/~feedsky/80steamblog/~6875423/201892669/4919905/1/item.html</link>
	<description>&lt;p&gt;经历了2008年的沉寂后, 我们决定回来了. 80s studio(&lt;a href=&quot;http://www.80s.net.cn/&quot;&gt;www.80s.net.cn&lt;/a&gt;)已经很久没有更新了,甚至出现了只有80s team blog 而不见主站的局面. 以至于圈里的很多新来的朋友都问我80s是不是就一个blog, 没有其他的东西了. 这次80s studio的回归就是我给大家最好的答案.&lt;/p&gt;
&lt;p&gt;这次我们采用了Bruce Lee的创意, 虽然比较简单, 但是从中大家足以见到我们的用心, 希望我们的作品能给大家带来一些新鲜感 &amp;#8211; 原来Flash还可以做这个, 原来Flash还可以这样做.&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.80s.net.cn&quot;&gt;&lt;img src=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/02/screen_shot_002.jpg&quot; alt=&quot;screen_shot_002.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.80s.net.cn&quot;&gt;&lt;img src=&quot;http://blog.80s.net.cn/wp-content/uploads/2009/02/screen_shot_001.jpg&quot; alt=&quot;screen_shot_001.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以下是将我们的创意分阶段实施的步骤:&lt;/p&gt;
&lt;p&gt;第一阶段/Phase 1:&lt;br /&gt;
用户可以看到一个真正的3D李小龙并且可以任意的切换视角, 选择李小龙的动作.&lt;br /&gt;
For user can realize the Flash is ready to create a real 3D web&lt;br /&gt;
application without any activeX or Plugin.&lt;br /&gt;
第二阶段/Phase 2:&lt;br /&gt;
用户可以用我们动作库中的很多李小龙的标志性动作自己创建李小龙动画并且可以把完成好的动画发给朋友&lt;br /&gt;
User can access the website to customize their own Bruce Lee real time&lt;br /&gt;
3D animation with lots of landmark actions from our action library.&lt;br /&gt;
And send the completion animation to friends.&lt;br /&gt;
第三阶段/Phase 3:&lt;br /&gt;
用户可以上传自己的照片替换掉李小龙的脸,制作真正意义上的&amp;#8221;自己的李小龙&amp;#8221;.&lt;br /&gt;
User can make an own Bruce Lee by uploading their own profile photos.&lt;/p&gt;
&lt;p&gt;您现在正在观看的是我们计划的第一阶段.&lt;br /&gt;
Now all you can see on the web page is Phase One.&lt;/p&gt;
&lt;p&gt;因为时间和精力有限, 整个site在创意和实施过程中的时间都比较紧促, 有什么不足还请大家发意见给我们. 下面就请大家来欣赏[&lt;a target=&quot;_blank&quot; href=&quot;http://www.80s.net.cn&quot;&gt;The Legend Returns|80s studio 2009&lt;/a&gt;]&lt;/p&gt;
&lt;h3&gt;随机日志&lt;/h3&gt;&lt;ul class=&quot;related_post&quot;&gt;&lt;li&gt;2005年04月18日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=226&quot; title=&quot;Macromedia被Adobe收购&quot;&gt;Macromedia被Adobe收购 (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2004年11月16日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=153&quot; title=&quot;cnnishi上线&quot;&gt;cnnishi上线 (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2007年09月05日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=412&quot; title=&quot;Silverlight1.0正式版发布&quot;&gt;Silverlight1.0正式版发布 (1)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2009年04月09日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=531&quot; title=&quot;ND3D 一个超轻量级的AS3 3D Engine&quot;&gt;ND3D 一个超轻量级的AS3 3D Engine (0)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;2004年12月05日 -- &lt;a href=&quot;http://blog.80s.net.cn/?p=173&quot; title=&quot;HttpSessionListener统计在线人数 -zt&quot;&gt;HttpSessionListener统计在线人数 -zt (3)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;!-- Feedsky ad --&gt;&lt;a href=&quot;http://feed.feedsky.com/~cpm/c/80steamblog/e6cff9dbe75940993296684fbecc6439&quot;&gt;&lt;img src=&quot;http://feed.feedsky.com/~cpm/80steamblog/e6cff9dbe75940993296684fbecc6439/s.gif&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;!-- /Feedsky ad --&gt;</description>
	<pubDate>Sun, 15 Feb 2009 11:43:04 +0000</pubDate>
</item>
<item>
	<title>Limodou: Mootools正在征求志愿翻译者</title>
	<guid>http://hi.baidu.com/limodou/blog/item/30b3c9fca64926fafd037f54.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/30b3c9fca64926fafd037f54.html</link>
	<description>Mootools是一个象jQuery一样的Ajax框架，我已经开始学，不过忙于Uliweb所以学得不深，还不会用它做些什么。它的一些想法是更接近于Prototype.js的，即修改原生的类。而jQuery则不对原生的javascript类做变化。所以对于喜欢面向方式的人可能更容易接受Prototype.js或Mootools。&lt;br /&gt;
&lt;br /&gt;
现在1.3版就要发布了，有一些是在more的包中的东西。核心作者&lt;span class=&quot;HcCDpe&quot;&gt;&lt;span class=&quot;EP8xU&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;Aaron Newton在邮件列表中写了一封邮件征求志愿翻译者，因为有一些本地化的东西可能需要翻译，原文如下：&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;Hi all,&lt;br /&gt;
&lt;br /&gt;
We've been hard at work on the next version of MooTools &amp;quot;More&amp;quot; - the&lt;br /&gt;
official plugins for MooTools. The new version includes at least two&lt;br /&gt;
plugins that create messages (a form validator that displays errors&lt;br /&gt;
and a date plugin that has the days of the week, the months, etc). The&lt;br /&gt;
new plugins also include a localization system so that these can be&lt;br /&gt;
translated into various languages.&lt;br /&gt;
&lt;br /&gt;
What we need are people who speak languages other than English to help&lt;br /&gt;
us translate these words and phrases as they come up. As of today we&lt;br /&gt;
have numerous translations for portions of these plugins but some are&lt;br /&gt;
incomplete and new additions will require help as well.&lt;br /&gt;
&lt;br /&gt;
If you'd like to help us with this task, please join the Google Group&lt;br /&gt;
we've created for this purpose:&lt;br /&gt;
&lt;br /&gt;
&lt;a target=&quot;_blank&quot; href=&quot;http://groups.google.com/group/mootools-lang&quot;&gt;http://groups.google.com/group/mootools-lang&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
We'll post requests and instructions there as they arise.&lt;br /&gt;
&lt;br /&gt;
所以你有兴趣欢迎加入为Mootools作些贡献。现在我看到有人已经报名准备为：法语，俄语，葡萄牙语，丹麦语，波兰语进行翻译了。 
		
		&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/30b3c9fca64926fafd037f54.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 15 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 关于Grady写的《uliweb guestbook 排错》的回复</title>
	<guid>http://hi.baidu.com/limodou/blog/item/39dfcb806646e9d09023d943.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/39dfcb806646e9d09023d943.html</link>
	<description>&lt;a href=&quot;http://blog.csdn.net/oncoding/archive/2009/02/15/3893576.aspx&quot; target=&quot;_blank&quot;&gt;原文&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
看到文章后拿guestbook的demo试了试，真是有问题，是因为ORM模块调整造成的。但是因为auto_now和auto_now_add的生成是使用当前时间，因此我的ORM的测试中是不包含这块东西的，结果就出了错。这块本来是要放到Model中的_get_data()方法中的，结果只处理了auto_now，但是auto_now_add没有处理。现在在svn中已经修复了，感谢Grady。&lt;br /&gt;
&lt;br /&gt;
这两者的区别是：auto_now是只要保存就会修改这个值，而auto_now_add是只有当第一次插入时会生成日期值，以后则不会变化。这一点应该是与django一致的。 
		
		&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/39dfcb806646e9d09023d943.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 15 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 发现一个新的关于Ulipad的视频</title>
	<guid>http://hi.baidu.com/limodou/blog/item/83da0308c599efd663d98673.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/83da0308c599efd663d98673.html</link>
	<description>是在Showmedo上，见&lt;a href=&quot;http://showmedo.com/videos/video?name=4520000&amp;fromSeriesID=452&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;。&lt;br /&gt;
&lt;br /&gt;
不过很简单，是讲如何在Ulipad中切换2.5和3.0解释器的。有兴趣可以看一看，是一位外国朋友做的，我不认识。 
		
		&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/83da0308c599efd663d98673.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Sun, 15 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: Jython 2.5b1中from java.xxx import *的bug</title>
	<guid>http://hi.baidu.com/limodou/blog/item/e2c2f724812dd2348744f993.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/e2c2f724812dd2348744f993.html</link>
	<description>今天在试验jython时，我使用的是2.5b1版本，结果发现在使用：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  from java.lang import *&lt;br /&gt;
&lt;br /&gt;
时，得到的东西都是NoneType。结果我只好换成2.2版本就没有这个问题。&lt;br /&gt;
&lt;br /&gt;
到了晚上终于搜到了：有人报告到jython的问题中，编号是 &lt;a href=&quot;http://bugs.jython.org/issue1230&quot; target=&quot;_blank&quot;&gt;#1230&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
这个问题已经被修复，见&lt;a href=&quot;http://fisheye3.atlassian.com/changelog/jython/?cs=5957&quot; target=&quot;_blank&quot;&gt;这里&lt;/a&gt;。于1月21日改的。改动就是两行，但是太影响使用了。&lt;br /&gt;
&lt;br /&gt;
如果你不想换回老版本(因为新版本有许多特性)，那么可以：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  from java.lang import Class&lt;br /&gt;
&lt;br /&gt;
之类的，这样就没有问题，不过就是有些麻烦。希望早些得到新版本。&lt;br /&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/e2c2f724812dd2348744f993.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Thu, 12 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: 阅读《Django到底有什么好?》</title>
	<guid>http://hi.baidu.com/limodou/blog/item/9691e8247a5073064d088d17.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/9691e8247a5073064d088d17.html</link>
	<description>原文： &lt;a target=&quot;_blank&quot; href=&quot;http://ch-linghu.3322.org/blog/entry/249&quot;&gt;Django到底有什么好?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
看到这篇之后的确想起令狐虫是对当时我的推荐有不同的意见。其实从个人角度来说，一个框架会面临许许多多的使用者，他们的层次不同，要求不同，水平不同。而django的特点就是统一，集成，功能完备，admin是极为出色的一个亮点。这许多的功能让它与其它的python web框架一比就耀眼得多。但是我也不想说什么django太多的优点，更何况我是认为django有许多缺点了，但相比其它的框架，就不能要求太高了。&lt;br /&gt;
&lt;br /&gt;
不过从文章中我们可以看出，令狐同学的功力比较深，所以他喜欢先定置，然后在此基础之上再进行开发。但他也说到，这种定制需要花精力，对项目也有一些影响。这一点与我在前面所写的&lt;a target=&quot;_blank&quot; href=&quot;http://hi.baidu.com/limodou/blog/item/8a9a5ab5a9a462c936d3ca93.html&quot;&gt;《merb的不可知--与uliweb框架的走向》&lt;/a&gt;的观点比较接近。太灵活等于没做完，就象werkzeug一样：我不是一个框架，但是我搜集了许多web开发相关的工具，可以让你自已组建。但是并不是人人都能做，都想做，或做得好的。因为框架的成熟，稳定，成长是需要时间的。两三天做出来的可能只够自已用。因些在灵活的基础之上，再应该有一些定制的东西，可以让用户快速上手。再用户越来越熟悉之后，再进行定制，这样比较好。&lt;br /&gt;
&lt;br /&gt;
现在许多开发都讲究快节奏，都希望立杆见影。比如我有时看到一个东西，总想看一看有没有demo, screenshots之类的，先有个初步感觉后再进行深入。框架也不例外，因为选择太多，如果你不方便让人家上手，人家可没时间陪你玩啊，谁的时间不宝贵啊。（虽然有些急功近利的意思，但是也说明发展的趋势）&lt;br /&gt;
&lt;br /&gt;
所以目前我对uliweb的想法就是，灵活能做多少做多少，同时要尽可能的将做过的经验以app的形式保存起来，以方便重用。只有这样，再开发才能真正提高效率，让更多的注意力在新的东西上。 
		
		&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/9691e8247a5073064d088d17.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 11 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: uliweb-tests可以访问了</title>
	<guid>http://hi.baidu.com/limodou/blog/item/5058d62a96edff2ad52af13a.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/5058d62a96edff2ad52af13a.html</link>
	<description>昨天我创建了uliweb-tests项目，地址在： &lt;a target=&quot;_blank&quot; href=&quot;http://code.google.com/p/uliweb-tests&quot;&gt;http://code.google.com/p/uliweb-tests&lt;/a&gt;, 它将用来存放我写的一些简单的测试程序，大家可以下载并运行看到一些执行结果和代码示例。&lt;br /&gt;
&lt;br /&gt;
欢迎大家加入这个项目，如果感兴趣你可以向其中贡献代码，不需要是完整的，代码片段也是可以的，但希望是可以运行的。&lt;br /&gt;
&lt;br /&gt;
如果你想加入，只要告诉我你的gmail邮箱，我会把你加入项目中， 这样你就可以提交代码了。 
		
		&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/5058d62a96edff2ad52af13a.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 11 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: django m2m自包含</title>
	<guid>http://blog.khsing.net/2009/02/django-m2m.html</guid>
	<link>http://blog.khsing.net/2009/02/django-m2m.html</link>
	<description>设计一个group，可以包含user也可以包含group。user和group都可以被多个group包含。
&lt;pre&gt;
class Group(models.Model):
    users = models.ManyToManyField(User)
    groups = models.ManyToManyField('self')
&lt;/pre&gt;
update: &lt;code&gt;ManyToMany&lt;/code&gt;对象有一个&lt;code&gt;symmetrical&lt;/code&gt;的参数，当为&lt;code&gt;True&lt;/code&gt;时的意思是对象间有互相拥有的关系，是双向的，反之为&lt;code&gt;False&lt;/code&gt;时就是单向的。</description>
	<pubDate>Tue, 10 Feb 2009 07:12:34 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 大裤叉配楼火灾</title>
	<guid>http://blog.khsing.net/2009/02/post-1.html</guid>
	<link>http://blog.khsing.net/2009/02/post-1.html</link>
	<description>引自《阿房宫赋》：
&lt;blockquote&gt;
楚人一炬，可怜焦土！
&lt;/blockquote&gt;</description>
	<pubDate>Tue, 10 Feb 2009 06:49:38 +0000</pubDate>
</item>
<item>
	<title>Limodou: 如何用logging输出一条有用的日志</title>
	<guid>http://hi.baidu.com/limodou/blog/item/dbc7d1168f02731f972b43ab.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/dbc7d1168f02731f972b43ab.html</link>
	<description>平时logging模块我用得不多，不过在GAE上有时进行测试，我发现它可以输出执行的程序名。其实这一点并不困难，下面就是告诉你如何做。这里我今天在uliweb中修改的一段代码。&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   import logging&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   log = None&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   FORMAT = &amp;quot;%(levelname)-8s %(asctime)-15s %(filename)s,%(lineno)d] %(message)s&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   def get_logger(format=FORMAT, datafmt=None):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   global log&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   handler = logging.StreamHandler()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   fmt = logging.Formatter(format, datafmt)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   handler.setFormatter(fmt)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log = logging.getLogger('uliweb')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log.addHandler(handler)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log.setLevel(logging.INFO)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return log&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   if __name__ == '__main__':&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log = get_logger()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log.error('This is an error %s', 'aaaa')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log.warning('This is an warning')&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   try:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   1/0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   except Exception, e:&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   log.exception(e)&lt;br /&gt;
&lt;br /&gt;
每个Handler可以设置自已的日志格式，上面我预定义了一个FORMAT，其中%(asctime)-15s用来输出日，精确到毫秒，%(filename)s 输出文件主名，%(lineno)d为执行的行号，%(message)是用来输出用户的日志。这些参数都是logging自带的，在logging.py中的Formatter类中的详细的描述：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(name)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Name of the logger (logging channel)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(levelno)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Numeric logging level for the message (DEBUG, INFO,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   WARNING, ERROR, CRITICAL)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(levelname)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Text logging level for the message (&amp;quot;DEBUG&amp;quot;, &amp;quot;INFO&amp;quot;,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;quot;WARNING&amp;quot;, &amp;quot;ERROR&amp;quot;, &amp;quot;CRITICAL&amp;quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(pathname)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Full pathname of the source file where the logging&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   call was issued (if available)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(filename)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Filename portion of pathname&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(module)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Module (name portion of filename)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(lineno)d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Source line number where the logging call was issued&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (if available)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(funcName)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Function name&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(created)f&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Time when the LogRecord was created (time.time()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return value)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(asctime)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Textual time when the LogRecord was created&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(msecs)d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Millisecond portion of the creation time&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(relativeCreated)d Time in milliseconds when the LogRecord was created,&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   relative to the time the logging module was loaded&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   (typically at application startup time)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(thread)d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Thread ID (if available)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(threadName)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Thread name (if available)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(process)d&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   Process ID (if available)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   %(message)s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   The result of record.getMessage(), computed just as&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   the record is emitted&lt;br /&gt;
&lt;br /&gt;
比文档好象详细多了。&lt;br /&gt;
&lt;br /&gt;
上面的测试代码输出结果为：&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;   2009-02-10 10:03:10,733 log.py,19] This is an error aaaa&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   WARNING  2009-02-10 10:03:10,733 log.py,20] This is an warning&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   ERROR&amp;nbsp;&amp;nbsp;&amp;nbsp;   2009-02-10 10:03:10,733 log.py,24] integer division or modulo by zero&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   Traceback (most recent call last):&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   File &amp;quot;D:\project\svn\uliweb\uliweb\utils\log.py&amp;quot;, line 22, in &amp;lt;module&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;   1/0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;   ZeroDivisionError: integer division or modulo by zero&lt;br /&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/dbc7d1168f02731f972b43ab.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Tue, 10 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 对待平等</title>
	<guid>http://blog.khsing.net/2009/02/post.html</guid>
	<link>http://blog.khsing.net/2009/02/post.html</link>
	<description>&lt;p&gt;云风的一篇&lt;a href=&quot;http://blog.codingnow.com/2009/02/equality.html&quot;&gt;平等&lt;/a&gt;讲述了他们团队对平等的一些理解。&lt;a href=&quot;http://herock.net/2009/02/post_16.html&quot;&gt;herock&lt;/a&gt;又对平等产生了许些质疑。我从电影&lt;a href=&quot;http://www.douban.com/subject/1308837/&quot;&gt;King Arthur&lt;/a&gt;里觉的人与人之间的平等是重要的，也是人与人之间互相尊敬的一个基础。其实真正的平等并不存在，herock重在说明这一情况（唯物）。而云风则更注重人对人的平等，且不论平等是否存在（唯心）。&lt;/p&gt;
&lt;p&gt;摘电影里的一句话&lt;/p&gt;
&lt;blockquote&gt;
Every man must be equal.
&lt;/blockquote&gt;
&lt;p&gt;我当时取名Gawain(圆桌骑士之一)即是受这部电影的影响。&lt;/p&gt;</description>
	<pubDate>Fri, 06 Feb 2009 02:07:57 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 一个safari地址栏的小技巧</title>
	<guid>http://blog.khsing.net/2009/02/safari.html</guid>
	<link>http://blog.khsing.net/2009/02/safari.html</link>
	<description>&lt;p&gt;按Command(⌘)和L是移动焦点到地址栏，然后再按Command(⌘)和分号(; semicolon)就是修改当前地址的各个部分了，多按几次修改的部分就不同&lt;/p&gt;</description>
	<pubDate>Fri, 06 Feb 2009 01:12:05 +0000</pubDate>
</item>
<item>
	<title>Limodou: A great article about &amp;#34;with&amp;#34; syntax</title>
	<guid>http://hi.baidu.com/limodou/blog/item/0ba35baf02e980fcfaed50eb.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/0ba35baf02e980fcfaed50eb.html</link>
	<description>The original article title is &amp;quot;&lt;a target=&quot;_blank&quot; href=&quot;http://jessenoller.com/2009/02/03/get-with-the-program-as-contextmanager-completely-different/&quot;&gt;Get with the program as contextmanager&lt;/a&gt;&amp;quot; wirtten by jesse. This article talks about the &amp;quot;with&amp;ldquo; usage, it illustrates with many examples. If you have interesting in this, you should read it carefully. 
		
		&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/0ba35baf02e980fcfaed50eb.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 04 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: New &amp;#34;Django Step by Step 1.0.2&amp;#34; tutorial</title>
	<guid>http://hi.baidu.com/limodou/blog/item/59b708243ee25d2cd50742c7.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/59b708243ee25d2cd50742c7.html</link>
	<description>I saw 浊风 has begun to revise my old &amp;quot;Django Step to Step&amp;quot; tutorial, my old tutorial is written at 2006.8, and at that time, the Django version is still 0.96. Later, I revised it to 0.97, but I've not maintained it any more. Because I'm working my own Python web framework -- Uliweb -- now. And some places in the tutorial can not be run in lastest 1.0.2 version, so 浊风's work is great! He doesn't just fix the problem in the tutorial, but rewrite it at all, and the main part are similar with the old one.&lt;br /&gt;
&lt;br /&gt;
So I'm thinking maybe I should write a tutorial about Uliweb just like &amp;quot;Django Step to Step&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[Link]&lt;a target=&quot;_blank&quot; href=&quot;http://www.7blog.org/archives/django-step-by-step-102/&quot;&gt;Django Step by Step 1.0.2&lt;/a&gt; The new tutorial is not finished yet. 
		
		&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/59b708243ee25d2cd50742c7.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 04 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: How to display table creation SQL statement in SQLAlchemy</title>
	<guid>http://hi.baidu.com/limodou/blog/item/1be4d78851644d93a5c27260.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/1be4d78851644d93a5c27260.html</link>
	<description>I asked this question in sqlalchemy mail list, and got the answer, you can find in sqlalchemy &lt;a target=&quot;_blank&quot; href=&quot;http://www.sqlalchemy.org/trac/wiki/FAQ#HowcanIgettheCREATETABLEDROPTABLEoutputasastring&quot;&gt;FAQ&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I copied the example in here:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  from sqlalchemy import *&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    from StringIO import StringIO&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    buf = StringIO()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    engine = create_engine('postgres://', strategy='mock', executor=lambda s, p='': buf.write(s + p))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    meta = MetaData()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    t1 = Table('sometable', meta, Column('foo', String(30)))&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    meta.create_all(engine)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;    print buf.getvalue()&lt;br /&gt;
&lt;br /&gt;
The most important thing in above example is the create_engine invoking.&lt;br /&gt;
&lt;br /&gt;
The example uses 'postgress://', and I've tested it with 'sqlite://', and it's different in some column definition. And the strategy='mock' will prevent the tables creation exactly.&lt;br /&gt;
&lt;br /&gt;
So with this help I also added an 'sql' command in Uliweb, so that you can see the creation SQL. 
		
		&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/1be4d78851644d93a5c27260.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Wed, 04 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: django login</title>
	<guid>http://blog.khsing.net/2009/02/django-login.html</guid>
	<link>http://blog.khsing.net/2009/02/django-login.html</link>
	<description>&lt;p&gt;最近写一个django项目的时候犯懒，把admin的login form给简单的扒出来用了用，感觉还不错。&lt;/p&gt;
&lt;p&gt;先把&lt;code&gt;display_login_form&lt;/code&gt;给扒出来&lt;/p&gt;
&lt;pre&gt;
def display_login_form(request, error_message='', extra_context=None):
    request.session.set_test_cookie()
    context = {
        'title': 'Log in',
        'app_path': request.get_full_path(),
        'error_message': error_message,
        'root_path': '',
    }
    context.update(extra_context or {})
    return render_to_response('admin/login.html', context,
        context_instance=template.RequestContext(request)
    )
&lt;/pre&gt;
&lt;p&gt;然后自己再写一个&lt;code&gt;login&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
def login(request):
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None and user.is_active:
            auth.login(request, user)
            return http.HttpResponseRedirect(request.get_full_path())
        else:
            return display_login_form(request,&quot;Login error!&quot;)
    else:
        return display_login_form(request)
&lt;/pre&gt;
&lt;p&gt;需要认证的地方就这样写&lt;/p&gt;
&lt;pre&gt;
def login_test(request):
    if not request.user.is_authenticated():
        return login(request)
    else:
        return http.HttpResponse(&quot;Welcome %s&quot; % request.user)
&lt;/pre&gt;

update: 上面那个方法还是不够懒，细读了一下文档，可以这样写。
&lt;ul&gt;
&lt;li&gt;settings.py&lt;/li&gt;
&lt;pre&gt;
LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'
&lt;/pre&gt;
&lt;li&gt;urls.py&lt;/li&gt;
&lt;pre&gt;
    (r'^login/','django.contrib.auth.views.login',{'template_name': 'admin/login.html'}),
    (r'^logout/','superman.lib.views.logout'),
&lt;/pre&gt;
&lt;/ul&gt;</description>
	<pubDate>Tue, 03 Feb 2009 06:48:48 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 易用的touchpad</title>
	<guid>http://blog.khsing.net/2009/02/usability-of-touchpad.html</guid>
	<link>http://blog.khsing.net/2009/02/usability-of-touchpad.html</link>
	<description>&lt;p&gt;有个朋友最近入手一台二手&lt;a href=&quot;http://support.apple.com/kb/SP68&quot;&gt;iBook(Late 2004)&lt;/a&gt;。试用了一下，发现Touchpad不支持双个手指滚动的功能，立时感到易用性下降许多。&lt;/p&gt;
&lt;p&gt;我用的是&lt;a href=&quot;http://support.apple.com/kb/SP43&quot;&gt;Mid 2005&lt;/a&gt;版，有双个手指滚动的功能，很方便。以前有一个单键的Apple Pro Mouse，但是很不好用，后来索性把鼠标拨了不用了，直接用Touchpad。键盘使用的频率要比鼠标高的多，要用到鼠标，手掌就会离开托手的位置，之后再回到托手的位置，Touchpad虽然精度不高但是手掌不用离开托手（我是懒人）。如果仅是如此还是不够，要拖动滚动条的时候还是麻烦，Touchpad远不如鼠标的滚轮方便，但是Apple近乎完美的解决了这个问题，就是用两个手指滚动，这远比其他厂商采用的右侧滚动区(HP等)或第三键滚动(IBM)方便的多。&lt;/p&gt;
&lt;p&gt;虽然现在的&lt;a href=&quot;http://www.apple.com/support/macbook/&quot;&gt;MacBook&lt;/a&gt;都有了Multi-Touch，其易用性也已经不可同日而语了，但我觉的最重要的还是两个手指(two finger)滚动(两个手指还可以当右键使two finger+单击)。&lt;/p&gt;</description>
	<pubDate>Tue, 03 Feb 2009 05:00:52 +0000</pubDate>
</item>
<item>
	<title>Limodou: Fwd: Debugging doctests interactively</title>
	<guid>http://hi.baidu.com/limodou/blog/item/74be4034fa7df849241f1444.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/74be4034fa7df849241f1444.html</link>
	<description>The artical is at &lt;a href=&quot;http://farmdev.com/thoughts/69/debugging-doctests-interactively/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
You can use this module to interactive when you are testing with doctest.&lt;br /&gt;
&lt;br /&gt;
There are also some tests in Uliweb, and some of them are implemented by doctest, but some times, it's not easy to inspect the variables, run some other code when you executing the test, and this tool will help me a lot.&lt;br /&gt;
&lt;br /&gt;
It's simple to use, just add below code in your doctest:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;gt;&amp;gt;&amp;gt; ...&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;gt;&amp;gt;&amp;gt; import interlude&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;gt;&amp;gt;&amp;gt; interlude.interact(locals())&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;gt;&amp;gt;&amp;gt; ...&lt;br /&gt;
&lt;br /&gt;
Remember, you should install interlude first, you can use:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  easy_install interlude&lt;br /&gt;
&lt;br /&gt;
to install it. 
		
		&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/74be4034fa7df849241f1444.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Tue, 03 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Limodou: Simple Admin App Launched</title>
	<guid>http://hi.baidu.com/limodou/blog/item/7f856a6008a74243eaf8f859.html</guid>
	<link>http://hi.baidu.com/limodou/blog/item/7f856a6008a74243eaf8f859.html</link>
	<description>Yesterday, I added a new app named Admin to Uliweb. You can use this simple app to explore some internal information of your project. If you want to use it, just run below command:&lt;br /&gt;
&lt;br /&gt;
uliweb runadmin&lt;br /&gt;
&lt;br /&gt;
This command will automatically add admin app to your project, so you can use http://localhost:8000/admin to visit admin app.&lt;br /&gt;
&lt;br /&gt;
Of cause you can add 'uliweb.contrib.admin' to INSTALLED_APPS like normal apps, but above command shows that you can add new apps to SimpleFrame.Dispatcher class(it's the core application class of Uliweb). And in this app, I also used yaml css framework, and I also wrap it to a yaml app, so that you can use it in your project. But for now, yaml app just includes static files, so you should write your own layout template first, and arrange the basic layout in this file, maybe we can do better later, for example, provide some finished layout template. But for now you can see the &lt;a href=&quot;http://www.yaml.de/en/&quot; target=&quot;_blank&quot;&gt;yaml&lt;/a&gt; examples and copy them into your project. &lt;br /&gt;
&lt;br /&gt;
So the admin app will depend on yaml app, and yaml app will depend on uliweb.contrib.staticfiles app. But you don't need to include all these app, just admin app enough, because Uliweb will automatically process these dependencies for you according the config.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/7f856a6008a74243eaf8f859.html#comment&quot;&gt;查看评论&lt;/a&gt;</description>
	<pubDate>Mon, 02 Feb 2009 00:00:00 +0000</pubDate>
</item>
<item>
	<title>Gawain's Jail: 备案警告</title>
	<guid>http://blog.khsing.net/2009/01/beian-notice.html</guid>
	<link>http://blog.khsing.net/2009/01/beian-notice.html</link>
	<description>刚才想down个驱动，上了nVidia，最后&lt;a href=&quot;http://cn.download.nvidia.com/Windows/nForce/15.24/15.24_nforce_winvista32_international_whql.exe&quot;&gt;打开的下载地址&lt;/a&gt;竟然是：
&lt;blockquote&gt;
警告：该网站未备案，按照国家相关法律法规，该网站被临时屏蔽，请网站拥有者尽快到国家工业和信息化部备案网站http://www.miibeian.org.cn对网站进行备案!
联系方式：+8622-27234501
&lt;/blockquote&gt;
&lt;p&gt;算你狠！！&lt;/p&gt;
&lt;p&gt;update: 房东同学告诉我这个www.miibeian.org.cn的网站不是工信部的，域名被截了？今晚回家看看。&lt;/p&gt;</description>
	<pubDate>Sat, 31 Jan 2009 12:25:51 +0000</pubDate>
</item>

</channel>
</rss>
