Today's the day

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

RubyConf 归来

嗯,本来依照一贯的宅男风格,是肯定懒得参与这些活动的,但是这次难得在上海,Matz 又来,前阵子又下定决心不能不喜欢的事情就不去,而且天气难得的凉快,就出发了~

一共 9 个演讲,涉及 Rails 部署经验、Rails 技巧、和 Ruby 企业开发等等,收获颇丰。不过 Matz 没讲啥。

本以为下午肯定撑不住提前闪人,最后还是兴致勃勃的听完了。

最后的提问环节,台下不少问题是关于某两个模式的优劣,某两种语言的优劣,某两种思想的优劣……嘉宾大牛们的答案是啥? 那就是该用什么用什么~

而且很高兴的知道,不少网站都是不同技术的融合体,比如页面用 Rails、全文检索用 Java、邮件用 PHP、生成 PDF 用 C,充分说明了,方式真的无所谓

又换回了 File Based Session Stroe

早期 Rails 一直是默认用文件保存 session,原来 blog 也用这个,就是 session 文件得经常清一下。

后来换成了 session 数据库表,其实也差不多,定期得清下表。 不过有两次 session 表损坏,导致程序出错,和频繁的更新 session 表有一定的关系。

最后就是目前普遍的那种 cookie session 了,忘了 Rails 2 点几开始有这个的了,这个东西不错,没有那么多乱七八糟的事情。

不过最近大家反应 blog 出现了一些奇怪的现象,比如有的时候登录成功后,发现并没有登录上;评论点击发送后,没有发送成功,也没有错误消息;保存文章也出现了这种情况。

仔细想想,发现这些情况都是从上次升级 Chito 1.1.0 之后出现的,而在 Chito 1.1.0 中才开始用的 cookie session。本地测试也遇到两次评论发送没反应的现象,清楚下浏览器的 cookie 或者刷新下页面就好了。

具体原因不明,大致感觉是保存在浏览器 cookie 中的 session 没有发送成功,然后在服务器那边 Invalid Authenticity Token 了。

随机出现,没有规律,这个比较郁闷。

现在只好又换回了 file session,还是这个放心啊……

啥个原因捏  

Javascript 相对时间

因为相对时间是随时变化的,所以如果在页面里面直接生成相对时间的文本,那么就没法缓存成静态文件,不过用 js 可以解决这个问题。

首先,在页面里面还是用 rails 生成一般的时间,这样即使关掉了 js,也可以显示正常的时间。并套个 span:

<span class="relative_time"><%= @post.created_at %></span>

然后就是 js 的事情了,找出这些 span,并且算出相对时间替换进去:

function show_relative_time(local){
    var times = $$('span.relative_time');
    var now = new Date();
    for(i=0;i<times.length;i++){
        var time = times[i];
        var t = new Date(time.innerHTML);
        var diff = now - t;
        time.innerHTML = relative_time_text(Math.floor(Math.abs(diff/1000/60)), local);
    }
}

其中的 relative_time_text 接收分钟为参数,返回相对时间的文本:

function relative_time_text(m, local){
    var text;
    if(!rtlang[local])
        local = 'en';

    if(m <= 1)
        text = rtlang[local]['less than a minute'];
    else if(m > 1 && m <= 45)
        text = m + rtlang[local][' minutes'];
    else if(m > 45 && m <= 90)
        text = rtlang[local]['about 1 hour'];
    else if(m > 90 && m <= 1440)
        text = Math.round(m/60) + rtlang[local][' hour'];
    else if(m > 1440 && m <= 2880)
        text = rtlang[local]['1 day'];
    else if(m > 2880 && m <= 43200)
        text = Math.round(m/1440)+ rtlang[local][' days'];
    else if(m > 43200 && m <= 86400)
        text = rtlang[local]['about 1 month'];
    else if(m > 86400 && m <= 525600)
        text = Math.round(m/43200) + rtlang[local][' months'];
    else if(m > 525600 && m <= 1051200)
        text = rtlang[local]['about 1 year'];
    else
        text = Math.round(m/525600) + rtlang[local][' years'];

    return text + rtlang[local][' ago'];
}

基本就是照着 rails 里那函数改的,rtlang 就是个 hash,保存多语言信息:

var rtlang = {'zh_CN':{}, 'en':{}};
rtlang['en']['less than a minute'] = 'less than a minute';
rtlang['en'][' minutes'] = ' minutes';
rtlang['en']['about 1 hour'] = 'about 1 hour';
rtlang['en'][' hour'] = ' hour';
rtlang['en']['1 day'] = '1 day';
rtlang['en'][' days'] = ' days';
rtlang['en']['about 1 month'] = 'about 1 month';
rtlang['en'][' months'] = ' months';
rtlang['en']['about 1 year'] = 'about 1 year';
rtlang['en'][' years'] = ' years';
rtlang['en'][' ago'] = ' ago';


rtlang['zh_CN']['less than a minute'] = '小于一分钟';
rtlang['zh_CN'][' minutes'] = ' 分钟';
rtlang['zh_CN']['about 1 hour'] = '大约 1 小时';
rtlang['zh_CN'][' hour'] = ' 小时';
rtlang['zh_CN']['1 day'] = '1 天';
rtlang['zh_CN'][' days'] = ' 天';
rtlang['zh_CN']['about 1 month'] = '大约 1 个月';
rtlang['zh_CN'][' months'] = ' 个月';
rtlang['zh_CN']['about 1 year'] = '大约 1 年';
rtlang['zh_CN'][' years'] = ' 年';
rtlang['zh_CN'][' ago'] = ' 前';

这样如果要显示中文的相对时间,那么只需在页面尾部加上:

<script type="text/javascript">
     show_relative_time("zh_CN");
</script>

就搞定了~

又犯了个愚蠢的错误

昨天给 Chito 加入了 Trackback 的功能,之后用他给本地的另一片文章发送 Trackback 做测试。

结果每次发送 Trackback 之后都是超时错误,但是 Trackback 又确实成功的发送了过去,比较奇怪

折腾了一个晚上,未果……最后到了锻炼的时间,出去活动的时候忽然顿悟,回来打开 lighttpd 的配置文件,果然发现:

...
"min-procs" => 1,
"max-procs" => 1,
...

囧,只开了一个服务器进程,自己把自己卡住了……

我的一个晚上啊……

is-Programmer 升级到 Chito 1.0.7

断断续续折腾了很久,其实主要的工作是把 Chito  REST 化了。

更新如下:

核心

  • 基于 Rails 2.1。
  • REST 化。
  • 编辑器升级到 FCKEditor 2.6.3。

功能

  • 文章底栏实现,可以在文章下面显示可选内容。
  • 文章、评论多选删除。
  • 通过编辑器下的 “发布为页面” 按钮,可以将新文章或者已存在的文章发布为页面,也可以将已存在的页面转换为普通文章。
  • Blog 评论 RSS 和 留言 RSS, 分别为 /comments.rss 和 /messages.rss。
  • 繁体中文语言支持。 ( 仅仅是 iconv 的转换  )

修正

  • 保存并继续编辑后显示提示。
  •  解决某些 IE 浏览器下无法从文章编辑界面添加分类的问题。

插件 & 皮肤

  • 文章底栏: 本地相关文章、全局相关文章。
  • iTheme 皮肤。

 

在 is-Programmer 上测试下,没问题就打包发布了~