Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

Chito 构架更新

调整作息时间以来已经过去了一个月的时间了,才发现这段时间一直没有写过 blog,不知道是不是这种正常人的作息让我有时光飞逝的感觉。

这一个月中,除了按部就班的玩模拟期货、做听力之外,还有就是开始逐渐把 Chito 迁移到 Rails3 上,原本这只是个额外的计划,因为 Rails3 的正式版还没有发布,所以慢慢修正即可,但是这两天逐渐的变成了主要工作,不仅更新了 Rails 和 Ruby,把编辑器也换了。一写起代码就一发不可收拾啊……

以下记录一下更新过程中遇到的问题:

Ruby1.9

虽说 Rails3 在 Ruby1.8.7 上也可以工作,但是既然这次有空更新就把 Ruby 也顺便一起升级了吧~ 通过 rvm 可以很方便的安装多个 Ruby 版本以及在它们中间自由切换,大大方便了测试~

incompatible character encodings: UTF-8 and ASCII-8BIT

恐怕升级到 Ruby 1.9 之后遇到最多的问题就是这个编码问题了。Ruby 1.9 中增加了字符编码的支持,但是这个编码支持的方式有些奇特,不像 Python 那样内部统一为 UTF-8,而是给每个字符对象一个 encoding 属性,通过这个属性来处理字符的显示与转换问题。

虽然这样很灵活,但是如果两个 encoding 属性不同的字符串对象进行相加或者拼接,就会 raise 一个 incompatible character encodings 的异常。而目前有些 Ruby 的库(比如 mysql adapter)还不能正确设置这个 encoding 属性,所以就会出现这种问题了。

目前解决的办法就是用 force_encoding('UTF-8') 强制转换,或者看看库有没有更新(比如可以把 mysql 换成 mysql2),网上的资料也不少,可以参考这里这里

除此之外,似乎无论字符串对象当前的 encoding 是什么,序列化后再取出后的 encoding 就变成了 ‘ASCII-8BIT’,所以取出之后还要强制转换一下。

感觉虽然 Ruby1.9 支持了多字符编码,但是却把所有的编码细节都扔给程序员来处理,相比 1.8 似乎更折腾了……

ImageMagick Segment Fault

在 Ruby1.9 下,可以正常编译 ImageMagick,也可以正常安装 RMagick 这个 gem,但是在使用 RMagick 库生成图片的时候却出现 Segment Fault,原因是 ImageMagick 的 OpenMP 和 MacOS 冲突,去掉 ImageMagick 的 OpenMP 支持重新编译一下就可以了,详细过程可以参照这里

Rails3.0

相比之下,Rails3 的迁移工作就简单的多,只要按照 Rails3 的新特性介绍,把旧的写法改一下就可以了,网上的资料一搜一大堆,railscast 上也有不错的视频教程~

额外的插件目录

众所周知 Rails 默认的插件目录是 vendor/plugins,在 Rails2.x 中,如果把插件放到 vendor/plugins 下的子目录中,插件也可以正常加载,这样就可以方便的整理插件(比如把 Chito 的插件放到 vendor/plugins/chito_plugins 目录下),但是到了 Rails3 这样不行了。

看了下文档,有 plugins_path 这个 config 参数,但是设置之后无效,看了下 Rails 的源代码,发现插件目录在 paths.vendor.plugins 中设置,所以在设置中加入:

config.paths.vendor.plugins("vendor/plugins", "vendor/plugins/chito_plugins")

就可以载入特定目录下的插件了~

Rails.root  "+"

Rails3 中 RAILS_ROOT RAILS_ENV 这些常量已经消失,转变为比较美观的 Rails.root 和 Rails.env 这样的形式。

不过 Rails.root 不再是个字符串,而是个 Pathname 的对象,大部分情况下和字符串没有区别,比如可以像原来那样拼接:

"#{Rails.root}/public/images"

但是用相加(+)这个方法的话会出现一些问题:

> Rails.root + "public"
=> #<Pathname:/Users/galeki/works/chito/public>

> Rails.root + "/public"
=> #<Pathname:/public> 

就是说如果和一个绝对路径的字符串相加的话,结果直接就变成绝对路径了,所以还是用 #{ } 来组合目录吧,用 File.join 也是不错的选择。

CKEditor

这次主要的时间都花在更新这个编辑器上了。相比 FCKeditor,CKEditor 要快速和好用得多。

其实 CKEditor 早就有了,我也早就想把 FCKeditor 换掉了,但是一直因为种种理由没有换。因为不仅仅是把新编辑器的 javascript 文件加到网页里就行了,还要重写 3 个插件(<!--more-->,高亮代码,TeX 公式)以及文件上传和管理系统,一直都觉得这是个大工程,迟迟都没有动手。

后来终于决定动手,却发现官方的开发文档中还没有 Plugins 的部分,于是暂时放弃了。

后来看了一下内置插件的代码,也不是很复杂,而且 <!--more--> 插件可以直接借用 CKEditor for wordpresss 中的,所以插件的问题解决了。但是发现还没有比较好的 CKEditor for Rails 插件,如果要自己写的话,实在是太折腾,于是又暂时放弃了。

前两天忽然想到,Chito 已经有了一个文件管理界面,为毛不把这个文件管理器集成到编辑器里呢?

实践了一下,没想到如此的简单!直接在编辑器中显示文件管理器的局部模板就行了,然后在模板里面只需要判断如果是编辑器请求的就加入一些和编辑器交互的 js 内容,然后就完成了!效果比原来的好多了: 

原来竟然没有想到这么简单的方式……冏

接下来的工作

目前 Chito 更新的大部分工作已经搞定了,除了几个插件的诡异 bug 还没有解决,解决之后就可以等待 Rails3 正式 Release,然后就可以正式上线了~

 


话说最近起床的时间越来越晚,又有恢复至颠倒黑白作息时间的趋势,还是夜里写代码比较爽啊~ :D

可以把 Anti-XSS 的功能交给浏览器吗?

所谓的 XSS 就是用户提交的内容中含有恶意的 js 代码,之后这段代码又被展现在特定的地方被执行了,所以就可以在浏览者当前的会话下执行 js 内容,比如偷取 cookie 或者发送 ajax 请求什么的。

虽然可以全部将用户提交的内容转义(比如 CGI.escape 或 Rails 中的 h 方法),但是很多时候还是希望接收用户提供的 html 代码,来展示样式、图片、连接之类。

这样就只好用白名单(比如 Rails 里面的 sanitize),过滤掉不想要的标签和属性,比如 <script> 标签,还有 onfocus onload 这些属性,但是这样消耗资源不说,还是不能解决问题。因为在一些其他的地方还是可以出发 js 的执行,比如 src"javascript:xxx" 这种形式,还有诸多意想不到的混乱式写法都可以触发 js。

这次升级至 Rails 2.3.8,切换到 Erubis,默认转义 html 内容和那个 html_safe 的方法的确可以避免一些无意间把 html 内容展示出来的情况,但是对那种就是要展示用户 html 代码的情况没有帮助。

于是开始想为啥浏览器不提供这种功能,例如提供个 <scruptoff> 和 <scripton> 两个标签,在 <scriptoff> 之后不做任何 js 解析,除非再被 <scripton>:

<scriptoff />

...用户内容

<scripton />

这样还是没有解决问题,因为用户也可以输入 <scripton /> 把 js 打开,那么可以给标签指定一个随机 key,只有 key 相同,才可以再次打开或关闭 js:

<scriptoff key="8C5D24E"/>

...用户内容

<scripton key="8C5D24E"/>

用 Rails 的 Helper 很容易生成这类标签,用户输入的内容却不能猜出 key 是什么所以不能打开 js。

这样就省事多了。不过应该还有什么没考虑到的情况吧……

 

Mac 下搭建 Rails 环境

终于收到 iMac 了 ,第一件事情当然就是搭建 Rails 开发环境。

最新的 Mac OS X 里面已经默认装好了 gem 和 Rails 环境,所以啥也不用做。

要做的只是一些周边软件,比如 MySQL、Fcgi、RMagick、Lighttpd 等等。

MySQL、Fcgi 的安装,可以参见:http://hivelogic.com/articles/ruby_rails_lighttpd_mysql_tiger 

之后,安装 MacPorts,参见:Installing MacPorts

装好了 MacPorts 就好办了,之后用 port 命令安装 Lighttpd 和 RMagick:

安装 Lighttpd,参见:http://gonefish.cn/?p=521

安装 RMagick,参加:http://rmagick.rubyforge.org/install-osx.html

Mac OS X 里面默认装好了 vim,如果需要 gui 前端,可以用 MacVim,参见:http://code.google.com/p/macvim/

搞定。虽然不如 Gentoo 下方便,但是比 Fedora 下舒服一些~

@font-face 很不错

CSS3 的 @font-face 是一大亮点,随着 Firefox 升级到了 3.5,也可以体验这个东西了。

这 @font-face 是干啥的? 简单来说,就是可以在网页中自由显示字体了~

早期的 CSS 虽然可以指定字体名称,但是前提是观看者的电脑商必须安装了这款字体才行,所以基本没啥用。

现在有了 @font-face,不再会有这个限制,可以轻松更改网页上的字体,比如本 Blog 的标题:

如果你看到的不是图片中的样子的话,那赶紧升级浏览器吧~

添加的CSS 如下:

@font-face{
  font-family: "RoughDraft";
  src: url("http://galeki.is-programmer.com/user_files/galeki/File/rough_draft.ttf");
}

h1#logo a{
  font-family: "RoughDraft", serif;
  font-size:50px;
}

前四行的 @font-face 部分就是关键,使用 font-family 给这个字体起一个名字,用 src 给出这个字体文件所在的位置,就 OK 了。

之后,就可以在 CSS 中用刚才定义的名字来引用这个字体了~

浏览器会自动下载 @font-face 里 src 中的字体,并正确显示出来,这样就可以使用漂亮的字体来设计网页了,再也不用担心别人看不到。

英文字体比较适合这样做,一款英文字体也就几十 K 的大小,中文字体就有点寒了。

顺便试试:

 

http://www.galeki.net

http://www.galeki.net

 

看不到上面的去面壁,哈哈。

以后 html 文档也会活泼很多吧~

详细一点的介绍可以看 https://developer.mozilla.org/index.php?title=En/CSS/%40font-face

更加详细的可以直接看 http://www.w3.org/TR/css3-webfonts/#font-descriptions

SyntaxHighlighter 挺不错

原来经常在使用 Wordpress 的 blog 上看到这个 js 的代码高亮工具,效果确实不错,但是还是没有让我动心。

最近发现 SyntaxHighlighter 2.0 出来了,不仅样式比原来漂亮多了,也支持了 Theme,所以准备移植到 Chito 上来。

原来插件里的“自动代码高亮”将被移除,换成这个 SyntaxHighlighter,由于都是用 <pre> 标签来包围要高亮的代码,所以只要稍加修改就可以使用 SyntaxHighlighter 了。

编辑器中也会加入 SyntaxHighlighter 工具栏。

虽然默认支持的语言不是很多,也没法在编辑器中即时看到高亮效果,但是使用 SyntaxHighlighter 的好处就是可以获得方便的查看、拷贝代码的能力,另外也不会在文章中留下很多高亮样式的代码,便于以后将文章转换成其他格式。