2007年12月27日星期四

Fonts TTF Opensymbol - Failed to write cache

Touch each directory reporting failed to write cache.
1. Save those directory to a file, say cache_fail_folder_list.txt
2.
sudo -i
cat cache_fail_folder_list.txt | xargs touch

Install Ubuntu 7.10 from hard disk

1. Copy initrd.gz, vmlinuz, grldr, menu.lst to C:\
2. add
c:\grldr="Install Ubuntu"
to c:\boot.ini
3. Put the iso file to the root directory of a fat32 partition
4. restart the system.

2007年11月23日星期五

another try to install wireless driver

http://ubuntuguide.org/wiki/Ubuntu:Gutsy#How_to_install_Broadcom_wireless_driver

2007年10月30日星期二

Using Windows wireless driver under Linux

Clear the previous installation of bcmwl5
clive@omniscience:~$ sudo ndiswrapper -r bcmwl5
Specify the path of the driver in Windows and install it:
clive@omniscience:~$ sudo ndiswrapper -i /media/sda1/DELL/drivers/R151519/DRIVER/bcmwl5.inf
installing bcmwl5 ...
sudo ndiswrapper -l
sudo modprobe ndiswrapper

2007年10月20日星期六

Sound problem with D630 in Gutsy

1. Get the latest alsa drivers from Georgia Tech's website
Quote:
wget http://www.gtlib.gatech.edu/pub/suse/projects/alsa/snapshot/driver/alsa-driver-hg20070804.tar.bz2
2. extract it
3. change directory to the directory with the extracted files
4. configure with
Quote:
./configure --with-cards-hda-intel
5.
Quote:
make
6.
Quote:
sudo make install
7. reboot

2007年9月20日星期四

Information about Going Abroad 1

Looked at Northwestern University's web site, on Industrial Engineering and Management Sciences, there are attrative program: Master of Engineering Management. However, it requires work experience. Dropped out therefore.

Anyway, I knew there is such a program: Master of Engineering Management.

2007年9月7日星期五

[转载]Matrix日记本

2005-11-2 22:00:51 天气:
  2003年9月,厦门大学漳州校区迎来第一批新生。10月24日,也就是整整两年前,博学园区团委学生会成立了。园区管理模式是厦门大学学生管理的一种创新模式,每个园区入住若干学院的新生,然后从该园区里挑选学生骨干作为园区团委学生会的部长级同志。整个校区7000人,包括博学、映雪、笃行、囊萤、勤业五个园区。园区之间的团委学生会是竞争关系。博学当时所组成的学院是软件学院、物理与机电学院、建筑学院、管理学院和经济学院。
一个字头的诞生
陈、周和我通过严格的竞选,从500人中脱颖而出,分别担当了博学软件学院总支书记、学生会副主席以及团委网络信息中心主任。故事,就是从这里开始的。
一个月后,周走出园区,成为了厦门大学漳州校区的校学生会主席。当时的整个软件学院03级,只有周、陈以及我算得上是最早涉足学生工作的。当时博学的学生会例会,只有我作为软件学院的学生,能列席干部会议,后来例会改成团总支扩大会议之后,陈作为整个软件学院的总支书记,理所当然能出席会议。
于是,带着年轻的激情,大家作为当时新校区的拓荒者,开始着手了自己职责范围内的学生工作。很快,博学网络信息中心建立起来了,辛、许作为我的副主任,给予了我很大的帮助,在三人的努力下,吸收了一大批来自软件学院和其他学院的电脑技术分子包括高、车、曹、吕、林等同学,此外,升、啸、冬等三位同姓的同学也加入了中心。
与此同时,陈的学院总支骨干也相应建立起来,超当时是总支副书记,作为陈的一大助手,超的工作态度是非常积极的。当时的学生会与团总支,是并列但又交叉的部门,总支有权利举办本学院的活动,但必须听从园区学生会的安排。
说到这里,不得不提起一个人:张。张刚来到学校时,便表现活跃,在学生机构没建立起来之前,便频频在老师面前表现,分担老师的工作。当时,从园区主任到团委正副书记到各学院辅导员,都对这位来自本地漳州的,瘦瘦的,戴着眼镜的男孩赞赏有加。后来的学生会竞选中,张并没有得到料想中主席的位置,甚至连副主席都不是,不过也担当了组织
部长一位,后来周当上了校会主席后,园区副主席一位空缺了,张便以强劲的优势兼任了这个职位,这时的组织部长兼学生会主席,具有绝对的权力。
或许,我们在厦大的拼搏史,就是从这里开始的。带着一点自信、一点冲动,以及对一个从未开发的处女地,我们的拓荒工作是从零开始探索和尝试的,这一切的一切足够可以写进厦大的历史。
风雨博学 起落人物
博学的学生工作轰轰烈烈地展开了。很快,校运会到来了,这也是考验同志们工作能力的一个重要时刻。在这次的准备工作中,陈开始有意识无意识地集中自己的权利,学院内很多脉络,包括财务和后勤物资都掌握在他手里,并且,工作的一切安排,无论从大到小都归他一个人策划。短短时间之内,由于工作经验的不足,同学对他有了一定的看法。而余本来是一位非常有主见的同学,当然,他也会跟陈在某些工作方面有相当大的分歧,而倔强的余自然是对陈的颐指气使十分
不满。校运会结束后,陈与余的关系跌到了谷底。
事实上,陈与余的关系至今没有得到改善,归根到底,都与双方当时的固执与幼稚有一定的关系,事实上相比起来,陈比余更稳重,余的工作方式未免浮躁,在陈掌管工作的当时,偏激的意见太多,以至于一些好的建议都被埋没了。
校运会后不久,余淡出了学院总支的管理工作,到了下学期,余正式辞职。
物理机电学院的情况却是另外一番景象。在机电系,真正的权力并没有掌握在总支书记手里,却掌握在机械测绘班的班长张手里。张除了在园区积极发挥影响力外,在系里掌握了绝对的权威。用老师的话评价张,是说:“从厦大历史以来,没有一位这样的学生,能有这样的魄力与威信,把一个系甚至一个学院紧紧的控制在自己手中,而且有这么多同学的追随与信服。”
2004年的大一第二个学期,是博学网络信息中心辉煌的一个学期,中心通过各种活动,把自己的名气影响扩展到整个厦门大学。其实,这个学期里,发生了一些比较微妙却对今后有决定性变化的事情。
2004年3月,博学团总支文体大赛正式展开,各学院代表纷纷参加体育、文化、歌唱、电子竞技等各种由园区学生会相关部门举办的大型比赛。各总支的干部(书记、副书记、宣传)一方面要领导自己的学院同学好好参赛,令一方面这是
在园区老师面前展示自己的工作能力的机会,而随后的评奖评优工作,与这次活动是有密切关系的。
余辞职后,陈对于独自承担工作感到越来越力不从心。于是,他开始物色新的副书记人选。
黄是博学一5楼的层长,一位来自山东威海的,高瘦个子的软件学生。他的谦逊与温和得到陈的赏识,陈经过了一番思想动员,黄怀着激动的心情当上了软件学院团总支的副书记。在随后的工作开展中,他们两人积极配合,把总支的一切比赛
活动办得有声有色,在这次大型文体活动中,软件取得了不俗的成绩,其实都归功于他们二人的功劳。事实上,今后陈黄二人在对外谈起这次文体活动的成绩时,都说这是他们的功劳,当然这也是他们丰功伟绩的一部分。
电子竞技大赛作为这次文体活动的重头戏,举办责任落在中心头上。这次的工作挑战性非常大,但是通过中心人的满腔的工作热情,终于把比赛顺利完成了。要知道,中心为比赛的设备搭建,是通宵达旦地工作的。中心在这次的工作中涌
现了非常多积极的人物,如高、郑等人,郑后来经我推荐,成了我的接班人;与之形成鲜明对比的是,一些工作懒散的同
学的较差表现情况非常突出,以至于电子竞技大赛结束后,我不得不把他们一一请辞出中心,其中包括副主任许、部员啸和冬等,许被辞退后,高被我推荐接管了他的工作。
高当上了网络信息中心的副主任之后,中心的阵容、士气达到了历史新高。但之前辞退许是经历了很多波折的,对于许,这次的辞退在整个大学生涯来说无疑是阴影。直到今天我与朋友提及这次激烈的行为时,不同的同学还是有不同的意
见。许被辞退之后,从此再也没涉足学院或园区的管理工作。
张在这次的文体大赛中的作用发挥到了极致。他的风头与权力远远盖过了学生会主席。因为整个文体大赛的全部经费一共近万元都是他一个人拉赞助拉回来的。他可以对学生会里任何举办项目的部门指手画脚,因为他掌管着所有经费,主
席团其余任何成员只能对他附首是从。他是这次活动的最大受益者,一方面他在园区的权威达到颠峰,令老师们钦佩不已,
另一方面,他从那笔庞大的赞助费中通过各种手段抽成了至少50%的资金,而且这笔资金是永远无法核算的。同时,他开始有意识地把他的影响扩张到他同院的另外一个系——物理系(当时物理系与机电系03级加起来近400人)。当时来自物
理系的学生会办公室主任,也是我的好友小王,很敏感地意识到了这个问题,他与物理系的总支书记联合起来,发动了一场名为“打倒以张为首的机电帮”的明争暗斗活动,但最后活动以失败告终,物理系的总支书记乖乖地成了张的一个爪牙。
大一的学生工作是我被评为厦门大学校级优秀团员追加三等奖学金的荣誉下结束的。但是,从这个时候开始,就有个问题一直困扰我,那就是园区的学生会即将解散,大二到来时,各个园区再次重组,而且软件、经济、管理和建筑即将分开。这意味着我辛勤培养的团队即将解散。
阴云笼罩映雪
大二尚未开始,我便忙于奔走于校团工委书记高老师身边。原因是我不让自己的团队在新学年的园区重组中解散,我恳求高老师以团委的名义接收我们的团队,但遭到了高的拒绝。我的行为并没有得到高的好感,以至于在整个大二学年里,
我所策划的许多大型活动因为没得到高老师的审核通过而作废。
因此,前博学网络信息中心便只好以社团的名义继续存在下去,,命名为海韵学生创新中心。事实上,海韵后来的影响力大大不如博学。
新的园区划分出炉了,软件、物理机电、法律、人文三个学院被划分到映雪园区,由于大一新生入住漳州校区,一个园区的管理人数达到了两千多人,园区升级成为学生工作站,这也意味着,新成立的团委学生会将会有更大的管理权力。
任何一位有野心的前干部都意识到,新的学生干部选举将是异常残酷的,但工作重点,也都必然是放在前期的老师公关活动上,他们都纷纷摩拳擦掌,应付这次风暴。
映雪的老师领导班子与博学的不同,我们必须重新摸透新主任、书记、老师的脾气,以及根据自己的意向选择分管不同部门、学院的老师去混熟络。
理所当然,我们再次与张分在同一个工作站。也很明显,张的目光盯住了映雪的学生会主席。但其中有相当大的威胁,首先来自法学院。法学院的同学几乎每个精于世道,对官场上的所有工作有极大的热情。法学院的学生干部,大到校会主
席,小到班干部,占了整个学院的90%以上。这就意味着,机电帮与法律系将有一场硬仗。
张首先要做的事情便是排异存己。从博学搬过来的同学,张是使尽一切手段拉拢。然而,陈也有与张一样的野心,这对张来说,无疑是眼中钉。无奈之下,张只好用了一个小手段,把陈赶下台。
那时的黄与我一样,都有意愿当软件学院的总支书记兼任学生会副主席。张利用了这一点,采用分离游说的手段,向我们宣扬:“陈是你们最大的威胁,陈的工作能力以及为人不足以再次成为你们的领导,陈如果当选,这将是学院与工作
站的不幸!”的确,陈当时的表现在同学们的印象中普遍不好。张要求我们必须多与老师沟通,把陈的现实情况要老师作及时的准确的详细的反映!我与黄信以为真,积极着手这件事情。另一方面,张建立了自己的人马后,极力把他们向老师
推荐,同时采用各个击破的手段,化解法学院人文学院的有关骨干。对于张是最好消息的是,前囊萤园区学生会主席,来自法学院的某同学放弃了参与学生会竞选的念头。
学生会干部面试在一片紧张的气氛中过去了。结果出来之后,整个映雪学生工作站在平静中带有一点震惊。
陈被彻彻底底地赶下了台,他被挂在了权益部这样的冷部门当了副部长,学院总支的事情再也没有他经手的机会。张如愿以偿当上了主席。
但我并没有成为学院的总支书记,而是按原来的职位继续做下去。幸运的是,映雪本没有设置网络信息中心,这个中心是老师们特地为我安排的。后来我才知道,这并非是一件好事。
黄当上了总支书记兼学生会副主席。他可谓是感慨万分,从被陈提拔,到把陈踢下去坐到陈的位置上来,这样的故事,在厦大乃至中国的所有高校,到底有多少次的发生?答案其实是很多的。中国这一代的年轻人,其实做到这个份上,实在
不简单,事实上,我们相当一部分的人已经有完全脱离书生气的情况了。
直到至今,我对当初与黄联合起来把陈赶下去的行为决定感到深深的内疚。一方面,自己没有从这次行为中得到任何的好处,令一方面,不管怎么说,陈是我共事一年的同僚,有一定的感情基础,他在博学的工作中给了我很多的支持。我
是为了自己的利益而罔顾一切,终于导致陈有这样的下场。事实上,陈当初即使犯了任何错误,也决不至于导致他有这样的结局,而且在后来的大学生活中,越来越多的同学发现,其实陈是一位思想觉悟极高,政治素养很好,领导能力、办事能力很强的同学。然而,自从他被“打倒”后,直到至今也没有“站”起来。一切的一切,都与张、黄、我有莫大的关系。
学院人数达到了444人,因此成立了软件学院团总支,内部开始建立庞大的学生团支部机构,从体育文娱到办公室,各部门应有尽有,黄掌管整个学院,工作比当年的陈多了很多。
事实上,在映雪的一年里,我的工作十分不顺利,无论是电脑维护还是活动的开展。虽然我在建设网络化的映雪学生站中作了一定贡献,但是,令我不安的是,我似乎渐渐被学院工作机构所孤立,这对于向本部过渡来说,是很不妙的。
黄作为学院总支的一把手,渐渐掌握了运用权力的技巧。2005年上半年,他组织学院干部,挂着校团工委的名义策划了一个名为电子作品大赛的活动。这次活动的赞助依然是由张筹集到的,黄同样不得不在其指点下工作。由于这次活动的定
位本来就不十分明确,加上黄缺乏此方面的经验,他为办好此次活动,足足瘦了5斤。但是,总支内部因为此次活动产生了很多不满的抱怨,认为是浪费人力物力财力特别是时间的一个活动。于是,总支内干部很快分成了两个部分,“挺黄”和“倒黄”。黄在日后的工作包括推优评优工作中,都下意识地排挤“倒黄”的份子。
回到鹭岛 梦的终结
大学的生涯就这么过了一半,我们离开奋斗了两年的漳州校区,回到了美丽的厦门岛。厦门大学本部采取学院管理制度,跟漳州校区略有不同,这表示着我辛苦在漳州与老师建立的良好关系,准备在厦门从零开始。
我怀着不详的预感来到海韵园,我知道我被学院孤立的程度,我也知道自己在学院很多东西都得从零开始,之前苦心经营的团队成员已经回到各个学院,我在软件学院的群众基础并没有特别好。
学院新一轮的学生会竞选又开始了,我决定不再在学生会工作,而是转向更能起到我作用软件学社和IBM俱乐部。我抱着自己曾经有两年的干部管理经验,以及跟师兄较好的关系,能在学社里面担任一定的工作。
学生会的竞选开始了,陈与黄的竞争最为激烈,陈在过去一年的时间里韬光养晦,积极与同学打好关系,准备在新的竞争中把自己的位置夺回来。遗憾的是,他再次败给了黄,他只能留在培训部做副部长。而黄则成为总支副书记(书记是
师兄,但他将是未来学生会主席的最好人选)。这是一次很大的变化,因为在漳州做了两年干部之后,回来一切都要跟着师兄做起。事实上,许多师兄当学生干部的经验并不比我们多,因为我们从大一开始就坐到了干部正职,一切问题都是自
己解决的,而在校本部长大的师兄未必有这个机会。
另一方面,我也在为自己能进入学社而努力,但是,随之而来的遭遇却成了我大学生涯的一个不大不小的阴影。
2005年10月12日,学院党委副书记召集了包括我在内的四名同学开了个小会议,会上意思是说,我们已经被内定为学社
的主要骨干,以及布置了日后学社的一些工作。
2005年10月15日,学社面试开始了,由于我知道自己已经被内定,基本没花太多时间准备面试的事情,但面试过程非常顺利。
2005年10月19日,学社干部面试结果正式公布,我不在干部名单内。当年我中心的部下,包括被我辞退的一些部员,如冬、啸堂而皇之的成为了我的部长,担任了很重要的职务。余这位曾经与陈不和的同学,如今当上了学社的骨干。
这就是我大学干部工作生涯的终点。可以说,这个结局是我一直害怕担心发生的却是注定要发生的。为了学社,我放弃了学生会,但学社通过一些我至今想不明白的手段(例如,为什么要党委书记老师给我开这么一个会?)使我现在失去了
很多很多的机会?带着这个问题,我将度过我余下的大学生活。


2005-10-15 23:30:44 天气:
  今天正式面试,地点在软件实验楼,厦门软件嵌入式开发系统研究实验室——旁边的会议室。面试官是我最熟悉的也是学院本科生里最牛的三个师兄,还有三个研究生。
  年年都要面试,博学老师,映雪老师,学院师兄,习以为常。希望将来工作少点面试。因为我不想做“面霸”。不知为什么,今年说得没往年自信了,可能是因为往年面对的不是本专业的老师,可以吹嘘一下。今年的话,只好从自己优势下口,师兄们爱听不听的样子,不知道是因为内定好了还是因为不屑。
  将来无论是广告还是软件,还是软件中的广告或广告中的软件,都注定这是一条有趣的道路,越来越感觉到自己选择的路似乎挺对的,一个工学学士加一个文学学士,嘿嘿,加上大学的工作经验,在厦门打通的人脉。
  可惜,不知道在厦门积累的财富带回广东,是否还值钱,这是每一个在外省念书的同学现在所担忧的,就是不能被珠三角所接纳,我也很担心不已。

2005-10-13 22:20:19 天气:
更新一个概念,我一直误会的,那就是软件学社与IBM CLUB的区别。我一直以为两者互不相同,其实,老师的意思是,IBM就是学社,学社就是IBM,可怜的是,IBM作为挂名,仅仅是学社用来筹集资金的一个招牌而已。IBM的宗旨还包括引领同学感受IT技术的魅力,但学社的范围相对小了一点。不知道,以后学社是否还有办活动的必要,有其他合作项目(例如硬件的营销)的必要等等。否则,发展空间将会缩小到软件开发和网站建设而已,远远比一个网络部的范围小多了。

2005-10-13 22:13:16 天气:
厦门大学IBM CLUB是IBM公司今年成立的第一个俱乐部,在这之前,IBM公司已经在华中科技大学,哈尔滨工业大学,华南理工大学,四川大学,复旦大学等9个高校建立了这样的俱乐部。同时对IBM公司提供的12项与大学合作的项目,包括课程体系建设、师资培训示教、专业技术认证、教学平台共建、教材编写出版、奖学金奖教金、专家学术巡讲、校园科技活动、毕业实习招聘、技术支持服务等分别进行了简单介绍。
IBMCLUB会员团队是由俱乐部开展日常学习活动和各类比赛的参加者组成,是俱乐部的主人翁;工作团队负责管理和监督俱乐部的正常运作,是俱乐部活动的服务者;俱乐部在厦门大学的主要活动形式为举办技术讨论小组、举办技术讲座、开发实践项目、参加各类IBM技术竞赛等,活动旨在校园内推广IT前沿技术,利用俱乐部的资源以及IBM大学合作部的有利支持,让同学们有更多的机会与IBM的前沿技术零距离接触,并通过开发实践项目,体验团队合作精神,为所有俱乐部成员以及参加俱乐部活动的同学提供实践创新、提升自我的舞台。
于是,有了联想并购IBM,就会有IBM兼并海韵学生创新中心,海韵建立的初衷与宗旨,本质上与CLUB是无任何不同的,相信在IBM,我们将会有更好的工作条件与创新机遇,我们将会有更多锻炼和展示自己的平台!
所以,海韵的同志们注意了,我们即将迎接被兼并的时刻的到来,任何想继续在IBM\海韵奋斗的同志们,请在群上回应一下!如果有离开的同志,请在群上说明,我们将衷心感谢你们曾经为海韵作出的努力!

2005-10-13 22:12:32 天气:
其实昨天的小会议比料想中更加平淡无奇地过去了。范大师兄的印象开始建立起来了,至少不会像以前那样肤浅。有理由相信,他从大一到大三都是在勤奋学习中度过的,保送研究生自然不在话下。事实上,跟他谈起来,他更多关心的是保研、工程硕士、其他高校的学科建设、专业建设,而不是关于学社与IBM的工作设想。当一个保研的学生到了这个程度上还对学科是如此执着和狂热,那么博士或者博士后他是很有可能一直追求下去的。不管怎么说,师兄的一代是崇尚技术与成绩的一代,对于今年没拿奖学金的我来说,道路是艰辛的。

2005-10-12 0:16:47 天气:
晚上7:45,学院传出消息,被内定为软件学社某骨干,小道消息而已,明天有希望被证实。……与我的初衷似乎有那么一点不相同,IBM似乎更让我由种博学网络信息中心的感觉,我就是爱它的一无所有。遗憾的是,今日每次碰到IBM主席范师兄时候,我都会察言观色,发现师兄对女师妹比对我更感冒,遗弃感奇强。而且看来看去,范师兄越来越象个走进研究所的,不像一个即将走出校门走出社会的,不过的确,他能保研,成绩也肯定比我好。算了,一切不好立刻下结论,学社未必要我,IBM也未必弃我。

2005-10-11 23:13:39 天气:
身边一切一切似乎都在悄然变化,大学对我的塑造似乎将要进入另外一个台阶,沉寂了一个多月后,学习外的工作生活似乎开始有了端倪,等待我的究竟是新的挑战还是再次的失落?
学生会已经离开我了,真正来说,是我离开学生会。并不是因为我厌于官场上、人情世故上的徘徊与游走,也并不说明我放弃了与学院领导老师建立良好关系的机会。大胆说一句,待人接物为人处世,学院里未必有人比我出色,问题在于,对于学生会的工作、本质,特别是在学院范围来说,我觉得如果进入学生会的话,我会损失更多。

2005-10-9 22:17:18 天气:
两年多的大学生活,发现学到的知识并没想象中的多,但感慨万千,或许这就是大学带给我的财富。我越来越感觉到自己离社会的日子不远了,却没有对校园的任何依恋。没办法,实在不想考研,因为自己的年纪都比同级的同学稍大,同时觉得自立的欲望也相对强烈一点。但是,我就这么离开校园,比考研的同学提早踏入社会,是否就如我们的师兄,前前前软件学院学生会主席李镇所说的“不争气”呢?如今的社会,是否只有到达硕士的水平,才有资格立足得很好,才是所谓真正的知识精英?如今软件学院崇尚“精英”,但所谓的精英,老师们至今没给我们明确的定义,如果是以编程技术或考试成绩衡量的话,软件的精英将来都去考研究生了,如我这种在夹缝中生存的人,属于软件06毕业生中的一员,岂不都是垃圾?

2007年8月15日星期三

chmod

chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
1. 文字设定法
chmod [who] [+ | - | =] [mode] 文件名?
命令中各选项的含义为:
操作对象who可是下述字母中的任一个或者它们的组合:

u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值。
操作符号可以是:
+ 添加某个权限。
- 取消某个权限。
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读。
w 可写。
x 可执行。
X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。
s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。
t 保存程序的文本到交换设备上。
u 与文件属主拥有一样的权限。
g 与和文件属主同组的用户拥有一样的权限。
o 与其他用户拥有一样的权限。
文件名:以空格分开的要改变权限的文件列表,支持通配符。
在一个命令行中可给出多个权限方式,其间用逗号隔开。例如:chmod g+r,o+r example
使同组和其他用户对文件example 有读权限。
2. 数字设定法
我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。
例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
chmod [mode] 文件名?
例子:
(1)文字设定法:
例1:$ chmod a+x sort
即设定文件sort的属性为:
文件属主(u) 增加执行权限
与文件属主同组用户(g) 增加执行权限
其他用户(o) 增加执行权限 
例2:$ chmod ug+w,o-x text
即设定文件text的属性为:
文件属主(u) 增加写权限
与文件属主同组用户(g) 增加写权限
其他用户(o) 删除执行权限
例3:$ chmod u+s a.out
假设执行chmod后a.out的权限为(可以用ls – l a.out命令来看):
–rws--x--x 1 inin users 7192 Nov 4 14:22 a.out
并且这个执行文件要用到一个文本文件shiyan1.c,其文件存取权限为“–rw-------”,即该文件只有其属主具有读写权限。
当其他用户执行a.out这个程序时,他的身份因这个程序暂时变成inin(由于chmod命令中使用了s选项),所以他就能够读取shiyan1.c这个文件(虽然这个文件被设定为其他人不具备任何权限),这就是s的功能。
因此,在整个系统中特别是root本身,最好不要过多的设置这种类型的文件(除非必要)这样可以保障系统的安全,避免因为某些程序的bug而使系统遭到入侵。
例4:$ chmod a–x mm.txt
$ chmod –x mm.txt
$ chmod ugo–x mm.txt
以上这三个命令都是将文件mm.txt的执行权限删除,它设定的对象为所有使用者。
(2)数字设定法:
例1: $ chmod 644 mm.txt
$ ls –l
即设定文件mm.txt的属性为:
-rw-r--r-- 1 inin users 1155 Nov 5 11:22 mm.txt
文件属主(u)inin 拥有读、写权限
与文件属主同组人用户(g) 拥有读权限
其他人(o) 拥有读权限
例2: $ chmod 750 wch.txt
$ ls –l
-rwxr-x--- 1 inin users 44137 Nov 12 9:22 wchtxt
即设定wchtxt这个文件的属性为:
文件主本人(u)inin 可读/可写/可执行权
与文件主同组人(g) 可读/可执行权
其他人(o) 没有任何权限

2007年8月5日星期日

Subversion server setup

首先下载Subversion Windows版本的服务器软件,下载地址如下: PHPChina 开源社区门户#B?(v+ma X$t2h3\
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 PHPChina 开源社区门户F.vio.fg9o r
文件为svn-1.2.0-setup.exe,然后执行安装,安装目录如:d:\develop\subversion,然后设置一下系统的环境变量Path,将Subversion的bin路径加入到系统的path中。 PHPChina 开源社区门户b!W}C*R6Ie7R0t
2 创建Subersion库:首先建立一个目录存放Subversion的库,在该库中存放所以的Subversion项目,如D:\repository\subversion
L.SA;?/i:A#| Ic0 3 创建一个新的Subversion项目。
,B!@K]�uKi0 只需执行: svnadmin create D:\repository\subversion\projectname PHPChina 开源社区门户eOOB6t;H&U;{]
下面需要设置项目的用户信息,只需打开Subversion项目conf目录下passwd文件添加新的用户即可,如 PHPChina 开源社区门户I4T7o8FI ?}9N
[users]
~ @&l@'c0]{0VE$a0 admin = mypassword
f7[~D4bx|n0 接下来是设置项目的一些其他信息,打开conf目录下的svnserve.conf文件,然后进行如下设置即可:
9CE+y7J5uF�N/A0B D2k0 [general] PHPChina 开源社区门户f5Io3O E%S
anon-access = read
0ItFV M!x0 auth-access = write PHPChina 开源社区门户x1B q-q&SH2r
password-db = passwd PHPChina 开源社区门户L[8S?0K$d*\Wb%?}B
realm = projectname PHPChina 开源社区门户6K#I6{)UD[Y+E
4 启动Subversion,这里可以通过命令行启动,最好使用SVN Service Wrapper,你可以通过以下地址下载: http://dark.clansoft.dk/~mbn/svnservice ,将SVNService.exe拷贝到Subversion安装主目录的bin目录下即可,然后执行以下命令,就可以将Subversion以windows服务方式启动啦。 PHPChina 开源社区门户;Xr+_#j�}Qt zd
SVNService -install -d -r D:\repository\subversion PHPChina 开源社区门户,s MB/?3`
5 向Subversion中导入项目:现在我们需要将项目导入到Subversion的库中,只需执行一下命令: svn import d:\projectname svn://localhost/projectname -m “initial import” –username admin –password mypassword PHPChina 开源社区门户S't7m }o n^
这样项目就导入到subversion库中啦。 PHPChina 开源社区门户SH6] jY8@XS[
6 将项目导出:从Subversion项目中导出项目也很简单,只需执行以下操作: PHPChina 开源社区门户Z*V qs ^-L s%A
svn co svn://localhost/projectname –username admin –password mypassword
-------------------------------------------------------------------------
  Svn配置

  4.1 建立版本库目录

  [root@localhost root] #mkdir –p /svn

  svn是我自己建立的目录,各人根据具体情况设计名字

  4.2 建立一个用户,用与管理这个版本库目录

  [root@localhost root] #useradd -m -s /bin/bash lyl

  lyl是建立的用户名,可以根据习惯改

  4.3 用建立的用户管理我们刚建的版本库目录

  [root@localhost root] #chown –R lyl.lyl /svn

  用lyl来管理我们的版本库目录/svn

  4.4 启动服务器

  用用户lyl来管理版本库目录/svn,则须转为lyl,命令如下:

  [root@localhost root] #su lyl

  启动svn服务

  [root@localhost root] #svnserve -d -r /svn/;

  -d表示以daemon方式(后台运行)运行

  -r/svn/指定根目录是/svn/

  检查服务器是否启动正常:

  [svn_leader@localhost root]$ ps –ef|grep svnserve

  如果显示如下,即为启动成功:

  lyl  6941   1 0 15:07 ?  00:00:00 svnserve -d ——listen-port 9999 -r /svn

-----------------------------------------------------
一旦你有了树形结构和数据你就可以继续了,使用svn import导入数据到版本库

$ svn import /home/kouyujie/project file:///home/kouyujie/repos -m "initial import"
Adding /home/kouyujie/project/branches
Adding /home/kouyujie/project/tags
Adding /home/kouyujie/project/trunk
Adding /home/kouyujie/project/trunk/foo.c

Mount Windows Partitions in SuSE

挂载Windows分区最普遍而且通用的方法是用mount命令或者修改/etc/fstab文件,但相对繁琐一些,对于新手推荐使用SuSE Linux 自带的YaST工具!
菜单-系统-YaST-系统-分区管理器,把Windows的某个分区选中,双击或点“编辑”,在装入点写上挂载目录,比如Windows的C 盘,挂载点可以写/windows/C(需要注意,Linux中的目录表示方式,是 / 而不是 \ ,跟windows不同)。千万不要选格式化!否则 后果……。设置好点应用就可以了。
如果你的系统没有使用UTF-8编码,而是cp936编码,在挂载的时候有一些需要注意的地方,否则挂载后Windows分区目录会是乱码。
1 如果Windows分区是NTFS格式,在以上编辑分区时选“Fstab选项”,任意选项值里原有的users,gid=users, umask=0002,nls=utf8修改为users,gid=users,umask=0002,nls=cp936
2 如果Windows分区是Fat32格式,在以上编辑分区时选“Fstab选项”,任意选项值里原有的users,gid=users,umask= &nbsp0002,utf8=true修改为users,gid=users,umask=0002,utf8=no,iocharset= cp936

2007年7月27日星期五

后记

这是一段很美好的时光,这是一段舍不得忘掉的记忆。然而,无情的时光流逝将把这段记忆磨平,冲淡,最后只剩下“大约在某年某月,我去云南玩了一趟”。我不忍心看着这样,与其去伤逝,还不如趁早把记忆中的东西写下来,让它成为永恒。我的记性不好,但云南回来后,我很惊奇的发现我居然对两个星期来每天到哪里玩记得清清楚楚。于是我就想记记流水账,把哪一天,玩过哪些地方记下来。当时我没办法上网,我就在随身的记事本上写。到云南的第一天原来是这样写的:

7.1 到达昆明。由于纯静与吴翔手机没电,通过媛君问得张妍的手机号,与她们取得联系。
游金殿

可到了7月2日就写得一发不可收拾了,整整写了两页。之后的能上网了,这两个星期来我每天晚上除了聊天外基本上都在写,把在云南的每一天记下来,然后把前面写的7月1日和2日也整理上去,到今天才算真正结束。现在回头一看,我也不知道我写的这十多篇是些什么东西,既不是流水账,因为我写得太啰嗦了;也不是什么旅游攻略,因为我也交代清楚什么路线1路线2之类的;更不是游记,写景的不多,语言也不优美,都在啰里啰嗦地写一些琐事,估计没人会想去看的。可就是那些人,那些在一起的时光,才是现在我回想起来最美好的而又生怕淡忘的东西,于是我就把它们写下的,至于美丽的风景,还有好几G的照片呢。现在终于将它们写下了,有种总算松了一口气的感觉。

2007年7月24日星期二

回厦门的火车

2007年7月12日到14日
我们12日下午4点多上火车,14日上午9点多到厦门,在彩云之南的毕业旅行就这样结束了。吴翔和张妍拿着十字绣在车上不停的绣,我则看张妍的一本关于弗洛伊德和精神分析引论的书。有时候我们就一起唱歌,唱《凤凰花开的路口》(这是我们旅途中唱得最多的,虽然歌词记得不多),唱《一夜长大》。到了晚上,我们就玩杀人游戏。13号晚上,我们玩杀人游戏到到熄灯了,我们就在黑暗中聊天,聊各人的爱情史。吴翔,张妍,黄锴和黄济泳他们四个人都是保送本校的研究生,以后见面机会还有,我快要远赴北方求学了,那天玩上我特别伤感,因为那是我们旅行的最后一个晚上,也可能是我跟他们在一起的最后一个晚上了。特别是吴翔和张妍,以后还不知道能不能再见到她们。

2007年7月23日星期一

石林

2007年7月11日 阴有小雨
这天去石林。前一天问方远,他说南窑车站可以买到车票。于是我们和女生约8:00到南窑车站。女生去得比我们早,在我还在济泳他舅舅的车上时她们就告诉我们,南窑车站没有到石林的车。济泳的舅舅于是说东部车站有买,干脆我们直接去东部车站吧。我想,既然南窑买不到票,去那边也只能是把女生接过来而已。但这辆车不够大,她们也只能自己另外坐车。因为我们也不太确定东部车站能不能买到票,不如我们先去看看。于是我们改道去东部车站。当我们快到东部车站时,吴翔又告诉我们说她们附近的另一个车站可以买到石林的票。怎么办?是回去女生那边呢,还是到东部车站?济泳的舅舅说,现在回去那边还要20分钟左右,干脆让她们女生自己坐车去石林,我们从东部车站坐车。如果是要省时间,这样当然比较省,而且我们又不想太麻烦济泳他舅,于是我把原话告诉了女生。结果招来女生的严重谴责,说我们太不负责任,先让她们去南窑车站,然后自己跑到东部车站,让她们自己坐车去石林。我们只好赔罪,然后让她们打的过来东部车站,我们等她们一起买票。8:30的车,22元,先到石林县城,再从县城坐公交去景区,到那边已经是10:30了。门票学生证打完折后100,居然可以刷银联卡。
石林可真是人山人海,拍照也不好拍。到了中午下起雨来,人是少了许多,但玩得还不是很痛快。石林是有,只是人造景观太多了,大片大片的草坪。原云南省主席龙云所题的“石林”两字已在为康生等人用水泥给补平了,现在所能看到的那两字只是今人集古帖所成,而补上的“龙云题”三个字只是附会。那块被补平的碑在新碑的旁边。
由于觉得没意思,今天回去得较早。回到昆明后,才差不多五点,于是我和济泳就决定接着去滇池(海梗公园)。滇池里蓝藻大爆发,一派死气沉沉,死鱼,死龟,臭不可闻。湖水所淹过的石头,就像涂了一层厚厚的绿油漆。那时刚雨过天晴,东天出现了一道很大的彩虹。坐在海梗公园的秋千上,感觉得特好。
在昆明的这两天又被蚊子叮了两个晚上

丽江到昆明

7月10日 丽江大雨 大理小雨 昆明晴
前一天晚上到丽江后虽然老板娘有提醒我们要提早买昆明的票,可我们都只顾玩,没在意。这下可好了,一早起来大雨就下个不停,怎么办去买票?发愁了半个早上,终于下决心,打电话问问还能不能买到票。结果是肯定的。于是大伙振作起来,收拾行李,退房。他们一人还有一大堆明信片要寄,于是派我一个人去买票。丽江这小小城市,客运站却有好几个,什么高快站,省旅高快,新客运站,旧客运站,我一路问得眼光缭乱,本来想一个人乘公交车过去,后来只好打车了。车票一人177,内含3元保险。
黄锴上次把相机的电池和充电器落在大理,这次得先回大理。于是我们四人坐了八九个小时的车先回昆明。
到了昆明后不久,找个家餐厅,还正在点菜,黄锴也到了。吃饭时老有一只猫在我们旁边钻来钻去。张妍怕猫,于是我们几个男生就不断地赶猫。黄济泳不小心被猫抓伤了,饭后只好去打狂犬病疫苗。
在昆明,女生还是住她们同学黄翠翠家,我们还是住济泳他舅舅为我们安排的招待所。

2007年7月22日星期日

从香格里拉回丽江:白水台与虎跳峡

2007年7月9日 阴有小雨
我们包车从香格里拉回丽江,沿途游玩白水台,下虎跳,中虎跳和上虎跳,车费500,还是海师傅的车。
一路盘山公路,风景美不胜收,海师傅不时停下来让我们拍照。白水台是一片被泉水冲刷成的成梯田状的石灰岩。为什么会成梯田状,我也想不通。
经过虎跳峡要买票,海师傅跟售票员说我们有三个是要玩虎峡,另外两个只是过路,为我们逃掉了两票,而且学生证在这边也可以打半折,省了不少钱。在虎跳峡我们徒步了两段,买票前(可能是下虎跳吧)走了1公里,买票后等车开出了售票站的视野,我们又走了四五公里。那些地方前不着村后不着店,头上的峭壁随时会有石头掉下来,路的左边是滚滚的金沙江。第二次步行开始时,黄锴和济泳想小便,也只能是等我带女生走远后,他们在路边解决而已。
上虎跳有栈道可以下到金沙江的水边,近距离感受金沙江的震憾。本来栈道是要检票的,海师傅告诉我们,他们五点下班,于是我们五个人虽然只有三张票,还是可以全部下去的。
到丽江已经是天黑了,我们还住茂恒缘。这是我们在丽江过的最后一个晚上。到小巴黎酒吧是张妍的夙愿,因为前几天古城路边两个歌手把我们都陶醉了,而他们就是小巴黎的。于是我们行李刚放下,就迫不急待地赶往小巴黎。这家酒吧,与古城的其它酒吧一样,都很有韵味。昏暗的酒光,烛影摇红。我们在那边坐了一个多小时,那两位歌手之一只唱了一会儿,就坐下来休息了,一直到我们离开。不过在那样的环境下聊天还是感觉很好的。

香格里拉第三天:发呆,逛街

2007年7月8日 晴
前一天的雨把我们的鞋全弄湿了,他们女生用电吹风把鞋子吹干了,我们三个男生还都是湿的。我前一天顺便洗了鞋子,这天早上还滴水呢。纯静走了,我们一时决定不下到当天到哪里玩。他们每人都有好多明信片要寄,于是就找邮局寄。普达措国家公园的门票是一封贴了邮票的明信片,我于是把它寄给Philip。
瞎逛了一上午,中午到一家藏族餐厅吃,那酥油茶的味道实在喝不惯。由于前一天太累了,午饭回来大伙都呼呼大睡,她们女生一直睡到下午4点。本来酝酿中的当天旅行计划就全完了。接下来的时间就还是要么在客栈发呆,要么逛街。客栈庭院边有一个摇椅,我喜欢坐在上面发呆,张妍喜欢替我摇,摇起来怪舒服的。

2007年7月19日星期四

香格里拉第二天:松赞林寺和普达措

2007年7月7日 多云转雷阵雨
海师傅突然说孩子那天开家长会,来不了,让另外一个师傅替他来,价钱一样。于是那位师傅带我们先去松赞林寺,后去普达措。
这座藏传佛教的寺庙与中原的寺庙有很大不同,依山而建,分为几层,而且并不是轴对称。整个建筑让人摸不着头脑,正如藏传佛教一样神秘。吸取玉龙雪山的教训,我们不敢在松赞林寺久留,毕竟我们今天的主角是普达措。
普达措的门票是110,环保车费80, 这两项捆绑销售。有学生证门票可以打五折,于是我们一人交了135进去。因为怕冷,三个女生还各租了一件棉袄进去。
普达措国家公园目前主要有两个景点:属都湖和碧塔海。环保车先在属都湖栈道起点停下,导游告诉游客,栈道全长2.7公里,游客可以选择走完,也可以继续坐环保车,然后走最后的500米。我们选择前者,然后从终点上车,到碧塔海。一样,游客可以步行走完碧塔海五六公里的栈道,也可以选择坐30元的快艇,我们还是选择前者。
普达措简直是人间仙境,山清水秀草绿花香。在属都湖的栈道上,还不时有松鼠跳跃其间。我们在碧塔海时天降大雨,我们浑身湿透,但也看到了碧塔海烟雾燎绕的另一番景色。碧塔海的木栈道旁开满了各种各样的小花,淡淡的芳香,让我们不禁唱起了《那些花儿》。
纯静当晚的飞机回去,吴翔和张妍去送她。香格里拉的机场估计是相当荒凉,她们差点打不着的回来。

2007年7月18日星期三

离开丽江,抵达香格里拉

2007年7月6日 丽江暴雨 香格里拉晴

一大早就烦恼事一大堆。丽江是玩得差不多了,下一站是香格里拉,可怎么去,去了怎么玩?我们三个男生都很想去徒步虎跳峡,可女生却不想去。纯静家里有事,8号之前就得走,可她又不想错过香格里拉,于是黄锴就忙着帮她订从香格里拉到温州的机票。还有,6号看来是玩不了了,能到达香格里拉就不错了,那如何在纯静走之前把她最想去的三个景点玩遍:普达措国家森林公园,松赞林寺和白水台?张妍和吴翔这天起得出奇的早,跑出去逛街了,逛了半个早上,回来补眠。纯静感冒了,病奄奄的躺在床上。再犹豫下去也不是办法,我和济泳决定出去走走,看能不能买到当天到香格里拉的车票,如果能买到,就马上回来,12点之前退房,省掉一天的房钱。运气不错,我们买到了下午2:30的票。回来时已经11:45了,一到她们女生的房间,纯静已经和黄锴买机票去了,另外两人还在睡。我一看急了,一边把她们叫起来收拾行李,一边给老板求情,给我们通融15分钟。过了12点,黄锴和纯静回来了,我们收拾好行李,午餐就在老板家吃饺子,一斤15元,我们6个人吃了三斤。东北的饺子,味道真的不错。
好几天没清帐了,我们6个人间的财务关系可真是千丝万缕。济泳和黄锴一个用笔算,另一个用Excel核对,从吃饺子算到去香格里拉的大巴上,算了好几个小时。去香格里拉的4个小时中,大巴沿着盘上公里一路上升,耳膜也像坐飞机的起飞和降落时一样不断变化。下车后一个姓海的满族师傅给我们拉住了,他倒也爽快,从车站把我们拉到古城,一个1块钱,到那边随我们住哪里,他决不干预。把我们拉到古城后,他给我们留了联系方式,告诉我们需要车时可以找他。这次我们可要货比三家了。我们先看了国际青年旅馆,然后看了家古城路口的客栈,把行李先放在那家客栈外面的餐厅里,留济泳守着,其它人一起再去看其它客栈。不过最后还是没有看到更理想的,在古城路口的那家经过砍价,以三人间一天70元住下了。
纯静的机票是7号晚上的,白水台较远,去不了了,于是决定7号白天去普达措国家公园和松赞林寺。路上也拿了不少司机的名片,晚上一个个打过去,有两百多的,有一百多的。还是海师傅爽快,开口就是一百块,带我们玩一天,我们接受了。

丽江的第三天:玉龙雪山

2007年7月5日 晴

前一天去拉市海前我们就买好了玉龙雪山的索道票,牦牛坪索道80,冰川公园160。她们女生还一人买了一个20元的氧气筒,老板说如果没拆封的话可以退。由于我们在住宿时已交了古城维护费,在玉龙雪山就不用交了,但是还要交进山费,学生票打五折40。因为怕冷,我们每人还租了羽绒服上去,每人30。后来才知道氧气和羽绒服完全是多此一举。高山是缺氧,但我们年轻人还用不上氧气筒,那天烈日炎炎,我一直都穿短袖。
牦牛坪的那片高山草垫很漂亮,我们绕了那座小山头的栈道走了一圈,花了很多时间。牦牛坪索道是开放式的吊篮,下山时,我们在索道上一路学山上的乌鸦叫,唱歌,纯静的歌声还引来不少游客的称赞。我们到白水河已经是下午3:05了,因为时间不多了,我们决定只在哪边逗留5分钟,于是我定了闹钟。刚才我在设我手机上的闹钟时,还发现其中有一个闹钟是设在了15:10。

到冰川公园的索道已经是下午3:30了。到了索道终点后我们还一路走走停停,拍照,看风景,也喘口气。其它人还不忘在这个高海拔的邮局寄明信片。他们4:30下班,等到广播里催游客下山时,我看时间来不及了,就给济泳拿了相机,抛下其它人,一个人沿着栈道往上跑。到了最后第二个观景台时,我遇到往下走的工作人员,他们已经不让我再往上跑了,只能给我几分钟时间在那边拍照。随黄锴与黄济泳也上来了,我们费尽口舌,就是上不去了,那时的海拔是4535。我们只好拍完照下去了。一路上遇到其它女生,吴翔快走到最后第二个观景台了,可惜也上不去了,张妍和王纯静就差很远了:她们花了太多时间寄明信片了。
回到丽江后在原来买票的地方归还氧气瓶 。那家店新开了个买牦牛角梳的铺子。一把开价18元,居然最后被几个女生砍到了8元!我买了两把,一把给雅玲,一把给奶奶。
得知有另外几个厦大的也在丽江玩,晚上下着小雨,济泳,我,黄锴和吴翔去拜访他们,看有没有办法同行。他们两对情侣,住在四方街的一个客栈,其中一个叫陈叶良子,大一在博学园时经常听到。他们明显比我们会玩得许多,出发前计划得比我们严密,一路上也比我们能了解信息,肯定比我们省了不少钱。他们决定明天要徒步虎跳峡,都准备得差不多了。我们也有在考虑徒步虎跳峡,只是现在看来,一起走是不可能了。

丽江的第二天:拉市纵马

2007年7月4日 晴

那些女生可真能睡,我们几个男生一早起来,到古城空荡荡的街道上逛了一圈,我和济泳还各买了一件东巴文的T Shirt,然后吃完早点后,替她们带早点回去,她们还在床上躺着。经过了一个早上的犹豫,我们决定去拉市海骑马,让一个前一天侯小姐向我们推荐的和师傅带我们去。
到了马场我们都惊呆了,天价啊,骑马上拉市海的源头要一人200元!我们身上都没带足够的钱。几番犹豫,还是禁不住诱惑,向和师傅借钱上去。由于管理人员说,如果我们还想划船,可以给我们优惠,一个加20就行,于是我们就一人付了220,骑马加划船。
看着比我大好几倍的动物驮着我,在我的缰绳控制下,走了四五公里的茶马古道上山,又沿原路返回,然后在马场驰聘,确实是一种很奇妙的体验。
下马后才知道受骗了,最近干旱,拉市海没水,船根本划不出去,划了一会儿就搁浅了,只好划回来。
下船后,我们尽情陶醉于夕阳下的原野与波光鳞鳞的湖光中,反正那边的天要8:30才黑,不急着回去。
回去后,我们觉得应该省点花钱了,于是在师傅的介绍下到新城的一家餐厅,每个点了一盘炒饭吃,我吃了8元,算是最省的一顿了。

2007年7月17日星期二

到达丽江:忘情束河

2007年7月3日 阴有小雨
我们早上8:30从大理出发,中午到达丽江高快站。下车进入候车厅后马上被一中年妇女给缠上了。她拿着照片一直试图说服我们住她家客栈。与我们事先打听的一样,住古城内要加收古城维护费80元/人,古城外则不要。80元的古城维护费是今年7月1日才加收的,之前只有40,而且可以逃:我们来得可真是时候啊!如果仅仅为了住古城,80元是很贵,但考虑到玩玉龙雪山时还是逃不了这80元,只是早交晚交的差别罢了。于是我们决定住古城。该中年妇女给我们开的价是行情价,没多少商量的余地。云南住宿真的很便宜,带卫生间的标准三人间一天只要20元。中年妇女愿意让她妹子开车过来,免费送我们到客栈。真服了那些女生,她们跟她说,免费送我们过去可以,但住不住她家客栈倒不一定,她居然也答应了。我们需要两个三人间,她家果然没有。于是她妹子带我们去一家名叫茂恒缘的客栈。这家客栈在女生们打印后带出来的“攻略”中榜上有名,主人是东北人。接下来女生们费尽口舌,想再砍砍价,终于以失败告终,只好以一天20元住下了。标准间,条件没大理那家好,不过还过得去。
女生就是爱逛街,东西一放下,说是要一起出去找吃的,一路上就在古城里逛了起来。最后在古城里找了家比较有特色的餐厅吃饭。吃饭时还有当地人进来向我们推销明信片,他们都买了,我流离失所,买了也没地方寄。开车送我们到古城的女人可真有耐心,一路等我们逛街,等我们吃饭,为的,是我们下午去哪玩搭她的车。我们让她失望了。吃饭后,经过一番折腾,我们告诉她,我们下午要自己玩,不想搭车。她很沮丧地走了。
后来我们决定,下午去束河古镇玩。本来想搭公交车去,后来在公交车站遇上一位侯小姐,她在束河开客栈,正要回去。她告诉我们,束河古镇现在也要收古城维护费了。于是我们就追问有什么办法可以逃。她说像她们这样长期住束河的都进出自如,我们如果想逃的话那干脆就跟她一起打的回去,她知道小路。于是我们6人加上侯小姐乘了两辆的士,成功的进入了束河。其实住在当地的人不完全都是只想赚钱的,侯小姐就不是。能够碰上侯小姐算是挺幸运的。
悠闲的人们,小桥流水,虽然带上一些商业气息,但还是能感受到恬静,这是就束河古镇。潺潺的泉水清彻见底,其中鱼儿自由自在,不禁联想到《小石潭记》中的意境:
“潭中鱼可百许头,皆若空游无所依。日光下澈,影布石上,佁然不动;俶尔远逝,往来翕忽,似与游者相乐。”
泉边的一个小亭里还有三个人弹着吉他,唱着自己写的歌曲,歌声轻缓而动听。
束河让我看到的,是另一种生活方式。要是什么时候能抛开尘世的一切宣嚣与纷扰,到束河当个客栈的小老板,该有多好!

2007年7月16日星期一

到达大理:洱海赏月

2007年7月2日 多云,夜间有小雨

我们与另外三个女生买同一班省旅高快的班车到大理,票价约120元。一下车就被两位出租车司机缠上了,说要带我们到大理古城住下并玩大理的风景,因为价格还行,我们就上了。我们住古城门口的一家客栈,条件不错,三人的标准间,带卫生间,60元一天。在客栈放下东西后,我们就出发了。

那两位司机可能是长期当司机兼导游了,太过专业了。两位司机都是当地人,他们先给我们介绍当地的小吃:粑粑,并带我们到路边一个小摊子买,因为那边比较便宜(之后的旅行证实了这一点),2块钱个,有甜味和咸味两种。我们分别买了一些,甜味的比较好吃。之后司机把我们带到严家大院,门票50元。我当时就在嘀咕,这么贵,要不要进去呢?可其它人都没说什么,如果其它人都要进去,我也不好意思一个人落下,于是只好掏钱进去。严家就是民国时代严子珍的府第,是一个纳西族是民居,里面有蒋介石和龙云的题字。里面纳西族舞表演,观看完后导游带我们去品“三道茶”。感觉很不值,后来才知道,其它人也有同样的想法。出了严家大院,司机带我们来到苍山,上面有天龙洞,当时的《天龙八部》就是在这边拍的。上苍山的路已被堵,只能乘索道上山。索道费好像是80吧,看起来短短的索道,刚刚被骗了一回,这回大家提高警惕了。犹豫许久,一起决定,不上!过后司机心情明显不好,估计是赚不到回扣的缘故。回来的路上,司机带我们到什么玉石加工场,大理石加工场,事先都没说要到这边,都是商业场所。可惜,从我们身上他们赚不到回扣的。听司机说,现在蝴蝶泉既没有蝴蝶又没有泉,于是我们就不去了。还有崇圣寺里面居说没什么东西,门票却要110。于是我们要求司机带我们到崇圣寺外面拍三塔。本来司机跟我们说,当天下午去游苍山,第二天早上去游洱海。苍山不想上去,洱海据说也只能在大游船上看,既花钱又无趣。于是我们取消了第二天的计划,决定晚上租马车去洱海边上逛,因为这边的天要到晚上8:30才暗。既然大理没什么可玩了,回来大理古城后我们就去买第二天到丽江的票,司机带我们去买的。两位司机在场里票价是每人45,女生们跟他们讨价还价未完,司机不耐烦了,收了我们下午的车钱先走了。司机一走,老板马上偷偷跟我们解释说司机要10元回扣,现在司机走了,他可以给35元卖给我们。于是我们在女生进一步砍价无效后成交。

我们回客栈稍事休息后,就进古城。大理古城名为古城,其实唯一古的东西是城门,城里是繁华的商业步行街。我们本来打算找个地方吃完饭后,就租马车去洱海。可这一进这种地方女生就流连忘返了,东逛西看,直到天黑。我也在这边买了支牦牛骨发簪,8块钱,回去送艺红。终于找了家餐厅吃饭,一边打听怎么租马车去洱海。这才知道已经太晚了,没有马车了。一边吃饭,一边有人跟我们说可以给我们拿到优惠船票,明天去洱海,我们不理。不去洱海有点可惜,可这么晚了怎么去。一吃完饭,一回到街上,女生们又把这事给忘了,继续逛街。我又随手买了一条东巴文披肩,回去给我妈。越来越晚了,大家才想起,要不打的过去吧?我拦了一辆的士过来,问了一天,要30,两辆就得60,觉得太贵。回头看到旁边有租自行车店,于是我们做出了整个旅行中可以说是最漂亮的决定:骑自行车去洱海。去洱海的路上很黑,自行车店的老板娘跟我们说,而且以前也没人在这种时候跟她租自行车走过,治安嘛,反正这里的治安也不会太差。我很佩服当时女生们的勇气,居然被我们说动了,一起骑车去洱海。那时候是晚上10点左右,自行车店本来是12点关门,老板娘说反正得等我们回来,每辆10元。我们问了路,六辆自行车一辆紧接在一辆后面走,女生在中间,我开路。一出古城就没有路灯了,路上真的很黑,我倒有点担心遇到抢劫,其它人倒兴致很高,一路上谈笑,唱歌,《白月光》,《听海》,《凤凰花开的路口》。一轮黄月刚刚升起,被路旁的树挡住,若隐若现。骑了大约四五公里的车,终于到了洱海边上的才村码头。月光倒映在洱海上,波光鳞鳞。月亮还不是很高,我们可以把月亮连同倒影一起拍下。都说下关的风,上关的花,苍上的雪,洱海的月,可到大理的游客,有几个能像我们深夜来洱海边上看海上升明月呢?跟我们一起在才村码头的,是一对夫妻,妻子呜咽看怀疑丈夫有外遇,丈夫在一旁不住的解释。另外有一对朋友在劝架。他们用蜡烛把码头围了一周。
回去的路上,月亮已经升得很高,照亮了路面。交还自行车时,刚好12点。回客栈途中,张妍发现她把墨镜忘在自行车上了,我陪她回去取。走在空荡荡的石板路上,听着雨淅淅沥沥的下,泉水在路旁咚咚的响,至今回味无穷。

2007年7月15日星期日

到达昆明

2007年7月1日 晴

经过40个小时的火车,我们终于到达昆明。同火车一起来到昆明的有黄济泳,黄锴,王流斌,高洁,吴翔,张妍,王纯静。我们四个男生都是软件学院的,四个女生都是经济系的。在火车上,吴翔和高洁一眼就认出当时我跟她们一起在英语快班上过课。我对高洁这个名字有点印象,人倒没什么印象,而对于吴翔则一点印象都没有,这两个女生的观察力和记忆力实在令人惊叹。由于不同时间买票,我们跟她们在不同车厢。上车前只有黄锴认识几个女生。

我带了本易中天写的《美国宪法的诞生和我们的反思》,在车上从头到尾看完了。王流斌和高洁都是攀枝花的,他们下车后就转车走了。济泳的舅舅和舅妈到车站接我们,她们女生的同学黄翠翠也到车站接其它女生。

王纯静和吴翔的手机没电,黄锴又没张妍的手机号,我们在招待所安顿下来后与她们女生失去了联系。我从媛君那里得到张妍的手机,后来才联系上她们。下午分开活动,明天去大理。

下午我们三个男生去金殿。我之前以为金殿是当时吴三桂反清时的宫殿。去了才知道,那只是吴三桂捐的一个道观。主殿全部用铜铸成,包括屋顶,墙壁,门窗,神像,都是铜,故称金殿。金殿旁边的一个钟楼还有一口大古钟,钟楼里刻着关于钟的传说。

2007年6月17日星期日

HOWTO Install fonts on Ubuntu

1. Installing fonts for single login use
1a. using kfontview
The easiest way to install fonts is using kfontview. Try running "kfontview" from the command line.
If you do not have kfontview installed, as root run:
# apt-get install kcontrol
This will download a few dependencies, so if you are short on disk space or simply do not want to install KDE, use the instructions in step 1b

Run "kfontview" from the command line
From the kfontview window, open the font you have downloaded.
Click on the "Install" button
NOTICE: You will probably need to resize the window to see the "Install" button which is in the lower right hand corner.
Click on the "Personal" button

1b. by hand
If ~/.fonts does not exist, create it:
$ mkdir ~/.fonts
Copy the font, from the command line, run the following:
$ cp [fontfile] ~/.fonts
From the command line, run the following:
$ fc-cache -f -v ~/.fonts
or alternatively, log out, and log back in.

2. Installing for system wide use
Make the following directory as root:
# mkdir /usr/share/fonts/truetype/myfonts
Copy the font(s) into the newly created directory:
# cp [fonts] /usr/share/fonts/truetype/myfonts
Run the following:
# fc-cache -f -v

3. Installing Windows Fonts (eg. Times New Roman)
Make sure you have the "universe" repository added. If not, as root, modify your /etc/apt/sources.list and uncomment the deb line which will look something like this:
# deb http://us.archive.ubuntu.com/ubuntu dapper universe
Then update apt-get:
# apt-get update
Run the following as root:
# apt-get install msttcorefonts

2007年5月22日星期二

Make Audacious support Chinese

首选项──播放列表──songdisplay──标题格式
选custom
下面填GBK

2007年5月12日星期六

Search files containing a particular string

Examples

For example search for a string called redeem reward in all text files located in /home/tom/*.txt directory, use
$ grep "redeem reward" /home/tom/*.txt

Task: Search all subdirectories recursively

You can search for a text string all files under each directory, recursively with -r option:
$ grep -r "redeem reward" /home/tom

Task: Only print filenames

By default, grep command prints the matching lines You can pass -H option to print the filename for each match.
$ grep -H -r “redeem reward” /home/tom

2007年5月10日星期四

利率的决定

  1. 资金供求关系
    均衡利率是指贷款人愿意贷出的金额恰好与借款人愿意借入的金额相等时的利率。当借款人对贷款的总需求等于贷款人的总供给时,便决定了贷款的利率。如果利率高于均衡水平,贷款人愿意供给的贷款就会超过借款人的需求;如果利率低于均衡利率水平,借款人的需求就会超过贷款人的供给。
  2. 平均利润率
  3. 银行成本
    银行成本=各种费用+风险溢价+预期利润
    顾客需求->成本
  4. 通货膨胀预期
    预期通胀上升,利率水平也上升,反之亦然。
  5. 中央银行政策
    改变货币供应量
    1. 流动性效应
    2. 收入效应
    3. 通货膨胀预期效应
  6. 商业周期
    经济扩张期利率上升,衰退期利率下降
  7. 借款期限和风险
  8. 政府预算赤字
    政府赤字上升,利率上升
  9. 国际利率水平

2007年5月6日星期日

XMMS Chinese support

Configure option->preference->font, set the font of main window and play list to:

-sony-*-*-*-*-*-16-*-*-*-*-*-iso8859-1,-*-*-*-*-*-*-16-*-*-*-*-*-gbk-0

2007年4月30日星期一

Last Day of the Iteation

Yesterday is the last day of an iteration on CIY. Nate was unhappy because we still had 4 stories uncompleted and they were not likely to be completed in a single day, but no one talked to him on this before. So we had a postmortem before the stand up meeting. Here is the result of our discussion:
  1. know when the iteration ends
  2. think about work, talk, set boundaries and enforeces
  3. standup is good time to realize features needed to be adjusted
  4. stand down meeting
  5. have intentional non pair work
  6. internal story controls (posties)

2007年4月27日星期五

SCIM

To get SCIM work correctly, these packages are needed:

$● as scim|grep ^i
i libscim8c2a - library for SCIM platform
i scim - smart common input method platform
i scim-chewing - Chewing IM engine module for SCIM
i scim-chinese - SCIM 的智能拼音输入引擎 (过渡包)
i scim-gtk2-immodule - GTK+2 input method module with SCIM as bac
i scim-modules-socket - socket modules for SCIM platform
i A scim-modules-table - generic tables IM engine module for SCIM p
i scim-pinyin - smart pinyin IM engine for SCIM platform
i scim-qtimm - SCIM context plugin for qt-immodule
i scim-tables-zh - Chinese input method data tables for SCIM

2007年4月25日星期三

failed to initialize HAL

I may have done something, but I couldn't remember. From last night, each time when I logged in, Ubuntu popped up an error dialog saying failed to initialize HAL.
After I searched on the web for sometime, I finally came up with a solution:
  1. cd /etc/init.d
  2. sudo ./dbus stop
  3. sudo ./dbus start
  4. sudo dpkg-reconfigure hal
Now it works.

PS: It doesn't work at all. The final solution is:
ls -l /etc/rc*.d/*dbus*
if there is any "S*dbus -> ../init.d/dbus" other than "S12dbus" under /etc/rc2.d/, delete it and recreate it:
cd /etc/rc2.d
sudo ln -s ../init.d/dbus /etc/rc2.d/S12dbus

2007年4月24日星期二

Benefits of Pair Programming

Without Nate, the number of programmers in the company is odd number, which means that there is always one person having to do solo programming. This misfortune fell on me since last Friday. I programmed alone for the most of the on last Friday and Yesterday, writing Selenium test. With no one to review my code all the times, every typo and misuse can only be found at run time, because there's no compiler to check my source code. Sometime such errors were very hard to find out all by myself and I wasted a lot of time on even very silly mistakes. Once I try to run Selenium tests, it reported errors. Then I tried very hard to understand the error message, until I found it impossible for me to figure it out, and I called Philip for help, only to find that I forgot to start the web server!
With no one on site to discuss, it was not easy to come up with a solution when I experienced some difficulties. Meanwhile, with no one to switch the keyboard back and forth, thinking and typing the code alone for 8 hours a day, I fell very tired. I drank a lot of coffee, and sometimes I had to put some cold water on my face to keep a clear mind.
After spending last 3 hours on Selenium tests, I finally completed that task. With Philip's pairing for about one hour, we eventually found out how to test the element generated by Ajax using XPath, which had been pending through the weekend. Two people working together is so full of ideas!
Then I moved to pair with Paul on the task about velocity tracking. After we implemented the functionality and passed all the tests, we started to refactor. There is a piece of code which can well exhibit the benefit of pair programming.
I am still not quite familiar with Rails, comparing I am with SQL, so I wrote that code like this (Let's called it code portion 1):

task_sessons = TaskSession.find_by_sql("select ts.work_date, ts.user_id from task_sessions ts, tasks t, stories s where ts.work_date between '#{start_date.to_time.to_s :db}' and '#{target_date.to_time.to_s :db}' and ts.task_id = t.id and t.story_id = s.id and s.project_id = #{project_id})

And followed by another piece of code which had been written by Paul (code portion 2):
unique_entry = Hash.new
for x in task_sessions do
unique_entry[[x.work_date, x.user_id]] = 'A'
end
puts "using hash: "+unique_entry.length.to_s
return unique_entry.length

It worked. And I was about to commit it. Because Paul had some errands, Philip came to pair with me instead. He thought that it was not good to put such a long SQL inside Rails. And I was eager to know how to rewrite it in Rails way. Then he showed me:
task_sessions = TaskSession.find(:all,
:select => "task_sessions.work_date, task_sessions.user_id",
:joins => "join tasks t on task_id = t.id join stories s on t.story_id = s.id",
:conditions => "work_date between '#{start_date.to_time.to_s :db}' and '#{target_date.to_time.to_s :db}' and s.project_id = #{project_id}")

And he also think code portion 2 smelled not good enough. So he suggested to use the class Set instead. Then he went away for some errands. I did some investigation on Set API, and rewrite the code portion 2 using Set. But it failed. Then Jordan came. He said that we did not need to use Set; Array had already had a method uniq to delete those duplicated element. Then we tried, it also failed. At this time, if he left, I might have continue to investigate Set and Array API to find out the problem. But then he suddenly came with a great idea. This is the result of code portion 1 & 2:
task_sessions = TaskSession.find(:all,
:select => "distinct task_sessions.work_date, task_sessions.user_id",
:joins => "join tasks t on task_id = t.id join stories s on t.story_id = s.id",
:conditions => "work_date between '#{start_date.to_time.to_s :db}' and '#{target_date.to_time.to_s :db}' and s.project_id = #{project_id}")
return task_sessions.size


It is much shorter then before, and it is more clear now.

2007年4月22日星期日

Install Ubuntu

The iso file should be downloaded first. Then it is important to do a md5 check. In Windows, winMD5Sum is needed to do the check, which can be downloaded from
http://www.nullriver.com/index/products/winmd5sum
I first planned to install from hard disk.
Since I have already had a grub installed. Here is the steps after enter grub command line:
grub> kernel (hd0,4)/vmlinuz root=/dev/ram ramdisk_size=32000 devfs=mount,dall

grub> initrd (hd0,4)/initrd.gz

grub> boot
See also:
http://my.opera.com/bloodmelon/blog/show.dml/284393
For more info about initrd and ramdisk, see
http://firenet.ik8.com/doc/rd.html
Ubuntu is strange; it did not let me to select iso file manually, instead, it scanned to hard disk automatically. However, it was not capable enough to find that image. So it prompted me to insert CD over and over again. I went insane.
So I burnt the CD. Start from the CD, I first chose to manually partition the disk, but later I found that I didn't know how to. So I exit and deleted the partition of Fedora using PQ Magic. Restart the installation again, and this time I found there was an option create partition on the largest continuous free space, so I chose it.

2007年4月21日星期六

grub

After entering
grub>

There are two commands need to install grub onto MBR

grub>root (hdX,Y)
grub>setup (hd0)

X and Y represent the disk and the partition where Linux is located.
setup install grub onto the first disk's MBR

NVIDIA GeForce 4 drive

NVIDIA has stopped supporting GeForce series graphic card in their new driver. We can only use the legacy drivers. There are 2 drivers needed, which are in livna repository: xorg-x11-drv-nvidia-96xx and kmod-nvidia-96xx. The latter depends the former

vi commands


run level

To change run level, edit /etc/inittab, using vi.

2007年4月6日星期五

"concern" about velocity

I made a mistake. The velocity is calculated in terms of stories, not tasks. I was quite concerned with the accuracy of velocity calculation, because there were always someone forgot to estimate tasks before starting them, and there were some tasks being marked as completed, but costing "no" time. I sent email to the administrative group saying that this will affect our velocity calculation. Later, with the reminder of Philip, I realized that they only affected the assessment of our estimation.
Philip told me about a suggestion from Nate. Nate said that we had to go off the computer to plan before we started coding. We had to think what we wanted to do, and then consider how the computer could help us, instead of writing a program first, and thinking how we could use it.

2007年4月4日星期三

Start to pay attention to management

I've got to start to pay attention to management now.
Nate has gone away for two days, so does our stand up meeting every morning.
AgilePlanner has become more mature, I can keep track of the progress from it. But there are still things not so desirable, perhaps I need to write down thing from the white board.
On planning game, we assign stories and tasks to engineers. But what should the engineer responsible for the story or the task do with the story or task? It is still a question worth investigation.

2007年4月2日星期一

Velocity

The velocity of last two weeks was much faster than before. One reason is that we worked on AP these 2 weeks. For most of us, except Nate and me, we worked out AP from scratch: we are more familiar with it. On the other hand, we switched pairs less frequently than before. One pair kept working together until their finished the task on hand. As a result, one spent less time in training his partner before the partner can do creative work.
For better tracing everyone's work, we make it a rule to write the story number, task number of the task and start and stop time every pair work on on white board, because there are always someone forget to enter their time to the google spreadsheet. Writing on the white board make it possible for others to enter to the spreadsheet instead.
A new release of AgilePlanner is deployed. The new release make it easy to keep track of the development velocity. I will pay more attention to it from now on

2007年3月27日星期二

Excerption: Agile Methodologies ask…

If design is good, why not make it everyone's job? (Refactoring)

If simplicity is good, why not use the simplest design that supports the currently desired functionality? (Simple design)

If architecture is good, why not have everyone work at defining and refining the architecture continuously? (Metaphor)

If short iterations are good, why not make iterations really short (hours and days) instead of weeks and months? (Short iterations & planning games)

If requirements, design, and code reviews are good, why not do it all the time? (Pair programming)

If testing is good, why not do it all the time… even customers? (Continuous unit and functional testing)

If integration testing is good, why not do it several times a day? (Continuous integration)

Test Driven 1

Test driven sounds like a good idea, but it is very hard to get used to it. When we get an idea, we could not help to realize it. We often forget to find out a way to prove what we're going to do is right. Even Nate sometimes forgets. So he often asks us don't hesitate to kick him when he forgets to write a test before writing any production code. It's not good to see a test always passes, Nate always says, that means what we do makes no difference. Every time we have to see a test fails before writing any code. So that it is our code that makes that test pass. That is test driven: writing code against a failing test.

Ruby on Rails provides so many facilities and tools to practice test driven development. There're different types of tests: unit test, functional test, acceptance test. There is a strong belief amongst Agile practitioners that every thing could be tested. So they develop lots of tools to do this. From user interface to database, there are tools to test them.

Incompatible Pair 3

In his middle of thinking, one may not like to be disturbed by questions and suggestions, and it does no good to the overall productivity as well. Nate suggested that to be a good partner, one should learn to take notes. It would be better if one writes down what he wants to talk about while the other is in the middle of thinking, as long as what he is going to talk is not so urgent that otherwise may waste a lot of effort. When waiting for checking in and out, waiting for tests to be passed, it's a good time to discuss what their doing

Incompatible Pair 2

It is still a question whether two people working together would be more productive than working separately. Currently in the company, the more sophisticated one in a pair should spend a lot of time to explain to his partner what's going on; otherwise the partner tends to be left behind or even snores away, because when he couldn't catch up, he couldn't find anything to do there. It seems that if these two people work separately, at least they can keep working all the time, which might be more productive by two. However, Agile practitioners like Nate have a strong believe that pairing is more productive than each one doing by their own. Let see how it works.

2007年3月23日星期五

Incompatible Pair 1

Extreme programming uses pair programming. There seems to be incompatible pairs. From this Wednesday, I have been pairing with Jordan. Jordan is a passionate guy, who has been notorious in the company for working so fast, keeping the key board all the time, and seldom explaining to the partner what's going on. Now it is my turn to suffer. Of course, he is much more experienced on Ruby on Rails than me. When I paired with him, I always tried to ask what I didn't know. But he always made me felt that me questions did not deserve answers. Meanwhile, although I was not familiar with Rails, I surely knew something about computer science; so, on high level, I couldn't help expressing my ideas on how to do it or making suggestions when I found it a bad design. But he always insisted that my ideas were ridiculous, and disdained to explain why. Sometime he even made me feel that Agile Planner was THEIR masterpiece, to which I could only show my respect; he was always afraid that my naive ideas would cause THEM to change THEIR system fundamentally. He is such a poor listener that he often interrupted me before I finishing speaking out my ideas.

The problem is what I have to envisage. The problem of incompatible pair also deserve to do so study on it.

2007年3月20日星期二

Overflow

Since we experienced a excessively slow progress last iteration, a lot of tasks are delayed. Nate called them overflows. This iteration we don't even have a planning meeting. We pick a few tasks from overflows, and add to it over time. After a depressing yesterday, Rock and I made a series of progresses today; we completed the whole story of sending emails to students when creating a composition assignment. The only thing that we had left out is a weird result from the postgres database. When we fetched email addresses from the database, for the sack of test, we sorted in query using "order by email_address". There were two email addresses in the result set: testor@163.com and testor2@163.com. In ascending order, we expected it to by in this order:

testor2@163.com, testor@163.com

And it came out as we expected in our Windows machine, so that all test passed. However, on Nate's Windows machine, it was in reverse order, which caused three tests failed. The encoding in the databases of both machines was the same: SQL_ASCII. And the two OS were both English version. We are still not able to figure it out. Anyway, Rock and I seemed more lucky than Nate today:-)

Since the timing in Agile Planner didn't work at all, from this week, we started to use Google Spreadsheets to keep track of every employee's work

2007年3月19日星期一

We spent 10 times as we might have estimated!

Today Rock and I continued the work that should have been done on last Friday. There is a task on CIY requiring that when a teacher creates an assignment, the system should send email to every student of that course. Nate had created a skeleton of sending email for us. We were expected to spend no more 2 pairing hours on this. However, it did not seem so easy when we got down to work.


On last Friday afternoon we spent two hours on researching this part of the system, and how to send a email using Ruby on Rails, only to find that there exited some problem with database fields. What we could get is an assignment_id, with which we had to look into the database and find the email address of the students who chose that course. Unfortunately, the database was not set up as was design on ERD. The assignments table stored a field teacher_id which should have been course_id, while the students table stored a field class_id which should be course_id. Then we realized that we should use migration to modify the database before we can start to work on the mailing job.


So we started today by creating the migration to modify the database. However, when we update the local project from SVN, there were failed tests. We tried very hard to fix that failure until we found it out of our capabilities and responsibilities half an hour later. Then we turned Nate, finally finding that it was a test that had been committed before passed. After Nate fixed that failure, we came back to our machine and update again, ran all tests, it had been 9:30! We thus wasted more than an hour today just because a failed test not caused by us.


Modifying the schema of a database is a radical change; it may shake the foundation of the system. Rock and I had experienced such a nightmare on last Thursday evening when we were asked to change a field ideal_hour to ideal_day and divide the original data by 8. In that evening, we started to work in 7:30. It seemed simple initially. After spent some time checking out and passing all test, we start to change the database. Of course a lot of tests could not pass. Then we began to spend frustrating hours in fixing codes in order to pass those tests, until it was nearly 12 that night when we realized it impossible to fix those failure in a couple of hours. So we decided to roll back what we had done that evening. When we continued to work for more than half an hour, we thought that we had rolled back. Since run all the tests again may take a long time, Rock said I could leave for bed first, he could handle the rest. Not do I know the next morning that he worked until 2:30 a.m. just to make all test pass again!


So this time we were both taught that it would never be too cautious in making change to database schema, and the estimation time of that work would never too long. Before we did the migration, we decided to make a new branch in the SVN, because we did not think that we could fix in a single day all the failures of tests that were caused by changing the schema. Before we made a new branch, we had to pass all the tests and commit what we had done to the trunk. Then we could made a branch from the trunk. Then we could work on that branch.


We proceeded so smoothly this time. Rock even doubted whether there were still incorrect logics that could not figure out by passing all the tests. It is possible, but it is a test coverage issue, we were not able to do anything to it then. So we could not but trust the tests. Then it came to merge the branch to the trunk. To did this, first we had to commit what we had done to the branch, then we checked out from the trunk to another project, say admin_trunk. And then we merged the branch to admin_trunk, after resolving all the conflicts and fixing all failures of tests, we finally committed it to the trunk. It had been 3:30 then. If we started from over eight this morning, apart from an hour of meeting this morning, we had spent nearly 5 hours on it. Imaging we just modify two database fields, if we had been asked to estimate how long it would take, we might say at most 30 minutes pairing. It turned out to be 10 times we might estimate. In retrospect of how we spent such a long time, writing that two migration files only took us less than 30 minutes; we spent the rest of the time fixing the unpassed tests that were not written by us, waiting for SVN check and out, waiting when the tests were running. How to reduce such overhead time, or how to estimate such time during planning meeting, it is a question.

2007年3月16日星期五

The second postmortem

We have encountered so many problems both technical and managerial this two-week iteration. Nate said that our velocity is 0.05 based on the figures in the Agile Planner, which means that our development speed is only 1/20 of what is expected. Though the timing of Agile Planner is untrustworthy, Nate said. It is so often that we forget to start and stop the session. Nate felt not quite good this morning when he saw that AP showed Li Pu had been continuously working on a task for more 16 hours!

We have paid so much time on configuring, nearly half of the work time. Configuring Linux, configuring Windows, configuring the company's machines, configuring our own machines. Nearly every time when we check out to start working, there are tests which should have passed in others' machine but fail in our machine. Finding what the problem is, trying to fix that problem by configuring the environment, often takes the whole four hours of work time, even the whole day.

If we can reduce the configuring time and put that time on productive work, we can significantly speed up, I proposed in the postmortem of the iteration today. As normal, we proposed so many problems that frustrated us so badly in the postmortem, and voted for the importance of each item. Because we have so many problems these few days, in the two-hour postmortem we did not have time to come up with solutions to these problems. Li Pu suggested to do it on the stand up meeting or the planning meeting next Monday. This reflected a common practice in the company, we call it time-boxing. When we try doing something, we set a time limit, called time-boxed. If we can not make any progress within the time limit, we stop it and find some way to get around it. If we fail in circumventing it, or if we find it very important to do it after reflection, then we rearrange a time to do it, and again, often time-boxed.

Subversion

In the company we are using a source control server called Subversion or SVN for short. Every time we want to start to work, we have to update the local project from the SVN server. And every time when we have made some progress and passed all tests, we update again to ensure there's no conflict by running all tests again, then we commit it to the SVN server. All tests must be passed, all conflicts must be resolved before we could commit what we have done to the server.

There's a distinction between trunk and branch on the server. As has just said, all tests must be passed before committing, or the server will reject it, which referred to committing to the trunk. But when we want to make a radical change, like change the directory structures of the project, as what Philip has been doing these days, we can't pass all the tests in a single day even a couple of days, and we want to commit what we have done to the server so that our work may not be lost, we create a branch, and commit it to the branch. When we have done the change and pass all the tests, we can merge it to the trunk, of course, all conflicts should be resolved.