Monthly Archives: October 2010

问:开发一个网站要几步?

在通常(注意是通常)情况下,开发出一个网站要分几步?要花费多少时间呢,外刊IT评论给出了答案:25 步。其中花费时间最多的一步用了 6 周,最短的一步只用了 1 秒。

来看看和你遇到的实际情况是否一致(如果恰巧你也经常开发网站/或程序):

  1. 下载一个网站开发软件——20分钟。
  2. 思考网页上要写些什么东西 —— 6周。
  3. 把那个网站开发软件再下载一次,因为在上次下载之后他们又发布了3个版本 —— 20分钟。
  4. 决定去偷一些图片或作品放在你的网站上 —— 1分钟。
  5. 浏览各种网站去找图片和作品,发现5个你喜欢的 —— 4 天。
  6. 安装你的网站开发软件,没有成功,你又下载了一遍 —— 25分钟。
  7. 重新安装,启动软件,把上面的按钮都点一遍,看看它们都是干吗用的 —— 15分钟。
  8. 看看别人的网页的源代码,偷一些过来,四处修改几个词 —— 4小时。
  9. 在网站开发软件里预览你的网页 —— 1分钟。
  10. 把两个相关联的图片水平对齐 —— 6小时。
  11. 删掉其中的一个图片 —— 10秒。
  12. 把文字的颜色设置成了背景色,纳闷你的文字为什么全看不见了 —— 4小时。
  13. 从主机提供商那里下载一个访问计数器程序 —— 4分钟。
  14. 试图能明白为什么你的计数器显示的数是“-16.3 E10” —— 3小时。
  15. 在两行文字间加入4个空行 —— 8小时。
  16. 微调文字,准备把你的网页上传到主机里 —— 40分钟。
  17. 不小心删掉了所有的网页 —— 1秒钟。
  18. 重新开发网页 —— 2天。
  19. 研究怎么才能把网页上传到主机上 —— 3周。
  20. 给一个有耐心的朋友打电话能清楚什么是FTP —— 30分钟。
  21. 下载FTP软件 —— 10分钟。
  22. 再次给你的朋友打电话 —— 15分钟。
  23. 把网页上传到主机上 —— 10分钟。
  24. 在互联网上访问你的网站 —— 1分钟。
  25. 重复所有之前的动作 —— 无限。

现在你应该好好总结一下,在开始行动前,是否应该有充分的准备呢?响应的知识储备是否很重要?万一发生误操作,是否有补救措施?

还有,产品开发结束后,你应该算算做了多少无用功。是的,人类就是在一次一次的失误和挫败中发展进步的。

Think different, dress alike – 苹果计划万圣节推出乔布斯套装

来自 cnBeta 的消息称,苹果准备在万圣节推出一款名为 iWear 的产品。这款时装套餐(显然不是高科技产品)包括了苹果老总常穿的高领黑毛衣,牛仔裤,运动鞋和眼镜。

这次活动的口号是:Think different, dress alike。看来成功占领了 mp3 播放器市场,高端智能手机市场后,苹果又准备向时装界发起攻击了。

PS,经过快速搜索后,我发现,这确实只是一条恶搞新闻,出处大概在这里

11个开源微博平台

目前提供微博服务的网站很多,你只要花几分钟注册一个用户,就可以快速的开始微博生活。但也许你会想动手搭建自己的微博平台,用自己的域名,随意修改源代码,保障数据的安全(想想饭否,以及msn spaces),下面是网上看到的一些开源微博程序,如果你自己搭建过博客,那搭建微博也不是什么难事。

PHP 类:

Python 类:

Ruby on Rails:

ASP 类:

其中,P2是非常有名的WordPress主题, PageCookey 和 EasyTalk 是国产的,前者的主页上有一些用户展示。就不用一一介绍了,打开链接,下载源代码,按照说明安装体验吧!

MeeGo 1.1 版发布

来自 MeeGo 社区和诺基亚博客的消息显示,MeeGo 已经发布了 1.1 版。

这次的发布版本可以让开发人员和终端制造商体验产品和熟悉代码,普通用户并不建议安装升级。

博客中同时提到,按照目前的节奏,MeeGo 1.2 版会在半年后发布。众多新功能目前已经进入了 1.2 的开发计划中,如果你很感兴趣,可以在 MeeGo Conference 这个页面了解更多内容:http://conference2010.meego.com/

诺基亚能不能在智能手机的战争中存活下来,MeeGo 至关重要,我们拭目以待。

一些 MeeGo 1.1 的图片(并不代表最终产品):

上图为车载系统图片

上图为上网本系统

上图为手持设备

真假开心网案宣判:千橡被判赔40万停用开心网名称

新浪科技讯 10月26日消息上午,“开心网诉千橡不正当竞争”一案今天上午在北京市第二中级人民法院宣判,千橡互联公司(以下简称“千橡”)和千橡网景公司(以下简称“千橡互联”)并未侵犯开心网(kaixin001.com)的注册商标权,但千橡使用与开心网相同的“开心网”名称构成了不正当竞争,判决赔偿开心网40万元,并不得使用与“开心网”相同或近似的名称。

  对此判决,千橡及千橡网景当庭表示将上诉。

  就开心网起诉千橡和千橡网景侵犯其商标注册权一事,法院判决,开心网的主张证据不足,法院不予支持。

  而在开心网诉千橡不正当竞争方面,法院认定千橡具有主观过错,构成了不正当竞争,应承担相应的法律责任。法院认为,千橡作为互联网业界具有一定影响力的公司,在开心网通过kaixin001.com提供的社会性网络服务已构成知名服务的情况下,于2008年10月使用该知名服务的特有名称“开心网”(kaixin.com)作为网站名称,在相同行业和领域中向公众提供社会性网络服务,使网络用户对二者提供的服务产生混淆。千橡具有主观过错,构成了不正当竞争,应承担相应的法律责任。

  法院认定,千橡及千橡网景自判决生效之日起不得再提供社会性网络服务中使用与开心网的知名服务的特有名称“开心网”相同或近似的名称。

  案件回顾

  2008年3月,由程炳皓创办的开心网上线运营。凭借“朋友买卖”、“争车位”等产品迅速占领白领市场。据透露开心网迅速蹿红后,千橡曾提出以1亿元收购开心网,不过遭到开心团队拒绝。

  随后2008年10月14日,千橡用早已购得的kaixin.com域名,推出了另一个开心网,除网站名称一模一样外,服务功能、网站布局、页面设置也几乎与开心网完全相同。

  2009年5月,开心网以不正当竞争为由将千橡互联公司告上法庭,要求其停止使用“开心网”网站名称,停用kaixin.com域名,赔偿经济损失1000万元,公开赔礼道歉,并承担诉讼费用。

  2009年10月,此案首次开庭,千橡方面提出,其旗下的千橡开心网的网站名称和域名,已经在不久前转让给千橡旗下另一公司千橡网景名下,认为开心网“告错人了”。有法律方面人士指出,“千橡开心网”在千橡系内部被转来转去,其用意在于拖延案件的诉讼周期。”

  随后2010年1月底,开心网正式追加千橡网景为共同被告。随后,北京市二中院和北京市高院相继驳回千橡网景的管辖权异议请求。

  2010年6月30日,该案第二次开庭审理,庭审过程中,千橡请求法院委托具有资质的认定机构对开心网在2008年10月时是否知名、开心网是否是特有名称等进行鉴定。该请求被法院当庭驳回。(宗秀倩)

  以下为该案宣判文字实录:

  审判长:原告北京开心人信息技术有限公司诉千橡互联网科技发展有限公司、被告千橡网景科技发展有限公司,本院受理后依法组成合议庭进行审理,现本案审理完毕。

  今天本院继续开庭为这个案件进行公开宣判,判决书已经制作完成,我简要的陈述判决书的主要内容。

  原告北京开心人信息技术有限公司起诉称,2008年3月原告创办了kaixin001.com开心网,由于开心网创意独特,开创不久便在网络引起强烈反响,全球排名在几个月内就逼近新浪、搜狐、网易等老牌网站,成为一个崭新的知名网站,具有很高的商业价值。2008年10月,原告从很多媒体中都看到山寨版开心网的报道,展开调查,发现被告千橡互联科技发展有限公司于2008年10月14日也开了同一名称的kaixin.com开心网,该网站的网站名称、服务功能、服务对象、服务内容与原告网站完全相同,使网民难辨真假,使得网站注册人数上升明显减缓,大量用户损失,带来巨大损失。2009年5月11日,被告千橡互联公司将kaixin.com开心网的经营许可证变更为被告千橡网景公司,原告认为原告的kaixin001.com开心网即知名网站,构成了不正当竞争,故诉之法院,请求判定:

  一、二被告停止适用于开心网近似的名称作为网站名称。

  二、二被告停止使用kaixin.com域名。

  三、二被告连带赔偿原告经济损失一千万元。

  四、在媒体上公开赔礼道歉。

  五、二被告承担全部诉讼费用。

  被告千橡互联公司答辩称:

  第一、kaixin.com开心网的服务内容与开心人的服务类别不近似,被告千橡互联公司未侵犯原告的注册商标专用权,被告已经向国家工商总局商标局提出撤销开心网。原告在本案主张开心文字注册商标专用权既不能同时将开心网作为知名服务的特有名称予以保护。kaixin.com开心网的经营主体已经由被告千橡互联公司变更为千橡网景公司,被告千橡互联公司并不是诉讼主体。原告的索赔请求缺乏依据,被告千橡网景公司答辩称,被告千橡互联公司已经向国家工商行政管理总局商标局提出撤销原告开心文字注册商标的申请,本案终止审理。

  第二、本案千橡互联公司售让kaixin.com的域名早于开心网的时间,原告对开心享有合法有效的权利。二被告使用kaixin.com域名的行为不构成侵权和不正当竞争。kaixin.com开心网没有仿冒原告网站主页的行为。被告千橡互联公司与被告千橡网景公司是独立的法人,二者前后域名kaixin.com开心网没有实施共同行为,不应该承担连带责任。

  2009年10月23日千橡互联公司以连续三年停止使用为由向国家工商行政管理总局商标局申请提交开心人公司开心注册商标。2008年3月,开心人公司开心社交网站kaixin001.com开心网提供社会性网络服务,即帮助人们建立社会性网络的互联网应用公司。2008年9月10日北京市通信管理局颁发了电信与信息服务业务经营许可证,该证记载经营单位名称开心人公司网站名称开心人,网址是kaixin001.com。

  开心人认为,其运营的kaixin001.com开心网自2008年5月起已经知名,开心人公司提交:

  一,百度网站搜索开心网的结果证明在2008年10月前开心网被网络媒体报道1730次;

  二、kaixin001.com开心网、新浪网、搜狐网、网易在网站的世界排名和结果证明kaixin001.com在该网站的世界排名在100位左右。

  三、kaixin001.com开心网及创始人获奖资料。

  四、截至2008年10月18日开心网注册用户已达750多万。

  五,国内外媒体对kaixin001.com开心网的报道。2008年10月16日千橡互联公司售让取得了kaixin.com域名,2008年10月,千橡互联公司开出了社交网站kaixin.com开心网,提供社会性网络服务。2009年3月18日北京市通信管理局颁发电信信息服务业务经营许可证,该证记载经营单位名称千橡互联公司网站名称及网址。2009年4月13日站长网刊载了开心网进行垃圾邮件推广。2009年7月24日,315热线网刊载了头投诉开心网擅自使用SSN发送邮件的垃圾文章,网易论坛指出开心因千橡旗下开心网及kaixin.com开心网频频向用户提出注册的垃圾邮件,遭到很多网友的抗议。中央电视台对kaixin.com开心网等网站涉足黑帮网络游戏教父进行了曝光后该游戏被文化部相关部门查处,并予以关停。2009年5月11日,北京市通信管理局颁发了电信与信息服务业务经营许可证,该证记载经营单位名称千橡网景公司网站名称。2009年10月10日千橡网景公司股东会议决定一变更股东,同意千橡互联公司在千橡网景公司百分之百全部股权转让给北京千橡天成发展科技有限公司。二,修改章程,将千橡网景公司更改为北京千橡天成科技发展有限公司设立千橡网景公司。开心人公司主张千橡互联公司千橡网景公司实施的侵权行为包括,在运营的kaixin.com网站名称中使用开心字样,属于在类似服务上使用开心文字注册商标的行为侵犯了开心文字注册商标专用权,kaixin.com开心网网站名称同时构成了对开心001.com开心网知名服务特有名称开心网的仿冒,构成了不正当竞争。使用kaixin.com域名属于在类似服务上使用开心文字注册商标,侵犯了开心文字注册商标专用权,构成对kaixin001.com开心网知名服务特有名称开心网kaixin001.com知名域名的仿冒构成不正当竞争。在运营的kaixin.com开心网网站首页使用苹果笑脸,与开心网文字符合标志构成了对kaixin001.com开心网网站首页亲情笑脸,与开心网文字符合标志知名文字的仿冒构成不正当竞争。

  开心人公司主张,千橡互联公司、千橡网景公司侵权行为造成的后果是,kaixin.com运营黑帮游戏、发垃圾邮件导致公众对kaixin001.com的评价降低,造成巨大商业损失。kaixin.com与kaixin001.com争夺客户,导致开心人公司巨大经济损失。

  本案审理中开心人公司提交了kaixin001.com自开通以来至2009年8月的广告合同,证明截止2009年8月底,开心人公司运营kaixin001.com获得的广告收入总额为3400余万元。

  开心人公司主张千橡互联公司、千橡网景公司给其造成的损失,为kaixin001.com销售收入除以kaixin001.com注册用户数,再乘以kaixin.com注册用户数,加kaixin.com在百度发广告损失的钱数,总共等于2300余万元。

  开心人公司在本案中主张1000万元。

  以上事实由开心人公司提交的商标注册证书、获奖证书、媒体报道、公正书、网站页面打印件、广告销售明细、千橡互联公司、千橡网景公司提交的国际域名注册证书、电信与信息服务业务经营许可证、公证书、媒体报道、双方当事人的陈述等证据材料。

  本院经过审查以后,做出了如下认定。

  (双方代理人、委托代理人起立)

  本院认为开心人公司售让取得开心文字商标,其对该商标享有的专用权受到我国商标法的保护,未经开心人公司的许可其他人不允许提供类似服务注册商标相同或者近似的商标,本案中千橡互联公司和千橡网景公司虽然在其经营的社交网站中使用了开心网标识和kaixin.com域名提供社会性网络服务,但鉴于该服务类别与涉案开心文字注册商标核准的服务类别不相同、不近似,故千橡互联公司和千橡网景公司并未侵犯开心网公司的注册商标权。开心人公司主张千橡互联公司和千橡网景公司上述行为侵犯其注册商标专用权的主张依据不足,本院不予支持。同时鉴于本院未认定千橡互联公司和千橡网景公司的行为侵犯开心人公司注册商标专用权,千橡互联公司和千橡网景公司已向国家工商行政管理总局商标局公司申请开心人公司商标注册商标为由,本院不予支持。根据开心人公司提供的相关证据本院认定社交网站kaixin001.com开心网于2008年3月开通后,用户数量迅速扩张,并在较短时间内得到了网络拥护和业界认可,开心人公司通过kaixin001.com开心网提供的社会性网络服务在2008年3月之后的较短期间既已构成知名服务,该网站名称作为网络用户识别该服务的最重要的途径,成为了该知名服务的特有名称,受到我国不正当竞争法的保护。千橡互联公司作为互联网业界具有一定影响力的公司,在开心人公司通过kaixin.com开心网提供的社会性网络服务已构成知名服务的情况下,于2008年10月使用该知名服务的特有名称开心网作为网站名称,在相同行业和领域中向公众提供社会性网络服务,使网络用户对二者提供的服务产生混淆。千橡互联公司的上述行为具有主观过错,构成了不正当竞争,应承担相应的法律责任。

  此外,千橡互联公司明知其所域名的kaixin.com涉嫌侵权,仍在纠纷处理过程中该网站交由全资子公司千橡网景运营。另外,未告知本案具有重大关联的事实,致使本案审理时间延长,本院认为千橡网景使用开心网的行为具有主观过错,构成不正当竞争,应承担相应的法律责任。

  本案中开心人公司还主张使用kaixin.com域名是对开心网知名服务特有名称kaixin001.com知名域名的仿冒构成不正当竞争,对此本院认为,开心网之所以被认定为开心人公司的知名服务的特有名称,是由于在当前的网络环境下,相对域名而言网站名称是网络用户识别网络服务及区别不同网络服务更重要、更基本的方式,本案中kaixin.com域名开心网名称与kaixin001.com之间具有一定的关联,但仍有一定的差距,在通常情况下单纯基于上述观点不足以导致网络用户对经营者提供的网络服务产生误认,故本院认为千橡互联公司和千橡网景公司使用kaixin.com域名的行为不是对开心网知名服务特有名称kaixin001.com域名的仿冒行为,不构成不正当竞争。开心人公司的上述主张依据不足,本院不予支持。

  此外开心人公司还主张千橡互联公司和千橡网景公司在网站首页使用笑脸开心网文字组合标志构成对kaixin001.com开心网网站首页亲情网站与开心文字符合标志仿冒构成不正当竞争,本院认为营业用具的使用、营业人员的服饰构成独特风格的营业形象,开心人公司的主张依据不足,本院不予受理。

  综上,开心人公司主张千橡互联公司和千橡网景公司使用开心网作为网站名称在同业竞争中使用开心人公司提供的知名社会性网络服务的特有名称的行为构成了不正当竞争,应承担侵权赔偿损失的民事责任,该主张理由正当,本按予以支持。关于停止侵权的方式,本院确认涉案kaixin.com开心网网站的登记经营者已从千橡互联公司变更为千橡网景公司,但考虑到本案的具体情况,制止侵权行为,本院将对判决生效后,千橡互联公司和千橡网景的行为一律予以搁置,本院认为该侵权行为难以认定kaixin.com开心网的所有用户是kaixin001.com开心网的用户,本院将综合千橡互联公司、千橡网景公司涉案侵权行为等方式、规模、后果及主观过错等因素,综合侵权赔偿数额,千橡互联公司和千橡网景公司在变更开心网运营过程中均有主观过错,本院认为考虑到本案的具体情况,开心人公司主张由千橡互联公司与千橡网景公司共同赔偿以及侵权造成损失的主张理由正当,本院予以支持。

  另外,千橡互联公司和千橡网景公司赔礼道歉的行为,网络公众根据相关信息可以判断该行为的主体为千橡互联公司,而非开心人公司,上述行为并未直接对开心人公司的声誉造成损害,开心人公司要求千橡互联公司和千橡网景公司承担公开赔礼道歉的主张依据不足,本院不予支持。

  本院依照《中华人民共和国商标法》第51条、《中华人民共和国反不正当法》第2条第一款第五条第二项、第20条第一款、《最高人民法院关于审理不正当竞争民事案件的解释》,《涉及计算机网络及其民事纠纷案件适用法律的若干问题的解释》判决如下:

  一、千橡互联科技发展有限公司、北京千橡网景科技发展有限公司自本判决生效之日起不得再提供社会性网络服务中使用与北京开心人信息技术有限公司的知名服务的特有名称开心网相同或近似的名称。

  二、北京千橡互联科技发展有限公司、北京千橡网景科技发展有限公司与本判决生日起十日内赔偿北京开心人信息技术有限公司经济损失40万元。

  三,驳回北京开心人信息技术有限公司其它诉讼请求。如果未按本判决指定期间履行,应当依照中华人民共和国民事诉讼法第229条规定,加倍支付。诉讼费用81800元由北京开心人信息技术有限公司负担21800元,由北京千橡互联科技发展有限公司、北京千橡网景科技发展有限公司共同负担6万元。如不同意判决,可在本案判决15日内上诉北京市高级人民法院。

  以上宣读的就是本院对本案做出判决的主要内容。

  原告方律师:是否提出上诉我回去协商以后才能来定。

  被告方律师:我代表千橡互联公司、千橡网景公司当庭提起上诉。

  审判长:今天我们的宣判就到此结束,在闭庭之后书记员将会向双方当事人送达判决书正式文本。

瑞典:小偷偷完笔记本送回数据

不得不说瑞典是一个神奇的地方,每个人都在关心自己的同胞,连小偷也不例外,一名瑞典教授就遇到了这样的稀罕事情。

一天他在他所住的公寓楼梯间放下了他的背包去了洗衣房,等回来的时候发现背包被盗,他的笔记本电脑和钥匙等私人物品被偷,他报了警,几分钟后,等他回到楼梯间,背包又出现了,笔记本电脑不见了,所有东西都物归原主。

如果事情到这里就结束了,我们也许会赞赏一下小偷盗亦有道的RP。结果一周后发生的事情谁也想不到。

教授收到了一个U盘,里面存有笔记本里面所有他的私人信息—小偷花大力气找出并备份了他的资料,并和之前的背包和钥匙一样物归原主。

世界是残酷的,无情的,但它明显正向着健康的方向转变。

前端开发及相关设计制作人员要看的网站

先来一本厚厚的手册——Web Developer’s Handbook
网址: www.alvit.de/handbook/
这是一本惊天地,集大成的在线参考手册,收录了HTML、CSS、JavaScript、设计、理论等大量丰富内容。

作为一个专业老道的页面制作人员,你不得不看的站点—— /* Position Is Everything */
网址:positioniseverything.net
/* Position Is Everything */ 是一个从IE浏览器bug讨论与研究并解决建立起的一个专业资深网站,目前讨论话题涵盖全线浏览器bug。

在线期刊——A List Apart
网址:www.alistapart.com
引用他们自己的话说:“For People Who Make Websites”。从最初探讨CSS技术,到现在涵盖文化、设计、流程、用户体验等热门领域,A List Apart一直秉承专业内容并且包装专业,期刊内容严谨,形成了线上优质学术氛围并拓展了线下活动。

大名鼎鼎的Stop Design
网址:stopdesign.com
内容以设计方向为主体,Douglas Bowman 是站点掌门人,同时由他组件团队创造了adaptive path[网址:www.adaptivepath.com]。

来自澳大利亚的力量—— max design
网址:www.maxdesign.com.au
他们专注于Web设计制作领域的技术传授与技术挖掘,在线有若干详实精美的教学内容。

另一本在线优秀刊物——Smashing Magazine
网址:www.smashingmagazine.com
内容以设计方向为主,时效性强,更新速度较快。站点经过不断努力,现在已经延伸到线下纸质图书,同时发行了若干电子版图书。

更多相关网站
【Web标准化组织】
W3C,全称“World Wide Web Consortium(W3C)”。W3C由会员制组建而成,全职进行互联网网页标准的研究与制订。由Web的发明者Tim Berners-Lee 和 CEO Jeffrey Jaffe领导。致力于全面挖掘Web潜能。
W3C网址:w3.org

Web Standards Project,“网页标准化项目”是一个由民间草根集合而成,为了将Web变得对于所有人都简洁易用无障碍而努力。
网址:webstandards.org

【Web制作开发】
初学者乐园——W3schools,网址:www.w3schools.com
Web Devout,网址:www.webdevout.net
牛人代号PPK的强大网站,网址:www.quirksmode.org
456 BEREA ST,网址:www.456bereastreet.com
HTML Dog,网址:www.htmldog.com

【基于CSS的网页设计展示】
CSS Zen Garden,网址:www.csszengarden.com
CSS Beauty,网址:www.cssbeauty.com
这种类型的站点有很多,不进行更多展示。另外,随着Web前端技术的不断进步发展,早前的浏览器可能无法胜任或渲染的设计效果,如今诸多都已解决。基于CSS的设计展示,慢慢也将转变为对于设计的欣赏。
在这里再多罗列出一个专门专业展示Flash优秀概念或站点的网站——FWA。
FWA,全称“Favourite Website Awards”,网址:thefwa.com

【ECMAScript(JavaScript)框架】
Prototype,网址:www.prototypejs.org
jQuery,网址:jquery.com
Yahoo的YUI,网址:developer.yahoo.com/yui/
MooTools,网址:mootools.net
Dojo,网址:www.dojotoolkit.org

【相关Blog】
CSS Zen Garden 创建者——Dave Shea的站点:www.mezzoblue.com
CSS资深开发者,Eric Meyer 的站点:meyerweb.com
Jeffrey Zeldman的站点:www.zeldman.com

来源:http://119.88.56.78/qeeblog/?p=95

香港演员罗家英模仿苹果CEO乔布斯

苹果公司CEO史蒂夫乔布斯以iPhone、iPad产品的成功吸引了不少的粉丝,这位被尊称为乔帮主的科技明星自然会有不少人去追随模仿,不过最大牌的乔布斯模仿秀会让不少人感到意外,他就是香港著名演员罗家英。

  昨天香港铁路有限公司发布他们最新版的iPhone应用程序MTR Mobile 2.0,为了让发布会举办更加成功,港铁邀请了著名演员罗家英模仿乔布斯,准备打造一场山寨版苹果发布会。

  经过策划安排,包括现场布局、灯光气氛等环境都与苹果的新品发布会非常相似,罗家英的衣着打扮也与乔帮主毫无差异,再加上他擅长的演技,将乔布斯的语气、动作等模仿到极致。现场还为幸运观众送出多部iPhone 4,整个山寨发布会举行的非常成功。

  MTR Mobile 2.0是港铁公司推出的交通出行服务应用,在2.0版中新加入了增强现实、离线阅读、会员区等新功能。

  作者:永辉

原文链接:http://tech.sina.com.cn/it/2010-10-14/17244746720.shtml

为什么Lisp语言如此先进?(译文)

为什么Lisp语言如此先进?

作者:Paul Graham

译者:阮一峰

英文原文:Revenge of the Nerds
译文网址:http://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html

(节选自即将出版的《黑客与画家》中译本)
一、

如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。

Python模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能,也一起模仿了。至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对。

编程语言现在的发展,不过刚刚赶上1958年Lisp语言的水平。

二、

1958年,John McCarthy设计了Lisp语言。我认为,当前最新潮的编程语言,只是实现了他在1958年的设想而已。

这怎么可能呢?计算机技术的发展,不是日新月异吗?1958年的技术,怎么可能超过今天的水平呢?

让我告诉你原因。

这是因为John McCarthy本来没打算把Lisp设计成编程语言,至少不是我们现在意义上的编程语言。他的原意只是想做一种理论演算,用更简洁的方式定义图灵机。

所以,为什么上个世纪50年代的编程语言,到现在还没有过时?简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。

三、

Fortran语言也是上个世纪50年代出现的,并且一直使用至今。它代表了语言设计的一种完全不同的方向。Lisp是无意中从纯理论发展为编程语言,而Fortran从一开始就是作为编程语言设计出来的。但是,今天我们把Lisp看成高级语言,而把Fortran看成一种相当低层次的语言。

1956年,Fortran刚诞生的时候,叫做Fortran I,与今天的Fortran语言差别极大。Fortran I实际上是汇编语言加上数学,在某些方面,还不如今天的汇编语言强大。比如,它不支持子程序,只有分支跳转结构(branch)。

Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp刚设计出来的时候,就很强大,接下来的二十年,它提高了自己的运行速度。而那些所谓的主流语言,把更快的运行速度作为设计的出发点,然后再用超过四十年的时间,一步步变得更强大。

直到今天,最高级的主流语言,也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。

四、

Lisp语言诞生的时候,就包含了9种新思想。其中一些我们今天已经习以为常,另一些则刚刚在其他高级语言中出现,至今还有2种是Lisp独有的。按照被大众接受的程度,这9种思想依次是:

1. 条件结构(即”if-then-else”结构)。现在大家都觉得这是理所当然的,但是Fortran I就没有这个结构,它只有基于底层机器指令的goto结构。

2. 函数也是一种数据类型。在Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够储存在变量中,也能当作参数传递。一种数据类型应该有的功能,它都有。

3. 递归。Lisp是第一种支持递归函数的高级语言。

4. 变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。

5. 垃圾回收机制。

6. 程序由表达式(expression)组成。Lisp程序是一些表达式区块的集合,每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同,它们的程序由表达式和语句(statement)组成。

区分表达式和语句,在Fortran I中是很自然的,因为它不支持语句嵌套。所以,如果你需要用数学式子计算一个值,那就只有用表达式返回这个值,没有其他语法结构可用,因为否则就无法处理这个值。

后来,新的编程语言支持区块结构(block),这种限制当然也就不存在了。但是为时已晚,表达式和语句的区分已经根深蒂固。它从Fortran扩散到Algol语言,接着又扩散到它们两者的后继语言。

7. 符号(symbol)类型。符号实际上是一种指针,指向储存在哈希表中的字符串。所以,比较两个符号是否相等,只要看它们的指针是否一样就行了,不用逐个字符地比较。

8. 代码使用符号和常量组成的树形表示法(notation)。

9. 无论什么时候,整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码;也可以在编译期读取或运行代码;还可以在运行期读取或者编译代码。

在读取期运行代码,使得用户可以重新调整(reprogram)Lisp的语法;在编译期运行代码,则是Lisp宏的工作基础;在运行期编译代码,使得Lisp可以在Emacs这样的程序中,充当扩展语言(extension language);在运行期读取代码,使得程序之间可以用S-表达式(S-expression)通信,近来XML格式的出现使得这个概念被重新”发明”出来了。

五、

Lisp语言刚出现的时候,它的思想与其他编程语言大相径庭。后者的设计思想主要由50年代后期的硬件决定。随着时间流逝,流行的编程语言不断更新换代,语言设计思想逐渐向Lisp靠拢。

思想1到思想5已经被广泛接受,思想6开始在主流编程语言中出现,思想7在Python语言中有所实现,不过似乎没有专用的语法。

思想8可能是最有意思的一点。它与思想9只是由于偶然原因,才成为Lisp语言的一部分,因为它们不属于John McCarthy的原始构想,是由他的学生Steve Russell自行添加的。它们从此使得Lisp看上去很古怪,但也成为了这种语言最独一无二的特点。Lisp古怪的形式,倒不是因为它的语法很古怪,而是因为它根本没有语法,程序直接以解析树(parse tree)的形式表达出来。在其他语言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。它由列表构成,而列表则是Lisp的基本数据结构。

用一门语言自己的数据结构来表达该语言,这被证明是非常强大的功能。思想8和思想9,意味着你可以写出一种能够自己编程的程序。这可能听起来很怪异,但是对于Lisp语言却是再普通不过。最常用的做法就是使用宏。

术语”宏”在Lisp语言中,与其他语言中的意思不一样。Lisp宏无所不包,它既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习宏。

就我所知,宏(采用Lisp语言的定义)目前仍然是Lisp独有的。一个原因是为了使用宏,你大概不得不让你的语言看上去像Lisp一样古怪。另一个可能的原因是,如果你想为自己的语言添上这种终极武器,你从此就不能声称自己发明了新语言,只能说发明了一种Lisp的新方言。

我把这件事当作笑话说出来,但是事实就是如此。如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样的功能,还有一种把函数写成列表的表示方法,那么在它们的基础上,你完全可以推导出Lisp语言的所有其他部分。事实上,Lisp语言就是这样定义的,John McCarthy把语言设计成这个样子,就是为了让这种推导成为可能。

六、

就算Lisp确实代表了目前主流编程语言不断靠近的一个方向,这是否意味着你就应该用它编程呢?

如果使用一种不那么强大的语言,你又会有多少损失呢?有时不采用最尖端的技术,不也是一种明智的选择吗?这么多人使用主流编程语言,这本身不也说明那些语言有可取之处吗?

另一方面,选择哪一种编程语言,许多项目是无所谓的,反正不同的语言都能完成工作。一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。但是,无数的项目根本没有苛刻条件的限制。大多数的编程任务,可能只要写一些很小的程序,然后用胶水语言把这些小程序连起来就行了。你可以用自己熟悉的编程语言,或者用对于特定项目来说有着最强大函数库的语言,来写这些小程序。如果你只是需要在Windows应用程序之间传递数据,使用Visual Basic照样能达到目的。

那么,Lisp的编程优势体现在哪里呢?

七、

语言的编程能力越强大,写出来的程序就越短(当然不是指字符数量,而是指独立的语法单位)。

代码的数量很重要,因为开发一个程序耗费的时间,主要取决于程序的长度。如果同一个软件,一种语言写出来的代码比另一种语言长三倍,这意味着你开发它耗费的时间也会多三倍。而且即使你多雇佣人手,也无助于减少开发时间,因为当团队规模超过某个门槛时,再增加人手只会带来净损失。Fred Brooks在他的名著《人月神话》(The Mythical Man-Month)中,描述了这种现象,我的所见所闻印证了他的说法。

如果使用Lisp语言,能让程序变得多短?以Lisp和C的比较为例,我听到的大多数说法是C代码的长度是Lisp的7倍到10倍。但是最近,New Architect杂志上有一篇介绍ITA软件公司的文章,里面说”一行Lisp代码相当于20行C代码”,因为此文都是引用ITA总裁的话,所以我想这个数字来自ITA的编程实践。 如果真是这样,那么我们可以相信这句话。ITA的软件,不仅使用Lisp语言,还同时大量使用C和C++,所以这是他们的经验谈。

根据上面的这个数字,如果你与ITA竞争,而且你使用C语言开发软件,那么ITA的开发速度将比你快20倍。如果你需要一年时间实现某个功能,它只需要不到三星期。反过来说,如果某个新功能,它开发了三个月,那么你需要五年才能做出来。

你知道吗?上面的对比,还只是考虑到最好的情况。当我们只比较代码数量的时候,言下之意就是假设使用功能较弱的语言,也能开发出同样的软件。但是事实上,程序员使用某种语言能做到的事情,是有极限的。如果你想用一种低层次的语言,解决一个很难的问题,那么你将会面临各种情况极其复杂、乃至想不清楚的窘境。

所以,当我说假定你与ITA竞争,你用五年时间做出的东西,ITA在Lisp语言的帮助下只用三个月就完成了,我指的五年还是一切顺利、没有犯错误、也没有遇到太大麻烦的五年。事实上,按照大多数公司的实际情况,计划中五年完成的项目,很可能永远都不会完成。

我承认,上面的例子太极端。ITA似乎有一批非常聪明的黑客,而C语言又是一种很低层次的语言。但是,在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。

附录:编程能力

为了解释我所说的语言编程能力不一样,请考虑下面的问题。我们需要写一个函数,它能够生成累加器,即这个函数接受一个参数n,然后返回另一个函数,后者接受参数i,然后返回n增加(increment)了i后的值。

Common Lisp的写法如下:

(defun foo (n)
(lambda (i) (incf n i)))

Ruby的写法几乎完全相同:

def foo (n)
lambda {|i| n += i } end

Perl 5的写法则是:

sub foo {
my ($n) = @_;
sub {$n += shift}
}

这比Lisp和Ruby的版本,有更多的语法元素,因为在Perl语言中,你不得不手工提取参数。

Smalltalk的写法稍微比Lisp和Ruby的长一点:

foo: n
|s|
s := n.
^[:i| s := s+i. ]

因为在Smalltalk中,局部变量(lexical variable)是有效的,但是你无法给一个参数赋值,因此不得不设置了一个新变量,接受累加后的值。

Javascript的写法也比Lisp和Ruby稍微长一点,因为Javascript依然区分语句和表达式,所以你需要明确指定return语句,来返回一个值:

function foo (n) {
return function (i) {
return n += i } }

(实事求是地说,Perl也保留了语句和表达式的区别,但是使用了典型的Perl方式处理,使你可以省略return。)

如果想把Lisp/Ruby/Perl/Smalltalk/Javascript的版本改成Python,你会遇到一些限制。因为Python并不完全支持局部变量,你不得不创造一种数据结构,来接受n的值。而且尽管Python确实支持函数数据类型,但是没有一种字面量的表示方式(literal representation)可以生成函数(除非函数体只有一个表达式),所以你需要创造一个命名函数,把它返回。最后的写法如下:

def foo (n):
s = [n]
def bar (i):
s[0] += i
return s[0]
return bar

Python用户完全可以合理地质疑,为什么不能写成下面这样:

def foo (n):
return lambda i: return n += i

或者:

def foo (n):
lambda i: n += i

我猜想,Python有一天会支持这样的写法。(如果你不想等到Python慢慢进化到更像Lisp,你总是可以直接……)

在面向对象编程的语言中,你能够在有限程度上模拟一个闭包(即一个函数,通过它可以引用由包含这个函数的代码所定义的变量)。你定义一个类(class),里面有一个方法和一个属性,用于替换封闭作用域(enclosing scope)中的所有变量。这有点类似于让程序员自己做代码分析,本来这应该是由支持局部作用域的编译器完成的。如果有多个函数,同时指向相同的变量,那么这种方法就会失效,但是在这个简单的例子中,它已经足够了。

Python高手看来也同意,这是解决这个问题的比较好的方法,写法如下:

def foo (n):
class acc:
def _ _init_ _ (self, s):
self.s = s
def inc (self, i):
self.s += i
return self.s
return acc (n).inc

或者

class foo:
def _ _init_ _ (self, n):
self.n = n
def _ _call_ _ (self, i):
self.n += i
return self.n

我添加这一段,原因是想避免Python爱好者说我误解这种语言。但是,在我看来,这两种写法好像都比第一个版本更复杂。你实际上就是在做同样的事,只不过划出了一个独立的区域,保存累加器函数,区别只是保存在对象的一个属性中,而不是保存在列表(list)的头(head)中。使用这些特殊的内部属性名(尤其是__call__),看上去并不像常规的解法,更像是一种破解。

在Perl和Python的较量中,Python黑客的观点似乎是认为Python比Perl更优雅,但是这个例子表明,最终来说,编程能力决定了优雅。Perl的写法更简单(包含更少的语法元素),尽管它的语法有一点丑陋。

其他语言怎么样?前文曾经提到过Fortran、C、C++、Java和Visual Basic,看上去使用它们,根本无法解决这个问题。Ken Anderson说,Java只能写出一个近似的解法:

public interface Inttoint {
public int call (int i);
}

public static Inttoint foo (final int n) {
return new Inttoint () {
int s = n;
public int call (int i) {
s = s + i;
return s;
}};
}

这种写法不符合题目要求,因为它只对整数有效。

当然,我说使用其他语言无法解决这个问题,这句话并不完全正确。所有这些语言都是图灵等价的,这意味着严格地说,你能使用它们之中的任何一种语言,写出任何一个程序。那么,怎样才能做到这一点呢?就这个小小的例子而言,你可以使用这些不那么强大的语言,写一个Lisp解释器就行了。

这样做听上去好像开玩笑,但是在大型编程项目中,却不同程度地广泛存在。因此,有人把它总结出来,起名为”格林斯潘第十定律”(Greenspun’s Tenth Rule):

“任何C或Fortran程序复杂到一定程度之后,都会包含一个临时开发的、只有一半功能的、不完全符合规格的、到处都是bug的、运行速度很慢的Common Lisp实现。”

如果你想解决一个困难的问题,关键不是你使用的语言是否强大,而是好几个因素同时发挥作用(a)使用一种强大的语言,(b)为这个难题写一个事实上的解释器,或者(c)你自己变成这个难题的人肉编译器。在Python的例子中,这样的处理方法已经开始出现了,我们实际上就是自己写代码,模拟出编译器实现局部变量的功能。

这种实践不仅很普遍,而且已经制度化了。举例来说,在面向对象编程的世界中,我们大量听到”模式”(pattern)这个词,我觉得那些”模式”就是现实中的因素(c),也就是人肉编译器。 当我在自己的程序中,发现用到了模式,我觉得这就表明某个地方出错了。程序的形式,应该仅仅反映它所要解决的问题。代码中其他任何外加的形式,都是一个信号,(至少对我来说)表明我对问题的抽象还不够深,也经常提醒我,自己正在手工完成的事情,本应该写代码,通过宏的扩展自动实现。

(完)