开会时联想到McLuhan,胡乱记下

“媒介即信息”。


1、媒介本身作为一个整体,即便不传达具体有意义的内容,也能在人的心中留下强烈印象。也就是说,人感受到了媒介的整体刺激。


2、人倾向于从整块的信息中摘取“需要的”部分。所谓“需要的部分”,包括
    1)易于理解的
    2)未接触过的
    3)具有强烈冲击力的
    4)清晰的
    5)对自己有利的
    6)对自己有害的


3、人对媒介信息的接受,通过感官刺激到心理刺激来完成。刺激强度:视觉>听觉>触觉。感官之间会互相影响刺激效果。例如,较为清晰的画面,能使配音听起来更易理解。又,带有字幕的电影,也较易使人理解。这就如同在稍微摇晃的公共车上,只需一个手指接触拉环即可保持身体平衡。

这个梦有点意思

     梦到与人商量,要起诉日本天皇。谈到理由,说“他即位时,居然没有交印花税。”

男儿膝下有黄金

     偶上论坛,看见这么一个帖子标题:“菜鸟问题,裸体雪地跪求解答,在线等待。”


     冰天雪地不着衣衫,已经是怎样一种惨状,只差没有学二祖当年断臂求法了。嗷嗷待哺的求知之心,何其可贵!


     然而,他求的可不是举世无双的高深佛法,仅仅是“菜鸟问题”罢了。根据我数年以来观察的经验,此类问题,多半可以从开发工具文档、网站文章或是搜索引擎中轻易找到答案。不过,这位“菜鸟”兄弟,和其他很多“菜鸟”一样,选择了不假思索、降格以求。


     为了一个自己稍动脑筋即可解决的问题,不惜宽衣解带,不惜委身冰雪,甚至不惜扑通跪下——要知道,男儿膝下有黄金,这一跪,是多大的委屈!值得吗?


     仿佛听见他说“值!”


     这就是网络社区中低层次问题不断重复出现的原因。

他们心中有恨,我心中有爱

      他们威胁我,要报警,因为我制造了噪音。那“噪音”对我来说,是虚无飘渺的,因为我根本就是一个好静的人。


      我不想吵架,忍了,心中却有些不舒服。此时,强烈地感受到什么叫做“外人”——外人,就是不容于某个范围之内的人。外人总是可恨的,闯入者的身份令他们必须被恨之入骨。如我们,对于这个大院,大约也算是“外人”吧?每日早出晚归,往往并不留意左邻右舍、楼上楼下的态度,而他们也总是隐身在猫眼之后,时时在监视外人的举动。


      Frost的诗说:围墙好邻居关系就好。无奈围墙、铁门以及一切能隔音的阻碍物,都无法挡住那股恨意,奈其何兮!


      但我心中仍有爱,愿上天祝福这些怀恨在心的人,也愿上天恕他们的罪。

无题

思想空白,无言。

从VB到VB.NET——VB6程序员如何转向.NET

 (发表于《CSDN开发高手》2003年9月号)


作者 Mahesh Chand


翻译 韩磊


 


Visual Basic .NETMicrosoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0/VB.NET之间的区别,阐述如何利用VB.NET编写简单的应用程序。


1.1 什么是 VB.NET? 

VB.NET
VB6.0的后续版本。Microsoft推出全新的编程和操作系统Framework——.NET,支持多种语言利用公共.NET库开发应用程序,这些应用程序在.NET Framework上运行。使用Visual Basic.NET Framework上编程,这就是VB.NET


首先,让我演示在VB.NET中写最简单的控制台程序:Hello World



1.2 Hello, World!

Hello World!”是初学者学习Windows编程的代表性程序。我们的第一个程序就叫做“Hello VB.NET World!”。该程序在控制台输出一句话:“Hello VB.NET World!”,代码如下所示:



代码 1.1: Hello VB.NET World例子

Imports System


 


Module Module1


    Sub Main()


        System.Console.WriteLine(“Hello VB.NET World!”)


    End Sub


End Module 


 


1.3 VB.NET 编辑器和编译器

你可以在记事本或VS.NET IDE等任意文本编辑器中撰写上述代码,然后保存为HelloWorld.vb 

代码编写完成之后,要么在命令行、要么在VS.NET IDE中编译它。在Microsoft .NET Framework SDK中已经包括VB.NET编译器vbc.exe[1],从IDE或是命令行都可以调用。要从命令行编译HelloWorld.vb,请在命令行窗口输入



vbc HelloWorld.vb /out:HelloWorld.exe /t:exe


编译结束后,HelloWorld.exe被创建到当前目录下。在资源管理其中双击图标或在命令行执行,程序正确地运行了。祝贺你进入VB.NET开发者的行列。


 


Imports 语句 


如你所知,大部分的.NET类型都在名字空间(namespace)中定义。Namespace是定义和管理类别的范畴。察看.NET Framework Class Library,可以看到数以百计的namespace。例如,System namespace就包括了ConsoleObject等类型定义。如果想使用Console类,需要用Imports指令导入System namespace。如下所示:


Imports System

甚至可以明确地调用namespace而无需用Import导入。下面的例子展示了不用Import的“Hello World!”程序:


代码1.2: Hello VB.NET World例子

Module Module1


    Sub Main()


        System.Console.WriteLine(“Hello VB.NET World!”)


    End Sub
End
Module


1.4 解析 “Hello VB.NET World!”

程序第一行是:



Imports System; 

System namespace
定义了Console类,该类用于读写控制台(命令行窗口)。

然后你定义了一个module

Module Module1



End
Module

所有的VB程序都包括一个Main()方法,即应用程序入口点。在例子程序中,我们调用Console.WriteLine()向控制台写入“Hello VB.NET World!”:



    Sub Main()


        Console.WriteLine(Hello VB.NET World!)
    End Sub


WriteLine()
方法归属于Console类,它负责向控制台写一个带有行结束符的字符串。如前所述,Console类定义于System namespace,你通过直接引用来控制类成员。


Console类负责读写系统控制台。读控制台输入用ReadReadLine方法,向控制台输出用WriteLine方法。


1.1 Console类定义的方法
























方法


用途


例子


Read


读入单个字符


int i = Console.Read(); 


ReadLine 


读入一行 


string str = Console.ReadLine();


Write 


写一行


Console.Write(“Write: 1”); 


WriteLine 


写一行,并带上行结束符


Console.WriteLine(“Test Output Data with Line”); 


 


1.5 VB.NET有什么新特点? 

作为VB6.0的后续版本,VB.NET更加稳定,而且完全面向对象。也许你还记得,VB6.0部支持继承、重载和接口,所以不是真正面向对象的。而VB.NET则支持这些面向对象特性。VB6.0有两个薄弱环节——多线程和异常处理。在VB.NET中,开发多线程应用和使用C++/C#别无二致,结构化异常处理也得到支持。稍后我们会详细解释这些特性。



下面是VB.NET的特性列表——


·面向对象的编程语言。支持继承、重载、接口、共享成员和构造器。
·支持所有的CLS特性,如存取控制.NET类、与其它.NET语言交互、元数据、公共数据类型、委托等等。
·多线程支持。
·结构化异常处理。
 
1.6 名字空间与集合 

前面讨论了我们的第一个VB.NET程序。该程序中首先引人注意的是名字空间(namespace)。在.NET参考文档中,你会发现每个类都归属于某个namespace。那么,namespace到底是什么?


一个namespace是类和组件的逻辑组合,其目的在于将.NET class按类别定义。微软借用了C++ class packaging概念:namespace来描述这种组合。.NET Framework中的组件被称为集合(assembly)。全部.NET代码在数百个库文件(DLL)中定义。Namespaceassembly中定义的类组织起来。一个namespace可以包括多个assembly,一个assembly也可以在多个namespace中定义。
 
namespace
树的根节点是System namespace。在.NET Library中,每个class都在一组相似的类别中定义。例如,System.Data namespace只包括数据相关类。同样,System.Multithreading只包括多线程类。


在使用.NET支持的语言(如C#VB.NETC++.NET等)创建新应用程序时,你会注意到每个应用程序都被定义为一个namespace,而所有的class都归属于这个namespace。通过引用这个namespace,其它应用程序就能存取这些class
 
.NET中,代码被编译为中间语言(Intermediate LanguageIL),assembly中存储了IL代码、元数据和其它资源文件。同一个assembly可以附属于一个或多个Exe/DLL。所有的.NET库都存储在assembly中。



1.7 VB.NET: 完全面向对象的编程语言

抽象、封装、多态、继承是面向对象语言的四个基本属性。VB6.0不支持继承,而VB.NET则不然。所以,和C++一样,VB.NET也是完全面向对象的编程语言。



Class
Module

VB.NET
Class…End Class语句对创建class。每个VB.NET至少包括一个Module(模块)。ModuleModule…End Module语句对中实现。应用程序的主要模块是Main方法,亦即应用程序入口点。


VB6.0一样,使用Function/Sub关键字可以定义方法。下面的例子显示了如何创建class、添加方法,并从主程序调用方法:
 
Imports System


 


Module Module1


 


    Sub Main()


        Dim cls As TestClass = New TestClass


        Console.WriteLine(cls.MyMethod)


    End Sub


 


    Class TestClass


        Function MyMethod() As String


            Return “Test Method”


        End Function


    End Class


End Module


Property

属性(Property)是类变量的公共描述。Property…End Property语句用以创建property。属性的Get/Set方法分别用于取得和设置属性值。下面的例子中,DataTestClass的属性。


Imports System


Imports System.Console


 


Module Module1


    Sub Main()


        Dim cls As TestClass = New TestClass


        WriteLine(cls.MyMethod)


        WriteLine(cls.Data)


        cls.Data = “New Data”


        WriteLine(cls.Data)


    End Sub


End Module


 


Class TestClass


    Private strData As String = “Some Data”


    Function MyMethod() As String


        Return “Test Method!”


    End Function


 


    ‘ Adding Data property to the class


    Public Property Data() As String


        Get


            Return strData


        End Get


        Set(ByVal Value As String)


            strData = Value


        End Set


    End Property




重载

VB.NET
通过overload关键字支持方法重载。使用这个关键字,你可以定义同名但不同参数的方法。



类成员访问域

除了原有的PrivatePublicVB.NET引入了几个新关键字。全部访问域关键字列表如下:






















关键字


作用域


Private


限于class内部


Public


可以从class外访问


Friend


限于class所属的应用程序内


Protected


只能被class和其派生类访问


Protected Friend


能被class、应用程序和派生类访问



继承

继承是面向对象编程语言中最常用的技术。继承让你能够重用类代码和功能。


VB.NET支持继承,而VB6.0则不支持。继承的好处在于你能使用任何人编写的类,从这些类派生自己的类,然后在自己的类中调用父类功能。在下面的例子中,Class B派生自Class A,我们将从Class B中调用Class A的方法MethodA


Imports System


Imports System.Console


 


Module Module1


    Sub Main()


        Dim bObj As B = New B


        WriteLine(bObj.MethodA())


    End Sub


End Module


 


‘ Class A defined


Public Class A


    Function MethodA() As String


        Return “Method A is called.”


    End Function


End Class


 


‘Class B, inherited from Class A. All members (Public and Protected)


‘ can be access via B now.


 


Public Class B


    Inherits A


    Function MethodB() As String


        Return “Method B is called.”


    End Function


End Class



可以从一个class中派生多个自定义class,也可以从多个class派生一个自定义class



共享的成员

类的共享成员被类的所有实体共享。共享成员可能是属性、方法或字段/值域。在你不想让用户全面控制自己的类时,共享成员相当有用。例如,你可以开发一个类库,让用户通过共享成员使用其中的部分功能。


 


可以通过class本身引用共享成员,而无需通过类的实体。例如:

Module Module1


    Sub Main()


        WriteLine(A.MethodA())


    End Sub


End Module


 


‘ Class A defined


Public Class A


    Shared Function MethodA() As String


        Return “Method A is called.”


    End Function


End Class




多线程

VB
语言的一大弱点就是缺乏编写自由线程(free-threaded)程序的能力。在.NET Framework中,所有语言共享CRLCommon Runtime Library,公共运行库),也就是说,你可以用VB.NETC#或其它.NET语言编写同样的程序。



System.Threading namespace
定义了线程类。我们只需要引入System.Threading namespace,即可使用线程类。



System.Threading.Thread
类提供线程对象,可以使用Thread类创建或破坏线程。



创建线程

使用Thread类的实体创建一个新线程,然后用Thread.Start方法开始执行线程。线程构造器接受一个参数,该参数指明你要在线程中执行的procedure。在下例中,我想在oThread1Thread类的一个实体)的第二线程中执行SecondThread过程:



oThread1 = New Thread(AddressOf SecondThread)


SecondThread procedure looks like below:


Public Sub SecondThread()


    Dim i As Integer


    For i = 1 To 10


        Console.WriteLine(i.ToString())


    Next


End Sub


然后,调用Thread.Start()开始线程:


oThread1.Start()


 


下面的代码创建两个第二线程:


 


Imports System


Imports System.Threading


 


Module Module1


    Public oThread1 As Thread


    Public oThread2 As Thread


 


    Sub Main()


        oThread1 = New Thread(AddressOf SecondThread)


        oThread2 = New Thread(AddressOf ThirdThread)


        oThread1.Start()


        oThread2.Start()


    End Sub


 


    Public Sub SecondThread()


        Dim i As Integer


        For i = 1 To 10


            Console.WriteLine(i.ToString())


        Next


    End Sub


 


    Public Sub ThirdThread()


        Dim i As Integer


        For i = 1 To 10


            Console.WriteLine(“A” + i.ToString())


        Next


    End Sub


End Module




破坏线程 

调用Abort方法来破坏(中止)一个线程。在调用Abort之前,确保用IsAlive判断线程处于活动状态。



If oThread1.IsAlive Then


  oThread1.Abort()


End If




暂停线程

可以使用Sleep方法来暂停线程执行。Sleep方法接受一个以毫秒为单位的参数,指明线程应当暂停多长时间。


 


下面的例子让线程暂停1秒钟:



oThread2.Sleep(1000)

你也可以使用SuspendResume方法来挂起和继续线程执行。




设定线程优先级

Thread
类的Priority属性用于设定线程优先级。该属性可以设置为NormalAboveNormalBelowNormalHighestLowest。如:



oThread2.Priority = ThreadPriority.Highest

线程与Apartment

使用ApartmentState属性设置线程的apartment类型,该属性值可以为STAMTA或是Unknown[2]



oThread.ApartmentState = ApartmentState.MTA

MTS
意味着可以使用多线程模式,而STA则只能是单线程执行。



Public Enum ApartmentState


{


STA = 0,


MTA = 1,


Unknown = 2,


}



1.8 结构化异常处理
异常处理也被称之为错误处理。作为VB程序员,你一定对On Error GotoOn Error Resume Next这些VB6.0错误处理语句耳熟能详。这种类型的错误处理被称为非结构化异常处理(Unstructured Exception Handling)。而在VB.NET中,Microsoft推出了结构化异常处理机制。VB.NET支持类似C++TryCatch..Finally控制。Try..Catch..Finally结构如下:
 
Try


可能导致异常的代码


Catch


当异常发生时处理异常的代码


Finally


清理现场


End Try


 


Try语句块用以抛出异常。如果异常发生,在Catch语句块中处理。Finally语句块是可选的,在需要释放资源时特别有用。




1.9 VB6.0VB.NET的不同之处

除了上面谈到的语言进化,还有一些语法上的变化。所有这些语言和语法的变化在MSDN中均可查到,本文只作简单介绍。




数据类型(Data Type)的改变

VB.NET
中有些数据类型得到改进。下面是变化对照表。




 




























数据类型


VB6.0


VB.NET


Integer


16 bit size


32 bit size


Long


32 bit size


64 bit size


Currency


用于存储大浮点数


decimal替代,支持更高精度


Variant


可以存储任意类型数据


Object类型替代,也可以存储任意类型数据,但结果更好


Date


Date类型被存储为double


引入DateTime类型,用于存储不同格式的日期



VB.NET中,Short数据类型是16 bit的。ShortIntegerLong都等同于CLRSystem.Int16System.Int32System.Int64类型。
 

变量声明的变化

VB6.0中,变量声明有许多限制。其中之一就是不能同行声明多个变量。如果一定要在一行中声明多个变量,就一定得指明每个变量的类型,否则将被默认为Variant类型。



Dim a1, a2 As Integer 
Dim a3 As Integer, a4 As Integer 

第一行中的a1Variant类型,a2Integer类型。第二行中两个变量都是Integer类型。

VB.NET
支持同行声明多个变量,举例如下:



Dim a1, a2, a3 As Integer 

变量初始化是另一个问题。在VB6.0中不能同时声明和初始化变量,而VB.NET则支持这个特性。



Dim name As String = “Mahesh”
System.Console.Write(name) 

声明常量也可以照此办理:

Const DT_COUNT As Integer = 23 

New
关键字。在VB.NET中,New关键字用于创建对象。由于数据类型是对象,所以New关键字用以创建一个数据类型对象。



Dim i As Integer = New Integer()
i = 10
System.Console.WriteLine(i.ToString()) 

代码块级别支持。像C++一样,VB.NET支持代码块级别的作用域检查。在语句块中声明的变量只在块内有效。



For i = 1 To 10
Dim p As Long
System.Console.WriteLine(i.ToString())
Next
System.Console.WriteLine(p.ToString()) 

这段代码在VB.NET中会得到一个编译错误,因为pFor..Next语句块之外不可访问。在VB6.0中这段代码可以通过。




改进了的类型安全


VB6.0中,当你声明一个对外部过程的引用时,可以指定任意类型的参数为As AnyAny关键字禁止了类型检查,允许任意数据类型传入和返回。



VB.NET
不支持Any关键字。你必须指定每个参数和返回值的数据类型。


数组
VB.NET
对数组作了明显的改动。





数组范围。在VB.NET中,你需要格外留意数组范围问题。VB6.0默认数组下界为0,故数组中的元素数量等与数组上界值加一。下面的数组界限从A(0)A(10),共有11个元素:



Dim A(10) As Single

可以使用Option Base改变下界值为1。在VB.NET中,数组和C++一样,下界值为0,不支持Option Base

注意:MSDN文档指出数组只能包括与其尺寸相等的元素数量,例如:

Dim A(10) As Integer 

只能包括10个元素(从A(0)A(9)),但在编译下面这段代码时我发现它运行良好,看起来数组中容纳了11个元素。




Dim A(10) As Integer 
A(0) = 12 
A(2) = 24 
A(10) = 23 

System.Console.WriteLine(A(0).ToString()) 
System.Console.WriteLine(A(10).ToString())
System.Console.WriteLine(UBound(A).ToString()) 
System.Console.WriteLine(LBound(A).ToString()) 


Lbound
Ubound分别返回 010

ReDim
Fixed Array。你可以在VB6.0中指定固定长度的数组。


 


Dim ArrWeekDays(0 To 6) As Integer 



这里的ArrWeekDays数组是固定长度的,不能用ReDim语句改变长度。VB.NET不支持固定长度数组,所以ReDim总是有效。



可以用下面两种方式声明数组:

Dim ArrWeekDays(6) As Integer
Dim ArrWeekDays() As Integer = {1, 2, 3, 4, 5, 6} 

ReDim
语句。在VB6.0中,ReDim用于初始化动态数组。在VB.NET中你不能把它当作声明用。ReDim只能用于改变数组长度,不过不能改变数组维度。




Variant
对阵Object
VB6.0
中的Variant数据类型能存储任意类型变量,VB.NETObject具备相同能力。



算术操作符
VB.NET
支持类似C++的快捷方式。下面的表格显示了常规操作与快捷操作的不同之处。快捷方式也可用于*/|&等操作符。



操作符        常规语法     快捷方式
加法           A = A+5    A +=5 
减法         A = A – 5  A -+ 5

固定长度字符串


VB6.0中,可以在声明字符串时指定其长度。VB.NET不支持固定长度字符串。



布尔操作符
VB6.0
中的AndOr或是Xor语句是按位操作符。而在VB.NET中,它们是布尔操作符。执行这些操作将返回truefalseVB.NET引入新操作符来完成按位操作。



操作符           描述          

BitAnd           
按位And
BitOr             
按位Or
BitXor            
按位Xor
BitNot            
按位Not


结构与自定义类型
VB6.0中,你使用Type…End Type语句块创建结构或自定义类型。例如:



Type StdRec 


StdId As Integer 


StdName As String 
End Type 



VB.NET
引入新的语法:StructureType…End Type不再被支持。Structure…End StructureC++用法相同。可以指定结构中每个元素的可访问域,如PublicProtectedFriendProtected FriendPrivate等。例如:



Structure StdRec 


Public StdId As Integer 
Public StdName As String 


Private StdInternal As String 
End Structure

VB.NET
中的Structures就像类一样,也可以拥有方法和属性。

New
Nothing关键字

VB6.0
中,AS NewNothing关键字用于声明一个对象并初始化它。
 
VB.NET
不支持隐式创建对象。如前所言,甚至连数据类型都是对象。你可以采用以下两种方法创建数据类型或对象:
 
Dim i As Integer 
Dim i As Integer = New Integer() 
// Do something 
if i = Nothing Then 
End If 

不支持Set语句
VB6.0
使用Set语句指派对象。例如:

Set myObj = new MyObject
Set a = b

VB.NET中,不需要使用Set指派对象。例如:

myObj = new MyObj()
a = b

过程(procedure)语法的变化
VB.NET中过程语法有了很多变化。例如类似C++的过程调用方式、ByVal(传值)为默认类型、Optional关键字、return语句等等。

类似C++的过程调用方式
VB6.0
允许不用加圆括号调用过程(sub)。不过,用Call语句调用函数或sub时,一定要使用圆括号。例如:

Dim I as Integer
Call EvaluateData(2, i) 
EvaluateData 2, i 

VB.NET中,所有的方法调用都需要圆括号,而Call语句则是可选的。
 
ByVal
是默认参数类型
VB6.0中,在调用函数或subByRef(传址)是默认类型。那意味着所有改变将反映到传入的变量。VB.NET改变了这种方式。现在,默认的参数类型是ByVal(传值)。
 
Optional
关键字
VB6.0
使用Optional关键字可用来让用户决定传入一个默认值,之后在调用IsMissing函数判断参数是否有效。
 
而在VB.NET中,每个可选参数必须声明其默认值,无需调用IsMissing函数。例如:

Sub MyMethod(Optional ByVal i As Integer = 3) 


Return语句
VB.NETReturn语句与C++相似。使用Return语句把控制权从过程返还给调用者。在VB6.0中,Return语句与GoSub语句一起使用。VB.NET不再支持GoSub语句。


流程控制的改变
下面是VB.NET对流程控制语句的修改:

1. GoSub
不再受到支持。

2. Call
FunctionSub语句均可用于调用过程。

3. On … GoSub
On … GoTo语句不再受支持。可以使用Select Case语句来替代。

4. While … Wend
语句现在改为While…End While语句。不再支持Wend关键字。

小结 
Visual Basic .NET
.NET版本的Visual Basic。通过本文你了解到VB.NET的基本概念,而且也从VB6.0开发者的角度对VB.NET进行了考察。


 






[1] 译注:这意味着你无需购买VS.NET即可进行VB.NET开发



[2] 译注:STA-Single Threaded ApartmentMTA-Multi Threaded Apartment

“英国人改变世界”——World Wide Web发明者Tim John Berners-Lee

(发表于《程序员》杂志)

    早上起床,泡上一杯咖啡,坐到电脑前打开浏览器看新闻——这是很多人每天的例行公事。当我们陶醉于在链接之间自如跳转,是否也曾经偶尔好奇过:到底是谁想出了这聪明的信息发布方式?在我们迅速将这个“无聊”的问题抛诸脑后时,那可敬的发明者却仍然继续为WWW的未来努力工作着。不过,他已不是孤身一人,而是领导着整个W3C。


Tim John Berners-Lee
     他,就是Tim John Berners-Lee,World Wide Web的发明者。


     Tim 1955年6月8日生于英国伦敦。在牛津大学女王学院读书时,他曾用M6800处理器和旧电视自己攒了一台计算机。1976年毕业后,他先后受雇于Plessey Telecommunications Ltd、D.G Nash Ltd两家公司。在D.G Nash,Tim曾写过一个多任务操作系统,但真正开启未来之门的,却是之后在CERN工作的一年半。


     CERN(European Particle Physics Laboratory,欧洲量子物理研究所),位于瑞士日内瓦。在那里,为了工作需要,Tim写了一个从未发布过的工具Enquire——这个我们无缘得见的Enquire,正是World Wide Web的雏形。不过在此之后Tim就到John Poole’s Image Computer Systems Ltd进行实时控制固件方面的开发工作去了。1984年,当Tim获得奖学金,重新回到CERN之后研究实时系统,他逐渐发现CERN内部沟通机制存在信息漏失的弊端。今天我们可以找到的关于WWW概念的第一份公开文件,是Tim于1989年3月写给CERN的建议书:Information Management: A Proposal。在这份文件中,Tim提出利用Hypertext(超文本)构造链接信息系统的设想 。同样,我们也可以从文件中看到“Browser(浏览器)”概念的最初提出。


 
最早的浏览器



     这时Tim已经开始在Enquire的基础上,基于NeXTStep系统开发第一个真正意义上的Web Server——httpd、第一个客户端浏览器——WorldWideWeb,之后又在1991年建立并开通第一个WWW网站http://info.cern.ch/(该网站至今仍然是CERN的官方站点)。到1993年,Tim再接再厉,制定了URI、HTTP、HTML等的第一个规范。


      1994年,Tim加入位于麻省理工大学的LCS(计算机科学实验室)。为了让World Wide Web不被少数人所控制,Tim组织成立了World Wide Web Consortium,即通常所说的W3C,致力于“引导Web发挥其最大潜力”。我们所熟知的HTML协议各个版本,都出自W3C会议。可贵的是,W3C的HTML规范是以“建议”的形式发布,并不强迫任何厂商或个人接受。至于微软利用HTML协议的开放性扩展自有标准,打败Netscape,应该是Tim始料未及的了。


      《时代》杂志在评价Tim的贡献时这样写道——“和其它影响世界的发明不同,这项发明的确应该归功于一人……Berners-Lee设计了World Wide Web,然后就把它开放给世界。他比其他任何人都更努力地保持WWW的开放性、非营利性和自由性……很难对WWW做出适当评价,它几乎可以媲美古登堡印刷术。Berners-Lee一手把只有精英们掌握的通讯系统变成了大众媒体。”


      这段话实实在在并非溢美之词。Eric Schmidt也曾说过:“如果计算机网络是一门传统科学,Berners-Lee早该获诺贝尔奖了。”我想,Tim本人不会在意这个。当他把上个世纪最伟大的传媒界发明完全无偿地奉献给全世界,天堂已准备好一双洁白的翅膀。Tim Berners-Lee是一位具有极高创造力的程序员,但更是一位品格高尚的盗火者。


     在《织网(Weaving the Web)》一书中,Tim提出三个观点:


◎ 编辑Web与浏览Web一样重要,Wiki是向正确方向踏出的一步。
◎ Internet的任何表现形式都应该呈网状,而非树形结构。域名系统例外。
◎ 计算机科学家在技术层面和道德层面都负有不可推卸的责任。


     也许我们可以从这些论断中获益良多,也许只当它是无稽之谈。不管如何,Tim Berners-Lee发明了World Wide Web,并继续在为之做出贡献。这,就已足够。

古怪的梦

昨天晚上(准确地说,应该是今早)做了一个梦,梦中和别人赛诗。醒来之后,居然还能记得其中大部分句子。这些句子实在没有诗味,打死我也不肯写出这么恶劣的文字,但它却仿佛是某种预兆。自己是不能给自己详梦的——哪位仁兄能帮忙给解一下?该“诗”照录如下:


 



一径小道上瑶台,
半山凋零半山开。
若使梅花能[ ][ ],(这里好像是“不谢”,又好像是“望月”或是“对月”,记不起来了)
何须借桂抚我怀。


 

      两个人要进别人的院子,一个费尽力气翻过墙去,看见另一个推门也进来了。翻墙那个人笨吗?笨。


      有位大哥,问我有没有办法把某诗词软件的加密数据拿出来。我想也没想,立刻找朋友帮忙解密。一个小时后,那位大哥自己搞到了这个数据库。他只是给软件作者打了个电话。


      有时候,事情就这么简单;我们,就这么笨。

IT2004:不安分的一年

(发表于《CSDN开发高手》2004.2)   


中国IT界的2004年开始于一个笑话。1月1日,当FM365域名被“抢注”的消息传来时,似乎预兆了今年的动荡与格局重整。一些演出落下了帷幕,而另一些演出却正锣鼓喧天。上场者与下场者交错而过,旁观的谁能体会其间奥妙?好了,让我斗胆就2004年IT技术发展方向做一些预测。我在这里写下的文字,惟有历史可以作证。至于是证明其真还是证明其伪,也只有历史才知道。


 


移动平台


    移动平台一向是Java的天下。而今微软知其利厚,不免要来插上一足。PDA市场上Palm的式微足以令人惊心——Java会在移动平台上重蹈Palm覆辙吗?我的回答是:不会,至少不会那么快。全球有超过1亿部支持Java的手机,这种可怕的垄断在竞争者面前筑起一道高墙。不过千万别忘了,手机是一种纯粹的消费品,用户可能为某些简单的理由更换手机。我见过不止一位朋友,仅仅是因为输入法不好用就直接买了一部新的。而微软的优势就在于界面统一性。Windows熟悉的界面对很多人都会是不小的诱惑。


    从开发和部署的角度来看,基于.NET Framework的手机应用的确有无可比拟的优势。无论采用何种架构,可以提前盖棺定论的是:2004移动平台是游戏的天下。娱乐无处不在,这简直就是最真的真理。对于拥有128M内存、真彩屏、具备完整多媒体支持的手机,玩玩游戏根本就是小菜一碟。不过,如果仅限于此,那么不过是把Gameboy简单地“镶嵌”到手机上。真正有魅力的手机游戏,一定会结合手机的“通信”功能与游戏的“娱乐”功能,创造出一种新的掌上娱乐方式。用手机打CS?也许,但决不是唯一选择。



    移动平台应用,除了手机游戏之外,还会有其他方面的进步。手机的全称将从“移动电话”变成“便携个人智能设备”。目前对移动设备软件应用的发掘,仍然强烈体现了厂商想象力的贫乏。便携设备并非电话、计算器、游戏机和媒体播放机的简单组合。时刻在线、时刻娱乐、时刻交流,会是便携设备应用的未来趋势。   


 


64位计算


    自1986年80386处理器推出以来,32位体系已经统领江山将近20年。从386、486到Pentium、Athlon,处理器厂商之间激烈竞争的结果是量变引起质变,去年Intel和AMD分别推出了自己的64位处理器。在探讨这个话题时,有朋友提出“基于从前代产品获取最大利润的原则,硬件厂商不会急于降低64位处理器价格”的想法。在普通情况下这是自然而然的,但这次有点不同了。



    不同之处何在呢?Intel推出64位处理器时,意在高端服务器市场。以正常的思维去考量,新处理器面向高端是很自然的。古怪的是AMD的采取了避实就虚的策略,号称自己的64位处理器面向桌面PC。如同拼命要抢在前面登上峰顶时,却意外地发现敌人在谷底收获庄稼一般,更要命的是到峰顶仍然路途崎岖。是该继续攀登呢,还是直杀向谷底抢粮食?相对于高端服务器而言,桌面PC更像一种消耗品。Intel放任AMD在桌面端肆意妄为的可能性不大,两家寡头在桌面端推出真正实用的64位处理器,不会是太遥远的事情。


    在高端服务器方面,64位处理器渐入佳境或许还得假以时日。Intel需要比微软更可靠的盟友,而AMD则稍嫌稚嫩。虽然还有另外一些厂商推出64位CPU,预计年内这个市场不会有地震式的变动。


 


Linux


    关于Linux的话题,在2003年已经给我们带来无数的叹息与担忧。在新的一年,所有的战尘应该会渐趋消散。但SCO的叫嚣并非迷幻药所致——Linux中莫非真有黄金屋?美国的事儿咱管不着,中国Linux界的发展却是一定要关注的。据称国家有关部门组织的论证工作已经初见成效,中国电子政务系统极有可能全面采用Linux。对于挣扎在泥潭中不知盈利为何物的国内Linux厂商而言这显然是重大利好消息,国外厂商当然也不会轻易放弃这个机会。整件事的受害者无疑正是微软。


    中国Linux商业前景可以说都在这一纸论证报告上面。从之前国家对Linux厂商的支持力度来看,这份报告极有可能倾向于选择Linux作为国家电子政务体系的搭建平台。微软操作系统能做到完整的开源吗?不能。所以Linux才有机会。如果你的公司仍在做基于Windows的电子政务系统,现在是考虑见风使舵的时候了。



    在桌面端Windows仍会占据大片市场。曾有一位网友在CSDN上发表文章,历数Linux可以代替Windows种种理由,并给出一系列的替代应用软件。但这位网友似乎并没有意识到人机界面友好性是一个操作系统是否具备足够亲和力的重要衡量标准。即便在Linux上有十万个免费、开源、强大的应用程序,假使没有一种很好的方式把它们组合到桌面,那便如同沙中之金,不免要埋没在茫茫大海之中了。


 


在线娱乐


    传统网络游戏格局大致已经稳定下来,谁要再趟这潭混水,都要有十万分的勇气和十二万分的实力。这并不意味着在线娱乐已经没有潜力可挖,因为“娱乐”的概念要比“游戏”广泛得多。梁冬对娱乐有一个界定:娱乐就是安全的体验,多重安全体验更具娱乐性。在线阅读、在线音乐、在线电影是安全体验,在线游戏也是安全体验。2004的在线娱乐体验会有不安全因素出现。为什么这样说呢?很简单,在线娱乐正在从虚拟体验走向真实体验。玩家愿意花钱买装备、花钱请人代练;甚至只要1000块钱人民币,你就能雇一个杀手,把网络游戏世界中的仇人干掉……真实世界和虚拟世界之间已经有了货币兑换机制,下一步是什么呢?


     


    在后脑勺接个插头做梦吃牛排或者套上紧身衣来次虚拟性爱,仍是可望不可即的幻想。这些幻想正代表了在线娱乐下一波浪潮的本质。那就是:全媒体,跨媒体,社会性,真实性。所谓全媒体,即在线娱乐将无处不在,你的MP3也许将升级为便携式网络收音机;所谓跨媒体,即娱乐平台之间互连互通,拿起手机可以打通网络世界;所谓社会性,即网络社会趋于成熟,孤立的网络群体之间实现交流;所谓真实性,即娱乐表现从感观体验延伸到心理体验,真实社会与网络社会界限模糊。


 


Blog


    每天都有人在批判我关于Blog的论调,这些人显然已经落后于时代了。如果现在谁还把Blog当作“带评论的文章”或是“个人主页”,那么他将错失新世纪第一个网络商机。Blog从最初的“个人网志”发展到今天,已然成为一种不可忽视的网络文化。Blog文化代表着“自由、开放、交流”,这无疑是与互联网旨趣是暗合的。脱离网络社会久矣者,才会不加思索地否认Blog的价值。而在Blogger.com被Google收购之后,国外许多公司已经开始钻头觅缝、拼命琢磨,打算在Blog代表的新一代网络文化中寻找机会。


    我不得不重申对Blog的定义:Blog是一种方便的Web内容发表方式,它让你能够经由简单的途径把内容放到Web页面。同时,通过某种统一规范,Blog之间可以共享这些内容和读者的评注。


    让我们更深入一些吧。因其自由,故Blog将会是史上最强的内容源,数量恐怖的内容(信息、知识)不断产生。刘韧先生把用户群比做水池,把水池理论“剽窃”过来套用在Blog上可能更为恰当。Blog是水池,用户是鱼,内容是鱼肉。以前的模式下,不但水池与水池之间老死不相往来,而且鱼要长肉还得申请。而Blog水池则是互通的,鱼儿可以自由与其他池子的鱼互通有无。你要做的,就是静静蹲在池边,看哪一条鱼长大了。鱼肉是产品,现在我们已经拥有了最大的产地。在鱼肉制成罐头卖给内容消费者之前,每一环节都有利可图。有人修建池子,有人加工鱼,有人卖加工工具,还有可能出现10种以上牌子的罐头……


     2004年将会出现多种基于Blog的商业模式,但其中多数不会很快成型。     撇除商业不谈,Blog更代表网络内容的革命。你编辑Web,你与其他写作者互相沟通……你将从Blog种获得前所未有的交流体验。



结语


    去年发生了太多事情,今年可能还会发生更多事情。对IT界美好前景的向往夹杂着对SARS卷土重来的疑惧,一切仿佛都已命中注定,一切又仿佛都是未知的。在这个变革时代,机会随时可能出现。至于是谁抓住了机会,待到年底便会水落石出了。