博文

目前显示的是 2008的博文

静态库/动态库 与 单线程/多线程。

假如你正在写一个C/C++的程序,那么通常一定需要链接到libc或glibc或mscvrt.采用哪种方式链接?静态?动态?微软这无耻小儿,原本他提供了8种crt,静态的,动态链接的,单线程的,多线程的,调试的,非调试的,并且干脆禁止混联。可微软在vc 2005及后续版本中完全删除了单线程的crt,强迫大家在多线程的环境下工作。vc并且警告大家不要在dll中静态链接crt,理由是crt的静态变量在每个实例中都有一份,比如你在1.dll中调用了srand(0),那么在2.dll中还得srand一次。谁在写exe的时候不顺手扔两个dll进去呢?于是大多数情况下,对于crt,仅剩的选择就是“debug版的多线程dll”和"release版的多线程dll"?还有,如果我在用C++标准库(vc的全称是vc++,它是一个C++编译器而不是C编译器),那么它强迫我打开RTTI。可是如果一个C的程序员批判C++慢,他一定会先从RTTI开口。solaris也很激进,从SunOS 5.10开始它放弃了libc.a(这个比我年龄还大的东西),并把libpthread合并到libc中。
放弃静态库的理由是:
1、为了使用线程库,必须在main函数开始之前进行一些必要的初始化工作,这个被放在了动态链接的init阶段。静态库没有这个阶段。
2、静态链接的程序不知道自身是否处于多线程的运行环境中,于是编译器不知道以何种方式去实现TSS(thread-specific storage),为此,编译的时候还得加上-D_MT -DXXXXXX
3、如果一个静态链接的程序用dlopen打开一个动态链接库,前者已经装载了libc中pthread的一部分,而后者需要用到pthread于是又要载入libc.so,那么对于符号的解析将产生很大的困难。
4、如果一个单线程的静态库突然dlopen一个需要使用多线程环境的so,那么那些为了多线程而准备的初始化函数怎么办?何时执行它们?单线程自然有单线程的好处,假如我要写一个tcp echo server这样的简单服务,那么我只需要单线程就够了,并且,大多数shell命令也只需要单线程,干嘛引进多余的复杂度?静态链接自然也有静态链接的好处,让chroot变得容易,当系统崩溃时也不至于连个sh都得不到(如果sh在/bin下而libc.so被放在了/usr/l…

rename files

我在win下用automake/libtool等写cgi的时候,遇到一个问题。cygwind的libtool在link和install模式下总是自作聪明的给可执行文件末尾加上.exe(如果以前不是以exe结尾)。而iis的性格也比较孤僻,它继承了win的传统,要求cgi-bin目录的文件必须是以.exe、.cgi等结尾的才被认为是可执行文件,才会被执行。问题是我这套代码是希望在linux下跑的,我不该在html代码中写上/cgi-bin/xxx.exe这样的东西,看起来多别扭啊,我希望我的cgi都是以.cgi为后缀名的(这样也好配置apache规则)。问题是,在Makefile.am中加上EXEEXT=.cgi后,所有的cgi在win下都以.cgi.exe结尾了。怎么办呢?查了下man,发现有个叫作rename的小工具着实好用。D:\cygwin\bin\find cgi-bin -name \*.cgi.exe -exec rename .cgi.exe .cgi {} ; 刷的一下,就解决问题了。

《麻男辣女诱惑你》

上周的时候,在宽度网上我很荣幸被选中观看《麻男辣女诱惑你》的彩排,于是今天一下班就赶紧拎起电脑包往地铁站赶。路上稍稍不顺,到剧场的时候7点20,本来规定是7点半集合,但是无奈饥肠咕咕,就只好先跟组织人沙凡打声招呼然后四处觅食去。呃,可狼狈了。端着肉饼一边啃一边往剧场跑,虽说没有把饭盒带进去,但是满口姜味肉味,亲爱的落花美女、猩红美女,实在是对不住。(顺便托落花的福,今天见着了何掌柜)回正题说。今天的演出整容非常的庞大,完全不是小剧场的风格,大概有7-9个演员吧。尽管是彩排,但是据说每个人演的都很认真。我由于老是分不清背幕的广告和前景的演员(反正不是“背靠背”就是XXX牌),所以一直处于很茫然的状态,神情恍惚。我就记得女主角脚踝很细,黑丝袜很诱人,台上总是在互赞“我爱你的腿”。我右手那边的观众很敬业,每次总是他们先笑,而且很响亮。我一般都是遇得黄段子比如谁谁谁举根黄瓜自得其乐的时候才愣一下发现,啊,该笑了,不对,不能笑。要装无知,不然显的我低俗。哼我很喜欢那个装傻的小胖,但是顺便提些小意见:其它人的情感、动作转换是不是有些太生硬了?剧场是不大但是座位太平了,很多戏都是趴地上演的,我坐第3排,看着都困难。

2008-11-30

冷啊!!!没有暖气的北京的冬天的屋子实在是可怕。我有点希望我现在抱着的不是一台thinkpad而是头儿那台每天倍受散热底座和御用电风扇呵护的华硕笔记本。thinkpad本来就是冷色系,而且又没温度,太发指了!冻死我了!今天去mysql的网站寻找对mysql api更高层的封装。发现两个很令人中意的,一个是仿jdbc的Connector/C++,一个是历史相当悠久(但是貌似后来换了人维护)的mysql++。我记得以前mysql++是很简陋的,但是现在发现它真的是做的不错。有这么几点:文档很漂亮。doxygen生的reference manual和一篇排版及内容都很漂亮的user manual。支持简单的Structure mapping。嗯,我说的不是ORM。因为首先,它是简单的类似POD那样的东西。不存在继承和多态,于是充其量算ADT,和OO无缘。其次,它只支持 表 <-> struct 之间的 一一对应,不能把一个用户自定义的collection影射到多张表,反之亦然。呃,无论如何,对于像我这些被hibernate惯坏的孩子来说,它太可爱了支持参数化查询。就是先用一个带%d、%s这样的sql字符串构造一个Query,然后AddParamXXX的方式添加参数,然后执行查询。呃,我在说别的,ADO.net或JDBC。mysql++的参数化查询要简单的多,只有两种格式,大写的%Q和小写的%q,但是,也足够了。说句题外话,我以前在一家很NB的公司工作看一些很NB的C/C++程序员写下来的NB代码,它们很好很精致,但是sql注入漏洞频频。另外,asp的程序员也好这个口。但是从那些满大街都是的无论多小白的C#程序员的代码中,却很少遇见这样的漏洞。因为越傻越天真就越懒,绝不会自己去构造sql查询语句或者自己写转义函数。我还真见有人放着mysql的escape api不用,自己去写转义函数。结果忽略了字符集的影响。呃……mysqlpp尽管进步不少,但是在使用的时候还是会有那么些奇奇怪怪的问题。比如我最初在cygwin下把它编译成dll使用的时候,一般都没有问题,但是有一个option类,却遇到了奇怪的dll导出的问题。还有,给数据库连接设定字符集,多么常见的操作啊,但是mysqlpp的文档只字不提这个,笔墨被花去夸赞icu和iconv了。还有,它在将它那套struc…

vc9下wstream不支持unget() ?

今天在写一个简单的算术表达式的解析器,遇到一些问题。发现貌似vc9下wcin不支持unget,一执行unget,stream就被设置为fail { wchar_t c=std::wcin.get(); std::wcin.unget(); if(std::wcin.fail()){ std::cout<<"error"<<std::endl; } } 跟踪调试,发现是因为streambuf的gptr()和eback()函数返回的都是NULL。前者应该指向读缓存区的当前位置,后者应该指向读缓存区的开头。wifstream也是同样的问题。但是换了下,把wcin换成窄字符(std::cin),上述代码都可以正常工作。why ? 是不是我忘记调什么初始化函数了?之所以专指vc,是因为在linux/gcc下没有遇到这样的问题。

2008-11-25

昨天和前天我买了hostmonster的空间然后又买了thinkpad t400(上个周末刷卡花去1万多),到目前为止,尚未从购物的兴奋中消退。买了hostmonster的空间后,先是把数据从老的地方挪过来,然后升级wordpress,中途遇到了些小波折,回退了一次然后重新升级。然后就考虑怎么利用这空间写东西了。首先,目标是自己写一个blog system替换掉wordpress。语言锁定于C++。开发平台考虑再三,最后选择为cygwin+eclipse,库主要是用ace/cgicc,后端存储还是采用mysql,至于页面如何构架,尚在思考中,考虑要不要引入dojo。其实很想找一个C版的smarty,但是无奈的是smarty实在是太强大了,我在网上所能找到的C的html模板库都简陋的非常。昨天和今天主要是搭开发环境。分别在服务器和笔记本上编译了ace以及cgicc,然后设置路径,写了简单的hello world测试了下库是否都能找到。我在hostmonster上编译的时候给库加了rpath参数以确保库能被找到,测试结果ok。还非得采用动态库,否则每个cgi都有2-4M之巨。下一步可能首先想做的是一个更完善的代码部署系统。以前用eclipse写servlet/jsp的时候,直接就可以用ant进行部署、reload。现在我是采用ftp上传然后执行shell脚本编译,目前主要的问题出在install上。需要修改Makefile.am让install的时候把bin_PROGRAMS中的每个东东的后缀$(EXEEXT)换成.cgi,然后install到$(CGI_HOME)下。呃。。。不会写sh脚本,茫然中。总之我的终极目标就是要在客户端实现一键部署。在笔记本上双击一个bat文件,然后就会自动把代码部署到远程服务器上去然后自动编译、安装。然后直接就可以在浏览器里面看到新的页面了。I hope that.

推荐一个活动:Ian Murdock的讲座

时间:2008年11月22日(星期六),下午1:30开始入场
地点:清华科技园创新大厦二层多功能厅
活动:与Ian Murdock见面
费用:此次活动不收费
礼品:所有参会人员均会获得Unix-Center.Net站衫一件
抽奖:现场将通过抽奖方式送出两台IPod
报名:网上报名 http://www.unix-center.net/bbs/viewthread.php?tid=65231:30 — 2:00
签到2:00 — 3:00
Ian Murdock个人演讲3:00 — 4:30
自由提问时间,这个时段听众可以就自己感兴趣的任何问题向Ian Murdock提问。Ian Murdock于1973年4 月28日出生于德国的君斯坦市(Konstanz, Germany)。他是Debian GNU/Linux发行版的创始人,也是商用Linux发行商Progeny公司的创始人。他目前是Sun 公司的副总裁,负责Sun 公司的开发者社区部门。在加入Sun 公司之前,Ian Murdock是Linux 基金会(Linux Foundation)的首席技术长官(CTO),以及Linux平台交互标准LSB (Linux Standard Base)的主席。1993年,当Ian Murdock还是一名普渡大学本科生的时候,他完成了Debian Linux的基本定义文档The Debian Manifesto。1996年,Ian Murdock获得了普渡大学计算机系的学士学位。Debian一词源自他当时的女朋友(现在是他的妻子)Debra和他名字的组合,也就是 Deb(ra)-Ian。Ian Murdock目前居住在美国的印地安纳州(Indiana)。

verycd打不开了。。。。

昨晚想去verycd找house,约莫着第7集快出来。
发现打开之后页面竟然是baidu。空白的页面内嵌入一个baidu的frame。标题是warn。
OMG~~~ 这到底算什么??

微软为什么要把http协议做到kernel中去?

今天在硬盘上发现了http.sys。网上一搜,才发现我太古董了。这是微软“了不起”的新发明,把http server做到kernel里面去。
用户态的硬件驱动,内核态的http server。微软的开发人员真是颠覆性的创造思想。http server(apache/iis)一向都是漏洞频出的东西,微软果然很有胆量。

varchar(256)

今天一个同事创建表的时候把一个字段设置成varchar(256)并设置成key。
数据库是mysql,表类型是innodb。
然后就报错了
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
查了下才知道,
"internal maximum key length for InnoDB indexes is 3500 byte, and limited by MySQL to 1024 bytes. In real-life it is limited to 767"
mysql认为utf8每个字符最长3个字节。如果是varchar(255)的话,3 * 255=765\<767,如果是varchar(256),就完蛋了。

终于把Encarta 2009装上了

从2006追到2009,追了4年。这软件真讨人喜欢,里面啥都有。就是,就是,每次出新版本后下载太烦。adsl的猫速下DVD,唉……为啥中国的电信设施比日本落后这么多呢?

煮粥记

早上起来想煮点粥喝。话说我4、5的时候就开始自己做饭煮粥了。把水和米按一定比例放进电饭锅里然后按下开关,不就这么简单呗?小时候我经常一个人在家自己做饭。可今天被难到了。厨房有两个电饭煲,都是美的牌的,区别仅在于容量。煮的米饭很香,但是不可煮粥。然后我觉得微波炉要比煤气灶简单点,就先尝试微波炉。拿出微波炉的碗,淘米,加水,盖好盖子露出小眼,然后把碗放进去。微波炉上有煮粥的按钮,按一下。它说需要45分钟,OMG~ 好多电费啊。时间好长,于是我就回卧室玩电脑。几分钟后,听见一声响,我赶紧跑回厨房。打开微波炉一看,碗的盖子飞起来了,微波炉里水汪汪的一片。败……换煤气灶吧。我把办信用卡的时候送的奶锅拿出来洗了洗,然后把米和水放进去。然后先开大火让水开,然后把火关到最小。不敢盖锅盖,会溢。过了10分钟后回去看,水快干了。米太多,水太少,因为锅太小。于是我就取出来一些米,然后加水。但是再过一会儿,水又干了,于是我只好继续加水,如此反复。又过了许久后,终于熟了。米是软了,但是水很清。而且粘锅了。恨!谁教教我怎么煮粥啊!!!就要最最简单的白米粥即可。

狗改不了吃屎,《天龙八部》流氓安装Sogou PXP

sogou当年信誓旦旦的说自己要做好人,与流氓软件决裂,然后一心去推它的sogou 输入法。
ok,2年过去了。《天龙八部》是我自愿安装的sohu的第一个软件。重启,然后发现启动速度特别慢,然后在进程列表中发现一个进程叫做p2psvr。多可怕,一个进程正在偷偷摸摸的上传下载东西。一查,是在C:\Program Files\Common Files\Sogou PXP目录下。太让人恼火了!而且这个exe绝非删除就可以了事的。删了它还会再出来,删了它还会再出来。
真应了那句话,狗改不了吃屎,狐狸总是要骗人。

多环芳烃(PAH)污染

今天在台湾的《科学人》杂志上看见一篇译文在讲PAH对遗传的影响。PAH中文全称“多环芳香烃”,是油、煤、脂肪等有机物不完全燃烧时产生的一种有机物。该文中称,四川的小火电厂在燃烧煤炭的时候释放出很多PAH污染空气,然后PAH可与DNA结合,使得小孩在尚未出腹时便受到损伤。该文用统计结果说PAH影响了新生儿的头围。
在我们平时的食物中,烤肉、烟熏食品、煎炸食品中均含有较高的PAH值。为了安全饮食,专家(非蛤蟆)提出了以下建议:
1、烤肉时尽量不要吃肥肉。尽量烤瘦肉、鱼。脂肪少的肉类。
2、不要让食品和火焰直接接触。(例如对比下中式烤肉和韩式烤肉)
3、最好是低温长时间烤。
4、不要像路边的新疆羊肉串那样把肉水平放置在炭火上,而改成巴西烤肉那样垂直烤
5、油滴在炭火上产生的油烟含有高浓度的PAH,所以尽量避免这样的滴油。
6、坚决不要吃焦了东西。扔掉它,否则你是没浪费食物,但是你在尝试浪费公共医疗资源。

UTF-8的BOM竟然是unicode标准

windows很多编辑器在编辑utf-8文件的时候都喜欢在前面加个efbbbf的BOM。utf-8本来就是无字节序的,何苦呢。
今天在http://unicode.org/faq/utf_bom.html上看见,这个竟然是unicode标准。
“An initial BOM is only used as a signature — an indication that an otherwise unmarked text file is in UTF-8. ”假如我就打开一个文档里面写abc三个字符然后保存,你偏要再给加个efbbbf,然后害得很多程序解析不出来,何苦呢?不要这个BOM的话,理解成ascii也好,utf-8也好,iso8859-1也好,都可以啊。不知道改天谁会不会再发明一个GB18030的BOM出来。以后给每个编码格式搞个BOM,然后混战。

写了个打印质数的小程序

如果需要打印1亿以下的质数的话,那么这个程序的计算是很快的,10秒左右。10亿就慢很多了。如果再往上,那么就会因为存储的问题而溢出了(内存不够以及int的上限是21亿)。
如何改进这个程序让它的内存占有率在一个合理的范围内(而不是随着n线形增长)。
另外,这段程序需要大量的IO写操作。貌似应该赶紧把printf替换成fwrite。另外,要不要用write自己来管理缓存,或者用mmap?#include <iostream>#include <stdlib.h>#include <locale.h>#include <sstream>staticvoidusage(){ printf("usage:%s <num>\n",getprogname()); } staticinlineintnextPrime(int s[],size_t slen,uint8_t* mask,size_t maskLen,int max){ return0; } staticintcomp(constvoid* left,constvoid* right){ return *(uint8_t*)left-*(uint8_t*)right; } staticconstuint8_t checkPoint[]={1,7,11,13,17,19,23,29}; staticvoidsetbitmask(int pv,uint8_t* mask,int num,int per){ int base=pv/per; int v; if(pv<per) v=per+pv-per%pv; else v=pv; for(;v<num;v+=pv){ uint8_t q=(uint8_t)(v%per); //0<=q<=peruint8_t* found=(uint8_t*)bsearch(&q,checkPoint,sizeof(checkPoint)/sizeof(checkPoint[0]), sizeof(checkPoint[0]),comp); if…

2008.9.18 the death of wallop

玥玥告诉我wallop要关了,这次是彻底的关闭了。 我打开wallop的主页一看,真是如此。 "Wallop beta period will end on Sept 18th, 2008Dear Wallop.com Member,Thank you for being part of the Wallop beta social networking site. We really appreciate your feedback and support. The beta period will end on September 18th, 2008 – after that date you will no longer be able to access your account.Please check out our apps Cool Cards and Party On! On Facebook.Thanks again, The Wallop.com Team"facebook真是无敌啊。 wallop再次验证了那句话,"很美很短暂"

谁熟悉暴雪的mpq文件的格式?

我在用mangos的ad.exe解压wow的2.4.3版的地图的时候,总是在41%的时候开始报错,然后到44%左右的时候死在memcpy中。
我把libmpq/commom.cpp中的/* Get current block length */if (mpq_f->mpq_b->flags & LIBMPQ_FILE_COMPRESSED) { blocksize = mpq_f->blockpos[index + 1] - mpq_f->blockpos[index]; } 改为: /* Get current block length */if (mpq_f->mpq_b->flags & LIBMPQ_FILE_COMPRESSED) { size_t newblocksize = mpq_f->blockpos[index + 1] - mpq_f->blockpos[index]; assert(newblocksize<0x80000000); blocksize=newblocksize; } 结果遇到assert,发现newblocksize = 0xbcc06384,blocksize = 0x00001000
也就是说,尽管设置了LIBMPQ_FILE_COMPRESSED,但是并不是压缩的,导致后面用memcpy复制一个大小为0xbcc06384的块。
新版本的libmpq(0.4.2)和mangos中相差很大。我在试图把0.4.2的libmpq移植到win下。

SecurID 卡的原理

163为它的游戏用户推出了动态口令卡。售价才10元。这让我非常的诧异。首先,我觉得这几乎是无懈可击的密保技术。其次,RSA的 SecurID卡在国内在几百RMB一个。而163的这东西,实在是便宜……以前一直对这东西的原理很好奇。今天翻了些文档,略微整理如下:1、密码:
登陆密码=f(静态密码,动态密码)。
静态密码就是用户自己设置的一个密码。
动态密码是通过卡动态生成的密码。
f是一个简单函数。例如不进位的加法、字符串拼接。
用户的静态密码最好是不要通过电脑键盘输入不通过网络传输的,所以很不推荐采用字符串拼接的方式。2、构成
一个8位的处理器,一个时钟,一个LCD显示屏,一块电池。可能还会有一个键盘。
外壳的设计目标:一旦打开外壳,那么立即清空内存数据。
内部的设计目标:存储一个种子文件。然后按文件中的数据和当前时间拼起来进行AES,然后hash成6-8位的数字,显示在LCD上。如果有键盘,那么用户可以通过键盘输入一串数字(用户的静态密码)。卡把这串数字(静态密码)与卡实际生成的数字(动态密码)用一种公开的算法(前面所说的那个f)进行组合,然后显示出来。通常采用的是不进位的加法。因此这个部件不是我们所需要关心的部分。理论上来讲,如果知道种子、如果知道时间、如果知道生成器内部所采用的算法,那么我们就可以自行的算出这个动态密码。既然RSA公司敢发布软件版的生成器,那么就意味着它不怕这个算法被知道。事实上这个算法被hacker们公开已经是10年前的事情了。一个俄国hacker在发布自己的软件模拟器后留下这样一段话:
“RSA公司的伙计们:
如果你需要人帮助你设计安全的加密算法和协议,告诉我们,我们将会帮助你做出来。俄罗斯人并不都是熊。我们的国际象棋比你们下的好,记住!”但是难点在于从卡中取走种子文件。就目前而言,是不可能通过它产生的随机序列反推回去得到它的种子文件的。在网上看到了另一种类似方案:
1、用户输入一个用户名,发送给服务器
2、服务器返回一个随机数,记做C
3、用户使用自己的密码unlock动态口令卡
4、用户输入C。动态口令卡计算f(C,time,seed),然后显示出来
5、用户把口令卡的结果发送给服务器6
6、用户锁住口令卡

Berkeley db in Tuxedo?

今天看Berkeley DB 4.7的文档的时候发现,在创建Berkeley db 的时候可以选择不把它放在Berkeley db的env中,而是放在Tuxedo中让它来做Transaction Container。这非常的让我意外。
Tuxedo据说很好很强大的哦。期待改天能有机会用用看。

tail recursion

ML尽管是一门函数式语言,但是在使用的时候要万分注意自己所写的rec函数是否能被编辑器优化成普通的loop。我现在唯一所知的就是tail recursion可以被优化掉。我刚开始写了这样两个函数,(* 生成一个长度为length的list,其每个元素是n *)letrec gen_list length n = match length with0 -> [] |_ -> n::(gen_list (length-1) n);; (* 对list求和*)letrec sum = function[] -> 0 | a::l -> a+(sum l) ;; 运行发现,只要list的长度很大,就会报告“Fatal error: exception Stack_overflow”let rec gen_list2 length n = let rec appendl length n = if(length=0) then lelseappend (n::l) (length-1) ninappend [] length n;; let sum2 l = let rec myloop ltotal= match l with [] -> total | a::other -> myloop other (total+a) in myloop l 0;; 规则就是:从rec调用得到值不要再进行任何运算,立刻返回!

ocaml中的浮点数真是奇怪

# 11 == 11 ;;: bool = true # 1.1 == 1.1 ;;: bool = false 真是奇怪哦~ 另外,ocaml中通过在每个int中保留一位做GC的方式,也是令我相当的惊讶。迄今为止我还没有听说过有别的语言这么做的。还有哪个语言的int上限是12亿而不是24亿?

级数{1/n}的发散性

课本上证明级数{1/n}是发散的,是采用柯西准则。从第m+1项开始选取了m项,然后证明这m项的和的绝对值大于1/2。
昨天做题的时候看见一个有趣的序列:a(n)={1+1/2+1/3+...+1/n-Ln(n)},这个序列是收敛的。于是显然,减号左边的东西是发散的。

mysql中怎么复制一条记录?

mytable 中有一条id=1的记录,我想把它复制一条,并且把id设置为2。
我这样写:insertinto mytable (select * from mytable where id=1) ON DUPLICATE KEYUPDATE id=2;结果发现效果等同于update mytable set id=2where id=1;啊!!!
要么就是show create table mytable;
然后修改下,创建一个新表,然后插入,然后修改key,然后再插回来,然后删除临时表
有没有简单点的办法啊?

我想知道Linux下jdk的FileLock到底是怎么回事

环境:
OS: fc8
jdk: 1.6测试代码:package snnn; import java.nio.*; import java.nio.channels.*; import java.io.File; import java.io.RandomAccessFile; publicclasss{ publicstaticvoidmain(String[] args){ try{ File file=new File("a.lock"); FileChannel fc=new RandomAccessFile(file,"rw").getChannel(); FileLock lock=fc.tryLock(); System.out.println("got"); lock.release(); fc.close(); }catch (Exception e) { } } }; 测试方式:
在shell中执行
$flock a.lock yes
那么该命令会把a.lock这个文件用system api中的flock锁住。然后输出满屏幕的yes
如果我接着再次执行这个命令,那么将得不到任何输出。因为无法再次得到锁。可是如果我此时用ant执行上面的java代码,显示的却是我成功获得了锁。我在屏幕上看见了输出run: [java] got 我不管是用fc.tryLock()还是fc.lock(),结果都一样。咋回事嘛?

root并不是必须的

在上家公司工作的时候,总是四处找人要root帐号。换了新公司后,人生地不熟,不知道该找谁要。前一段时间linux有一个vm的提升漏洞。我用了一段时间。最近服务器更新了,OMG~~~ 后来我发现就算是普通的用户帐户,也是可以做很多事情的。而通常这些对我来说已经足够了。我现在已经用普通用户帐户在自己的目录下安装了apache 2.2、tomcat 6.0、mysql 5.0、proftpd等等。刚刚把apache和tomcat间用ajp连接了起来。 只是在装bugzilla的时候遇到了麻烦。它的页面都是perl写的cgi.每个脚本的第一行都是#!/bin/perl。于是我写了个sed脚本做了下替换。替换成我的目录下的perl。

2008-06-26

今天早上看了下cglib和bcel。
本来是这样的,我有很多个普通的类,它们有一些public的成员变量。但是没有对应的getter/setter。所以如果用jdk的bean工具去查properties,就找不到这些变量。而我需要在axis2中把这些类型认做pojo作为 web service的Method中的参数。我首先的想法是,可否通过cglib这样的库动态的给原来的类添加几个get/set函数。发现用cglib或者bcel创建一个新的java bean class是很容易的。然而,我的要求,是不可能被满足的。因为据说java不允许动态的给一个类添加方法。So,我彻底的放弃了这个念头。只好根据现有的类生成新的类,然后尝试来回转换。
晚上回来想给新博客添加rss的功能。由于整个web的表现是在struts2上构建的。所以本来首先想用struts2的一个rss plugin(Rome RSS-Atom Plugin)来生成rss.但是发现对方网站实在是简陋的可以,而且找不到任何文档。想想算了,还是自己做吧。 首先有两个考虑 用log4j从头开始生xml,然后输出到一个stream。然后把struts的result type设置成stream,这样输出到浏览器。 用freemaker写一个模板。然后就像写普通网页一样,挨个填空。 把对象从数据库中取出后就交给xstream输出,然后写一个xslt转成rss格式的xml. 后来采用了第2条,因为觉得比较简单。折腾了一会儿,总算把rss2弄完了。明个儿有空了再给atom写一个ftl模板就行了。 struts2的url标签比较让我郁闷的是,它生成的仅仅是一个路径。不包含主机名、端口号等信息。而rss中要求写的是一个以协议名开头的完全的url。于是我只好去HttpServletRequest对象中找主机名、端口号然后拼起来。有谁知道什么好的办法吗? 嗯,下面最想做的就是给google提供sitemap。不过目前还没有具体的想法,不知道该怎么做。
还有一个比较急的是添加评论的页面还没有做。

flashget也搞偷偷上传

话说,可不可以去告它啊?
偷偷的把我硬盘上的文件传到不知名的地方?如果我这是公司的电脑,那么它算不算是窃取商业机密罪?

JDK 7中ProcessBuilder新添了重定向IO的功能

JDK 7中ProcessBuilder新添了IO重定向功能,例如:ProcessBuilderredirectError(File file)真好~~ 啥时候发布啊

Hibernate的Cascade怎么用?数组成员删不掉

/** * 地图信息 * */@SuppressWarnings("serial") @EntitypublicclassMapInfo{ int id; String name; NpcInfo[] activities; @IdpublicintgetId(){ return id; } publicvoidsetId(int id){ this.id = id; } 于是,事实上,数据里有两张表,一张Mapinfo,一张MapInfo_activities.第二张表会引用第一张表。@CollectionOfElements@IndexColumn(name = "aid", base = 1) @Cascade({ org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) public NpcInfo[] getActivities() { return activities; } publicvoidsetActivities(NpcInfo[] activities){ this.activities = activities; } } /** * NPC信息 * */@EmbeddablepublicclassNpcInfo{ int id; String name; publicintgetId(){ return id; } publicvoidsetId(int id){ this.id = id; } public String getName(){ return name; } publicvoidsetName(String name){ this.name = name; } } 然后我这么删除s.createQuery("delete from MapInfo").executeUpdate(); 结果呢,它直接就在MapInfo这张表执行delete,而没有先去MapInfo_activities中执行delete。我用的数据库是Mysql InnoDB。它报告说“foreign key constraint fails”。…

FreeMaker Vs Jsp ?

最近在重写我的Blog。发现Struts 2中重用一段代码,主要采用的是component。 <s:componenttemplate="header.ftl"/>然后发现Struts力推FreeMaker,基本不建议使用jsp或者其它引擎写template。啊,我不会FreeMaker。又得学一大堆东西……

IE6一个尚未修补的漏洞可导致任意ftp指令被执行

http://www.rapid7.com/advisories/R7-0032.jsp
攻击者可以在他的页面中放一个iframe,指向一个精心构造好的ftp url.浏览这个网页的人就会在不知不觉中执行包含在url中的ftp命令. (理论上来说url应该只是一个网址,不应该包含ftp指令).比如悄悄把本地的文件传到hacker的服务器上去.

2-1=0 ????

(gdb) n
46 argc -= optind;
(gdb) p argc
$7 = 2
(gdb) p optind
$8 = 1
(gdb) n
47 argv += optind;
(gdb) p argc
$9 = 0
运行环境: ubuntu 8.04
还有,getopt居然会返回1.不是-1

Spring Security中openid的局限性

Spring Security中openid模块缺乏注册新用户的功能。例如,当一个用户访问我的网站,而我发现他没有登录。于是我就把他转到某个openid provider的页面去(例如yahoo)。当它登录完成并跳转回来后,因为在我本地数据库的user表中并没有找到与该openid相对应的记录,于是认证还是失败了。一个想法是如果在本地的user表中没有找到。那么提供一个注册页面。让用户提交openid,以及其它的基本信息(但是不包括密码),然后把它加到数据库中去。但是这样应该是用户在使用openid登录成功后才能访问的。但是spring security的openid模块并没有给我提供一个这样的中间状态。论坛上有人给出了解决办法,就是在web.xml中加一个listener:<listener><listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class></listener>该类实现ApplicationListener接口,然后在onApplicationEvent中写:if (event instanceof AuthenticationSuccessEvent) { // Logon event UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) event.getSource(); WebAuthenticationDetails details = (WebAuthenticationDetails) token.getDetails(); String login = (String) token.getCredentials(); ///TODO addToDataBase(login, details.getRemoteAddress(), details.getSessionId()); } 另外,我是不是应该限制下,只允许使用我所知的几个比较大的provider呢?如果允许用户任意输入网址,那么它就能牵引我去访问任意一台服务器。我觉得这样很危险。

栽倒在openid里

今天下了spring security( aka Acegi )。准备用它的openid完成用户认证。事情大概是这样的,用户在登陆页输入openid的provider(例如yahoo.com),sxip的openid首先对这个url执行一个类型为head的http请求。yahoo会把yadis url返回回来。然后sxip再发一个GET请求获取yadis信息数据。这一步没有问题。找到了。但是接下来会把本机的j_spring_openid_security_check页面当作YadisURL使用headXrdsUrl再次请求。这一点让我很奇怪。然后就会得到这样的错误:ERROR [org.apache.commons.httpclient.HttpMethodDirector] - Narrowly avoided an infinite loop in execute然后sxip会说HTTP error during HEAD request on: http://localhost:8080/myapp/j_spring_openid_security_check ,原因是:Maximum redirects (0) exceeded奇怪~~~~然后发现是我的openid版本不配套。很奇怪。spring security的包中没有包含openid,所以这个是我自己下的。下载的是0.9.4。最终发现,替换成0.9.3就ok啦!但是现在已经夜里4点了。还要睡吗?

给wordpress改编码

今天费了好大的劲把blog的mysql数据库编码从latin1改成了utf-8。唉,在上家公司工作的时候经常干这事,每次都被折腾死了。改完之后,我用Spring-Struts-Hibernate新写的blog就可以正常的显示了。宣传一下:http://www.sunchangming.com:8077/blog/index.action1、数据的实际编码
打开网页,然后点右键选“Encoding”。然后就可以知道现在是用什么编码浏览的这个网页。那么,实际上,也将以这样的编码提交form。如果程序没有再做转码。那么数据库里面存储的就是这样的格式。2、数据库的编码
每次连接mysql的时候,连接属性中有一项时是字符集。实际上这个名称很不恰当。确切来说,是说这个mysql连接在使用什么编码处理字符串。
大部分应用程序,如果在连接数据库的时候没有特别指定编码,那么将会用mysql的默认编码。
例如,如果wordpress的config文件中如果没有指定编码,那么将采用当前mysql的默认编码。
这个编码是什么呢?可以这么看见:
#mysql --help |grep default-character-set如果直接用
#mysql -uroot -pxxxx
连接数据库,那么就是采用的这个编码。
这个可以在mysql的设置文件中设置。如果不设置,默认就是latin1。但是比较可恨的是mysqldump默认采用的是utf8。并且mysqladmin默认采用的也是utf8.
而我的Blog默认是utf-8的数据,且错被当作了latin1存在数据库中。然后再通过mysqldump或者phpmyadmin以utf8的方式导出来,那么就废掉了。倒了数次。最后一次才成功。流程如下:
1、用mysqldump把表结构导出
mysqldump -uxxx -pxxxxx dbname --add-drop-table --skip-add-locks --no-data --single-transaction --hex-blob --default-character-set=latin1 --result-file=E:\first.sql --skip-comments
2、用mysqldump把表的内容导出。但是不要表结构。
mysqldump -uxxx -pxxxxx dbname--no…

正在学struts

啊,刚从hibernate的噩梦中逃出来。又入ssh之二,Struts。 我正在着手把这个Blog用jsp重写。计划使用现有的数据库表。然后使用hibernate将表结构逆向导出成java beans。然后向上一步步的写呈现和逻辑。我发现Struts真的是很强大,但是……文档不像hibernate那么条理清晰。Struts的文档杂七杂八,东一块西一块的,让我不知如何下手。 看在文档的时候惊喜的看到了dojo的名字。但是比较闷的是struts 2.0以及即将发布的2.1所继承的dojo都是0.4.x。而dojo曾是一下子从0.4跳到了0.9,几乎将整个架构重写。刚才在网上看见上个月有人在着手做stucts的dojo 1.x plugin,不知道现在如何了。 还有个小问题,谁指点下我 我在jsp中写: <%@ taglib prefix="s" uri="/struts-tags" %> 然后eclipse提示出错说Cannot find the tag library de script or for /struts-tags 但是我已经把struts2-core-2.0.11.1.jar放到WEB-INF\lib里面了啊。 运行一切都正常。 who can tell me why?

javax.ejb.Stateless在哪?

今天用hibernate的eclipse插件做逆向工程生java代码。但是生出来的代码中,有一个奇怪的annotation,@Stateless。文件的开头有@import javax.ejb.Stateless. 但是我根本就没有ejb容器啊,只有一个ejb3-persistence.jar。
so....去哪里找它?什么是ejb? 啊……好乱

axis2 1.4发布了

今天发现axis2 1.4已经发布了.
主要的改动有:
1、新增JAXWS 和JSR 181 Annotations的支持
2、实验性的CORBA支持
3、修补了一些BUG
同时,axis2的发行包中的axiom也从1.2.5升级到了1.2.7。
但是让我比较郁闷的是,依然,我无法把java.util.map从server传递给客户端,但是List和Set都没有问题。

这个五一,很短,并且没有迷笛

你还要问我为什么讨厌奥运吗?还要继续问?——————————以下为转载——————————迷笛音乐学校重要通告: “重返乌托邦”紧急停办……4月25日,我们欣喜地告知所有支持迷笛的朋友们:我们要继续在五一做自己的校园音乐会。昨天,4月27日,新华社向全国发布了消息:安徽阜阳 789名儿童感染肠道病毒,19个孩子已经死亡。今天,4月28日,山东发生火车相撞的特重大事故,目前死亡人数增至70人伤者升至416人。现在,我们向所有亲爱的朋友们道歉,因为这些伤痛,我们决定停止“重返乌托邦”的音乐会,并将通知所有计划参演的中外乐队,让我们为那么多无辜的孩子祈祷;让我们为挣扎在病榻上的伤痛的同胞们祈祷,除了祈祷,我们还能够做些什么呢?!今天傍晚,一个6岁的小男孩对他爸爸说:“爸爸,妈妈说有好多小朋友生病死了。。。”也许我们国人已经慢慢习惯这么多的伤害了,也许我们国人的情感已经渐渐麻木了,也许我们国家不会为这么多的人祸降半旗,但是,就在今天,我们大家应该团结起来表明我们的态度,应该毫不犹豫地宣扬我们的立场:停止娱乐吧,为了深切的纪念!已经来到北京的或者买了车票将要来到北京的朋友们,如果你们还愿意来学校看看,我们就一起坐在草坪上聊聊天吧,那时候也许语言很少,但我们的心会深深地交融。再次向所有支持我们的朋友们深表歉意,但我们知道,你们爱迷笛,所以你们肯定更爱这个国家,你们永远是好样的!北京迷笛音乐学校2008年4月29日凌晨

dojox.layout.ContentPane中的dojox.Grid必须设置height,否则无法显示

我在页面中通过dojox.layout.ContentPane载入一个子页面。子页面中放置了一个dojox.Grid。<styletype="text/css">@import"js/dojox/grid/_grid/tundraGrid.css"; </style><scripttype="text/javascript"> dojo.require("dojox.grid.Grid"); dojo.require("dojox.grid._data.model"); dojo.require("dojo.data.ItemFileReadStore"); // a grid view is a group of columns. var logview = { cells: [[ {name:'level', field:"level"}, {name:'className', field:"className"}, {name:'fileName', field:"fileName"}, {name:'lineNumber', field:"lineNumber"}, {name:'methodName', field:"methodName"}, {name:'loggerName', field:"loggerName"}, {name:'startDate', field:"startDate"}, {name:'logDate', field:"logDate"}, {name:'threadName', field:"threadName"} ], [ {name:'message', colSpan:"9&qu…

类名少写个public,找了一下午

(好累,终于可以回家了。) 一个同事写了一堆类,然后将某个类交给我让我用axis2发布成web service。但是在调用的过程中出现这样的错误: AxisServlet:152 - org.apache.axis2.AxisFault: java.lang.RuntimeException: java.lang.IllegalAccessException: Class org.apache.axis2.databinding.utils.BeanUtil can not access a member of class com.mypage.xxxx with modifiers "public" 如果 是java老手,一眼看这错误就知道是jre报告的,就知道原因了。而我却晕了一下午。 我一点点的跟踪调试,出错的位置不是在axis2中,而是在axiom2中。我自己写段代码查看那个出错的类是不是符合java bean规范,结果一切都正常啊。axis2从我的类中获取bean信息,然后交给axiom2生成xml.axiom在往xml中添加element的时候出错了。于是我就拼命的往axiom2里面跟,代码好多,好茫然啊。直到实在没有勇气再跟下去,就搜了下这个错误。发现,无非就是axiom/axis在org.apache.xxx包内,而我同事的那个类声明的时候没有加public。oh。。。。于是是可以通过java bean接口获取类的各种信息,但是,没有权限通过read/write accessor去操作该类的对象。于是就出错了嘛。而由于这个对象是我创建好返回给它的,所以出错时不是说无法创建对象,而是说无法访问该对象的某个函数。我开始一直以为是某个成员变量忘了加getter或者setter。 最近精神状态真是不好,本来以为没啥不会影响到工作。结果,嗯…………饿死了!

Indiana快要发布了?

sun说它将在5月5日发布opensolaris的第一个发行版。我推测是Indiana。因为它在2月的时候刚发布了Indiana preview 2,并说预计在今年夏天发布正式版。
但是相比而言,我还是喜欢玩Nevada

tomcat中hibernate的数据库连接问题解决了

首先,把Hibernate的session管理模式设置为thread。那么每个thread将会有一个单独的SessionFactory<!-- Enable Hibernate's automatic session context management --><propertyname="current_session_context_class">thread</property>那么在线程结束的时候SessionFactory就会析构,然后所有资源都会被释放,数据库连接也会被释放。
然后写一个这样的Helper提供 SessionFactorypublicclassHibernateUtil{ privatestaticfinal SessionFactory sessionFactory; static { 。。。 初始化SessionFactory } publicstatic SessionFactory getSessionFactory(){ return sessionFactory; } } 然后呢,给tomcat做一个 Listenerimport javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; publicclassHibernateListenerimplementsServletContextListener{ publicvoidcontextInitialized(ServletContextEvent event){ HibernateUtil.getSessionFactory(); // Just call the static initializer of that class } publicvoidcontextDestroyed(ServletContextEvent event){ HibernateUtil.getSessionFactory().close(); // Free all resources } } 于是每次请求结束的…

hibernate数据库连接该怎么关闭

我在hibernate.cfg.xml中采用的是最普通的方式,将连接池的大小设置成1。<propertyname="connection.pool_size">1</property>然后执行这样的代码org.hibernate.Session s = DBConn.getSessionFactory().getCurrentSession(); s.beginTransaction(); 。。。。 s.getTransaction().commit(); 然后发现,如果是在eclipse中通过junit执行,那么一切正常。
如果是tomcat/servlet,那么每执行一次就会新打开一个数据库连接,而且它不关。
于是我就想显式的关闭它,我在commit后加上s.close(),结果hibernate在close语句抛出一个异常说session已经关闭了。
谁能告诉我咋回事嘛?
数据库连接立刻就又满了~~~~

获得了一个google app Engine邀请

“ Hello,
Thanks for signing up to try Google App Engine! Your account has been activated, so you can begin building applications!”
人生之不如意事,十之八九。喜欢C++的时候,偏偏买的空间是php。刚刚喜欢上了jsp,偏偏得到的又是python/Django。唉……
总之,现在这个主机用不了多长时间了。早做打算

变态,总是找不到hibernate.cfg.xml

hibernate总是找不到hibernate.cfg.xml,于是我就想把hibernate.cfg.xml的写死写绝对路径,/etc/hibernate.cfg.xml这样的。但是在windows下的大哥大姐们成功了,而我没有。后来看了下源代码,哦,开头的/被过滤掉了。String stripped = resource.startsWith("/") ? resource.substring(1) : resource; InputStream stream = null; if (classLoader!=null) { stream = classLoader.getResourceAsStream( stripped ); } if ( stream == null ) { stream = Environment.class.getResourceAsStream( resource ); } if ( stream == null ) { stream = Environment.class.getClassLoader().getResourceAsStream( stripped ); } if ( stream == null ) { thrownew HibernateException( resource + " not found" ); } so,我无耻的又多写了一个'/'.但是还是不行。
最后发现,其实只要把hibernate.cfg.xml放在src目录下。其它的一切copy动作,eclipse都会帮着自动完成。

"你还在用数据库吗"?

“你还在用数据库吗?” 大2的时候在《程序员》上看到hibernate的这句广告的时候,我深深的为震惊。
我发现jdbc和java beans实在是太棒了。于是就在找方便的工具在它们之间利用java的反射自动实现object-relation的map。先看了下JDO,EJB,后来找到了hibernate。
嗯,今天开始学hibernate,遇到不少问题。
1、找不到某某class
hibernate不一定要j2ee,在j2se中也能跑起来。hibernate用到了很多第三方的库,我本来很笨,挨个去网上搜然后下载。后来发现,啊,hibernate core的那个20多兆的包里面都有。在lib目录下。
2、drop table的语句有问题。
mysql的语法为:droptableifexists`tablename`;hibernate生的为:droptable tablename ifexists ;3、整数类型的主键如何生成?
@Id @GeneratedValue(strategy=GenerationType.AUTO)
不行。
语句为:
id integer generated by default as identity (start with 1)
不支持。
后来发现这两个问题都是因为 hibernate.cfg.xml中dialect 没有设置对。<!-- SQL dialect --><propertyname="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

今天被java bean折腾了一下午

上大学的时候, Joyer Huang曾非常激动的给我介绍java bean是一个多么多么令人兴奋的组件技术,呃,但是那时候,我压根儿不想去学java。
这周在用axis2架一些简单的web service,无奈文档奇缺。本来一切都写完了,今天调试的时候发现,axis在将xml反序列化成object的时候出了问题。当我使用复杂类型的时候,它并没有把对象的每个字段赋予正确的值,它们都是默认值。哦,去axis2的网站来回溜达,它反复的在讲Plain Old Java Object,当时我还没有意识到bean。
然后反复的调试,读axis2的源代码,然后跟踪到BeanUtil类。然后发现:BeanInfo beanInfo = Introspector.getBeanInfo(beanObject.getClass()); PropertyDescriptor [] propDescs = beanInfo.getPropertyDescriptors(); 它要求参数的类型是一个bean。然后根据bean工具去获取bean的所有属性。然后解析xml,每解析到一个字段,就去bean info里面找找有没有这个属性,如果有,就赋值,否则就跳过。
然后我发现我唯一的问题就是:没有把类写成bean。所幸,eclipse的编辑功能非常强大,能自动生成getters/setters。然后写段代码测试下:@Testpublicvoid 列出所有属性(){ BeanInfo bi=null; PropAttr attr=new PropAttr(); try{ bi=Introspector.getBeanInfo(attr.getClass()); }catch(IntrospectionException ex){ logger.error(ex); } for(PropertyDescriptor d: bi.getPropertyDescriptors()){ logger.info(d.getName()); } } bingo!

google app太好玩了!

托moses的福,试用了google app engine,觉得它太棒了
1、它给开发者提供了免费的网络服务
2、它提供了一套cgi的开发部署框架
wonderful!
但是现在问题还是比较多的。
比如我在py文件中输入了一句中文,google就会给我一个难看的500(在我本地上测试
是正常的),而且还不给任何错误日志。
呃,我不会python。试着玩玩吧。
期待它能推出其它语言,例如perl、java、C++
http://mosestsetapplication.appspot.com/
—————————————————————————————————————————————
Google 今天发布了一个非常有趣的服务, Google App Engine.
Google App Engine 是一个专为开发者而设的平台, 目前只支持 Python. 开发者可以完完整整地将自己编写的在线应用运行于 Google 的服务器里. Google 的官方声明说, Google 希望 App Engine 能令网络开发者更容易创建及升级在线应用, 而不用花费精力在系统的管理及维护上. 通过 App Engine, 开发者可以实现:
*编写代码并执行
开发者完全不必担心应用运行所需要的资源, 因为 Google App Engine 会提供所有东西.
*全面关注流量变化
得益于 Google 自身强大的 Bigtable 数据库系统及相关的可升级的基础组件, Google App Engine 能提供全自动化的复制及负载平衡, 使应用能更容易升级以满足不同用户群的需要, 从一至一百万.
*轻松与Google其它服务整合
开发者可以直接通过 Google App Engine 使用内置的组件及 Google 的 API 资源库所提供的即插即用式的功能.
Google App Engine 目前是免费提供的.
Google 称以后会支持更多其它语言. (Python 的发明者 Guido Van Rossum 实际也是 Google 的雇员. 呵呵..)
如果你是 Python 的开发者, 可以到这个地址申请 :)
http://code.google.com/appengine/

飞信协议中的扩展方法

晚上没事做就用wireshark抓包玩。filter为:tcp port 8080 and host 221.130.45.203
零零碎碎记录了些结果在此
————————————————————————
飞信协议中的扩展方法
Service方法(S),是IETF定义的一个SIP扩展方法,用来向SIP服务器请求额外的服务。
协议中,现发现的所有部分,凡是要用到字符串的,统一都是用UTF-8。
1、心情短语
(1)获取
S fetion.com.cn SIP-C/2.0
F: 123456789
I: 2
Q: 1 S
N: GetPersonalInfo
L: 172
<args><personal version="11" attributes="all" /><services version="11" attributes="all" /><config version="109" attributes="all" /><mobile-device attributes="all" /></args>
(2)设置
S fetion.com.cn SIP-C/2.0
F: 123456789
I: 47
Q: 1 S
N: SetPersonalInfo
L: 48
<args><personal impresa="" /></args>
服务器返回:
SIP-C/2.0 200 OK
I: 47
Q: 1 S
L: 67
<results><personal version="14" impresa="" /></results>
每设置一次,version号就会增加一个。
2、获取好友列表中的好友信息
S fetion.com.cn SIP-C/2.0
F: 123456789
I: 16
Q: 1 S
N: GetContactsInfo
L: 137
<args><contacts attributes="all" extended-attribu…

64位的linux下pidgin的qq为什么不能登录呢?

经我初步查明,是这个函数qq_send_packet_login 这里出现问题,发出login包后,因为包的格式有问题,被服务器直接丢弃了。读了一遍,发现qq_encrypt附近比较可疑。因为这些函数写的比较难懂。还没搞明白。

pidgin 2.4.1 + fetion v0.97

pidgin 2.4.1已经于2008年的愚人节发布。
我把国人开发的飞信插件集成进去,然后重新打了个包在这里:下载
感谢pidgincn的magicgod 提供一个新的下载地址:http://www.pidgincn.com/deploy/pidgin-2.4.1.tar.bz2Update: 2014-03-05本文中下载链接已经失效。已删除。

家里的电脑终于又可以用了

此事说来话长。这台电脑是03年买的,然后一直多病多灾。搬了几次家之后,因为内存显卡松动,经常启动不起来。而后,突然发现,每次进入windows的时候,在选择启动项之后,屏幕要黑很久,大约在30s左右,然后下面出现一条白色的进度条横线,然后才能出现windows启动画面(一个滚动条滚啊滚)。好吧,只是多等等。但是久了之后,启动完经常发现某某图标无法显示,或是干脆报告说某某“应用程序初始化失败”,一片乱七八糟,只能充启。但是,启动10次,至少大概有2-3次是处于可使用状态的,并且每次从休眠中恢复时,不存在此问题。所以我从来都是休眠,不安装任何系统补丁,以避免重启。我错误的以为是我的主板大限已到。直到某一天,windows彻底启动不起来了。gf眼睁睁的看着我重启N次无效。进入安全模式也不行。在读\windows\system32\config的时候会停数10秒,然后在读windows/config/system.log的时候彻底卡死。更可恨的是,即便是重装系统或是进入故障恢复台进行修复,它也经常读不出来某个分区。或者,本来正常,但是突然就找不到当前目录,以及该盘下的其它文件。以至于重装系统的时候从来没有办法成功的copy所有文件并重启。话说,我惊奇的发现,Freebsd仍然能正常运行。只是packages有些老了,放弃了从6.2升级到7.0的想法,更放弃了从xorg 6.x 升级到xorg 7.3的想法。这个……太痛苦了。于是我便pkg_delete -a,然后从ftp中用pkg_add -r重新安装需要的包。windows怎么办?所有分区都是ntfs的,进入故障恢复台,对所有分区反复的进行chkdsk,但是还是不行。周五我把我的硬盘挂在朋友的机器上,再次进行chkdsk,依然无法启动win。于是准备周六去买本子,扔掉面前这个老家伙。但是嘛,gf不愿去中关村(她比我懂行)。于是就只好另谋策略。周六我在网上搜索时无意中发现我之前出现的图标显示不正常可能是因为注册表损坏,再加上的确是在读取注册表的时候卡死,于是我便需要想办法修复注册表。但是因为硬件问题我没有办法去安装一个新的win。于是我便进入win的故障恢复台,备份注册表,然后把windows\repair目录下的5个注册表文件复制到\windows\system32\config下。然后启动,哇!成功了。一切恢复到刚装…

联想的枪手满天飞

明天要去买thinpad t61,但是今天还是要忍不住鄙视下它。因为我一周内已经看见两篇不同的枪稿了。一会儿说联想的杀毒软件好,一会儿说联想的送的座椅好。什么和什么啊!
推荐去搜索引擎搜索 "底层杀毒 联想 可是我们家就没个懂电脑的人"
你说,联想,你好歹这么大了,怎么还在学神舟呢?

2008-03-27

今天用eclipse写了第一个jface程序。简单的不能再简单,就是一个空窗口。准备,好好学学jface之后下一步学习rcp。目前还没有找到令人满意的界面编辑器,或者说,一个都没有用过。如果找不到的话,我就退回去用C++/WxWidget好了。
最近自己私有的时间还真是少。白天上班,下班后就回来打电话,挂掉电话就睡觉。嗯,等买了新本子,我准备花时间学下palmOS编程,然后写一个飞信客户端。对自己而言,至少可以省不少话费嘛。但是我对palmOS真是的很无知啊。试试看吧。如果有行家路过,麻烦给扔点palm OS 5.x的文档下来。还有,貌似skype是无法通过gprs进行语音通话的,那么,飞信也是sip协议,估计,都差不离吧。时间……时间……
最近对游戏的数值策划很感兴趣,有谁是做这个的吗?一起讨论讨论吧。我正在研究大话系列。

微软放弃了中文新闻组

刚又看到另一条坏消息,微软放弃了中文新闻组,专心建设它的技术论坛了。
From: "Sophie Tan [MSFT]" <sophieta@online.microsoft.com>
Subject: 微软中文新闻组公告
Date: Tue, 18 Mar 2008 11:05:07 +0800
NNTP-Posting-Host: 207.46.55.30

微软中文技术论坛( http://forums.microsoft.com/china/default.aspx?siteid=15 )做
为微软全球统一平台, 是中国的广大用户,微软技术爱好者, 微软最有价值技术专家(MVP)
和微软 技术工程师活跃的全新交流平台,一起探讨问题,分享经验,共同提升价值。2008年
4月1日,活跃在微软中文新闻组的技术工程师将转战微软中文技术论坛,新闻组作为微软技
术爱好者以及微软最有价值技术专家交流的平台还将继续保留,特此公告.

其实,多谢微软对于新闻组的推广活动,我才得以接触了解新闻组。大一的时候还利用新闻组的积分奖励兑换了一件微软黑T-shirt。我很喜欢那里。微软花了很大的心血去经营它,上面有很多很多技术专家每天专职来负责给解答技术问题。(但是C/C++以及底层技术方面的专家很少,大部分看起来都像是做售后支持的一样)
只是05年往后,微软中文新闻组也渐渐的由盛转衰。cn.fan也持续的陷入萧条。然后我发现,真的是,它们所持的经营理念不同。cn.*是无版主一说的,但是几乎没有令人反感的广告和政治言论。微软中文新闻组尽管有版主,但是面对广告和政客的spam无能为力。他们没有权限删帖,只能把问题报告给美国那边,等那边的人解决。但是美国微软总部的那帮人又看不懂中文,且不了解轮子的这些东西将会惹来多么可怕的麻烦,于是便听之任之放手不管。
而另一方面,cn.bbs那边,最近几年也是举步为艰。相比于外层的cn.*而言,cn.bbs内容很丰富。但是对于各bbs的站长而言,他们根本不希望和外界相通, 新闻组对他们而言只是一个网络协议,只是一个站点间信息互换的承载工具。再加上教育部的一道道的重令,以及bbs本身技术老化,所以cn.bbs 基本不可能再有什么发展。
新闻组是多么好多么伟大的一项发明。但是,它太乌托邦了。 站在商家的角度,它希望让他投入的资本能以其更可控的方式运作并收…

Freebsd彻底放弃KSE,N:M终结

发信人: delphij (make universe...), 信区: FreeBSD
标 题: FreeBSD 8.0-CURRENT不再支持KSE
发信站: 水木社区 (Thu Mar 13 01:48:39 2008), 转信
Jeff Roberson 今天正式砍掉了 FreeBSD 的 KSE (M:N) 线程支持。这一变动会
使代码更容易维护,但先前 FreeBSD 版本(5.0-6.x)上编译的使用 KSE 线程库
的静态联编的文件将无法继续正常工作。动态联编的文件可以使用 libmap.conf
映射到 1:1 线程库(libthr)来使用。
————————————————————————————————————————————
linux的世界只有lwp,solaris也把它那么优秀的n:m的线程库放弃了,哦,现在,freebsd,也终于弃掉这块鸡肋了。
说到底,它的缺点是什么?说来说去,就是说它的模型太复杂了。还有呢?
呃,freebsd最让人love的一点就是,不同的线程库之间接口都是一样的,换线程库只需要修改下libmap.conf就可以了。
找了找,信件原文如下,CURRENT is no longer going to support KSE threaded applications. As
mentioned in UPDATING the following libmap.conf should work along with
compat libs for old dynamically linked libraries:libpthread.so.1 libthr.so.1
libpthread.so.2 libthr.so.2
libkse.so.3 libthr.so.3Statically linked binaries will no longer work. We're still investigating
whether 5.x binaries may have trouble due to problems in the 5.x libthr.
If this is the case we will make a special build of libthr to include in
compat5x. Thank…

太棒了!linux下有飞信可以用了

有人开发了一个针对pidgin的fetion插件。
详情请见: http://www.linuxsir.org/bbs/thread320802.html
这位帅哥好厉害。
正在试用中,很好,很强大!

"Static version not so static"

可恶的GPL。。。。。
因为win坏了,起不来。于是就只好转用freebsd/ubuntu。因为GF住的地方和我很远,于是每天就只能skype。
呃……头晕,装了AMD64版的ubuntu。但是skype在linux下只有for i386的。话说,即便是32bit的elf,只要不缺动态库,在64bit的OS下不也一样运行吗?好么,简单,下个static版的skype回来就行了。但是呢,下载完后用ldd一看,发现,哪是static啊,依赖10多个so呢。
后来在他们的jira上找到了解答:
https://developer.skype.com/jira/browse/SCL-251
简单来说,很多库是基于GPL或者 LGPL协议的。他们无法把这些库打包入自己程序中,除非采用一个与之兼容的版权协议。
回头想,那些做linux发行版的公司,真可怜

用java.nio使用mmap将一个字符串写入文件

@Testpublicvoidtest_nio_write_string(){ String s= new String("你好"); File file=new File("/tmp/test.txt"); RandomAccessFile outputFile = null; try{ outputFile=new RandomAccessFile(file,"rw"); } catch(FileNotFoundException e) { logger.error("创建文件失败",e); Assert.fail(); } FileChannel outChannel=outputFile.getChannel(); try{ MappedByteBuffer buffer; byte[] data=s.getBytes(); buffer=outChannel.map(FileChannel.MapMode.READ_WRITE, 0,data.length); buffer.put(data,0,data.length); buffer.force(); outChannel.close(); outputFile.close(); }catch(IOException ex){ logger.error("io错误",ex); Assert.fail(); } }

gnome 2.22今天发布了

对用户而言,比较关注的改变在这里:
http://library.gnome.org/misc/release-notes/2.22/#rnusers
我比较感兴趣的是它引入了一个叫做GVFS的基于网络的文件系统。这个东西,并不是像NFS这样的内核级文件系统。我觉得它很像fuse。GVFS对SFTP, FTP, DAV, SMB的这些统一给了一个上层抽象。其实很早以前nautilus就可以为这些不同的网络协议提供统一的文件夹形式的浏览方式,具体这东西是咋样我也不太清楚,貌似还可以和fuse混用。
好困,先睡了~~

杀不死的artsd

scm 10257 0.0 0.3 84624 6708 ? D 12:50 0:00 /usr/bin/artsd
-F 10 -S 4096 -s 60 -m artsmessage -l 3 -f
发现机器有些不正常,然后用ps发现,我的机器上启动了300多个artsd进程。gnome-panel死掉。右上角的时间定格在了12:21。(半个小时前)
很郁闷。这些artsd是用kill -9杀不掉的。这应该是一个kernel bug。my kernel: Linux 2.6.22-14-generic

在64bits的ubuntu下安装flashplayer

adobe目前还没有出64 bits的flashplayer,还好x64CPU和i386没啥质的区别。只需要在软件层面多装几个库就可以解决了。
步骤如下:
切换到root,打开软件包管理器看看“nspluginwrapper”有没有安装。如果没有,那么安装下。
然后退回普通用户,执行下面的操作。
1、创建插件目录
$mkdir -p ~/.mozilla/plugins/
2、去adobe的网站下载最新的flash压缩包。tar.gz格式的。
解压之后把libflashplayer.so取出来。放在~/.mozilla/plugins/
下载网址为:http://fpdownload.macromedia.com/get/flashplayer/current/install\_flash\_player\_9\_linux.tar.gz
3、用nspluginwrapper安装
$nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so
4、重启firefox

eclipse官网上的Linux 64bit版下载地址给错了

eclipse官网上的Linux 64bit版下载地址给错了,给的地址是32bit的。
我的ubuntu是64位的,软件源里最新的eclipse是3.2的,于是我就去官网下3.3的eclipse。下载后我没注意,解压后直接运行,然后报告
changming:~/eclipse> eclipse
eclipse: Command not found.
changming:~/eclipse> ls
about_files configuration eclipse.ini features libcairo-swt.so plugins
about.html eclipse epl-v10.html icon.xpm notice.html readme
搞的我莫名其妙的。
$ file eclipse
eclipse: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripp
我以为它是动态连接的,然后缺少动态库。但是用ldd -v被告知说这个是静态链接的可执行程序。又搞的我莫名其妙。后来查了下,确实是动态库缺失,然后安装了ia32的libc的动态库后,果真可以运行了,但是jvm报错。
最终的解决办法是,找到镜像的文件目录,自己去找64bit版下载~!

为System.out指定字符编码

System.out是PrintStream类型的,它是一个Stream,是面向字节的,所以无编码一说。那么怎么办呢?方法就是利用 OutputStreamWriter 这个类,把Stream转换成WriterPrintWriter fileout; try { fileout = new PrintWriter(new OutputStreamWriter(System.out, destEncoding)); } catch (UnsupportedEncodingException ex) { logger.error("不支持编码" + destEncoding + "\n" + ex.getLocalizedMessage()); return; } 嗯,还有,java中一定要去显式的关闭Stream等等。拿PrintWriter来说,用write输出的东西,并不一定会立刻输出到设备上,所以在执行完最后一次输出后一定要调用一次flush。而close方法会去调用flush,所以每次用完后不要偷懒忘记close。
而C++标准库中的stream不是这样,用完了就用完了,不用理会它。

opera从9.50b开始支持amd64

最近一时兴起,装了一个64bit的ubuntu,然后发现找不到opera。然后发现,目前opera的稳定版还不支持64位的linux,只能使用测试版9.50 Beta 1。这个版本很不稳定,经常crash。
怎么办?

在ubuntu/Xen中启动现有的windows

是这样的,我机器上本来装了一个windowsXP,但是我不喜欢,于是就安装了ubuntu。(本来打算装 opensolaris, 但是没有光驱,在使用硬盘安装opensolaris 1/08的时候失败了)
但是有很多软件是必须在windows下运行的,并且还有很多网页是只有在ie下才能正常显示。
嗯,动手之前先做个自我介绍
分区情况:
三个主分区。
第一个主分区是windows的C盘,第二个是windows的扩展分区,然后下面是windows的d盘。第三个主分区是ubuntu.
C盘对应linux下的/dev/sda1,D盘对应/dev/sda5
CPU是Intel Core 2 E6550.
ubuntu用的是7.10 AMD 64,刚做完更新。然后安装了xen 3.1,Dom0是 Ubuntu 7.10, kernel 2.6.22-14-xen。xen是通过图形界面的“新立得”软件包管理器安装的。
没有采用amd 64的ubuntu作为dom0,因为没有启动起来。
安装xen然后重启。在grub中选择“Xen 3.1 / Ubuntu 7.10, kernel 2.6.22-14-xen”。进入后切换到root,开始想办法启动win。
首先,确定bios中是否打开了vmx的支持。
# xm dmesg |grep VM
VMX disabled by Feature Control MSR
我的主板默认是不打开的。
在bios中启用cpu的vt和vt-d后,得到的是这样的结果
# xm dmesg | grep VM
(XEN) HVM: VMX enabled
(XEN) VMX: MSR intercept bitmap enabled
然后对xend的配置做一点点小修改:
打开 /etc/xen/xend-config.sxp,
找到行“#(vnc-listen '127.0.0.1')”修改为
(vnc-listen '0.0.0.0')
这个不是必须的。如果只让它在127.0.0.1监听,要安全些,但是我,喜欢方便。反正是在内网嘛,无所谓。
修改完后要这样重启xen
#/etc/init.d/xend restart
每个DomU需要对应一个配置文件,我的配置文件如下:
kernel="/usr/lib/xen-ioemu-3.1/boot/hvmloade…

Java中的多线程

class Thread 实现了interface Runnable。可以使用一个实现了interface Runnable的对象来初始化一个Thread。
所以在java中创建一个Thread有两种方式从class Thread继承,并重写run方法实现interface Runnable,然后创建这样一个对象,然后用它初始化一个Thread对象。 (preferred)classTaskimplementsRunnable{ publicvoidrun(){ for(;;){ System.out.println("Thread 2"); try{ Thread.sleep(1000); } catch(java.lang.InterruptedException ex){ return;///thread end; } } } }; classTest{ publicstaticvoidmain(String[] args){ new Thread(new Task()).start(); } }; 默认情况下,只有在所有子线程都完成后 ,主线程的main才会退出,然后主线程才会结束。然后主进程结束。

Windows Media Player 11怎么在Linux上跑起来的

好奇。据说motorala RAZR2 V8尽管是Linux操作系统,但是可以运行windows player 11?
http://tech.sina.com.cn/mobile/n/2008-02-26/07242041856.shtml
V8 采用了Linux智能操作系统和拥有500MHz的AMR11处理器,提供更流畅的操作速度。其内置了420M的超大内存空间,另外该机拥200万像素摄 像头,并支持120分钟视频摄录,并支持暂停续录功能。借助内置的Windows Media Player 11播放器,兼容多种格式的多媒体文件,数据传输方面则提供了蓝牙以及数据线两种方式
我想这其中必定有些误解。过年的时候遇见卢习,他超喜欢这款手机,下次遇见他的时候我再问问。有达人知道详情吗?

Java基础数据类型的Boxing转换

staticbooleansameArgs(Integer a, Integer b){ return a==b; } publicstaticvoidmain(String[] args){ System.out.println(sameArgs(3,3)); ///true System.out.println(sameArgs(3,new Integer(3))); ///false System.out.println(sameArgs(3,Integer.valueOf(3))); ///true } sameArgs函数判断a,b是否指向同一对象,如果是,那么返回true,否则,返回false。因为它自身接收的是Integer类型的参数,所以在把一个字符整数3(它默认是int类型),传递给sameArgs的时候,会发生boxing行为。
如果使用new Integer的方式调用构造函数从一个int构造一个Integer,因为采用了new,这就将导致生成一个新的对象实例,而如果是使用Integer.valueOf这样的方式,可能会“重用"现有的已创建但是还没销毁的对象。boxing默认是采用valueOf这样的方式进行的。

unicode2成为emacs的主干分支

今天从cvs中获取emacs23的代码然后./configure的时候,被告知unicode-2分支已经被移动到主干分支中了.
恩,emacs22已经发布,emacs23也该被扶正了

今天又买了两本书,《纯粹理性批判》和《逻辑学导论》

今天去了趟万圣,主要是想把上次看见那本打折的《纯粹理性批判》买回来。
五折,厚厚的一摞,放在那里貌似没有多少人关心,因为剩的比较多,所以挑到本品相比较让人满意的。
然后顺便上楼去转悠了下,看见一本《逻辑学导论》不错,就买了。
回来在豆瓣一查,亏哦。万圣是九折,导致我多花了10多块钱。
也许,买书如买衣服,只在于挑选时的心情。逛网店,太没质感了。

《哲学概论》看完了

图片
虽说读之前已经有了些心理准备,但是……触动还是太大了。里面,各种各样的观点,总之,就是对自出生到现在,先前这20多年的所学所持有的哲学、伦理、逻辑观点进行了一次全方位的洗礼。触动太大了。(具体内容,容以后细述)
这本书精彩之处在于它的观点很中立,它提出很多问题引人思考,而不是中国的哲学书那样教导你必须做什么,必须认为什么什么。他引文非常多,以至于让我怀疑是不是作者为了凑页码而在偷懒。不过作为一本概论,这样也很合适,这样引得我去读那些原著。
他在每章的末尾都有一个比较“时髦 ”的话题引出来争论,题目如堕胎、“邪教”、中医、同性恋婚姻、安乐死、少数民族保护法案等等,选取正方、反方论文若干,全文附于每章末尾。这些文章都很精彩,立场明确,言语犀利,论证很有力。引的我很想去看它们的英文原文。
作者很推崇Kant。但是直到读到末尾,我才发现几乎没有出现过黑格尔的名字。另外,最后一章也很滑稽。尽管作者一改之前的语气,以非常庄重严肃的言语来讨论哲学中的宗教问题,来讨论上帝的存在性,但是,毕竟他是一个无神论者,所以,我觉得最后一章,完全可以用“蛇尾”来评价。

新RSS阅读器:Snarfer

以前一直在用rssowl,一个java写的程序,与其它java程序相比,界面很漂亮(很愤恨那些说java不适合开发桌面应用程序的人)。但是有一个小小的缺点,显示图片有问题。它在下载图片,发出http请求的时候,没有在reference字段填入正确的值,导致被很多网站认为是盗链而不予以显示。
我改天要做个浏览器插件,或者写一个防火墙规则。将所有向外发出的请求图片的http请求填上reference字段,如果它之前没有的话。
回正题,这本只是一个很小的缺陷,但是Snarfer没有这个缺陷。然后我把rssowl的纪录用opml格式导出,然后导入到snarfer中。转换的好顺利啊

Linux kernel又爆一个重大安全漏洞

今天在cn.bbs.admin看到czz转来的一篇文章,然后跟过去。一看是linux kernel的mmap又出了一个本地的安全漏洞。可使得普通用户获取root权限执行任意代码。这个漏洞貌似最先在debian上被发现的,http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=464953
附,探测代码:aaa.c (保存成aaa.c,然后编译 gcc -o aaa -static -Wno-format aaa.c ,然后执行./aaa即可。如果成功,则可得到一个root shell。)
有兴趣的可以拿unix-center.net的ubuntu主机做测试。

嘿嘿,zfs,开玩

嗯,首先用uname查看下版本。
bash-3.00# uname -srv
SunOS 5.10 Generic_120012-14
然后,卸载各分区。
bash-3.00# umount /data1
bash-3.00# umount /data2
bash-3.00# umount /data0
然后,创建zpool
bash-3.00# zpool create snnn_data mirror /dev/dsk/c1t1d0s2 /dev/dsk/c1t2d0s2
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t1d0s2 contains a ufs filesystem.
/dev/dsk/c1t1d0s2 is normally mounted on /data1 according to /etc/vfstab. Please remove this entry to use this device.
/dev/dsk/c1t1d0s2 overlaps with /dev/dsk/c1t1d0s8
修改/etc/vfstab,注释掉相关行后重试
# zpool create snnn_data mirror c1t1d0s2 c1t2d0s2
invalid vdev specification
use '-f' to override the following errors:
/dev/dsk/c1t1d0s2 contains a ufs filesystem.
/dev/dsk/c1t1d0s2 overlaps with /dev/dsk/c1t1d0s8
嗯,是的,以前有一个ufs了。那么,强制重试
bash-3.00# zpool create -f snnn_data mirror c1t1d0s2 c1t2d0s2
嗯,看看结果:
bash-3.00# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
snnn_data 68G 89K 68.0G 0% ONLIN…

去腾讯玩~

今天去腾讯北京分部玩,参加一个salon,在银科那边。嗯,去洗手间的时候,顺便四处溜达了下,发现这里工作环境蛮不错的嘛。起码,每个人的工位面积比我现在的大。角落里有一个休息室,有桌上足球和饮料机,看起来要比我们17层的休息室丰富些。嗯,其实,要是我,最想要的就是一排大沙发,软软的,红色的。最好,可以不脱鞋直接躺着睡。
腾讯的洗手间比较好玩,门口的标志,不是靠是否带有短裙来标示男女,也不是汉字,而是QQ GG和QQ MM。嗯,那个,头上戴有一朵小花的,嗯,不要进。
话说,周末的缘故,没有看到多少员工,亦,没有遇到真正的QQ MM啊。salon来了很多媒体,咔嚓,咔嚓。估计明天,就可以在各网站和媒体上看见这次活动了。很荣幸,我是第一个站起来提问的,嘻嘻。

计划:买IBM X61

计划买IBM X61的本子,装今年1月的open solaris或者indiana,在网上查了下硬件兼容性,只找到一条关于ThinkPad X61 7673LN2的纪录,貌似所有的设备都有驱动?如果能找个X61的本子运行下sun的那个设备检测工具就好了。
选择solaris而不是freebsd,主要是考虑它有Xen,可以作为dom0运行。理论而言,这样的运行方式要比vmware效率高很多。但是不知道windows作为domU在xen下的表现如何。
比较不爽的是,要离我亲爱的Freebsd远一步了。
谁有比较可靠的代理?敬请介绍下。
另外,一个外置的USB光驱大概多钱?

原来新浪也在做开源

怎么说呢,待了这么久,对这个公司了解的还是太少,没想到新浪还有开源项目。今天发现几个不错的开源项目,推荐一下:
项目名:xbaydns
网址:http://code.google.com/p/xbaydns/
负责人:黄冬
简单来说,是对bind9的一个增强,为其增加一个web管理界面,新浪研发的老大级人物倾力而作。
项目名:ncache
网址:http://code.google.com/p/ncache/
负责人:不详
简单来说,就是在nginx的基础上实现cache
项目名:memcachedb
网址:http://code.google.com/p/memcachedb/
负责人:不详
简单来说,就是memcache + berkeley db。

用tasklist找出隐匿在系统进程之后的病毒

windows很多病毒,它是通过rundll32.exe或者svchost.exe(系统服务)运行的。
如果是通过rundll32.exe,那么,用这样的方式查它运行了哪些dll
tasklist /m /fi "IMAGENAME eq rundll32.exe"
如果是通过svchost.exe执行的,那么
tasklist /svc
tasklist是windows中使用极其复杂、参数超多的一个命令,威猛啊。但是貌似,home版下没有。

gmirror+ggate != DRBD

Freebsd下没有类似的专有文件系统,但是可以通过gmirror和ggate达到类似的效果。
gmirror是geom中一个用于做软RAID的工具(RAID-0或者RAID-1)
ggate是一个类似于NFS的东西,用于把一块磁盘导出供另外一台机器挂载。
于是做法就是
首先在两台服务器,A和B上各找一块大小相同的物理硬盘,然后用ggated导出。(注意,这两块硬盘坚决不能在A和B上挂载)
然后在另外一台服务器C上,用ggatec挂载上这两块硬盘。挂载前首先要确认没有其它的服务器也挂载了这两块硬盘。
然后在C上用gmirror做RAID-1。
然后用把做好的RAID-1挂载在C的文件系统中。
如果某两台机器间的网络发生问题,如C和A之间,那么对于每个读写操作,ggate会返回EIO。于是gmirror就会自动把这台机器从RAID中移除出去。之后网络恢复后需要人工处理。
但是这样做有个问题。
文件的信息分两部分,meta data(inode等)和实际数据。而通常文件系统为了加速文件系统的性能都是采用的异步写的方式。例如要删除一个文件,它可能先修改inode信息,然后再在适当的时候刷新文件数据到磁盘。
此时,如果另外一台机器正在读这个文件,它应该是先读inode节点。然后再根据节点去找文件。由于主机间缺乏锁机制,如果这删除和读这两个操作在两台机器上交替进行,那么可能读到的就是不正确的数据。

小技巧:找出已安装的包中版本号重复的

pkg_info | sort | sed -e 's/-[0-9].*$//' | \
uniq -c | grep -v '^[[:space:]]*1'
例如我装了两个automake
> pkg_info -Ex automake
automake-1.10_3
automake-1.9.6_2
那么就会得到这样的输出:
> pkg_info | sort | sed -e 's/-[0-9].*$//' | \
uniq -c | grep -v '^[[:space:]]*1'
2 automake
但是未必就需要从重复的中删除一个,例如glib
> pkg_info -Ex '^glib'
glib-1.2.10_12
glib-2.14.4
glib1和glib2在ports中对应不同的目录,分别是两个port。它们区别很大,不能相互替代,所以经常需要两个都安装。

ffsdrv的大文件漏洞原来已经被补上了

今天迟钝的去了下ffsdrv的官方网站,http://ffsdrv.sourceforge.net/ ,若要在win下浏览freebsd的文件系统,这是唯一的驱动。但是它一直有个问题,就是不能读取大文件(50M以上)。今天迟钝的发现,在距离上一个版本发布2年半后,这个漏洞终于在众人的期盼和唾沫中被补上了。Apr 21, 2007。值得纪念的日子。

Freebsd安全漏洞:inet_network栈缓存区溢出

官方安全公告:http://security.freebsd.org/advisories/FreeBSD-SA-08:02.libc.asc
CVE: CVE-2008-0122
影响范围(我认为):
所有以静态方式链接了libc库并且使用了inet_network函数的程序。
探测:
测试代码#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <locale.h> #include <sstream> intmain(int argc,char* argv[]){ setlocale(LC_ALL,""); std::ostringstream oss; oss<<"127.1.1.1."<<(unsignedint)-1; in_addr_t addr=inet_network(oss.str().c_str()); return0; } 编译链接后用gdb载入,可以看见char c的值被意外覆盖。
Breakpoint 4, __inet_network (cp=0x804b0e0 "") at /usr/src/lib/libc/inet/inet_network.c:97
97 *pp++ = val;
(gdb) p c
$4 = 0 '\0'
(gdb) n
98 n = pp - parts;
(gdb) p c
$5 = -1 '\377'
测试环境是x86,freebsd 6.2。我觉得这不是什么大不了的漏洞。
解决办法:
1、cd /usr/src
2、wget http://security.FreeBSD.org/patches/SA-08:02/libc.patch
3、patch \libc.patch
4、然后按照<http://www.freebsd.org/handbook/makeworld.html
进行make world并重新链接受影…

VS8的CRT的调试功能太优秀了!

来看一段不小心误写的代码#include <iostream> #include <fstream> unsignedcharlenToKey(short nLen){ ///取出长度的高位和低位 unsignedchar nLenLow= nLen && 0xFF; unsignedchar nLenHigh= nLen >> 4; return nLenLow ^ nLenHigh; } intmain(int argc,char* argv[]){ constchar* const filename="D:\\msg\\matrixdb"; std::ifstream ifs(filename); char rType; ifs.get(&rType,sizeof(rType)); short nLen; ifs.get(&rType,sizeof(nLen)); unsignedchar key=lenToKey(nLen); return0; } 变量nLen所在的内存,未经初始化便投入使用。如果是在Freebsd下,不借助于valgrind这样的错误要花很久才能调试出来。而在VS下按F5,瞬间得到这样的诊断信息:
“Run-Time Check Failure #3 - The variable 'nLen' is being used without being defined.”
试问,任何unix的libc,有哪个能做到这么智能?

dijit.form.Textbox不能设置size?

我想让dijit的那个textbox的长度变长点,试了很多种属性,都不成功。在网上搜了下,貌似所有的textbox都是一样长。即便把maxLength设置的特别特别短,它还是那么长。
奇怪ing~~~

小道消息,微软在搞emacs.net,似乎是GNU.net的前奏

嗯,如大家所知,emacs是一个相当出名的编辑器,gnu的代表作。emacs和Richard Stallman有很深的渊源。微软从开源社区挖了很多人过去,这当中有很多人都很喜欢emacs,连vs现在也提供了emacs风格的key bindings。现在,微软有人想搞emacs.net,用.net重写一个emacs。 http://www.douglasp.com/blog/2007/12/27/EmacsNet.aspx他们正在招人 http://www.douglasp.com/blog/2007/11/15/MyTeamIsHiring.aspx貌似连大名鼎鼎的Don Box(写XXX本质论的那个)也是emacs的忠实用户,并且,也参与了这个项目。微软的员工社区channel9上有一篇关于这个的讨论 http://channel9.msdn.com/ShowPost.aspx?PostID=369049

AMD 64 (1)

我一直告诫周围的朋友,买电脑千万别赶潮流迷信什么双核、64位。但是其实,我自己对这些新的CPU技术也不怎么熟悉。嗯,那么,就专心学学吧。 —————————————————————————————————————— AMD64的新特性: 一、寄存器扩展
1、增加了8个通用寄存器(以前已有8个)
2、所有通用寄存器(16个)都是64位的
3、8个128位的XMM寄存器
4、使用一个指令前缀,访问那些扩展寄存器 二、长模式
1、64位的虚拟地址空间
2、64位的指令指针 (RIP)
3、Instruction-pointer-relative寻址模式
4、平坦的地址空间 其指令集中的指令主要分为以下4类:
1、通用指令。指mov、add这些,通用的计算指令
2、128位多媒体指令。 (SSE系列,不过说实在的,amd的CPU对sse的支持显著的要比广告中的差)
3、64位多媒体指令。即MMX 和3DNow!
4、x87浮点指令。貌似是为一些老的应用程序专备的。现在还有人用吗? 三、模式
AMD64比较复杂,提供了好几类运行模式。
首先,总体上而言,分为长模式和遗留模式。64位的操作系统下的程序运行在长模式下,32位的操作系统及应用程序可以不经改动的运行在遗留模式下。 大体来说,长模式分为64位模式和兼容模式。
64位的应用程序在64位的操作系统下以64位模式运行。而以32位方式编译的应用程序在64位的操作系统下以兼容模式运行。
而遗留模式又可分为以下三种子模式:
1、保护模式。 支持16位和32位的程序的内存分段、可选的分页、以及权限检查机制。在保护模式下运行的程序最大可以寻址4G的内存。
2、虚拟8086模式。 虚拟的8086模式可以让16位的实模式程序以保护模式的方式运行,并为其提供最大1M的寻址空间。
3、实模式。不支持分页,不支持权限检查。最大1M的地址空间。 四、内存管理
在内存管理方面,传统的x86是采用基址+段偏移的方式进行寻址。在过去来说,这是一个很大的进步啊。386以前,那时候还不存在逻辑地址一说。所有的程序和系统本身一起共享同样的地址空间,共享所有的物理内存。在引入分段机制及地址转换单元后,相同的代码,被载入不同的内存地址运行的时候,需要改变的仅仅是段的基址,大大的提高了代码重用率和软件在不同环境下的适应性。但是呢,分段式内存管理的一个缺点就是易于…