<?xml version="1.0" encoding="GB2312"?>  
<rss version="2.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
xmlns:admin="http://webns.net/mvcb/" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
  
<channel> 
<title><![CDATA[梦想太阳]]></title> 
<link>http://browser.bokee.com/index.html</link> 
<description><![CDATA[linux,vxworkd ,brower,QT,Opera and so on.

my MSN :  vcomwpl@hotmail.com]]></description> 
<dc:language>zh-cn</dc:language> 
<dc:creator>vcomwpl@yahoo.com.cn</dc:creator> 
<dc:date>2007-04-06T10:17:31Z</dc:date> 
<admin:generatorAgent rdf:resource="http://blog.bokee.com.com" /> 

<item> 
<title><![CDATA[dfb+gtk+ note]]></title> 
<link>http://browser.bokee.com/6638935.html</link> 
<description><![CDATA[<p>不能参考它的安装文档你会上大档的，在用./configure时带参数如下：--with-gdktarget=directfb;(它的文档是--with-gdktarget=linux-fb)</p><p /><p>1，获得Directfb,Gtk+2.0<br />可以在www.directfb.org上，<br />2，配一个支持directfb的内核。<br />3，正常安装directfb,<br />4，正常安装gtk+-directfb.<br />注意：不能参考它的安装文档你会上大档的，在用./configure时带参数如下：--with-gdktarget=directfb;(它的文档是--with-gdktarget=linux-fb)<br />5，安装demo测试。<br />以上仅供参考。</p>]]></description> 
<guid isPermaLink="false">6638935@http://browser.bokee.com/</guid> 
<dc:subject>linux ，vxworks，等等。</dc:subject> 
<dc:date>2008-02-28T11:33:27Z</dc:date> 
</item> 
<item> 
<title><![CDATA[Linux的系统性能监测参数获取]]></title> 
<link>http://browser.bokee.com/6207755.html</link> 
<description><![CDATA[<div class="posttitle">
		<a href="http://www.cppblog.com/cyt/archive/2006/03/02/3660.html" class="singleposttitle" id="viewpost1_TitleUrl">Linux的系统性能监测参数获取</a>
	</div>
	<p>目前的工程需要简单的监测一下Linux系统的：CPU负载、内存消耗情况、几个指定目录的磁盘空间、磁盘I/O、swap的情况还有就是网络流量。<br />Linux下的性能检测工具其实都有很多。mrtg（<a href="http://people.ee.ethz.ch/%7Eoetiker/webtools/mrtg/">http://people.ee.ethz.ch/~oetiker/webtools/mrtg/</a>）
就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤，似乎比较麻烦。本来
也想直接调用sar、vmstat之类的命令，parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本
parse它们的结果，那还不如直接去系统里面获得算了。于是研究了一下sysstat（<a href="http://freshmeat.net/projects/sysstat/">http://freshmeat.net/projects/sysstat/</a>）和gkrellm（<a href="http://gkrellm.net/">http://gkrellm.net</a> ）的源代码，找到监测性能的数据所在。<br /><br />1、CPU<br />&amp;#160;&amp;#160;&amp;#160;
在文件&amp;quot;/proc/stat&amp;quot;里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是：
user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在，CPU的每tick用
在了哪里。例如：<br />cpu0 256279030 0 11832528 1637168262<br />就是cpu0从开机到现在有
256279030
tick用在了user消耗，11832528用在了sys消耗。所以如果想计算单位时间（例如1s）里面CPU的负载，那只需要计算1秒前后数值的差除
以每一秒的tick数量就可以了。gkrellm就是这样实现的：((200 * (v2 - v1) /
CPU_TICKS_PER_SECOND) + 1) /2<br />例如，第一次读取/proc/stat，user的值是256279030；一秒以
后再读一次，值是256289030，那么CPU在这一秒的user消耗就是：((200 * (256289030 - 256279030) /
CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。<br /><br />2、内存消耗<br />&amp;#160;&amp;#160;&amp;#160;文件&amp;quot;/proc/meminfo&amp;quot;里面包含的就是内存的信息，还包括了swap的信息。例如：<br />$ cat /proc/meminfo<br />&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; total:&amp;#160;&amp;#160;&amp;#160; used:&amp;#160;&amp;#160;&amp;#160; free:&amp;#160; shared: buffers:&amp;#160; cached:<br />Mem:&amp;#160; 1057009664 851668992 205340672&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 67616768 367820800<br />Swap: 2146787328 164429824 1982357504<br />MemTotal:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 1032236 kB<br />MemFree:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 200528 kB<br />MemShared:&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 0 kB<br />……<br />不过从gkrellm的源代码看，有些版本没有前面那两行统计的信息，只能够根据下面的Key: Value这种各式的数据收集。<br /><br />3、磁盘空间<br />&amp;#160;&amp;#160;&amp;#160;
从gkrellm的源代码看，这个是一个很复杂的数据。磁盘分区的数据有可能分布在：/proc/mounts、/proc/diskstats、
/proc/partitions等等。而且如果想要检查某几个特定的路径，还需要通过mount、df等命令的帮助。为了减少麻烦，这个数据我就直接用
statfs函数直接获得了。<br />int statfs(const char *path, struct statfs *buf);<br />这个函数只需要输入需要检查的路径名称，就可以返回这个路径所在的分区的空间使用情况：<br />总空间：buf.f_bsize * buf.f_blocks<br />空余空间：buf.f_bsize * buf.f_bavail<br /><br />4、磁盘I/O<br />&amp;#160;&amp;#160;&amp;#160;磁盘I/O的数据也同样比较复杂，有些版本看/proc/diskstats，有些版本看/proc/partitions，还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样，需要隔一段时间取值，两次取值的差就是流量。<br /><br />5、网络流量<br />&amp;#160;&amp;#160;&amp;#160;网络流量也是五花八门，不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。<br /><br />&amp;#160;&amp;#160;&amp;#160;以上就是数据获得源头。程序也比较好写，不外乎就是打开一些文件，逐行读出来然后用sscanf来parse一下数据就可以了。</p><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">6207755@http://browser.bokee.com/</guid> 
<dc:subject>linux ，vxworks，等等。</dc:subject> 
<dc:date>2007-04-06T10:17:23Z</dc:date> 
</item> 
<item> 
<title><![CDATA[AJAX 开发库]]></title> 
<link>http://browser.bokee.com/6152568.html</link> 
<description><![CDATA[<p>1. Pure Javascript: Application Frameworks<br />1.1 Bindows (成立于2003年)</p><p>Backbase是一个通过DHTML、JavaScript、CSS和HTML等技术强劲联合起来的一套完整的Windows桌面式的WEB应用程序解决方案。Bindows无需下载安装客户端支撑组件（如Java、ActiveX或Flash），仅需一个浏览器。纯OO的理念体现在Bindows任何地方，Bindows或许是笔者见过的最完整最强大的AJAX应用程序平台。 <br />Bindows是商业程序的，使用了来自于MB的技术(总部位于GA USA，主要开发中心在瑞典，成立于2002年)。<br />Bindows框架提供的功能和特性有： <br />基于面相对象技术的类和API<br />一套完整的Windows桌面系统，支持各种特性窗口模式，包括菜单、表单、表格、滑动条、测量仪器窗口和其他一些Windows窗口特性支持。<br />是开发zero-footprint(零空间占用)SOA客户端应用程序首选工具包<br />本机的XML，SOAP和XML-RPC支持<br />单用户到企业级开发的支持<br />内建的完美的AJAX支持<br />Bindows开发环境： <br />支持企业级规模的项目开发<br />跨浏览器、跨OS平台的支持<br />不受服务器结构限制<br />良好的与新的、现有的资源互操作性<br />统一的开发接口<br />1.2 BackBase (成立于2003年)<br />BackBase是一个完整的浏览器端框架，提供了丰富的浏览器操作功能，以及对.NET和JAVA平台的集成。 <br />商业化产品，来自于Backbase B.V(总部在Amsterdam，成立于2003年)。 <br />1.3 DOJO (开发中,成立于2004年9月) </p><p>DOJO提供完整的轻量级窗口组件和浏览器-服务器消息映射支持<br />提供创建自定义Javascript窗口组件的框架支持<br />预制的丰富的窗口类型库<br />B/S消息映射支持——XMLHttpRequest和其他机制<br />支持浏览器中的URL操纵功能<br />开源许可(Academic Free License 2.1)，由JotSpot的Alex Russell所领导。<br />1.4 Open Rico (开发中;成立于2005年5月;基于早期的一个proprietary 框架) </p><p>Open Rico是一个支持Ajax架构和用户交互的多用途框架。 <br />一个XMLHttpRequest response能被一个或多个的DOM对象，或者Javascript对象调用。<br />支持拖拽操作<br />支持基于AJAX的动画模式，如缩放和变换等<br />基于Behaviors的操作库<br />使用指南，由RussMirimar的Yonah提供<br />开源。源于Sabre航空公司解决方案，由Bill Scott，Darren James及另外一些人维护。<br />1.5 qooxdoo (开发中; 成立于2005年5月) <br />qooxdoo，是另一个发展迅猛的应用框架，提供广泛的UI支持，正在开发基础架构等特性。 <br />基础结构特性：<br />能轻易的捕获和操纵DOM事件<br />支持调试<br />支持一个时间操作的Timer类<br />Getter/Setter支持<br />UI:<br />窗口组件库和框架<br />界面布局管理<br />图像缓存和透明PNG图片处理<br />开源(LGPL).<br />1.6 Tibet (开发中; 创建于2005年6月)</p><p>Tibet提供了大量的易移植和完整的JavaScript API，通过这些可以快速生成大量的客户端代码，Tibet自称是企业级AJAX。<br />远程脚本调用封装在XMLHttpRequest中<br />URI支持<br />支持所有的HTTP事件，不再仅仅是GET和POST<br />低级的协议-File://和WebDav也可以当作HTTP正常使用<br />Web Services调用支持，包括SOAP、XML-RPC等等<br />大型的Javascript对象库<br />多种多样的XML操作支持<br />IDE和开发工具<br />开源协议(OSI)<br />1.7 AJFORM (创建于2005年6月)</p><p>AJFORM是一个极易上手的AJAX框架，被用来编写入门级的AJAX代码，提供有以下功能：<br />三步安装<br />自动支持任意HTML表单元素<br />几乎无需编码即可实现AJAX<br />2 Pure Javascript: Infrastructural Frameworks<br />2.1 AjaxCaller(创建于2005年5月，目前是Alpha版)<br />AjaxCaller是一个具有多线程安全访问的XMLHttpRequest组件，主要针对Ajax开发新手，目前仍处于alpha开发阶段，仅在AjaxPatterns的在线搜索范例中使用了这个程序。 <br />用明文或者XML结构的数据实现和服务器的交互(GET/POST/PUT/DELETE)<br />支持XMLHttRequest对象的构析(销毁对象，C++支持内存对象的构析操作)<br />支持Response的高速缓存(尚在计划中)<br />简单的库文件代码易于新手学习使用，并且支持脚本调试<br />开源协议<br />2.2 Flash JavaScript Integration Kit</p><p>The Flash JavaScript Integration Kit可以使Flash和Javascript脚本实现相互集成。<br />可以实现在JavaScript中调用Flash ActionScript脚本，反之亦然。<br />几乎支持双方主要数据类型的在不同环境中的传递调用。<br />开源协议，有几个Flash开源爱好者维护。<br />2.3 Google AJAXSLT (2005年6月发行) </p><p>Google AJAXSLT，是一个Javascript框架，用来执行XSLT转换以及XPath查询。<br />目前在Google Map上就使用了这个。<br />开源协议(BSD)<br />2.4 HTMLHttpRequest(Beta版；创建于2005年)</p><p>HtmlHttpRequest最大的特点就是运用XMLHttpRequest对象和标准HTML标签IFrame来实现最大限度的跨浏览跨平台的AJAX支持，其原理是在支持XMLHttpRequest的浏览器上调用XMLHttp，如果不支持，就用IFrame来模拟实现异步交互。<br />目前支持的浏览器：IE6/Win, IE5.5/Win, IE5/Win, IE4/Win, Mozilla/Win, Opera7/Win, Safari/Mac, IE5/Mac<br />尚未测试的浏览器：IE4/Mac, Mozilla/Mac, Opera/Other, Konqueror/Linux。<br />开源协议(LGPL)<br />2.5 Interactive Website Framework (创建于2005年)</p><p>Interactive Website Framework定位在浏览器中支持各种各样的AJAX基础应用的开源项目。自称是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架，包括一个可定制易读的XML解析器。实际上，IWF是一个AJAX的基础框架，并且还包括一些通用脚本代码。<br />实现了线程安全的XMLHttpRequest<br />对XML Document进行封装，以便创建更具有可读性的代码：<br />var node = doc.groceries.frozen[0].pizza[0].size;<br />封装后的数据读取 <br />var node = doc.documentElement.firstChild.firstChild.getAttribute(&amp;quot;size&amp;quot;);<br />原始的DOM操作读取<br />开源协议<br />2.6 LibXMLHttpRequest (2003年6月发布) </p><p>libXmlRequest是一个小型XMLHttpRequest封装包<br />用getXML()和postXML()两个事件简化XMLHttpReuqest调用<br />支持XMLHttpRequest对象池<br />Response缓存处理<br />源码可以使用，但是有版权保护。<br />2.7 MAJAX </p><p>MAJAX是另一个非常小巧的HttpRequest封装包，为收发字符型信息提供简单接口，并为每步动作设置回调界面。<br />2.8 RSLite (x) </p><p>RSLite是一个XMLHttpRequest封装组件，作为Brent Ashley的JSRS(JavaScript Remote Scripting)其中的一部分功能单独发布。详情可以看JSRS的介绍<br />2.9 Sack(开发中，成立于2005年5月) </p><p>Sack也是一个很有名字的微型XMLHttpRequest封装包。调用者可以自定义回调函数或者是DOM对象。借助于回调DOM对象，可以把Response回来的数据直接以文本的方式嵌入DOM中。<br />2.10 Sarissa (发布于2003年2月)</p><p>Sarissa是一个JavaScript API，封装了在浏览器端独立调用XML的功能。<br />可移植的XMLHttpRequest对象创造<br />可移植的XPath查询<br />可移植的DOM操控<br />可移植的XSLT<br />可移植的XML序列化<br />开源协议(GPL2.0和LGPL2.1)<br />2.11 XHConn (2005年4月发布)</p><p>XHConn也是一个小型的XMLHttpRequest封装库。笔者也使用改良过的XHConn，其特点就是调用简单，代码也清晰易读。<br />例子：<br />new XHConn().connect(&amp;quot;mypage.php&amp;quot;，&amp;quot;POST&amp;quot;，&amp;quot;foo=bar&amp;amp;baz=qux&amp;quot;，fnWhenDone);<br />开源协议许可<br />3 Server-Side: Multi-Language<br />3.1 Cross-Platform Asynchronous INterface Toolkit (2005年5月) </p><p>CPAINT是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台提供你需求的AJAX和JSRS代码，并自动返回到浏览器端相应的Javascript脚本代码，这种方式易于实时反馈需求的WEB应用程序。<br />支持PHP和ASP<br />所有功能函数都在统一的JavaScript文件中<br />支持远程脚本和XML<br />支持本地和远程函数调用<br />可以创建单个或多个XMLHttp对象<br />返回给后台的数据即可以是文本也可以是XML/DOM文档对象<br />支持POST和GET<br />用服务端代理的方式实现远程函数和数据的访问操作<br />大部分浏览器中测试正常使用<br />在GNU、GPL、LGPL开源协议保护下发行<br />3.2 SAJAX (2005年3月) </p><p>SAJAX的实现方式很独特，例如：调用一个javascript方法x_calculateBudget()，将先把响应传到服务器并调用一个Java calculateBudget()方法，然后以javascript方式把值返回到x_calculateBudget_cb()中。SAJAX的名气不错，估计很多人都听过甚至用过，不过缺点就是它的这套映射理论感觉较繁锁，远不如一些轻量级的封装库好用，不过SAJAX最大的特点就是支持的平台丰富，几乎囊括了WEB下常用的编程语言和平台<br />很方便从JavaScript函数映射到服务端代理操作<br />支持多种平台(ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby)<br />开源协议<br />3.3 Javascipt Object Notation (JSON) and JSON-RPC </p><p>JSON是一个&amp;quot;face-free&amp;quot; XML，而JSON-RPC是一种远程交互协议，类似于XML-RPC，对JavaScript支持较强<br />支持多服务端平台: Java, Python, Ruby, Perl. <br />针对不同的平台有不同的包和许可协议, 如JSON-RPC-Java. <br />3.4 JavaScript Remote Scripting(JSRS)(2000年) </p><p>JSRS，较经典的远程脚本访问组件，支持将客户端数据通过服务器做代理进行远程的数据/操作交互。<br />支持的浏览器：IE4+，NS4.x，NS6.x，Mozilla，Opera7和Galeon。<br />服务器端脚本语言支持：ASP，ColdFusion，PerlCGI，PHP,Python和JSP(servlet)。<br />开源协议。由Brent Ashley提供支持。<br />3.5 Bitkraft for ASP.NET </p><p>Bitkraft是个基于(.NET)Web框架的CLR(公共语言运行库)，允许用独特的方式创建和操作分布式Web内容。用C#编写，运行在微软的.NET 1.1和Mono框架下，无缝式的客户端-服务器响应方式是它的最大特点。Bitkraft没有使用XML组织数据，而是用JSON代替。<br />支持的浏览器： IE5+, Firefox1+, NS6 <br />服务器端要求：ASP.NET, Mono XSP, Cassini, Apache (modMono) .NET Framework 1.1+<br />事件驱动<br />支持同步和异步的远程代理<br />客户端支持所有的.NET类型或自定义类对象映射到JSON中<br />用JSON取代XML<br />免费，开源许可协议<br />4 Server-Side: Java <br />4.1 WebORB for Java (2005年8月) </p><p>WebORB for Java是一个开发AJAX和基于Flash的富客户端应用程序的开发平台。在线例子<br />WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何Java对象、XML Web Services和EJB<br />支持异步或同步的事件驱动<br />不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指定代理等。<br />同步调用不需要回调，异步调用需要一个回调方法。<br />客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的转变为状态。<br />提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。<br />支持数据分页技术。客户应用程序能检索页面中的数据。<br />支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex types, arrays, native .net collections, remote references<br />目前有两个版本：标准版(免费)，专业版(商业许可)<br />4.2 Echo 2 (2005年3月) </p><p>Echo 2允许你用纯Java语言编写AJAX程序。 Demo. <br />自动生成HTML和Javascript代码<br />用XML在客户端-服务端传递消息<br />如果愿意支持自定义Javascript组件<br />开源协议(Mozilla Public License or GNU LGPL)<br />4.3 Direct Web Remoting (DWR) (2005) </p><p>Direct Web Remoting可以在Javascript代码中直接调用Java方法的应用框架<br />类似于SAJAX，可以把Javascript中的请求调用转递到Java方法中并将执行结果返回给Javascript<br />可以和任何Web框架一起使用，如Struts、Tapestry等等<br />开源(Apache)，目前该产品被加入到WebWork中<br />4.4 SWATO (2005) </p><p>SWATO是一套可重用的和良好集成的Java/JavaScript库，它实现了一种更容易的方式来改变你的web应用程序的交互，通过AJAX方式实现。<br />服务端Java库可以非常容易的部署到所有Servlet2.3+兼容的容器中<br />客户端Javascript库可以在所有支持XMLHttpRequest的浏览器中使用<br />使用JSON技术在服务端组织POJO数据，这样你可以在任何Javascript环境中(HTML、XUL、SVG)访问这些远程数据，这种方式很容易通过硬编码或者某种成熟的Javascript库集成到当前应用中<br />提供一个简单接口使你能在Javascript中调用远程的POJO数据<br />使用&amp;lt;servlet&amp;gt;和&amp;lt;filter&amp;gt;灵活的在web.xml中进行配置，并且可以集成(不是必须)到你的Spring框架中<br />提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框，在线表单，在线列表等等)<br />4.5 AJAX JSP Tag Library </p><p>The AJAX JSP Tag Library是一组JSP标签库，用来AJAX程序开发。可以在J2EE下无需Javascript就能轻松开发AJAX模式的Web Form。标签库为比较通用的AJAX功能提供了5个标签：<br />autocomplete: 用户在文本框中输入字符，自动从指定的数据中匹配用户输入的字符，类似于Google Suggest<br />callout:可以为A标签加入气泡式的消息提示框，不过是实时的服务端取出数据<br />Select/dropdown:类似于联动菜单，比如地州市的联动下拉框<br />toggle:开关闸按钮，比如在一个hidden表单域中存储true和falsh，同时显示相应的img图像<br />update field:更新数据，也就是无刷新提交了。<br />4.6 AJAX Java Server Faces Framework </p><p>The AJAX-JSF用来把任意的JSF应用程序转变为AJAX应用程序<br />例子：AJAX组件的 MyFaces JSF Tree(树型目录), table scroller(可滚动的表格), tabbed pane(分页栏)<br />开源协议(Apache Software License)<br />Server-Side: Lisp <br />5.1 CL-Ajax </p><p>CL-Ajax实现Javascript直接调用服务端Lisp<br />生成可带参数的函数<br />可以回调Javascript函数或者DOM对象<br />可以集成到SAJAX中<br />开源许可<br />6 Server-Side: .NET <br />6.1 WebORB for .NET (2005年8月) </p><p>WebORB for .NET是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应用程序(在线例子) <br />WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何.NET对象、XML Web Services<br />支持异步或同步的事件驱动<br />不需要在服务端修改任何代码，不需要自定义方法或属性、变量等。不要求设计时指定代理等。<br />同步调用不需要回调，异步调用需要一个回调方法。<br />客户端可以向服务端请求指定的活动方式，不需要任何编程就可以把处理结果轻易的转变为状态。<br />提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable，而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。<br />支持数据分页技术。客户应用程序能检索页面中的数据。<br />支持以参数的方式返回所有服务期端数据类型，如primitives, strings, complex types, arrays, native .net collections, remote references<br />目前有两个版本：标准版(免费)，专业版(商业许可)<br />6.2 Ajax.NET (2005年3月) </p><p>Ajax.NET是首家支持各种方式通过Javascript访问服务端.net的免费库<br />类似于SAJAX，能把Javascript请求发送到.NET方法，服务端回传给Javascript，甚至包括串行化自定义类。<br />可以在Javascript中访问Session和Application数据<br />缓存查询结果<br />免费使用源代码<br />无需更改源代码，允许给Ajax.NET添加和修改方法和属性<br />所有类支持Javascript客户端返回数据，可以在JavaScript中使用DataSet：res.Tables[0].Rows<br />使用HtmlControls组件访问和返回数据<br />页面无需重载，用事件代理(数据访问层)<br />因为只提供一个调用接口方法，所以服务端CPU占用非常少<br />6.3 ComfortASP.NET (2005年8月) </p><p>ComfortASP.NET可以让开发者在纯.NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)特性的应用程序。<br />快速应答<br />减少HTML传输<br />减少页面重载<br />无闪烁的浏览器内容更改<br />AJAX用户体验，<br />6.4 AjaxAspects (2005年8月) </p><p>AjaxAspects是个可以用Javascript调用服务端WebService事件的引擎<br />用标准的SOAP和WSDL进行服务端-客户端通信<br />用简单的类型和XML对象支持带参数的返回值<br />缓存支持<br />动作队列<br />免费使用，开源协议<br />7 Server-Side: PHP <br />7.1 AjaxAC (2005年4月) </p><p>AjaxAC用一个单独类封装了完整的应用程序功能<br />所有的功能集成在自包含的类中(另外附带一些Javascript库)<br />调用PHP文件或者HTML页面非常简易，只需创建App类后把类引用传递给需要调用的Javascript对象或者HTML元素即可。<br />捕获Javascript事件<br />可以自定义配置数据，并且支持运行时参数更改<br />无需再Javascript代码中夹杂凌乱的Html代码，所有事件都是被动态附加上的<br />由于以上两个优点，所以支持良好的模版引擎<br />容易Hook到PHP类和MySql数据已返回给自己的request<br />能够容易的用Javascript建立窗口模式应用程序。<br />7.2 JPSpan </p><p>JPSPAN通过Javascript直接调用PHP中的函数。<br />进行了严谨的单元测试<br />开源许可(PHP)<br />7.3 XAJAX </p><p>XAjax通过Javascript直接调用PHP中的函数<br />支持用Javascript调用PHP脚本<br />开源许可协议<br />8 Server-Side: Ruby <br />8.1 Ruby On Rails </p><p>Ruby On Rails是一个支持AJAX的完整Web框架，使用Ruby语言编写，严格按照MVC结构开发。<br />当Ajax出现的时候Rails还处于其发展的早期，因此Ajax可能逐渐成为Rails框架的核心。<br />生成浏览器中大多数/全部的Window应用组件和动画的Javascript脚本。<br />支持服务器端调用。</p>]]></description> 
<guid isPermaLink="false">6152568@http://browser.bokee.com/</guid> 
<dc:subject>浏览器技术点滴</dc:subject> 
<dc:date>2007-03-10T10:04:49Z</dc:date> 
</item> 
<item> 
<title><![CDATA[ActiveX技术面面观]]></title> 
<link>http://browser.bokee.com/6134985.html</link> 
<description><![CDATA[<p>想要彻底理解web开发的方方面面，Activex应该是绕不过去的一个，虽然现实的开发中不会用到微软的平台，但其理念，可以借鉴。</p><p>一、ActiveX的由来 </p><p><br />ActiveX最初只不过是一个商标名称而已，它所涵盖的技术并不是各自孤立的，其中多数都与Internet和Web有一定的关联。更重要的是，ActiveX的整体技术是由Microsoft的COM(Component Object Model，组件对象模型)构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与Microsoft Office和Windows以及Microsoft现在所做的一切都有关联，但显然这些产品并不是ActiveX家族中的成员。</p><p>ActiveX是从Microsoft的复合文档技术——OLE成长起来的。OLE最初发布的版本，只是瞄准复合文档，但在后续版本OLE2中，导入了COM。COM是应OLE设计者的需求而诞生的。其基本的出发点是想让某个软件通过一个通用的机构为另一个软件提供服务。因而，COM的第一个使用者是OLE2。实际上，COM与复合文档间，没有多大关系。后来，COM就作为与复合文档完全无关的技术，开始被广泛使用。这样一来，Microsoft就开始&amp;quot;染指&amp;quot;通用平台技术。但COM不是产品，它需要一个商标名称。不巧，市场专家们选用了&amp;quot;OLE&amp;quot;作为商标名称。于是，使用COM的技术都开始贴上了OLE的标签。当然，这些技术中的绝大部分与复合文档没有关系。Microsoft要想向人们解释:&amp;quot;OLE不单单是指复合文档!&amp;quot;，这要花费相当的精力和时间。</p><p>于是，在1996年春，Microsoft改变了主意，选择了ActiveX作为新商标名。ActiveX是指宽松定义的、基于COM的技术集合，而OLE仍然仅指复合文档。当然，最重要的核心还是COM。</p><p>让对象模型完全独立于编程语言，这是一个非常新奇的思想。从C++和Java的对象上，我们就能有所了解。但所谓COM对象究竟是什么?为了便于理解，可以把COM看作是某种(软件)打包技术，即把它看作是使软件的不同部分，按照一定的面向对象的形式，组合成可以交互的过程和一组支持库。COM对象可以用C++、Java和VB等任意一种语言编写，并可以DLL或作为不同过程工作的执行文件的形式来实现。使用COM对象的客户端，无需关心对象是用什么语言写的，也无需关心它是以DLL、还是以另外的过程来执行的。从客户端来看，无任何区别。</p><p>这样一个通用的处理技巧非常有用。例如，由用户协调运行的两个应用，可以将它们的共同作业部分，作为COM对象间的交互来实现(当然，现在的OLE复合文档也能做到)。为在浏览器中执行而从Web服务器下载的代码，浏览器可把它看作是COM对象。即是说，COM技术也是一种打包可下载代码的标准方法(ActiveX控件执行这种功能)。</p><p>甚至连应用与本机OS进行交互的方法，也可以用COM来指定(Windows和Windows NT用的新API，多数是作为COM对象来定义的)。COM虽然起源于复合文档，但却可有效地适用于许多软件问题。</p><p>二、ActiveX王国</p><p>Active平台是Microsoft的世界观。其基本思想是:使用ActiveX控件，来构筑包括从与用户交互和适应COM的事务处理监视器到Web服务器、全部实现自动化的机构。Active平台包括两大部分:Active Server和Active Client。</p><p>Active Server实际上是中间层。使用组件或Active服务器页面，来提供用于业务逻辑和主要应用处理的场所。ActiveServer的技术，其核心是NT Server、Microsoft事务处理服务器、数据管理服务、目录服务、Web服务以及网络服务。</p><p>事务处理服务器是把线程产生和数据库多重化等传统的TP监控功能与Microsoft的基于组件的编程模型结合起来。数据管理服务等Active平台的其他组件是用OLE DB和ODBC，访问DB2、Oracle、SQL Server等的数据源。目录服务是在DCOM(Distributed COM，分布式COM)的周围，提供目录服务层，这样使远程对象在网络上能相互搜索。Web服务以Internet信息服务器为中心进行构筑，它为服务器上的Web应用开发，提供脚本生成(Scripting)机构。网络服务以DCOM为中心进行构筑，通过以同步MS-RPC为中介的网络，使之能够连接控件。</p><p>Active Client是一种交叉平台。Microsoft的技术纵然是独家所有，但也希望将这种技术向多个OS开放。具体实施计划是使用脚本引擎(Scripting Engine)。这种脚本引擎是由标准的HTML和带有Microsoft特色的Java虚拟机(JVM)、Microsoft的VBScript与JScript所构成的。Active Client组装进了Microsoft的IE 3.0和4.0，通过ActiveX，可以变成用户的C/S应用的一部分。</p><p>从清一色采用Windows的企业用户来看，Active平台可以提供坚固的、具有可缩放性的服务器应用开发平台。ActiveServer在TP监视器这类高端产品的场合，也利用常见的一些工具和技术。因此，小型工作组和Intranet应用不会超越Active Server的能力。Active平台的目标机虽是异种机环境，但由于过分依赖IE，所以不能驱动客户端。尽管在一些非Windows平台上也推出了Explorer，但最好的支持、最新版本的Explorer还是在Windows上。</p><p>三、ActiveX的进展</p><p>1.向分布计算扩充</p><p>COM的最初版本假定COM对象及其客户端是在同一个机器上运行(可以在同一个进程内，也可以在不同的进程内)，DCOM是ActiveX家族中的重要成员。后来，它在Windows 95中也能使用。DCOM对于客户端制作COM对象、进行交互的方法没有做任何改变。</p><p>客户端使用完全相同的代码，可以访问本地以及远程对象。但许多场合下，客户想使用少数的DCOM附件。DCOM备有分布式安全保密机制，提供认证和数据加密。在1998年要发布的Windows NT 5.0中，要将Kerberos等安全保密协议，追加到DCOM中。DCOM已能够利用域名服务等简洁的目录服务，以用于搜寻在其他机器上的COM对象。NT 5.0要追加对Active Directory的支持。Active Directory是基于域名服务和轻型目录访问协议的。</p><p>DCOM的劲敌，此前一直是OMG(Object Management Group)的CORBA(Common Object Request Broker Architecture)。它被组装进了Iona的Orbix和Visigenic的VisiBroker等产品中。不久前，另一种支持分散对象的技术——Java的远程方法调用出台了。无论是CORBA，还是DCOM，都能在多种语言写的对象间进行通信。而RMI却不同，它只限于在由Java实现的对象间进行通信。显然，这是个制约。但RMI使用起来非常简单。另外，RMI的开发者可以用Java来设计协议规范。因此，在语言的功能上，可以做得浑然一体。若写一个只处理两三个客户端的DCOM服务器，还是比较简单的。但是，要构筑一个高效处理几百、几千个客户端的DCOM服务器，则相当之难。</p><p>为了便于编写可缩放的DCOM服务器，Microsoft发布了事务处理服务器(MTS)。MTS在支持事务处理的同时，也提供自动生成线索和智能对象的重复使用等服务。MTS使可缩放服务器的制作变得相当简单。即使是无需事务处理的应用，使用MTS也有好处。实际上，Microsoft鼓励人们用VB来写MTS应用。这与开发业务服务器的传统手法不同，所有的MTS应用，都是作为一个以上的COM对象来编写，且必须以DLL来实现。一般情况下，客户端看不到MTS。客户端只管一如既往地制作、使用COM对象即可。</p><p>2.组件的标准化</p><p>基于组件的应用开发，其方法和组装电子装置一样，可以用已制作好的组件部件来构筑应用。桌面用的、基于COM的组件叫做ActiveX控件。所谓ActiveX控件不过是遵从一定的标准、与客户端交互的COM对象而已。</p><p>例如，ActiveX控件必须通过Automation (即使用dispinterfaces)来公开方法。用这个被标准化的交互功能，可以在多个不同的上下文中，使用同一个控件。在这个标准接口的&amp;quot;幕后&amp;quot;，ActiveX控件几乎是什么都能执行。现在，许多软件公司都能提供实现各种功能的控件。</p><p>ActiveX控件是作为DDL编写的，为此，必须装载到某个容器中。ActiveX控件的原型容器是VB，除此之外，还有多种容器可供选择。目前，一个非常重要的控件容器是Microsoft的Web浏览器Internet Explorer。</p><p>现在所谓ActiveX控件的那些内容，是实现许多方法所必须的。已经把它们从机器的本地硬盘移到了VB等容器中。几百KB和几MB的控件，似乎没有什么大区别。但要将控件装载到Web浏览器时，很可能要通过速度很慢的电话线。现在，控件的大小已经是非常关键的问题。一旦要执行超过了某个限度以上的控件，就会延长下载时间。因此，Microsoft规定:在ActiveX控件中，只能执行绝对必要的功能。</p><p>Apple和IBM推行的OpenDoc，曾是ActiveX控件的主要竞争对手。现在OpenDoc的赞助企业，已正式宣告中止资助。大部分与Microsoft对抗的企业，转而支持JavaBeans(基于Java的组件结构)。ActiveX控件，基本上都是和Windows捆绑在一起、以二进制机器代码发放的，而JavaBeans却不同，它在哪儿都能执行。这当然是有代价的。显而易见，只要不牺牲可移植性，就不可能完全、彻底地利用本地环境。要编写从公共Internet上能下载的组件时，应优先选择JavaBeans。</p><p>桌面组件市场在持续、急速增长。其中绝大部分是以ActiveX控件构筑的(目前JavaBeans仍然是少数)。但服务器组件的标准化要落后一些。在桌面上，Web浏览器、VB以及PowerBuilder这些编程环境，作为容器是强有力的。但服务器容器又该当如何呢?作为服务器上的组件容器，事务处理服务器是一个较好的选择。</p><p>Microsoft的竞争对手，千方百计要阻止MTS和NT称霸市场。他们正在快马加鞭地制订服务器上的组件标准，其中最有前途的是Enterprise JavaBeans。它是JavaBeans的扩充，并定义了事务处理服务器接口。Enterprise JavaBeans的支持者们，希望独立软件厂商不是将服务器组件作为COM组件来编写，而是要作为Beans来编写。</p><p>四、ActiveX的构筑工具</p><p>随着ActiveX控件的推广，ActiveX控件的开发工具逐日增加。由于ActiveX不依赖于语言，所以传统的开发工具基本上都能构筑、配备ActiveX控件。最常用的有Delphi、PowerBuilder以及Visual Basic、Visual C++、Visual J++等。</p><p>1.基本概况</p><p>用3GL开发ActiveX控件的方法有:①MFC (Microsoft Foundation Class，Microsoft基础类)，②ATL(ActiveX Template Library，ActiveX模板库)，③BaseCtrl Framework等。MFC最经典，采用MFC，可以使开发者不去关心接口，而是集中精力关注对象的动作。缺点是控件的规模较大且执行时DLL必须与容器同时存在。ATL可利用模板生成代码。就是说，库和DLL无需与控件一起推出。在ATL中，需要从作为模板存在的几个基本类派生类。ATL也有缺点，即接口的处理较难，应用中必要的接口，必须分别制作。另外，ATL不支持类向导(Class Wizard)。遗憾的是，没有使对象描述语言(Object Description Language)和接口定义语言文件、与用户代码自动同步的向导。BaseCtrl是个简便型库。与ATL非常相似，但无模板。实际上，由于BaseCtrl过于简便，Microsoft并不支持它。在BaseCtrl中，带有几个万能控件(Skeleton Control)。BaseCtrl提供容易理解的ActiveX开发模型，但与ATL相比并不简单，且灵活性也不及ATL。目前看来，对于ActiveX控件开发者来说，BaseCtrl是个&amp;quot;苦涩&amp;quot;的选择。</p><p>2.开发工具</p><p>可制作ActiveX控件的、最初的工具是Microsoft的Visual C++。它可为ActiveX开发者提供最多的控件。Visual J++也可以制作ActiveX控件。</p><p>Borland推出的两个工具(JBuilder和IntraBuilder)也非常令人瞩目。但是，用Borland的工具能制作ActiveX组件的， 只有Delphi 3.0和C++ Builder。Borland把Delphi的ActiveX开发功能，叫作Active Inside。它是将任意的Delphi Window做成ActiveX的形式。Active Inside备有配备在Web上的新控件。Delphi可以将控件链接到COM和DCOM。</p><p>PowerBuilder 5.0是改造成能用于ActiveX开发的、客户机/服务器开发工具。 PowerBuilder可以将Data Window(PowerBuilder应用开发的核心部分)作为ActiveX控件来配备。以使现在的PowerBuilder开发者，能使用PowerScript编程语言等某些熟悉的功能。具有制作ActivX控件最好工具的，当属Microsoft。例如，若用Visual Basic 5.0，开发者就可使用可视化编程环境和本机的Visual Basic for Application语言，来开发控件。</p><p>五、ActiveX的未来</p><p>的确，Windows和Windows NT的世界，是ActiveX技术的最佳环境。但无论Microsoft如何卖力推进它的OS，也不能使所有的企业都变成清一色的Windows。因此，Microsoft要设法使COM、DCOM以及ActiveX家族的一部分，也能在其他OS上使用。现在，在Macintosh中，已经支持ActiveX，其中也包含对ActiveX控件的支持。Software AG正在把这些技术移植到多个Unix和IBM的OS/390上。DEC和HP也打算将这些技术在自己的系统上使用，他们也是用移植Microsoft代码的办法来实现的。</p><p>COM已成为Windows 95和Windows NT环境下基础软件的重要部分，但它的未来还有许多不确定的因素。例如，Microsoft是否能将COM作为多平台技术，让其继续存在发展下去?为了使NT服务器能适合已有的企业，就必须要使DCOM等分布式服务也能在非Microsoft平台上应用。要解决这些问题， 需花费相当长的一段时间。另外， 基于CORBA的产品和Java的RMI，已成功地运行在多OS环境下。多平台DCOM出台得越晚，CORBA和RMI就领先越多。ActiveX控件和JavaBeans的竞争前景如何?无论使软件运行在Web浏览器上也好，还是在另外的地方运行也好，总之，组件式软件(ComponentWare)将是下一个软件开发的热点。</p><p>目前，ActiveX控件虽然暂居领先，但由于OpenDoc的自生自灭，与Microsoft竞争的企业会结为一体与之抗衡。用户决不希望看到&amp;quot;一统天下&amp;quot;，仅就这点而言，JavaBeans也会在这一市场竞争中抢占一席之地。</p>]]></description> 
<guid isPermaLink="false">6134985@http://browser.bokee.com/</guid> 
<dc:subject>浏览器技术点滴</dc:subject> 
<dc:date>2007-03-02T08:51:00Z</dc:date> 
</item> 
<item> 
<title><![CDATA[一起吃苦的幸福]]></title> 
<link>http://browser.bokee.com/6018921.html</link> 
<description><![CDATA[
我们越来越爱回忆了<br />是不是因为不敢期待未来呢<br />你说世界好像天天在倾塌着<br />只能弯腰低头把梦越做越小了<br />是该牵手上山看看的<br />最初动心的窗口有什么景色<br />不能不哭你就让我把你抱着<br />少了大的惊喜也要找点小快乐<br />就算有些事烦恼无助<br />至少我们有<font style="color: rgb(225, 9, 0);">一起吃苦的幸福</font><br />每一次当爱走到绝路<br />往事一幕幕会将我们搂住<br /><br />我们越来越爱回忆了<br />是不是因为不敢期待未来呢<br />你说世界好像天天在倾塌着<br />只能弯腰低头把梦越做越小了<br />是该牵手上山看看的<br />最初动心的窗口有什么景色<br />不能不哭你就让我把你抱着<br />少了大的惊喜也要找点小快乐<br />就算有些事烦恼无助<br />至少我们有<font style="color: rgb(225, 9, 0);">一起吃苦的幸福</font><br />每一次当爱走到绝路<br />往事一幕幕会将我们搂住<br />虽然有时候际遇起伏<br />至少我们有<font style="color: rgb(225, 9, 0);">一起吃苦的幸福</font><br />一个人吹风只有酸楚<br />两个人吹风不再狐单无助<div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">6018921@http://browser.bokee.com/</guid> 
<dc:subject>技术之外</dc:subject> 
<dc:date>2007-01-05T13:15:54Z</dc:date> 
</item> 
<item> 
<title><![CDATA[vi使用注记]]></title> 
<link>http://browser.bokee.com/5995879.html</link> 
<description><![CDATA[<span style="padding: 4px;"><span class="postbody"><span style="font-weight: bold;">进入vi的命令</span><br /> vi filename :打开或新建文件，并将光标置于第一行首<br /> vi +n filename ：打开文件，并将光标置于第n行首<br /> vi + filename ：打开文件，并将光标置于最后一行首<br /> vi +/pattern filename：打开文件，并将光标置于第一个与pattern匹配的串处<br /> vi -r filename ：在上次正用vi编辑时发生系统崩溃，恢复filename<br /> vi filename....filename ：打开多个文件，依次进行编辑<br /> <br /> <span style="font-weight: bold;">移动光标类命令</span><br /> h ：光标左移一个字符<br /> l ：光标右移一个字符<br /> space：光标右移一个字符<br /> Backspace：光标左移一个字符<br /> k或Ctrl+p：光标上移一行<br /> j或Ctrl+n ：光标下移一行<br /> Enter ：光标下移一行<br /> w或W ：光标右移一个字至字首<br /> b或B ：光标左移一个字至字首<br /> e或E ：光标右移一个字至字尾<br /> ) ：光标移至句尾<br /> ( ：光标移至句首<br /> }：光标移至段落开头<br /> {：光标移至段落结尾<br /> nG：光标移至第n行首<br /> n+：光标下移n行<br /> n-：光标上移n行<br /> n$：光标移至第n行尾<br /> H ：光标移至屏幕顶行<br /> M ：光标移至屏幕中间行<br /> L ：光标移至屏幕最后行<br /> 0：（注意是数字零）光标移至当前行首<br /> $：光标移至当前行尾<br /> <br /> <span style="font-weight: bold;">屏幕翻滚类命令</span><br /> Ctrl+u：向文件首翻半屏<br /> Ctrl+d：向文件尾翻半屏<br /> Ctrl+f：向文件尾翻一屏<br /> Ctrl＋b；向文件首翻一屏<br /> nz：将第n行滚至屏幕顶部，不指定n时将当前行滚至屏幕顶部。<br /> <br /> <span style="font-weight: bold;">插入文本类命令</span><br /> i ：在光标前<br /> I ：在当前行首<br /> a：光标后<br /> A：在当前行尾<br /> o：在当前行之下新开一行<br /> O：在当前行之上新开一行<br /> r：替换当前字符<br /> R：替换当前字符及其后的字符，直至按ESC键<br /> s：从当前光标位置处开始，以输入的文本替代指定数目的字符<br /> S：删除指定数目的行，并以所输入文本代替之<br /> ncw或nCW：修改指定数目的字<br /> nCC：修改指定数目的行<br /> <br /> <span style="font-weight: bold;">删除命令</span><br /> ndw或ndW：删除光标处开始及其后的n-1个字<br /> do：删至行首<br /> d$：删至行尾<br /> ndd：删除当前行及其后n-1行<br /> x或X：删除一个字符，x删除光标后的，而X删除光标前的<br /> Ctrl+u：删除输入方式下所输入的文本<br /> <br /> <span style="font-weight: bold;">搜索及替换命令</span><br /> /pattern：从光标开始处向文件尾搜索pattern<br /> ?pattern：从光标开始处向文件首搜索pattern<br /> n：在同一方向重复上一次搜索命令<br /> N：在反方向上重复上一次搜索命令<br /> ：s/p1/p2/g：将当前行中所有p1均用p2替代<br /> ：n1,n2s/p1/p2/g：将第n1至n2行中所有p1均用p2替代<br /> ：g/p1/s//p2/g：将文件中所有p1均用p2替换<br /> <br /> <span style="font-weight: bold;">选项设置</span><br /> all：列出所有选项设置情况<br /> term：设置终端类型<br /> ignorance：在搜索中忽略大小写<br /> list：显示制表位(Ctrl+I)和行尾标志（$)<br /> number：显示行号<br /> report：显示由面向行的命令修改过的数目<br /> terse：显示简短的警告信息<br /> warn：在转到别的文件时若没保存当前文件则显示NO write信息<br /> nomagic：允许在搜索模式中，使用前面不带“\”的特殊字符<br /> nowrapscan：禁止vi在搜索到达文件两端时，又从另一端开始<br /> mesg：允许vi显示其他用户用write写到自己终端上的信息<br /> <br /> <span style="font-weight: bold;">最后行方式命令</span><br /> ：n1,n2 co n3：将n1行到n2行之间的内容拷贝到第n3行下<br /> ：n1,n2 m n3：将n1行到n2行之间的内容移至到第n3行下<br /> ：n1,n2 d ：将n1行到n2行之间的内容删除<br /> ：w ：保存当前文件<br /> ：e filename：打开文件filename进行编辑<br /> ：x：保存当前文件并退出<br /> ：q：退出vi<br /> ：q!：不保存文件并退出vi<br /> ：!command：执行shell命令command<br /> ：n1,n2  w!command：将文件中n1行至n2行的内容作为command的输入并执行之，若不指定n1，n2，则表示将整个文件内容作为command的输入<br /> ：r!command：将命令command的输出结果放到当前行<br /> <br /> <span style="font-weight: bold;">寄存器操作</span><br /> &amp;quot;?nyy：将当前行及其下n行的内容保存到寄存器？中，其中?为一个字母，n为一个数字<br /> &amp;quot;?nyw：将当前行及其下n个字保存到寄存器？中，其中?为一个字母，n为一个数字<br /> &amp;quot;?nyl：将当前行及其下n个字符保存到寄存器？中，其中?为一个字母，n为一个数字<br /> &amp;quot;?p：取出寄存器？中的内容并将其放到光标位置处。这里？可以是一个字母，也可以是一个数字<br /> ndd：将当前行及其下共n行文本删除，并将所删内容放到1号删除寄存器中。</span> <p><br /> 进入vi<br /> vi&amp;#160;test<br /> 离开vi<br /> :q!&amp;#160;离开vi,并放弃刚在缓冲区内编辑的内容。<br /> &amp;#160;:wq&amp;#160;将缓冲区内的资料写入磁盘中，并离开vi。<br /> &amp;#160;:ZZ&amp;#160;同wq<br /> 同wq<br /> :w&amp;#160;将缓冲区内的资料写入磁盘中，但并不离开vi。<br /> :q&amp;#160;离开vi,若文件被修改过，则会被要求确认是否放弃修改的内容，此指令可与:&amp;#160;w&amp;#160;配合使用。<br /> Vi&amp;#160;的操作模式<br /> Vi&amp;#160;提供两种操作模式：<br /> 输入模式（insert&amp;#160;mode）<br /> 指令模式（command&amp;#160;mode）<br /> 当使用者进入vi后，既处于指令模式下，此刻键入任何字元皆被视为指令。</p> <p>输入模式：a(append)&amp;#160;游标之后加入资料。<br /> A&amp;#160;该行之末加入资料<br /> i&amp;#160;(insert)&amp;#160;游标之前加入资料<br /> I&amp;#160;该行之首加入资料<br /> o&amp;#160;(open)&amp;#160;新增一行与该行之下供输入资料<br /> O&amp;#160;新增一行与该行之上供输入资料</p> <p>指令模式：B&amp;#160;　&amp;#160;　　　移至该行第一个字符，若光标在该行第一字符则光标移至上一行第一字符。<br /> &amp;#160;b&amp;#160;　　&amp;#160;由游标所在位置之前一个字串的第一个字元<br /> cc&amp;#160;删除整行，修改整行的内容。<br /> D　　　　　&amp;#160;以行为单位，删除游标在内后面的所有字符。<br /> db&amp;#160;删除该行光标前字符<br /> dd&amp;#160;删除该行<br /> de&amp;#160;删除自光标开始后面的字符<br /> d加字符　　　删除光标所在位置至字符之间的单<br /> E　　　　　　移至该行最后字符，若光标在该行最后字符则光标移至下一行最后字符<br /> e　　　　　　由游标所在位置至该字串的最后一个字元<br /> G&amp;#160;移至该档案的最后一行<br /> h&amp;#160;向前移一个字元<br /> j&amp;#160;向下移一个字元<br /> k&amp;#160;向上移一个字元<br /> 0&amp;#160;移至该行之首<br /> M&amp;#160;移至视窗的中间那行<br /> L&amp;#160;移至视窗的最后一行<br /> l&amp;#160;向后移一个字符<br /> 0&amp;#160;由游标所在位置该行的第一个字元<br /> nG&amp;#160;移至该档案的第n行<br /> n+&amp;#160;自游标所在位置向后移n行至该行的第一字符<br /> n-&amp;#160;自游标所在位置向前移n行至该行的第一字符<br /> R&amp;#160;进入取代状态，直到《ESC》为止<br /> s&amp;#160;删除游标所在字元，并进入取代模式直到《ESC》<br /> S&amp;#160;删除游标所在之该行资料，并进入输入模式直到《ESC》<br /> w&amp;#160;由游标所在位置之下一个字串的第一个字元<br /> x&amp;#160;删除游标所在该字元。<br /> X&amp;#160;删除游标所在之前一字元。<br /> r&amp;#160;用接于此指令之后的字元取代（replace）游标所在字元<br /> yy&amp;#160;yank整行，使游标所在该行复制到记忆体缓冲区<br /> &amp;lt;ctrl&amp;gt;&amp;lt;g&amp;gt;&amp;#160;显示该行之行号、档案名称、档案中最末之行号、游标所在行号占<br /> 总行号之百分比<br /> $&amp;#160;由游标所在位置至该行的最后一个字元。<br /> ）&amp;#160;由游标所在位置至下一个句子的第一个字元。<br /> （&amp;#160;由游标所在位置至该句子的第一个字元。<br /> {&amp;#160;由游标所在位置至该段落的最后一个字元。<br /> }&amp;#160;由游标所在位置至该段落的第一个字元</p> <p>yank和delete可将指定的资料复制到记忆体缓冲区，而藉有put指令可将缓冲区内的资料复制到荧幕上<br /> 例如：搬移一行&amp;#160;：在该行执行dd<br /> 游标移至目的地<br /> 执行p<br /> 复制一行&amp;#160;：在该行执行yy<br /> 游标移至目的地<br /> 执行p<br /> 视窗移动：<br /> &amp;lt;ctrl&amp;gt;&amp;lt;f&amp;gt;&amp;#160;视窗往下卷一页<br /> &amp;lt;ctrl&amp;gt;&amp;lt;b&amp;gt;&amp;#160;视窗往上卷一页<br /> &amp;lt;ctrl&amp;gt;&amp;lt;d&amp;gt;&amp;#160;视窗往下卷半页<br /> &amp;lt;ctrl&amp;gt;&amp;lt;u&amp;gt;&amp;#160;视窗往上卷半页<br /> &amp;lt;ctrl&amp;gt;&amp;lt;e&amp;gt;&amp;#160;视窗往下卷一行<br /> &amp;lt;ctrl&amp;gt;&amp;lt;y&amp;gt;&amp;#160;视窗往上卷一行<br /> 删除、复制及修改指令介绍：<br /> d(delete)、c(change)和y(yank)这一类的指令在vi&amp;#160;中的指令格式为：<br /> operation+scope=command<br /> (运算子)（范围）<br /> 运算子：<br /> d&amp;#160;删除指令。删除资料，但会将删除资料复制到记忆体缓冲区。<br /> y&amp;#160;将资料（字组、行列、句子或段落）复制到缓冲区。<br /> p&amp;#160;放置（put）指令，与d和y配合使用。可将最后delete或yank的资料放置于游标所在位置之行列下。<br /> c&amp;#160;修改（change）指令，类似delete于insert的组合。删除一个字组、句子等资料，并插入新键入的</p></span><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">5995879@http://browser.bokee.com/</guid> 
<dc:subject>linux ，vxworks，等等。</dc:subject> 
<dc:date>2006-12-28T13:08:59Z</dc:date> 
</item> 
<item> 
<title><![CDATA[在QNX平台上开发Java应用程序 4]]></title> 
<link>http://browser.bokee.com/5995567.html</link> 
<description><![CDATA[<font class="contentwithhtml">
		<strong>4.1 SWT类库的安装和配置</strong> </font><p><font class="contentwithhtml">Eclipse
项目的发布在IT界可以说是一次震撼，这不仅仅是因为IBM
公司无偿公开了花费4000万美元开发出来的一整套代码，也不仅仅是因为支持这个项目的包括目前在市场上相当吃香的Rational,
Borland, Red Hat以及QNX等公司。最让人吃惊的是：Eclipse 项目的矛头直接针对的是IBM公司最亲密无间的Java合作夥伴
-- Sun公司。就象Eclipse这个名字所意味的那样，IBM
的目的是要建立一套各种程序设计语言都能够使用的模块化的开发平台，并且希望它能够成为一个业界公认的标准平台。 </font></p><p><font class="contentwithhtml">Eclipse
项目中最令人震撼的一点是它用称为SWT的的图形库和工具包取代了Java标准中的AWT和Swing。根据Eclipse项目的解释，SWT直接调用了
操作系统的图形库，从而使得Java应用程序的Look &amp;amp; Feel
与操作系统的习惯完全一致；更为重要的是，对本地方法的直接调用大幅度的提高了基于SWT
的Java应用程序的运行速度。关于SWT与AWT/Swing的优点和缺点我们将在这一章的第三节中进行比较和讨论。 </font></p><p><font class="contentwithhtml">为了在我们的Java应用程序中使用SWT，我们需要做一点必要的配置，如下： </font></p><p><font class="contentwithhtml">(1) /usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar 是Eclipse平台的运行库，需要将它放到类路径里面。 <br />(2) /usr/eclipse/plugins/org.eclipse.ui/workbench.jar是Eclipse 平台的图形界面库，需要把它放到类路径里面。 <br />(3) /usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar里面是SWT 的基本类库，需要将它放在类路径里面。 <br />(4) /usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 这个目录下面存放的是SWT 与本地方法的接口，需要放在LD_LIBRARY_PATH里面。 </font></p><p><font class="contentwithhtml">修改.profile文件，如下： </font></p><p><font class="contentwithhtml">export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar <br />export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.ui/workbench.jar <br />export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar <br />export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 <br /></font></p><p><font class="contentwithhtml">改动过这些设置以后，最简单的办法是重新启动Photon来让这些新的设置生效。 </font></p><p><font class="contentwithhtml"><b>4.2 一个简单的SWT图形用户界面</b> </font></p><p><font class="contentwithhtml">通常来说，构建一个基于SWT 的图形用户界面需要经过如下步骤： </font></p><p><font class="contentwithhtml">(1) 创建一个Display对象，该对象代表一个SWT 进程(session)。 <br />(2) 创建一个或者是多个Shell对象，一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器，也就是应用程序的主窗口。<br />(3) 在Shell对象上面创建用户所需要的控件。<br />(4) 初始化所有的控件，包括大小和初始值等，为控件的事件注册必要的监听器Listener。<br />(5) 打开主窗口。<br />(6) 启动事件处理循环，一直到用户结束程序的运行。<br />(7) 垃圾回收。<br /></font></p><p><font class="contentwithhtml">下面是一个简单的基于SWT 的Java应用程序HelloSwt: </font></p><table width="70%" cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" align="center"><tbody><tr><td><pre><code><br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.SWT;<br /><br />public class HelloSwt<br />{<br />    public static void main(String[] args)<br />    {<br />        Display display = new Display();<br />        Shell   shell   = new Shell(display);<br />        Label   label   = new Label(shell, SWT.CENTER);<br />        label.setText(&amp;quot;Hello SWT!&amp;quot;);<br />        label.setBounds(shell.getClientArea());<br />        shell.open();<br />        while (!shell.isDisposed())<br />        {<br />            if (!display.readAndDispatch()) display.sleep();<br />        }<br />        display.dispose();<br />    }<br />}<br /></code></pre></td></tr></tbody></table><p><font class="contentwithhtml">使用下面的命令编译以上例程： </font></p><p><font class="contentwithhtml">#j9c -classpath $CLASSPATH HelloSwt.java </font></p><p><font class="contentwithhtml">使用下面的命令运行以上例程： </font></p><p><font class="contentwithhtml">#j9 HelloSwt </font></p><p><font class="contentwithhtml">我
们可以看到，基于SWT的图形用户界面在外观上和基于AWT的图形用户界面有明显的不同。更为重要的是，能够明显的感受到HelloSwt的启动速度比
HelloAwt要快很多。 QNX 高效的微内核图形界面系统当然是提高用户应用程序运行速度的一个方面，但是更重要的是SWT 直接调用了QNX
的微内核图形界面系统的功能，而AWT 则没有利用到操作系统所提供的这些优势。 </font></p><p><font class="contentwithhtml">SWT 是一套与AWT/Swing 完全不同的图形界面系统，新接触SWT 的程序员还是需要花费一段时间来熟悉SWT的结构和API。下面推荐的几个参考资料能够让你轻松的开始利用SWT 进行图形用户界面设计： </font></p><p><font class="contentwithhtml">The Programmer's Guide for Eclipse， 这是Eclipse项目发布的官方程序员手册，其PDF 版可以从这个地址下载： </font></p><p><font class="contentwithhtml">http://www.eclipse.org/documentation/pdf/org.eclipse.platform.doc.isv.pdf </font></p><p><font class="contentwithhtml">这份文档也可以从这个网站联机查看： </font></p><p><font class="contentwithhtml">http://download.eclipse.org/downloads/documentation/2.0/html/plugins/org.eclipse.platform.doc.isv/ </font></p><p><font class="contentwithhtml">另外，www.eclipse.org最近在其网站上发布了关于SWT的结构及其应用的一系列文章，也非常的有参考价值。如果有感兴趣的网友，请自行到 Eclipse 的网站查看。 </font></p><p><font class="contentwithhtml"><b>4.3 关于SWT和AWT/Swing的一点讨论</b> </font></p><p><font class="contentwithhtml">通
过3.3 的讨论我们知道在AWT 中的图形用户界面是通过本地方法来实现的，每个AWT
方法都有一个与其对应的本地方法，称为peer。由于平台无关性的需要，AWT
所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。通过这种机制，在所有的平台上相同的AWT
控件的Java代码是一样的，其性能也是类似的。SWT
所采取的则是一种完全相反的方法，它是通过一些本地方法将操作系统的图形库完全的暴露给虚拟机。在这些本地方法的基础上，SWT
通过纯粹的Java代码实现了需要的图形界面功能。由于各个操作系统所提供的图形库是不一样的，同样一个控件在不同平台上的Java实现通常来说是不一样
的。基于同样的道理，同样的SWT 程序在不同平台上的性能和表现也许是不一样的。 </font></p><p><font class="contentwithhtml">SWT 所采取的这种方法决定了它在技术上要比AWT 要具有更多的优点，如下： </font></p><p><font class="contentwithhtml">(1)
如果操作系统A 支持某种图形控件而操作系统B 不支持，AWT 就会出于平台无关性的要求拒绝提供这个控件。SWT 则会在操作系统A
上原封不动的调用操作系统所提供的控件，在操作系统B
上则使用该操作系统所提供的其它功能对该控件进行模拟。例如Windows平台本身就提供了树和表格等控件而其它一些操作系统不提供这些控件，SWT
在Widnows平台上就会直接调用Windows的方法来实现这些控件，AWT 为了实现平台无关性拒绝提供这些控件，Swing
则为了实现纯Java的目的在AWT 的基础上自己来画这些控件 -- 尽管它画出来的东西很少有画得好的。 </font></p><p><font class="contentwithhtml">(2)
由于SWT 大量的采用了本地平台所提供的图形库，SWT 中的控件风格跟本地平台的UI风格是完全一致的，因为在SWT
中的控件基本上就是操作系统本身的控件。这一点对于AWT 来说是比较相似的，但是Swing 的表现就不太一样了，譬如说在Windows
XP上面用Swing 画一颗树它看起来就跟Widnows 2000上面的树一模一样，尽管Windows XP跟Widnows
2000本身的树形控件是不一样的。 </font></p><p><font class="contentwithhtml">(3)
在SWT中，大部份的事物逻辑都是用Java写的，在SWT
中C/C++代码的比重远比AWT中C/C++代码比重要小。这样使得程序设计人员能够更加方便的对SWT
应用程序进行调试，也能够更清楚的知道在后台运行的本地方法究竟在做什么事情。更为重要的是，SWT利用比AWT 更少的C/C++
代码实现了比AWT 更快的图形用户界面，这个优势在嵌入式应用中往往是决定性的。 </font></p><p><font class="contentwithhtml">SWT
的缺点主要在于两点：(1) 不是Java语言标准；和(2) 支持的平台太少。目前版本的Eclipse仅仅支持Windows
98/ME/2000/XP, RH 7.1, SuSE 7.l, Solaris 8, QNX,
AIX和HP-UX几个有限的平台。而作为Java 语言标准的AWT/Swing 则在目前大部份的主流和非主流操作系统上都有支持。 </font></p><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">5995567@http://browser.bokee.com/</guid> 
<dc:subject>浏览器技术点滴</dc:subject> 
<dc:date>2006-12-28T11:06:32Z</dc:date> 
</item> 
<item> 
<title><![CDATA[在QNX平台上开发Java应用程序 1]]></title> 
<link>http://browser.bokee.com/5995562.html</link> 
<description><![CDATA[<font class="contentwithhtml">
		<strong>1.1 QNX 实时操作系统介绍</strong> </font><p><font class="contentwithhtml">QNX
实时操作系统(QNX Real Time Operating
System)是由位于加拿大渥太华的QNX软件系统公司开发的一个针对嵌入式应用的微内核操作系统。QNX软件系统公司成立于1981年，在过去的20
多年中一直致力于微内核实时操作系统的研究与开发。目前的QNX
实时操作系统已经发展成一个可以使用在严实时应用中的高可靠性实时操作系统，能够运行在x86/Pentium, PowerPC, ARM,
StrongARM, XScale, MIPS,
SH-4等一系列硬件平台上，是在关键任务应用中首选的两个实时操作系统之一(另外一个是VxWorks)。 </font></p><p><font class="contentwithhtml">QNX
是一个与电气工程师协会(Institute of Electrical and Electronics
Engineers，IEEE)发表的便携式操作系统界面标准(Portable Operating System Interface,
POSIX)
相兼容的实时操作系统。该操作系统提供了一系列可裁剪的功能全面的高可靠性高性能组件，包括分布式计算，资源管理，网络应用，图形窗口系统，文件系统，以
及对Java的支持等等。此外，QNX还是一个与Linux高度兼容的操作系统，由于gcc和gmake等Linux
平台上常用的应用程序开发工具已经被移植到QNX
平台上，很多为Linux平台编写的应用程序可以直接拿到QNX平台上编译运行。此外，QNX还提供了一个类似于Visual
C++的应用程序集成开发环境，称为Photon Applicatioin Buider
(PHAB)。在这个集成开发环境里程序开发人员能够很方便的开发和调试基于图形用户界面的QNX 应用程序。 </font></p><p><font class="contentwithhtml">更
为重要的是，对于应用程序开发人员来说，QNX是一个完全免费的实时操作系统。根据QNX软件系统公司发布的使用授权协议，在一个产品商业化之前应用程序
开发人员可以自由的使用QNX实时操作系统系统而无须向QNX
公司交付任何软件使用费用。同样，QNX的应用程序集成开发环境PHAB对于软件开发人员来说也是免费的。QNX
实时操作系统以及QNX应用程序集成开发环境均可以从QNX公司的主页www.qnx.com下载。 </font></p><p><font class="contentwithhtml"><b>1.2 QNX 实时操作系统对Java语言的支持</b> </font></p><p><font class="contentwithhtml">QNX
Neutrino使用IBM公司开发的业界领先的J9虚拟机为Java应用程序以及小应用程序提供了支持。目前可供选择的方案有两个，一个是与J2ME标
准完全兼容的WebSphere嵌入式环境，另外一个是WebSphere客户环境，提供了一个可裁剪的Java 2语言标准的子集。由于QNX
是一个多任务操作系统，因此可以同时运行多个虚拟机为不同的应用程序提供服务。基于微内核的microGUI窗口界面系统为AWT提供了全面的支持，在其
它平台上开发的基于AWT的图形用户界面可以不加修改的在QNX平台上运行。此外，QNX还通过使用本地线程保证了正确的线程调度。 </font></p><p><font class="contentwithhtml">IBM
公司开发的J9虚拟机通过了Modena JT++以及Plum Hall JVS
等一系列严格的业界测试，是一个与J2ME标准完全兼容Java虚拟机。由于J9是一个专门为实时的嵌入是应用开发的虚拟机，因此在其设计中对速度优化，
内存管理，线程管理，本地方法，垃圾回收，及时编译，可移植性以及可裁剪性能方面做了很大的努力。根据多个公开发表的测试结果，J9虚拟机是目前运行速度
最快的嵌入式Java虚拟机。对本地方法的支持，使得应用程序开发人员能够直接控制外围设备，调用实时操作系统的功能。J9虚拟机本身对内存的要求极少，
用户更可以通过一个配置工具使得应用程序在特定的嵌入式系统中对内存的要求降低到最小。就象一般的Java应用程序一样，内存的分配和回收都是通过虚拟机
来自动管理的，因此在一般情况下不会产生内存泄露。此外，J9虚拟机还提供了一个垃圾回收机制管理工具，使得用户能够在运行时刻控制和改变所使用的垃圾回
收机制。在线程管理方面，J9虚拟机直接使用底层实时操作系统所提供的线程调度机制，从而保证了正确的代码能够在正确的时间被执行。高度可裁剪的类库使得
用户能够将应用程序所不需要的类和方法排除在嵌入式系统之外，从而进一步节省了对系统存储空间的要求，也间接地提高了嵌入式应用程序的执行速度。目前版本
的J9虚拟机支持大多数流行的嵌入式软硬件平台，包括运行在x86, MIPS, PowerPC, SH-4, 68K,
SPARC平台上的Windows, Linux, QNX, Solaris, AIX, Pocket PC, Palm
OS等操作系统。由于J9虚拟机卓越不群的表现，它被Java
Pro杂志评选为2002年度最佳嵌入式Java平台。同时，使用J9作为Java平台的WebSphere Studio Device
Developer (也就是以前的Visual Age for Java Micro Edition) 也被Java
Pro杂志评选为2002年度最佳嵌入式开发工具，又被Java World杂志评选为最佳Java设备应用程序开发工具。 </font></p><p><font class="contentwithhtml">值
得一提的是，QNX 软件系统公司是Eclipse Consortium的发起者和最早的成员之一。Eclipse 是由IBM
公司牵头开发的开放源代码的Java应用程序开发平台，其目的是为应用程序开发人员提供一套完备的高度可裁剪的高性能软件开发组件。Eclipse
Consortium成立于2001年11月，目前已经拥有Borland, IBM, QNX, Red Hat, SuSE, Sybase,
Rational等18个成员。由Eclipse Consortium
发布的Java应用程序集成开发环境Eclipse是完全免费的，可以运行在Windows, Red Hat Linux, SuSE Linux,
Solaris, QNX和AIX等操作系统上。也就是说，在QNX平台上也是可以使用集成开发环境Eclipse来开发Java应用程序的。 </font></p><p><font class="contentwithhtml"><b>1.3 QNX 实时操作系统以及集成开发环境的安装和配置</b> </font></p><p><font class="contentwithhtml">QNX
实时操作系统的安装非常简单。首先你需要从QNX公司的网站下载最新版本的QNX
操作系统，下载的地址是http://www.qnx.com/nc/download.qnx。目前最新的版本是QNX
6.2，下载文件是qnxnc620.iso，这是一个CD-ROM映像文件。将这个映象文件里面的内容刻录到一张光盘上，然后利用该光盘启动计算机即可
开始安装QNX 操作系统。总的来说安装的过程相当的简单，只需要选择启动方式以及指定QNX
文件系统所在的位置即可。系统文件拷贝完成后将自动的重新启动机器，然后需要用root登录进入系统并且自动安装其它应用程序。在一台500 MHz
+ 128 MB的计算机上，安装过程通常都小于15分钟，相对来说还是非常快的。系统安装完成后，即可直接使用PHAB以及gcc等程序开发工具，
但是要使用Java还需要进行一点小小的配置。 </font></p><p><font class="contentwithhtml">J9虚拟
机的缺省安装位置是/usr/eclipse/ive。在这个目录下有bin和lib两个子目录，bin目录包含了J9虚拟机的可执行文件和所需要的库文
件，lib目录则包含了各种版本的Java类库。未来在QNX
系统上使用J9虚拟机，我们需要将合适的目录包括在PATH和LD_LIBRARY_PATH
这两个环境变量中。我们需要修改用户家目录(~)下面的.profile文件，使之包含如下语句： </font></p><p><font class="contentwithhtml">export J9_HOME=/usr/eclipse/ive <br />export PATH=$PATH:$J9_HOME/bin:. <br />export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$J9_HOME/bin <br /></font></p><p><font class="contentwithhtml">应
用程序集成开发环境Eclipse SDK for QNX可以从Eclipse
Consortium的主页下载，下载地址是http://www.eclipse.org/downloads/。将所下载的zip
文件拷贝到/usr目录中，然后使用unzip命令解压缩。然后你还需要下载针对
J9虚拟机的插件，下载地址是http://dev.eclipse.org/viewcvs/index.cgi/
%7Echeckout%7E/jdt-debug-home/plugins/org.eclipse.jdt.launching.j9/
index.html。你需要根据你所下载的Eclipse SDK for
QNX的版本好选择一个合适的插件，然后将下载的zip文件解压缩到/usr/eclipse/plugins目录中。同样，我们需要修改用户家目录
(~)下面的.profile文件从而将Eclipse 所需要的路径和库路径包含在环境变量PATH和LD_LIBRARY_PATH中。 </font></p><p><font class="contentwithhtml">export ECLIPSE_HOME=/usr/eclipse <br />export ECLIPSE_PLUGIN=/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 <br />export PATH=$PATH:$ECLIPSE_HOME <br />export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECLIPSE_PLUGIN <br /></font></p><p><font class="contentwithhtml">到此为止我们以及成功的安装与配置了QNX 实时操作系统以及相关的Java应用程序开发工具。下面我们简单的介绍几个常用的命令： </font></p><p><font class="contentwithhtml">j9c -- 类似于Java SDK中的javac命令，是用来编译Java源代码的。 <br />j9 -- 类似于Java SDK中的java命令，是用来运行Java应用程序的。<br />eclipse -- 这个命令启动Eclipse for QNX应用程序集成开发环境。<br /></font></p><p><font class="contentwithhtml"><b>1.4 一个简单的Hello World程序</b> </font></p><p><font class="contentwithhtml">在没有开始写Hello World之前，我们首先介绍一下QNX 上的文本编辑器。很多熟悉类UNIX操作系统的朋友也许会对vi比较熟悉，但是从Windows操作系统过来的朋友也许不太喜欢。我们这里使用的是QNX 操作系统自带的图形化编辑软件ped。 </font></p><p><font class="contentwithhtml">利用下面命令启动ped: </font></p><p><font class="contentwithhtml">#ped &amp;amp; </font></p><p><font class="contentwithhtml">下面是HelloWorld.java的源代码： </font></p><table width="70%" cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" align="center"><tbody><tr><td><pre><code><br />public class HelloWorld<br />{<br />    public static void main(String args[])<br />    {<br />        System.out.println(&amp;quot;Hello World!&amp;quot;);<br />    } 	<br />}<br /></code></pre></td></tr></tbody></table><p><font class="contentwithhtml">使用j9c命令编译Java源代码： </font></p><p><font class="contentwithhtml">#j9c HelloWorld.java </font></p><p><font class="contentwithhtml">使用j9命令运行Java应用程序： </font></p><p><font class="contentwithhtml">#j9 HelloWorld </font></p><p><font class="contentwithhtml">需
要注意的是，QNX
操作系统和Java语言都是大小写敏感的，所以一定要把大小写都写对了。另外，对源代码进行编译的时候需要加上文件扩展名，在运行一个Java应用程序的
时候则不需要加上文件扩展名。如果排除了这几种错误之后你仍然无法正确的编译或者是运行你的Hello World程序，请参考
1.3正确配置你的PATH和LD_LIBRARY_PATH。 </font></p><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">5995562@http://browser.bokee.com/</guid> 
<dc:subject>浏览器技术点滴</dc:subject> 
<dc:date>2006-12-28T11:05:08Z</dc:date> 
</item> 
<item> 
<title><![CDATA[ J9C 编译器的使用]]></title> 
<link>http://browser.bokee.com/5995557.html</link> 
<description><![CDATA[<font class="contentwithhtml">
		<strong>2.1 J9C 编译器的使用</strong> </font><p><font class="contentwithhtml">j9c是J9虚拟机自带的字节码编译器，相当于标准版Java开发工具中的javac命令。这个编译器的用法如下： </font></p><p><font class="contentwithhtml">#j9c &amp;lt;编译选项&amp;gt; &amp;lt;源代码文件 | 目录名&amp;gt; </font></p><p><font class="contentwithhtml">在j9c编译器中主要的编译选项如下： </font></p><p><font class="contentwithhtml">-help <br />打印于编译有关的帮助信息 <br />-version <br />显示编译器的版本号 <br />-classpath <br />指定编译时刻使用的类路径<br />-d <br />指定存放字节码文件的目录名，如果没有指定目标目录名，编译器将不生成包目录结构 <br />-nowarn <br />隐藏编译器的警告信息 <br />-warn <br />设定编译器的警告水平 <br />-g <br />设定是否生成调试代码 <br /></font></p><p><font class="contentwithhtml"><b>2.2 J9虚拟机的使用</b> </font></p><p><font class="contentwithhtml">和标准版Java开发工具相类似，可以使用j9命令启动J9虚拟机。这个命令的用法如下： </font></p><p><font class="contentwithhtml">#j9 &amp;lt;运行选项&amp;gt; 主类名称 [运行参数] <br />#j9 &amp;lt;运行选项&amp;gt; -jxe:jxe文件 [运行参数] <br /></font></p><p><font class="contentwithhtml">J9虚拟机中主要的运行选项如下： </font></p><p><font class="contentwithhtml">-jxe <br />运行所指定的jxe文件<br />-jxespace <br />为jxe文件指定所使用的内存(十六进制)<br />-jxeaddr <br />从内存中直接运行一个jxe格式的应用程序<br />-cp <br />将path指定为运行时刻所使用的类路径<br />-D <br />在运行之前设定系统的环境变量<br />-debug <br />在指定的端口启动JDWP调试服务器<br />-jcl <br />指定所使用的JCL动态连接库<br />-verbose <br />详细输出相关的调试信息其中class和gc是缺省的选项<br /></font></p><p><font class="contentwithhtml"><b>2.3 J9虚拟机上的标准类库</b> </font></p><p><font class="contentwithhtml">嵌
入式应用程序和普通应用程序的最大的区别在于嵌入式应用程序处处要受到目标平台的处理速度，内存大小以及存储空间的限制，而基于PC
的应用程序所受的限制则相对要小很多。基于以上考虑，所选择的虚拟机必须在能够满足系统要求的情况下尽可能的少占用系统存储空间，经过编译的字节码文件必
须尽可能的以提高执行效率。因此，在嵌入是应用程序的开发中，虚拟机的裁剪是提高系统整体性能的至关重要的一个环节。 </font></p><p><font class="contentwithhtml">基
于如上需求，J9虚拟机专门为不同的应用提供了不同的标准类库。这些标准类库均提供了运行Java应用程序所必须的基本类，例如Java语言中最基本的
java.lang.Object和java.lang.String等等。一个完全版的 J9虚拟机通常包括如下标准类库： </font></p><p><font class="contentwithhtml"><b>jclXtr</b> <br />这
是一个极小型的类库，大约90 KB， 当你的存储空间和内存极度紧张并且你能够容忍功能局限的情况下可以考虑这一个类库(QNX
的缺省安装里面没有)。这个类库提供了如下Java 2标准类库的一个子集：java.io, java.lang, java.net,
java.util。 </font></p><p><font class="contentwithhtml"><b>jclCldc</b> <br />这
是J9虚拟机向资源极度紧张的目标平台所推荐的最小配置，大约166 KB。在jclXtr类库中仅提供了最基本的 IO功能，在jclCldc
类库中则大幅度的增加了对IO以及网络应用的支持，例如http, ftp, comm, datagram, file,
serversocket, socket等。这个基本类库所在的位置是$J9_HOME/lib/jclCldc </font></p><p><font class="contentwithhtml"><b>jclCore</b> <br />这
是一个为微小型设备设计的一个轻量级的基本类库，它提供了基本的文件IO以及对网络应用的支持，大约占用空间346
KB，是J9虚拟机为资源不太紧张的目标平台所推荐使用的核心类库(所以叫做jclCore )。这个类库包括了Java
2中如下包里面的大部：java.io, java.lang, java.net, java.util, java.util.zip。在QNX
的缺省安装中不包括jclCore基本类库。 </font></p><p><font class="contentwithhtml"><b>jclGateway</b> <br />这
个基本类库是在jclCore基本类库的基础上构建的，大约600 KB，主要的改进是提供了安全检查的功能。这个类库除了jclCore
基本类库所包含的内容之外还提供了如下包和类：完整的java.lang.reflect包；
java.net.URL包，但是不包括URLClassLoader包；
java.lang.SecurityManager包，但是不包括java.security.acl包；提供
java.lang.Runtime.exec()方法。在QNX 的缺省安装中不包括jclGate基本类库。 </font></p><p><font class="contentwithhtml"><b>jclMax</b> <br />这
是一个专门为资源比较宽裕的目标平台所设计的基本类库，大约2732 KB。这个基本类库里面包括了Java 2
里面的大多数包和类，包括java.lang, java.lang.ref, java.lang.reflect, java.io,
java.net, java.math, java.txt, java.util, java.util.jar,
java.util.zip。此外，jclMax基本类库还基于如下包提供了Java 2风格的安全检查功能，包括： java.security,
java.security.interfaces, java.security.acl, java.security.spec,
java.security.cert,
com.ibm.oti.security.provider。这个基本类库所在的位置是$J9_HOME/lib/jclMax </font></p><p><font class="contentwithhtml"><b>jclPersonal</b> <br />这
个类库提供了AWT, RMI以及对Java Bean的支持。QNX 的缺省安装中不安装这个类库，但是可以从IBM
的主页上面下载。另外，如果你已经在QNX上面安装了Eclipse的话，你也可以使用SWT来构建你的图形界面。这些内容将会在本系列文章的后面讲述。
</font></p><p><font class="contentwithhtml">不包括在QNX 缺省安装中的J9标准类库可以从IBM
公司开发的Webshpere Studio Device Developer 中获得。Webshpere Studio Device
Developer是基于Eclipse项目的针对嵌入式 Java应用的一个集成开发环境，可以从IBM 公司的主页免费下载，下载地址是
http://www.ibm.com/software/ad/embedded。 </font></p><p><font class="contentwithhtml"><b>2.4 一个从串口设备采集数据的简单程序</b> </font></p><p><font class="contentwithhtml">数
据采集与处理是当前嵌入式应用的一个热点。在这种应用中，嵌入式系统与各种各样各样的传感器或者是数据采集器等外接设备进行通讯，在其内部对各种数据进行
处理并向外接设备输出反馈信号。到目前为止，串口通讯(主要是RS-232和RS-485)仍然是传感器与主机进行通讯的主流方式，因此在一个嵌入式应用
程序中，经常需要通过串口与串口设备进行通讯。 </font></p><p><font class="contentwithhtml">在标准版
的Java语言中，串口通讯是通过扩展类库javax.comm来实现的。由于这个扩展类库在标准的JDK
中并不提供，需要使用到串口通讯功能的软件开发人员必须到IBM或者是Sun公司的网站去下载，在一定程度上影响了这个扩展类库的普及和使用。J9虚拟机
在设计上充分考虑到了嵌入式应用的需求，在各个版本的标准类库中都提供了对串口通讯的支持。这些功能被放在serial.jar这个包里面，可以在如下目
录下找到： </font></p><p><font class="contentwithhtml">$J9_HOME/lib/jclCdc/serial.jar <br />$J9_HOME/lib/jclFoundation/serial.jar <br /></font></p><p><font class="contentwithhtml">在QNX
系统上，J9虚拟机缺省的类路径(CLASSPATH)是jclMax标准类库，也就是$
J9_HOME/lib/jclMax/classes.zip。也就是说，如果在程序中需要用到串口通讯的时候，我们需要将serial.jar添加到
虚拟机的类路径里面去。在QNX系统上设置类路径的方法于Linux系统比较相似，只需要修改
.profile文件把新的CLASSPATH定义好就可以了。 </font></p><p><font class="contentwithhtml"># export CLASSPATH=$J9_HOME/lib/jclCdc/serial.jar </font></p><p><font class="contentwithhtml">J9虚拟机缺省的类路径，也就是$J9_HOME/lib/jclMax/classes.zip 不需要显式的定义。 </font></p><p><font class="contentwithhtml">serial.jar里面包含了很多用于与串口设备进行通讯的类，需要详细了解的网友可以自行参考相关的文档。一般来说，于串口设备进行通讯需要经过如下步骤： </font></p><p><font class="contentwithhtml">(1) 创建一个SerialConfiguration对象，然后根据特定设备的通讯参数修改一下波特率等值。<br />(2) 创建一个SerialPort对象，在创建这个对象的时候需要使用到串口的名称以及刚才创建好的SerialConfiguration。<br />(3) 利用SerialPort类的getInputStream() 和getOutputStream()方法获得串口设备的输入输出流，通过该设备的输入输出流即可与该设备进行通讯。<br />(4) 当不再使用这个串口设备的时候，利用SerialPort.close()关闭与该设备的连接，同时释放所占用的系统资源。 </font></p><p><font class="contentwithhtml">在QNX
系统下，设备名被保存在/dev目录下，串口设备被起名为ser(n)，其中n是该串口设备的编号，从1
开始计数。例如/dev/ser1相当于晕倒死系统上的COM1，/dev/ser2相当于晕倒死系统上的COM2。因此，虽然J9
虚拟机在各个平台上都提供了对串口进行操作的包serial.jar，但是程序员仍然需要考虑到在不同的平台上设备名是不一样的。 </font></p><p><font class="contentwithhtml">下面的示范程序演示了与串口进行通讯的一般过程。该程序与连接在ser1 的设备进行通讯，将该设备的输出信息打印到屏幕上。 </font></p><table width="70%" cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" align="center"><tbody><tr><td><pre><code><br />import java.io.*;<br />import com.ibm.ive.serial.*;<br /><br />public class SerialDemo<br />{<br />    public static void main(String[] args)<br />    {<br />        // 构造SerialPortConfiguration对象并且配置通讯参数<br />        SerialPortConfiguration SPC = new SerialPortConfiguration();<br />        SPC.baudRate = 19200;<br />        SPC.dataBits = 8;<br />        SPC.stopBits = 1;<br />        SPC.parity   = 0;<br /><br />        try<br />        {<br />            // 构造SerialPort对象，构造成功以后系统已经与指定的设<br />            // 备连接上了<br />            SerialPort     SP = new SerialPort(&amp;quot;/dev/ser1&amp;quot;, SPC);<br />            // 获得设备的输出并读取数据<br />            InputStream DevIn = SP.getInputStream();<br />            for (int i = 0; i &amp;lt; 10000; i++)<br />                System.out.println(DevIn.read());<br />            // 关闭与串口设备的连接<br />            SP.close();<br />        } catch (Exception e)<br />        {<br />            System.out.println(e.getMessage());<br />        }<br />    }<br />}<br /></code></pre></td></tr></tbody></table><p><font class="contentwithhtml">对上面这个示范程序进行编译的时候，由于程序中使用了jclMax标准类库之外的类，所以需要在编译的时候指定类路径，也就是： </font></p><p><font class="contentwithhtml"># j9c -classpath $CLASSPATH SerialDemo.java </font></p><p><font class="contentwithhtml">在运行这个示范程序的时候，不需要再次显式的指定类路径，因为j9命令会自己到系统的CLASSPATH里面去找： </font></p><p><font class="contentwithhtml"># j9 SerialDemo </font></p><p><font class="contentwithhtml">需要说明的是，在J9虚拟机中同样提供了对扩展类库javax.comm的支持。但是基于 J9虚拟机的嵌入式Java应用中，普遍的做法是直接使用J9虚拟机本身的serial.jar。 </font></p><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">5995557@http://browser.bokee.com/</guid> 
<dc:subject>java技术</dc:subject> 
<dc:date>2006-12-28T11:04:11Z</dc:date> 
</item> 
<item> 
<title><![CDATA[J9开发--AWT类库的安装和配置]]></title> 
<link>http://browser.bokee.com/5995551.html</link> 
<description><![CDATA[<font class="contentwithhtml">
		<strong>3.1 AWT类库的安装和配置</strong> </font><p><font class="contentwithhtml">对
嵌入式Java比较熟悉的朋友一定知道目前大多数的嵌入式虚拟机都提供了对AWT 的支持。例如Sun公司开发的Personal
Java，Insignia公司开发的Jeode，Nsicom公司开发的CrEme，还有PERC公司开发的Perc，当然还包括我们正在介绍的IBM
J9。就我个人所了解的情况，Nsicom公司开发的CrEme 是目前唯一的一个支持Swing
的嵌入式Java虚拟机。关于为什么在嵌入式Java中普遍使用AWT而不使用Swing的问题，我们会在这一章的第三节进行讨论。 </font></p><p><font class="contentwithhtml">根
据我们在2.3 节中的介绍，J9虚拟机在jclPersonal
标准类库中提供了对AWT的支持，但是在QNX的缺省安装中并不包括这个类库。因此，我们需要从J9虚拟机的新家WebSphere Studio
Device Developer (也就是原先叫做Visual Age for Java Micro Edition的)中获得这个类库。 </font></p><p><font class="contentwithhtml">首
先我们必须从IBM 的网站下载WebSphere Studio Device
Developer，下载的地址是www.ibm.com/software/ad/embedded/。这是IBM公司基于
Eclipse开发的嵌入式Java集成开发环境，如果你以前用过Visual Age for
Java或者是Eclipse的其它版本的话，想来应该很容易的就能够上手。WSDD有两个版本，一个是给Windows平台的，另外一个是给Linux
平台的。但是在这个标准版的WSDD中既不包括QNX平台的运行环境，也不包括我们所需要的jclPersonal
类库，所以我们还要下载WSDD的Software Updates。QNX 平台的运行环境在Runtime Software
Updates中，jclPersonal库在Custom Environment Software
Updates中，所以这两个update我们都要下载。 </font></p><p><font class="contentwithhtml">首
先安装WSDD，将下载来的Software Updates解压到一个临时目录下，然后启动WSDD。从主菜单选取Help -&amp;gt;
Device Developer Updates。点击Add或者是Update All，在随后跳出来的对话框里面选Local
Predefined Locations。在最下面的Location一栏里面填上你所需要安装的Update，格式为file:/$dir，例如：
</font></p><p><font class="contentwithhtml">file:/c:/temp/wsddupdates/wsdd/4.0/runtimes/ <br />file:/c:/temp/wsddupdates/wsdd/4.0/wce/ </font></p><p><font class="contentwithhtml">安装结束以后在下面这个目录找到QNX 的jclPersonal类库prsnlqnx.jar: </font></p><p><font class="contentwithhtml">wsdd/wsdd4.0/ive/runtimes/qnx/common/ive/lib/jclMax/ </font></p><p><font class="contentwithhtml">如
果你的QNX
和Windows或者是Linux主机是两台独立的计算机的话，你可以通过网络或者是其它的可移动存储设备将prsnlqnx.jar拷贝到你的
QNX 系统上。如果你的QNX 和晕倒死或者是利怒死主机是安装的同一台计算机的不同硬盘或者是同一块硬盘的不同分区上的话，你可以启动QNX
进入文件管理器，然后进入/fs目录看看里面是不是能够看见其它的硬盘或者是分区。如果没有看到你所需要的硬盘或者是分区，你可以使用mount命令启用
相对应的硬盘或者是分区，使得你可以从QNX 系统下对这些硬盘或者是分区上面的文件进行操作。 </font></p><p><font class="contentwithhtml">将prsnlqnx.jar文件放到/usr/eclipse/ive/lib目录下，然后修改类路径，最好是在~/.profile文件里面改： </font></p><p><font class="contentwithhtml">export CLASSPATH=$CLASSPATH:/usr/eclipse/ive/lib/prsnlqnx.jar </font></p><p><font class="contentwithhtml">到目前为止，我们已经完成了AWT类库的安装和配置。 </font></p><p><font class="contentwithhtml"><b>3.2 一个简单的AWT图形用户界面</b> </font></p><p><font class="contentwithhtml">AWT是Java语言中构建图形用户界面的标准。由于Java语言卓越的跨平台特性，在一个平台上编写的基于AWT的图形用户界面可以不加修改的直接移植到另外一个平台上使用。通常来说，构建一个基于AWT的图形用户界面需要经过如下步骤： </font></p><p><font class="contentwithhtml">(1) 创建一个顶级容器对象，例如Window或者是Frame。<br />(2) 在顶级容器对象上面创建用户所需要的控件。<br />(3) 初始化所有的控件，包括大小和初始值等，为控件的事件注册必要的监听器Listener。<br />(4) 打开主窗口。 </font></p><p><font class="contentwithhtml">下面是一个简单的基于AWT的图形用户界面： </font></p><table width="70%" cellspacing="0" cellpadding="5" border="1" bgcolor="#cccccc" align="center"><tbody><tr><td><pre><code><br />import java.awt.*;<br />import java.awt.event.*;<br /><br />public class HelloAwt extends Frame<br />{<br />    public HelloAwt()<br />    {<br />        Label label = new Label(&amp;quot;Hello AWT!&amp;quot;);<br />        add(Label);<br />  <br />        addWindowListener(new WindowAdapter()<br />        {<br />            public void windowClosing(WindowEvent e)<br />            {<br />                System.exit(0);<br />            }<br />        }<br />    }<br /><br />    public static void main(String[] args)<br />    {<br />        HelloAwt hello = new HelloAwt();<br />        hello.setTitle(&amp;quot;I Love Java!&amp;quot;);<br />        hello.pack();<br />        hello.setVisible(true);<br />    }<br />}<br /></code></pre></td></tr></tbody></table><p><font class="contentwithhtml">使用下面的命令编译以上例程： </font></p><p><font class="contentwithhtml">#j9c -classpath $CLASSPATH HelloAwt.java </font></p><p><font class="contentwithhtml">使用下面的命令运行以上例程： </font></p><p><font class="contentwithhtml">#j9 HelloAwt </font></p><p><font class="contentwithhtml">在Sun
公司撰写的Java入门教程The Java Tutorial中有专门的一章介绍了基于AWT
的图形用户界面。但是由于目前Swing已经正式成为标准版Java2 中构建图形用户界面的标准，这一章的内容被Sun 公司从The Java
Tutorial网站上撤下，但是各位读者仍然可以从Sun 公司的网站下载这部分的教程： </font></p><p><font class="contentwithhtml">http://java.sun.com/docs/books/tutorial/information/download.html#OLDui </font></p><p><font class="contentwithhtml"><b>3.3 关于AWT和Swing的一点讨论</b> </font></p><p><font class="contentwithhtml">在
第一节中我们提到了目前大多数的嵌入式Java虚拟机都提供了对AWT 的支持但是不提供对Swing
的支持。但是，在标准版的Java平台上Swing 才是推荐使用的图形界面系统，在Sun 公司所提供的Java Tutorial
中甚至把基于AWT 的图形用户界面设计这一部份从其网站中删除，需要利用到AWT
进行图形用户界面设计的用户只有将该部份下载到本地硬盘才能够使用这部份教程。在标准版Java中正值春风得意的Swing
为什么到了嵌入式应用中便不再吃香了呢？ </font></p><p><font class="contentwithhtml">AWT
是Abstract Window ToolKit (抽象窗口工具包)的缩写，这个工具包提供了一套与本地图形界面进行交互的接口。AWT
中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系，我们把它称为peers。 也就是说，当我们利用 AWT
来构件图形用户界面的时候，我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的，在一个平台上存在的功能在另外
一个平台上则可能不存在。为了实现Java语言所宣称的&amp;quot;一次编译，到处运行&amp;quot;的概念，AWT
不得不通过牺牲功能来实现其平台无关性，也就是说，AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT
是依靠本地方法来实现其功能的，我们通常把AWT控件称为重量级控件。 </font></p><p><font class="contentwithhtml">Swing
是在AWT的基础上构建的一套新的图形界面系统，它提供了AWT 所能够提供的所有功能，并且用纯粹的Java代码对AWT
的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持， Swing 利用了AWT
中所提供的基本作图方法对树形控件进行模拟。由于 Swing
控件是用100%的Java代码来实现的，因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing
中没有使用本地方法来实现图形功能，我们通常把Swing控件称为轻量级控件。 </font></p><p><font class="contentwithhtml">说
到这里我想各位读者应该明白了AWT和Swing之间的基本区别：AWT 是基于本地方法的C/C++程序，其运行速度比较快；Swing是基于AWT
的Java程序，其运行速度比较慢。对于一个嵌入式应用来说，目标平台的硬件资源往往非常有限，而应用程序的运行速度又是项目中至关重要的因素。在这种矛
盾的情况下，简单而高效的AWT
当然成了嵌入式Java的第一选择。而在普通的基于PC或者是工作站的标准Java应用中，硬件资源对应用程序所造成的限制往往不是项目中的关键因素，所
以在标准版的Java中则提倡使用Swing， 也就是通过牺牲速度来实现应用程序的功能。 </font></p><div style="text-align: left;">
</div>]]></description> 
<guid isPermaLink="false">5995551@http://browser.bokee.com/</guid> 
<dc:subject>浏览器技术点滴</dc:subject> 
<dc:date>2006-12-28T11:02:36Z</dc:date> 
</item> 

</channel> 
</rss> 