三月, 2008 | iJohn.org

Archive for 三月, 2008

27th
三月 2008

宇宙大爆炸(二):给我证据
爱因万江斯坦@2008年03月27日 23:16 Post in 科学会 No Comments »

第二集:给我证据

1905年,在瑞士伯尔尼专利局工作的小职员,德国犹太人阿尔伯特·爱因斯坦,发表了一篇关于运动物质中电磁现象的论文,提出了狭义相对论;10年之后,他又提出了广义相对论。相对论同量子论一起推动了20世纪物理学的革命,也为从整体上研究哈勃发现的星系宇宙奠定了理论基础。

20世纪以前的物理学建立在牛顿绝对时空观的基础上:时间永恒地均匀流逝,空间是不动的舞台,两者相互独立并且不受物质的影响。爱因斯坦的革命性发现是:时间和空间是不可分割的统一体,时空告诉物质如何运动,而物质告诉时空如何弯曲。

在爱因斯坦的理论中,两个物体间的相互作用并不像牛顿所描述的那样,直接产生引力,而是由每个物体对周围的时空产生影响,它们在时空中造成凹陷或扭曲,一个物体经过另一个物体的旁边,路径就会受到扭曲而偏向,这就好像是物质互相吸引一样。

广义相对论就好像是描述了一个表面上由网格标记的橡胶膜,放在橡胶膜上的重物看成是恒星或整个星系,网格代表时间和空间,重物的质量越大,空间和时间凹陷的程度也越深,那些从附近经过的东西,也就越难逃脱坠落在这个大质量物体上的命运。可为什么时间和空间会是弯曲的呢?

古希腊的时候,数学家欧几里德,发展了一套几何学理论,就是欧式几何,我们在初中学的几何就是这个,其中的第五公设,可以推出三角形的三个内角之和为180度,于是我们就把符合欧几里德这套几何学的空间叫做平直空间
19世纪初,德国数学家高斯、匈牙利数学家鲍耶、俄国数学家罗巴切夫斯基等人认识到,除了平直空间以外,没有第5公设的非平直空间在逻辑上是可能的。在这样的空间中,三角形的内角之和未必是180度,描述这种空间的几何学叫做非欧几何,如在球面上画一个三角形,其内角和是大于180度的。

非欧几何虽然被发现了,但在爱因斯坦之前,它仅仅是理论上可能。而爱因斯坦的相对论说明,在大质量物体附近的时空真的就需要非欧几何来描述了,这就是所谓的弯曲时空。爱因斯坦并且预言,由于时空弯曲,从太阳表面附近经过的星光会偏折1.75角秒,这是牛顿预言值的两倍。
1919年5月发生了日全食,英国天文学家爱丁顿领导的两个远征队,分赴巴西东北海岸的索布拉尔和西非几内亚湾的普林西比岛进行观测。半年以后,英国皇家学会正式宣布,他们的观测结果符合爱因斯坦的预言,这个消息立刻轰动了世界,广义相对论从此得到科学界公认。

通过牛顿的理论所描绘出的宇宙在时间上和空间上都是无限的,其中有无限多的基本静止的物质,那么这里就有一个矛盾,因为按照这样推算就会有无限大的万有引力,并最终将宇宙形成一个唯一的大物质。
爱因斯坦利用非欧几何里在1917年提出了一个宇宙模型。这个模型的空间部分是一个球面,弯曲的空间使得宇宙看起来是有限的,因此可以避免引力变成无限大的问题。但是爱因斯坦发现,和牛顿的宇宙一样,这个模型里的物质也很难保持静止不动,于是爱因斯坦就在他的广义相对论方程当中加入一个表示斥力的一项:宇宙学常数

但很快有人反对爱因斯坦的这个静态宇宙模型,第一个提出质疑的,是俄国学者阿列克谢·弗里德曼。在1922年发表的一篇论文中,弗里德曼求解了不包括宇宙学常数的广义相对论方程,发现宇宙不会静止不动,而是要么膨胀要么收缩。爱因斯坦看到弗里德曼的论文后,给发表它的杂志去信,说弗里德曼可能算错了。弗里德曼并没有屈服于爱因斯坦的权威,他详细写出了自己的计算过程给爱因斯坦寄去。后来,爱因斯坦在同一个杂志上发表声明,承认自己错了而弗里德曼是对的,伟人都很谦虚的说。

弗里德曼还认识到,如果假定空间有最大的对称性,那么三维空间的几何只有三种可能:一种是我们熟悉的欧几里德空间,即平直空间;一种是爱因斯坦模型中类似球面的空间,即闭合空间;还有一种是类似马鞍形的双曲面空间,即开放空间。在此后几十年的时间里,探索宇宙空间的几何形状一直是宇宙学家们最重要的课题。

1927年,比利时神甫,洛文天主教大学的物理学教授乔治·勒梅特指出:爱因斯坦的静态宇宙模型是不稳定的,如果宇宙学常数的斥力稍稍超过物质的引力,宇宙就会开始膨胀,而且越膨胀越快。

1912年的时候,哈佛大学天文台的女天文学家赫丽塔·勒维特,在南半球天空的麦哲仑星云中找到了一类特殊的天体,叫做”造父变星”。它们的亮度先是快速上升,随后缓慢下降,呈周期性变化,越亮的造父变星光变周期越长。哈佛天文台台长沙普利立即认识到,通过造父变星,可以推算出星系的距离,并测定出银河系的范围为30万光年,虽然比实际值偏高,但这种方法还是帮助他做出了太阳并不在银河系中心的重大发现。

在威尔逊山天文台的哈勃用同样的方法,在仙女座大星云和三角座星云中发现了一批造父变星,推算出它们的距离都是93万光年,甚至远远超出了沙普利的大银河系的范围。哈勃还发现,大部分星系的光谱都发生了红位移,距离越远的星系红位移越大。根据多普勒效应,这意味着所有的星系都在远离我们,而且离我们越远的星系,退行的速度也越快。哈勃在1929年发表的这个初步结论,后来被更多观测所证实,成为人们公认的”哈勃定律”。 其中速度与距离成正比关系的比例常数被称为”哈勃常数”。
哈勃定律的重要意义在于,它显示出宇宙中的星系,就像一个膨胀气球上的斑点,彼此分散那样运动,从而为弗里德曼和勒梅特的膨胀宇宙模型提供了观测依据。

这时,勒梅特听说了哈勃的发现,他知道这是自己一直等待的结果,他决定找到爱因斯坦,当面向他陈述自己的想法。1931年,爱因斯坦访问威尔逊山天文台,哈勃是主人,勒梅特也赶到加州和他们见面。他们推心置腹的讨论了各自的观点。在一次演讲中,勒梅特以诗意的叙述,向爱因斯坦陈述了他的理论。按他的说法,宇宙是从一个原始原子开始,不断分裂膨胀而成的,就如同一颗小小的橡果,长大成为一棵参天的橡树那样,他并以哈勃的观测为证,说明宇宙是创生于”没有昨天的那一天“。演讲结束的时候,他看到爱因斯坦站起来说:”这是我所看到过的最美丽的结果”。从那时开始,爱因斯坦承认引进”宇宙学常数”是他一生最大的失误。

按照哈勃的的计算,他得到宇宙的年龄是20亿年,但当时的地质学家通过研究地球上最古老的岩石得出地球的年龄不小于40亿年,宇宙的年龄怎么可能比地球的年龄还要小呢,这就出现了一个很大的矛盾。

1948年剑桥大学的数学家弗里德·霍伊尔对宇宙有一个起点的说法,提出了一系列质疑,他特别反对宇宙起源于一次大爆炸的观点,并与同事邦迪和戈尔德一起,提出了与大爆炸理论完全对立的”稳恒态宇宙”理论,他问道:如果说宇宙起源于大爆炸,那么大爆炸之前难道就没有宇宙吗?这从哲学上让人感到困惑,所以他提出了所谓完美宇宙学原理的假设:认为宇宙不仅在空间上均匀,而且面貌不随时间改变。

由于哈勃根据星系退行速度,测算出宇宙年龄只有20亿年,导致霍依尔的”稳恒态”一时占了上风。正当宇宙年龄所造成的疑惑,使大爆炸理论陷入困境的时候,天文学家发现,哈勃将星系的距离全都低估了一倍,因此也就将宇宙的年龄低估了一倍。在改正了这个错误以后,宇宙的年龄就不会比地球的年龄低了。

霍伊尔的另一个质疑是:勒梅特并没有具体说明”原始原子”究竟是什么,它是如何形成,又如何崩解为各种元素的?而霍伊尔的”稳恒态”恰恰能证明这一点。自19世纪中叶,光谱分析应用于天文学以来,人们在天体中发现了几十种元素,最常见的是氢和氦。进入20世纪以后,物理学家又陆续发现,原子核是由质子和中子组成的;在适当条件下,较重的原子核可以裂变为较轻的核;较轻的核也可以聚变成更重的核,在此过程中释放出的能量,可以为恒星提供足够的能源。霍伊尔和他的合作者,阐明了元素在恒星内逐级合成的具体反应过程,直到今天,这仍然是教科书中的标准理论,其实这也是间接支持了后面所发展的大爆炸理论:

当空间中的氢原子,由于引力逐渐凝聚到一起,形成越来越大的球体时,恒星形成了。在恒星像滚雪球似的越滚越大时,引力造成的内部压力也越来越高。这种压力会把氢原子紧紧压合在一起,产生聚变反应,形成新的元素”氦”。当氢燃烧完后,恒星内的氦可以再聚变为氧和碳,如此持续,合成越来越重的原子,直到铁的产生。
比铁更重的元素,则可以在一些特殊的环境,如大质量恒星演化晚期的超新星爆发中产生。而组成我们身体的碳、氧、铁等重元素,都是先在恒星中产生,再于恒星爆发后被抛射出来,在太空中像灰尘一样的游荡,直到跟其他的星尘混合,因重力形成新的恒星。可以说,我们每个人都曾经是某颗恒星中的一部分,生命,也由此产生

霍伊尔关于重元素在恒星内合成的理论实在是太成功了,但却不能解释轻元素氦,在宇宙中含量高达1/4的观测事实。因为假如这么多氦都是在恒星中合成的话,那么夜晚也会比白天还亮了。1946年,移居美国的前苏联科学家伽莫夫另辟蹊径,提出了宇宙中的氦主要是在大爆炸后不久的高温条件下合成的理论。
但是,霍伊尔不愿意承认这一点,他提出了一个尖锐的问题:如果宇宙起始于一次大爆炸,在那种高温高热状态下所产生的辐射,一定会在太空中留下某种痕迹,即使是在大爆炸已经过去了140亿年的今天,也应该能找到哪怕一丁点儿辐射痕迹的残留。可问题是,这个痕迹能找到吗?

23rd
三月 2008

宇宙大爆炸(一):何处是中心
爱因万江斯坦@2008年03月23日 21:14 Post in 科学会 No Comments »

昨天第二遍完整的又把央视”探索.发现”的《宇宙大爆炸》四集重新看了一遍,这种不可多得的讲述宇宙起源的记录片,我怎么能放过呢。高三那年,突然对化学,物理产生极大的兴趣,可惜为了应试,也未能多研究,这一次算是安慰一下了,(感兴趣的朋友还可以参考我在06年的日志”霍金北京《宇宙的起源》演讲全文“),以下是我的观片笔记:

第一集:何处是中心
我们在宇宙中处于怎样的位置,宇宙有没有起源,如果有,它怎样起源?

公元前5世纪,爱琴海的萨摩斯岛上,有一位发明了几何学中勾股定理的数学天才毕达哥拉斯,从球型是最完美的几何体的观点出发,认为大地是球型的,而且所有天体都是球型的,它们的运动是匀速圆周运动。并认为地球是宇宙的中心,周围是空气和云,再往外是围绕地球做圆周运动的行星,如月亮、太阳等,再往外是恒星所在之处,最外面是永不熄灭的天火,这就是毕达哥拉斯的宇宙模型。但他并没说明地球有多大,日月星辰离地球有多远。

最早算出地球大小的人是公元前3世纪的希腊天文学家埃拉托西尼。他听说在阿斯旺附件有一口深井,在夏至的时候,太阳光照能射到井底,这表明,夏至时,太阳光在当地是垂直入射的;然后他又在埃及北方的一个城市亚历山大找了一个方尖塔,在夏至那一天,测量了斜入射的太阳光与垂直的方尖塔之间的角度,这个角度其实是从阿斯旺到亚历山大这一段距离弧长的圆心角,于是他算出了地球的周长约是三万九千多千米(现在实测是四万千米,几乎相差无几了)。

月球离地球有多远呢?当时希腊人已经猜测到,月食是因为地球走到太阳与月球之间而引起的。出生于萨莫斯岛的阿利斯塔克提出,测量月食时掠过月面的地影与月球的相对大小,利用几何学方法,可以算出以地球直径为单位的地球至月球的距离。

公元前150年,古希腊又出了一位叫依巴谷的天文学家。依巴谷重复了这项工作,依巴谷得出地球到月球距离是地球直径的三十倍。根据埃拉托西尼求得的地球直径计算,月球到地球的距离约等于三十八万公里,他还同时得出了地球与太阳的距离:弦月的时候,地球、月亮和太阳组成一个近似的直角三角形,于是得出太阳到地球的距离是月亮到地球距离的19倍,当然了这个精度与现测的结果相差有点大,但他的结果显示出太阳比地球要大得多。依巴谷思考,一个很大的天体不可能围绕一个小的天体来运行,这已经隐含了日心说的概念。

公元140年,埃及的亚历山大城的希腊裔天文学家托勒密,提出了一个完整的地心体系,所有能观测到的行星都是围绕着地球做顺时针周周运行,并提出了本轮和均轮的概念来解释所观测到的行星的运动规则。

然而到16世纪的时候,波兰天文学家尼古拉·哥白尼勇敢地站出来表达了相反的观点。他认为,宇宙应该是简单的和谐的,没有托勒密所描述的那么复杂,是地球绕太阳,而不是太阳绕地球旋转,这样根本不需要均轮的概念。这一日心学说改写了托勒密延续千年的宇宙模型,开启了宇宙学革命性的一刻。

哥白尼死后66年,德国天文学家开普勒在1609年《新天文学》一书中宣布,他用丹麦天文学家第谷留下的精密观测资料,发现行星是沿着椭圆轨道围绕太阳运动,从而打破了天体必须做匀速圆周运动的传统观点,并彻底消除了托勒密体系中的本轮和均轮。

1609年底,意大利物理学家伽利略,造出了一台放大率三十二倍的望远镜,并开始观测天体,并被木星所吸引,并有了一个惊人的发现:在木星周围有四个暗弱的星体在围绕着它运转(也就是后来我们称的伽利略卫星),这彻底宣告了托勒密地心体系的终结,因为人类第一次发现了有天体围绕不是地球的行星在运行。

这个时候,牛顿终于出场了。牛顿生于1642年。1661年,他离开家乡伍尔索普,前往剑桥大学三一学院,于1665年毕业。随后的18个月,他回到家乡躲避瘟疫,研习数学,发明了微积分。1667年,牛顿回到剑桥,于次年成为剑桥大学卢卡斯数学教授。不久,他对伽利略的望远镜进行了改良,他在里面加了一片平面的反光镜,这使得镜筒变短,并观察到更清晰的图像。

开普勒的发现和伽利略的观测结果,都支持哥白尼的日心学说,但有一个问题还没解决:究竟是什么原因维持着这些天体的运动?开普勒曾经猜想也许是磁力,而真正解决这个问题的是牛顿,这就是我们高中物理都学过的”万有引力”:一个大质量的物体,才可以把一个较小的物体吸引到自身上来,所以,苹果才会从树上落下来。也是”万有引力”使得人能够站在移动的地球上。”万有引力”让宇宙中所有的行星保持运动,宇宙也因此而永恒不变。

1716年,英国天文学家哈雷提出利用金星凌日的机会来测量太阳到地球的距离,可惜金星凌日十分罕见,直到1772年,法国天文学家潘格雷在分析了1769年金星凌日时各国天文学家的全部观测资料后,得出太阳与地球的距离为1.5亿公里。这时人们开始在想能否测量恒星到地球的距离呢。

伽利略早就提出了测量恒星到地球距离的方法:由于地球围绕着太阳运转,如果把地球围绕着太阳运转的轨道两端作为观测点,看看两点上所观测到的恒星的位移,这就是三角测量,就可计算出来。但由于实测非常困难,直到1836年,三位不同国籍的天文学家才根据伽利略的方法才成功的对恒星距离进行了测算。三位科学家中有一位俄国人斯特鲁维,他测出织女星的视差是0.125角秒(1角秒视差对应的距离是太阳到地球距离的20万倍),恒星的距离就这样算出来了,现在知道织女星离我们有26 光年,也就是说织女星发现的光要过26年后,才能到达地球,恒星真正是远啦。

那三位科学中,有一位定居英国的德国人威廉·赫歇耳,他认为,假如所有恒星的真正亮度与太阳相同,那么看上去亮度越暗的,距离就应该越远。他用这种方法,估计银河系的尺度至少为2600光年,从此,人类的视野从太阳系扩展到了更为广阔的宇宙空间。

1845年,爱尔兰中部的比尔城堡,第3代罗斯伯爵威廉·帕森斯,在这里建造了一架口径1.8288米,重达10吨的望远镜,它是当时世界上最大和倍率最高的望远镜。使用这架望远镜,帕森斯伯爵看到了一个呈旋涡状的美丽星云。这是有史以来人类首次观测到旋涡星系。天文学家们后来了解到,这个旋涡星系的距离为2100万光年,远远超出了银河系10万光年的范围。

1842年,在维也纳,一个名叫多普勒的奥地利物理学家,发表了一篇讨论双星颜色的论文,提出了可以通过恒星的光谱鉴别出谱线的元素构成和恒星的运动趋势,是远离还是朝向我们运动。这是多普勒运用夫琅和费线的一个创造。如果光源在向我们接近,夫琅和费线就会向光谱的蓝端移动,这叫”蓝位移”。如果光源在后退,这些谱线会向光谱的红端移动,这叫”红位移”。

1859年,英国天文学家威廉·哈金斯,用一台装有高色散分光仪的20厘米望远镜,开始观测一些亮星的光谱,并在其中找出了钠、钙、镁等化学元素的谱线。1868年,他利用多普勒效应,首次从谱线的微小位移,测出了天狼星的视向速度。1880年前后,哈金斯对太阳光谱中构成谱线的化学元素进行分析,以了解太阳和恒星都是由何种成分构成的。哈金斯发现,太阳和恒星的光谱线中,都有着清晰的氢和氦的特征线。于是他得出结论:太阳和恒星主要是由氢和氦构成的。这一发现等于宣告太阳只不过是一颗普通的恒星。人类也因此彻底了解到,地球不是宇宙的中心,太阳也同样不是宇宙的中心。

 

16th
三月 2008

翻译:High Performance Web Sites(6)-Chapter 4
爱因万江斯坦@2008年03月16日 22:58 Post in 性能 No Comments »

《High Performance Web Sites》 :Chapter 4

法则4:使用Gzip压缩组件  Gzip Components

前端开发工程师能力的好坏直接关系着页面的访问快慢(John:要知道,用极其丑陋的table套table做出的页面比简洁的div与table做出的页面无论是从K字节上,还是载入速度上都是极大的消耗),但另一些如用户的带宽等我们无法控制的因素,也会影响到用户访问您web应用的速度。法则1法则3介绍了如何通过减少不必要的HTTP请求来提升页面加载时间,法则2介绍了用CDN,可以让我们离用户更近,但我们总不能把所有的HTTP请求都优化掉吧。于是,我们这法则4应潮流而生。

法则4,是通过减少HTTP响应的数据量来加快响应速度。要知道如果一个HTTP的响应足够少,那传输的时间多快呀,因为从服务器端传送到浏览器端的数据包小了,也少了,岂有不快之理。这对像那些网络不太好的用户可是特有效。这一章节就会展示如何通过gzip去压缩HTTP响应,这是减少数据量最easy的方法,但有得到就会有付出,gzip也会有一些不好的影响,这个后面介绍。


压缩是如何工作的

很久以前我们就把文件压缩应用在电子邮件和FTP站点当中。直到HTTP/1.1的规范制定,web客户端才开始通过HTTP请求中的 Accept-Encoding 头信息来来表示其支持压缩。

如果web服务器在请求信息中看到这个头信息,它就可以通过响应的 Content-Encoding头信息来返回服务器可用的压缩方式。
gzip是目前最流行和高效的压缩方式。它是一个可以自由使用,不受专利权限制的压缩格式,是由GNU项目开发出来并定义在RFC1952规范中。另外还有一种压缩方式是deflate,但它不如Gzip那么常用和高效,其实上,我只发现一家网站在使用deflate:msn.com 。而支持deflate数据压缩的浏览器,也支持Gzip,所以Gzip是非常好的选择。
 

该压缩什么

服务器要压缩什么是取决于文件格式。很多网站只压缩HTML文件,其实script和样式表文件的也都值得压缩(事实上,任何文本型的数据都可以压缩,包括XML和JSON数据)。图片和PDF文件的则不必再用gzip压缩,因为它们本身就是压缩格式,再多余的压缩只会浪费CPU资源,也得不到多少的文件压缩量。

gzip压缩需要消耗服务器端的CPU,而客户端也需要执行解压gzip格式的数据。至于是否值得压缩的问题,我觉得任何超过1K或2K的文件都值得压缩。mod_gzip_minimum_file_size 参数就可以配置您想要压缩的文件的大小范围,它的默认值是500 bytes.

老套路,我又调查了美国10大网站使用gzip的情况如下图。有9家都用gzip压缩他们的HTML文件,7家还用gzip压缩了script和样式表文件,其中有5家是完全压缩了所有的script和样式表。一个网站如果压缩所有的HTML文件,样式表,script文件,甚至可以减少70%的数据量,这是我们下面的段落里会提到的。

节省The Savingsgzip压缩后,返回的数据量一般会减少70%,如下图所示,显示了scrtip,样式表文件在压缩前和压缩后的数据量的变化,同时也显示了如果用deflate方式来压缩的数据量对比。

很显然,从上图中就知道我们为什么要选择gzip了。gzip会减少约66%的数据量,而deflate只会减少约60%。

配置 Configuration

配置gzip的模块要取决于您Apache的版本:Apache 1.3使用的是mod_gzip,而 Apache 2.x 使用 的是mod_deflate。这一段落就会讲解如何配置每个模块。

Apache 1.3: mod_gzip

Apache1.3的gzip压缩功能是通过 mod_gzip 模块来现实的。mod_gzip 有很多的配置参数,这些在mod_gzip的站点上有说明,在这里我介绍一些最常用的参数。

mod_gzip_on
开启mod_gzip.
mod_gzip_item_include
mod_gzip_item_exclude
定义要被gzip压缩或不压缩的文件的类型,MIME类型, user agent, 等等。

大部分的web服务器都会打开mod_gzip,并把text/html设为默认文件类型。最重要的是您应该为script与样式表文件也打开gzip功能。您可以参考下面对Apache 1.3 的配置:

mod_gzip_item_include  file    \.js$
mod_gzip_item_include  mime  ^application/x-javascript$
mod_gzip_item_include  file    \.css$
mod_gzip_item_include  mime  ^text/css$
gzip的命令行程序可以控制压缩的级别以及CPU的使用率,但在mod_gzip中却无法配置这些。有时对数据流的压缩会造成CPU的过分负荷,我们可以选择缓存压缩后的响应数据到磁盘或是内存中,如果要手动实现这一功能就太麻烦了,还好,我们可以通过mod_gzip来自动保存压缩后数据到磁盘上,还可以及时的响应更新。实现这一功能则要配置 mod_gzip_can_negotiate 和 mod_gzip_update_static 参数。

Apache 2.x: mod_deflate
 

Apache 2.x 是通过mod_deflate 模块来实现压缩。尽管它的名字是deflate,但实际它是实现的gzip压缩方式(John:怪异吧!)。如果要实现像对script和样式表的压缩这种基本的配置只需要下面这一行就够了:

AddOutputFilterByType   DEFLATE      text/html    text/css    application/x-javascript

与mod_gzip不同,mod_deflate可以通过参数配置来控制压缩级别。要获取更多的信息,可查阅Apache 2.0 mod_deflate的文档。

代理缓存  Proxy Caching

以上介绍的简单配置对直接访问web服务器的方式来说没有一点问题,web服务器通过请求中的Accept-Encoding头信息来判断客户端是否可以支持压缩的数据,然后把压缩或没压缩的数据再返回给客户端,这些都是通过HTTP的header头信息来实现的。

但如果用户是通过代理上网的,那用户的请求也都是通过代理服务器中转发送的,这时就比较麻烦了:假如用户发请求给代理服务器时,并表明其不支持gzip,而代理服务器再中转数据时却将已经缓存过的压缩的数据返回给用户,这时就会造成用户看到的是一堆乱码,反之亦然。

要解决这个问题则要在服务器端加上vary头信息。mod_gzip默认是为所有的响应都增加Vary:Accept Encoding头信息,这样代理服务器就会缓存压缩和未压缩版的数据了。

特殊情况 Edge Cases

目前90%的浏览器都支持gzip。但还是会有一些特殊情况我们不得不考虑,如在早期的IE版本中,特别是IE5.5和IE6.0 sp1存在一些bug,一种比较安全的做法是用”浏览器白名单(browser whitelist)“,让服务器端只针对一部分浏览器发送gzip格式的数据。如下的设置就是只针对IE6~9的版本和Mozila 5~9的版本发送gzip数据。

Apache 1.3使用User-Agent:

mod_gzip_item_include  reqheader  ”User-Agent: MSIE [6-9]”
mod_gzip_item_include  reqheader  “User-Agent: Mozilla/[5-9]“
Apache 2.x 使用 BrowserMatch :
BrowserMatch  ^MSIE [6-9] gzip
BrowserMatch  ^Mozilla/[5-9] gzip

而针对代理缓存,一种方法是在Vary的头信息中加上User-Agent标识来告诉代理服务器,我们使用了白名单;在mod_gzip模块中,如果它发现配置了白名单,则会自动为Vary加上上User-Agent标识。但是不要指望代理服务器会缓存所有的浏览器白名单的每一个url副本。所以我们不得不采用另一个方法:为返回的响应中加上Vary : * 或 Cache-Control:private 头信息,以表明完全禁止代理服务器的缓存,不让代理去缓存任何一个组件,让用户通过代理时,都要去请求真正的服务器以获得页面数据,事实上Google和Yahoo!都是使用的这一策略,尽管它会带来更多的流量消耗。

还有一个特殊情况要指出,就是ETags(我们将会在Chapter 13章节单独提到),默认情况下它都不会被压缩,所以最好的办法就是干脆禁用ETags,这个还是放在Chapter  13章节再详谈吧。


下面三个链接分别是没有gzip压缩,只压缩了HTML和压缩了全部组件的三个链接页面:
Nothing Gzipped
http://stevesouders.com/hpws/nogzip.html
HTML Gzipped
http://stevesouders.com/hpws/gzip-html.html
Everything Gzipped
http://stevesouders.com/hpws/gzip-all.html
下图就是三者的具体数据量对比和时间对比:

 

9th
三月 2008

翻译:High Performance Web Sites(5)-Chapter 3
爱因万江斯坦@2008年03月09日 22:54 Post in 性能 No Comments »

《High Performance Web Sites》 :Chapter 3

法则3:增加Expires Header  Add an Expires Header 

在您设计网页时,快速的响应时间不应该是你唯一要考虑的,如果仅仅是这样,那我们采用法则1,把我们的页面设计成一个极端的网页:没有任何图片,script,样式表。我们都明白,图片、script、样式表这些组件可以增强用户体验,虽然它们会给页面带来较长的载入时间。你幸运了,在这一章介绍的法则3,我就要向你介绍如何最大限度地利用浏览器的缓存来使这些页面组件更高效的为我们的页面服务。

现在的网页所包含的组件越来越丰富,java applet去了,Flash来了,script也不可缺少,随着div的大潮,css样式表也少不了…… 所以用户若第一次访问您的网页,则可能会产生多个HTTP请求;但如果您在请求返回中使用Expires头信息,则可以缓存这些组件,避免在随后的访问中产生不必要的HTTP请求,Expires头信息最常用于图片,其实它适合应用在所有的组件中,如scripts,样式表和Flash。但大多数当今的热门网站目前并没有这样做。在这一章节中我会提及如何让这些网站可以更快。在使用Header头信息时,也可能会有一定的额外开销,这点会在 “改变文件名”段落中再详谈.

Expires Header

浏览器使用缓存来减少HTTP请求数和减少HTTP的响应数据量,以达到更快的加载页面。web服务器通过Expries header来告诉web客户端(John:主要是浏览器)当前返回的组件在我指定的时间以前都是可用的,你(浏览器)可以留着下次备用(John:有点像我们在超市买牛奶时,随包装袋上返回的过期日期)。Expries header 在HTTP规范中描述为 “the date/time after which the response is considered stale.”,它附带在HTTP的响应中返回给客户端。

如上图,这是一个典型的expries header ,它告诉浏览器,直到2010年4月15日这个请示的返回都不会变化。如果这个头信息是随着一个图片返回的,那浏览器就会缓存这个图片,以为其后的页面浏览直接使用,以减少一个HTTP请示。 

Max-Age and mod_expires

在我解释缓存是如何更好的提升性能之前,有必要介绍一下与Expries header相关的几个头信息。Cache-Control header是在HTTP/1.1中被引入以弥补Expries header的不足。因为Expries header使用的是一个具体的日期,它就要求服务器与客户端之间要有严格的时钟检查,并且当过期日期到来之后,服务器端还必须配置一个新日期。

相反,Cache-Control 使用max-age来指定一个时间段来标识一个组件能使用多长时间。这个max-age是以秒为单位来描述的(John:有点保质期的概念)。如果在这个保质期内,这个组件再被请求,浏览器就直接使用缓存里的就行了。下面就是一个返回10年保质期的头信息。

使用Cache-Control虽然弥补了Expires的不足,但我们仍然还是得使用 Expires header以兼容那些不支持HTTP/1.1的浏览器(尽管这些流量可能还不到1%)。所以我们一般同时使用Expires和Cache-Control max-age,按HTTP规范这时会以max-age的时间为优先考虑,所以我们还是避免不了服务器与客户端之间的时钟检查和服务器端的新日期配置。幸运的是我们有Apache的 mod_expires模块,能让我们像设置max-age那样来配置Expires header,它使用ExpiresDefault来设置一个时间段,如下,为图片,scripts和样式表设置10年的有效期: 

<FilesMatch “\.(gif|jpg|js|css)$”>
ExpiresDefault “access plus 10 years”
</FilesMatch>
这个时间可以是年,月,周,天,小时,分钟甚至是秒。使用了这个模块,所有的响应返回中就会同时带着 Expires header 和 Cache-Control max-age 头信息:
其中Expires header所携带的过期时间具体是多少,则依赖于每个客户端什么时间发出的请求,在上面的例子中,始终是10年。这样就避免了我们每次在到期后都要重新设置服务器,mod_expires会搞定一切。图3-1是对10大网站使用这些headr的一个调查。有7家使用了这些header,其中有5家同时使用了
Expires 和 Cache-Control max-age(John:推荐)。各有2家分别只使用 Expires 或Cache-Control max-age。很遗憾有3家什么也没使用。 

 

Empty Cache vs. Primed Cache

使用Expires  header只会影响已经访问过的页面和组件,当用户第一次访问您的页面时无法避免的会有比较多的HTTP请求数,因为这时浏览器的缓存里是空的。所以如果您的网站能吸引用户访问更多的页面, 并经常在此停留,我们所做的缓存工作才有效果。

不仅仅是图片 More Than Just Images

一般Expires header常用于图片,其实这并不是最佳实践。Expires header应该应用于所有那些不经常变动的组件,script,样式表或Flash组件。

在理想情况下,所有组件都在一个页面内,并且都有一个未过期的Expries header,而随后浏览的页面只一个对HTML源文件的HTTP请求,其余的组件都在浏览器的缓存中直接提供,这时的响应时间会提高50%甚至更多。

我调查了美国的10大网站,并记录了其中有多少图片,script和样式表是设置了至少30天有效期的Expires 或是 Cache-Control max-age header,如表3-2所示,情况并不是太好,图中所列的是被缓存至少30天的组件数,分母是该网站上的所有的该类型组件数,分子是被加了过期header的组件数。
• 有5家网站把大多数图片的缓存有效期设为30天以上.
• 有4家网站把大多数样式表的缓存有效期设为30天以上.
• 有2家网站把大多数script的缓存有效期设为30天以上.

从上图的百分比中俺发现有74.7%的组件没有被缓存或是有效期低于30天。一种解释就是这些组件因为业务关系而不应该被缓存,如新闻网站CNN.com就是个例子,138张图片中没有一张被缓存,这是因为很多新闻照片要被不断更新而不必缓存在用户端,所以这时更适合用Last-Modified heade,来通过组件的最后修改时间判断是否要读取新数据。 

表3-2的最后一项,显示了未被缓存的组件的最后修改时间的中分线,就CNN.com来说有一半的未缓存组件的最后修改时间是在227天前了,很显然这些组件是应该被缓存的。

这种情况也曾发生在Yahoo!,在过去,Yahoo!并没有缓存script,样式表和一些图片,是因为我们认为这样是经常变化的,用户有必要每次访问时都去请求一次以获取最新的。可问题是,在实际应用中,这些组件并不是我们想像中的那样要经常变化更新,我意识到应该把它们缓存来提升用户体验。后来,Yahoo!选择了去缓存它们,哪怕会带来一些额外的开发花销,这就是我马上要谈到的Revving Filenames。

改变文件名 Revving Filenames

如果我们已经为组件设置了缓存,可当这些组件又需要更新时,用户如何才到得到最新的组件呢?由我们前面介绍的Expires 或是 Cache-Control max-age header 都会让浏览器不检查任何改变,直接从本地硬盘中读取缓存,除非是过了有效期。所以我们能做的,就是在HTML页面中改变这个组件的文件名。在Mark Nottingham的文章”Caching Tutorial for Web Authors and Webmasters“谈到这个问题:

最优的方案还是改变它们的链接;只有这样,用户才能从服务器上获取更新。(The most effective solution is to change any links to them; that way, completely new representations will be loaded fresh from the origin server.)

说白了,还是要改变文件名。在已有的页面中改变文件名可能是件头疼的烦事,但是,不得不这样,如果您使用的是PHP,Perl等动态的页面,不妨利用一个变量为所有的组件命名,这样换起文件名来比较省事。在Yahoo!,我们是在组件名后面跟上版本号(如,yahoo_2.0.6.js),把这个版本号做为一个变量写在程序中,真的很省事。


举例 Examples

下面的两个链接,包包含有相同的组件:6个图片,3个script和1个样式表。第一个链接没有任何Expires header,而第二个链接,全有。
No Expires
http://stevesouders.com/hpws/expiresoff.php
Far Future Expires
http://stevesouders.com/hpws/expireson.php
我在900Kbps的DSL下测试,加了过期头设置的链接页面访问时间会减少600~260毫秒,能提升57%,如果页面的组件再多一点,这个百分比还会更高。

要说明一点,并不是说没有加过期头的组件就不会被浏览器缓存,它们也会被缓存,还记得我在Chapter B中介绍的有条件的GET请求吗,只不过,会多一个HTTP请求到服务器端以询问这个组件是否有效,如果这个组件的最后修改时间和以前一下,则直接使用缓存中的版本,HTTP返回中将不带这个组件的具体数据了。

为您页面上的组件贴上保质期吧,再加有有条件的GET请求,带来的会是减少近一半的HTTP请求数还有不必要的数据传输。

相关章节:

 

6th
三月 2008

翻译:High Performance Web Sites(4)-Chapter 2
爱因万江斯坦@2008年03月06日 22:39 Post in 性能 No Comments »

《High Performance Web Sites》 :Chapter 2

法则 2: 使用CDN 内容分发网络  Use a Content Delivery Network

用户的网络带宽在逐年增加,但用户访问您web服务器的快慢仍受着地域的限制(John:最典型的例子就是我们大陆的南北电信互通问题)。Web创业者往往都会在某一地域的机房放置自己的服务器,但一旦他们渡过艰难的初创阶段,开始要面对涌入的大量用户时,他们都要面对这样的现实:即一个地域机房里的那一台服务器已经不足于应付这种大访问了,是时候在多个分散地域(城市结点)上部署更多的内容服务器。

如何迈出第一步呢?要实施地理上的内容分布,切勿急着尝试以分布式的系统构架去重新设计您的web应用。如果依赖于应用系统的分布,那您的重构工作可能会是十分艰巨,如要处理会话状态的同步和在多个地域的数据库之间处理数据一致性等复杂问题(John:如果您进行的是类似银行级的用户应用,则不在此讨论之列)。您应该优先考虑缩短用户与您web内容之间的地域距离。

还记得我们在前面的Chapter A中讨论的性能黄金法则吗:
只有10-20%的最终用户响应时间是花在了下载HTML源文件上。其它的80-90%是花在了下载页面中的所有组件上。

如果您的web应用服务器离用户足够近,那么在Chapter A 中讨论的那个第一个HTTP请求的响应时间就可以更快;再或者您的web组件服务器也离用户足够近,那在页面中请求这些组件的响应时间也会缩短,这可比您重新设计一个分布式的系统的复杂度要小的多了,这就要用到内容分发网络:CDN(content delivery networks)。

Content Delivery Networks

内容分发网络 CDN 是一个分布在多个地域间用于为用户提供更高效的内容访问服务的网络服务器集群。这种高效不仅体现在性能上,也体现在成本的节省上,因为CDN会选择离请求用户物理结点最近的一台服务器为用户提供内容访问服务,以在到提高响应时间。

一些大型的互联网公司都拥有自己的CDN,但使用专业CDN服务提供商的服务则更能节约成本。如Akamai科技公司于2005年收购了Speedera网络公司,成为北美CDN市场的领军者,还有Mirror Image网络公司,Limelight 网络公司,SAVVIS 公司等。

如下图2-1是十大美国网站使用CDN的情况:

 

我们能看到:
• 有五家网站使用了Akamai
• 有三家分别选择了 Mirror Image,Limelight,SAVVIS
• 其他的五家要么没有使用CDN,要么就是有自己的CDN解决方案

规模较小或是非商业网站未必能负担得起CDN服务器的高额费用,但有一些免费的CDN服务机构可以选择。如部署在阿姆斯特丹自由大学的基于Apache模块的Globule(http://www.globule.org),建在普林斯顿大学的CoDeeN (http://codeen.cs.princeton.edu)等等。(John:老实说,这些免费的CDN对我们没有什么用)
CDN除了能提升响应时间,还有一个好处。CDN还可以用于备份数据,扩充存储容量甚至是做缓存;它还可以帮助我们解决流量高峰的问题,如,一个提供实时性较强的天气预报或财经新闻的服务,或是发布某种体育娱乐新闻时,这种瞬间的访问高流量也可以被CDN所分流。

说到这,该说说CDN的缺点了,除了费用高,您的服务响应时间则会依赖于CDN服务商的硬件和同时在使用这家CDN的其它网站,甚至是有可能会受您竞争者的影响,如果您的竞争者也在使用与您相同的CDN服务商。因为CDN服务商一般都是在他所有的分发服务器之间为客户共享这些资源(John:这和大家在机房使用共享的虚拟主机是一个道理)。CDN的另一个不足是您可能会无法直接控制这些内容服务器,假如您要修改所有该CDN中的组件的HTTP响应头,这可能必须通过CDN服务商而不是您自己的技术人员。如果CDN本身出了问题,也会直接影响用户对您的web的访问。在上图2-1中,eBay和MySpace都使用了两家CDN服务商,这可是个明智之举,减少一定的风险,前提是您有足够的业务需求和金钱的支撑。

CDN是用来分发静态内容的,如图片,scripts,样式表或Flash。而要提供动态的HTML页面则要一定的服务器端要求:数据库连接,状态管理,权限认证,硬件和操作系统优化等,这些复杂的东西都超出了CDN的服务器范围(John:CND不是虚拟主机提供商)。由于CDN只提供静态文件的访问,从另一方面看,也使得它更有针对性,它只针对于提供静态文件较多的网站使用。

时间,节省

使用CDN到底能带来多少速度的提升。下面的两个链接页面,都包含相同的页面元素:5个script,1个样式表,8个图片。第一个链接页面是放在Akamai公司的CDN上,另一个是放置在一台单独的web服务器上:
CDN
http://stevesouders.com/hpws/ex-cdn.php
No CDN
http://stevesouders.com/hpws/ex-nocdn.php

由于这是放在美国的服务器,我们在国内访问可能还没那么快,但从测试的时间上来看,用 CDN的页面比放在单独服务器上的要快近18%,当然了,这一结果要取决于您的带宽接入速率和所在的地域。(John:目前的几大门户网站,新华网,人民网等以新闻资讯为主的网站都使用了CDN,在我前面介绍的Youtube构架中,也提到了他们的CDN策略。)

相关章节:

中文翻译:
翻译:High Performance Web Sites(1)-Chapter A 前端性能的重要性
翻译:High Performance Web Sites(2)-Chapter B HTTP 概述
翻译:High Performance Web Sites(3)-Chapter 1    法则 1: 尽可能减少HTTP请求数
翻译:High Performance Web Sites(4)-Chapter 2   法则 2: 使用CDN 内容分发网络
翻译:High Performance Web Sites(5)-Chapter 3   法则3:增加Expires Header
翻译:High Performance Web Sites(6)-Chapter 4   法则4:使用Gzip压缩组件
翻译:High Performance Web Sites(7)-Chapter 5  法则5:将样式表放到HEAD中
翻译:High Performance Web Sites(8)-Chapter 6    法则6:把script放到页面的底部

 

3rd
三月 2008

飞出个未来Futurama
爱因万江斯坦@2008年03月03日 00:09 Post in 一千零一夜 No Comments »

昨天在家,把《飞出个未来》的2007电影版本看完了。

Futurama故事情节稍显凌乱,但还有主线可循。关于电影版本中的主线:那个贴在Fry屁股上的时间球的密码,到底是如何来的,电影版本并没有交待清楚,怎么看怎么像是一个逻辑错误。虽然电影版本中关于时间旅行的方程式推出一个定律:任何一个经过时间球而copy的自己,最终都将会以某种形式被kill掉,但怎么看怎么觉得有点逻辑不清,呵,对一部以搞笑为主的美国动画片,就不用要求理论的严谨性了。所有的故事发展都在1999年12月31日23点59分到2000年1月1日零点之间被戏剧化。

想知道美国人是怎么调侃当年小布什是以微弱的选票当选总统的吗,原来是被来自1000年后的一个终结者机器人无意中干的… …

电影版本中的一些情节的铺垫来自于其以前的短片版本,现在《飞出个未来》已经拍到第四季了,建议没有看过的朋友们去找来看看,看看美国人以3000年为时代背景所勾画出的包括了地球人,外星人,机器人,还有历史人物的一系列故事。里面还有对圣诞老人的颠覆性改写。

post-425982-1195885961-thumb-150x232参考:
《飞出个未来》第一季
《飞出个未来》第二季post-425982-1154769377-thumb-150x194
《飞出个未来》第三季
《飞出个未来》第四季
《飞出个未来》大电影

介绍:(来自于飞翔科幻论坛)《飞出个未来》这部动画剧集荣获了多次艾美奖等殊荣,IMDB评分高达9.1分,该剧的制作班底是《辛普森一家/阿森一族》(The Simpsons)的原班人马。香港曾播出过,港译名为”乃出个未来”。该剧讲述了 Fry,一位20世纪的年轻人在30世纪的冒险经历。Phillip Fry是一个纽约市的25岁的比萨饼快递员,他的生活就是每天四处奔波,1999年12月21日他偶然的被冰冻了起来, 当他醒过来时已是1000年以后,他也有了一个开始新生活的机会. 他到行星际快递公司找了一份工作, 那个公司主要业务就是为宇宙的各个角落提供现代化的快递包裹服务. 他的同事包括快递运输船船长 Leela, 一个粗暴但可爱的单眼女外星人,还有一个有着很多人类的缺点的机器人Bender。Fry, Leela, Bender, 有时再加上Amy 和Zoidberg 他们冒着生命危险为宇宙的各个地方快递包裹,有时也为了减税从事一些慈善行动. 每一集都是笑料百出。