小站重新装修,欢迎到访。

ketama的一个重要bug

ketama是什么?

C library for consistent hashing, and langauge bindings

至于consistent hasing(一致性哈希),不了解的可以参考这里

ketama是去年读这篇文章时看到的,应该是Richard Jones还在last.fm工作时写的,不过他现在已经离开了。今天莫名其妙地突然想起了它,所以特地又去搜了下,找到后顺便读了下源码。ketama最初是一个c库和一个PHP的封装,不过后来作者添加了多种其他语言的实现,还感慨Java集合类让实现简化了很多(实际上是用了SortedMap的API,我还读过一个常见的memcached java客户端,具体哪个忘了,也是用了SortedMap)。源码在github上可以看到。

问题就出在Java实现上。当我看到源码里声明了全局的java.security.MessageDigest时,意识到这里可能有并发问题。起初我还不太相信,于是去google了一把,网上似乎是说MessageDigest不是线程安全的,但我最后还是自己写了个简单的多线程程序测试以求最终确认,最后终于向自己证实确实是RJ同学出了bug。然后果断fork然后fix,最后向作者提交了patch,坐等处理。

我的patch很简单,将成员变量去掉,在函数中即时创建MessageDigest对象。为此我写了个简单的benchmark,发现MessageDigest.getInstance(String)方法在我的MBP MD313上一次调用耗时不足1ms,相对于网络开销来说基本可以忽略。

最后我去看了下apache-commons-codec库的org.apache.commons.codec.digest.DigestUtils类,发现也是类似的做法,遂放心。

类似的比较容易忽略的还有java.text.SimpleDateFormat,在编写Java类时,同学们一定要审慎对待每一个成员变量,以及其即将面临的运行环境。这其实很烦,这也是我喜欢FP的理由。

我的Emacs

初识emacs还是在大学时代,因为编程比赛获奖而有幸通过面试进入学生在线这个大家庭,从而和大炮、yada等同学相识,跟他们学了很多。据说当时技术部新进小同学的时候,要由一名老成员在不经意间秀一下emacs的操作,刺激一下,不过我实在记不起来何时起开始用emacs,似乎是当年和大炮一起用PHP写网站的时候看他用,然后被王垠那篇神作《Emacs是一种信仰!世界最强编辑器介绍》感动之后开始学习的吧。后来毕业后不久听说那帮新来的熊孩子居然把工作室的Linux服务器全部都装成WindowsServer了,真是败家败业!Linux都不用了,想必也没人再去学emacs了。再后来,听说yada因为左手需要空出来端咖啡竟也转而使用VI了,毕竟emacs的key-binding实在是太变态了。

扯远了。

其实我依然是一个emacs初级用户,现在基本只用emacs做两件事:

  • 写clojure

  • 写markdown(即写博客)

早些时候我已经把我的Mac的一些配置都备份在github里了,这里是我emacs的配置,需要的可以参考下,包含如下配置:

  • erlang mode
  • clojure mode相关的一坨,包括nrepl
  • 自动补全
  • 显行号,用的是linum
  • deep-blue主题,我最喜欢的emacs主题
  • 隐藏鸡肋一般存在的工具栏
  • 隐藏滚动条
  • 启动后自动最大化
  • markdown mode,用来写博客
  • yasnippet,神器
  • rainbow delimiters,彩色括号,特别是对于clojure这种lisp方言,效果参考下图
  • ido和lusty explorer,简化mini buffer里的命令输入
  • 显时间
  • yes/no简化成y/n
  • yaml mode
  • window numbering,给每个buffer定义数字编号,再也不用C-x o了
  • git-emacs,不太常用,我还是习惯terminal里用git

后面几个配置如果你在github没看到的话,那是我还没push上去。

最后附上我的emacs的真容。

Emacs

博主是一个不是很聪明的码农。完美主义者,强迫症中期。这里会记录一些回忆和点滴,以博为镜。

武器库:

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-SA 3.0  授权发布。最后生成于 2017-02-20.