Dec 24
IUSR咿咿呀呀 gadget, linkedin

Panasonic BL-C131A Network Camera Wireless 802.11
入手了大约一个星期了,目前感觉良好。
其实一直以来想要的都是Wowwee的Rovio,1、2年前就知道Rovio了,视频什么的也看了不少,觉得很cool很有用的一个东西,不过鉴于一直要存钱娶媳妇儿,不能买这种大玩具,只好吞了吞口水。现在也变成已婚人士了,家里又是传说中的双职工,有时离开家后还会惦记着煤水电是不是都关好了,Rovio逐渐变成了我眼中的必需品。
最近这次出差时,心想总算有机会可以买Rovio了吧,不料丫还卖断货了,官网提示Amazon上可能还有货,遂去看了看,天,已然从以前的$229、$239飙升至$299,完全就是一个iPod Touch的价码。考虑到当时买新上市的iPod Touch 3GS 32GB才同样的价格,还能打折便宜一些,而且相比之下iPod Touch还算对工作学习有帮助,干脆就放弃了Rovio,和同事一起组团儿买了iPod Touch。出差回来以后,虽说iPod Touch玩的很欢,可一上班了又会隐约觉得家里没人不放心,于是又动起Rovio的脑筋。
终于!感恩节期间,Rovio官网总算又有货了,而且降价到$229.99,还可以选择UPS并且免运费,最走运的是当时还有同事在美国出差,也答应了帮我带回来这个尺寸稍大的玩意儿,当时感动得真是觉得…要是每天都过节就好了啊!
下单之前忽然想起来去Amazon看了一下别人的评论,结果…忽然觉得Rovio这东西不靠谱起来…比如有人说它经常无故无法进入dock,导致没法充电,本身因为电池又要负责Wi-Fi又要负责丫四处转悠,顶多撑一个小时就没电了;有人说摄像头的远程遥控基本就是个笑话,只有3档:看地板,高一些,看天花板;有人说太阳刚开始下山的时候屋里不开灯的话就什么都看不清楚了;等等等等。一下子看的我的心都凉了,也骂自己在Web 2.0的年代网上购物却没有想起来查看别人对这产品的评价,一直对着官网的正面宣传流口水。看来这玩意儿还不是太成熟,或者按某些人说的,这个价格这种质量已经不错了,追求高清晰度成像的话还是花个一千多刀买专门的安全摄像机好了。
随即打消了买Rovio的念头,抄起来1000多RMB,总不能拿来远程检查地板擦没擦干净吧。在Amazon上又转了转家庭安全保障方面的设备,发现了这个价格不高评价却很不错的Panasonic BL-C131A Network Camera Wireless 802.11,价格是$249.99,比当时Rovio的价格贵一些,不过功能似乎更多一些。综合一下其他用户的评价和买家的review,最终下单。顺便利用了一下当时的Amazon Prime一个月试用,搞了个免费的2个工作日送货,免得同事都回国了东西还没到。
等同事终于出差归来,把Amazon的箱子交给我的时候,实际上我几乎已经要在公司就插上电源开机了,更别提旁边一大票电子玩具爱好者一直在撺掇。不过,谁叫咱专业呢,我决定继续吞口水,回家再说,不给起哄的看~

没有来得及给产品包装盒拍照,因为我已经迫不及待地拆开了…
打开包装,第一感觉是…这摄像头还真小…本以为可以大一些的。电源的变压器还不错,最高可以接240V 60Hz的电源,网络方面支持有线和无线802.11b/g,视频拍摄的最高分辨率640×480,水平视野49°(最大149°),垂直视野37°(最大87°),etc.,更多的就不说了,在松下官网的产品页面上有详细的技术参数。照说明书的提示,把包装里带着的螺丝拍进墙里——说到这就要赞一下松下还在说明书的边缘画了一下螺丝钉的间距,比较细心,想以前往墙上固定点儿什么时一不小心距离没掌握好就要恶心地左右微调——不怪我不专业,当初上门装空调的师傅也是凭感觉的,最后还是免不了手动调整一下的。然后首先需要用网线把摄像头连在路由器上——总不可能靠喊的来告诉摄像头家里Wi-Fi的密码吧,再用随机光盘中的管理工具在本地LAN里搜索出这个摄像头,进入它的web管理页面,配置一些最基本的选项,比如管理员的用户名和密码,Wi-Fi热点的SSID和密码,做完这些基本配置以后,重启并拔掉网线,把网络接入方式的开关拨到无线方式,这个摄像头就算基本设置好了可以工作了。最后自然是毕恭毕敬地把它安在墙上拍好的螺丝钉上挂住。

值得一提的是这个摄像头的“软”功能真是比较丰富:最基本的远程遥控摄像头移动就不说了,输出方面视浏览器的支持可以用静态图片、MJPEG和MPEG-4视频,用IE访问的话还可以单向输出从摄像头内置麦克风输入的音频(当然需要先装个把ActiveX控件),可以预设几个常用的摄像头移动位置以方便直接转向;支持运动检测并连续拍照缓存——这可是防贼必备,虽说我家的小区是这块治安最好的——以及定时拍照缓存,缓存中的照片可以通过FTP、HTTP和SMTP方式发送;网络方面支持通过UPnP自动配置同样支持UPnP的路由器的端口映射配置,直接通过动态DNS服务发布服务——虽说比较危险,为了安全考虑,支持配置多个权限不同的用户,并为用户设置允许的和默认的图像输出格式,以及允许查看的时间,这样出门在外的话不是必需的话可以用低权限用户远程查看,避免不必要地暴露管理员帐号;如果买了N个同系列产品,还可以配置多台摄像头的图像输出,有点保安监控电视的感觉。最贴心的感觉还是那个Privacy模式的大按钮,一按下去以后,镜头就会向上移动然后被覆盖住,同时web界面也会禁止管理员之外的用户访问,当然管理员还是可以远程解除Privacy模式让镜头再转出来的,但是有这么个大按钮就能保证即使使用这个摄像头的人是个计算机白痴,也能毫不犹豫地按下这个按钮保护自己的隐私——要是不懂“privacy”这个单词的话就另说了。
比较不舒服的是web管理界面不支持SSL连接,而且是做HTTP Basic认证校验用户名和密码,当然要这么个小设备做太多的运算还是有些强人所难,只好尽量用最低权限的用户登录,并且隔一段时间就修改用户名和密码。
有了这个小家电,上班终于放心了。就算我有些偏执吧,谁不稀罕自己家乜?至于为啥不在国内买,我琢磨着但凡有些生活经验阅历的人都能明白吧~

Dec 14
IUSR技术文章 linkedin
其实一共也就才2天。
还是头儿一直张罗着要做一个设计模式的培训,因为连续2次公司技术考试里大部分人对设计模式的试题回答得都比较业余。我一直觉得这种东西是很虚的那种技术,所以一直以来不是太感冒:曾经有过N次都是看了设计模式的书就发现自己前几天在干的东西就是某模式,总觉得一帮人吹的那么神乎其神干什么。今天讲师也正好提到了Joshua Bloch大爷也有这种经历。所以说,自然而然地在不了解模式的情况下就应用了一种或N种模式也不是什么稀奇的事情,更不值得沾沾自喜,只不过不学习设计模式就能自己总结出目前流行的所有这些设计模式,那就真是神一般的存在了。
今天想记一笔,主要是因为有一个题目有点儿意思,直接就和讲师想到一起去了(过分低调了,否则可以拿个小奖品),而且应该比他想的还多一丁点。
题目很简单,设计一个logging框架,要求主要是:
- 支持同一笔log记录到不同的目的媒体,比如文件、数据库,或者通过socket传输字节流;
- 支持同一笔log记录到不同目的媒体时使用不同的格式;
- 支持log分级;
- 除了将log级别作为是否记录log的判别标准以外,要允许用户创建自己的算法逻辑决定log是否记录。
大概就是这个意思了,细节记不太清。
很多人的第一印象是:这不就是一个设计log4j么?!不过仔细考虑的话,1和4都是log4j不能直接支持的;第1个要求可以通过log4j.xml配置方式通过AsyncAppender搞定,但显然这是具体实现类的行为,没法体现框架的设计思路。

类图,草稿,而且不规范
上面是草草画的一个类图,很草,而且也不规范,箭头的实虚都是后来看了UML类图规范又改的。
在大部分人都直接认为这就是个log4j的设计的时候,我和组里的几个哥们儿还是识别出来明显的差异,然后开始了我们自己的设计,目的很朴素:一定要和log4j不同,否则就不去演示了。
不过log4j在大部分java开发人员思维方式里的先入为主的地位还是很严重的,几个接口方法定义过来一看,还是那么地log4j。这可不行。于是先来统一一下中心思想,直接套一个大概还靠谱的模式:chain of responsibility。其实我心里完全想的是另外一个模式:J2EE核心模式里的intercepting filter。主要因为似乎chain of responsibility最原始的定义是最终链中只有一个节点被执行,而我的想法是把输出log的对象做成chain,这样肯定需要链中有0到N个对象能被执行,虽然可以说是种扩展,不过还是别在讨论严肃话题的时候捣浆糊的好,再者,借助filter就可以很容易地针对log级别和用户自定义逻辑进行过滤,只让满足所有条件的log被最终记录下来。
这个时候log4j给我们的先入为主的印象又作祟了一小下;控制输出log的被定义为类似log4j的Logger——姑且也叫做Logger吧,然后向log4j看齐一下,每个Logger都有一个名字,名字的命名规范和java的包及类名的命名规范类似,做成了树状的实现了继承的结构。这时我和另外一个老哥就有一点儿傻眼了:这成了树了,怎么搞链式调用啊?马上我想到一个补丁:生成一个广度优先遍历,哇,这样似乎又和iterator拉上关系了;并且然后允许客户代码获取没有预先配置好的Logger,默认的log行为是继承父节点的行为,这也比较类似Log4j,然后每一次客户代码获取没有预先配置好的Logger的时候,框架就在其父节点下挂接上这个新的Logger,更新广度有限遍历的iterator,etc.。如此这般,折腾了一会儿以后,我失望地发现,哎,这不还是log4j么,核心的部分基本是换汤不换药的。
好在随即马上又想到一个补丁。以上的思路的中心都是Logger们用命名规范生成出来的一个树状结构,痛苦也来源于此,但是现在已经有了filter的定义,不如换个思路,把记log时所用的Logger的名字一起作为参数传到filter中,然后做一个根据Logger名字来决定是否过滤Log消息的filter。这样一来,让我头疼的树状结构终于被干掉了,对框架来说偷了些巧,而且实现这样一个拿到Logger名字然后做一下字符串操作的filter也远比遍历、维护树状结构容易很多。至少针对这个题目看来,树状的结构没有带来更多的好处。
于是我们team就产生出了2种设计:一种是之前最终演化成和log4j基本差不多的设计,一种是我更喜欢的剥离出Logger名字管理的使用了intercepting filter模式的设计。后者明显更简单一些,没有不必要的处理。事后才反应过来,那个树状组织Logger的方式完全不是必需的,题目也根本没提到,只是作为一个需求更改验证了一下我的想法能处理这种组织方式。
讲师在看了其他team的设计之后也公布了一下他的设计,据他说那是97、98年左右的事情了,那个时候他也是刚毕业,和项目经历一起花了一个晚上重构他之前的臭代码到这个设计。98年左右,国内是肯定没有引进设计模式这本书的了。
之后也有其他很多同事“攻击”了chain of responsibility,指出这个模式和这个题目的要求似乎不太搭调,毕竟没人要求必须按照某个顺序记录同一笔log,而observer模式应该更适合一些。其实这个问题用observer的缺陷是很明显的了,filter逻辑完全要再借助其他类实现。无所谓了,好在我提到是用intercepting filter,而不是chain of responsibility,如果照讲师的说法,chain of responsibility带个filter,那observer带个filter不也可以解决同样的问题么。
是以为记。比较意识流了一些,嗯。想想这样一个logging框架,做出来应该也是有一定用途的吧。
作业是一个异常处理框架。实在有些想用上AOP,不知对付OO设计模式的题目算不算作弊乜?
Sep 19
IUSR咿咿呀呀 linkedin
临走前电视里正播Carlifornia这儿的大火,说都要烧到机场了云云,所以老婆和爸妈都挺担心的。其实降落时也没感觉,就听见有人嚷嚷能看见好莱坞的大牌子,妈地,我坐在中间座位上也肯定是看不到了,不知道真的假的。不过后来看网上的图片,那大火确实够牛X的,有种灾难大片的感觉。
洛杉矶国际机场感觉真大啊啊啊啊啊啊啊啊啊,布局跟北京那个很不一样,不过因为急着转机也就没逛。
过海关时还好,只不过因为顺路捎了些要寄给在这儿上学的大姨子的食品和衣服,有一些吃的被人家要求当场扔掉,唉,想当初在超市时买的时候也花了不少钱了。也算积累了一些经验值:鸟身上下来的东西,甭管是啥,以何种形式出现,都是要扔的,包括快熟汤料;牛肉的话,罐装的可以,塑料真空包装的都要扔;不要想蒙混过关,海关的人多少都懂一些汉语和汉字,带个鸟字旁的字他们都认识。甚至于,我带的一包话梅肉都被海关的帅哥拿起来检查了半天,问我说这到底是啥,我解释了半天是plum之类的东西,他问,上面不是有”肉”字么,我当时就震惊了,这丫也太精了,还认得汉字,遂顺便给其介绍了一下我国汉语的博大精深,颇像一周以后某同事跟请我们吃饭的印度同事解释豆沙的”沙”字。最后帅哥表扬了我的配合精神,拿了我的护照不知道做了啥记录之后还给了我,对我莅临美帝表示了欢迎。整个过程气氛友好,我们还对食品卫生以及恐怖主义这类关系国计民生的问题亲切交换了意见。
后来我觉得吧,估计要是忽悠忽悠他,好多东西也就不用扔了。一帮很单纯的人。算啦,谁愿意缺这德谁就缺去吧~
美帝安检很严格,转机过安检门时就差脱掉裤子了。鞋要脱,皮带要解下来,衣服口袋里不能有任何东西,笔记本要从包里单独拿出来放盒子里,上面还不能有东西覆盖。队伍前面某位不太配合的老哥导致我们后边的人等了将近20分钟,害得我一直怕错过2小时以后的那班去圣地亚哥的航班。其实还是我太实诚了,后面的航班提前10分钟才慢慢腾腾地广播提示开始登机。其实估计也因为这个航空公司太颓,虽然名头听起来还很牛X,American Airlines,域名也很牛X,aa.com,看见了飞机才知道,那么小的飞机,就差用螺旋桨了。这也让我误以为美帝的国内航班可以不用像国际航班一样那么早提前几个小时就过去机场。
飞机虽小,坐上去还是比较舒服的,估计美帝人民每天生活在水深火热当中只能以暴饮暴食聊以自慰,都长得很富态,所以飞机的座位空间都很大,后来从圣地亚哥飞旧金山的时候坐的美联行的飞机也是。于是让我很不能理解第一次出差时坐的英航的波音767,竟然能挤成那样,没见英国人很矮小啊!
这次飞行过程中我开始觉得悃了。从北京飞到洛杉矶的途中基本没怎么睡觉,旁边的一个导游老姐感冒了,频繁咳嗽打喷嚏擦眼泪,伴随着一些小动作,所以虽然我的座位相对来说比较不错,我也从一上飞机就试图睡觉休息,可还是一直没能睡踏实,最长的睡眠时间估计也就不过半个小时,其他时间都在看出发前快递来的书,虽说是后来基本没用上的书;而另外一边的导游姐姐在被乘务长亲自制止了拿iPhone玩游戏的行为以后,倒头就睡,一直睡到降落洛杉矶前半小时。就像上次出差途中一样,这种人我一直都惊为天人。
快降落的时候,这AA的机长开始抒情:俺们的圣地亚哥这旮儿多美啊,夜景更是美啊,云云。往舷窗外看了一眼,我靠啊,这么黑?没路灯么?我心里马上就唰地出现了一个城市的模糊的形象:N多墨西哥偷渡来的小混混,身上都纹着带鱼,拉帮结伙地在街上乱转,黑灯瞎火的路上,有人被打劫,有黑帮火拼,et cetera。我的小心肝儿一下就紧张到极点,肾上腺素也嗖地全出来了,瞬间就不悃了。
降落了,出了飞机还要走好远到出口,黑灯瞎火的,感觉这机场够小的,圣地亚哥也肯定是个破破烂烂的落后城市——后来的经历证明这完全是我的幻觉而已。到了出口附近领行李,谢天谢地两个箱子都还在,感谢全球航空公司和机场的协作机制,感谢社会主义国家人民和资本主义国家人民能不计前嫌携手保障人民出行。拉起两个箱子,按指示走到可以叫出租车——也就是传说中的cab——的地方。左右看了看,路上基本都没人了啊,这才10点,放咱那儿正是马路边儿上支起桌子吃砂锅的钟点儿啊。出租车隔了10分钟才到——要说这地儿的出租司机可真有派儿啊,放咱那儿都要排着队等着谁叫车,这可好,还得现打电话叫。拎包上车,给司机看了看目的地地址,司机操着西班牙口味的英语拍胸脯表示没问题。暂时没搞清楚美帝这儿的邮编是不是像英国那里一样精准,据说英国的邮编能定位到几间房子的范围。美帝这儿的出租车可真大,开起来也真快,就是路上果然真是没啥路灯,不过也没有想象的那么少,很多都是被高大的棕榈树给遮住了,在飞机上看不到,只是有些路段还是要完全靠汽车的车灯照明。路上大伙开的都很规矩,没见来回乱窜并道的,外车道的车也基本都是开着很快的,没遇到天津快速路上那种一个小面包儿嘶吼着以50kmph的速度占着快车道的情形。
和我预料的差不多,从机场到酒店开了老半天才到。入住又出个小插曲,前台MM说公司的信用卡结帐时出了些问题之类的,要留我的信用卡以备不测。日,留就留,咱那额度换成美元也不够您刷的。
房间还算不错,双人间,比较大。时间比较晚了,我也基本上全程没怎么睡觉,于是就洗洗睡了。
Sep 19
IUSR咿咿呀呀 linkedin
已经来美帝两周了,一直也没写点儿什么。今天周末,除了老大请客吃晚饭,之前也没什么活动安排。吃过早饭就来公司写文档,顺便写点儿别的。
2008 年8月18号,一个阳光普照风和日丽万里无云的日子,我高高兴兴地乘坐着天津至北京的城际列车,前往首都安家楼美国使馆签证中心,办理美帝签证。那火车真 是快啊,还没爽够就到北京南站了,而且可以免费拿到传说中的西藏产矿泉水。从亮马桥地铁站出来就看见牛X哄哄的燕莎,真是大买卖儿,一看就知道咱没可能存 钱给盘下来。
签证比较顺利,也算在意料之中。咱多少也算签了几次了,每次都是事先觉得可能会很比较麻烦,过后发现自己真是太实诚太当真了。公务签有公司保着,基本不会 为难啥,旅游签有旅行公司保着,也不会有问题。最大的问题就是同胞们来签证的人真是太多了,每次都是要等起来没完。记得法签的时候是有中法智签,等候时间 很少,英签的时候去的银座那里的签证中心,人就比较多了,不过等候时间也可以忍受。这次是去美国使馆的签证中心,光排队就排了1小时20分钟,比以前两次 加一起还要多。面试官那里倒是没有什么问题,基本人家问我来答,人家说英语我就说英语,人家说中文咱就说中文。排队时看到很多学生模样的人,手里还捧着个 讲稿,英文的,天,实诚到家了,这还带打草稿的么。还有就是网上看见一个大姐,全程跟面试官拼英文,被毙了N次,然后看了签证中心的blog才幡然醒悟, 下一次面签的时候就和签证官选择的语言保持一直,一次性就过关了…
然后就没事儿了,没当面把护照退回来的应该都是过了的。
飞机是9月6号飞洛杉矶国际机场,LAX,然后转机去圣地亚哥,SAN。一起出差的有5个同事,只有我的行程比较特殊,需要去圣地亚哥呆一周再飞去总部,人家都是飞旧金山然后来总部Redwood City这里。
多少咱也是飞过几次的人了,经验教训也积累了一些,所以这次很早就去机场领登机牌,特地要了最前排的座位,因为只有坐这排才能把腿伸开,否则这12个小时 以后肯定是膝盖疼外加腿酸得实在受不了。不过虽然有了前排座位,可既不靠窗也不靠过道,是3个座位里中间的那个。登机以后明白了,两边都是导游,赫赫赫 赫,这就不说啥了,旅行公司和航空公司也基本都是关系户了吧,这种好座位,整天飞来飞去的导游们肯定第一时间能搞到。期间还看到感觉像领队的某人塞东西给 机长和乘务长,作为一个中国人,我对此深表不新鲜不奇怪不打听。俩导游坐上飞机以后很放得开啊,哦,不是那种放得开,我是说人家很会休息,一起飞就赶紧换 拖鞋啥的,还把随身的小行李箱放前面然后把腿架在上面,那叫一个舒坦…看的我真想掀开过道的帘子钻头等舱里去。
一路无话,自己一个人,比较那啥,寂寞。
Mar 18
IUSR技术文章 java, linkedin, openjdk
接上篇,当openjdk6的代码库已经用mercurial clone/fclone完毕之后,就可以构建openjdk6了。当然构建与阅读源代码没有太大关系,只是如果日后还要做hack的话,总要通过构建和测试来检查、调试自己的hack不是,所以了解openjdk6的构建方法还是有点必要的。
基本上,代码库根目录下的README-builds.html中的讲解已经很到位了,我这里再简要地啰嗦一下整个步骤,权当个中文翻译好了。
- 必需的应用程序:gcc 4,g++ 4,GNU make (>3.80),m4 (>1.4.4)。以及README-builds.html中指定的很多个开发包(dev)。我的操作系统是Ubuntu 8.10,内核版本为2.6.27-14,按照README-builds.html的包依赖关系,一下子:
sudo apt-build install binutils cpp libfreetype6-dev g++ cpp-4.1 g++-4.1 gcc-4.1 gcc-4.1-base libstdc++6-4.1-dev gawk gcc libasound2-dev libc6 libc6-dev libc6-i686 libcupsys2-dev libgcrypt11-dev libgnutls-dev libgnutls26 libgpg-error-dev libice-dev liblockfile1 libopencdk10 libpopt-dev libsm-dev libtasn1-3-dev libx11-dev libxau-dev libxaw7-dev libxdmcp-dev libxext-dev libxi-dev libxmu-dev libxmu-headers libxmuu-dev libxp-dev libxpm-dev libxrandr-dev libxt-dev libxtrap-dev libxtst-dev libxv-dev m4 make ssl-cert x-dev x11proto-core-dev x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-record-dev x11proto-trap-dev x11proto-video-dev x11proto-xext-dev zlib1g-dev
就好了。我的机器里其实已经装了libstdc++6-4.3-dev以及g++-4.3,不过保险起见还是把g++ 4.1以及libstdc++6 4.1的东西搞进来了,尊重一下README-builds.html,也顺便给自己少找些麻烦——后来测试的时候还真发现用libstdc++6 4.3或者g++ 4.3的话会编译失败,大概看了看错误信息,结论是以我现在的c++水平如果要把它port到4.3的话还是暴有难度的…嗯,那就4.1吧,听话的孩子有糖吃。
- 参照README-builds.html,有2个环境变量是必需的,当然这俩环境变量的值指向的目录也不是乱来的:
- Bootstrap JDK:README-builds.html自己都说了,编译openjdk6的时候还需要一个已有的jdk6是很那啥的。没办法,估计语言发展起来之后需要自己来编译自己的某一部分也不是很罕见的事情吧。我的系统里已经装了SUN的jdk6,所以,ALT_BOOTDIR=/usr/lib/jvm/java-6-sun。
- JDK binary plugins:这东西还是个新鲜玩意儿,以前是没听说过。照着README-builds.html里的指示,按图索骥到最新发布的jdk 6 binary plugins:http://download.java.net/openjdk/jdk6/promoted/b14/jdk-6-ea-plug-b14-linux-i586-25_nov_2008.jar。这是个可执行jar文件,java -jar一下,accept一下条款之类的东西,指定个目录就可以安装了。安装完成后,在安装目录里会看到一个openjdk-binary-plugs的子目录,结构和普通jdk一致,内容只有两个文件:LICENSE和jre/lib/rt-closed.jar。rt-closed.jar的内容没什么惊喜,一堆SUN自己的SNMP功能的支持类,光看这文件名就知道肯定是不方便开源的东西。不管它的内容:ALT_BINARY_PLUGS_PATH=~/projects/openjdk/jdk6-bin-plugins/openjdk-binary-plugs/ 。
- 其他的几个环境变量我是没有再手动设置,估计debian系的系统里,那些dev包安装妥当之后也不用再自己设了。
然后,终于可以开始make了,先来make sanity一下,确认当前配置没问题,没问题的话就可以直接跑make了。所有c/c++的代码无疑都是gcc、g++来编译的,其他诸如corba、jaxp、jaxws是单独用javac以及ant编译的,我用的机器上已经装好了ant 1.6.5,编译jaxp和jaxws时也没出什么问题。整个make过程在我这台P4 2.4G MHz 2G RAM的机器里花费掉了…差点儿一个小时…中间看到”linking vm…”的时候我几乎要哭出来了…
make成功后,build/目录下包括所有编译、链接出来的可执行文件以及jar包,还有javadoc。里面的j2re-image和j2sdk-image分别是…jre以及jdk,嗯,废话,是吧。进到bin目录下./java -version一下:
iusr@wisdom:~/projects/openjdk/jdk6/build/linux-i586/bin$ ./java -version
openjdk version “1.6.0-internal”
OpenJDK Runtime Environment (build 1.6.0-internal-iusr_18_mar_2009_16_32-b00)
OpenJDK Client VM (build 11.0-b17, mixed mode)
Yay!
Update: 到一台默认语言设成中文的ubuntu 8.10上重make一次,结果出错了…有3个注意事项要更新一下:
- g++、libstdc++6 dev包的版本问题。如果几个版本共存的话,确保g++-4.1在PATH的最前面能被最先找到。这个比较好解决,而且一旦g++版本正确的话也会确保include路径是对应的libstdc++6的头文件库。小问题。
- make之前要unset JAVA_HOME。这个环境变量如果存在的话make sanity会报错,错误信息也很明显,所以,同样是小问题。
- LANG=C。无论export出去还是运行make,一定确保LANG兼容英语,否则会出现很奇异的错误…
- apt-build install libmotif-dev 。这个忘记了很不应该,因为我用awesome,所以还特别地在.profile里export AWT_TOOLKIT=MToolkit了的。
其他的诸如gawk、m4之类居家旅行必备的东西,如果落下没说的话还请自己装好。
Mar 16
IUSR技术文章 java, linkedin, mercurial, openjdk
最近几天在抽空看openjdk6的源代码。总觉得如果打算干很久java的话,光靠看tutor、doc、reference始终有种底气不足的感觉;src.zip里的东西可以随用随看,但各种本地方法调用以及src.zip不方便包含的类的源代码都是平日在eclipse里开发时很少会花时间看的,但这一部分往往最能决定一个java应用程序的性能。其实预谋了很久了,大概多半年到一年前就有这打算了,可始终没什么空闲,杂事也很多。
OpenJDK老窝在http://openjdk.java.net/。记得早先mustang、dolphin还都在dev.java.net这个域下,而OpenJDK直接挂在java.net下,身份自然特殊。不管别人怎么看,我是想目前先看jdk6的代码,因为日常开发正在用,jdk6也是SUN目前的主打版本,VM特性和API也更稳定,相比之下,jdk7还在密集开发之中,平日看看各种相关人员的blog,新特性、新API也是隔一阵儿就来一个,现在追起来肯定会很累,虽说jdk7也肯定是以后的主流。
获取openjdk6的代码其实也不复杂,尤其是download source bundle的方式,当然也更没劲一些——我(们)的目标是:往死里折腾。
折腾当然有折腾的好处。当你clone了整个一个mercurial forest以后,查看变更记录是了解各种特性、API以及bug fix的最直接的途径,比看什么release notes都管用,而且适合fork出自己hack过的版本——听着很吓人,其实一个hack不见得必须是一个很BT的很完善的东西,那样的话基本成了添加一个feature了,还不如去盯OpenJDK社区啥时候再出Innovators’ Challenge的时候去赚些钱;很多时候hack都是临时解决一些小问题,看上去甚至会觉得有些dirty。
openjdk的源代码采用mercurial做版本管理。Mercurial也是个分布式的版本控制系统,优点是跨平台,缺点是忒慢了点儿,用惯了git尤其没法容忍管理些源代码都慢吞吞的;基本上我也只是用它来拿openjdk的代码,目前还罕见有多少我感兴趣的项目使用mercurial的,所以也没动机去深入学习一下。openjdk6的代码位于http://hg.openjdk.java.net/jdk6/jdk6/,是一个mercurial forest——一大堆源代码tree在一起就形成了源代码forest。配置mercurial以及安装那个forest插件的过程参考一下http://openjdk.java.net/guide/repositories.html应该可以搞定,不是什么大件事。有了mercurial+forest插件以后,找个干净目录来fclone一下:
iusr@wisdom:~/projects/openjdk$ hg fclone http://hg.openjdk.java.net/jdk6/jdk6/
[.]
requesting all changes
adding changesets
adding manifests
adding file changes
added 27 changesets with 63 changes to 29 files
updating working directory
29 files updated, 0 files merged, 0 files removed, 0 files unresolved
[corba]
requesting all changes
adding changesets
adding manifests
adding file changes
added 26 changesets with 1439 changes to 1376 files
updating working directory
1371 files updated, 0 files merged, 0 files removed, 0 files unresolved
[hotspot]
requesting all changes
adding changesets
adding manifests
adding file changes
added 28 changesets with 7862 changes to 3278 files
updating working directory
2964 files updated, 0 files merged, 0 files removed, 0 files unresolved
[jaxp]
requesting all changes
adding changesets
adding manifests
adding file changes
added 26 changesets with 2021 changes to 1975 files
updating working directory
1973 files updated, 0 files merged, 0 files removed, 0 files unresolved
[jaxws]
requesting all changes
adding changesets
adding manifests
adding file changes
added 29 changesets with 4864 changes to 2867 files
updating working directory
2583 files updated, 0 files merged, 0 files removed, 0 files unresolved
[jdk]
requesting all changes
adding changesets
adding manifests
adding file changes
added 97 changesets with 41623 changes to 17063 files
updating working directory
16829 files updated, 0 files merged, 0 files removed, 0 files unresolved
[langtools]
requesting all changes
adding changesets
adding manifests
adding file changes
added 40 changesets with 6616 changes to 3018 files
updating working directory
3012 files updated, 0 files merged, 0 files removed, 0 files unresolved
fclone是forest插件提供的命令,如果forest插件没有配置妥当的话mercurial会提示无法处理fclone这个命令的。等mercurial慢吞吞地把代码下载回来后,折腾的第一步就完成了。当然如果只关注openjdk6的某一模块,比如hotspot,可以单独clone这一个tree。基本上hotspot模块是每个人都感兴趣的,jdk模块次之,其他的corba、jaxp、jaxws之流也不算什么rocket science。考虑到模块大小的话:
iusr@wisdom:~/projects/openjdk$ du -s -B M jdk6/ jdk6/*
542M jdk6/
1M jdk6/ASSEMBLY_EXCEPTION
20M jdk6/corba
63M jdk6/hotspot
37M jdk6/jaxp
35M jdk6/jaxws
349M jdk6/jdk
39M jdk6/langtools
1M jdk6/LICENSE
1M jdk6/make
1M jdk6/Makefile
1M jdk6/README 1M jdk6/README-builds.html 1M jdk6/THIRD_PARTY_README 1M jdk6/TRADEMARK
大概要准备>600M的空间吧,这年头应该谁都不在乎这点儿地方了吧。
OpenJDK社区的代码仓库索引页位于http://hg.openjdk.java.net/,对其他项目感兴趣的话可以自行clone/fclone。
开始折腾前还要铭记一点:大部分openjdk6的源代码是以GPL v2许可的,部分基于其他开源项目的代码还维持其许可证不变,此外还有部分二进制模块使用的是OpenJDK二进制文件许可证。如果真折腾出来好东西了,别忘了回馈社区,没有人家夯下的基础,这一切都不可能完成。
Feb 02
IUSR咿咿呀呀 asf, java, linkedin, sun
continuation,对这个东西很久之前开了个头就没再深入,晚上又拾起来看了下,也算continuation了吧。jsr 315敢情被apache sf驳了,而且是因为很扯淡的产业政治问题,但愿不要难产,tomcat拿起来还算没门槛一些,想改哪里都好改。
On 2009-01-12 Apache Software Foundation voted No with the following comment:
The Apache Software Foundation's vote is based on the point of view that this spec lead – Sun – is in violation of the JSPA
http://www.apache.org/jcp/sunopenletter.html
and therefore shouldn't be allowed to start or continue another JSR until the above matter is resolved.
This vote is not a comment on the technical merits of the JSR. If not for the issue of the spec lead, the ASF would have otherwise voted "yes".
过年期间本想更新下那个纠结的问题的进展,八成是fix了,而且是我们自己的问题。在这个问题上我也算费了不少心思,也积累了很多,只不过对公司的贡献还不如US那里的人坐着review一下代码。嘴上拿不熟悉这新家酿框架以及从另外一版port过来又做了些山寨修改的代码当作借口,实际上最主要的还是态度问题,因为主观上就没想我们的代码能搞坏下面tomcat和apache的行为。回头好好总结。
Jan 05
IUSR咿咿呀呀 linkedin
标题党了?
新年了几乎一周后才想起来总结总结。
2008这年,废话地说起来,收获还是很大。损失也是有的,伴随着有如每个project过后都会做的那些lessons learned。
其实我也不是投机商,于是损失也应该算作收获。
重温了下eva。看法没有改变。人总是无法互相理解的。所以,照顾好自己的家人。其他不相干的人,相忘。
夏初的时候出差了一趟,去了向往已久的欧洲。在希斯罗降落的时候飞机是盘着降的,很忽悠。伦敦市中心很挤很乱,有些地方甚至会脏,可是天很蓝,云流走的很快,也明白了为什么英国人喜欢谈论天气。从伦敦桥走到白金汉宫,左膝隐约走伤。好高骛远去学伦敦腔,分不清楚谁是牛津腔。欧洲之星的票真贵,比便宜的航班还贵,餐车卖的饭吃完了恶心想吐,车头也没有想象中那么炫,而且浮土很多,可以想象在刚诞生的时候估计还是很酷的。路过了布鲁塞尔,在火车站转了一圈,跟天津一样到处在施工。德国的环境很好,绿化程度很高,据说要归功于二战期间盟军轰炸机把它基本炸平。波恩很静。科隆人很多。莱茵河看起来也没有多宽。出了公司能搜到的所有的Wi-Fi接入都是要花钱的。英航的7N7坐着明显没有柏林航空的小空客A330舒服。呆了一个半月,回到家有些不适应,主要还是湿度太大,早餐没了生肉和咖啡。
下半年对linux的熟悉程度比起之前增长很快。全都归功于头儿终于争取来第二台机器让我们装linux。SLED装完了用了半个下午就扔掉装了ubuntu。apt-build简单到有些简陋,最大的功劳是让我对gentoo、freeBSD有些想入非非,无视了之前的几次失败的相处。以至于后来狂妄到开始把一些常用软件purge后转去svn trunk、git master,还有bazaar,虽然没怎么用过。
越来越觉得FSF和ASF可以先merge一下再branch,也许可以互相学习一下。
比较了常用开发工具在winxp sp3和这大部分apt-build以及make过的intrepid上的性能以后,决定把winxp定为服务器系统,这台intrepid作为开发用机,因为xp机的硬件配置更高级而且速度更慢。
键盘操作也比以前频繁了很多。vim方面没啥长进,wm改到了awesome,ff装备了vimperator。键盘操作多了肯定会被人骂装逼。其实只不过是提升工作效率的尝试,如果这都要算装逼,那不装也是逼,傻逼的逼。
信用卡的开销也比以前大了很多,注册了paypal,主要是美元消费。两个域名,一个tasktop pro的一年期license,一个github.com的micro帐号。域名基本沦为命名java package的用途;公司想agile,TeamTrack这种重量级tracker的地位被弱化,mylyn也不经常用了,tasktop pro的一年期license比较贵,就当是为mylyn做贡献;github目前还是拿来学习git用,以及保存系统和用户的配置文件,以及其他一些零碎的代码。
上网看东西看多了,也产生了些自我意识。让那些牛人都见鬼去。会看代码是正经,RTFSC以及RTFM是王道。目前只有康神还是很神的。RTM不是RTFM。
年初给别人当伴郎力巴。贷了房子,搞了装修,买了家具,装了电器。5年了吧。
2009年。
多看些底层的东西,少谈论些设计、框架之类的东西,特别是不要自己到处发明局部小框架。重新看体系结构和操作系统基本原理。认真翻C、C++,不要头大。好好学py3000。要看open jdk,6以及7。要有core。有些事情已成定局,有些同学不足与谋,不如安心下来做好眼前的工作。
要安家结婚,不要弄出人命。
此致,敬礼。
Oct 20
IUSR补充两句 english, linkedin
What good could you get from a programmer who even cannot avoid
viruses/malwares?
What good could you get from a country whose people endure the most
messy road traffic?
Sep 05
IUSR咿咿呀呀 english, linkedin
Long time no blog, again.
There’s simply no exciting things for me over this long period after returning from Germany. Ah, yes, except one thing: I’m now engaged, after 5 years:)
I’m back to
Mylyn , and am developing the habit relying on it to organize my daily work. My company hosts an internal portal site using Share Point. Well, I’d say that I would like to use it if I’m someone who does not need to use anything other than the Microsoft Office suite, but I’m a poor coder, which means I don’t make a living using Microsoft Office but my IDE. I’ve been using Eclipse for 5 years also, meaning that I already had it in my last computer when I met my girlfriend (who has just been promoted lol). I’d tried other alternatives and eclipse still remains to be the best choice for me ever. I like the whole ecosystem built on the eclipse platform; there are not only plug-ins for developers, but a lot of decent desktop/RIA applications, either public available or proprietary.
I should suggest my friends and colleagues to give
Mylyn a try. It really helps. And I’m also trying
Tasktop Pro for Eclipse, which is available as a 30-day free trial and is at the price of
99.00 USD or 149.00 USD depending on the type of the license. There are simply more features in this Pro edition, such as integrations with Outlook, Gmail and Google Calendar, making them task repositories. I think I’ll buy one; the price is reasonable and it worths. One thing to mention is that seems key developers of the Mylyn project also work for Tasktop; I often see them in the Mylyn newsgroup. To me, Mylyn is the first Eclipse plug-in offered by eclipse.org that is not about development but is for development.
Well, and I tried developing a connector for TeamTrack, which is used by my company for tracking defects and something else. Having been googling and reading for 2 hours, I finally found the web service APIs that TeamTrack provides, yet I don’t think the operations it exposes can meet the need to build a complete connector. And also it seems one even needs to be familiar with the database tables to perform queries via TeamTrack’s web service! I currently have no technical information available so finally I decided to give up making such a connector, but to use the generic web connector to parse HTML pages with regular expressions… This is only one of the basic differences between proprietary products and their open source alternatives.
Moreover, there’s a bug with the Mylyn generic web connector and it fails to authenticate via HTTP Basic authentication method, whoa. It’s said to be a code migration/integration problem so I guess it’s easy to deal with, though.
Honestly, Office 2007 is good; I can use Visual Studio 2008 with VSTO to make a few simple add-ons for my Outlook. I’d agree there’s more value out of Microsoft’s products, because everyone can see that Microsoft’s products are engineered to be able to work with each other; this is something other companies need some years to develop.
Older Entries
Recent Comments