2007年7月18日星期三

解决 Ubuntu 中的循环依赖 (Cycle Dependency)

最近在VMware中安装了一个Ubuntu系统。由于创建系统时没有要求安装虚拟网卡,因此需要安装Ubuntu的软件包时,需要自己下载deb文件,拖进系统,然后双击调用gdebi进行安装。可是,当我尝试安装G++时却出现了问题:g++-4.1这个包依赖libstdc++6-4.1-dev这个包(也就是C++库),而libstdc++6-4.1-dev又依赖g++-4.1。结果两个包都装不上。





上网搜索,在Ubuntu官方论坛找到了解决方法:

在命令行下执行以下语句
sudo dpkg -i --ignore-depends=libstdc++6-4.1-dev g++-4.1_4.1.2-0ubuntu4_i386.deb
sudo dpkg -i --ignore-depends=g++-4.1 libstdc++6-4.1-dev_4.1.2-0ubuntu4_i386.deb
即可。
(g++-4.1默认安装包名为g++-4.1_4.1.2-0ubuntu4_i386.deb;libstdc++6-4.1-dev默认安装包名为libstdc++6-4.1-dev_4.1.2-0ubuntu4_i386.deb)

也就是说,强行让两个安装包忽略依赖项。

使用apt-get自动安装应该没有这种问题。

2007年5月22日星期二

一点关于宗教和信仰的讨论

昨天朋友过来,就和他讨论了一下最近在重新看的《卡拉马佐夫兄弟》。仍然还是从宗教大法官开始。为什么阿廖沙要叫道“你的长诗是对耶稣的赞颂,而不是诋毁……”呢?大法官难道不是在告诉耶稣,也告诉所有的读者,耶稣所做的其实并没有起到他希望的效果,他是高估了普通人类吗?难道他没有指出,与其跟随耶稣,整日在旷野里嚼草根、禁欲,魔鬼的食物、奇迹更能吸引他们吗?而宗教大法官剥夺了人民的自由,却给了他们食物,他充当的是魔鬼的,而非基督的代言人,虽然他告诉人民他是暂时代替基督来统治他们的。问题就在这儿:基督教之所以可以成为最大的宗教教派之一,离不开它对政治统治提供的无可取代的帮助。不可否认,如果基督教仅仅是一门宗教,它不可能得到如此庞大,如此久远的发展的。统治者们利用基督教实施他们的统治,即使他们自己本来毫无宗教信仰,他们而得在民众面前装得很虔诚。相反,基督教在民众心中是很纯洁的。从它被创造之初到现在,宗教本身没有,也不可能有很大的改变。在基督教传播的过程中,变化的只是谁利用它,怎样利用它,它的本质则始终如一。

当然,时代变化了,民众也会变化。从中世纪的神权统治,到重视精神思想的文艺复兴,再到现在的重视物质的社会,民众对宗教的态度也会有很大的变化。基督教在现在之所以还会有这么大范围的影响,应该要归功于它在这么多世纪以来的积累。设想一下现在有一门全新的宗教被创造出来(注意,是宗教,而不是法轮功那种迷信),有可能产生像基督教那样的影响吗?基督教强调灵魂不死,强调忏悔和救赎,这在一千年前完全可以成为人们寄托希望的容器,但在现在,金钱往往是人们最首要考虑的因素。

期待下一个精神时代的到来。

毕业设计——BitTorrent客户端(二)

最近把程序的极原始的雏形写出来了。现在的进度是:
1) 连接Tracker。获得正确回应后记录返回的IP列表,等待回应中指定的时长后重新连接。返回错误回应则记录错误信息。连接错误和回应错误则等待预先设置的时长再重新连接。使用一个线程作为定时器,检查每个Socket是否到了应该重连的时间。

2) 连接Peer。主动连接或者被动接受连接。Tracker获得IP列表后,会把列表存放到一个IP池里。由另一线程去定时尝试连接那些IP。任务一开始会开一个Socket来监听某个指定端口,当有人尝试连接本客户端,则接受连接。

3) 消息流程还是按照BT规范里约定的。主动发起者先发送握手消息,被动接受者收到握手消息后,检查无误,发送回应握手消息,连接建立。然后双方发送Bitfield消息,然后Unchoke消息等等。不同客户端对Bitfield消息的产生方式不一样。像BitComet就是严格按照规范里描述的,把所有Piece的消息写到一个Bitfield里去,而uTorrent对大任务是把Bitfield消息置空,而用Have消息通知Peer它有哪些Piece。

我在自己计算机上测试的,下载可以达到2MB/s的速度。瓶颈是在消息处理流程过长,以及主动请求频率的问题。

4) 保存和恢复任务进度。我是参考uTorrent的方法,将任务信息用bencodin写到文件里去。

5) 文件读写缓冲。所有写文件的操作先是写到内存里去。当缓冲区达到指定大小时,将缓冲区数据写入文件。读操作时,先到缓冲区里去找,若没有则读实际文件。当然要解决的问题是,如果程序意外终止,缓冲区里的数据来不及写到文件里去,那下载的数据就白费了。还是要研究一下Windows关于文件缓冲的技术。

6) 为了简化代码,目前暂时是把支持多任务给去掉了的,不过以后是肯定要加入的。因为每个回收站文件也是一个另一种类型的任务,纯上传任务。

以前使用的是同步Socket,但是问题很多:每个Peer连接都要开启一个线程,要有地方来管理这些线程。另外要控制某个Peer连接去主动请求Piece也很难,因为是要由一个线程去控制另一个线程。线程与线程的同步也是要解决的问题。总之,同步Socket是不能采用的方案。

现在所有连接使用CAsyncSocket,MFC框架。异步Socket + 消息驱动可以保证很少的线程,很低的CPU占用,很高的速度。当然,异步Socket也要解决一些“异步”相关的问题,比如消息发送的先后问题。

关于回收站模式,我会在下一篇文章中介绍。

2007年5月15日星期二

找到 Skype 的官方代理

前段时间用 Skype 3.1 版的时候发现在 Connection 选项卡里面多出来一个“CERNET Beta”,应该是TOM通过某种技术或者手段让教育网用户也能连上美国的服务器。这两天换了3.2版,发现CERNET Beta没有了,但代理设置里面是有值的,用密码显示器得到用户名和密码后一试,竟然可以直接在浏览器里面使用,看来是得到了一个极品的适合教育网使用的代理了。当然也不知道能坚持多久。需要的朋友可以试试:

IP:59.64.114.29
端口:2000
用户名:skype
密码:tomskype

2007年5月5日星期六

大学生在小学

一天做梦,梦见我和中学的几位同学不知道什么原因被要求去小学重读一年的书。可以选择任何一所小学,任何一个年级,任何一个班。当然,在现实中这样的事就太匪夷所思了,要求一个拥有大学生知识和经历的人像一个小学生那样生活一年。不过假如用小说来写出一部这个题材的作品,估计会是挺有趣的吧:

想想,首先,选哪一个年级?六年级会比较接近一点,不会像一年级那样无聊吧。平时上课干什么呢?总不能老打瞌睡吧,那不就白白浪费了一年的时间了。做自己的事,看自己的书?那要假设老师和学校强制要求认真听课。怎么和那些小学生交流呢?总不能一年时间都一个人太孤僻吧。既然那些老师都能和这些小孩打成一片,那我们也能做得到的。作业和考试?当然是轻松完成了。作息安排上,当然是不能迟到、早退的。星期一升国旗的时候肯定会比较醒目吧,这么一个个儿……

当然还有很多情况了,不过小说的结尾是什么呢?一句疑问:“不过,我干嘛要到这儿来上一年小学?”可能最大的好处就是能够有一年时间拥有良好的作息规律,对身体好吧:)

重读《穷人》

五一这几天又在重读陀氏的《穷人》,虽然是他的第一部小说,当也写得确实很真切。除了好奇为什么那个时代的俄罗斯,富人和穷人的差异有如此之大外,我想起了我妈妈。

和马卡尔·杰武什金一样,我妈妈也是一个在岗位上辛辛苦苦、勤勤恳恳了一辈子的人,虽然在机关里是出了名的好人,好心肠,品德高尚,但也从来没有过工作上的升迁。同马卡尔一样,每个月都还是按时拿到虽然不算微薄,但还能过得去的薪水。虽然不多,但她也从来不抱怨什么,总还是认为单位对她已经很不错了。当然,她的这种满足对她来说是好事,事实上,在这个竞争激烈的时代,她在工作方面拥有的能力也确实只配拿到那么多薪水。从我的角度来说,我一直纳闷,干嘛就不发发奋,好好学点技术含量高的知识,争取到金字塔的更高层去呢?依她的人缘,这并不是很难办得到的啊?

现在我逐渐想到,当一个人还年轻的时候,他总是可以对未来充满希望,认为即使现在的状况再差,他也有时间、有力量去改变。而当一个人在一个环境里面呆上了10年、20年以后,他就很难再有改变现状的希望和勇气了。应该改变的东西早就应该已经改变了,没有变化过的东西也基本上不可能在现在再来改变了。即使现状再怎么差,看来都是命运决定了的,自己的力量已不足以撼动它了。不管这种思想如何如何,在那种境况下的人应该是很容易产生这种想法的。君不见这位马卡尔·杰武什金,在他“年纪轻轻”的时候也是那么富有热情,发疯似的去追求女演员,现在老了,每天都用同样的衣装,走同样的路线,到同样的地方,做同样的工作,和同样的人打交道,得到同样的回应。我不清楚我妈妈年轻时具体是怎么想的,不过现在,她是肯定不会再去想怎么让自己升迁,获得更多的报酬。

当然,支撑杰武什金活下去的,是瓦尔瓦拉,支撑我妈妈活下去的,是我。正如瓦尔瓦拉写到的,“您倒想想看,您吃尽了苦头,直到现在,您还只是为我而活着,为我的欢乐而欢乐,悲伤而悲伤,为我的情意而活着。”因为瓦尔瓦拉还年轻,还有希望,所以瓦尔瓦拉很有可能改变她的现状,变得好起来,比他能够设想到的更好。既然他以她的欢乐而欢乐,那么瓦尔瓦拉的改变也就意味着他自己的改变,这是他活下去、极端无私地帮助瓦尔瓦拉的根本原因。同样,我妈妈也只能把希望寄托在我身上(这是她的一句口头禅),希望我的未来会比他的好,这样她也就能心满意足了。

当然,我们的处境比杰武什金他们好,我也比瓦尔瓦拉更有力量去改变自己的命运。

2007年4月24日星期二

毕业设计——BitTorrent客户端(一)

从苏州回来以后还是一直在写自己的毕业设计。题目是我自己选的,做一个BitTorrent客户端,并且在这个基本的客户端上加入我自己设想的独特功能,使这个客户端更加强大。从研究的角度讲,我认为这个题目还是比较合适的,对我个人来说,实现BitTorrent客户端绝对是一个合适的挑战;对计算机领域来说,如果我设想的独特功能被证明是有意义的,那也是有价值的。

当然,要实现“独特功能”,首先得把那个基本的、能够和现有别的客户端通讯的底层做出来,而这个才是难点所在。想一想,虽然一篇BitTorrent协议不算长(和IA-32、FAT这些比的话),但需要实现的东西还是挺多的:

按照协议的顺序,首先要实现bendcoding的解析器,这个在解析torrent文件和解析tracker服务器响应时都会用到。除了解析,还要提供接口,让外部访问者能获得结构化了的数据。

其次,要能和tracker服务器通讯。要充分考虑到tracker可能发生的各种情况,如连接失败,需要重定向,返回无效数据,返回错误,以及返回理想信息等。做到后面还要考虑多线程向多个tracker服务器发送请求,维持请求间隔时间,使用代理服务器访问等等。

再次,要能和各个peer通讯,传输数据。这部分其实就是在博弈,在你我都不知道对方规则的情况下各自制定一套规则,规则本身是由协议里面定义的消息元素来构造的,但是具体细节完全是由你我自己控制的。然后大家在一个对等的平台上,通过规则进行通讯,双方的目的都是在不违反对方规则的同时使自己获得最大的收益。比如,我可以一次向某个peer发送很多请求,但如果这个peer很忙,他就有可能choke我,一个可能更好的策略是,分散请求面,首先请求最稀少的数据块。自己获得最大利益并不意味着要损害对方,最好的结局是双赢,所有人都最终得到完整的数据。当然除了博弈这个算法的问题外,还有很多基础的网络问题要解决。

最后,还要把各个模块整合起来。比如在向tracker服务器发送请求时就要提供当前任务已经下载和上传了多少数据量。而这个数据量显然是要在和peer通讯时统计得到的。类与类之间肯定需要一个中间层来联系。像这种耦合在程序里实在不少,因此架构设计也是需要非常谨慎的。

原本打算还要把图形界面加上,做成一个完整的可发布软件,现在看起来一是时间不够,我实在是找不到能在短时间内实现像uTorrent那样界面的GUI解决方案,二是觉得作为毕业设计,界面确实不是最重要的,不能喧宾夺主嘛。所以界面的事可能得先缓一缓了。

下一篇里我会介绍一些我客户端的框架和一些实现细节,也算是为论文先打个草稿啦。

2007年4月15日星期日

Dvorak 键盘布局

突然对Dvorak键盘布局感兴趣了,想尝试一下这种比我们传统QWERTY布局更高效得多的打字方式。不管Dvorak是否对中文拼音输入有没有帮助,至少它应该可以提高我写代码、写注释的速度吧。



加上了这种布局后,刚开始确实很别扭,马上发现了两点问题:第一个,切换到搜狗拼音后,键位仍然是QWERTY的,这个应该是搜狗内置了键位的。不知道那种拼音输入法支持Dvorak。第二个,原来Ctrl+C, Ctrl+V的复制粘贴,现在变成了原来的Ctrl+I, Ctrl+.,这就不是习不习惯的问题了,因为一般都是右手握鼠标,左手进行这些键盘的快捷操作。用左手输Ctrl+I和Ctrl+.很痛苦啊。不知道Windows有没有机制可以保持这些快捷操作的键位不变。

下载了一个免费的打字练习软件KP Typing Tutor,开始慢慢练习。听说,原来的QWERTY打字者转到Dvorak键位后,一般能在一个月之内恢复原有打字速度,所有还是挺有信心学好Dvorak的 :)

另有一篇介绍Dvorak键位的文章,有兴趣的可以看看。

2007年4月1日星期日

我的留学美国申请经验(二)——Resume

准备材料。对于CS来说,申请材料一般就是个人陈述(Personal Statement,简称PS)和简历(Resume 或 CV)。这两个材料都非常重要,不是可以一蹴而就的,写的时候要多听取别人的意见,多修改。

先从简单一些的Resume开始吧。Resume之所以相对简单,是因为他的格式和内容相对固定,和PS相比,就像GRE的Argument和Issue一样。Resume的页面可以参考网上和同学之间关于求职简历的经验,但从内容上说毕竟还是会有不同。另外,并不是每个学校都要求提供Resume。

尽量把Resume控制在2页A4纸内。

以下是我的Resume的格式,大家参考吧:

1) 基本信息 (Personal Information)

包括姓名,性别,出生日期,e-Mail,国籍,联系地址和电话,最后还可以用一句话来简单描述一下自己打算申请的研究方向。

1. 关于姓名,一定要是名在前,姓在后。

2. e-Mail要写上以后会用来申请学校的邮箱,我用的是Gmail,很不错,从没有发生过寄丢邮件或者错误归到垃圾邮件的问题。

3. 联系地址当然是按地方的从小到大顺序写下来,包括国内邮编和国家。

4. 关于电话,固定电话的话可以使用 “+国码-地区码-电话号码” 的格式:对于中国,国码是86;地区码前面的0省略,如010只写10。举个例子,+86-10-12345678。移动电话可以使用 “+国码-4-3-4” 的格式,如 +86-1301-234-5678 。当然,这些格式只是我的推荐,不是硬性规定。

2) 教育背景 (Education and Qualification)

1. 本科信息包括就读学校和主修专业,开始和结束时间,所获学位,相关GPA和Ranking。对于一般还未毕业的申请者来说,应该在本科结束时间和所获学位前加上 Expected。GPA可以包括综合GPA和专业GPA,可以写上4.0分制和100分制。关于GPA我后面还会在Online Application里解释。原则是,如果某个不是必需的分数、排名对自己不利,情愿忽略掉也不要强求。

2. 中学信息可以写上去,注意学历信息要按就读的先后顺序从后往前写。不过中学以前的学历就不要写了。

3. TOEFL,TWE,GRE成绩及考试时间。可以注明TOEFL和GRE的类型,是iBT还是PBT,General还是Subject,后面写上分数。TOEFL可以只写总分,GRE最好写明每一类的分数,百分比。

4. 如果自己有业余爱好,或者在校的辅修等等和申请专业比较相关,也可以简单提及,格式和本科主修专业类似。

3) 奖项,荣誉 (Reward and Honor)

按照获得时间从后往前写。太小、太久的奖项都不要写,那些不重要。相反,和申请专业相关的奖项则很重要。一般来说,就写上大学时期的和专业比较相关的就行了。获奖证书不要寄到学校去,他们不认识中文的。

4) 专业能力 (Professional Skill)

简单描述一下自己在欲申请专业的相关能力。比如我是申请计算机的,所以就写上自己熟悉的语言,曾参与过项目中自己独立编写的代码行数等等。

5) 项目经验,研究经验 (Major Projects and Research Experience)

对每一个值得提及的、和申请专业相关的项目、实际经验进行简要描述。仍然是按照发生时间的先后顺序从后往前排。这部分一般是Resume的主要部分,能体现申请者的竞争力。

拿计算机来说,我的每一个项目有以下几个大点:
1. 概述该项目,主要能解决什么问题;2. 基于什么技术,一些出彩的技术细节;3. 有什么前瞻性的意义,自己的哪方面能力在项目中有所体现。

我认为,介绍项目最重要的不是项目本身怎么样,而是你自己怎么样。老美们当然不大会对你的项目感兴趣,他们更感兴趣的是你这个人怎么样,因此,如何通过介绍项目间接地来介绍自己才是这部分最需要考虑的。因为各个专业、项目细节都不一样,所以请各位自己仔细斟酌如何写好这部分吧。

6) 课外活动,社会实践 (Extracurricular Activities)

介绍一些和申请方向相关的课外活动,让教授们更全面地了解你。美国人都还是非常看重每个人的社会经验、人际关系这些的,这个地方就是展示自己一个小舞台。当然,不要写得太琐碎,捡重要的写,扼要地写,关键还是突出这些事情对自己在申请方向上的影响。对了,还是建议按事件发生的时间从后往前写。

大家可以参考一下我写的Resume。写得不算好,但大家去其糟粕,取其精华吧。:)

相关链接:

GPA 计算器 "GPA Wizard": http://offer.go3.icpcn.com/main/main.htm

My Resume: http://www.puzatech.com/kerenjin/

一些免费下载乐谱的网站

2008.12.19 更新:有些网站死掉了,更新一下列表。
2007.4.1 更新:偶然的机会找到了一个乐谱网站,竟提供 J.S. Bach 几乎所有乐谱的免费下载,不敢私藏,拿出来和广大巴赫爱好者共享。此网站除提供巴赫乐谱下载外,还提供 Mozart 部分的乐谱下载。
http://www.tobis-notenarchiv.de/ : Tobi's Notenarchiv。极好。提供 J.S. Bach 几乎所有乐谱的免费下载。midi 和 cap。cap 文件需用 capella 系列的软件打开。capella 的相关信息可以在 http://www.capella.de/ 找到。


昨天无意间找到一片帖子,上面列举了很多免费乐谱下载的网站,我把其中比较适合喜欢古典音乐的和有乐器特长的人的选了出来,写在下面,供爱乐者们借鉴。midi 格式的文件请用 Cakewalk 等软件打开。

格式:URL : 网站名。我的评价。介绍。乐谱格式。(备注。)

1) http://www.classicalarchives.com/main/ : Classical Music Archives。极好。提供几乎所有著名音乐家的著名作品,数量极多。midi。需免费注册或支付注册。

2) http://www.lysator.liu.se/~tuben/scores/ : Free Sheetmusic from Johan Tufvesson。好。主要提供早期音乐家的作品。pdf。

3) http://www.dlib.indiana.edu/variations/scores/ : VARIATIONS Prototype: Online Musical Scores。好。美国印第安纳大学图书馆提供的乐谱下载。网上浏览,当然你也可以下载到本地。

4) http://imslp.org/wiki/Main_Page:International Music Score Library Project。最好。这是一个收集了几乎你能想到的所有古典音乐家的乐谱的维基式网站,非赢利性质。这应该是目前最正规、最全、最稳定的乐谱资源网站了。它的维基介绍:http://en.wikipedia.org/wiki/International_Music_Score_Library_Project。pdf。

5) http://www.piano.ru/inter-e.html : Piano.ru。极好。一个俄国网站,提供了非常多音乐家的钢琴作品乐谱,只不过作品名都是俄文,看起来比较费劲。pdf。

6) http://www.sheetmusicarchive.net/ : Sheet Music Archive。好。收录了很多音乐家的著名作品,只是作品数量稍嫌少。pdf。

7) http://www.recmusic.org/lieder/:The Lied and Art Song Texts Page。很好。这里提供了非常多的歌词资料,康塔塔,歌剧,晚祷等等都有,有原文,也有各种翻译。不过此网站似乎很注重作曲家的数量,每个作曲家的作品都不是很全。不过考虑到其非赢利性质,已经很不错了。html。

8) http://www.tobis-notenarchiv.de/:Tobi´s Notenarchiv。极好。上文已有介绍。midi 和 cap。

9) http://icking-music-archive.org/scores/ : Werner Icking Music Archive。好。Werner Icking Music Archive 网站作品列表,音乐家数量多,作品也多,比较推荐。格式杂。

另外再介绍两个下载 SoundFont 的网站。这里提供的都是 SF2 格式,没有创新声卡的朋友可能需要自己转换一下。

1) http://hammersound.net/cgi-bin/soundlink.pl

2) http://www.homemusician.net/soundfonts.php

如果大家有什么好的音乐资源,欢迎大家一起交流分享。