2010年11月28日星期日

Run sinatra application with Apache httpd server over scgi

It's really painful when the README file told me the code works but actually not. This is what I was fighting for running a rack based application on Apache2 over scgi.

Background: On Friday night, I brought a web scalability problem from office that mainly on ruby because we confirmed Webrick sucks and can't work well in REAL production (aka, concurrent users). On gtalk, Kevin provided a number of solutions on scaling out Rails application like lighttpd+fastcgi and mod_rails. But I'm using sinatra + rack. Finally I approached to scgi which is a stable and high-performance solution.

Here's the steps on centos5.5 (things are getting easier on ubuntu but centos is my production use):
  1. Install apache2:
    #yum install httpd httpd-devel
  2. Install mod_scgi:
    #wget http://python.ca/scgi/releases/scgi-1.14.tar.gz
    #cd scgi-1.14/apache2
    #/sbin/apxs -i -c mod_scgi.c
  3. Install ruby-scgi (assume you've got necessary gems like sinatra and rack):
    #gem install scgi
  4. Compose a simple sinatra app for example:
    # /var/www/sample-app/MyApp.rb
    require 'rubygems'
    require 'sinatra/base'

    class MyApp < Sinatra::Base
    set :sessions, true
    set :foo, 'bar'
    set :server, %w[scgi]

    get '/query/' do
    'How you doin'?'
    end
    end
  5. compose a config.ru for rack:
    require 'rack'
    require 'MyApp'

    MyApp.run! :port => 9090
  6. Note: you must create a 'log'directory before running rackup:
    #mkdir /var/www/sample-app/log
    #rackup config.ru &
  7. Create an conf file for your apache2:

    # /etc/httpd/conf.d/MyApp.conf
    LoadModule scgi_module modules/mod_scgi.so

    # Set up a location to be served by an SCGI server process
    SCGIMount /query/ 127.0.0.1:9090


    <location "/query">
    # Enable SCGI delegation
    SCGIHandler On
    # Delegate requests in the "/query" path to daemon on local server, port 9090
    SCGIServer 127.0.0.1:9090
    </location>
  8. Restart your apache2 then issuing request to http://localhost/query/
Enjoy :)

2010年8月3日星期二

富有责任感的工程师们

故事背景:周一晚上有场音乐演出,准备邀请同事们一同去。

我:今天晚上在XX区YY路ZZ厅有场精彩的音乐演出,大家一起去吧!
(以下 A~F均为工程师同事)
A君:还看演出?产品 release 压力好大...不去了
B君:太远...不去了(此君家距离演出地点乘20分钟直达地铁即可到达)
C君:有话剧吗?有话剧我就去。...有话剧吗?
D君:这种音乐我不熟...
E君:有美女吗?...咳,我今晚有事儿,晚上要开电话会议
F君:我要2张票!......几点结束?我晚上9点要和 GHI 搞定那个 JJ 事...

(以下K和L均为实习生同事)
K君:哇有演出唉,够狂野吗?... 同去同去
L君:好啊...不过还要你请我们看演出...门票我来付吧...

富含责任感的工程师们为了所谓的工作放弃了欣赏音乐、放松紧张心情的机会,实在令人钦佩。

不禁回忆起大学时同宿舍的兄弟们为了赶一场学生剧团的演出前排座位,不惜压缩必修课程、自习时间以及实验进度,匆匆忙带着晚餐骑车赶往音乐厅。这种事情在以工作为己任的工程师们身上极少看到了。也许我的理解有误,也许他们在紧张的工作中找到了刺激,能够迸发超越艺术体验的激情,看来我是缺少这种刺激的责任感了。

2010年7月22日星期四

30分钟的讲座:设计开发实效 Web2.0 应用程序

月初给中科院的夏季学期系列讲座之一:设计开发实效 Web2.0 应用程序

这里是一同去的成大师的讲座:Ajax应用开发最佳实践

PS: 幻灯片模板上的图片是米兰LV店门前漂亮的地板,感谢远在意大利的袁瑶同学提供的照片。

2010年3月20日星期六

JSMin 的道德大战

本人是JSMin的用户,无非用它来压缩 JavaScript 代码的规模,从而减少数据传输量、提高浏览器解释代码的性能,却从未认真阅读过其版权声明,实在汗颜。
有趣之处在于,Web 开发领域使用JSMin富有争议,引起开发者、互联网公司和开放源代码传教士之间的精彩道德大战。让我先从其版权声明讲起。

JSMin的版权声明从约束力最小的MIT许可证修改而来,而MIT许可证的声明长达162字,但是大意只有两个:
  1. 不管你如何发布软件,你要在所有的拷贝中加入本声明
  2. 被发布的软件仅包括软件本身,不承担任何附加担保、义务和责任
除了抽象的普遍性和无责,相当于什么也没说。好比一个开发者决定开放自己编写的软件代码而又不知道选择什么许可证时,用MIT许可证再合适不过了。采用MIT许可证的软件如著名的prototype.js

后来 JSMin 的作者 Crokford 发布它时,在MIT许可证上加了9个字,后来正是这富有争议的9个字,给了我们精彩的故事:
“The Software shall be used for Good, not Evil.”

因为它以MIT许可证作为基础,所以以后在JSMin基础上开发的软件都把这段文字包括在自己的许可证里。于是用到JSMin的很多代码包括etherpad, jsmin-php 都做了如此“不做恶”的声明。在 etherpad 被谷歌收购之后,它的开放源代码版本不得不去掉使用JSMin的部分,因为这9个字意味着该软件可能不免费,与googlecode的使用协议有冲突。于是如果你想要把代码通过 googlecode.com 发布,那么你就不能使用和JSMin相关的代码。想起来哪家公司说过“Don't be evil”吗?

不光是 JSMin, 使用JSLint也没戏了。接下来是应用它们的各式互联网应用程序,你将不能用这些道德代码去开发——因为你无法担保基于Web的功能不被其他人用来做坏事,如果你想担保,那么至少要加入这段修改过的MIT许可证——实际上如我一般在商业公司里工作的程序员都做不到。

有人想要把这段文字从许可证里去掉。但是修改许可证可不是小事,而且去掉这些文字的行为违反了MIT许可证的第一条。所以很多JSMin的用户都不同意这种做法(除了JSMin.js的作者,他用JSMin处理了自己编写的jsmin.js代码,于是这段声明就没有了),于是他们不得不把软件从googlecode.com的代码仓库里面迁出来。


看完这篇博文里Crokford调侃某大公司律师的文字之后,我发现得和JSMin说再见了。

2010年1月25日星期一

十年过去,我们依旧为足球电视游戏疯狂 - H博士传奇

2010年1月某寒冷的夜晚,巴西烤肉店。

H博士(刚刚拿到学位即将毕业)兴奋地说:等我工作后,先要整台wii+wii fit,这样就可以每天下班在家玩足球游戏了!
我:我还以为你要说为祖国的强大贡献力量呢,怎么还想着游戏机?
H博士:嗯~~~,哇哈哈哈~~~,为什么不呢?

于是,也许是烤肉吃多了,恍惚间我想起了10年前当时的H博士和我在火车上激烈讨论的场景,事情是这样的...

怀揣着某大学录取通知书,心里略有兴奋,可是一路上的讨论主要围绕着脱离父母后如何自由地玩游戏和踢球云云。当讨论完若干关于宇宙和整个人类的话题后,我们的结论是,最伟大的梦想不过于拥有一台电视游戏机(十年前流行的PlayStation)和著名的实况足球游戏。十年后,也就是现在,这个我们当初共同的梦想就要被H博士抢先实现了!而且是数次游戏技术革命后的升级版!想起这一点的确有些激动,虽然听起来有些傻。

实际地说,这对于一个享受国家补助、2009年涨过工资的博士生来说并不困难。一台 wii 并不贵,3个月补助足够了,于是H博士用刚刚涨过的补助去中关村买了一台破解的 PSP3000. 我没开玩笑,考虑到他去年用积蓄的补助购置了两台顶级 thinkpad 的情况下,用余钱买PSP非常令人敬佩。

在H博士动用某大学某著名实验室多台计算工作站在世界足球经理这样的游戏上通过并行计算处理整个联赛的球队交易数据之后,我从来没有公开说过H博士沉迷于游戏(数年前当我为宿舍攒第一台电脑第一次成功开机,他就霸占了超过30多个小时)。现在他毕业了,掌握着将卫星送上天、计算大楼爆破以及用多少力才能撕裂蜻蜓翅膀的技术,最重要的是,多年来怀揣着单纯的游戏梦想,生生不息,激情依旧。

高中时代第一次在游戏厅看到中学时代的H博士,没错,他在玩实况足球;
高考最后一门考试结束,我和死党们狂奔到游戏厅刚坐下没多久,就看到了那时的H博士紧跟而来;
大学时他为同学们无偿提供关于实况足球的各种知识:从PC上的PS模拟器,到游戏程序、手柄驱动程序、学习教程以及若干经典bug;
后来他去了某系某实验室,据称那里有性能强劲的计算工作站......很聪明的选择;
再后来博士生补助涨了,大家也都知道他买了什么

H博士决定离开我们求学的这座城市,今晚吃完烤肉打着饱嗝我却突然觉得少了什么,有些失落......我们是否还梦想着十年后的游戏主机?但愿H博士还会续写他的传奇。

2010年1月4日星期一

节省移动电话话费的方法

  • skype 包月卡拨打长途。在android手机上安装 skype lite来拨打电话,这样每次拨打按照双倍时长计算,只要你能买到20元以下的400分钟包月卡,话费就可以降低到0.10元/分钟以下;
  • Gizmo5.com + Sipphone (SipdroidFring)打国际长途。前者拨打国内电话的费率是$0.02/分钟,用3G网络接听,语音质量很好。
  • Google Voice + Gizmo5 + Sipphone :如果你需要频繁地给在美国的朋友打电话,这个组合最合适。Google Voice 用来呼叫电话和转接至 Gizmo5, Gizmo5 可以用来将电话呼叫转接到 SIP,最后你用 Sipphone 接听就好了。资费按照你的手机网络流量计算。
这里有一些参考也许有所帮助:
Google Voice呼转到中国电话的五种方法
国内注册 Google Voice 的方法