行者无疆 始于足下 - 行走,思考,在路上
兔年伊始
一月初处理完家中的事,回到百度补了三天班,请了两周的假,马不停蹄回到杭州,参加学校的几门考试。当然,这期间顺便去了趟上海看了看妞——也顺便看了看新版水浒传。陪妞的几天搞定了C#大作业,到杭州已经是一月中旬的事情。到宿舍的第一件事是发现了桌子上的奖学金证书,上面还写着自己的名字,没错,就是我。学业优秀三等奖学金,我仔细看着这几个烫金大字,脸上一阵苦笑——要知道,大三一年我还挂了三门课。不过心里却还是挺高兴的,虽然我根本不太在乎这个东西。给母亲打了个电话,让她高兴高兴;给妞也发了条短信,妞回“你的大学生活完满了”——我呢,会心一笑,盘算着这几百大洋能给妞买个什么东西呢。
一月的杭州总是那么阴霾,又赶上难得的大雪给太阳公公放了长假,不多的好心情也在湿冷的空气中散发殆尽。考试还是很无聊的,更无聊的是你在准备无聊的考试,别人却在旁边无聊地玩着无聊的游戏。所谓“大四不考研,天天像过年”,我是个例外,因为大四的最后半年我还有七门考试——都是重修。其实每个学期初自己都雄心勃勃的——工作要好,项目要做好,课程也要尽量做好,但是往往最终结果是工作好,项目好,课程却一塌糊涂。大四上我选了六门课,华数淘宝实习到十月中旬,然后用了不到两周的时间就拿下了Baidu的Offer,照理说,剩下的时间应该好好补补课业,搞一搞毕业设计,结果我却依然非常偏执地申请了Baidu的实习,不断地给自己“没事找事”,不懂得“享受时光”。结果是,整个一个学期六门课,我就去上过两次。学期末的考试自然难免焦头烂额。好在结果还行,我通过了本该预科时学的《线性代数》,两门选修课,C# 80+,软件体系结构也低空飘过。电路原理就去打了个酱油,计算机组成再度弃考,数字电子技术……真是纠结。
在杭州的几日还去参加了两次同学会,最大的发现是,CKC的同学们还是很牛的——有拿到MIT某某比赛金牌的、有在MSRA实习的、有拿了ACM中国赛区金牌+HKUST Offer+MSRA实习的、有保送到ZJU CAD/CG实验室读PHD的、有ibus-cloud-pinyin的作者和ibus-sunpinyin的作者、有主修CS辅修商科最后拿了Monitor咨询Offer的强悍女生,等等。我发现自己似乎有个小毛病,就是太过认可自己的生活方式,总以为别人的生活方式怎样怎样,偶尔会带着一丝鄙夷的眼光来看待一些事情。回头看看自己写的两篇《找工作总结》,霸道之气溢于言表,对自己挂课这件事情不以为耻,反而吹嘘地如同传奇一般。这或许是一种自恋吧。想想还是那句话,“人生不是平行的向量,没有可比性”。每个人都应该有自己的精彩,嗯。
23日回到北京,继续Baidu的实习。由于我元旦、春节等各种假期,导致我在Baidu的时间很分散,因此导师安排我去做一个项目调研性的工作。我选择的是x-trace,一个patch-based、cross-layer的网络监控工具。做的调研工作就是如何在Hadoop中集成x-trace,从而全面了解MapReduce任务的运行细节,如下图:
在Baidu一直奋战到最后一天,还参加了整个运维部的年夜饭。2月2号早晨起床迟了,便转道赶往六里桥客运站。好在运气不错,赶上了家乡的一辆Passat正在吆喝人,简单询问了下就上了车。司机彪悍无比,用一对春联盖上前后的车牌,几百公里的高速公路愣是没有交一分钱。就这样,大年三十、下午两点,我总算有惊无险地回到了家中。家中几日无非就是那么几件事情——看春晚、包饺子、走亲戚、喝大酒。我不喜欢喝酒,虽然我有那么点酒量。我觉得多数情况下,酒杯里盛的不是酒,而是虚伪。觥筹交错的背后往往是尔虞我诈。酒品如人品,都是一种心境,对高人而言,即便是白水一杯,亦可品出人间百态。
8号返京。我和父亲开车,带上弟弟,捎上去廊坊工作的表兄表嫂。带弟弟来主要是让他来参观下,长长见识,按照父亲的说法——“给他施加点压力”。中午到火车站,在北京的立交桥上绕了若干圈后终于到达了北5.4环我的住处。下午去百度大厦参观,节假日,保安无论如何也不给我这个面子,就是不让父亲和弟弟进。无奈之下只能带着他们绕着大厦走了一圈。时间尚早,就临时改变了计划,去清华北大参观下。如此又让我想到了高二那年来北大蹭课的青涩岁月。那时自己一门心思沉浸在竞赛中,数学竞赛惨败后就转战了化学,跟着“师傅”来到了北大,跟老师说是来买些书,顺便来听次课。其实暗地里倒是主要为了逃避一次月考。来到北大,漫步在未名湖畔,仰望博雅塔,清风徐徐,心情自不必说——仿佛自己已经考上北大,成了天之骄子。漫步进入一个小书店,就如那刘姥姥进了大观园,直把这里当成了理工科的天堂。买了各种各样的书,热学的,分析化学的,有机的,不知道有多开心了。次日去化学系蹭了节裴伟伟的有机化学课,讲的是什么已然忘记,印象深刻的,第一点就是很多人上课迟到,或者偷偷吃东西,让我觉得非常不可思议;第二点就是“师傅”wp去索要裴教授的签名,裴问了我们是哪个学校的,“师傅”说是唐山一中高二的……北大蹭完课,晚上又去清华逛了逛,也记不得是从哪个门进去的,只是记得wp总在那里提醒说“清华比北大还大,小心走丢”,还有就是我们逛着逛着到了一个路灯下,杆子上有一个按钮,我就要伸手去摁。然后wp一下子把我从背后抱住。事后我才知道那个可能是报警按钮,不能乱摁。哎,当时实在是太嫩了。
胡乱开车到了清华西门,时间已是下午两点多。在清华只走了两个小时,父亲就直嚷嚷着大腿疼。我也终于明白,父亲的时代已经过去。我们,已经成了时代的主人。清华出来后又拉着俩人去未名湖走了一圈,顺便感慨下即将逝去的大学生涯。晚上带着俩人去看了场3D电影——周杰伦的《青蜂侠》。父亲是一点本事没有了,而他也确实十多年没有看过电影了,像个小孩子似的,跟在我的后边,拿票,换3D眼镜。看了一半他还睡着了……弟弟倒是看得津津有味。
次日早晨,父亲和弟弟回家,我去上班。走之前帮他们设置好了导航仪,一路顺风,中午到家。我回到公司,继续调研我的x-trace。直到现在,项目依然没有本质的进展,主要原因是我对这个项目的难度评估不足,其次是我个人能力不够。x-trace是Berkeley RAD Lab几个博士生的博士论文项目,整个项目涉及到众多领域如对TCP/IP协议栈的深刻理解、Java/Ruby/Perl的纯熟使用等等。除此之外还有一些基础性工具的使用,如svn/git、ant/maven/scons、jetty、graphviz,GNU diff/patch等等,而要结合Hadoop与x-trace,更是需要对Hadoop的内部通讯机制有着深刻的了解。而这一切的一切,让我在调研的过程中举步维艰。
好在导师并没有给我施加太大的压力,项目也没有特别紧要的milestone,所以我还是有时间来巩固下基础,看一些书籍。部分重读了Java之父James Gosling的《The Java Programming Language》,了解了Annotation、Reflection、Serialization,让我对Java语言有了更进一步的认识。不过不得不说,初学者想要靠这本书入门还是太难了。学习了下Ant的使用,简单浏览了下Ant权威指南,主要是了解下主要思想和基本概念,没有太过深究。Hadoop: The Definitive Guide读到了第十章,还在本机上搞了个伪分布式Hadoop集群,但是缺乏实践,对Hadoop内部机制还是似懂非懂,多写写Java程序吧。另外,Pragmatic系列的几本小书都很不错:
- 《Pragmatic Version Control Using Subversion》,svn基础使用入门,有Linux环境的话动手实践一下,两三天就可以上手了。
- 《Pragmatic Unit Testing in Java with JUnit》,基于JUnit 3.x版本的,比较老了,但是单元测试的概念是相通的。
- 《Pragmatic Project Automation》,讲的是软件的自动化构建、测试、安装、发布等等。
技术之外,我还看了一些电影短片和Blog,简单做下推荐:
- 《天使爱美丽》:特别喜欢影片的色调、喜欢那个傻傻的矮个子、玻璃老头,当然,还有爱美丽的微笑。
- 《黑天鹅》:一部心理剧,展示了人在巨大压力下心理的变化过程。但是我看不太懂。
- 姜文《太阳照常升起》、《阳光灿烂的日子》,不知道是姜文的电影太过晦涩,还是我比较幼稚,总是看不太懂,包括《让子弹飞》。当然,字里行间外露的姜文的霸气,我还是能感受得到的。
- 筷子兄弟《老男孩》,也许我还没有长大,不够成熟,但是这个片子让我来评,歌曲占80%,片子占20%。“青春如同奔流的江河,一去不回来不及道别”,叶蓓《白衣飘飘的年代》也是很不错的。
- 旭日阳刚《春天里》、西单女孩《天使的翅膀》:总是有那么一些人,能够不时的带给我们一些温暖和感动,坚持的力量。
-
刘伟《You Are Beautiful》
- “我的人生中只有两条路,要么赶紧死,要么精彩地活着”
- “生命里有三样东西不可以少,空气 水 音乐”
- 《搭车去柏林》,这个记录片看得我躁动不已。我跟妞说“我们辞职吧,用一生的时间去度一个蜜月”。每一刻都是崭新的,我所向往的生活。
- 《背包十年》,号称是中国第一位职业旅行家,确是不一样的人生。但是作者认为“白领的生活精确到每分每秒,但每分每秒都是无聊”,我认为颇为偏激。社会需要进步,而单单靠环游世界是无法推动社会进步的。所以环游世界是我的梦想,但也只是梦想之一。
- 身边总有这么一些人:净干些随意妄为的事,一副既不在乎自己也不在乎别人的样子,其实心底里藏着比任何人都要柔和而耀跟的光芒。还就是这么些人,时不时地让你感到:活着真他妈带劲。follow your heart!!
忙里偷闲还去体验了下Archlinux下WordPress的本机安装,琢磨着有空了去搞一个独立域名的Blog。我最近一直想写一些东西,比如Hadoop的本机安装啊,WordPress的入门使用啊,Subversion使用小记啊,等等,诸如此类。但是转念一想,这些东西在网上都有足够多的资料,也不需要我在多此一举,给互联网上再增添点垃圾信息——国内的很多网站论坛基本上就是Copy来Copy去,而且Copy过来都不懂得排版一下就贴上去,恶心。我更希望有一些深刻独特的东西,所以最近一直在思考,却很少提笔了。如刘未鹏所说,“书写是为了更好的思考”,坚持写了一年多的Blog,确实让我受益很多。一点一滴,看到了自己的成长过程,结交了一些朋友,也开始学着将知识串成网络,展现出来。
3月返校,暂时结束Baidu实习生涯,全力以赴搞定毕业大计。看看能否抽出时间,架上单车,再出去“干上一票”,漂泊的梦想,压抑好久,已经膨胀的不行。
纠结的j2ee之旅
还没启程,就遇到了诸多意想不到的问题……弄得我焦头烂额,极度郁闷。
web开发本身就是的部署本身就是一件极其纠结复杂的事情,在正是进入web开发前先要搞懂什么叫静态网页、动态网页,什么叫服务器、客户端,什么叫tcp/ip,什么叫html/css,什么叫做动态语言等等;而要进行j2ee的web开发,新概念的爆炸简直是一场急风暴雨,扑面而来,譬如jsp、javabeans、struts、hibernate、spring、ejb、设计模式、MVC等等,令人目不暇接,说实话这写概念到今天我也只是略懂皮毛,因此寻求一款好用的IDE协助开发成了当务之急。等到真正熟悉了整个开发流程和原理,再尝试着转回CLI,寻求一种full-control的感觉。
想进行Java Web开发,第一个前提是有Java,第二个前提是有Web。Gentoo上的Java还是好搞定的,一条命令几乎什么都设置好了,也不用像windows那样去设置PATH环境变量。但是令人比较混乱的是java的选择问题。Gentoo上的jdk至少有5、6种,什么ibm的、apple的、sun的等等,还有什么openjdk——貌似是sun-jdk的开源版本,icedtea(A harness to build the OpenJDK using Free Software build tools and dependencies),GNU Classpath。默认安装的是icedtea6-bin。反正搞到最后,命令行下敲一个java和javac,能用了,因此关于openjdk和sunjdk之间到底是什么关系,我也就没有再深究了。
Java好了,接下来就是开发环境的选择了。记得去年的java程序设计,我单用emacs就搞定了1500行的java校车查询系统,因此emacs+jde+ecb应该也能胜任。但是今年的J2EE Project更侧重web和database,这方面我不熟,因此就想暂时偷偷懒,找个IDE暂时搪塞一下。
关于Java开发的IDE,除了已经“廉颇老矣”的JBuilder,恐怕只剩下Eclipse和Netbeans了。早先安装过这两个大名鼎鼎的IDE,觉得还是Eclipse更美观一点,因此这次也就首选Eclipse进行安装。安装过程倒也顺利,只是众所周知,Eclipse和Emacs一样是一个平台,需要插件的协助才可以“建功立业”。习惯了linux自动化的包管理系统后,自然也希望Eclipse的插件管理也有类似的功能:自动下载,自动配置,自动判断依赖。可是我几乎在网上找了一天,也没有找到合适的网址,作为Eclipse插件的“源”,自然是及其郁闷,索性放弃,去做别的事情。
后来一次做嵌入式的实验,闲来无聊,就下了windows版的eclipse安装在实验室的电脑上,然后在这个版本上的eclipse找到了比较合适的更新网址(泪流满面,真不容易):
- EPP Packages Repository http://download.eclipse.org/technology/epp/packages/galileo
- Galileo http://download.eclipse.org/releases/galileo
- Mylyn for Eclipse 3.4 and 3.5 http://download.eclipse.org/tools/mylyn/update/e3.4/
- The Eclipse Project Updates http://download.eclipse.org/eclipse/updates/3.5
- The Eclipse Web Tools Platform (WTP) Project update site http://download.eclipse.org/webtools/updates
这样总算能安装一些常规插件了(什么?你问我怎么安装?呃,这个问题还是先问问百度先生和google小姐吧。)我安装了Eclipse CDT、Eclipse WTP,还有一些看似像但不知道能不能用的上的插件。
老师用的是MyEclipse,对于MyEclipse,我的理解就是一个插件的集合,针对Java Web开发做了整合优化。我也想图省事,就去校内的神网搜索,只有MyEclipse 7.0 for linux版本,装之……无法启动……直接sudo rm -rf /where/is/myeclipse/……我又想到最新出的MyEclipse 8.5版会不会好一点,结果是,MyEclipse的官网说”你们中国盗版太严重了“,因此封了所有来自中国的ip,所以也就无法访问了,彻底无语了……
Eclipse安装完毕,简单Hello World也能跑。好啦,开始配置Web和Database。
涉及到的Web服务器主要有两个,Apache和Tomcat。这两者是什么关系,有没有相互的依赖性,又是一头雾水。貌似Apache主要解析静态网页,配上php模块可以解析动态php网页,而Tomcat则主要解析Servlet和Jsp。具体依赖性我就不知道了。不过Tomcat是Apache的子项目倒是真的。Apache的配置比较简单,参见Gentoo Wiki,而Tomcat的配置又出了很大的问题。Gentoo Docs上的Tomcat Guide有这么一段:
The root directory of a typical Tomcat binary distribution is laid out as illustrated in the following listing.
Code Listing 2.1: Standard Tomcat Root Directory Layout |
/opt/tomcat-x.y/bin /opt/tomcat-x.y/common /opt/tomcat-x.y/conf /opt/tomcat-x.y/logs /opt/tomcat-x.y/server /opt/tomcat-x.y/shared /opt/tomcat-x.y/temp /opt/tomcat-x.y/webapps /opt/tomcat-x.y/work |
Note: Substitute either 5, or 5.5 for x.y |
To comply with FHS and Gentoo standards, Tomcat has been dissected and installed into the following locations.
Code Listing 2.2: Gentoo Tomcat Layout |
/usr/share/tomcat-x.y/bin /usr/share/tomcat-x.y/common /etc/tomcat-x.y /var/log/tomcat-x.y/logs /usr/share/tomcat-x.y/server /var/lib/tomcat-x.y/shared /var/tmp/tomcat-x.y /var/lib/tomcat-x.y/webapps /var/run/tomcat-x.y |
这里面又涉及到一个FHS(Filesystem Hirarchy Standard)的概念。简单的说,tomcat的“正常”安装(在windows平台上)呢,其所有的安装文件都应该在同一个目录下,但是Linux(Gentoo)呢,则有自己的标准(就是FHS),比如临时文件放/tmp和/var,配置文件放/etc里,因此gentoo就把tomcat这个包拆了放到不同的目录里面,这样和自己的哲学比较统一,也确实比较便于管理,比如gentoo环境下开机自动启动apache和tomcat,只需要:
sudo rc-update add apache2 default sudo rc-update add tomcat-6 default
事实上重启后apache和tomcat服务都已经启动,在浏览器地址栏输入http://localhost/就会出现apache的经典宣传口号“It works!",但是输入http://localhost:8080,浏览器却显示一片空白,再次输入http://localhost:8080/manager/html时,跳出一个对话框,询问manager的用户名和密码(这个密码需要自己配置),正确配置了用户名和密码后重启tomcat输入manager/html,是出现了一个界面,但是功能残缺不全,很多超链接指向html但是实际目录中的文件确实xml格式。而且Eclipse的tomcat插件要求tomcat的安装必须在同一个目录下。我曾想着在/opt/tomcat做几个ln -s的软链接,但终究失败。搜索良久,我找到了这片文章,里面描述的的窘境和我的情况一样。
没办法了,只能去官网下了tarball,自己解压手动安装到/opt/tomcat目录中。然后每次开机手动启动tomcat,这下Eclipse的插件配置也好了……此时的我泪流满面……然后呢,参考ibm developerworks上的文章,兴冲冲地在Eclipse中建立Dynamic Web Project,写了一个"hello, jsp",然后启动tomcat,又出现了tomcat无法启动的问题:
然后我就无语掉了……继续泪流满面……
看来,偷懒的方法不成,还是得回到原始生活时代,开始上网搜一些emacs开发j2ee的东西。用脚趾想也能想得到,用emacs的少,用emacs开发java的少,用emacs开发j2ee的就更少了,因此资料也是出奇的少,相关插件也不完善。拿最简单的jsp来说,我觉得怎么也应该有一个比较顺手的jsp-mode的插件吧,可是结果令人失望……分别尝试了mmm-mode,multi-mode,jsp-mode,nxhtml-mode,可是无一如意,要么是bug无法启动,要么是用了一段时间后就bug,无法正确缩进(nxhtml)等等,于是这条路也走不通了。
于是就剩下最后一个备胎了,netbeans。老实说我不太喜欢netbeans(我觉得界面和字体照eclipse差远了,java swing做出来的东西貌似没几个特别好看的)。emerge一下,提示有几十个包300M的东西要下载,好大的家伙,忍了。然后呢,开始的几十个包安装还是很顺利的。只是到了jnlp这个包,出现了以前没有遇到的问题:
>>> Emerging (1 of 3) dev-java/jnlp-bin-1.2-r1 !!! dev-java/jnlp-bin-1.2-r1 has fetch restriction turned on. !!! This probably means that this ebuild's files must be downloaded !!! manually. See the comments in the ebuild for more information. * Please download javaws-1_2-dev.zip and place it in /usr/portage/distfiles * https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewProductDetail-Start?ProductRef=7026-jaws_dev_pack-1.2-oth-JPR@CDS-CDS_Developer * Fetch failed for 'dev-java/jnlp-bin-1.2-r1', Log file: * '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log' >>> Failed to emerge dev-java/jnlp-bin-1.2-r1, Log file: >>> '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log' * Messages for package dev-java/jnlp-bin-1.2-r1: * Fetch failed for 'dev-java/jnlp-bin-1.2-r1', Log file: * '/var/tmp/portage/dev-java/jnlp-bin-1.2-r1/temp/build.log'
google了一下,大概意思是由于license问题,需要到sun的网站上去下载,需要”同意某个许可“,然后给出一个下载链接,就是上面的log中给的那个长串,可是令我极其郁闷的是这个链接怎么也打不开,用wget -c也下载不下来,最后我怀疑是GFW的问题。shit,真是不能忍了,本来不想折腾的。把人逼到绝境。于是我就想起了前不久看到的一个west-chamber计划,好在linuxsir上面还有相关的帖子教程,加了gentoo-china的overlay,可是用eix搜索却怎么也搜不到这个ebuild,奇了怪了,又搜寻了好久,原来是layman升级到1.3后overlay portage的位置改变了,找到了sabayon forums上的帖子,解决了layman的问题,这写总算可以emerge west-chamber了。
编译的过程出了问题,原来是内核配置的问题,又照着linuxsir上的帖子改了.config文件,重新编译了内核,现在还没有重启,不知道能否成功编译west-chamber,翻越GFW。
“待月西厢下,迎风户半开,隔墙花影动,疑是玉人来。”