Philip's profileComPhilipPhotosBlogListsMore Tools Help

Blog


    September 17

    终于回到家啦

    过去的一个星期活得真痛苦。在北大医院待了4天,人生的第一次手术竟然如此痛苦。

    第一天早上,去北大医院看门诊,医生说小事,得做手术才能好。而且立刻给我开了住院条,然我去办理住院手续。而且还嘱咐说今天入院,后天可以安排手术,如果明天再进来,就得等多几天。那我当然是宜早不宜迟啦。

    不料办理完之后,大肚婆护士跟我说现在没床位,下午两点半再来,有一个加床位。还加床位呢,看来床位相当紧张。

    吃了午餐,睡了一下之后,准时来到医院,床位安排了,接下来就得等后天啦。那天下午去做了心电图,胸透。隔天凌晨5点护士又抽了血,提供了尿液检验。平时无所事事。后来主治医生跟我说了手术的事宜,主要是说采用局麻,然后使用什么药物,可能有什么副作用等等,当然,在我签名之前,没有心思去考虑那么多,相信医生吧。

    下午终于安排进病房啦,隔壁是一位老大妈,看来刚刚做了大手术,精神不大好,他的老公陪在身旁,同时他们还雇了一位护理。他们倒也很好聊,心情还真不错。家里事情比较多,不到我进手术室之前是不出现的。当天晚上,睡得比较早,隔壁邻居说我明天进行手术,养好精神。我不是很理解,闲着无聊,也早早入睡。后来我才知道的确要好好睡一觉。

    手术安排在中午12点左右,10点钟的时候,妈妈终于来了。12点15分,我躺着被推进手术室。事前打了镇定针,所以心情比较平稳。在无影灯下躺了10分钟,医生来了,在开到处周围涂搽消毒水,然后在身上盖了一张绿巾,只露出开开到处。另一个人在我脖子上方架了一个铁杆,然后用绿巾挡住我的视线。我能够看到的就是无影灯和手术室周围的东西,此外,听着连接右食指的心跳感应器的声音。

    还以为先打上麻药,然后等20分钟再开刀。没想到医生立刻在开刀处注射麻药,在注射的一霎那,很刺痛。过了几秒钟,医生问是否还痛。我回答不同之后就开始动手啦。接下来我才知道局麻是什么意思:哪里痛,哪里麻。有时割到没有麻到的地方,我立刻反馈,医生就下麻药,一下又不同了。好在手术室的温度比较低,我没冒出多少冷汗。刚开始不久,我闻到烧焦的问道,还看到一丝丝烟雾,原来用激光刀啊。

    手术进行了三分之一,医生让我忍一下,那个阶段无法麻。在疼痛中,咬着绿巾强忍着,不过也忍不住叫了起来。我不知道是否自己叫得很大声,手术结束后发觉自己喉咙有点沙哑。那个痛苦的阶段结束后,一切都在无痛苦的过程中结束了。

    等我推出手术室,从医生和护士的口气中,觉得自己被骗了,局麻根本不是事前说的一点点痛,要不然护士不会一直强调局麻这个词。

    很好笑,到了病房门口,我自己走下来躺回自己的床上。别人都是被抬回去,后来这一件事有几个护士也当做趣事。

    由于是局麻,做完手术后立刻可以吃东西啦,虽然我没有胃口。直到睡觉之前,在麻药的效果下,伤口都不是很痛。不过当天晚上,伤口痛得厉害,根本睡不着,无可奈何之下让医生打了一针,这才勉强入睡。那天晚上睡得很不好。

    第二天吃的依然很少,只要任何能够扯到腹部肌肉,伤口就痛。这下我可不敢笑啦,当然也没多少心情笑。早上,无聊之下打电话给党员姐姐吹水,党员姐姐一下子就发觉我的口气不妥,这个朋友还真没活说。跟她聊天真的很开心!!!

    傍晚,何嫣瑶和钟德志来探望了。看了一大束花,真的很开心。那一瞬间笑了,然后又抱着花痛苦了——伤口扯到了。我不敢说太多话,也不敢开玩笑。大部分听说何在说,钟也跟我差不多。真难为何,压抑自己的心情让我开心一点。在她走了那一刻以及接下来几天对我的关怀,我心情很复杂,不知道做什么来报答她。

    第三天,医生说可以出院了,吊针都吊完了,可以回家护理。虽然我那个时候只能勉强走路,不过还是离开医院这个没病都让人病的地方。中午我就回到爸爸公司疗养啦。

    希望上帝保佑,让我快点康复,然后开开心心上班。

    August 21

    安全性什么时候回来

    记得Firefox开始攻城略地的时候,打的旗号就是安全。那是IE在浏览器的市场份额超过90%。不过不断暴出严重的安全漏洞,使得用户纷纷拥护这只狐狸。那个时候Firefox有先天的优势,用户量少,受攻击的概率低,给人的感觉就是铜墙铁壁,因此打着自以为安全的旗号到处招摇撞骗。随着用户的增加,黑客瞄上了,IE的噩运同样发生在Firefox上。用户也理智了一些。

    不过随之Ajax的发展,各种Web应用的出现,使得Firefox找到了另一个炫耀的资本:效率。从那时起,媒体日以继夜地比较各个浏览器不同版本的运行效率,各种曲线图和柱线图眼花撩乱。不过比起安全性,效率更让用户觉得实在。许多人情愿裸奔,冒着把自己暴露在凶恶的互联网的风险,仅仅为了换回不大明显的运行效率。由于更能抓住用户的心理,Firefox、Safari、Opera等等非IE浏览器都在宣传CSS渲染速度、JavaScript运行速度在新版本快了N倍。可怜的IE往往作为效率的判断基准。

    人们似乎忘记了安全性。在这一点发生问题所带来的损失了不是提高几倍的效率能够挽回的。最近终于有一篇关于浏览器安全性的测试出来了,令人很意外的是:在运行效率最低的IE8,安全性测试竟然居首。这一点不知对于当初打着安全旗号的Firefox团队怎么想。

    今天又看到关于Chrome 4采用效率更快的V8引擎,看到这一点,神经都麻木啦。或许只有经过安全性的惨痛教训之后,安全性才会重新回到媒体的心中。

    August 13

    劳累的一天

    今天真累,其实体力劳动一直不多,不过还是觉得身心疲惫。这两天睡得比较少,改确切地说,这半个多月来一直得比较少。自从开始阅读《回到明朝当王爷》这部小说后,就沉迷得不能自拔。上班时中午那两个小时也不休息,打开电子书把自己置身于小说的氛围中。双休日更惨,两天除了睡觉,吃饭和洗澡,就坐在电脑前看。而且还要看到凌晨四五点,当自己无法再撑起眼皮的时候才睡。

    昨天晚上2点,终于把那小说看完了,宣告中断了半个多月的无聊生活明天又继续无聊。不过今天心情时时沉不下来,一是那小说精彩的剧情和人物时不时浮在眼前,二是图像处理书中的公式有点难消化,三是该死的Google,让我一整天在叹气。打着正版的Google音乐,我在里面挑选粤语流行歌曲,可它检索出来的歌曲都是旧的,而且排在最前。看着那一个个歌手:Beyond因为黄家驹的意外而解散了,“哥哥”03年自杀了,罗文因为癌症死了……听着小时候流行的歌,回溯的心情更加复杂。还好它没有把罗文的《狮子山下》列出来,否则一想狮子山被维多利亚的写字楼挡了,还得性情悲愤去维港抗议。

    唉!希望月光把《回到明朝当王爷》修改一番,我希望再一次阅读时更投入。

    July 23

    挥之不去的噩梦

    在酣眠时,一闭上眼睛就想起过去,一个我无法忘记的结局。经常因为悲愤而睁大眼睛,叹一口气之后再躺下。每次让自己精疲力尽之后再躺在床上,入睡的速度使我无瑕多想。

    上下班是段难熬的时段,耳边的音乐使我感到恬静,望着窗外的树木匆匆而过,望着阴薶的天空,在鸟瞰之下,自己也是苍海一粟。

    回家爸爸公司是件快乐的日子,抚摸可爱的狗狗们,逗逗淘气的侄子。不过快乐也是那么一瞬间,回到房间后,面对我的仍然是空虚,仍然是那些自己认为能够填充空虚的空虚。

    钱包中那张记载了联系方式的黄色纸,是我一直不敢联系的人,时间过得越久,胆怯就越大。那张纸对我来说一个约定,一个激励:能依靠的只有自己。

    July 13

    有感于软院第五届软件创新设计大赛专题项目

    今晚小青青在群上发了关于《关于举办软件学院第五届软件创新设计大赛的通知》,于是很好奇地看看里面到底有哪些现成的专题。

    看完之后,有种冲动想跟师弟师妹说,但怕影响不好,就不在群上发表啦,在自己的博客说说吧。

    那些项目本身有很深的应用背景,但仔细观察都知道,这些项目都跟指导老师有很大关系,可以说是他们的研究方向或开发项目。给人的第一印象就是把学院中的精英作为廉价劳动力来用,特别是《医疗会员卡终端及电脑管理系统》要求同学必须坚持把项目完成,不管有什么赛果。

    不过,对于在校生。本身技术和经验有限,难得有这些机会锻炼,许多人都争相报名,而且从项目的简介和指导老师的背景来看,似乎参加会大大提升自己的实力,至少以后简历上有闪光的一笔。

    那么,师弟师妹能学到什么呢?

    第一个专题的指导老师是李文军,院长,治学严谨而闻名(对某些人,闻风丧胆)。这个项目的最大目标是可用性。是否可以说做出来就行,其他方面可以再商量。在看看项目的需求,虽然内容不长,但说得很具体,特别是具体实现上的细节。如数据的存储格式,存放位置。有几个疑问:

    • 基于Web的应用,主要开发语言为JavaScript。按照常规,JavaScript主要用于Web前端,是在客户端运行的代码。但从功能需求来看,对数据的处理主要是放在服务端,在几重常见的Web开发平台上,只有ASP可以用JavaScript开发后台。不过我想不大可能采用ASP,那么其中提到的Java和C++可能是后台开发的主要语言,而不是仅仅用于开发辅助工具。
    • 不知道李院长为什么特别突出XML格式。从“数据的查询、统计、打印”功能来讲,用XML做为数据的存储格式很不合理,效率低,操作很不方便。我只能猜测这是一个Web Service,数据的交互通过XML格式。那么JavaScript就是把接收到的XML数据转化为HTML显示出来。

    如果这个项目仅仅考虑实用性,那么师弟只能学到具体问题的解放方案,对于整个系统的规划和设计,恐怕不会涉及太多。

    对于李院长指导的另一个专题《软件学院本科生毕业论文过程管理平台》,显然针对于我们这次毕业论文的整个过程在管理上很不满意。于是想搞一个电子化平台。这个项目不想多说什么,一个典型的信息管理系统,Java在Web开发的那套:JSP,Hibernate,Structs等等。项目本身难度不大,就是苦干啦。对于想熟悉Java的人,一个很好的机会。

    项目二的指导老师是王青,到现在为止,他给我的印象就是BlackStore队长这个光环。对他了解不深。这个项目说了这么多英语无非就是说ACM。英语要六级500分以上。参加ACM英语不是最重要的因素,主要还是问题的分析以及算法的应用,当然还需要创造性。今年在国际赛拿铜奖的华工团队中,有一个队员英语一般,六级不过,4级成绩一般。

    项目三这个明显雇佣廉价劳动力的项目,这个项目看起来似乎很大,但其实没有特别高难度的技术问题,说白了跟ERP差不多。对导师不了解,希望导师有很好的管理能力和系统设计技术。否则…(我都不敢想象)

    项目四是数据挖掘,不太了解。自己不想想象太多。

    项目五项目比较容易些。一个Web应用,后台用JSP开发,任务描述中的内容没什么特别难的。在要求中需要熟悉的C/C++设计和掌握GCC编译器,这是训练平台需要的。后台需要对学生编学C/C++代码调用GCC编译,编译通过返回运行结果,否则显示错误信息。参加ACM的同学都感觉这个平台感到很熟悉,这也是要求中ACM参赛中青睐的原因,需要他完善系统的需求和体验,至于算法能力,没什么好要求的。

    项目六指导老师为陈有青,一个我最想避开的老师,至于为什么,问其他人吧。我不做任何评论。

    最后一个是Silverlight,指导老师是老潘。没有给出要求,任自己发挥。我不知道老潘对silverlight了解多少,毕竟它是一个新东西,短短两年,就从1.0发展到3.0。silverlight我没有去学过,它最先的名称为WPF/E。WPF是.NET 3.0引入的新一代桌面GUI程序开发框架,silverlight只是它的子集。我看完一本超厚的WPF书,内容比较多,功能也很强大。silverlight既然是子集,在许多方面都有许多保持一致。参加的师弟师妹大可不必一定要追新使用3.0,毕竟3.0明显看到得的更新并不多,也许你需要的功能2.0都提供。2.0相比1.0,简直是质的飞跃。如果不知道用silverlight做什么,到http://silverlight.net看看,那里有许多优秀的例子。

    睡了,不吹了,明天是上班又得打瞌睡啦。

    July 10

    转帖Mentor的教导

    今天再次看看Mentor昔日发给我的邮件,再次感到那简单的语句中透露高深的设计思想。每次看都有新的体会,现在贴出来给朋友分享(部分涉及到具体项目的举例删了):

    1)  What are the reference models of your problem?

    If you never reference any others work, please make sure you are doing Einstein or Newton’s problem. If you just want to copy other’s model, please make sure if you really need to write any code to solve this stupid problem.

    2)  What will be changed in near future?

    Agile development does not encourage developers to guess future, since it leads to over-design. However, the core meaning of “design” is providing flexibility.

    3)  How to test your code that implements the design?

    The basic testability  is to make each  individual class fully testable with a few mock classes. I’m not talking product testing. I’m talking about Unit Testing. It’s developer’s job! Testability can definitely make both your design and code clean.

    4)  What are the building blocks of your system?

    Building blocks mean a higher  level of abstraction.  The best way  to  think of  the power of building blocks  is:  the user of your system can build some  totally unexpected or surprising scenarios using your building blocks. Building blocks can also enable some domain specific language invented in your system.

    5)  What are your key assumptions?

    This  is  just another side of “what would be changed” question. You have to maintain some assumption. (BTW, the more assumption not necessary mean a simpler implementation. The simplest code generated from only right assumptions). The  most  dangerous  assumption  that  would  bring  you  troubles  later  is  the  sort  of assumption that you never think it as an assumption. E.g. ”I never build any application for monkeys,  my  application  is  for  human.”  Yes,  but  machine  might  be  a  non-monkey  and non-human user of your system.

    6)  What system components and 3rd party components your design depend on?

    These dependencies will bring lot of troubles to you, so make the dependent components as few as possible.

    July 01

    离校悠

    昨天晚上从南校区回到宿舍后,望着空荡荡的宿舍,顿时有一种伤感。4年前,那时望着同样空荡荡的宿舍,心中充满了激情与梦想。4年之后,却是另一种感触。望着突然宽阔的桌面,回忆起无数个深夜编程的情境。仰视床头,无数次以疲倦的眼光望着天花板入睡。

    昨晚从光明顶出来,望着许多大牌档,到处有胡老师、仰平和叶总的身影。

    这次回校虽然有两天时间,但我没有来得及去回忆计应一起上课的课室,计协成员开会讨论的饭堂,学期末抱佛脚的图书馆……

    许多人用相机捕捉这一切,希望永远留住那曾经的一刻。

    一年前,黄晨煜师姐说过:“在毕业典礼上,那种庄严的气氛让她激动得想哭。”。昨天下午,我终于感受到了同样的心情。当上台握住校长的手,把等待4年的心情告诉了他:“等了4年,终于见到你了。”校长握手得更紧,时间更长。我高兴地笑了……

    June 28

    《Exceptional C++》真的是一本好书

    昨晚终于看完了《More Exceptional C++》,之前也看完了它的姐妹篇《Exceptional C++》,不得不说,这是两本更深入了解C++的两本书。

    也许对于有经验的C++程序员来说,书本里面提到的内容也许微不足道,甚至有点在吹毛求疵。它并没有教你高超编程技巧,也没有针对具体的C++应用技术进行探讨,所有的一切,都是围绕着C++语言和STL。

    C++初学者也许不适合阅读这两本书,因为它是面向有经验的读者,里面有一大堆讨论Template和STL。如果你觉得MSDN关于STL的文档很恶心,我想你应该好好学习STL。现在我觉得STL设计得很优雅(当然,C++标准委会员那班人不是饭桶,全世界的C++程序人都在盯着他们),当我第一次接触STL时,对着MSDN文档大骂,所有的改观都是建立在STL的了解上。毫无疑问,《The C++ Programming Language(Special Edition)》是一本很好的书(可惜中文版被裘宗燕糟蹋了),作者很系统地从浅到深地讲解了C++各个特征。这本书毕竟是教程书,有许多东西它无法讲得很深入。

    当你对C++有所了解后,特别是对Template和STL的架构和设计原则有所了解后,《Exceptional C++》应该是你在编程时的老师。阅读这两本书后,也许你不会再对资源管理感到恐惧,也许你会明白过去你对面向对象的了解仅仅是在表象上,也许……

    June 05

    让IE7Pro正常在IE8上工作

    自从使用了IE8之后,已经对它产生了依赖,增强的搜索功能和加速器等等功能使我转移到其他浏览器上就不习惯。网上充满着许多对FF、Chrome等等速度的宣传,速度不是我主要的追求,用户体验和安全也需要考虑。

    不过IE8使用了新的进程模型,使得IE7Pro这款插件不大适应,功能打了折扣。而最令人失望的是,开发人员好像停止了对插件开发。不过今天在IE7Pro论坛上终于贴出了一个解决方案。

    这个方案使得IE7Pro在IE8工作正常,牺牲的代码就是关闭IE8默认的进程模型,恢复为IE7的进程模型。

    在默认设置中,IE8会开启两个iexplorer的进程,其中一个是作为故障恢复。偶尔会遇到一个情况,当你打开多个页面时,偶尔一个页面停止响应(网站开发人员的责任啊),你会不耐烦把它关闭。在IE7上,这个关闭可能是致命的,它可能导致IE7崩溃,于是你打开的所有页面都会消失。而IE8有了这个多余的进程,一个页面的崩溃不会影响到其他,而且IE8还会把崩溃的页面恢复。可以想象,IE8的稳定性比IE7大大提高了。

    可IE7Pro不适应,当IE8第一次开启时,IE7Pro在第一个页面正常。不过打开第二个页面时,IE7Pro的功能就打了折扣啦。不过,可以通过修改注册表来使IE8使用IE7的进程模型。

    打开注册表,在HKCU\Software\Microsoft\Internet Explorer\Main创建一个名为TabProcGrowth的DWORD项,设置为0或1,就恢复为IE7的进程模型,IE7Pro就工作正常了。

    参考来源: http://forum.ie7pro.com/viewtopic.php?id=4599

    June 04

    无奈使用代理

    从前天开始,MSN服务开始中断了。Live Mail无法连接服务器,我刚开始以为是服务器升级,于是把账号删了,然后重新添加。发现还是不行,看来网络有问题。于是打开www.live.com, www.bing.com, www.hotmail.com,都无法连接,看来是电信搞的鬼。

    上百度新闻一查,果然是普遍问题,MSN和Live相关域名被屏蔽了。问了一下微软的朋友,他们说能连接得到。这个当然,他们通常使用日本网络出口,当然没问题。

    没办法,只是用代理了,谁叫我的MSN订阅了几个邮件列表。下载了Tor,这款开源代理真是不错,只不过速度不敢恭维。

    May 28

    闲说

    过去的一个月,把全部心思全部放在C++上。原以为使用ATL开发ActiveX是一件很容易的事情,到头来还是得啃一本十几年前的书。不知不觉,感觉自己已经入门了,OLE 2规范,OC 96规范看完之后,对于OLE和ActiveX体系有了全方面的认识,做起项目来不再盲目。现在讨厌向导生成的多余代码,喜欢手写。少了向导,自己也只是走了几个弯路而已。这些弯路就是学费,而且永远不会再交同样的学费。

    使用了一个多月的C++,突然想起国外一位大师曾经公开批评Java阻碍了学生对计算机的认识。我没用过Java,但对Java的批评同样也适用在.NET和C#身上。现在觉得这句话很有道理,不过也怪不了广大Java fans。他们面对着功能齐全的框架,一个容易上手的语言,他们并不会为编译链接感到痛苦,他们无需使用高超调试技术就能完成对程序的纠正(但我的导师对我说:通过编写测试性高的代码辅助以全面的单元测试,他不需要掌握高超的调试技能。相反,那些具备高超的调试技能的人往往不编写测试用例)。不过Java隐藏了太多的底层(它必须这么做,否则怎么宣传跨平台),程序员在它身上对底层概念的理解可能不会太深入。

    不过自己在大一的时候很不喜欢C++,主要的原因就是编译和链接过程很痛苦。而当我遇到C#以及.NET后,C++是一个敬而远之的东西。不过两年之后,随着自己的知识逐渐提高,在.NET似乎找不到新鲜的东西。系统底层是一个向我招手的新大陆。但我再次去尝试接触它们时,发现自己很轻易地理解它们,而且它们也相当友善。编写C++时,编译和链接的错误提示不再是天书,而是友善的提示。Windows核心、ATL、WTL、OLE、ActiveX不再神秘,也许我正在enjoy。

    突然想起昨天上午公司举行了一个培训,主要是讲解自主编写的JS框架的使用。然而,培训完了之后,我很失望,“框架”这个词带给我太多的暇想,不过现实并没有给我太多的兴奋。

    说来惭愧,我只使用过AJAX.NET这个JS框架,Prototype也只是简单看了一下它的文档。我觉得一个JS框架具备两个方面:一方面扩展JS并简化一些常见的功能,如扩展Number对象,使它具备国际化和本地化功能,Array提供完善的列表功能,跨浏览器的事件模型,AJAX封装等等。另一方面,就是提高JS代码的可重用性。通过该框架,JS代码更模块化,可维护性。可惜的是,展示在我面前的一个个demo,我并没有看到什么亮点。

    他鼓吹说通过该框架,可以通过CSS选择器来选择页面的元素。这是一个亮点,它甚至支持IE不支持的CSS选择器,如属性选择器。不过我担心它的性能,很明显,对CSS选择器的解析是在脚本代码级上的,它的效率有多快呢?不过会上鼓吹的是开发效率而不是运行效率。是的,通过它,你可以少敲一些代码。但我想,也许调试是占用你最多时间的,多敲几行代码也许并不能把开发效率提高多少。在整个框架的功能列表中,我好像没有留意到它对调试的支持。

    会上我提问了许多问题,如一些函数在使用上会不会使人疑惑。但我说自己用JS编写类的时候,他跟我说JS没有类这个概念,JS的所有东西都是对象。我无语了,没错JS并没有类的概念,但并不能说它不具备OOP。C是面向过程,但你可以编写出面向对象的代码,封装,继承,多态在C上也能体现。业界的人都知道,JS中的原型模式是实现OOP的关键特性。在封装上通过闭包这种浪费资源的方式,继承上你需要编写一些代码去除对象原型的冗余。在AJAX.NET,我没有怀疑过JS的OOP能力,很庆幸的是,AJAX.NET并没有把JS弄得面目全非。

    经过几次的意见提出,我知道自己的意见不会被采纳,能够做的就是使用并适应这个框架,因此我也保持沉默。缺少OOP,这个框架无非就是封装函数的集合,并没有其他特别的东西。我担心,如果未来我需要编写JS,已经习惯OOP的我能接纳和习惯这个框架吗?

    April 22

    我想我还是没看懂

    今天下班后终于在优酷上重温了《第28届香港电影金像奖颁奖典礼》,当然观看这个典礼主要是冲着《天水围的日与夜》去的。

    算是机缘巧合吧,有一天在逛news.tvb.com的时候,《星期日档案》里面有一集说香港电影的形状的。一看到那一集的主题,不得不让我感慨——东方荷里活何时回来。在那半小时中,提到了《天》这部电影,小制作,但口碑不错。从那个节目中,《天》的导演说找投资很难,因为剧情不是很波澜起伏(这一点严重同意),而且整部电影只有以粤语才能体现出香港天水围的味道和氛围,所以不会引入内地。而如果不引入内地,票房来源就窄少了许多,从而许多投资商不肯投资。

    这个时候,我突然感慨,自己是不是忽略了许多香港默默无闻的好电影呢(看了典礼之后,惊讶地发现许多提名的电影我还没听说过)。好在互联网发达,很容易在网上下载到原汁原味的电影(不知道是光荣还是羞耻)。

    看完之后,我完全说不出其中有什么亮点。一个普普通通的家庭,读书不怎样的儿子,父亲已过世,母亲在超市打工。另一个独居老人(陈玉莲饰),生活很十分简朴。故事情节没有高潮,好像是一部纪录片,反映简简单单的生活。

    然而,今天我仍然还记得《天》,因为它让我在无意中感受到了感动。贵姐(鲍起静饰)对啊婆的关怀与帮助,使人感到丝丝的温暖,独居老人感受到的温暖更多。另一处最令我感动的是贵姐的儿子去医院看望外婆时,外婆述说那段贵姐的事迹。

    看了《天》,我应该把目光从欧美移回香港,移到《亲密》、《证人》……

    April 21

    倒霉的201车

    其实如果顺畅的话,乘坐201号车到公司只需要15分钟左右,然而这两个早上,时间都超过了半个小时。上一次,车在一座桥上停留了很久,也不知道为什么,当车开过那座桥时,除了交通灯,没发现有什么车祸。也许应该埋怨交通灯时间设置不合理。然而今天早上,还是有意外。

    地点同样是车刚刚经过那座桥,在一个车站停下来后不动了,只听到驾驶座那边有争吵声,过了5分钟,后面的乘客开始急躁了,不断催车,前面密密麻麻的人,也不知道发生了什么事。突然一种声音出现了,叫司机开去派出所。这时才知道发生了什么事:一位女乘客的钱包被偷了,但无法知道是哪位,明显有几位嫌疑人。做小偷合理,但大家上班心切啊。许多人8点半上班,这时时间只剩下十几分钟。这么绞缠下去不是办法,许多人喃喃开门下车。

    吵了一会,终于开门了,一出门就发现一个男的摆脱苦主,扬长而去。于是有几个男的下车帮那位女苦主追,最后好像也追不回来。最后车终于开了。看来201不大利我。

    April 17

    毕业设计回顾:URL解析路由

    好久没写博客啦,一直想着把毕业设计遇到的点点滴滴写出来,然而自己总喜欢写code,而且怕写出来会贻笑大方。原以为软件的熵只有在不断发展时才会越来越高,后来才知道软件的熵具备人的主观判断,随着时间的推移,认识的事情多了,回过头来看看那款软件,才知道它的熵比原先估算得还要多。

    废话说多了,上次把网络硬盘的URL方案确定了之后,接下来就是要进行解析处理。然而解析只是整个系统的一部分,与各个部分如何协同也是一个挑战。在之前的Word REST API,这一点做得不是很好,有很高的耦合性,严重违反了SRP原则。同时,这一套API中,对URL解析过程中上下文的处理也不够灵活,使用了Hard Code。在网络硬盘中,必须能够实现动态配置。ASP.NET MVC框架给了我灵活。

    我不大熟悉ASP.NET MVC框架,它得在VS 2008上开发,而自己的老爷机只配与它同年生的VS 2005,对ASP.NET MVC只能大概了解一点。MVC框架的第一印象变化是体现在URL上,从这个URL,在IIS7上,URL好像有REST的影子,不过URL还是得进行解析,从IIS.NET初步看到的教程,解析的工作交给路由器(Router)负责,路由器会路由到相关的控制器(Controller),调用控制器的相关方法,传递参数(也是从URL解析得来)。而控制器则最后返回一个结果,这个结果可能是HTML,JSON,XML或其他格式。从示范的例子看,MVC框架内置的路由器是使用正则表达式进行路由。不过我想用户可以定义自己的路由器,从这一点来看,利用MVC框架,为在ASP.NET创建一个REST Web应用提供了一个利器。

    利用MVC框架路由的设计,粗略了设计了一套MVC框架。这其中最困难的还是控制器的定位上,因为控制器了解自己操作的模型和生成的视图。同样我也使用了路由器这个概念,但由于网络硬盘的URL复杂,无法使用一个正则表达式表示,于是就采用网络中的路由器工作模式:一个接一个进行路由(一个路由器解析某一部分的URL段)。大致的工作模式如下:

    路由器工作模式

    当接受到HTTP请求时,第一个路由器解析资源,若当前URL无效(它不知道怎么解析),则返回一个空的控制器。如果URL有效(知道怎么解析),而且还有后续的URL未解析,则交由后续路由器解析,传递上下文信息,并且返回后续路由器返回的控制器。如果URL已解析完毕,则路由器返回相应的资源控制器。由于每个URL段表示资源(可能是集合,也可能是集合中的一员,也可能是一个资源中的属性),路由器也知道处理相应资源的控制器。

    这样,当一个路由结果返回一个控制器时,表示URL有效,如果没有返回控制器,则说明URL无效,可能指向一个不存在的资源。在URL中,两个段之间所表示的资源是从属关系,它们之间都有比较强的联系,这一点在路由器传递时体现出来,路由器传递给上下文信息包含了URL段所表示资源信息,而后续的路由器如果需要上下文信息,则一段是宿主(不知道这个词用得对不对)的信息。即使如果,我们仍然可以进行路由器的动态配置。

    路由器间的关系不会像网络路由器那样构成复杂的图,也不会是一个单向链,它实际上是一个森林(多棵树),没有理由规定只有一个根路由器(虽然大部分情况如此),也没有理由规定子节点只有一个(一个同级后续路由器)。

    举一个例子,对于http://ss.sysu.edu.cn/netdisk/rest.ashx/browse/|006520/课件/数据结构课件/01.ppt|?format=binary,解析过程如下:

    removePrefixUrl 路由器,把多余得URL前缀移除,得 browse/|006520/课件/数据结构课件/01.ppt|?format=binary

    browse 路由器,转入浏览模式,其实只是移除browse,得 |006520/课件/数据结构课件/01.ppt|?format=binary

    browseFolder 路由器,路由数据结构课件文件夹,同时传递01.ppt文件信息

    browseFile 路由器,路由到01.ppt文件,已解析完毕,返回BrowseFileController

    整个路由器森林也可以通过配置文件来进行搭建,如下面的XML:

    <path name="removePrefixUrl">
    
        <path name="browse">
    
            <path name="browseFolder">
    
                <path name="browseFile" />
    
            </path>
    
        </path>
    
        <path name="login">
    
            <path name="loginCallback" />
    
        </path>
    
        <path name="admin">
    
            <path name="adminFolder">
    
                <path name="adminFolderNaming" />
    
                <path name="adminFolderPassword" />
    
                <path name="adminFolderRolePermission" />
    
                <path name="adminFolderClassPermission" />
    
                <path name="adminFolderMove" />
    
                <path name="adminFileUpload" />
    
                <path name="adminFile">
    
                    <path name="adminFileNaming" />
    
                    <path name="adminFileMove" />
    
                </path>
    
            </path>     
    
        </path>
    
        <path name="icon" />
    
    </path>
    March 27

    重温《东邪西毒》

    王家卫带着《东邪西毒终极版》让大家怀念一下经典。今天重新观看这部电影,想把以前没有看懂的情节理清。最终我没有选择终极版,而是1994年的原版。因为原版的配音更加经典与动听。

    仍然有一个地方不大清楚,东邪(梁家辉饰)隔了很久之后再次去见盲剑士(梁朝伟饰)的妻子(刘嘉玲饰),盲剑士为什么悲伤苦泣,是因为他的丈夫死了?不是,根据后面的情节,丈夫的死讯是西毒(张国荣饰)告诉她的,因为她不可能因为丈夫的死有关。只能说她又见到了自己喜欢的人而泣,但是她趴在马上的动作使我很不解她在做什么。

    盲剑士想杀东邪这位最好的朋友,因为她的老婆喜欢他。我无法知道为什么他的老婆会喜欢东邪。那个时候的东邪已经喜欢西毒的大嫂(张曼玉饰),盲剑士说想杀东邪的时候,西毒的大嫂已经死了(“醉生梦死”的酒是临死前给东邪的),这里时间顺序以及历程不大明白。

    东邪有一句不解,但他望着鸟笼时,西毒问他为什么一直望着鸟笼,他说“因为眼熟”。后面才知道,当初慕容嫣(刘青霞饰)与东邪约定在一个地方见面,那个地方有一个鸟笼。东邪最后是失约,看来他不重视慕容嫣,可他为什么会特别留意那个地方的鸟笼呢?

    慕容燕与慕容嫣其实是同一个人对东邪的感情——又爱又恨。看来东邪对她伤害很深,导致其精神分裂,最终成为独孤求败。在《神雕侠侣》,独孤求败只剩下一只神雕,他的剑术通过杨过表现出来,精神分裂成如此高手,惊讶啊。

    洪七公(张学友饰)竟然有老婆,而且他右手食指不是因为贪吃被自己砍了(94《射雕》的版本),年轻的洪七是使刀的,断指之后没使刀了。在电影最后,交待了打狗棒法,但没有交待降龙十八掌。

    这里并没有交待《射雕》那传奇的东邪西毒,南帝北丐中神通。洪七的武功虽然很高,但没有给人高深的感觉。而东邪与西毒虽然出手极少,但给人高深莫测的感觉。

    西毒的大婶有一句话很经典:“有一天我对着镜子,发现自己输出”。赢了一时之气,输了终身幸福。94《射雕》只说了一下欧阳克是欧阳峰的私生子,这里同样没交待,不过西毒与大嫂有那么一夜,八九不离十啦。

    重看了一遍,又理解许多了。

    Technorati 标签: ,
    March 17

    网络硬盘上线一个星期

    毕业论文终于完成初稿了,新的网络硬盘上线已超过一星期,可能还没有老师使用,现在还没有发现任何问题。出了头两天修改一些UI bug之外,一直没有修改。

    今天把HTTP协议的缓存部分读了一下,优化了几个地方,更改了两个UI。

    现在有时间做自己喜欢的事情喽。

    Technorati 标签:
    March 09

    毕业设计回顾:基于ASP.NET的REST网络硬盘 之 URL

    昨天晚上,终于把毕业设计搞完了,单元测试也随之完成,剩下就是集成测试的环节。上个月底,还以为三月份结束时不能完成整个设计,当时还在Javascript的泥潭中,没想到昨晚却到了一个关键的里程碑。

    这个课题是自己找的,在微软实习时接触了REST以及实现了一套简单的API,对REST这种特别适用Http Web Service的架构很有好感。去年暑假,花了一个多月时间匆匆忙忙完成软件学院的网站的设计,其中的网络硬盘仅仅花了不到三天。当时参考的对象是SkyDrive,后台操作的方式基本与SkyDrive相同。在8月10号,也就是网站完成编码的那一天,心里一直有想把网络硬盘进一步开发的想法。刚好毕业设计有时间和精力把这个想法实现。

    一开始觉得网络硬盘最大的不足在于后台的用户体验很差,看不到Windows文件管理的影子。最初的想法就是使用Ajax来增强用户体验,当时认为这个工作量并不大。过了不久,突然冒出一个想法,为什么不把整个网络硬盘RESTful呢?这样的话,数据移植更方便,而更重要的是,其他非浏览器的程序可以操作网络硬盘。于是就决定使用REST架构。

    REST有几条原则,我想许多人想都不用想就会冒出一句:Everything is a resource. 的确,REST是面向资源的,资源不仅仅是数据,而可能是一个操作。不过对于网络硬盘,资源很简单不过:文件夹、文件以及它们相关的属性。那么资源确定了,如何定位它们呢?也就是它们的URL如何定义呢?

    方案一

    文件夹: http://<host>/<folder1>/<folder2>/…/<folderN>

    文件: http://<host>/<folder path>/<file1>

    文件夹属性: http://<host>/<folder path>/<property name>

    文件属性: http://<host>/<file path>/<property name>

    这是一个很直观的方案,然而它会带来岐义。试想有下面是一个folder1文件夹,地址如下:

    http://www.abc.com/folder1

    它有一个Size属性,该属性显示文件夹中所有文件大小的总和。地址如下:

    http://www.abc.com/folder1/size

    如果folder1包含一个文件,文件名为size,那么文件的地址就会与folder1的Size属性地址相同,从而发生岐义。类似这种情况的岐义还有许多,因此方案一不能采用。

    仔细观察上面的结果,会发现文件/文件夹的路径是一个任意个度的URL段(url segment),段的个数等于文件/文件夹在网络硬盘目录树中的深度,更恐怖的是,文件/文件夹的名字可以任意(除了少数几个字符外),这就导致了文件/文件夹名字可能跟它们各自的属性名相同,这样的URL无法判断是访问文件/文件夹还是它的属性,从而有岐义。

    方案二

    既然文件/文件夹是一个任意个数的URL段,如果放在URL地址的中间或首部,必定导致岐义,那就把它放在最后吧。于是

    文件夹: http://<host>/<folder1>/<folder2>/…/<folderN>

    文件: http://<local>/<folder path>/<file>

    文件夹属性: http://<host>/<property_name1>/…/<property_nameN>/<folder path>

    文件属性: http://<host>/<property_name2>/…/<property_nameN>/<folder path>/<file>

    一开始我觉得这个方案不错,于是利用这个特性设计了REST架构,然后开始编码,不过在定义接口的时候,才知道方案二比方案一更糟糕,它带来更多的岐义和复杂性,直至没有可读性。

    出现岐义还是在属性上,如下面一个地址:

    http://www.abc.com/size/demo

    如果网络硬盘根目录有size, demo两个文件夹,并且size文件夹还有一个demo子文件夹,那么这个地址是访问根目录下demo的大小属性,还是访问根目录下size文件夹的demo子文件夹?

    另外还有一个岐义的地方,那就是属性。属性是隶属一个类的,一个属性名在一个类的环境下才具备确切的含义。一开始就出现属性,无法判断它要访问什么资源。举个很简单的例子: table,它是指桌子呢,还是指表格?

    这个方案也令资源更加难于定义,因为它需要回溯操作,如下面一个地址,它表示帐户administrator在demo文件夹的权限:

    http://www.abc.com/permissions/administrator/demo

    即使没有岐义,要定位到权限这个资源,必须从demo回溯到permission,而且并不是完全逆着回溯,因为administator在permissions下才有意义,回溯顺序是:demo->permissions->administator,太复杂了!!!

    OK,即使回溯能够实现,那么回溯肯定需要上下文来指引,如果传递上下文,那么传递方式以及结构必须在各个段中进行协定。如果一个类负责解析一个URL段,那么类与类之间必须协同好上下文的结构,这将导致很高的耦合度。

    最后,这个方案违背了人们习惯从左到右,从广到窄的URL阅读方法,肯定不实用。

    方案三

    坦白说第一种方案已经相当好,只要解决文件/文件夹URL段的任意性就行了。如果抛开网络硬盘这个环境,单纯思考URL,那么下面一个通用的地址:

    http://<host_name>:<port>/segment1/segment2/…/segmentN?<querystring>#<hash>

    再简化一点,RESTful的URL在很大程度上不需要查询字符串:

    http://<host_name>:<port>/segment1/segment2/…/segmentN

    那么从范围上讲segment1 > segment2 > … > segmentN, OK,方案一满足这一条件,问题是,文件/文件夹的多段性如何消除。

    URL段?URL如何划分段呢?下载了《Uniform Resource Identifiers (URI): Generic Syntax》,看看URI有什么格式要求。发现URI里面的保留字符(reserved characters)都是用来划分段的。然而URI还考虑到某些段中可能包含保留字符,此时为了防止其作为段边界标记,需要使用转义格式(% hex hex)来表示该字符。这刚好是我想要的答案,于是对方案一做了点小修改:

    文件/文件夹路径在URL地址中必须进行转义,如demo/size转义后为demo%2fsize。其实这没什么,平时浏览器在发送请求时都会帮我们进行转义,只不过浏览器不会对“/”进行转义,而现在我们必须手动转义而已。这似乎是一个圆满的解放方案,于是我开始进行架构设计。

    好不容易架构搭起来了,当我对架构进行测试时,发生了意想不到的事情,在ASP.NET中获取的URL,竟然全部已经逆转义了,ASP.NET把逆转义的过程帮你做了,而且你无法拒绝它的盛情,最糟糕的是原先我们手动转义的“/”,它也帮你逆转义了,噢呕!又回到方案一啦。试了许多方法尝试访问原始的URL,但都失败,一筹莫展!!

    不过Windows的命名限制倒引起了我的注意:名称不能包含以下字符: /, \, *, ?, :, <, >, |。选择他们来作为分界符吧。前两个不能选择,URL已经用了,“*”和“?”最好少动,后者是URL查询字符串的起始字符,前者在许多场合使用,可读性不强。最后选择了“|”,于是demo/size的路径改为|demo/size|,这下不用去管什么转义不转义的问题啦。而解析URL的工作还得自己动手,不用ASP.NET代劳,这样的划分没有问题。

    至此URL方案定了下来。

    Technorati 标签: ,,
    February 22

    发下牢骚

    四天了!为了编写一个ListView组件足足花了四天功夫,仍然没有完成,每次都把几百行JS代码全部删除,重构架构后再写出来。恰恰是都能实现一个Demo时才发现架构的不足。

    今天不得不进行第三次重构了,希望这次能够把各个对象的关系处理好。

    唉!这次毕业设计会不会太过认真了呢?

    February 06

    正式被百度耍了

    下午收到邮件:

    你好 ×××:
    让你等了这么久,我也一直在等,报上去也一直没什么音信。
    官方点的解释是,你正处于等待状态,我们正在审批的过程中。
    今天收到你的短信和邮件,下午追踪了一下,有一些很不好的消息,我也觉得很难过。
    由于一些内部的原因,发生了一些变动,我们申报的名额不久以前被砍掉了,所以被搁置。

    实在不好意思,我都不知道怎么发出邮件向你解释,非常抱歉。

    而具体的问题,如果你还想知道,问××同学吧。

    ×××

    Technorati 标签: ,

    喜欢狭义的“山寨”

    “山寨”,这个2008年最热的网络名词,不知道2009还能不能继续发挥余热。从CCTV的“经济半小时”了解到了山寨手机,也开始接触山寨这个名称。对于后来一发不可收拾的“山寨”,甚至有些人把“假冒”当做“山寨”来混用,我更喜欢狭义的山寨,也就是山寨手机。

    出于一种情节,在深圳生活了11年,深深地爱上这个城市。对于深圳能够拥有这么完整的手机产业链,我感到很自豪。对于无数人的对MTK这块芯片进行压榨式的挖掘,很敬佩。

    山寨机网,我每天都会去浏览一番。这个网站发展得很快,内容也越做越好。“推介国产强机,交流山寨手机文化”这句口号已经不完全是它的本份,新兴的山寨本也在这个网站有专有的栏目。大部分情况下,我不是去看看有哪些新出的山寨机或山寨本,而是看看网络上的评价。评论、寨日、杂烩时不时有最新的国内无线产业行情,对某产业和产品的讨论,尽管里面不欠偏激的文章。

    今天,一位从小在中国生活学习的青年写一篇文章被翻译发布了——美国青年:整个中国就是一个山寨,从太平洋彼岸来思考中国的山寨现象,很奇特,很精彩。

    Technorati 标签: ,