2009年12月26日星期六

来来,年终总结

又loser样的混了一年,转眼都年过26,情何以堪。回想本年度,我挑我的拣出该记得的几件事:

行程大事

1:毕业毕业
     占据了上半年6个月的大好时光,论文七拼八凑的出来一篇"the red damping wing of Gunn-Peterson trough in the high redshift GRBs/高红移伽马暴中的Gunn-Peterson槽",发表于Sicence China/Physics and Astronomy/English Version上,之后为毕业论文,答辩,好歹磕磕绊绊的过了。从此退出学术界(或许本来就没有进过),从科学家转为IT民工。

2:失败的川藏之行
     毕业后没有直接去工作,而是把自行车抗到成都,准备从川藏到拉萨一行。可惜在出成都的第二天就开始感冒发烧,硬撑骑到泸定,休息好些天,期间挂水打针吃药无数,怎么也好不了,只好折返成都,并被当成猪流感关进小黑屋。失败之旅。

3:转战苏州
     IT民工之旅始于苏州阳承软件,作为一名perl语言爱好者和linux使用者,在公司里担当系统管理员一职。在十一月初,公司两位老资历管理员先后离职,我居然就这样被推上SA team leader岗位。然而对比前后的工作内容,并没有什么两样,在此公司仍然学不到什么知识。

4:单车被盗
     08年骑去西藏的单车在苏州国检大厦车库被盗,由此失去生活唯一户外兴趣爱好。由于对苏州无好感,决定不在此买车,同时为了不至于过于宅男,决定转行徒步,现在背包睡袋帐篷等装备齐全,就等找到一个户外的大本营。

5:获得园区补助
    本来工资算是少得可怜,但靠着中科院的光环,园区居然把人才补助划给于我,2k对于loser来说不是小数目,于是把这件事情也记录在此。尴尬的是十人上报仅我一人获得,或多或少担心有人拿有色眼镜看我。

生活感情

宅男化严重,朋友依然少,越来越不喜欢深交,不喜欢管人闲事和被管闲事。当多人说我们关系不错而我认为只是泛泛之交时,心惶恐万分。

依然没有mm,不喜欢深交是原因之一,其次是依然搞不清恋爱是何种感觉。年中曾尝试追求一似有好感却不确定的mm,不出意料失败,好在很快结束,两人见面还不至尴尬。前些日子某女苦心婆劝让我挖一墙角,啼笑皆非情何以堪情,遂义正严词予以拒绝。

挨踢技能

Perl水平有长进,除xs外,料已经不需再专门花时间看perl语法。

C水平长进,仍需参考语法书

Linux水平无长进,当前知识足以应付工作所需,心思也不在于此

英语水平略有长进


总结:
能养活自己,钱似乎也够,但不是我想要的生活。

#end

Posted via email from 单行道

2009年12月22日星期二

perlxstut: 从Net::LDAPxs学perl xs

Net::LDAPxs是Pan YU正在开发的一个连接openldap c api的package,根据Devel::NYTProf的测试结果,能够显著提高Net::LDAP的性能。刚刚出到0.04版,是很好的学习ldap和perl xs写法的资料。我从0.03版本开始关注这个包的开发,并给作者提交了几个bug,很欣喜的看到在0.04版中这些bug都得到了修正。但0.04版似乎bug更严重,make test会返回失败,具体原因还有待查看。

昨天晚上阅读illguts-0.18,发现perl5.10内部数据结构的表示较先前版本有了很大的改变,但好在perl开发者们注意了perl5的向后兼容性,在先前版本里面的xs宏基本都能够继续使用,准备花点时间把illguts看完。

Posted via email from 单行道

2009年12月21日星期一

perlxstut: perl内部数据类型

XS variable type Table

Name      variable type   C structure     Perl function
SvNULL   SVt_NULL        None            undef
SvIV        SVt_IV             xpviv           Integer
SvNV       SVt_NV           xpvnv           Floating-point number
SvRV       SVt_RV           xrv             Reference or undef
SvPVIV    SVt_PVIV        xpviv or xpvuv  String and/or number
SvPVNV   SVt_PVNV      xpvnv           Float, string and/or integer
SvPVMG  SVt_PVMG      xpvmg           Magic
SvPVAV   SVt_PVAV      xpvav           Array
SvPVHV   SVt_PVHV      xpvhv           Hash
SvPVGV   SVt_PVGV      xpvgv           Glob


所有的类型都是从SvNULL(也可直接成为SV)继承过来,一个SvNULL结构如下

ANY是指向其他结构的一个指针,从SvNULL继承过来的其他类型主要就是靠这个指针来获得数据。

REFCNT是perl变量的一个重要属性,创建一个变量时,引用计数为1。为这个变量创建一个引用,则计数增加1。当引用计数为0时,perl即认为这个变量可以被释放内存。Devel::Peek可以用来查看一个变量的引用计数。
            perl -MDevel::Peek -e 'my $a="a"; Dump $a;$b=\$a;Dump $a';
        SV = PV(0x863f6ec) at 0x8642964
            REFCNT = 1
            FLAGS = (PADMY,POK,pPOK)
            PV = 0x8652adc "a"\0
            CUR = 1
            LEN = 4
        SV = PV(0x863f6ec) at 0x8642964
            REFCNT = 2
            FLAGS = (PADMY,POK,pPOK)
            PV = 0x8652adc "a"\0
            CUR = 1
            LEN = 4

type字段包含有sv的类型,其值为上表中之一
FLAGS 字段有 24 个标志位,它将说明这个对象的各个字段应该怎样解释,还包含其它状态信息。一些标志只是用于优化,避免解除许多层的指针引用,结果发现信息不在那里,如下所示,具体含义见cpan illguts

给出几个典型的SV类型:
SvRV:

SvPVNV:

SvPVMG:

可以看到perl里面的复杂数据对象都是在SvNull上面添加其他数据结构而来的。继承关系如下:

SvPVMG: 在perl里面,SvPVMG被成为"magic variable",当这个变量被访问时,一些函数会被触发。比如tie变量,%SIG,被bless过的类变量等。

词法变量和包变量:
Perl使用namespace来区分不同包的变量,包变量保存在symbol table hash(stash)里面,默认的namespace是main::,每个namespace都由一个hash组成,hash的键值是变量的名字,而hash的值就是一个GV,其中包含所有共享这个变量名的变量值。
词法变量是生存期与代码块相关的变量。每个CV(code block)包含一个叫做padlist的数组引用,这个数组的第一个entry包含所有词法变量,第二个是其对应的值,还有第三个是为了解决递归代码快所使用的。

更多详尽信息,参见perlguts,perlapi,illguts.

Posted via email from 单行道

2009年12月19日星期六

perlxstut: 用xs创建perl对象

Click here to download:
TObj-0.01.tar.gz (44 KB)

=head1 NAME
 
    使用xs创建perl对象

=head1 AUTHOR

    woosley.xu

=head2  从xs创建类

    void
    new(class)
            char* class
        PREINIT:
            HV* hash;
            SV* obj;
        PPCODE:
            hash = newHV();
            hv_store(hash,"author",6,newSVpv("woosley",0),0);
            obj = newRV_noinc((SV *)hash);
            sv_bless(obj,gv_stashpv("TObj",1));
            XPUSHs(sv_2mortal(obj));

在xs中,创建一个类也和perl中建立类类似,使用相当于bless的sv_bless,其接受的第一个参数是被bless的SV,第二个参数是HV* stash,它可以通过gv_stashpv将一个字符串转化为HV获得。

上面例子中将一个hash bless成名为TObj的类,hash通过newHV创建,并使用hv_store将"author" => "woosley"键值对存入。由于sv_bless需要一个sv,所以将hash通过newRV_noinc转换成为一个RV,在这里noinc意味着不给RV增加引用数,目的是为了防止内存泄漏。

XPUSHs将obj push到perl返回值堆栈,sv_2mortal表明在xs退出后obj会自动清空。

    void
    hello_xs(class)
            HV* class
        PREINIT:
            char* author;
            SV** ve;
        CODE:
            if (ve = hv_fetch(class, "author", 6, FALSE)){
                author = (char *)SvPV_nolen(*ve);
            }
            else {
                Perl_croak(aTHX_"no author found for you");
            }
           
            printf("greet %s: hello from xs\n", author);

这是一个TObj类中的方法,使用$obj->hello_xs传入的第一个参数为$obj,它依然是一个HV,可以从里面使用hv_fetch获得其键值对,使用SvPV_nolen将返回值转化为PV,再强制转化为需要的char*,如果没有author键,则使用Perl_croak打印错误。

=cut

Posted via email from 单行道

2009年12月18日星期五

perlxstut: 从perl给c传递数组参数

Click here to download:
Array-0.01.tar.gz (44 KB)

=head1 NAME

    如何从perl中将数组传入xs

=head1 Prework
   
    h2xs -A -n Array


=head2 从perl给c传递数组

    typedef int intArray;
    int sum(int count, intArray * array); //c原型

    intArray * T_ARRAY  // typemap
   
    int sum_as_list(array, ...)
        intArray * array
      CODE:
        RETVAL = sum(ix_array, array);
      OUTPUT:
        RETVAL
      CLEANUP:
        Safefree(array)

从perl中传递数组给c需要经过perl预定义的T_ARRAY的处理, T_ARRAY定义在perl的标准typemap中。T_ARRAY会生成一个ix_${var}的变量来表示传入参数的个数,比如在上面的例子中,生成ix_array。$var为传入参数和传到c中的参数名

在c中当然需要有一个保存传入参数的数组,T_ARRAY假设存在一个叫做$ntype(这里为intAarryPtr)的函数,这个函数返回一个指向内存的指针,T_ARRAY使用这个指针来保存参数列表,自然的,这个指针需要在c函数返回后被释放,不然便会造成内存泄漏。这就是上面例子中CLEANUP的作用。当然我们也可以自己定义,在$ntype中添加释放内存的操作。比如

!!!! 改正,perl不会给我们自动提供实现提供内存的函数,这些还得我们自己定义.
  
    //这是默认实现
    intArray * intArrayPtr(int num){
        intArray * array;
        New(0,array, num, intArray);
        return array
    }

    //无须cleanup的实现版本
    void * intArrayPtr(int num){
        SV * mortal;
        mortal = sv_2mortal(NEWSV(0,num * sizeof(intArray)));
        return SvPVX(mortal);
    }
   

c里面是如何决定array的类型的?答案是从$ntype中猜测,perl把ntype中的array和ptr字段去除,剩下的字段就是数组的类型。在这里,把intArrayPtr去掉便成了int

标准的T_ARRAY typemap可以在/usr/lib/perl5/5.10/ExtUtils/typemap中找到


=head2 给c传递数组引用

    int
    sum_as_ref(avref)
            AV * avref
        PREINIT:
            int len;
            int i;
            SV ** elem;
            intArray * array;
        CODE:
            len = av_len(avref) + 1;
            array = intArrayPtr(len);
            for(i = 0; i<len; i++){
                elem = av_fetch(avref, i, 0);
                if(elem == NULL){
                    array[i] = 0;
                }
                else{
                    array[i] = SvIV(*elem);
                }
            }
            RETVAL = sum(len, array);
        OUTPUT:
            RETVAL

在这里av_fetch返回的是一个指向sv的引用的引用,其第三个参数是bool lvalue,当这个参数被设置时,如果数组不够大,perl会自动根据第二个参数index扩充数组。


=head2 使用pack给c传递参数

    int
    sum_as_packed(packed)
            SV * packed
        PREINIT:
            int len;
            intArray * array;
        CODE:
            array = (intArray *) SvPV_nolen(packed);
            len = SvCUR(packed)/sizeof(intArray);
            RETVAL = sum(len, array);
        OUTPUT:
            RETVAL
   
    int
    sum_as_packed2(len, packed)
            int len
            char * packed
        CODE:
            RETVAL = sum(len,(intArray *)packed);
        OUTPUT:
            RETVAL

SvPV无非是从SV返回一个PV,而SvCUR返回的是Sv的大小。

=cut

Posted via email from 单行道

2009年12月17日星期四

阿里巴巴送别曲

To somebody that may mean something to me.

阿里巴巴是个快乐的青年
阿里巴巴是个快乐的青年

阿里巴巴从来都是快乐的青年,他大碗喝酒,大块吃肉,和乡亲们扯淡,光着膀子在大山里吆喝,不管胯下是马是牛还是猪,他都能找到骑士般的快乐。阿里巴巴觉得生活就应该简简单单,做想做的事而不被一切羁绊,所以他永远都在英雄气短里面徜徉,“嘿,臭小子,今天掰腕子居然输给你了,明天再来!“
阿里巴巴偶尔也会无聊,特别在夜深人静的时候,于是突然间他用清高的目光看着这周围的一切,人们在觥筹交错间称兄道弟面红脖子粗,那是凡夫俗子才会散发的霉气,凡夫俗子们每天都做着吃喝拉撒这些无聊的事情。所以他用二进制来思考,觉得如果写一个算法,编一个程序,这些行动后面的下一步他都能知道得一清二楚,那些简单的生活下面,是空洞的深渊,是被冻僵后刀砍火烧都毫无感觉的麻木不仁。阿里巴巴开始不相信交流,在他每天扯淡的笑面下面,是对人与人关系的严重不信任,他把心藏的严严实实的,开始麻木不仁的过这日子,他也会感觉到痛苦,需要的矛和不相信而逃避的盾冲突的痛苦 。
阿里巴巴用折磨自己的精神来剔除这些思想的痛苦,他沉浸于自己的黑暗而罪恶的世界里,幻想天使被烧焦了羽翼,流着脓水的恶魔,尸骨碎块拼凑起来的恶魔占领这整个天堂,平凡的人们在绝望的惨叫。
日子久了,阿里巴巴已经接受了自己的麻木不仁,他离开了家乡,他离开了城市,他离开了形形色色的人群,在他流落过的地方,你几乎看不到他来过的痕迹,他总是把自己的身后打扫得干干净净,把痕迹交给陌生人保管。渐渐的,阿里巴巴忘了是逃避让自己麻木,还是麻木让自己不需要再逃避。来来往往,皆是过客,阿里巴巴对自己说。
阿里巴巴也没有相信过,他的坚硬的壳也有被打开的一刻。这书还是这平凡的书,这猪还是只平凡的猪,但在这叽叽喳喳的吵闹声中,他居然发现这小麻雀很是可爱。阿里巴巴觉得自己好久没有这么开心的扯淡过了,他回想刚刚扯淡的一幕,嘴角还会漾出一丝笑意。有时候他和那只小麻雀互相干瞪眼,心理倒抽一口凉气,完了这小麻雀看起来有点意思,于是阿里巴巴最后只好仰天大笑哈哈而过,因为他觉得很惶恐,我阿里巴巴不再麻木不仁了么,十年坚冰,可不能就这么一刻倾破。
然而麻雀也需要去南方过冬,阿里巴巴有时淡淡难过,有时心里紧缩如石,他在想多少年没有这种感觉了?于是阿里巴巴歪着头想了想,在笔记本上写了这么几句话:

冬天深了
云雀自然南飞
掠过秋实后的村庄
衔一支饱满的稻穗
和天边的夕阳对话

庄稼汉说
过冬去吧
稻穗尽管带走
我不差钱
该得到的业已得到
该丧失的早已丧失


不要惊醒
那些田埂上的往事
扔泥巴的日子
就这么一去不复返了

抽一杆旱烟
在老槐树下坐定吧
任风霜雨露打湿肩头
看尽起的西风
将飞过的痕迹
慢慢抚平

Posted via email from 单行道

2009年12月5日星期六

那些耳熟人详的人和事

李开复: 李开复怎么能积攒上他现在这一身光环的,我百思不得其解。从面相以及气质来看,尖尖的脸和软塌塌的笑,这个人都给人一种极其娘们的感觉。如果说他有本事,那也只有在他新书里吹嘘的:4年获得某某大学博士学位而一般人要六年了。如果作为一个计算机科学的工作者,前期的他尚有资本在大千世界里面炫耀一番,然而说他作为打工皇帝在业绩上的成效,鲜有听闻。首先不知道替微软做了什么,在google的这几年,也被baidu海揍得鼻青脸肿,其经营水平也就比那种“不求有功但求无过”的典型差一点点,把一个稍微有点智商的人放到这职位上,都不会比他差。我们看到的,大部分是此人借着高职位的平台,大量利用着媒体,凭着三寸不烂之舌,左演讲右出书,忽悠着千万青年。在聚光灯下翻手为云覆手为雨,这倒是他的本事,和李敖那斯有颇多相似之处,但这并不值得让人把他当为偶像。最近听说开了个创新工厂,瞟了一眼那个宣传海报,伊完美的维持了他在我心中的贱人形象。

张朝阳/马云/丁磊/任中非
这些搞it和互联网的,似乎看起来都差不多,但华为老总应该比其他人高了不止一点点。可以说,华为是中国唯一一个有气质的企业,而任正非在华为改革过程中表现出来的魄力和眼光都让人佩服不已。马云是一个纯粹的机会主义商人,而丁磊和张朝阳都在门户网上干得不错。

韩寒
n多年前韩寒刚出道的时候,仗着能写几个字就口出狂言,到现在,这小子狂性收敛了,酸辣劲却是上来不少,在博客上针砭时弊,有人说他即将成为下一个鲁迅。我从没去他blog上看过,反正水木上一直会转贴他的文章。还早,真的。韩寒的文章批评是上去了,但深度却不见得有,很多时候他只是以尖刻的口吻配以纯熟的文字讽刺社会而已,罗列事实陈述观点的水平的确很高,我不能同意得更多,但仅此而已,因为即使不看他的文章,这些观点就已经存在于我的脑海中了。

linux vs windows
从来不是GNU/linux fan,从来不是。所以如果某些人从free的角度来说linux比windows好,我倒认为Copyright是相当重要的,辛辛苦苦的劳动成果理应获得回报。当然我一直怀着感激之心在用linux,这么多工具都能免费发布,赞,不容易。大牛们业余时间能写出来的东西免费发布,我们这种底层阶级饭都吃不饱,还提什么copyleft?
windows比linux易用么?绝对的,把两个操作系统放在从没学过电脑的人的面前,直接点图标的必然比先要调个命令行出来的容易多了。这不仅仅是所谓由于我们先用windows而形成的习惯问题。windows在使用上和*nix相比,垃圾的权限管理系统造成病毒泛滥或许是最大的缺点了。最近linus给windows7竖大拇指了,*nixer无厘头的攻击windows的事情,实在让人感觉哑然失笑。

Posted via email from 单行道

2009年12月4日星期五

回归费城

妈呀,天下掉下了石头,辛好没砸头上

即使爷们如AI,在回到费城的新闻发布会上也泪流满面。我又何必成天练着粘衣十八跌的功夫,把一米之内的异物弹出十米开外?


Posted via email from 单行道