09年03月19日   6 条评论

早就看到弥缝发起的活动:一个月培养一个好习惯,也练过那么几天字,不过荒废了,不知道怎么最近看着人家写得漂亮的书法作品很是喜欢,终于下定决定要把钢笔字先写好,别二十多岁的人了,写出来的字还像个小学生一样,太丢人了!

记得小时候还写过一段时间的毛笔字,都不记得后来为什么没坚持下去,为了让自己能坚持下去,使用弥缝介绍的“习惯培养清单”。

发在博客里的目的是希望能更好的监督自己,每月总结一次。

标签 :
分类 : Life
Top
09年03月19日   8 条评论

Python QQ是好早以前就有的一个项目,不过因为很久没更新过,以前看到的时候不能登录,所以没怎么关注过,最近代码被开发者放在了google code上面,也做了些改动,目前可以登录,发送,接收消息了,不过不是很稳定。最近看了看这个项目的代码,对整个socket-分枝有了全面了解。在代码设计上也学到了不了东西:-)

是在Windows上面开发的,所以我在Linux下测试的时候还有不少问题,最近改了改,然后做了个挂的工具给草儿同学,很不完善的,也很不稳定,使用wxPython+threading完成,GUI+多线程确实是很折腾人的,在多线程更新GUI上使用了wx.CallAfter函数,可以查看limodou博客的介绍。

截个图上来:
oqq

先不发布了,继续完善

标签 :
分类 : Python
Top
09年03月16日   2 条评论

首先安装必要的软件:,dovecot
只支持SMTP发信,dovecot可以支持POP3,IMAP等。

把自己的机器名改为一个你想使用的域名,例如coco.com(vi /etc/sysconfig/network)。配置,修改以/etc/mail/.mc下一行:

-O DaemonPortOptions=Port=smtp,Addr=127.0.0.1 , Name=MTA
+O DaemonPortOptions=Port=smtp,Addr=192.168.1.112 , Name=MTA

同时修改/etc/mail/access,添加:
Connect:192.168.1 RELAY

编辑/etc/mail/local-host-names文件,添加你想在内部使用的一个域名,如:
coco.com

这样局域网内的用户就可以使用你的SMTP了,别人在发邮件时在SMTP服务器地址中填写你的IP地址,或者域名(需要改更hosts中coco.com的指向)。帐户就直接使用Linux系统的用户,因为在一个公司使用,所以安全问题就不需要考虑了。

安装好后先测试,可以使用 mail -s ‘your subject’ somebody@coco.com命令来发邮件。也可以使用claws-mail等客户端来发邮件。

dovecot安装好后也很简单,启动后就可以使用POP3收邮件了。

标签 :
分类 : Linux
Top
09年03月11日   4 条评论

公司新拿来几台电脑,头让俺换一台用用,趁这个机会就想装个Archlinux试试,没想到折腾两天了,还是用不起来。

整个硬盘用ghost对拷了一下,Windows分区拷过去都正常,以前用的主Linux分区无法使用,以前这个分区就有问题,使用正常,但从Windows下无法访问,而且引导文件也放在另一个ext3分区上。

用光盘安装的Archlinux,300多M,base很快就安装好了,pacman也用的挺顺手,不过记得要加几个国内速度快一点的源,然后使用rankmirrors来重排一下源的顺序。不过在安装X的时候出问题了(我主板集成HD3200显卡),折腾了好久,手动改了几次.conf文件,最后显卡驱动用xf86-video-ati,在.conf文件里加上了1680×1050这个分辩率。好不容易(openbox+fbpanel+rox)启动后分辩率正常了,也可以自由切换到其它终端,但是安装ibus的时候又出问题了,使用的是yaourt,实在是折腾累了,浏览器里的字体也很不好看,uxvrt不好用,不能粘贴,不能用标签,字体怪怪的也不知道怎么改,问题一大堆啊,有点像刚用Fedora的时候,要真正能使用系统得折腾好久,但现在实在是懒得折腾了,看着人家漂亮的Archlinux桌面,只能叹息了。

俺自己的那台电脑更是郁闷,是Intel GMA 3100的显卡,本来说Linux应该支持挺好的,但在Archlinux里安装xf86-video-intel驱动后,X启动报错,如果使用vesa驱动能进入X,但是切换到终端再切换回X后就花屏了,昨天折腾了一晚上也不搞定,看来只能回到Fedora了。

不过话说回来,Archlinux速度确实挺快的,连启动X估计就10秒多点,Archlinux+openbox这样轻量级的组合确实不错,如果能在细节上完美些的话还真不想换回Fedora了。

切换到Windows下写的这篇文章,一会儿再整整Archlinux,不过俺自己那台机器要能让X在Archlinux上跑起来估计悬!

标签 :
分类 : Linux
Top
09年02月27日   1 条评论

今天配置一个Bug跟踪的工具,使用发邮件时一直出错,先没仔细看,后来仔细看了下,在/var/log/maillog里面有出错提示:

451 DT:SPM mx4, 7lcQrLDL7iJgl6dJktVcJQ–.7531S2, please try again 1235720034 http://mail.163.com/help/help_spam_16.htm?ip=1038939298&hostid=mx4&time=1235720034

在上面的链接中会有详细的提示,这个错误451:

发信人短期内发送了大量信件,超过了网易的限制,该发件人被临时禁止发信。请检查是否有用户发送病毒或者垃圾邮件,并降低该用户发信频率。

郁闷啊,我才手动连着发了几封而已。还有不少地方需要注意。

还有如果直接使用向gmail发邮件会提示:

http://mail.google.cn/support/bin/answer.py?hl=en&answer=10336

‘The IP you’re using to send email is not authorized…’

In order to prevent spam, Gmail refuses mail when the sending IP address does not match the sending domain. To send mail from your server to Gmail, we suggest using the SMTP relay provided by your ISP. Please note that we are unable to whitelist IP addresses or otherwise make exceptions at this time.

还是gmail考虑的多些,gmail的垃圾邮件过滤确实做的也不错。

标签 :
分类 : 互联网
Top
09年02月26日   3 条评论

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

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

:
  1. static PyObject * lookup(PyObject *self, PyObject *args)
  2. {
  3.     int fd;
  4.     char *file_prefix;
  5.     long file_size;
  6.     long wc;
  7.     char *word;
  8.  
  9.     char *data;
  10.     const char *p;
  11.     long index_size;
  12.     int offset;
  13.     int size;
  14.     int flag = 0;
  15.     unsigned char *buf;
  16.  
  17.     if (!PyArg_ParseTuple(args, "slls:lookup",
  18.                 &file_prefix, &file_size, &wc, &word)) {
  19.         return NULL;
  20.     }
  21.     char file_name[256];
  22.     strcpy(file_name, file_prefix);
  23.     strcat(file_name, ".idx");
  24.     if ((fd = open(file_name, O_RDONLY)) <0) {
  25.         printf("open failedn");
  26.         return NULL;
  27.     }
  28.     data = (char *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, fd, 0);
  29.     p = data;
  30.     int i;
  31.     for (i=0;i<wc;i++) {
  32.         index_size = strlen(p) + 1 + 2*sizeof(int);
  33.         if (strcmp(word, p) == 0) {
  34.             flag = 1;
  35.         }
  36.         if (flag == 1) {
  37.             offset = ntohl(*(int *)(p + strlen(p) + 1));
  38.             size   = ntohl(*(int *)(p + strlen(p) + 1 + sizeof(int)));
  39.             //printf("offset=%dnsize%dn",offset,size);
  40.             /*gzFile zfile;
  41.             zfile = gzopen("./dic/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.dict.dz", "rb");
  42.             gzseek(zfile, offset, SEEK_SET);
  43.             buf = (unsigned char *)malloc(*size+1);
  44.             memset(buf, '', size+1);
  45.             gzread(zfile, buf, size);
  46.             printf("%sn", buf);
  47.             */
  48.             close(fd);
  49.  
  50.             if ((fd = open("./dic/stardict-langdao-ec-gb-2.4.2/langdao-ec-gb.dict", O_RDONLY)) <0) {
  51.                 return NULL;
  52.             }
  53.             lseek(fd, offset, SEEK_SET);
  54.             buf = (unsigned char *)malloc(size+1);
  55.             memset(buf, '', size+1);
  56.             read(fd, buf, size);
  57.             //printf("%sn",buf);
  58.             close(fd);
  59.             return Py_BuildValue("s", buf);
  60.         }
  61.         p += index_size;
  62.     }
  63.  
  64.     return Py_BuildValue("s","");
  65. }
  66.  
  67. static struct PyMethodDef lookup_methods[] = {
  68.     {"lookup", lookup, 1, "lookup(file_prefix, file_size, wc, word)"},
  69.     {NULL, NULL}
  70. };
  71.  
  72. void initlookup()
  73. {
  74.     (void) Py_InitModule("lookup", lookup_methods);
  75. }

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

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

标签 :
分类 : C, Python, 编程相关
Top
09年02月24日   9 条评论

老爸昨晚上打电话告诉我的。
我自己居然不记得,会不会有一天我都不记得自己出生年月了呢?

很难受,为什么会这样呢?
造化弄人!

标签 :
分类 : Life
Top
09年02月23日   评论

libevent是一个异步事件处理软件函式库,以BSD许可证释出。

提供了一组应用程序编程接口(API),让程式设计师可以设定某些事件发生时所执行的函式,也就是说,可以用来取代网络服务器所使用的循环检查架构。

摘自维基百科

http://blog.gslin.info/2005/11/network-programming-using-libevent-i.html
这里介绍了相关的网络编程背景,需要带套访问哦。

以下分析针对-1.4.3-stable。

来看libevent自带的例子:

我把原来代码中WIN平台相关的去掉了,看起来方便一些,这个例子创建了一个pipe,并且使用来监听是否可读,读有数据可读时调用函数fifo_read。
调用比较简单,首先event_init()对event库进行初始化,然后使用event_set()来对某个fd的操作进行监听,接着使用event_add()把这个event激活,这里可以指定超时的时间,最后一步event_dispatch(),开始进行循环。

event_init()里只是对外的一个接口,这个函数调用了event_base_new(),分配了一个event_base类型的空间,设置了一些全局变量,使用detect_monotonic来检测是否支持CLOCK_MONOTONIC类型的时钟,这里不太理解为什么要使用clock_gettime(CLOCK_MONOTONIC, &ts)来获得当前时间,这个与gettimeofday得到的精度是一样的,只是一个是标准的时间(UNIX元年算起),一个是开机时间算起,有什么差别吗?

CLOCK_MONOTONICI测试代码:

结果:

[cocobear@cocobear -1.4.3-stable]$ gcc ftime. -lrt
[cocobear@cocobear -1.4.3-stable]$ ./a.out
sec=1235372220
sec=4621

接下来就检测可使用的事件检测函数,这里与系统相关的调用被封装成了一个结构eventop:

:
  1. struct eventop {
  2.     const char *name;
  3.     void *(*init)(struct event_base *);
  4.     int (*add)(void *, struct event *);
  5.     int (*del)(void *, struct event *);
  6.     int (*dispatch)(struct event_base *, void *, struct timeval *);
  7.     void (*dealloc)(struct event_base *, void *);
  8.     /* set if we need to reinitialize the event base */
  9.     int need_reinit;
  10. };

编译时会通过

:
  1. #ifdef HAVE_SELECT
  2.     &selectops,
  3. #endif

来“动态”的确定eventops数组,在定义这个eventops数组时确定了使用这些事件驱动模型的顺序,如果你机子上有多种可用的模式,则可以通过修改改数组来自定义使用的模型。

在event_base_new()的最后调用了event_base_priority_init()初始化了消息的优先级队列。主要就是对activequeues变量进行空间分配。默认是分配了一个event_list给activequeues。

标签 :
分类 : C, 编程相关
Top
09年02月20日   39 条评论

详细的更新请到google code 查看。

  1. get_info()函数参数处理who遗失的情况;
  2. 向服务器以HTTP方式提交密码时使用urllib.quote()编码;
  3. 修改send_msg()函数;
  4. 清理代码中直接退出的exit函数;
  5. 重写__tcp_recv()函数,以前这里有可能会丢失数据,比如好友列表过长;
  6. 增加隐身登录功能,login(True)表示隐身登录。

以前还有人提到增加隐身登录,我看了下08 PC版的飞信,只能是先登录,然后再设置隐身模式,这样的话增加设置隐身模式就没必要了。

至于登出飞信更是没必要了。

09.02.23 Update:

  1. 上次的代码get_uri被我改出错了,修正了一下;
  2. 修改了使用手机号直接发送的方式,因为目前可以使用tel: 13888888888的方式发送短信,不用从联系人中一个一个找了;不过以前似乎这种方式不行;
  3. 修正了获取联系人信息的XML数据,可以完整的获取联系人;
标签 :
分类 : Python, 编程相关
Top
09年02月07日   评论

先给出libev的主页http://software.schmorp.de/pkg/libev.html,libev是一个高性能的事件驱动模型,与类似,不过设计更为小巧,简洁。

libevent有成功的应用--memcached,libev是一个比较新的项目,代码比较少,所以这几天来研究下这个。

首先从CVS中下载最新的代码:

cvs -z3 -d :pserver:anonymous@cvs.schmorp.de/schmorpforge co libev

CVS代码中有autogen.sh文件,执行该文件会生成configure,我机子上出了点问题,需要首先运行

automake --add-missing

然后就是./configure && make && make install 了。
安装好后会有一个提示:

Libraries have been installed in:
/usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

需要注意一下,因为默认这个库安装在了/usr/local/lib/里,所以运行程序时有可能会提示找不到libev.so这个动态库。我们需要在编译时加上-LLIBDIR参数,然后设置LD_RUN_PATH这个环境变量。

安装好为了测试libev,可以使用lighttz,其实我是从这里知道的libev,下载文件,使用下面的命令来编译:

LD_RUN_PATH=/usr/local/lib/
export LD_RUN_PATH
gcc -LLIBDIR -o lighttz lighttz. -lev

标签 :
分类 : C, 编程相关
Top