Archive for July, 2008

该死的小偷

今天一早上班,女朋友的手机就被偷掉了。放下自己的文明,不得不骂一句:该死的小偷。

其实上海的治安也不见得好到哪里去,每天成百上千的手机被偷,不知道多少夜归人在回家的路上被抢。还和谐社会,至少我作为一个平民百姓没有感觉,每天上下班依然是提心吊胆,左顾手机右顾钱包,我可以肯定最起码在上海,没有几个人可以说没被第三只手光顾过。这样的日子让人怎么过的安心?

话说回来,和小偷讲良心是跟自己过不去。但是,难道小偷们就没有自己的父母没有自己的孩子?看到自己的家人在社会中被瞧不起,对得起他们么?

又碰到这种事情,心里是在觉得很无奈,很纠结

Gettext 的内存泄漏 / Memory Leaks in Gettext

Rails 支持 L10N 的插件并不算非常多,而其中的 Gettext 由于 GNU 的缘故应该算是比较普遍的了。相信很多人在对 Rails 项目进行本地化的时候都会接触过这个插件。

但是不知道有多少人在部署 Rails 项目的时候留意过 mongrel 的内存使用情况(这里以 mongrel 举例仅仅是因为比较常见,其他部署方式也会有类似的情况)。至少在我的项目中,mongrel 占用的内存会不停的增长,不得不把所有 mongrel 加入 monit 并把内存占用作为监视条件。

空闲的时候稍微分析过它的源代码。导致内存泄漏的原因其实很简单,插件内部使用一个 Class 的实例对象作为 Hash 的 Key,这部分的资源没有回收导致每次调用方法都会产生泄漏(bound_target)。虽然可以可以用 MonkeyPatching 的方式解决这个问题,但是我始终认为这种方式会带来不可预测的风险。

昨天想起以前做过的 GettextDb 的项目,于是检查了一下 Gettext 的版本情况,发现最近升级的 Gettext 1.91.0 修复了这个漏洞,改用实例对象的 object_id 作为 hash 的 key,避免了过多无法回收的对象产生的泄漏。

相关链接:http://gettext.rubyforge.org

# how to install gettext gem
gem install gettext

Uploading with Safari

前段时间在项目中加入一个新的 Upload Attachment ,很顺利的部署到了 LIVE。但是在使用过程中,很意外的收到了 Exception Notification Mails ,总结下来都具有以下特点

  1. 访问 Upload Attachment
  2. 浏览器都是 Safari
  3. Raw Post 数据段有空白
  4. 报告 undefined method `read' for "":String

根据这些线索,在 dev 环境下模拟了各种可能的情况,终于重现了这个 BUG:不选择任何文件。这个结果很让人感到意外,Rails 在处理一个请求的时候会自动的将 multipart 段进行封装,返回一个 Template File 对象。但是在处理来自 Safari 的请求,却返回一个空白字符串。

之后查过很多 tickets ,不少国外用户都遇到过这个问题(国内 mac 用户比较少?),而 Rails 团队一直都没有做出过修改,所以自己写了一个 patch 放在项目里。今天工作的时候无意中又看到了这个 patch,心血来潮检查了一下 dev.rubyonrails.org 上是否有解决方案了,得到一个 changeset: http://dev.rubyonrails.org/changeset/7759

没有去查证这个 bug 发现以后时隔多久才被修正,记上一笔,也作为 Rails 历史的一部分 :)