威's profile我只是风的影子,根本不存在的东西PhotosBlogLists Tools Help

Blog


    30 May

    我还是启用这个blog吧

    毕竟这里留下了我好多的东西。。。
    但是新的也继续,并且有更多的内容 http://hi.baidu.com/python23/
    也欢迎访问我的技术blog: http://www.pythonid.com 这个是在csdn的blog

    03 December

    我的blog

    由于公司平时上不了msn,所以blog搬迁到百度了。
    08 June

    C++中的内存泄露问题

        最近几天都在解决一个daemon的内存泄露问题,是用来做信息过滤的,并且是多线程的。
    刚刚写完这个程序的时候就发现有内存泄露,平均1000次处理信息后会泄露502K,很严重。
    之前我曾经做过一些C程序的内存泄露的检查,C的比较好办一些,只要有内存泄露肯定是
    有malloc而没有对应的free, 而由于C++语言本身的复杂性,它的内存泄露检测就没有这么简单了。
    比如下面这种情况:
    char  *test = new char[10];
    delete test;
    确实是用了delete的,但是写错了,应该是 delete []test 才正确。
    还有以下的情况:
    #include <iostream>
    #include <string>
    using namespace std;
    class VBase
    {
    public:
        virtual ~VBase(){}  // 如果没有这行,就不能释放Test中分配的内存
        virtual void test() = 0;
    };
    class Test : public VBase
    {
    public:
        Test(){}
        ~Test(){}
        virtual void test(){}
    };

    int main()
    {
        VBase    *vb;
        Test    *test = new Test();
        vb = test;
        delete vb;
        return 0;
    }
    子类Test被分配了内存空间,可是释放的时候是从父类VBase的指针释放的,这种情况,
    如果父类的析构函数不是虚函数,就不会调用子类的析构函数(即使父类是抽象类也是如此!),
    从而导致子类中分配的内存不能释放。
    对C++语言的掌握不仅仅是能写出可以正确运行的程序来!
    能写出稳定、高效、灵活且没有内存泄露的程序来的才算C++用的好。
    27 April

    把库的搜索路径编译到程序中

        通常在linux下的程序都会依赖一堆的so,系统会在/etc/ld.so.conf中定义的路径中寻找这些
    动态库。比如装了一个软件,它有一些自己的so,在/opt/myproduct/lib下,很可能它会修改
    /etc/ld.so.conf,把/opt/myproduct/lib添加进去,以便自己的程序使用的时候能找到。但这样
    引入了一些潜在的问题,容易出来版本混乱,就象我前面遇到的问题,下面两个地方都有同一个库:
    libfreetype.so.6 => /usr/lib/libfreetype.so.6
    libfreetype.so.6 => /opt/gd/lib/libfreetype.so.6
        其中第一个是系统的,第二个是由于安装其他软件给附带安装上的,这两个libfreetype.so.6都是
    符号连接,系统的是连到libfreetype.so.6.3.8,第二个是libfreetype.so.6.3.7,就这一点小小
    的差别就让我的一些程序不能运行,虽然说这也和这个库的设计有关,但这种情况是可以避免的。
    就是在gcc编译的参数里带上库的搜索路径,很简单,比如
     
    gcc -Wl,-R/opt/myproduct/lib  ...
     
        就把/opt/myproduct/lib带到了编译好的程序中,改程序运行的时候会先到这个路径中搜索库。
    这样就不需要通过把/opt/myproduct/lib添加到/etc/ld.so.conf中这种修改系统的办法来达到目的。
    16 March

    python 小技巧


    用了几年的 python 了,其实都知道 python的PATH包括:
    * 当前目录
    * 环境变量PYTHONPATH
    * WINDOWS的注册表
    * python安装目录下的lib和lib/site-packages
    * 程序运行过程中sys.path中添加的
    大多数时候装的第三方的模块都是装到它的lib/site-packages里去了,模块的名
    字就是site-packages里的目录的名字。

    但是还有一种情况,就是如果我有个模块在site-packages里,是一个目录的形式,名字叫 zwtest-0.1,这时候想要import这个模块的话,应该写成:

    import zwtest-0.1

    但是这样就很不爽了,如果出了 zwtest-0.2,连import都的改,有一办法就是在与zwtest-0.1相同目录里建立一个zwtest.pth的文件,里面内容是zwtest-0.1,这样python在查找模块的时候,会把zwtest.pth中的模块全部当成名为zwtest的模块,这时候 import zwtest 就和import zwtest-0.1效果一样了,就是升级了版本,只需要修改zwtest.pth就好了,而且也很好的解决了一个模块的多版本共存问题。并且,*.pth中是可以写多个模块的,一行写一个就行,很cool。


    又是符号未定义


    发现GNOME的东东版本的一致性好难控制,GNOME自己是由很多LIB组合起来
    的,这些LIB互相依赖,如果其中一个LIB的版本错了,可能一些程序运行起来很正
    常,而还有一些程序就会出问题。
    今天在LINUX上装了 pyGTK 和wxPython2.6.2, 他们都是使用GTK的,装好后无
    法运行我的程序,报一错误:undefined symbol:
    FT_GlyphSlot_Embolden(/usr/lib/libcairo.so.2),这样的东西见的太多了,通
    常就是和库的版本有关。很恶的问题,记得wxPython在2.6.2版本之前装在比较新
    的GNOME上就会有这个错误:undefined symbol: pango_x_get_context,只要
    wxPython换到版本2.6.2就好了,这个问题曾经困扰了我好久。

    先看看使用的SO的情况,用ldd /usr/lib/libcairo.so.2, 显示:
    linux-gate.so.1 => (0xffffe000)
    libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40075000)
    libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4007d000)
    libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40176000)
    libpng12.so.0 => /opt/gd/lib/libpng12.so.0 (0x40184000)
    libglitz.so.1 => /usr/lib/libglitz.so.1 (0x401c3000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x401e7000)
    libfreetype.so.6 => /opt/gd/lib/libfreetype.so.6 (0x40218000)
    libz.so.1 => /lib/libz.so.1 (0x4027d000)
    libm.so.6 => /lib/tls/libm.so.6 (0x40290000)
    libc.so.6 => /lib/tls/libc.so.6 (0x402b6000)
    libdl.so.2 => /lib/libdl.so.2 (0x403d5000)
    libexpat.so.0 => /usr/lib/libexpat.so.0 (0x403d9000)
    /lib/ld-linux.so.2 (0x80000000)
    果然有问题,libfreetype连错了,它用的是 /opt/gd/lib 下的。在/opt/gd/lib
    下的是libfreetype.so.6.3.7, 而我的/usr/lib下的是 libfreetype.so.6.3.8,
    版本不一样,就出了问题。至于为什么会连到那个so,是因为我的机器上装了一个
    软件,它会安装一个gd,并且装到那个目录,还把/opt/gd/lib加到
    了/etc/ld.so.conf中去。问题清楚了,去/etc/ld.so.conf中删除/opt/gd/lib
    行,用root用户重新执行ldconfig重新配置了库信息就OK了,再次用
    ldd /usr/lib/libcairo.so.2 看到的结果就正常了:
    linux-gate.so.1 => (0xffffe000)
    libXrender.so.1 => /usr/X11R6/lib/libXrender.so.1 (0x40075000)
    libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x4007d000)
    libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x40176000)
    libpng12.so.0 => /usr/lib/libpng12.so.0 (0x40184000)
    libglitz.so.1 => /usr/lib/libglitz.so.1 (0x401c3000)
    libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x401e7000)
    libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x40218000)
    libz.so.1 => /lib/libz.so.1 (0x4027d000)
    libm.so.6 => /lib/tls/libm.so.6 (0x40290000)
    libc.so.6 => /lib/tls/libc.so.6 (0x402b6000)
    libdl.so.2 => /lib/libdl.so.2 (0x403d5000)
    libexpat.so.0 => /usr/lib/libexpat.so.0 (0x403d9000)
    /lib/ld-linux.so.2 (0x80000000)
    其实像这样的问题,在 LINUX 下是经常出现的,而在Windows下是不容易出这样的
    问题的。这个可能和两个系统的发展有关,windows下的绝大部分为商业软件,所
    以基本上都会使用自己的库,没有什么开源的东西,不会像LINUX上的程序一样,
    很多软件都组合了N多的开源东东。 有利也有弊,这个给LINUX系统带来很多不确
    定性,造成一些依赖其他库太多的程序的稳定性不够,一是不能控制别人的程序的
    质量,再者,版本的一致性问题到现在没有太好的解决办法,这很容易造成混乱。




    28 February

    Windows2000/XP中强制杀进程的方法

    这个我也是从网上看到的,觉得挺有用的,2000里面很多进程都是从任务管理器里杀不掉的。
    Windows 2000:
    ntsd -c q -p 进程ID
    注意:System、SMSS.EXE和CSRSS.EXE不能杀,CSRSS.EXE是Win32子系统。
    Windows XP:
    tasklist  列出系统中正在运行的进程信息
    tskill 进程ID 结束该进程ID的进程

    21 February

    我换桌面了

        本来一直用的是 KDE ,无赖它太消耗资源了,我的512内存很快就被耗光,于是换了xfce4,感觉还挺不错,桌面也PP,我决定就用它了~
        我是从源代码安装的,xfce4有个带图形界面的安装程序叫xfce4-4.2.3.2-installer.bin, 官方的www.xfce.org上有下载,运行后会弹出一个窗口,自动编译所有需要的东东,比较方便。
        完了用 startxfce4启动就是了,运行起来好快啊。
    20 February

    wxPython中的wx.html的问题

        最近一直在写一个发送邮件的python程序,发现自己动手写点东西会得到很多其他方面的知识,比如说,现在也明白了python的国际化是怎么搞的了,还有关于那个XRC的用来描述wxPython的界面的XML文件具体应该怎么使用好。其实也得益于limodo的newedit,newedit确实是做的非常不错的一个编辑器,目前就是还缺少调试(似乎)。
        前天我花了一个晚上,想为我的程序做一个HTML的界面,结果发现N多的HTML标记和属性是wxPython(其实就是wxWidget)不支持的,结果当然是只要参考官方文档描述的的该成它可以支持的,这个过程太痛苦了。。主要有几点不爽是:
    1. 不支持背景图片,这样我还不得不在表格里嵌入图片而不能使用图片背景,而且此单元格不能被拉伸,不然图片可就遮不住单元格了。
    2. 尽量不要在表格中将单元格拆分为有横排有竖排的,这样做,结果是很多单元格无法控制他们的宽度,所以应该让表格尽量的简单,然后在表格中套表格。
    3. 不要尝试使用CSS,不支持的。
    4. JavaScript也是不支持的。

    这样的话,HTML页面只能做的尽可能简单了。。哎,本来还想和Firefox差不多呢。
    15 February

    怀念

        今天又到CU的BSD版看了看,无意间,又翻到了skylove写的纪念“红袖添香”的id封存一周年的帖子来(http://bbs.chinaunix.net/viewthread.php?tid=364193&extra=&page=1),这个帖子回复21页,红袖2003年离开的,2004年发的这个纪念帖,2005年都还有人在回复,所有的人都为她的离去感到可惜。她对BSD版的贡献太大了,虽然身在德国,一直以来她热心的为大家解答了无数的难题,对于一个MM来说,太罕见了。她的技术让人折服,她的乐于助人更是让人佩服。

    她的最后一个发帖:(以此怀念一下)

    题目为:再见了朋友
    我不想对阁下的人品和素质发表多余的评论
    也不会就此“问候”一下你们家的女性成员
    也将不会妨碍你轻薄他人和庸俗自己的自由

    感谢在过去一段时间里给我无私帮助的朋友
    以及让我在帮助他人中体会分享快乐的朋友

    Farewell, BSD
    Farewell, ChinaUnix
    Farewell, all buddies...

    无光驱安装中文化的FreeBSD5.4

        本来昨天是要写blog的,可昨天重新装了freebsd后中文输入法没有装好,发不了。。
        这个是我装FREEBSD最费劲的一次,因为没有光驱,只有3个iso。去下了isoemu这个东西,它可以在windows启动的时候加一个启动选项,可以配置用该选项启动自动使用哪个iso,挺方便。关于isoemu的使用,去下载一个,里面有文档,短小而又清楚。我是修改了isoemu.ini, 在里面设置选择的freebsd的引导光盘的iso为启动执行的iso,然后把CD1的内容提取到一个目录,把CD2的packages目录覆盖到CD1提取出来的目录,然后修改packages下的INDEX文件,这个文件存放的是软件包的路径,就是说是在CD1上还是CD2上,把里面的||1替换为着||,||2替换为||,然后放到FTP上。FTP上这个目录名要命名为5.4-RELEASE(我的是5.4的),这样从FTP安装才找的到。然后FTP一定要可以匿名访问到,不然FreeBSD会很傻的把ftp://user:password@ip这种写法的user,password这部分当成域名来解析,结果是找不到,我开始就犯了这样的错误。
        很快就可以装完,FreeBSD安装包里没有带中文语言包,需要去下载一个,我的KDE是3.4,就用的kde-i18n-zh_CN-3.4.0.tar.bz2,先configure再make install, 就装上了。下一步就是要产生于一个xorg.conf的人配置文件,使用命令Xorg -configure 就会在用户目录下生成叫xorg.conf.new的文件,把它复制到/etc/X11/下面,命名为xorg.conf。这个时候使用startx是启动不了KDE的,可以快先xinit, 再在里面用startkde命令启动KDE, OK,不出意外就可以进KDE了,如果出了问题,先删除掉/etc/X11/xorg.conf再重新启动试试。进KDE后用KDE控制中心里的字体安装程序装上simsun.ttf的字体,选择使用该字体,不管是看网页还是什么,简直是完美啊,和windows一样。中文输入法嘛,装fcitx就可以了。这个fcitx一定要把系统的字符设置为zh_CN.GBK行,奇怪,这里要是设置错了,fcitx虽然运行了也不能使用。
        FreeBSD5.4里默认startx不是启动的KDE,可以修改用户目录下的.xinitrc,没有这个文件的话可以创建一个,我的.xinitrc内容如下:

    #!/usr/local/bin/bash
    export LANG=zh_CN.GBK
    export LC_ALL=zh_CN.GBK
    export LC_CTYPE=zh_CN.GBK
    XMODIFIERS=@im=fcitx
    fcitx &
    exec /usr/local/bin/startkde

    到这里,已经完全是中文化的显示、输入了,使用起来太方便了!
    感觉FreeBSD的KDE比Linux下的KDE快一些,不错不错。
    13 February

    最近有点懒了

          过完年后好多天都没有写blog了,真的是有点懒了,似乎什么事情都不想做,从明天开始我又要每天写了。
          前两天把我的工作的机器的系统换成RedHat AS4了,主要是实在是不想用windows了。然后发现几个问题:1。 Redhat的图形界面不愧是所有发行版里最难看的。 2。挂载FAT32分区后,那个分区的文件稍多一点,ls就会卡住,kill都杀不掉。要不是我看在这个发行版编译wxPython比较方便的份上,真的很想装FreeBSD或者Mandrike。
          昨天在家里装了一个FreeBSD 5.4的amd64版,由于显卡是geforce的,驱动装上了,中文包和simsun.ttf字体装上之后,中文很美观。下面编译程序也飞快,很满意啊。。有点想在我工作的机器上也装一个。
          昨天还为我的linux装了一个新的nvidia驱动,主要是想在linux上开发opengl程序。装完后有了libGL.so, libGLcore.so但是就是没有libGLU.so,这个时候我傻了一点,其实libGLU.so是可以用其他地方的,我今天下了一个SGI的回去试试。
    09 February

    地坛庙会

    初一的时候我去了地坛庙会,拍了几张照片,放上来看看。
    panda好象很想看的样子。。。
    在我的相册里,为了打开的速度这里就不贴过来了。
    02 February

    春节期间

          我真的是服了MSN的blog,这个内容我本来是写了的,还提交了,就连标题都提交上了,可内容没有。。我看到标题在就以为都提交上去了,就没有打开看。。现在还得重新补充写一下。
          有MM真好,今年过年是和爸爸妈妈以及MM一起过的,好像是10个菜,其中有2个是我做的,嘿嘿。初一去了传说中的地坛庙会,发现除了卖吃的就是卖些玩具,装饰什么的很没意思,中午就坐车
    去了西单,然后沿着长安街一直走到王府井,中间路过天安门也拍了几张照片。回到家好累。初二去了颐和园,我以前夏天的时候去过,那时候是凉风习习,现在也是。昆明湖上结冰了,这个好玩,我们在冰上走了走,心都是飘着的,一路在想,千万别掉下去千万别掉下去。。。初三和MM去买了点东西,最失败的事情在这天发生了,买了一篮子坏水果。。。初四去MM家,下午一起去了北海公园,然后初五一起去了故宫。
    风,
    冷风,
    冷风吹。(俺也学学某人)
    这天的风TM太大了,脸像正在被刀割一样,脚就像被割掉了一样。辛苦了MM一路陪着我们,手也是一直冰凉冰凉的。初六我们一起在家过的,看看电视什么的就过去了,,感觉这样时间过得最快了。。
    初七准备第二天工作了,在家呆了一天,装了两次系统, 不知道怎么回事,我的XP进不去了。。还装了个solaris 10 x86 64位版本的。
    26 January

    被summer点名

    刚开始没有搞懂是什么意思,去summer的blog看了看才明白,我也来:

     

    规则:被点名的朋友需在自己的博里公开8个理想伴侣的条件,同时加上说明。

      A)必須注明你的理想伴侶是男的或者女的

      B)被点到玩游戏的人要写出自己选择伴侣的8个条件

      C)要传给另外8个人 一同参与这个游戏并告知对方已被点名

      D)玩过游戏的人可以不用再玩

    理想伴侣:当然是女的

    8个条件:

      1、很爱我

      2、人品好啊,这个非常重要

      3、理解我,千万别没事大吵大闹,有事也尽量不要这样

      4、孝顺父母,包括双方的,我也会这样的。

      5、看起来感觉好

      6、别太懒了,不然就麻烦了。

      7、女人也要有责任心

      8、明白钱很重要,但不是最重要

    应该差不多了吧。。呵呵。满足summer的需求了。。

    24 January

    py2exe越来越爽了

          新版本已经可以打包为一个文件了,以前都是一堆dll, pyd的。具体的变化其实只有一个地方。就是options里增加bundle_files项,值为1表示pyd和dll文件会被打包到exe文件中,且不能从文件系统中加载python模块;值为2表示pyd和dll文件会被打包到exe文件中,但是可以从文件系统中加载python模块。另外setup中使用zipfile=None可以不生成library.zip。
     
    例如原来的:
    from distutils.core import setup
    import py2exe
    includes = ["encodings", "encodings.*"]
    options = {"py2exe":
                {   "compressed": 1,
                    "optimize": 2,
                    "includes": includes,               
                }
              }
    setup(  
        version = "0.1.0",
        description = "search panda",
        name = "search panda",   
        options = options,   
        windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }],     
        )
    只需要改为:
    from distutils.core import setup
    import py2exe
    includes = ["encodings", "encodings.*"]
    options = {"py2exe":
                {   "compressed": 1,
                    "optimize": 2,
                    "includes": includes,
                    "bundle_files": 1
                }
              }
    setup(  
        version = "0.1.0",
        description = "search panda",
        name = "search panda",
        options = options,
        zipfile=None,
        windows=[{"script": "search.py", "icon_resources": [(1, "search.ico")] }], 
       
        )
    就可以生成一个exe的了。(红色的为添加的内容)

    我的想法

      最近想写几个小程序,总觉得一些数据结构每次都重复写太麻烦了,我决定自己做一个库,
    就叫libzw吧,昨天晚上想了一下,基本确定需要做的内容了。首要的要求是,一定要是线程
    安全的,数据结构类的可以在节点中存储任意的数据类型。支持任意的数据类型比较麻烦,
    我是考虑如果是自定义的类型(比如结构)需要提供一个创建该结构的函数和销毁该结构的
    函数。
    1.数据结构:
      1> 链表
         其中包括一些可以把此链表作为队列、栈使用的函数,当然都是以链表的形式存储的,其实就     相当于脚本语言中的列表。链表节点可存储任意类型的东东。
        
      2> 队列
         和前面链表结构的队列不一样,这个有固定大小,所以速度更快,不会产生内存碎片,但是动态改变队列的容量会造成重新创建整个队列。
      3> 栈
         和链表结构的栈不一样,这个也是固定大小的,与上一个队列类似。动态改变栈容量代价很大。
     
      4> 哈希表
         用来通过字符串索引快速定位节点。支持N级哈希,也可以存储任意的数据类型。
        
      5> 二叉排序树
         主要是一些对查找速度要求高一点的情况,二叉排序树的插入、查找、删除都比线性表的代价小。
     
      6> B树
         用来对大量需要存储到硬盘空间的数据做索引。
     
    2. 编解码
      1> 自然语言的编码转码,用iconv  
      2> base64  
      3> quoted-printable  
      4> uu  
      5> rot13  
      6> BinHex  
      7> crc32  
      8> md5  
      9> sha1
     
    3. 其他
      1> 有边界检查的数组
        这个尽量做的轻量级一点,因为数组是非常频繁使用的东西,必要我想用gas来写。
     
      2> 字符串类型
       通过一个结构来表示字符串,同时记录字符串分配的长度,通过边界检查来避免越界访问。
     
      3> 字符串缓冲
       可以把文件或者字符串通过一个缓冲区来操作,强化按行读取和读取到特定的字符。
     
          这个是最近的计划,先搞定了以后写一些程序也方便。完了顺便也放一份到sourceforge.net上。我比较喜欢open source的。
    19 January

    不爽

          几天没有写blog了,原因是前两天我写一篇blog的时候居然没有提交上去,而也没有任何的错误提示,直接导致丢失了我的东东,甚是不爽,两天没写了。今天我心情终于又好了点了,明天去滑雪,但愿不要摔的太厉害。。
          最近怎么总是很困呢。。
    16 January

    周末在家

          周末在家仔细研究了一下gas汇编以及gcc的优化问题,当初我想gas汇编可能很难,现在看来也不算太难,毕竟我以前还是学过masm的,虽然gas的格式有点不一样,基本想法到是一致的。等两天我整理整理贴点上来。
         晚上又搞了几下Blender, 对于blender我还是比较喜欢的。我非常欣赏它的用户界面,很PP,而且还可以用python来写脚本,可惜就是不能脱离blender的环境运行。贴几个它的图:
     
     
    似乎贴自己的更有意思。。。。
    13 January

    几个IDE

          自从我的PC上装了cygwin和mingw后,在windows下我也基本不怎么使用VC了,但是编写代码的时候有些麻烦,我一般是用cygwin里的vim,可还是想关注关注windows下的一些可以方便使用cygwin或minggw的ide。收集了几个:
     
    1. Dev-Cpp    这个太有名了,用的非常多,在4年以前我就听说过它,并开始用,带了mingw。
     
     
    2. Eclipse   这个虽然是java的ide,但是装了cdt插件后可以开发C/C++的程序的。
     
    3. MinGW Developer Studio 支持 mingw的IDE,有windows,linux,freebsd版本。
     
    4.VIDE  一个可以开发GNU g++和java的IDE,有windows和linux版
     
     
    5.Relo 支持g++, Borland C++ , VC的IDE,可以可视化的设计windows的对话框
     
     
    6. Pelles C 支持Windows和Pocket PC,似乎不可以用gcc,可以可视化设计对话框
     
     
    7. Ultimate++ 一个很cool的IDE,支持mingw,支持好多库,跨平台。有一套自己的库。
     
    8. Code::Block  功能很强的IDE,支持mingw,borland c++,watcom c++,有插件支持界面的可视化设计。
     
     
    贴图实在是太慢了。。。。