一个星期前,由于网站崩溃,我需要学习备份数据库和站点文件。一位朋友主动向我伸出援手,把他自己编写的Shell脚本共享给我,并通过聊天工具耐心地指导我配置脚本选项。由于我把数据库编码一项误写成了“utf-8”,而系统又轻易不返回错误消息,导致了我们俩从晚上8:44一直Debug到23:28。(严格来讲,是他在不停地查手册、重写脚本,而我不停地用他给我的脚本覆盖服务器上的脚本并重新运行)。最后,他终于“想到把那个错误问题输出”了。根据错误信息,我们查了一下,原来MySQL默认的字符集是“utf8”而不是“utf-8”——去掉中间的短划线,问题就解决了。

说起这位朋友,其实我们早在2005年就认识了,当时我们都在翻译正则表达式方面的书。想一想那天晚上Debug的情景,心里不禁涌起丝丝暖流。

两个月前,由于种种原因,我需要学习使用SSH。一位朋友主动向我伸出援手,通过聊天工具耐心地给我讲解SSH客户端软件以及相关浏览器插件的配置和使用方法,直至我终于入了门为止。刚才又翻了翻当时的聊天记录:两次聊天用时大约90分钟,你来我往的文字有200余行!更令人感动的是,由于担心我从头开始配置太烦琐,这位朋友还把他的配置文件共享给了我。

说起这位朋友,其实至今我还只知道他的英文名——JerryChoi。现在回忆起来当时聊天学习的情景,心里仍然会泛起阵阵感动。

老子《道德经》第七十七章是这样写的:“天之道,其犹张弓与?高者抑之,下者举之;有余者损之,不足者补之。天之道,损有余而补不足。人之道则不然,损不足以奉有余。孰能有余以奉天下?唯有道者。是以圣人为而不恃,功成而不处,其不欲见贤。”

山西古籍出版社卫广来译著的《老子》,对这一章是这样解释的:“天的道,不就像拉开弓射箭吗?目标高了,就把它压低一点;目标低了,就把它抬高一点;弓弦过满了,就把它减少一点;弓弦不够满,就给它补充一些。天的道,减少有余的,用来补给不足。人的‘道’却不是这样,减少不足的,用来供养有余的。谁能拿出多余的财物来供给天下呢?只有‘有道’的人。因此圣人,为万物尽了力而不恃其能,办事成功而不自居功,他不愿意表现自己的贤能。”

这是老子在2500年以前说过的话,到了今天改变了吗?没有。前面说到的两位朋友在某些方面强过我,其实他们就是“能有余以奉天下”的人,而相对于他们我就是“不足”的人。他们对我的帮助,可以说是“损有余而补不足”,是顺应了“天道”,而他们自然也就是“有道者”了。

说到“不足”,我这个站点的域名跟这两个字其实大有渊源。早在2007年注册域名的时候,之所以想到cuckoo这个词,就是因为“布谷”和“不足”是谐音。当时的想法其实比较“自私”,我认为自己应该永远是“不足”的。这就相当于一个杯子只盛了少半杯水,这样才会有更多空间接受“替天行道”的“有余者”倾倒过来的“水”,才能让自己越来越“足”起来。

今年以来,我越来越多地联想到杯子和水的比喻。人生世间,每个人都可以决定自己是一杯水,还是半杯水;如果是半杯水,还可以进一步决定自己的杯子举得比别人的高,还是比别人的低。道理显而易见,只有没盛满水的杯子才能从别人的杯子中获得补充,而且更重要的是,只有自己的杯子举得比别人的低,别人杯子里的水才有可能流注到你的杯子里面来。

感谢上述两位朋友,也感谢曾经以这样或那样的方式帮助过我的更多朋友。

俗话说,“覆巢之下无完卵”。主机服务器硬盘损坏了,数据全都丢了,作为一颗“蛋”保存在坏掉的硬盘这个“巢”里的本站能幸免于难吗?当然不能。这正是本站自7月25日(左右)以来无法正常访问的原因——它跟着那块服务器硬盘一块牺牲了。

然而,掉到地上的“蛋”在“粉身碎骨”之后,不仅能够“破壳重圆”,而且还变得更加“完美”,这不禁令我对“祸兮福之所倚,福兮祸之所伏。”这句话有了身临其境并且更加深刻的体会。

自从网站无法访问后,不少朋友通过聊天工具、邮件、微博问我:你的网站怎么了?开始我还以为是服务器重启这类的操作造成的,没当回事儿。这也跟我最近很少写博客有关。又过了几天,发现网站还是打不开。于是,不得不在“所有程序”里找到几乎被埋没了的“××的”聊天软件——QQ2010。原来是这样啊——主机提供商已经在群里作出承诺了:24小时恢复数据。

事实上,给博客换个洋家也不是现在才有的想法。某某部出台了限制.com域名注册的规定(只有企业才能注册,个人不能注册了),后来又传出站长必须亲自到主机商那里照相备案的消息(后来据说只要把带脑袋的照片传过去,就有人用PS负责把你的头像放到官方的背景上),已经让人忍无可忍了!不行,得出国,得让我的这颗“宝贝蛋”出国。也就是说,兴搬家这个念头少说也有小半年光景了。

幸好,原来的那个“窝”完蛋了。24小时恢复数据,没问题。三下五除二,我就从淘宝上买了一个国外空间。登录后台CPanel面板一试,这才觉得自己以前太“恋家”了。这个新“窝”不限制子域名(支持泛域名解析)、不限数据库数量、可在线解压缩、有后台邮件通知,……。相比之下,原来那个“窝”的租金又贵限制又多还不怎么好用。跟现在这个窝比一比,一个银窝,一个金窝吧。换句话说,原来的银窝也不太差,差就差在它的价值与价格背离得太远了。

话说“银窝”的东家说到做到,数据库的数据居然恢复到了7月25日(但这已经不重要了,因为我最新的一篇博客写于6月24日)。再话说,由于我没怎么深入鼓捣地过“银窝”的后台,不怎么熟悉备份导出数据的操作,不得不一边探索一边向人家求救。结果,几乎在我自己鼓捣出备份的同时,人家也通过QQ把10M大小的.sql文件传给了我。在此道一声谢!(我预测,他一准会听到的。)

拿到数据后我就吃了一颗定心丸。先把WordPress版本升级到3.0(支持多站点),然后在本地XAMPP环境下先尝试恢复了一下数据,一切顺利。然后,临时叫停了老婆那吃掉我大量带宽的游戏,正式恢复站点数据,破镜重圆。

结果大家都看到了,表面上跟7月25日以前没有什么区别。但是,经历了这次搬家和数据恢复之后,我突然发现以前写过的那些东西并不像我一开始想象得那么不值一提。在老东家恢复数据期间,我用自己备份的数据(WRS格式的XML文件,通过WordPress导出的)恢复过几次,虽然是5月份才导出的,按理说也就只会丢失几篇文章而已,但几次恢复居然都只能恢复到2008年10月;从2008年11月到2010年5月,居然有18个月的数据断档。我因此作了最坏打算,如果主机商的数据也不能恢复,那就卷土重来,给自己的站点重新定位、重新设计、重新开博。

然而,眼瞅着后台那些十根手指头都数不过来的Ping链接,我清醒地意识到还有不少站点在引用和转载我以前的文章。如果这些引用都变成了空链接,不仅我面子上不好看,也会给不知道有多少读者学习深造带来极大不便。毕竟,在这个网络时代,作为其中的一个结点,我和这个站点都已经不再孤立存在了,而是与千千万万的其他结点建立并保持了千丝万缕的联系。如果数据真的丢了,可让我怎么面对那些素未谋面,而将来又有可能谋面但因此又可能永远也不会再谋面的花朵一样灿烂的脸孔呢?想到这里,我原来如释重负的感觉一下子无影无踪了,一种因失职而难逃其咎的负罪感油然而生。

当然,在老东家的指点和帮助下,数据都完整无缺地找回来了,灾难并没有真的发生。站点恢复如常了,我又可以做一个负责的结点了。与此同时,我发现由于“年久失修”,过去的一些文章有的图片打不开了,有的代码格式变得不好看了。看来有必要把这些年来的文章好好地捋一捋,修补一下,让站点更“完美”一些。这正是我接下来几天一段时间内的一个工作计划。

除了修补过往旧文,我还计划挑选整理一个《精华文章汇总》的页面,把那些价值相对较大的文章从“垃圾”堆里挑出来,摆在明面上。这样就不会过多地浪费读者诸君的宝贵时间了。现在,这个页面的链接已经有了,今后还将不断充实:2007-2010年精华文章汇总

最后,也是最重要的:从今以后一定坚持做备份,每周至少一次,雷打不动。还有,真心感谢在我站点无法访问期间纷纷提醒、慰问我的朋友,感谢在我测试新“窝”期间,奋不顾身地在测试文章下留言,最后留言又被我忍痛割爱而没有留下任何痕迹的朋友,感谢那些热心转载推介我的文章,让我从一个孤立的结点跟千千万万结点发生了关系的朋友!

《JavaScript高级程序设计(第2版)》

锡林郭勒草原

2010年06月19日 原创

草原

天光

起伏

奶牛

风车

路漫漫……

罗伯特·C·马丁
2003年4月26日
原文地址:http://www.artima.com/weblogs/viewpost.jsp?thread=4639

显示摘要

我曾经是一个静态类型的偏执狂,而且偏执了很多年。我在使用C的过程中饱经磨难,得到很多教训。愚蠢的类型错误曾经导致了不计其数次的系统崩溃。因此,在C++问世的时候,我马上就成为强类型的积极拥护者和推动者。听到Smalltalk程序员抱怨缺少灵活性,我还嘲笑过他们。毕竟,安全性与灵活性相比,前者要重要得多——况且,只要遵循良好的依赖关系管理原则,就能够保证软件具有灵活性,同时还是基于静态类型的。

4年前,我接触到了XP(eXtreme Programming,极限编程)。我很认同其中关于软件开发的实用性观点,也很认同其中关于测试的观点。于是,我又迷上了测试,以至于不使用测试驱动的开发,我都不觉得自己是在写软件。我不敢想象如果没有一套完整的单元测试套件来支持开发,后果将会怎样。

大约在两年前,我发现了一些问题。我越来越少地依赖类型系统所提供的安全性,因为单元测试可以帮我避免类型错误。对单元测试的依赖越多,对Java或C++(这是我选择的语言)类型安全的依赖就越少。

我觉得应该做一个实验。我先后尝试用Python和Ruby(都是以动态类型著称的语言)编写了一些程序,在发现并没有出现什么类型问题时也没觉得特别不可思议。因为单元测试确保了我目标清晰、范围明确,过去那么多年一直对静态类型检查的依赖也被我抛到了九霄云外。

而且,我认识到动态类型语言的灵活性也让编写代码变得异常轻松。模块容易编写,也容易修改。根本就不存在构建时间的问题。动态类型世界的生活让我感到无比轻松自释。

现在,由于项目需要我又改回了使用Java编写代码。但动态类型语言给我的轻松感觉每时每刻都在诱惑着我。我真希望自己是在使用Ruby、Python,甚至是使用Smalltalk在编程序。

还有谁有我这种感觉吗?随着越来越多的人接受测试驱动的开发(我觉得这是一个大趋势),他们一定能体会到我所说的这种感觉。到了2010年,是不是我们都应该换成使用动态类型的语言来编程了?