Category Archives: Bug

catch me if you can.

nginx 的请求大小限制

项目里头有文件上传的功能,测试的时候,上传大文件都没有问题的,结果发布到测试环境和线上,就都挂掉了。很奇怪,Rails log 里头 POST 请求都木有,第一反应是 Flash 上传组件的问题,或者是 crossdomain.xml 的缘故。前者因为开发环境木有问题,排除;后者也因为 swf 文件、请求地址、页面地址都是在 / 下,也排除。 排除这俩,自然就觉得整个世界崩溃了,出了人品与长相还有别的原因么? 结果晚饭的时候顺便跟同事提起,他讲到 nginx 可能会限制请求大小,恍然大悟,于是给配置文件加上: client_max_body_size 4M; 或者你需要的更大的尺寸。

Also posted in Computer | Leave a comment

项目发布、Ruby Gems、Bundler 与伟大的墙

敝人在做的一个小项目,有一些些小改进,经过一番测试,于昨日开始上线。项目用的 Ruby on Rails,并依赖一系列 Ruby Gems,为了方便后续的 1.8 -> 1.9 转换,并保证两边不耽误,1.8 的紧急除虫之类的工作能够照常进行,又加了 RVM(Ruby Version Manager?)。在自己的机器、测试环境里头看看,一切正常,今天 cap production deploy 的时候,挂了无数次,回滚了无数次,到刚刚,可算是成了,现记录血泪史如下。 前几次失败,是自己 naive 了,忘了给产品环境安装 RVM,又忘了在 RVM 里头装需要的 Ruby 版本,以及它的 gemset,1.8.7@my-awesome-project。这导致项目里的 .rvmrc 执行出错了。贪图方便,我在项目里配置了 .rvmrc。生成它的方法很简单: $ rvm –rvmrc –create 1.8.7@my-gemset 就可以了。不过这里有个 git 带来的问题。我全局开启了 cr 自动转成 crlf,结果 .rvmrc 在转掉之后,bash 执行出错了,不认得 ^M 字符。因为 bash 脚本实在不熟,只好含泪先把 crlf 关关掉,凑合用一下先。 再说回到产品环境的解决,自然就是安装 RVM,然后安装 bundler。在这个原以为柳暗花明的时候,伟大的墙出现了,gem install bundler [...]

Also posted in Computer | Comments closed

近期遇到的一些 Bug 汇总

项目里头,用户保存一份设计的时候,会合并多份 JavaScript 文件。这些文件都是 seajs 模块,过程中,会根据模块中声明的依赖关系,自动添加相应的文件到合并的文件中去。依赖声明的形式是数组,类似: define(‘foo’, ['a','b','c'], function(require, export){}); 代码实现得很容易,之前也一直没有问题。然而最近一个模块因为依赖太多,出了麻烦。那个模块被 Closure Compiler 压缩之后,成了这个样子: define(“foo”,”a,b,c”.split(“,”), function(require, export){}); 之前根据 [] 寻找依赖数组的,就挂掉了。Closure Compiler 这里的压缩策略是,如果用 “,”.split(“,”) 这种,能够比之前的语句压缩后要短,就改成这种。算是一个 gotcha,记在这里。 另一个问题,是略有些粗苯的,代码如下: define(‘a’, ['b'], function(require,exports){}); seajs.use(['a'], function(a) { document.write(‘ ‘); a.foo(); }); 结果 document.write 锁住了 DOM 树,seajs 在尝试解决 a 模块的依赖,在 head 中加入 的时候卡住了。比较奇怪的是,即使调用了 document.close(); 也不行。下次 debugger 看一下⋯⋯

Also posted in Computer | Comments closed

ActiveModle 的一个小 gotcha

错误信息: ActiveModel::MissingAttributeError in ComponentsController#update missing attribute: name 提示错误的源头是 model 里头通过 after_find 注入的方法中,self.name 这句挂掉了。name 属性自然是有定义的,这就让人很摸不着头脑。 tl;dr 的请看:在出错的方法里头加一句判断 return unless self.attribute_present?(:name) 就可以了。 第一次碰上这个的时候很无厘头,后来发现是当 model 的 validation 流程挂掉的时候才出现的。一开始向暴力解决问题,便加上一句 `self.instance_variable_defined?(:@name)` 期待能解决问题,然而这句实实在在的返回的是 false。然后 `self.inspect` 一下,才晓得 ActiveRecord 类中对数据库中的字段属性并不是直接以类变量定义的,要查看模型中是否有相应的字段,得用 `self.attribute_present?(:name)`。inspect 的时候,还顺带找到了错误根源,当 model.save 挂掉的时候,rails 不知道搞什么,要去找导致错误的另一个 model (当校验 uniqueness 的时候)。而且该 model 返回的数据里头除了 `id` 属性神马也没有。但是也会去调 after_find,于是就挂了。

Also posted in Computer | Comments closed

IE 6、7 中在 iframe 中操作父窗口 DOM 的时候的问题

错误信息:`Invalid argument error using AppendChild` 具体情况是,在 iframe 中的页面里头,写: var node = document.createElement(‘div’); parent.document.body.appendChild(node); [解决办法](http://www.workcss.com/Javascript/20100803122.html)是,使用父窗口的 `document` 对象创建 HTMLElement: var doc = parent.document, node = doc.createElement(‘div’); doc.appendChild(node); 不过我在 IE6 下还是遇到这个问题,实在搞不懂为神马,暂且压着。

Also posted in Computer | Comments closed

IE6 overflow:visible bug

ie6 甚至 ie7 让前端开发抓狂的原因在于,这俩货常有些奇奇怪怪的地方,而这些问题通常是都可以以很诡异的方法解决的,代价就是时间。今天遇到的问题是,当给一个 #block 节点的 overflow 为 visible,并限制其高度为 200px,而它的子节点的高度有可能超出的话,ie6 会把该子节点的高度作为 #block 节点的高度。其他浏览器(firefox、ie7+、webkit)都没有这个问题。quirksmode 对此问题也有记录。ppk 比较乐观,说这个 bug 可以作为 ie6 的 min-height 的猥琐实现(是的,ie6 这货不支持 min-height、min-width、max-height、max-width)。 碰到这问题的时候想死的心都有了,求助 Google 没想到还真有解决方法。就是在 ie6 中,#block 的 overflow 设为 hidden,子节点 position: relative。 这货不是浏览器,这货是我上辈子的夙敌。

Also posted in Computer | Comments closed

Flex 里头的 HTML 问题

更准确点说是 <Font> 标签的 font-size 属性。在 HTML 中,font-size 的取值范围是 1-7,木有单位。而在 Flash 的 HTML 解析器里头,font-size 是跟 flash 其他地方一样的单位,即像素。 今天在应用 Flex 3.5 自带的 RichTextField 的时候就碰到了问题,报表生成出来,在 PDF 里头要大上许多。Google 一番,已有一个猥琐解。 人肉把 font-size=”10″ 改成 style=”font-size:10px” 就可以了。Java demo 如下: value = value.replaceAll(“SIZE=\”([0-9]{1,2})\”", “style=\”font-size:$1px\”");

Also posted in Computer | Comments closed

[The Daily WTF] Got Time?

via Peter 是一家公司的新程序员,Noah 的继任。有一天他接到这样一封信: Subject: 请再增加些天数 Content: Peter 童鞋你好,能不能给我们的交易报表再加点天数?我不知道是不是该这么讲,以前 Noah 在的时候,每次要增加天数就要改程序的。 于是我们的 Peter 童鞋跑去翻历史遗留代码,然后他明白了为啥每次都得通过该程序才能增加天数: ‘Calculate days/hours based on total ‘ Hopefully, we wont need to go ‘ more granular than 12h If totalHours <= 12 Then dayCount = 0 hourCount = 12 ElseIf totalHours <= 24 Then dayCount = 1 hourCount = 0 ElseIf totalHours [...]

Posted in Bug | Comments closed

ant 啊 ant

快过年了,折腾个人历史遗留代码。其中有个学 jQuery 的时候弄的工作日志记录工具,JavaScript 部分写得不咋地;Java 部分写得更囧。于是打算给起个新名字,好好折腾一番,重点放在传说中的 Plug and PrayPlay 上,看能否得众 PM 芳心,拿来部署到项目组内部作为 Recreation Affair 的告示板、讨论区和记账本。 芳名 Aragog。 啊,离题了。因为要脱胎换骨,所以在代码组织方式上有所变更。因为蛋疼,自己写 ant 的 build.xml。在删除部署目录的时候,一开始还想稳妥起见,写成这样: <delete> <!– 漏掉了 dir 参数,应该是 delete dir=”${deploy.dir}” –> <fileset dir=”blah” /> </delete> 于是项目目录下的 blah 文件夹里的东西全没了。

Posted in Bug | Comments closed

一个简单的 URL Rewrite

其实没啥好写的,深入的我不懂也说不清。 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^([0-9]+?\.html)$ http://blog.cyj.me/$1 [R] </IfModule> 不知道有没有人注意到我很猥琐地又把博客地址从 www.dotnil.org 换到了 blog.cyj.me。我希望木有哈哈。 换一下不难,麻烦的是博客文章里头经常会有链接到历史文章的(上一次搬家的时候,是人肉把备份文件替换了一下)。这次呢,因为备份已经导入到 blog.cyj.me 了,就懒得再去搞。索性按 quark 同学建议 RSS 的方式,写了这么个。 我想,www.dotnil.org 的文章绝对不会是 [0-9]+\.html 的,所以就这么直接搞了。记一下……

Posted in Bug | Comments closed