Tag Archives: sdcv
IN:Python Tags: pysdcv, Python, sdcv 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秒左右。
IN:C, Python, 编程相关 Tags: Python, sdcv Comments:3sdcv-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,所以暂时就先只使用未压缩过的。
IN:Python, 编程相关 Tags: pystardict, sdcv, stardict 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;
}
谁有什么好的办法吗?
IN:C, 编程相关 Tags: sdcv Comments:3sdcv是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这个输入法也不错。
IN:Linux Tags: Linux, sdcv, Vim 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可以新分割出来一个窗口显示单词的翻译。
原文请使用梯子访问。