April 2009 Archives
April 29, 2009
我喜欢剧透
人们对于剧透这件事情的认知有好有坏,不过我在现实环境中总觉得是反感剧透的居多。我在国内上大学的时候,有个室友就特别讨厌剧透,每次我们围在一起看电影的时候,一旦有人要剧透,他总会厉声制止。网上这种情况更多,我记得有一次看了一集Heroes,可能是那一集剧情特别跌宕起伏,我不禁在Twitter上赞叹了一句情节,结果立即有人回我“不要剧透”。老六曾经写过一篇文章,表达了他对剧透这一行为的愤慨,里面他讲的被剧透的事迹悲惨的可以用催人泪下来形容了。在维基百科上,很多关于影视作品的条目,在介绍剧情的片段时,常用技术把剧透的部分给隐藏起来,并提示下面内容可能会降低观赏性质云云,手动点击后才能看到。在美剧论坛里,在有剧透内容的帖子的标题上标明“剧透慎入”已经不是一种美德,而是一种基本的道德了。
我不讨厌看到剧透的内容,但我挺讨厌故意散播剧透的情节的人的。抛开玩笑性质的心理不谈,这些人的这种行为,无非是一种无聊又弱智的“优越感”作祟。我也搞不清楚反感剧透的心理,不过检点自己的语言,不吐露剧透情节,已经算是与人交往的必要尊重了。
不过我最近两年有一种感觉:随着对电影的兴趣逐渐减弱,我越来越依赖剧透了。不知是因为年龄的增长还是学业的负担,我觉得我越来越没有心情看电影了。硬盘上存着我下载了很久的《Revolution Road》和《The Reader》,但一直没有看,母亲还两次在通话里给我推荐《贫民窟的百万富翁》。对我来说,电影需要专心致志的投入,把感情融入电影的情节当中去。而现在的我要来这么一次“情感投入”似乎成本有点高,到时候导致我“情感虚脱”就不好了。因此现在我即时有时间,我也更喜欢吃快餐一样的看综艺节目,而不是去看一部哪怕是评价很高的电影。即时综艺节目看腻了,我也更希望“复习”过去看过的电影,而不是再看新的。
我考虑过原因。我觉得看一部新电影对我来说成本有点高,对于未知的电影情节,我需要把情绪调整到与电影合拍,并在电影结束后把情绪抽离。基本上能导致我义无反顾的去做成这件事情的因素不多,其中最主要的可能是这部电影里有我喜欢的演员吧。比如尼古拉斯凯奇的电影(近期的对我的说服力不大了),《Deception》里的Hugh Jackman(不过我感觉这片子挺垃圾的),《Batman: The Dark Knight》里的克里斯蒂安贝尔与Aaron Eckhart(他演的地心末日让我印象挺深刻的),《亲密》里的郑伊健与林嘉欣,《疯狂的赛车》里的黄渤、九孔。这些电影我基本上是下载下来马上就看回想一下我在最近一年看的电影,除了有我喜欢的演员的以外,下载下来就看的大概只有《Iron Man》和《Yes Man》了。这两部片子基本上都在我观看前有着铺天盖地的宣传,又属于动作和喜剧,对感情的要求不深。而且在相关的VeryCD上也有相对完整的剧情介绍。
回忆我近一年的看片经历,我在每次看完一部电影前,都会在网上搜索电影的情节。当看到情节中有吸引我的东西时,我就会特别带劲的看一部片子。不过我几乎没有一次找到过完整(哪怕是相对完整)的情节叙述。原因不难猜,“天下文章一大抄”,网上尤其明显。片商公开的剧情梗概不可能把故事完整的说出来,而那些只言片语就被不断转载,而没有人认真的看完电影做总结,即时总结的时候也怕被人骂剧透而常常闪烁其辞。因此我常常只有对着一字不差的片商给的剧情梗概叹气。
我在一、两年前有个想法,我觉得不止是我一个人有这种感觉,因此有一个专门收集电影剧透故事的“剧透网”应该是一个不错的创意。网站采用wiki的形式让每个人都可以添加内容,形成一个越来越大的库,应该会有相当大的作用。其实IMDB本身就有条件做到这个功能,不过并不是所有人都喜欢它,因此集成在IMDB可能不太现实。除了利于我们这些人以外,在目前的技术下,文字相对于视频也有相当大的优势。我们曾经只记得电影的剧情而不知道电影的名字,如果有相应完整的文字描述,那么用电影情节从搜索引擎找到电影名称的几率就大大增加了。可惜我没有精力来搞这个,网上有相同志愿的人也不好找。
这个想法已经沉寂了将近一年了,基本上属于快忘了的状态。但上周末我在找奥特曼的回目列表的时候,看到了奥特曼中国联盟的“爱迪奥特曼剧情介绍”页面,不禁大为感动。除了剧情与演员,连幕后工作人员的资料都给了出来,更有很多截图帮助我们理解剧情,非常生动详细。可惜作者只整理了1至10回的。基本上我所期望的“剧透网”的内容应该与这个页面差不多吧,把每一部电影做到这个地步,应该会有很大的帮助。
他包含女性
不知道是不是练习英文作文留下来的习惯,每次写文章提及第三人称的时候,一定要写“he or she”。中国人的思维习惯里是老外对女权很尊重,因此对这种人称代词比较敏感。中文中似乎也有一点类似的趋势,在某些不正式的场合里,“他”和“她”都被用“TA”来代替了。不过后来听老师说,在英文作文里面似乎对这种人称代词的要求并不是那么敏感。
在写blog的过程中,我经常注意到我会用到第三人称代词。当每次输入“他”后,我基本上都会考虑一下,是不是应该在后面加上“或她”。可能是思维定势的原因,如果不加的话我就感到不是非常习惯,因此总会愣一下;但加上的话句子念起来也实在别扭。每次想到我这种blog小户,应该没有人无聊到找这种麻烦,也就释怀了。
但在台湾节目里,我经常看到不管指代男女,字幕上都是用的“他”。我常常会不习惯,因为不知道说话的人指代的人的性别,所以经常搞不明白说话的人的语气含义。不知道在繁体字的使用习惯中是怎么规定的,但在这种情况下,我觉得女字旁的“她”是提供了语言中的信息的,似乎用“她”会使句子更加明确一点。但作者写起来的问题却令人头疼。
对于“她”字的来历,百度百科上这样说:
“五四运动”前后,有的文学作品也用“伊”字来指女性,如鲁迅早期作品中就是如此。1918年,我国新文化运动初期重要作家、著名诗人和语言学家刘半农在北大任教时,第一个提出用“她”指代第三人称女性。一时轰动全国。“她”字一出现,就遭到封建保守势力的攻击和反对,但却很快得到人民群众的承认、称赞,并被广泛使用,各种字典也都收录了这个字,此事在当时文化界成为轰动一时的新闻。
刘半农创造了“她”字,结束了以往书面语言中,第三人称的混乱现象,从而纯洁、丰富了祖国的语言文字。鲁迅高度评价刘半农的创造精神,说“她”字的创造是打一次“大仗”。
字典上说“她”专指第三人称女性,理论上来说我们今天用的“他”应该是指第三人称人类,而专指男性的应该用“男也”才对。这样一来,我们才可以自由自在的使用“他”。而我们经常被教育说“他”是专指男性的,我们用“他”来指代女性时是冒犯,弄的我们紧张兮兮的。我们似乎把“他”与“她”跟英文中的“he”与“she”联系的过于紧密了。
把这个束缚解开,习惯于使用“他”来表示女性,我觉得是汉语语言与社会的双重进步。
April 28, 2009
过多的留言降低blog的质量
正常写blog的人都希望自己的文章被更多的人阅读。blog留言则是一个非常能说明问题的指标。一般情况下,留言数量越多,blog的质量越高。但后来人们发现,有些异常火爆的blog,留言数量不但没有让blog的质量提升,反而令blog的质量有所下降。
相对于传统的静态网页,blog多出了反馈这一部分。在今天看来,对于一个blog,正文与反馈这两部分都是不可或缺的组成部分。而反馈这一块又可以分成Trackback和留言两部分。Trackback要求使用者自己有blog,鉴于目前blog在国内的情况,Trackback对blog的影响并不大。而留言则显得非常不同了。
作为blog的读者与作者交流的渠道之一,留言的重要性毋庸置疑。但是在今天,这种渠道变得有些堵塞了。堵塞的程度视这个blog的火爆程度而定。举例来说,你在月光博客上看到了一篇非常棒的文章,而且这篇文章激起了你同月光交流的欲望,于是你去月光的blog上留言。但是当你发现月光的每篇文章的平均留言数目在40多的时候,你还相信月光有超过80%的几率看到你的留言并回复吗?月光自己也说过:“回复评论留言和邮件太少。因为每天的评论留言太多,我甚至无法保证看完所有的留言和评论,更无法保证对所有留言进行回复,邮件也是一样,如果把时间投入到这里面,那可真是一个时间的无底洞啊”。而王三表的“不许联想”的文章的留言数目基本上都不下100,则更是如此。
如果仅仅是这样,其实也没什么可说的。虽然确实导致了blog互动的功能丧失,但是blog的客观火爆程度是作者无法控制的事情,这样的功能丧失也算是“幸福的烦恼”。可是我发现,比留言数目更能降低blog质量的是,认真对待留言的人越来越少了。
在上面提到的两个blog里,我们很容易看到很多“不良留言”。比如“沙发”(三表屏蔽了沙发,因此在三表的留言里很少),几乎没有任何意义与作用的留言,相当令人火大,实在不知道留言的人是怎么想的。有些人借此机会提高自己的链接的权值,但blogger在留言页面上加了nofollow标签后就失效了。开始的时候还能看到三表给那些留“沙发”的人回复“沙你妈逼发”,后来留言多了也处理不过来了,三表干脆屏蔽了事。还有一个比较常见的,主要出现在blog正文是非中文或比较长的情况下,“文章太长了/看不懂鸟语”也是一个让人哭笑不得的留言。还有更无聊的,写了一点东西发现没有马上出现在页面上,就怀疑blogger把他屏蔽了,然后一遍一遍的发留言验证尝试,也早就了相当数量的垃圾。
而这些不良留言的产生,我认为根本原因还是一个:我们社会的快餐文化的盛行。快餐文化带给我们的“低投入高回报”的思想,长期下来,使得我们懒于思考,甚至不会思考了。而另一方面,blog的形式极大降低了读者与作者之间交互的成本。许多事情,当它的成本越趋近于零,就越有人去做,哪怕是对那个人一点作用都没有。两方面一加,这种不良留言就这么多起来了。
不良留言的增多是这几年来的事情,因为blog留言系统被人们所认可也是这几年来才发生的。蔡智浩在2006年12月2日发表了一篇文章《部落格迴響的心理分析》,讲了他为什么关闭blog的留言与Trackback系统而使用HEMiDEMi一类的第三方网站来处理留言。文章里上来就说:
很多部落客開放了這項功能,卻忽略了一項關鍵事實:只有少數讀者會發表迴響,絕大多數的讀者都是沉默的。這些沉默的讀者只是不習慣或覺得沒必要發表迴響,未必就認同或反對你的文章或其他讀者的迴響所傳達的觀點。這麼說吧,讀者主動發表的迴響,並無法代表所有的讀者的共識。
因为blog读者不习惯在blog上留言,而且在分散的blog上留言降低了互动,因此蔡智浩把他的blog上的留言推到了HEMiDEMi上了。这是人们在2006年底对blog留言的看法。而这种情况在今天似乎早已经不存在了,人们毕竟会某种程度的接受新事务的,因此在blog上留言已经是很多blog读者的习惯了。
今天看来,我觉得蔡智浩的做法有点“歪打正着”的感觉。排除内地与台湾blog读者文化的差异,如果内地的blogger,比如月光,关闭了他的blog的留言系统,改为用一个第三方工具来收集留言,我相信这里的不良留言数目会降低许多。因为这些系统需要注册,即使不用注册,在月光博客上留言的成本也提升了,这样一来,除非是有比较强烈的交流欲望和确实值得交流的想法,人们不会在上面胡乱留言。不过有鉴于国内的网络环境,国内的blogger们还不能像蔡智浩做的那么放心。
前几日知道了Six Apart的TypeKey,我还没有自习研究,不过看它的后台,感觉似乎有管理留言等类似的功能,也可能可以做到像蔡智浩那样来管理留言。
在有些可以形成圈子的blog那里,比方说ponba的Mind Hacks,平均留言数量在30上下。但即使有的文章的留言在100左右,因为形成了良好的圈子,里面的留言仍然有相当高的价值。比如这篇文章,我在阅读它的留言时,除了那些“坐沙发的”外,我又获得了很多正文中没有的或者没有被强化的信息。但这种圈子成之不易,碰到了算是相当的运气了。
全民自信与全民思考
前天晚上看到zhanghao在Twitter上说:“现在是个年轻人就谈独立思考,就像前几年谈自信一样,都他妈一阵风儿”。当我看到这条时,我愣了一下。可能是因为我不在庞大的中文环境里的原因,我还没有发现有这么多年轻人在标榜“独立思考”。另一点是我想不到“独立思考”相比于“自信”而言有什么坏处,即使是一阵风气,也总比“自信”带来的大吵大闹要好很多。不过“一阵风儿”也确实不是什么好事,因此对于zhanghao说的情况,我也确实想不到究竟是好还是坏。
1 “自信”、“个性”与“思考”的迷思
一直到了今天,这个问题一直在我的脑子里放着。今天到了学校,看了“不许联想”上对黄舒骏的采访,有了一点较为深层的认知。这篇采访里有很多对我触动颇深的观点,虽然有点长,但不失是一篇有“自我提升”效果的好文。其中对这个话题,给我很深触动的是这么一段:
记者:我们在谈论罗大佑、崔健这样两岸比较有标志性的人物的时候,都会说这是一个在集体主义年代里出现的个性主义,在今天一个完全都是个性主义的年代里,反而出不来个性主义。
黄舒骏:我也参与过电视选秀或唱片公司找新人的活动,你会发现现在的年轻人他们很有自信。那你问他自信的理由是什么?他没有办法回答,可是他还是坚信自己很有自信,坚信自己很有个性,非常有个人的风格。那你再问他你的风格是什么?他又答不出来。也就是说——个人、个性、自信变成朗朗上口的一句话,可却是一个没有内涵的形容词。……
相比较黄舒骏提到的现今的年轻人关于“自信”、“个性”的看法,我似乎看到了当今年轻人对于“思考”的情况。但我想先谈一下为什么“自信”这件事能这么的有“说服力”。
首先,“自信”这个词被很多年轻人认同,我觉得不是因为“自信”这个词语本身,而是因为别人都认同。当“我自信所以我成功”、“我自信所以我美丽”这样的话语铺天盖地的席卷我们的社会的时候,当一个想引起别人主意的年轻人在“自信”、“个性”这一个方面上失败的时候,他就会被认为是老土、是没有特色、是平凡。我不知道第一个说“我自信所以我成功”的人有没有总结出“自信”的理由,不过既然这个理由不容易总结,年轻人有何苦去总结它呢?因此,因为自信所以自信、因为结论所以结论这种狗屁不通的思想就被广泛的传播了。
而之所以这些东西能够传播,我想与今天社会的风气有很大的关系。在今天,“快餐式”的文化被普遍的推崇。在这种文化的影响下,人们不再花功夫在一件事情上深究,而是以商业上的“利益最大化”为目标来做事情。既然被问道“自信的理由是什么”的几率很低,不管三七二十一把“自信”这一标签放在自己身上而想用它的利益在商业上是再自然不过的事情了。 而既然这件事情这么符合商业规律,影响青少年的商业文化很容易的就接纳了“自信”、“个性”这种标签,相关的例子有“我的地盘我作主”之类的广告语。
另一方面,目前大陆的社会环境里,“同理心”还没有被广泛的认同甚至被认知。从小到大,我们被过分的要求一致,身体上和思想上都是如此。因此,一旦当我们看到与我们不同的东西,就积极的大加鞭笞,拒绝接受。想想看当我们听到某人是同性恋的时候,我们是多么兴奋的在背后讨论、传播这一消息。因此,当一件事情被流行起来的时候,如果有人不跟风,则很容易的就被看成是怪物。“自信”这件事情,就如“皇帝的新衣”一样,被一般疯狂的传播。
换句话说,“自信”、“个性”在今天的流行,某种意义上其实是炒作的成果。
当昨天的自信换成了今天的思考,相同的事迹又同样上演。在今天,不管你有没有真正的思考,只要你说出“我思故我在”这种话,就会赢得或多或少的尊敬。而这些标榜自己“在思考”的人,有些并不知道“critical thinking”是什么意思。因而,这种年轻人把“思考一词”挂在嘴边也就没有什么可纳闷的了。与“自信”、“个性”一样,“思考”在今天的年轻人身边也是一股“时尚”的风,等这阵风刮了过去,可能还会有另一阵风出现。
2 我们什么时候可以思考思考本身
在构思这篇文章的时候,我在思索“先哲”们对于“思考”这件事情的评论。我的学问实在不是那么的广博,因此想到的曾经给我非常深刻印象的是Perl语言的发明人Larry Wall在“Uncultured Perl: a Subversive Lifecycle”一文里说过的一句:
There comes a time at about the age of ten when suddenly a child doesn’t just think about things, but starts thinking about thinking about things.
我的翻译:在十来岁的时候,一个小孩突然不止是思考,而是开始思考思考本身了。
当时我在读到这一句的时候,内心的触动是无与伦比的。这句话交代的情形,与中国的先哲们探索宇宙的“道”这一抽象的概念如出一辙。可惜在现今的中国社会,我们离这种程度似乎越来越遥远了。
April 26, 2009
我为什么讨厌《于丹 “论语/庄子” 心得》
于丹在“百家讲坛”里的节目是我最不爱看的百家讲坛节目之一。我过去想不出来原因,但就是对她的节目感到莫名的厌烦。昨天晚上和母亲的一番电话里,我突然有了一点明确的感觉,刚才洗澡的时候总结了一下。
我母亲算是半个于丹的fans(也许是全个,但我没见过其他的于丹饭,因此不好说)。首先是于丹的“心得”她几乎都看,还劝我一块看。于丹出了《论语心得》,她在书店看到了就很想买一本,于是最终我们就买了一本。昨天电话里说,之前什么时候她又看到了于丹的书,于是又买了两本,但也没怎么看。我不知道其他于丹的fans会不会在买回于丹的书之后努力研读,不过我猜真正能从头到尾读完的也不多吧。
后来我总结过为什么身边的人只有我不喜欢于丹,结果发现,似乎只有我读过《论语》。初中时教育部推行的“中学生必读文学XX本”时,家里买了全套。其中有一本就是《论语通译》,后来成了我的“厕上”读物之一。那时候我不敢说全部,但我感觉80%的话我都能背的差不多。当然不是按顺序背,而是只要有人起个头,我就能把那一段背诵下来。而里面包含的故事道理则是再清楚不过了。后来看于丹讲的,也无非那样,因此就一点也提不起兴趣来。
相对于“百家讲坛”的其它节目,我就觉得比于丹有意思多了。后来仔细想原因,发现主要是我对他们讲得东西不是很了解。如《三国志》我就没看过,因此觉得易中天还不错;《红楼梦》我也没有读全,因此觉得刘心武说的也有那么些道理。
后来我想到的是,《论语》中的道理就是那么多,就放在那里。其实那些道理在《论语》之外照样看的到。道理有不同的传播方式,而于丹的工作,相当于把道理用《论语》来包装,然后再在观众面前把这层包装给剥开,把道理展现在观众眼前。经过这么一“剥”,原本观众所熟知的道理,则又变得那么“新鲜”了,因此观众觉得从于丹那里学到了新东西。而事实上,“尊师重教”、“民贵君轻”、“平息干戈”的道理我们还不知道吗?只是于丹用《论语》这个你所不了解因而畏惧的东西来狐假虎威罢了。
因此,别人讲的历史与文学我不敢说,但于丹讲的“道理”却是这么回事。我们在看于丹《论语》心得的时候,看的是“于丹心得”而非《论语》。不过于丹的外部形象又适合她去做这个“秀”,她也有这个作秀的能力,而这一点则实在巧妙。因此我觉得,于丹要是想在像我们这种人身上再捞一笔的话,出一本名叫《于丹“于丹‘论语’心得”心得》的书来教给我们怎么作秀,应该会大卖吧。
April 25, 2009
全民blog時代不靠譜
最近幾天思考了一些關於blog現狀的話題。今天上午在Google Reader上看到一篇文章,題目為《博客已死;博客长存》,文章結尾說“以往的静态博客确实将要逝去,但又将通过WordPress以实时的社会化媒体个人门户的姿态重生。博客已死;博客长存。”
我倒是覺得blog一直好好的,沒有死也沒有活。只是在前幾天很多人都認為的誇大了blog,使之成為了泡沫。而一旦泡沫破裂,人們變感覺過去別人吹出來的東西(也就是blog)死了。事實上,blog一直在那裡,不為堯存,不為紂亡。
在那些炒作聲中,“全民blog時代”似乎是最響亮的一個。這部分的促進了BSP的繁榮與今天荒廢的空間增多。今天來看,“全民blog時代”是那麼的不靠譜,而在那個年代卻是那麼的有說服力。
不靠譜是為什麼呢?舉個例子來說,blog就好比絕世神兵,擁有了它,一個武功高強的人可以錦上添花,而一個沒有武功的普通人也只能更迅速的宰殺一只雞而已。blog是非常好用的兵器,因此一個善於寫作的人,可以更迅速、更輕松的發表自己的見解。這也解釋了為什麼到現在還在更新的blogger多數屬於媒體行業的精英了。
因此,想要寫blog,就要在線下就能寫出漂亮的作文,而且不止是一篇兩篇。金色葡萄在我的blog上的留言我很贊同:
其实还有一个写作难度的问题。并不是每个人都有足够的能力定期写出几百字的文章放在blog上的。如果把blog比作写作文,那么twitter相当于造句。门槛低很多,用户也就多很多。
目前多數現實中的人們的語言水平,都已經不足以寫成一篇文章了。從高考之後,還有誰再認真的寫過作文?誰又在高考前夕非常痛恨寫作文?痛恨寫作文的人,不可能寫出可以閱讀的blog。這一點是“堅持”、“毅力”以外的事情。
附:用Google搜索“全民blog時代”的結果:http://www.google.com/search?hl=en&safe=off&client=safari&rls=en-us&q=%22全民blog時代%22&btnG=Search
三周里总结的Movable Type的问题
上次换网站的虚拟空间后,发现不知道中间少弄了哪一步,当时blog的1024px模板的侧栏不见了,去了页面下方,就像没有了css的效果。那个模板虽然不是我自己写的,但我当年也做了不少格式上的微调。我没写过PHP,因此对模板的改动也是现学现用,用了就忘,两年后早就忘了当时改了什么了。于是我那时就把blog程序换成了MT,主要想再学习理解一下另一个相当著名的blog程序。转眼三周已过,我在中间也写了不少文章,也发现了MT的一些缺点,总结如下。
1 上传程序会“创立页面”
这是目前发现的最严重的一个问题。左边的截图就是我目前页面侧栏下方的截图,里面的关于我下面的uploads、2007、2008、06就是MT的上传程序给弄出来的。MT的上传图片窗口里,在Upload destination那一行的最右边有Choose folder链接,点击后就会出现下面的窗口:

最早的时候只有根目录,我在点了根目录右边的绿色的加号后,可以建立新目录。当我建立好了目录结构之后,却发现侧栏下方的的Pages部分已经多出来了这么些东西。我去后台检查MT的模板,发现页面里的项目都是迭代生成的,数据库里有这些东西,就生成了。因此无法在模板直接改。MT的数据库,我目前还不怎么敢动它。因此也一直没有解决这个问题。
2 Basename的自动控制
MT后台写文章页面里有Basename的设定,就是WordPress的slug,也就是这一篇文章的URL最后的部分。MT默认不让你修改,而是自动生成,因为怕你不小心把两篇文章设定了同一个Basename。如果要人为编辑Basename,需要点击一下右边的小锁。不过我觉得只有把所有的文章都发布在同一个目录下的blog才会有这种问题,不过他们多半不会自己设定Basename,而是用数字或者前缀来防止冲突。而像我的blog,我把URL格式设定成“/年/月/Basename”,而一个月里写两篇相同的文章又把文章的Basename设成相同的几率小之又小,因此这个锁定对我不适用。我记得我在2007年末用MT创建过另外一个blog,好像是可以设定成不锁定Basename的,不过这次没有找到选项。
而显而易见的是,MT对中文的理解并不足以自动的设定相应的英文或拼音basename,因此MT的策略是忽略标题里的中文,有英文或数字的话就只取其中的英文与数字;没有英文或数字的话就留空白,到时候生成的是post1之类的地址。因此手动修改basename就是我每次发布文章的必须动作了。
锁定本身不是问题,对我来说,不过是要多点一下鼠标而已,但讨厌的一点就是MT居然“不依不饶”:如果我在设定了basename后又改动了标题,basename就又变回去了。这实在是够弱智的行为,希望MT的下一个版本能改动吧。
3 后台字体太难看
MT可能从来没有对中文进行过优化,因此默认的MT的中文字体是相当难看的,不管是页面还是后台。CNBlog: Blog on Blog是一个时间比较长的blog,用的和我一样是Movable Type 4开源版。它目前的blog页面用的就是MT的默认页面,字体相当不适合中文。
后来我把blog的风格设定成随机附带的几个风格之一──Unstyled,也就是没有任何格式,页面的字体变成了系统设定的Serif,在中文里就是宋体,字号也大了,因而更好看了。后来我学着修改了一下页面的CSS,字体的设定直接从蔡智浩的stylesheet里复制了过来:font-family: Verdana, Arial, Sans-Serif;。Sans-Serif在中文里对应的是黑体,在屏幕上阅读更清晰(这也就是微软把Vista的默认字体从宋体换成雅黑的原因,苹果很早就有的丽黑字体显示我的blog也相当漂亮)。
页面还好,MT后台的编辑器里的字体就相当丑陋了,在firefox里编辑是还会出现有些字符变窄的情况,因此我一直都在Safari里编辑,因为字体相对好一点。但好也只是相对的,编辑区里同样也是一片重一片淡,相当影响写作的情绪。下面的图是我后来截取的:

标题里就是过去字体的情况,而正文区的字体已经改过了,可以明显看出不同。我把上面那行设定字体的CSS放到了/MT/mt-static/css/editor/editor.css的.editor textarea部分里,正文的区域就变成了截图里的样子。而标题区的字体设定我还没有找到,不过影响不是很大,我暂时就没有再管它了。
以上三条就是我在使用MT 4.25版本中遇到的问题。其中第一条影响最大,第二条影响较小,第三条已经基本解决。另外还有昨天我在学校机房的系统下用IE7打开我的blog,发现footer居然不见了。IE7号称兼容性较好,也出现这种问题。不过我也不打算修复它了,像标准靠拢是王道。
另外,默认情况下MT发给我的邮件里的中文都是?,大概是sendmail的设定问题吧。我还没有找到解决方法。
April 24, 2009
昨天偶尔遇到的事情
已经想不起昨天我是怎么看到这篇文章了。作者孔令春对我在2007年对他做出的评价发出了疑问。我曾在2007年7月20日左右在Twitter上说了一句“孔令春学习网,纯粹一个抄袭网站。虽然聚合了一些好文章,但确相当可鄙。”,当时我的blog上装了twitter-post这个插件,自动把当天的twitter条目整理成一篇文章,发布在blog上。然后2007年11月份,孔令春在他的百度空间上的文章如下:
维护这个博客也有一段时间了,每次的评论朋友们都说不错,很有帮助!所以才得以支持到现在.
可是今天在百度搜索时无意中看见一位朋友的评价,感触很多!不错,评心而论,这的确称得上是一个纯粹的抄袭网站,因为本站的80%的文章都是转载,我也曾经一再声明过,本站文章不全是自创,有的因原创作者没有要求,有的是因为根本不知道作者是谁,所以大多数并没有标明。
之所以这么做,是因为建这个博客的最初目的是为了保存那些曾经看过的好文章,(当时我还没有自己的电脑),因为我是学计算机的,有很多文章并不是看过就能记住,就能消化和领会的,所以碰到好的文章通常都想保存下来(以前每次保存都是通过邮箱,好麻烦的)。后来经过朋友推荐才来注册这个博客的。
可令我没有想到的是,保存了几篇文章之后,居然会有朋友来访,而且最高日访问量居然达到了508,这使我非常高兴,于是渐渐的便维护起来了,目的也没有变,还是看到好的文章便传上来,便于以后慢慢研究,同时也为一些志同道合的朋友能够分享。
虽然多次告诉自己无须在意,可是心里还是不是滋味,这么做真的那么可鄙吗?
当时我在Twitter上说了以后就没有继续关注,不知道又出了这么一篇文章。昨天我大致看了一下他的空间,那些文章基本上都有了来源链接。如果我今天第一次看到了他的空间,我应该不会这么说了吧。
我一直很反对转载,不过对于目前国内“猖獗”的形势,我估计也没有什么脾气了。可能我在三年前还比较冲,因此说出了“可鄙”这种词,今天的我大概不会说的这么直接了。无奈的是不同于盗版,很多人到今天仍然在意识上认为转载是对的。我觉得大概是新中国以来的教育导致人们更倾向于自我的利益,而不是整体的利益。今天就简单的总结一下自己的想法。
对于转载的坏处,了解一下“囚徒困境”就能看出来。囚徒困境认为,当一个坏人到了好人的世界,因为好人没有保护自我资源的意识(或必要),会无限的夺取好人的资源。结果是要么好人变成坏人,要么好人就死掉。在经济学领域里有“劣币驱逐良币”的说法,放在blog转载的例子里一样是成立的。当一个人的blog总是被转载时,到了一定程度上他就会选择放弃继续写了。转载者可以想象一个类似的情况:你开车去上班很舒服但不环保,你坐公交车则环保但不舒服,你不开车有别人开车,也不差你一个。但就是这样的想法会导致有更多的人选择开车而不是坐车,直到再次有事情引发人们的环保意识的时候才又开始了新一轮的循环。
孔令春的做法,我看了他的文章后可以理解。不过我也在下面留言回复了我的想法:
今天偶然看到了这一篇,没想到07年在Twitter上的一句话居然能被你看到。我都忘了当时是因为什么这么说了,不过今天再看了一下,我的态度还是一样,不过不会用“可鄙”这样的词。有些文章并不禁止转载,你也可能找不到出处,不过一个链接是应该放上的。可能我当时是因为这个原因而这么说的。
学计算机的不会用del.icio.us,应该是国内计算机教育的可悲吧。我理解你的出发点是好的,但我觉得作为一个“业界人士”,至少该做点有技术的活计,比方说Yahoo Pipes之类的聚合,要比弄个blog转贴别人的文章好多了,也省力多了。你是学计算机的,我相信你不会不懂转载的缺点。
他为了自己收集文章而做一个公开的blog复制,然后又为了与别人分享而继续转载。这种分享的态度是值得赞赏的,他为了维护这个非盈利的百度空间也确实付出了劳动。同时让我觉得惋惜的是国内的计算机教育教给学生计算机知识,却不会教给学生正确的使用计算机工具。我在国内的时候,学校里学计算机的学生总给人感觉是那么的落后。我觉得像del.icio.us这样的工具放到大学一年级来教都有点夸张了,不过国内已经落后的太远了,现在国内用del.icio.us之类的在线书签工具的人也没有多少。Yahoo Pipes之类的RSS合烧就更别提了,因为RSS还尚未普及。总之,很多国内大学培训出来的“IT民工”、“码农”给人切切实实的“民工”、“农民”的感觉。
计算机在国内给很多学计算机的人的感觉就是赚钱的工具,我也遇到过很多同学要学计算机,因为很多“富翁”都是搞计算机的。而计算机自动化给人带来的便利则丝毫不见,眼中只有钱这一点。计算机的种种伟大之处成了生钱的工具,这种功利化的想法让人很惋惜。
April 23, 2009
要认真写blog就要付出一点
这是今天在看“老白说真话”上的文章《丧失了表达欲》时突然想到的。而标题里所谓的“付出一点”,说白了指的不是别的,其实就是“孔方兄”。这个想法虽然不一定能让别人认同,但我现在感觉很有道理。
老白的那篇文章里面的一句话我特别赞同:
某个人之所以写独立的blog,最真实的目的是想贡献出一些别处没有的思想、观点、看法。而且,这些是发自内心的。
当时我一看,“别处没有的思想、观点、看法”,这不就是我之前说的“blog要‘以我为尊’”么。这是我所理解的blog的目的。而没有属于自己的上面那几项东西的,blog是写不长的。而我在上一篇文章里说的情况就是如此。
这时候我就想到了一个问题,“为什么独立blogger就不太容易荒废呢?”我觉得老白的话部分的解释了这个问题。独立blogger不是免费的,虽然花费不是太多,但至少是要付出一些成本的。在今天的环境下,做一名独立blogger的成本并不是很高。买一个国际域名每年花费人民币80元不到,合租一个国外空间,平均每人花费每年不到100是可能的。而200元对我们来说,平常的情况下多久会花完呢?也就是几次肯德基的价格。
而这点成本,足以对一个blogger的思想、观点、看法做出考验。如果这些不如何强烈,自己不觉得多么有价值,正常人是不会付出这种成本的。另一方面,也有一种情况有可能发生,就是架设了独立的blog,也写了几篇文章后,就感觉思想、观点、看法写完了。在BSP的blogger也会遇到这种情况。BSP上开设blog几乎没有成本,因此很容易没有可写的就停止了写作;相反,独立的blogger付出了成本,一般不会看着自己血汗钱买来的域名空间就这么荒废了,于是就强迫自己思考,算是逼着自己进步了。
有感于今天互联网上遍地都是的荒废blog,我觉得让BSP收费是不错的方法,就像TypePad那样。每年征收200元的费用,如果有人买的话,集中起来管理主机,BSP的利润率是相当高的。这样的好处有二:一是收了费能提供像TypePad一样的服务,就已经比国内的BSP要好太多了;二是blogger付出了成本,不会买了服务就让钱打水漂,如果不是真想要写blog,也不会注册一个没有内容的blog帐号就让它荒废,起到了过滤作用。
而目前BSP这样免费政策,我觉得对blog荒废是一种促力。今天想到,如果一件事情的成本趋近于零,哪怕它不会给人们带来任何意义,人们也会不由自主的去尝试一下的,这大概是心理学的什么问题。如果按一下公共场所的防火警报开关不会有任何事的话,我很可能会真的尝试去按按它。而写blog也是如此,很多人不是真得想有一个表达的渠道,而只是想看看blog是什么东西,因此我们才会有这么多不超过5篇文章的blog。
在Web1.0的时代,我们很少会看到这种情况,就是因为有成本给限制住了。其实有时候事情有了成本未必不是一件好事。
===================
写这篇文章之前,我在网上搜索了一些关于独立blogger的文章,罗列在下面:
另外,今天下午看到的王建硕在2005年写的《喜欢有之,还是喜欢用之》,文章非常棒,也从一个侧面解释了那些乱建blog的用户的行为。
Blog在我的身边没落了
今天清晰的感到我周围的人不爱写blog了。
意识到这一点已经很长时间了,但今天真正让我感到详细的感慨。起因是我看到了“憂鬱馬戲團”的一篇Movable Type教学文章《Blogrolling 使用教學》。Blogroll我一直以为就是blog页面上的友情链接,给blogger们建立关系用的。而Movable Type貌似没有默认提供这个功能,所以要花一点功夫自己来修改模板。看到了文章后,我就在想我要不要也弄一个,然后才意识到我不用Blogroll好久了。
两年前,不管我是在BSP上写blog,还是在独立空间上写,总会记得把身边好友的blog链接加上去,这似乎是建立blog后的第一件事。那时blog在国内还很热,所以当有同学知道我也有blog后,就赶紧要跟我交换友情链接,就像两个人热衷于交换QQ号一样。尽管有的blog以我当时的眼光来看没有任何用处,纯属幼稚的垃圾,但毕竟是一层关系,我也就加了。不过我那时在网上认识的人不多,因此友情链接固定后就没再怎么变化。这种情形似乎持续到上次我的空间被攻击。那时我的空间上的东西都丢失了,因此我的blog也是重新开始的。似乎从那次我就没再怎么设置过友情链接。有几个我是直接能默写出来地址的,我就直接给加上去了。
这次换了Blog系统,Movable Type的设置里一直没有这个功能,我也就一直给忽略了。今天想起来后,想了一下,发现我根本就不必加友情链接了:要加的那些几乎很早就不更新了。也许是因为Twitter的冲击,blog这种东西在我的身边没落了!
我不禁有些伤感,细想原因:一是大家都忙了,可能平时没有精力再在网上维护自己的那一亩三分地;二是新鲜工具的冲击,Twitter把大家的写作欲望都一点一滴的化解掉了,而目前blog这种东西上的文章毕竟不如在校内上发一篇流传的快。不过从“大局”来看,这未尝不是一件好事:有些人的blog本来就不是因为他想有一个表达的渠道而建立的。大概三、四年前,由方兴东起头,国内开始炒作blog。炒作本身就是把一件事物的价值过分抬高,因此导致在那时你要是没有一个blog就是落伍的表现。很多人注册了帐号,更换了模板之后才发现根本不知道要写什么,于是结果有二:好的一点就是不管它,任由那个帐号荒废;不好的一点就是去网上别人的blog上搜刮,把文章搬到自己的空间上,满足一下自己的虚荣心。而我一些同学不在关注blog,把精力放在更有用的地方,也不会对blog圈带来不好的影响,应该是一件好事啊。
可能是由于环境的原因,我一直觉得blog在我身边算是“精英”文化,而不是新浪鼓吹的“草根”。身边屈指可数的blogger就体现了这一点,而真正写出点有用的东西的则少之又少。反正到现在,我身边一直没出现过大面积开始写blog的情况。可能跟我们这一代与blog热潮相遇的时间点有点关系:blog火的时候,大家忙于学业,没有心思写blog;而到大家上了大学,有了点时间,校内就基本上取代了blog。因此我反而觉得blog是“精英”,校内才是“草根”。
这与我在国外的感觉也很相似。我的加拿大同学很少有写正式blog的。虽然也有很多人没听说过Twitter,但有些我觉得应该写blog的都去Twitter了。另外就是Facebook非常盛行,基本上是大学生必备配备,直有“民间学生证”的感觉。反正国外的新奇玩意远比国内丰富,老外不愁找不到blog的替代品。
放眼国内外,我能想到的blogger们都属于精英型的,国内的比较知名的三表、徐宥之流,都是在相关领域有一定影响力的,其它的一些驻于新浪之类的blogger的声音都很微弱,形不成气势。总之,我感觉blog热潮算是过去了,经过“草根”群众的实践,blog这种东西并不能帮助他们表达生活琐事,于是纷纷投入SNS网络,而blog则成了“精英”的表达工具。
注:本文中“草根”的解释参考新浪,“精英”指的是一直坚持blog写作的人们。由于找不到合适的词,只好用低俗解释来代替。
又:刚刚看到了“老白说真话”上的一篇文章《丧失了表达欲》,里面的一段话让我相当认同:
某个人之所以写独立的blog,最真实的目的是想贡献出一些别处没有的思想、观点、看法。而且,这些是发自内心的。
为什么独立blogger不容易荒废?很有启发。
互联网上,没有人“不”知道你是一条狗
左边的这副“在互联网上,没人知道你是一条狗”漫画(详细描述请见维基百科上的页面),在过去非常有名。我第一次见到这幅漫画是在小学五、六年级的时候。当时在报纸上见到之后,觉得非常新奇,也确实把互联网的感受给描述了出来。尽管我当时并没有接触过互联网,对互联网也不怎么着迷,但总觉得当时隐隐约约的就感受到了互联网的好处。后来初中后才尝试了互联网,当时并没有很快速的连接,网络上新型的互动服务也不是很兴盛,而IRC之类的传统工具还不是那时候的我有机会体验到的。那时对网络最大的兴趣就是能下载很多软件,那时我读的《电脑商情报》上有推荐软件的专栏,我那时开始收集软件的下载链接,一有机会就弄下来试试。
后来似乎是一瞬间的事情,Web2.0就开始兴盛了。互联网用户一下子从网络的读者变成了网络的作者。用户提供信息在近几年讨论的很激烈,blog、Twitter之类的工具也给用户提供了相当便利的渠道。一下子用户的信息都跑到了网上。过去想了解一个人要靠人脉打听,现在只要把他的信息输入到搜索引擎里,总能弄到点东西。
从blog到Twitter,我认为两者间有了很大的进步。表面上从技术上来讲两者的差距并不大,甚至说从根本上就是一样的技术:blog的文章限制在140个字以内不就是Twitter了吗?但是从文化上确实实实在在的进步。我过去说过,从发布信息的成本上,Twitter大大低于blog。因此,Twitter上的信息就有了更琐碎的感觉,而不是像blog那样相对与正式。Twitter相对与blog的另一个更重要的有点就是更新迅速。即使我们愿意在blog上发表一篇一篇的140个字母的关于自己的宠物的信息,但显然我们不会在几分钟之内就更新三、四篇。Twitter的时效性使得我们了解一个人变得更加容易,越来越带来了人们对于个人信息安全的重视。
我们在伦理课上讨论过这个问题。人们对于个人的信息安全,并没有太多的不安全感。但是对于在网络上随意的就分享自己的信息,而不管认识不认识、熟悉不熟悉的人们都可以看到,总觉得有点不对。但具体是哪里不对,还没有很明确的论断。Kevin Kelly曾经在TED上预测过5000天以后互联网的情形,他说的情况更极端:我们忘了某个人的电话,直接去网络上搜索就行。他的结论是互联网就像是《Matrix》电影里的Matrix,也就是“母体”。人们都是母体的一部分。如果一个人愿意游离在互联网之外,那他们就像是Neo那群人一样,脱离了主体社会。
今天看到月光写的一篇文章《Google地图位置服务Latitude登录Orkut》,又提到了Google Latitude服务。这项服务比Twitter又进了一步,用户不用主动更新自己的状态,工具自动就替我们完成了我们地理状态的更新。用户在不自觉的状态下就被别人了解了更多。Google Latitude让用户自己选择把地理信息与谁共享是肯定的,但今天的互联网用户从心理上就不介意与别人分享更深层次的隐私。昨天我就收到了月光在Google Latitude给我的邮件,说是他的位置在深圳某某处。我估计月光是直接给他所有的Google Talk联系人都发了分享。而这种“不介意”的心态也就是互联网的伦理学讨论的一部分。
提到这件事,倒是很难说它是好还是不好。总之目前一个事实是肯定的,就是:互联网上,没有人不知道你是一条狗。
April 22, 2009
对脚本语言的感觉
今天上午考完了《面向对象》这门课,往后一段时间就不用再接触继承(这还好)、Shadowing、Refinement、Overloading之类的概念了。相对来说我还是更喜欢可以快速开发的脚本语言的。
我们这门课接触了三门语言:Java,C++,和Ruby。纵观每次作业的代码量,Ruby是最少的。里面Java用的多,感觉还好。C++里面那些C的东西就太讨厌了,指针啊什么的传来传去,自己回收对象也容易犯错。编译器对包的控制也比Java落后,不像Java那样可以搜寻CLASSPATH里的类,而必须要自己来控制#include。总之,再怀念一次脚本语言。
我目前比较熟悉的脚本语言有四种(可能不严谨):Python、Perl、Scheme、Ruby,这个顺序是以我的熟悉程度来算的。之前也有花大半天时间来从零开始用PHP来写网站的,不过以失败而告终,我的眼还没有练就在一堆HTML tag里看出PHP语言的逻辑的境界,因此可以忽略。正好一门课告一段落,今天就记录一下我对它们的看法。
Scheme是我最想学好的一门。理由很简单,单就SICP在计算机界的地位就已经足够了。我买过裘宗燕翻译的中文版,也下载过作者放在网上的讲课视频,不过都没有什么精力自习看。其实Scheme很简单,这也是我喜欢它的原因之一,区区50页的R5RS对我很有吸引力。而且因为如此,要想查找一个什么函数也就很简单,因为实在没有太多需要查的。但Scheme蕴含的思想,也就是SICP里的东西,我还没有领悟。
我上学期用Scheme的次数比较多,那门“科学计算”课上的作业我没少用Scheme来写。奇怪的是我虽然不是很熟悉它,但我写的Scheme程序很少有错误,不知道是不是因为它的括号语法让我写起来必须要加倍小心的原因。另外一个因素可能是它的交互式环境更方便调试,我在上学期的“编程语言概念”课上用J语言的时候也很少犯错(不过J的语法我估计现在已经忘了)。
我机器上一直有scheme48。我遇到要进行数值运算的时候最喜欢用Scheme来作为计算工具。Emacs结合Scheme运行起来很方便。
Perl语言是我学的第一门脚本语言,因此我对它的感情很深。我的Perl入门读物是《Perl语言入门(第三版)中文版》。那本书翻译的相当不错,原作中幽默的笔调,译作中完全体现出来了,因此它是我那时候的厕上读物之一。可以说这本书打开了我对脚本语言喜爱的感情。不过那时候学习忙,没有时间实践,我多数时间是凭空看书,在脑子里空想。不过奇怪的是反而印象深刻。后来出于对Perl的喜爱,又去买了厚厚的“大骆驼书”──《Perl程序设计语言》。不知道是不是因为这书太厚还是因为翻译的问题,我读这本书的前半部分时感觉非常枯燥。因此我后来只看后面的专题部分,如POD、调试、C语言接口之类的。
Perl对语言格式的思路我非常喜爱,TIMTOTTDI。它衍生出来的种种Perl艺术也令我相当震惊。不过我对自己写Perl诗没有什么兴趣。不过因为学了面向对象,写了很多很长的程序,现在养成了把代码弄的很整齐的习惯,结果Perl代码我也是写的比较易读。
最近因为用了Movable Type的原因,我又拾起了Perl。处理HTML、XML的两个小脚本来获取dict.cn的翻译和Twitter到校内同步的工具我都是用Perl写的。期间有一种感觉,似乎Perl的实现比Python来的简单,更贴近于C。比如写往校内上修改status的时候,用Python怎么试都不成功,后来是用的Perl,就是因为对Python的字符串还不甚了解。另一个感觉是Perl更容易结合其它语言,而Python似乎更容易在自己的内部来工作。
我对Perl的负面感觉是没有交互式的界面。我用Python写程序时离开了交互式环境就没有什么思路,一定要先试验一下再整理初代码。写Perl的时候虽然不这样,但有时总感觉不方便。另一点是目前网上的中文Perl资料越来越少了,而且都不是很新。国内程序员追逐的风气在几年前就往Python移动了,近几年大概都转移到了Ruby上了吧。还有就是我用Python写多了程序后,再写脚本都容易忘了在句子的结尾写分号……
我学Python的时候有点障碍,当时看的是一本《Python宝典》,怎么也看不下去。当时冷静想了一下是因为看Perl太久了,对Python不习惯。后来出国以后我再逼着自己看《Dive into Python》,才可以开始使用Python。后来对Python熟悉之后就喜欢上了Python,不过对于Perl的感情还是无法取代。当时看了《Dive into Python》里处理HTML那一章后,在2007年圣诞那会写了段Python脚本来获取RubyConf 07的演讲视频,感觉不错。
不过我经常感觉Python有点“超出掌控”的感觉。经常会出现摸不着编辑的错误,尤其是字符串方面,弄的我挺郁闷。似乎相对与Perl,离C之类的低级语言更远了,因此也导致我不熟悉。另外,Python的面向对象机制我还没学通,因此Django之类的代码框架我就不大在行了。
我知道Ruby还挺早,记得高中时看过《程序员》上有文章介绍Ruby。当时的印象就是“日本人发明的语言”、“一切都是对象”。那时没有深入的接触Ruby,也没有想到后来RoR能如此之火。后来想用Rails写网站的时候看了一部分Ruby,感觉就是代码挺诡异(我觉得比Perl要诡异的多)。后来这门“面向对象”课上老师用Ruby来解释动态语言的面向对象机制,我算是多接触了一些Ruby,并用它写了此作业。不过这次的学习只是学Ruby里面关于面向对象方面的机制与语法,Ruby里面那些诡异的语句我还是不明白。
April 21, 2009
从Twitter更新校内状态成功!
继续上篇文章,紧天吃午饭的时候觉得那里说的两种方向都不太容易解决。Python的那个最诡异,实在不知道是哪里的问题,而且Python那个脚本,用了几个库,好像我目前手上能用的虚拟主机上(Dreamhost和SDF)都没有;Bash的那个,我实在是不想把目前的宝贵时间花在学习一门新语言上。然后就想到了我过去最喜欢的Perl,既然它被称为是一门“粘合语言”,应该在里面可以直接调用yegle写的wget语句,而且前两天用Perl写过海词客户端简化版,里面就用了正则表达式来处理了HTML。相对与海词的那个排版混乱的HTML输出,Twitter给的XML可简单清晰多了。
我不知道Perl里怎么解析XML,不过Twitter的XML很简单,我几下就弄出了需要的最新的tweet文本和那一条tweet的时间。然后用yegle的wget语句提交,一下子就成功了。然后就发现了一个困扰了我长时间的问题:如果tweet里面是中文,就无法提交(实际上是提交了一个空信息)。然后让程序打印初那条tweet的文字,发现都成了写;这样的东西,然后就到处研究怎么把它转换成正常的文字。后来从这里知道了需要用HTML::Entities来处理(代码里第38行)。做了这一步后那些wget语句就又好使了。
结下来就是隔一段时间就运行一下这个程序了。cron似乎是我第一个想到的。还有一个方法就是在Perl脚本里用循环,不过这样似乎有点不妥(具体怎么不妥我没有自习琢磨)。我的MacBook虽然基本上保持开机状态,不过把它放在24小时运行的网上的虚拟主机上似乎更不错。我目前有两个虚拟主机帐号,一个是Dreamhost,一个是SDF。结果两个都有问题:Dreamhost上的wget版本太老,不支持命令行里的那些session、cookies功能;SDF则不让我用cron。SDF的问题不大好办,似乎cron是它们专门的用户帐号才能做的,我目前的ARPA帐号不在此范围。我只好试着下载wget的代码在Dreamhost上编译。结果出乎我意料,居然编译成功了!我过去在不是本地的主机上编译软件通常是以失败而告终的。用了新版本的wget,程序就运行正常了。设定好了cron(我让程序2分钟运行一次,查看了Dreamhost的wiki上关于cron的说明,没有提到有什么限制),程序运行OK。
这时还有最后一个问题没解决:如果让这段代码隔一段时间就自动运行,那么如果在这段时间里面没有更新Twitter,那么校内的状态会被不断用同一条tweet刷新。这也是我要保存最新tweet的发布时间的目的。我用的方法是把这一条tweet的发布时间写到一个磁盘文件中去,然后下一次运行的时候比较两个时间,如果两个时间不同,就运行发布的wget命令,然后更新磁盘文件,否则就退出程序。我不知道有没有更好的解决方案,不过我的方法目前还可行。
最后就是把代码贴出来了。我整理了一下,把用户名、帐号、磁盘文件、还有wget程序的地址都弄成了变量,放在代码最前面以方便设定。完事后看起来还不错。
02
03 # Twitter -> Xiaonei status sync tool.
04 # Author: Feng Liu <liufeng@cnliufeng.com>
05 # Version: 1.0
06 # Date: Tue Apr 21 23:06:40 +0000 2009
07
08 use utf8;
09 use Encode;
10 use LWP::Simple;
11 use HTML::Entities;
12
13 ####################### Settings starts here #######################
14 # Set your base account information here. Don't show this to others!
15 my $twitter_account = '';
16 my $xiaonei_email = '';
17 my $xiaonei_passwd = '';
18
19 # some machine's wget is too old, so you may need to rebuild a newer
20 # version and indicate the path of your own wget here.
21 my $wget_cmd = 'wget';
22
23 # The program needs a log file for keeping the time of your last
24 # tweet. Otherwise you may get your xiaonei status updated to a same
25 # tweet. So please keep this file!
26 my $logfile = '/tmp/twxn.log';
27 ######################## Settings ends here ########################
28
29 my $twitter_url = 'http://twitter.com/statuses/user_timeline/' . $twitter_account . '.xml';
30 my $statuses = get($twitter_url);
31 my @lines = split /\n/, $statuses;
32 my $latest_text = $lines[5];
33 my $latest_time = $lines[3];
34
35 if ($latest_text =~ /<text>(.*)<\/text>/) {
36 $status = $1;
37 };
38 $text = decode_entities($status);
39
40 # If the log file doesn't exist, create a new one.
41 if (!(-e $logfile)) {
42 open LOG,"> /tmp/twxn.log" or die "ERROR: Cannot create log file.";
43 close LOG;
44 print "Created a new log file: $logfile\n";
45 }
46
47 open LOG, "< $logfile" || die "ERROR: Cannot open log file!";
48 $last_time = <LOG>;
49 close LOG;
50
51 if ($last_time ne $latest_time) {
52
53 my $login_cmd = $wget_cmd . ' --no-proxy -O xiaoneilogin.log --post-data="email=' . $xiaonei_email . '&password=' . $xiaonei_passwd . '&autoLogin=true" --keep-session-cookies --save-cookies=xiaoneicookie http://login.xiaonei.com/Login.do';
54
55 my $post_cmd = $wget_cmd . ' --no-proxy -O xiaoneipost.log --post-data="c=' . $text . '" --keep-session-cookies --load-cookies=xiaoneicookie http://status.xiaonei.com/doing/update.do --referer=http://status.xiaonei.com/getdoing.do';
56
57 system($login_cmd);
58 system($post_cmd);
59
60 open LOG, "> $logfile" || die "ERROR: Cannot open log file!";
61 print LOG $latest_time;
62 close LOG;
63 }
校内状态更新有进展
不愧是水木的Linux版主,yegle直接用wget就能成功的修改了校内的状态。不过话说wget、curl这种看似不起眼的命令行工具还真是牛屄,man了一下yegle的代码里面wget的参数,感觉我过去只把wget当成一个下载软件只是大材小用了。
我测试了他的代码。刚开始的时候一直不能成功,后来经yegle在Twitter上指点后也成功了。只是不会更新“目前”的状态,而是修改的“目前”的上一条状态。换句话说,目前的状态显式“什么都没做”,但从个人主页上可以显式状态被修改的历史。
这已经相当程度的解决了问题了。我对用shell处理xml还不熟悉,不能做到一直在后台更新Twitter的消息,有待以后研究。或者再继续修改那个Python脚本。要么就干脆结合Python和Bash,也可以解决问题。
另外,关于上一篇文章中的问题,我昨天回家就给python-twitter发了issue,今天早上看到有人回复,原来从今年四月8日开始,Twitter就不在http header里面支持since参数了,真是很奇怪。另外,发芽网的半瓶墨水回复了我的邮件,给我了一篇“鼓励性”的邮件……
April 20, 2009
被Python字符串弄崩溃了
受发芽网上的一段“校内网发帖机”的启发,最近想修改那段代码,让它可以部分的实现Twitter状态和校内网同步。之所以说“部分的”是因为我不知道怎么样让它像Facebook的Twitter插件那样Twitter的消息发送完毕后几乎同时(相差不到10秒钟)把Facebook的状态一并更新。另外一点很惭愧,就是我对HTTP编程不熟悉,目前还找不初修改校内的状态要提交的代码,只能修改一下原来的代码,在写日志上面做文章。
就算这样,也还是遇到了不少问题。我目前的打算是像过去WordPress上用过的一个插件,名字大概叫twitter-post那样,总结一天的Twitter消息,成为一篇文章,发送到校内上去。我开始用的是python-twitter这个包,很方便的就能弄到Twitter的消息。不过在它的GetUserTimeline()方法的说明中说到里面有一个since参数,提交一个“HTTP-formatted time”,就可以获得从那个时间点以后的消息。我觉得它应该能让我获得前一整天的所有消息,虽然需要做点处理,删除今天的消息。但这个“HTTP-formatted time”我实在是不知道是什么东西。昨天下午几乎找遍了我能从网上找到的所有表示时间的格式,怎么测试,它都只给我默认的最近20条的消息。可笑的是,python-twitter的代码里有test可以运行,而里面测试since参数的用例里用得Twitter帐号居然总共才不到10条tweets,这样GetUserTime()返回了所有的tweets,当然都是他要的时间段的啦。没办法,我只好去它的Google Groups里发问,结果今天居然找不到我提交的帖子了,难道是开发者觉得我是捣乱的?!!
既然这样不行,只好退一步先把能获得的最近20条tweets一并发上去,先看看效果再花功夫自己来解析前一天的所有tweets。结果很快写出了代码,但测试的时候却不行了。那段代码,我在程序里输入什么样的文字都可以正常发送,但自己从Twitter那里获得的文字就无法发送。Python一点提示都没有。我不光试验了python-twitter API给出的结果,还自己抓取了Twitter给出的XML文件自己parse,得到的结果也无法发送。我让两个程序在提交前输出提交的字符自己来比对,基本上都是一种格式的。简直快疯掉了。
接下来该怎么办?我目前只想到:
继续骚扰python-twitter,谁让他给出的测试用例中有问题呢?
像那段发布“校内网发帖机”的半瓶墨水虚心请教。
昨天晚上yegle在Twitter上对那段代码表示了兴趣,如果我没猜错的话,他应该就是某个BBS的Linux版版主之一,大概Python功力比我这种菜鸟强很多,说不定他能“一语惊醒梦中人”……
我目前的代码如下,它还不能工作。这个是我自己parse Twitter的XML版本,用python-twitter的版本前半部分简洁一些,不过差别不大,两者都有同样的问题。
02 # -*- coding: utf-8 -*-
03
04 from xml.dom import minidom
05
06 # 需要先运行wget http://twitter.com/statuses/user_timeline/liufeng.xml
07 tw_url = 'http://twitter.com/statuses/user_timeline/liufeng.xml'
08 xmldoc = minidom.parse('liufeng.xml')
09
10 status = xmldoc.firstChild
11 tweet = status.childNodes[1]
12
13 output = ""
14 count = 1
15 flag = 0
16 for tweet in status.childNodes:
17 if flag == 1:
18 created_at = tweet.childNodes[1].firstChild.toxml()
19 text = tweet.childNodes[5].firstChild.toxml()
20 output += str(count) + " " + text + " " + created_at + "\n"
21 count += 1
22 flag = 0
23 else:
24 flag = 1
25
26
27 import cookielib
28 import urllib2
29 import urllib
30 import time
31
32 cj = cookielib.CookieJar()
33 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
34 exheaders = [("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.1; Windows NT 5.1; SV1)"),]
35 opener.addheaders = exheaders
36 url_login = 'http://xiaonei.com/Login.do'
37 body = (('email', '*******@gmail.com'), ('password', '*******'))
38 req1 = opener.open(url_login, urllib.urlencode(body))
39 print "Login should be successful.\n"
40
41 body = {'relative_optype':'publisher', 'blogControl':'1'}
42 url_post = 'http://blog.xiaonei.com/NewEntry.do'
43 title = '最近我(说了/做了/想了)什么 %s' % time.asctime()
44 #xt = text.encode('utf-8')
45 print output
46 output = output.encode('utf-8')
47 print " fucked\n\n" + output
48 body['title'] = title
49 body['body'] = output
50 req2 = opener.open(url_post, urllib.urlencode(body))
51
52 #print urllib.urlencode(body)
April 19, 2009
成功的一面
今天下午研究了一個台灣的blog小團體“憂鬱馬戲團”的歷史。這個團體成立與2003年,是幾個人一起的松散小組織。有一位負責技術的人用Movable Type在個人主機上搭建blog程序,團員們集資支持,然後就可以不用管底層的技術,專心寫blog了。這種運作模式有點像TypePad。
之所以對它感興趣,是因為裡面出了工頭堅與林凱洛。他們這一對情侶檔在台灣,甚至大陸的blog圈子也已經創響了名頭,算是成功的blog人士了。
對於他們成功的經驗,除了他們的文筆風格足以吸引觀眾以外,我感覺一個很大的因素是起點早。早在2003年憂鬱馬戲團建立伊始,凱洛就是它的第一個用戶,而之前她已經在別的BSP那裡寫了一段時間了。而工頭堅的blog經歷更可以回溯到上個世紀!因此他們成為了呼風喚雨的元老。而從後來開始的blogger,除非他們的內容非常精彩,否則他們很難超越前人。
這也是人們討論成功的結論之一。有時候一個人成功了,原因並不是因為他非常聰明,而是因為他起步的早。想象2003年我在干什麼?那時我能在gmail那裡申請一個郵箱就已經歡呼雀躍了,自己在網絡上建立頁面,根本連想也沒想過。而成功的另外的因素,就是有足夠的毅力(在我看來不需要很多)堅持。從2003年到2009年,6年時間,幾乎每天都寫初一篇文章來放到blog上,這看起來每日微不足道的事情,集合起來就變得相當有分量了。不過從另一方面來看,在別人都沒有領悟的時候搶先領悟並下手,而且堅持相當的時間,這本身就已經是看似平凡的大智慧了。
转移了过去的blog
我在2007年3月份开始在独立空间上写blog前,曾经在几个BSP上写过blog。过程分别是Blog.com.cn -> Blogger -> Blogsome -> Blogger(beta)。
最早在blog.com.cn上写了几篇后,发觉Blogger更优秀一些(现在时间长了,我对blog.com.cn都没有了什么印象,它好像不是WordPress搭建的),于是就从Blogger上开写。
后来Blogger在国内无法访问,我就去了blogsome。blogsome的后台是WordPress,记得当时blogsome的后台在我们家拨号上网的5k下行带宽的环境下相当慢,但blog页面却出奇的快。我一向奉行简单的页面应该也有一定的关系。
然后就是Blogger有可以访问了,同时推出了挺吸引我的beta版。我在某一天的下午学会了激活beta版后,就把整个blog从blogsome转移到了Blogger。当时很痛苦的是两者的兼容性不是很好,导致slug在blogger里都错了。我当时花了整个下午来修改slug。
后来Blogger又被封锁后,我就买了域名和虚拟主机,自己搭WordPress。当时从Blogger到WordPress没有完美的方法,而且之前的文章也没有太多有价值的,我也懒得理了,直接在我自己的域名blog.cnliufeng.com上从头开始。
前几天由于域名到期,我转移WordPress的之后的模板无法正常显式,于是就直接把blog后台程序换成了我很早之前就想尝试的Movable Type。由于对Movable Type不熟,我就去一些用Movable Type的blog前辈的blog“取经”。学知识的同时,看到他们的blog积攒了相当多的文章,blog的月份分类已经积攒了很长。而且他们很多也不是一开始就用Movable Type的,有的人开始时甚至用得不是blog程序,而是直接手写静态页面,到后来才把文章都转移到blog上的。那时我感觉到自己在网上的文章过于分散不是一件好事,我也应该把自己过去的文章都弄到这个blog上来。
去网上搜索回顾了一下,找到保存我的文章最多的地方还是blogger:上面有我从2006年3月到2007年3月一年的文章。我当时的想法是通过Movable Type的导入功能一下子把文章都转移过来,不过发现似乎Six Apart对自己的blog有点封闭,目前除了支持导入之前的Movable Type的备份外,只能导入WordPress的导出文件,而且听说对WordPress的支持也是后来才加进去的。Blogger明明就在Movable Type前啊,Mena Trott在弄出Movable Type前不也是用Blogger的平台写她的dollarshort吗。
然后我想了一个折衷的主意。我在其它BSP上还有几个WordPress后台的帐号,可以先在那里批量导入Blogger的文章,然后再导出,最后再从Movable Type导入。尝试了一下立即打消了这个想法。Blogger似乎没有支持slug功能,我过去写的时候一点也没有考虑这个事情。这样的话当我最终导入后,那些文章的链接就都带有了中文,这是我不希望的结果。
这样的解决方案剩下了两个:要么我这样导入后再手动修更改每一篇文章的slug;要么我手动导入每一篇文章。我选择了第二种方法。第一种方法虽然工作量更小,但70多篇文章,我很容易就可能漏掉修改某一篇。手动转移工作量虽然大,但确可以保证万无一失。而且我也很想有个机会来回顾一下过去写的文章。转移不需要一次进行,我每次转移五、六篇文章花不了多少时间。而早上起来还没有完全清醒时,来做这项工作也是个不错的加速清醒的方法。当然这种做法也不是没有坏处,就是过去的评论都无法转移。不过那些文章的评论都很少,也没有什么很重要的,丢掉也不心疼。
就这样,这几天我在累了的时候就弄那么几篇,顺便修改里面的错别字。像有些文章,如《我的2002年》,确实让我重新经历了我过去的岁月。否则那时候的有些事情我还真想不起来。
结果,今天下午,终于把所有的在blogger上的文章都转移到这里了。后来我发现在blog.com.cn上的blog也有三、四篇文章。虽然写的都是写芝麻蒜皮的小事,不过那是我写的最早的几篇blog文章,对我来说有很大的纪念价值,于是我也一并转移过来了。所有工作全部告一段落。
在转移的过程中,我发现我对blog的心态又有了变化。过去我觉得blog既然原名是web log,就是一种记录事件、时事的工具。而有些人的blog写的都是自己身边的小事,我那时认为这些blog都是毫无意义的浪费带宽的垃圾。在这次转移中,看了很多自己过去写的垃圾,才感觉到如果没有这些“垃圾”,我在今天几乎不可能那么清晰的再回顾起三年前经历的事情。现在感觉不管是自己身边发生的“高级”研究,还是“低级”感情,总之是自己身边的事情,就是对自己有价值的。一句话,blog要“以‘我’为尊”(语出马荣成《风云》)就对了。
从这一点上来看,我还是对“网络转载”持反对态度,但有了另一层体会。过去我觉得转载的人自己懒于观察、懒于思考、懒于总结、懒于录入,只会偷窃别人的作品,是对对方劳动的不尊重。现在我更觉得,他们这种转载行为才是切切实实的“垃圾”行为。我也实在是想不通为什么有人看到了喜欢的文章就非要执着与在自己的blog里再放一份,而且多数情况下读者也只有自己,只是满足自己狭隘的虚荣心而已。哪怕是在blog上写自己再微不足道的事情,也是创造了有一定价值的内容,而不是像转载者那样创造的只是没有丝毫价值的一篇文章的备份。
April 18, 2009
April 17, 2009
让Movable Type生成Sitemap
上一篇文章里说,我目前的blog在Google索引里总是旧的链接排在前面,而新的排在后面。新的链接和旧的相比几乎没有变化,两者间唯一的不同在于旧链接的结尾是/,而新链接是以.html结尾的。把/换成.html就可以访问到新的页面,否则就会得到404错误。我是没有问题,但不知情的人从Google里搜索到我的页面,获得404错误就不大方便了。
因此我在上一篇文章里写过,我在想法子让Google把顺序调整过来。我当时的主意是先在robots.txt里面加上“Disallow: /”这一句,粗暴的阻止任何搜索引擎索引我的全部页面。等Google搜索结果里面不含我的站点的任何结果后,再去掉robots.txt里面的那一句,让Google重新索引。相当粗暴的办法,我也不知道有没有效。但写文章的时候我自己提到了Sitemap,我才想起可能我的问题可以用sitemap来解决。
于是我就去我过去用来生成sitemap.xml的网站去生成最新的sitemap来研究。过去每次生成sitemap的时间都很长,基本上在5分钟左右。因此我就先去做别的时了。一会我回到那个页面看生成进度的时候,莫名奇妙的看到已经处理完了。纳闷间我看了一下生成的sitemap.xml文件的大小,才10多K,远远低于我平时的结果60多K。看了一下提示信息,说有什么错误,我也不明白那个错误是什么意思。而且这个网站生成的sitemap还有一个问题,就是它会生成一些类似“/mt-cp.cgi?_mode=view&blogid=1&id=1”这样的链接,是我们不希望Google索引的。
然后我就开始找其它的生成工具,Fenng介绍过Google Sitemap Generator,我前几天也下载了。不过它的配置远没有我想象的那样简单,需要自己配置一个xml设定文件。没有很多中文帮助,我对着Google提供的帮助简单弄了一个,结果出错了。在我过去用的网站外,没有类似的那么方便的了。
WordPress里有个很好用的sitemap自动生成插件,我觉得Movable Type里应该也有一个才对,于是就去Movable Type的plugins支持页面里去搜索,居然没有。然后再搜它的Documentation页面和Wiki页面。结果在Wiki结果里一眼就看到了Canonical Google Sitemap template,进去看是一个sitemap模板。通过替换能为首页、分类、月份、星期、天、每篇单独的文章和页面档案分别生成链接。它的默认优先级设定比较符合我的需求,因此就试了一下。它的默认优先级如下:
首页=1.0
分类=0.8
月份=0.6
星期=0.4
天=0.2
单篇文章=1.0
页面=1.0
之前从来没有试过自己添加Movable Type模板,开始的时候有点摸不着头脑。然后尝试着在后台进入Design -> Templates页面,在里面的Index Templates部分下面点Create index template链接。在接下来的窗口里面把那篇文章里的东西复制进去(原文给的代码没有很好的缩进设定,我花时间调整了一下,代码放在本页最后),设定好标题,然后点下面的Template Options弹出模板选项,在Output File里填生成的sitemap文件名,我写的是sitemap.xml。其它的保持原样。然后点Save,系统会提示需要更新。点更新后大约20秒后sitemap就被生成了。我看了一下,和过去用网站在线生成的sitemap差不多。也没有生成乱七八糟的链接。
我刚刚把robots.txt里面Disallow那一句去掉了,Google目前还没有更新,因此我无法提交新的sitemap.xml测试。另外我不清楚这个通过模板生成的sitemap会不会在我每次发布新文章的时候自动更新。如果能自动更新的话就非常理想了。因此借由发布这篇文章来尝试一下。
模板代码如下:
<!--
Canonical sitemap.xml template v0.8
### START SETUP
Possible values for the frequency variables are:
always
hourly
daily
weekly
monthly
yearly
never
"always" should be used to describe documents that change each time they are accessed.
"never" should be used to describe archived URLs.
-->
<$MTSetVar name="home-frequency" value="daily"$>
<$MTSetVar name="category-frequency" value="weekly"$>
<$MTSetVar name="current-monthly-frequency" value="daily"$>
<$MTSetVar name="past-monthly-frequency" value="never"$>
<$MTSetVar name="current-weekly-frequency" value="daily"$>
<$MTSetVar name="past-weekly-frequency" value="never"$>
<$MTSetVar name="current-daily-frequency" value="hourly"$>
<$MTSetVar name="past-daily-frequency" value="never"$>
<$MTSetVar name="recent-entry-frequency" value="hourly"$>
<$MTSetVar name="past-entry-frequency" value="monthly"$>
<$MTSetVar name="page-frequency" value="weekly"$>
<!--
Values for priority range from 0.0 to 1.0 and reflect the relative importance of pages within your site.
Do not set these all to a high value, as that's no different from setting them all to 0.0.
This does not affect how your pages are compared to other sites'.
-->
<$MTSetVar name="home-priority" value="1.0"$>
<$MTSetVar name="category-priority" value="0.8"$>
<$MTSetVar name="monthly-priority" value="0.6"$>
<$MTSetVar name="weekly-priority" value="0.4"$>
<$MTSetVar name="daily-priority" value="0.2"$>
<$MTSetVar name="entry-priority" value="1.0"$>
<$MTSetVar name="page-priority" value="1.0"$>
<!-- ### END SETUP -->
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<!-- ### This is your blog's homepage -->
<loc><$MTBlogURL encodexml="1"$></loc>
<changefreq><$MTGetVar name="home-frequency"$></changefreq>
<priority><$MTGetVar name="home-priority"$></priority>
</url>
<!-- ### START CATEGORY ARCHIVES -->
<MTIfArchiveTypeEnabled archivetype="Category">
<MTCategories>
<url>
<loc><$MTCategoryArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="category-frequency"$></changefreq>
<priority><$MTGetVar name="category-priority"$></priority>
</url>
</MTCategories>
</MTIfArchiveTypeEnabled>
<!-- ### END CATEGORY ARCHIVES -->
<!-- ### START MONTHLY ARCHIVES -->
<MTIfArchiveTypeEnabled archivetype="Monthly">
<MTArchiveList archivetype="Monthly" lastn="1">
<url>
<!-- ### The current month is still being updated. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="current-monthly-frequency"$></changefreq>
<priority><$MTGetVar name="monthly-priority"$></priority>
</url>
</MTArchiveList>
<MTArchiveList archivetype="Monthly" lastn="9999" offset="1">
<url>
<!-- ### Past months are just archived. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="past-monthly-frequency"$></changefreq>
<priority><$MTGetVar name="monthly-priority"$></priority>
</url>
</MTArchiveList>
</MTIfArchiveTypeEnabled>
<!-- ### END MONTHLY ARCHIVES -->
<!-- ### START WEEKLY ARCHIVES -->
<MTIfArchiveTypeEnabled archivetype="Weekly">
<MTArchiveList archivetype="Weekly" lastn="1">
<url>
<!-- ### The current week is still being updated. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="current-weekly-frequency"$></changefreq>
<priority><$MTGetVar name="weekly-priority"$></priority>
</url>
</MTArchiveList>
<MTArchiveList archivetype="Weekly" lastn="9999" offset="1">
<url>
<!-- ### Past weeks are just archived. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="past-weekly-frequency"$></changefreq>
<priority><$MTGetVar name="weekly-priority"$></priority>
</url>
</MTArchiveList>
</MTIfArchiveTypeEnabled>
<!-- ### END WEEKLY ARCHIVES -->
<!-- ### START DAILY ARCHIVES -->
<MTIfArchiveTypeEnabled archivetype="Daily">
<MTArchiveList archivetype="Daily" lastn="1">
<url>
<!-- ### The current day is still being updated. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="current-daily-frequency"$></changefreq>
<priority><$MTGetVar name="daily-priority"$></priority>
</url>
</MTArchiveList>
<MTArchiveList archivetype="Daily" lastn="9999" offset="1">
<url>
<!-- ### Past days are just archived. -->
<loc><$MTArchiveLink encodexml="1"$></loc>
<lastmod><MTEntries lastn="1"><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></MTEntries></lastmod>
<changefreq><$MTGetVar name="past-daily-frequency"$></changefreq>
<priority><$MTGetVar name="daily-priority"$></priority>
</url>
</MTArchiveList>
</MTIfArchiveTypeEnabled>
<!-- ### END DAILY ARCHIVES -->
<!-- ### START INDIVIDUAL ARCHIVES -->
<MTIfArchiveTypeEnabled archivetype="Individual">
<MTEntries lastn="10">
<url>
<!-- ### The recent items you post are more likely to be active(comments, etc) than older ones. -->
<loc><$MTEntryPermalink encodexml="1"$></loc>
<lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
<changefreq><$MTGetVar name="recent-entry-frequency"$></changefreq>
<priority><$MTGetVar name="entry-priority"$></priority>
</url>
</MTEntries>
<MTEntries lastn="999999" offset="10">
<url>
<!-- ### And the rest of them. -->
<loc><$MTEntryPermalink encodexml="1"$></loc>
<lastmod><$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
<changefreq><$MTGetVar name="past-entry-frequency"$></changefreq>
<priority><$MTGetVar name="entry-priority"$></priority>
</url>
</MTEntries>
</MTIfArchiveTypeEnabled>
<!-- ### END INDIVIDUAL ARCHIVES -->
<!-- ### START PAGE ARCHIVES ### -->
<MTIfArchiveTypeEnabled archivetype="Page">
<MTPages>
<url>
<loc><$MTPagePermalink encode_xml="1"$></loc>
<lastmod><$MTPageModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$></lastmod>
<changefreq><$MTGetVar name="page-frequency"$></changefreq>
<priority><$MTGetVar name="page-priority"$></priority>
</url>
</MTPages>
</MTIfArchiveTypeEnabled>
<!-- ### END PAGE ARCHIVES ### -->
</urlset>
另:刚才在找Fenng的介绍时又仔细看了一下他的文章,原来他过去用的就是模板生成的方法。不过他给的模板没有区分页面的优先级。
另另:刚才发布了这篇文章,发现后台的sitemap.xml果然同步更新了,非常不错。接下来就看Google的索引结果会不会跟着变动了。还有就是我本来担心这样一来发布文章的速度会变得很慢,结果我并没有觉察到不同。我不确定是不是因为我目前的文章少的缘故。不过就算文章多,也可以通过设定模板的参数,把更新方式改成如“手动更新”之类的就可以解决问题了。
另另另:刚才找到了一个检查sitemap是否符合标准的网站:http://www.validome.org/google/validate,检测了一下说urlset标签不符合标准。比照我过去用工具自动生成的结果改进后通过了检查。这里的代码也已经更改了。
Google和百度对我的blog收录的观察
最近在新的blog系统上花了些心思,并在搜索引擎收录的方面有了一点心得,记录如下。
1 百度懂得找新页面
我过去用WordPress的时候,单篇文章的URL用的是/年/月/slug/的格式。而现在用的Movable Type所产生的静态页面的URL却是/年/月/slug.html格式的。这样一来在搜索引擎里的单篇文章地址就有许多过去留下的错误链接,这些链接都无法访问。在Google里面,挺奇怪的是我过去的那些文章都排在了前面。大约前3页以内没有.html结尾的页面。我不知道是不是那些地址资历“老”的原因。而在百度里,我新发布的页面都排在前面,刚才又查了一下,似乎旧格式的页面都不在搜索结果里面了。
我不清除是什么原因。有可能是Google的索引策略所致,也有可能是我在Google Webmaster Tool里面提交过的sitemap里priority设定不当(我用在线工具生成超过200个链接的sitemap.xml文件,还没有着手研究)所致。
2 百度不懂robots.txt
这是我从过去就发现了的事情。今年一月左右我又有了时间写blog后发现Google里搜索我的blog只有两个结果,而且它们都是WordPress后台登录之类的链接。而同时百度里的结果就一切正常。当时我百思不得其解。后来发现我的模板里有noindex的设定。我想起这是我过去看过的一篇SEO文章里说的方法之一(现在怀疑有这样的SEO方法吗?)当我从模板里删除了这一条后Google就开始正常索引我的页面了。
为了让Google去掉那些旧的地址,我想了一个粗暴的方法:在robots.txt中禁止搜索引擎的爬虫来访问我的页面,等Google索引的地址一个都不剩后,再允许爬虫来索引。Google Webmaster Tool里面有申请删除页面索引的地方,我还不是很急,因此就先让搜索引擎自己来做吧。
TextMate 2.0什么时候能出啊
最近用着Movable Type的感觉还不错,但有一点是我特别不习惯的:就是页面预览。
我不喜欢用所见即所得的编辑器,一是因为用起来很麻烦,远不如Markdown来的直接方便;二是在一个在线的网页里用这种所见即所得编辑器的速度也实在是慢;三是不兼容,因为编辑的时候编辑器要parse页面的HTML代码,不同编辑器的parser不同,因此用Frontpage编辑的页面,再用Dreamweaver来编辑就不是很容易。
我用Markdown来写我的blog页面。Movable Type原生支持Markdown,不用像在WordPress里那样要自己安装插件,这一点不错。但毕竟我对Markdown语法不是100%的精确掌握,因此有时候要先预览一下看看。过去在WordPress里面点预览后会弹出新页面,如果不关闭这个页面而继续在后台修改文章后再点预览按钮,这个新页面也会同步更新,这样写起来十分方便。而在Movable Type里点了预览后,后台页面会直接更新成预览的页面,页面上方有两个按钮,一个是直接发布,另一个是回到后台继续修改。这样我要修改的话就要点回到后台那个按钮。如果是本地软件,那还没有什么问题。但由于Movable Type是在线的软件,这样一来一去的修改就要消耗相当的速度在中间的重写页面上,思维都被打断了。
今天编辑一个稍微有点复杂的文章,实在觉得麻烦,就想起TextMate支持Markdown,应该也有一键预览的功能吧。打开一看果然如此。编辑完后按control+option+command+p四个键就可以弹出窗口显式页面的实际效果,十分方便,直接解决了我的苦恼。以后写文章就方便了。
但TextMate有众所周知的问题:中文支持。TextMate对每个字只支持英文字母的宽度,由于汉字的宽度是英文字母的两倍,因此相邻的两个汉字都叠在了一起,根本没法分辨。可惜我写的又是中文文章。好在我要做的编辑不多,基本上可以分辨我的文件的内容,而且TextMate的输出窗口是支持宽字符的,因此勉强可用。但要是像在里面从头开始写一篇文章的话,那就基本上不大可能了。
网上有人弄的折衷解决方法:做一个特殊的中文字体,每个字的宽度是标准的60%,这样汉字都变的细细的,能够填进一个英文字母的宽度中了。我过去试过这种办法,但实在是看不习惯这样的汉字。于是需要对中文处理的场合我都换用别的编辑器。据说TextMate的作者说CJK问题会在2.0版本时完全解决。我现在用的是1.5.8 (1498)版本的,看来到2.0版本还需要很长一段时间。
现在暂时的解决方案是找一个本地版的Markdown处理器,哪怕是像TeX那样能处理一下也好。Emacs有Markdown模式和muse模式,编辑的话是不成问题的。
April 16, 2009
发布一款Movable Type风格--Feng2009
今天弄好了blog的CSS后,在回家的路上想到:既然header的背景是用一张照片的顶端,那为什么不把那张照片的底部截取出来当作style的footer呢?于是回家后就弄了一下。不过由于我在处理header的时候颜色参数是胡乱调的,因此footer的参数我也是胡乱弄的。两者可能不是很统一,不过应该没有太大影响。
随着对Movable Type的theme的了解的加深,我发现一个theme其实是很简单的。无非在一个目录下包括了screen.css和需要的资源图像,以及thumbnail.gif和thumbnail-large.gif文件用于后台系统的style切换的style缩略图。我照着相同的规格,把我自己的东西都放到了另外一个目录下,并做了截图,果然Movable Type的后台出现了我做的style。不过style的名字却显式未命名。我看了一下其它style,原来在screen.css这个文件的开头有注释来表明这个style的名字、作者资料等等。我把我的资料加上了后就一切OK了。
试验了一下,在Movable Type的后台可以自由切换。我简单的用我的名字+年份来命名它,于是就叫它Feng2009。
毕竟是我做的第一款style,虽然没有人想要,但还是把它上传上来作为纪念。feng2009.tar.gz是整个style的打包文件,里面有style的所有东西,包括header和footer的背景。使用的时候把它解压缩后得到的feng2009文件夹放到MTRoot/mt-static/themes/目录下面,从Movable Type的后台的style切换里的Default Styles下面就可以看到Feng2009这款style了。
修改了blog的CSS
我从来都不是一个网页页面设计的爱好者。原因大概是我足够懒,对于像页面设计这种精细的工作很不擅长,而且我对美工没有天分,从小美术课上鉴赏还行,自己动手画就不行了。或许是这个原因同时也导致我对网页的关注的重点一直在内容上。可能是性格使然,我特别痛恨那种"过度设计"的页面。一方面过于花哨的页面元素降低了页面的载入速度(我发现即使我们从电话拨号上网的5K/s下传速度进步到500K/s的宽带下传速度,仍然有人在制作更花哨的页面),另一方面太花哨的页面也确实不美观,反而显得内容不正式,适得其反。
因此,从过去在WordPress驱动的BSP那里放blog开始,我一直不曾在页面设计上花功夫。我的作风是选择一个尽量简单的模板就不管了(可以参考我过去在Blogger上的blog)。好在总有一款比较不错的模板让我用,因此也没有太大的问题。
我在07年刚到了加拿大后,在另外一个域名上用当时的Movable Type建立过一个英文blog,当时就发现Movable Type上没有我非常喜欢的模板。因此那个blog我一直用着默认的红色模板。其实那个模板也不太丑,就是那个枣红底色的宽大Header太恶心了。另外就是模板的字体很一般,显式英文还勉强说的过去,显式中文就很难看了。不过我当时不在那个blog上写中文,因此也没有太操心。
这次我把这个主blog的后台换成了Movable Type后,发现问题还真是挺困扰。当时在后台默认的一堆模板里翻了一下,只找到了一个Unstyled还可以。顾名思义,Unstyled就是没有style的意思。字体基本上都是一般大小的,没有底色。不过相比较起来还算很清爽的,于是就暂时用了它。
但心理一直没有再找一个中意的模板的打算。但Movable Type自从3.0时代转向收费为主后,导致很多blogger们转向了WordPress平台,因此良好设计的模板不多。有那么几个还不错的,也"响应号召",成为了收费的作品(我到现在还不理解怎样经营收费的模板)。中文blogger圈子里面用Movable Type的有那么几个,于是我就不断从他们的blog里面找每一篇关于Movable Type的文章,现在总算稍微有点入门了。
知道了Movable Type的页面设定主要用一个css文件完成的,当时就有点头晕。css我了解,但每一个元素都要设定,然后就是px宽度、字体什么的,都不是我的强项。后来看到Fenng公布了他的stylesheet,马上就下载下来研读一番。好在Fenng写的很整齐,看的也不算太吃力。然后自习琢磨了一下,要让我的页面好看点,而不是设计成那种花哨的,也不需要调整太多的东西,于是稍微有了点信心。
今天下午正好没事,就想着手调整一下。我之前没写过css,因此对HTML的相关tag也不熟悉,以至于连div是做什么用的都不懂。以前用WordPress自己修改一下模板,看到满屏的div标签就心烦。今天下决心克服这个难关,于是上网搜索了一下,原来就是对应样式的作用,真没想到还这么容易。
知道了div标签的含义后,一下子感觉"豁然开朗"。很容易的自己写了几行,让标题栏(header)变得好看一些。当中对我来说最麻烦的就要数弄一个header的背景图案了,这对我这个设计生手是相当有难度的事情。上网去"偷"人家的太逊了,我就打开iPhoto,从图库里找一张比较合适的截取下来。去年我们去King's Park踏青的时候照的几张春色还不错,我就从其中的一张里截取了一个banner。
然后就截取了现在的banner。其实不是一次完成的。我一开始截取的是图像中间的那一排树,结果传上去后由于header高度的限制只显式初树冠那一小块。我当时看着还不错,就只截取了上面的那一部分。然后觉得天然的颜色太"鲜亮"了,与我的白色背景十分不搭。于是就在Preview里面乱调图像的参数,当我把曝光度调到最低后觉得颜色挺素了,还不错,就留下了目前的背景。
然后我突然领悟到既然div和css这么方便的对应,那么应该很容易的就能从别人的页面上借鉴他们的设置。于是我印象里比较漂亮的两个人的页面--Eric Raymond的首页和蔡智浩的Taiwan 2.0 部落格都被我打开了。然后背景啊、字体啊什么的借鉴起来就都方便了。:)
当我最后一次设定好了字体后(就是直接从蔡智浩的stylesheet上复制的,丝毫未改)后,再看我的页面,我自己都惊叹了。这种感动劲简直无法形容啊。
当然目前也不是很完美。主要是右边时间列表里像单词长度比较长的月份,比如二月,页面就不大够显式,后面的文章数就被换行了,算是一点小瑕疵。我想解决方法要么把两遍的空白减少,要么就把那一部分的字体变小。目前都没有找到做的方法,于是暂时先不管了。
另外,我开始时是直接修改根目录下的style.css文件,结果后来每次发布文章后页面就变回去了。略微一想后,把文件放到mt-static/themes/目录里面的相关的模板目录里就OK了。我不知道常规的做法是什么,我是直接用quick and dirty的方法把我的style.css改名成默认的screen.css了,然后就正常了。
本着共享的精神,我把我的css文件也上传,放在这里,不过估计没有人要用啦。:) screen.css
更新: 我已经把样式文件和背景打包成标准的Movable Type的style文件包,可以下载它并直接用在Movable Type里。详情请看这篇文章。
海词客户端简化版
嫌在浏览器里用海词太麻烦,写了个Perl脚本来提取单词的解释。使用时把单词通过参数送进去就OK了。支持词组。查无此字时理论上不会有输出。
没有使用任何"高级"技术。通过LWP模块把网页弄下来,找到解释所在的位置,通过正则表达式提取出来就差不多了。本来想连例句一起弄出来,但只能做到一条例句的情况,如果例句多了只能显式第一条。如何完美的显式所有例句,还需要再想办法。
02
03 use utf8;
04 use Encode;
05 use LWP::Simple;
06
07 if ($#ARGV == 0) {
08 $word = $ARGV[0];
09 } else {
10 $word = shift @ARGV;
11 foreach $arg (@ARGV) {
12 $word .= "-" . $arg;
13 }
14 }
15
16 my $url = "http://dict.cn/" . $word . ".htm";
17 my $content = decode("gbk", get $url);
18 @lines = split /\n/, $content;
19 $meaning = $lines[79];
20
21 if ($meaning =~ /<strong>(.*)<\/strong>/) {
22 $ = $1;
23 s/<br \/>/\n/g;
24 print encode("utf8", $) . "\n";
25 }
注:发芽网导出的HTML似乎和我的blog有点冲突,因此上面的代码有些许不正常,请上发芽网上看正确的代码。
April 15, 2009
Tweenbots引发人类的爱心
今天在读瘾科技时独到一篇有趣的文章,说ITP的Kacie Kinzer设计了一台只会向前走的小型机器人,上面插一个小旗说名它的目的地,然后把它放在纽约街头。在42分钟后,它成功的到达了目的地,当中有29个人帮助了它。
从Tweenbots的网页上能看到这次旅途的路径:
瘾科技那篇文章后面的讨论有人问如果这个机器人被放在长安街上会是什么情形,下面的回复无一例外的都是不好的结果。我也有类似的想法:在国内,无论如何都不会被善待的。其实何止是机器人,人类在陌生人面前无法得到善待的例子也屡见不鲜。
以前读过艾萨克·阿西莫夫的《钢窟》这篇科幻小说,当时除了故事情节外,印象比较深的就是里面说的”炭-铁文明”。炭元素是人类等有机生物的基础,铁则是机器人的基础。那时的有识之士推行的所谓”炭-铁文明”,就是倡导人类和机器人融合的精神。但当时地球人排斥这一想法,城市里的机器人造成人类大规模失业,人们变得十分憎恨机器人。地球上有人成立反机器人组织,破坏机器人并谋杀推广”炭-铁文明”的人类。
看到目前的人类世界,有些地区的人与人之间已经能够相当和谐的相处,而有些地区正在朝”和谐社会”在努力。人与机器人的和谐,我想大概会建立在人与人的和谐之上吧。不过以我目前的观察来看,努力和谐的地区要走的道路还很长,而且有越来越长的趋势。融合与和谐的关键在于”爱”,而我周围的国内民众似乎对”爱”的感应越来越少了。
老的feed总算被访问到了
过去有有一段日子在使用feedburner,当时把blog首页上的feed提示也该成了feedburner的链接。后来feedburner一度在国内不能访问,当是考虑到把RSS输出放在别人的域名下终究不安全,后来feedburner被Google收购后,果然域名的前缀也给改了。
当时feedsky也挺火的,推出了子域名绑定也确实比feedburner更进一步。不过当时我对CNAME设定之类的都还不大明白,因此一直没有成功。后来feedsky推出”博者神龟”什么的,后来演化成了免费软文,算是对中文blog圈的一次大破坏,我当时也挺反感的,对feedsky的印象分大减,因此也就没有考虑。
不过从那以后我就觉得RSS这种东西还是放在自己的域名下比较安全,因为第三方服务总有被禁的风险,而且对方一旦改了域名,也和没托管一个样子。相比较在自己主机上的RSS,除了那些流量很大的blog可以减轻些负担外,也就是多了一个统计功能而已。于是从那时开始我就把首页上的RSS地址改回了自己的默认地址http://www.cnliufeng.com/blog/feed/。
当时以为这样是万无一失的做法,不料近期才发现不对:我最近把blog程序换成了Movable Type。之前安装Movable Type,成功的经历不多,于是决定趁这次机会好好的研究一下。但Movable Type属于静态的blog程序,输出的RSS地址是http://www.cnliufeng.com/blog/atom.xml。结果造成我过去的地址失效了。
然后去网上找解决方案。本来觉得应该就是一个重定向的问题,不料找到了许多文章都说一般阅读器都不认重定向的域名,Google Reader就是这样。但当时也没有别的办法,只能冒险一试了。如果这样不成功,大概也没有别的办法了吧。不过我算blog小户,读者粘性几乎为0,就算丢失了也只好算了。
重定向是该从虚拟主机的panel里设置还是该手动写.htaccess文件,我也不知道哪个好一些。但在Dreamhost的面板里设定时没有设定成功,于是就用了手动方法,在blog的根目录下建一个feed目录,里面放一个.htaccess文件,内容如下:
RewriteEngine on
RewriteRule (.*) http://www.cnliufeng.com/blog/atom.xml [R=301,L]
今天早上到了学校后,终于看到Google Reader里又显示了新的文章了。去主机上查log,发现前一天的log中,搜索\/feed\/时还会返回一堆的404记录,然后当天的log里都成了301了。我又试验了一下鲜果,可以正常显式我换blog程序后的文章。其它的阅读器也显式可以正常收到301信号,但它们的政策是否支持301重定向,我就不知道了。
如果所有的阅读器都支持转向,直接在http://feed.cnliufeng.com/上做个301转向能不能实现feedsky的功能呢?印象里似乎是不行,但还没有找到相关文章。
April 14, 2009
内容与格式分离
"内容与格式分离"是新一代网页的基本要求之一。网页设计者坚持这一项要求,可以大大的减少网页维护的麻烦。目前多数自动化的网络出版工具都已经支持了这一要求,如Movable Type,在后台的发布页面编辑文章时,不需要作者来编辑HTML代码(尽管Movable Type支持这样做),在发布的时候自然会有程序来王文章里面加HTML标签。其实不止是网络出版,任何在发布前需要程序进行处理的出版方式都只这一要求的支持者。从SGML生成HTML,从.tex文件生成.pdf文件,都是如此。
过去我一直觉得这种方法很完美,但今天当我需要使用存放在页面里的内容时,我觉得这样做还不够。
起因是我觉得每次上海词上查单词太慢了,就想用Perl写一个简单的命令行工具,从命令行参数获得要查的词,然后直接打印初单词的意思及例句。海词的输出并不隐晦,是标准的HTML页面。当把页面拉下来后,我要做的只是从页面里提取出我要的东西了。难度并不高,写几条正则表达式把HTML标签给去掉就OK了。但问题是工作挺繁琐,长时间没有Perl编程的经验,我目前只完成了大约50%:我可以输出单词的意思和第一条英、中例句,当例句多于一条时的处理,我还没有写。
弄到这个情况,很明显我的工作是脱除格式,获得内容。最理想的做法是什么也不做,因此自然而然的就想,如果海词会直接提供一种良好格式的数据该多好啊。当然这是不可能的,但如果有可以自由传播的英汉词典的数据该多好啊。于是我一下子就想起了Tim Berners-Lee喊过的"Raw Data Now"。
正规来说,虽然"内容与格式分离"式的出版已经是一个相当大的进步了,但如果能直接输出内容会不会更进一步呢?在目前的网络环境下,我们可以有Google一样的工具来维护一个全球的网页库。如果我们有了单纯的内容,我们会不会就能有工具来自动为我们维护一个全人类的知识库呢?自然语言的语义处理与分析是计算机的课题之一,目的在于让计算机理解人类的语言。如果我们认为的跳过这一步,直接把计算机能够理解的语言(内容数据)交给计算机来处理是不是可行呢?剥开自然语言的外壳,剩下的内容逻辑交给计算机来处理,能不能让计算机来自动进行逻辑运算,为我们完成如定理证明一类的工作呢?
这里不禁想到了Tim Berners-Lee所宣传的RDF。
但可惜的是,基于目前的现实环境,让人们把自己的数据贡献出来,似乎可能行不大。剥离了格式,内容则变得愈加宝贵,奇货可居。人们就愈加不会贡献出内容了。
为什么我们写不出来精密的软件?
我的记忆力似乎从来就没有非常有效过,因此我不应该把事情寄托在脑力记忆上。前几天我看到周伟明写的文章《程序员的十层楼 第十层(下)》时,从上面对于海森堡的”测不准关系”的讲解让我联想到了那时正在看的《梦断代码 第0章》里面作者对于软件工程业界的发问:
…总共将会有160根这种大管子被打入海底,填上混凝土,支撑新桥的水上部分。整个过程设计精密、执行无误;它分毫不差,完全满足了我们对工程一词的信心。
关于软件缺陷的话题,只要谈上几分钟,必会有人拍案叹道,”为什么就是不能像造桥那样造软件?”
当时脑袋里同时想着这两个问题,似乎隐隐约约的感到了一点联系。但总结出来的结论并不是我能完全证明的了或者讲清楚的,因此就没有写下来,打算等过一阵子再仔细思考。结果时间一下子到了今天早上,我洗澡的时候突然想起我有一个问题要思考的,但就是想不起来是什么问题了。我把头顶在浴室墙上,使劲的想才回忆起来。这算是比较幸运的,过去经常发生的情况是无论如何也想不起来,只好等哪一次电波能正好击中我的大脑刺激我在不经意当中想到吧。所以我决定有时间马上把当时的结论记录下来。
结论跟”测不准关系”有关。测不准关系用我的理解来描述就是过去、现在、和未来都是命中注定的。你下一秒钟将要做什么事情,是自宇宙诞生以来分子、原子的运动带来的结果。分子、原子按照一定规律运动,你做的事情也就因此而固定。在科幻作品里,有人可以突破时间的限制,到达过去或者未来。而他在过去或未来做了任何可以改变”现在”的行动,”现在”世界发生的变化也是注定的,因为他跨越时间段本身就是命中注定。因此通过观测未来来预测未来没有任何意义。
测不准关系和时间有关,而软件的运行又确确实实的也与时间有关。后来我学了一点state machine的知识,知道了软件就是随着时间点的变化而进行变化的几种状态。我理解的时间的一个特性,就是”测不准关系”。也就是说,凡是和时间有关的东西,它在不同时间段的状态都是不可预测的。软件就是这样的一种东西。在我们人来的视角来看,软件下一个时间单位会到达什么状态,从宏观上是不可预测的。无法预测,就意味着我们不能100%的控制一个软件的流程。
而造桥则与时间没有太大的关系,纯粹是空间上的部件的组合,而人类的视角基本上可以对空间进行完美的操控。因此,造出100%精密的桥则不是不可能的事情了。
Mena Trott在TED的演讲:blog创建更友善的世界
Movable Type是不是一个伟大的blog发布工具,Six Apart是不是一家伟大的公司,似乎不需要讨论。作为最早的几个blog发布工具和它的公司,它们服务了不知多少blogger。Six Apart公司的创办经历也颇为有趣:Mena Trott在2001年四月开始了一个blog—dollarshort.org,当是用的是Blogger的服务。Mena想用一种更好的方法来管理自己的blog,就和她的丈夫Ben一起用Perl写了Movable Type。通过Internet Archive Wayback Machine,我们可以看到,Mena的blog在2001年十月2日就已经用上了Movable Type了。然后就是夫妻两人发现了Movable Type的商业价值,于是接受了风投,创办了Six Apart。Mena Trott现任Six Apart的主席。
看到动态的Mena,我的印象就是一个”傻大姐”:脸大、嘴大。她在演讲中也承认了嘴大这一点,并拿出她祖母的照片来说明她的嘴大是遗传的。演讲本身并不是相当精彩,没有很多我期待的关于Six Apart里面的技术故事。她讲了blog作为个人的发布工具,记录个人事件本身的价值。
Mena举了几个例子来说明这一点。Emma Candy在Typepad还在beta的阶段就在这里写blog了。她是一位癌症患者,到2004年二月5日她去世前,她一直在这里记录自己的日常生活。虽然每件小事都是微不足道的,但在今天看来却更多的记录了一个人的历史。Mena自己的例子是关于自己的重奶奶,她至今的记忆仅仅是一张照片。如果Mena什么也不做,当她有了自己的重孙子的时候,她的重孙对她的记忆可能也只限于一张照片而已。于是她从2005年开始每天为自己照一张照片。虽然没有公布,但确实给自己留下了更完备的历史。对于Mena自己,她也说道当她后来翻看那些照片时,自己也能回忆起那一天她干了什么事。
对于这种感觉,我觉得当你做了越久,你就会越有感触。我过去常常觉得日记类的blog是废物,但现在看来不可否认的是它对于作者本身确实有很多价值。另一个角度来说,这种价值其实就是日记的价值,但blog把记录和翻阅日记的成本降低了。
最近我决定把过去在BSP上的零散的blog整合到自己的blog数据库里面。由于Blogger对于slug的支持不好,因此要想达到完美的效果,我只有手动重新发布。今天转移的时候看到我在2007年一月写的一篇文章我的2002年,回顾了我在2002年的难忘事项。今天看来,其中的一些事情我已经遗忘了。但由于有了这篇文章,我又可以回忆起许多当时的感受。
PS,飞猪在2006年十一月就Six Apart当时新出的blog网站VOX对Mena Trott进行过采访,发表在了这里。
April 13, 2009
广大人民创造的文化
今天看了Yochai Benkler在TED的演讲“Open-source economics”,里面他提到2004年中期IBM蓝色基因超级计算机的性能刚刚超过了日本产的DEC”地球模拟器”超级计算机。但与此同时,另外”一台”超级计算机也在运行着——“SETI@Home”,由全球450万个人电脑用户通过互联网贡献他们的空闲运算力而组成的超级计算机。而这台超级计算机的运算能力超出了IBM蓝色基因的三分之二之多。这有点像“集中力量办大事”的故事,但有些许的不同。人们没有像我们过去那样,贡献自己所有的精力,而只是把自己零碎的运算能力贡献出来,不影响自己的工作,就完成了更大的计算。
他还举了一个例子,美国宇航局得到了火星表面的照片,要绘制火星的地图。当时他们没有雇佣几个博士生来做这项工作,而是把照片放到网上,网民可以通过他们的工具,花几分钟在线点几下鼠标而完成一小部分的工作。过了6个月,有8万5千名志愿者参加了这项工作,而更高效率的完成了全部工作。国内也有类似的例子,就是大家熟知的“文泉驿计划”。计划通过网友的在线工作,来完成可以合法自由使用的中文字体。这样一来,网友通过在线软件,在浏览器里完成一个个的字型设定,很快就完成了可以使用的多种中文字体库。
另一个例子是Wikipedia。通过网友的贡献来完成百科全书,这在之前是难以想象的。而我今天想的问题与Wikipedia有很大的关系。Jimmy Wales在TED也发表过演讲,他讲述了Wikipedia的组织与日常工作,其中就提到了页面保护的问题:如果有人进行恶意破坏,有人可以回复页面。而当时我想的就是”囚徒困境”所带来的社会问题。我之前写过文章来讨论过[1][2]。在那里的结论是:总有人会破坏规则。这在Wikipedia里也有体现。但在我讲的情况里,结局是悲观的:人们最终都选择破坏规则来获得利益,因为总有人破坏规则,他们这时再坚持规则,利益就会被破坏。而Wikipedia的结局是乐观的:少数破坏者并不会带来影响。
要细究两者间的不同,大概在于囚徒困境中,人们破坏规则,会获得比较明确的利益;而在Wikipedia搞破坏,获得的“利益”大概仅有一时的快感吧。
Benkler提到人们希望的稳定的高容量存储,他给我们的答案是P2P。目前人们听到P2P就想到盗版,但确实,P2P很大程度上实现了这种愿望。文件存储在每个人的硬盘里,下载的同时也上传,只要网络不断,就能保证稳定性。而且当一个文件分布在越来越多的硬盘中时,下载速度与稳定性都有显著的提升。Skype是另一个著名的P2P应用。通过用户建立一个P2P网络来传递语音包,做成高质量的网络电话。
在过去没有Google的时候,Yahoo是最流行的搜索引擎,他们人为的收录网页列表。这样一来,网络就相当于掌握在了一个公司的手中。那时人们的改善工具是Open Directory。当人们到达一个网页中时,他们可以说这就是他们要找的网页。多数网民提交同一个站点后,一个健全的网页列表就出来了。今天的Google做的Page Rank很类似,不过是用机器代替了人们的选择。而今天的Digg,在做着类似Open Directory的事情。
Jimmy Wales演讲中讲到他们有比Wikipedia更大的计划,就是通过Wiki来编撰人类的教科书。这是一个伟大的计划,想象看将来全地球的小孩用同一本教科书会是什么情况。
以上的种种,都是由广大人民创造文化的例子。我起初通过”囚徒困境”怀疑过例子的可行性,但这些例子确实是不容置疑。除了我上面提到的理由外,网络的开放属性也是其中的关键。人类的进步需要开放的环境,而目前我们还有很多地方根本不开放。这无疑压制了这些地区的进步,也最终会导致这些地区的文化落后。
Twitter上follow谁?
Twitter上follow谁?今天看了月光在Google Reader上分享了一篇来自”望月的博客”的文章《45+或许你想follow的twitter帐号》后,突然有了明确表述的想法。当然,我不是Twitter专业用户,讲得都是我自己的想法,并不客观。
首先我想说一下”微博”的作用以及由于作用所带来的它的性质。与传统网站、新兴的论坛、blog一样,微博的作用同样是发布信息的媒体。他们之间的区别是成本不同:传统的静态网页需要发布者有编辑的权利,而论坛、blog则只需要一个帐号。Twitter则把这种成本进一步降低,可以说是使成本无限接近与一个标准。这里的”标准”,被我不严谨的描述为”越接近这个标准,人们越有意于发布一篇文章/帖子/信息…”。
Twitter之前的媒体的成本,大约在标准之上。因此尽管通过论坛、blog发布信息越来越容易了,还是有人不会这样做。原因无非就是他们的信息太无关紧要了,根本不值得发布;或者他们虽然有值得发布的信息,但由于太懒,不愿把它整理成一篇文章。而Twitter几乎把成本降低到了无限接近这个标准的程度,因此像”我的猫…了”这种信息,大家也乐于发布到Twitter上。Twitter的140个字的限制,很大程度上促进了成本的降低。
正是Twitter的这种作用,它的一个性质是:上面的许多信息都不正式。如果你是普通人,那么喜欢读这些非常琐碎的日常信息的人,基本上都是你的亲友。与你越不熟的人,越对这些信息没有兴趣。当这种兴趣无限降低时,你的信息则对对方造成了骚扰。我有一次用twitterfeed把用last.fm记录的我目前在听的音乐信息同步到我的Twitter帐号上,不一会儿就有人在Twitter上让我停止。当时我第一个想法是这种责任在于订阅者而不在发布者,也就是说我有权利发布任何我想发布的信息,如果你不喜欢,要么不要follow我,要么闭嘴。不过考虑到我的行为其实属于滥用,因此就关掉了。
这就是微博的问题。因为发布信息的成本极低,因此Twitter上必然产生”无聊”的信息。而且只要你想,你几乎可以产生无限多的这种信息。当然,如果你要刻意的研究一个人,这种信息越多越好,反之,你的日常工作会被这些信息淹没。在Pownce关门前,我曾经做过实验:在Pownce上不断添加好友,不管我认识还是不认识(事实上,这些人我现实生活中一个都不认识)。实验的目的是体验一下”与社团融入”的感觉。结果是我很快就不在用Pownce了。
后来我想到,在Twitter上要follow的人,一定要是你在日常生活中认识的人。哪怕是不曾见过,也一定要说过话。否则一旦follow的人多了,而那些人又都是更新频繁的”Twitter大户”(其实只要飞猪一人就要你命了),几乎肯定会被骚扰。
因此,或许你会想follow那45+个Twitter帐号,不过还是希望你三思。
PS,这篇文章还隐含的涉及到一个有争议的问题:”真正的Twitter使用者”。简单的讨论一下:如果你不是真正的Twitter使用者,你或许不会用客户端软件来即时获取Twitter上的信息,而只通过浏览器来主动查看Twitter上的信息时,被大量信息骚扰的可能性就很低了;另一方面,当你用客户端时,你大概算是Twitter的日常用户,但这样一来,当你follow了会频繁更新的人时,你的工作就经常会被骚扰到。不过这个问题并没有定论。
April 10, 2009
April 9, 2009
Motion Rocks!
Motion是Six Apart公司新推出的网络信息聚合程序,包含在最新的Movable Type Pro (4.25)中。在它的页面上是这么描述它的作用的(我翻译的中文):
从Twitter到FaceBook,你已经用社会化媒体来与客户在线的建立关系了。但这些服务无法让你完全的控制你的品牌。现在Motion在确保你的社区仍然与外界关联的同时,带给你一种统一管理你在所有这些社会化网络上的信息方法。
说白了,我感觉Motion就是一个类似Pownce(当然也类似Twitter,但支持比Twitter更多的格式)的程序。可以用Blogger和Movable Type来类比Pownce和Motion。除此以外,Motion支持从相当多中社会化网络中获得信息,发布在自己的页面上。
虽然上面那段话看上去是对企业说的,但经过试用,我感觉它同样适用于个人用户的社会化媒体聚合要求。就像Pownce一样,Motion支持文字、图像、链接、在线视频、以及音频的分享。这里是Motion的一个演示例子。
Six Apart的Motion视频介绍(YouTube上的):
推荐《疯狂的博客》
今天在Google Reader里看到了王小峰的文章《关于DV》,大概是长期远离国内人民的生活,视频网站只看YouTube的原因,一时间没有想起里面说的"鸡巴6"到底是说的谁。于是上页面上看留言找提示。找到答案后,顺便往后面托了一下,发现有长篇留言,仔细一看马上就被吸引住了:
话说王三表答应好好考虑一下新浪博一客的建议,其实他真的很认真地考虑了,因为这不单是钱的问题,而且是很多钱的问题。...... 期间王三表还出了《文化@私生活》,但那些平时在网上叫得老响的粉丝抠得厉害,只喜欢到他博客来看免费的,不愿意到书店把它买回家,即使有到了书店,也是左脚站着看"给你自由过了火",右脚站着看"人人都爱塞林格",然后蹲着看"十面埋妇",最后揉揉大腿回家去。...... 王三表给老六发了一条短信----老六,如果我不去牛博而跟老罗翻脸,你还当我是朋友吗?少倾,老六传回两个字----嗯哼 ......
当时就让我会心一笑。而看完了全文后则完全被吸引住了。文字是连载性的,作者紧接着留言提示上一篇在王小峰的那篇文章的留言里。看一下文字的标题,是《疯狂的博客》。顺藤摸瓜找到作者易分贝在新浪的博客,从上面看到了目前连载了六篇的文章。
读完后感觉文字相当有趣味。平日王小峰在博客上经常讲他身边的老男人们的故事,在这篇文章里也提到了很多,让一个王小峰的日常读者马上起了亲切的感觉。文章围绕王小峰的博客,把这群人调侃了个遍,平日里喜欢王小峰的文字的同学可以读一下。
April 8, 2009
CSS裸奔日

刚看到iLoveMac.cn的文章才记起了今天是CSS裸奔日。忘了去年有没有做了,不过依我的习惯,我大概是没做。
之所以没做是因为一直喜欢清爽型的模板。过去用WordPress的时候,基本上自从建立这个blog,就在用1024px-10这个模板,浅蓝色基调、白底黑字,非常适合我的口味。这次搞搬家,结果恢复blog后发现模板总工作不正常。印象里两年前我花了不少时间修改了这个模板的一些细节,以符合我的审美。所以虽然可以上网上重新下一个原始的1024px-10模板,但我实在是懒得再像两年前那样修改了,而且经过两年,我修改了哪些地方我都忘记了。于是趁这个机会尝试了一下Movable Type,目前正在摸索中。Movable Type 4的默认深红色模板我也挺喜欢,但底下是白底的,显得banner"太重",略微有点压抑。过去我一直不会修改甚至更换Movable Type的模板,这次自己试着挑了一个比较喜欢的换上,感觉还不错。
这个模板的名字叫Unstyled,确实符合它的名字,页面上没有任何修饰,全是文字,相当于比过去的1024px-10还要激进了一步。不过确实比较符合我的口味。
这样,其实在今天裸不裸奔也就无所谓了。我的站点裸奔的效果就是右边的一栏会到页面底部。用firefox的同学可以直接在View菜单里把Page Style设定成"No Style",就是没有CSS的效果了。
不过这样的活动还是要发文支持的。CSS的目的在于分离文档的内容和格式,这对于信息处理是非常重要的。过去从Netscape留下来的坏习惯是应该纠正的。
做了一个新的favicon
从小对图像不是很敏感的我,对网络上的一些图形应用有点排斥。昨天和同学通电话的时候还听说另一位同学用Flash做了挺牛的东西,我之前也确实见证过他在10分钟左右就从零开始(不包括素材)用Flash软件作出让我艳羡的动画。这方面我就不行,Dreamweaver、Flash、Fireworks、Photoshop这类软件我怎么就不开窍。而Emacs之类的“简陋”工具对我则有致命的吸引力,因此我的空间上的东西都是纯手工写HTML弄出来的。
因此,我虽然一直都知道favicon不难,直接把图像文件丢到根目录下,现在的浏览器就可以自己识别了,但两年来一直都没有弄它。主要的原因就是弄不出一个原始的设计。其实太复杂的想法我估计也没有能力实现。而从网上挖取别人做的现成的又太逊了,也没有含义。
前几天用TeX写作业的量又一次增加,突然有了点想法,就在空闲时用Plain TeX微调一下字号,弄了个“LF”两个字母,然后手工截图,上传到favicon.ico Generator处理了一下就凑合着用了。
但其实我对TeX底层并不熟,因此用它做出来的字明显过于纤细,favicon.ico Generator又自动加了阴影效果,因此那个favicon我实在不满意。更碍眼的是它明显宽比高要长一些,本来应该是一个方块的favicon变成了扁的矩形。旧的favicon我改名到了这里先做备份,什么时候高兴了再删除。
刚才看到这几天一直复习的计算机伦理学里Larry Lessig关于网络版权的演讲,突然发现他的网站上的favicon到不错。一个大写的L。忽然不知为什么想到了初中无聊时自己搞的一个L与F(我姓名的首字母)交叠的图案,于是就有了点灵感。从纸上画了三、四个草图后,弄出了目前的简单设计:正方形边框,里面L和F的直角和连接点都位于黄金分割点上。
这个挺简单的,应该用画图工具不难做。于是我就下了GIMP。在下载的过程中,审视了一下自己的作图技术,觉得真要是动起手来也未必能顺当的做漂亮。这种东西笔画简单,而且黄金分割点这种精确的东西用MetaPost来话大概会更容易吧。于是简单的复习了一下MetaPost,写出了代码:
beginfig(1) u:=1cm; v:=u*.618; w:=u-v; pair A,B,C,D; A:=(0,0); B:=(0,u); C:=(u,u); D:=(u,0); draw A--B--C--D--cycle withpen pencircle scaled 2bp; pair P,Q,R,S,T,U; P:=(w,w); Q:=(w,u); R:=(v,v); S:=(v,0); T:=(u,w); U:=(u,v); draw P--Q withpen pencircle scaled 2bp; draw P--T withpen pencircle scaled 2bp; draw R--S withpen pencircle scaled 2bp; draw R--U withpen pencircle scaled 2bp; endfig; end
生成的图形还不错。其实我还做了另一个版本,把里面的黄金分割点换成了三等分点,不过看起来那个L就不大自然了,于是放弃。目前这个favicon还算满意。
另外,觉得目前有点动力做这么个小东西,大概受了两点启发。一是前几天看的iPhone 3.0发布会上介绍的一位iPhone游戏开发者Steve Demeter开发Trism的经历,上面他旁边白板上画的图形让我“若有所悟”。YouTube上有这段视频:
另一个启发大概是昨天晚上熬夜写面向对象作业,要用Java Swing实现一个银行帐户客户端之类的窗口,中间的组件摆放、消息监听处理可能也有点帮助:)
April 6, 2009
搬家
今天早上,网页和blog终于搬家完毕。
其实大概也不算严格意义上的搬家,因为两个空间都在Dreamhost,只是在不同的服务器上而已。我不知道有没有方便的自动搬家方法,于是就用了纯手工的方式。Dreamhost居然没有提供lftp工具,原始的ftp我用不习惯,幸好我在SDF那里注册过终身ARPA帐号,有这么一点空间和shell帐户。于是就先在SDF的主机上用lftp来mirror老的Dreamhost上的文件,在mirror -R上传到新的Dreamhost主机上。好在之前我就是备份在SDF上的,因此直接上传也没有话多少时间。
话说Dreamhost机器上都用户真是多,我在添加用户的时候遗憾的发现我想要的用户名liufeng没有了。倒也不是多么看好这个名字,而是因为我的机器的login name就是这个,这样ssh的时候就不用用@来指定用户名了。不过ssh了两年旧的主机,以后也应该习惯了吧。
在此感谢 leeseon 给我免费分享他的Dreamhost空间!
上次我买别人的虚拟主机时,时卖方帮我设定的Dreamhost。经过两年多的使用,这次自己动手设置信心增加了不少,也突然领悟了一些选项。
过去我一直用Wordpress来搭建blog,虽然没有弄什么太高深的应用,不过基本原理也大概熟练了。今天早上把blog转移过来后,发现过去用的1024px-10这个theme不管用了,感觉就像少了css一样。不过也懒得花时间捣鼓,试着安装了一下MT成功后就把过去的xml备份直接导入进来,目前还没有发现什么异常。
还有10分钟,又要上伦理课了:)
April 2, 2009
小虚惊一场
2007年的三月份我在淘宝上买了两那年别人的Dreamhost虚拟主机共享计划,中间虽然出过一次问题,但总体来说体验还是不错的。那之前我对网络这方面完全是小白一个,现在明显感到经验提升了许多。在经验增长之外,虚拟空间确实给我带来了相当大的方便。除了可以让我安心的搭建blog而不用担心速度和被封锁的问题外,配合ssh、lftp等工具后自己转移、备份小型的档案更是相当方便。
转眼间两年已经过去了。虽然中间我曾向卖我空间的同学发邮件处理过一些问题,但我发现他当初推广主机合租的网页也早就不在了。我估计他未必能给我续租空间。因为如果能找到一个负责任的合租管理员就不用操心和Dreamhost打交道之类的麻烦问题,遇到不懂的情况也可以询问,所以我如果可以继续跟这位同学合租的话还是非常理想的。几天前就想着给他发一封邮件问问他是否还能续租,也想到了应当备份一下自己的数据以防万一。不过最近挺忙,而且空间的使用期限还有几天,于是我也没太放在心上。
但就在刚才,我突然发现我的个人网页和blog都无法访问了,ssh、ftp也都无法连接,于是就很自然的想到了可能是空间到期的原因。当时就特别紧张了,因为我的首页、blog的倒是小事,但我上次重装系统时,把我从入学以来所有的课堂笔记打包成一个130M的zip包上传在空间里备份。这次如果把这个包弄丢了,虽然不会产生多么严重的问题,但已经十分可惜了。不仅如此,我之前收集的各种学术上的资料也是相当可惜的。
不过既然不是极端严重的东西,我也只好算了。看看以后续租的话能不能找回来,或者等联系到卖我空间的同学让他麻烦一下。不过也有可能空间过期了内容就没了。但当时也是有很后悔的感觉:并不是忙的一点时间也挤不出来了,为什么不提前备份一下呢?
过了大约半小时,我偶尔访问了一下我的主页,居然能正常打开了。blog也是一样。这时二话不说,赶紧上lftp,往硬盘mirror。以后再也不敢不备份了……
了一桩心事
人生如泡茶这个页面在我的Safari打开的页面里放了很久了,一直舍不得关掉,因为它记录了我两年半前的一段回忆。
当时从花儿开了的一篇文章上看到了社会化网络VOX的介绍。当时我的blog由于种种原因似乎不想再用了,估计是页面太花哨,速度太慢了吧。之前很喜欢用的Blogger也被河蟹了。正愁找不到地方,看到istef这么大力的推荐VOX它的母公司又很硬,于是就试验了一下。VOX提供一个二级域名,后缀很短,于是我也在那里“安顿”下来了。
讽刺的是,我只在那里发了一篇文章。还没等我构思第二篇文章的内容,VOX在国内也无法访问了。当时的感觉真是欲哭无泪,印象里从那时起我就暂时放弃了blog的写作。不过这不是重点。
重点是当时不知道怎么,竟然找到了文章开头的那篇文章。也不知道为什么,我读着读着就感觉非常有共鸣,于是一激动就在下面留下两段话。今天看起来虽然觉得有些词挺肉麻的,但的确很符合那时候我“浩浩忽如冯虚御风,飘飘忽如遗世独立”的感觉。至于最后说道的“矢车菊”,则是来源于初中在某次完成老师布置的剪报作业时,从齐鲁晚报里看到的一幅简笔画,旁边有文注,大意是:想获得清静,与其驾车千里寻求,不如手中有一朵矢车菊。从那时起,我印象里就觉得矢车菊是“大隐于世”、“清静自在”的象征。
前几天忘了干什么了,突然就想到了VOX这个网站,继而想起了《人生如泡茶》这篇文章和我的留言,于是抱着侥幸的心态搜索了一下,没想到还真找到了,不由得心生一阵感触。现在还觉得这篇文章写的很好,想保存下来。但感觉存在del.icio.us书签里也没有太多价值,保存在本地收藏夹或直接保存网页也怕后来弄丢了。拖了好几天,今天算下决心把它存在这里吧。
April 1, 2009
讲一下对隐私的保护
今天下午上课前写了篇文章谈了一下我们伦理学老师的一些我们看来的"偏执"行径。巧的是下午上课的时候老师正好在谈论加拿大公民隐私的问题。
加拿大官方有隐私保护机构,名为Privacy Commissioner of Canada,网址是http://www.privcom.gc.ca/。这个网站包含很多非常详实的法规条文,比方说隐私保护最重要的两部法律[1][2]。其中第一部是传统的隐私法案,大概颁布与1968年;第二部是2001年之后颁布的关于信息技术的法规。
有趣的是,这个网站还有一个答题系统,可以检测你对隐私的了解程度。老师在课堂上演示这个系统时,有一道题问道你访问WWW网站的时候你的位置能不能被侦测到。答案是能,但老师说网站上对于答案的解释是有问题的──网站上说WWW网站通过cookies可以获得你的位置。
老师在课上给我们演示了两种追踪访问来源的方法。一种是我们学校课程网站使用的nTreePoint系统自带的统计功能,另一种是Google Analytics给出的访问统计。两种方式都可以得到访问者的IP地址、访问这个网站前访问者是在访问什么网站。而Google Analytics直接能给出访问者的地理位置。
这时,老师表达了对于这种方式的担忧。因为当我们访问一个包含Google Analytics代码的网页时,并没有什么提示告诉我们我们的信息会被交给第三方网站,而是直接就让Google Analytics记录了我们的信息。他还提到了在大约10年前的Anonymous.com网站,可以保护你的IP地址等资料不被Google之类的网站得到。但Anonymous自己检测了这些信息。老师曾经在这个网站上找到了我们系主任的详细信息。
这时低下的一个同学说可以尝试一下一个名为pipl.com的网站。进入了这个页面后,输入你要找的人的first name、last name和地理为止后,网站就会通过多种途径搜索信息。包括myspace、facebook和flickr之类的网站上的个人资料都被找了出来。我在课下直接尝试了一下,当我看到我的头像在搜索结果列表里时,确实感到非常惊讶。
我个人对于这种状况并不感到十分介意。相反地,在一些比较正式的网站,如Wikipedia、Twitter,我都更倾向于用自己的真实姓名来注册。上个月我才刚在Wikipedia上把一个我的名字注册的帐号给抢了过来。但我们老师却十分不同,他十分注重这方面的保护。不仅对于陌生人,对于我们,他也非常小心。我们上课用投影仪,有的老师直接就开着投影仪操作。但我们这位老师在做一些操作时,哪怕泄露隐私的可能性微乎其微,他也一定要关闭投影仪的输出,等操作完毕后才把投影仪打开。
和我的上一篇文章中的想法一样,对于这两种对待个人隐私的方式,我觉得并没有什么对错。未来社会发展的趋势确实是不可知的。不过我觉得老师这样做是相当不错的,虽然我们无法偷窥他的屏幕,但他确实给我们一种哪怕我们自己的隐私也被保护的感觉。就像这位老师过去给我们讲的一个例子一样。
有一年学校的管理机构像每个与学生实习有联系的系里的负责老师征集学生的联系资料。当时他收到了这封电子邮件,于是给学校回复了一封邮件,说"根据我们的'隐私条款',我们无权擅自把这些资料交给你们。如果你们需要的话,我可以为你们打电话询问这些人是否授权我们把他们的资料交给你们"。结果学校没有回复了。后来开会的时候,他询问了一下其它系的负责人,发现只有计算机系没有给学校这些信息。
把这些信息交给学校,显然并不会给系里带来很大的麻烦。学校要这些信息,无非是向这些人们募集捐款。但从隐私的角度来说,老师的做法无疑是正确的。
母体外的人
还有半小时计算机伦理课就要开始了,这次我想写写我们这门课老师的一个特点。我相信他的这个特点蛮普遍的,就是:活在母体(matrix)之外。
对于我们这一代来说,把互联网形容成电影《Matrix》里面的matrix再适合不过了。虽然程度上并不是那么强大,但现今的互联网上总能或多或少的找到某个人的某些信息。Google的发展壮大固然是一个很大的因素,但更重要的是我们心态上的变化。开放的社会环境使得我们比过去更加不惧怕在网上公开自己的信息,Twitter、Facebook、校内网的壮大就是依赖于我们的这种心态。
2007年,Kevin Kelly在TED上作了题目为“预测5,000日之后的互联网”的演讲,里面根据从互联网诞生的那一天到Kelly演讲时的总共大约5,000天中互联网的发展趋势,Kelly估计了从那时开始再过5,000天后互联网的情形。其中他说道,那时人们的信息都在互联网上,当你忘了你朋友的电话号码时,上Google搜索就出来了。Kevin Kelly是电影《Matrix》的顾问,因此他的预计这么像Matrix里的剧情就不足为奇了。
人们的资料都公开,对我来讲很难说是好是坏。但我们的老师就不喜欢这种“科技带来的进步”。
描述一下他的行为吧:他是大学计算机系的老师,却没有所有权属于自己的电脑;工作时不随身带手机(鉴于他的教师职位,这点可以接受);他回家后就把手机关机,拒绝被任何工作上的事情打扰;他注册了Facebook帐号,却没有一个好友,只是用Facebook帐号去看别人的页面;他对我们宣称自己为了体验,注册了Twitter帐号,但不管我们如何软磨硬泡,他就是不告诉我们他的Twitter的用户名……
他并不强烈反对这些技术,也不觉得这些技术不好,但对于自己使用这些技术感到有点空洞的不妥。他也说不上来具体如何不妥,但就是觉得“隐隐”不对。说白了就是钻牛角尖吧:)
这种人似乎并不少见。我简单的想了一下,似乎我们的上一代人都不是对这些技术很感冒。不说社会性网络、微博这类新鲜事务,有些人对于个人网页都不是很赞同。很难解释这方面的原因。
今天正好看keso共享了译言翻译的一篇文章“从Facebook到Twitter:‘数字化亲密’的美丽新世界”。里面“环境知觉”这一段里本·哈雷的例子我感觉很有趣:经过尝试,他习惯甚至沉迷于Twitter当中。文章中是这样解释的:
这就是环境知觉的悖论。每条小的更新,每一条单独的社交信息,本身都是微不足道的,甚至是十分平庸的。但若假以时日,当它们汇集起来,这些小片段就渐渐接合成一幅细致得惊人的、描绘你朋友或家人生活的画卷,就像成千上万个点构成的一幅点描派画作。这在过去是绝无可能的,因为在现实世界中,没有朋友会专程打电话给你描述她吃的三明治是什么样子。用哈雷自己的话说,这些环境信息就好比“一种超感知觉”,一种弥漫在我们日常生活中的看不见的存在。
这段话是否正确,我无法判断。这类拒绝母体的人是否落后于时代,同样无法判断。我只知道:从我们这一代起,人们会越来越依赖网络。不过就像电影里面描绘的那样,生活在母体里的人们看上去被当作机器的能源,但与Neo这群人相比,究竟谁更幸福,还真是难说。
虽然不能得到具体的结论,不过在我脑袋里想了将近一个学期的问题,终于被我写了下来,也算欣慰了。





