March 2009 Archives

搬家小记

 终于搬到住处了,杭州滨江还是比较荒凉,小区的住户比较少,而且房子大都闲置状态,估计再没有人住,也慢慢变成了旧小区了。


本来想弄个大卡车把物品用具等的一股脑儿的搬过去的,但是托同屋的福,先弄过去了大部分的衣物杂物,后来的搬家就打了一个出租车,基本上搞定了。


原来的房东很小心眼,什么东西都婆婆妈妈的算,最后还扣押了我们300元,不喜欢。 现在的房东显然大方的多,不知道是我们刚住进去还是......其中原因估计还得等以后再了解了。



基础平台的重要性

从雅虎转到阿里巴巴,仍然做开发,做开发免不了与各种各样的基础库打交道。
开发了一个系统,准备上线了,sa给了一些机器,看系统版本,一般为rhel4或者rhel5。
准备安装系统,结果发现,没有数据库、没有openssl,没有boost库,没有适合gcc3的版本,还有大量需要依赖的perl模块,看样子给的是名副其实的“裸机”,
开始怀念雅虎yinst的日子,哎,没有yinst,但是还有yum,但是整个公司竟然连个线上的yum源都没有,每次下载n个包竟然去n个官方网站跑跑,跑了还需要make,make通不过还

需要看看有啥没有安装,有啥需要依赖,日子都没法活了,用rpm? rpm去哪找,线上机器不是测试机,随便到rpmfind网站找个包就可以安装,到时候出了问题还是自己的问题。

问sa,sa说这种包不是他们管,即使管也是给机器一顿make,幸好还没有实力申请1、2个集群,否则也没有实力去make。
在雅虎,有专一的团队维护这开发平台的可移植、可扩展以及可依赖性,这样使的开发和发布变得非常之简单,我觉得阿里巴巴应该像雅虎学习一下。
人微言轻,将就着吧!

轻松的一天

好不容易有了轻松的机会------去桐庐县采草莓。
桐庐县,浙江省杭州市属县,全国著名旅游县。位于杭州市西南,富春江斜贯县境。

奇怪的JNI的问题

在项目中遇到一个奇怪的现象,在java中使用jni调用c++的库时,总是会出现崩溃现象,java的堆栈一直显示错误在jni调用中,具体错误在strlen+0x10,看样子是strlen计算指

针所指的内容导致的一个错误,但是仔细查了一下,并不存在这种情况,一直找原因,看内存是否释放?看c++客户端是否存在指针为空指针,数组是否越界等等,结果都找不出原

因来,于是只好将java端传递的字符打印出来,并将C++库刚刚接收以及所有可能出现错误的日志打印出来,发现在java传递这种字串时:

String javastr = "abcde^@12345";

注意^@表示ascii字符为0的字符,此字串的长度为11;传递到客户端后,变成了:

char *key = "abcde<00>12345";

注意<00>表示null字符,此时用了一个指针,但是获得的字串长度为10了,这样到strlen处计算肯定会发生错误。

在c/c++语言中,数组字串中肯定不存在这样的字符串abcde^@12345,因为^@会截断12345,而java中允许出现^@,这样就导致了上述的这个问题。在jni调用c/c++库的时候,如果

用数组或指针获取,肯定会发生问题,这可能是jni的一个bug。jni部分调试代码如下:

    const char *key = env->GetStringUTFChars(string, 0);
    /* 
    int i, l = strlen(key);
    for (i = 0; i < l; i++) {
        printf("c[%d]: %u\n", i, (unsigned char)key[i]);
    }
    */
    unsigned short exists = jsClient->exists(key);
    env->ReleaseStringUTFChars(string, key);

那么在c++当中,如果用string来接收java的传递呢?有兴趣的读者不妨做做试验哟!

关于编译的几点须知

无论是C的编译还是C++编译,以及Perl或者Java的编译都可以通过make来完成。

 

rpm的一点学问

一般在linux下开发,在对源码进行二进制打包时,要用到spec文件,这个是rpmbuild的一个输入文件,暂且相当于配置文件吧。

进行打包时会出现:
Installed (but unpackaged) file(s) found:
/usr/bin/xxx
/usr/lib/xxx
/usr/share/xxx
这种现象一般属于文件files中未完全包含$RPM_BUILD_ROOT下的文件,检查一下看什么问题,可以使用:
rpmbuild -bl xxx.spec
调试时rpm会自动帮你检查文件是否包含完整,并且不需要进行编译;

另外,上述的环境确保$RPM_BUILD_ROOT的工程文件存在,否则会报错:
File not found: xxx/xxx.debuglist

老版本的linux下,rpmbuild可能替代的命令是rpm,老版本的$RPM_BUILD_ROOT路径一般是/var/tmp,很难通过$HOME/.rpmmacros来进行指定,所以一般需要使用sudo权限;
但如果一般用户编译,可以在spec文件中指定$_topdir和$_tmpdir,来确定你拥有权限的目录路径。

针对rpm一些疑难问题,大家不妨发表评论,相互交流一下。

好怀念leohacks

leohacks原来是LB插件与功能发布非常棒的一个非官方站点,站点的性质有些特殊,即非官方承认,又是官方采用最多的功能和发布官方补丁最多的一个站点。

leohacks的倡导人是花无缺,后来一直由路杨、Anthony、hztz、simonfamily和我维护,这里是以前的一个备份:http://opensource.huhoo.net/cgi-bin/leobbs.cgi

leohacks后来成为一些perl爱好者的天堂”,不过备份回退了2年,很多的修改都没有啦,遗憾中。

Monthly Archives

Pages

Powered by Movable Type 7.7.2

About this Archive

This page is an archive of entries from March 2009 listed from newest to oldest.

February 2009 is the previous archive.

April 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.