Archive for the Category “ 拿来主义 ”
15
Dec
Post on 4:30 PM, 2009/12/15, by LovelyMMX

很久没有转贴什么东西了,现在习惯每天上上kaixin001,看看朋友们的动态,看看杭州热的七十码杯具,时常能看到诸如

新世纪女性:上得了厅堂,下得了厨房,写得了代码,查得出异常,杀得了木马,翻得了围墙,开得起好车,买得起新房,斗得过二奶,打得过流氓…

新世纪男性:睡得了地板,住得了走廊,跪得起主板,补得了衣裳,吃得下剩饭,付得起药方,带得了孩子,养得起姑娘,耐得住寂寞,争做灰太狼…

这样的让人忍俊不禁的打油诗,但是基本笑笑也就过去了,但是今天看到的若干桥段确实属于能引起共鸣,百看不厌的,至今回味仍满脸笑意。不过可能非计算机专业的很难理解其中的精髓所在罢了。所以“语录”出自网络,鉴于看到的已经是转贴了N手的,无法一一著名出处了。

1“咚咚咚”“谁?”过了很久……“Java”

2换一个电灯泡需要几个程序员?一个也不要,这是硬件问题。

3一个计算机 系学生坐在树下学习,又有一个计算机系学生骑着一辆很炫的自行车经过。前一个学生问道:“你的车从哪儿弄来的?”骑车的回答说:“我在外面学习的时候,一 个漂亮的MM骑着车过来,她脱光了所有的衣服对我说,‘你想要什么我都给你’。”“明智的选择!你穿她的衣服肯定不合适的。”前一个学生说道。

4 怎么使用面向对象的方式变得富有?继承。

5 要理解递归,你先要理解递归。

6 一男子在路边一根接着一根地抽烟。一个女士走过来对他说:“嘿,你不知道你是在慢性自杀吗?注意看看烟盒上的警告信息。”“没关系”,男子悠然自得地又吸 了一口:“我是个程序员。”“嗯?这和你是程序员有什么关系?”“我们一点儿也不在乎警告(warning),我们只在乎错误(error)。”

7(唔…… 这个貌似跟程序员没关系……)地理学家和数学家在飞机上坐在了一起。地理学家伸过头来问数学家想不想玩个有趣的游戏。数学家只想睡一觉,所以就礼貌地拒绝 了。可地理学家坚持说这个游戏 很有趣,他解释说:“我问你一个问题,如果你回答不上来,你就给我5美元。然后你再问我一个问题,如果我回答不上来,就给 你5美元。”数学家又一次礼貌地 拒绝了。这下地理学家有点儿激动,说道:“这样吧,如果你不知道答案就给我5美元,如果我不知道答案的话就给你50美 元!”这下子数学家有了兴趣,并且他也明白如果他一直不同意的话也没法入睡,所以就加入了游戏。地理学家先问了第一个问题。“地球到月球的距离是多少?” 数学家一句话不说,掏出钱包来给了地理学家5美元。该数学家问问题了。他问地理学家:“什么东西上山的时候三只脚,下山的时候四只脚?”地理学家疑惑地看 了一下数学家。他取出笔记本电脑,查找了他所有的资料。他通过飞机上的调制解调器上网查找美国国会图书馆,还发送E-mail问了他的同事——但是始终没 找到答案。过了一个小时,他叫醒了数学家并奉上50美元现金。数学家礼貌地收下了钱,转过头去接着睡觉。地理学家越来越感到迷惑不已,他叫醒了数学家,问 道:“好吧,答案到底是什么?”数学家又是二话不说,掏出钱包,给了地理学家5美元。

8  一百万只猴子,给他们一百万个键盘,其中的一个会写出Java程序,其它的写的都是Perl程序。

9  十 个顶尖软件工程师参加培训管理人员的课程。老师提出了这样一个问题:“假如你供职的公司是为航空电子设备提供软件的。有一天你乘飞机出差,当你上了飞机后 你发现一个牌子上写着这个飞机用的是你的团队开发的Beta版软件,你会下飞机吗?”
九个软件工程师举了手。老师看着第十个问道:“你为什么愿意留在飞机上?”这人回答说:“如果是我的团队写的这个软件,飞机根本无法起飞,根本谈不上坠毁。”

10 为什么程序员总是分不清万圣节和圣诞节?因为 Oct 31 == Dec 25。

11 换一个电灯泡需要几个微软程序员?一个也不要,他们会把黑暗变成标准然后告诉每个人:“我们就是这么设计的。”

12 Keyboard not found … press F1 to continue

13 Unix是用户友好的,只是要成为Unix的用户很困难。

14 这个笑话大概来自70年代的米国:一个新手在试着修复一台坏了的LISP机器,他的方法就是反复关上电源然后打开。专家看到之后,严厉地批评说:“你这样是没用的,你必须要明白出错的深层次原因。”

专家关掉电源,然后打开。运行正常了。

15 计算机科学家靠什么避孕?他们的人格魅力。

16 一 个微软工程师正走在路上,突然听到一只青蛙说:“如果你吻我一下的话,我就会变成漂亮的女人,我们可以结婚,从此幸福地生活在一起。”工程师看着青蛙想了 一下,抓起它轻轻地放在自己的上衣口袋里。青蛙把头伸出来说:“怎么,你不准备吻我吗?”“是的”,工程师说:“我在微软工作,没有时间娶妻——不过有一 只会说话的青蛙还是挺酷的。”

17 换一个电灯泡需要几个C++程序员?你还在用面向过程的思维考虑问题。一个设计良好的电灯泡类必然封装了换灯泡的方法,所以你要做的就是调用“换电灯泡”方法。

18 两个程序员在聊天:“我昨天碰到个辣妹。我把她带回家,马上就开始如饥似渴地亲吻,她就坐在我的键盘上,然后……”“你在家里也有台电脑?CPU是什么型号的?”

19 为什么程序员喜爱UNIX:unzip, strip, touch, finger, grep, mount, fsck, more, yes, fsck, fsck, fsck, umount, sleep

20 电脑是高速的笨蛋,程序员是低速的笨蛋。

21 一个存放了一半数据的数组:悲观的程序员觉得数组是半空的。乐观的程序员觉得数组是半满的。真正的程序员?觉得数组占用的空间过大,需要调用realloc()。

22编译成功了!交付吧

02
Nov
Post on 12:07 PM, 2009/11/02, by LovelyMMX

31日,一代大师驾鹤西去,读过了几篇大段相互抄袭,内容基本完全一致的不同新闻报道之后,不禁感慨,大师真能安心而去么?

联合早报2日刊发了一篇署名的评论文章《二老结伴逝,大师何时还》,作者是暨南大学的蒋璟璟。文中,作者在感慨一年内四位大师相继作古之余,也把钱老先生生前的一句疑问重新提出: “为什么现在我们的学校总是培养不出杰出人才?”。遗憾的是,作者并未深入挖掘根由,在很多地方都是“点到即止”,没有太多的展开跟延伸,让人读来屡屡觉得意犹未尽。我善意的推测作者应该不是果真如此短视,无力探究是非根本之理的糊涂人,大约是受限于本身的地位处境尴尬,不方便像鲁迅那样毫无情面地对一些弊端进行抨击嘲讽吧。

虽然扭捏谨慎,但文章也的确指出了学术环境欠佳,急功近利等等的问题,甚至也不无调侃地写道 “困惑的是,如今海外留学的中国学生何止万千,为什么就是出不了一个如钱老抑或贝老的翘楚呢?最有资格回答这个问题的,或许是浙江大学那个跳楼的海归博士吧。” 我无意写篇文章去针砭时弊,或者去完成作者未尽的事业,纠结出问题的根源所在,仅仅罗列点其他的新闻跟事实,或许就能说明很多问题了。

1)上面提到文章刊发不久,就被国内诸多网站争相转载,时间所限,无法考证究竟是哪家网站做了天下先,第一个发现并转载了原文。只知道这家网站的记者或者编辑在转载的时候,为了将该新闻条目作为自己的业绩,便自拟了个打油诗式的新题目 《海归何止千万人 为何再无钱学森》,匆匆把原文字句重组了一下作为小序,继而就整段的摘抄。确实是摘抄,不是通篇拷贝复制的,因为涉及敏感话题的最有资格回答大师疑问的浙大跳楼海归就被和谐掉了。好吧,这至少说明了你在摘抄之前还是读过原文,用过大脑的,虽然你不声不响给原文改名,并且隐去原始链接地址的做法有点不厚道,但毕竟还保留了出处跟作者姓名,让有心探究根源的人不至于完全迷失于茫茫网络之中,与其他那些从你这二手信息源直接复制整篇文章和其中的错别字的网站相比,还是强很多了。瞧,这就是我们的学术环境,这就是原作者所说的“却偏执崇拜论文,追求数量,全不见其间掺杂多少抄袭与垃圾”

2)去年10月,钱永健获得诺贝尔化学奖的时候,联合早报也有一篇评论文章:《为什么不是钱永健而是钱学森的侄儿钱永健》,作者黄福良。该文是我们学术风气败坏的另一佐证:你是谁不重要,你做了什么也不重要,重要的是你得有个足够大的关系人挂在自己名字前面做定语。或许这个风气并不是始于学术界,而是万恶的政治产物,比如最近大家都比较耳熟能详的毛三代准少将。

最后还是忍不住说一句,从小接受到的教育一直是说,钱老乃关公式的人物,人在曹营心在汉,满腔忠心赤胆,一意回国为建设四化贡献毕生力量。但刚刚查阅维基百科(中,英文双语相同)才知道,他老人家1949年也是提交了入籍申请的,大约是在入籍的政审阶段被发现隐瞒30年代的入党事实,才被美帝猜忌排挤迫害软禁的。且不管他提出归国的要求是在被软禁前还是后(注意争议是在被迫害前还是后,而不是入籍申请前后,实际上,他申请入籍美帝的事情压根就被政宣部门和谐掉了),仅从他49年提出入籍申请看,不难猜测人家当年最初的打算其实是为帝国主义事业奋斗终生的。胜者王侯败者寇啊,不论你之前做过什么,动机是什么,只要最后一步走对了,自然会有人给你擦屁股。

作为科学家,钱老是一代巨匠,客观贡献上,他对朝廷的付出也几乎无人能出其右,这两条足够我们去尊敬他,纪念他了,至于他早年是否想过改换国籍,又有什么关系呢?难道如果他当年真的成功入籍美帝,之后“投诚”就不会被接纳么?白求恩的封号叫啥来着?伟大的国际主义战士么!钱老,一路走好,愿你安息!

26
Jun
Post on 10:44 PM, 2008/06/26, by LovelyMMX

 

原帖地址:http://blog.seattlepi.nwsource.com/microsoft/archives/141821.asp

中文翻译:http://tech.qq.com/a/20080626/000226_1.htm

—- Original Message —-

From: Bill Gates
Sent: Wednesday, January 15, 2003 10:05 AM
To: Jim Allchin
Cc: Chris Jones (WINDOWS); Bharat Shah (NT); Joe Peterson; Will Poole; Brian Valentine; Anoop Gupta (RESEARCH)
Subject: Windows Usability Systematic degradation flame

I am quite disappointed at how Windows Usability has been going backwards and the program management groups don’t drive usability issues.

Let me give you my experience from yesterday.

I decided to download (Moviemaker) and buy the Digital Plus pack … so I went to Microsoft.com. They have a download place so I went there.

The first 5 times I used the site it timed out while trying to bring up the download page. Then after an 8 second delay I got it to come up.

This site is so slow it is unusable.

It wasn’t in the top 5 so I expanded the other 45.

These 45 names are totally confusing. These names make stuff like: C:\Documents and Settings\billg\My Documents\My Pictures seem clear.

They are not filtered by the system … and so many of the things are strange.

I tried scoping to Media stuff. Still no moviemaker. I typed in movie. Nothing. I typed in movie maker. Nothing.

So I gave up and sent mail to Amir saying – where is this Moviemaker download? Does it exist?

So they told me that using the download page to download something was not something they anticipated.

They told me to go to the main page search button and type movie maker (not moviemaker!).

I tried that. The site was pathetically slow but after 6 seconds of waiting up it came.

I thought for sure now I would see a button to just go do the download.

In fact it is more like a puzzle that you get to solve. It told me to go to Windows Update and do a bunch of incantations.

This struck me as completely odd. Why should I have to go somewhere else and do a scan to download moviemaker?

So I went to Windows update. Windows Update decides I need to download a bunch of controls. (Not) just once but multiple times where I get to see weird dialog boxes.

Doesn’t Windows update know some key to talk to Windows?

Then I did the scan. This took quite some time and I was told it was critical for me to download 17megs of stuff.

This is after I was told we were doing delta patches to things but instead just to get 6 things that are labeled in the SCARIEST possible way I had to download 17meg.

So I did the download. That part was fast. Then it wanted to do an install. This took 6 minutes and the machine was so slow I couldn’t use it for anything else during this time.

What the heck is going on during those 6 minutes? That is crazy. This is after the download was finished.

Then it told me to reboot my machine. Why should I do that? I reboot every night — why should I reboot at that time?

So I did the reboot because it INSISTED on it. Of course that meant completely getting rid of all my Outlook state.

So I got back up and running and went to Windows Update again. I forgot why I was in Windows Update at all since all I wanted was to get Moviemaker.

So I went back to Microsoft.com and looked at the instructions. I have to click on a folder called WindowsXP. Why should I do that? Windows Update knows I am on Windows XP.

What does it mean to have to click on that folder? So I get a bunch of confusing stuff but sure enough one of them is Moviemaker.

So I do the download. The download is fast but the Install takes many minutes. Amazing how slow this thing is.

At some point I get told I need to go get Windows Media Series 9 to download.

So I decide I will go do that. This time I get dialogs saying things like "Open" or "Save". No guidance in the instructions which to do. I have no clue which to do.

The download is fast and the install takes 7 minutes for this thing.

So now I think I am going to have Moviemaker. I go to my add/remove programs place to make sure it is there.

It is not there.

What is there? The following garbage is there. Microsoft Autoupdate Exclusive test package, Microsoft Autoupdate Reboot test package, Microsoft Autoupdate testpackage1. Microsoft AUtoupdate testpackage2, Microsoft Autoupdate Test package3.

Someone decided to trash the one part of Windows that was usable? The file system is no longer usable. The registry is not usable. This program listing was one sane place but now it is all crapped up.

But that is just the start of the crap. Later I have listed things like Windows XP Hotfix see Q329048 for more information. What is Q329048? Why are these series of patches listed here? Some of the patches just things like Q810655 instead of saying see Q329048 for more information.

What an absolute mess.

Moviemaker is just not there at all.

So I give up on Moviemaker and decide to download the Digital Plus Package.

I get told I need to go enter a bunch of information about myself.

I enter it all in and because it decides I have mistyped something I have to try again. Of course it has cleared out most of what I typed.

I try (typing) the right stuff in 5 times and it just keeps clearing things out for me to type them in again.

So after more than an hour of craziness and making my programs list garbage and being scared and seeing that Microsoft.com is a terrible website I haven’t run Moviemaker and I haven’t got the plus package.

The lack of attention to usability represented by these experiences blows my mind. I thought we had reached a low with Windows Network places or the messages I get when I try to use 802.11. (don’t you just love that root certificate message?)

When I really get to use the stuff I am sure I will have more feedback.

发方:比尔·盖茨(Bill Gates)

发送时间:2003年1月15日10时05分

收方:吉姆·阿尔钦(Jim Allchin)(微软三号人物、平台和服务部总裁)

抄送:克里斯·琼斯(Chris Jones)(负责Windows开发的微软副总裁)、巴拉特·斯哈(Bharat Shah)(微软平台部门负责人)、韦尔·波利(Will Poole)(微软副总裁)、布莱恩·瓦伦蒂尼(Brian Valentine)、阿努普·谷普塔(Anoop Gupta)

标题:Windows使用性出现系统性退化

我对Windows使用性如何一直倒退感到非常失望。项目管理团队并没有解决好使用性的问题。

我告诉你们一些我昨天的体验。我昨天想下载Moviemaker,并购买Digital Plus pack,所以我登录了Microsoft.com(微软官方网站)。因为这个网站有下载地址,所以我登录了这个网站。当在打开Microsoft.com页面时,前5次都出现了超时问题。在第六次,在8秒钟延迟之后,我终于能够登录Microsoft.com网站。这个网站的速度太慢,几乎到了无法使用的程度。

Moviemaker并不是五大热门下载软件,所以我决定在网站页面上寻找该款软件。但是软件下载目录过于混乱,使我根本无法找到这款软件。事实上,类似于C:\Documents and Settings\billg\My Documents\My Pictures这样的路径能够更便于用户查询。因为系统没有过滤功能……而且许多事情也使我感到非常奇怪。我试图在Media stuff目录中寻找Moviemaker,但什么都没有找到;然后我在movie目录下寻找,还是什么都没有找到;我在movie maker下寻找,还是一无所获。我最终选择了放弃,并向阿米尔发了一封电子邮件,问他哪里能够下载Moviemaker?难道说该款软件不存在吗?

他们对我的答复是,不应当用使用下载的页面去下载东西。而且,想要下载Moviemaker,应当在网站首页的搜索栏输入movie maker,而不是moviemaker进行搜索。我照着阿米尔教我的方法做了一下,网站慢的毛病并没有得到改变。不过在延时了6秒之后,我终于能够下载Moviemaker了。

我现在想要确信的是,我应该能够看到下载软件的按键。但事实上,这就相当于是一个需要你们解决的难题。因此我看到是我先要对Windows进行更新。这使我感到非常恼火。为什么我要下载Moviemaker却非要对Windows进行更新?我随后登录到了Windows update页面,系统告诉我需要下载一大堆的控件。随后,我看到了许多怪异的对话框。难道说Windows更新知道如何同Windows进行主要谈话?随后我开始进行扫描,扫描用了很长一段时间,而且我被告知需要下载17兆至关重要的补丁。

我照做了,这一部分进展的非常顺利。随后程序告诉我需要安装补丁。安装用了6分钟的时间,我的电脑变得非常缓慢,在这段时间当中,我几乎不能用电脑做任何的事情。为什么安装需要6分钟的时间?这简直是太疯狂了。在这之后,程序告诉我需要重启我的电脑。我为什么要这么做?我每天晚上都会重启电脑,但为什么程序会要求我在那个时候重启电脑?我还是照做了,因为程序坚持要求我这么做。

在重启电脑之后,我再次打开了Windows更新页面。我都忘了我为什么要打开Windows更新页面,从一开始我想做的仅仅是下载Moviemaker。随后我又返回到了Microsoft.com开始下载Moviemaker,下载过程非常的顺利,但安装却用了很长一段时间,为什么安装这款软件要用这么长的时间?程序随后又告诉我需要下载Windows Media Series 9,我决定照做。这一次我看到的对话框时“打开”或者“保存”,没有得到任何的提示,我都不知道该如何去做。下载Windows Media Series 9的过程非常顺利,但安装该款软件用了我整整7分钟的时间。

现在我想我应该可以使用Moviemaker了吧。但令我沮丧的是,我的电脑上根本就没有Moviemaker。我的电脑上有什么?Microsoft Autoupdate Exclusive test package,Microsoft Autoupdate Reboot test package,Microsoft Autoupdate testpackage1,Microsoft AUtoupdate testpackage2和Microsoft Autoupdate Test package3。根本就没有Moviemaker。我最终决定放弃Moviemaker,并决定下载Digital Plus Package。

当我在搜索框内输入Digital Plus Package之后,程序却告诉我拼写出现了错误。所以我只能继续拼写,因为它清除了绝大部分我拼写正确的内容。随后我拼写了5次,但每次程序都清除了我拼写的内容。所以在经过了一个多小时疯狂之后,我既没有得到Moviemaker,也没有得到Digital Plus Package,不过我却看到了Microsoft.com是多么一家糟糕的网站。

我的这一体验告诉我,我们缺少对Windows使用性的关注。我希望确信就此能够得到更多的反馈。

Category: 拿来主义  3 Comments
13
Jun
Post on 11:43 AM, 2008/06/13, by LovelyMMX

PART I

在理解REST on Rails之前,有必要先思考一下这个问题:浏览器是如何工作的?在开始使用Rails构建一个网站之前,我对这个问题是这么认为的:

  • 首先我会在地址栏输入一个URL,或者点击一个链接
  • 然后浏览器会发送一个HTTP请求,并获取响应中的HTML代码
  • 最后我会看到经过浏览器渲染的页面

就这么多,我甚至不知道Form是如何工作的,我觉得它跟点击链接没什么不同。

但在现实世界里,HTTP协议有很严格的指令用于定义浏览器应该如何向服务器发送请求,HTTP同HTML完全是两码事,HTML只不过是一种用于表现页 面内容的标记语言(Markup Language),而HTTP协议则允许浏览器从服务器获取各种类型的数据,HTML只是其中之一。事实上,HTTP协议定义了8中不同类型的请求,尽管如此,我们最熟悉的可能还是下面两种:

  • GET,通过GET请求可以获取Web上的资源,每一个资源都由URL来唯一标识。
  • POST,通过发送一组数据到特定的URL来创建一个新资源。

PART II

你可能对我使用“资源”(Resource)这个词感到迷惑不解,事实上我第一次看到这个词时也跟你一样迷惑,但这正是REST的精髓所在,在REST的世界里,整个Web被看作一组资源的集合,而不是一张张的网页,这是什么意思呢?

昨天,我上当当买了几本书,又去维基百科查了几个词条,然后上新浪看了几条新闻,最后又在NBA网站上看了下骑士对马刺的比赛前瞻。

如果你想要理解REST,那么你就要转变你的思维,不要再认为以上这些东西都是一张张的网页,让我们以维基百科为例,我查阅的REST词条事实上并不是一张网页,它是一个资源,我们使用http://zh.wikipedia.org/wiki/REST访问这个资源,并取得了它的HTML表示,之所以是HTML,是因为浏览器只只是这种方式。

我承认这有些费解,http://zh.wikipedia.org/wiki/REST怎么可能不是网页呢?事实上,确实不是,它是一个使用URL进行标识的资源,当我使用浏览器来访问它时,我得到了它的HTML表示,但维基百科可能还提供其他形式的表示,比如一个PDF,一张JPG图片或者别的什么东西,而我之所以得到一个HTML,是因为我的Firefox发送了一个GET请求,并明确的告诉了服务器,给我一个HTML表示。

再举个更浅显些的例子,比如我向南方航空定了张机票,他们可以通过HTML在浏览器中跟我确认,也可以发短信给我,或者发一封Mail,当然也可以选择最稳妥的方式,打个电话告诉我。事实上就是一种资源,多种表示。

希望经过这番唠叨,你能够理解我所说的,我的机票订单不止是个网页,它是一个资源,当然我可以选择通过浏览器以HTML的方式来查看它。

PART III

一旦你接受了Web就是个巨大的资源集合,这些资源可以使用任意多的方式来表示,而HTML只是其中一种时,你离真正掌握REST已经不远了,但在结束今天的课程前,我还要在絮叨下:事实上,资源并不总是单个的东西,比如维基百科上介绍REST的文章,一张机票订单或者一堆NBA比赛数据,它也可以是一组资源的集合,比如中国传统节日列表,你最好的朋友等等,它们都是资源。

现在,你应该已经理解了什么是资源,在下一节,我们将讲解如何通过HTTP来创建(Creation),读取(Reading),更新(Updating)和销毁(Destruction)一个资源。

REST on Rails 指南2 : 无穷尽的API

通过上一讲,我认为你树立了这个概念:即Web其实是一组资源而不是网页的集合(如果你还不这么认为,那请你先返回再次阅读第一讲)。这一讲我们将从另一个侧面来讲解为什么要有REST?

面向对象设计与分析

如果你曾经学习过面向对象程序设计,那么你很可能会这样开始构建你的新程序:

  • 首先,你需要定义你的问题域——你的程序要解决什么问题
  • 然后,你会定义一个类,这个类的名字一般是名词
  • 接着你会为这个类定义一些方法,方法的名字一般是动词
  • 最用,通过调用其它类的方法,你的这个类顺利完成了它的使命

这看起来不错,事实上我曾经这么干了好多年,这种名词加动词的编程方法被成为“RPC”(远程过程调用),虽然我不明白那个Remote(远程)是指什么,但RPC的确是构建面向对象软件的一个重要方法,不过这种方式却并不适合Web开发。

让我们回到远古,假设现在是1992年(或者Web出现之前的随便什么日子),假设有这样的三家公司,他们需要开发这样三种应用:书籍贩卖,机票贩卖以及卫星地图浏览。并且他们都遵照了面向对象的设计思想,同时出于长远考虑,他们都认为总有一天会有第三方的软件需要同他们的系统进行交互,因此,他们都实现了他们各自的API。

现在,假设你的老板分配给你一个任务:为这三个系统设计一个统一的前端,你会怎么做呢?

我想你首先需要学习这三种完全不同的API,然后为每一个API设计一个UI控件,当用户操作UI控件时,对应的API就会被调用,你可能会通过你学到的一些设计模式知识来简化你的工作量,并使你的代码看起来尽可能酷一些。

无穷尽的API

当然这只是假设,但即使真的如此,在Web时代,你也不需要去学习那些无穷尽的糟糕API,你所要做的就是在你的电脑上安装一个浏览器,不是吗?浏览器对 于你将要访问的网站一无所知,但它却能够准确的返回你想要的,你可以通过它购买音乐,预定机票,甚至从任意远的距离来欣赏你家的屋顶。

这很神奇,不是吗?但是让我们设想一下,如果每个网站都有它们自己的API会是什么样子?如果你想在Amazon买本书,浏览器必须知道如何调用 Amazong.buy(),如果你想查看航班信息,那么浏览器需要知道如何调用UnitedAirlines.CheckFlights(),事实上,这样通吃所有API的程序永远也不可能被开发出来。

所以这就决定了Web不可能是RPC式的,它只能是REST式的。

以资源为中心的设计

那么REST究竟是什么呢?按照维基百科的解释,REST是指Representational State Transfer。这是什么意思呢,简单的说,就是现在每个名词都不再拥有它们各自独一无二的动词了,在REST的世界里,所有名词拥有的动词都是一样的,并且数量也很有限。换句话说,也就是所有的资源都提供了一组相同的API,这些API的实质就是允许随便什么客户端:

  • 获取资源的某种表示
  • 创建一个新资源
  • 更新已存在的资源
  • 销毁一个资源

等一下!那么究竟上面那个API可以让我“购买一本书”呢?搜索“下周二从纽约飞往洛杉矶的航班”又是哪个API完成的呢?

我们将在下一讲回答这个问题,但是如果你已经改变思维,不再认为”买书“就是一个网页,而是开始思考这其实是某个资源的创建,那么我想你其实应该已经知道答案了。

REST on Rails 指南3 : RESTful design

通过上一讲,我们明白了为什么Web需要按照REST的方式来设计,而不是传统的面向对象编程的RPC方式,这一讲我们将通过一个实例来演示如何进行REST方式的Web设计,也就是让我们的设计变的RESTful。

航空公司的需求

我们假设你为一家航空公司工作,你的任务是为他们设计一个航班管理系统,它的功能包括:

  • 允许公司员工通过Web前端来输入航班信息。航班信息包括航班的起飞和降落城市,以及起飞时间等。
  • 允许客户通过手机查询他的航班信息。
  • 允许第三方通过我们提供的API来获取我们的航班信息。

很没有难度,不是吗?如果你是个急性子,你甚至可能都顾不上将你无懈可击的设计转换成UML,就已经在你IDE的编辑框里输入了如下字符:

class FlightSchedule
def CancelFlight
......

但是慢着,在REST的世界里,我们不再需要操心这些,我们需要做的只有一件事情:

定义你的资源!

是的,就这一件,因为REST已经为我们定义好了用于操作这些资源的方法。

在这个例子里,我们首先会想到这几个资源:airports,airplanes,flights。当然可能还会有其它,但就让我们先从这几个开始吧!

我们首先要做的就是为这些资源分配URL,原则只有一个:尽可能的简单明了。

  • /airports,通过这个URL可以访问所有的机场资源
  • /airplanes,通过这个URL可以访问所有的飞机资源
  • /flights,通过这个URL可以访问所有航班资源

还有:

  • /airports/pudong,通过这个URL可以获取浦东机场的相关信息
  • /airplanes/ZJ3543,通过这个URL可以获取编号为ZJ3543的飞机信息
  • /flights/451,通过这个URL咋可以了解到航班451的起飞,降落城市已经起飞时间等信息。

方法已经准备好了

一旦你定义好了你的资源,整个设计也就完成了,因为,REST已经为你准备好了以下四个方法(并且不再需要其它的了):

  • GET,获取资源
  • POST,创建一个新资源
  • PUT,更新已存在的资源
  • DELETE,删除资源

通过HTTP调用这些方法

同样的,我们也不需要关心客户端如何来调用我们的方法,浏览器会帮我们搞定一切。

如果你仅仅只是在地址栏敲了个地址,然后按了下回车,浏览器会生成一条HTTP消息,并通过它来调用你输入的URL所代表的资源的GET方法。

如果你填写了一个表单,并点击了提交按钮,那么浏览器会将你填在表单中的信息组装成一条HTTP POST消息,并通过它来调用你想访问资源的POST方法。

但不幸的是,由于HTML的限制,目前你无法通过浏览器来调用资源的PUT和DELETE方法,不过这不重要,GET和POST对我们已经足够了。

好了,我们的基于REST的设计就这么完成了,下一讲,我们将演示如何使用Rest on Rails来快速优美的实现我们的设计。

REST on Rails 指南4 : 路由

通过上一讲我们了解到,RESTful设计的关键就是定义系统中的资源,这一讲我们将学习在Rails中,如何将请求路由到我们的资源,以及我们应该如何来处理它。

不过,有一点需要先说明:REST并不是Rails的一部分,在Rails出现之前,REST的概念已经存在很多年了,并且REST的应用也并不局限于Web,事实上,它也可以应用到其它各种应用软件的开发中。

资源就是控制器

在我们正式开始之前,我们需要首先明确,在Rails中,资源和model并不总是一对一的关系,有时资源仅仅只是你应用逻辑中的一个实体的抽象,并不需要映射到你的数据库。但资源跟控制器总是一对一的,也就是每个资源都必须有一个与它相对应的控制器,并且你需要重新理解控制器,现在控制器只是REST接口的具体实现,它的全部作用就是根据客户的请求返回资源的某种表示(HTML,XML等)。

所以,就像第2章讲的,我们不在需要去设计那无穷尽的API了,现在我们的控制器只需要定义7个方法:

  • show,处理针对单个资源的GET请求
  • create,处理POST请求,并将创建一个新资源
  • update,处理PUT请求,并更新指定的资源
  • destroy,处理DELETE请求,销毁一个资源
  • index,处理针对多个资源的GET请求
  • new,GET请求,返回一个用于创建资源的表单,
  • edit,GET请求,返回一个用于更新资源的表单

Rails 会帮助我们将用户的请求路由到某个合适的方法,当然,你并不需要实现这全部的7个方法,如果你的系统不允许用户创建和修改资源,那么你只需要实现 index和show方法就可以了。

不过更有可能的一种情况是你觉得这7个方法根本不够,你当然可以选择向控制器添加新的方法,但这其实是因为你的设计遗漏了一些资源,因为我建议,在你向控制器添加新方法之前,最好先重新考虑下你的设计。

方法已经定义好了,下一步的任务就是将用户的请求路由到指定的方法,在router.rb中,你可能会看到这样的路由:

map.connect '/airports/:action/:id', :controller = 'airports'

这条语句将映射/airports/open/45到airports控制器的open方法,你可以通过params[:id]获取URL中的参数 45。但是REST路由有些特殊,它需要同时考虑URL和请求的类型,因此同样是发往/airports/1的请求,如果是GET请求,它需要被路由到 airports的show方法,而DELETE请求则需要被路由到DELETE方法。

不过幸运的是,从Rails1.2开始,我们不再需要通过map.connect来手动的配置REST路由,map.resources会帮我们搞定一切:

map.resources 'airports'

这句话将创建如下的路由规则:

  • 针对/airports/ 的POST请求将被路由到create方法
  • 针对/airports/1 的GET请求将被路由到show方法
  • 针对/airports/1的PUT请求被路由到update方法
  • 针对/airports/1 的DELETE请求被路由到destroy方法
  • 针对/airports/ 的GET请求被路由到index方法
  • 针对/airports/new 的GET请求被路由到new方法
  • 针对/airports/1;edit 的GET请求被路由到edit方法

注意:最后一条逗号分隔的URL看起来很丑陋,但它们在Rails1.2.3中是合法的,不过不用苦恼,它们将在Rails2.0中被去除

现在我们已经完成了URL的路由,下面我们需要做的就是实现这些方法:
不过先别着急着码代码,从Rails1.2开始,我们有了一个新的生成器(generator):scaffold_resource,使用它我们可以很轻松的生成一个符合REST规范的Rails框架,它包含:

  • 资源所对应的model
  • 资源的migration文件
  • 资源所对应的控制器,控制器已经包含了REST所需的7个方法的实现
  • 这7个方法所对应的RHTML文件
  • 一条映射用户请求的路由

让我们仍然从第三讲的例子开始,首先创建一个新程序,然后为它添加一个airport资源:

D:\study>rails REST
D:\study>cd REST
D:\study\REST>ruby script/generate scaffold_resource airport name:string designator:string

修改database.yml文件,设置好你的数据库链接,然后执行:

D:\study\REST>rake db:migrate
D:\study\REST>ruby script/server

现在定位你的浏览器到http://localhost:3000/airports/new,你应该已经可以创建一个新机场了,是不是很神奇?现在,让我们来看看airports_controller.rb,所有的东西都在那了。

你应该会在控制器代码中看到一些奇怪的respond_to块,这正是我们整个REST实现的关键所在,我们将在下一讲详细探讨respond_to的细节。

REST on Rails 指南5 : respond_to

通过上一讲,我们已经对REST on Rails的基本框架有所了解,但是它是如何实现根据客户端的请求类型来返回不同类型的资源表示的呢?这就是我们这一讲所要讲的,秘密就在于respond_to。

首先让我们来看看我们在上一讲中生成的airports控制器的代码:

class AirportsController < ApplicationController
  
def index
    @airports = Airport.find :all
    respond_to do |format|
      format.html
# do nothing, allow Rails to render index.rhtml
      format.js # do nothing, allow Rails to render index.rjs
      format.xml { render :xml => @airports.to_xml }
    end
  end
end

我们以index方法为例,其它方法的实现大同小异。第一行代码很容易理解,获取所有的机场信息,但是接下来的代码就比较费解了,而这也正是REST on Rails的关键所在,那个respond_to是做什么的呢?

我们知道,在HTTP协议中,客户端会在他们的HTTP首部包含一些元信息(meta-information),这些元信息按照“字段:值”的方式来组织,HTTP协议预定义了很多标准字段,其中的一个字段就是“Accept-type“,它代表发送请求的客户端能够支持或者说理解的资源表示类型,如果没有为这个键指定值,服务端会认为客户端能够理解标准的HTML文档,当然,客户端可以为这个字段指定任意的符合MIME规范的类型值,假设客户端设置这个字段为”Accept-Type: text/xml“,则服务端必须返回资源的XML表示。

所以respond_to事实上就是根据HTTP首部的Accept-Type字段来决定向客户端返回那种类型的资源表示,如果不使用respond_to,我们的实现可能会是这个样子:


class AirportsController < ApplicationController

  # Pretend that Rails will call our index action,
  # and will pass in the value of the Accept-Type header
  def index(client_format)
    @airports = Airport.find :all

    if client_format == “text/html”
      # TO DO: render the default template

    elsif client_format == “application/javascript”
      # TO DO: return some javascript

    elsif client_format == “application/xml” || client_format == “text/xml”
      # TO DO: return some XML back the client

    # … more elsif statements here for each MIME type you want to support
    end
  end
end

这很丑陋,不是吗?但它却相当直观,我想respond_to的作者可能最初也是这么写的,或者这段代码至少在他的脑海中闪现过,但立刻就被他否定了,因为它实在是太蹩脚了,所以他对这段代码进行了重整,于是有了respond_to。

respond_to do |format|
  format.html
# do nothing, allow Rails to render index.rhtml
  format.js # do nothing, allow Rails to render index.rjs
  format.xml { render :xml => @airports.to_xml }
end

但是Block内的代码看起来仍然比较古怪,事实上,如果我们理解了respond_to的设计思想,那么这段代码看起来就非常理所当然了。

respond_to基于这样的思想设计的,你不需要知道客户端的请求到底是那种类型,你只需要告诉Rails你准备支持那些类型的请求,Rails会自动帮你处理剩下的事情。

所以,这里我们告诉Rails,对于HTML和JS类型的请求,采用默认的实现,而对XML则使用我们在Block内提供的实现。

指南到这里就结束了,篇幅有限,我们只能对REST的基本概念和它在Rails中的简单实现做一个基本的介绍,REST on Rails的世界还有更多的东西等着你去探索。

我建议你尝试动手创建一个Rails应用,然后试试scaffold_resource生成器,阅读并试着理解生成的代码,然后尝试修改view和controller,事实上,比你想象的要简单的多,不是吗?

祝你好运同时期待你的反馈!

 

Category: 拿来主义  5 Comments
16
May
Post on 3:04 PM, 2008/05/16, by LovelyMMX
原文刊发于5月14日的《金融时报》,文章转贴如下,中文翻译取自google,不很完全,但大意基本准确译出。推荐一读。

The downside of joining the superpower club

By Victor Mallet

Published: May 14 2008 17:27 | Last updated: May 14 2008 17:27

Being a superpower is not all pomp and pleasure. There is more to it than attending summits, deploying aircraft carriers and overthrowing irritating regimes in the Caribbean with which you disagree. You also have to be able to handle criticism, even when you are grappling with a natural disaster such as Hurricane Katrina or the deadly earthquake that struck China’s Sichuan province on Monday.

That China has yet to grasp the downside of its imminent superpower status is evident from a plaintive e-mail doing the rounds of internet forums. The anonymous author of the text, published and republished in various forms by Chinese patriots in response to protests over the Beijing Olympics and the Chinese crackdown in Tibet, bitterly condemns western hypocrisy about the rise of China.

“When we closed our doors, you sent gunboats and opium to open markets. When we embrace free trade, you blame us for taking away your jobs,” the message says. “When we reached a billion people, you said we’re overcrowding the planet. When we have one-child policy, you say it is human rights abuses …

“When we build our industries, you call us polluters. When we sell you inexpensive goods, you blame us for your deficits. When we search for oil, like you did, you call that exploitation and genocide.” The message concludes peevishly, in large print: “What do you really want from us?”

It is a good question. The thrust of the complaint is that China is damned if it does something and damned if it does not. It is worth reading in full because the depth of Chinese anger over western double standards is not always appreciated in Washington or Brussels.

Americans, however, must find it hard to suppress a wry smile. They have been mocked for decades as the citizens of a swaggering, insensitive, militaristic and ecologically destructive superpower – a superpower, furthermore, that proved pathetically incapable of dealing with the aftermath of Hurricane Katrina on home soil in 2005.

Now Americans can stand aside and watch as China feels some of the geopolitical heat that has been directed exclusively at the US since the demise of the Soviet Union.

Evidence of this trend is accumulating. In an FT/Harris monthly opinion poll in Europe’s five biggest nations, conducted in March and April, Europeans for the first time ranked China as the biggest threat to global stability, ahead of the US, North Korea and Iran.

Whatever its military weaknesses, China has already made it as a superpower in the popular imagination. In a recent episode of The Simpsons, the US comedy series, schoolboy Bart Simpson is lured into “pre-enlisting” for the dangerous job of soldier in the US army, to the horror of his mother, Marge. Homer, his clueless father, is unmoved. “Yeah, big deal. By the time Bart is 18, we’re gonna control the world.” He pauses. “We’re China, right?”

The question now is not whether China will become a superpower, but what kind it will be. In the 1960s China, like the Soviet Union, was happy to export its own brand of communism. But Beijing today has no desire to spread Maoism or fight capitalism at home, let alone abroad.

In fact, modern China has a surprising number of qualities in common with the US. They include optimism and confidence, but also arrogance and a degree of ignorance about the outside world. Nationalists in the two countries even share, for the time being, a rather childish hatred of the French – the Americans because of French scepticism over the latest Iraq war and the Chinese because of French support for persecuted Tibetans.

Like all superpowers, China is associated with the crimes of its various protégés. The Soviet Union was lumbered with Fidel Castro, Mengistu Haile Mariam and the tyrants of its satellite states in eastern Europe. The US had Augusto Pinochet, Mobutu Sese Seko, the Shah of Iran and Saddam Hussein. China is forever tainted with Pol Pot, Enver Hoxha and Kim Il-sung. Now it is linked to the Burmese junta, Sudan’s Islamist regime and Robert Mugabe.

Yet even a mediocre country can acquire dubious allies. The true mark of a great nation is that the rest of the world cares what happens inside your borders. By this measure China is already a superpower.

People care first because they are directly affected: by air pollution from China, by radioactivity from Chernobyl, by Hollywood films, Russian literature and Chinese art, and indeed by wars launched from the White House, which explains the view that foreigners have a stake in US elections. People also care because superpowers tend to be respected for their strength and admired for ideals that inspire the citizens of other nations. That is why the world was shocked by the chaos in New Orleans after Katrina, and one reason attention is focused now on Sichuan.

As it happens, the early evidence suggests that the Chinese armed forces have been swift and effective in their rescue efforts, unlike their Burmese counterparts after the devastation of cyclone Nargis. But they will remain under intense scrutiny, just as the Chinese leadership will be closely watched in the approach to the Beijing Olympics.

It is no fun being a superpower, for with power come great responsibilities and the suspicion of foreigners. There is only one sensible answer to the plaintive e-mail about the injustices meted out to China: welcome to superpower status – now you know how it feels to be American.

victor.mallet@ft.com

 
     身为超级大国并不总是风光和愉快的。除参加峰会、部署航母外,超级大国还有其他事情。它必须能应对批评,即便当它在抗击像“卡特里娜”飓风或周一侵袭中国四川省的毁灭性地震这样的自然灾害时。

  中国未能理解近在眼前的超级大国地位的不利方面,这从网上流传的一份忧伤 的电子邮件就可看出。这段文字严厉指责了西方对中国崛起的伪善。

     这篇短文这样写道:“当我们关上大门,你们派来炮舰、运来鸦片;我们拥抱自由贸易,你们责怪我们抢走饭碗;我们有10亿人时,你们说我们将使这个星球毁于一旦;我们限制人口,你们说这是对人权的侵犯……”短文最后一句以大字表达恼怒之情:“你们到底要我们怎么办?”

  这个问题问得好。这种抱怨想说的是中国做与不做都要挨骂。中国人对西方双重标准愤怒之深并不总能获得华盛顿或布鲁塞尔的理解。

  但在这种情形下,美国人很难不窃笑。几十年来他们一直被嘲笑为狂妄自大、麻木不仁、黩武和破坏生态的超级大国子民。而现在,美国人可以站在一边,静观中国感受苏联消亡以来一直针对美国的地缘政治热度。

  这种趋势正日积月累。近期对欧洲最大5国的民调显示,欧洲人首次把中国列为全球稳定的头号威胁。

  尽管中国军力存在弱势,但在舆论看来它已经是一个超级大国了。现在的问题不是中国是否会成为超级大国,而是它会成为怎样的超级大国。

  事实上,当今中国与美国的相似之处惊人的多:既包括乐观和自信,还有傲慢和对外界一定程度的无知。两国的民族主义者一度还都对法国抱有幼稚的仇恨———美国人是因为法国对伊拉克战争的质疑,而中国人是由于法国对“藏独”分子的支持。

  但是,超级大国的真正标志是世界其他国家关注这个国家内部发生的。从这一点来衡量,中国已经是一个超级大国了。

  人们之所以关注,是因为中国的污染、切尔诺贝利核辐射、好莱坞电影、俄罗斯文学,乃至从白宫发动的战争,都会影响到他们。人们之所以关注,还因为超级大国往往因实力和能启发别国人民而受到尊重与钦佩。正由于此,世界才会震惊于“卡特里娜”飓风过后新奥尔良的混乱,世界的目光如今才会聚焦于四川。

  当地震发生时,证据表明中国迅速有效地展开了救援行动。但他们仍将遭到仔细的监视,就像中国在北京奥运会到来之际将一直受到的一样。

  身为超级大国绝非好玩之事,因为伴随着超级大国地位的是巨大责任和外国人的猜疑。对于那封诉说不公正对待中国的忧伤电子邮件只有一个明智的回答:欢迎成为超级大国———你现在能理解美国人的感受了。(作者是《金融时报》亚洲版主编维克托·马莱,汪析译)

Category: 拿来主义  4 Comments