<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>AlanSmith的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=AlanSmith</link>
<description>AlanSmith的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[Eclipse 运行命令行参数大全]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=AlanSmith&amp;id=15694</link>
<author>AlanSmith</author>
<pubDate>2006/6/21 0:43:59</pubDate>
<description><![CDATA[<A></A>
<P>运行 Eclipse<BR>将 Eclipse 驱动程序安装（解压缩）到某个目录（例如，c:\eclipse）中之后，通过运行顶级安装目录中的 Eclipse 可执行文件来启动"工作台"。在 Windows 系统上，该可执行文件称为 eclipse.exe，而在 Linux 系统上称为 eclipse。注意：下列讨论描述 Windows 系统上的设置。Linux 上的设置是相似的。<BR><BR>如果您没有另行指定，则平台将缺省工作区目录创建为可执行文件的兄弟目录（例如 c:\eclipse\workspace）。此工作区目录用作项目的缺省内容区，还用于保存任何必需的元数据。要进行共享安装或多工作区安装，应明确指出工作区的位置而不是使用缺省值。有两种控制工作区位置的方法：使用当前工作目录或使用 -data 命令行自变量。<BR><BR>将工作区位置设置为在当前工作目录内<BR>在此方案中，工作区位置将是当前工作目录中称为 workspace 的目录。<BR><BR>实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：<BR><BR>导航到 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。 <BR>编辑快捷方式的属性，以使启动位置：字段标识工作区位置的父目录（例如，c:\users\robert）。 <BR>关闭属性对话框并双击快捷方式（如果提供的目录为 c:\users\robert，则工作区位置将为 c:\users\robert\workspace）。 <BR>当然，您也可以使用命令提示符（通过将目录切换为工作区父目录然后运行 eclipse.exe）来获得同样的效果。<BR><BR>使用 -data 设置工作区的特定位置<BR>要使用 -data 命令行自变量，只要将 -data your_workspace_location（例如，-data c:\users\robert\myworkspace）添加至快捷方式属性中的目标字段或显式地将它包括在命令行上。<BR><BR>使用 -vm 设置 java VM<BR>建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 -vm 命令行自变量（例如，-vm c:\jre\bin\javaw.exe）可以实现此目的。如果不使用 -vm，则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 Eclipse 时使用另一 Java VM。<BR><BR>运行 Eclipse 中的高级主题<BR>Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。运行 Eclipse 可执行文件的一般格式是：<BR><BR>eclipse [platform options] [-vmargs [Java VM arguments]]<BR>Eclipse 启动参数 命令 描述 原因 <BR>-arch architecture<BR>定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java os.arch 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有："x86"、"sparc"、"PA-RISC"和"ppc"。 2.0 <BR>-application applicationId<BR>要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行"Eclipse 工作台"。 1.0 <BR>-boot bootJarURL<BR>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。Eclipse 平台的引导插件代码（boot.jar）的位置，表示为 URL。如果指定此项，则会用它来为装入 Eclipse 平台引导程序类装入器的类装入器设置类路径。仅当更改 startup.jar 和 boot.jar 的相对位置时才需要它。注意，不允许使用相对 URL。 *1.0 <BR>-classloaderproperties [file]<BR>如果指定的话，则使用给定位置处的类装入器属性文件来激活平台类类装入器增强。文件自变量可以是文件路径或 URL。注意，不允许使用相对 URL。单击此处以获得更多详细信息。 2.0.2 <BR>-configuration configurationFileURL<BR>Eclipse 平台配置文件的位置，表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。 2.0 <BR>-consolelog<BR>将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 -debug 组合时很方便使用。 1.0 <BR>-data workspacePath<BR>要运行 Eclipse 平台的工作区的路径。工作区位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-debug [optionsFile]<BR>将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 eclipse 的目录中查找称为".options"的文件。URL 和文件系统路径都可作为文件位置。 1.0 <BR>-dev [classpathEntries]<BR>将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作区包含要开发的插件时，指定 -dev bin 会为每个插件项目的名为 bin 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。 1.0 <BR>-endsplash params<BR>用于在 Eclipse 平台启动并运行时关闭闪屏的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR>-feature featureId<BR>主要功能部件的标识。主要功能部件为 Eclipse 的已启动实例提供了产品个性，并确定使用的产品定制信息。 2.0 <BR>-keyring keyringFilePath<BR>磁盘上授权数据库（或"密钥环"文件）的位置。此自变量必须与 -password 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-nl locale<BR>定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有："en_US"和"fr_FR_EURO"。 2.0 <BR>-nolazyregistrycacheloading<BR>取消激活装入优化的平台插件注册表高速缓存。缺省情况下，仅当需要时才从注册表高速缓存（可用时）中装入扩展的配置元素，以减少内存占用。此选项将在启动时强制完全装入注册表高速缓存。 2.1 <BR>-noregistrycache<BR>绕过读写内部插件注册表高速缓存文件。 2.0 <BR>-nosplash<BR>运行平台而不显示闪屏。 1.0 <BR>-os operatingSystem<BR>定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 $os$ 变量的出现。示例值有："win32"、"linux"、"hpux"、"solaris"和"aix"。 1.0 <BR>-password password<BR>授权数据库的密码。与 -keyring 选项配合使用。 1.0 <BR>-perspective perspectiveId<BR>启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。 1.0 <BR>-plugincustomization &nbsp; propertiesFile<BR>包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。 2.0 <BR>-plugins pluginsFileURL<BR>（建议不使用；用 -configuration 代替；支持 1.0 兼容）。 指定 Eclipse 平台查找插件的文件的位置，表示为 URL。该文件为属性文件格式，其中键是任意用户定义名称，值是指向 plugin.xml 文件的显式路径或指向包含插件的目录的路径的用逗号分隔的列表。注意，不允许使用相对 URL。如果指定此项，则此选项会导致创建适当的临时配置。 *1.0 <BR>-refresh <BR>启动时执行工作区的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。 1.0 <BR>-showlocation <BR>用于在窗口标题栏中显示工作区的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。 2.0 <BR>-showsplash params<BR>用于显示闪屏（由可执行的 Eclipse 平台启动器执行）的内部选项。此选项在闪屏处理链中不同的位置有不同的语法和语义。 2.0 <BR>-vm vmPath<BR>要用来运行 Eclipse 平台的"Java 运行时环境"（JRE）的位置。如果不指定此项，则 JRE 位于 jre（它是 Eclipse 可执行文件的兄弟目录）。相对于从中启动 eclipse 的目录来解释相对路径。 1.0 <BR>-ws windowSystem<BR>定义 Eclipse 平台在其上运行的 Windows 系统。Eclipse 平台通常使用 Java os.name 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getWS() 用于插件、用于配置 SWT 以及用于解析插件清单文件中提及的路径中 $ws$ 变量的出现。示例值有："win32"、"motif"和"gtk"。 1.0 <BR><BR>将 -vmargs 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。注意：如果 Eclipse 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 Eclipse 将不会启动并且您将接收到"JVM 已终止。出口代码为 1"的错误。<BR><BR>在不同的 VM 上运行 <BR>在 J9 上运行 Eclipse<BR>当在 J9 版本 1.5 上运行 Eclipse 时，建议使用以下 VM 选项： <BR><BR>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe &nbsp; &nbsp; &nbsp; &nbsp; -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000<BR>当在 J9 版本 2.0 上运行 Eclipse 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 Eclipse 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： <BR><BR>eclipse.exe [eclipse arguments] -vm path_to_j9w.exe -vmargs<BR>有关进一步信息，参考 J9 VM 文档和帮助。<BR><BR>在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse<BR>IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB。</P>]]></description>
</item><item>
<title><![CDATA[C++学习经典50]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=AlanSmith&amp;id=14358</link>
<author>AlanSmith</author>
<pubDate>2006/5/13 14:08:36</pubDate>
<description><![CDATA[1.把C++当成一门新的语言学习（和C没啥关系！真的。）；&nbsp; <BR>2.看《Thinking&nbsp;In&nbsp;C++》，不要看《C++变成死相》；&nbsp; <BR>3.看《The&nbsp;C++&nbsp;Programming&nbsp;Language》和《Inside&nbsp;The&nbsp;C++&nbsp;Object&nbsp; <BR>Model》,不要因为他们很难而我们自己是初学者所以就不看；&nbsp; <BR>4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境，而我们要学的是一门语言；&nbsp; <BR>5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单，或者可以引伸出很多知识点；&nbsp; <BR>6.会用Visual&nbsp;C++，并不说明你会C++；&nbsp; <BR>7.学class并不难，template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书；&nbsp; <BR>8.如果不是天才的话，想学编程就不要想玩游戏——你以为你做到了，其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住：学C++是为了编游戏的；&nbsp; <BR>9.看Visual&nbsp;C++的书，是学不了C++语言的；&nbsp; <BR>10.浮躁的人容易说：XX语言不行了，应该学YY；——是你自己不行了吧！？&nbsp; <BR>11.浮躁的人容易问：我到底该学什么；——别问，学就对了；&nbsp; <BR>12.浮躁的人容易问：XX有钱途吗；——建议你去抢银行；&nbsp; <BR>13.浮躁的人容易说：我要中文版！我英文不行！——不行？学呀！&nbsp; <BR>14.浮躁的人容易问：XX和YY哪个好；——告诉你吧，都好——只要你学就行；&nbsp; <BR>15.浮躁的人分两种：a)只观望而不学的人；b)只学而不坚持的人；&nbsp; <BR>16.把时髦的技术挂在嘴边，还不如把过时的技术记在心里；&nbsp; <BR>17.C++不仅仅是支持面向对象的程序设计语言；&nbsp; <BR>18.学习编程最好的方法之一就是阅读源代码；&nbsp; <BR>19.在任何时刻都不要认为自己手中的书已经足够了；&nbsp; <BR>20.请阅读《The&nbsp;Standard&nbsp;C++&nbsp;Bible》(中文版：标准C++宝典)，掌握C++标准；&nbsp; 21.看得懂的书，请仔细看；看不懂的书，请硬着头皮看；&nbsp; <BR>22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍；&nbsp; <BR>23.请看《Effective&nbsp;C++》和《More&nbsp;Effective&nbsp;C++》以《Exceptional&nbsp;C++》；&nbsp; 24.不要停留在集成开发环境的摇篮上，要学会控制集成开发环境，还要学会用命令行方式处理程序；&nbsp; <BR>25.和别人一起讨论有意义的C++知识点，而不是争吵XX行不行或者YY与ZZ哪个好；&nbsp; <BR>26.请看《程序设计实践》，并严格的按照其要求去做；&nbsp; <BR>27.不要因为C和C++中有一些语法和关键字看上去相同，就认为它们的意义和作用完全一样；&nbsp; <BR>28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言，你一定不会把C和Z语言联系得那么紧密；&nbsp; <BR>29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已；&nbsp; <BR>30.读完了《Inside&nbsp;The&nbsp;C++&nbsp;Object&nbsp;Model》以后再来认定自己是不是已经学会了C++；&nbsp; <BR>31.学习编程的秘诀是：编程，编程，再编程；&nbsp; <BR>32.请留意下列书籍：《C++面向对象高效编程（C++&nbsp;Effective&nbsp;Object-Oriented&nbsp; Software Construction）》《面向对象软件构造(Object-Oriented&nbsp;Software&nbsp; <BR>Construction)》《设计模式（Design&nbsp;Patterns）》《The&nbsp;Art&nbsp;of&nbsp;Computer&nbsp; <BR>Programming》；&nbsp; <BR>33.记住：面向对象技术不只是C++专有的；&nbsp; <BR>34.请把书上的程序例子亲手输入到电脑上实践，即使配套光盘中有源代码；&nbsp; <BR>35.把在书中看到的有意义的例子扩充；&nbsp; <BR>36.请重视C++中的异常处理技术，并将其切实的运用到自己的程序中；&nbsp; <BR>37.经常回顾自己以前写过的程序，并尝试重写，把自己学到的新知识运用进去；&nbsp; 38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路；&nbsp; <BR>39.C++语言和C++的集成开发环境要同时学习和掌握；&nbsp; <BR>40.既然决定了学C++,就请坚持学下去，因为学习程序设计语言的目的是掌握程序设计技术，而程序设计技术是跨语言的；&nbsp; <BR>41.就让C++语言的各种平台和开发环境去激烈的竞争吧，我们要以学习C++语言本身为主；&nbsp; <BR>42.当你写C++程序写到一半却发现自己用的方法很拙劣时，请不要马上停手；请尽快将余下的部分粗略的完成以保证这个设计的完整性，然后分析自己的错误并重新设计和编写（参见43）；&nbsp; <BR>43.别心急，设计C++的class确实不容易；自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的；&nbsp; <BR>44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的，而不是一次记住的；&nbsp; <BR>45.每学到一个C++难点的时候，尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了；&nbsp; <BR>46.记录下在和别人交流时发现的自己忽视或不理解的知识点；&nbsp; <BR>47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成&nbsp;&nbsp;&nbsp;&nbsp; Version100.XX；&nbsp; <BR>48.保存好你写过的所有的程序——那是你最好的积累之一；&nbsp; <BR>49.请不要做浮躁的人；&nbsp; <BR>50.请热爱C++!&nbsp;]]></description>
</item><item>
<title><![CDATA[李开复：算法的力量]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=AlanSmith&amp;id=14185</link>
<author>AlanSmith</author>
<pubDate>2006/5/8 21:24:38</pubDate>
<description><![CDATA[算法是计算机科学领域最重要的基石之一，但却受到了国内一些程序员的冷落。许多学生看到一些公司在招聘时要求的编程语言五花八门就产生了一种误解，认为学计算机就是学各种编程语言，或者认为，学习最新的语言、技术、标准就是最好的铺路方法。其实大家都被这些公司误导了。编程语言虽然该学，但是学习计算机算法和理论更重要，因为计算机算法和理论更重要，因为计算机语言和开发平台日新月异，但万变不离其宗的是那些算法和理论，例如数据结构、算法、编译原理、计算机体系结构、关系型数据库原理等等。在“开复学生网”上，有位同学生动地把这些基础课程比拟为“内功”，把新的语言、技术、标准比拟为“外功”。整天赶时髦的人最后只懂得招式，没有功力，是不可能成为高手的。 
<P></P>
<P><BR><B>算法与我</B></P>
<P>当我在1980年转入计算机科学系时，还没有多少人的专业方向是计算机科学。有许多其他系的人嘲笑我们说：“知道为什么只有你们系要加一个‘科学’，而没有‘物理科学系’或‘化学科学系’吗？因为人家是真的科学，不需要画蛇添足，而你们自己心虚，生怕不‘科学’，才这样欲盖弥彰。”其实，这点他们彻底弄错了。真正学懂计算机的人（不只是“编程匠”）都对数学有相当的造诣，既能用科学家的严谨思维来求证，也能用工程师的务实手段来解决问题——而这种思维和手段的最佳演绎就是“算法”。</P>
<P>记得我读博时写的Othello对弈软件获得了世界冠军。当时，得第二名的人认为我是靠侥幸才打赢他，不服气地问我的程序平均每秒能搜索多少步棋，当他发现我的软件在搜索效率上比他快60多倍时，才彻底服输。为什么在同样的机器上，我可以多做60倍的工作呢？这是因为我用了一个最新的算法，能够把一个指数函数转换成四个近似的表，只要用常数时间就可得到近似的答案。在这个例子中，是否用对算法才是能否赢得世界冠军的关键。</P>
<P>还记得1988年贝尔实验室副总裁亲自来访问我的学校，目的就是为了想了解为什么他们的语音识别系统比我开发的慢几十倍，而且，在扩大至大词汇系统后，速度差异更有几百倍之多。他们虽然买了几台超级计算机，勉强让系统跑了起来，但这么贵的计算资源让他们的产品部门很反感，因为“昂贵”的技术是没有应用前景的。在与他们探讨的过程中，我惊讶地发现一个O(n*m)的动态规划(dynamic&nbsp;programming)居然被他们做成了O(n*n*m)。更惊讶的是，他们还为此发表了不少文章，甚至为自己的算法起了一个很特别的名字，并将算法提名到一个科学会议里，希望能得到大奖。当时，贝尔实验室的研究员当然绝顶聪明，但他们全都是学数学、物理或电机出身，从未学过计算机科学或算法，才犯了这么基本的错误。我想那些人以后再也不会嘲笑学计算机科学的人了吧！</P>
<P><BR><B>网络时代的算法</B></P>
<P>有人也许会说：“今天计算机这么快，算法还重要吗？”其实永远不会有太快的计算机，因为我们总会想出新的应用。虽然在摩尔定律的作用下，计算机的计算能力每年都在飞快增长，价格也在不断下降。可我们不要忘记，需要处理的信息量更是呈指数级的增长。现在每人每天都会创造出大量数据（照片，视频，语音，文本等等）。日益先进的纪录和存储手段使我们每个人的信息量都在爆炸式的增长。互联网的信息流量和日志容量也在飞快增长。在科学研究方面，随着研究手段的进步，数据量更是达到了前所未有的程度。无论是三维图形、海量数据处理、机器学习、语音识别，都需要极大的计算量。在网络时代，越来越多的挑战需要靠卓越的算法来解决。</P>
<P>再举另一个网络时代的例子。在互联网和手机搜索，如果要找附近的咖啡店，那么搜索引擎该怎么处理这个请求呢？最简单的办法就是把整个城市的咖啡馆都找出来，然后计算出它们的所在位置与你之间的距离，再进行排序，然后返回最近的结果。但该如何计算距离呢？图论里有不少算法可以解决这个问题。</P>
<P>这么做也许是最直观的，但绝对不是最迅速的。如果一个城市只有为数不多的咖啡馆，那么这么做应该没什么问题，反正计算量不大。但如果一个城市里有很多咖啡馆，又有很多用户都需要类似的搜索，那么服务器所承受的压力就大多了。在这种情况下，我们该怎样优化算法呢？</P>
<P>首先，我们可以把整个城市的咖啡馆做一次“预处理”。比如，把一个城市分成若干个“格子(grid)”，然后根据用户所在的位置把他放到某一个格子里，只对格子里的咖啡馆进行距离排序。</P>
<P>问题又来了，如果格子大小一样，那么绝大多数结果都可能出现在市中心的一个格子里，而郊区的格子里只有极少的结果。在这种情况下，我们应该把市中心多分出几个格子。更进一步，格子应该是一个“树结构”，最顶层是一个大格——整个城市，然后逐层下降，格子越来越小，这样有利于用户进行精确搜索——如果在最底层的格子里搜索结果不多，用户可以逐级上升，放大搜索范围。</P>
<P>上述算法对咖啡馆的例子很实用，但是它具有通用性吗？答案是否定的。把咖啡馆抽象一下，它是一个“点”，如果要搜索一个“面”该怎么办呢？比如，用户想去一个水库玩，而一个水库有好几个入口，那么哪一个离用户最近呢？这个时候，上述“树结构”就要改成“r-tree”，因为树中间的每一个节点都是一个范围，一个有边界的范围（参考:<A class=contentlink href="http://www.cs.umd.edu/~hjs/rtrees/index.html" target=_blank><FONT color=#4455aa>http://www.cs.umd.edu/~hjs/rtrees/index.html</FONT></A>）。</P>
<P>通过这个小例子，我们看到，应用程序的要求千变万化，很多时候需要把一个复杂的问题分解成若干简单的小问题，然后再选用合适的算法和数据结构。</P>
<P><BR><B>并行算法：Google的核心优势</B></P>
<P>上面的例子在Google里就要算是小case了！每天Google的网站要处理十亿个以上的搜索，GMail要储存几千万用户的2G邮箱，Google&nbsp;Earth要让数十万用户同时在整个地球上遨游，并将合适的图片经过互联网提交给每个用户。如果没有好的算法，这些应用都无法成为现实。</P>
<P>在这些的应用中，哪怕是最基本的问题都会给传统的计算带来很大的挑战。例如，每天都有十亿以上的用户访问Google的网站，使用Google的服务，也产生很多很多的日志(Log)。因为Log每份每秒都在飞速增加，我们必须有聪明的办法来进行处理。我曾经在面试中问过关于如何对Log进行一些分析处理的问题，有很多面试者的回答虽然在逻辑上正确，但是实际应用中是几乎不可行的。按照它们的算法，即便用上几万台机器，我们的处理速度都根不上数据产生的速度。</P>
<P>那么Google是如何解决这些问题的？</P>
<P>首先，在网络时代，就算有最好的算法，也要能在并行计算的环境下执行。在Google的数据中心，我们使用的是超大的并行计算机。但传统的并行算法运行时，效率会在增加机器数量后迅速降低，也就是说，十台机器如果有五倍的效果，增加到一千台时也许就只有几十倍的效果。这种事半功倍的代价是没有哪家公司可以负担得起的。而且，在许多并行算法中，只要一个结点犯错误，所有计算都会前功尽弃。</P>
<P>那么Google是如何开发出既有效率又能容错的并行计算的呢？</P>
<P>Google最资深的计算机科学家Jeff&nbsp;Dean认识到，Google所需的绝大部分数据处理都可以归结为一个简单的并行算法：Map&nbsp;and&nbsp;Reduce（<A class=contentlink href="http://labs.google.com/papers/mapreduce.html" target=_blank><FONT color=#4455aa>http://labs.google.com/papers/mapreduce.html</FONT></A>）。这个算法能够在很多种计算中达到相当高的效率，而且是可扩展的（也就是说，一千台机器就算不能达到一千倍的效果，至少也可以达到几百倍的效果）。Map&nbsp;and&nbsp;Reduce的另外一大特色是它可以利用大批廉价的机器组成功能强大的server&nbsp;farm。最后，它的容错性能异常出色，就算一个server&nbsp;farm宕掉一半，整个fram依然能够运行。正是因为这个天才的认识，才有了Map&nbsp;and&nbsp;Reduce算法。借助该算法，Google几乎能无限地增加计算量，与日新月异的互联网应用一同成长。</P>
<P><BR><B>算法并不局限于计算机和网络</B></P>
<P>举一个计算机领域外的例子：在高能物理研究方面，很多实验每秒钟都能几个TB的数据量。但因为处理能力和存储能力的不足，科学家不得不把绝大部分未经处理的数据丢弃掉。可大家要知道，新元素的信息很有可能就藏在我们来不及处理的数据里面。同样的，在其他任何领域里，算法可以改变人类的生活。例如人类基因的研究，就可能因为算法而发明新的医疗方式。在国家安全领域，有效的算法可能避免下一个911的发生。在气象方面，算法可以更好地预测未来天灾的发生，以拯救生命。</P>
<P>所以，如果你把计算机的发展放到应用和数据飞速增长的大环境下，你一定会发现；算法的重要性不是在日益减小，而是在日益加强。</P>]]></description>
</item><item>
<title><![CDATA[XML+RDF——实现Web数据基于语义的描述]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=AlanSmith&amp;id=14142</link>
<author>AlanSmith</author>
<pubDate>2006/5/7 9:32:58</pubDate>
<description><![CDATA[内容： <BR>&nbsp;<BR>引言——语义 <BR>数据表示中的语法与语义 <BR>XML——Web数据的语法描述标准 <BR>XML是否已经足够 <BR>RDF(Resource Description Framework)——Web数据的语义描述模型 <BR>RDF是否已经足够 <BR>参考资料 <BR>关于作者 
<P>周竞涛 (<A href="mailto:zhoujtnet@yahoo.com.cn">zhoujtnet@yahoo.com.cn</A>)<BR>王明微 (<A href="mailto:wangmv@hotmail.com">wangmv@hotmail.com</A>)<BR>西北工业大学CAD/CAM国家专业实验室<BR>2003年9月 </P>
<P>本文介绍了XML结合RDF实现Web数据基于语义的描述。<BR>今天，越来越多的Web应用需要通过交换数据来实现互操作。XML的出现使实现Web应用之间的语法互操作成为可能，而RDF则可以借助XML来实现Web应用之间的语义互操作。那么XML和RDF是如何来完成它们各自职能的呢？ <BR>引言——语义</P>
<P>语义到底是指什么？这是一个比较难回答的问题，就像有人问起Ontology到底指什么一样。如果读者已经对Semantic Web有一些了解的话，就会知道语义是一个正在改变我们所熟悉的Internet的一个关键元素，甚至是提高全球经济发展效率不可或缺的重要元素[1]。本文并不是要给出语义的一个精确解释，因为这确实很困难，尤其当这个概念被不同领域所引用的时候，它的含义往往存在着一些差异。讨论语义的目的是希望我们能够更好地理解XML和RDF到底在数据表示和交换中起到什么作用，更清楚地看到XML和RDF之间的区别，各自的优点和不足。我们可以将语义简单地看作是数据（符号）所代表的概念的含义，以及这些含义之间的关系，是对数据的抽象或者更高层次的逻辑表示。对于计算机领域来说，语义一般是指用户对于那些用来描述现实世界的计算机表示的解释，即用户用来联系计算机表示和现实世界的途径。或许这听起来还是不够通俗，让我们通过一个的例子来进一步说明语义的含义：以关系数据库为例，数据库中的数据可以简单的认为是存储在一张张表中，例如我们将学生的基本信息存入到一张"学生"表中。这时，对于表中的每一列数据所构成的集合，其所隐含的意思就是该列数据所要表达的对应的概念，这个概念往往体现为设计人员对该列数据对应的属性所给定的名称，例如"姓名"、"性别"等等。这些属性之间的关系就相当于数据对应的概念之间所存在的关系，它们都是学生这个实体的属性。数据库表中的属性和关系都可以看作数据的语义信息。当然，语义并不是这么简单，它代表的关系可能更为复杂，甚至超过E-R模型等数据库建模语言的表达范围。其实语义并不是引入到IT领域的新概念，数据库长期以来已经在用语义来区分模式和数据，并作为数据库建模、查询和事务管理技术的一部分，语义是保证数据管理系统达到可扩展性、高效性和健壮性要求的一个关键元素。</P>
<P>数据表示中的语法与语义</P>
<P>在了解了什么是语义之后，让我们来进一步讨论语法和语义在数据描述和交换中的作用。事实上，数据交换所要达到的真正目的是得到所交换数据所代表的含义，实现数据在含义上的交换，而不是单纯的数据本身的交换，这同人与人之间的信息交换类似。对于人类来说，我们可以通过相同的语言进行交互，交互双方以他们所共同遵守的语言组织规律（相当于语法）对所要表达的信息含义（相当于语义）进行组织才能使对方理解。人与人之间信息的传达并不需要非常严格的语法，即便是对方在语言表达上存在着一定的错误，我们仍然可能理解对方所要表达的意思。但对于计算机之间的信息交换来说，语法与语义缺一不可。数据正确的语法表达是保证计算机之间能够进行信息交换和处理的前提，而数据语义的描述则是数据可被计算机正确理解和推理的基础。</P>
<P>对于今天的大部分计算机应用来说，其所产生的信息并没有采用统一的语法描述格式，信息在语法描述上存在着千差万别，这就造成了信息表达上的语法异构；而对于信息所代表含义（即语义）的解释，则是以硬编码的方式写入到了应用中，这种所谓程序式语义（procedural semantics）[2]的信息语义建模方法，分离了信息的语义和信息的语法描述，将对信息的理解固化到了特定的代码逻辑中。因此程序式语义有很大的局限，既不具备扩展性也不具备通用性，难于维护和集成。与程序式语义的信息建模方法相反，声明式的语义建模方法[2]通过将数据的语义描述与特定应用逻辑的分离，将数据的语义描述纳入到数据层，将数据语义的解释留给了通用的形式化系统（例如一阶逻辑，描述逻辑，Datalog等推理系统），而与具体的数据和应用逻辑无关，具有非常好的适应性、可重用性。数据基于语义的描述就是以声明式的语义建模方法对数据的语义进行描述。通过实现数据的语义描述可以大大减轻应用处理数据的压力。</P>
<P>XML——Web数据的语法描述标准</P>
<P>信息在语法描述上的差异，我们往往可以通过必要的数据格式转化来将信息转化为目标应用能够处理的语法格式。当然，更为理想的情况应该是所有的信息都采用同样的语法来描述，XML的出现使得不同类型的数据表示成同一格式成为了可能。XML已经成为了Web上数据表示和交换的事实标准，是应用之间或者机器之间共享数据的一种有效方式。XML及其相关技术的发展极大地促进了信息表达和交换过程中语法描述上的统一，越来越多的应用开始选用XML作为其数据、配置信息、消息以及服务的语法描述模式。迄今为止，XML已经成为了Web上最理想的数据表达方式。XML的可扩展性是XML区别其他标记语言的最基本特征。XML的核心在于以一种标准化的方式来建立数据表示的结构，而将具体标记的定义留给了用户。XML的可扩展性使XML可以满足各种不同领域数据描述的需要，并可以对计算机之间交换的任何数据进行编码。</P>
<P>XML是否已经足够</P>
<P>当我们刚刚接触XML时，我们可能会因为XML的表现能力，可扩展性和光明的前景而激动不已，可是随之而来的问题是：两个用XML表示的消息或数据，如何才能实现交换？是不是我们只要采用了XML格式，二者的交换就万事大吉了?。XML除了给我们提供了一个可以被应用自动化读取的格式外，并不能进一步促进数据交换的自动化程度，我们还需要通过专用的程序来对XML数据进行解释，以获取目标应用能够处理的数据部分。注意，这里的解释并不同于对XML文档的解析。当然，对XML文档解释的前提是首先完成对XML文档的解析。尽管XML已经拥有了各种版本的解析器，但解析器的真正作用是一个XML的读取和处理器，并不是一个解释器。因此我们必须采用特定的应用程序来对XML的内容解释，很显然这些程序之间并不存在互换性和通用性。</P>
<P>尽管XML的灵活性使得用户可以快速、容易的描述任意的内容，但由于XML并不能解释它标记的含义，大多数处理应用要求这些标记集合能够满足某种标准或者双方的约定。XML允许用户通过XML模式来定义这些标记的集合。XML模式（诸如XML DTD和XML Schema等）为XML文档提供了一种约束机制，用来限定XML文档所用到的标记和这些标记之间的结构关系。XML模式为XML文档提供了一定的语义描述能力，然而XML模式的语义仍然是隐含的。XML模式的元素含义要么由用户根据元素的名称（通过自然语言描述）去推断，要么通过另外一个文档来描述，XML模式并不能对其所含有的语义进行任何解释。</P>
<P>为了实现XML文档的解释或者转换，用户必须将这些语义编码到工具中，而将数据的最终解释留给了特定的应用。不仅如此，由于XML模式只能对XML的语法合法性进行验证，而不能区分XML属性和元素在含义上的不同，因此对于同样的信息内容，我们可以将其映射为多种不同的XML结构。例如我们要说明某本书（Book）的作者（Author）是哪个作家（Name），可以得到例1中的多种XML Schema的定义。</P>
<P>例1 对于同一信息的多个XML Schema的定义</P>
<P>XML实例&nbsp; 对应的DTD定义&nbsp; </P>
<P>&lt;Book id="B_id"&gt;<BR>&nbsp;&lt;Author&gt;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;Name id="A_id"/&gt;&nbsp;<BR>&nbsp;&lt;/Author&gt;<BR>&lt;/Book&gt;</P>
<P>&nbsp;<BR>&lt;xs:element name="Author"&gt;<BR>&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="Name"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;<BR>&lt;xs:element name="Book"&gt;<BR>&nbsp;&lt;xs:complexType&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="Author"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="id" type="xs:string" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;<BR>&lt;xs:element name="Name"&gt;<BR>&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&lt;xs:attribute name="id" type="xs:string" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;<BR>&lt;/xs:schema&gt;</P>
<P>&nbsp;</P>
<P>&lt;Book id="B_id"&gt;<BR>&nbsp;&lt;Author&gt;<BR>&nbsp;&nbsp;&lt;Name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;id&gt;A_id&lt;/id&gt;<BR>&nbsp;&nbsp;&lt;/Name&gt;<BR>&nbsp;&lt;/Author&gt;<BR>&lt;/Book&gt;</P>
<P>&nbsp;<BR>&lt;xs:element name="Author"&gt;<BR>&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="Name"/&gt;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;<BR>&lt;xs:element name="Book"&gt;<BR>&nbsp;&lt;xs:complexType&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="Author"/&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&lt;xs:attribute name="id" type="xs:string" use="required"/&gt;<BR>&nbsp;&lt;/xs:complexType&gt;&nbsp;<BR>&lt;/xs:element&gt;&nbsp;<BR>&lt;xs:element name="Name"&gt;<BR>&nbsp;&lt;xs:complexType&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="id"/&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;&nbsp;<BR>&nbsp;&lt;/xs:complexType&gt;&nbsp;<BR>&lt;/xs:element&gt;<BR>&lt;xs:element name="id" type="xs:string"/&gt;</P>
<P>&nbsp;</P>
<P>&lt;Book&gt;<BR>&nbsp;&lt;id&gt;B_id&lt;/id&gt;<BR>&nbsp;&lt;Author&gt;<BR>&nbsp;&nbsp;&lt;Name&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;id&gt;A_id&lt;/id&gt;<BR>&nbsp;&nbsp;&lt;/Name&gt;<BR>&nbsp;&lt;/Author&gt;<BR>&lt;/Book&gt;</P>
<P>&nbsp;<BR>&lt;xs:element name="Book"&gt;<BR>&nbsp;&lt;xs:complexType&gt;&nbsp;<BR>&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element ref="id"/&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&lt;xs:element name="Author"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="Name"&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element name="id"/&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:element&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/xs:complexType&gt;<BR>&nbsp;&nbsp;&nbsp;&lt;/xs:element&gt;<BR>&nbsp;&nbsp;&lt;/xs:sequence&gt;&nbsp;<BR>&nbsp;&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;</P>
<P>&nbsp;</P>
<P><BR>这种数据表达上的不唯一性意味着，相同的XML文档可以存在多种不同的解释，而相同的应用也可能对不同的XML作出同样的解释。这种解释上的多对多关系，使得我们在交换XML文档之前，必须对其所使用到的标记的名称、组织格式和含义进行约定，任何对该XML文档的单方面扩展都可能会给数据交换过程带来更多的麻烦，甚至导致失败。然而，这种通过约定来实现信息共享的方式只适用于两两之间的信息交换，却不能满足Web上多个用户或团体大范围的信息共享。假设我们要集成n个应用所产生的XML信息，即便是要集成部分的含义完全一致，但由于它们来自不同的应用，各自的XML模式描述很可能存在着不同（既包括标记命名的不同也包括结构组织上的不一致），所以我们仍然不得不做大量的模式之间的转换，而目的只是为了保证它们在语法的描述结果上保持一致。当然我们可以通过采用一个统一的全局的XML模式来描述所有相关的XML信息，但这显然是不现实的，即便是在一个企业内部，我们也很难建立一个稳定的标准化的企业数据表示模式。</P>
<P>RDF(Resource Description Framework)——Web数据的语义描述模型</P>
<P>XML所存在的问题是因为XML不具备语义描述能力。为此，W3C推荐以RDF(resource Description Framework)标准来解决XML的语义局限。RDF提出了一个简单的模型用来表示任意类型的数据。这个数据类型由节点和节点之间带有标记的连接弧所组成。节点用来表示Web上的资源，弧用来表示这些资源的属性。因此，这个数据模型可以方便的描述对象（或者资源）以及它们之间关系。RDF的数据模型实质上是一种二元关系的表达，由于任何复杂的关系都可以分解为多个简单的二元关系，因此RDF的数据模型可以作为其他任何复杂关系模型的基础模型。</P>
<P>RDF和XML是互为补充的。首先，RDF希望以一种标准化，互操作的方式来规范XML的语义。XML文档可以通过简单的方式实现对RDF的引用。如例2所示。</P>
<P>例2 XML对RDF的引用示例</P>
<P><BR>&lt;?xml version="1.0"?&gt;<BR>&nbsp;&lt;Description&nbsp;&nbsp; <BR>&nbsp;&nbsp;xmlns="<A href="http://www.w3.org/TR/WD-rdf-syntax">http://www.w3.org/TR/WD-rdf-syntax</A>#"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;about="<A href="http://www.w3.org/test/page">http://www.w3.org/test/page</A>"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;s:Author ="<A href='http://www.w3.org/staff/Ora"/'>http://www.w3.org/staff/Ora"/</A>&gt;</P>
<P>&nbsp;</P>
<P>借助RDF，表达同一事实的XML描述就可以被转化为统一的RDF陈述。对于例1，它们可以表示为下面的RDF模型：</P>
<P>&nbsp;</P>
<P>通过在XML中引用RDF，可以将XML的解析过程与解释过程相结合。也就是说，RDF可以帮助解析器在阅读XML的同时，获得XML所要表达的主题和对象，并可以根据它们的关系进行推理，从而做出基于语义的判断。XML的使用可以提高Web数据基于关键词检索的精度，而RDF与XML的结合则可以将Web数据基于关键词的检索更容易地推进到基于对象的检索。</P>
<P>其次，由于RDF是以一种建模的方式来描述数据语义的，这使得RDF可以不受具体语法表示的限制。但是RDF仍然需要一种合适的语法格式来实现RDF在Web上的应用。虽然RDF（模型）既可以用Notation3[3]来表示，也可以用XML来表示。但是，由于XML已经成为被广泛支持的Web数据表示标准，便于应用的读取，因此将RDF序列化为XML表示可以使RDF获得更好的应用可处理特性，并使得RDF数据可以像XML数据一样的容易使用、传输和存储。</P>
<P>因此，RDF是定制XML的良伴，而不只是对某个特定类型数据的规范表示[4]，XML和RDF的结合，不仅可以实现数据基于语义的描述，也充分发挥了XML与RDF的各自优点，便于Web数据的检索和相关知识的发现。</P>
<P>RDF是否已经足够</P>
<P>与XML中的标记（tags）类似，RDF中的属性（properties）集也是没有任何限制的。也就是说我们既可以&lt;rdf:Description about=http://www.w3.org/test&gt;&lt;s:Creator&gt;张三&lt;/s:Creator&gt;&lt;/rdf:Description&gt;也可以用&lt;rdf:Description about=http://www.w3.org/test1&gt;&lt;s:Author&gt;张三&lt;/s: Author &gt;&lt;/rdf:Description&gt; 来表示某个作品的创作者。这就是我们通常所说的同义词现象，即同一个概念可以以不同的词汇来描述。在实际应用中这个词汇并不一定要和词典中的词汇有一定的对应关系，例如英文语法中常见的缩写就属于此种情况。与同义词现象相对应的另一个问题就是一词多意，即同一个词汇在不同的应用背景下可以表示不同的意思。RDF的模型不具备解决这两个问题的能力，而RDF Schema虽然可以为RDF资源的的属性和类型提供词汇表，但是基于RDF的数据语义描述仍然可能存在语义冲突。为了消解语义冲突，我们在描述数据语义的时候可以通过引用Ontology的相关技术，对语义描述结果作进一步的约束。幸运的是，RDF(Schema)在提供了简单的机器可理解语义模型的同时，为领域化的Ontology语言（OIL（Ontology Interchange Language），OWL（Web Ontology Language））提供了建模基础，并使得基于RDF的应用可以方便地与这些Ontology语言所生成的Ontology进行合并。RDF的这一特性使得基于RDF的语义描述结果具备了可以和更多的领域知识进行交互的能力，也使基于XML和RDF的Web数据描述具备了良好的生命力。</P>
<P>参考资料</P>
<P><BR>Amit Sheth, Robert Meersman. Amicalola Report: Database and Information Systems Research Challenges and Opportunities in Semantic Web and Enterprises. SIGMOD Record Special Issue on Semantic Web, Database Management and Information Systems, December 2002.充分讨论了Semantic Web的发展给多个领域所带来的机遇和挑战。 <BR>Stefan Decker, Sergey Melnik, Frank Van Harmelen, Dieter Fensel, Michel Klein, Jeen Broekstra, Michael Erdmann, and Ian Horrocks. The semantic web: The roles of xml and rdf. IEEE Expert, 15(3), October 2000. 该文论述了XML和RDF在Semantic Web中的不同角色和各自的作用。 <BR>SEAN B P. The Semantic Web: An Introduction [EB/OL]. <A href="http://infomesh.net/2001/swintro">http://infomesh.net/2001/swintro</A>, 2001-09.对Semanitc Web的介绍。 <BR>Uche Ogbuji.Generate RDF using XSLT.http://www-106.ibm.com/developerworks/library/x-think4/ , July 1, 2001. 讨论如何从已有的XML 格式数据转化为RDF模型的描述，突出了RDF 可用作定制 XML 的搭挡，而不仅仅用作某些数据类型的规范表示的观点。 <BR>[tttt]Tim Berners-Lee. Why RDF model is different from the XML model. <A href="http://www.w3.org/DesignIssues/RDF-XML.html">http://www.w3.org/DesignIssues/RDF-XML.html</A> September 1998 主要从查询的角度来比较XML于RDF。 <BR>Graham Klyne. Information Modelling using RDF - Constructs for Modular Description of Complex Systems. citeseer.nj.nec.com/422203.html. 该文介绍了以RDF对复杂系统建模的一些实验性工作。 <BR>Uche Ogbuji. Thinking XML # 1: XML和语义：实际情况： 介绍了语义透明性的思想，讨论了XML 相关开发的重要性。 </P>
<P>关于作者 </P>
<P>周竞涛，西北工业大学CAD/CAM国家专业实验室博士研究生，致力于将哲学、数学结合到技术研究中，主要研究方向：中间件、XML技术、EII、Semantic Web Service。 曾多次在国内外发表与XML和语义相关的学术论文。部分论文被SCI和ISTP索引。可以通过<A href="mailto:zhoujtnet@yahoo.com.cn">zhoujtnet@yahoo.com.cn</A>与他联系。</P>
<P>王明微，陕西西安，西北工业大学CAD/CAM国家专业实验室硕士研究生，研究方向：逆向工程、模式识别。可以通过<A href="mailto:wangmv@hotmail.com">wangmv@hotmail.com</A>与他联系。</P>]]></description>
</item><item>
<title><![CDATA[Java学习从入门到精通]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=AlanSmith&amp;id=14097</link>
<author>AlanSmith</author>
<pubDate>2006/5/6 10:42:47</pubDate>
<description><![CDATA[<P><FONT face="verdana, arial, helvetica" size=2>Java Learning Path （一）、工具篇<BR><BR><BR>一、 JDK (Java Development Kit)<BR><BR>JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。<BR><BR>1、 JDK的下载和安装<BR>JDK又叫做J2SE（Java2 SDK Standard Edition），可以从Sun的Java网站上下载到，<A href="http://java.sun.com/j2se/downloads.html" target=_blank>http://java.sun.com/j2se/downloads.html</A> ，JDK当前最新的版本是J2SDK1.4.2，建议下载该版本的JDK，下载页面在这里：<A href="http://java.sun.com/j2se/1.4.2/download.html。" target=_blank>http://java.sun.com/j2se/1.4.2/download.html。</A><BR><BR>下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。<BR><BR>2、 JDK的命令工具<BR>JDK的最重要命令行工具：<BR>java： 启动JVM执行class<BR>javac： Java编译器<BR>jar： Java打包工具<BR>javadoc： Java文档生成器<BR>这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK Documentation上有详细的文档。<BR><BR><BR>二、 JDK Documentation<BR><BR>Documentation在JDK的下载页面也有下载连接，建议同时下载Documentation。Documentation是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个Documentation上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。<BR><BR><BR>三、 应用服务器(App Server)<BR><BR>App Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server：<BR><BR>1、 Tomcat<BR>Tomcat严格意义上并不是一个真正的App Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍：<BR><BR>Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：<A href="http://jakarta.apache.org/tomcat/" target=_blank>http://jakarta.apache.org/tomcat/</A> ，Tomcat最新版本是Tomcat4.1.27，软件下载的连接是：<A href="http://www.apache.org/dist/jakarta/tomcat-4/binaries/" target=_blank>http://www.apache.org/dist/jakarta/tomcat-4/binaries/</A> 。<BR><BR>下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量：<BR><BR>JAVA_HOME=C:\j2sdk1.4.2<BR>CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录)<BR><BR>这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问<A href="http://localhost:8080来测试Tomcat是否正常启动。/" target=_blank>http://localhost:8080来测试Tomcat是否正常启动。/</A><BR><BR>Tomcat提供了两个Web界面的管理工具，URL分别是：<BR><A href="http://localhost:8080/admin/index.jsp" target=_blank>http://localhost:8080/admin/index.jsp</A> <BR><A href="http://localhost:8080/manager/html" target=_blank>http://localhost:8080/manager/html</A> <BR>在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行：<BR><BR>&lt;role rolename="manager"/&gt;<BR>&lt;role rolename="admin"/&gt;<BR>&lt;user username="robbin" password="12345678" roles="admin,manager,tomcat"/&gt;<BR><BR>这样用户“robbin”就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。<BR><BR>2、 BEA Weblogic<BR>Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：<A href="http://commerce.bea.com/index.jsp，Weblogic的在线文档：http://edocs.bea.com/" target=_blank>http://commerce.bea.com/index.jsp，Weblogic的在线文档：http://edocs.bea.com/</A> 。<BR><BR>3、 IBM Webshpere<BR>Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：<A href="http://www-900.ibm.com/developerWorks/cn/wsdd/" target=_blank>http://www-900.ibm.com/developerWorks/cn/wsdd/</A> ，Websphere的下载连接：<A href="http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html" target=_blank>http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html</A> 。<BR><BR>4、 Jboss<BR>Jboss是免费开源的App Server，可以免费的从Jboss网站下载：<A href="http://www.jboss.org/index.html，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：http://www.jdon.com/idea.html" target=_blank>http://www.jboss.org/index.html，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：http://www.jdon.com/idea.html</A> <BR><BR><BR>四、 Java应用的运行环境<BR><BR>Java的应用可以简单分为以下几个方面：<BR><BR>1、 Java的桌面应用<BR>桌面应用一般仅仅需要JRE的支持就足够了。<BR><BR>2、 Java Web应用<BR>Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层：<BR>Browser层：浏览器显示用户页面<BR>Web层：运行Servlet/JSP<BR>DB层：后端数据库，向Java程序提供数据访问服务<BR><BR>3、 Java企业级应用<BR>企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层：<BR>Browser层：浏览器显示用户页面<BR>Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互<BR>Web层：运行Servlet/JSP<BR>EJB层：运行EJB，完成业务逻辑运算<BR>DB层：后端数据库，向Java程序提供数据访问服务<BR><BR>4、 Java嵌入式应用<BR>Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。<BR><BR><BR>Java Learning Path（二）、书籍篇<BR><BR>学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。<BR><BR>在这里我只想补充一点看法，很多人学习Java是从《Thinking in Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。<BR><BR>对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking in Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。<BR><BR>对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。<BR><BR>在所有的Java书籍当中，其实最最有用的，并不是O'reilly的 Java Serials，真正最最有用处是JDK的Documentation！几乎你想获得的所有的知识在Documentation里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过Documentation来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，Documentation也是编程必备的手册，我的桌面上有三个Documentation的快捷方式，分别是J2SDK1.4.1的Documentation，Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation，什么其他的书籍都不需要了。<BR><BR>对于Java Web 编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet API，所以最重要的东西就是Servlet API。当然对于初学者而言，直接通过Servlet API来学习Web编程有很大的难度，我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。<BR><BR>EJB的书籍当中，《Enterprise JavaBeans, 2nd Edition》是一本很不错的书， EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。<BR><BR>但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。<BR><BR>如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA Weblogic Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。<BR><BR>在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习“设计模式”。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。<BR><BR>Java Learning Path（三）过程篇<BR><BR>每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。<BR><BR>学习Java的第一步是安装好JDK，写一个Hello World，&#61514; 其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。<BR><BR>第二步是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。<BR><BR>第三步是学习Java的面向对象的编程语言的特性的地方。比如继承，构造器，抽象类，接口，方法的多态，重载，覆盖，Java的异常处理机制。对于一个没有面向对象语言背景的人来说，我觉得这个过程需要花很长很长时间，因为学习Java之前没有C++的经验，只有C的经验，我是大概花了一个月左右吧，才彻底把这些概念都搞清楚，把书上面的例子反复的揣摩，修改，尝试，把那几章内容反复的看过来，看过去，看了不下5遍，才彻底领悟了。不过我想如果有C++经验的话，应该一两天时间足够了。那么在这个过程中，可以多看看《Thinking in Java》这本书，对面向对象的讲解非常透彻。可惜的是我学习的时候，并没有看到这本书，所以自己花了大量的时间，通过自己的尝试和揣摩来学会的。<BR><BR>第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个，我没有统计过。但是真正对于我们来说最核心的只有4个，分别是<BR>java.lang.*;<BR>java.io.*;<BR>java.util.*;<BR>java.sql.*;<BR><BR>这四个包的学习，每个包的学习都可以写成一本厚厚的教材，而O'reilly也确实是这样做的。我觉得如果时间比较紧，是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的：<BR>首先要通读整个package的框架，了解整个package的class，interface，exception的构成，最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。<BR><BR>对包整体框架的把握并不是要熟悉每个类的用法，记住它有哪些属性，方法。想记也记不住的。而是要知道包有哪些方面的类构成的，这些类的用途是什么，最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包，所以不可能详细的介绍每个类的用法，但是我反复强调，我给你们讲这些包的不是要告诉你们类的方法是怎么调用的，也不要求你们记住类的方法调用，而是要你们了解，Java给我们提供了哪些类，每个类是用在什么场合，当我遇到问题的时候，我知道哪个类，或者哪几个类的组合可以解决我的问题，That'all！，当我们具体写程序的时候，只要你知道该用哪个类来完成你的工作就足够了。编码的时候，具体的方法调用，是边写代码，边查Documentation，所有的东西都在Documentation里面，不要求你一定记住，实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。<BR><BR>第五步，通过上面的学习，如果学的比较扎实的话，就打好了Java的基础了，剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步，Java的自学能力已经被培养出来了，可以到了直接学习Documentation的水平了。除了要做GUI编程之外，JDK里面其他会有用处的包是这些：<BR>java.text.*;<BR>java.net.*;<BR>javax.naming.*;<BR>这些包里面真正用的比较多的类其实很少，只有几个，所以不需要花很多时间。<BR><BR>第六步，Java Web 编程<BR>Web编程的核心是HTTP协议，HTTP协议和Java无关，如果不熟悉HTTP协议的话，虽然也可以学好Servlet/JSP编程，但是达不到举一反三，一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话，又有了Java编程的良好的基础，学习Servlet/JSP简直易如反掌，我学习Servlet/JSP就用了不到一周的时间，然后就开始用JSP来做项目了。<BR><BR>在Servlet/JSP的学习中，重头仍然是Servlet Documentation。Servlet API最常用的类很少，花比较少的时间就可以掌握了。把这些类都看一遍，多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP，还需要熟悉几个常用JSP的标记，具体的写法记不住的话，临时查就是了。<BR><BR>此外Java Web编程学习的重点要放在Web Application的设计模式上，如何进行业务逻辑的分析，并且进行合理的设计，按照MVC设计模式的要求，运用Servlet和JSP分别完成不同的逻辑层，掌握如何在Servlet和JSP之间进行流程的控制和数据的共享，以及Web Application应该如何配置和部署。<BR><BR>第七步，J2EE编程<BR>以上的学习过程如果是比较顺利的话，进行到这一步，难度又陡然提高。因为上面的知识内容都是只涉及一个方面，而像EJB，JMS，JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶，所以掌握起来难度比较大。<BR><BR>首先一定要学习好JNDI，JNDI是App Server定位服务器资源（EJB组件，Datasouce，JMS）查找方法，如果对JNDI不熟悉的话，EJB，JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包，运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置，就需要看看专门的文档规范了，比如web.xml的写法，ejb-jar.xml的写法等等。针对每种不同的App Server，还有自己的服务资源配置文件，也是需要熟悉的。<BR><BR>然后可以学习JTA，主要是要理解JTA对于事务的控制的方法，以及该在什么场合使用JTA。这里可以简单的举个例子，我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit())，做为一个原子操作，但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作，你能做的到吗？这时候只能用JTA了。假设操作过程是先往A数据库插一条记录，然后删除B数据库另一个记录，我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话，由App Server来完成控制。<BR><BR>在学习EJB之前要学习对象序列化和RMI，RMI是EJB的基础。接着学习JMS和EJB，对于EJB来说，最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的，以及在什么情况下要用到EJB。<BR><BR>在学习完EJB，JMS这些东西之后，你可能会意识到要急不可待学习两个领域的知识，一个是UML，另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计，一个好的软件框架是软件开发成功的必要条件。在这个时候，应该开始把学习的重点放在设计模式和框架的学习上，通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。<BR><BR>J2EE规范里面，除了EJB，JMS，JTA，Servlet/JSP，JDBC之外还有很多很多的企业技术，这里不一一进行介绍了。<BR><BR>另外还有一个最新领域Web Services。Web Services也完全没有任何新东西，它像是一种黏合剂，可以把不同的服务统一起来提供一个统一的调用接口，作为使用者来说，我只要获得服务提供者给我的WSDL（对服务的描述），就够了，我完全不知道服务器提供者提供的服务究竟是EJB组件，还是.Net组件，还是什么CORBA组件，还是其他的什么实现，我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式，实现了整个Internet服务的共享，是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍，但是可以通过在网络上面查资料的方式来学习。<BR><BR>Java Learning Path（四） 方法篇<BR><BR>Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。<BR><BR>举个例子，我们都编过Hello World<BR><BR>public class HelloWorld {<BR>public static void main(String[] args) {<BR>System.out.println("Hello World");<BR>}<BR>}<BR><BR>很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写？包括我刚学习Java的时候也有这样的疑问。想知道答案吗？很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析；把main的public取掉，在试试看，报什么错误；static去掉还能不能运行；不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成int[]，或者String试试看；不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。<BR><BR>我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么了main方法是这样定义的了。<BR><BR>此外，我对于staic，public，private，Exception，try{ }catch {}finally{}等等等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。<BR><BR>其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose <BR>java –verbose<BR>javac –verbose 以及其它很多JDK工具都有这个选项<BR>-verbose 可以显示在命令执行的过程中，JVM都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出JVM在执行的过程中都干了些什么。<BR><BR>另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。<BR><BR>所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下Sun是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。<BR><BR>Java Learning Path（五）资源篇<BR><BR>1、 <A href="http://java.sun.com/" target=_blank>http://java.sun.com/</A> (英文)<BR>Sun的Java网站，是一个应该经常去看的地方。不用多说。<BR><BR>2、<A href="http://www-900.ibm.com/developerWorks/cn/" target=_blank>http://www-900.ibm.com/developerWorks/cn/</A> <BR>IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！<BR><BR>3、<A href="http://www.javaworld.com/" target=_blank>http://www.javaworld.com/</A> (英文)<BR>关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。<BR><BR>4、<A href="http://dev2dev.bea.com.cn/index.jsp" target=_blank>http://dev2dev.bea.com.cn/index.jsp</A> <BR>BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。<BR><BR>5、<A href="http://www.huihoo.com/" target=_blank>http://www.huihoo.com/</A> <BR>灰狐动力网站，一个专业的中间件网站，虽然不是专业的Java网站，但是在J2EE企业应用技术方面有深厚的造诣。<BR><BR>6、<A href="http://www.theserverside.com/home/" target=_blank>http://www.theserverside.com/home/</A> (英文)<BR>TheServerSide是一个著名的专门面向Java Server端应用的网站。<BR><BR>7、<A href="http://www.javaresearch.org/" target=_blank>http://www.javaresearch.org/</A> <BR>Java研究组织，有很多优秀的Java方面的文章和教程，特别是在JDO方面的文章比较丰富。<BR><BR>8、<A href="http://www.cnjsp.org/" target=_blank>http://www.cnjsp.org/</A> <BR>JSP技术网站，有相当多的Java方面的文章和资源。<BR><BR>9、<A href="http://www.jdon.com/" target=_blank>http://www.jdon.com/</A> <BR>Jdon论坛，是一个个人性质的中文J2EE专业技术论坛，在众多的Java的中文论坛中，Jdon一个是技术含量非常高，帖子质量非常好的论坛。<BR><BR>10、<A href="http://sourceforge.net/" target=_blank>http://sourceforge.net/</A><BR>SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。</FONT></P>]]></description>
</item>
</channel>
</rss>