2011年3月30日星期三

阮一峰的网络日志

阮一峰的网络日志


MP3是如何颠覆音乐行业的

Posted: 30 Mar 2011 01:40 AM PDT

本文以MP3为例,探讨了现行版权制度与新技术之间的冲突。

1.

1987年,德国科研机构"弗劳恩霍夫协会"(Fraunhofer Institut)组建了一个研究小组,专攻音频编码。

2.

Karlheinz Brandenburg博士是这个小组的核心人物,他后来被称为"MP3之父"。

3.

1988年1月,国际标准组织ISO决定成立"运动图像专家组"(Moving Picture Experts Group,简称MPEG),解决影音节目的压缩编码的标准问题。音频编码是这个专家组的一个子项目,由弗劳恩霍夫协会的研究人员主导。

4.

1992年,MP3格式初步研制成功,ISO将其收入了国际标准。1994年7月14日, 官方编码器L3enc发布,文件后缀名正式定为".mp3",这一天被看做是MP3格式的生日。

5.

虽然MP3是一种国际标准,但是专利都属于弗劳恩霍夫协会。该协会决定将MP3商业化,解码器(decoder)可以免费或低价使用,但是编码器(encoder)要收取高额授权费。

6.

1997年,犹他大学的两个学生,推出了大受欢迎的音乐播放软件Winamp。这是历史上第一个被广泛使用的MP3解码器,外界由此开始注意到MP3格式。

7.

MP3格式的最大优点就是高压缩率,128Kbps取样时,文件体积只有原始wav文件的11分之一,而且音质几乎没有下降。一张CD转成mp3文件,体积大约在60MB左右。当时,大多数人的硬盘只有512MB,因此MP3格式开始流行起来了。

8.

越来越多的人想要用MP3储存自己喜欢的音乐,但是高昂的编码器授权费成了一种障碍。

9.

1997年底,一个澳大利亚学生用偷来的台湾信用卡,从一家德国公司购买了专业级的MP3编码器。他发现这个编码器使用了微软的通用编程界面,很容易破解,就把破解后的软件放上了美国一所大学的FTP。他在readme文件中写道:"这是免费软件,请随意使用。"

10.

弗劳恩霍夫协会大惊失色,企图抓住肇事者,并且警告所有使用者,不得非法使用偷来的编码器。但是无济于事,免费编码器在全世界流行开来,每个人都在用,MP3成了事实上的音频编码标准。没过几年,弗劳恩霍夫协会就明白大势已去了,它根本无力阻止这种全球潮流,不如默许MP3编码器可以免费使用。

11.

1999年,19岁的美国学生Shawn Fanning开发了Napster软件,允许使用者进行"点对点"(P2P)的MP3文件传输。这实际上使得任何人都可以从互联网上免费获得各种音乐作品。

12.

当MP3格式与互联网结合在一起,事情就变得很明显了,未来音乐的主要传播渠道将是互联网,因为实在是使用太方便、成本太低廉了。这就像雪崩将要开始,你怎么都无法阻止,那么不如接受它,提前开始做准备。

13.

弗劳恩霍夫协会意识到,免费音乐的时代将要到来,互联网上将到处都是可以自由下载的音乐。它赶紧向唱片公司通报,请求它们做好准备。但是,唱片公司根本不愿正视这种"噩梦",CD是它们的主要利润来源,它们想尽一切办法要保住CD。

14.

唱片公司先是起诉并关闭了Napster,然后威胁要起诉所有P2P下载的使用者。作为回应,加密的P2P下载很快开发出来,使得追踪使用者几乎成了"不可能的使命"。

15.

唱片公司又想开发一种加密格式,使得下载的音乐只能付费后播放。后来,这种想法逐渐演变成各种各样的"数字版权管理"技术(Digital Rights Management,简称DRM)。

16.

2007年,苹果公司CEO乔布斯发表文章,公开要求唱片公司"彻底抛弃 DRM",因为"它已经不起作用了",根本无法防止盗版,只是徒增用户使用的麻烦。二年后,苹果公司宣布,它的音乐商店itunes出售的所有音乐,都不带有DRM。至此,DRM在音乐行业宣告彻底失败。

17.

互联网时代出现了许多新的音乐格式,但是用户希望音乐文件在任何时间、任何设备都能播放,这使得MP3格式总是能够在竞争中获胜,因为它满足了用户的需要。一个免费音乐的时代,实际上已经来临。

18.

MP3的历史说明了一点,信息的免费传播是无法抗拒的潮流,技术的进步不以人的意志为转移。在这个互联网时代,企图以旧有的商业模式限制信息传播,将注定失败。

[参考文献]

* The MP3: A History Of Innovation And Betrayal

* The History of MP3

* Wikipedia: Mp3

(完)


2011年3月28日星期一

阮一峰的网络日志

阮一峰的网络日志


《美丽新世界》读后感

Posted: 28 Mar 2011 12:20 AM PDT

最近,我在整理以前的旧文章

突然想起来,十年前,我曾经写过一篇英国小说《美丽新世界》的书评,还未发表过。现在就把这篇旧文章贴出来,内容似乎一点没有过时。

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

《美丽新世界》读后感

作者:阮一峰 / 2001.12.7


1931年,欧洲一片混乱。大萧条处在高峰期,到处是找不到工作的穷人,中产阶级面临破产,各国政府摇摇欲坠,极左或极右的思潮纷纷出笼。为了对抗危机,越来越多的人相信一个集权的政府将是必要的。

这种想法让一个37岁的英国人很担忧。他从飞速发展的汽车工业身上,预感到一旦集权的政府上台,未来的国家机器将不再用警察和军队来维持统治,取而代之的是各种高科技手段。统治的目标将是经济繁荣,为了实现这个目标,人类也将被改造。

他写了一本预言小说,提醒人们关注这种危险。这本薄薄的十多万字的小说,一经发表,就轰动了世界。随着时间的流逝,其中的预言不仅没有过时,反而历久弥新,变得更有现实意义了。这个英国人就是小说家阿道斯·赫胥黎(Aldous Huxley,1894--1963),这本小说就是著名的《美丽新世界》(Brave New World)。

小说中的"美丽新世界"有高度的物质文明,所有一切都是自动化的。人们不愁吃穿,享受着最舒适的生活,每天下班以后,可以乘坐私人的超音速飞机,去世界各地度假旅行。经济繁荣和享受生活成为整个社会唯一的哲学理念,也是唯一的宗教。第一个采用流水线生产的亨利·福特被视为新的上帝,他生产出第一辆"福特"T型车的1908年被采纳为新的纪元元年(小说的故事就发生在福特632年,也就是公元2540年)。

阿道斯·赫胥黎这样推理:人类认识到了科学带来的巨大生产力,享受了流水线生产出来的丰富的物质产品,也同时发现了这种生活模式的脆弱性。人类社会中的种种不稳定因素----大到战争动乱,小到失恋生病----都会影响到物质生产,进而在不同程度上使人类社会发生混乱和倒退。于是,为了保证社会的稳定和繁荣,保证各种物质能够源源不断的生产出来,实现人类的幸福,就有必要消灭这些不稳定因素。

"美丽新世界"的设计者认识到,改造社会的基础在于改造人。以前诸次社会革命,之所以成果不大,就在于它们对人的改造还不彻底。"美丽新世界"将利用先进的科学技术,在四个方面彻底改造人。

首先,杜绝有先天缺陷的婴儿,建立万无一失的优生体系。人的生产采用标准化的工业过程。人类的出生地不再是医院妇产科,而是类似高级养殖场的"人类孵化中心"。为了防止父母的不良基因遗传给新生儿,胎生被取消,人是直接在孵化车间里被创造的,身上只含有优良的基因,所有对社会稳定繁荣不利的基因都将被去除。

其次,并不是所有的工作都需要高质量的人来完成的。如果让有才干的人去干低级工作,他势必会感到非常痛苦,这就为社会不安定埋下了隐患。低等人的活只能让低等人去干,因为他们不会觉得在做牺牲。所以对人进行识别和分类是免不了的,识别工作从胚胎时期就开始了,不同等级的胚胎将接受不同的培养,并且用各种手段强化胚胎之间的差别,以便适应将来不同岗位的需要。比如,在胚胎发育的后期,等级越低的胚胎就供氧越少,最早受到影响的是头脑,然后是骨骼,这样就确保了这些胚胎无论在智力和体力上都是低人一等的。

再次,只给人分类是远远不够的,还必须让每个人安心接受自己的等级,热爱自己的等级,忠于自己的等级,这样才能避免等级之间的冲突。这必须靠宣传和教育来实现。在"美丽新世界"里,每个人从婴儿期开始就接受精心安排的说教,哪怕睡眠的时候,都会有一只喇叭对着你的耳朵,低声细语,反复灌输各种教条。一旦人在思想上接受了社会现实,认为发生的一切都是合理的,就不会有自觉的动力去改进社会,那么社会不稳定的因素就消除了一大半。

最后,人在日常生活中还是会产生很多烦恼和痛苦,必须找到办法来消除它们。最常见的烦恼有两种,一种是性压抑,另一种是衰老。性压抑是人类社会稳定的大敌。为了使每个人性欲都能得到充分的满足释放,"美丽新世界"提倡性的泛交,男女之间不再有夫妻关系,而只有性交关系。至于征服衰老,这"并不是因为要保证老年人的健康,而是因为老年人总喜欢消极退却,相信宗教,靠读书和思考混日子。他们会思考",这是对社会稳定的潜在威胁。所以必须"给他们保健,不让他们生病,人工维持他们的内分泌,像年轻人一样,给他们输入年轻人的血液,保证他们的新陈代谢永远活跃。因此他们就不会老。"

除此以外,"美丽新世界"还提供一种安全的麻醉药,叫做"唆麻"(soma),这种麻醉药"具有基督教和酒精的一切好处,却没有两者的坏处",一旦产生了各种烦恼,只要服了这种药,就会立刻昏昏大睡,醒来以后所有不愉快都会忘得一干二净。

"美丽新世界"的设计者明白,社会稳定的关键在于控制人的思想。思想自由是最大的威胁。新思潮的出现,往往是社会革命的前奏。允许一个人自由思考,接触各种思潮,将是极具有破坏力的。于是,"新世界"里不允许思想自由,因为这种自由的副作用实在太大,将有可能将人类幸幸苦苦创造的物质毁于一旦。在"美丽新世界"里,各种有害思想都象病菌一样被排除在外。人们不再需要宗教,因为没有什么可祝福和祈祷的,人们也不再信仰上帝,而转而信仰亨利·福特。国家用快乐和消遣作为思想的替代品,思想的空白被各种各样的娱乐和感官上的刺激所填补。

写到这里,"美丽新世界"是一个什么样的世界,大家也就一目了然了。这是个极度繁华的世界,又是个人地位极度卑微的世界。人丧失了思想的功能,只是作为社会的附庸而存在,社会财富不仅是人享受的对象,更成为了人为之服务的主人。幸福本来是人生追求的一种目的,现在却反过来成为人的枷锁,这不能不引起我们的深思。

赫胥黎写作这篇小说的时代,二十世纪的科学大爆炸才刚刚开始。七十年过去了,小说中的许多预言已经实现(比如克隆技术),而且人类社会的某些发展似乎也正朝着小说中的方向前进。也许现在我们还说不上来,理想的社会应该是什么样,但至少《美丽新世界》为我们提供了一个反例,不理想的社会可能是什么样。

对于这样的社会,尽管它有那么多的好处,我们的回答也仍然象书中"野蛮人"(指来自"美丽新世界"以外的人)的回答一样:

"我不需要舒服。我需要上帝,需要诗,需要真正的危险,需要自由,需要善,需要罪恶。"

"实际上你要求的是受苦受难的权利。"

"那好,"野蛮人挑战地说,"我现在就要求受苦受难的权利。"

"你还没说要求衰老、丑陋和阳痿的权利;要求害梅毒和癌症的权利;要求食物匮乏的权利;讨人厌烦的权利;要求总是战战兢兢害怕明天会发生的事的权利。要求害伤寒的权利;要求受到种种难以描述的痛苦折磨的权利。"

良久的沉默。

"这一切我都要求。"野蛮人终于说道。

(完)


2011年3月27日星期日

阮一峰的网络日志

阮一峰的网络日志


Firebug控制台详解

Posted: 26 Mar 2011 07:14 AM PDT

Firebug是网页开发的利器,能够极大地提升工作效率。

但是,它不太容易上手。我曾经翻译过一篇《Firebug入门指南》,介绍了一些基本用法。今天,继续介绍它的高级用法。

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

Firebug控制台详解

作者:阮一峰


控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息。

一、显示信息的命令

Firebug内置一个console对象,提供5种方法,用来显示信息。

最简单的方法是console.log(),可以用来取代alert()或document.write()。比如,在网页脚本中使用console.log("Hello World"),加载时控制台就会自动显示如下内容。

另外,根据信息的不同性质,console对象还有4种显示信息的方法,分别是一般信息console.info()、除错信息console.debug()、警告提示console.warn()、错误提示console.error()。

比如,在网页脚本中插入下面四行:

  console.info("这是info");

  console.debug("这是debug");

  console.warn("这是warn");

  console.error("这是error");

加载时,控制台会显示如下内容。

可以看到,不同性质的信息前面有不同的图标,并且每条信息后面都有超级链接,点击后跳转到网页源码的相应行。

二、占位符

console对象的上面5种方法,都可以使用printf风格的占位符。不过,占位符的种类比较少,只支持字符(%s)、整数(%d或%i)、浮点数(%f)和对象(%o)四种。

比如,

  console.log("%d年%d月%d日",2011,3,26);

  console.log("圆周率是%f",3.1415926);

%o占位符,可以用来查看一个对象内部情况。比如,有这样一个对象:

  var dog = {} ;

  dog.name = "大毛" ;

  dog.color = "黄色";

然后,对它使用o%占位符。

  console.log("%o",dog);

三、分组显示

如果信息太多,可以分组显示,用到的方法是console.group()和console.groupEnd()。

  console.group("第一组信息");

    console.log("第一组第一条");

    console.log("第一组第二条");

  console.groupEnd();

  console.group("第二组信息");

    console.log("第二组第一条");

    console.log("第二组第二条");

  console.groupEnd();

点击组标题,该组信息会折叠或展开。

四、console.dir()

console.dir()可以显示一个对象所有的属性和方法。

比如,现在为第二节的dog对象,添加一个bark()方法。

  dog.bark = function(){alert("汪汪汪");};

然后,显示该对象的内容,

  console.dir(dog);

五、console.dirxml()

console.dirxml()用来显示网页的某个节点(node)所包含的html/xml代码。

比如,先获取一个表格节点,

  var table = document.getElementById("table1");

然后,显示该节点包含的代码。

  console.dirxml(table);

六、console.assert()

console.assert()用来判断一个表达式或变量是否为真。如果结果为否,则在控制台输出一条相应信息,并且抛出一个异常。

比如,下面两个判断的结果都为否。

  var result = 0;

  console.assert( result );

  var year = 2000;

  console.assert(year == 2011 );

七、console.trace()

console.trace()用来追踪函数的调用轨迹。

比如,有一个加法器函数。

  function add(a,b){

    return a+b;

  }

我想知道这个函数是如何被调用的,在其中加入console.trace()方法就可以了。

  function add(a,b){

    console.trace();

    return a+b;

  }

假定这个函数的调用代码如下:

  var x = add3(1,1);

  function add3(a,b){return add2(a,b);}

  function add2(a,b){return add1(a,b);}

  function add1(a,b){return add(a,b);}

运行后,会显示add()的调用轨迹,从上到下依次为add()、add1()、add2()、add3()。

八、计时功能

console.time()和console.timeEnd(),用来显示代码的运行时间。

  console.time("计时器一");

  for(var i=0;i<1000;i++){

    for(var j=0;j<1000;j++){}

  }

  console.timeEnd("计时器一");

九、性能分析

性能分析(Profiler)就是分析程序各个部分的运行时间,找出瓶颈所在,使用的方法是console.profile()。

假定有一个函数Foo(),里面调用了另外两个函数funcA()和funcB(),其中funcA()调用10次,funcB()调用1次。

  function Foo(){

    for(var i=0;i<10;i++){funcA(1000);}

    funcB(10000);

  }

  function funcA(count){

    for(var i=0;i<count;i++){}

  }

  function funcB(count){

    for(var i=0;i<count;i++){}

  }

然后,就可以分析Foo()的运行性能了。

  console.profile('性能分析器一');

  Foo();

  console.profileEnd();

控制台会显示一张性能分析表,如下图。

标题栏提示,一共运行了12个函数,共耗时2.656毫秒。其中funcA()运行10次,耗时1.391毫秒,最短运行时间0.123毫秒,最长0.284毫秒,平均0.139毫秒;funcB()运行1次,耗时1.229ms毫秒。

除了使用console.profile()方法,firebug还提供了一个"概况"(Profiler)按钮。第一次点击该按钮,"性能分析"开始,你可以对网页进行某种操作(比如ajax操作),然后第二次点击该按钮,"性能分析"结束,该操作引发的所有运算就会进行性能分析。

十、属性菜单

控制台面板的名称后面,有一个倒三角,点击后会显示属性菜单。

默认情况下,控制台只显示Javascript错误。如果选中Javascript警告、CSS错误、XML错误都送上,则相关的提示信息都会显示。

这里比较有用的是"显示XMLHttpRequests",也就是显示ajax请求。选中以后,网页的所有ajax请求,都会在控制台面板显示出来。

比如,点击一个YUI示例,控制台就会告诉我们,它用ajax方式发出了一个GET请求,http请求和响应的头信息和内容主体,也都可以看到。

[参考文献]

* Firebug Tutorial - Logging, Profiling and CommandLine (Part I)

* Firebug Tutorial - Logging, Profiling and CommandLine (Part II)

(完)


2011年3月20日星期日

阮一峰的网络日志

阮一峰的网络日志


IETF:互联网精神的典范

Posted: 20 Mar 2011 02:57 AM PDT

今年是IETF成立25周年,ars technica有一篇介绍文章,回顾了它的辉煌成就。

IETF的全称是"互联网工程任务组"(Internet Engineering Task Force),主要目标是协调制定互联网标准。

几乎所有重要的网络底层协议,都是由IETF制定的,比如TCP协议IP协议HTTP协议等等。可以毫不夸张地说,没有IETF就没有互联网。

我一直以为,IETF与其他权力机构没有不同----一些人高高在上,另一些人服从指挥。但是,读完介绍文章以后,我震惊了,IETF居然是网友自发组织,并且自我管理的!

IETF这样介绍自己:

"我们没有会员的概念,所有人都可以参与,都可以报名参加会议。只要加入邮件列表,你就可以把自己看做是一个IETF成员。

----摘自The Tao of IETF(英文版中文版)"

这就是说,任何人都可以加入IETF,提出自己的互联网标准!这与其他标准制定机构(比如ANSI、ISO、IEEE等等)截然不同,那些机构的门槛很高,有时你必须是主权国家,才有资格加入。

IETF的运行原则,也完全是民主平等的。

"我们拒绝国王、主席和投票。我们相信共识和运行的代码。(We reject kings, presidents and voting. We believe in rough consensus and running code.)"

对于IETF来说,你是谁不重要,只要得到大多数人的赞同,或者代码运行得更好,你的标准就有可能成为整个互联网的标准。之所以不搞投票,只是为了避免平均主义,只需要那些真正关心和了解这个问题的人保持一致就行了。

IETF的邮件列表是不受审查的,任何意见都可以发表。虽然有志愿者担任的管理员,但那是为了保证讨论秩序,而不是为了控制讨论。

"某个领域的负责人(area director)是选出来协助大家思考,而不是接管整个思考过程。(ADs are selected to think, not to just run the process.)"

IETF进一步地明确表示,虽然自己制定标准,但并不硬性推广标准,更不谋求控制互联网。

"如果你对IETF感兴趣,只是因为你想当互联网的监督者,那么你可能会对我们极其失望。(If your interest in the IETF is because you want to be part of the overseers, you may be badly disappointed by the IETF.)"

"我们的角色是指出方向,而不是下命令。(its role is to set directions rather than to give orders.)"

IETF每年举办三次年会,它关于年会的定位和安排,更是令人瞠目结舌,将自由合作的精神发挥到了极致。

"我们的年会与别的年会不一样。我们的主要目的,是为了让大家放松一下。"

"任何人都可以报名参加。你不要有精神负担,完全可以为了感受一下气氛,而来参加会议。"

"穿着的一般原则是'根据天气而定'(如果你一整天都不打算去室外,我们的建议就是怎么舒服怎么穿)。"

"因为必须在胸口佩戴姓名标签,所以上身最好穿衬衫或短上衣。下身推荐穿普通的裤子或者裙子。许多新人穿着西装亮相会场,他们会感到很尴尬,因为其他人只穿T恤、牛仔裤(如果天气允许,不少人还会穿短裤)和拖鞋。"

"如果你对发言者的主题不感兴趣,你可以低头阅读自己的email和上网,这是很普遍的现象。"

"所有会议都可以随便坐,任何平整的表面、任何有电源插座的地方,都可以坐下。你可以与旁边的人,一边打开笔记本电脑,一边讨论。"

在IETF身上,充分体现了自由、开放、合作、共享的精神。这是互联网的核心价值。正是这样的机构,以及信奉这些价值的人,奠定了互联网的基础。

可是,当今世界还有另一些人,他们拼命地想要管制互联网,把它变成一个封闭的、信息不能自由流动的、等级制的、存在中央管理机构的"监狱"。只要IETF这样的机构存在,只要IETF制定的标准构成互联网的基础,那些企图控制互联网的人就注定会可耻地失败。

(完)