830 likes | 946 Views
星际译王 - 自由软件介绍. 内容. 1. 个人简介 2. 星际译王软件介绍 3. 技术介绍 4. 开发历史 5. 我开发的一些其他软件 6. 其他兴趣爱好 7. 提问和交流. 本人简介. 胡正,83年出生,湖南岳阳人。 2006年从四川大学毕业。 在大学里开发了星际译王等软件。 曾获中国开源软件竞赛金奖。 对哲学和佛法很爱好,写了一些非正式的书。 目前在红帽Linux公司工作。. 星际译王简介.
E N D
内容 • 1. 个人简介 • 2. 星际译王软件介绍 • 3. 技术介绍 • 4. 开发历史 • 5. 我开发的一些其他软件 • 6. 其他兴趣爱好 • 7. 提问和交流
本人简介 • 胡正,83年出生,湖南岳阳人。 • 2006年从四川大学毕业。 • 在大学里开发了星际译王等软件。 • 曾获中国开源软件竞赛金奖。 • 对哲学和佛法很爱好,写了一些非正式的书。 • 目前在红帽Linux公司工作。
星际译王简介 • 星际译王是一个跨平台(能在Linux下和Windows下运行)的国际化的词典软件,使用C++语言开发,并使用了GTK2库作为图形界面,开放源代码,并遵循GPLv3协议。
功能 • 星际译王功能强大,除基本的即输即查功能外,还有通配符匹配,模糊查询,全文检索,正则表达式匹配,屏幕取词等功能。 • 星际译王3.0版新加了插件系统,网络词典等功能,已经渐趋完善。
词典管理 • 在词典管理对话框中,你可以屏蔽掉不需要的词典,你也可以设置词典查询的顺序。
首选项 • 在首选项窗口里可以进行各种配置。
包含金山词霸词典 • 金山词霸的所有版本的所有词典都可以转换后在星际译王中使用。
星际译王也开发了Babylon词库转换程序。 使用所有Babylon词典
词典下载页面 • 目前星际译王已经有两千多个词典下载,包含各种语言和类型。
安装 • 星际译王安装十分方便,在Linux下提供了RPM包,在Windows下有向导式的安装程序。
跨平台 • 目前星际译王能在Linux, FreeBSD, Solaris, Windows等平台上运行。 • Mac OS X 苹果移植版也已经推出。 • 星际译王还有专门的命令行版本,叫做sdcv。
国际化 • 由于有UTF-8支持,星际译王能支持各种语言。如德语,法语,俄语,日语,阿拉伯语等。 • 星际译王还收集了广泛的词典数据,包含了各种各样的语言。 • 因此星际译王在国外也有很多的用户。目前是在Linux系统下最流行的词典软件。
高效率 • 星际译王自己设计了词典文件格式,访问效率极高,支持数据压缩,扩展性也很好,并使用了稀疏索引技术,使用时的内存消耗很少。
广受欢迎 • 星际译王得到了广大用户的欢迎,目前下载量已达到400万以上,每天下载量在8千左右。项目主页的每日独立IP访问在几万以上。 • 在SourceForge.net的全球自由软件排名目前是八十名左右的位置。
开发历史 • 星际译王在2003年开始开发,现在已经比较完善,现有代码8万行左右,其中主程序2万行,词典引擎库3万行,插件1万行,工具1万多行, 目前还在不断维护中。 主要工作是由我做的,来自俄罗斯的Evgeniy也曾做了不少贡献。有非常多的用户和爱好者也进行了参与。 • 项目主页是:http://stardict.sourceforge.net
获奖 • 2004年获得第一届中国开源软件竞赛金奖。 • 2005在香港举行的“金企鹅杯”两岸四地开源软件大赛中获得杰出创意奖。代表分别来自港澳台和大陆。 • 第一届中日韩开源软件竞赛中作为中方四名代表之一进行参赛,和其他国家的选手进行了友好交流。
商业回报 • 毕业工作半年后,在2007年一月以一个六位数将在线词典网站和软件所有权卖给了一家翻译公司。 • 商业交易后软件继续保持开源,我们仍然一起合作并致力于改进和维护星际译王的发展。
开发开源项目对毕业后找工作的帮助 • 由于有很强的项目实践经历,培养了实力,所以找工作比较简单。 • 毕业后到北京飞漫嵌入式Linux公司工作是发了封邮件就定好了。 • 去红帽面试时说到开发过星际译王,大家知道了我是谁,所以过程也很顺利。 • 目前工作还是比较轻松自由,之前一段时间就是在工作时开发StarDict-3.0版。因为是开源软件公司,所以支持我们的开源项目。
目前的主要问题 • 缺少其他开发者的参与和贡献。目前我自己的个人精力已经转变到一些其他的事情上了,所以难以继续做很多开发。希望能有高水平的开发者参与进来,维护和发展星际译王的后续版本。 • 缺少技术支持人员。目前在StarDict论坛里发帖提问题的人很多,发信到邮件列表的人也比较多,但一直只有我一个人回复。平时回复邮件占了我很多精力,希望也有人能参与进来。
星际译王的一些技术细节 • 1. 词典文件格式 • 2. 查询引擎 • 3. dictzip技术 • 4. 屏幕取词技术 • 5. 网络词典 • 6. 插件系统
详细词典格式文档 • 星际译王的词典格式是公开的,这意味着,其它软件可以自由读取星际译王的词典文件。由于StarDict词典文件格式设计简单而清晰合理,所以很多其它软件也在采用这种格式作为他们的词典数据,比如Mac os下的mdict,手机上的NDS等等。 • 详细文档包含在了软件源码包里。这是一个500多行的英文文档。因为软件一般都有国际化的要求,而且也会有其他国家的开发人员参与,所以用英文写文档和注释是一个好习惯,也能锻炼自己。
词典文件组成 • 一个最基本的词典分为.ifo, .idx, .dict三个文件。 • 还可以有.syn同义语信息文件, .idx.oft索引缓存文件(加快启动速度),.clt单词排序方法文件等,另外也可以有图片资源等目录文件。 • .idx文件可以用gzip压缩。 • .dict文件可以用dictzip技术压缩,生成.dict.dz文件。
ifo文件内容 • Ifo文件包含词典的基本信息。是一个纯文本文件。
idx文件格式 • Idx文件格式也很简单。就是一个UTF-8编码的单词,加上\0字符结尾,然后两个32位数字,一个表示解释数据块在.dict文件里的偏移,另一个表示解释数据块的大小。接着就是第二个单词,依次重复。 • 所有这些单词,按一定的排序规则来存储。比如利用类似strcasecmp的函数。
dict文件格式 • dict文件是纯粹的数据块,每个数据块的开始偏移地址和大小记录在idx文件里了。 • 由于idx文件里已经有了数据长度信息,所以字符串可以不要结尾的\0字符。 • 数据块的类型由.ifo文件里的sametypesequence标识决定的。可以是纯文本,也可以是html, pango, xdxf, xml, 音标,wiki标记等等,正因为如此,StarDict可以兼容各种其他词典的数据类型,只要开发相应的数据解析插件就行了。
查询原理 • StarDict通过读取ifo文件,获取了词典的基本信息。然后加载处理.idx单词索引文件,在内存里创建一个元素为32位数字的数组,数组大小就是单词的数量。每个数组成员的值就是对应单词在idx文件里的起始偏移。 • 比如,第一个单词的偏移肯定就是0,假设第一个单词为apple的话,那么它的单词长度是5,加上结尾的\0占1字节,后面紧跟的解释数据偏移和大小两个32位数字占8字节,总共就是14字节,所以第二个单词在idx文件里的起始偏移肯定就是6+8=14字节,因此数组的第二个元素的值就是14。后面的单词偏移值都以此类推。 • 由于记录了每个单词在idx文件里的偏移值,这样访问第99个单词时只需读取数组里的第99个数字和第100个数字的值,第99个数字的值就是第99个单词的偏移,第100个数字的值减去第99个数字的值就是第99个单词的大小。这样要访问第任意个单词,都可以非常快,只要相应的fseek和fread就行了。
折半查找 • 在能迅速访问第任意个序号的单词后,加上单词已经事先排好了序,就可以用折半查找算法来查找对应的词了。 • 比如查找apple这个词,同时词典里有1000个词,我们先取出第500个词,假设是banana,通过strcasecmp比较,我们肯定a开头的是在b开头的单词的前面,所以我们继续读取第250个单词,再进行比较,又确定是再读取比较第125个单词还是第375个单词。这样范围慢慢缩小,最后找到了apple这个单词的位置,(如果未找到,就可以返回显示未找到了)比如是第85个单词,我们就同时取到idx文件里apple字符串后面的两个数字,有了偏移和大小,再访问.dict文件里的数据块,这样就把解释也读出来了,然后再通过解析,就可以把意思显示到软件界面上来了。 • 实际中的星际译王是使用的稀疏索引折半查找算法,这样稍微复杂些,但需要的索引数字的数组大小可以只要原来的1/32,这样就达到节省内存的目的。这个数组的内容还可以保存为.idx.oft文件,下次直接mmap加载到内存中,以加快词典加载速度。
代码查看 • 这段稀疏索引折半查找的代码只有80行,相对于总共的80000行代码,只占千分之一,可见一个软件虽然原理简单,但要做到好用,往往要涉及到其它的各方各面的细节,然后整体架构就会比较复杂了。 • 这也就是Unix的KISS原则,Keep it simple, stupid的意义所在了。因为复杂只有构建在简单上,才能掌控其复杂性。
dictzip词典压缩技术 • 对词典的文本解释数据进行压缩是很常见的需要,但一般的压缩方法只能从头到尾进行顺序解压,而词典需要快速访问某一特定偏移和大小的数据,因此dictd软件项目设计了基于gzip的压缩技术,在gzip文件里的附加信息块里保留各个压缩分块的偏移信息,以达到前面的目的。同时解压却可以仍然使用gunzip工具,保持了兼容性,从而很方便。 • 由于dictd也是使用GPL协议的自由软件,所以星际译王可以自由地修改和采用她的代码,只要继续保持开放就行了。这样自由软件之间进行技术共享就很大地方便了开发者,大大减少了工作量,不必重复开发,重复发明轮子。
屏幕取词技术 • 星际译王在Linux下使用的是选中区取词,利用的是x-window的机制。用户只需双击选中单词就行了。 • 星际译王的windows版本也实现了金山词霸那样的屏幕取词功能。这个功能以前一直是一个不公开的难点技术。后来有人告诉我有个俄国的开源软件实现了这个技术,通过阅读它的delphi源码,我编写了c语言的dll代码,同时阅读了一些相关技术文档,对它进行了改进,使其成为独立的模块,从而攻克也公开了这个技术。现在任何感兴趣的人都可以阅读和使用这些代码了。
网络词典 • 星际译王的在线词典网站目前由stardictd词典服务端, stardict-client客户端和stardict.org php代码三部分组成。 • StarDict软件也可以直接连接到stardictd端口来查询单词和进行用户设置等。 • 一般的词典网站是利用数据库来提供查询,但开发专门的词典数据服务端能更高效,查询机制也可以更专业。目前stardictd在加载30G的词典数据后也只需16M的内存,而且运行非常稳定快速。
插件系统 • 在软件里增加插件系统能大大提高软件的扩展性和灵活性,使代码更加模块化,降低复杂性。一些不在核心但可以独立的功能可以开发为插件,这样用户可以选择是否加载对应插件来取舍这些功能。 • 插件系统就是一个加载,管理,调用插件的复杂类,并设计了各种插件类型和对应的调用接口。在软件里的合适位置再进行调用。
星际译王的源码 • 星际译王的源码还是开发得比较仔细严密,代码质量比较高,一直以来很少有bug。对于感兴趣的同学,可以下载研究阅读一下其代码,肯定会有不少收获。因为软件的所有设计思想,技术精华等等都全部包含在源码里了。
开发历史和经历 • 星际译王的源码包里有一个ChangeLog文件,里面记录了每个版本的修改历程。
大学时的开发经历 • 2003年3月,大二下学期,开始星际译王项目。 • 大三上学期完善了StarDict,推出2.4.2版,星际译王成为了一个完整的词典软件。 • 然后休息了一年半,大四毕业时推出了2.4.5版。 • 因为学分不够,延期一年毕业,因此多读了一年,在上课之余主要开发StarDict,每三个月出一个版本,2.4.6,2.4.7,最后毕业时推出了2.4.8版,一年里基本上就只做了这一件事,但为软件的成熟打下了基础。星际译王作为一个本地的词典软件已经很有竞争力了。
工作后的开发 • 在飞漫公司时利用业余时间开发出了在线词典网站和词典服务端。 • 到红帽公司后,花半年时间开发出了3.0.0版。主要是加了插件系统和网络词典,以及大量的修改和完善。 • 之后又过了三个月,推出3.0.1版。这个版本加了语音朗读,WordNet图形化词典等功能,以及bug修复等。