Netscape/Mozilla 趣史

按:今天被“Mozilla 的圣经”勾起了兴趣,进而了解了更多一些历史。现简单记录一下,也算是对 Netscape 历经14年风雨动荡并终于在2008年初寿终正寝的一点纪念和致敬吧。

一、Netscape/Mozilla 是谁?

对于年纪不大且不大关心 WEB 的人来说,这个问题是很正常的。

非严格来说,Netscape(网景)是一个公司及其出品的 WEB 浏览器的名字。正是这个浏览器吸引并教育了最早的一批万维网用户,并且创造和引进了许多至今仍在应用的 WEB 技术和标准。

众所周知的是,Netscape 最终被微软的 IE(Internet Explorer)干掉了。

1998年,Netscape 被 AOL(美国在线)以4百20万美元的价格收购(微软败诉于反垄断案后,AOL 籍此获得了7.5亿的赔偿),后 AOL 又被 TimeWarner(时代华纳)收购。

AOL 在获得巨额赔偿的同时,还吃了微软一个“7年内可以无限制使用和散布IE”的糖衣炮弹。
2003年,网景终于被宣布解散,只剩少部分人继续维护和开发。

2008年初,Netscape 的开发被宣布彻底终止,并将于 2008.2.1 停止所有安全与技术支持。

如果只是这样,那也无甚好说。传奇的是,Netscape 在卖掉的前夕创立了开源的 Mozilla 社区,而后者诞生了另一款革命性的浏览器(firefox)。形象地说,Netscape 的躯体已经死了,而血脉流传到了 Mozilla。

二、Mozilla 吉祥物

Mozilla 在作为开源计划的名称之前,早已在 Netscape 使用多年,包括作为开发代号、作为吉祥物(那是一只类暴龙,原先是绿色,现在进化到了红色)等。

以下有很多 Mozilla 吉祥物的卡通图,有些满 funny 的。

The Mozilla Museum:
http://home.snafu.de/tilman/mozilla/

Dave Titus(Mozilla 卡通形象的设计者) T-Shirt collection:
http://www.ex-mozilla.org/teeshirtart/

三、图形网页浏览器的鼻祖 & Mozilla 名字的来源

虽然 Netscape 在早期很有影响力,但史上第一个图形化的 Web 浏览器应该是 Mosaic。它由 NCSA(National Center for Supercomputing Applications,美国国家超级计算应用中心,设立于伊利诺大学)发布于1993年。早年的领头羊 Netscape 以及现时的霸主 IE 虽没有直接使用它的源码,但都与之有很深的渊源。

对此感兴趣的话,可以看看 IE 原作者的回忆文章。
Memoirs From the Browser Wars:http://www.ericsink.com/Browser_Wars.html

而 Mozilla 的名字即是由 Mosaic 杀手(Mosaic killer)变化而来(Moz+illa)。

四、Mozilla 的圣经

显然,Mozilla 并没有出版过这么一本书。然而,如果你使用 Netscape 或者 firefox 的话,只需在地址栏输入“about:mozilla”即会看到一段很有启示文学风格的引文,引文的最后注明“from The Book of Mozilla”,使人误以为真有其书。最后会注明一个时间,这个时间代表一个 Mozilla 的重要日期。不同版本的浏览器可能会有不同的引文。

比如,我现在的版本(IceWeasel 2.0.0.11)是这样的的:

The Book of Mozilla

最后野兽终于沒落,异教徒们欢欣鼓舞。不过一切并没有结束,因为灰烬中飞出一只巨鸟。那只鸟望向不信者,并将加诸他们身上。野兽已经重生,力量更甚强大玛门的追随者仓皇逃逸。

來自 Mozilla 之書,7:15

7:15 这章节指代2003年7月15日,即 Netscape 被解散、Mozilla 基金会成立的日期。
野兽的没落指 Netscape 的解散;Mozilla 这只巨鸟在浴火中重生;火与雷指代 Mozilla 的两个旗舰产品:Firebird(Firefox 的原名)、Thunderbird;Netscape 的理念在 Mozilla 基金会“重生”,不再像从前那么依赖AOL,力量变得“更强”;玛门指代微软。

细细读来,觉得确实蛮坎坷顽强的。如果有兴趣可以在下面站点找到其它章节。

Mozilla 官方站点,注意看源代码,有注释:
http://www.mozilla.org/book/

英文维基页面,比官方站点多两个,并且有浏览器截图:
http://en.wikipedia.org/wiki/The_Book_of_Mozilla

中文维基页面,目前比英文维基少两个,没有截图但有中文解释:
http://zh.wikipedia.org/wiki/Mozilla之书

五、User Agent String,IE 的童年

以前一直有个疑问,为什么 IE 的特征串会包含 “Mozilla” 这个词,难不成 IE 初始时用了 Netscape 的代码?

原来,因为早先 Netscape 非常 NB,很多网站都 Designed Only for Netscape。通过检测客户端特征串识别 Netscape 的浏览器,对其它的浏览器要么不理,要么只给点阉割的功能(怎么这么熟悉,风水轮流转呵)。IE 为了能访问这些站点,就搞起了特征串欺骗,说“我是 Netscape 啊,不要歧视我啊”。。。

即使后来 IE 成了新的霸主,”Mozilla” 的字眼依然保留在 IE 的特征串中,微软还是满坦然的~。

IE 还有一个对 Netscape 的恶搞动作。因为 Netscape 能通过 “about:Mozilla” 阅读 “The Book of Mozilla”,据说,在早期的 IE 中输入 “about:Mozilla” 也有个页面——象征死机的蓝屏。

呵呵,史海轮回,Netscape 一路走好,Firefox 加油!

凑凑 SNS 的热闹--论facebook的必然没落

天天看到有人在捧 facebook。
本来想在 Twitter 上写两句话的,没想到越写越多,干脆总结下吧~

SNS 只是工具,而不是目的。我不认为有必要将现实关系再在网上映射一遍(当然,更不需要重建一套)。据此,我认为 facebook 必将雨打风吹去

有人可能会从研究的角度说,“啊,facebook 的架构如何如何好,拥有无限可能”……“啊,开放 API,8000个应用”……“啊,以用户为中心,以关系为纽带,用户黏性极高”…………。

我只想问一个问题:facebook 要的,就是让用户一个一个地添加好友,加满几百上千个,然后蹲在上面看人家在干什么?

至于那上面有的功能,哪个是独一无二,除此一家,别无实现的?
互动?我有什么话不能在 BLOG (Twitter) 上说?这才是高效和严谨的方式。我很难想象连我 BLOG 都不看的人,为什么要在 facebook 上盯着我看。
集成?呵,这又是一次个人门户的努力么?大部分人常上的站不超过10个吧?这区区几个站为什么不能加到书签里,爱上哪个上哪个。我放着好好的 Blogger 不用,为什么要上你 facebook 写 blog?我放着好好的 Google Reader 不用,为什么要用半撇子的 facebook api?我又为什么给 flickr 上传照片时要绕道 facebook?至于所谓几千个应用,只是各个网站来打广告和 killing users’ time 的。

当然,那些互联网观察/实践“家”们,他们喝彩并不是因为 facebook 多么有用,而是这背后巨大的利益令他们欢欣鼓舞、跃跃欲试。试想,关系是人类社会的基本要素,而网络化是必然的趋势。按照他们的理解,facebook 将来就是整个(或者大部分)人类的神经中枢,它是一个超级巨无霸。功能的巨无霸,一站集成你所有需要的网络功能;个人信息的巨无霸,拥有无数结构化、量化的个人信息,以及你自己都没意识到的种种心理、怪癖、嗜好……。
后面还用说吗?想干什么都可以!

然而,这正是我不喜欢 facebook 的原因。
倘若我进行互联网创业,首先问自己的是:这个东西对用户意味着什么?而不是:能搞到多少用户、多大的访问量、有什么商业模式。
如果我利用用户的无聊,通过浪费用户的时间,搞到了大量的访问量(甚至商业的成功),我会觉得这是在犯罪。

Yahoo 和 Google 是两个符合我的哲学的典型例子。前者在互联网信息荒漠的时代给用户以大量信息,后者在信息泛滥的时候帮助寻找方向。
很多人说 facebook 将是第三个 Big Thing,我觉得它担不起这个重任,facebook 的远景是类似 QQ 的 evil 存在。别提什么开放API,有些东西是不会给你的。

关系在交互中自然形成,Web2.0 绝不是 SNS 元年。
松散的个人信息不需要商业公司的统一管理,自由的互联网不需要 facebook;
需要的,是观念的进一步创新,以合理的技术连接每一个松散的节点,SNS 在其中自然形成。

WordPress + OpenID + BlogRoll 就是一个有益的尝试。
试想,每个人都是一个独立的节点,这里不存在中心。
没有人可以对用户说,“嘿,朋友,我知道,你缺乏性伴侣却又对此充满热情。我给你推荐一个XX牌的XX女郎!”……。
也没有公司可以携用户数据以令互联网,以此阻止竞争、扼杀创新。

退一步说,我也觉得豆瓣比 facebook 有意义。诚然,对圈钱者来说豆瓣没有 facebook 令他们心潮澎湃,但它有其存在的意义和核心价值。
当某个书评令我强烈认同的时候,当某人推荐的书影音竟如此契合我的胃口的时候,我可能默默地记住了这个人,加为好友。SNS 就这样自然地发生了,它以某个应用始,并服务之。

好像可以结尾了?呵呵,不过是一点点想法,没料到居然写了这么多花了这么久。
这也正是BLOG严谨的地方(相对而言)。不管你有多少读者,甚至只有你自己会看,只要发表出来,就必须尽量组织好自己的思路、语言以及格式,这是基本的素养。
读者看到的起码是认真思考过的东西,而不像呆在 facebook 偷窥狂似的事无巨细地盯着人家。
当然,facebook 肯定不会迅速关门,毕竟太多的人有太多的时间需要kill,Who knows。

杂碎笔记:DOM中的Text节点

DOM中的Text节点,has no properties错误

考虑下面一段代码:

<script type=”text/javascript”>
function switch_nextSibling_display(hdl){
hdl=hdl.nextSibling;
if(hdl.style.display==”none”) hdl.style.display=”block”;
else hdl.style.display=”none”;
}
</script>
<input type=”button” value=”Click Me!” onclick=”switch_nextSibling_display(this)”/>
<input type=”button” value=”Hidding Me!”/>

能得到我们想要的结果吗?否!如果用firebug调试的话(有了firebug太爽了哈~),会得到“……has no properties”的提示。这是因为:两个 input 控件之间有个换行符。在DOM树中,包括换行符、空格及其他普通字符都属于Text节点。不能因为换行符和空格看不见就当它不存在,实际上,前 input 节点的 nextSibling 正是这个Text节点,应该nextSibling.nextSibling才对。不过,在IE中,这个Text节点是被忽略的。为了兼容,有两个方法,一就是不要换行;或者,加上这么一句:if(hdl.nodeType==3) hdl=hdl.nextSibling,nodeType等于3表示Text节点。

P的问题~
同样是上面的script,下面的click能预期执行吗?

<input type=”button” value=”Click Me!” onclick=”switch_nextSibling_display(this)”/><p>I want to hide<p>all this!</p></p>

同样不能,”all this”是不受影响的。虽然看起来,后一个p只是前一个p的子节点,好像前面的p包括整句话才能称的上是input的“兄弟”。但实际上,p是不能自包含的,当后一个p出现的时候,前一个p就被关闭了,所以那句话等价于:<p>I want to hide</p><p>all this!</p>。同理,p也不能包含div等块级元素。虽然手工不大可能写出这样的语句,但一些半自动的场合难免,这时用JS读/写DOM树可能会碰到一些意想不到的问题。

var与非var
JavaScript中,在函数外用不用var定义的变量都是全局的,在函数内部,var定义局部变量,不用var定义全局变量,这似乎没什么问题。但下面一段代码会alert出什么呢?

<script type="text/javascript">var a=1;function f(){   alert(a);   var a=2;}f();</script>

1吗?No。因为f()里面声明了与全局变量同名的局部变量,代码在运行前先处理变量声明,所以此a已非彼a了,但是alert的时候a还没有被赋值,所以结果是undefined。倘若把f()里面的声明:var a=2 改成赋值:a=2,此a就仍然是彼a,此时因为a的值尚未被改变,所以结果是1。另,全局的JS变量还能被VBScript访问。

一封惊慌失措的来信

刚刚从 GMail 的 Spam 里救回一封信,看完后大为欣慰——这么好玩的信幸好没错过!

以下为原文:

Click the expand button to read full text…

From:西部数码 <info@west263.com>
Date:Aug 31, 2007 1:12 PM
Subject:依法打击网络淫秽色情专项活动的通知

尊敬的用户:
您好!
因近期国家加强了打击非法信息的力度。8月23日,河南电信关闭紫田机房,400余台服务器中断6天以上,被逼转移到杭州机房。
8月28日汕头机房中断了厦门蓝芒科技约1000台服务器,上万个网站受到影响。8月30日,汕头电信中断中客科技600多台服务器。

“电信人员跟笔者提醒:现在政治风头强劲,千万别违规,劝各服务商好好维护自己的机器,特殊的时间要做好特殊的防护,该暂停的就暂停。据蓝芒客服解释:汕头电信机房部分服务器出现了大量BBS站点及违规贴,之前已经停掉约40台服务器,但不知道何故,下午28日17时突然通知强行断掉汕头电信所有机房的服务器(约上万台)的网络连接。”

为了防止类似事件的发生,我司从即日起至10月底开展“依法打击网络淫秽色情专项活动”。

第一方面:站长自查

请广大用户看到此通知后立即对自己的所有网站进行全面清查,并主动关停以下类型的网站:
1、没有经过论坛备案的论坛及其它电子公告板网站,包括论坛、留言板、文章评论等。
2、虽有论坛备案但无法做到全天候监管的论坛。
3、废弃的或者长时间没有进行管理的网站,如因特殊原因不能关停,则需在对网站内容检查确认没有不良信息后将网站置于只读状态。
4、网站内容没有经过站长人工筛选的小说和图片网站,这包括但不限于使用采集工具添加内容的网站。

第二方面:我司采取的措施

针对虚拟主机,每天上午10点执行非法关键词过滤程序,对前一天出现非法关键词的网站进行相关的目录锁定和文件锁定。主要是处理那些长期没有人管理的Blog和论坛,防止自动群发机发送大量非法信息。对内容不健康,打擦边球的网站进行人工排查,责令期限期整改,严重的彻底关闭。

VPS、主机租用、主机托管的用户,请安装我司提供的过滤和监控程序,在专项活动期间接受我司的监督管理。如拒绝安装的将被断网。另外请自觉清理您服务器上的所有网站,发现非法信息的立即关闭。对于没有人管理的论坛,请设置为用户发的贴子必须审核后才能显示。
安装程序我司将通过邮件发送给您,如果没有收到请联系我司客服专员。如果您的服务器没有提供网站服务,则可以不用安装。

第三方面:近期被公安部分通报的出现非法信息的网站的处理

近期被公安部分通报的非法网站不限于按以往的删除非法信息就了事的处理方案。即日起至10月底,被通报的出现非法信息的虚拟主机网站和独立服务器,第一次给予关闭24小时的处理,网站站长需要全面整改自己的网站,并给我司出具书面的整改措施后才能开通。 第二次出现的给予永久关闭并不退款。

由于近期17大召开,所以公安部对服务器的用途规定很严格,绝对不能有未备案或违法信息的网站,论坛/留言板/博客等交互性很强的程序如果能关闭最好关闭,如果不能关闭请加强管理、或者关闭注册,或在虚拟主机控制面板>ip限制中对BBS等目录设置为“禁止任何人访问”。等到17大召开完毕再重新开放。

此次活动旨在维护广大合法用户的权益,大家应给予足够的重视,果断关停自己无法完全监管的信息发布接口,不要有侥幸心理,这是对大家负责,也是对自己负责。近期的严打行动可能给您带来一些不便,敬请您谅解和支持!

相关链接:

深度:毁灭上万网站,紫田网络灾难全纪录 http://home.donews.com/donews/article/1/118092.html

汕头电信单方面中断约1000台服务器网络连接 http://www.admin5.com/article/20070829/54014.shtml

严查40部网络淫秽的色情小说以及违禁网站 http://www.admin5.com/article/20070829/54014.shtml

我司目前过滤的非法关键词及非法信息处理流程 http://www.west263.com/faq/list.asp?unid=299

中客科技被汕头电信封掉六百来台服务器 http://home.donews.com/donews/article/1/118280.html

西部数码

2007-8-31

Update:或不言,或论天象,切不可轻犯天威……

人民与政府

刚刚与MM聊天,无意中谈到消息封锁,她的一句话很让我感到惊讶。她说:封锁好啊,免得为那些事闹心。我心想,了解事实真相是你的权力,至于是否有能力接受事实,以及如何应对那是自己的问题。

这不禁让我联想到中西方在对政府的期望上的区别:
当年五月花号的事迹也许颇能说明西方的特点:各自都有明晰的主张,并有执行其主张的强烈愿望。为了平息纠纷,他们签订了著名的“五月花号公约”,同意将原属于自己的一部分权力授予某些人,以代行管理和协调的职责——这便是政府。
另一方面,中国人所要的政府类似于保姆。许多事,我们没兴趣没态度,或者有态度但是懒得去争。我们干脆找个保姆,只要还有吃有喝、最好不被人欺负,就乖乖地不吵不闹。至于有些地方保姆说那儿危险不能去玩耍、至于有些东西保姆说我们未成年不能看,都一概遵从即是。甚至,保姆还要告诉我们,我们吃的有多么的好。这可是个双重需求,一方面保姆需要我们相信自己吃得很好,以感谢他工作努力、卓有成效;另一方面,我们需要保姆这样说,以告诉自己生活很幸福、世界一片和谐美满。至于实际上好不好,最好别说出来,以免惹得保姆也惹得我们闹心。

这又让我联想到一个观点,说中国人很勤劳。这话诚然不错,但我猜,这个勤劳也许只限于自家一亩三分地,其它的倒很懒。譬如大众利益(其实大众更关乎自己,但许多人看见的只是与自己直接相关的利益)、更譬如他人的利益。关于对他人的漠视,《狼图腾》里有一段描述印象深刻:

“当狼咬翻那只大羊的时候,立即引起周围几十只羊的惊慌,四处奔逃。但不一会儿,羊群就恢复平静,甚至有几只绵阳还傻乎乎战兢兢地跺着蹄子,凑到狼跟前去看狼吃羊,像是抗议又像是看热闹。那几只羊一声不吭地看着热闹,接着又有十几只羊跺着蹄子去围观。最后上百只绵羊,竟然把狼和血羊围成一个三米直径的密集圈子,前挤后拥,伸长脖子看个过瘾。”

我又想起坐出租车的经历。
司机往往会问乘客,我们走 A 线还是走 B 线啊?
如果对当地的路不熟悉,我往往会随便应付一句:你看着办吧。
这句话通常包含以下假设:
司机肯定比我熟悉;
我懒得去熟悉;
司机一般是好人,不会故意绕圈坑我;
即使坑我也不至于太过份。
这与我们对政府的设想多么像:
政府肯定比我清楚;
我懒得去搞清楚;
政府一般都是为民办好事,不会故意害人民;
即使地方政府乱搞,中央政府还是好的、即使有腐败分子,还有反腐败呢。
于是,当一个个政策出台、当国家面临选择的时候,大部分人也都是:
懒得管,政府看着办吧!(管不管得着是另一回事)

中国人向来很骄傲自己的文化,几千年来,中华民族不时遭受外来侵患,甚而几度被外族统治。但中华文明却从未中断,外来的统治者非但没有改变我们的文化基因,反而被同化。联想到当下对于政府强权统治的批评,我想,这也许不是政府一方面的责任,在保留这份批评的同时,更多地应该反思自身。当下的中国,有的是沉默的大多数,民主意识离许多人的骨髓还远得很。一下子去除了强权,指不定出多少乱子。(还记得那则新闻吗,说是某地几个人合伙承包了一个鱼塘,因为当地警察力量薄弱,随着天干鱼塘水浅,成群的人下水抢鱼。一边是承包人跪着哭求不要抢他的鱼;一边是成群的人抱着鱼嘻笑颜看,后悔带少了袋子……)

让沉默的大多数们明白:他天生拥有自己的主权,只是为了共同的利益同意把自己的一部分权力授予政府(并保留其他所有未明确授予的权力);而并非天生犯贱,需要一个强权镇压。如此,断不至于有见人家拿着自己的武器对付自己而默然的态度;也不至于当镇压不在时,出现幸灾乐祸、不负责任哄抢的事。

人民,决定着政府的性质;政府,宣传、教育出认同他们意识形态的人民。

Update:

请支持:
国内首个针对 GFW 的诉讼!

附:
本人在 cndigg 投票支持时留的言:

支持!
想想那些在色情与娱乐面前眉飞色舞,
却在被镇压时吓得不敢作声的人们,
心中无穷的悲悯。。。

这样的人在你争取民主时,
恐吓、打压、讥讽……无不净其能。。。
生怕你的努力连累了他们享受被强奸的快感,
却又在事情成功之后坐享果实、侃侃而谈,
仿拂那全是他们的功劳。

附:
英文digg.com的投票页

修正Debian下的“Could not open default cursor font ‘cursor’”错误

昨晚折腾Debian,最后弄出个致命错误,导致X无法启动

错误信息:
fatal error: Could not open default cursor font ‘cursor’

最终从Debian邮件列表里搜到了答案,只需装上“artwiz-cursor”字体包就OK了
console下:
# aptitude install artwiz-cursor
done!

用TestDisk恢复分区表

一不小心把移动硬盘的分区表给弄坏了,那可是命根子啊!

分区表虽然坏了,但是并没有格式化,数据还是在的,我想有没有工具可以自动检测并还原正确的分区信息呢?

呵呵,那就是TestDisk了!基本上,听说过的分区格式都支持~

在Debian下直接 “sudo apt-get install testdisk”,
然后确认几下就OK了。

好东东,很好,很强大~~~

adblock隐藏规则中的CSS选择器

adblock(官网安装)是我觉得最不可或缺的几个Firefox 插件之一,除了过滤用于广告的帧、脚本、图片、flash等,加快浏览速度之外,元素隐藏则可以隐藏那些恶心的文本广告,清新整洁的互联网使人心情愉悦:),想到一句广告词:痘痘都不见了!

然而,这次却遇到一个极想隐藏又没办法隐藏的广告。因为人家只有一个table,总不至于把所有table都隐藏了吧=_=!

我只好再次打开adblock官网,找到过滤规则写法说明,看看会不会有什么新发现。虽然早就看过,但只是草草概览了一遍,这回认真一看,果然以前漏掉了一个极重要的特性:adblock支持 CSS selector

也就是说,就好像自己就是这个网站的作者,像平常写style sheet一样选择元素,最后由adblock自动在后面加上{ display: none; }。比如:

Click the expand button to read full text…
*
//匹配所有元素

A
//匹配所有名为A的元素

A B
//匹配名为B且包含在A中的元素(B是A的“后代”,包括儿子、孙子……)

A>B
/* 匹配名为B且是A的孩子的元素:
<div>Hello<h1>adblock, <em>I love you!</em></h1></div>
其中,h1是div的孩子,em是div的孙子……
div>h1:匹配
div>em:不匹配
div em:匹配 */

A:first-child
/* 匹配名为A且是其父母长子的元素
<h1><strong>Hello</strong><em>adblock!</em></h1>
其中,strong是长子,em不是
strong:first-child:匹配
em:first-child:不匹配 */

A + B
/* 匹配名为B且是A紧挨着的弟弟的元素
<nl>
<lable>for many reasons:</lable>
<li>1</li>
<li>2</li>
<li>…</li>
</nl>
<h1>I love adblock</h1>
<p>and, I can’t help introducing it to you</p>
nl + h1:匹配
h1 + p:匹配
nl + p:不匹配 */

A[B]
// 名为A且具有属性B的元素

A[B=”C”]
// 名为A且属性B精确地等于C的元素

A[B~=”C”]
/* 名为A且其属性B以空格分隔的多个值中的一个等于C的元素
<div class=”adv blink right_box”>example</div>
div[class]:匹配
div[class=”adv blink right_box”]:匹配
div[class~=”blink”]:匹配
div[class=”blink”]:不匹配
div.adv:匹配 */

A.B
//等价于 A[class~=”B”]

A#B
//等价于 A[id=”B”]

虽然看起来也不是很多,但将上面几种模式组合起来用,效果是很强大的。在实际的例子中,应该不会有隐藏不了的吧:)

Sun建立Unix体验中心

如题,目前已有Solaris、Fedora、Debian,以及将有FreeBsd、Ubuntu系统供体验。一个简单的注册之后,通过SSH登录,普通用户权限。常见的包都打上了(自然也少不了他们自己的Sun Studio~),甚至有sftp(可以把本地开发的代码上传编译运行,或者将运行结果下载到本地)。开发语言方面,支持:C/C++、Fortran、Java、Ruby、Python、Perl、Lisp…

上去试了下,先打开vim编辑了个cpp,然后g++,一切正常~。不同的是,不像在自己的机器上,自己就是root,整台机器归自己所有。在那上面,无数终端连接共享一台服务器,很有点当年前辈们的感觉~~~。总之,对于暂时没有计算机,以及因为总总原因没有安装Unix系统的人来说,是一个不错的体验平台。

比较特别的是,它还能满足关于龙芯、多处理器、多核、多线程的兴趣和需求。

Twitter API 应用

题外话:
———————————————————————
我的需求很简单,就是将最近的几条twitter信息显示在blog上。

首先想到的办法就是,直接用blogger提供的feed功能。可是,输出的每条信息前都有个“Wang Congming:”长长的前缀,不喜欢。而且,blogger每抓取一次feed好像要缓存挺长时间,而twitter应该是实效性比较强的,恩~。

然后,就想到用twitter官方提供的Badges。However,他们给的不是我想要的。所以,只好去看看API说明,自己动手。

小小原理:
———————————————————————
twitter支持四种格式的数据输出:xml, RSS, ATOM, JSON,以及 GET 和 POST 两种方法。当然,只是查询一下不需要授权的数据,自然用不上POST。所以,只需要GET一个JSON就行,通过URL传递适当的参数,得到我们需要的数据。

传递过来的 json 是一个函数,而我们需要的数据作为函数的参数。唯一要做的,就是事先定义这样一个函数,告诉它该怎么执行,怎么显示其中的数据。至于函数名,GET 时由自己用 callback 参数指定。

Click the expand button to read full text…

数据结构
———————————————————————
返回的数据类似以下结构:

twitterCallback([   {      "created_at":"Sat Apr 28 15:45:24 +0000 2007",      "text":"信息的内容~",      "id":43160262/*该条信息的数字编号*/,      "user":{         "name":"Wang Congming",         "profile_image_url":"http:...",         "description":"自我介绍",         "location":"BeiJing",         "screen_name":"WCM/*用户名*/",         "url":"http:...",         "id":5002701/*用户的数字编号*/,         "protected":false      }   },   {      /* 第2/3/4...条信息,重复以上形式 */   }]);

完成
———————————————————————
根据以上数据,得代码如下:

<ul id="my_twitter"><li>Loading...</li></ul>

<script type="text/javascript">function relative_time(time_value) {   var time_correct = time_value.split('+0000');   var parsed_date = Date.parse(time_correct[0]+'GMT+0000'+time_correct[1]);   var relative_to = new Date();   var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);   if(delta < 60) return 'less than a minute ago';   else if(delta < 120) return 'about a minute ago';   else if(delta < (45*60)) return (parseInt(delta / 60)).toString() + ' minutes    ago';   else if(delta < (90*60)) return 'about an hour ago';   else if(delta < (24*60*60)) return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';   else if(delta < (48*60*60)) return '1 day ago';   else return (parseInt(delta / 86400)).toString() + ' days ago';}function twitterCallback(obj){   var twitterHTML = '';   for(var i=0; i<(obj.length); i++){      twitterHTML += '<li><span class="item-title"><a href="http://twitter.com/wcm/statuses/'+obj[i].id+'">' + obj[i].text + '</a></span><span class="item-date"> - ' + relative_time(obj[i].created_at) + '</span></li>';   }   document.getElementById('my_twitter').innerHTML = twitterHTML;}</script>

<script src="http://twitter.com/statuses/user_timeline/5002701.json?callback=twitterCallback&count=5" type="text/javascript"></script>

效果如右侧~

总结一下
———————————————————————
1、以上代码,如果去掉ul间的“<li>Loading…</li>”,然后存为一个单独的文件,将无法正常显示,加上后又变为正常。当然,并不限于Loading…,也并不限于ul之间。也就是说,只要在任何可以的地方,加上任何字符,就OK了,不加就不行,IE和ff均如此,不理解……。

2、twitter输出的”+0000″时区没有指名是哪个标准时间(虽然没多大差别),这将导致IE的Date.parse语法分析出错,所以先在”+0000″前加上GMT再分析。

3、”…/5002701.json?callback=twitterCallback&count=5″。这里的5002701要换成自己的编号;twitterCallback即是指定的返回函数名,可自由命名;除了count外,还有其他筛选条件,如指定起始日期的since等。

4、Twitter API官方文档

关于JSON (JavaScript Object Notation): http://www.json.org/json-zh.html