博主是一个不是很聪明的码农。完美主义者,强迫症中期。这里会记录一些回忆和点滴,以博为镜。
武器库:
贡献了一篇译文。
Learn X in Y minutes
where X=clojure
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还是在大学时代,因为编程比赛获奖而有幸通过面试进入学生在线这个大家庭,从而和大炮、yada等同学相识,跟他们学了很多。据说当时技术部新进小同学的时候,要由一名老成员在不经意间秀一下emacs的操作,刺激一下,不过我实在记不起来何时起开始用emacs,似乎是当年和大炮一起用PHP写网站的时候看他用,然后被王垠那篇神作《Emacs是一种信仰!世界最强编辑器介绍》感动之后开始学习的吧。后来毕业后不久听说那帮新来的熊孩子居然把工作室的Linux服务器全部都装成WindowsServer了,真是败家败业!Linux都不用了,想必也没人再去学emacs了。再后来,听说yada因为左手需要空出来端咖啡竟也转而使用VI了,毕竟emacs的key-binding实在是太变态了。
扯远了。
其实我依然是一个emacs初级用户,现在基本只用emacs做两件事:
写clojure
写markdown(即写博客)
早些时候我已经把我的Mac的一些配置都备份在github里了,这里是我emacs的配置,需要的可以参考下,包含如下配置:
后面几个配置如果你在github没看到的话,那是我还没push上去。
最后附上我的emacs的真容。