分页: 25/29 第一页 上页 20 21 22 23 24 25 26 27 28 29 下页 最后页 [ 显示模式: 摘要 | 列表 ]
Nov 14
读写相关的问题是永远存在的,文件锁就是为了解决这个问题而做的,其实它就是个简单的信号量。读写相关性指由于同时读写文件造成文件数据的随机性冲突。为了明确知道在何时通过何种操作对更改或是读取了文件中的那些数据,有必要对操作进行序列化,原子化,同步化,使用户能确知在何时文件中有什么数据。文件锁就是其中一个工具。

文件系统一般有两种锁,共享锁及排它锁,也可被称为读锁和写锁。

文件系统锁的特点:
一个文件打开的时候只能拥有一把锁,就是说在同时,不能给一个文件同时分配两把以上的锁。

读写已被上锁的文件的用户可以持有这把锁,即持有这把锁的用户可以对该文件进行相应的操作,如读或写。用户可以申请持有某个文件锁,如果文件开始无锁,申请持有锁之前先由系统为该文件创建了一把锁,然后该申请者持有它。

持有锁的规则:如果这个文件已拥有一个读(共享)锁,其它用户不能为该文件分配排它锁或只读锁,但可以持有这把锁,也就是说其它用户可以读文件,但只要该文件被锁住,就没有用户可以对其进行写入。如果该文件已有一把排它锁且已为某用户持有,则没有任何用户可以再持有这把锁,除非持有者解锁。

有一个重要的概念要记住:对文件的操作本身与锁其实没有什么关系,无论文件是否被上锁,用户都可以随意对文件进行正常情况下的任何操作,但操作系统会检查锁,针对不同的情况给予不同的处理。比如说在无锁的情况下,任何人可以同时对某文件进行任意的读写,当然这样很有可能读写的内容会出现错误——注意只是内容出错,操作并不会出错。加锁后,某些操作在某些情况下会被拒绝。文件锁的作用并不是保护文件及数据本身,而是保证数据的同步性,因此文件锁只对持有锁的用户才是真正有效的,也只有所有用户都使用同一种完全相同的方式利用文件锁的限制对文件进行操作,文件锁才能对所有用户有效,否则,只要有一个例外,整个文件锁的功能就会被破坏。比如,所有人都遵循的开文件,加锁,操作读写,解锁,关闭文件的步骤的话,所有的人操作都不会出现问题,因为基于文件锁的分配及持有原则,文件中的数据的更新是作为原子操作存在的,是不可分的,因此也是同步的,安全的。但假如某个人不是采取此步骤,那么他在读写时就会出现问题,不是读不准就是写不进等等。

基于以上原理,对读数据是否锁定这点就值得说说。一般来说,写数据的时候排它锁定是唯一的操作,它这时保证写到文件中的数据是正确的,文件被锁时,其它用户无法得到该锁,因此无权做任何操作。在读的时候,要视具体情况而定,大多数情况下,如果不需要特别精确或是敏感的数据,无需锁定,因为锁定要花时间和资源,一个人申请持有锁花不了时间,人一多就有问题了,最主要的是,如果该文件需要被更新的话,假如被上了只读锁,则写入无法进行,因为那些想写入的用户将得不到排它锁,如果同时申请持有只读锁的人过多的话,排它锁就有可能一直申请不到,这样表现就是文件可能很长时间内无法被写入,显得很慢。一般来说,写文件的机会相对较少,也更重要,因此主要做好排它锁定,只读锁在多数情况下并无必要。那么只读锁用在何处呢?只读锁其实只对用户本身有用,只读锁保证用户读到的数据是确实从文件中读到的真实数据,而不是被称为“dirty”的脏数据。其实,这个还是针对那些不用锁的其它用户对文件的误操作,假如文件上锁,其它用户不一定非要通过锁对文件进行读写,如果他是直接读写的话,对上了锁的文件操作不一定有效,持有读锁的用户可以肯定在他读数据的时候读出来的是从真实的文件中得到的,而不是同时已被覆盖掉的数据。

因此,在写入的时候上排它锁应该是天经地义的,可以保证这时数据的不会出错。如果你不申请共享锁,可能读出的数据有错误,但对文件本身没有任何影响,影响只是对用户的,申请共享锁后读出的数据肯定是当时读的时候文件中的真实数据,如果不是为了保证数据的精确性,共享锁可以不加,充其量就是重新读一次,如果你读它是为了写入,不如直接加排它锁,没有必要用共享锁。

还有一点要强调的是:文件锁只对使用它的用户,而且是按规则使用它的用户才有效,否则,你用你的,我用我的,有的用,有的不用,还是会乱套的,错误还是会出现的,对同一个文件,只有大家用同一个规则用文件锁,才能保证每个用户在对该文件进行共享操作的时候不会出现读写错误。

以上是就本人知识说的一点原理,可能有些错漏,如有需要更正的,还请多指教。
Nov 12
常用数据段概要(只收集部分)
用户数据     ($ofstarid.php)
帖子数据     ($tid.php)
帖子索引数据 (list.php)
版块索引数据 (status.php)
版块数据     (forumdata.php)
论坛索引数据 (bbsnew.php)
今日会员数据 (today.php)
最新会员     (userarray.php)
版主数据   (admin.php)
论坛公告   (notice.php)
联盟论坛   (sharebbs.php)


--------------------------------------------------------------------------------
$ofstarid.php

安全接口#0|姓名#1|密码#2|电子邮件#3|是否公开邮箱#4|用户组#5|头像#6|性别#7|注册时间#8|签名#9|简介#10|QQ#11|ICQ#12|主页#13|来自#14|头衔#15|发贴数#16|威望#17|金钱#18|上次登陆时间#19|这次登陆时间#20|生日#21|是否发送邮件#22|推荐人#23|最后发表时间#24|预留#25|最后发表主题地址#26|是否验证#27|今日发贴#28|门派#29|生肖#30|星座#31|是否使用虚拟形象#32|是否有犯罪记录#33|在线时间#34|签名是否转换#35|商务平台管理用户真实信息#36|

常用变量统为:

$dir_fb,$dir_name,$dir_pwd,$dir_email,$dir_publicmail,$dir_groupid,$dir_icon,$dir_gender,$dir_regdate,$dir_sign,$dir_introduce,$dir_oicq,$dir_icq,$dir_homepage,$dir_from,$dir_honor,$dir_post,$dir_rvrc,$dir_money,$dir_lasttime,$dir_thistime,$dir_birth,$dir_receivemail,$dir_tuiji,$dir_lastpost,$dir_null1,$dir_lastaddrst,$dir_yz,$dir_todaypost,$dir_group,$dir_sx,$dir_star,$dir_xuni,$dir_badman,$dir_onlinetime,$dir_signchange,$dir_main


--------------------------------------------------------------------------------
$tid.php

安全接口#0|标题#1|作者#2|点击,帖子类型,表情 #3|内容#4|时间#5|IP#6|是否使用签名#7|附件下载次数,附件需要威望#8|被评为几分,评分的人#9| 买帖子的人#10|IP来自#11|帖子是否需要转换#12|是否订阅此主题#13|nul#14l|
常用变量为:

$tpc_fb,$tpc_title,$tpc_author,$tpc_covert,$tpc_content,$tpc_date,$tpc_ip,$tpc_sign,$tpc_download,$tpc_rvrc,$tpc_buy,$tpc_from,$tpc_ifconvert,$tpc_email,$tpc_null1




--------------------------------------------------------------------------------
list.php

安全接口#0|预留#1|预留#2|预留#3|帖子来源# 4|文件名#5|回复数#6|最后发贴状态#7|是否置顶#8|null #9|
常用变量:

$lst_fb,$lst_null,$lst_null,$lst_null,$lst_trdfrom,$lst_filename,$lst_reply,$lst_lastpost,$lst_ifinheard,$lst_null2




--------------------------------------------------------------------------------
status.php

安全接口#0|主题#1|作者#2|时间#3|文件名#4|时间戳#5|帖子总数#6|主题总数#7|子版块所有主题数#8|null#9|


--------------------------------------------------------------------------------
forumdata.php

安全接口#0|版块类型#1|名称#2|简介#3|版块id#4|父版块id#5|密码#6|风格#7|是否使用加密帖#8|是否使用隐藏帖#9|是否使用买卖帖#10|版块公告标题#11|版块公告内容#12|子版块数据段#13|是否全部显示子版块#14|版块logo#15|版块主题回贴限制#16|


--------------------------------------------------------------------------------
bbsnew.php

安全接口#0|新注册用户#1|会员总数#2|主题数#3|文章数#4|今日发贴#5|昨日发贴#6|最高日发贴#7|昨日0点时间控制发贴#8|昨日0点时间控制生日会员#9|今日明星#10|今日庄主#11|今日幸运儿#12|今日生日会员列表#13|最高在线人数#14|最高在线人数发生时间#15|


--------------------------------------------------------------------------------
today.php

安全接口#0|用户名#1|登陆时间#2|活动时间#3|IP#4|用户操作系统#5|用户浏览器#6|NULL#7|IP来源#8|


--------------------------------------------------------------------------------
userarray.php

单一包含 为了简便 安全接口在顶处

--------------------------------------------------------------------------------
admin.php

安全接口#0|版块ID#1|版主名称#2|


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

notice.php


安全接口#0|作者#1|标题#2|内容#3|起始时间#4|终止时间#5|

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

sharebbs.php

安全接口#0|论坛名称#1|论坛URL#2|论坛说明#3|论坛logo#4|


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

帖子类型

list----0普通贴,3置顶贴,
帖子----0普通贴,1锁定的普通贴,2精华贴,3锁定的精华贴,4投票贴,5锁定的投票贴
Nov 12

我发现很多的PHP程序员,尤其是学习还不是很久的,都不知道PHP的精华所在。Perl当年如何在商界出名?其强大的正则表达式。而PHP呢?他是一门从Unix下发展起来的语言,当然也就继承了Perl的很多特点,同时C的优点都有。快速、简洁、明了,尤其是C程序员,PHP是至爱,我就是深爱着“PHP”(都忘了女友了)。这里,我想来写一篇PHP的变量、数组应用技巧和PHP的正则表达式、PHP的模板应用,以后有时间再写PHP与COM、PHP与XML的完全结合。

1、变量、数组的应用技巧
(1)很多人用得不多的数组函数。foreach、list、each。分别举几个例子,应该就能知道了。例:
<?php
$data = array('a' => 'data1', 'b' => 'data2', 'c' => 'data3');
while(list($subscript, $value) = each($data))
{
echo "$subscript => $value :: ";
echo "$subscript => $value\n<br>";
}

reset($data);
foreach($data as $subscript => $value)
{
echo "$subscript => $value :: ";
echo "$subscript => $value\n<br>";
}
(2)函数的变量、变量的变量、变量的“指针”:看下例:
<?php
//变量的变量
$var = "this is a var";
$varname = "var";
echo $$varname;
//函数的变量
function fun1($str) {
echo $str;
}
$funname = "fun1";
$funname("This is a function !");
?>
变量的“指针”。这个指针加上了双引号,表明他不是真正的指针。看看下例:
<?php
function($a) {
$a ++;
}
$c = 0;
function($c);
echo $c; //$c仍为0
function(&$a) {
$a ++;
}
$c = 0;
echo $c; //$c为1
?>
之所以称其为“指针”,就是因为他有了和C语言中指针相同的功能。但这又不是真正的指针,只能够是这样的去理解。

2、正则表达式
正则表达式是一个非常大的题目,Perl的正则表达式的强大是闻了名的。而PHP也不弱,他继承了Perl的正则表达式法则,还有自己的一套法则。这里只说PHP自己的正则表达式。
正则表达式是最基本的元素。简单地说就是一套规则,用于去判定其它的元素是不是符合自身的规则,或者说是不是有相同的特征描述。
正则表达式的开始符:^,结尾符$,这两个符号间的是匹配的元素。如检查一个电话号码是不是打往北京的号,用正则表达式表示就是“^010$”。只要前3位区号是010,就是北京的号,后面的电话号码就不用管了。然后,用正则表达式匹配函数ereg来判断,例:
<?php
$pattern = "^010$";
$phone = "01080718828";
if(ereg($pattern, $phone))
echo "打往北京的号";
else
echo "不是打往北京的号";
?>
这就是正则表达式。北京的电话都是8位数字的,那我要知道这个号码是不是正确了?假如他按了9位号呢?如果判断正误?这就要用到正则表达式的字符簇。那么上例的正则表达式就要这样写:^010[0-9]{8}$,就能同时判断号码是不是符合规则。正则表达式有很多的应用,像LBB、VBB论坛在发贴时的所谓VBB代码LBB代码的解析,都是用正则表达式完成的。

3、模板
知道了正则表达式的功能,那么就可以知道模板了。什么是模板?举个例子吧?一般写网页用到了后台程序的时候,都是在网页里面插入程序代码。如PHP。这就是HTML和PHP的混写。这样的优点是读取速度快,缺点是如果大家分工合作做网站,那么非程序员就不会改网了。
而用模板,则可以达到分工的最合理化。美工只做页面,程序只写后台,然后再合起来。优秀的Jsp提供了自定义标签的功能很好地完成了模板功能。而主流的PHP如何做到呢?就是利用正则表达式来做到的。可以去网上下载一个PHPLIB,里面的PHP目录下有一个template.inc的源代码文件,那就是用PHP实现模板套用的类。

由于篇幅有限,这里只是简单地说一说这些内容,如果真的想学的话,还请看专门的教材。如光要讲清楚正则表达式就可以写上一本小书。
3.11. 记录所有的空语句

总是记录下for或者是while的空块语句,以便清楚的知道该段代码是漏掉了,还是故意不写的。

while ($dest++ = $src++)
; // VOID

3.12. 不要采用缺省方法测试非零值

不要采用缺省值测试非零值,也就是使用:

if (FAIL != f())
比下面的方法好:

if (f())

即使 FAIL 可以含有 0 值 ,也就是PHP认为false的表示。在某人决定用-1代替0作为失败返回值的时候,一个显式的测试就可以帮助你了。就算是比较值不会变化也应该使用显式的比较;例如:if (!($bufsize % strlen($str)))应该写成:if (($bufsize % strlen($str)) == 0)以表示测试的数值(不是布尔)型。一个经常出问题的地方就是使用strcmp来测试一个字符等式,结果永远也不会等于缺省值。
非零测试采用基于缺省值的做法,那么其他函数或表达式就会受到以下的限制:
· 只能返回0表示失败,不能为/有其他的值。
· 命名以便让一个真(true)的返回值是绝对显然的,调用函数IsValid()而不是Checkvalid()。

3.13. 布尔逻辑类型

大部分函数在FALSE的时候返回0,但是发挥非0值就代表TRUE,因而不要用1(TRUE,YES,诸如此类)等式检测一个布尔值,应该用0(FALSE,NO,诸如此类)的不等式来代替:

if (TRUE == func()) { ...
应该写成:

if (FALSE != func()) { ...

3.14. 通常避免嵌入式的赋值

有时候在某些地方我们可以看到嵌入式赋值的语句,那些结构不是一个比较好的少冗余,可读**强的方法。

while ($a != ($c = getchar()))
{
process the character
}
++和--操作符类似于赋值语句。因此,出于许多的目的,在使用函数的时候会产生副作用。使用嵌入式赋值提高运行时**能是可能的。无论怎样,程序员在使用嵌入式赋值语句时需要考虑在增长的速度和减少的可维护**两者间加以权衡。例如:

a = b + c;
d = a + r;
不要写成:

d = (a = b + c) + r;

虽然后者可以节省一个周期。但在长远来看,随着程序的维护费用渐渐增长,程序的编写者对代码渐渐遗忘,就会减少在成熟期的最优化所得。


4. 帮助与共享

4.1. 重用您和其他人的艰苦工作

跨工程的重用在没有一个通用结构的情况下几乎是不可能的。对象符合他们现有的服务需求,不同的过程有着不同的服务需求环境,这使对象重用变得很困难。
开发一个通用结构需要预先花费许多的努力来设计。当努力不成功的时候,无论出于什么原因,有几种办法推荐使用:

4.2. 请教!给群组发Email求助

这个简单的方法很少被使用。因为有些程序员们觉得如果他向其他人求助,会显得自己水平低,这多傻啊!做新的有趣的工作,不要一遍又一遍的做别人已经做过的东西。
如果你需要某些事项的源代码,如果已经有某人做过的话,就向群组发email求助。结果会很惊喜哦!
在许多大的群组中,个人往往不知道其他人在干什么。你甚至可以发现某人在找一些东西做,并且自愿为你写代码,如果人们在一起工作,外面就总有一个金矿。

4.3. 告诉!当你在做事的时候,把它告诉所有人

如果你做了什么可重用的东西的话,让其他人知道。别害羞,也不要为了保护自豪感而把你的工作成果藏起来。一旦养成共享工作成果的习惯,每个人都会获得更多。

4.4. 小型代码库

对于代码重用,一个常见的问题就是人们不从他们做过的代码中做库。一个可重用的类可能正隐蔽在一个程序目录并且决不会有被分享的激动,因为程序员不会把类分拆出来加入库中。
这样的其中一个原因就是人们不喜欢做一个小库,对小库有一些不正确感觉。把这样的感觉克服掉吧,电脑才不关心你有多少个库呢。
如果你有一些代码可以重用,而且不能放入一个已经存在的库中,那么就做一个新的库吧。如果人们真的考虑重用的话,库不会在很长的一段时间里保持那么小的。

4.5. 知识库

很多公司不清楚现有什么代码可用,而且大多数程序员仍然没有通过沟通他们已经做过了什么,或者一直在询问现存什么代码可用。解决这个的方法是有一个可用的知识库。
理想的情况是,程序员可以到一个WEB页,浏览或者查询打包的知识库列表,找到他们所要的。建立一个程序员可以自动维护的知识库系统,是一个很不错的做法。如果有一个专门的管理员来负责维护这个知识库,那当然更好。
另一种方法是自动的从代码中产生知识库的做法。把通用的类、方法和标头(subsystem headers)作为手册或者是知识库的一个条目。


5. 书写注释


5.1. 讲一个故事

把你的注释当作描述系统的一个故事。并且使得你的注释能被机器解析后,以固定的格式放到手册中去。类的注释是故事的一部分,方法的名称、方法的注释、方法的实现也是故事一部分。所有的这些部分编织在一起,使得人们在以后的时间里能够准确的知道你干了什么,为什么这么做。

5.2. 归档注释

注释的要归档才有意义,否则,假如在一个地方放一条注释描述你做了什么选择和你为什么这么做,只有考古学家才能发现这是最有用的信息。(如何归档另行规范)

5.3. 注释结构

工程的每部分都有特定的注释结构。 程序中的注释,这里给出示例作为规范,注释中以 * @ 为关键字的开始,以:为注释关键字结尾。

5.3.1. 预定义关键字

关键字 含义
Purpose 表示类、属**、方法要做些什么或者什么含义。
Package Name 类名
Author 作者
Modifications 修改记录(编号规则为“No”+日期+“-”+序号)
See 参考
Method Name 方法名
Parameter 参数名(包括类型)
Return 返回值(包括类型)
Attribute/Variable Name 属**/变量名
Type 属**/变量类型

5.3.2. 类的注释

/**
* @ Purpose:
* 访问数据库的类,以ODBC作为通用访问接口
* @Package Name: Database
* @Author: Forrest Gump gump@crtvu.edu.cn
* @Modifications:
* No20020523-100:
* odbc_fetch_into()参数位置第二和第三个位置调换
* John Johnson John@crtvu.edu.cn
* @See: (参照)
*/
class Database
{
……
}

5.3.3. 方法注释

/**
* @Purpose:
* 执行一次查询
* @Method Name: Query()
* @Parameter: string $queryStr SQL查询字符串
* @Return: mixed 查询返回值(结果集对象)
*/
function($queryStr){……}

5.3.4. 属**或变量注释

/**
* @Purpose:
* 数据库连接用户名
* @Attribute/Variable Name: mDbUserName
* @Type: string
*/
var mDbUserName;

5.3.5. if (0)来注释外部代码块

有时需要注释大段的测试代码,最简单的方法就是使用if (0)块:
function example()
{
great looking code

if (0) {
lots of code
}

more code
}
你不能使用/**/,因为注释内部不能包含注释,而大段的程序中可以包含注释。

5.3.6. 目录文档

所有的目录下都需要具有README文档,其中包括:
· 该目录的功能及其包含内容
· 一个对每一文件的在线说明(带有link),每一个说明通常还应该提取文件标头的一些属**名字。
· 包括设置、使用说明
· 指导人们如何连接相关资源:
o 源文件索引
o 在线文档
o 纸文档
o 设计文档
· 其他对读者有帮助的东西
考虑一下,当每个原有的工程人员走了,在6个月之内来的一个新人,那个孤独受惊吓的探险者通过整个工程的源代码目录树,阅读说明文件,源文件的标头说明等等做为地图,他应该有能力穿越整个工程。


6. 其他


· 采用面向对象的设计方法;

理由
毫无疑问这是最接近人们自然思维的方法,可能前期会觉得没有直接书写来得快,能否试着保留自己的看法?好戏在后头!

· 类的定义采用一个文件一个类,并且类名和文件名相同;

理由
o 越来越多的人接受了这种做法
o 事实证明这种方法使得项目的逻辑结构更清晰

· 类定义文件中,定义体之外不得出现诸如echo、print等输出语句;

理由
出现这样的语句,应该当做出现bug来看。

· 输出网页的页面不出现SQL语句

理由
这是n层结构的编程思想所致,每层的任务不同,虽然可以越权行使,可能这样很快捷,但我们不赞成这么干。

· 进行SQL执行的数据必须进行有效**检测

特殊符号:
对于MS SQL Server,’%_[ ] 这些符号都是在书写SQL语句中的特殊含义字符,在SQL执行前需要对这些字符进行处理。
脚本符号:
对于PHP脚本标记,如<??><%%><?php?><script lang<script language="php"></script>,在进入数据库前需要检测处理。
理由
这是数据库编程的一个约定,很多参考书上也是这么说,这里需要强调一下。

· 在HTML网页中尽量不要穿插PHP代码

循环代码和纯粹变量输出(类似于<?=$UserName?>)除外。
理由
o 需要说明的是我们工作的上游,页面设计者的工作,假如在页面中穿插代码,将破坏结构,这应当是我们需要避免的。
o 在这里的PHP代码只负责显示,多余的代码显然是不应该的。

· 没有含义的数字

一个在源代码中使用了的赤裸裸的数字是不可思议的数字,因为包括作者,在三个月内,没人它的含义。例如:
if (22 == $foo) { start_thermo_nuclear_war(); }
else if (19 == $foo) { refund_lotso_money(); }
else if (16 == $foo) { infinite_loop(); }
else { cry_cause_im_lost(); }
在上例中22和19的含义是什么呢?如果一个数字改变了,或者这些数字只是简单的错误,你会怎么想?
使用不可思议的数字是该程序员是业余运动员的重要标志.
你应该用define()来给你想表示某样东西的数值一个真正的名字,而不是采用赤裸裸的数字,例如:
define("PRESIDENT_WENT_CRAZY", "22");
define("WE_GOOFED", "19");
define("THEY_DIDNT_PAY", "16");

if (PRESIDENT_WENT_CRAZY == $foo) { start_thermo_nuclear_war(); }
else if (WE_GOOFED == $foo) { refund_lotso_money(); }
else if (THEY_DIDNT_PAY == $foo) { infinite_loop(); }
else { happy_days_i_know_why_im_here(); }
现在不是变得更好了么?


7. PHP文件扩展名


常见的PHP文件的扩展名有:html, .php, .php3, .php4, .phtml, .inc, .class...
这里我们约定:

· 所有浏览者可见页面使用.html
· 所有类、函数库文件使用.php

理由

· 扩展名描述的是那种数据是用户将会收到的。PHP是解释为HTML的。


8. PHP代码标记

统一使用<?php ?>,只输出变量时<?=$username?>

Nov 9
mysql出错了,以前往往靠猜.有了这张表,一查就出来了.方便不少.特共享于众

1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能



Nov 9
为下一代软件的设计模式和商业模板

2001年秋季网络泡沫的破灭标志着互联网的一个转折点。很多人得出结论说,互联网被过分夸大了,实际上,泡沫和随之而来的衰退看上去是所有科技革
命的共同特点。衰退是正处于上升期的科技准备占据中央舞台的特色。伪装者被逐出门外,真正的成名故事显示出他们的实力,开始理解一个事物与其他分开的原
因。


Web 2.0的概念开始于O’Reilly与 MediaLive
International的一个献计献策会。网络先锋人物和O’Reilly公司副总裁Dale
Dougherty指出,网络非但没有破灭,而且随着许多令人激动的新程序和网站让人惊讶的突然规律性出现,网络比以往的作用更重要。更重要的是,在互联
网灾难中幸存下来的公司看上去有一些共同的特点。.com公司的垮掉能在某种程度上标志互联网的转折点吗, web
2.0这样的称呼有意义吗?我们同意它的确是,web 2.0大会就这样诞生了。


在那以后的一年半时间内,web 2.0这个词就无疑已经生根,在Google上有超过950万个引用结果。但仍有大量对web 2.0含义的不同观点,一些人谴责这只不过是一个毫无意义的市场时髦吵作词汇(buzzword),其他人则认为它是一个新的传统概念。


本文旨在阐明我们通过web2.0想要表达的含义。


在最初的集体讨论上,我们用例子阐明了我们对web2.0的理解。


Web 1.0—> Web 2.0
DoubleClick—>Google AdSense
Ofoto(网上照片
贮存和共享服务的提供商)—>Flickr
Akamai(阿卡迈技术公司)—>BitTorrent
mp3.com—>Napster
不列颠百科全书在线—>Wikipedia
个人网站—>网络日志(博客、部落格)
evite—>upcoming.org and EVDB
域名投机买卖—>搜索引擎优化(SEO)
网页浏览—>每次点击成本
屏幕抓取—>网络服务
发表/出版—>参与
内容管理系统(CMS)—>维基(wiki)
目录(分类)—>标签(“folksonomy”)
粘性—>聚合


这个表格还可以不断往前进。但是,究竟什么可以让我们确定一种程序或道路是web 1.0,而另外一种则是web
2.0呢?(这个问题非常迫切,因为web 2.0
概念已经非常流行,许多公司把它当作市场时髦词汇了,却并不真正理解它的含义。问题特别困难,因为许多对时髦词汇有癖好的创业型公司绝对不是web
2.0。其他有些程序如napster和BT被认为是web2.0,但它们甚至不是适当的网络应用程序!译者注:应该是由于版权问题)
web 1.0有一些被成功故事以及最有趣的新应用程序证明的原则,下面是列表。
1,作为平台的网络


和其他许多重要的概念一样,web2.0没有坚实的分界线,但有重力的核心。可以通过一系列原则和实践把web 2.0形象化,并证明部分或所有原则都在离核心或远或近的地方。


上图显示了在FOO Camp的一次献计献策会上的web 2.0“meme map”。这是一项正在进行的工作,但显示了许多来自web 2.0核心的思想。

如,在2004年10月第一届web 2.0大会上,John
Battelle和我在公开讨论中列出了初步的一系列原则。第一个原则就是“作为平台的互联网”。虽然这也是web
1.0时代骄子网景公司的口号。更重要的是,web
1.0时代最初的2个标兵――DoubleClick和Akamai在对待“作为平台的互联网”方面都是先驱。


人们并不认为它是网络服务,但实际上,广告服务是第一个在互联网上普遍开展的服务,第一个广泛展开的组合(mashup、用另外一个词,就是获得了
currency of
late?不明白啥意思),每个广告横幅都是两家网站之间的无缝合作,向另外一台电脑用户传递整合的页面。Akamai也把网络看成平台,在堆栈的较深层
次,建立了透明的缓冲存储器和内容传递网络(CDN),减轻了带宽堵塞的压力。


即便如此,这些先驱提供有用的对比,因为后加入者在相同问题上,可以有更深入的解决方案、对新平台的特性理解更深刻。DoubleClick 和Akamai都是web 2.0先驱,然而我们也能看出,通过包含额外的web 2.0设计模式,认识更多可能性有多大可能。


让我们对3个案例演练片刻,了解一些关键因素的差别。


Netscape vs. Google


如果说Netscape是web 1.0时代标准的搬运工,google则当然是web 2.0时代标准的搬运工,因为他们的IPO(首次公开募股)界定了各自的时代。因此,让我们以对这两家公司及其各自定位的对比开始。


Netscape根据旧的软件范例构筑了“作为平台的互联网”,他们的旗舰产品是网页浏览器,一种桌面应用程序,他们的战略是利用在浏览器领域的统
治地位,来建立一个高价服务器产品市场。理论上说,控制了浏览器显示内容和应用程序的标准,这给了netscape一种微软在PC市场上的支配力。作为熟
悉的外延,和无马马车(horseless
carriage,常指老式汽车。第一辆汽车问世时,当时称之为‘无马马车’)构成的汽车相似,网景意图用(网面)webtop代替桌面
(desktop),并计划通过信息升级和向webtop推送applets程序来组装webtop,信息和程序则来自愿意购买网景服务器的信息提供商。


最终,浏览器和网络服务器都成了最普通不过的东西,价值转移到了通过互联网平台传递的服务上。


与此相反,google从一开始开始就是网络应用程序,从来不卖也不打包,但作为服务传递,顾客也为这种服务直接或间接付帐。没有旧软件工业的任何
困扰。没有预定好的软件发布,只有不断的改进。没有许可或出售,只有使用。没有通向其他不同平台、以使顾客在自己的设备上运行软件的端口,只有大量可升
级、运行开源操作系统以及自制程序的电脑,公司以外人士从来没有机会目睹。


实际上,google需要的能力是网景从未面对的:数据库管理。Google不仅仅是收集软件工具,它是专门的数据库。没有数据,这些工具都没有用
处,没有软件,数据则无法管理。软件许可和控制API――此前时代的力量杠杆――现在却不相干了,因为软件从来不需要被分发,而只是运作。同时由于没有收
集和管理数据的能力,软件的用处不大。实际上,软件的价值与它帮助管理的数据的范围和力度成比例。


Google的服务不是一台服务器――尽管它通过大量互联网服务器传输,也不是浏览器,尽管它通过用户使用浏览器来体验。它旗舰的搜索服务也不控制
内容。与电话很类似,不仅仅是在电话两端,而是在中间的网络。google就在浏览器、搜索引擎与目标内容服务器之间,就像一个在用户和在线体验之间的ENABLER或中间人。


Netscape和google都可以被描述为软件公司,前者很明显属于诸如lotus微软,甲骨文SAP,之类的软件世界,而google则是和另外一些互联网应用程序很类似,例如eBay Amazon, Napster,DoubleClick和 Akamai.

和google类似,DoubleClick是互联网时代真正的孩子。它把软件作为一种服务,在数据管理中有核心的能力。正如上面所说的,它是互联网服务
的先驱,甚至早在还没有互联网服务这个名称之前。但是,DoubleClick最终受限于其自身的商业模式。它引入的是1990年代的概念,即互联网是关
于出版,而非参与;广告商应该作最后决定,而非顾客;大小很重要,互联网正日益变得由MEDIAMETRIX和其他互联网广告评比公司界定的大型网站操
纵。
结果,DoubleClick骄傲的在网站上宣布:其软件已经成功执行超过2000次。

与此相比较,Yahoo搜索行销(前Overture)和google adsense早已为无数广告客户分别刊登了广告。

Overture和google的成功来自对Chris Anderson
到的所谓“长尾”的理解,也就是组成互联网内容大部分的小网站的集体力量。DoubleClick需要正式的销售合同,这使得它们的市场限制在少数几个大
型网站。Overture和
Google则知道如何在每个网页上放置广告。更重要的是,他们避开了出版商/广告代理机构的广告模式,诸如横幅广告和弹出广告,而采用最低限度打扰用
户、上下文相关、对消费者友好的文本广告。
Web 2.0训诫:通过杠杆作用,使消费者自助服务和算法数据管理延伸到整个互联网,到达边缘、而不仅仅是中心,到达长尾、而不仅仅是头部。

没有什么可惊讶的,其他web2.0成功故事也证明了同样的行为。eBay使得个人之间只有数美元的偶然交易变得可能,作为自动的中间媒介。
Napster(尽管因为法律原因关闭了)不是通过集中的歌曲数据库建立其网络,而是通过构建一个系统,让每个下载者也变成服务端,这样发展起了网络。


Akamai vs. BitTorrentt
类似DoubleClick,Akamai也是经过优化从头部开始做生意,而不是尾部;从中央,而不是边缘。它通过在中央铺平前往高要求网站的道路,对每个在互联网边缘的个人也有益处,它从这些中央网站得到利润。
和其他P2P运动先驱相似,BT(BitTorrent)为互联网去中心化采取了彻底的方法。每个客户端也是服务端,文件被分割,从多个方位传输,利用下载者的带宽向其他用户提供带宽和数据。实际上,文件越流行,服务的越快,因为有更多用户提供带宽和完整文件的部分。
BT
(BitTorrent)就这样证明了web
2.0的关键原则:越多人使用,服务就自动变得越好。而Akamai必须增加服务器方能改善服务,每个BT使用者把自己的资源带给其他人。有一个隐含的
“参与体系”把每个人的边缘连接起来,利用用户自身的力量。“参与体系”则是内在的企业道德,服务主要作为智能经纪人。
2,利用集体智慧


看上去,在Web 1.0时代诞生、并引领web 2.0时代潮流的巨人成功背后的重要原则就是这个,他们把互联网力量和利用集体智慧组合了在一起。


  • 超链接是互联网的基础。用户增加新内容、新网站,过其他用户发现网站内容和链接,这构成了网站结构的一部分。和大脑中的神经键很类似,通过复制或加强,联系变得越来越强大,链接的互联网有机成长,成为所有互联网用户集体行为的结果。


  • YAHOO!,第一个互联网伟大的成功故事,诞生初期是目录或链接目录,一个数千人辛勤工作的结果,后来是百万互联网用户。随着yahoo转入创造内容类型事务,它作为网络用户集体创作门户的核心地位保持了下来。

  • Google在搜索上的突破是pagerank,这使得它无可争辩成为搜索市场的领袖。这是一种利用互联网链接结构,而不仅仅是文档的特性的方法,提供了更好的搜索结果。


  • eBay的产品是其所有用户的集体活动,像网络自身,ebay响应用户活动,有机发展了起来。公司的地位在于使得用户的活动可能发生。更重要的是,ebay竞争优势基本来自于其买家和卖家,这使得任何新入门的提供类似服务的网站缺乏关注。



  • Amazon和竞争对手Barnesandnoble.com出售相同产品,他们收到相同的产品介绍,封面图,卖主的编辑内
    容。但是Amazon指定了一套科学的用户参与方案。他们按照用户浏览页面的次数,在每个页面上发出不同方式从参与邀请。更重要的,他们利用用户活动来创
    造更好的搜索结果。Barnesandnoble.com搜索只是指向公司自己的产品或赞助商产品。Amazon总是以“最流行”、不仅基于销售,而是其
    他因素的实时计算,AMAZON内部称之为产品周围的“流动flow”。有了按照用户参与次数的订单,因此它超越竞争者也不奇怪了。
    现在,熟悉这种洞察力的创新公司可能延伸的更远,正在互联网上写下自己的标志。


  • 维基百科,任何人均可编辑的在线百科全书。基于信任的试验,适用了Eric Raymond的格言,“有了足够的眼球,所有的bug都很肤浅”。维基百科早已是100强网站,很多人认为它不久进入前十。这是动态内容创作方面的深刻改变。

  • del.icio.us 和
    Flickr之类的网站,这两家公司最近收到广泛关注,是folksonomy概念的先驱,一种任何人均可自由选择关键词(标签)的分众分类。Tag考虑
    到大脑自身使用的多重选择和重叠的联系,而不是硬梆梆的分类。在规范的例子中,一幅flickr小狗的图片可能被标签为“小狗”(puppy)和可爱
    “cute”,考虑到了沿自然轴的检索产生了用户的活动。

  • 协作垃圾邮件过滤产品,例如Cloudmark聚合了email用户认为哪个是、哪个不是垃圾邮件的决定,胜过依靠自身分析邮件内容的系统。

  • 最伟大的因特网成功故事就是从来不打自己产品的广告。他们的采用病毒营销(viral marketing),这就是说,从一个用户直接到另外一个用户的推荐宣传。你甚至可以推断出,如果一个网站或产品依靠广告才让人知道,那它就不是web 2.0、
  • 即使许多互联网的基础设施――包括linux、 apache 、MySQL、 Perl, PHP,
    或Python等涉及大多数网络服务器――依靠开源的个人生产(peer-production)方式,但他们自身是集体、net-enabled智慧的
    例子。SourceForge.net有超过10万个开源软件项目。任何人都可以增加项目,任何人也可以下载和使用代码。作为用户行为的结果,新项目从边
    缘迁移到中央,一个有机的软件采用过程几乎完全依靠病毒营销

    训诫:来自用户贡献的网络影响是占据web 2.0时代市场主导地位的关键。

  • Blogging与大众智慧


    Web 2.0时代被高度吹捧的一个特点是blogging的兴起。个人主页在互联网初期就开始活跃,个人日记和每日评论专栏比这个时间还要长,那么这一切有什么值得大惊小怪的呢?
    最基本的,blog只是日记形式的个人主页。但是正如Rich Skrenta指出的,blog按时间顺序的组织形式“看上去好像是微不足道的差异,但它推动了一个完全不同的传输、广告和价值链。


    造成这些区别的其中之一就是被称为RSS的技术。RSS是自早期黑客认识到CGI可以被用来创造数据库支持的网站以来,互联网基础体系中最有意义的
    进步。RSS允许人们不仅是链接到一个页面,而是订阅它,当每次有页面更改时,都会有通知。Rich
    Skrenta称之为“增加的(incremental)互联网”,其他人则称之为live web(活的互联网)。


    当然,现在“动态网站”(也就是数据库支持的网站,有动态产生的内容)在过去10年里代替了静态网页。Live
    web所说的动态不仅仅是页面,而是链接。指向一个weblog的链接可能指向一个不停在变化的页面,每一篇单独的条目则有一个永久链接
    (permalinks),每个更改都有通知。就这样,RSS feed是比书签或单独页面链接要强大的多的链接。



    RSS也意味着浏览器不再是浏览网页的唯一工具。一些RSS聚合器,例如bloglines是基于网络的,其他是桌面客户端,还有一些则允许用户通过便携式设备订阅不断更新的内容。


    RSS现在不仅被用来发布blog新条目通知,也被用做各种数据更新,包括股票报价、天气数
    据和相片的有效性。这种应用实际上是RSS本源的一种回归:RSS诞生于1997年,来自Dave Winer提出的Really Simple
    Syndication技术,一般用来推送blog更新。网景公司的”Rich Site
    Summary则允许用户用不断更新的数据流创建自定义的Netscape主页。
    Netscape后来失去兴趣,这种技术由blog先驱Winer 的公司Userland继续发展。在目前的应用程序中,我们看到,尽管这是父母双方的遗产。


    但是,RSS只是blog区别于普通网页的特点之一。Tom Coates有关于permalink意义的陈述



    看起来,它不过是微不足道的功能,但却是使得blog从一个易于出版现象
    转变为重叠群落的对话混乱(a conversational mess of overlapping
    communities)。它使得直接表示他人网站上非常明确的帖子第一次变得相对地容易,以及讨论。讨论形成、聊天形成了。结果,友谊形成或变得更加确
    立。Permalink是第一次,也是最成功的在blog之间搭建桥梁的尝试。


    在许多方面,RSS和permalink的联合给NNTP增加了许多特
    性,在HTTP网络协议上。Blog圈可以被理解为早期互联网某些事物新的、对等的等价物,例如Usenet、BBS和会话水坑
    (conversational watering
    holes)等。人们不仅可以订阅彼此的网站、轻易在一个页面链接个人评论,同时通过trackbacks机制,当其他人链接到此页面时,他们可以看到并
    进行回应,不管是通过相互链接还是增加评论。


    有趣的是,双向链接是早期超文本系统的目标,例如Xanadu。超文本纯化论者(purists)庆祝trackback,认为这是通往双向链接的
    一步。但是注意,trackback不是完全的双向,他们实际上(潜在的)是对称的单向链接,创造了双向链接的效果。这其中的区别看起来似乎很小,但在实
    践中却很大。社会性网络系统――例如Friendster, Orkut和
    LinkedIn,他们要求得到接受者的承认以建立链接――他们和互联网都缺乏相同的规模可伸缩性。正如flickr合创者Caterina
    Fake指出的,注意力只是巧合的相互作用。(flickr就这样允许用户设立监视表――任何用户都可以通过RSS订阅其他用户的照片。注意力的目的是得
    到通知,但不必链接)


    如果web
    2.0的核心之一是利用集体智慧、将互联网变成某种意义上的全球大脑,那么blog圈就是前脑中不断呓语的等价物,我们在大脑中听到的声音。它可能不反映
    大脑深层次经常的无意识的结构,但却是有意识思想的等价物。作为有意识思想和注意力的反映,blog圈开始拥有强大的影响。


    首先,因为搜索引擎利用链接结构,以帮助预测有用的页面。和大多数多产、及时的linker相似,blogger在修正搜索引擎结果方面有不对称的
    角色。第二,因为blog社区太过依赖参考自己,blogger关注夸大可见度和能力的其他人。批评家谴责的回响室(echo
    chamber)也是一个放大器(amplifier )。


    如果这仅仅是放大器,Blog将变得无趣。但就像维基百科,blog也利用集体智慧作为某种过滤器。James Suriowecki 所说的“大众智慧”开始产生效果了。PageRank产生的结果比其他任何个人文档分析都要好,blog圈的集体关注决定价值取向。


    主流媒体可能认为个人blog是竞争者,其实真正让他们失去勇气的是:他们的竞争对手是整个blog圈。这不仅仅是网站之间的竞争,而是商业模式之间的竞争。Web 2.0世界也是Dan Gillmor /所称的“自媒体(we, the media)”。在这里,此前的听众决定什么才是重要的,而不是后台的少数人。



    ,数据是下一个Intel Inside


    每一个重要的互联网应用程序,到目前为止,都由专门的数据库支持。Google的网络爬虫,Yahoo!的目录(和网络爬虫).Amazon的产品
    数据库,eBay的产品和商家数据库,MapQuest的地图数据库,Napster的歌曲库。正如Hal
    Varian去年在一次个人谈话中谈及的,sql是新的html。数据库管理是web 2.0公司的核心能力,到这样的程度以至我们有时候用”infoware提到这些公司,而不是software(软件)。


    这个事实引发了一个关键问题:谁拥有数据?


    在互联网时代,人们可以发现许多例子,控制数据库从而控制市场并获得巨额利润。Network
    Solutions公司(后来卖给Verisign),最初由政府批准他们在域名注册上的垄断,成为互联网最早挣大钱的公司之一。我们已经讨论通过控制软
    件API的商业优势,这在因特网时代更加重要,控制数据源则不是,尤其是如果那些数据源创造起来非常昂贵或有责任通过网络影响增加回报。


    看看MapQuest, maps.yahoo.com,
    maps.msn.com,或者maps.google.com,等地图网站每张地图底部的版权通知,你会看到这么一行:“地图版权归NavTeq,
    TeleAtlas”或者是新的卫星图片服务商,“图片版权归Digital
    Globe”。这些公司在数据库商进行了大量投资(据报道,仅NavTeq公司就投资7500万美元建立简历街道地址和方向数据库。Digital
    Globe花费了5亿美元发射自己的卫星,以改进政府提供的卫星图片。)NavTeq甚至于模仿英特尔的intel inside
    的logo:装有导航系统的汽车,留下”NavTeq Onboard的烙印。数据的确是这些应用程序的Intel
    Inside,是那些软件基本来自开源代码或经过改良的系统的唯一来源。


    目前地图市场激烈的竞争证明,失败者如何理解拥有应用程序核心数据重要性程度,最终减低其竞争地位。MapQuest从1995年开始地图服务,是
    此行业的先驱。而当yahoo和微软google决定进入此行业时,他们只需要获得相同数据的许可,就可以提供具有竞争性的服务。


    但是,与此相反的是amazon的地位。和Barnesandnoble.com等竞争者类似,它最初的数据库来自ISBN注册提供商R.R.
    Bowker。但与MapQuest不同的是,amazon增加了数据,增加了诸如封面图片、目录、索引和样品材料等出版商提供的数据。更重要的,他们利
    用用户注释这些数据。10年后,amazon,而不是Bowker
    ,成为书籍目录资料的主要来源,也是许多读者、学者和图书管理员的参考资源。Amazon還引入了他们自己与ISBN相对应的产权标志-ASIN。
    Amazon就这样有效地包含和扩展了他们的数据提供商。


    设想一下,如果mapquest做了同样的事情,让用户注解地图和方向,增加价值。只通过颁发基础数据许可,就会让竞争者进入这一市场更加困难。


    Google
    maps为应用程序卖家和数据提供商进行竞争提供了一个鲜活的实验室。Google的计划模式导致许多增值服务的产生,以组合形式出现,用其他可接入因特
    网的数据源链接google地图。Paul
    Rademacher的housingmaps.com,就把google地图和Craigslist公寓出租、家庭购买数据联合了起来,创造了一个互动
    的住宅搜索工具,这是类似mashup(译注:似乎可解释为组合)的优秀例证。


    目前,这些mashup大多数是创新的试验,由黑客们完成。但是,企业家的活动紧跟其后。人们发现,google至少已经为一个种类的开发者占据了
    数据源的地位,并把他们自身作为受欢迎的中介插入。随着数据提供商和应用程序卖主都认识到,某些种类的数据将变成web
    2.0应用程序的基础,我们将在接下来几年内看到他们发生战斗。


    竞赛在我们自己某些类型的核心数据:位置、身份、公共事物日历,产品标志符和自己的命名空间。很多花费巨资创造数据的案例中,可能有机会使得
    Intel
    Inside模式运转,在数据只有一个来源的情况下。在其他方面,第一家通过用户聚合、到达临界容量的公司将是获胜者,并将聚合的数据转为系统服务。


    例如,在身份领域,PayPal,
    Amazon’的1-click以及其他数百万用户的交流系统,都将是建立网络范围身份数据库合法的竞争者。(在这点上,Google最近尝试用手机号码
    作为Gmail身份标志符可能是其踏入电话系统的一步。)同时,Sxip等公司正在探索联邦身份的潜在可能,试图找到某种可以提供无缝的web
    2.0身份子系统的分布式1-click。在日历领域,EVDB通过wiki式的参与机构,尝试建立世界最大的共享日历。
    在关于数据方面,必须指
    出另外一点,这就是用户关心的隐私和数据权利问题。在很多早期网络应用程序中,版权很宽松。例如,Amazon认为(但没有强迫),任何提交给站点的评
    论,人们可以在其他地方再次张贴相同的内容。然而,随着公司开始认识到控制数据可能是他们竞争优势的主要来源时,尝试控制将有所增加。
    和专有软件
    (proprietary
    software)的增加导致自由软件运动类似,我们希望专有数据库也能在接下来10年内引发一场自由数据运动。我们已经可以在诸如维基百科、
    Creative Commons等开源数据项目以及Greasemonkey等软件项目中,发现了这一趋势的早期征兆。

  • ,软件发行周期的终结
    正如在上面关于google和netscape的讨论中所指出的,互联网时代定义特性之一就是,它是以服务方式传递,而不是产品。这导致这样一个公司在商业模式方面,出现很多根本性的改变。

    转(Operations)必须成为核心竞争能力。Google或yahoo的产品开发专家必须配有一个每日运转专家。因此,基本原则就是把软件从一种产
    品转为服务,除非每天都要维护,否则软件不会停止执行任务。Google必须不停的搜索网络、更新其索引,不断过滤垃圾链接以及影响其结果的其他尝试,不
    断和动态的对数百万人异步查询进行反映,同时给他们匹配的文本广告。
    Google的系统管理、网络和负载平衡技术可能比搜索运算法更加机密,这也就不是偶然了。Google在这些程序自动化方面的成功是面对其他竞争者的优势所在。
    诸如Perl, Python, PHP
    现在的 Ruby等脚本语言在web2、0公司扮演巨大角色也不是偶然。Sun公司第一个网络管理员Hassan Schroeder
    Perl描述为“因特网的输送带(the duct tape of the
    internet)”。动态语言(经常称作脚本语言,被软件工件(software
    artifact)时代的软件工程师藐视)是系统和网络管理员的、也是建立需要不停变化的动态系统的应用程序开发者上乘工具。


    户必须被视作共同开发者,在开放源码发展实践的反思中(即使软件不大可能在开源协议下发行)。开源格言:“早发行,常发行”,这实际上已经变成更加激进的
    “永远beta版”,产品开放式发展,每个月、每周甚至每天都有新特性产生。因此,Gmail、google
    maps、Flickr、del.icio.us以及其他类似产品可能好几年都带有beta的标志,也就不是意外了。
    实时监视用户行为,只是发现使用了哪些新特性,怎么使用,从而成为另外一个必须的核心能力。一个大型在线服务网络开发人员这么评论到:“我们每天在网站的某些部分增加2到3个新特性,如果用户不接受,那么我们就取消。如果他们喜欢,我们将扩大到整个网站。”
    Flickr
    开发人员Cal
    Henderson最近披露,他们每半个小时就配置一些新的特性。这明显是一个完全不同的发展模式!并非所有网络程序都像flickr这样的极端,大多数
    网站程序有一个与PC或客户服务器时代完全不同的发展周期。因为这个原因,最近的ZDnet社论总结出,微软不会击败google:微软的商业模式是依靠
    人们每2年或3年更新其计算环境,而google则依靠人们每天在计算环境中发现新东西。
    微软善于学习其竞争对手,但这次就没有这样的问题了,竞争将要求微软(以此延伸到现在其他的软件公司)变成一个完全不同的公司。诞生之初就是web 2.0的公司有其先天优势,他们没有旧模式(以及相应的商业模式和收入来源)的束缚。
    5,轻量级规划模式
    一旦网络服务的思想变得为人熟知,有着复杂网络服务、为分布式程序创造高度可信赖规划环境的大公司将进入竞争。
    但是,和网络抛弃其大部分超文本理论而成功相似,用简单的实用主义取代理想主义设计,RSS因为其简单性,可能是最为普遍的网络服务。而复杂的合作网络服务还没有得到广泛配置。
    与此相似,Amazon用两种方式提供网络服务:一个附着于SOAP形式网络服务堆栈,另外一个只通过HTTP提供XML数据,在轻量级方式中有时候被称为REST. 高端的B2B链接都使用SOAP堆栈,而95%都使用轻量级的REST服务。
    在其他“有机的”网络服务中,也有相同的问题。Google最近的地图服务就是恰当的例子。Google 地图简单的AJAX界面迅速被黑客所解释明白,然后他们混合这些数据,形成新的服务。

    地图相关的网络服务出现有一段时间了,从诸如ESRI 、MapQuest以及微软MapPoint
    等地理信息系统卖家出现。但是google地图由于其简单性,在全世界燃起了一场大火。体验任何正规卖家支持的网络服务都需要双方正规的合同,
    google地图贯彻的途径是让数据为人们所利用,黑客不久就发现方法重新使用这些数据。
    这里有几个很有意义的训诫:
    支持允许松散连接系
    统的轻量级程序模式。企业赞助的网络服务堆栈的复杂性,就是为了使紧密的链接变得可能。在很多情况下这是必要的,但大多数有趣的应用程序实际上可以保持松
    散、甚至脆弱的连接。Web
    2.0的精神与传统的IT精神大相径庭!想象一下聚合,而不是调和。例如RSS和基于REST的网络服务等简单的网络服务,当它到达连接的另外一端时,是
    关于向外的聚合数据,而不是控制发生了什么。这种思想是互联网本身的基本原理,是端到端(end-to-end)的反映。

    为hackability和remixability设计


    诸如原始网络、RSS
    、AJAX等系统都有一些共同点:重新使用的门槛极其低。很多有用的软件实际上是开放源代码的,即使它不是,在知识产权保护方面障碍也不多。网页浏览器的
    “查看代码”使得任何用户都有可能复制他人的网页,RSS是被设计用来使得用户可能观看他/她想要的内容,当需要时,不是由于信息提供商的命令;最成功的
    网络服务是那些最容易吸收新的方向,甚至是创造者自己也没想到的。与更加典型的“版权所有”相比,通过“创作共用”流行起来的“保留部分版权”就是有用的
    路牌,
    集体创新
    轻量级商业模式是轻量级程序和链接的自然衍生物。Web
    2.0的精神是易于重新使用。例如ousingmaps.com这样的新服务就是通过简单组合两个已经存在的服务。Housingmaps.com还没有
    商业模式,但是对很多小型公司来说,google adsense(也可能是Amazon的associates
    fees,或者是两者)提供了同等的利润模式。


    这些例子给另外一个web 2.0原则提供了洞察力,我们称之为
    集体创新。当必需成分很丰富时,你可以很简单的以新奇或有效的方法将他们组合在一起,创造新的价值。和PC革命为组装必需硬件提供了很多创新机会类似,像
    DELL这样的公司就从这样的组装中产生了学问,从而击败那些商业模式需要产品发展创新的公司。我们相信web
    2.0将给很多公司提供机会,在利用和整合其他人提供的服务方面做的更好,击败竞争对手。
    6,超越单一设备的软件
    Web
    2.0另外一个应该引起关注的特性是,它不再局限于PC平台。微软资深开发者Dave
    Stutz在给微软的离别建议中指出,“在单一设备之上编写的有用软件,将在未来很长时间内,掌握高利润。Useful software
    written above the level of the single device will command high margins
    for a long time to come.”
    当然,任何网络应用程序都可以被视作超越单个设备的软件。毕竟,即使最简单的网络程序也涉及到了两台电脑:主机服务器和用来浏览的电脑。正如我们讨论过的,作为平台的网络的发展将这种思想延伸到了由多台电脑组成的服务合成程序。
    但是,由于在很多web 2.0领域里,2.0-ness并非新东西,而是网络平台真实潜力的实现,这个短语在观察如何为新平台设计应用程序和服务方面,给了我们关键的洞察力。

    目前为止,iTunes是这个原则最好的例证。iTunes无缝地从手持设备到达后端的网络,PC扮演本地CACHE和控制台的角色。此前有很多将网络内
    容带到便携式设备上的尝试,但是iPod/iTunes组合是完全跨越多设备的应用程序之一。TiVo是另外一个很好的例子。


    iTunes 和 TiVo也证明了其他很多web
    2.0的核心原则。他们本质上不是网络应用程序,但是他们利用了网络平台的力量,使之无缝、并几乎它们基础构造的一部分。数据管理明显是它们的心脏。他们
    是服务,而不是应用程序包(尽管在Itunes的情况下,它可以被用作打包程序,只管理用户的本地数据)。更重要的是,TiVo 和
    iTunes都显示出了利用集体智慧的萌芽,尽管在各自的例子中,他们的试验还在与IP通道(IP
    lobby)进行战争。iTunes只有一个受限制的参与构建,尽管最近podcsting的加入充分改变了这种因素。
    这就是web
    2.0其中的一个领域,随着越来越多的设备被连接到新平台,我们将看到一些伟大的变革。当我们的电话和汽车不是消费数据而是报告数据时,还将出现什么样的
    应用程序?实时的交通情况监视、快闪暴走族(flash mobs)、公民媒体,这些只是新平台能力的少数几个早期信号而已。


    Web 2.0投资论文
    风险投资商Paul Kedrosky写道:关键是在你与大众意见不一致的地方,发现可行的投资。
    观察web 2.0的每个侧面是如何包括了与多数人不同的意见是很有趣的事情:每个人都强调保持数据隐私, Flickr/Napster等却使它公开化。这不仅仅是为不同意而不同意,这是让从分歧中找出有用东西。Flickr建立社区,napster建立连接宽度。

    察这个的另外一条道路是,成功企业都放弃了一些昂贵,但被认为在免费获得曾经昂贵的有价值的东西方面很重要。例如,Wikipedia放弃了中央编辑控
    制,换来了速度和规模。Napster放弃了“目录”的思想,得到规模。Amazon放弃了物理店面的思想,换来的是服务全世界。Google(最初)放
    弃了大客户思想,得到了80%
    需求得不到满足的人。在下面这句话里,颇有一些合气道(以敌力制敌)的意思,“你知道,你是对的,世界上任何人绝对都能更新这篇文章。猜什么呢,这是你的
    坏消息?”Nat Torkington


    7,富用户体验
    早在Pei Wei1992年发明的
    Viola浏览器中,网络就被用来在浏览器中传输applets以及其他活动内容。1995年,java的引入给这样的applet传输加了外框。
    JavaScript和DHTML随后被以轻量级方式引入,以提供客户可编程性和富用户体验。几年前,Macromedia发明了富因特网应用程序
    (Rich Internet Applications)这个词汇(开源Flash竞争者Laszlo
    Systems也使用这个词汇),以突出Flash的能力:传输的不仅是多媒体内容,而是还有图形用户界面方式的应用程序体验。
    但是,网络传输全
    尺寸应用程序的潜力并没有对主流形成打击,直到Google推出了Gmail,接着就是Google地图,基于web的应用程序,有富用户界面和与PC等
    同的相互作用。Google使用的技术被称作AJAX,在网络设计公司Adaptive Path的Jesse James
    Garrett写的一篇文章中,他这样写道:
    Ajax不是一项技术。它其实是好几项技术,每一项都自己繁荣,然后以新的强大方式走到一起了。Ajax包含了:
    使用XHTML CSS的基于标准的陈述
    使用Document Object Model的动态显示和互动
    使用XML 和 XSL数据交换和处理
    使用XMLHttpRequest的异步资料检索
    JavaScript把他们所有绑定在了一起。
    Ajax也是诸如Flickr等web 2.0应用程序的关键组成部分,37signals应用程序的大本营和基础。也是Google的Gmail和Orkut的基础。我们进入了一个用户界面创新的空前时期,网站开发者最终能够建立和PC应用程序一样丰富的网络应用程序。

    趣的是,很多现在被探索的能力已经有不少年历史,在90年代末期,微软和网景都想象到了现在才实现的一些能力,但是他们对标准的战争使得跨浏览器程序变得
    困难。只有到微软最终打败其他浏览器,才有事实上的单一浏览器标准可以写入,这种应用程序才变得可能。Firefox再次打起浏览器市场大战的时候,至少
    目前我们还没有看到导致阻止90年代发展的、浏览器标准的毁灭性竞争。
    我们将在接下来几年里看到许多新的网络应用程序,包括真正新奇的和PC程序在网络上的重新导入。每个平台的改变也都创造了一个机会,即改变在此前平台占主导地位的程序。
    Gmail
    早已给电子邮件带来了有趣的创新,把web的力量(易于到达、深刻的数据库能力和可搜索性)和在可用性上接近PC的用户界面接合在一起。同时,其他PC平
    台上的邮件客户端正在从另外一端一点点解决问题,增加了IM和呈现能力(presence capabilities)。我们离整合了EMAIL,IM
    手机优点的通信客户端还有多远?使用VOIP技术,给网络程序的富能力增加语音能力。竞赛还在继续。
    看web
    2.0怎么重制地址本很容易。Web
    2.0样式的地址本将把本地电脑或手机的地址本仅仅视作你明确让系统记住的联系人仓库。同时,基于web、Gmail式的同步代理将记住每一个发出或收到
    的信息、每个电子邮件地址和使用过的电话号码。并且,具有社会性网络启发,以决定当本地找不到答案时,用哪个来代替。如果没有答案,系统将在更广阔的社会
    性网络进行查询。
    Web 2.0文字处理将支持wiki式的集体编辑,而不仅仅是单独的文档。但是,它也将支持我们在PC文字处理上的富格式。Writely是这样程序的一个好例子,尽管它还没有引起广泛注意。
    Web 2.0的革命也将不会局限在PC应用程序上,Salesforce.com证明网络可以如何用来作为服务传输软件,在企业级应用程序例如CRM.方面。
    新入者的竞争机会是全力发掘web 2.0的潜力。胜出的公司将学习用户,创造应用程序,使用参与机构,不仅在软件界面,而且在共享数据的丰富程度上建立优势。
    Web 2.0公司核心竞争能力
    在探索上述的7个原则的过程中,我们突出强调了web 2.0的一些原则性特点。我们所举的每一个例子都证明了一个或多个这些关键原则,但是也可能丢失了其他的。以下总结web 2.0公司的核心竞争能力,作为结尾。
    •服务,而非软件包,具有高效低成本的可扩展性
    •控制独特、难以再造的数据源,越多人使用,就越丰富
    •把用户当成合作开发者一般信任
    •借力于集体智慧
    •从消费者自身服务中产生长尾优势
    •超越单一设备层次的软件
    •轻量级的用户界面、开发模式和商业模式



  • 分页: 25/29 第一页 上页 20 21 22 23 24 25 26 27 28 29 下页 最后页 [ 显示模式: 摘要 | 列表 ]