毕业居然都有五年了

偶然访问到了川农的首页,看到了迎新的新闻,想想9年前我也是第一次来到雅安这个地方,四年的光阴,更多的来说象一场梦,不知不觉就渡过了。

初到雅安,感觉真的是太有80年代的感觉了,一部80年代的西部电影不在这里做外景真是浪费了胶片。真的有种时光倒流的感觉。不过也是不知不觉中,这种世外桃源般的环境却我们所接受了,高原下的蓝天比其他地方更蓝,5、6月看蓝天的那种感觉格外让人心情舒畅。(待续)

轻松实现可伸缩性,容错性,和负 载平衡的大规模多人在线系统

本文以我的OpenPoker项目为例介绍另一种构建大规模多人在线系统的方案。OpenPoker是一个大型多人扑克网游,内建支持了容错能力,负载平衡和无限制的规模大小。OpenPoker的源代码遵循GPL协议可以从我的网站下载,大约包含一万行代码,有三分之一是用来测试的。

在Openpoker最终版出台之前,我花了很大精力设计参考,尝试过Delphi, Python, C#,C/C++还有Scheme。我甚至还用Common Lisp完成了一个可运行的Poker引擎。虽然我花了9个多月研究设计,最终代码编写却只用了6个星期,这最后的高效率要归功于选择了Erlang作为编写平台。

根据比较,老版本的OpenPoker需要4~5个人的小组9个月时间完成。原班人马还另外完成了一个Windows版的客户端,就算把这个开发时间的一半(1个半月)算进去,也比预期的18个月少得多,就当今游戏开发的客观环境,如此可观的时间节省不可小看!
Continue reading ‘轻松实现可伸缩性,容错性,和负 载平衡的大规模多人在线系统’

Facebook后台技术探秘

今天我们一起来了解Facebook背后的软件,看看作为当今世界上访问量最大的网站之一,Facebook是如何保证5亿用户的系统一直稳定可靠的运行。

Facebook的扩展性挑战

在我们讨论细节之前,这里有一些Facebook已经做的软件规模:

  • Facebook有570000000000每月页面浏览量 (据Google Ad Planner)
  • Facebook的照片量比其他所有图片网站加起来还多(包括Flickr等网站)
  • 每个月超过30亿张照片被上传
  • Facebook的系统服务每秒处理120万张照片,这不包括CDN服务中处理的照片
  • 每月超过25亿条的内容 (状态更新,评论等)被共享
  • Facebook有超过30,000服务器(这个数字是去年的)

Continue reading ‘Facebook后台技术探秘’

Poppen.de网站架构

在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsung。

Poppen.de目前有200万注册用户数、2万并发用户数、每天20万条私有消息、每天25万登录次数。而项目团队有11个开发人员,两个设计,两个系统管理员。该站点的商业模式采用免费增值模式,用户可以使用搜索用户、给好友发送消息、上载图片和视频等功能。

如果用户想享受不受限制发送消息和上载图片,那么就得根据需要支付不同类型的会员服务,视频聊天及网站其他服务也采用同样的策略。 Continue reading ‘Poppen.de网站架构’

Jay Chou

10年前就听Jay Chou,从第一张倒现在的专辑,每张必听,不过还算不上他的fans,不太喜欢他的摇滚风,R&B或者中国风还不错啦。特别是中国风,听起来就有种纯情歌的味道,虽然都是那种凄美的感觉,不过也好,给人很多遐想,也许方文山和Jay Chou就是那种人吧 :(

中国风里必备的二胡也许正适合这样的意境,难道二胡是贫苦劳动人民的智慧结晶?总是那么婉约凄美。总之,失恋必听。心情不好也可以听,可以以毒攻毒。

中国风里还有什么?当然还有一段若即若离的故事,虽然总有些不着边际,但是现代人总还是喜欢把自己放进那些故事,让自己和某某某成为故事的以部分,纵然是配角,但还是显得那么铭心刻骨,痛彻心扉。

中国风有种时光倒流的感觉,就是在那种感觉里,才能让彼此在自己的想像里任意放纵,是喜是悲,只不过是随着旋律转换罢了。明知道是想像,却还是不能自拔。也好,给自己一个说法,让流逝的月岁变成了只不过是一场幻境,一场戏。戏如人生、人生如戏。下一场戏于是也又要上演了。

How to get current controller name and action name in Yii

To get current controller name/id inside your controller, or view

1
2
3
$controllerId = Yii::app()->controller->id;
//or
$controllerId = $this->getId();

To get current action name/id being executed, if you are inside beforeAction() or afterAction(), use the received CAction argument

1
2
3
4
5
//inside beforeAction or afterAction
public function beforeAction($action)
{
  $actionId = $action->id;
...

or just elsewhere inside your controller

1
$actionId = $this->getAction()->getId();

Oracle的redo和undo区别

写的次序:

redo → undo → datafile
insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据.

redo → 每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件
undo → 记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据

redo → 记录所有操作,用于恢复(redo records all the database transaction used for recovery)
undo → 记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback)

redo → 已递交的事务,实例恢复时要写到数据文件去的
undo → 未递交的事务. Continue reading ‘Oracle的redo和undo区别’

发现一个在Linux下煲耳机的好工具

http://wavb.sourceforge.net/

在svn中设置mime

1
2
svn propset 'svn:mime-type' 'text/html' *.html
svn propset 'svn:mime-type' 'text/css' *.css

极速 Twisted Web 60秒(6): 定制返回代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from twisted.web.server import Site  
from twisted.web.resource import Resource  
from twisted.internet import reactor  

class PaymentRequired(Resource):  
    def render_GET(self, request):  
        request.setResponseCode(402)  
        return "<html><body>Please swipe your credit card.</body></html>"  

root = Resource()
root.putChild("buy", PaymentRequired())
factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()