技术

刚刚发现 link.exe /dump 其实就是 dumpbin

以前只知道 link.exe /lib 相当于 lib.exe,现在发现 dumpbin 也是可以用 link.exe /dump 来代替的。这样对于我来说,Win32 上安装一套 msvctoolkit2003 + platform sdk 基本就可以满足我的所有需要了。

Topic: 技术

最近的日子

软件工程里有一个很有趣的“定理”:一个项目的花了 90% 的工期完成了前 90%,但剩下的 10% 要花同样的 90% 的时间才能完成。目前我手头的这个项目似乎就处在这个完成度 90% 的状态下,似乎已经没有什么事情可做了,但离完工好像还是遥遥无期。

在搜狐接触的人多了,总会碰到那么一两个不大合拍的人,其中一个说话的态度好像我欠他钱,另外一个大部分时候还算和善,不过偶尔会发发飙。回想起来其实都是跳槽带来的挑战,以前在亿邮的时候别人和我说话几乎都是恭恭敬敬,现在得时时提醒自己,“心态要端正...冷静,一定要冷静...冲动是魔鬼...”

或者终极心理暗示大法:这也会过去

总之突然圣诞节那天快下班时觉得状态非常不好,或许是周日在 SOGO 血拼满三百返三百太疲倦的缘故,遂等公共汽车的时候去麦当劳买了杯热巧克力喝下。26 日一个朋友在 MSN 上祝我 Merry Xmas,一下子又充满了干劲。在这里向所有看我 blog 的朋友们说,Merry Xmas!Happy New Year!我永远爱你们;虽然从来不群发短信,但我永远是一个 rapport 的家伙,这点是错不了的。

明后天计划做做公钥算法加密解密的benchmark,刚刚发现除了 RSA/DSA 外,ECC(椭圆曲线密码)也是属于公密钥体系(非对称加密)的,似乎有超越 RSA 的势头。

Topic: 技术 生活

web.py 进阶2,连接 MySQL 数据库,以及其它的一些内容..

第一部分在这里

申明一点,这里的例子都是基于 web.py 0.2 版本的。现在网上的 web.py 中文教程是基于 0.1 的,如果你看到的文章一开始说要安装什么 Cheetah,那肯定不适用现在的情况了。

首先说的是 Python 连 MySQL,以及 UTF-8 字符集的事情。我这里假设你的应用是纯 UTF-8 的,而且使用 MySQL 4.1 以上的版本。

Python for MySQL 的连接扩展在 mysql-python,Debian Sarge 的包里面是 1.2.1c2 版,是不支持 4.1 的 Charset 特性的,最新的 1.2.1_p2 版支持的很好,只不过从这个版本开始必须依赖 Python2.4 了。

当使用 mysql-python connect()的时候有两个重要参数,charset,use_unicode。charset 就是指定连接以后 set names 的字符集;use_unicode 则指定 fetch result 的结果是用 'unicode string' or 'string' 类型 ? 由于最后输出的模板都是按照 string 来解析的,为了能正确运算,必须把这里设置成 0

web.py 类似 Java Servelet,可以在程序出错的时候抛出一大块异常;而且因为直接处理所有的 URL,所以它也内置一个自定义 url not found 的机制。

例子:首先是初始化部分的代码

def mynotfound():
render = web.template.render('templates/')

print render._404()

web.webapi.internalerror = web.debugerror
web.webapi.notfound = mynotfound
if __name__ == "__main__":
import os
os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式
web.config.db_parameters = dict(dbn='mysql', user='webpy', pw='passwordofwebpy', \
host='localhost',port=3306,db='club',charset='utf8',\
use_unicode=0)
web.run(urls, globals())

上面定义了新的 404 处理函数以及用 web.debugerror 代替原来的 500 处理函数,debugerror 可以抛出一个非常漂亮的异常页面。在 __main__ 函数里面设定了 mysql 的连接参数,这里连接到一个叫 club 的数据库

增加一个对所有以 'sample/' 开头的 URL 分发类 samples

urls = (
'/sample', 'sample',
'/sample/(.*)', 'samples',
'/(.*)', 'hello'

)

class samples:
GET = web.autodelegate('GET_')
POST = web.autodelegate('POST_')
def show_signup(self, users):
render = web.template.render('templates/sample/')
print render.signup(users)
def GET_signup(self):
users = web.select('user')
self.show_signup(users)
def POST_signup(self):
i = web.input()
web.insert('user',
user_name=i.user_name,
user_email=i.user_email,
user_passport=i.user_passport)
users = web.select('user')
self.show_signup(users)

注意:这里用了 autodelegate ,来把 sample/abc 的 GET 方法转到 GET_abc 方法去处理

运行实例:

访问 http://www.dup2.net/papp/sample/notfound 可以看到我自定义的 _404 输出结果

访问 http://www.dup2.net/papp/sample/signup可以执行我这里访问 MySQL 的例子.

我这里的 email 是设置成 unique key 的,这样可以在这个页面提交表单内容里面把 email 赋值为已经存在的 email,比如 spam@notinput-realemail-here.org,哈,就可以看到一个很帅的异常了..

Topic: 技术

web.py 进阶例程

web.py 的首页提供了一个 13 行的例子来演示如何开始一个应用,但其网站上似乎就没有别的更进一步的例子了。这两天简短学习了一下,写一个进阶例程。包括:读取 GET/POST 变量,以及模板的使用。

  1. #!/usr/bin/python
  2. import web
  3.  
  4. urls = (
  5.         '/sample', 'sample',
  6.         '/(.*)', 'hello'
  7.        )
  8.  
  9. class hello:
  10.     def GET(self, name):
  11.         i = web.input(times=1)
  12.         if not name: name = 'world'
  13.         for c in xrange(int(i.times)): print 'Hello,', name+'!'
  14.  
  15. class sample:
  16.     def _request(self):
  17.         render = web.template.render('templates/')
  18.         cache = False
  19.         i = web.input(fname = 'yingbo', sname = 'qiu')
  20.         #交换 fname, sname 的值
  21.         firstName = i.sname
  22.         surName = i.fname
  23.         print render.sample(firstName, surName)
  24.     def GET(self):
  25.         self._request()
  26.     def POST(self):
  27.         self._request()
  28.  
  29. if __name__ == "__main__":
  30.     import os
  31.     os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式
  32.     web.run(urls, globals())

模板:templates/sample.html

  1. $def with (firstName, surName)
  2.  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  4. "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  5. <html>
  6. <head>
  7. <meta">http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8. <html>
  9. <head>
  10. <meta</a> http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  11. <title>dup2.net</title>
  12. </head>
  13. <body>
  14. <form action="sample" method="post">
  15. 名:<input type="text" name="fname" value="$firstName" /><br />
  16. 姓:<input type="text" name="sname" value="$surName" /><br />
  17. <p><input type="submit" value="提交" /></p>
  18. </form>
  19. </body>
  20. </html>

访问 http://www.dup2.net/papp/sample 就可以看到效果。这个 sample 可以接受 GET/POST 请求。参数为 fname 和 sname。执行结果就是将这两个值交换显示。

web.py 每个 URL 请求分发到一个类。这里就把 sample 分发给 sample 类,其它的所有 URL 分发给 hello 类。访问一下 http://www.dup2.net/papp/ladf/badf?times=3 看看 hello 的效果。

HTTP GET 和 POST 分别执行 class 里面的 method。使用 web.input() 来取得 request 参数和值。

然后用 web.template.render() 初始化模板目录。方法名 "sample" 对应的 "sample.html" 模板文件

计划下面研究模板系统...

Topic: 技术

Apache 2.2 + web.py + RoR

刘韧的 1234 文体

1. mod_python 非常不主流,所有 Python 的 Web 框架都内置一个 HTTP Server 的实现(在 Python 世界里这样做太简单了),web.py 还包括了 FastCGI/SCGI 的支持。RoR 也同样通过 mongrel 提供了 web server 支撑。

2. lighttpd 支持反向代理,也支持 FastCGI,再加上它确实够轻,性能也不错,而且用 apache httpd 不够酷,于是它成了新潮 web hacker 们的最爱。

3. 其实我很有理由使用 lighttpd,因为我的内存只有 128M。但我想通过 http 端口来跑 svn,没办法,只有用 apache。编译的时候加上 rewrite/proxy 的支持

./configure --prefix=/usr/local/apache2  --enable-so -enable-ssl \
   --enable-rewrite --enable-proxy --enable-proxy-http

mod_fcgid 的编译过程也很简单,直接 make; make install 就好了。
注意:fcgid 的配置为 SetHandler fcgid-script 而不是 fastcgi-script

4. 我下载的是 web.py 0.2,但网站上的关于如何运行在 Apache FastCGI 模式下的说明是错误的(怀疑说的还是 0.1 版本的方法)。我的方法是增加了这么两行

import os
os.environ['PHP_FCGI_CHILDREN'] = "1"

注意:必须安装 flup 包,web.py 才能支持 FastCGI。

最后的配置为

  1.     <Directory "/usr/local/apache2/htdocs/papp">
  2.         Options ExecCGI
  3.         AllowOverride None
  4.         Order allow,deny
  5.         Allow from all
  6.         <Files code.py>
  7.             SetHandler fcgid-script
  8.         </Files>
  9.         Options +FollowSymLinks
  10.         <IfModule mod_rewrite.c>
  11.             RewriteEngine on
  12.             RewriteBase /papp/
  13.             RewriteCond %{REQUEST_URI} !^/icons
  14.             RewriteCond %{REQUEST_URI} !^/favicon.ico$
  15.             RewriteCond %{REQUEST_URI} !^(/.*)+code.py/
  16.             RewriteRule ^(.*)$ code.py/$1 [PT]
  17.         </IfModule>
  18.     </Directory>

code.py 放在 htdocs 的 papp 目录下

5. RoR 的 mongrel 起在 8000 端口,我在 htdocs 下创建了一个 rapp 目录,然后配置 rewrite

  1.     <Directory "/usr/local/apache2/htdocs/rapp">
  2.         <IfModule mod_rewrite.c>
  3.             RewriteEngine on
  4.             RewriteBase /rapp/
  5.             RewriteRule ^(.*) <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a>$1 [P]
  6.         </IfModule>
  7.     </Directory>

有的网站上的配置是 ProxyPass 什么什么的,我的这个重写到本地端口的配置方法是从 karrigell 那里学来的,觉得也挺好的

Topic: 技术

jabberd2 2.1 release

很早就订阅了 jabberd2 的邮件列表,似乎开发不是很活跃。有次和其中一个开发人员 gtalk,他说目前也有不过 3 个开发者,而且其中一个对现有的框架不满意,觉得很难去 scalable,要另起炉灶,感觉这个项目前景不妙。。。不管怎么说,刚刚看到邮件列表里面的新消息,2.1 发布了!

http://ftp.xiaoka.com/jabberd2/releases/jabberd-2.1.tar.bz2

Release Note / New Features

- dropped SCOD, using CyrusSASL
- jabberd2 uses system expat library
- router level XMPP packet filtering
- modules/features ported and integrated:
* Linux epoll support
* full vcard-temp support
* storing user status in DB
* offline messages quotas and more robust handling
* Advanced Message Processing (AMP)
* authreg_pam realm handling
- RFC3921 compliance (presence handling)
- dropped legacy features (presence-invisible)
- certificate handling fixes (not complete yet)
- proper SRV records handling
- c2s HTTP connection forwarding to real HTTP server
- other im servers on the router are not listed on disco
- using route errors for stanza errors
- only PostgreSQL is now fully supported
(patches needed and welcome)

- numerous bug (crash, leaks) and stability fixes

Topic: 技术

ffdshow tryouts

今天总算搞明白 ffdshow 现在的状态了。原始开发者 milan_cutka 不知什么原因终止了对这个项目的维护,最后一次 build 是 20051129。接着 celtic_druid 大牛做了一段时间的 build (就是把各种各样的 patch 抓进来)。然后 videomixer9 在 sourceforge 上启动了这个新项目 ffdshow-tryouts,总共 4 名核心开发人员吧,一直都很活跃,可以说现在的 ffdshow-tryouts 已经取代了原来 ffdshow 的官方地位。

因为在各大搜索引擎搜索 ffdshow 返回的还是停止更新的那个项目,所以写篇文章说明一下。

Topic: 技术

DV-2-XviD 0.8.1

今天收到一封 DV-2-XviD 用户反馈来信(感叹一下:中国软件业的希望是争取国外用户啊...这是第二个老外给我报 bug 了),说是不支持 Scenalyzer Live 4.0 捕获的 AVI。查了查代码,应该是自己原来对 AVI 格式理解有误造成的,很快就改好了。

不过在生成 py2exe 的时候出了一些问题。因为前不久系统重装,所以 Python 也顺手换上了 2.5,结果就导致一系列扩展都要重新安装。先是 py2exe 0.6.5 报告 zlib 错误,google 之,是由于 Python 2.5 for Win32 内置 zlib 导致的,py2exe 暂时也没有正式发布的包解决这个故障,还有在邮件列表上找到一个 patch 搞定了。然后就是最新的 wxPython 2.7.2.0 在 py2exe 的时候依赖 gdiplus.dll,于是降级回 2.6.3.3,整个世界清净了。

其实新版本比老版本还少了一行脚本,但 Python 2.5 环境下转换出来的 DV-2-XviD.exe 整整大了 360k,郁闷...

Topic: 技术
订阅 RSS - 技术 | BT的花