[转]Smarty 学习随记,很不错,值得初学参考

(06年的文章,时间比较老了,但信息还不过时)

源于: http://www.jcwcn.com/html/PHP/09_08_22_827.htm

我的个人建议,下边的文字都是SMARTY里经常用到的一些基础概念的东西! 写的非常细致,而且接近中国人的思维了,都是工作中做的总结. 但是更全的资料到SMARTY的官方论坛上去看吧!!!!!
http://www.phpinsider.com/smarty-forum/
虽然是全英文的,但是只要你能看个大概其,相信收益将会非常大,而且上边的管理员也是非常热情,可是因为是美国时间,所以一般他们活跃的时间是半夜3,4点!!

虽然很简单的东西,但是还是共享一下!!

什么是smarty及其安装

Smarty是一个php模板引擎,它分开了逻辑程序和外在的内容,提供了一种易于管理的方法.

Smarty要求web服务器运行php4.0.6和以上版本.

smarty安装需要smarty库文件。可以去官方网站http://smarty.php.net下载。

网上讲了很多安装的教程,但是我都没有成功,所以直接把整个目录名改为smarty直接复制到了网站所在的目录下,然后打开
http://网站路径/smarty/demo/index.php,显示正常,应该算是安装成功了。

基本语法

所有的smarty标签都被加上了定界符.在smarty里,所有定界符以外的内容都是静态的,当smarty遇到了模板标签,将尝试解释他们,然后再以恰当的方式输出.

默认情况下是 {和},但它们是可定制的.定制方法是:
$smarty->left_delimiter = '<!--{';
$smarty->right_delimiter = '}-->';

1.注释

模板注释被*号包围,例如 {* this is a comment *}
smarty注释将不被输出.它是模板内在的注释.

2.变量
模板变量以$开头,可以包含数字,字母和下划线。
config_file变量是例外要用#变量名#的方法引用

3.函数
smarty标签输出一个变量或者调用某种函数.
在定界符内函数和其属性将被处理和输出.例如:
{funcname attr1="val" attr2="val"}.
funcname为函数的名称比如:include等,attr1,attr2为属性名,val为属性相应的值。

在模板里无论是内建函数还是自定义函数都有相同的语法.
内建函数将在smarty内部工作,例如 {if}, {section} 和{strip}.他们不能被修改.
自定义函数通过插件机制起作用,它们是附加函数,可以随意修改,自行添加.
例如 {html_options} and {html_select_date}

4.属性
静态数值不需要加引号,布尔值(真或假)也不需要引号,可以是true,on,yes或者false,off,no. 但是字符串例外.变量同样被用到了,它们也不能加引号.

5.在字符串中插入变量
只能识别数字,字母,下划线和[]的组合,如果为复杂的形式需要用``将变量隔起来。比如{func var="test $foo.bar test"} 中只能识别变量$foo,要识别$foo.bar,需要写成{func var="test `$foo.bar` test"}的格式。

6.一些保留字的显示方法
在模板中如果要将smarty的一些保留字作为语言的内容显示出来,比如显示分隔符,默认为{}的方法是: {ldelim},{rdelim} 或者{$smarty.ldelim},{$smarty.rdelim} 或者可以把{}放在{literal} .. {/literal} 中间输出。

smarty的保留变量

{$smarty}保留变量可以被用于访问一些特殊的模板变量.
以下是全部.

页面请求变量
以下是访问页面请求变量诸如get,post,cookies,server,enviroment和session变量的例子. 例如{$smarty.server.SERVER_NAME}取得服务器变量,{$smarty.env.PATH}取得系统环境变量path, {$smarty.request.username}取得get/post/cookies/server/env的复合变量。

{$smarty.now}变量用于访问当前时间戳.
可以用 date_format调节器格式化输出. 例如{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}

{$smarty.const}
你可以直接访问PHP常量. 例如{$smarty.const._MY_CONST_VAL}

{$smarty.capture}
可以通过 {capture}..{/capture}结构 截取的输出可以使用{$smarty} 变量访问.

{$smarty.config}
{$smarty}变量 可以访问已经加载的config变量.
例如 {$smarty.config.foo}就可以表示 {#foo#}.

{$smarty.section}, {$smarty.foreach}
{$smarty} 变量可以访问'section'和'foreach'循环的属性.

{$smarty.template}
显示当前被处理的模板的名字.

{$smarty.version}
显示smarty模板的版本

{$smarty.ldelim}
显示左分隔符

{$smarty.rdelim}
显示右分隔符

变量调节器
变量调节器用于变量,自定义函数和字符串.
可以使用'|'符号和调节器名称应用调节器.
变量调节器由赋予的参数值决定其行为.
参数由':'符号分开.
如果你用变量调节器调节数组变量,结果是数组的每个值都被调节.如果你想要调节器调节整个数组,你必须在调节器名字前加上@符号.
例如: {$articleTitle|@count}(这将会在输出 $articleTitle 数组里的数目)

capitalize
将变量里的所有单词首字大写. 参数值boolean型决定带数字的词是否首字大写。默认不大写

count_characters
计算变量值里的字符数.参数值boolean型决定是否计算空格数。默认不计算空格

cat
将cat里的参数值连接到给定的变量后面.默认为空。

count_paragraphs
计算变量里的段落数量

count_sentences
计算变量里句子的数量

count_words
计算变量里的词数

date_format
日期格式

第一个参数控制日期格式.
如果传给date_format的数据是空的,将使用第二个参数作为默认时间

%a - 星期几的简写

%A - 星期几的全写

%b - 月份的简写

%B - 月份的全写

%c - 日期时间06/12/05 11:15:10

%C - 世纪时间

%d - 一个月的第几号(从 01 到 31)

%D - 同 %m/%d/%y

%e - 一个月的第几号,号为单数则前面加一空格 (从 1 到 31)

%g - 世纪

%G - 世纪 [0000,9999]

%h - 同%b

%H - 24小时形式的小时(从00到23)

%I - 12小时形式的小时(从01到 12)

%j - 一年中的第几天(从 001 到 366)

%k - 24小时形式的小时,单数字前面加空格. (从 0 到 23)

%l - 12小时形式的小时,单数字前面加空格.(range 1 to 12)

%m - 月份 (range 01 to 12)

%M - 分

%n - 换行符

%p - 显示早上还是下午`am' 或 `pm'

%r - a.m. 或 p.m.形式的时间

%R - 24小时形式的时间

%S - 秒

%t - tab符号

%T - 同%H:%M:%S

%u - 用 [1,7],表示星期几

%U - 计算是该年的第几个星期,从该年的第一个星期天开始计算

%V - 计算是该年的第几个星期, 从 01 到 53, 第一个星期必须至少有4天在这一年, 星期天作为这个星期的第一天

%w - 用数字的形式表示是星期的第几天, 星期天 为 0

%W - 用数字的形式是该年的第几个星期,从该年的第一个星期一开始计算

%x - 显示日期:月/日/年

%X - 显示时间:小时:分钟:秒

%y - 不包括世纪的年份

%Y - 包括世纪的年份

%Z - 时区

%% - 输出%

其中有些有时不能正常输出。

default
默认
为空变量设置一个默认值.
当变量为空或者未分配的时候,将由给定的默认值替代输出.

escape
转码
参数值为html,htmlall,url,quotes,hex,hexentity,javascript。默认是html转码

indent
缩进
在每行缩进字符串,第一个参数指定缩进多少个字符,默认是4个字符.第二个参数,指定缩进用什么字符代替。

lower
小写
This is used to lowercase a variable.
将变量字符串小写

nl2br
换行符替换成<br />

regex_replace
正则替换
寻找和替换正则表达式.必须有两个参数,参数1是替换正则表达式. 参数2使用什么文本字串来替换

replace
替换
简单的搜索和替换字符串必须有两个参数,参数1是将被替换的字符串. 参数2是用来替换的文本

spacify
spacify是在字符串的每个字符之间插入空格或者其他的字符串. 参数表示将在两个字符之间插入的字符串,默认为一个空格。

string_format 字符串格式化
是一种格式化浮点数的方法.例如十进制数.使用sprintf语法格式化。参数是必须的,规定使用的格式化方式。%d表示显示整数,%.2f表示截取两个浮点数。

strip 去除(多余空格)
替换所有重复的空格,换行和tab为单个或者指定的字符串. 如果有参数则是指定的字符串。

strip_tags 去除所有html标签

truncate 截取
参数1,规定截取的字符数.默认是80个.
第二个参数指定在截取的那段字符串后加上什么字符.默认为...
第三个参数决定是否精确截取,默认情况下为false,则smarty不会分割单词。

upper 将变量改为大写

wordwrap 行宽约束
第一个参数指定段落的宽度(也就是多少个字符一行,超过这个字符数换行).默认80.
第二个参数指定在约束点使用什么字符(默认是换行符\n).
第三个参数决定是否精确截取字符,默认情况下是不精确截取,就是截取时不能分开单词。

内建函数
内建函数不能擅自修改。
capture
capture函数的作用是收集模板输出的数据到一个变量里,而不是把它们输出到页面.例如任何在 {capture name="foo"}和{/capture}之间的数据都被收到了由函数的名称属性指定的变量{$foo}里,或者{$smarty.capture.foo}里。如果函数没有名字属性,将使用"default".每个{capture}都必须对应{/capture},也不能嵌套使用capture函数。

config_load
引用配置文件
file是必须的,说明要包含进来的配置文件名称,section说明要加载的部分的名称,scope被处理的变量的作用域.必须是local,parent或者global.
local的意思是变量将在本模板里被加载.
parent 的意思是变量将在本模板和上级模板被加载.
global的意思是变量将应用到所有的模板.默认为local。变量是否在上级模板可视,默认为no。如果scope属性已经有了,这个值将被忽略.

foreach,foreachelse
foreach循环是选择性的section循环.用于遍历关联数组.foreach的语法比section简单的多,但是作为一个折中它只能用于简单数组.
foreach必须的参数是from和item. from变量表示需要循环的数组的名称,item表示当前元素的变量名,key表示当前关键字的变量名,name表示访问foreach属性的foreach循环名。循环可以互相嵌套,被嵌套的循环之间的名字必须是独立的.foreachelse 在from变量没有值的时候被执行

include
用来引用其他的模板。
file属性是必须的用来表示所引用模板的名字,assign表示include文件将要分配的输出的变量。你可以自行用属性名="属性值"的方式定义任意个局部变量。

include_php
用来在模板中引入php脚本。file是必须的用来表示php脚本的路径,once确定如果在模板中引用了php脚本多次,是否只装载一次。默认为true。

insert
用来包含php脚本中的函数,name是必须的,表示所插入的脚本的名称,注意如果名称是name,则包含的函数则是insert_name(),所以所有要插入的函数要有前缀insert_ 。如果用了assign属性,则insert的输出将会分配给模板变量而不会显示。 script表示要引用的脚本路径。这个程序产生的内容将不会被缓存,在每次调用该页时重新执行,适用于广告,投票,查询结果等互动的地方。

if,elseif,else
if语句和和条件同php差不多,但每个词之间必须用空格分割开。也有一些新的条件语句,列举如下:eq相等,ne、neq不相等,gt大于,lt小于,gte、ge大于等于,lte、le 小于等于,not非,mod求模。is [not] div by是否能被某数整除,is [not] even是否为偶数,$a is [not] even by $b即($a / $b) % 2 == 0,is [not] odd是否为奇,$a is not odd by $b即($a / $b) % 2 != 0

php
php标记可以让模板中能直接使用php语言。

section,sectionelse
section用来循环显示数组的数据,name和loop是必须的参数。name表示嵌套名. section 可以嵌套使用,但是名字必须各不相同。loop表示循环的次数. sectionelse在loop参数为空的输出。start用来规定循环开始的指针,如果值为负则从数组尾部计算开始的指针,默认为0.step表示循环的步数,为负则反向循环,默认为1.max设定循环的最大步数.show决定是否显示section.
section也有自己的变量处理section属性,用{$smarty.section.sectionname.varname} 来显示.

index
index用来显示当前循环的指针,从0开始.

index_prev
用来显示前一次循环的指针,从-1开始

index_next
用来显示后一次循环的指针.

iteration
显示当前循环的次数,从1开始.

first
如果当前循环为第一个循环,则值为true.

last
如果当前循环为最后一个循环,则值为true.

rownum
同iteration.

loop
显示最后一次循环的指针,可以用在section中间的任何地方,也可以用在section之后.

show
show 决定是否显示section.

total
显示总共循环的次数,可以用在section中间的任何地方,也可以用在section之后.

strip
去掉多余的空格

常规函数
assign
assign用来在执行模板时分配变量值.var,value是必须的参数.var为要分配值的变量名,value为分配的值.

counter
counter用来输出一个计数. 可以用多个计数,但是名字必须各不相同.name表示计数器名,默认为default.start表示计数的初始值,默认为1.skip计数的间隔,默认为1.direction表示计数方向,up或down,默认为up.print表示是否打印该值,默认为true.assign定义模板变量,计数器的输出将被分配到assign定义的变量中.

cycle
Cycle用来循环显示一组数值.name表示cycle名,values("值1","值2",...)表示循环显示的一组数值.print表示是否显示.advance决定是否显示下一个数值. delimiter决定value的分隔符,默认为逗号. assign定义模板变量,cycle的输出将被分配到assign定义的变量中.

debug
debug可以显示所有分配了值的变量,但是不显示模板内容,output属性决定显示的格式html或javascript,默认是html.

eval
eval用来在变量里插入变量。var是插入的变量名,assign把输出分配给一个变量。

fetch
用来取得文件内容,并输出文件内容,可以取得本地文件,http文件和ftp文件,file是取得文件的路径, assign把输出分配给一个变量。

html_checkboxes
html_checkbox用来用给定的数据创建checkbox。name表示checkbox的名称,values表示checkbox的值,output表示checkbox的显示,selected表示被选选项的值,options表示一组checkbox的值和显示,separator表示分割每个checkbox的符号,labels表示给输出添加标签,默认为true。

html_image
html_image用来为一个图片创建html标签,如果height和width不分配值将会自动生成。file是图片的路径,height,width,alt同html标签,basedir是图片相对路径开始的目录的路径,默认为服务器根目录。href定义图片的链接。

html_options
输出下拉列表,参数有name,values,output,selected,options。

html_radios
输出单选框,参数同复选框。

html_select_date
prefix定义各个下拉列表名字的前缀,默认为Date_。time决定使用的时间,默认是当前时间。start_year决定下拉列表开始的年份,可以用年份表示,也可以用与当前年份的相对年数来表示。默认是当前年份。end_year决定下拉列表结束的年份,可以用年份表示,也可以用与当前年份的相对年数来表示。默认是当前年份。display_days决定是否显示日期。display_months决定是否显示月份。display_years决定是否显示年份。month_format决定显示月份的格式,默认为%B。day_format决定显示日期的格式,默认为%02d。day_value_format决定日期值的格式,默认为%d。month_value_format决定月份值的格式,默认为%m。year_as_text决定是否将年份按文本格式输出。reverse_years决定是否反向输出各年份。field_array用来取得一组变量,可以用name[Day],name[Month],name[Year]的方式从form取得获得的值。day_size,month_size,year_size添加大小标签。all_extra,day_extra,month_extra,year_extra添加额外的属性到select或input标签。field_order决定年月日下拉列表的顺序,默认为MDY。field_separator不同下拉列表之间的分隔符,默认是\n。year_empty,month_empty,day_empty是在各下拉列表第一栏显示的内容。

html_select_time
prefix定义各个下拉列表名字的前缀,默认为Time_。time决定使用的时间,默认是当前时间。display_hours决定是否显示小时。display_minutes决定是否显示分钟。display_seconds决定是否显示秒数。display_meridian 决定是否显示上午或下午,即显示am/pm。use_24_hours 决定是否24小时制。minute_interval 决定分钟之间的间隔。second_interval 决定秒数之间的间隔。field_array用来取得一组变量,可以用name[Hour],name[Minute],name[Second]的方式从form取得获得的值。all_extra,hour_extra,minute_extra,second_extra ,meridian_extra添加额外的属性到select或input标签。

html_table
loop定义用于循环的一组数据。cols决定列的数目,rows决定行的数目,如果其中一个为空,另一个有值,则根据元素个数和有值的属性来计算另一个的值,两者的默认值为3。inner决定元素的列举方向cols则列跟着列排列,rows则行跟着行排列,默认为cols。table_attr,tr_attr,td_attr分别为table,tr,td增加标签,如果tr_attr,td_attr是数组,将会循环增加标签。trailpad用来填充最后一行没有值的单元格,默认是 。hdir决定每行元素的排列方向,从左到右right或从右到左left,默认为right。vdir决定每列的排列方向,从上到下down或从下到上up,默认为down。

math
进行数字运算操作。equation和var是必须的。equation定义运算式,可以使用的运算符有+, -, /, *, abs, ceil, cos, exp, floor, log, log10, max, min, pi, pow, rand, round, sin, sqrt, srans and tan。var给运算变量赋值。format确定结果的格式。assign将输出赋给一个参数。

mailto
使用mailto函数能使网络蜘蛛很难获取你的email地址,但是能在网页上正常显示,因为他把email地址进行了加密处理。address是必须的,定义email地址。text是显示在页面上的文本内容,默认是email地址。encode是加密email地址的方式,可以是none,hex或javascript,默认是none。如果要把邮件发给其他的邮箱,可以用cc抄送,email地址之间用,分割。bcc则为密件抄送。subject是邮件主题。newsgroups是发表内容的新闻组,新闻组之间用,隔开。extra添加附加标签。followupto意思不知。

textformat
textformat用来格式化文本,他会去掉空格和特殊字符,和规定行宽和缩进。style规定当前的格式,indent规定缩进的位数。indent_first规定第一行的缩进。indent_char用来缩进的字符,默认是一个空格。wrap规定行宽,即一行的字符数,默认是80。wrap_char规定每行的分隔符,默认是\n。wrap_cut决定是否分割单词。assign将输出分配给变量。

常量
SMARTY_DIR
是到smarty类目录的完全路径,必须以/结束。如果没有定义,将会自动决定路径.

SMARTY_CORE_DIR
是到smarty类core文件目录的完全路径,必须以/结束。如果没有定义,将会自动定义为smarty_dir路径下面的子目录.

变量

$template_dir
默认的模板目录名,默认为"./templates".
$compile_dir
默认的编译模板目录名,默认为"./templates_c"
$config_dir
默认的config文件目录名,默认为"./configs".
$plugins_dir
默认的插件目录名,默认为"plugins".
$debugging
debugging控制台。即一个显示变量的窗口.
$debug_tpl
debug窗口的模板
$debugging_ctrl
另一种控制debugging的方法。
$autoload_filters
对所有的模板使用过滤程序,这个变量是一个数组,其中关键字是过滤的类型,值是过滤的名字。
$compile_check
每次php执行将是否查看模板的内容是否改变。

$caching
决定是否缓存文件执行生成的文件。
$cache_dir
默认的模板缓存目录名,默认为"./cache".
$cache_lifetime
缓存的模板的过期时间,以秒计算. $caching值为-1则缓存的模板永不过期.

最后我放个我用的例子.大家仅做一个参考吧!!!

<?php
error_reporting(7);

$TurnDot  =  substr(PHP_OS, 0, 3) == 'WIN'  ?  ";"  :  ":"  ;

$doc_root=$_SERVER['DOCUMENT_ROOT'];   //默认获取根路径
//$doc_root="E:/Myweb/an-cool.com/Web" ; //这里是指定路径

$lib_root=".".$TurnDot.$doc_root."/shopadmin".$TurnDot.$doc_root."/shopadmin/inc".$TurnDot.$doc_root."/".$TurnDot.$doc_root."/jpgraph/src/".$TurnDot.$doc_root."/Smarty/libs/".$TurnDot.$doc_root."/Smarty";

ini_set("include_path",$lib_root);

include("conf.global.php");  //这里是装载一个全局配置文件.

$Templates_root = $doc_root."/templates";  //定义摸版根目录
define("Templates",$Templates_root);

$templates  = isset($INFO['templates'])  ?  $INFO['templates']  :  'default'  ;

include_once('Smarty.class.php');

$tpl = new Smarty();                                                                   //建立smarty实例对象$tpl
$tpl->debugging = false;
$tpl->template_dir   = Templates."/".$templates  ;                             //设置模板目录
$tpl->compile_dir    = Templates."/".$templates  ."/templates_c";     //设置编译目录
$tpl->cache_dir      = $doc_root."/cache";                                //设置缓存目录
$tpl->cache_lifetime = 60 * 60 * 24;                                         //设置缓存时间
$tpl->cache_lifetime = 0;                                                          //设置缓存时间
$tpl->caching        = false;                                                        //这里是调试时设为false,发布时请使用true
$tpl->left_delimiter = '<{';
$tpl->right_delimiter= '}>';

$tpl->assign("template_dir",  $INFO['site_url']."/templates/".$templates ); //摸板路径
$tpl->assign("Site_Url",      $INFO['site_url']); //主站URL
$tpl->assign("LanguageIs",    $INFO['IS']); //语言包类型
$tpl->assign("HtmlTitle", $INFO['site_title']);     //TITLE内容
$tpl->assign("HtmlMeta",  $INFO['meta_keyword']);  //META内容
?>

php识别图像类型为image/pjpeg格式,pjpeg是什么?

调试一套php系统,突然发现数据库里记录的jpg格式的图片附件,类型字段显示为附件image/pjpeg,很惊异,之前从来没有见过,还以为 是程序哪里出错了,在源程序里查找image/pjpeg,结果没有这样的字符串,于是google一下,相关的资料不是非常多,就网上查到的信息整理如 下:

image/pjpeg究竟是什么,与image/jpeg有什么区别?

image/pjpeg对应.jfif文件,image/jpeg对应.jpg、.jpe、.jpeg文件。
JFIF文件格式(JPEG文件交换格式,   JPEG   File   Interchonge   Format,是 progressive JPEG 的缩写)。JFIF文件格式只是将一种图像格或环绕JPEG压缩的一种简单方法,它们没有其他的更多功能。
JPEG文件格式(Joint   Photographic   Experts   Group(联合图像专家组))是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。 尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。

英文原文:What is progressive JPEG?

一个错误的说法:

有人说IE下上传jpg 会被服务器端程序识别为image/pjpeg格式,但firefox则显示为正常的jpg,

“原因是ie会把 jpg、jpeg翻译成image/pjpeg,png翻译成image/x-png 。而火狐则很标准:jpg、jpeg翻译成image/jpeg,png翻译成image/png”

其实这种说法不对 的,虽然IE很烂,但这里却不是它的错,这些图片严格的讲确实是image/pjpeg格式的,firefox没有这样识别而已。

PHP与image/pjpeg

PHP GD库对image/pjpeg格式的图片支持不是非常完美,或者说是要求太严格,有时会出现这样的错误

Warning: imagecreatefromjpeg(): ‘/tmp/lalala’ is not a valid JPEG file in /path/upload.php on line 1

出现这个Warning是由于GD函数库检测发现是非标准JPEG图片格式导致。

解决方法,如果PHP版本 > 5.1.3,可以在php.ini中增加:
gd.jpeg_ignore_warning = 1

在 MIME 类型中,图像方面有这样两种: image/jpeg 与 image/pjpeg ,GD库只认识前者的传统格式,后者是 progressive JPEG 的缩写。

php官方BUG讨论区http://bugs.php.net/bug.php?id=29878

[2004-08-28 19:00 UTC] cyleriggs at kc dot rr dot com

Description: ------------ When calling ImageCreateFromJPEG() on a valid jpeg file it fails and i get errors such as the following in my php error log: <code> [28-Aug-2004 05:21:29] PHP Warning: imagecreatefromjpeg() [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: '/usr/local/apache2/htdocs/pictures/Before Dad Went to Iraq/IMGP0008.JPG' is not a valid JPEG file in /home/www/pictures/index.php on line 43 </code> however as can be seen through this link the file is a valid jpeg file: http://cyle.dyndns.org/pictures/Before Dad Went to Iraq/IMGP0008.JPG Also i have a memory_limit of 25mb so this cannot be the issue. Something that might help: http://cyle.dyndns.org/phpinfo.php I am writing this code for a picture gallery browser, while most pictures load, about 10% of my pictures cannot be opened through ImageCreateFromJpeg(), however it is always the same pictures that cannot be opened. The only trend i can see is that this does not appear to be happening on small jpegs. The page that I am having problems with is http://cyle.dyndns.org/pictures/index.php. The source code for this is at http://cyle.dyndns.org/pictures/index.phps. Expected result: ---------------- The image would be loaded and code continue to execute and i get the error message described above. Actual result: -------------- Sometimes images load sometimes images cannot be opened.

[2004-08-29 08:22 UTC] pajoye@php.net

Sorry, but your problem does not imply a bug in PHP itself.  For a
list of more appropriate places to ask for help using PHP, please
visit http://www.php.net/support.php as this bug system is not the
appropriate forum for asking support questions. 

Thank you for your interest in PHP.

Your jpeg file is not valid. PHP could not take care of each possible failures in image files. Desktop softwares could. Fix your image and replace it.

--Pierre

[2004-09-30 17:05 UTC] paul at gslip dot com

I disagree. I have used my code successfully on montypics.com until the upgrade to php 5.0.1. I now get exactly the same results as the original poster.
Images that worked fine on previous versions now do not. I have a sample image that can be provided. I also have code I can share with the PHP team although I cannot post it here as it is lengthy and copyrighted.

[2004-10-05 00:34 UTC] cyleriggs at kc dot rr dot com

After playing around with the images themselves i have found that converting them from jpeg to png then back to jpeg fixed the problem and yielded no quality loss. I used the linux tool set called ImageMagick to do this. I wrote a short perl script to go through all my images and fix them. Other than this i have found no other way of stopping this. one interesting fact though is that while converting the images with the imagemagick utility it complained about some corruptions, however it was still able to open them fine and convert them. Maybe PHP is being too picky about the images that it opens as despite a few corrupted bytes EVERYthing was able to open these images except for PHP.

[2004-10-05 05:33 UTC] derick@php.net

PHP only reads non-coprrupted files - there is no bug here.

[2004-10-06 23:18 UTC] cyleriggs at kc dot rr dot com

Okay, so how about a feature suggestion than, i think that there should be the option in GD that allows you to try and open images that have a few corrupted bytes. If other programs can open them just fine what would be the harm in allowing programmers to choose to live with the corruptions?

[2004-10-07 05:12 UTC] derick@php.net

Corrupted files are invalid, and may crash an application if attempted to use. That's why we will not implement that. (Actually, it's not a PHP issue either, it has to do with how libgd handles opening files).

[2004-10-12 13:23 UTC] paul at gslip dot com

Has anyone at php verified that the images are corrupt? In what way are they corrupt?
Here's what I know:
1- These images were supported with no issues whatsoever before I 'upgraded' to php 5.x

2- Every other piece of software I own, including Windows Image Viewer, Photoshop, Paint, IE, Netscape, Imagemagick, etc. open the files with no complaint.

3- A visual inspection of the files on the byte level show nothing out of the ordinary.

That all leads me to believe that the images are not corrupt and that PHP or GD has a bug.

Please, stop being so stubborn and at least look at the problem. I can show you hundreds of examples of where this is happening on the web. Just do a google search for 'is not a valid JPEG file in' to see for yourselves how many sites are having this issue.

I suspect there's some new twist on the JPEG format that new digital cameras are using ,or something along those lines, that GD and PHP just aren't yet up to speed with.

Let's get this solved folks.

[2006-02-05 15:09 UTC] pajoye@php.net

This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.

Thank you for the report, and for helping us make PHP better.

You can now allow the jpeg decoder to be more tolerant/weak:

error_reporting(E_ALL);
// 0 is the current behavior
ini_set('gd.jpeg_ignore_warning', 1);
$im = imagecreatefromjpeg($file);

Php 5.1.3+ will contain the fix.

UNIX发展史(BSD,GNU,linux)

先前的一個理想

UNIX 系统自 1969 年 Ken ThompsonKen Thompson 与 Dennis RitchieDennis Ritchie 在美国贝尔电话实验室(Bell Telephone Laboratories)发展出雏形至今,已历经近 30 来年。而 "UNIX" 这个字典上查不到其原意的怪字,其实是戏谑 MULTICS(MULTiplexed Information and Computing System)操作系统的大而无当所产生的 谐音字。

在 1957 年 10 月,前苏联发射了第一枚人造卫星,此举让当时的美国总统艾森 豪威尔决定投下巨额的经费用以支持及发展科学,美国高等研究计划署(ARPA, Advanced Research Projects Agency)便是在这个时空下设立了,该单位负 责推动系统发展等相关计划,成为当时美国电子计算器发展的重要推手。

1960 年代是大型计算机的发展年代,当时的麻省理工学院因最先实现了兼容分 时系统(CTSS, Compatible Time-Sharing System),在电子计算器领域享有 相当崇高的地位。1963 年,麻省理工的里克莱德(J. C. R. Licklider, 1915~1990)推动了 MAC 计划,MAC 以 IBM 的大型计算机做为主体,连接了 将近 160 台终端机,这些终端机就四散在学区以及教职员的家中,可以让 30 位 使用者同时共享计算机资源。这项计划到了 1965 年便不堪负荷,于是麻省理工 便决定开发更大型的分时计算机系统。新的计划便是 -- MULTICS。一个计算机 史上最为庞大的分时计算机系统,企图连接 1000 部终端机,支持 300 位使用 者同时上线的分时计算机系统。她面临的是,操作系统的分时观念还在各学术与 研究机构探索成形中,计算机硬件亦需重新设计的双重挑战。

当时,麻省理工原本找 IBM 来配合这项计划,但 IBM 正忙着应付自己的问题而 无意配合 MULTICS 计划。此时,通用电子公司(General Electric Company)也就是奇异公司正好在发展自己的大型主机,见机不可失,便极力邀 请麻省理工参予她们的 GE 645 大型主机的规格制定。有了奇异热心主动的计算 机硬件配合,麻省理工找上的不能贩售计算机却人才济济的贝尔电话实验室来负 责承包软件工程。于是乎,MULTICS 的计划便在 1965 年由麻省理工学院、奇 异公司及贝尔电话实验室这三个成员开始共同发展。

1969 年,MULTICS 计划在历经四年的奋战后,仍旧未达到原先规划设计的理 想,贝尔电话实验室决定退出计划。功能未达原始设计理想的 MULTICS 还是安 装在奇异公司的 GE 645 大型计算机上供麻省理工使用。奇异公司在该计划草草 结束后不到一年便完全淡出大型计算机市场。日后,MULTICS 计划被嘲解为 Many Unnecessarily Large Table In Core Simultaneously。

农 夫我个人认为, MULTICS 计划诞生在大型计算机将开始鼎沸的 1965 年,夭 折于大型计算机最为辉煌的 1969 年。她如果适时在 1960 年代末期成功的话, 绝对可以助长当时已经普遍被计算机权威人士视为理想的『计算机公用事业』, 至少可以让大型计算机的发展与资源集中的应用模式就不至于会在 1970 年代初 期就迅速萎缩。因为 MULTICS 计划如果成功,至少能让当时的大型计算机的应 用规模大上 10 倍左右。然而,MULTICS 计划失败了。她严重地打击了当时依赖 大型计算机主机的计算机公用事业业者在发展上的信心。更由于没有相似的计划 后继进行,使得集中式的大型计算机主机没有明显的 使用效能提升,而加速催化 计算器工业的转变,以寻找新的道路。另一方面,MULTICS 计划失败的经验亦让 当时参与该计划的软件工程师们得到相当宝贵的经验与正面的影响。

几年后,就在 AT&T,MULTICS 计划这个不同凡响的失败换来的一个不同凡响的 成功。一个戏谑她的名字诞生了 .... UNIX。

一个游戏的开始

1969 年贝尔实验室的计算器科学研究中心(Computing Science Research Center)成员退出 MULTICS 计划的同时,贝尔实验室本身其实也没有一套完善 便利的交谈式计算器服务环境。在其中不少工程师们也正为了改善程序设计环境 努力着, Ken Thompson、Dennis Ritchie 和其同事们在当时草拟一个新的档 案系统架构,这个档案系统也就是早期的 UNIX 操作系统的档案系统的前身。当 时的 Ken Thompson 忙着使用 Fortran 语言将原本在 Multics 系统中开发的 game 叫 "Space Travel"(太空旅游)转移到 GECOS System 上开发。当 时 GECOS System 大型计算机的 CPU Time 相当昂贵(一秒要 75 块美 金),同时控制 "spaceship"(宇宙飞船)的效果不甚理想,于是 Ken Thompson 不得不寻找替代的开发环境。Thompson 看上了一台很少被人使用 的 Digital Equipment Corporation PDP-7 迷你计算机,当时 PDP-7 使用的 是 Graphic-II 显示器,具有不错的图形处理能力。Brian kernighan于是 Ken Thompson 便与 Dennis Ritchie 连手将程序设计转移到 PDP-7 型计算机上。 Ken Thompson 在移转工作环境的同时为了得到较好的发展环境,便与 Dennis Ritchie 共同动手设计一套包含 File System、Process Subsystem 及一小组 Utility 的操作系统,当时这套系统仅能支持 2 个使用者使用。由于贝尔 实验室对于 MULTICS 计划失败的阴霾还未消散, Brian Kernighan 这位仁兄 开玩笑地戏称这套新的操作系统为 UNiplexed Information and Computing System,缩写为 UNICS,之后大家取谐音便叫她为 "UNIX",没想到这个开玩 笑的名字会被人叫到今天。

初期的自由发展

事实上该套 "UNIX" 系统在当时仅是私下的被使用,也并没有得到多大的重视, 一直到 1971 年的一个正式的计划,UNIX 才正式被搬上台面。

PDP-11/201970 年,当时贝尔实验室的专利部门(Patent department)缺 乏一套文书处理系统,为了设计开发的需要,于是买了一台 PDP-11 计算机。当 时 PDP-11 计算机的交机过程并不顺利,处理器先到,硬盘则多等了好几个月。 当 PDP-11 一切准备妥当后,他们便将 UNIX 移植到拥有 512K bytes 硬盘的 PDP-11/20 型计算机上,并在此系统之下开发了一套文书处理工具。而这套工具 便是后来 nroff / troff 的前身。那时的 UNIX 提供 16K bytes 给系统、8K bytes 给使用程序,档案最大的极限是 64K bytes。而此套含有文书处理工具的 系统,也正式获得贝尔实验室的专利部门采用,系统名称并被编为 "First Edition"。在 UNIX 移植成功后 Thompson 用 B 语言为它添加了 Fortran Compiler,但因为 B 语言属于一种解译语言(interpretive language),执 行成效并不是很好,于是 Ritchie 又将它 -- Compiler 发展成可产生机器码、允 许定义数据形态及结构, Ritchie 称它为 C 语言。1973 年并以 C 语言改写全部 UNIX 原始程序,UNIX 于是首度出现正式版本--V5 (第五版)。

此时的 UNIX 慢慢地在贝尔实验室内部蔓延开来,装机数也变成了 25 部之多。 由于当时的贝尔实验室实际上是掌控在美国电信电话公司(AT&T)及其子公司西 方电器公司的手上,实验室主要是负责研究改进西方电器公司制造的和美国电信 电话公司在贝尔系统中使用的电信设备。同时根据军方合同,从事与国防有关的 研究与改进的工作。而 AT&T 本身由于有反托拉斯法的限制并不能从事于任何有 关计算机方面的销售,所以 AT&T 的主管阶层们对于当时 UNIX 的发展并没有太 多的支持,因而当时贝尔实验室内部对于 UNIX 的发展并不是相当在意也无意于 将之推广。不过为了应付实验室内各部门日益增加的 UNIX 使用者与相关技术支 持需求,还是成立了 UNIX System Group(简称 USG)。但该组织也仅只是 提供技术上的支持,并未赋予继续发展的任务。所以当时的 UNIX 发展,全靠 AT&T 的工程师们的努力。这段期间 UNIX 的发展完全没有组织及系统性可言, 而玩家尽是一些工程师们,于是乎种下了 UNIX 日后较难以被一般人所接受的命 运。

走出贝尔实验室

1974 年 Thompson 与 Ritchie 共同在 Communications of the ACM 发表 了一篇 UNIX 论文 "UNIX Time-Sharing System" 得到相当大的回响。 1975 年 UNIX 发表第六版(V6)﹐其提供的强大功能更胜过当时昂贵大计算机的操作 系统,其最大特点是以高级语言写成,仅需要做少部份程序的修改便可移植到不 同的计算机平台上。 UNIX V6 版本并附有完整的程序原始码在 1976 年正式从 贝尔实验室内部传播到各大学及研究机构,UC Berkeley 也就是依据这个版本开 始研究并加以发展,并在 1977 年发表 1 BSD(1st Berkeley Software Distribution)版本的 UNIX OS,其后续的发展更为 UNIX OS 贡献良多且影响 深远,此点稍后再为你说明。同年 UNIX 因它提供良好程序发展环境、网络传输 服务与及时服务 (Real-Time Services),而广得各电话公司采用。Interactive System Corporation 更因 Value Added Reseller (VAR) 运用 UNIX 来强化 办公室自动化环境,成为第一家应用 UNIX 操作系统的公司。此年 UNIX 亦被修 改并第一次装到 Interdata 8/32 型计算机上。这也是 UNIX 操作系统首次安装 在非 PDP 型的计算机上。自此 UNIX 系统开始被移植改装到各型微处理机及新 计算机上

一个稳定的基石

1978 年 UNIX 发表对今日影响最重大的 UNIX 第七版(UNIX Time-Sharing System,Seventh Edition)也就是 V7。此版本包含 Fortran 77 compiler、Shell(只有Bourne Shell)、文件处理工具(nroff/troff、roff、 MS mocro等)、UNIX-to-UNIX-file-Copy(用来支持两台 UNIX 机器间的档 案传输)、数据处理工具(AWK、SED 等强悍的工具)、除错工具(ADB)、程 序发展工具(MAKE)、Lexical analyzer generator(LEX、YACC 等)、简 单的绘图工具、并支持 C 语言及 LINT verifier,主要执行于 PDP-11 及 Interdata 8/32 型计算机上。在当时那个年代来说其系统的架构与功能已经是 相当的完备的了。Bourne Shell 的原作者称她为 "improvement over all preceding and following Unices",在今日也有人称这个版本是 "last true Unix"。由此可见 V7 在 UNIX 发展里程上的扮演了相当重要的盘石角色。

在当时 DEC 公司推出了一款 32-bit supermini 主机 -- VAX,搭配的 VAX 的 操作系统叫做 VMS。这款迷你级计算机的硬件无可挑剔〈直到今日她的稳定度仍 是被诸多老一辈的系统管理者所赞许的〉,但 DEC 对 VMS 操作系统的支持性却 让贝尔实验室的工程师们宁愿使用 UNIX OS 。而这项工作则是由 John Reiser 和 Tom London 所共同完成。他们以 V7 为基础转移 UNIX OS 到 VAX 计算 机上使用。这个版本被称为 UNIX V32。同时为了转移的方便性,他们把 32-bit 的 VAX 当成是大一点的 PDP-11(因为 DEC 的 PDF-11 型计算机是 16-bit), 同时为了执行的效率,V32 放弃使用 VAX 硬件提供的一项 paging 功能(DEC 的 VMS OS 有支持 paging 功能,也由于 V32 舍弃这项功能,所以 V32 没有 虚拟内存的功能)。即使是如此,V32 支持的地址已高达 4Gb。就这样没有支持 paging 功能的 V32 开始被广泛的安装在 VAX 的机器上运作。

DEC 则是在 1984 年左右推出来自己的 UNIX OS,叫做 ULTRIX。

一个重要的延续及发展 -- BSD UNIX

时间回到 1973 年 11 月, Ken Thompson 和 Dennis Ritchie 在印第安纳 Purdue 大学的一场操作系统原理的座谈会。会场上、坐着一位柏克莱大学 (U.C. Berkeley)教授,名字叫 Bob Fabry。当天的 K&R 所发表的 UNIX 立 刻引发 Bob Fabry 的极度兴趣。当时的柏克莱还是处在使用大型计算机主机、批 次执行程序的阶段,并没有像 UNIX 这样的交谈式作业环境。会后,他便决定将 UNIX 带回柏克莱。

于是柏克莱的计算器科学、数学与统计三个系所合买的一台 PDP-11/45,准备用 来迎接 UNIX。1974 年 1 月,Bell Labs 寄来了一卷 V4 的磁带,学生 Keith Standiford 便开始进行安装 V4 的工作。安装时 Standiford 碰到了问题,便转 向 Bell Labs 求援。人在新泽西州的 Thompson 便透过柏克莱这端速度只有 300-baud 的调制解调器在在线进行侦错。

在 UNIX 的发展史上,这是 Bell Labs 与 柏克莱的第一次接触。

完成除错后,V4 便顺利地在柏克莱这台新买的 PDP-11/45 计算机上工作了。当 时这台是三个系所合买的,计算器科学好不容易装上了 UNIX,却碰到数学与统计 系所要使用 DEC's RSTS system,所以在一阵协调后,UNIX 与 DEC's RSTS system 以 8:16 小时的比例分配,供三个系所轮流使用。一段时日后,具交谈 式功能的 UNIX 在效能上的表现得到绝多数学生们喜爱,纷纷将自己的计划转向 UNIX 的时段。而一天占了 16 个小时的批处理时段却乏人问津。

当时 Eugene Wong 与 Michael Stonebraker 教授,看上了 UNIX 提供的便 利性,便打算将他们的 INGRES 数据库计划重原先批处理的计算机环境转移到 UNIX 系统上面。在 1974 年,他们为这执行计划添购了一台新的 PDP-11/40 计算机,上面安装了 V5。这个计划也就是柏克莱的第一个将作业环境转移到 UNIX 的案子。UNIX 作业环境的需求,在柏克莱迅速地成长。为了应付需求, Michael Stonebraker 与 Bob Fabry 教授决定再申请购买两台 PDP-11/45。 1975 年初,DEC 推出 PDP-11/70,价格差不多等于两台 PDP-11/45,但功 能强过 PDP-11/45,所以他们便决定改购买一台 PDP-11/70。

这台机器引来了 Ken Thompson、碰上 Bill Joy 以及日后产生了 1BSD。她 就宛如是一块 UNIX 史上的地标,沿袭自 Bell Labs,竖立在柏克莱,承先启后 并开创新局。农夫个人认为,她应该被供在博物馆。

当这台机器在 1975 年终运达柏克莱时;同一时间,Thompson 受邀回母校(柏 克莱)当客座教授,科目就是 UNIX。Thompson 在校期间与 Jeff Schriebman 和 Bob Kridle 一起动手将新版的 V6 安装在 PDP-11/70。

Bill Joy1975 年,一位密执安州大学的毕业生来到了柏克莱,他的名字就是 Bill Joy。当时 Joy 和同学 Chuck Haley (tar 就是他写的)喜欢一起泡在计算机房里 面,Thompson 也时常插上一脚。他们成功地改善了 Pascal 的解译与侦错的能 力,同时还提升了解译与执行的速度。另外换装上 ADM-3 的屏幕后,他们觉得 ed 文字编辑指令并不合用;于是根据另外一个相似的 em 指令,发展了自己的 觉得满意的文字编辑工具,也就是指令 ex。

1976 年夏天,Thompson 结束了他的休假回到 Bell Labs。此时的 Joy 和 Haley 已经开始着手探索 UNIX kernal,甚至还做了一些修改。1977 年初, Joy 制作了一卷磁带,上头写着 "Berkeley Software Distribution.",这就是 1BSD。其中包含新的 Pascal compiler 与 ex 编辑器。

次年,来了几台新屏幕 -- ADM-3a,这种屏幕支持光标地址显示,Joy 在这种屏 幕上完成了有人爱不释手;有人恨之入骨的文字编辑器 -- vi。接着不久,Joy 便 发现一个问题,老旧的屏幕装备,还是会被用在其它的计算机上。为了支持上的 方便,Joy 针对此现象设计了一个接口,用来管理、支持不同的屏幕装备。这个 接口就是现在的 termcap。1978 年中,包含了功能加强的 Pascal 与 vi 及 termcap 的 "Second Berkeley Software Distribution," 也就是 2BSD, 迅速的取代了原先版本。1979 年,至少有 75 部 PDP-11 的机器上安装 2BSD 在运作着。自此在 DEC PDP-11 系列上执行的 BSD 版本便一直以 2.xBSD 作 为识别。由于 PDP-11 计算机实在相当长寿,持续到今日农夫我仍然在网络上发 现过关于 PDP 计算机的网站。似乎到今日它们仍旧在某些地方默默地工作着。 2.xBSD 最近的一次改版是在 1987 年,使用 4.3 BSD 为主架构改写,版本定 为 2.10 BSD。

在 BSD UNIX 中登场的重要功能当中,有一个直到今日仍然叫人又爱又恨的 指令 – vi。我接触过不少学习 UNIX OS 的人,大部分的人对 vi 的使用与掌握都 不算顺手,其中恨死这个指令的也大有人在,前些日子农夫我还看到某个网站公 开讨论起 vi 是否阻碍了 UNIX 的发展?实在夸张了一点!

Bill Joy 多次公开地说,他要是知道 vi 会如此受"欢迎"的话,他宁愿当初没有 写 vi 这只程序。不过 Bill Joy 也说过,当时他原本还想加入一项 Multiple Windows in vi 的功能,不过当他在写这部分程序的时候,磁带机坏了,所以 Bill 只好在没有备份的情况下继续工作,想不到"屋漏偏逢连夜雨",程序写到一 半,他使用的硬盘也跟着挂了。在无可挽救又没有备份磁带的情况下,Bill 宣告放 弃为 vi 增加 Multiple Windows 这项功能。事后 Bill 为前一版的 vi 写好使用说 明后就继续作其它的事。所以 vi 就长成今天那付德性。农夫我认为这或许是福不 是祸!搞不好当初要是连 Multiple Windows 这项功能一起发表的话,上头的图 可能就是遗照了。

当时有位 Richard Fateman 教授,原先使用一台 PDP-10 上进行着他的 Macsyma 研究计划。但他需要更大的内存地址来执行程序,所以在 1978 年 初,他看上了当时迪吉多新发表的 VAX-11/780。好不容易,他联合了其它的部 门才凑足购买 VAX 的经费。刚开始时,机器原本安装的是 VMS 操作系统。不过 别的成员要执行 UNIX 操作系统,于是 Fateman 安装上了 V32。但问题来了, V32 并不支持虚拟内存,Fateman 便找上了 Domenico Ferrari 教授,希望他 与他的研究小组能为 UNIX 加上这项功能。当时一位学生叫 Ozalp Babaoglu ,他想到了一些解决的方法似乎可行,但因为牵涉到 VAX 硬件与 UNIX kernal 的问题,于是他找上了 Joy 帮忙。就在只有一台 VAX 的状况下,他们努力奋战 着。1979 年 1 月,在 VAX 上支持虚拟内存的 UNIX 版本终于诞生,V32 从此 走入历史。紧接着 Peter Kessler 与 Marshall Kirk McKusick 为他加上了 Pascal;Joy 则动手将 2BSD 上的 ex、vi、C shell 等工具转移了过来。这个 版本就是 3BSD。一个首次支持虚拟内存、demand paging 和 page replacement 的 UNIX OS。

UNIX 与 DARPA 交会

1970 年代末,美国国防部先进研究计划机构(Defense Advanced Research Projects Agency -- 简称 DARPA)正在为 AI(Artificial Intelligence), VLSI 及计算器视觉等研究(vision research)找寻一个可共通作业的计算机环境。硬件 方面的首选是迪吉多的 VAX 主机。配合的操作系统是 VMS。这样的组合因拥有 相当接近 DARPA 需求的功能被列入优先的考量,但在 DARPA 与 DEC 商谈对 于 VMS 的支持事宜之后,DARPA 并没有得到满意的答案。这迫使他们考虑朝向 UNIX 发展。但当时 UNIX OS(指的就是32V) 搭配 VAX,最大的缺憾就是没有 支持虚拟内存;但此时已经有人克服了。

当时,Bob Fabry 教授写了一份建议书给 DARPA,建议他们以柏克莱支持虚拟 内存的 3BSD 为基础,发展成为计划所需。这份企划书引起了 DARPA 的高度兴 趣。随后 3BSD 也实际获得了 DARPA 相关计划成员们的良好风评,也因此最后 柏克莱大学打败了卡奈基梅隆大学与 BBN(Bolt Baranek & Newman, Inc.), 让 Bob Fabry 成功地获得了 DARPA 的资助合约。这份合约开始于 1980 年 4 月,为期 18 月。此后的 DARPA 便以 UNIX OS 为标准操作系统。Bob Fabry 教授在取得 DARPA 合约后,依约成立了一个支持机构,也就是 Computer Systems Research Group 简称 CSRG。Bob Fabry 找上了 Bill Joy 来负责 软件开发。Joy 迅速地以先前的 3BSD 为基础,整合新的功能。如 Job Contro l(作者是 Jim Kulp)、auto reboot、1K block file system。同时也整合入 Pascal compiler、Franz Lisp system、enhanced mail handling system。这就是在 1980 年所发表的 4BSD。没多久她便被安装在将近 500 台 VAX 上。

DARPA 采用了这个版本作为当时 DARPA 的标准 UNIX 操作系统。

树大招风,当时,有位在 Stanford Research Institute 的仁兄叫 David Kashtan,写了一份关于 VMS 与 BSD UNIX 在 VAX 上的执行效率评估。该份 报告指出 BSD UNIX 在效率上不如 VMS 来的好。Joy 知道这件事之后,花了不 到一个星期的时间,重新调整 UNIX kernal。然后也写了一份报告,证明他们的 BSD 在 VAX 上要比 VMS 优越多多。1981 年 6 月,这个 Joy 调整过的系统, 加上了 Robert Elz 写的 auto configuration,以 4.1BSD 的版本发表了。

当时的 DARPA 对柏克莱 4.1BSD 的表现相当满意,于是续签了两年的新约,金 额更是先前合约的 5 倍。其中有一半的金额用在资助柏克莱继续发展 BSD UNIX 。钱多的相对代价就是要求高。当时,DARPA 对 UNIX 的期望开出了明确的目 标;更迅速、更有效率的档案系统、支持程序可执行地址达 multi-gigabyte、提 供弹性的解译沟通能力、具整合支持网络能力。在此同时,为了达到计划的目 标,DARPA 成立的一个指导委员会;主要的成员有柏克莱的 Bob Fabry, Bill Joy, Sam Leffler、BBN 公司的 Alan Nemeth and Rob Gurwitz、贝尔实验 室的 Dennis Ritchie、史丹佛大学的 Keith Lantz、卡内基.梅伦大学 Rick Rashid、麻省理工学院 Bert Halstead、信息科学协会 Dan Lynch、DARPA 的 Duane Adams and Bob Baker 以及加州.洛杉矶大学的 Jerry Popek。

不久,Joy 便开始整合早先 BBN 的 Rob Gurwitz 所发表的 TCP/IP protocols,不过他对 BBN 这些程序的执行效率并不满意,于是 Joy 与 Sam Leffler 重新写的一版自己的程序。另外,并加入了一些支持网络的工具 rcp, rsh, rlogin, rwho。他们称她为 4.1aBSD,这个版本并没有正式发表,在 1982年 4 月开始供内部使用。虽是如此,在 4.2BSD 未正式发表之前,她还是 繁殖的到处都是。6 月,4.1aBSD kernal 加上了新完成的档案系统,版本更新 为 4.1bBSD。

rcp, rsh, rlogin, rwho 这群指令。因安全机制上的理由,逐渐被另一群新的 指令群所取代,新的指令群叫 SSH (Secure Shell)。SHH 相关网址(http: //www.ssh.org)。

1982 年的春季末,已厌倦了在柏克莱环境的 Bill Joy ,答应受邀加入当年刚创 办的 Sun Microsystems, Inc.,成为 SUN 的第四号创办人。那年的整个夏季 他就在两地奔走。之后他对修改中的弹性解译沟通机制及改写 UNIX kernal 到一 个段落之后,由 Leffler 接手了他的工作。由于合约期限的因素,Leffler 在 1983 年 4 月发表了 4.1cBSD ,提供给参予 DARPA 各项相关计划的成员试 用。6月,DARPA 的指导委员会第二次会议招开,验收与检讨最新版的 BSD 成 果。继续整合 UNIX 系统的 Leffler,在 1983 年 8 月,发表了 4.2BSD。她达 到了 DARPA 的预定的需求;足以应付 CAD/CAM 影像处理与 AI 研究的高速的 档案系统及扩展强化的虚拟内存功能;提供能分散处理的解译沟通机制;支持 56-Kbit 的 ARPA Internet 网络连结,以及 10-Mbit/s Ethernet 的局域网 络;还有经过重组架构已模块化的 kernal code ,提供更有效率的计算机平台移 植。

SUN 以生产 RISC 架构的工作站计算机为主,使用的正是以 BSD 为基础所的 UNIX OS。在当时以不逊色于大型计算机的多人多任务、具网络沟通功能的 UNIX OS、加上价格低廉的硬件(相对于 mini 级计算机而言),广获得工程界 的青睐,而 mini 级大计算机的命运自此注定开始逐渐式微。计算机软件的应用因 为有了网络于是也开始朝向 Client-Server 的架构发展。

1982 年,SUN 有了自己的操作系统 -- SunOS 1.0 -- 承袭自 4.1BSD。一 直到 1990 年 11 月,发表 SunOS 4.1.1 版同时冠上 Solaris 1.0 时,SUN 才算开始向 System V 版本靠拢。SunOS 4.1.1 可算是以 BSD 为主体再附加 上 System V 工具的 UNIX 混血儿。但这其实是个商业考量的过渡性做法(后文 会加以说明)。而 SunOS 4.1.x 版的字眼也仅延续到 1994 年的 SunOS 4.1.4 为止,她后继的版本是 Solaris 1.3。真正延续到今日的 Solaris 版本,则是始 于 1992 年 7 月的 Solaris 2.0(SUN OS 5.0)。

在商业有所成就的 SUN Microsystems 对 UNIX OS 的发展倒也做了些重大 贡献;如 1984 年发表的 NFS(Network File System)与其后在 1986 年发表的 PC-NFS。

商业化的不平坦历程 -- UNIX 版本的战争

UNIX 商业化实质上即意味着将产生各种独立化的 UNIX 版本,这点大概是最显 而易见的事实。如果以商品要具备独特性与独占性的利益来做考量的话,其实一 点也不意外。因此 UNIX 开始衍生的相当多的版本。这种现象,对使用者以开发 应用程序的厂商而言,已经造成了某成程度上困惑。然而,一种无所适从的无力 感其实才刚开始。

1984 年 1 月 1 日, AT&T 这个拥有 1495 亿美元资产、1,009,000 位员工的 庞大巨兽,终于被格林法官 (Harold H. Greene) 以反扥拉斯法 (antitrust) 强 制拆解成七家 RBOCs (Regional Bell Operating Companies) 。 AT&T 也 因而在一夕间解体成为区域性网络公司,从此失去了长途电话的垄断性地位。这 种时空的转变让 AT&T 对 UNIX 的态度有了 180 度的转变(其实,农夫我指的是 收费的态度)。

先前已经提过 70 年代初期的 AT&T,已经在长途电话市场上占有绝对垄断的优 势,因而被美国政府的限制不得涉足与从事计算机与其它行业,也正因而造就了 UNIX 发展初期的自由开放。直到 1979 年,AT&T 才宣布要将 UNIX 商业化的 计划。1981 年 11 月,AT&T 属下的 USG 发表了 System III。次年又更新为 System IV。稍后于 1983 年,AT&T 将 CRG, USG 合并成立了 UNIX System Development Lab. 一般简称为 USL,从其名称就不难清楚她将要扮 演的角色。该年 System V 上市了。此时 AT&T 发觉每次版本更新都得花不少宣 传费,实在不划算,所以决定在 System V 以后,名字就不再做变动了。1984 年,System V Release 2 发表,简称为 SVR2。在这个版本中,才终于看到 来自 BSD 版本的 Virtual memory 功能,农夫我不得不惊叹 AT&T 的稳健作 风。SVR3 则是到了 1986 年才发表,随后 1987 年又发表了 SVR3.2。

1987 年,在工作站市场上已占有一席之地的 SUN,找上了 AT&T,打算将 System V 与 BSD 这两大版本归为一统。1988 年初,双方更签订了合作合约, AT&T 取得 SUN 的一席董事,同时亦有权买下 SUN 百分之二十的股份。这项合 作计划,原本有机会整合当时版本纷乱的 UNIX OS。但那是理想。实际上这个计 划反而让 UNIX 族群里的其它成员恐慌万分,特别是 IBM、DEC、HP 这几个产 业龙头。为了抵制这项行动,他们组织了一个反对联盟。因此「开放软件基金 会」也就是 Open Software Foundation 简称 OSF 在 1988 年正式诞生;成 员除了前面的三巨头外,尚有多达三十几家计算机硬件制造厂商与系统咨询顾问 公司,也相继以行动投入到此反对的行列中。然而 AT&T 与 SUN 也不示弱地组 织了 UNIX International,也就是 UNIX 国际公司,成员数量虽然不比 OSF 阵营来的多,但如果她是 Intel、Toshiba、Unisys、Motorola、Fujitsu,这 几个大块头,那也是很够看头的。

企业自身的利益在现实世界里始终是以个体的考量为优先,所以这两大阵营始终 没能再达成任何共识,就连当时所制定的 UNIX 统一标准规格,严格来说也从不 曾被实现过。这种企业利益上的冲突与矛盾其实也存在于同一个阵营中不同的成 员之间。两大阵营对峙,可以说是 UNIX 有史以来最重大的产业冲突事件。由于 商业利益的政治考量大过技术问题的考量,也因此奠定了 UNIX 将继续分裂下去 的命运。 AT&T 在 1989 年发表了 SVR4,SUN 在日后也将她的 SunOS 4.1. 1 开始冠上 Solaris 的字眼,以行动靠拢 SVR4。OSF 则是在 1990 年发表了 OSF/1。UNIX 版本的问题因而更加混乱了。但有趣且可笑的是,开放系统 -- Open System,这个双方都标榜的理念与观念却因此在计算机产业界引起了回 响,这点倒是原先所始料未及的。

不久 AT&T 撤销了对 SUN 的投资,同一个阵营的成员彼此也因而劳燕分飞。 USL 在 1991 年正式转变了一家独立的商业公司。但 UNIX 在商业市场上的价值 却出现了变化...

让 UNIX 自由 -- Networking Release 2

自从 UNIX 走出贝尔实验室后,研究机构与学术界就扮演了继承与发展的双重角 色。在 1979 到 1984 年这段期间,UNIX 的拥有者 AT&T,对于学术界的授权 政策尚可用『大方』来形容;同时也对学术界做某种程度的资助与合作。当时的 学术界,得助于 AT&T 的大方授权与分享程序原始码,研习 UNIX 这个分时操作 系统开始在学术界蔚为一股风气,甚至可以说是一种潮流或一种流行。其中,像 柏克莱 BSD 对 UNIX 的贡献,就是一个公开的事实。但早期的 BSD 使用者,是 必需向 AT&T 支付授权金的。这点,从产业界资助学术界的角度来看是一点也不 值得惊讶的。因为资金的援助为了就是取得其成果。所以当时基于 AT&T 原始码 所发展的成果,均归属 AT&T 所有。也因而 AT&T 掌控了 UNIX 的所有权。到了 1984 年以后,AT&T 开始更积极地保护 UNIX 的原始码;AT&T 甚至还要求各 大学的使用人员签订保密条约,想藉此防堵 UNIX 的原始码从学术单位流出,以 影响到商业利益。

在 DARPA 资助柏克莱从事 BSD OS 发展的过程中,诞生了 TCP/IP 这项广泛影 响现今计算机与因特网的通讯协议。由于 DARPA 对于资助开发的软件项目有明 文规定接受资助者必须无条件地释出程序的原始码,所以 TCP/IP 的原始码与程 序的版权并不属于 AT&T 所有。这点在现今看来其意义是不凡的。也正因为有此 一条件,柏克莱的 CSRG(Computer System Research Group)因应 BSD Vendors 需求,在 1989 年 6 月发表了 Networking Release 1,她包含了 TCP/IP source code 以及一些工具,提供给当时正开始起步发展的个人计算机 制造业者使用。Networking Release 1 授权收费仅 1000 美元,而且不需要 T&T 的商业授权,取而代之的是柏克莱大学的开放式授权。

农夫我看柏克莱授权方式,几乎可以说是一种良心式授权方式,在实质的运用上 她完全没有限制。她允许原始码或执行档在任何情况下修改并且允许将修改后的 程序从事商业行为而无须任何回馈,当然也没有绝对要求开发者必须要释出原始 码。如果你改都不改地加以贩售,她也没有意见。但有一点不可违反的限制,就 是必须在衍生物的版权声明上提到柏克莱的贡献。这种做法在日后,也没有多少 改变,而这样的授权方式也成为了柏克莱的授权精神。

Keith Bostic由于 Networking Release 1 所得到的响应实在远超过 CSRG 成 员的预估。这个不算差的成果,让柏克莱的 CSRG 觉得有必要释出更多属于 BSD 的程序原始码。于是激发 CSRG 的成员 Keith Bostic 开始组织志愿工作者从事 一项就算不能够惊天也足以动地的程序写作计划。计划的主要目的在当时还真让 人感到有点"乌扥邦"。农夫我个人喜欢戏称她为『解放 UNIX 计划』。

Marshall Kirk McKusick这项计划大体上分成两个部分,操作系统工具(Utility) 与核心(kernal)。而且参与人员必须在完全没有参考 AT&T UNIX source code 的情况下进行撰写程序的工作。因为只有在这种条件下,写出来的程序代码,才 能摆脱 AT&T 的著作权束缚。当然这也绝对不是一件容易的事。Keith Bostic 四 处奔走,组织了超过四百名热心的软件工程师,经过了长达十八个月的奋战之 后,操作系统主要的工具与链接库才算改写完成。Marshall Kirk McKusick 负责 改写当时的核心程序。但系统核心的部分,由于长期以来柏克莱与 AT&T 一直就 彼此分享 UNIX 原始码,所以各自所加上去的程序代码早已混杂难分了。为了彻 底的厘清双方各自撰写的部分,他们下决心进行逐行比对。首先花了好几个月的 时间,将核心程序每一行每一个档案都建立转换比对的数据库。然后接着进行移 除来自 AT&T 32V 的程序代码并改写她们。即使是如此,仍旧有 6 只程序让他们 束手无策,因而无法将核心程序彻底完整地改写。最后,他们还是决定将他们所 做的所有成果发表。授权的方式沿用 Networking Release 1 的授权方式,授 权的磁带依旧是 1000 美金。这个版本就是 Networking Release 2,也有人 称她为 4.3BSD NET/2。发表的时间在 1991 年 6 月。虽然这是个不完整的操 作系统。但,在今日看来,却有着划时代的意义 -- UNIX OS 自由了。

谁是"老大哥" -- 侵权诉讼

AT&T 的 USL 在 1991 年正式转变了一家公司。当然,这意味着她将更重视 UNIX 在商业上的利益。当时的 UNIX OS 早以称霸高阶的计算机市场;从 Cray 超级计算机、IBM 的大型计算机主机、迷你级计算机到工作站,均是 UNIX 的天 下(这一点,直到现在21世纪,仍旧没有多大的改变)。即使在 80 年代中期后开 始迅速发展的个人计算机,虽然当时被戏称为是玩具计算机,但也仍旧有像 XENIX[注1], Interactive UNIX[注2] 等几种向 AT&T 缴过税的商业化版本。 UNIX 简直就是 AT&T 的一棵摇钱树。

但这一切在 Networking Release 2(以后简写为 Net/2)出现之后,起了变化!

首先,一位 i386 处理器的玩家名叫 Bill Jolitz,在拿到 Net/2 之后,很快地就 将 Net/2 kernal 缺少的程序补齐了。BSD kernal 这时可算是大功告成了。当 时 Bill Jolitz 将他们放在因特网与其它人共享他的原始码,并且得到了不少正面 的响应。由于这个版本是使用在 i386 微处理器的个人计算机上,所以就命名为 386BSD,在 1992 年 2 月正式发表。这该算是 BSD 首度功能完整且版权独立 的版本。Bill Jolitz 是当时唯一的 kernal 维护者。在他离开这个计划之后,继起 的 BSD 玩家们延续了这个版本,日后衍生了 FreeBSD,然后又从其中分支出裂 NetBSD 版本。

另一个将 Net/2 完整化的是一家叫 Berkeley Software Design, Incorporated 的公司,简称 BSDI[注3]。由于 Net/2 的版权声明中,宣称其 源文件的合法性,并且允许使用者,从事衍生物的商业行为,所以 BSDI 将他们 修改后的系统命名为 BSD/386。他们并将成果打包,刊登广告以 995 美金的售 价贩售 BSD/386,而且含原始码,而且还提供免费服务电话的咨询,电号号码是 "1-800-ITS-Unix"。时间大约是在 1992 年 1 月。当时,USL 的 System V 含 source code 的价格大约是 BSD/386 价格的一百倍左右。这可惊动了老大 哥 AT&T。并且正式地书面严重警告 BSDI 违反的注册商标法(电话号码里有 Unix 的字眼),并公开宣称 AT&T 拥有 UNIX 的注册商标。BSDI 再次刊登广告 公开反击 AT&T,声明她的商业行为完全合法。果不期然, BSDI 的博命演出让 双方手牵手走上法庭。

AT&T 的 USL 控告 BSDI 剽窃他的 UNIX 原始码,要求法官还他公道。在听证 会上,BSDI 祭出早已准备好的法宝;自己在无任何 AT&T source code 的条件 下写出的合法档案,以及来自于 BSD 授权的 Net/2 source code。前面的证据 足以让 BSDI 立于不败之地,后者让 BSDI 置身在暴风圈外。BSDI 的辨证获得 了法官的采信。但 At&T 岂会就此罢手,他们将焦点转移到 Net/2 的 BSD 授权 上面,并且重新提出控诉,被告的对象变成了 BSDI 与柏克莱大学;同时 AT&T 还申请法庭禁止 BSDI 一切的 BSD/386 销售行为。就这样,柏克莱大学也对号 入座了。

农夫我认为,毕竟 AT&T 是营利企业,她得维护她的商业利益,这点是天经地 义的事。虽然柏克莱大学与 AT&T 在 UNIX 发展上有着非比寻常的关系,但商业 利益是现实的。企业资助学术界的研究计划,多半是基于商业上的考量;我相 信,学术界的少数高层在寻求奥援时不会不明白这一点,即使这有可能让大部分 的学术人士无法接受或不愿接受。不管如何,这一记醒棍倒再次挑起了这一点事 实。

成为被告的柏克莱大学,只好无奈地面对这场无情的商业诉讼。但他们也同样不 甘示弱地对 AT&T 的 Systerm V 著作权提出质疑,因为在 AT&T 的 UNIX 授权 声明中完全没有提及柏克莱的贡献。所以柏克莱反控 AT&T 违反 BSD 的授权条 款。柏克莱的反击让战况越演越烈,诉讼案一路从 AT&T 的老家新泽西州的联邦 法庭打到柏克莱大学的所在地加州法院,但依旧没有结果。

到了 1993 年,官司还在进行中,但 AT&T 却已经打包 USL 准备以一亿美元的 价格找寻买主了。最后 AT&T 将 USL 以八千万美元代价的卖给了 Novell。而新 买主也当仁不让地加入了这场混战。但却也因此,战况露出了一线平息的曙光。 诉讼案在 1994 年 1 月宣告终结,以庭外和解收场。实际的协议内容仅有当事人 知情。

如果从胜负的角度来看这场诉讼,或许柏克莱与 BSDI 是胜利的一方。但如果从 UNIX 发展的脚步来看这场诉讼,就可能根本没有任何一方是胜利者了。

事件平息后的 1994 年 6 月,柏克莱的 CSRG 风光地发表了 BSD 4.4 Lite。在 这个版本中,有 70 个档案引用的一份新修改的版权声明,阐述的 AT&T 与 BSD 双方的贡献,并明确地给予档案自由散播的权利。但不知为何,应该有能力完整 发表的 BSD 4.4 Lite 还是缺少了三的档案。当时,农夫我也很高兴地买了一本 BSD4.4-Lite CD-ROM Companion,含一张光盘,现在拿在手上,看来总觉得 有点呆。

掌握 UNIX source code 以及 UNIX 商标的 Novell,将 UNIX 商标交给 X/open 管理,自己则发展了一套命名为 UNIXWave 的操作系统。推出后市场 的反应并不热络。不久,Novell 与 SCO 接头,在 SCO 保证继续支持 UNIXWare 的条件下,UNIX 在 1995 年二次易主,新主人是 SCO[注4]。

备注: *1 Intel 在 1978 年发表 4.77 MHz 的 8086 微处理器。1980 年, Microsfot 便以 V7 为基础,发表了在微处理器(microprocessor-based computers)上执行的版本也就是 XENIX。到了 1982年,一家成立于 1979 年 的软件公司 Santa Cruz Operation,成为微软的合作开发厂商。之后她这家公 司便一直致力于这个领域里延续到今日,缩写就是今日的 SCO。

*2 Interactive IS/1 (以 V6 为主体)。这个版本后来演化为比较让人熟知的名 字 -- Interactive UNIX。后来因为 Sun Microsystems 致力发展 Solaris for X86,被财力雄厚的 Sun Microsystems 合并了,如今已经不见踪迹了。

*3 就在我反复修改这段文稿的时候,BSDI 这家公司已经被 Wind River 合并 了,改名为 iXsystems。2001/05/03

*4 2001 年 5 月 4 日,Caldera International, Inc. 正式并购了 SCO 的服 务器软件部及SCO专业服务部这两个部门,新的控股公司名为 Caldera, Inc

GNU 计划 -- 开启了新大道

在 1983 年 9 月 27 日,麻省理工学院人工智能实验室(MIT Artificial Intelligence Lab)的 Richard M. Stallman (以下简称为 RMS),在 net.unix-wizards 以及 net.usoft 的 newsgroups 贴上了一份标题为 "new UNIX implementation" 的讯息。这就是如今广为人知的 GNU 计划的开始 。在那则被视为「GNU 宣言」草稿的讯息中,RMS 阐述个人的理念与计划的目 的 -- 完成一个命名为 GNU 的 "Free UNIX" 操作系统,希望藉此寻唤理念想同 者共襄盛举。

『如果我喜欢一个程序的话,那我就应该分享给其它喜欢这个程序的人』,这是 RMS 的座右铭。此点也似乎正是促使其决心运作 GNU 计划的原动力。当时的 RMS 是想写出一套免费的操作系统。能够让每个人如空气般地自由的取得与使 用。选择“UNIX 兼容”为设计的主要原因是;RMS 表明,UNIX 并非他个人理想 中的操作系统;他仅阅读一些相关数据,但未曾使用过 (MIT 使用操作系统是 "ITS--Incompatible Timesharing System");但他认为 UNIX 操作系统具有 优良的本质特性。他相信如果 GUN 与 UNIX 兼容将更容易令人接受。所以 RMS 承袭 MIT 用递归缩写字命名的传统为 GNU 释译界定 Gnu is Not Unix。

1984 年 1 月,RMS 为了展开他的理想而决心离开已经待了十几年的 MIT AI Lab.。当他向他老板 Patrick Winston 辞职时,Winston 试图挽留地说:「你 还是要辞职?」。RMS 不为所动的回答:「是」。Winston 显然得到预料中的 答案,于是接着说出了思绪里关怀:「你想要保留你的钥匙吗?」。于是 RMS 就 从此开始专心地"失业"在他的老东家。一个人窝在他原来的旧办公室中,规划着 如何开始他的 GNU 计划。但想开发一套新的 UNIX 兼容的操作系统,即使是财 力、人力资源雄厚的顶级计算机公司,也绝对不是一件说想做就能够做到的事。 当拟妥他的「GNU 宣言」之后,他正式向全世界呼唤、表明其将所为。种子落地 了。

GNU 计划的第一只程序要算是孤军奋战的 RMS 在 1984 年 9 月开始撰写的 Emacs 编辑器。1985 年初,Emacs 已进入可用的阶段。于是 RMS 将她放在 pre.ai.mit.edu 这台机器的 FTP server 上,免费地让 amonymous 的到访者 自由下载使用。不久后,Emacs 强捍的功能引发了一些玩家们的注意,由于附上 了 source code,玩家们能自己动手为它添加新的功能或除错,很快地, Emacs 获得了相当热烈的回响。随着名声渐播,开始有人相继地加入 GNU 计划 的程序写作阵营。"此道不孤"让 RMS 倍感振奋与喜悦。

当时的因特网并未十分普及。所以有不少人虽然对 Emacs 程序有兴趣,却没办 法经由 FTP 的管道取得,因而有人透过其它管道向 RMS 询问能如何取得时,这 可让当时处在失业状态的 RMS 看到能够支持他继续奋战下去的资金来源--贩售" 自由软件"。

一个人、一个独立的个人,要想在现实中实行自己的理念,最先得接受"现实 "。唯有接收它是事实,实行理念的道路,才获得比较稳固的起点与开始。  -- 网络农夫如是说。

想着、写着,脑中突然掠过一丝感受(所以顺便记录在这个地方)。不管如何, RMS 真的开始以一卷磁带 150 块美金的代价,服务有需要的人。也因为基于这 个开始与基础,RMS 当年便创立了自由软件基金会 -- Free Software Foundation (以后简称为FSF)。这对 GNU 计划而言,意味着它已跨越个人化理 念的构思阶段,并进入了有群体组织化的运作阶段。同时,RMS 也制定出了属于 GNU 计划的软件版权。RMS 使用 "copyleft" 用来形容她,其实就是与著作版权 (copyright) "对立"之意。这也就是 GPL -- General Purpose License (通用 公共授权)。GNU 计划的种子,就这样生根发芽了。

从贩卖 GNU 自由软件扩展到其它的相关软件与参考手册,提供软件技术支持,并 接受计算机器材与资金的捐助(捐助者依法享有一定额度的减税),为企业代训软件 人才。FSF 努力地开辟财源却仍旧是运作资金捉襟见肘。RMS 本人并不支薪。而 FSF 聘请软件工程师的待遇,也仅是软件业界薪资水平的一半。但这绝不表示 GNU 计划的软件水准是半桶水。GCC 编译器是 GNU 计划在 1987 年 3 月开始 发表的免费编译器,当时的版本是 0.9 测试版。如今最新的版本则是 3.0。这个 编译器可以说是今日自由软件写作的基石。GCC 所解译的机器码,其可靠度绝对 不逊于商业化的编译器产品,甚至可以说是优越过商业编译器。

90 年代初,GNU 计划暨已完成了质量与数量均十分可观的系统工具。这些工具 被广泛的使用在当时各种工作站的 UNIX 系统上。虽然已有如此的成果,但仍称 不上是完整的操作系统。他们缺少一支属于自己的"核心程序(kernal)"。

UNIX 在 4.2BSD 之后,越写越大 kernal 开始带来一些不便与问题。因而当 时便开始有另一个写作理念逐渐在发展--微核心(microkernal)理念。

1985 年,卡内基大学(Carnegie Mellon University 简称 CMU)暨以 4.3BSD 为发展基础,将之一拆为二,分成 micro kernal 与 single server 两个部分。 该计划的名称为"Mach"。这个计划成了微核心发展的技术先河。GNU 原本有意 直接采用 "Mach" 计划的成果。但无奈,这一等,从80年代中等到了90年代 初,在几经商量之后,他们打算采用微核心的写法,成立自己的计划,名称叫 "Hurd"。这项计划,如今仍在奋战中,虽然 microkernal 的做法让他们吃了不 少苦头;但可喜的是,0.2, 0.3 测试版本已经发表。

直到 21 世纪的今日,RMS 依旧努力不懈地耕耘着他的梦土。尽管他本人认为还 尚未完全地实现他的「GNU 宣言」;但他执着于理念的行动,已凝聚了相当数量 的自由软件写作族群们,在这些人与群体的努力下,一条新的大道其实已经被开 拓出来了,她通往一个新的世界。大道旁,枝叶已然繁茂的树荫下,可口果实一 如礼物般地为所有的人成熟。人们称她 -- Linux。

新世代的焦点 -- Linux

1990 年代中期,因特网因出现 World Wide Web, HTML 这种新型态的应用, 而开始迅速的延烧全世界。一夕间,架设因特网主机的需求激增。这时有一套可 以免费取得,并且能让 x86 计算机升格成 UNIX 级主机的免费操作系统,开始了 吸引全世界目光。在传媒与计算机工程师们的竞相走告下成为了这个新世代的焦 点,这个新的名字就是 Linux。

Linus Benedict Torvalds当然,这套媒体吹捧的当红炸子鸡,可非一人之功, 一夕即成的。Linux 是一套版权彻彻底底与 AT&T 无关的 UNIX-like OS。原始 核心程序的创作者是芬兰籍的 Linus Benedict Torvalds(现今他仍旧是核心程 序的维护者)。操作系统里大部分的系统工具,来自于 RMS 行之多年的 GNU 计 划成果,以及其它的自由软件写作计划产生的软件,如 X Windows、KDE、 Gnome 等窗口接口。由于构成操作系统的主要部分均奉行 GPL 版权,所以市面 上有相当多样的安装套件,目前较广为人知的有 RedHat、Slackware、 SuSE、Debian GNU/Linux...。也因此,这套操作系统,可说是包含了无数字 自由软件写作者的共同心血。如此的一套操作系统其实也就是 RMS 多年来想要达 成的宿愿 -- "Free UNIX"。所以,RMS 本人总认为该将名称改做 "GNU/Linux"。因此,也有人用 GNU/Linux 来称呼这个操作系统。

Torvalds 打从十岁出头当他外公的"键盘手"开始,到了中学就已成了不折不扣的 计算机迷。1990 年,当他就读赫尔辛基大学(University of Helsinki)信息系二 年级,选修一门「C 语言与 UNIX 操作系统」的课程,因而疯狂地迷恋上了 UNIX 操作系统。那年正好赫尔辛基大学正好添购的一台 VAX,安装 Ultrix 操作 系统。连接了 16 台终端机供授课师生使用。有所限制的计算机资源,对一位计 算机迷来说是极痛苦忍受的。Torvalds 开始作梦想"搞"一套可以在自己计算机上 跑的 UNIX。

1991 年 1 月,Torvalds 利用 "学生贷款" 加上去年的 "耶诞红包",以分期付 款方式买了一台 386 DX33 个人计算机(他的第三台计算机)。他选择安装的操作 系统则是在学术界颇负盛名的 Minix[注5]。在几番奋战下,就绪运作的 Minix OS 功能性却多方面无法满足 Torvalds 的需求,因而激发了他重头来的欲念。于 是 Torvalds 在他的 386 DX33 上逐步探索并撰写出他自己的核心程序。他网络 上释放的第一个版本是 1991 年 9 月 17 日的 0.01 版。虽然她是个简陋的开 始,但由于 Torvalds 本人持续维护与网友回馈贡献,原本一个人所撰写的核心 程序竟在不知不觉中逐渐转化成 "虚拟团队" 的运作模式。

然而,一般计算机使用者,需要的是可安装运作的操作系统(农夫我习惯以"安装套 件"称之),而非单一的操作系统核心。当时英国的曼彻斯特电算中心 (Manchester Computer Center, 简称 MCC)便根据 0.12 版核心程序制作了 一套名为 MCC Imterin 的安装套件。随后各地的安装套件有如雨后春笋般地出 现;如美国德州 Dave Safford 的 TAMU(Texas A&M University)版、Martin Junius 的 MJ 版、Peter McDonald 的 SLS(Softlanding Linux Sustem)版 等非商业安装套件的出现。在安装需求日增的情况下,Linux 安装套件创造出了

一块新的需求市场。这一线商机,让非商业安装套件的也开始出现在商业市场 上。Slackware 大概可算是最早出现的商业安装套件了。到如今,商业与非商业 的安装套件则已多得数不清了。

随着使用人数激增,核心程序的版本与功能也开始加速演化,但仍不失于稳健。 1994 年 3 月 13 日,核心程序 1.0 正式发表。其安装套件在功能上的整合已急 起直追当时商业版的 UNIX OS。此时的 Linux OS 已拥有数十万名使用者。当 时赫尔辛基大学还以此为由举办了一场名为"Linux 首度正式发表会"。就在芬兰 电视台与众多传媒的郑重其事的报导下,Torvalds 成了芬兰人的自豪,Linux OS 宛如刚诞生的"超新星",闪闪发亮地展现在众人眼前。

早期的 Linux 核心程序曾被 Andrew Tanenbaum 指出,过度紧密地与 x86 处理器结合,所以他认为 Linux 核心程序将无法移植到别的处理器上。这点显然 与 UNIX OS 的可移植性大不相同。当时的情况的确是如此,这或多或少与 Torvalds 本人受限于拥有的硬件资源有关。但当 Linux 的使用族群拓展开来之 后,便开始有人主动地将她移植到不同的平台上。像 Dave Miller 即以不下于 Torvalds 狂热与学习精神将 Linux 成功地移植到 SUN 的 SPARC 工作站上。 此外如 Amiga、Atari、PowerPc、MIPS R4000 也陆续见到 Linux 的身影。 这些移植严格地从技术的角度来看,仅能说是"个案"。但这已激发 Torvalds 的 兴趣。真正撼动 Linux 核心的移植是对 Alpha 处理器。

1994 年 5 月,在 DEC 使用者协会上,Digital 的工程师 John Hall(外号 Maddog)碰上了 Torvalds,双方一见如故。Maddog 力劝 Torvalds 将 Linux 移植到 Alpha 芯片上,并主动提供了一台 Alpha 计算机供 Torvalds 研 究使用。当年可说是全世界最快的 64-bits Alpha 芯片是 DEC 引以为豪的一项 成就,其架构与功能均优越过同一时期的 Intel 32-bits 处理器。这种技术性的 挑战吸引了 Torvalds 的投入。这项移植,但这对原先以 x86 微处理器为写作基 础的 Linux 核心程序而言,实在不是一件小工程。在 Torvalds 与 DEC 相关人 员的将近一年奋战后,Linux 核心程序脱胎换骨,成功地移植到 Alpha 处理器上 (与 x86 处理器使用同一套程序代码)。1995 年 3 月,被戏谑是 Linux'95 的 1.2 版核心程序正式发表,支持 Intel x86、DEC Alpha、SUN SPARC、MIPS 等处理器。

1996 年 6 月,核心程序版本由 1.3 直接跃升为 2.0 版。Torvalds 本人正式钦 定了一只"企鹅"作为 Linux 的标志。同时也开始支持对称式多重处理器 (Symmetric Multi-Processing,简称 SMP)架构的计算机;而支持的处理器则 又多了 Motorola 68k 和 PowerPc。在自由软件团体们的努力与计算机产业业 界的支持投入之下,Linux 具备的功能逼近商业版 UNIX OS。当然,Linux 要达 到"成熟"与"稳定",实际上还有好长的一段路要走。

时至今日,散播在全球各地的 Linux 虚拟发展团体,仍旧持续地发展中。能维持 到什么时候?这在将来的历史自有答案。但至少在现今,一个 RMS 奋斗的目标 -- 可自由分享程序代码的操作系统,已可贵地呈现在我们的眼前。

备注: *5 Minix 是 Andrew Tanenbaum 教授为教学目的而撰写的操作系统。在教 育界可算是一套学习 UNIX 基础的好范本。

新文明世紀 自由共享

到此,这一段关于 UNIX 发展的文字,已从过去的历史当中走回到了今日 ... 21 世纪的今日。本文也接近尾声了。请诸位原谅农夫将以极为自身的历史感受,来 作为本文的结语。

阅读与探究历史,是农夫个人在年轻时即有的一点小癖好。通常我无法忍受对自 己喜好事物的缘由一无所知。所以我会想办法去探究她由谁所创、因何而生与发 展的沿革。也正因为如此,我才会为 UNIX 这个当初我没能在英文字典上找的怪 字,写了这么一篇文字。

然而在 UNIX 的发展过程当中,我惊讶地发现了一项有别于我探索 20 世纪历史 的东西。我相信诸君应该清楚,20 世纪是人类文明史上最为血腥残暴的一段岁 月。在其间,多数民族的上个世代所遭逢的苦难,都是空前的。哲学家柏林 (Isaiah Berlin)回顾 20 世纪的感受,说了以下这样的一段话。

「我的一生--我一定得这么说一句--经历了二十世纪,却不曾遭逢个人苦难。 然而在我的记忆之中,它却是西方史上最可怕的一个世纪。」

的确,每当我阅读 20 世纪的相关史料,我就更能加倍地感受到这份莫名的幸 运。我生长在台湾,这块回顾其历史仅能以"悲土"称之的岛上,她的苦难直至今 日亦尚未完全结束。尽管多数年轻的一代已然淡忘,来自何方,归往何处。身为 一个中国人,站立在这块似乎仍将被同胞武力相向的孤岛上....我已不清楚历史伤 口会因得到同胞的爱而痊愈,还是再次因人类残暴掠夺的天性而迸裂.........抱 歉,离题了.

我想说的是,在 20 世纪未的因特网时代中,我感受到了令人喜悦地,根源于 心、跨越既有疆界藩篱的自由共享文明。这相较于 20 世纪初将"战争"视作为文 明象征的人类而言,实属无价可贵的进展。即使这文明仍仅是刚播下的种子。但 我相信,她将如贝聿铭所言:

「你永无法明确知道你已播种的东西何时可以收割;或许只有一次收成,或许 可重复收成。你也许遗忘曾播种了些什么,一种经验,一种感受,与某人的关 系,抑或一种哲学及一项传统。然后,忽然间就开花了,被全然不同的环境所唤 醒。这种盛开可以冲破藩篱及整个时代。」

多希望亲眼看到,几个世代后的某日,人类彼此掠夺的行为如天花一般地在人类 社会中绝迹;而,共享已成为人类整体奉行的道德公理。如果这样的一个社会是 我们今日所企求的;那么,这个方向与希望,就值得你我花一生的精力去努力。 当然,这仅只是一个个人的希望,我也清楚这世间并非如此美好。但,如果因假 设一件事物不可能做到,而决定不去做;那是假设得到胜利,而非真实的事实。 或许过去的历史,曾经证实正义、公理、平等与理想的胜利,不过是短暂的昙花 一现;那又如何。只要我们不放弃希望,希望就有机会成为真实。今日,所有的 美好均因此得来,明日也是。

这几年来,我已看到不少因特网上诸君们的努力。我也相信这崭新文明的种子, 有朝一日将展现出令人赞叹、愉悦的美景。未来存在我们尚未发现的国度。我相 信,我们能发现未曾走过的通道,打开不曾打开的门,进入玫瑰园中.....那会是一 个崭新的文明。

網路農夫 2001/12/12 文定

linux简史(很老的一篇文章,可做参考)

1 混沌初开

那是在一九九一年,令人痛苦难耐的冷战渐渐走到了尽头。和平安详的空气开始升起在地平线。在计算科学领域,随着强大硬件的推出,计算机的极限能力已超出了我们的想象,一个辉煌的未来似乎已渐露端倪。

但还是缺了点儿什么。在操作系统领域,存在着一片巨大的空白。

一方面, DOS还统治着庞大的个人电脑王国。比尔-盖茨花$50,000从一个西雅图黑客手中买来DOS。之后,靠着聪明的市场策略,这个简陋的操作系统悄悄渗透到了世界的每一个角落。PC用户没有其它的选择。苹果机虽好,但它的天价没人能承受得起。它和大众需求保持着遥不可及的距离。

计算领域的另一个阵营是UNIX世界。但 UNIX更是贵不可攀。为了追求高额利润,UNIX销售商把价码抬得足以吓跑随便哪个PC用户。贝尔实验室曾慷慨地提供UNIX的源代码给大学。但现在, 这些源代码被小心地看管起来,不再对外公开。更令全球PC用户心烦的是,软件市场的大玩家们没能为这一问题提供个有效的解决方案。

MINIX似乎是个选择。它是在荷兰当教授的美国人Andrew S.Tanenbaum从 零开始编写出来的。MINIX的初衷是为了向学生讲授操作系统的内部工作原理。MINIX的设计是面向当时最为流行的Intel8086微处理器。作为一 个操作系统,MINIX算不上一流。但它的好处是你能得到它的源代码。只要你有Tanenbaum写的《操作系统:设计与实现》这本书,你就能得到那 12,000行用C和汇编写的源码。头一次,程序员或黑客可以有机会读一读操作系统的源码–这种被软件商严加看管的东西。Tanenbaum用详尽简洁的 笔触探讨了编写操作系统的艺术。他是个一流的作者,迷住了一批当时计算机领域最聪明的大脑。全世界学计算机的学生都在钻研这本书,通过读它的源码来了解他 们电脑里运行的MINIX操作系统。

Linus Torvalds就是这些学生中的一个。

2 呱呱坠地

在1991年, Linus Benedict Torvalds还是个芬兰学生,在赫尔辛基大学念 计算机专业二年级。同时他也是个自学成才的黑客。这个长着沙滩黄头发,说话软绵绵的二十一岁芬兰帅哥喜欢折腾他的电脑,把它不断推向能力的极限。但他缺少 一个合适的操作系统来满足他如此专业的需求。MINIX不错,可它只适合学生,是个教学工具,而不是一个强大的实战系统。

当时,全世界的程序虫们都很看好Richard StallmanGNU项目—一个致力于推出自由、高质量软件的运动。在计算科学的王国里,Stallman是个倍受尊崇的神话式英雄。他令人景仰的职业生涯是从大名鼎鼎的MIT人工智能实验室开始的。

七十年代中后期,他在那里开发出了著名的Emacs编 辑器。八十年代早期,商业软件公司从人工智能实验室吸引走了绝大多数优秀的程序员,并和他们签署了严格的保密合同。Stallman为此大大不爽。他认为 软件和其它产品不同,在复制和修改方面它不该受到任何限制。只有这样,才能开发出更好更强的软件。1983年,他在著名的《GNU宣言》中,向世人宣告了 GNU项目的启动,开始了贯彻其哲学的自由软件运动(顺带一句,GNU一词是‘GNU's Not Unix’的递归缩写)。 为了最终实现开发出一个自由操作系统的梦想,他得先制造些工具。于是,在1984年初,Stallman开始创作一个令商业企业程序员叹服的作品-GNU C编译器(gcc)。他出神入化的技术天才,令所有商业软件程序员自愧不如。gcc被公认为世界上最高效最强健的编译器之一。

./figs/stallman.png

Richard Stallman,GNU项目的创始人

到1991年,GNU项目已经开发出了众多的工具软件。大家期待已久的GNU C编译器也问世了。但自由操作系统还没有出现。MINIX也是受版权约束的(后来,在2000年4月,Tanenbaum在BSD许可证下发布了自由的 MINIX)。GNU操作系统内核-HURD-还在开发之中,几年之内还不可能面世。

拖了这么久,终于该说说Linus了。

1991年8月25号,Linus在MINIX新闻组发出了历史性的一贴…

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: comp.os.minix
Subject: What would you like to see most in minix?
Summary: small poll for my new operating system
Message-ID: <1991Aug25.205708.9541@klaava.Helsinki.FI>
Date: 25 Aug 91 20:57:08 GMT
Organization: University of Helsinki

Hello,各位使用minix的朋友,

我正在写一个基于386(486)AT机器的(自由)操作系统(只是出于爱好,不会做得象gnu那么大、那么专业)。 我从四月份开始酝酿,现在已经做得差不多了。我现在想知道一些你们对minix的看法,它哪点好?哪点不好? 因为我这个操作系统和minix多少有点儿类似(文件系统采用同样的物理布局(因现实原因), 其它方面也有类似的地方)。我已经把bash(1.08)和gcc(1.40)移植过来了,而且它们运转正常。 这意味着在下面几个月里,我将给它加上更多实际的功能。所以我想知道大家都希望它有哪些功能。 欢迎多提建议,但我不敢保证能实现你的建议 :-)

Linus (torvalds@kruuna.helsinki.fi)

附:没错,它不包含任何minix的代码,而且它有一个多线程文件系统。 它现在不能在其它硬件上转(因为用了386任务切换机制,等等),而且除了AT硬盘, 它基本上不支持任何其它硬件。这就是全部了 :-(。

从这个帖子不难看出,Linus自己并没预料到他的小创造将会改变整个计算科学领域。1991年9月中旬,Linux 0.01版问世了,并且被放到了网上。它立即引起了人们的注意。源代码被下载、测试、修改,最终被反馈给Linus。10月5号,0.02版出来了,同时 伴随着Linus著名的声明:

From: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds)
Newsgroups: comp.os.minix
Subject: Free minix-like kernel sources for 386-AT
Message-ID: <1991Oct5.054106.4647@klaava.Helsinki.FI>
Date: 5 Oct 91 05:41:06 GMT
Organization: University of Helsinki

你在怀念minix-1.1时代的美好时光吗?那时你自己写着驱动,充满了作男人的感觉。 现在没什么好项目可做了,是吗?你在拚命啃一个操作系统,修改它以满足你的需求,是吗? 现在minix已经没什么需要你去改进的了,你为此怅然若失,是吗? 没机会再熬通宵去改进一个小程序了,是吗?如果是这样的话,那这个帖子就是给你的 :-)

一个月(?)前我曾经提到过,我正在一个AT-386机器上开发一个自由版本的、类似minix的操作系统。 现在它终于出来了(尽管未必能满足你的期待)。我乐意把源代码公开出来,让它传播得更广。 它现在仅仅是0.02版(外加一个(很小的)补丁)。但是我已经成功地在它上面跑了 bash/gcc/gnu-make/gnu-sed/compress等程序。我这个小宝贝儿的源程序在 nic.funet.fi(128.214.6.100)下面的/pub/OS/Linux目录中可以找到。 该目录中还有些README文件,还有几个在linux下能工作的可执行文件(bash,update和gcc), 你还要求些什么呢:-)。完整的内核源代码都公布在这儿了,因为里面没用到minix的源程序。 而函数库的源程序只是部分开源,所以目前还不能提供出来。拿到源代码后,直接编译就行了。 编译完就能转了。哈哈。可执行程序(bash和gcc)的源代码可以在同一网站的/pub/gnu目录里找到。

几周以后,Linux 0.03版发布了。12月份,0.10版发布了。这时的Linux还显得很简陋。它只能支持AT硬盘,而且不用登录(启动就进bash)。0.11版有了 不少改进,可以支持多国语言键盘、软驱、VGA、EGA、Hercules等等。Linux的版本号从0.12直接上升到了0.95、0.96…不 久,Linux的源代码就通过在芬兰和其它一些地方的FTP站点传遍了全世界。

3 谁与争锋

./figs/laptop.png

Linus在展示一台Linux笔记本电脑

不久,Linus开始面对挑战。他面对的不是别人,正是Andrew Tanenbaum,那个开发出MINIX的伟大教师。在给Linus的一个回贴中,Tanenbaum写到:

“我还是坚持我的观点,在1991年还设计这样一个整体架构的内核是个根本性的 错误。你该庆幸不是我的学生。这么个设计,在我这儿你得不了高分:-)”

(Andrew Tanenbaum to Linus Torvalds)

Linus后来承认说,这是关于开发Linux他所得到的最坏评价。Tanenbaum是当时的知名教授,他说的话自然很有份量。但这次面对Linux,他的话没能奏效,因为Linus不是个轻易服输的人。

Tanenbaum还宣称:

“Linux过时了。”

现在轮到新的Linux一代开始反击了。以强大的Linux社区为后盾,Linus给了Tanenbaum一个恰如其分的回复:

“你的工作是教授、研究员。这对于minix的大脑损伤是个绝妙的解释。”

(Linus Torvalds to Andrew Tanenbaum)

Linux的开发在继续。不久,加入开发的人数就超过了一百,然后是数千,然后是数十万。Linux不再只是个黑客的玩具,配合上GNU项目开发出 的众多软件,Linux已经可以走向市场了。它最终在GNU公共许可证下发布,这保证任何人都可以自由获得它的源代码,可以自由复制、学习和修改它。学生 和程序员们都没错过这个机会。

不久,软件商们也来了。Linux是自由的操作系统。软件商们需要做的只是把各种各样的软件在Linux平台上编译,然后把它们组织成一种可以推向市场的形式。这和其它操作系统在运作模式上没什么区别,只是Linux是自由的。Redhat, Caldera, 和其它一些公司都获得了相当大的市场,获得了来自世界各地的用户。除了这些商业公司,非商业的编程专家们也志愿地组织了起来,推出了他们自己的品牌–享誉全球的Debian。配上崭新的图形界面(比如X Window System, KDE, GNOME), Linux的各个品牌都倍受欢迎。

好戏连台,惊喜不断。除了PC机,Linux又被移植到了许多其它平台上(PowerPC、 Sun Sparc、ARM、Alpha…Debian就支持十几种CPU)。它还被人安装到了3com的手掌计算机上。另外,利用集群技术,许多Linux单机 可以被组织成一个整体,用于并行计算。1996年4月, Los_Alamos国家实验室的研究人员利用68台Linux单机搭建了一个并行计算系统,用它来模拟原子弹爆炸的冲击波。与其它超级计算机不同的是, 用Linux搭建的集群计算机非常便宜。这种DIY出来的超级计算机只花费$152,000,连人工(连接68台PC的线缆)都包括了。这价格只是同级别 商业机的十分之一。它的峰值计算速度可达每秒190亿(19 billion, 19x10^9)次。在世界超级计算机排行榜中它排在第315位。它也极其稳定可靠,投入运行三个月后,还不必去重启动。

./figs/linusnow2.png

今天锋芒毕露的Linus

今天,Linux最大的优势就是推动它前进的巨大开发热情。一旦有新硬件问世,Linux内核就能快速被改进以适应它。比如,Intel Xeon微处理器才问世几个星期,Linux新内核就跟上来了。它还被用在了Alpha、MAC、PowerPC上。甚至在手掌机这一少人问津的领域都可 以运行Linux。正如它在1991年诞生时那样,Linux正以同样的热情阔步走向新世纪。

./figs/Linus_Torvalds.png

Linus,2002

至于Linus本人,他保持着简单的生活。不象比尔盖茨,Linus不是亿万富翁。完成学业之后,他移居美国,在Transmeta公司找了个工 作。Transmeta公司在指导完成了一个绝密项目的研发之后,推出了自己的Crusoe处理器。Linus是这个研发小组中活跃的一员。最近,他和 Tove结了婚,生了个女儿,取名Patricia Miranda Torvalds。世界范围内的计算机社区都对Linus推崇备至,到目前为止,他是我们这个星球上最受欢迎的程序员。

./figs/family.png

全家福

4 风雨十年

Linux的开发已经走过了十个年头。它用十年的蓬勃发展否定了所有持怀疑态度的警告和预言。今天,Linux是有史以来发展速度最快的操作系统之 一。从91、92年的几个技术狂热者发展到今天数以百万计的普通用户,这绝对是个不平凡的历程。大商业公司们“发现”了Linux,将数以百万计的美元倾 入到开发中来,这一事实无情地驳斥了“开源运动反商业”的谬论。IBM曾经视开源社区为洪水猛兽。而现在,它已经将大量的资金转移到以Linux为平台的 开源解决方案中来。

但真正让人感到惊喜的是,Linux开发团队持续不断地壮大,并在世界范围内扩散开来。这些开发者以旺盛的精力和高涨的热情不断改进着Linux的 功能和性能。Linux的开发工作并没有象“代码封闭论者”所妄言的那样“最终消失在一片混乱之中”。正相反,Linux的开发是有组织有秩序的,它采用 的是一种精心设计并被细心维护的开发模式。在这一高效开发模式下,数以千计的开发者们把各种 各样的应用软件注入到Linux平台中来。

商业企业不再对Linux心怀戒惧,因而大量的软件商开始提供Linux平台上的产品支持,软件质量有了更可靠的保障,在办公室里用Linux不必 再有“风险自负”的担心了。说到可靠性,Linux在1999年CIH病毒肆虐和一年后的‘爱虫’病毒流行时,证明了自己的强健。这些相当简单的小病毒把 世界搞得一团糟,而所有的Linux机器却丝毫不受影响。这充分显示了它出色的免疫力。当Redhat这样的Linux排头兵走向市场的时候,它们受到了 热烈的欢迎。甚至在近几年dot-com网络泡沫破灭之后,它们还在持续蓬勃地发展壮大。这也大大增强了人们对Linux的信心,许多大大小小的商业公司 开始采用Linux作服务器和工作站平台,把Linux作为办公室系统的可靠支撑。

4.1 桌面应用

那么,针对Linux人们报怨最多的是什么呢?在过去,也许就数它的字符界面了。很多对Linux感兴趣的人被传统的字符界面吓着了。“字符界面可 以让你无所不能”,一些执着的黑客会向你这样辩解。但对于数百万的普通用户,这意味着要花费大量的时间和精力去学习它。现成的XWindow图形界面和窗 口管理器并不能满足普通计算机用户的期待。这一直是MS Windows追随者们的攻击把柄。但在过去的几年间,情况发生了改变。象KDE和GNOME这样非常专业的桌面环境呈现在了人们的面前。这些桌面环境的 较新版本使人们对Linux的“用户友好性”有了更好的认识。尽管一些铁杆用户在报怨,图形化使黑客文化失去了其原有的纯正品味。但图形化大大改善了 Linux在普通用户心目中的形象,促进了Linux的流行与推广。

4.2 第三世界

Linux在发展中国家得到了广泛的传播。这也许是它对世界影响最大的地方。在Linux出现之前,发展中国家在计算科学领域大大落后于西方。虽然 硬件价格不断下滑,但在第三世界国家,计算机爱好者们饱有热情,却又囊中羞涩。软件的高昂价格一直是个巨大的经济负担。无奈中,他们只能求助于各种各样的 盗版软件。这直接导致了盗版的泛滥,盗版金额高达数万亿美元。话又说回来,大多数商业软件的标价都大大超过了发展中国家人民的承受力。举例来说,一个典型 的操作系统软件至少标价$100。在一个年人均收入只有$200-$300的国家,这$100是个巨额数字。

Linux和其它开源软件的崛起彻底改变了这一切。在适当的裁减之后,Linux可以在硬件配置极低的计算机上运行。这使得Linux成为穷人的理 想选择。在发达国家已经成为历史的老旧机器,比如486/Pentium1计算机,在发展中国家还在被使用着。Linux使得这些老旧机器继续发挥作用。 由于在穷国,高昂的软件价格是个大问题,所以开源软件得到了广泛的传播。在亚非拉,Linux成了众多计算机爱好者们的选择。在世界的各个角 落,Linux被本地化。这标志着它真正走向了全球。Linux的相关文件被翻译成了各种语言,包括很多冷门的语言,比如,越南语。

4.3 超级计算

Linus Torvalds当初开发Linux,只是出于一个黑客的爱好。自从Linux运行在了一个破386机器上以后,到现在,它已经走过了一条很长的路。今天,它最令人瞩目的应用领域是大规模并行计算集群。

2001年8月,BBC报道说,美国政府正在计划一个超大规模计算机。这个超级计算机将能够进行每秒13万亿次(13 trillion,13x10^12)计算(13.6TeraFLOPS)。这一项目被命名为“Teragrid”,是一个由四个美国超级计算中心组成的 网络。这四个超级计算中心是:

  1. 伊利诺斯大学国家超级计算机应用中心(National Center for Supercomputing Applications at the University of Illinois(NCSA))
  2. 加利福尼亚大学San Diego超级计算机中心(San Diego Supercomputer Center (SDSC) at the University of California)
  3. 芝加哥Argonne国家实验室(Argonne National Laboratory in Chicago)
  4. 加州理工学院帕萨迪纳分校(California Institute of Technology in Pasadena)

在每个计算中心都有一个Linux超级计算机集群。在Teragrid网中,总共将会有超过3000个处理器进行并行运算。截止至2005年,Linux超级应用再创新高。在2005年超级计算机500强中,使用Linux的超过了60%。而且前5名中,有4个用的是Linux。

4.4 走向未来

Linux从一个黑客的个人项目发展到一个遍布全球的操作系统,这一历程就象一次生物的进化。八十年代早期,Richard Stallman发起了GNU项目,为开源软件的发展奠定了基础。Andrew Tanenbaum教授开发的MINIX系统,把操作系统的学习研究从单纯的理论教学带入到实践阶段。最终,Linus Torvalds用他追求完美的无尽热情催生了Linux。在过去的几年中,开源社区成千上万的人们不断地呵护滋养着它,谱写了计算机革命史册的光辉一 页。今天,Linux不再是一个学生黑客的项目,它成了一个世界范围的奇迹。在开源运动的精神感召下,IBM这样的大公司和千百万热情的人们都加入了进 来。在计算科学的历史上,它将是人类最辉煌的成就之一。

5 企鹅绅士

./figs/logo.png

Linux的标志是一只小企鹅。不象其它商业操作系统,Linux没有采用一个令人肃然起敬的徽标。这个穿着黑色燕尾服的小家伙充分表达了自由软件 运动无忧、无虑、无畏的态度。这个可爱的徽标诞生于一个有趣的小故事。据Linus说,Linux最初并没有徽标。一次,Linus去南半球某地度假,碰 到了一只企鹅。它长得并不象现在的Linux徽标。Linus想去亲近这小家伙。结果,小企鹅在他手掌上重重地拍了一翅膀。这次有趣的经历导致了后来 Linux徽标的诞生。

6 轶闻趣事

下面是一些Linus的名言。

Dijkstra八成讨厌我。
(Linus Torvalds, in kernel/sched.c)

“我怎么知道它转不转?这是beta测试该做的事情。我只管编码。”
(Linus Torvalds的个性写照。摘自某个帖子)

“我真白痴…至少这个bug花了我五分钟才找到…”
(Linus Torvalds 给一个bug报告的回应)

“如果你想周游世界,想被邀请去到处演讲,那就写个Unix操作系统吧。”
(By Linus Torvalds)

>> Linux除了有一个酷名字以外,谁能说说为什么我该用 Linux 而不是BSD?
> 不,这就够了,有个酷名字就够了。在取名方面,我们花了老大的力气,希望它的名字能引起大家的兴趣。这招挺有效,数以千计的人们选择了Linux,就是为 了说:“OS/2?哈。我有Linux。多酷的名字。” 386BSD的名字里有太多数目字和奇怪的缩写,太失败了。听起来太技术化, 把人都吓跑了。
(摘自Linus Torvald的一个关于Linux的跟贴)
> 有朝一日,大家觉得有人能把Linux搞得更好的时候(自由软件基金会就是个选择),我就“退位”。我觉得这还不是我们现在该操心的事情,至少在可见的将 来还不会发生。我喜欢搞Linux,尽管工作量不小。 而且我还没听到有人报怨我(也就听到些很小声的提醒,都是关于我忘了或者忽略了某个小补丁。至今也没有什么真正的负面反映)。
> 别误会,我上面这些话并不是说一旦有人报怨我,我就撂挑子不干了。我皮很厚(Lasu正在我背后偷看我写这些东西,他说“更确切地说该是‘脸皮’很 厚”),厚得足以接受些难听的话。如果不是这样,早在听到ast(译注:Andrew S. Tanenbaum)嘲笑我模仿、复制minix的时候,我就停止开发了。我只是想说,Linux到现在一直是我的宝贝儿,如果有人想把它搞得更好,我不 会死抱不放、 舍不得撒手的。
Linus
> 嘿,也许我该到教皇那儿申请个圣徒的头衔。谁知道教皇的email?很高兴我 让你恶心了。
(摘自Linus给某位为Linux未来表示担忧的人的回复)

当你向人炫耀“我写了个能搞死Windows的程序”的时候,大家会木然地盯着你说“呵,我Linux系统里有得是这类程序,而且这系统不花钱”。
(By Linus Torvalds)

7 似水流年

日期 事件
1984年1月 Richard Stallman从MIT辞职,开始了他的GNU项目。
1985年某月 Richard Stallman成立了自由软件基金会。
1985年3月 Richard Stallman在Dr. Dobb's杂志上发表了《GNU宣言》。
在宣言中,他陈述了自由软件运动的起因。
1991年8月25号 Linus在Usenet新闻组上公开了关于Linux的构想。
1991年9月 Linux 0.01版在网上发布。
1992年1月 第一个Linux新闻组诞生:alt.os.linux。
1992年4月 Ari Lemmke在Usenet上创立了广受欢迎的comp.os.linux新闻组。
1992年11月 Adam Richter宣布他的公司推出了第一个Linux发行版: Yggdrasil。
1993年6月 Peter Volkerding推出了著名的Linux发行版:Slackware。
1993年8月 Matt Walsh推出《Linux安装与入门:第一版》。
1994年3月 Linux内核1.0版问世。

8 参考链接

下面是一些关于Linux历史的参考链接,也许对你有帮助。

9 鸣谢与版权

历史通常是枯燥乏味的,但计算科学和Linux的历史却是相当有趣的。这篇文章中的大多数信息都取自互联网。它的很多灵感来源于在孟加拉Linux用户俱乐部中的交流。谢谢大家。

本文涉及的所有资料的版权属于资料的原作者。所有的商标都属于它们的公司。 Microsoft和Windows是微软公司的注册商标。

本文的版权属于Ragib Hasan(1991+),作者保留所有版权。但不必担心,本文的任何部分都可以随意复制,前提是事先征得作者的同意。很简单,只要给他发个email就行了,不收钱。欢迎大力弘扬自由软件运动的精神。

如有任何建议和更正,请联系:

Ragib Hasan
Department of Computer Science
University of Illinois at Urbana-Champaign,
Urbana, IL 61801
United States
电子邮件:ragibhasan aaaaht gmail daaawt com (你明白我的意思 ;-)

本文可以从下列网址获得:

中文PDF版和TeX源文件可以从下列网址获得:

关于中文翻译的任何意见和问题,请联系:

从web安全角度看服务器端脚本与客户端脚本(javascript)的差别

从web安全角度看服务器端脚本与客户端脚本(javascript)区别

从安全角度而言,服务器端的程序对浏览器端传递参数的判断,这在任何时候都是非常必要的;客户端脚本(一般是js/javascript)很多时候也是必要的

js是在客户端执行的,可以把信息以最快的速度告诉用户,如果有错误输入,马上提醒用户修改,而不是等提交 后才得到警示信息
这就是所谓“用户体验”,让用户使用时感觉“好用”
可以这样讲,客户端脚本脚本是是为了提高用户体验,而服务器端验证程序是为了数据完整及数据安全
永远不要指望使用用客户端脚本就完成了数据验证

linux下最强大最好用的媒体播放器:mplayer+SMplayer前端,远胜过kmplayer

linux下媒体播放器mplayer前端SMplayer,很好很强大,感觉胜过kmplayer

使用linux,多媒体功能也是一个很重要的功能,不好人对linux多媒体功能颇多诟病。不可否认,linux的长处并不在于多媒体,但它还是有不少优秀的多媒体工具可选。

mplayer就是很好的一款,也是多数使用者推荐的,但mplayer主要是一个播放器核心,它自带的UI确实不怎么好用,于是安装其它的前端就是很必要的工作。

很多使用者推荐以mpaleyer+kmplayer+win32 codes打造linux下万能播放器,通过google搜索linux播放器相关信息,看到无数这样的文章,笔者也是linux菜鸟,当然会跟着网上的文章一步一步的安装,但上周fedora 12  yum update升级了一下,里面的kmplayer升级为新版本,升级完后发现,kmplayer播放不了rmvb文件了。这是一件很郁闷的事情,总要解决的,怀疑是kmplyaer与mplayer不兼容,于是到官方下载最新的svn版mplayer源码,编译安装,花了老长时间,算是安装好了,到kmplayer里,还是播放不了rmvb,kmplayer的“控制台”中有以下的信息输出,

MPlayer SVN-r30235-4.4.3 (C) 2000-2009 MPlayer Team

Exiting... (End of file)

ID_EXIT=EOF

google一下,没找到原因。但使用mplayer直接播放,却是可以播放rmvb的,虽然有一些错误提示,有时还启动失败,但多试两次就可以正常启动了。

一度还在网上找其它的播放器,还通过yum安装了xine,但不知哪里不对,就是不能播放任何文件。于是又回到mplayer上。今天周六休息,早上起来,突然想起来看有没有其它mpalyer前端程序,见有人说gnome-mplaer,与smplayer,大致比较一下,选择smplayer,搜索,

官方网站 http://smplayer.org/

sourceforge下载页 http://smplayer.sourceforge.net/downloads.php

编译安装总是要花费较长时间,于是先看看yum上没有(fedora12)

[root@localhost feng]# yum install smplayer
它还要安装一个依赖包mplayer,之前编译安装的mplayer在/usr/local/mplayer,看来它不认,要重新安装,当然要听从它的,下载安装。文件不大,只有几M,很快就完成。信息如下:

设置安装进程
解决依赖关系
--> 执行事务检查
---> 软件包 smplayer.i586 0:0.6.8-1.fc12 将被 升级
--> 处理依赖关系 mplayer,它被软件包 smplayer-0.6.8-1.fc12.i586 需要
--> 执行事务检查
---> 软件包 mplayer.i686 0:1.0-0.111.20091029svn.fc12 将被 升级
--> 完成依赖关系计算

依赖关系解决

================================================================================
软件包       架构     版本                            仓库                大小
================================================================================
正在安装:
smplayer     i586     0.6.8-1.fc12                    rpmfusion-free     1.5 M
为依赖而安装:
mplayer      i686     1.0-0.111.20091029svn.fc12      rpmfusion-free     4.3 M

事务概要
================================================================================
安装       2 软件包
更新       0 软件包

总下载量:5.8 M
Installed size: 17 M
确定吗?[y/N]:y
下载软件包:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 5.8 M
(1/2): mplayer-1.0-0.111.20091029svn.fc12.i686.rpm       | 4.3 MB     00:38
(2/2): smplayer-0.6.8-1.fc12.i586.rpm                    | 1.5 MB     00:14
--------------------------------------------------------------------------------
总计                                            109 kB/s | 5.8 MB     00:54
运行 rpm_check_debug
执行事务测试
事务测试成功
执行事务
正在安装       : mplayer-1.0-0.111.20091029svn.fc12.i686                  1/2
正在安装       : smplayer-0.6.8-1.fc12.i586                               2/2

已安装:
smplayer.i586 0:0.6.8-1.fc12

作为依赖被安装:
mplayer.i686 0:1.0-0.111.20091029svn.fc12

完毕!

安装完毕后,sfce的主菜单-影音 里启动smplayer,试了试,还真不错,rmvb也可以正常播放了。而且还能自动加载同目录下的字幕文件,单这点就比mplayer强。

(笔者使用xfce作为桌面,最近很少使用fedora12自带的gnome/kde,xfce是个轻量级桌面,反应速度比较快,在性能不是很强的笔记本上也跑得飞快。)

SMplayer的中文资料好像不是很多,这是其官方的介绍信息。

About

SMPlayer uses the award-winning MPlayer as engine, so it’s able to play the most known audio & video formats without any need of external codecs: avi, mkv, ogm, mpeg, vob, 3gp, asf, mov, wmv, mp3, ogg… You can also play DVD discs and Internet streams.

Special care have been taken with subtitles. It supports srt, sub, ssa, embedded subtitles in Matroska files, DVD subtitles… SMPlayer subtitles can be very nice, you can choose font and size, and even colors for the subtitles.

One of the most interesting features of SMPlayer: it remembers the settings of all files you play. So you start to watch a movie but you have to leave… don’t worry, when you open that movie again it will resume at the same point you left it, and with the same settings: audio track, subtitles, volume…

[ad#gad_3]

这是有人对for windows版本的介绍

万能播放器 SMPlayer 绿色汉化版

SMPlayer 是 MPlayer 一个十分完整、图形界面相当友好、操作很方便的前端程序 。SMPlayer 能播放目前常见的所有的视频格式文件。SMPlayer 跨平台的能力优秀,SMPlayer 在 Windows 平台下也有不凡的表现。占用的系统资源小,拖动播放进度快,支持记忆功能(自动恢复到之前看过的视频的播放进度),可自由修改界面的风格,功能日趋强大的 SMPlayer 成为播放器领域的一个宠儿。

一般情况下,在 Windows 中使用 SMPlayer 的需要先下载主程序,然后下载 smplayer_codecs_20071007.exe 这个解码器来解决播放 RMVB , RM , AVI 等格式的视频文件只有声音没有图象的情况。并且经我们测试官方提供的smplayer_codecs_20071007.exe 这个文件的链接不能正常下载。因此,我们考虑到方便更多的用户使用 SMPlayer ,我们基于官方的 SMPlayer 制作了 SMPlayer 绿色汉化版,用户下载解压后便直接可以使用。

SMPlayer 绿色汉化版相对官方原版的变化:

* 无需安装,直接解压后便可以使用
* 加入解码器,省去四处寻找解码器来支持rm,rmvb 的繁琐过程
* 删除一些不常用的语言,只保留英文和简体中文还有繁体中文 (精简版本)
* 在 Tim Green 的基础上进一步汉化部分英文
* 删除自带的主题,只保留默认的主题 (精简版本)

click and support me [ad#gad_1]

百度和Google的算法区别/Difference between Baidu and Google Algorithm

百度和Google算法区别:

1、 公正性:Google比百度更加公正,因为百度有很多人为的因素干涉排名,而Google的PR(Page Rank)算法使得Google更加公正

2、 网站评价等级:Google的PR(Page Rank)是Google算法中一个重要因素,它给网站进行了评分,而百度没有类似的算法机制。

3、 网页收录:Google和百度都可以对网站进行收录,而其都是采用site命令查询。Google对网站的收录比较客观真实,百度收录一般都要比Google少,而其会少很多。

4、 算法稳定性:Google的算法相对稳定,而百度的算法基本上“天天在变”

5、 Sitemap:Google的sitemap功能方便“蜘蛛”爬取网站页面,即使一些链接很深的页面也可以通过sitemap引导“蜘蛛”爬到该页面;而百度没有sitemap功能,百度“蜘蛛”只能依靠网站HTML页面上的链接爬取网站页面。
Difference between Baidu and Google Algorithm:

1.     Impartiality:

Google is more fair than Baidu. Because Baidu is affected by human factor, but PR algorithm makes Google more fair.
2.     Site evaluation grade:

Google's PR (Page Rank) is an important factor in Google algorithm, and it grades sites, while Baidu has no similar algorithm mechanism.
3.     Web pages record:

Both Google and Baidu can record web pages with the same “site” order to search. But web pages in Google are more objective, true and also much more than Baidu. For example: hsw.cn, Google includes 15,500,000,but Baidu only includes: 2,150,000.
4.     Algorithm stability:

Google's algorithm is relatively stable, while Baidu's algorithm essentially "changing every day"
5.     Sitemap:

Google's sitemap feature to facilitate the "spider" crawling Web pages, even if some link deep in pages can also be guided through the sitemap "spider" climb up on the page; while there is no sitemap feature for Baidu, Baidu "spider" can only rely on Web site link on the page web site pages get crawled.

Enable Root login on Fedora 12/fedora 12 下启用root用户登录X

linux fedora 12 下 root用户通过x界面登录默认是禁用的,网上查询启用方法,google中文里搜索,说是修改/etc/pam.d/gdm文件,注释掉一行就可以,但修改过却还不能登录的,于是在google.com里搜索,看老外们怎么讲查到下面一篇文章,里面说要修改两个文件,

/etc/pam.d/gdm

/etc/pam.d/gdm-password

这样才可以,明确指出不像Ubuntu那样。

原文如下,作者说直接修改root为其它随意的字符串,如test,但或许注释会更好。

http://www.linuxreaders.com/2009/11/19/root-login-on-fedora-12/

Root Login on Fedora is not as easy as Ubuntu Root Login, here you need to modify two files to get root access.

You need to modify content of following files

/etc/pam.d/gdm

/etc/pam.d/gdm-password

You’ll find pam_succeed_if.so user != root quiet in above files, replace root with anything e.g test

I replaced root with test & was able to login to system using root.

OR Comment the entire line.

[Comment the entire line recommend!]

五种开源协议的比较(,LGPBSD,Apache,GPLL,MIT)

当Adobe、Microsoft、Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来!

最初来自:sinoprise.com/read.php?tid-662-page-e-fpage-1.html(遗憾的是这个链接已经打不开了),我基本未改动,只是进行了一些排版和整理。
参考文献:http://www.fsf.org/licensing/licenses/

现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。

BSD开源协议(original BSD licenseFreeBSD licenseOriginal BSD license

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

  1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
  2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
  3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0(Apache License, Version 2.0Apache License, Version 1.1Apache License, Version 1.0

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

  1. 需要给代码的用户一份Apache Licence
  2. 如果你修改了代码,需要再被修改的文件中说明。
  3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL(GNU General Public License

我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL(GNU Lesser General Public License

LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL 允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并 发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源 代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

MIT(MIT

MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的.

本文来自:http://www.awflasher.com/blog/archives/939

自由软件/开源社区几个名词简介:unix,GNU,GPL,linux,BSD,freeBSD/UNIX简史

对于刚刚接触自由软件/开源社区的人来说,里面经常出现的几个名词很令人头大,网上搜索这些概念的讲解,都讲得很复杂,至少我个人没有找到很简明的介绍。 终于通过不懈的努力,这几个概念终于大概明白了。肯定会有不少朋友也像我一样,因此,我按照自己的理解,用最简单的话,对这几个概念作一个简介,可能有不 对之处,还请指正。

  1. UNIX说起,它是一个非常老牌、但又影响深远的操作系统,由AT&T公司的贝尔实验室开发。
  2. 当时AT&T公司把该操作系统的源码授权给高校、学术机构做研究或教学之用。因为这个操作系统非常优秀,很多机构都在其源代码基础上做功能扩充改 进,其中以加州大学伯克利分校的改进版最为著名,这个改进版即BSD(Berkeley Software Distribution,伯克利软件套件)。
  3. 由于源码开放性,一些公司也参与到UNIX的开发工作中,这里面最代表性的是IBM、SUN,他们分别开发出了AIX (Advanced Interactive eXecutive)、Solaris(曾用名SunOS),是供各自公司的工作 站、小型机等机器使用(当时还没有微机)。
  4. 之前的unix(包括unix衍生版都是)有一群BSD开发者离开了加州大学后,在BSD基础上搞了一套386BSD,是基于 intelCPU的(这时候便宜的intel芯片已经问世,并获得了一定市场,但intel芯片却没有相应的unix版本)。
  5. AT&X公司意识到了UNIX商业价值,但看到这些商业版本的UNIX感到非常眼红,大概想从中获得利益,于是疯狂的“打关司”,状告他们侵权。 于是UNIX界一片阴云,UNIX的发展也受到很大影响,高校教学用的UNIX也受到一定影响。
  6. 有位教授在业余时间编写了一个简单的unix版本MINIX,意思就是mini版UNIX. 其实是一个兼容UNIX的一套操作系统,他编写时是不看UNIX源码的,而是根据记忆里的UNIX的功能开发。但他确实太忙了,没有精力对这个版本进一步 完善。
  7. AT&T公司的官司还在继续,但UNIX实在太好了,离了它就不能工作。
  8. 70、80年代之际,对软件开发应该是开放还是封闭,有着截然不同的两种观点。“钱门大叔”也正是这时开始发迹的(这里他有一篇关于basic工具的呼 吁),他当然是支持封闭开发了。
  9. GNU大神 Richard Matthew Stallman是“软件专利”的坚决抑制者,他建立了GNU项目,目标是创建一套完全自由的操作系统,当然是UNIX兼容的。为了保证自由软件的成果不被封闭软件的开发盗用,他起草了一个许可协议GNU General Public License,简称GPL
  10. Stallman本人做了不懈努力,完成了相当大的一部分工作,但还差一个操作系统内核,他的构想是编写一个非常超前的先进的内核,但需求太复杂了,从而进展缓慢
  11. 正好这时荷兰的大学生linus基于intel i386编写了一个操作系统内核linux,在一定程度上参考了MINIX。在stallman的鼓动下,linus以GPL作为授权协议发布了linux.于是一个完整的操作系统就诞生了,就是GNU/Linux。
  12. 另外有一BSD群开发人员在386BSD的基础上搞起了UNIX,这里面有freeBSD, netBSD, openBSD. 通常认为freeBSD是最纯正的UNIX(但它其实也不是UNIX的嫡系)。
  13. AT&T的UNIX后来被卖了,而且经几家公司多次转手,结果从这个世界上淡出了,UNIX官司也就不了了之了。

-------------

详细信息参看以下:

UNIX发展史(BSD,GNU,linux) http://www.path8.net/tn/archives/726

linux简史 http://www.path8.net/tn/archives/722

了解更多信息,可以观看记录片《操作系统革命》(Revolution OS)2001年摄制,另有维基百科里相关词条。