2010年3月31日星期三

阮一峰的网络日志

阮一峰的网络日志


CSS使用技巧大全

Posted: 31 Mar 2010 12:33 AM PDT

最近,我开始升级网志了。

在修改模板的过程中,需要重写CSS样式表。正好看到instantshift.com有一篇CSS常用技巧的总结文章,我就把它整理出来,供自己参考,也希望对大家有用。

未来,本文将持续更新。

1. 文字的水平居中

将一段文字置于容器的水平中点,只要设置text-align属性即可:

  text-align:center;

2. 容器的水平居中

先为该容器设置一个明确宽度,然后将margin的水平值设为auto即可。

  div#container {
    width:760px;
    margin:0 auto;
  }

3. 文字的垂直居中

单行文字的垂直居中,只要将行高与容器高设为相等即可。

比如,容器中有一行数字。

  <div id="container">1234567890</div>

然后CSS这样写:

  div#container {height: 35px; line-height: 35px;}

如果有n行文字,那么将行高设为容器高度的n分之一即可。

4. 容器的垂直居中

比如,有一大一小两个容器,请问如何将小容器垂直居中

  <div id="big">
    <div id="small">
    </div>
  </div>

首先,将大容器的定位为relative。

  div#big{
    position:relative;
    height:480px;
  }

然后,将小容器定位为absolute,再将它的左上角沿y轴下移50%,最后将它margin-top上移本身高度的50%即可。

  div#small {
    position: absolute;
    top: 50%;
    height: 240px;
    margin-top: -120px;
  }

使用同样的思路,也可以做出水平居中的效果。

5. 图片宽度的自适应

如何使得较大的图片,能够自动适应小容器的宽度?CSS可以这样写:

  img {max-width: 100%}

但是IE6不支持max-width,所以遇到IE6时,使用IE条件注释,将语句改写为:

  img {width: 100%}

6. 3D按钮

要使按钮具有3D效果,只要将它的左上部边框设为浅色,右下部边框设为深色即可。

  div#button {
    background: #888;
    border: 1px solid;
    border-color: #999 #777 #777 #999;
  }

7. font属性的快捷写法

font快捷写法的格式为:

  body {
    font: font-style font-variant font-weight font-size line-height font-family;
  }

所以,

  body {
    font-family: Arial, Helvetica, sans-serif;
    font-size: 13px;
    font-weight: normal;
    font-variant: small-caps;
    font-style: italic;
    line-height: 150%;
  }

可以被写成:

  body {
    font: italic small-caps normal 13px/150% Arial, Helvetica, sans-serif;
  }

8. link状态的设置顺序

link的四种状态,需要按照下面的前后顺序进行设置:

  a:link
  a:visited
  a:hover
  a:active

9. IE条件注释

你可以利用条件注释,设置只对IE产生作用的语句:

  <!--[if IE]>
    <link rel="stylesheet" type="text/css" href="ie-stylesheet.css" />
  < ![endif]-->

还可以区分各种不同的IE版本:

  <!--[if IE 6]> - targets IE6 only -->
  <!--[if gt IE 6]> - targets IE7 and above -->
  <!--[if lt IE 6]> - targets IE5.5 and below -->
  <!--[if gte IE 6]> - targets IE6 and above -->
  <!--[if lte IE 6]> - targets IE6 and below -->

10. IE6专用语句:方法一

由于IE6不把html视为文档的根元素,所以利用这一点,可以写出只有IE6才能读到的语句:

  /* the following rules apply only to IE6 */

  * html{
  }

  * html body{
  }

  * html .foo{
  }

IE7专用语句则要写成

  /* the following rules apply only to IE7 */

  *+html .foo{
  }

11. IE专用语句:方法二

除了IE6以外,所有浏览器都不能识别属性前的下划线。而除了IE7之外,所有浏览器都不能识别属性前的*号,因此可以写出只有这两个浏览器才能读到的语句:

  .element {
    background: red; /* modern browsers */
    *background: green; /* IE 7 and below */
    _background: blue; /* IE6 exclusively */
  }

12. CSS的优先性

如果同一个容器被多条CSS语句定义,那么哪一个定义优先呢?

基本规则是:

  行内样式 > id样式 > class样式 > 标签名样式

比如,有一个元素:

  <div id="ID" class="CLASS" style="color:black;"></div>

行内样式是最优先的,然后其他设置的优先性,从低到高依次为:

  div < .class < div.class < #id < div#id < #id.class < div#id.class

13. IE6的min-height

IE6不支持min-height,有两种方法可以解决这个问题:

方法一:

  .element {
    min-height: 500px;
    height: auto !important;
    height: 500px;
  }

共有三条CSS语句,第一句是针对其他浏览器设置最小高度,第三句是针对IE设置最小高度,第二句则是让其他浏览器覆盖第三句的设置。

方法二:

  .element {
    min-height: 500px
    _height: 500px
  }

_height只有IE6能读取。

14. font-size基准

浏览器的缺省字体大小是16px,你可以先将基准字体大小设为10px:

  body {font-size:62.5%;}

后面统一采用em作为字体单位,2.4em就表示24px。

  h1 {font-size: 2.4 em}

15. Text-transform和Font Variant

Text-transform用于将所有字母变成小写字母、大写字母或首字母大写:

  p {text-transform: uppercase}
  p {text-transform: lowercase}
  p {text-transform: capitalize}

Font Variant用于将字体变成小型的大写字母(即与小写字母等高的大写字母)。

  p {font-variant: small-caps}

16. CSS重置

CSS重置用于取消浏览器的内置样式,请参考YUIEric Meyer的样式表。

17. 用图片充当列表标志

默认情况下,浏览器使用一个黑圆圈作为列表标志,可以用图片取代它:

  ul {list-style: none}

  ul li {
    background-image: url("path-to-your-image");
    background-repeat: none;
    background-position: 0 0.5em;
  }

18. 透明

将一个容器设为透明,可以使用下面的代码:

  .element {
    filter:alpha(opacity=50);
    -moz-opacity:0.5;
    -khtml-opacity: 0.5;
    opacity: 0.5;
  }

在这四行CSS语句中,第一行是IE专用的,第二行用于Firefox,第三行用于webkit核心的浏览器,第四行用于Opera。

19. CSS三角形

如何使用CSS生成一个三角形?

先编写一个空元素

  <div class="triangle"></div>

然后,将它四个边框中的三个边框设为透明,剩下一个设为可见,就可以生成三角形效果:

  .triangle {
    border-color: transparent transparent green transparent;
    border-style: solid;
    border-width: 0px 300px 300px 300px;
    height: 0px;
    width: 0px;
  }

20. 禁止自动换行

如果你希望文字在一行中显示完成,不要自动换行,CSS命令如下:

  h1 { white-space:nowrap; }

21. 用图片替换文字

有时我们需要在标题栏中使用图片,但是又必须保证搜索引擎能够读到标题,CSS语句可以这样写:

  h1 {
    text-indent:-9999px;
    background:url("h1-image.jpg") no-repeat;
    width:200px;
    height:50px;
  }

22. 获得焦点的表单元素

当一个表单元素获得焦点时,可以将其突出显示:

  input:focus { border: 2px solid green; }

23. !important规则

多条CSS语句互相冲突时,具有!important的语句将覆盖其他语句。由于IE不支持!important,所以也可以利用它区分不同的浏览器。

  h1 {
    color: red !important;
    color: blue;
  }

上面这段语句的结果是,其他浏览器都显示红色标题,只有IE显示蓝色标题。

24. CSS提示框

当鼠标移动到链接上方,会自动出现一个提示框。

  <a class="tooltip" href="#">链接文字 <span>提示文字</span></a>

CSS这样写:

  a.tooltip {position: relative}
  a.tooltip span {display:none; padding:5px; width:200px;}
  a:hover {background:#fff;} /*background-color is a must for IE6*/
  a.tooltip:hover span{display:inline; position:absolute;}

25. 固定位置的页首

当页面滚动时,有时需要页首在位置固定不变,CSS语句可以这样写,效果参见http://limpid.nl/lab/css/fixed/header

  body{ margin:0;padding:100px 0 0 0;}

  div#header{
    position:absolute;
    top:0;
    left:0;
    width:100%;
    height:<length>;
  }

  @media screen{
    body>div#header{position: fixed;}
  }

  * html body{overflow:hidden;}

  * html div#content{height:100%;overflow:auto;}

(完)

2010年3月26日星期五

阮一峰的网络日志

阮一峰的网络日志


一封博士研究生的遗书

Posted: 25 Mar 2010 09:04 AM PDT

这两天心情不好,什么也不想写。

外国公司可以一走了之,可是走不了的人,该怎么办呢?

========================

北邮一男博士生坠楼身亡 死者生前为人热情乐观

2010年03月23日 来源:京华时报

作者:孙乾 李靖 黄海蕾

昨天下午,北京邮电大学内,一名2009级男博士研究生高坠身亡。目前,其坠楼具体原因仍在调查当中。

事发北京邮电大学本部教学楼主楼,该楼有15层,属于"圈楼",中间为露天天井。

该楼一名保洁人员称,昨天下午1点50分左右,她正在楼道内打扫卫生,只听窗外传来一声闷响,接着又听到一阵惊呼。她前去查看,只见位于主楼内部北侧的一个露天天井地上躺着一名男子。天井四周窗户边有很多学生在张望, "他们都是上自习的,发现有人坠楼了,就都过去看"。几分钟后,学校老师和保卫处的工作人员来到现场维持秩序。紧接着,民警赶到勘察情况。随后,该坠楼男子的尸体被蒙上白布抬走,围观的人才渐渐散去。"没有人说得清他从哪层坠下来的,有的说10层,有的说11层。"

昨天傍晚,主楼不时有前来上自习的学生,一名电子学院的本科生说,学校已经通知了,死者与其同在一个学院,是一名博士生。

事后,北京邮电大学校务办公室、学生事务管理处在北邮人论坛上,对该起坠楼事件作出说明,证实下午1点50分,该校2009级博士研究生吴某某,在校本部主楼坠楼身亡。校方在说明中称,事发后,学校迅速启动了突发事件应急处置预案,校领导、保卫处、学生处和学院领导第一时间赶赴现场处理。目前,该生坠楼原因还在调查中。学校正在积极协调处理,情况有进展将及时通报。

另据知情人介绍,根据初步调查,排除该生为他杀。

校方帖子发出后,引起很多学生关注,截至昨晚9点,跟帖者已有1000多人。多数人都对该生的离去表示惋惜。

平时为人热情乐观 近期曾有失眠状况

昨晚,记者来到坠亡博士生小吴所在的宿舍楼。楼管工作人员称,吴同学所在的宿舍已经封了,校方正在等待其家长到来。该宿舍原本有四个床位,其中一个人开学就没有来报到,还有一名博士是在职教师,早已搬到一楼去住,因此他的宿舍只有两人。现在该生出了事,另一人也搬出。"他是个非常热情的孩子,见了面总打招呼。"楼管员称,今年寒假结束后,吴同学返校后发现宿舍灯泡坏了便找人来修,"修好后,一口一个谢谢,是非常客气的人"。

知情人士介绍,吴同学26岁,没有女友。根据该生所在班的班长及舍友的描述,该生平时很热情也很乐观,跟同学关系也不错,但近一阶段他可能出了点问题,有失眠的情况,具体什么事不明。据了解,吴同学家庭并不完整,他的日记本上模模糊糊地记载着一些家庭生活片段,还有一些慨叹,没有具体细节。

============================

然后,我在网上读到了他的遗书。

============================

遗书

想好了。我想我真的想好了。

这个世界是一沟绝望的死水,我在这里再怎么折腾也激不起半点涟漪。所有的努力都会被既得利益集团踩在脚下,所有的奋斗都面临着举步维艰。

冷漠的人,谢谢你们曾经看轻我,让我最终下了这样的决心。世俗的炎凉,尘世的丑恶,恶心的嘴脸,可恶的压力,你们都随风去吧。

对不起。对不起。

我可怜的让我万般不舍的妈妈,最对不起的就是你……

我此刻一想到你苍苍的白发,粗糙的双手,一年大部分的饭菜只是馒头就咸菜,一件蓝色的夹克穿了那么多年,每年过年都是那一件,我都会心痛得要死。

儿子不孝,不肖,没能让您的付出得到回报,这么多年您一个人含辛茹苦供我一直读到北邮的博士啊……曾经,我所有对您的承诺,都没有办法履行了,对不起,对不起。儿子是一个没有用的人,自从离开老家以来,其实无时无刻不在想着让您也能来北京吃一次烤鸭,看看天安门和故宫,住上楼房,坐上小车,不用再为了我去捡垃圾、拾破烂,不用再去给人家工地上做饭赚钱瞧人家白眼……可是,这么多年了,我什么都没有给您,我甚至连您一直想要却舍不得买的假牙伴侣都没能给您买到,每当晚上躺在床上想到您每顿饭都在用那戴不牢的假牙痛苦地磨着干涩的馒头,我的眼泪就止不住地流……一百块啊,不过是一百块啊,一百块还不够那些老板官员们抽一盒烟的钱,我却给你买不起!

我太没用了。现在知识太没用了。有用的只是金钱和权势,有用的只是关系和背景。现在要凭正直的才华去出人头地,太难太难了。我也曾试着找过工作,但是没有人用我。我对这个世界彻底地绝望了。绝望了。我的肝又开始痛了,不能再写下去了……

我走之后哥哥一家就应该会对您好点了,保重……

终于可以一了百了了,我很高兴。永别了,妈!

2010年3月22日

======================

下面是我的感想。

我特别理解他。只有在国内大学读过博士的人,才能体会那种知识带来的绝望感。你付出了那么多,却一无所获,甚至连知识也学不到,因为大学不过是社会的缩影,所有社会丑恶现象在校园中全部存在,而且因为披着学术的伪装,而显得更加虚伪。当你看到那些所谓的学者,不过是道貌岸然的学棍,而整个学术的体系和制度,都在鼓励急功近利和弄虚作假时,你的信念瞬间就崩溃了。这样的苦苦忍受为了什么呢?学到知识又有什么用呢?你只有变得和其他人一样虚伪,才能熬出头,这样的未来值得追求吗?

曾经有一篇博士毕业论文,它的致谢是这样写的:

  "从进入大学到博士毕业,整整十年了。在这十年中,我过得浑浑愕额。

  十年前,我身高170cm,十年后,我身高还是170cm。十年前,我体重60kg,十年后,我体重还是60kg。十年前,我一无所有,十年后,我还是一无所有。十年前,我眼睛明亮、有神,十年后,摘掉眼镜,我已看不清自己有多少个手指了。十年前,我声音洪亮、清澈,十年后,已经是慢性咽喉炎,声音嘶哑。十年前,我踌躇满志、指点江山、激扬文字,十年后,我心如止水,只求温饱。

  当然,我也得到了一些东西。

  十年前,我还是个农民的儿子,十年后,我成为了一个博士。十年前,我只懂得砍柴、种田、割草、放牛,十年后,我已经成为了一个懂机械、金融、管理的复合型人才。

  但如果您问我这十年最大的长进是什么,我将告诉您:十年前,我十七,十年后,我二十七。"

我翻了一下自己的毕业论文,致谢和后记都没写。想起来,那时心情也是很不好,爱过不过的,连稍微伪装一下的兴趣也没有。

我不知道该怎么写下去了,我们这一代青年都是这个国家该死的政治制度的殉葬品。

[相关文章]

* 《A Lonely Drifter Off To See The World》

UPDATE 2010年3月26日

吴博士的硕士同学来信,指出吴博士幼年丧母,因此这封遗书系伪作。

在此我向大家表示歉意,由于我没有仔细查找该文的出处,导致出现这样的错误,以讹传讹,造成了某些不好的影响。这是不应该的。

但是我还是觉得,这封"遗书"表达的绝望情绪是真实的,很多博士研究生的处境确实非常困难和无助,甚至整个青年一代都不知道人生出路在哪里。吴博士的自杀绝不是个案,而是反映出我们的教育制度和社会制度出现了严重问题。我希望,一方面,当局能够注意到这个问题;另一方面,我们还活着的人能够觉醒,并且团结起来,努力改变不合理的现状。

最后,愿死者安息。

(完)

2010年3月22日星期一

阮一峰的网络日志

阮一峰的网络日志


《摩西英语》出书了!

Posted: 21 Mar 2010 10:32 PM PDT

上个周末,收到梁兄的来信。

他告诉我一个好消息,《摩西英语》已经结集出版了!

听到这个消息,我不禁想起了往事。一年半以前,"摩西英语"网站开张,我大概是它的第一个外部访问者。当时,网站刚刚搭建,梁兄询问我的看法。我看了一眼,觉得完全是业余爱好者的作品,设计得很粗糙,功能也很落后。我就直率地告诉他,我很钦佩你的勇气和理想,但是这个网站想成功,恐怕难度很大。

梁兄三十多岁了,没有学过计算机,也没有人脉和资源,只是一个普通工人,而且还辞职了。这样的条件,怎么可能做出一个很先进的网站呢?……互联网给人一种假象,似乎普通人也可以创造神话,但是你最好不要相信这一点。网络与其他所有世俗的领域一样,没有大公司和大资本的支持,你什么也做不到。所以,我那时对"摩西英语"的前途很悲观。

"摩西英语"的后台,采用了asp语言和性能较差的access数据库。结果开张第一天,大量访问者涌入,access数据库一下子锁死了,所有网页都打不开。我心想完了,第一天也撑不过去了。

但是,梁兄克服困难,坚持下来了,凭着一种信念:人生短暂,应该去追求自己的梦想。每个工作日,一篇原创的英语单词讲解,风雨无阻,至今已经有400篇了。"摩西英语"也从默默无闻的个人网站,变为国内小有名气的英语学习站点,Google Reader的订阅数达到了3000+,有道词典也与他合作推出了专门版本的电子词典

虽然他没说,但是我知道,这些成绩的背后是别人看不见的艰辛付出。网站开张很快就要满两年了,梁兄的所有时间几乎都用在这件事上了。日复一日地撰写文章、更新网页,就像愚公移山一样,每天都要为自己打气,对自己说,这座山是可能被我移走的。那种无力的孤独感,没经历过的人无法想像。更何况所有这一切,都没有办法变成经济收入,也许未来会找到方法,但是现在确实没法解决经济问题。你受到的打击是双重的,一方面是经济压力,另一方面是心理压力。社会不向你提供收入,就是变相告诉你,你不应该做这件事。

现在《摩西英语》终于结集出版了,我想这对于梁兄是一个莫大的安慰。这本书是对他人生价值的肯定,但愿能帮助他走得更远一点。

虽然我知道很难很难,但是我还是希望梁兄能继续坚持下去。你为我们所有人带来希望,如果你能够走得很远,就说明传说是真的。一个普通的灵魂,靠着自己的努力和勤奋,不断为别人创造价值,就能够在这个社会上生存下去,并且获得成功。最终来说,这并不是关于一个网站或一本书,而是一个关于梦想和奋斗的故事。让我们祈祷,互联网会让这一切成为可能。

朱学恒翻译过村上春树的一篇演讲,我要引用其中的一段:

"若要在高墙与以卵击石的鸡蛋之间作选择,我永远会选择站在鸡蛋那一边。

是的。不管那高墙多么的正当,那鸡蛋多么的咎由自取,我总是会站在鸡蛋那一边。就让其他人来决定是非,或许时间或是历史会下判断。

我们每个人或多或少都是一颗鸡蛋。我们都是独一无二,装在脆弱容器里的灵魂。对我来说是如此,对诸位来说也是一样。我们每个人也或多或少,必须面对一堵高墙。这高墙的名字叫做体制。体制本该保护我们,但有时它却自作主张,开始残杀我们,甚至让我们冷血,有效地系统化地残杀别人。

我这样做只有一個理由,那就是将个体的灵魂尊严暴露在光明之下,将一道光束照在体系上,避免它将我们的灵魂吞没,剥夺灵魂的意义。"

梁兄的"摩西英语"成功的机会,看上去是如此的微小,就好像鸡蛋击破高墙的机会那样微小,但是我永远选择站在鸡蛋这一边。

300页,52篇的英语单词讲解,只要18.40元,欢迎到http://www.mosesenglish.com/books.asp购买!(通过这个网址购买,梁兄还能获得佣金。)

(完)

2010年3月20日星期六

阮一峰的网络日志

阮一峰的网络日志


几种计算机语言的评价(修订版)

Posted: 20 Mar 2010 02:54 AM PDT

编程新手都有一个同样的问题:"我应该学习哪一种语言?"。

《Unix编程艺术》(Eric Raymond著)第十四章,对各种语言进行了评价,正好可以用来回答这个问题。下面是我的笔记,整理了六种主要计算机语言的优缺点。读完就会知道,对于不同的任务,应该选择哪一种语言了。

原文写于2003年。网上曾经有一个不完整的中译本,我也在这个网志中转贴过,所以今天贴的只能算修订版了。

====================

几种计算机语言的评价

作者:Eric Raymond

摘自《Unix编程艺术(第十四章)》

一、C

C语言的优点是,运行效率高和接近机器语言。它特别适用于以下几种程序:

  1. 对运行速度要求很高的程序。

  2. 与操作系统内核关系密切的程序。

  3. 必须在多个操作系统上移植的程序。

除此之外,学习C语言有一个最大的理由,那就是它能帮助我们学会,在硬件层次上考虑问题。如果你想以编程作为自己的人生事业,C是一定要学习的。

C的最大缺点是,在编程过程中,你不得不花很多时间,考虑与你要解决的问题完全无关、且非常复杂的硬件资源管理问题。

二、C++

C++在80年代中期推出,支持OO(面向对象编程),原意是作为C语言的取代者。

但是它没能做到做一点,原因有以下几个:

  1. 它也没有解决"内存管理"问题,虽然比C有所改善。

  2. 标准化不成功。各个编译器都只支持自己选择的一个子集,导致跨平台性不如C。

  3. 过分的精细和复杂了。C++的复杂度,超过了C和OO的复杂度之和。

  4. OO并没有带来多少优势,反而带来了一些副作用,比如厚重的胶合层和庞大的代码体积。

总的来说,C++的优势还是程序效率,以及面向对象编程能力,糟糕之处是它鼓励复杂的设计。

三、Shell

Shell程序写起来很容易,对于简单的任务,开发速度很快。

当程序变大时,它就不太适合了,很难维护,而且将变得非常专用(只能在你自己的机器上使用),因为 Shell必须调用各种外部程序,无法保证每一台机器都同样安装了这些程序。

最常见的Shell是bash,它的一些语法规则很混乱,会产生很难阅读的代码。另外,shell只能在Unix上使用,无法跨平台。

Shell的最佳用途如下:

  1. 执行简单的系统管理任务。

  2. 编写系统启动时的初始化脚本。

  3. 作为其他语言开发的程序的包装器。

四、Perl

Perl发布于1987年,基本上就是一个增强的Shell。

它的最大长处是强劲的文本处理能力,无以伦比的正则表达式支持,而且有全套Unix API的内部支持,显著减少了对C的需求。

Perl的主要缺点是某些部分设计得非常丑陋,且无法补救,某些部分也过于复杂。当程序规模增大时,必须严格遵守约定,才能保证模块化和设计的可控性,难于维护。

五、Python

Python发布于1991年,是一种与C语言紧密集成的脚本语言。

Python的优点是非常干净优雅,鼓励清晰易读的代码,易学易用;提供了面向对象编程的可能,但并不把这个选择强加于设计者;具有出色的模块化特性,同Java一样,适合用来做需要协同开发的大型复杂项目。在很多方面,它都比Java简单。此外,Python标准中包括了对许多网络协议的支持,因此也很适合网络管理任务。

Python的缺点主要是效率低下,速度缓慢。在执行速度上,它不仅无法与C/C++竞争,而且也不如其他主要的脚本语言。但是,这其实并不是一个严重的问题,有时网络或磁盘的延迟,会完全抵消Python本身消耗的时间。而且因为Python特别容易和C结合起来,因此性能关键的 Python模块,可以很方便地转化成C语言来提高速度。

总的来说,对于小型项目和大量依靠正则表达式的项目,Python不如Perl的表达能力强。至于更小的项目,Python则是大材小用,shell也许更适合。

六、Java

Java发布于1995年,设计目标有两个。

一个是"write once, run anywhere"(一次编写,到处运行),即不依赖于特定的平台;另一个是在网页中嵌入交互程序(applet),可以在任何一个浏览器中运行。由于它的所有者Sun公司的一系列失误,第一个目标并没有完全实现,第二个目标则是彻底失败。但是Java依然在系统编程和应用编程方面非常强大,足以挑战C和 C++。

Java的优点是比C++小巧简单,可以自动管理内存,支持类似C的语法和OO编程,与C程序的结合也很好。

Java的缺点是某些部分过于复杂,比如内部类和匿名类的运用会产生很混乱费解的代码;某些部分功能不完善,也无法利用操作系统提供的功能接口,比如在Java中读取和处理文本文件,并不像其他语言那样容易。此外,Java配置环境和版本的混乱,也让人很头疼。

总的来说,除了系统编程和某些对运行速度要求很高的编程之外,Java都是比C++更好的选择。如果和Python相比,Java可能在大型项目上有优势,但是也不是绝对的。

(完)

2010年3月18日星期四

阮一峰的网络日志

阮一峰的网络日志


Unix版权史

Posted: 18 Mar 2010 04:54 AM PDT

1.

这几天,我在读《Unix编程艺术》。

书中介绍了Unix的发展历史。我发现,这是一个很好的例子,说明现行版权制度具有阻碍社会发展的负面作用。

2.

Unix诞生于1969年,是贝尔实验室员工Ken Thompson的个人项目。由于贝尔实验室是AT&T(美国电话电报公司)的下属机构,所以Unix的版权归AT&T所有。

AT&T垄断了美国长途电话业务,所以美国司法部在1958年与它签了一个和解协议。AT&T同意不进入计算机业,不销售任何与计算机有关的产品,以避免司法部起诉它违反《反垄断法》。Unix是计算机的操作系统,所以AT&T不能销售它,任何要求得到源码的机构,都能免费得到。

加州大学伯克利分校得到源码后,为Unix添加了许多功能。然后在1979年,推出了一个自家的Unix版本,取名为Berkeley Software Distribution(伯克利软件套件),简称BSD。

3.

正当Unix蓬勃发展之际,发生了一件谁也没有想到的事情。

1974年,美国司法部再次起诉AT&T违反《反垄断法》。1982年,哥伦比亚地区法庭判决AT&T败诉,必须被拆成8家小公司。但是,这个判决也意味着1958年的和解协议失效,AT&T从此可以进入计算机业。

1983年,AT&T发布了Unix最新版system V,这是一个商业化版本,付费才能使用,并且不得传播源码。这个决定对BSD构成了限制,为了减少纠纷,伯克利分校规定,BSD本身依然保持免费,但是只能提供给持有AT&T源码许可的公司。不过,与此同时,伯克利的师生也开始着手另一项工作:将AT&T的专有代码从BSD中逐渐去除。

80年代后期,几个伯克利毕业的学生,成立了一家Berkeley Software Design Inc.公司,简称BSDi,专门销售BSD的一个商业版本。他们在广告中宣称,自己的产品不包含任何AT&T代码。这句话惹恼了AT&T,1990年BSDi被告上法庭,稍后伯克利分校也被追加为被告。AT&T起诉BSD侵犯了Unix的版权。

这场诉讼对BSD打击极大,所有的开发活动都被迫停止,用户人心惶惶,担心自己也遭到AT&T的追究,因此BSD的使用急剧减少。最后在1994年,双方达到和解,BSD才恢复开发。

4.

AT&T与BSD之间的诉讼,是当代版权制度最恶劣的应用之一。

为什么这么说?

首先,起诉者其实与Unix毫无关系。这是AT&T经理层的决定,而不是开发者的决定。事实上,包括Ken Thompson在内的技术人员一直希望,公司能够公开源码。他们完全有理由这么要求,因为Unix从来不是AT&T的业务重点,最初是个人项目,后来也没有占用公司太多资源。销售Unix的利润,在公司全部业务中,几乎可以忽略不计。为了一点点钱,去打击一个使许多人受益的产品,何必这样做呢。

其次,AT&T根本不关心Unix的发展。它真正关心的是金钱和削弱对手。1994年,官司还没有结束,它就把Unix卖给了Novell公司,从此不再与Unix发生关系,官司也因此不了了之。既然你不想要这个产品,为什么要提起诉讼呢?真是不可理解。

最后,所谓的侵权几乎是不存在的。因为Novell从AT&T买下Unix版权后,检查了BSD的源码,最后在18000个组成文件中删除了3个,并对其他文件做了一些小修改,然后BSD就重新获得了自由发布源码的许可。这意味着,至多只有千分之一的BSD代码有版权问题,但是就因为这千分之一的问题,导致百分之百的产品被迫中断,完全不符合比例原则。

所以,这场版权官司就是一家利益至上的公司,以微不足道的理由,为了一个自己根本不在乎的产品,悍然发动一场损人不利己的战争。

5.

这场战争给Unix和BSD带来毁灭性的打击。

从八十年代中后期开始,AT&T固执地捍卫Unix版权,完全不顾它的创造者和开发者的愿望,导致Unix丧失活力、一蹶不振,大量开发者无法参与,只好离开了这个平台。

而BSD在1992~1994年期间,开发处于停滞,错过了发展的黄金时机。官司结束以后,又不幸发生分裂,变成了FreeBSD、NetBSD和OpenBSD三个版本。这些原因导致BSD直到今天,都还在操作系统的竞争中处在落后地位。

如果换个时间,官司的损失也许还没这么大。偏偏90年代初是计算机工业决定性的年代,错过了那几年,从此你就不要想翻身了。因为从80年代末期开始,Intel的80x86芯片有巨大的发展,性能快速上升,而成本快速下降,个人电脑的年代就要到来了。市场迫切需要能够运行在386芯片上的操作系统,但是Unix和BSD忙于打官司,都没有去做移植操作系统这件事。其他两个这样做的人,改变了人类历史。

一个是比尔·盖茨,他推出了Windows,占领了个人电脑市场,后来赚了几百亿美元。另一个是芬兰大学生Linus Torvalds,他想学习Unix,但是买不起工作站,就自己写了一个能在386上运行的Linux操作系统,现在全世界超过一半的网络服务器都在使用这个系统。Linus Torvalds后来说,如果他早知道BSD没有法律问题,并且可以被移植到386,他就会加入BSD的开发,而不是自己写一个。

我们不禁要问,如果AT&T不打版权官司、不对Unix收费的话,会发生什么事?……人类的历史、市场的格局也许都会被改写。

6.

Novell买到Unix版权后,也没在手里放多久,1995年又转手卖给了别人。从此,Unix原始版本的开发正式结束。

以后的发展集中在两个方向,一个是各个商业公司自己修改的Unix版本,比如Sun的Solaris,HP的HP-UX,IBM的AIX,另一个则是开源项目的开发,比如BSD和Linux。

(完)

2010年3月16日星期二

阮一峰的网络日志

阮一峰的网络日志


为什么Joel不谈软件了?

Posted: 16 Mar 2010 04:52 AM PDT

3月初的时候,Joel发布了一个惊人消息(中文版见下文)。

他将不再写作网志了!就在3月17日,"Joel谈软件"开张十周年的纪念日,他就会停止自己的写作。

全世界排名第一的程序员网志要关门了?我简直不敢相信,不知道3月17日他会怎么告别,只能心神不宁地等着那一天。

结果昨天晚上,Joel出人意料地贴了一篇新文章,做了一些澄清。

首先,关于软件开发的文章,确实不会再写了,因为除了声明中提到的原因,Joel感到他已经有点在重复自己了。其次,讨论技术细节的文章,以后依然会写,比如Mercurial教程。最后,近期还会有一篇关于Twitter的文章,已经写了一半。

我对此感到很可惜,又一个自己喜欢的作者要从网上消失了。而且,Joel的风格太独特,将来恐怕不会再有这样的人了,滔滔不绝地把自己对软件开发的想法写成1000篇文章,免费给大家看,一写就是10年,而且写得那样生动活泼、富有启迪。这样的事情只可能在互联网诞生的初期发生,只有那种时候,才会让人产生异乎寻常的创造力和热情,因为无论你做什么,都是前无古人的,你都是在创造。等到网络模式成熟了,大家也就司空见惯了,没有太高的热情了,一切都是循规蹈矩。另一方面,我也很高兴,幸亏自己翻译了Joel的一本书,否则未来恐怕不会遇到这样的机会。

下面就是Joel告别Blog的声明,像他的其他文章一样,包含着令人深思的观点,非常值得一看。不知道这是不是最后一次我翻译他的文章了,但愿不是吧。

=======================

告别网志的时候到了

作者:Joel Spolsky

译者:阮一峰

发表日期:2010年3月1日

出处:inc.com


你创立了一家公司,做出了一种优秀的产品,现在你需要把消息传播出去。但是,你没有钱买广告,也没有钱雇佣公关公司,你的预算最多只够雇一个销售员。然而优秀的销售员都是聪明人,不会糊涂到愿意为你这样的小公司工作。

所以,你总是会想到网志。

当前,好像每一个初创公司,都有一个自己的网志。但是,其中99%都有问题。什么问题呢?那就是他们在网志中只谈自己,发一些招聘消息,展示一些新产品,秀一下员工一起野餐的照片。这样的文章,看上去当然很可爱。你的亲爱的妈妈,肯定很喜欢读。但是糟糕的是,除了你的妈妈,其他人都不感兴趣。大多数的企业网志,几乎没有任何读者,没有访问量,对销售也毫无影响。长此以往,网志的更新也越来越少,间隔的周期越来越长(如果撰写网志的责任由多个员工承担,情况就更是如此),最终网志就变得荒芜了。

我开始写"Joel谈软件"的时候,几乎没什么人写网志。那是10年前的事,那时我甚至还没有成立自己的公司。我的网志很快就在程序员中变得流行了,上面有各种各样的内容——如何写出漂亮的代码,如何在短得不合理的时间中拿出产品,如何得到更多的薪水等等。访问人数一直在上升,到了后来,一个月的独立访问者超过100万人。它也使得人们对我的公司"Fog Creek"和我们的产品,产生了兴趣。

那么,企业网志的成功秘诀是什么?怎样才能把网志转化为影响力、销售额和利润?其实,我自己都不太清楚应该怎么做。直到去年,我参加了一个软件研讨会,在会上,一个著名的游戏开发者Kathy Sierra做了一个发言,我听了以后茅塞顿开。她讲了一个很简单的观点,完全解释了为什么我的网志能为我带来商业成功,而其他那么多公司的网志都做不到。

根据她的观察,要让企业网志真正有影响力,就必须谈一些比你的公司、你的产品更大的东西。这听起来不难,但是实际上不是,你需要严格的自律,不谈你自己和你的公司。表面上,网志似乎是一种个人化的媒体,很多时候确实如此。但是,Kathy Sierra说,一旦你使用网志来推广企业,你就不能用它谈论自己感兴趣的事情。你必须谈一些你的读者愿意看到、或者希望看到的东西,这样他们才会变成你的客户。你必须让你的读者感到满意。

举例来说,如果你销售的是照相机的闪光灯,你就不要去谈产品的技术细节,也不要去谈旺季的促销计划(优惠10%!)。你要介绍拍出优秀照片的10个窍门。

如果你开餐馆,网志就不要介绍你的菜单,而要介绍一些好吃的食品。你这样才能吸引,对你的餐馆不感兴趣的饕客。

如果你生产高档巧克力,就不要在网志上写你去多米尼加共和国收购可可豆的旅程,因为这只对你个人有意义。你应该写详细的教程,介绍如何自己做出草莓巧克力。以后的十年中,任何一个美食家或面包师,想在Google中找到制作草莓巧克力的方法,他就会发现你的文章。帮助你的读者做出美味食品,很可能会吸引来一些这种食品的购买者,这就是一个成功的企业网志的意义。介绍前往多米尼加的旅程,只能吸引那些想去多米尼加的人。除非你是搞旅游的,否则你不应该写这个内容。

回顾起来,"Joel谈软件"实际上是一本内容高度集中、专门写给程序员看的小型杂志,以介绍一些软件开发的实用主义观点为主。我也利用它,为自己的公司做免费广告,但是那些广告实际上更接近社论,而不像商业目的的广告。我写的最受欢迎的文章,都与我自己和我的公司无关,比如我写过如果软件公司想要重构代码,那么千万不要推倒重来。

一旦大量的程序员成为了我的读者,他们中的许多人就会变成我的公司的顾客。因为读者群实在是太集中了,导致我们公司开发的产品,只有供程序员使用的才会成功,其他的都不成功。那些都是很优秀的产品,但是就是不成功,因为它们不是供程序员使用的,而我们又没有能力将它们推广到非程序员的目标客户中。

当然,网志占用了我大量时间。它是一种劳动密集型的手工推销方式。合计起来,我用来做自己的网站、写作相关书籍、录制视频、参加网志会议等等的时间,大约占到过去十年我创业总的投入时间的三分之一。那也就是整整三到四年的工作量。

这样做是否值得?你也应该这样写网志吗?

这样说吧,我很受用这个方式,但是当我观察其他人越多,就越发现很多成功的初创公司,不把大量早期创业时间用来架设一个受欢迎的网志,结果也能得到客户,并且快速地发展起来。

而且,更麻烦的是,除了我自己之外,我真的找不到其他任何通过写网志而获得成功的企业家。

过去十年的大热门技术公司,往往都没有一个像样的网志。Twitter、Facebook、Google的网志,都充满了喋喋不休、乏味透顶的新闻稿,最多只是略加改写,好让文章看上去不是那么一本正经。Apple公司实际上根本没有网志,哪怕它开发出了好几样优秀的革命性产品。同时,微软公司倒是有相当一大批很不错的网志,但是毫无作用,这家公司还是给人一种笨重迟暮的印象。

所以,我觉得是时候了,应该从网络日志中退休了,能够在狭小美好的程序员世界成为一个互联网名人,已经足够了。3月17日就是"Joel谈软件"开张十周年的纪念日,我将最后发一篇正式的文章。同时,正常情况下,我也将停止录制视频节目和公开演讲。Twitter?"那玩意太可怕了,我不会去玩的。抱歉,我没法只用140个字母,就告诉你原因。"

真正原因是,虽然我一如既往喜欢写Blog,但是我的时间越来越少了,因为Fog Creek正在不断发展壮大。我们现在有32个雇员,以及至少6条正式的产品线。我们的顾客也已经多到令我无法自由写作的地步,我很怕自己漫不经心写出的一句话,会侮辱到某位顾客。我的日常工作占用了大量时间,以至于无法集中精力,写作一点有思想性的东西,哪怕每个月只写一篇到两篇。

大量证据也表明,推广Fog Creek的产品有很多有效的其他方法。过去,我们倚重网志作为营销渠道,忽略了其他方法。我现在意识到,网志使得我和Fog Creek,成为了一个很小的池塘中的大鱼。结果就是,对于那些经常阅读网志的5%~10%的程序员来说,我们是无可争议的头号产品。同时,对于除此之外的每个人,我们完全是默默无名的。

我希望,放弃网志就好像让一个双眼发展不均衡的孩子,戴一付眼镜。是时候让那只好的眼睛休息一会,而让那只比较弱的眼睛有一个成长的机会了。我的公司需要证明一点,就是我们不依赖于单一渠道推广自己的产品,这是任何一家其他公司都已经明白的道理。在目标市场的一个细分领域中,我们已经彻底做到饱和了,现在我们不得不去大得多的其他领域,寻找更多的潜在顾客。

对于我的读者,感谢你们过去10年中对我的关注。没有你们,我不可能做成这个网志。感谢你们高质量的Email、留言、twitter发言、评论文章,所有这一切使得我的过去10年成为一次美好的旅程。我很享受我们在网上形成的这种关系,期待未来在我的公司的某个发展阶段,我能够与你们有面对面的交流。

(完)

2010年3月15日星期一

阮一峰的网络日志

阮一峰的网络日志


CSS3常用功能的写法

Posted: 15 Mar 2010 01:51 AM PDT

随着浏览器的升级,CSS3已经可以投入实际应用了。

但是,不同的浏览器有不同的CSS3实现,兼容性是一个大问题。上周的YDN介绍了CSS3 Please网站,该网站总结了一些常用功能的写法。

以下就是这些写法的详细介绍。所有代码都经过了Firefox 3.6和IE 8.0的验证,原文的错误之处也已得到改正。

一、圆角(Rounded Corner)

.box_round {

  -moz-border-radius: 30px; /* FF1+ */

  -webkit-border-radius: 30px; /* Saf3+, Chrome */

  border-radius: 30px; /* Opera 10.5, IE 9 */

}

圆角的实现比较简单,只要设好一个半径值就可以了。遗憾的是,目前所有的IE都不支持CSS圆角,要等到IE 9才行。

二、盒状阴影(Box Shadow)

.box_shadow {

  -moz-box-shadow: 3px 3px 4px #ffffff; /* FF3.5+ */

  -webkit-box-shadow: 3px 3px 4px #ffffff; /* Saf3.0+, Chrome */

  box-shadow: 3px 3px 4px #ffffff; /* Opera 10.5, IE 9.0 */

  filter: progid:DXImageTransform.Microsoft.dropshadow(OffX=3px, OffY=3px, Color='#ffffff'); /* IE6,IE7 */

  -ms-filter: "progid:DXImageTransform.Microsoft.dropshadow(OffX=3px, OffY=3px, Color='#ffffff')"; /* IE8 */
}

-moz-box-shadow、-webkit-box-shadow和box-shadow的设置是一样的,都有4个参数,含义分别为:x轴偏移值、y轴偏移值、阴影的模糊度、以及阴影颜色。

IE 6~8使用其独有的滤镜,需要设置三个参数:offX(X轴偏移值)、offY(Y轴偏移值)、Color(阴影颜色)。

三、线性渐变(Gradient)

.box_gradient {

  background-image: -moz-linear-gradient(top, #444444, #999999); /* FF3.6 */

  background-image: -webkit-gradient(linear,left top, left bottom, color-stop(0, #444444),color-stop(1, #999999)); /* Saf4+, Chrome */

  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#444444', endColorstr='#999999', GradientType='0'); /* IE6,IE7 */

  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#444444', endColorstr='#999999',GradientType='0')"; /* IE8 */

}

先看Firefox。

-moz-linear-gradient(top, #444444, #999999);

-moz-linear-gradient有三个参数。第一个参数表示线性渐变的方向,top是从上到下、left是从左到右,如果定义成left top,那就是从左上角到右下角。第二个和第三个参数分别是起点颜色和终点颜色。你还可以在它们之间插入更多的参数,表示多种颜色的渐变。

-webkit-gradient(linear,left top, left bottom, color-stop(0, #444444),color-stop(1, #999999));

-webkit-gradient是webkit引擎对渐变的实现,一共有五个参数。第一个参数表示渐变类型(type),可以是linear(线性渐变)或者radial(辐射渐变)。第二个参数和第三个参数,都是一对值,分别表示渐变起点和终点。这对值可以用坐标形式表示,也可以用关键值表示,比如left top(左上角)和left bottom(左下角)。第四个和第五个参数,分别是两个color-stop函数。color-stop函数接受两个参数,第一个表示渐变的位置,0为起点,0.5为中点,1为结束点;第二个表示该点的颜色。

DXImageTransform.Microsoft.gradient(startColorstr='#444444', endColorstr='#999999', GradientType='0');

IE依靠滤镜实现渐变。startColorstr表示起点的颜色,endColorstr表示终点颜色。GradientType表示渐变类型,0为缺省值,表示垂直渐变,1表示水平渐变。

四、透明(opacity)

正常情况下,上层的对象会覆盖下层的对象。

但是,如果将上层对象的颜色变为透明,就可以透过它看到下层对象。

.box_rgba {

  background-color: #B4B490;

  background:transparent;

  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#99B4B490',endColorstr='#99B4B490'); /* IE6,IE7 */

  -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#99B4B490',endColorstr='#99B4B490')"; /* IE8 */

  zoom: 1;

  background-color: rgba(180, 180, 144, 0.6); /* FF3+, Saf3+, Opera 10.10+, Chrome */

}

先看第一行。

background-color: #B4B490;

这是设置对象的预备色,也就是不透明时的颜色。如果浏览器不支持透明,就将显示这个颜色。

background:transparent;

filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#99B4B490',endColorstr='#99B4B490'); /* IE6,IE7 */

-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#99B4B490',endColorstr='#99B4B490')"; /* IE8 */

zoom: 1;

这几行是专门为IE写的,其中主要用到 DXImageTransform.Microsoft.gradient滤镜。我们要为它设置起点色(startColorstr)和终点色(endColorstr)。在单色透明的情况下,这两个值是相同的。需要注意的是,它们的取值是一个八位的十六进制值,前两位表示alpha通道值,00表示完全透明,FF表示完全不透明;后六位则是这个颜色的RGB值。

background-color: rgba(180, 180, 144, 0.6);

除了IE,其他浏览器几乎都支持rgba函数。它有四个参数,前三个为一种颜色的RGB值,第四个为透明度,这里设为0.6。

五、旋转(rotation)

.box_rotate {

  -moz-transform: rotate(7.5deg); /* FF3.5+ */

  -o-transform: rotate(7.5deg); /* Opera 10.5 */

  -webkit-transform: rotate(7.5deg); /* Saf3.1+, Chrome */

  filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9914,M12=-0.1305,M21=0.1305,M22=0.9914,SizingMethod='auto expand');

  -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.9914,M12=-0.1305,M21=0.1305,M22=0.9914,SizingMethod='auto expand')"; /* IE8 */

}

除了IE以外,其他浏览器都是用rotate函数,实现某个对象的旋转。比如rotate(7.5deg)就表示顺时针旋转7.5度(degree)。

IE则需要用到一个复杂的滤镜DXImageTransform.Microsoft.Matrix。它一共接受五个参数,前四个参数需要自行计算三角函数,然后分别写成M11 = cos(rotation),M12 = -sin(rotation),M21 = sin(rotation),M22 = cos(rotation),其中的rotation表示旋转角度,如果顺时针旋转7.5度,则rotation就为7.5;第五个参数SizingMethod表示重绘方式,'auto expand'代表自动扩展到新的边界。

除了这个滤镜,IE还有一个稍微简单一点的滤镜DXImageTransform.Microsoft.BasicImage(rotation=x)。其中的x只能取值为1,2,3,0,分别表示顺时针选择90度、180度、270度和360度。

六、服务器端字体(font-face)

设计网页的时候,可能会用到某种特殊的字体。如果用户的机器中没有安装,文字只能以普通字体显示。

这时可以让用户的浏览器自行下载服务器端字体,然后就能呈现出设计者想要的效果。

@font-face {

  font-family: 'MyFont';

  src: url('myfont.eot'); /* IE6+ */

  src: local('myfont.ttf'),

  url('myfont.woff') format('woff'), /* FF3.6 */

  url('myfont.ttf') format('truetype'); /* FF3.5+, Saf3+,Chrome,Opera10+ */

}

第一行代码:

font-family: 'MyFont';

表示为这种字体起一个名称,可以随意设置,我这里用的是MyFont。

src: url('myfont.eot');

这一行表示字体位置,由于ie只支持服务器端的eot字体,所以这一行是ie专用的。

src: local('myfont.ttf'),

  url('myfont.woff') format('woff'),

  url('myfont.ttf') format('truetype');

local()表示在本机(客户端)查找该字体,如果本机已经安装了,就不用下载了。url()表示字体在服务器上的位置,format()用来说明字体格式。Firefox 3.5支持TrueType和OpenType字体,Firefox 3.6又增加了WOFF字体。其他基于Webkit引擎的浏览器(sarif,opera、chrome),目前好像只支持truetype。

然后,使用的时候这样写就可以了。

h2{ font-family: "MyFont"; }

需要注意的是,字体文件必须与网页文件来自同一个域名,符合浏览器的"同源政策"。另外,由于中文字体文件太大,服务器端字体显然只适用于英文字体。

七、其他

利用css3,还可以完成transform(变形),包括skew(扭曲)和scale(缩放),以及css transitions(动态变换)。这些内容待以后再补充。

(完)

2010年3月14日星期日

阮一峰的网络日志

阮一峰的网络日志


美国电影《以眼杀人》

Posted: 13 Mar 2010 08:53 AM PST

这是一年来,我看过的最讽刺的电影。

它极尽所能讽刺了美军。

在电影中,美军为了更有效地击败敌人,找来了一批具有特异功能的人,训练他们用意识杀人。

简单说,就是让他瞪大眼镜。

盯着一只山羊。

然后,山羊就突然倒地,抽搐而死。

===========================

看完这部电影,我突然觉得,自己也能写一个剧本。

剧本的开头是这样的:

  (镜头缓缓穿过紧闭的金属门,切入室内。门口有人站岗。)

  (那是一间空旷的、大得像篮球场一样的会议室,中间放着一张巨大无比的圆形会议桌。大概有20多人坐在桌旁,正在开会。有人在发表讲话,其他人在做笔记。)

—— 同志们,目前的局势很严重,出现了许多不利因素。社会上有许多不好的风气,正在愈演愈烈。

  (随着他的讲话,相应的蒙太奇镜头一一插入。)

—— 有一张床可以睡觉,却还抱怨没有住房;明明知道中国地少人多,却还认为房价昂贵;手机中有淫秽信息,却不愿意电信公司审查短信;有高速的地铁可以乘坐,却嫌入口处的安检太麻烦;有股市和彩票可以赚钱发财,却还要求提高养老金和医疗保险;自己工作不努力,失业下岗,却要求政府负责;为了个人的一点小事,到处大吵大闹,却不知道保持社会稳定是每一个人的责任;每到逢年过节,都会有下基层的领导,却还说意见无法向上反映;每天晚上可以看免费的CCTV,却还想装卫星天线;网上有内容丰富、制作精良的新华网,却还要上Google。

  (镜头切回到会场。发言者提高了语调。)

—— 同志们,这些落后的思想,正在侵蚀群众,使得一部分人变得蛮不讲理,到处滋事煽动,成为社会的不安定因素。国际上的敌对势力,正在利用这些人来渗透、攻击、颠覆我们。长此以往,后果将不堪设想。

—— 同志们,新的时代对我们的执政能力,提出了新的挑战。我们亟需采用具有时代特征的新方法,加强对人民的教育,更好地领导人民。

  (镜头一一扫过听众。他们还是在不断地做笔记,或者是一付若有所思的样子。)

—— 同志们,为了适应这个高科技的时代,适应复杂多变的形势,适应许多以前没有出现过的情况,我们必须采用一些前所未有的手段。

—— 我们要达到人类灵魂的深处,从内部彻底教育那些思想落后的群众,彻底改造那些不安定分子。

  (所有的听众都停了下来,抬起头,看着发言者。)

  (发言者一挥手,秘书小姐从门口走进来,向每个听众发了一份报告。)

—— 大家拿到的报告,来自国防部、科技部、安全部、卫生部、宣传部的联合工作小组。他们发现,全国有13个基因突变者,具备心灵震慑能力。简单说,就是当他们与别人双目相对,就能让对方接受他们的想法。

  (屏幕上出现了一双睁开的眼睛的特写。眼神极为犀利。)

—— 我们需要这些人,建立与群众心与心交流的渠道,让群众向我们交心,从心灵深处说服群众。

—— 只有这样做,我们的国家才能彻底保持稳定。我们才能挫败国内外敌对势力的进攻。

  (片名《心灵战士》切入。背景音乐响起。)

  (画面切换,出现一行字。"献给在净化灵魂战线上工作的人们"。)

……

……

这个剧本怎么样?

我在后面还设想了一些情节。后来,哪怕是没有太阳的大冬天,路上所有人都带着墨镜,行迹匆匆,说话不看对方眼睛,因为害怕一看,自己的心就没了。再后来,这个城市中除了瞎子,大家都被人看过了……好像还挺有趣的,编剧看来是一个不错的职业。

对了,差点忘了声明。以上故事,纯属虚构。

(完)

2010年3月11日星期四

阮一峰的网络日志

阮一峰的网络日志


碧姬·巴铎

Posted: 10 Mar 2010 08:34 PM PST

下面这组照片,真是令我赞叹不已。

===============================

碧姬·巴铎(Brigitte Bardot)

时间:1955年

摄影师:Gaston Paris

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

11.

12.

13.

14.

15.

16.

17.

18.

19.

20.

21.

22.

================================

看完照片,我就干了一件让自己后悔不已的事情:上网搜索"Brigitte Bardot"。结果,……

——警告:如果你想永久保留美好印象,请不要点击下面的链接。

因为你会看到,1968年2003年的她,然后你就会像我一样后悔。

(完)