关于作者

用户名:bom
笔名:bom
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



技术相关,linux,browser ,etc.

其他blog,个人站

访问统计:
文章个数:144
评论个数:103
留言条数:8




Powered by BlogDriver 2.1

梦想太阳

 

linux,vxworkd ,brower,QT,Opera and so on. my MSN : vcomwpl@hotmail.com

文章

dfb+gtk+ note

不能参考它的安装文档你会上大档的,在用./configure时带参数如下:--with-gdktarget=directfb;(它的文档是--with-gdktarget=linux-fb)

1,获得Directfb,Gtk+2.0
可以在www.directfb.org上,
2,配一个支持directfb的内核。
3,正常安装directfb,
4,正常安装gtk+-directfb.
注意:不能参考它的安装文档你会上大档的,在用./configure时带参数如下:--with-gdktarget=directfb;(它的文档是--with-gdktarget=linux-fb)
5,安装demo测试。
以上仅供参考。

- 作者: bom 2008年02月28日, 星期四 11:33  回复(0) |  引用(0) 加入博采

Linux的系统性能监测参数获取

目前的工程需要简单的监测一下Linux系统的:CPU负载、内存消耗情况、几个指定目录的磁盘空间、磁盘I/O、swap的情况还有就是网络流量。
Linux下的性能检测工具其实都有很多。mrtg(http://people.ee.ethz.ch/~oetiker/webtools/mrtg/) 就是一个很不错的选择。不过用mrtg就要装sysstat、apache、snmp、perl之类的东西。而且安装也要好几个步骤,似乎比较麻烦。本来 也想直接调用sar、vmstat之类的命令,parse一下结果就算了。哪知道发现不同的版本的linux这些命令的结果也都是不一样。既然要按版本 parse它们的结果,那还不如直接去系统里面获得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代码,找到监测性能的数据所在。

1、CPU
    在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分别是: user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在,CPU的每tick用 在了哪里。例如:
cpu0 256279030 0 11832528 1637168262
就是cpu0从开机到现在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想计算单位时间(例如1s)里面CPU的负载,那只需要计算1秒前后数值的差除 以每一秒的tick数量就可以了。gkrellm就是这样实现的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2
例如,第一次读取/proc/stat,user的值是256279030;一秒以 后再读一次,值是256289030,那么CPU在这一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。

2、内存消耗
   文件"/proc/meminfo"里面包含的就是内存的信息,还包括了swap的信息。例如:
$ cat /proc/meminfo
        total:    used:    free:  shared: buffers:  cached:
Mem:  1057009664 851668992 205340672        0 67616768 367820800
Swap: 2146787328 164429824 1982357504
MemTotal:      1032236 kB
MemFree:        200528 kB
MemShared:           0 kB
……
不过从gkrellm的源代码看,有些版本没有前面那两行统计的信息,只能够根据下面的Key: Value这种各式的数据收集。

3、磁盘空间
    从gkrellm的源代码看,这个是一个很复杂的数据。磁盘分区的数据有可能分布在:/proc/mounts、/proc/diskstats、 /proc/partitions等等。而且如果想要检查某几个特定的路径,还需要通过mount、df等命令的帮助。为了减少麻烦,这个数据我就直接用 statfs函数直接获得了。
int statfs(const char *path, struct statfs *buf);
这个函数只需要输入需要检查的路径名称,就可以返回这个路径所在的分区的空间使用情况:
总空间:buf.f_bsize * buf.f_blocks
空余空间:buf.f_bsize * buf.f_bavail

4、磁盘I/O
   磁盘I/O的数据也同样比较复杂,有些版本看/proc/diskstats,有些版本看/proc/partitions,还有些版本至今我也不知道在那里看……不过可以看到数据的版本也像CPU那样,需要隔一段时间取值,两次取值的差就是流量。

5、网络流量
   网络流量也是五花八门,不过基本上都可以在/proc/net/dev里面获得。同样也是需要两次取值取其差作为流量值。

   以上就是数据获得源头。程序也比较好写,不外乎就是打开一些文件,逐行读出来然后用sscanf来parse一下数据就可以了。

- 作者: bom 2007年04月6日, 星期五 10:17  回复(0) |  引用(0) 加入博采

AJAX 开发库

1. Pure Javascript: Application Frameworks
1.1 Bindows (成立于2003年)

Backbase是一个通过DHTML、JavaScript、CSS和HTML等技术强劲联合起来的一套完整的Windows桌面式的WEB应用程序解决方案。Bindows无需下载安装客户端支撑组件(如Java、ActiveX或Flash),仅需一个浏览器。纯OO的理念体现在Bindows任何地方,Bindows或许是笔者见过的最完整最强大的AJAX应用程序平台。
Bindows是商业程序的,使用了来自于MB的技术(总部位于GA USA,主要开发中心在瑞典,成立于2002年)。
Bindows框架提供的功能和特性有:
基于面相对象技术的类和API
一套完整的Windows桌面系统,支持各种特性窗口模式,包括菜单、表单、表格、滑动条、测量仪器窗口和其他一些Windows窗口特性支持。
是开发zero-footprint(零空间占用)SOA客户端应用程序首选工具包
本机的XML,SOAP和XML-RPC支持
单用户到企业级开发的支持
内建的完美的AJAX支持
Bindows开发环境:
支持企业级规模的项目开发
跨浏览器、跨OS平台的支持
不受服务器结构限制
良好的与新的、现有的资源互操作性
统一的开发接口
1.2 BackBase (成立于2003年)
BackBase是一个完整的浏览器端框架,提供了丰富的浏览器操作功能,以及对.NET和JAVA平台的集成。
商业化产品,来自于Backbase B.V(总部在Amsterdam,成立于2003年)。
1.3 DOJO (开发中,成立于2004年9月)

DOJO提供完整的轻量级窗口组件和浏览器-服务器消息映射支持
提供创建自定义Javascript窗口组件的框架支持
预制的丰富的窗口类型库
B/S消息映射支持——XMLHttpRequest和其他机制
支持浏览器中的URL操纵功能
开源许可(Academic Free License 2.1),由JotSpot的Alex Russell所领导。
1.4 Open Rico (开发中;成立于2005年5月;基于早期的一个proprietary 框架)

Open Rico是一个支持Ajax架构和用户交互的多用途框架。
一个XMLHttpRequest response能被一个或多个的DOM对象,或者Javascript对象调用。
支持拖拽操作
支持基于AJAX的动画模式,如缩放和变换等
基于Behaviors的操作库
使用指南,由RussMirimar的Yonah提供
开源。源于Sabre航空公司解决方案,由Bill Scott,Darren James及另外一些人维护。
1.5 qooxdoo (开发中; 成立于2005年5月)
qooxdoo,是另一个发展迅猛的应用框架,提供广泛的UI支持,正在开发基础架构等特性。
基础结构特性:
能轻易的捕获和操纵DOM事件
支持调试
支持一个时间操作的Timer类
Getter/Setter支持
UI:
窗口组件库和框架
界面布局管理
图像缓存和透明PNG图片处理
开源(LGPL).
1.6 Tibet (开发中; 创建于2005年6月)

Tibet提供了大量的易移植和完整的JavaScript API,通过这些可以快速生成大量的客户端代码,Tibet自称是企业级AJAX。
远程脚本调用封装在XMLHttpRequest中
URI支持
支持所有的HTTP事件,不再仅仅是GET和POST
低级的协议-File://和WebDav也可以当作HTTP正常使用
Web Services调用支持,包括SOAP、XML-RPC等等
大型的Javascript对象库
多种多样的XML操作支持
IDE和开发工具
开源协议(OSI)
1.7 AJFORM (创建于2005年6月)

AJFORM是一个极易上手的AJAX框架,被用来编写入门级的AJAX代码,提供有以下功能:
三步安装
自动支持任意HTML表单元素
几乎无需编码即可实现AJAX
2 Pure Javascript: Infrastructural Frameworks
2.1 AjaxCaller(创建于2005年5月,目前是Alpha版)
AjaxCaller是一个具有多线程安全访问的XMLHttpRequest组件,主要针对Ajax开发新手,目前仍处于alpha开发阶段,仅在AjaxPatterns的在线搜索范例中使用了这个程序。
用明文或者XML结构的数据实现和服务器的交互(GET/POST/PUT/DELETE)
支持XMLHttRequest对象的构析(销毁对象,C++支持内存对象的构析操作)
支持Response的高速缓存(尚在计划中)
简单的库文件代码易于新手学习使用,并且支持脚本调试
开源协议
2.2 Flash JavaScript Integration Kit

The Flash JavaScript Integration Kit可以使Flash和Javascript脚本实现相互集成。
可以实现在JavaScript中调用Flash ActionScript脚本,反之亦然。
几乎支持双方主要数据类型的在不同环境中的传递调用。
开源协议,有几个Flash开源爱好者维护。
2.3 Google AJAXSLT (2005年6月发行)

Google AJAXSLT,是一个Javascript框架,用来执行XSLT转换以及XPath查询。
目前在Google Map上就使用了这个。
开源协议(BSD)
2.4 HTMLHttpRequest(Beta版;创建于2005年)

HtmlHttpRequest最大的特点就是运用XMLHttpRequest对象和标准HTML标签IFrame来实现最大限度的跨浏览跨平台的AJAX支持,其原理是在支持XMLHttpRequest的浏览器上调用XMLHttp,如果不支持,就用IFrame来模拟实现异步交互。
目前支持的浏览器:IE6/Win, IE5.5/Win, IE5/Win, IE4/Win, Mozilla/Win, Opera7/Win, Safari/Mac, IE5/Mac
尚未测试的浏览器:IE4/Mac, Mozilla/Mac, Opera/Other, Konqueror/Linux。
开源协议(LGPL)
2.5 Interactive Website Framework (创建于2005年)

Interactive Website Framework定位在浏览器中支持各种各样的AJAX基础应用的开源项目。自称是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架,包括一个可定制易读的XML解析器。实际上,IWF是一个AJAX的基础框架,并且还包括一些通用脚本代码。
实现了线程安全的XMLHttpRequest
对XML Document进行封装,以便创建更具有可读性的代码:
var node = doc.groceries.frozen[0].pizza[0].size;
封装后的数据读取
var node = doc.documentElement.firstChild.firstChild.getAttribute("size");
原始的DOM操作读取
开源协议
2.6 LibXMLHttpRequest (2003年6月发布)

libXmlRequest是一个小型XMLHttpRequest封装包
用getXML()和postXML()两个事件简化XMLHttpReuqest调用
支持XMLHttpRequest对象池
Response缓存处理
源码可以使用,但是有版权保护。
2.7 MAJAX

MAJAX是另一个非常小巧的HttpRequest封装包,为收发字符型信息提供简单接口,并为每步动作设置回调界面。
2.8 RSLite (x)

RSLite是一个XMLHttpRequest封装组件,作为Brent Ashley的JSRS(JavaScript Remote Scripting)其中的一部分功能单独发布。详情可以看JSRS的介绍
2.9 Sack(开发中,成立于2005年5月)

Sack也是一个很有名字的微型XMLHttpRequest封装包。调用者可以自定义回调函数或者是DOM对象。借助于回调DOM对象,可以把Response回来的数据直接以文本的方式嵌入DOM中。
2.10 Sarissa (发布于2003年2月)

Sarissa是一个JavaScript API,封装了在浏览器端独立调用XML的功能。
可移植的XMLHttpRequest对象创造
可移植的XPath查询
可移植的DOM操控
可移植的XSLT
可移植的XML序列化
开源协议(GPL2.0和LGPL2.1)
2.11 XHConn (2005年4月发布)

XHConn也是一个小型的XMLHttpRequest封装库。笔者也使用改良过的XHConn,其特点就是调用简单,代码也清晰易读。
例子:
new XHConn().connect("mypage.php","POST","foo=bar&baz=qux",fnWhenDone);
开源协议许可
3 Server-Side: Multi-Language
3.1 Cross-Platform Asynchronous INterface Toolkit (2005年5月)

CPAINT是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台提供你需求的AJAX和JSRS代码,并自动返回到浏览器端相应的Javascript脚本代码,这种方式易于实时反馈需求的WEB应用程序。
支持PHP和ASP
所有功能函数都在统一的JavaScript文件中
支持远程脚本和XML
支持本地和远程函数调用
可以创建单个或多个XMLHttp对象
返回给后台的数据即可以是文本也可以是XML/DOM文档对象
支持POST和GET
用服务端代理的方式实现远程函数和数据的访问操作
大部分浏览器中测试正常使用
在GNU、GPL、LGPL开源协议保护下发行
3.2 SAJAX (2005年3月)

SAJAX的实现方式很独特,例如:调用一个javascript方法x_calculateBudget(),将先把响应传到服务器并调用一个Java calculateBudget()方法,然后以javascript方式把值返回到x_calculateBudget_cb()中。SAJAX的名气不错,估计很多人都听过甚至用过,不过缺点就是它的这套映射理论感觉较繁锁,远不如一些轻量级的封装库好用,不过SAJAX最大的特点就是支持的平台丰富,几乎囊括了WEB下常用的编程语言和平台
很方便从JavaScript函数映射到服务端代理操作
支持多种平台(ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby)
开源协议
3.3 Javascipt Object Notation (JSON) and JSON-RPC

JSON是一个"face-free" XML,而JSON-RPC是一种远程交互协议,类似于XML-RPC,对JavaScript支持较强
支持多服务端平台: Java, Python, Ruby, Perl.
针对不同的平台有不同的包和许可协议, 如JSON-RPC-Java.
3.4 JavaScript Remote Scripting(JSRS)(2000年)

JSRS,较经典的远程脚本访问组件,支持将客户端数据通过服务器做代理进行远程的数据/操作交互。
支持的浏览器:IE4+,NS4.x,NS6.x,Mozilla,Opera7和Galeon。
服务器端脚本语言支持:ASP,ColdFusion,PerlCGI,PHP,Python和JSP(servlet)。
开源协议。由Brent Ashley提供支持。
3.5 Bitkraft for ASP.NET

Bitkraft是个基于(.NET)Web框架的CLR(公共语言运行库),允许用独特的方式创建和操作分布式Web内容。用C#编写,运行在微软的.NET 1.1和Mono框架下,无缝式的客户端-服务器响应方式是它的最大特点。Bitkraft没有使用XML组织数据,而是用JSON代替。
支持的浏览器: IE5+, Firefox1+, NS6
服务器端要求:ASP.NET, Mono XSP, Cassini, Apache (modMono) .NET Framework 1.1+
事件驱动
支持同步和异步的远程代理
客户端支持所有的.NET类型或自定义类对象映射到JSON中
用JSON取代XML
免费,开源许可协议
4 Server-Side: Java
4.1 WebORB for Java (2005年8月)

WebORB for Java是一个开发AJAX和基于Flash的富客户端应用程序的开发平台。在线例子
WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何Java对象、XML Web Services和EJB
支持异步或同步的事件驱动
不需要在服务端修改任何代码,不需要自定义方法或属性、变量等。不要求设计时指定代理等。
同步调用不需要回调,异步调用需要一个回调方法。
客户端可以向服务端请求指定的活动方式,不需要任何编程就可以把处理结果轻易的转变为状态。
提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable,而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。
支持数据分页技术。客户应用程序能检索页面中的数据。
支持以参数的方式返回所有服务期端数据类型,如primitives, strings, complex types, arrays, native .net collections, remote references
目前有两个版本:标准版(免费),专业版(商业许可)
4.2 Echo 2 (2005年3月)

Echo 2允许你用纯Java语言编写AJAX程序。 Demo.
自动生成HTML和Javascript代码
用XML在客户端-服务端传递消息
如果愿意支持自定义Javascript组件
开源协议(Mozilla Public License or GNU LGPL)
4.3 Direct Web Remoting (DWR) (2005)

Direct Web Remoting可以在Javascript代码中直接调用Java方法的应用框架
类似于SAJAX,可以把Javascript中的请求调用转递到Java方法中并将执行结果返回给Javascript
可以和任何Web框架一起使用,如Struts、Tapestry等等
开源(Apache),目前该产品被加入到WebWork中
4.4 SWATO (2005)

SWATO是一套可重用的和良好集成的Java/JavaScript库,它实现了一种更容易的方式来改变你的web应用程序的交互,通过AJAX方式实现。
服务端Java库可以非常容易的部署到所有Servlet2.3+兼容的容器中
客户端Javascript库可以在所有支持XMLHttpRequest的浏览器中使用
使用JSON技术在服务端组织POJO数据,这样你可以在任何Javascript环境中(HTML、XUL、SVG)访问这些远程数据,这种方式很容易通过硬编码或者某种成熟的Javascript库集成到当前应用中
提供一个简单接口使你能在Javascript中调用远程的POJO数据
使用<servlet>和<filter>灵活的在web.xml中进行配置,并且可以集成(不是必须)到你的Spring框架中
提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框,在线表单,在线列表等等)
4.5 AJAX JSP Tag Library

The AJAX JSP Tag Library是一组JSP标签库,用来AJAX程序开发。可以在J2EE下无需Javascript就能轻松开发AJAX模式的Web Form。标签库为比较通用的AJAX功能提供了5个标签:
autocomplete: 用户在文本框中输入字符,自动从指定的数据中匹配用户输入的字符,类似于Google Suggest
callout:可以为A标签加入气泡式的消息提示框,不过是实时的服务端取出数据
Select/dropdown:类似于联动菜单,比如地州市的联动下拉框
toggle:开关闸按钮,比如在一个hidden表单域中存储true和falsh,同时显示相应的img图像
update field:更新数据,也就是无刷新提交了。
4.6 AJAX Java Server Faces Framework

The AJAX-JSF用来把任意的JSF应用程序转变为AJAX应用程序
例子:AJAX组件的 MyFaces JSF Tree(树型目录), table scroller(可滚动的表格), tabbed pane(分页栏)
开源协议(Apache Software License)
Server-Side: Lisp
5.1 CL-Ajax

CL-Ajax实现Javascript直接调用服务端Lisp
生成可带参数的函数
可以回调Javascript函数或者DOM对象
可以集成到SAJAX中
开源许可
6 Server-Side: .NET
6.1 WebORB for .NET (2005年8月)

WebORB for .NET是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应用程序(在线例子)
WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何.NET对象、XML Web Services
支持异步或同步的事件驱动
不需要在服务端修改任何代码,不需要自定义方法或属性、变量等。不要求设计时指定代理等。
同步调用不需要回调,异步调用需要一个回调方法。
客户端可以向服务端请求指定的活动方式,不需要任何编程就可以把处理结果轻易的转变为状态。
提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable,而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。
支持数据分页技术。客户应用程序能检索页面中的数据。
支持以参数的方式返回所有服务期端数据类型,如primitives, strings, complex types, arrays, native .net collections, remote references
目前有两个版本:标准版(免费),专业版(商业许可)
6.2 Ajax.NET (2005年3月)

Ajax.NET是首家支持各种方式通过Javascript访问服务端.net的免费库
类似于SAJAX,能把Javascript请求发送到.NET方法,服务端回传给Javascript,甚至包括串行化自定义类。
可以在Javascript中访问Session和Application数据
缓存查询结果
免费使用源代码
无需更改源代码,允许给Ajax.NET添加和修改方法和属性
所有类支持Javascript客户端返回数据,可以在JavaScript中使用DataSet:res.Tables[0].Rows
使用HtmlControls组件访问和返回数据
页面无需重载,用事件代理(数据访问层)
因为只提供一个调用接口方法,所以服务端CPU占用非常少
6.3 ComfortASP.NET (2005年8月)

ComfortASP.NET可以让开发者在纯.NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)特性的应用程序。
快速应答
减少HTML传输
减少页面重载
无闪烁的浏览器内容更改
AJAX用户体验,
6.4 AjaxAspects (2005年8月)

AjaxAspects是个可以用Javascript调用服务端WebService事件的引擎
用标准的SOAP和WSDL进行服务端-客户端通信
用简单的类型和XML对象支持带参数的返回值
缓存支持
动作队列
免费使用,开源协议
7 Server-Side: PHP
7.1 AjaxAC (2005年4月)

AjaxAC用一个单独类封装了完整的应用程序功能
所有的功能集成在自包含的类中(另外附带一些Javascript库)
调用PHP文件或者HTML页面非常简易,只需创建App类后把类引用传递给需要调用的Javascript对象或者HTML元素即可。
捕获Javascript事件
可以自定义配置数据,并且支持运行时参数更改
无需再Javascript代码中夹杂凌乱的Html代码,所有事件都是被动态附加上的
由于以上两个优点,所以支持良好的模版引擎
容易Hook到PHP类和MySql数据已返回给自己的request
能够容易的用Javascript建立窗口模式应用程序。
7.2 JPSpan

JPSPAN通过Javascript直接调用PHP中的函数。
进行了严谨的单元测试
开源许可(PHP)
7.3 XAJAX

XAjax通过Javascript直接调用PHP中的函数
支持用Javascript调用PHP脚本
开源许可协议
8 Server-Side: Ruby
8.1 Ruby On Rails

Ruby On Rails是一个支持AJAX的完整Web框架,使用Ruby语言编写,严格按照MVC结构开发。
当Ajax出现的时候Rails还处于其发展的早期,因此Ajax可能逐渐成为Rails框架的核心。
生成浏览器中大多数/全部的Window应用组件和动画的Javascript脚本。
支持服务器端调用。

- 作者: bom 2007年03月10日, 星期六 10:04  回复(0) |  引用(0) 加入博采

ActiveX技术面面观
摘要:想要彻底理解web开发的方方面面,Activex应该是绕不过去的一个,虽然现实的开发中不会用到微软的平台,但其理念,可以借鉴。 查看全文

- 作者: bom 2007年03月2日, 星期五 08:51  回复(0) |  引用(0) 加入博采

一起吃苦的幸福
我们越来越爱回忆了
是不是因为不敢期待未来呢
你说世界好像天天在倾塌着
只能弯腰低头把梦越做越小了
是该牵手上山看看的
最初动心的窗口有什么景色
不能不哭你就让我把你抱着
少了大的惊喜也要找点小快乐
就算有些事烦恼无助
至少我们有一起吃苦的幸福
每一次当爱走到绝路
往事一幕幕会将我们搂住

我们越来越爱回忆了
是不是因为不敢期待未来呢
你说世界好像天天在倾塌着
只能弯腰低头把梦越做越小了
是该牵手上山看看的
最初动心的窗口有什么景色
不能不哭你就让我把你抱着
少了大的惊喜也要找点小快乐
就算有些事烦恼无助
至少我们有一起吃苦的幸福
每一次当爱走到绝路
往事一幕幕会将我们搂住
虽然有时候际遇起伏
至少我们有一起吃苦的幸福
一个人吹风只有酸楚
两个人吹风不再狐单无助

- 作者: bom 2007年01月5日, 星期五 13:15  回复(0) |  引用(0) 加入博采

vi使用注记
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename....filename :打开多个文件,依次进行编辑

移动光标类命令
h :光标左移一个字符
l :光标右移一个字符
space:光标右移一个字符
Backspace:光标左移一个字符
k或Ctrl+p:光标上移一行
j或Ctrl+n :光标下移一行
Enter :光标下移一行
w或W :光标右移一个字至字首
b或B :光标左移一个字至字首
e或E :光标右移一个字至字尾
) :光标移至句尾
( :光标移至句首
}:光标移至段落开头
{:光标移至段落结尾
nG:光标移至第n行首
n+:光标下移n行
n-:光标上移n行
n$:光标移至第n行尾
H :光标移至屏幕顶行
M :光标移至屏幕中间行
L :光标移至屏幕最后行
0:(注意是数字零)光标移至当前行首
$:光标移至当前行尾

屏幕翻滚类命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
S:删除指定数目的行,并以所输入文本代替之
ncw或nCW:修改指定数目的字
nCC:修改指定数目的行

删除命令
ndw或ndW:删除光标处开始及其后的n-1个字
do:删至行首
d$:删至行尾
ndd:删除当前行及其后n-1行
x或X:删除一个字符,x删除光标后的,而X删除光标前的
Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令
/pattern:从光标开始处向文件尾搜索pattern
?pattern:从光标开始处向文件首搜索pattern
n:在同一方向重复上一次搜索命令
N:在反方向上重复上一次搜索命令
:s/p1/p2/g:将当前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:将文件中所有p1均用p2替换

选项设置
all:列出所有选项设置情况
term:设置终端类型
ignorance:在搜索中忽略大小写
list:显示制表位(Ctrl+I)和行尾标志($)
number:显示行号
report:显示由面向行的命令修改过的数目
terse:显示简短的警告信息
warn:在转到别的文件时若没保存当前文件则显示NO write信息
nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符
nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始
mesg:允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令
:n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下
:n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下
:n1,n2 d :将n1行到n2行之间的内容删除
:w :保存当前文件
:e filename:打开文件filename进行编辑
:x:保存当前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:执行shell命令command
:n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入
:r!command:将命令command的输出结果放到当前行

寄存器操作
"?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字
"?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字
ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。


进入vi
vi test
离开vi
:q! 离开vi,并放弃刚在缓冲区内编辑的内容。
 :wq 将缓冲区内的资料写入磁盘中,并离开vi。
 :ZZ 同wq
同wq
:w 将缓冲区内的资料写入磁盘中,但并不离开vi。
:q 离开vi,若文件被修改过,则会被要求确认是否放弃修改的内容,此指令可与: w 配合使用。
Vi 的操作模式
Vi 提供两种操作模式:
输入模式(insert mode)
指令模式(command mode)
当使用者进入vi后,既处于指令模式下,此刻键入任何字元皆被视为指令。

输入模式:a(append) 游标之后加入资料。
A 该行之末加入资料
i (insert) 游标之前加入资料
I 该行之首加入资料
o (open) 新增一行与该行之下供输入资料
O 新增一行与该行之上供输入资料

指令模式:B      移至该行第一个字符,若光标在该行第一字符则光标移至上一行第一字符。
 b    由游标所在位置之前一个字串的第一个字元
cc 删除整行,修改整行的内容。
D      以行为单位,删除游标在内后面的所有字符。
db 删除该行光标前字符
dd 删除该行
de 删除自光标开始后面的字符
d加字符   删除光标所在位置至字符之间的单
E      移至该行最后字符,若光标在该行最后字符则光标移至下一行最后字符
e      由游标所在位置至该字串的最后一个字元
G 移至该档案的最后一行
h 向前移一个字元
j 向下移一个字元
k 向上移一个字元
0 移至该行之首
M 移至视窗的中间那行
L 移至视窗的最后一行
l 向后移一个字符
0 由游标所在位置该行的第一个字元
nG 移至该档案的第n行
n+ 自游标所在位置向后移n行至该行的第一字符
n- 自游标所在位置向前移n行至该行的第一字符
R 进入取代状态,直到《ESC》为止
s 删除游标所在字元,并进入取代模式直到《ESC》
S 删除游标所在之该行资料,并进入输入模式直到《ESC》
w 由游标所在位置之下一个字串的第一个字元
x 删除游标所在该字元。
X 删除游标所在之前一字元。
r 用接于此指令之后的字元取代(replace)游标所在字元
yy yank整行,使游标所在该行复制到记忆体缓冲区
<ctrl><g> 显示该行之行号、档案名称、档案中最末之行号、游标所在行号占
总行号之百分比
$ 由游标所在位置至该行的最后一个字元。
) 由游标所在位置至下一个句子的第一个字元。
( 由游标所在位置至该句子的第一个字元。
{ 由游标所在位置至该段落的最后一个字元。
} 由游标所在位置至该段落的第一个字元

yank和delete可将指定的资料复制到记忆体缓冲区,而藉有put指令可将缓冲区内的资料复制到荧幕上
例如:搬移一行 :在该行执行dd
游标移至目的地
执行p
复制一行 :在该行执行yy
游标移至目的地
执行p
视窗移动:
<ctrl><f> 视窗往下卷一页
<ctrl><b> 视窗往上卷一页
<ctrl><d> 视窗往下卷半页
<ctrl><u> 视窗往上卷半页
<ctrl><e> 视窗往下卷一行
<ctrl><y> 视窗往上卷一行
删除、复制及修改指令介绍:
d(delete)、c(change)和y(yank)这一类的指令在vi 中的指令格式为:
operation+scope=command
(运算子)(范围)
运算子:
d 删除指令。删除资料,但会将删除资料复制到记忆体缓冲区。
y 将资料(字组、行列、句子或段落)复制到缓冲区。
p 放置(put)指令,与d和y配合使用。可将最后delete或yank的资料放置于游标所在位置之行列下。
c 修改(change)指令,类似delete于insert的组合。删除一个字组、句子等资料,并插入新键入的

- 作者: bom 2006年12月28日, 星期四 13:08  回复(0) |  引用(0) 加入博采

在QNX平台上开发Java应用程序 4
4.1 SWT类库的安装和配置

Eclipse 项目的发布在IT界可以说是一次震撼,这不仅仅是因为IBM 公司无偿公开了花费4000万美元开发出来的一整套代码,也不仅仅是因为支持这个项目的包括目前在市场上相当吃香的Rational, Borland, Red Hat以及QNX等公司。最让人吃惊的是:Eclipse 项目的矛头直接针对的是IBM公司最亲密无间的Java合作夥伴 -- Sun公司。就象Eclipse这个名字所意味的那样,IBM 的目的是要建立一套各种程序设计语言都能够使用的模块化的开发平台,并且希望它能够成为一个业界公认的标准平台。

Eclipse 项目中最令人震撼的一点是它用称为SWT的的图形库和工具包取代了Java标准中的AWT和Swing。根据Eclipse项目的解释,SWT直接调用了 操作系统的图形库,从而使得Java应用程序的Look & Feel 与操作系统的习惯完全一致;更为重要的是,对本地方法的直接调用大幅度的提高了基于SWT 的Java应用程序的运行速度。关于SWT与AWT/Swing的优点和缺点我们将在这一章的第三节中进行比较和讨论。

为了在我们的Java应用程序中使用SWT,我们需要做一点必要的配置,如下:

(1) /usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar 是Eclipse平台的运行库,需要将它放到类路径里面。
(2) /usr/eclipse/plugins/org.eclipse.ui/workbench.jar是Eclipse 平台的图形界面库,需要把它放到类路径里面。
(3) /usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar里面是SWT 的基本类库,需要将它放在类路径里面。
(4) /usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86 这个目录下面存放的是SWT 与本地方法的接口,需要放在LD_LIBRARY_PATH里面。

修改.profile文件,如下:

export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.core.runtime/runtime.jar
export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.ui/workbench.jar
export CLASSPATH=$CLASSPATH:/usr/eclipse/plugins/org.eclipse.swt/ws/photon/swt.jar
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86

改动过这些设置以后,最简单的办法是重新启动Photon来让这些新的设置生效。

4.2 一个简单的SWT图形用户界面

通常来说,构建一个基于SWT 的图形用户界面需要经过如下步骤:

(1) 创建一个Display对象,该对象代表一个SWT 进程(session)。
(2) 创建一个或者是多个Shell对象,一个Shell对象相当于我们在AWT/Sing里面所说的顶极容器,也就是应用程序的主窗口。
(3) 在Shell对象上面创建用户所需要的控件。
(4) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(5) 打开主窗口。
(6) 启动事件处理循环,一直到用户结束程序的运行。
(7) 垃圾回收。

下面是一个简单的基于SWT 的Java应用程序HelloSwt:


import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;

public class HelloSwt
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
Label label = new Label(shell, SWT.CENTER);
label.setText("Hello SWT!");
label.setBounds(shell.getClientArea());
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}

使用下面的命令编译以上例程:

#j9c -classpath $CLASSPATH HelloSwt.java

使用下面的命令运行以上例程:

#j9 HelloSwt

我 们可以看到,基于SWT的图形用户界面在外观上和基于AWT的图形用户界面有明显的不同。更为重要的是,能够明显的感受到HelloSwt的启动速度比 HelloAwt要快很多。 QNX 高效的微内核图形界面系统当然是提高用户应用程序运行速度的一个方面,但是更重要的是SWT 直接调用了QNX 的微内核图形界面系统的功能,而AWT 则没有利用到操作系统所提供的这些优势。

SWT 是一套与AWT/Swing 完全不同的图形界面系统,新接触SWT 的程序员还是需要花费一段时间来熟悉SWT的结构和API。下面推荐的几个参考资料能够让你轻松的开始利用SWT 进行图形用户界面设计:

The Programmer's Guide for Eclipse, 这是Eclipse项目发布的官方程序员手册,其PDF 版可以从这个地址下载:

http://www.eclipse.org/documentation/pdf/org.eclipse.platform.doc.isv.pdf

这份文档也可以从这个网站联机查看:

http://download.eclipse.org/downloads/documentation/2.0/html/plugins/org.eclipse.platform.doc.isv/

另外,www.eclipse.org最近在其网站上发布了关于SWT的结构及其应用的一系列文章,也非常的有参考价值。如果有感兴趣的网友,请自行到 Eclipse 的网站查看。

4.3 关于SWT和AWT/Swing的一点讨论

通 过3.3 的讨论我们知道在AWT 中的图形用户界面是通过本地方法来实现的,每个AWT 方法都有一个与其对应的本地方法,称为peer。由于平台无关性的需要,AWT 所能够实现的功能是各种不同操作系统的图形库所提供的功能的交集。通过这种机制,在所有的平台上相同的AWT 控件的Java代码是一样的,其性能也是类似的。SWT 所采取的则是一种完全相反的方法,它是通过一些本地方法将操作系统的图形库完全的暴露给虚拟机。在这些本地方法的基础上,SWT 通过纯粹的Java代码实现了需要的图形界面功能。由于各个操作系统所提供的图形库是不一样的,同样一个控件在不同平台上的Java实现通常来说是不一样 的。基于同样的道理,同样的SWT 程序在不同平台上的性能和表现也许是不一样的。

SWT 所采取的这种方法决定了它在技术上要比AWT 要具有更多的优点,如下:

(1) 如果操作系统A 支持某种图形控件而操作系统B 不支持,AWT 就会出于平台无关性的要求拒绝提供这个控件。SWT 则会在操作系统A 上原封不动的调用操作系统所提供的控件,在操作系统B 上则使用该操作系统所提供的其它功能对该控件进行模拟。例如Windows平台本身就提供了树和表格等控件而其它一些操作系统不提供这些控件,SWT 在Widnows平台上就会直接调用Windows的方法来实现这些控件,AWT 为了实现平台无关性拒绝提供这些控件,Swing 则为了实现纯Java的目的在AWT 的基础上自己来画这些控件 -- 尽管它画出来的东西很少有画得好的。

(2) 由于SWT 大量的采用了本地平台所提供的图形库,SWT 中的控件风格跟本地平台的UI风格是完全一致的,因为在SWT 中的控件基本上就是操作系统本身的控件。这一点对于AWT 来说是比较相似的,但是Swing 的表现就不太一样了,譬如说在Windows XP上面用Swing 画一颗树它看起来就跟Widnows 2000上面的树一模一样,尽管Windows XP跟Widnows 2000本身的树形控件是不一样的。

(3) 在SWT中,大部份的事物逻辑都是用Java写的,在SWT 中C/C++代码的比重远比AWT中C/C++代码比重要小。这样使得程序设计人员能够更加方便的对SWT 应用程序进行调试,也能够更清楚的知道在后台运行的本地方法究竟在做什么事情。更为重要的是,SWT利用比AWT 更少的C/C++ 代码实现了比AWT 更快的图形用户界面,这个优势在嵌入式应用中往往是决定性的。

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 则在目前大部份的主流和非主流操作系统上都有支持。

- 作者: bom 2006年12月28日, 星期四 11:06  回复(0) |  引用(0) 加入博采

在QNX平台上开发Java应用程序 1
1.1 QNX 实时操作系统介绍

QNX 实时操作系统(QNX Real Time Operating System)是由位于加拿大渥太华的QNX软件系统公司开发的一个针对嵌入式应用的微内核操作系统。QNX软件系统公司成立于1981年,在过去的20 多年中一直致力于微内核实时操作系统的研究与开发。目前的QNX 实时操作系统已经发展成一个可以使用在严实时应用中的高可靠性实时操作系统,能够运行在x86/Pentium, PowerPC, ARM, StrongARM, XScale, MIPS, SH-4等一系列硬件平台上,是在关键任务应用中首选的两个实时操作系统之一(另外一个是VxWorks)。

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 应用程序。

更 为重要的是,对于应用程序开发人员来说,QNX是一个完全免费的实时操作系统。根据QNX软件系统公司发布的使用授权协议,在一个产品商业化之前应用程序 开发人员可以自由的使用QNX实时操作系统系统而无须向QNX 公司交付任何软件使用费用。同样,QNX的应用程序集成开发环境PHAB对于软件开发人员来说也是免费的。QNX 实时操作系统以及QNX应用程序集成开发环境均可以从QNX公司的主页www.qnx.com下载。

1.2 QNX 实时操作系统对Java语言的支持

QNX Neutrino使用IBM公司开发的业界领先的J9虚拟机为Java应用程序以及小应用程序提供了支持。目前可供选择的方案有两个,一个是与J2ME标 准完全兼容的WebSphere嵌入式环境,另外一个是WebSphere客户环境,提供了一个可裁剪的Java 2语言标准的子集。由于QNX 是一个多任务操作系统,因此可以同时运行多个虚拟机为不同的应用程序提供服务。基于微内核的microGUI窗口界面系统为AWT提供了全面的支持,在其 它平台上开发的基于AWT的图形用户界面可以不加修改的在QNX平台上运行。此外,QNX还通过使用本地线程保证了正确的线程调度。

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设备应用程序开发工具。

值 得一提的是,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应用程序的。

1.3 QNX 实时操作系统以及集成开发环境的安装和配置

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还需要进行一点小小的配置。

J9虚拟 机的缺省安装位置是/usr/eclipse/ive。在这个目录下有bin和lib两个子目录,bin目录包含了J9虚拟机的可执行文件和所需要的库文 件,lib目录则包含了各种版本的Java类库。未来在QNX 系统上使用J9虚拟机,我们需要将合适的目录包括在PATH和LD_LIBRARY_PATH 这两个环境变量中。我们需要修改用户家目录(~)下面的.profile文件,使之包含如下语句:

export J9_HOME=/usr/eclipse/ive
export PATH=$PATH:$J9_HOME/bin:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$J9_HOME/bin

应 用程序集成开发环境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中。

export ECLIPSE_HOME=/usr/eclipse
export ECLIPSE_PLUGIN=/usr/eclipse/plugins/org.eclipse.swt/os/qnx/x86
export PATH=$PATH:$ECLIPSE_HOME
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ECLIPSE_PLUGIN

到此为止我们以及成功的安装与配置了QNX 实时操作系统以及相关的Java应用程序开发工具。下面我们简单的介绍几个常用的命令:

j9c -- 类似于Java SDK中的javac命令,是用来编译Java源代码的。
j9 -- 类似于Java SDK中的java命令,是用来运行Java应用程序的。
eclipse -- 这个命令启动Eclipse for QNX应用程序集成开发环境。

1.4 一个简单的Hello World程序

在没有开始写Hello World之前,我们首先介绍一下QNX 上的文本编辑器。很多熟悉类UNIX操作系统的朋友也许会对vi比较熟悉,但是从Windows操作系统过来的朋友也许不太喜欢。我们这里使用的是QNX 操作系统自带的图形化编辑软件ped。

利用下面命令启动ped:

#ped &

下面是HelloWorld.java的源代码:


public class HelloWorld
{
public static void main(String args[])
{
System.out.println("Hello World!");
}
}

使用j9c命令编译Java源代码:

#j9c HelloWorld.java

使用j9命令运行Java应用程序:

#j9 HelloWorld

需 要注意的是,QNX 操作系统和Java语言都是大小写敏感的,所以一定要把大小写都写对了。另外,对源代码进行编译的时候需要加上文件扩展名,在运行一个Java应用程序的 时候则不需要加上文件扩展名。如果排除了这几种错误之后你仍然无法正确的编译或者是运行你的Hello World程序,请参考 1.3正确配置你的PATH和LD_LIBRARY_PATH。

- 作者: bom 2006年12月28日, 星期四 11:05  回复(0) |  引用(0) 加入博采

J9C 编译器的使用
2.1 J9C 编译器的使用

j9c是J9虚拟机自带的字节码编译器,相当于标准版Java开发工具中的javac命令。这个编译器的用法如下:

#j9c <编译选项> <源代码文件 | 目录名>

在j9c编译器中主要的编译选项如下:

-help
打印于编译有关的帮助信息
-version
显示编译器的版本号
-classpath
指定编译时刻使用的类路径
-d
指定存放字节码文件的目录名,如果没有指定目标目录名,编译器将不生成包目录结构
-nowarn
隐藏编译器的警告信息
-warn
设定编译器的警告水平
-g
设定是否生成调试代码

2.2 J9虚拟机的使用

和标准版Java开发工具相类似,可以使用j9命令启动J9虚拟机。这个命令的用法如下:

#j9 <运行选项> 主类名称 [运行参数]
#j9 <运行选项> -jxe:jxe文件 [运行参数]

J9虚拟机中主要的运行选项如下:

-jxe
运行所指定的jxe文件
-jxespace
为jxe文件指定所使用的内存(十六进制)
-jxeaddr
从内存中直接运行一个jxe格式的应用程序
-cp
将path指定为运行时刻所使用的类路径
-D
在运行之前设定系统的环境变量
-debug
在指定的端口启动JDWP调试服务器
-jcl
指定所使用的JCL动态连接库
-verbose
详细输出相关的调试信息其中class和gc是缺省的选项

2.3 J9虚拟机上的标准类库

嵌 入式应用程序和普通应用程序的最大的区别在于嵌入式应用程序处处要受到目标平台的处理速度,内存大小以及存储空间的限制,而基于PC 的应用程序所受的限制则相对要小很多。基于以上考虑,所选择的虚拟机必须在能够满足系统要求的情况下尽可能的少占用系统存储空间,经过编译的字节码文件必 须尽可能的以提高执行效率。因此,在嵌入是应用程序的开发中,虚拟机的裁剪是提高系统整体性能的至关重要的一个环节。

基 于如上需求,J9虚拟机专门为不同的应用提供了不同的标准类库。这些标准类库均提供了运行Java应用程序所必须的基本类,例如Java语言中最基本的 java.lang.Object和java.lang.String等等。一个完全版的 J9虚拟机通常包括如下标准类库:

jclXtr
这 是一个极小型的类库,大约90 KB, 当你的存储空间和内存极度紧张并且你能够容忍功能局限的情况下可以考虑这一个类库(QNX 的缺省安装里面没有)。这个类库提供了如下Java 2标准类库的一个子集:java.io, java.lang, java.net, java.util。

jclCldc
这 是J9虚拟机向资源极度紧张的目标平台所推荐的最小配置,大约166 KB。在jclXtr类库中仅提供了最基本的 IO功能,在jclCldc 类库中则大幅度的增加了对IO以及网络应用的支持,例如http, ftp, comm, datagram, file, serversocket, socket等。这个基本类库所在的位置是$J9_HOME/lib/jclCldc

jclCore
这 是一个为微小型设备设计的一个轻量级的基本类库,它提供了基本的文件IO以及对网络应用的支持,大约占用空间346 KB,是J9虚拟机为资源不太紧张的目标平台所推荐使用的核心类库(所以叫做jclCore )。这个类库包括了Java 2中如下包里面的大部:java.io, java.lang, java.net, java.util, java.util.zip。在QNX 的缺省安装中不包括jclCore基本类库。

jclGateway
这 个基本类库是在jclCore基本类库的基础上构建的,大约600 KB,主要的改进是提供了安全检查的功能。这个类库除了jclCore 基本类库所包含的内容之外还提供了如下包和类:完整的java.lang.reflect包; java.net.URL包,但是不包括URLClassLoader包; java.lang.SecurityManager包,但是不包括java.security.acl包;提供 java.lang.Runtime.exec()方法。在QNX 的缺省安装中不包括jclGate基本类库。

jclMax
这 是一个专门为资源比较宽裕的目标平台所设计的基本类库,大约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

jclPersonal
这 个类库提供了AWT, RMI以及对Java Bean的支持。QNX 的缺省安装中不安装这个类库,但是可以从IBM 的主页上面下载。另外,如果你已经在QNX上面安装了Eclipse的话,你也可以使用SWT来构建你的图形界面。这些内容将会在本系列文章的后面讲述。

不包括在QNX 缺省安装中的J9标准类库可以从IBM 公司开发的Webshpere Studio Device Developer 中获得。Webshpere Studio Device Developer是基于Eclipse项目的针对嵌入式 Java应用的一个集成开发环境,可以从IBM 公司的主页免费下载,下载地址是 http://www.ibm.com/software/ad/embedded。

2.4 一个从串口设备采集数据的简单程序

数 据采集与处理是当前嵌入式应用的一个热点。在这种应用中,嵌入式系统与各种各样各样的传感器或者是数据采集器等外接设备进行通讯,在其内部对各种数据进行 处理并向外接设备输出反馈信号。到目前为止,串口通讯(主要是RS-232和RS-485)仍然是传感器与主机进行通讯的主流方式,因此在一个嵌入式应用 程序中,经常需要通过串口与串口设备进行通讯。

在标准版 的Java语言中,串口通讯是通过扩展类库javax.comm来实现的。由于这个扩展类库在标准的JDK 中并不提供,需要使用到串口通讯功能的软件开发人员必须到IBM或者是Sun公司的网站去下载,在一定程度上影响了这个扩展类库的普及和使用。J9虚拟机 在设计上充分考虑到了嵌入式应用的需求,在各个版本的标准类库中都提供了对串口通讯的支持。这些功能被放在serial.jar这个包里面,可以在如下目 录下找到:

$J9_HOME/lib/jclCdc/serial.jar
$J9_HOME/lib/jclFoundation/serial.jar

在QNX 系统上,J9虚拟机缺省的类路径(CLASSPATH)是jclMax标准类库,也就是$ J9_HOME/lib/jclMax/classes.zip。也就是说,如果在程序中需要用到串口通讯的时候,我们需要将serial.jar添加到 虚拟机的类路径里面去。在QNX系统上设置类路径的方法于Linux系统比较相似,只需要修改 .profile文件把新的CLASSPATH定义好就可以了。

# export CLASSPATH=$J9_HOME/lib/jclCdc/serial.jar

J9虚拟机缺省的类路径,也就是$J9_HOME/lib/jclMax/classes.zip 不需要显式的定义。

serial.jar里面包含了很多用于与串口设备进行通讯的类,需要详细了解的网友可以自行参考相关的文档。一般来说,于串口设备进行通讯需要经过如下步骤:

(1) 创建一个SerialConfiguration对象,然后根据特定设备的通讯参数修改一下波特率等值。
(2) 创建一个SerialPort对象,在创建这个对象的时候需要使用到串口的名称以及刚才创建好的SerialConfiguration。
(3) 利用SerialPort类的getInputStream() 和getOutputStream()方法获得串口设备的输入输出流,通过该设备的输入输出流即可与该设备进行通讯。
(4) 当不再使用这个串口设备的时候,利用SerialPort.close()关闭与该设备的连接,同时释放所占用的系统资源。

在QNX 系统下,设备名被保存在/dev目录下,串口设备被起名为ser(n),其中n是该串口设备的编号,从1 开始计数。例如/dev/ser1相当于晕倒死系统上的COM1,/dev/ser2相当于晕倒死系统上的COM2。因此,虽然J9 虚拟机在各个平台上都提供了对串口进行操作的包serial.jar,但是程序员仍然需要考虑到在不同的平台上设备名是不一样的。

下面的示范程序演示了与串口进行通讯的一般过程。该程序与连接在ser1 的设备进行通讯,将该设备的输出信息打印到屏幕上。


import java.io.*;
import com.ibm.ive.serial.*;

public class SerialDemo
{
public static void main(String[] args)
{
// 构造SerialPortConfiguration对象并且配置通讯参数
SerialPortConfiguration SPC = new SerialPortConfiguration();
SPC.baudRate = 19200;
SPC.dataBits = 8;
SPC.stopBits = 1;
SPC.parity = 0;

try
{
// 构造SerialPort对象,构造成功以后系统已经与指定的设
// 备连接上了
SerialPort SP = new SerialPort("/dev/ser1", SPC);
// 获得设备的输出并读取数据
InputStream DevIn = SP.getInputStream();
for (int i = 0; i < 10000; i++)
System.out.println(DevIn.read());
// 关闭与串口设备的连接
SP.close();
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}

对上面这个示范程序进行编译的时候,由于程序中使用了jclMax标准类库之外的类,所以需要在编译的时候指定类路径,也就是:

# j9c -classpath $CLASSPATH SerialDemo.java

在运行这个示范程序的时候,不需要再次显式的指定类路径,因为j9命令会自己到系统的CLASSPATH里面去找:

# j9 SerialDemo

需要说明的是,在J9虚拟机中同样提供了对扩展类库javax.comm的支持。但是基于 J9虚拟机的嵌入式Java应用中,普遍的做法是直接使用J9虚拟机本身的serial.jar。

- 作者: bom 2006年12月28日, 星期四 11:04  回复(0) |  引用(0) 加入博采

J9开发--AWT类库的安装和配置
3.1 AWT类库的安装和配置

对 嵌入式Java比较熟悉的朋友一定知道目前大多数的嵌入式虚拟机都提供了对AWT 的支持。例如Sun公司开发的Personal Java,Insignia公司开发的Jeode,Nsicom公司开发的CrEme,还有PERC公司开发的Perc,当然还包括我们正在介绍的IBM J9。就我个人所了解的情况,Nsicom公司开发的CrEme 是目前唯一的一个支持Swing 的嵌入式Java虚拟机。关于为什么在嵌入式Java中普遍使用AWT而不使用Swing的问题,我们会在这一章的第三节进行讨论。

根 据我们在2.3 节中的介绍,J9虚拟机在jclPersonal 标准类库中提供了对AWT的支持,但是在QNX的缺省安装中并不包括这个类库。因此,我们需要从J9虚拟机的新家WebSphere Studio Device Developer (也就是原先叫做Visual Age for Java Micro Edition的)中获得这个类库。

首 先我们必须从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我们都要下载。

首 先安装WSDD,将下载来的Software Updates解压到一个临时目录下,然后启动WSDD。从主菜单选取Help -> Device Developer Updates。点击Add或者是Update All,在随后跳出来的对话框里面选Local Predefined Locations。在最下面的Location一栏里面填上你所需要安装的Update,格式为file:/$dir,例如:

file:/c:/temp/wsddupdates/wsdd/4.0/runtimes/
file:/c:/temp/wsddupdates/wsdd/4.0/wce/

安装结束以后在下面这个目录找到QNX 的jclPersonal类库prsnlqnx.jar:

wsdd/wsdd4.0/ive/runtimes/qnx/common/ive/lib/jclMax/

如 果你的QNX 和Windows或者是Linux主机是两台独立的计算机的话,你可以通过网络或者是其它的可移动存储设备将prsnlqnx.jar拷贝到你的 QNX 系统上。如果你的QNX 和晕倒死或者是利怒死主机是安装的同一台计算机的不同硬盘或者是同一块硬盘的不同分区上的话,你可以启动QNX 进入文件管理器,然后进入/fs目录看看里面是不是能够看见其它的硬盘或者是分区。如果没有看到你所需要的硬盘或者是分区,你可以使用mount命令启用 相对应的硬盘或者是分区,使得你可以从QNX 系统下对这些硬盘或者是分区上面的文件进行操作。

将prsnlqnx.jar文件放到/usr/eclipse/ive/lib目录下,然后修改类路径,最好是在~/.profile文件里面改:

export CLASSPATH=$CLASSPATH:/usr/eclipse/ive/lib/prsnlqnx.jar

到目前为止,我们已经完成了AWT类库的安装和配置。

3.2 一个简单的AWT图形用户界面

AWT是Java语言中构建图形用户界面的标准。由于Java语言卓越的跨平台特性,在一个平台上编写的基于AWT的图形用户界面可以不加修改的直接移植到另外一个平台上使用。通常来说,构建一个基于AWT的图形用户界面需要经过如下步骤:

(1) 创建一个顶级容器对象,例如Window或者是Frame。
(2) 在顶级容器对象上面创建用户所需要的控件。
(3) 初始化所有的控件,包括大小和初始值等,为控件的事件注册必要的监听器Listener。
(4) 打开主窗口。

下面是一个简单的基于AWT的图形用户界面:


import java.awt.*;
import java.awt.event.*;

public class HelloAwt extends Frame
{
public HelloAwt()
{
Label label = new Label("Hello AWT!");
add(Label);

addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
}

public static void main(String[] args)
{
HelloAwt hello = new HelloAwt();
hello.setTitle("I Love Java!");
hello.pack();
hello.setVisible(true);
}
}

使用下面的命令编译以上例程:

#j9c -classpath $CLASSPATH HelloAwt.java

使用下面的命令运行以上例程:

#j9 HelloAwt

在Sun 公司撰写的Java入门教程The Java Tutorial中有专门的一章介绍了基于AWT 的图形用户界面。但是由于目前Swing已经正式成为标准版Java2 中构建图形用户界面的标准,这一章的内容被Sun 公司从The Java Tutorial网站上撤下,但是各位读者仍然可以从Sun 公司的网站下载这部分的教程:

http://java.sun.com/docs/books/tutorial/information/download.html#OLDui

3.3 关于AWT和Swing的一点讨论

在 第一节中我们提到了目前大多数的嵌入式Java虚拟机都提供了对AWT 的支持但是不提供对Swing 的支持。但是,在标准版的Java平台上Swing 才是推荐使用的图形界面系统,在Sun 公司所提供的Java Tutorial 中甚至把基于AWT 的图形用户界面设计这一部份从其网站中删除,需要利用到AWT 进行图形用户界面设计的用户只有将该部份下载到本地硬盘才能够使用这部份教程。在标准版Java中正值春风得意的Swing 为什么到了嵌入式应用中便不再吃香了呢?

AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口。AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers。 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库。由于不同操作系统的图形库所提供的功能是不一样的,在一个平台上存在的功能在另外 一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其功能的,我们通常把AWT控件称为重量级控件。

Swing 是在AWT的基础上构建的一套新的图形界面系统,它提供了AWT 所能够提供的所有功能,并且用纯粹的Java代码对AWT 的功能进行了大幅度的扩充。例如说并不是所有的操作系统都提供了对树形控件的支持, Swing 利用了AWT 中所提供的基本作图方法对树形控件进行模拟。由于 Swing 控件是用100%的Java代码来实现的,因此在一个平台上设计的树形控件可以在其他平台上使用。由于在Swing 中没有使用本地方法来实现图形功能,我们通常把Swing控件称为轻量级控件。

说 到这里我想各位读者应该明白了AWT和Swing之间的基本区别:AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT 的Java程序,其运行速度比较慢。对于一个嵌入式应用来说,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛 盾的情况下,简单而高效的AWT 当然成了嵌入式Java的第一选择。而在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素,所 以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。

- 作者: bom 2006年12月28日, 星期四 11:02  回复(0) |  引用(0) 加入博采

转:关于AWT和Swing
摘要:AWT和Swing 查看全文

- 作者: bom 2006年12月28日, 星期四 11:00  回复(0) |  引用(0) 加入博采

EtherPeek的使用方法.
摘要:EtherPeek的使用,这个东西比sniffer好用多了. 查看全文

- 作者: bom 2006年12月27日, 星期三 11:50  回复(0) |  引用(0) 加入博采

J2ME平台体系结构
J2ME平台体系结构

做J2ME应用开发的程序员也许经常会被一些名词或者概念所迷惑,比如Personal Basic Profile和Personal Profile有什么关系?基于CLDC的应用程序能够无修改的移植到基于CDC的设备上嘛?要回答这些问题并不容易,因为你必须首先揭开J2ME平台的 神秘面纱。
2000年当J2ME平台的CLDC发布的时候,所有的java开发者都为之兴奋不已。SUN也不负众望在两个月后发布了基于CLDC的MIDP,给开发 者提供了开发交互式应用程序的平台。我想现在国内还主要是基于CLDC/MIDP在开发应用吧。J2ME平台的另一个规范CDC在大概10个月后才发布, 同时发布的还有Foundation Profile。但是由于他们都没有给开发者提供开发可交互应用程序的API,因此他们发布的影响远远小于CLDC/MIDP的发布。大概在2003年 SUN发布了基于CDC的Personal Basic Profile和Personal Profile。他们的组合替代了以前的PersonalJava平台。

是不是已经被这些名字弄糊涂了,我们现在来看J2ME平台的结构。J2ME平台是本着Configuration和Profile结合来设计的。 Configuration是提供支持最大范围设备的最小的平台。Profile是针对特定的设备提供相应的开发包集合。在J2ME的两个基本配置CDC 和CLDC是按照如下的标准进行区分的。
CLDC:

512 KB 以下内存
有限能源供应(通常使用电池)
有限或非持续网络连接
简单的用户界面
16位或者32位的处理器
CDC:

2M以上内存
具有网络连接能力,通常为无线网络
需要实现java虚拟机规范的全部功能
32位或者64位的处理器

从上述的要求中我们不难看出CLDC主要针对那些资源非常受限的设备比如手机、PDA、双工寻呼机等。而CDC主要面对那些家电产品,比如机顶盒、汽车导航系统等。
下面我们来看看J2ME平台的结构图:


我们可以看出J2ME的核心是Configuration,在它里面定义了java的虚拟机,通过它来和底层的Host OS打交道。Profile提供了访问设备的IO或者图形界面的能力,这样Configuration和Profile共同构成了J2ME的运行环境。比 如CLCD/MIDP可以提供给你开发手机程序的环境。在Profile之上针对不同的设备还可以提供不同的可选开发包。
由于CLDC/MIDP大家都比较熟悉了,我们下面主要介绍一下基于CDC的J2ME系统构架,同样还是看它的系统图:

基于CDC的设备可以支持全部的Java2语言规范和Java虚拟机规范,它是CLDC的超集并且远大于CLDC,因此基于CLDC的程序是可以无修改的 移植到基于CDC的设备的。Foundation Profile是对CDC进行扩展的Profile,但是他并没有提供GUI的开发包,GUI是在Personal Basic Profile中进行定义的,它提供了AWT的一个子集给开发人员。它还提供了Xlet应用程序模式——针对java TV。Personal Profile是Personal Basci Profile的超集。他提供了对Applet的支持,丰富了AWT的组件,添加了java.awt.datatransfer包。
总结:上面是我对J2ME平台进行的阐述,我想最重要的就是Configuration/Profile的设计。理解了它就掌握了一半。如果大家有不同的意见,欢迎一起交流!

- 作者: bom 2006年12月26日, 星期二 08:24  回复(0) |  引用(0) 加入博采

转:用Shell编程实现DOS风格Linux命令行
查linux下的bash编程,看怎么判断磁盘上有没有一个文件存在,找到这个文章,暂时解决问题:

if [ -f "filename" ]
注意 -f 之前要有一个空格。


用Shell编程实现DOS风格Linux命令行

如果你是习惯于Windows命令提示符的IT人,当你第一次使用Linux命令行时,一定会感到无所适从。你所熟悉的DOS命令再
Linux中基本不存在。摆在你面前的是一大堆要记背的命令。

一种替代方案是利用强大的Linux外壳命令编写shell脚本,让你在Linux下也能用DOS命令。下面告诉你怎么做。

shell脚本编写基础

从定时备份到执行简单命令,Linux的shell脚本可以执行各种功能。几乎所有的程序都可以用shell脚本来运行。在脚本中甚
至可以包含一些简单的条件选择。shell脚本的基本格式如下:


#!/bin/sh

...

Your commands here

...


注意文件以#!/bin/sh开始。这条语句告诉操作系统用来解释脚本的程序位置。大多数系统会有/bin/sh目录,因为该目录包含
root用户的标准shell程序。在大部分系统中你也可以指定/bin/bash目录。

每种shell的脚本都有所不同。一些shell,比如bash,支持比标准shell更多的命令。在大多数Linux版本中sh实际上就是
bash。

从脚本运行命令十分简单,很像在Windows DOS提示符下运行命令。举个例子,通过下面这段语句可以拷贝文件:


#!/bin/sh

cp file1 file2

mv file2 file3

echo "complete" > complete.txt


自动执行命令对那些不需人工干预的任务很有用,但对一般用户来说并不那么有用。为此,shell脚本在执行过程中允许用户输
入命令行参数,然后利用输入的参数运行命令。脚本中输入参数用$1到$9表示。如果你曾写过DOS批处理文件,你会发现批处理
文件中也有类似功能,只是它用的是%1、%2等来代表输入参数。下面举例来说怎样使用命令行参数:


#!/bin/sh

cp $1 $2


上段脚本接受2个命令行参数,第一个是要拷贝的原文件,第二个是拷贝的目标文件。运行脚本的命令格式是:./myscript
file1 file2,myscript代表脚本文件名。命令行选项也可以通过这种方式传递,如:


#!/bin/sh

cp $1 $2 $3


键入./copy –r sourcedir destdir形式的命令执行上段脚本,即可递归拷贝$2目录下所有文件到$3目录下。选项$1为-r
时能让cp命令递归拷贝所有文件。


含条件选择的shell脚本

对于不含变量的任务简单shell脚本一般能胜任。但在执行一些决策任务时,就需要包含if/then的条件判断了。shell脚本编
程支持此类运算,包括比较运算、判断文件是否存在等。基本的if条件命令选项有:

-eq —比较两个参数是否相等(例如,if [ 2 –eq 5 ])

-ne —比较两个参数是否不相等

-lt —参数1是否小于参数2

-le —参数1是否小于等于参数2

-gt —参数1是否大于参数2

-ge —参数1是否大于等于参数2

-f — 检查某文件是否存在(例如,if [ -f "filename" ])

-d — 检查目录是否存在

几乎所有的判断都可以用这些比较运算符实现。脚本中常用-f命令选项在执行某一文件之前检查它是否存在。



来自于:
http://linux.ccidnet.com/art/302/20061129/963331_1.html

- 作者: bom 2006年12月21日, 星期四 13:07  回复(0) |  引用(0) 加入博采

有没有人想一起做点什么?
摘要:对于技术,有些厌烦的倾向;也许厌烦的只是工作而已。 有时候想不明白到底是要做什么,或者想做什么,回头看看走过的路,做了很多却也多重复和拼凑,缺乏实质性的东西,不知道真的是为了生活在赚钱,还是本身就缺乏坚持的态度。 对技术还是有兴趣的,只是哪个才是真正的技术,也许水平有限,但却从来没试过做点什么,谁来提建议。 查看全文

- 作者: bom 2006年04月3日, 星期一 16:40  回复(1) |  引用(0) 加入博采