Mar 06

Beta 2中更新的内容:

  1. 修正了一个导致crash的bug (#36)
  2. 修正了无法安装到~/Library/Input\ Methods的bug (#30)
  3. 加入了在切换中英文时提交的选项 (#18)
  4. 加入了中文的本地化界面
  5. 将全角半角切换快捷键从Shift+Space改为Alt+Space,避免和Safari的向上翻页键冲突
  6. 提供了安装包,同时支持Mac OS 10.5和10.6,并支持PowerPC系统 (未验证)
  7. 将升级检测和数据文件校验等配置文件迁移到sunpinyin.googlecode.com

欢迎下载试用,SunPinyin-MacOS-2.0.zip。已安装beta 1版本的朋友,无需删除已安装的版本,直接运行安装程序即可。首次安装的朋友请注意,当安装程序进行到“下载数据文件”步骤时,请点击“开始…”按钮下载必要的数据文件(文件较大,可能比较耗时)。

Tagged with:
Mar 05

open-gram项目是由sunpinyin开发团队发起的一个open-source项目,主要是tchaikov同学在drive,主要目标是为中文输入法在内的NLP类项目,提供开放的词表和n-gram频率数据。项目中的代码将以GPLv3发布,数据文件将以creative-common license发布。

open-phrase对于词表和unigram(词频)数据来说,已经做得很好了。但是对于其词库的原始来源,以及生成数据的发布协议,都不是很清晰。(也许这也是ubuntu至今没有收录ibus-pinyin-data包的原因之一?)其仅在项目页面上提到,采用GPLv2协议。如果的确如此,这个协议对于广大软件开发者来说,无疑是过于严苛了。

open-gram将采用cc-cedict的词库(同样以creative-common license发布)为基础,在处理语料时发现的新词也将采用相同的协议,并希望能贡献回cc-cedict。open-gram不仅仅针对简体中文,我们希望将来也能包括繁体中文、甚至中英混合的统计信息。最终提供给大家的包括词表和n-gram频率数据,都会采用文本文件的方式。

tchaikov同学已经发布了一个适用于sunpinyin-2.0的,基于cc-cedict和zh.wikipedia的词库和语言模型,可以在此下载,用以替换sunpinyin-2.0中原有的数据文件。替换之后,可能有些词条会和您的用户词典中有重叠(我们将尽快加入删除用户自造词的功能),而且建议您清除掉history cache文件。

tchaikov同学做了大量艰苦的工作,训练了用于新词发现的CRF模型,手工校对了许多词条及其注音,等等。我们也热切盼望更多朋友的加入!

Updated by tchaikov:

ibus-pinyin-data 现在叫 ibus-pinyin-db-open-phrase,已经进入了 ubuntu 和 debian。license 是 GPLv2。

Tagged with:
Feb 26


(由左到右,分别是我,江疆,薛伟和柴可夫)

柴可夫是SunPinyin项目的主力开发人员之一。这次来京,终于有机会一聚,得以一见Kov同学的真容,让人相见恨晚啊。席间大家相谈甚欢,也讨论了SunPinyin下一步的开发规划,希望我们新的一年做得更好 … 同时也期待Mike同学回国一聚 :)

Tagged with:
Feb 19

Beta 2版本已发布安装包,请参考:sunpinyin-2.0 beta 2 for mac os (10.5+)

过年期间把sunpinyin-2.0的mac porting搞了搞,有一个基本可用的版本了。和前一版相比,2.0加入了双拼、易混淆音、拼音自动纠错、用户词典等新特性。欢迎下载试用: SunPinyin-2.0-beta.zip

下载解压之后,请用下面的步骤进行安装:

  1. $ sudo rm -rf /Library/Input\ Methods/SunPinyin.app
    (
    注意:仅当已安装1.0版本时需要此步骤)
  2. $ sudo mv ~/Downloads/SunPinyin.app /Library/Input\ Methods/
  3. $ for i in {1..10}; do killall -9 SunPinyin; done
    (
    注意:仅适用于升级旧版本,初次安装请重新登录,并在系统的语言设置中选中SunPinyin)

leopard(10.5.x)的用户,可先执行上面前2步,然后下载 SunPinyin-2.0-beta-leopard.zip,解压缩之后,覆盖已安装的snow-leopard的版本:

  • $ sudo cp -r SunPinyin.app /Library/Input\ Methods/

再执行第三步,就可以了。

还有很多易用性的功能还未完善,包括支持用快捷键删除用户自造词、在输入数字后将句点设为英文句点等。希望在下个minor release中加入进来。欢迎大家多提宝贵意见 :)

Tagged with:
Feb 08

家里的D700太沉,加上个24-70/F2.8就接近2公斤的重量了,拍些生活中的小品有点over,而且目标太明显,不利于扫街。要是有一台比较轻便的、画质出色的相机,该有多好啊。莱卡的M8/9就算了,那是富人们的奢侈品。Sigma的DP1/2是不错,就是操控性让人诟病良多,且不能更换镜头。一直关注M4/3机型,终于在年底磨到了老婆的批准。

M4/3的机型主要是松下的GF-1和Olympus的E-P1/2系列,性能和价格都相当。Olympus新发布的E-PL1,虽然价格上估计会便宜一些,不过塑料机身和缩水的操控性能,让我对它提不起兴趣。

在网上查了些资料,对比GF-1和E-P1/2三款机型。貌似松下和奥林巴斯也在玩错位竞争的把戏。松下的GF-1,有机身内闪,背面的LCD像素比E-P1/2要高不少,显示画面比较精细,对焦速度快,20/F1.7的光学防抖套头,也受很多M4/3玩家的推崇。相比之下,E-P1/2好像找不出什么优势,也就是机身操控性方面稍好一些,造型比较复古,有机身防抖。不过,E-P2的VF-2电子取景器,是O的一记杀手锏。144万像素的高分辨率、100%取景视野、1.15倍的放大倍率,对于一个习惯用取景器观景拍摄的人来说,这太有吸引力了。相比之下,GF-1 22万像素的电子取景器(DMW-LVF1),就像是个玩具。也正是由于VF-2的缘故,E-P1也被我排除在外了。E-P2 17/2.8套(带VF-2),比E-P1的同等套机贵了接近1500元左右,不过VF-2还是值这个差价的,淘宝上的单价基本都在1800以上。总之,候选的机型就是GF-1和E-P2了。

到中关村转了转,只有GF-1有货,E-P2问了几家都没货,要么就是报E-P1的价来忽悠我。但是我和老婆比较了一下GF-1和E-P1的外观,可能是机身偏短的原因,GF-1显得有点短胖,而且握持的手感也不好。还是O记的外观比较有型、耐看。而且GF-1套机基本报价在6500左右,加上取景器价格比E-P2套机还要贵了。最后,目标锁定E-P2。给五棵松的锐意打了好几通电话,一直没人接。天色也见晚,也不敢贸然跑过去了,只好作罢。第二天早起,给锐意打电话,得知E-P2仅剩一台17/F2.8套机了,连忙让店家帮我预留,中午吃完饭就杀过去提货。

交钱开箱,映入眼帘的是乌黑色的机身,很有质感。开机玩了两下,操控性和对焦性能,比我的D700还是有差距。不过,真的是很轻巧。后来回到家,又研习了一下说明书,调整了一些转盘和按钮的设置,感觉好多了。E-P2的一些艺术滤镜,还挺有意思的,新增的那个3D滤镜,有点移轴的味道。另外,在网上看到,我的SB-800在手动模式下是可以工作的。只是这么小巧的机身,加上硕大的一个闪光灯,有点头重脚轻,呵呵 …

Tagged with:
Jan 26

CAS(CompareAndSwap),是用来实现lock-free编程的重要手段之一,多数处理器都支持这一原子操作。其用伪码描述如下,

template bool CAS(T* addr, T expected, T value)
{
   if (*addr == expected) {
      *addr = value;
      return true;
   }
   return false;
}

Herb在其一篇文章中提到,看到类如if(variable.compare_exchange(x,y))这样的表达式时, 你应该去习惯将其解读为,“是否我就是那个要把variable从x改为y的线程?”。

使用CAS实现lock-free的一般过程可描述为:

  1. 拷贝目标对象
  2. 对拷贝进行修改
  3. 用CAS对目标对象进行修改,如果失败跳转到#1

你可能觉得这个过程有些眼熟,和C++里异常安全编码的规则有些类似,都是先得到目标对象的一份拷贝,然后对拷贝进行修改,最后通过一个不会抛出异常的swap(),将拷贝和目标对象进行置换。只不过这里多了一个CAS,判断目标对象是否已经被其他线程修改了。如果没有被修改过,则commit;否则,就要重做重试

这个过程有一个很实际的风险,就是人们常说的ABA问题,即在当前线程得到目标对象的拷贝并进行修改时,目标对象可能被另一个线程从A修改到B、进而又从B又修改到A了。解决ABA问题的方法是,为操作的对象加上一个版本号。大部分的处理器都支持CAS2,支持对两个连续的WORD进行比较和交换。对Intel/AMD的x86和x64处理器来说,CAS2分别对应的是8个byte和16个byte。

我一直在想,这个过程有没有一个比较直观、容易让人理解的类比。后来想到,作为程序员的我们,在使用版本管理系统进行合作开发时,其实经常遇到类似的问题。例如,我们可以把团队里的多个成员想象为多个线程,我们可能同时对一个源文件进行修改。作为个人,修改代码并最终提交的过程大概是这个样子的,

  1. 从代码仓库中检出或更新某个源代码文件
  2. 对本地的文件拷贝进行修改
  3. 在提交之前从代码仓库中update一下该文件,如果没有冲突,就可以提交了;否则,就要解决冲突再尝试提交

在步骤iii中,存在冲突的原因是,一定有其他同事(另一个线程)已经对这个文件进行了修改并提交;如果我们把解决冲突的过程描述为,重新拷贝目标源文件,并apply/merge步骤ii中得到的patch,这个过程和前面的那个过程非常接近了。

对于ABA问题,可以想象:另一个同事在我提交之前对文件进行了修改,然后又revert了自己的修改(A->B->A),虽然没有冲突,我们依然可以将步骤iii设想为重新拷贝新版本并apply patch的方式(虽然大多数版本管理工具是根据文件的checksum进行相等性比较的)。

如果在这个时间段,某同事快速不停地对该文件进行修改提交的话,我可能就一直处于“redo-retry”的状态而无法提交自己的代码了。这时,索性我就先把这个修改放到一边,去冲杯咖啡,溜达溜达,然后回来继续尝试。这个就是所谓“back-off”操作了,即如果CAS一直失败,就空闲一会儿,甚至将线程切换出去。

似乎基于CAS的lock-free结构和spin-lock也很相像,不都是一直自旋等待么,不也都是基于乐观性假设么?也对,spin-lock也有可能是用CAS来实现的呢。不过,spin-lock毕竟还是一个锁,因此也就沿袭了锁的一些问题,例如优先级反转、死锁等。而基于CAS的lock-free结构,这不会有这样的问题(虽然运行比较慢的、优先级比较低的线程依然可能被饿死),并且有更好的可伸缩性。

使用CAS实现lock-free的一个类比
Tagged with:
Jan 21

Linked from James’ blog

Don’t understand why it’s THE Penguin came together with Duke …

Tagged with:
Dec 31

今天,终于完成了年底的最后一个build,可以稍稍歇一口气了。

回首2009年,对我影响最大的事,是我离开了工作近6年的Sun公司,加入了汤森.路透。这4个多月来,工作比以前紧张了不少,不过倒也充实。只是对Sunpinyin2开发上的投入是少之又少了,甚感惭愧,希望来年能多贡献些力量。

小小昨天开始发烧,直到今晚还未退烧。虽然去医院诊断是普通感冒,还是很担心他。希望他明天能好起来,给2010年开个好头。:)

最后,祝愿各位朋友,新年快乐 …

Dec 17

要处理好C++构造函数抛出异常,的确是很tricky啊。

如果要分配在堆上,例如 T* p = new T(),则new operator会被异常中断,造成p没有被赋值。在离开构造函数的scope时,首先会析构自己的成员变量,并会递归调用父类的析构函数;不过,自己的析构函数是没有机会执行了,即便它被分配到栈上。唯一值得欣慰的是,为这个对象分配的内存,是会被释放掉的。

因此如果在构造函数中要分配一些资源,并且在执行过程中可能会抛出异常,最好用auto_ptr把它们保护起来。或者干脆不要在构造函数中执行复杂的初始化操作,转而定义一个单独的initialize方法 …

Tagged with:
Dec 10

今天中午接到三里屯Apple Store的电话,说i5的iMac昨晚已经到货。晚上一下班,就急急忙忙跑过去提了,到快10点才回到家。

iMac的Setup真是相当的简洁,只需要一根电源线,电源模块在机器内部。键盘和鼠标也都是蓝牙的。不过我还是比较喜欢有线的那款键盘,因为键盘的两侧有两个USB接口,可以很方便地接U盘等小设备,而不必跑到机箱后面。鼠标的手感还不错,有点沉,还是觉得前代的那款,握在手里更舒服。

屏幕真是惊人的大啊,刚开始还觉得有点头晕,现在已经基本适应了。

后面几天有得玩了,正在下载Xcode 3.2.1 … 不过近期工作很忙,估计周末要加班了 …

Tagged with:
preload preload preload