搜狗浏览器的“真双核”的实现 (0)
2/05/10 •
最近搜狗浏览器发了很多新闻稿给各大网站,号称自己“真双核”。什么意思呢,就是在webkit内核和trident(IE)内核之间“无缝”切换,主要也就是说cookie能够在切换过程中,得以保留和继续发挥作用,一个内核登录的网站,在切换完之后,在另一个内核下,仍旧能够登录,是登录的状态。作为一个曾经二次开发过浏览器的软件开发者,我觉得,这个idea是好的,可是,标准开发渠道是行不通的,得有些技巧。
技术上来说,cookie被微软引入了一个新的属性,叫做httponly,也就是说,脚本环境无法获取这种cookie。因为http是无状态的协议,网站登录的状态,大多用cookie来维系。让某些重要的cookie对脚本环境不可见,会有效的避免cookie被有恶意的脚本获取,增强安全性。同样,这种cookie在对trident引擎二次开发的时候,也是不可以获取的。所以,它无法共享给webkit,切换浏览器内核必然丢失这些cookie。 而httponly的cookie本来就是为了安全登录所用,绝大多数CMS,比如wordpress,都是用httponly的方式来传输登录的cookie,
我是说正规渠道在IE8以下的系统里,无法获取,但如果hook进trident内核的底层http协议的实现,winInet,的确是可以获取这种cookie,其实也不复杂。
题外话,最近搜狐张朝阳发表了一篇很赞的演讲,妙处就在于针砭了当前体制最根本的症结所在,却又能从经济这个层面入题,避免了触动逆鳞。其实,郎咸平一直都在这么干。
当然,我觉得张朝阳的奋笔疾书应该是有大环境的原因的,以前,媒体国家队只是传统传媒领域,而如今又以一种非竞争的姿态,强势切入互联网,理论上,最受影响的,自然是搜狐,新浪这样的传统门户。如果自己的利益,自己不去维护,谁还来维护你呢?建议其它门户大佬参照张朝阳童鞋的做法。
近期文章
孙云丰的苦难 (0)
1/22/10 •
狗狗最近要离家出走了,事儿激起了千层浪。我的观点早已在不同渠道阐明。总的来说,我认为这是一个商业上少见的 principles before profit 的决定,是个让人敬佩的事儿。萨特说,你在选择成为自己的时候,也就为众人做出了选择。这是每一个在中国互联网中苟活着的人,都应该感恩的,感谢狗狗的”take a stand“。中国话来说就是,纯爷们。
但是,有的人,比如孙云丰,面对这样一个事实,还是能从所谓的动机上挑出刺儿。我和易中天一样,国人怎么这么喜欢说人动机呢?因为动机说到底是内在的,除了当事人,其它人无法做出是与不是的判断,只存在信与不信。作为旁观者,我们只能做出一些能够说通的,理由上的推测,而不是查人动机。所以,用动机说事儿,能指望你的读者留下什么心平气和的留言吗?定然是教徒般狂热,这个原因不在读者,在于作者。
但是另一方面,我又灰长灰长同情孙云丰。现实生活里,我们每个人都是多面体,都有着不同的身份,这些身份是枷锁,束缚着每个博客人自油的表达,是每个渴望自油的博客人都希望摆脱的。这也是为什么有的博客是匿名的原因。 孙云丰的博客是匿名的,孙云丰的最后也做了不代表公司的声明。事实上,一个产品设计师,也不可能就产品之外的事儿来代表公司发言。但是不幸的是,这么重要的一点都被人忽视了。我看到南方周末的记者都加上了作者的身份,这无异于要求匿名接受采访的人,你公布了他的真实身份,这是违背职业道德的,真是太让人遗憾了。
我相信关注这件事儿的人,都是对自油有渴望的人。但是自油,绝对不是一句空话,自油应该是每个人都要反求诸己的,强行的把每个博客人和他现实中身份捆版的这种思想,就是在给人上精神枷锁。这不是孙云丰的苦难,也不是我的苦难,是所有渴望自油表达的人的苦难。
“我不同意你说的话,但我誓死捍卫你说话的权利”,这种自油,你做不到的话,那么你也不应该得到。
仿Google编辑器的纯css圆角边框 (0)
1/09/10 •
Google的javascript库:Closure,里面的编辑器的toolbar button,全部都是圆角的边框。显得非常美观,本文解析该边框的制作方法,结果和Google的一样,可通行于包括ie6在内的所有主流浏览器。
一,概念
先介绍用到的几个概念。html元素的margin容易理解,就是元素边距,但是margin为负数的话,什么意思呢?如果margin正数代表同性相斥,那么负数的意思就是好比于异性相吸。两个元素没有margin,就是挨着的,margin为负数的话,两个元素互相交互,交互的值为margin的负数值:
二,原理
Google的圆角边框其实是内外两个元素组成,内元素只有左右边框,外元素只有上下边框,内元素左右分别比外面的元素超出一个像素,视觉效果上,会造成圆角的错觉,这就是取巧的地方。再多出一个像素,视觉上就会出现断裂。
如何让内元素比外元素左右刚好多出一个像素呢?由于内元素有了border,border值为1个像素,也就是说内元素已经比外元素宽出2个像素,但是只是朝一边,通常是右边宽处来,为了让内元素相对于外元素左右各宽出一个像素,就用到了负margin的方法。
三,做法
结果的css代码如下:
.outter {
border-top: 1px solid #f00;
border-bottom: 1px solid #f00;
width: 30px;
height: 30px;
}
.inner {
border-left: 1px solid #f00;
border-right: 1px solid #f00;
width: 30px;
height: 30px;
margin:0px -1px;
*position:relative; /*带星号为对ie67的hack,只有他们可见*/
*zoom:1;
}
其中,ie67对于内元素超出外元素的部分会直接删掉掉,这是一个bug,只要通过某种方法让内元素有haslayout,就可以了。
对阮一峰童鞋推荐的12条Javascript编程经验的看法 (2)
1/03/10 •
阮一峰童鞋在博客上谈了一下他对Javascript语言的看法,说他比较赞同Douglas Crockford说的12点建议,我没有查阅英文原版,但我相信翻译应该是照字面翻译过来的,国内翻译科技图书大多这么个做法。所以,看的时候,有时候不大好理解,需要在脑袋里再回译到英文上去,但是大意不会有太大的偏差。我很惊讶这些建议竟然出自Douglas Crockford,这位著名的Javascript专家。这里的12条我几乎全部都有意见。
首先第一条,关于“==”,“===”号的问题,和第12条一起说吧,我感觉作者没有理解Javascript是动态类型语言这个事实。在c++等静态类型语言的编程的时候,我们没有专门的关键字来定义变量,而是在变量前面用变量类型来定义变量:
int a; //c++
var a; //javascript
这是因为静态类型语言在定义的时候必须指明变量类型,但动态类型语言显然是不必要的,到底在初始的时候设置成哪个类型比较好呢?所以动态类型语言存在一种特殊的状态,就是这个变量定义了,但是没有定义它的类型,这个时候,Javascript把它叫做undefined,其实是the type is undefined的省写的意思。我们也可以认为undefined是一种类型,就像不做任何选择本身也是一种选择。这样理解比较简单,但是无所谓,只要明白意思就好。
动态类型有什么好处?其实他放映的是一个现实的问题,就是很多概念的具体表现形式是多样的,比如礼拜三这个概念,在屏幕上显示的时候,我们希望是“星期三”这个字符串,但是在计算机里参与运算的时候,我们希望是“3”这个数字,这种具体的表现形式上的差异,在静态类型语言里是要被编程人员人为转换的,而动态类型语言里由它的runtime来代为完成,所以在编程上就会简单不少。
同时这也带来个问题,就是在两个变量比较的时候,到底比较他们的值还是比较值的同时包括类型的比较?这在静态类型语言里,比如c++里是不存在的,因为两个变量可以比较的前提是类型必须相等。就好象男可以和女比较,但是不能和公母的母比较,因为这是形容两种动物的。所以,Javascript里出现了“==”,“===”号是必然,而不是混乱,一旦你理解了Javascript的动态类型语言这个特点,自然就明白了。同理,void关键字也是必须的,因为它可以让任何确定了类型的变量回到“undefined”这种特殊状态,当然,这个状态具体有什么用,是另外回事儿,但作为一个语言设计者,既然设计了这个状态,必然一出一入两个方法都必须实现。所以,说void不好理解,是因为对语言不理解。
更为不可思议的是第11条,我感觉作者就是没理解OOP(面向对象)的实现方式是多样的。用静态类型语言里的class关键字不是必须的,目前这个版本的Javascript的OOP实现方式叫做prototype,而不是class。为什么不用class?class的目的是什么,无非就是制造对象的一个模具,根据这个模具来制造对象,但是Javascript的对象是可以在runtime的时候改变的,比如:
var a=new Object();
a.prop1=1; //可以先定义对象,再定义对象的属性
明白否?对象可以直接制造,可以先制造一个什么都不是的对象,而后再往里面添加属性,当然无需模具。这在静态类型语言里面是不可思议的,因为对象有什么属性属于对象的类型,而类型必须提前定义,一旦定义,不可以在后续的代码里增删对象属性,除非你改变class里的内容。
所以,Javascript其实是给了OOP更大的自由,你可以直接造对象,而无需先制造模具,而后再用模具来造对象。当然,这里又牵涉到一个问题,就是大规模生产的问题,想要大规模生产,就必须要用模具,但是这个模具的概念已经不同于静态类型语言里的class的概念,所以,Javascript用到了prototype这个概念,这个概念就是用对象来造对象,也就是对象复制自己成为一个新的对象,而不是通过一个和任何对象无关的class来实例化成一个个具体的对象。对prototype的介绍,后文会说,不过在这之前,不得不说到原文第9条,我感觉作者没有理解什么是function和function object的区别。
Javascript里,一切都是对象,所以,没有面向过程的语言里的那种纯的function。什么是function?无非是用大括号括出来的一堆代码。所以在面向过程的语言里,一个function是不会有属性的。
int Foo(){}//c++纯函数
Foo.prop1 //错误,函数不能有属性
但是,如上代码在Javascript里是合法的:
function Foo(){};//javascript 函数
Foo.prop1 //ok,Foo这个function object具有了prop1这个属性
所以,javascript里所有function都是function object。这是理解Javascript的另一个要点。只有理解这句话,才可以说理解了Javascript。什么是function object?如果熟悉c++就会理解,function object其实是一个对象,但是该对象的类里重载“()”这个函数调用上的符号,导致该object可以函数的那种语法来“调用”。形态上像一个函数,但是可以看到,根本上它是一个object,而不是function,所以才有属性。所以,var关键字定义的东西和function关键字定义是可以通用的:
function foo(){};
var a;
a=foo; //a对象就具有了foo这个funciton object的一切属性和特征。
那么为何要function这个关键字?其一,是需要传统意义上function,这个计算机语言上的概念,其二,就是为了可以prototype,也就是说,在Javascript里,不是任何对象都可以复制自己成为别的对象的,或者说prototype功能的,只有用function定义的对象,而不是var定义的,才具有prototype的属性。当然,必须和new关键字合用。这一切只要理解了Javascript的特点,一点都不会觉得奇怪。
其它的条就不细究了,像“switch贯穿”这样的问题,很明显不合实际,比如switch一个星期,每个case为一天,但是名不是每一天都相同的,周一到周五是工作日,只有周六日是休息,所以,虽然星期这个概念有七个case,但是实际编程的时候,只需要对两种case做出处理,所以,switch贯穿是必须的,好理解的。
还有第10条的“基本数据类型的包装对象”,所谓包装,我猜测原来的英文应该是“wrapper”这个词语。但是在计算机语言里,wrapper一般是指对原始的,繁琐的东西,进行一个包装。在javascript里
new Array();
new Object();
已经是原始的定义数组的方法,没有比它更原始的了。而且,javascript里对任何对象的定义都有一种更为简洁的方式,叫做“literal”,从而无需new这个新建所有对象的通用的关键字:
var str=””; //定义string
var obj={};//定义对象
var foo=function(){};//定义function object
但是哪种定义的方法更好理解是一看便知的,当然是更接近自然语言的“new”更容易让人理解。
云计算将颠覆企业级用应用市场 (0)
12/29/09 •
最近一条新闻,IBM的CEO对云计算,对Google提出了诸多质疑。一向和Google无恩怨的IBM的这条不和谐言论,预示着下一个十年,IT领域的一场重要的战争:云计算将重新定义企业级用应用市场的格局。
目前的企业级应用市场的由一个基本的假定所支撑:企业需要服务器。由此,Oracle提供了服务器需要的数据库,IBM提供了服务器管理需要的 Tivoli,Microsoft提供了服务器需要的操作系统,SAP提供了服务器需要的企业运营的软件。但是在云计算里,整个企业级应用市场分为三个角色:用户消费云计算、SAAS软件提供者提供计算的软件,云计算提供者计算的场所,也就是说,只有云计算的提供着才需要服务器,而云计算的特点决定了规模出效应,也就是仅有的几个大的云计算提供才可能成功。如果云计算得以成功,那么如上所述的四大应用软件提供商:IBM、微软、Oracle、SAP的多数基础架构软件产品将会失去意义,而应用软件产品线至少要以SAAS的方式重构。这就是为什么至今为止对云计算的抵触大多来自这四家的原因。
虽然目前来看,云计算更多的是由于Google在人为的推动,但是云计算的核心理念是:计算像自来水一样,拧开就用,无需关心计算的过程,计算发生的位置,计算的管理等等细节,只需拧开,接收结果。这个描述不但符合个人用户的心理期望,对企业来说,由于大部分企业IT只是消耗品,和水电煤气并无实际区别,所以,也符合企业管理的实际需要。所以企业对“云化”的态度,至少也会是,没什么不可以的。不过,IBM的CEO,还是挑出了一个企业的担心点:数据安全。一般认为“云化”以后,企业的数据,将被迫在云里传输和计算,较目前来看,会有所谓的“不安全感”,但是首先,目前的企业级IT架构本身,数据也是要被计算机存储,如果企业有VPN,也是要在广域网里传输,同时,企业如果是自有机房,那么也是会有非管理人员来管理数据,所谓的不安全因素依然是存在的,只不过企业接受了目前的这种形式而已,其次,就像水表电表一样,一些关键数据,“云化”以后,仍然是在可以用户可见的范围内保存的,比如,最简单的方式,比照水表电表,做一个“云表”这样的架构上的设施,那么这种对数据安全的担忧也是可以一定程度上消除的。
早一点的文章
各分类的近期文章
Programming»
2/05/10 •
搜狗浏览器的“真双核”的实现12/11/09 •
醒醒吧,微软11/06/09 •
Closure Tools:Google的javascript库9/11/09 •
vertical-align详解8/01/09 •
linux内核开发起内讧
web2.0»
1/22/10 •
孙云丰的苦难1/09/10 •
仿Google编辑器的纯css圆角边框1/03/10 •
对阮一峰童鞋推荐的12条Javascript编程经验的看法12/29/09 •
云计算将颠覆企业级用应用市场12/17/09 •
Google Android将结束使命?
三国腾百里»
11/24/09 •
百度i贴吧是迫不得已?
软件作品»
10/15/09 •
WP-WeiBo:新浪微博的WordPress插件7/31/09 •
dwoop: ctags for dreamweaver3/27/09 •
WP-Gmailer:让你的WordPress用Gmail来发邮件12/25/08 •
Firefox spy,探测你的firefox隐私。
题外话»
12/30/09 •
李献计历险记10/22/09 •
Follow your heart9/08/09 •
未选之路8/04/09 •
更喜欢女足了7/25/09 •
我纠结,我打算站错队。
