在推特上抱怨面试时问HTTP GETE和POST的区别得到回答都不满意,有人不清楚,当时只回复了看 RFC2616。趁有空说说

面试时得到的回答大多是:POST是安全的,因为被提交的数据看不到,或者被加密的,其它的还有GET的时候中文出现乱码(在地址栏里),数据最大长度限制等等。

说 POST 比 GET 安全肯定是错的,POST跟GET都是明文传输,用httpfox等插件,或者像WireShark 等类似工具就能观察到。

POST和GET的差别其实是很大的。语义上,GET是获取指定URL上的资源,是读操作,重要的一点是不论对某个资源GET多少次,它的状态是不会改变的,在这个意义上,我们说GET是安全的(不是被密码学或者数据保护意义上的安全)。因为GET是安全的,所以GET返回的内容可以被浏览器,Cache服务器缓存起来(其中还有很多细节,但不影响这里的讨论)。

而POST的语意是对指定资源“追加/添加”数据,所以是不安全的,每次提交的POST,参与的代码都会认为这个操作会修改操作对象资源的状态,于是,浏览器在你按下F5的时候会跳出确认框,缓存服务器不会缓存POST请求返回内容。

很遗憾到目前为止没有应聘者能够提到这一点。我猜测这背后的原因大概有两个,一是也许大多数人往往(我也一样)满足于只要完成任务就好,不管用哪个,表单提交了,数据处理了,内容显示或者重新定向到另外一个页面,就算完成了一个任务,从任务表里划掉,结束。而且对大部分项目(OA, CRM, MIS)的大部分情况下,用哪个似乎都可以。

同时,在被商业机构在媒体和书籍上宣传兜售的WS-*概念和使用集成开发环境提供的“方便”的代码生成工具后,“了解”到所有Web服务调用都是通过POST,更潜意识里确定了POST和GET是一样的,而且GET能做的,POST都能做,POST简直就是GET++嘛。自然,能用POST就用POST,不必在乎两者的差别了。

这又让我想起最近学到的一个概念: Radius Of Comprehension,理解的半径:

当学习概念A的时候,需要先了解概念B,而概念C又是理解B的前提。当B和C都是新的需要学习的概念时,可以说A的理解半径是2,如图:

A --> B --> C
|--1--|--2--|

在学习Web开发时,接触到GET和POST时,“理解的半径”可能包涵:

POST vs. GET
     |---> Conditional GET -> ETag -> Cache
     |         `--> Status Code
     `---> HTTP的方法 --> URL

往往因为仅仅满足于完成手上被要求的任务,或者懒于问一个为什么,我们就把自己的理解半径设置成零,那么就学不到更深入的东西,也因此仅仅知道POST和GET不同,而不再会了解不同在哪里,什么是Conditional GET和缓存header等概念。

从一个简单的面试问题谈到这,貌似小题大作了,写到哪算哪吧。

<UPDATE>
看到Fenng Buzz 了这篇文字,引起一些评论,因此在这再讨论两个概念: 安全的(Safe)和幂等的(Idempotent)

安全的是指没有明显的对用户有影响的副作用(包括修改该资源的状态)。HTTP方法里的GET和HEAD都是安全的。

幂等的是指一个方法不论多少次操作,结果都是一样。PUT(把内容放到指定URL),DELETE(删除某个URL代表的资源),虽然都修改了资源内容,但多次操作,结果是相同的,因此和HEAD,GET一样都是幂等的。

所以根据HTTP协议,GET是安全的,也是幂等的,而POST既不是安全的,也不是幂等的。
</UPDATE>

Fenng 前阵子写了“绿色IT生活“,分享了一些心得和建议。

我已经做到或者基本做到的有:

  • 无线网络,网线再见;这个基本做到了,除了特殊情况,比如速度、安全或者稳定要求高的特殊情况。
  • 不用光盘,网上下载;
  • 不换电话,少打电话;从手机更新频率(现在的手机是一年半前买的)和话费,都属于运营商定义的“垃圾用户”;
  • 不写笔记,多写网志 ;这给我改成写在Wiki上(毕竟我写在网志上的东西不会写在纸上,笔记上的也多半不会放在网志上);
  • 买东西尽量买同类商品中品质好一点的那个;这个毛病/习惯我早就有了;
  • 少弄一些劣质 T 恤。穿过一次就扔掉了,太浪费。牛仔裤也尽量少买,发扬”一条裤子穿三年”的革命朴素主义精神。- 这里一定要赞一下自己,过去的365天里没买一件/双 衣服/袜子/鞋子(除了网志年会和厦门马拉松的T-shirt,那都已经算在报名费里的);
  • 不去领一些惠而不费的礼品。基本上都没什么实际用途的东西,尤其是一些展会上厂商分发的玩意儿。- 恩,我也没这样的机会 :-D

我确定做不到或者有别的办法的有:

  • 少买图书,不买杂志;这点对我来说,那是相当的难啊。的确,图书杂志浪费纸张,不环保,在家里还占地方。但又不能不买,解决办法是可以跟朋友同好共享,比如互相借阅或者交换,跟Fenng在线上曾经讨论过,他说异地借书需要快递,可快递也浪费资源。可那至少减少浪费纸张了,再不行就本地朋友之间借阅吧。对了,家里占地方的旧杂志可以废物利用,比如:Craft a Table Using Old Magazines,省了买家具;
  • 抛弃鼠标,这点确实做不到,买个好点的鼠标和鼠标垫(参见前面“买东西尽量买同类商品中品质好一点的那个”一项 :-D);至于尽量熟悉键盘快捷键,减少鼠标操作对阅读造成的中断,这点我赞成并要不断提高;

自己再补充几条:

  • 关于读书,多读电子书,并继续订阅O’Reilly的Safari在线图书馆,昨天看到O’Reilly也裁员了,继续订阅也算是继续支持他们;
  • 使用白板,不仅办公室里用,家里房间里也摆一块,页面设计,程序设计,To-Do-List都可以用。尽量用环保的马克笔,实在不行可以争取废品回收
  • 使用dopplr.com来记录自己的每一次旅行,dopplr会提供每次和一年里旅行所产生的C2O值,这也算保持对环保的意识和对自己的监督吧;
  • 使用小软件来控制和优化电脑的电源使用,比如:Local Cooling省省看
  • 重复利用硬件,废品回收。看看今年有没有机会做个硬件复用的项目,到时候汇报;
  • 去咖啡屋买咖啡争取带自己的杯子,据说这样会被人说是213,213就213吧,比那什么还少37不是?
  • 少抽烟到不抽烟,现在每天在线汇报并记录,自我监控;

最后,对作为写代码的(SA和DBA也需要写代码的)来说,也是最重要的:

写高效率的代码,减少和优化CPU和硬盘使用;

先记这些,年底的时候再回头看看自己做得怎么样。

问题:假设有n个城市C1,C2,…Cn,每个城市里有Mi(1<i<n)个人,他们互相信任并愿意交换和借阅各自拥有的图书,每两个城市(x,y)之间的快递所需耗费的能源已知是Exy,且已知每个人拥有并愿意借出的书(Bi1,Bi2,… )和想看的书;设计一个算法能够:1)让他们所有人能够借阅到自己想看的书,且;2)因快递图书而导致的能源消耗最少。

这要是延伸做个豆瓣App应该很赞吧?

Random Thoughts @ 31 December 2008, “4 Comments”

Best wishes to you all.

Hope we all will have done something good/meaningful/great/interesting/fun/profitable in the next 365 days, and most of all, have no regrets.

keso说

中国用户是有骨气的,很多出色的开源操作系统摆在我们面前,我们从来都没有正眼瞧过。我们不光热爱微软的Windows,还热爱微软的 Office,微软的IE。我们热爱微软,所以我们不给微软的竞争对手任何机会,你的产品再好,我就是不用。我们万众一心,牢牢地替微软把守着市场占有率的阵地。让Linux走开,让金山转型做游戏,让所有超越的梦想慢慢枯竭而死。不用谢我们,这都是一名粉丝应该做的。

其实,粉丝与粉丝还是不一样的,只要掌握了一小撮粉丝,所有的粉丝就会永远像现在“早已丧失了选择的能力“而“爱微软”。

还是让Steve Balmer亲自告诉大家这一群粉丝是谁吧,请看大屏幕:

Developer,软件开发者。只要他们还在开发只在Windows上运行的软件(股票客户端,图片编辑,即时通讯,在线银行服务… 所有工作的挣钱的管钱的打发时间的),那么大部分的用户还是要使用Windows不可。究其根源,与爱无关,与盗版无关,这是依赖。要让大众有更多的选择,首先就要让开发者提供相应的选择。 在大陆,很遗憾,大部分的程序员还是离不开Windows,即使开发语言是跨平台的Java,PHP等,他们还是要在Windows上编程和测试。

哦,对了,他们学习起步的教材的编纂者们,他们的老师们,恐怕也多是粉丝,而且还有言传身教盗版的粉丝

不改变软件开发者们对Windows的依赖,就算半年微软后把黑屏改成每俩小时重启一次,粉丝们的爱还是爱不完的。即使Windows最后彻底不让用了,他们也会像电影《肖申克的救赎》里的老Brooks一样,恢复自由身后,还是在墙上刻上“粉丝曾经在这里”,然后踢倒脚下的凳子,吊死自己,如Brooks的狱友,Morgan Freeman扮演的Red的一句台词:

These walls are funny. First you hate ‘em, then you get used to ‘em. Enough time passes, you get so you depend on them. That’s institutionalized.

这几天在收拾东西,惊喜地翻出95年买的Windows 95和Plus!一套!那天微软全球同步发布Windows 95,晚上(因为与美国的时差)我和同学一起到Funan Center排队购买。当时发布的媒介分CD和3寸盘两种版本(没有MSDN下载,MSJ杂志也还没改名MSDN),轮到我的时候已经没有CD版了,于是先拿了3寸盘的,结果后来补了CD,但3寸盘也留下了。

当时还在上学,系里有个很有名的教授(AP),出版过IBM360(?)操作系统的专著,于是当年操作系统有一个学期的一大部分课时就是听这个瘦小精干的老头侃IBM的JCL(Job Control Language)。那时候学生个人用的都是DOS和Windows 3.11,学校机房里是Sun的工作站和DEC VAX的终端,几乎没人知道离开自己一个北半球的地方有个将在几年内影响全球IT界的Linux。

那个JCL让我昏昏欲睡,虽然老教授目光炯炯抑扬顿挫,但我知道自己不会在那玩意上浪费哪怕一分钟(当然,要是那时候努力学习并精通的话,也许一辈子工作都有保证了 - 但这既不是当时也不是现在的我想要的)。自己买了Jeffrey Ritcher的Advanced Windows了解Win32,直到现在我还是觉得那是一本非常经典的好书,把Windows上的pre-emptive multi-tasking,32位寻址空间,虚拟内存,线程和进程等操作系统上的核心概念深入浅出解释得很透彻明白,我也从此开始了几年的基于Windows开发的历程,OLE, COM, MTS,COM+, … 甚至一直到工作上使用Java之后,曾经为了实现EJB Container也向MTS借鉴了一番。

我现在基本上已经不用Windows了,改用Linux已经好几年,而且是直接从网络上下载后安装。大部分人包括我自己都不是技术上的弄潮儿,都是被新的技术和发现不断推着向前冲。想想看,如果回到过去看现在,对一切的变化,一定要比站在此时看过去要感到震惊得多。

Windows 95是自己掏钱买的第一套Windows,也是自己掏钱买的第一套操作系统(本来想说也是最后一套,但是想想,那些随笔记本一起的OEM的Windows XP其实也是自己掏钱买的…)。

写了上面这些字,回顾一把;拍几张照,纪念一下。

包装盒外观和当时把Windows95作封面的Newsweek和BusinessWeek:

IMG_0539

里面的东西,有CDKEY和正版证书 :)

img_0541

相关链接:

In Infoworld’s article, Java performance improvements touted quoted:

As your program grows in size, the lack of strong typing basically kills your ability to handle a very large program and so you don’t find the million-line Perl program.

In response, chromatic said:

the reason that there aren’t many million-line Perl programs is that the people who are capable of writing and managing million-line Perl programs have better ways to organize their projects than glomming a million lines of Java into a single shared-everything instance.

My reflection and thoughts:

  1. Interestingly, why the pick on Perl? not Python or Ruby or Lisp-flavoured ones?
  2. s/Perl/PHP/g or s/Perl/Python/g etc. on chromatic’s quote still valid and sound;
  3. Java => Strong typing? Not necessarily always;
  4. IntelliJ IDEA is the only reason I still code in Java, Eclipse? that would be another post;
  5. Vim (together with some bash scripts and esvn) has been my primary “IDE” for projects that involve php, python, bash and javascript;
  6. I have written Perl applications before, and would be very happy to pick it up for my next project if everything else fits (e.g. the team factor);
  7. When would I code in Java? most likely a project that:
    • being “enterprisy”, or
    • I am really interested to learn, explore and apply, e.g. Antlr.

无题

王佩入了一台Canon 400D

读着他的文字,自己当时进了第一台相机时的感受冒了出来。

很久很久很久很久以前,我开始玩摄影(准确地说是照相),耗费了许多精力,财力,和时间,周末和朋友出门拍照然后聚在一起放片子,和各家器材店的伙计们混个脸熟,下载无数图片,阅读器材评测报告,研究镜头和胶卷特性曲线,千万思量后下狠心告诉自己这是今年最后进的一个镜头或者相机,然后没多久又进一个…,上班下班只要上网就流连于各个摄影论坛,灌水或者看人灌水,拍砖或者被人拍砖。

那时在无忌摄影论坛(器材派们最热爱的论坛,那时那里只讨论摄影器材不像现在无所不涵连烟斗似乎都有专门的版块)上有一句经典:

如果你爱一个人,送他一台相机;如果你恨一个人,送他一台相机。

王佩一定非常爱自己,除了笔,他又多了一支表达自己的工具。

我已经很久很久很久很久很久没有真正地摸相机了。

就算拿起来,按了快门,也不再有当时那种热情和专注,或者说,那种幸福感。

王佩说:“人生之所以痛苦而有趣,乃是因为永远充满着选择。”

无间道里说:“出来混,总是要还的。”

要还多久?