Today's the day

思考,自知,耐心

原来有个 reset_session

之前在用户登出的时候,都手动小心的清除登录用户的 session,今天才发现有 reset_session 这个方法,一口气把当前 session 对象的内容全部清除,又方便又安全~

reset_session  -  Resets the session by clearing out all the objects stored within and initializing a new session object. 

不光用户登出时要清空 session,用户登入之前,也要清除 session,免除当前 session 数据,和恶意伪造 session 数据的影响:

  1. def login
  2.     ...
  3.     if user.try_to_login
  4.         reset_session
  5.         session[:user_id] = user.id
  6.     ...
  7.  
  8. def logout
  9.     reset_session
  10.     redirect_to 'xxx'
  11. end

 

 

接着努力

不知不觉就快 5 月了,天气都热了起来……

Chito 终于发布了,这也是最近最大的成果了,接下来暂停大的改动,专心修正 bug 和不足,最多写两个插件。

顺便趁着这个机会补一下测试相关的知识,一直以来都忽略了这个内容。

当然,主要的精力要往 Gtk+ 编程上迁移,准备下个星期把 Gtk+ 浏览一遍 ( 完美的情况下 ),顺带深入学习一下 C。写桌面程序才是我的梦想~

另外前两天 lyanry 向我介绍了 cairo,导致我现在对这个东西相当感兴趣,看完 Gtk+ 就去了解一下~

就这样了,希望 5 月不要过得那么快……

Chitolog.org -- Chito 官方网站

Chito 的官方网站开始运行啦~

http://www.chitolog.org

以后 Chito 相关的更新、最新下载,还有皮肤和插件,都放在这个官方网站上去。

作为一年学习 Rails 的成果,Chito 能发展到今天我深感欣慰,当然这只是个开始,Chito 今后会作为一个独立的 Blog 软件继续增强下去~

感谢大家的意见和支持~

第一个 Chito 版本释出

Chito 1.0.5 beta 释出~

相比上次的 demo ,修正了不少 bug,而且加上了多语言的支持,现在只有中文简体和英文两种语言,并根据浏览器语言偏好来判定。

依然放在 Google Code 上:

http://chito.googlecode.com/files/chito.tar.bz2 下载请到 http://www.chitolog.org

此版去掉了一些插件和皮肤,准备以后拿出来单独下载。

欢迎反馈错误报告~

安装方法:

  1. 下载、解压
  2. 创建数据库
  3. 编辑 config/database.yml 修改数据库名称和密码
  4. rake db:migrate RAILS_ENV=production
  5. 部署你的 Web 服务器

如果你想支持多用户功能的话,请用域名访问你的 Blog。


本想注册个 chito.org,没想到被人注掉了,看来我只好 chito-blog.org 之类的了……

 

编辑 gettext 的 po 文件

下午把 Chito 的中文 po 文件翻译完毕,用的是 poEdit

poEdit 的优点就是足够小巧和简单,如果你只需要翻译,那么 poEdit 足够了,而且 poEdit 有 Win 版。就是快捷键有点不方便,切换到下一个翻译条目有点麻烦。

用 poEdit 把文件翻译完,才发现 Linux 下还有一些更加强大的 po 编辑软件,比如这个 Gtranslator

多语言顺利进行中

顺利的把语言信息通过 Gettext 提取了出去,完全的体力活,干得非常郁闷……

另外发现自己英文实在是太烂了,“文章数量” 翻译成 “Article number”……   不过我相信大家的智商,应该能看懂我要表达什么。

嗯嗯,看上去还挺像样的~

麻烦的皮肤问题

Chito 的皮肤和一般的 Blog 皮肤一样,都包含了模板 ( 也就是 rhtml 文件) ,还有就是 CSS 和图像这些静态文件。

众所周知,Rails 的模板文件一般在 app/views 目录下,静态文件要放在 public 下,不过一个皮肤是一个整体,总不能让别人每次下载一个皮肤回来,就要把模板和静态文件拷贝到不同的位置。

Typo 的实现方法倒是比较有趣,模板和静态文件都放在 public 之外,找不到文件的请求会转向 ThemeController 上,然后再把请求的文件拷贝到 public 目录下,这样下次请求就会找到了。不过总觉得这样有点小题大作,与其这样,还不如建个 rake 任务,运行一下就自动把 theme 中的静态文件拷贝到 public 目录下,或者 rails 启动的时候,把静态文件一股脑拷过去。

还有一种方法就是干脆把模板文件也放在 public 目录下,缺点就是别人也能看到你的模板内容了,里面如果没有什么敏感信息的话倒是不算问题,但是就算现在没有,也不能保证以后没有,所以这种方法 pass ……

没想到这个问题这么麻烦。

准备用 Ruby-Gettext 国际化 Chito

也算是积攒经验吧,准备把 Chito 国际化。Rails 下的国际化方案有不少,复杂度和功能上都差别很大,可以参考这篇文章 InternationalizationComparison 里面对比了几个 Rails 的国际化方案,看下来还是决定用 Ruby-Gettext

Gettext 是个非常老牌和广泛使用的国际化、本地化实现,文档非常丰富,功能也非常强大,支持的 locales 也很多,po 文件还有专门的跨平台编辑器 poEdit,这样即使非编程人员,也可以用 poEdit 来轻松翻译程序中的文字信息。

Ruby-Gettext 的资料也不少,可以参考下面这两个:

Ruby-GetText-Package HOWTO for Ruby on Rails

Using Gettext To Translate Your Rails Application

中文的可以参考这篇在 IBM Developer Work 上的文章:

Ruby 和 Rails 的国际化与本地化技术

查看可能需要注册,如果你懒得注册,可以去看下面这个在 ruby-lang.org.cn 上转载的:

Rails 的国际化和本地化技术

别看这些文章洋洋洒洒写了那么一大篇,其实用 Ruby-Gettext 国际化 Rails 网站很简单,如果你原来对 Gettext 有一些了解的话,会发现和国际化普通的程序没有什么两样~

现在只是比较担心插件的部分国际化,不知道能不能把语言信息和插件打包在一起,不过现在也不用考虑这么长远,到时候遇到问题再解决就是了~

Chito 小白鼠版

单机版的基本的工作差不多完成了,愿意当小白鼠的可以下这个测试版玩玩~ 

此版就是目前 Chito 目录的一个打包,所以包含所有的插件和皮肤,没有充分测试过各个部分和细节,所以不要拿这一版做实际应用~

放到了 Google Code 上:

http://chito.googlecode.com/files/chito-demo.tar.bz2

安装和其他 Rails 程序完全一样:

  1. 解压
  2. 建立数据库,开发数据库名称是 chito_dev
  3. 修改 database.yml 填上正确的数据库密码
  4. rake db:migrate
  5. ruby script/server
  6. 浏览器访问 http://127.0.0.1:3000

Ruby 中获取目录大小

查了查,Dir 类没有 size 方法,也没找到现成的解决方案,自己动手吧~

当前 Chito 中统计目录大小完全是偷懒的方式

  1. class Dir
  2.     def self.size(dir)
  3.        `du -s #{dir} | awk '{print $1}'`.to_i
  4.     end
  5. end

直接调用 du 这个程序然后把结果转换成数值就可以了,非常方便~  不过要是运行在 Windows 下就不灵了,只好自己写代码统计下:

  1. class Dir
  2.     def self.size(dir)
  3.         sum = 0
  4.         Dir.foreach(dir) do |entry|
  5.            next if entry =~ /^\./
  6.            path = File.join(dir, entry)
  7.            FileTest.directory?(path) ? sum += Dir.size(path) : sum += File.size(path)
  8.         end
  9.         sum
  10.     end
  11. end

不过计算目录大小是个很慢的工作,尤其时文件夹嵌套很深,小文件又很多的时候,缓存一下是很必要的,当新文件上传或者删除设置个 dirty 标记,dirty 标记存在的时候再去重新获取。