下周的两个活动

下周准备参加两个活动. 一个是五月二十一号在上海的Ruby Conference China 2009. 终于有人走出这第一步了. 很佩服javaeye和Shanghai Rails Group的勇气. 虽然我们并没有什么在技术性会议上做宣传的需求, 也没有太多的钱, 但还是希望能和大会组织者一起, 为国内Ruby社区尽一点点力. Louie和我会在二十号到达上海, 二十二号返回. 其实比起Matz, 更想见见南方ruby圈子里的朋友. 希望到时候可以见到大家. 第二个活动是beta技术沙龙第四期[iPhone开发入门]. beta技术沙龙是一个在奇遇花园每月一次的聚会,每次会有一个主题,几个主讲,但更主要的是大家互相之间的交流. 这次的主题是iPhone开发, 银杏的Tinyfool和我主持这次活动, 我们各作一个二十分钟左右的演讲, 然后大家可以一起聊一聊, 有什么感兴趣或者疑惑的问题可以现场切磋.

Goo – Ruby Gem文档浏览器

一般查看ruby gem 文档都会开一个gem server ,但多少有些不便,每次都要运行一个gem server 不说,浏览器本身也身兼数职,又要测试,又要收mail,又要停车,又要看文档,切换起来越来越不方便。索性写了一个ruby gem 文档浏览器 – Goo . 另一只龙。 主要功能就是查看gem 文档。除了查看文档,查看gem的代码也是了解gem必不可少的过程,所以也集成了在Finder和TextMate里打开gem的功能。虽然我在shell里也加了自动匹配打开gem的脚本,不过看着文档,一点就看到代码,还是比在Terminal和Safari之间切来切去要方便一些。 功能不多,源代码也非常之少,LOC只有两百多行,从决定动手到写完花了不到两天的时间。Cocao/Object-C也是开发效率相当高的组合了。源码分享在github。 支持Mac OS X 10.5,或许rubygems的版本也需要>1.2.0。目前版本0.2,可以到这里下载。

memcached使用中的竞争条件

在通过ruby的memcached-client使用memcached的过程中,遇到一些问题,数据更新时清除了缓存,缓存重建的时候却仍然是老数据,在并发密集的情况下更容易出现。研究了一下,类似这样典型的memcache使用方法: Controller里: … def foo_action … unless d = Cache.get(“key”) d = Data.find(…) Cache.put(“key”, d) end … end … Model里 … def after_save … Cache.delete(“key”) … end … 存在下面的竞争条件(race condition): 存在两个rails应用实例(比如两个并发的mongrel)A和B, memcached清除过期缓存c。 实例A运行foo_action,发现缓存c不存在(Cache.get失败),读取数据d。 实例B更新数据d’,清除过期缓存c(Cache.delete)。 实例A保存缓存c(Cache.put),其中的数据是老数据d。 这时,再有数据访问缓存c的时候,c已经存在,到下一次缓存c被清除前,这个缓存都是存在问题的过期数据。不难看出,即使将第三步中的清除过期缓存c改成更新缓存c,c仍然会被实例A在第四步覆盖。 其实,memcached为了避免这种竞争条件,提供了一些便利的原子操作(参看memcached protocol): “add” means “store this data, but only if the server *doesn’t* already hold data for this key”. Read more about memcached使用中的竞争条件[…]