当前位置

qyb的博客

最近的日子

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

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

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

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

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

Topic: 

小公司 大公司

来 SOHU 很长时间了,今天头一次参加了一个很没有营养的会议。具体内容就不谈了,反正是 13 个人从 9:30 开始呆到 12:10,可以想象会议有多无聊。至少一半的人对会议没有任何贡献,理论上俺也不用说什么话,不过作为新人还是得好好表现,在几个地方适时的阐述了一下我负责的项目对该市场计划会带来什么影响。

现在是进入大企业工作了(哈,SOHU有2000号人呢),SOHU确实很多地方能体现大公司的风范,但问题也很多,最重要的感受就是——要做一件事实在是太难了。

稍微大一点的项目,比如我手头的以及今天开会讨论的,就至少涉及3个业务单元,5个以上的team。别人不是在为你打工,必须一个一个谈过去,随时紧盯着项目跟进。

业务做的好坏,和老板是否重视有极大的关系。并不是说大公司资源多就可以把事情做好的。如果老板不重视,资源放在那里根本拿不到,虽然说我感觉查尔斯已经算是很勤奋的老板,但SOHU那么多业务线,能做好体育、娱乐、博客、搜索、输入法就相当了不起了。小公司们,尽管向搜狐的其他业务去冲击吧,呵呵。比如校友录的确很牛,但投入在“校内”上的资源,远远不及 5Q 和占座,甚至我怀疑不如被收购前的 xiaonei.com。幸好Passport号称是搜狐的第一项目(虽然我们迄今为止只有三个人),老张每周都要做1到2次brief review,进行的还算顺利。

小公司的优势是只有单一的业务,所有的团队都是因为同一个方向而设立。所以根本不必担心配合问题,如果你的团队无法成功,那所有的团队的结果都是失败。

按照长尾理论,未来的趋势应该是小公司,或者说小组织会越来越多...在脑力密集型行业,BigCompany实在不是资源配置的最有效方式。

关于开会,我最近的心得是:首先预计开会的人时数n(比如13个人,3小时会议就是39人时),会议的召集者至少事先准备n/6小时,确保开会的所有人是在同一个状态下坐在一起来讨论问题的。事实上当 n > 10 的时候,就应该考虑是否要缩减开会的人数,以及议程了。

Topic: 

《风之影》

前晚和昨晚一口气读完了.. 精采绝伦。强烈推荐,去体会一下西班牙文学的魅力吧。

作者对结构、情节、人物的掌控能力,完全是第一流的。类似的感觉我只有读《第22条军规》的时候才有。

值得一提的是这本书翻译也相当好,读的时候完全感觉不到这是翻译作品,呵呵。大前天晚上读斯蒂芬金的《三张牌》里面的第二部,也是好作品,感觉不用变成剧本就可以直接拍电影了,可惜翻译的比较烂。

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 的机制。

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

  1. def mynotfound():
  2.     render = web.template.render('templates/')
  3.     print render._404()
  4.  
  5. web.webapi.internalerror = web.debugerror
  6. web.webapi.notfound = mynotfound
  7. if __name__ == "__main__":
  8.     import os
  9.     os.environ['PHP_FCGI_CHILDREN'] = "1" #FastCGI 运行模式
  10.     web.config.db_parameters = dict(dbn='mysql', user='webpy', pw='passwordofwebpy', \
  11.             host='localhost',port=3306,db='club',charset='utf8',\
  12.             use_unicode=0)
  13.     web.run(urls, globals())

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

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

  1. urls = (
  2.         '/sample', 'sample',
  3.         '/sample/(.*)', 'samples',
  4.         '/(.*)', 'hello'
  5.        )
  6.  
  7. class samples:
  8.     GET = web.autodelegate('GET_')
  9.     POST = web.autodelegate('POST_')
  10.     def show_signup(self, users):
  11.         render = web.template.render('templates/sample/')
  12.         print render.signup(users)
  13.     def GET_signup(self):
  14.         users = web.select('user')
  15.         self.show_signup(users)
  16.     def POST_signup(self):
  17.         i = web.input()
  18.         web.insert('user',
  19.                 user_name=i.user_name,
  20.                 user_email=i.user_email,
  21.                 user_passport=i.user_passport)
  22.         users = web.select('user')
  23.         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: 

“爱因斯坦”是谁?

IceBin 那里看到明年忍者神龟就要上映了,呵呵,小时候还是挺喜欢看这个动画片的。不过后来一直对里面的"爱因斯坦"有疑问,应该都是文艺复兴时期的艺术家啊,怎么会包括爱因斯坦?

上网搜索一番,知道了 L 是达芬奇(莱昂纳多..小时候一开始以为 D 是达芬奇,L 是拉菲尔,汗...),R 是拉斐尔,M 是米开朗基罗,以上就是文艺复兴三杰了。

D,Donatello,则是意大利文艺复兴早期最好的雕塑家。Donatello 的代表作包括:青铜像《David》(当然最有名的那个《大卫》是米开朗基罗的大理石像版本),《Abraham and Isaac》,《Gattamelata》(或者称《Equestrian monument of Erasmo da Narni》)等

Topic: 

更新了 DV-2-XviD 以及 Python IrDA Socket extension

DV-2-XviD 更新到 0.8.2 版本. 其中一个 bug 是刚开始学 Python 开发的时候,使用了全局变量在函数间传递信息,结果上一次运行的结果影响了下一轮调用。还是那个指出 0.8 的 bug 的用户又发现了 0.8.1 的 bug.

Python IrDA Socket 则是编译了 Win32 2.5 环境下的扩展

Topic: 

尝试 “(10+2)*5”

现在感觉时间严重不够用,于是昨晚在等待切换的时间里研究了一下 GTD,发现了这么一个好东东。

它的概念是 10 分钟工作,2 分钟休息,这样执行5次,让一个小时的时间得到充分利用。

很多程序员都忍不住去看看论坛、check mail&RSS.. 这样时间被很多细碎的事情打断,很难有一个完整的时间去预热,去“进入状态”.

这里有一个软件可以帮助着来执行这个步骤。首先安装 yahoo widgets(只支持 windows 和 Mac),然后安装 这个(10+2)*5 的 widget

widget 可以设置为浮在所有窗口的最上层,每次执行一小时。我试用感觉还不错,强烈推荐程序员使用。

想要有效管理别人,首先有效管理自己;大学之道说先修吾身,然后齐家治国平天下。

BTW: yahoo 的 clock 和 calendar 的 widget 我也很喜欢,已经把 windows 缺省 systray 的时钟关闭了,哈哈。

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: 

说说加班

今天无意中逛到石锅拌饭的Blog,有一段很经典:

“I’ve been in the computer business for over 30 years 
and have concluded that there are only three reasons 
to work more than 40 hours a week on a regular basis. 
One – you are incompetent. Two – your management is 
incompetent. Three – you have no ability to socialize 
with others. I.e. No life. Number two seems to be the 
most common though.” - By Alfred Thompson。
我在电脑行业做了三十多年,以我看,每周超过四十小时工作
当作家常便饭就三个原因:1.你能力有限。2.你老板能力有
限。3.你缺乏社交能力,或者说,没有生活。通常,以第二个
原因居多。

关于这个问题我的看法是这样:
1. 程序员心里都明白写程序是有状态的,即《人件》里面所谓的那种攀岩的状态
2. 如果下班铃一响就关机走人,显然那个时候的人是不在状态的
3. 所以或多或少,得晚走一会儿,让自己看起来很进入状态的样子
4. 既然下班晚了,那么就应该在平时补回来。哈,所以白天我们灌水、聊天
5. 于是心里有内疚感,然后下班更晚
6. 恶性循环...
7. 突然发现,如果下班后有很长的连续时间来工作的话,的确效率会更高。那是因为这个时候没有背景噪音,没有人在身边走来走去,没有客户打电话麻烦。有些人干脆把白天的工作拿到晚上来做。

所以好的经理努力让他的团队在白天保持高效状态,在下班的时候把程序员统统赶回家。

Topic: 
订阅 RSS - qyb的博客