Friday, November 30, 2007

从头搭建 rails on emacs 开发环境

最近准备用 rails 做新的产品,没有熟悉的 ruby 开发环境,索性这次狠下心来,用 emacs。

安装设定 emacs

Ubuntu gusty 下安装 emacs

sudo aptitude install emacs

安装 ruby mode

sudo aptitude install ruby-elisp

安装 emacs-rails

mkdir ~/.emacs.d/
cd  ~/.emacs.d/
svn co svn://rubyforge.org/var/svn/emacs-rails/trunk rails

下载需要的库文件

cd  ~/.emacs.d/
mkdir libs
cd libs
wget http://www.kazmier.com/computer/snippet.el
wget -O find-recursive.el http://www.webweavertech.com/ovidiu/emacs/find-recursive.txt
snapshot设定代码到 ~/.emacs
; rails mode
(setq load-path (cons "~/.emacs.d/rails" load-path))
(setq load-path (cons "~/.emacs.d/libs" load-path))
(require 'rails)
(require 'find-recursive)
(require 'snippet)

几个有用的 mode

sudo aptitude install ecb
sudo aptitude install emacs-goodies-el

设定 emacs 颜色方案 ubuntu 的 emacs-goodies-el 包已经提供了 60 多种颜色方案,不过都不是很能让我满意,-__- 这里用了 hober2 的颜色方案。

cd ~/.emacs.d/
mkdir color-scheme
cd color-scheme
wget http://edward.oconnor.cx/elisp/color-theme-hober2.el
增加设定代码到 ~/.emacs
; theme
(setq load-path (cons "~/.emacs.d/color-themes" load-path))
(require 'color-theme-hober2)
(color-theme-hober2)

OK, rails on emacs 环境已经完成,进入 rails project 目录,打开一个文件试试,rails mode 已经默认加载了。唯一不还不满意的是字体,看了一把 emacs 文档 Defining fontset 节,发现 emacs 2.2 包括之前的版本字体设定通过 ~/.Xresource 文件,并不支持 Xft freetype,好在 SVN 的 emacs 已经支持 unicode 和 Xft freetype,并 有人为 ubuntu 打了包。 添加下面的设定到 /etc/apt/source.list

# emacs snapshot
deb http://ppa.launchpad.net/avassalotti/ubuntu gutsy main
sudo apt-get update
sudo aptitude install emacs-snapshot-gtk
注意,PPA 仓库中的 deb 包密钥并未包含在 ubutnu keyring 中,安装的时候需要手工确认。 增加设定代码到 ~/.emacs
(set-default-font "DejaVu Sans Mono-10")
(set-fontset-font (frame-parameter nil 'font)
         'unicode
         '("DejaVu Sans Mono-10" . "unicode-bmp"))
(set-fontset-font (frame-parameter nil 'font)
             'han
         '("SimSun" . "unicode-bmp"))

参考资料:

Friday, November 16, 2007

公司门户改版手记

day 1

公司网站改版,索性扔掉 drupal 改用 symfony,维护起来会方便很多。

试试 bleeging edge trunk 先,大体上是一致的,虽然半年没用 symfony,遇到问题参考 symfony/docs 和以前代码即可, 未更新到 symfony 1.1 的 plugin 直接 svn export 过来,大多可以正常使用,一切设定停当,移植 utilities 和 basic class,卡壳在 propel,symfony 1.1 将 propel 拆分出去为单独的 plugin (which is good),从现在看来还不稳定,并且实际使用的话,需要 compat 10 layer,旧的 helper 系统还未移植过去。1.1 的 widget、validator、event 等都还没有文档。时间紧张,没有时间看代码 debug(还记得 symfony 1.0 beta 时候花费很多时间找 symfony 的 bug),所以做出决定,放弃 symfony 1.1!

回到 1.0 stable,再熟悉不过了,搭建基本系统,配置数据库,创建 frontend app,安装 plugin,试验 sfGuardPluin 一切停当之后,发现非常之 lack of feature! 没有 editor profile,request password,RBAC 对公司门户来说是杀鸡用牛刀,放弃 sfGuardPluin。

从以前项目移植 signup/login/user 等,一切顺利。

新的网站需要 blog 系统,sfSimpleBlogPlugin 功能简单,本这够用就好的原则,安装测试,buggy,propel-build-model task 失败(sfGuardPlugin 正常),最致命的是无法定制 module 名称,http://blah.com/sfSimpleBlog 这样的 URL 对我来说是无法接受的,放弃 sfSimpleBlogPlugin。

两次使用 plugin module 的失败经验让我确信不用再看 sfSimpleCMSPlugin 了,新闻栏目本来需求就很简单。

try, try, try,try 掉宝贵的一天时间。明天任务很重了。

day 2

创建 backend app,移植 layout,menu system。

创建 blog 数据库 schema,用以前写的 Comment plugin scaffolding 出基本的带评论功能的 frontend blog module。CommentHelp 是 ajax based,对这个项目来说太复杂了,注释掉 templates 中用于 display comment 部分的代码,放到后面再考虑。

使用 propel-init-admin 创建 blog post, blog post comment 后台模块,定制 generator.yml,增加 TinyMCE 编辑器, 导入 sfMediaLibaryPlugin 提供图片媒体支持,搞定 blog 后台部分。

news schema,后台模块;ask schema,系统后台。fixture 功能还是比较若,手工写代码初始化测试数据。

day 3

移植分页系统,更新分页 helper,开始 blog 前台部分,列表需要现实博客文章 summary,暂时去除 html tag 好了,抓出一段完整的 html tag 的话,估计会比较浪费时间,之前使用 drupal,这个问题就让我非常不爽。

blog 的显示页面,URL 使用 permalink,格式为 blog/:year/:month/:day/:permalink,permalink 为去除特殊字符后的 title,对 SEO 稍有好处。

新闻、问题前台。about 模块,添加 routing 保证 URL 和原系统一致。

首页,CSS fixing。

用户个人信息设置,找回密码功能。

testing, bug fixing。

上线。

day 4

使用 sfSugarCRMPlugin 模块处理 lead caputures。

使用 awstats 分析日志,找出 Error 404。调整 routing,保证旧系统链接可用。

SEO,添加 meta 信息,调整系统 title。

添加 RSS blog 订阅功能。

We are done!

Wednesday, November 14, 2007

文件名转码工具 convmv

$convmv -f gbk -t utf8 *
$convmv -f gbk -t utf8 --notest *
省得每次都得 google, @_@

Monday, November 12, 2007

转移 SVN 仓库下单个目录

有个项目需要转移到另外一个 SVN 仓库,查了 SVN 手册未找到仓库部分转移的办法,跑去 Freenode IRC #svn 频道问人,有人回答: “I haven't done it, but your best bet is to mix 'svnadmin dump' and 'svnadmin load' and 'svndumpfilter' in some way”。我担心有 revision number conflict 的问题,不过还是试试先好了。

假设需要导出的项目为 legacy repository 下的 blah。

$svnadmin dump /media/work/legacy/svn/repos > dumpfile
$cat dumpfile | svndumpfilter include blah > blah-dumpfile
$svnadmin load /var/lib/svn 

还好,两个 repository revision numbers 差距很大,import 很顺利。 cehckout 出来时候检查历史等,一切正常,^^