Category Archives: Computer

All the weird heck at this corner of the Internet.

Twitter Bootstrap 框架介绍

第一次听说 Boostrap 是因为同事的 Ruby China,后来在自己负责的项目 一淘UX,后台部分的界面也用到了这个东东,用得有些束手束脚,因此决定把它的介绍看一遍,也给大家做个分享。 Bootstrap 是 Twitter 搞的一个框架,目的是有个工具可以方便快速搞起一个项目,样式部分使用 Less 写就,也提供了一些 jQuery 插件形式的扩展。对景德镇居民来说,它比较狠的是直接不支持 IE6,许多特效、属性在 IE7、8 里头也是捉襟见肘;因此,如果你的网站放不下这部分用户,还是先不要用了,或者可以参考着整一个自己的版本。Bootstrap 的代码托管在 Github,随时可以 fork。 样式方面,它提供了如下解决方案: 栅格系统 布局 字体样式 多媒体展现 表格 导航 警告与提示 弹出浮层 栅格系统与比较著名的 960 Grid 大同小异,不过丫默认是16栏,940像素宽,此外一个特性是,因为 Less 带来的动态语言特性(变量、函数等),可以通过配置几个参数,自定义自己的栅格。因为抛弃了老旧浏览器支持,可以直接用 :last-child 将最后一栏的 margin-right 去掉,这也是它与 960 Grid 的差别之一。 布局也是老生常谈,一个固定宽度的居中,一个可变宽度的浮动布局。 字体设置里的风格比较明显,标题、em、strong、b、i 以及 address,都配了一些样式。在 blockquote 的样式里头,利用 before 属性,加上了个 ‐。然后是列表,通过 .unstyled 类,获得样式充值效果;这个方式其实我也比较喜欢,特别是网站是以内容为主的时候。代码块也比较朴素,推荐了 Google Code [...]

Posted in Computer | Leave a comment

RMagick、MiniMagick、ImageMagick、GraphicsMagick 傻傻分不清楚

四兄弟都是 Magick 字辈的,要分清楚其实也简单。ImageMagick 和 GraphicsMagick 是名副其实的两兄弟,都是开源的图片处理工具,具有丰富的执行参数,艺术效果等等。后者是前者的分支,从 2002 年时的 5.5.2 版本分出来,专注软件与编程接口的稳定性。 而 RMagick 与 MiniMagick 也算是两兄弟,后者比前者优势在更稳定,不容易内存泄露(That’s what they say…)。哥俩都是 Ruby Gem,是对 ImageMagick 的命令行选项的封装。中午查文档的时候瞥了一眼 MiniMagick 的些许代码,也是用的 method_missing 来搞。例如: img = MiniMagick::Image.read(blob) img.resize ’800×800′ # method_missing thrown, resize wrapped as an option of `convert` command. 所以,基本上对着 ImageMagick 的文档用就是了。 然后再提一个经常用到的实践,在 CarrierWave 的封装里头也很常见的,resize_to_fit 与 resize_to_limit,以及其他一些需求,例如我今天要做的,把图片宽度限制在 800 以内,高度不限。这种需求都可以通过 -resize 参数统统搞定。在文档里头我们看到,它说接收一个 geometry [...]

Posted in Computer | Leave a comment

事件代理以及它的好处

不是什么新东西了,昨天做的分享里头需要讲到,又把几个知识点翻出来看了一下,这篇博客总结得不错,摘译一些。 事件代理利用的是事件冒泡机制,在事件,例如点击触发时,是从 DOM 树最底端的阶段开始往顶端冒泡,事件对象贯穿这个生命周期。入门事件绑定的时候,绑定与处理是这样的: var button = document.getElementById(‘J_button’); button.onclick = function(e) { e = e || window.event; var target = e.target || e.srcElement; // handles target }; 这在要绑定、处理的节点多了之后有点难办的,尤其是列表、表格这种场景,在 for 循环的时候,有个经典的 js gotcha: // 错误代码 for (i = 0; i < anchors.length; i++) { anchors[i].onclick = function(e) { alert(i); }; } 不管点那个锚点,alert 出来的都是 anchors.length -1,熟悉 js [...]

Also posted in Complang | Leave a comment

nginx 的请求大小限制

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

Also posted in Bug | Leave a comment

定制 Authlogic 的错误信息

Authlogic 是 Rails 项目中比较常用的 Gem,用来方便添加账户系统,登陆校验、密码哈希,都一并做掉了,Redmine 似乎也用的它。有个不足处是,HTTPS 的方式比较麻烦,还需要许多额外的工作。 另一个经常需要改动的是它的错误提示信息,其实可以在 locale 中很方便地定制,在 config/locales/zh.yml 里头复制进 authlogic: error_messages: login_blank: can not be blank login_not_found: is not valid login_invalid: should use only letters, numbers, spaces, and .-_@ please. consecutive_failed_logins_limit_exceeded: Consecutive failed logins limit exceeded, account is disabled. email_invalid: should look like an email address. password_blank: can not be blank password_invalid: [...]

Posted in Computer | Leave a comment

JavaScript 获取 Iframe 内容高度

页面中,有需要 iframe 嵌入的内容,因为是同源的内容,所以可以使用 JavaScript 操作起来,希望可以获取它需要的高度,修改 iframe 标签的 height,以去掉滚动条,让嵌入看起来更自然一点。 stackoverflow 上果然已经有了不少关于这个问题的问答,翻看一遍,总结解决办法如下: var frame = document.getElementById(‘#frame’), win = frame.contentWindow, doc = win.document, html = doc.documentElement, body = doc.body; // 获取高度 var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight ); frame.setAttribute(‘height’, height); 这里还有个值得注意的是,最好让上面这段,在 iframe onload 事件触发之后执行: frame.onload = function(){}; frame.setAttribute(‘src’, frame.getAttribute(‘data-src’)); 这俩结合起来,就是我最终采取的方式啦。

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 Bug | 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 Bug | Comments closed

卡内基·梅隆大学(CMU)的脸部识别实验

CMU 的脸部识别实验,看了 FAQ 的小结部分,我已经后脊背发凉了 >_

Posted in Computer | Comments closed

Amazon 与它新发布的 Kindle 们

Amazon 真是家有趣的公司哇。在线卖书起家,因为感觉错过互联网淘金热和急火火加入,一路上扩张、收购,不好好做电子商务这份有前途的工作,还非得搞出些七七八八的云服务,什么存储服务(S3)啦,云计算(EC2)啦,最近又搞了亚马逊·擎天柱(Amazon Prime)搞影音流媒体服务。与之搭配的,就是今天要说的这些 Kindle 们。 我在去年入了一个,6″ 的 Kindle 第三版,无 wifi 版本。拿到手第一感觉是,这货真轻啊,跟地摊货似的,点亮屏幕就马上被 hold 住了,真真确确的在看书的感觉。后来就去下各种 pdf、epub,用 calibre 转了发到 kindle 上去看;也用一些服务例如 read later 啦,readability 啦之类的,将网文发到这台 kindle 上看;也会去 Amazon 上买些版权过期的、免费的书来看。 有“商务人士”指出,买个 Kindle 却不高兴买正版书看的人,都活该被鄙视。唔,确实 not fashion。 然而等不及我悔悟,Amazon 又重磅出击,把产品线更新、扩大了。昨日发布,一下多了好些个版本:去掉主键盘、只保留按键的 Kindle;增加了触屏、也去掉了所有按键的 Kindle Touch,当然,分有无 3G 的版本;老款成了最贵的,改名叫 Kindle Keyboard,这货的主键盘我从来没用过,真心不好用啊,屏幕反馈太慢,打字的乐趣分文没有了;然后就是当当当!Kindle Fire,一个彩屏的 Kindle 诶! 等等,说了这些个,价格多少?把他们都加起来(总共六个 Kindle),唔,差不多比最贵的 iPad(64GB+3G)还要便宜个几十刀的样子。这个公司的思路可真够清晰的,公司创始人 Jeff Bezos 曾说过这么一句话: There are two types of companies: [...]

Posted in Computer | Comments closed