香港游小记一

8月25日5点出发,8点上火车,26日晚10点左右到达香港明白英奇酒店,再到现在,其实在香港才逛了一天,不过还是有些东西想要写下来,或者是一些感受,或者就是一些流水帐似的记录。

火车上

在火车上,其实是大家认识的一个过程。总共30人,在之前,大家都是谁都不认识谁。而在火车上的24个小时,就是提供了一个让大家相互了解的机会。这么多人主要分成了两个大拨,一拨是杀人游戏,一拨是三国杀,24小时里,基本上有16个小时,我一直在杀,两个杀都玩了。这样,24个小时的火车也就不会那么无聊了。。下火车的时候,已经可以把大部分人的名字和模样对上号了。。

逛旺角

旺角是香港的繁华地带,但是呢,我们起得太早了。因为在香港,一般的铺面是在早10点才开始营业的。而我们在8点半就集合带出酒店了。原因么,可能是,我们原来定的是上午去香港中文大学,但是因为一些时间上的问题,改到了下午,然后我们还是按照原定的8点半集合了。。然后我们就真正的逛了一个上午的“街”。

港中大和香港理工

下午我们去了港中大和香港理工两所大学。这是我们此行参观访问的唯“二”的大学。

港中大

香港中文大学建校于1963年,到现在也才50年不到。不过,港中大的学术地位,已经不容质疑。同时,港中大还是香港惟一的一所书院制大学。港中大提倡“全人教育”,理智学院负责学生的“形式教育”,也就是专业课等课程,而书院则负责学生的“非形式教育”,包括通识教育、非专业课以及各种活动等,同时负责学生的生活、住宿等。

相比于大陆的大学,重视学生的专业刻教育,却对德育等其他方面有所欠缺,港中大所提成的“全人教育”显然更加注重学生的“全面发展”,而非只是一种大陆常提的“口号”。

这一点在三个港中大的学生的一些对于港中大学习生活的分享中也可以看到。我清晰的记得其中一个林姓的同学说,他们书院的义工活动不仅仅关注香港的老人儿童,他们去了乌干达、柬埔寨等等落后的地区,提供义务服务。我不知到大陆的大学是怎样的,但是我知道我的学校肯定是没有这样的活动的。 PS,即使2013年,也就是明年就是港中大的50年校庆,港中大内(至少我们乘坐大巴的这一大段路上)并没有为了校庆而大兴土木以至于无法通车、干扰正常生活等等现象。

香港理工

在香港理工我们听了一些关于香港理工的介绍,也参观了它的工程中心和图书馆。给我感触最深的还是图书馆。

香港理工的图书馆,称作包玉刚图书馆,共有六层,其中一、三、四层藏书,五层是期刊阅览室。和大陆不同,香港采用的并非国图分类法,而是美国国会图书馆分类法。同时,除了书和期刊,包玉刚图书馆还提供有音像制品的外借服务,比如一些音乐CD,电影碟片等等。在图书馆的每一层都设有若干的电脑,供学生查阅电子资料。而最让我喜欢的是,图书馆提供了85个Research Carrel,供研究生和任课老师使用。所谓的Research Carrel,就是一个小的单间,配有电脑和一张相当不小的桌子,以便可以不受影响的做些研究。除了这些,包玉刚图书馆的环境很好,虽然是1972年建馆,但是新近没有装修的几个楼层,完全看不出有什么老旧之处。

相对于包玉刚图书馆,我不免对于本校的图书馆有些失望。先说硬件,我不清楚本校的图书馆是何时成立的,但是显然,并没有包玉刚图书馆看起来新。然后说软件,藏书量上,我不清楚,但是本校的图书馆并不提供阅览用的电脑(或者是有,但是我不知道,而且即使有应该也是收费的),至于音像制品当然更是没有(对于音像制品,并不是一个图书馆必备的条件,也不是一个图书馆是否足够好的一个判断标准,这里只是陈述一个事实)。其他的一些我也说不清楚,但是,如果让我选哪个图书馆更好的话,显然是包玉刚图书馆。而且,显然一个好的图书馆会对学生的查阅资料、进行研究有一些正的加成。

从以上港中大和香港理工的一些小方面来看,大陆高等教育的不发达可见一斑。

平顶山

杜莎夫人蜡像馆

杜莎夫人蜡像馆享誉全球,我们一行人也在晚上来到了这里。不过,可能对于杜莎夫人蜡像馆的期望值过高,馆中的真人蜡像并不能完全的打动我。里面当然有些栩栩如生的蜡像,比如美国总统奥巴马,真的是相当的逼真。不过,其他的一些蜡像并不是那么的惟妙惟肖,特别是眼睛,可能也是由于眼睛是心灵的窗户,而蜡像是没有心灵的,所以也就没有传神的眼睛。不过,虽然如此,我们也是玩得相当的痛快,毕竟拍在照片里,还是足以以假乱真的。在杜莎夫人蜡像馆里,除了蜡像,还有一个鬼屋。不过,在我之前那一队人进入之后,工作人员说需要等一个小时才能轮到我们(可能是出现了什么问题,没有说),但是我们还有一个小时不到就要集合了,无奈只能放弃。更可气的是,在我走后大约10分钟,就可以近人了。。Oh,shit!

幻彩咏香江

如果说杜莎夫人蜡像馆只是一点点的不那么的逼真,那么,我看到的幻彩咏香江就是完全的名不副实。8点钟,我们集中到平顶山的一个观景台。预想中的灯光璀璨、绚丽场景并没有出现,有的只是几道白光偶尔的直射灰暗的天空。不清读是我们的观景为止不好,还是幻彩咏香江本来就如此,抑或是之前导游的描述让我对幻彩咏香江有了太高的期待。不过,在平顶山观看夜景,可以看到相当美丽的一幅画面。不过,所有的人关注的几乎都是那个知名度极高的幻彩咏香江,又有几人会欣赏这美景呢?或许只有幻彩咏香江结束之后,才会有人注意到吧。

浮躁的暑假浮躁的我

没有几天,暑假就结束了。从6月26日正式放假以来,感觉自己在放假之前画的大饼完全没有实现,可以说,整个暑假是一事无成。个人感觉都是浮躁惹的祸。

总结一下自己在暑假之前画的大饼

  1. 预习数据库
  2. 看算法导论,学习算法,POJ
  3. 好好学习C++
  4. 用博客记录自己的进步历程
  5. 学习Android开发,参加Google的Android开发大赛
  6. 学习一些Linux内核方面的东西,做实验项目
  7. 学习游泳
  8. 充实英语,看英文小说The Twilight Saga(因为我有这个系列的纸质书)

感觉好多啊。然后这个暑假自己做的和这些相关的事情

  1. 数据库在暑假前几天看了一些,《数据库系统概念》,很经典的书,呵呵。第四章没看到,就再没看过
  2. 算法导论看到了栈和队列,还有好多部分是在暑假之前看的。之后也撂下了
  3. C++的书,看了些《泛型编程与STL》,不过这不是我之前要干的事情。我想的是强化基础,看这个完全是临时起意
  4. 博客,除了一篇关于Linux内核编译的,再没写过一篇,而且那篇由于那是实验室给了个编译内核的任务。这个博客是在这里
  5. Android开发,只会一些最基本的东西。完全没有能力做出一个App来。管我们这组的师兄估计要哭了
  6. Linux内核方面,《Linxu内核设计与实现》看到了中断的下半部(bottom half),之后就没看了,现在也忘的差不多了
  7. 游泳还算做的不错,现在可以游几十米了,虽然换气换不好,动作不标准。
  8. 这个小说只在暑假前几天看了些,查了词典。之后就看得很少,到现在为止只看完了一章。

然后是自己做的另外一些事情

  • 看Haskell,完全是一时兴起,在网上看的Real World Haskell,只看了两三章
  • 看Ruby,这个其实只看了一下,几个小时。然后是一点都不会写
  • 搭建Jekyll的博客,就是你先在看到的这个。这个花费了大量的时间和精力
  • 然后也想着看看C#的,结果宿舍同学的书写实在是太烂了,没法用,就没看、
  • 用Python跟着教程写了一个Todo应用。又写了一个博客系统selog,当然博客系统没完成,效率也有待提高,现在还是一个渣

最后列出的那几个,其实都是自己在执行预定目标时,不想继续进行了,才临时想到去做的。可以算是一种逃避,也可以说是浮躁,急于求成,急于看到成果。这个结果就是自己每样都了解浅浅的一层,一到动真格的,就废了。其实发现自己这个问题很长时间了,但是一直就改不掉(貌似知道毛病在哪,但就是改不掉也是我的一个毛病,囧。就比如晚睡晚起,每天晚上睡不着,有时候是困死了就是不睡,每天都都睡到中午。但就是明知道症结就是在晚睡上面,还是会晚睡)。现在,就期望自己能够渐渐的学会控制自己,压抑住浮躁,否则我还真是无计可施。

最后说一下对于下个学期的打算,这次希望不会再和这个暑假一样了

  • 数据库、编译、软件工程三个有大作业的课大作业按时完成,不能像这个学期一样都压倒期末
  • 在保证课上成绩的同时,研究操作系统,主要是Linux内核,不能说去实验室就是去玩的
  • 英语还要继续努力,大学毕业六级成绩600分是我的梦想
  • 体育锻炼,下个学期的体育报的是长跑体能,这个估计够我练的了。时不时再去锻炼一下游泳技巧。好滋润

在最后,浮躁横行的社会,必须能够沉下心来,才能做出成绩!

编译Linux内核

这几天实验室交给任务,编译linux内核。然后就开始做了。

师兄给了两篇参考文章,这篇这篇。第一篇比较简略,说了总体的过程,而第二篇比较而言就比较详细了。

好了,现在说说自己的编译的过程吧。

下载源码并解压

源码从这里下载,我下载的是最新的3.5-rc6。具体那个版本都是差不多的。然后需要把源码解压到/usr/src这个目录下,我是ubuntu用户,其他发行版相似

sudo cp /path/to/file/linux-3.5-rc6.tar.bz2 /usr/src
sudo tar jxvf linux-3.5-rc6
cd linux-3.5-rc6/  # 进入源码的目录,以后所有操作均在该目录下完成

删除之前编译的残留文件

sudo make mrproper

如果是第一次编译的话,可以不用执行这一步。而如果之前曾经编译过,务必执行这一步,清除残留文件,否则可能会导致编译失败。

配置编译选项

sudo make config
sudo make menuconfig
sudo make xconfig

这三个命令任选一个执行就好了。区别是

  • make config
    问答式的配置,选错之后无法更改,所以一般人都不会用这个。

  • make menuconfig
    这个命令需要ncurses库的支持,ncurses是字符界面下的图形界面库。可以通过apt-get install libncurses5-dev来安装。ncurses是字符界面下的图形界面库,所以如果使用的字符控制台,就可以用选用menuconfig了

  • make xconfig
    这个命令需要Qt,这是个跨平台的图形界面库。可以通过sudo apt-get install libqt...来安装,具体是那个包忘记了。xconfig就是图形界面下的配置环境了。

xconfig用着最舒服,menugconfig也可以,不过界面难看了些。config自己没用过,也不推荐用。

这一步其实应该是很重要的一步,不过由于选项众多,且众多选项和硬件相关,需要有足够的硬件知识,并且对自己电脑的硬件配置有足够的了解才可能完全配置的好。网上有许多专门讲这一步的文章,比如金步国的这篇经典文章,不过由于版本还是2.6,所以有许多选项文章里面没有讲到。

由于本人是个菜鸟,对于硬件以及其他的知识都不是很清楚,再加上这么多的选项,所以大部分都是默认的选项。当然,这样就使得modules过多,使得之后的make modules的时候花费了大量的时间。所以应该尽量的减少不需要的模块,特便是其中的许多针对不同的硬件的驱动。

编译内核

sudo make bzImage

在我参考的第二篇文章中说,他编译出来的内核大约在800k-900k左右,可是实际上我编译出来的内核一般在4500k左右。可能是由于版本的差异吧,不用纠结在这个上面。

在编译结束后,会告诉你bzImage的位置,然后执行

sudo cp /path/to/bzImage /boot/vmlinuz-3.5-rc6

把其放到/boot目录下。这里我把它重命名为vmlinuz-3.5-rc6?为什么是这个名字?自己看看/boot,更深层原因我也不知道了。

编译模块

sudo make modules

上边也说了,这个阶段的时间是和配置选项那一步中选择的模块的多少直接相关的。有时可能会遇到rts5139.ko undefined的错误,可以在配置选项时去掉rts5139这个模块。

安装模块

sudo make modules_install

这一步没什么说的。有时可能会出错,并让你make CONFIG_MISMATCH=y(这个选项记不清了,不过差不多了),可以不用理。

安装内核

sudo make install

这一步比较快。在这一步,系统会自动更新grub。

如果以上完全弄好了,那么就可以重启进入新的内核体验了。不过有的同学在重启后可能会遇到这样一个问题,就是无法进入图形界面了。 提示类似如”ubuntu run in a low-graphic mode”,“Your screen, graphic card, input devices cannot detected correctly. You need configure it yourself.“等等。 这时可以Ctrl-Alt-F1或者Alt-F1进入控制台,sudo apt-get install gdm之后选择gdm即可。如果还不能解决问题,对于ATI显卡,可以安装fglrx。由于我不是ATI的显卡,所以是否可行我就不是很清楚了。更具体的可以google之。

Python的逻辑运算

Python的逻辑运算(and,or,not)与C/C++、Java等语言不太一样。这些语言的逻辑运算返回的值都是bool值,而Python返回的则不同。

先说非运算,Python的非运算与这些语言相比,并没有特别的地方。not只有两个返回值,True和False。在Python中,真值为假的对象,包括False,None,数字0,空字符串以及空的容器类型。除此以外的任何对象均为真。

接下来是与运算,Python的与运算的规则是

  • 若左边的表达式为真,则返回右边表达式的值
  • 否则,返回左边表达式的值

初看起来比较奇怪,一个逻辑运算搞得这么复杂干嘛?这么做当然是有目的的。当我们需要的不是一个表达式的bool值而事实其表达式的值,但是只是需要根据这个表达式的bool值确定下一步的动作,就会发现这种规定的好处了。

比如需要统计一下重量在500克以上的桃子的重量,用C写,可能会写成这样

for (i = 0; i < n; ++i) {
    if (weights[i] > 500)
        sumofweight += weights[i];
}

用Python,就可以这样写

for x in weights:
    sumofweights += x > 500 and x

显然是简单了许多。

最后再来说或运算,Python的或运算的规则是

  • 若左边的表达式为真,则返回左边的表达式的值
  • 否则,返回右边的表达式的值

这个规定和或运算的目同出一辙,都是为了简化代码,增加效率。

可能有些同学觉得and和or的规则比较复杂,不容易记忆。其实,这是不需要记忆的,因为,无论是and还是or,其结果的值就是最终决定整个表达式真值的表达式的值

对于与运算

a and b
  • 如果a为真,继续计算b,b将决定最终整个表达式的真值,所以,结果为b的值
  • 如果a为假,无需计算b,就可以得知整个表达式的真值为假,所以,结果为a的值

对于或运算

a or b
  • 如果a为真,无需计算b,就可得知整个表达式的真值为真,所以结果为a的值
  • 如果a为假,继续计算b,b将决定整个表达式最终的值,所以结果为b的值

最后再说一下and or表达式,通常所说的and or表达式是指如下的表达式

condition and a or b

这个表达式和C中的唯一一个三目运算符

condition ? a : b

比较相似,但稍有不同。C中三目表达式的语义如下

if condition:
    a
else:
    b

但是Python的and or则不同,由于Python的逻辑表达式的运算规则,必须保证a的真值为真,才和C的三目运算符相同,而若a为假,不论condition的真值为何,总会选择b而非a。

可以说,Python的逻辑运算给程序员带来了极大的编程快捷,但是若不能理解其如此设计的原因,就不能自如的运用其便捷性,甚至造成错误而不知。