可可熊的窝

Tag Archives: sdcv

更新两个小脚本

IN:Python   Tags: , ,    Comments:4

一个是以前写的导出抓虾收藏的工具,增加了保存抓虾上文章的功能,因为只导出链接有些文章地址可能已经失效。

另一个就是pysdcv,前面文章介绍过了,整理了一下,测试了一下,然后放在了google code上面,直接使用星际译王的词典,查一个单词大概0.15秒的时间:

cocobear@0-0 /home/cocobear/Work/pytool/pysdcv $ make
gcc lookup.c -g -I/usr/include/python2.5 -lz -shared -fPIC -o lookup.so
cocobear@0-0 /home/cocobear/Work/pytool/pysdcv $ time ./pysdcv.py test
*[test]
n. 测试, 试验, 化验, 检验, 考验, 甲壳
vt. 测试, 试验, 化验
vi. 接受测验, 进行测试
【医】 试验, 测验
【经】 检验, 试验, 测试
相关词组:
put sth to the test
stand the test
give a test
take a test
test sb’s ability

real 0m0.164s
user 0m0.143s
sys 0m0.010s

如果是未使用gzip压缩过的dict文件,则0.05秒左右。

03-20
2009

发一个Python版的星际译王

IN:C, Python, 编程相关   Tags: ,    Comments:3

sdcv-0.4.2版本的代码有3480行,而图形界面的星际译王更是有N多的代码,俺也写了一个就十几行的Python代码,速度当然比不上sdcv,能差十倍,不过,请注意,sdcv查一个单词是0.01秒,我这个是0.1秒,我不觉得有人能感觉出来差别。

其实我的核心是C语言写的,之所以在速度上没有sdcv快是没有做那么些优化,俺只写了80多行,而且还有不少代码是用作Python封装的。我以前写文章说过sdcv代码写的很麻烦,用C语言可以很简洁的写出来,现在确实做到了,只是结合了Python。我觉得这种模式挺不错,影响速度的核心使用C语言去写,然后主逻辑框架使用Python写,不仅效率不会受影响,开发的速度也提高了不少。(我这个例子Python并没做什么)

static PyObject * lookup(PyObject *self, PyObject *args)
{
    int fd;
    char *file_prefix;
    long file_size;
    long wc;
    char *word;

    char *data;
    const char *p;
    long index_size;
    int offset;
    int size;
    int flag = 0;
    unsigned char *buf;

    if (!PyArg_ParseTuple(args, "slls:lookup",
                &file_prefix, &file_size, &wc, &word)) {
        return NULL;
    }
    char file_name[256];
    strcpy(file_name, file_prefix);
    strcat(file_name, ".idx");
    if ((fd = open(file_name, O_RDONLY)) < 0) {
        printf("open failedn");
        return NULL;
    }
    data = (char *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, fd, 0);
    p = data;
    int i;
    for (i=0;i<wc;i++) {
        index_size = strlen(p) + 1 + 2*sizeof(int);
        if (strcmp(word, p) == 0) {
            flag = 1;
        }
        if (flag == 1) {
            offset = ntohl(*(int *)(p + strlen(p) + 1));
            size   = ntohl(*(int *)(p + strlen(p) + 1 + sizeof(int)));
            //printf("offset=%dnsize%dn",offset,size);
            /*gzFile zfile;
            zfile = gzopen("./dic/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.dict.dz", "rb");
            gzseek(zfile, offset, SEEK_SET);
            buf = (unsigned char *)malloc(*size+1);
            memset(buf, '', size+1);
            gzread(zfile, buf, size);
            printf("%sn", buf);
            */
            close(fd);

            if ((fd = open("./dic/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.dict", O_RDONLY)) < 0) {
                return NULL;
            }
            lseek(fd, offset, SEEK_SET);
            buf = (unsigned char *)malloc(size+1);
            memset(buf, '', size+1);
            read(fd, buf, size);
            //printf("%sn",buf);
            close(fd);
            return Py_BuildValue("s", buf);
        }
        p += index_size;
    }

    return Py_BuildValue("s","");
}

static struct PyMethodDef lookup_methods[] = {
    {"lookup", lookup, 1, "lookup(file_prefix, file_size, wc, word)"},
    {NULL, NULL}
};

void initlookup()
{
    (void) Py_InitModule("lookup", lookup_methods);
}

使用C语言对Python进行扩展挺方便的,http://gashero.yeax.com/?p=38#id7这里有个不错的文档。
完了俺整理整理也放在google code上去。

上面的代码中dict文件需要是未gzip压缩过的,如果在压缩过的我使用被注释掉的那段代码在seek的时候速度很慢,又没办法用mmap,所以暂时就先只使用未压缩过的。

02-26
2009

关于Stardict的字典

IN:Python, 编程相关   Tags: , ,    Comments:3

前几天看了下sdcv(Console version of Stardict),感觉很不爽,C++的代码,花了好长时间才理清楚那些结构,我觉得使用C语言来写的话可以让代码更清晰、简洁,或者C++也可以写得更好一些。因为本来就是个很简单的东西,从一个文件中读取单词索引,然后与输入比较,最后在另外一个文件里面查到解释,加上一些模糊匹配,如果需要再加上对国际化的支持,就这些东西。

因为打算在我做的东西里面使用字典,想用stardict的字典,找到了一个PyStardict,不过速度太慢了,加载一个11M的字典需要10s的时间,原因是字典的idx文件中存放的索引使用Python需要一个字节一个字节的去判断字符串长短,而sdcv在实现的时候使用的是C++,它里面读idx文件的时候使用到了指针来确实一个字符串的大小,而Python没办法做到,只能一个一个读然后判断是否字符串结束。
sdcv-0.4.2/lib/lib.cpp:629:

        for (guint32 i=0; i<wc; i++) {
            index_size=strlen(p1) +1 + 2*sizeof(guint32);

            if (i % ENTR_PER_PAGE==0) {
                wordoffset[j]=p1-idxdatabuffer;
                ++j;
            }
            p1 += index_size;
        }

谁有什么好的办法吗?

12-31
2008

sdcv在amd64上编译问题

IN:C, 编程相关   Tags:    Comments:3

sdcv是stardict的命令行替代,打算用stardict的字典,所以看看如何从字典中取词,sdcv比较小巧,拿来看挺合适,不过在我机子上编译出现了点问题:

lib.cpp:516: error: no matching function for call to ‘min(long unsigned int, guint32&)’

解决办法:

-fread(wordentry_buf, std::min(sizeof(wordentry_buf), page_size), 1, idxfile);
+fread(wordentry_buf,std::min(sizeof(wordentry_buf),(size_t)page_size),1,idxfile);

——————————————–split—————————————
听说WordPress2.7在后台的UI上变化不小,今天试着升级上来,发现果然是完全改变了以前的UI,大量使用了JS,感觉还不错:-)

好久没有Opera了,因为又出现了无法输入的现象,只好去用了Firefox一段时间,今天换了下Ibus输入法,发现可以在Opera里面使用,赶快换回Opera,firefox的速度还是与Opera无法相比的。对了Ibus这个输入法也不错。

12-18
2008

vim中使用sdcv(stardict CLI版)

IN:Linux   Tags: , ,    Comments:0

这里介绍的vim中使用辞典查词的方法不错,利用了vim的一些特性,这样平时使用vim的时候就可以手不离键盘要完成查词了。

sdvc是命令行版的Stardict,可以在这里下载,目前最新的版本是0.4.2,不过在ADM64平台下编译会出错,我在网上找到了一个补丁,不过这个补丁是针对debain用户的,有些用不上,那些找不到文件的patch就可以直接忽略掉。

如果在gvim中使用则在~/.gvimrc中添加:

function  Mybln()
     let  expl=system('sdcv  -n  '  .
           \  v:beval_text  .
           \  '|fmt  -cstw  40')
     return  expl
   endfunction 

   set  bexpr=Mybln()
   set  beval

如果直接在vim中使用,则在~/.vimrc中添加:

function!  Mydict()
   let  expl=system('sdcv  -n  '  .
         \   expand("<cword>"))
   windo  if
         \  expand("%")=="diCt-tmp"  |
         \  q!|endif
   25vsp  diCt-tmp
   setlocal  buftype=nofile  bufhidden=hide  noswapfile
   1s/^/\=expl/
   1
endfunction
nmap  F  :call  Mydict()<cr>

gvim中鼠标移动到单词上就可以得到翻译,在vim中光标移动到单词上,使用shift+f可以新分割出来一个窗口显示单词的翻译。

原文请使用梯子访问。

05-19
2008
loading...