qyb的博客

孔雀西北飞,东南有高楼

新浪和搜狐先后从朝阳搬到海淀
小熊也说觉得 Opera 以后还是把开发放到中关村上地比较好

听说微软将把 MSN 放到谷歌旁边的楼

CBD 的 5A 写字楼是越来越多了,可 IT 公司,或者说研发的群落在那里的环境真的越来越好了么?

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: 社会

过了这座山,就是菩提洞了

今天晚上加班,Passport切换数据库。如果最终失败,意味着之前5个星期的准备工作完全白费。虽然从项目经理的角度看我对自己的工作还是比较满意,如果今晚出岔,应该是纯粹技术上的原因——恰恰在 Java 和 MySQL 高容量高并发下运行,我完全没有任何技术经验。

理论上,纯粹是理论上,今晚能平安过去,明天一起看起来很完美,给下面三个星期的工作开个好头,也给我在搜狐的职业生涯开个好头。

还有人记得大话西游里面菩提老祖说了“过了这座山,就是菩提洞了”后发生了什么事情么?用这句话做标题的意思是任何时候都要警觉,越是快到幸福终点,越是危险。

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: 技术

微睦(vmmatrix )的虚拟服务器

很早以前就知道 vmmatrix 的大名,因为在下载 mysql、apache、debian 的时候,就会告知有一个中国的镜像叫 vmmatrix。当时也没有细想它的盈利模式是什么,直到后来看 solidot 的网络和硬件配置,这才知道原来 vmmatrix 是专业做虚拟服务器的。

在决定离开亿邮后,就计划弄一个可自由使用的 shell——在我看来,没有 shell 的生活和不能联网是一个概念,而且可以顺便放自己的 blog。可是托管机器相当的不便宜(按三年折旧的话,找个好机房托管 1U 的服务器平均一年怎么也得六七千),俺又没有做视频聊天图铃下载传奇私服赚钱的打算,投入产出比就显得太低;另外潜在的维护需求也很让人头疼。后来从 xjb 那里走后门弄来一个免费的 PHP 主机空间做 dup2.org 后就没再想这事儿。

一开始 dup2.org 的主机虽然没有 shell,但好歹能用 system() 函数。可好景不长,为了系统安全,去掉了对 system() 的支持,一下子感觉维护起来不那么方便了,很多计划也无法实施,就把目光转向了 vmmatrix。正好 10 月份 vmmatrix 正在做一个活动,最便宜的那款机器第一个月促销 99,而且其网络支付平台支持北京的长城卡,于是就很干脆的付款了(很大程度是因为 vmmatrix 镜像,所以觉得声誉很好)。

vmmatrix 是用 vmware 来将服务器进行分区,做成独立的虚拟服务器。理论上是可以远程连接 console 维护的,而且免费提供 CDN——事实上这种模式上跑的 web 服务器必须通过反向代理才能访问的,呵呵。缺省提供 SSH 访问和 WEB 访问(开通服务的时候根据注册的邮件地址默认给你一个 test.vmx.cn 的域名);用户需要和客服联系,告知所需要转发的域名才能最后配置好;如果有额外的端口想要用也需要让客服设置端口转发,比如 https(注意:虽然 vmmatrix 用 https://yourdomain 也可以访问成功,但实质上是你的浏览器 SSL 连接到做反向代理的 squid,然后 squid 和你的 80 端口做不加密通信的)。

目前阶段 vmmatrix 的服务还是很好的(实际上现在我的这位客服是一个很 senior 的技术人员),和他说需要怎么怎么配置都很快就搞好了。俺买的这一档服务器是 128M 内存、4G 硬盘(512M 的 swap,实际只有 3.5G)、然后是号称“CPU 最多分配 Intel Xeon2.8G 的 50% 的计算能力,最低 12.5%”。实际使用中(编译 apache、php)速度还真不错,只不过看 /proc/cpuinfo 是一颗 AMD Athlon(TM) MP 2600+,而不是 Xeon 2.8G。

第 1 个月的使用感觉挺不错的,只不过刚开始在 SOHU 上班,实在没有太多精力鼓捣这台机器,利用率较低,但还是续了 2 个月的费。续费过程中发现它的购物车系统做的实在是很烂,客服说正在改进,最后通过银行汇款续的费。

听说 chenxa 同学在学习 Ruby/Rails,于是给他一个帐号帮我用用 cpu,hoho。shell 的好处这就体现出来了,想玩什么玩什么;即使是 mysql/php 组合,为了兼容性,大部分的虚拟主机应该都还停留在 php4/mysql4.0 阶段吧,稍微高级一点的特性需求根本玩不起来。

最后是我打算 web 开发转向到 Python,不再考虑 PHP。一方面是因为看到 PHP6 的 unicode 特性后觉得现在的 PHP5 没有必要深入学习和使用下去;另一方面是认为 PHP 先天性无法作为一个应用服务器使用,而 Python 在这方面和 Java 很有一拼。今天简单研究了一下,似乎 web.pyKarrigell 是 Python 世界中两个比较容易入门的 web 框架,哈,先从它们开始吧。

ffdshow tryouts

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

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

Topic: 技术

12月1日九头鸟北太平庄店

通过饭统网订了一个包间,号称可容纳20人。

19点,如果有人早到,试试报订单号 z938,不用大冷天在外面等着。

这是第二次使用饭统网的服务了,上次是订蓟门桥鄱阳湖酒楼。其实不是网上订,而是上网查了电话,直接打过去订的,hoho

Topic: 生活
订阅 RSS - qyb的博客