Apr 1 2008

Java Final vs C++ Const

Java的Final看起来和C/C++的Const有几分相似,但又有很多不同,看了这篇文章后总结如下,Final有三种主要用法:

修饰变量:variable

final变量是不可改变的,但它的值可以在运行时刻初始化,也可以在编译时刻初始化,甚至可以放在构造函数中初始化,而不必在声明的时候初始化,所以下面的语句均合法:

  • final int i = 1; // 编译时刻
  • final int i2 = (int)(Math.Random() * 10); //运行时刻
  • final int i3; //构造函数里再初始化

而如果修饰类对象,并不表示这个对象不可更改,而是表示这个这个变量不可再赋成其它对象,这就比较象 C++的 Class const * p了。

 final Value v = new Value();
 v = new Value(); //不允许!
 v.some_method(); //允许

final经常和static一起用,这种用法类似C++的常量,在Java中很常见,比如 static final i = 10; 但这里同样也是允许运行时刻初始化的。

修饰方法:method

修饰方法时,final和C++的const就差别太大了,final表示一个Java函数不可更改,也就是不能被重载了,而不是修饰返回值的,所以private方法自动就是final的了(它们不会被重载)。

带来的一个附带的好处就是,final方法可以被编译器优化,比如内联什么的,也就是说final的方法可能效率会高一些(仅仅是可能,具体取决于编译器)。

修饰类:class

这个可以从final修饰方法引申开去,就表示整个类不能被继承了, 自然,里面的所有方法也相当于被加了final。

总之,final和const差别较大,还好Java换了一个关键字来做这些,否则会晕倒一批C++用户的,不过Java似乎保留了const这个字,不知留作什么用。


Mar 27 2008

批处理读取用户输入

在DOS下想在批处理(bat)里面读取用户键盘输入还不是很简单的一件事,印象中以前都是用copy CON filename这样的非常规方法,但这个方法确实很土,CON是键盘设备的名字,所以这条命令就是从键盘读取输入放到文件里,在输入的时候没有提示不说,而且还要记得结束输入(EOF)的特殊键是Ctrl-Z(F6也可以),这种方法到现在还可以用,附带的一个好处是再也不能用CON作为一个文件的名字了。 :)

时代进步到Windows2000后,我们有了一个更好的命令 set /p var=prompt,这个命令由于借用了set这个命令名字,理解起来也是有一些困难,它实际上是以prompt提示用户输入,并将用户输入的一行字符放到环境变量var中,下面是一个例子:

D:\>set /p var=input:
input:vvv
D:\>echo %var%
vvvv

而在Linux下,bash的read命令则要强悍的多了,read可以同时读入多个变量,比如:
wenshu@ws-lap:~$ read var1 var2
skf skfj
wenshu@ws-lap:~$ echo $var1
skf
wenshu@ws-lap:~$ echo $var2
skfj
wenshu@ws-lap:~$

除了基本的输入功能,继承Linux命令行的优良传统,read还可以支持很多参数,比如加 -p 来设置提示信息,用 -s 将以密码方式读入(不回显), -e 可以让用户在输入时可以用方向键编辑,甚至还支持 -t 设置一个超时,超时就不候用户了,真是非常贴心。


Mar 23 2008

Netbeans6.0的Visual Mobile Designer

需要承认,我一直没有注意Netbeans的Visual Mobile Designer(VMD),因为毕竟Netbeans不是VB/Delphi这种专门的RAD工具,在Netbeans里面提供这种让程序员用所见即所得的方式去控制界面和自动生成代码的工具,总感觉有些怪异,而且VMD还不仅仅是画界面,它还提供了程序逻辑功能,有点象流程图,并且里面的箭头都是“绘制”出来的,你会习惯用这种方式写程序吗?

由于J2ME本身用户界面部分的代码并不复杂,因此手动用代码来实现其实也可以接受,不过如果想快速写一个程序,VMD还是蛮合适的。而且除了标准的J2ME控件外,VMD还提供了一些基于J2ME控件的Custom控件(想一想VB/Delphi都有这些),比如什么Splash/Login 等等,这些如果手动写代码还是有点麻烦的,所以想用这些的话,VMD也挺合适的。

至于使用“流程图”来代替逻辑部分的编程,显然只能对小程序适用,而恰恰很多J2ME的程序都很小,因此也可以一用。我自己试用的结果是效率是有一些提高,而且和所见即所得的界面编辑功能结合起来,还真挺方便的,印象大为改观,什么时候用这种方式“画”一个程序出来看看效果如何。

一些参考文档:


Mar 20 2008

牛人之-Adrian Holovaty

这是我比较敬仰的一个牛人,Adrian Holovaty,善用Python,是Django Web框架创始人之一及主要开发者(Lead developer),文档写的一级棒,Django book的作者,每一个Django的开发者必读的文档,现已成书有售。

同时也使用Python创建了一些网站,其中一个小网站chicagocrime.org最为有名(之所以有名是一是因为创意,另一个重要原因是它是较早使用Google Map的Web应用),最初这个小网站是记载芝加哥最近30天的犯罪信息(地点,类型,地图等),如今已经扩展到很多其它的信息(失物招领,最新电影等),比较强调时效性。

除了Django之外,Adrian Holovaty也用Python开发了其它一些开源的项目,比如一些Python的库,甚至还有一个Greasemonkey脚本的编译器(这种脚本通常在Firefox里面用的较多),还有的成果自然是一些Firefox的插件,也蛮多的。

最后, Adrian Holovaty擅作曲和吉他,有不少的音频和吉他视频在网页上,或许会出专辑,呵呵。Django应该就是取自一个爵士音乐人的名字(传说此人也很有名:Django Reinhardt,我不了解,不作介绍了)。

总结:牛人 (想看照片的话找google,前几张都是)。


Mar 16 2008

Synclast

Synclast是J2ME的一个UI库,提供了常见的一些GUI控件,这些GUI控件在不同的手机中可以保持一致的外观。

需求

一般来说,J2ME的GUI有两层API,一层是高级UI,提供了各种GUI控件,但是J2ME只是规定了这些控件的接口,没有规定实现,因此不同厂商的这些UI的实现有很大的差异,也就是在不同的手机上看到的UI可能会有差异,另一层是基于Canvas的低层绘图接口,这一层次上需要应用程序直接在Canvas上绘制用户界面,不提供控件功能,但是好处是在各个手机上有一致的效果。

很多应用程序希望得到这种一致的效果,但直接在Canvas上编程又太麻烦了,于是就有了各种基于Canvas的UI库,Synclast是其中的一个。

安装

在Ubuntu下,不能用apt-get来安装synclast,需要到Sourceforge上去下载(似乎已经很久没有更新版本了,最新的可下载版本还是2004年的,但直接用cvs版本的话会有不少更新),展开后的Synclast包括了源码,例子以及编译好的jar包,要安装例子程序,可以使用下面的命令:

export J2ME_HOME=/usr/local/netbeans-6.0/mobility8/WTK2.5.2/

sudo ant demo

这会将Synclast的例子程序安装到系统中去。

运行

启动Netbeans6,选择New Project中的Mobility下的Import Wireless Toolkit Project,就自然可以看到SynclastUIDemo这个工程了,创建它,剩下的工作就很简单了,直接在Sun模拟器下运行就可以看到Synclast UI的几个例子。

因为我没有用过它,所以不作评价,类似的这种UI库还有J4MEJ2ME Polish等,不过感觉还是不够多,可能和J2ME在手机应用程序领域的流行度有关。


Mar 11 2008

J2ME Canvas的Double Buffer

Double buffer(双缓冲)曾经是游戏编程中常用的一个技巧,可以使动画更平滑,它的原理很简单,就是在刷新显示时,先在内存中作图,再从内存“拷贝”到真正的显示设备上,通常拷贝比直接绘图要快,因此这个方法可以显著提高显示切换的速度,做到平滑的显示效果,因为要准备一个内存中额外的缓冲,所以这种方法通常被称为双缓冲(Double buffer)。

J2ME中的UI部分,如果使用低级的Canvas来做用户界面的话,Canvas仅仅提供了一些最基本的绘图操作(线,框,填充等),要支持象按钮,列表等这些UI控件的话,不免要自己来做绘制了,这时Double Buffer就可以派上用场了。在有些平台上,Double Buffer已经内嵌就支持了,我在Sun的模拟器和N73上实测的结果是这两个平台已经都支持了Double Buffer,无需再写代码去实现额外的显示缓冲了,在Symbian S60的网站上也找到了一篇文章证实了我的猜测。
这里的一篇文章详细介绍了在使用Canvas时如何使用Double Buffer,还提供了一个动画的例子程序,这个例子代码使用了Canvas的isDoubleBuffer接口来判断一个Canvas是否已经支持了DoubleBuffer,如果不支持的话,才自己分配一个buffer来做Double Buffer,如果已经支持了,那么直接绘图就可以了。但是代码中有一个明显的bug,这句话:

g.drawImage (offscreen, 0, 0, Graphics.TOP | Graphics.RIGHT);

需要改为:

g.drawImage (offscreen, 0, 0, Graphics.TOP | Graphics.LEFT);

不过这个语句只在Canvas不支持Double buffer才用到(用于buffer的拷贝),所以在模拟器上是没有影响的,我也是为了验证double buffer的效果,特地注释了前面的isDoubleBuffer的检测(强制使用代码实现的Double Buffer)才发现这个bug。


Mar 7 2008

Google Android试用

以Google在业界的地位,加上手机操作系统这样的热门领域,Google的手机操作系统Android想不火都不行,喜欢品尝新鲜的我自然也来尝试一下了。

Android是什么

简单的说,Android是操作系统,不过这个等于是废话,更准确一点,Android是基于Linux/Java组合的操作系统,Linux几乎是众望所归,但在Java的选择上,多少有些出乎意料,Java成了Android世界的唯一官方语言(连C/C++都被暂时抛到一边了,以后也许会支持),而且Google非常“意外”(或者说野心也好)的抛弃了Sun的J2ME(Java对应移动设备的版本),而是完全实现了新的类库和应用程序框架,甚至连虚拟机也不放过,搞了自己的Java虚拟机,这一定令Sun相当的不爽,不知会不会再兴起一场波澜(当年的Sun大战 Microsoft还记忆尤新)。

不过看过Android的应用程序结构之后,也大概能明白Google的苦心了,Android应用程序在很多方面确实和J2ME有很大的差异,下面是我印象深刻的几点。

组件化

Android下,应用程序更像是一个个的组件,它们提供了对外的标准服务,也同时使用其它应用程序提供的服务,应用程序可能因为服务而被其它程序随时唤起运行,应用程序的边界已经变得模糊了。很多应用程序不提供退出选项,它们会在“适当”的时候由操作系统关闭。

Web化

Web是Google的实力所在,Google也把Web中的强势带入了Android,看看Android模拟器上那个大大的Back按钮,就可以感觉到这种趋势了,在Android下,与其说用户在使用不同的应用程序,不如说是用户在“浏览”Android的不同的“页面”,虽然我们看不到URL,但并不影响我们使用Back按钮感受如浏览器一般的体验。

炫目的界面

在UI上,J2ME与Android似乎不在一个层面,Google为Android配备了比J2ME丰富太多的UI,可以很明显的感觉到在UI上,Android的对手是iPhone而不是J2ME(虽然看起来在UI上,iPhone很难超越)。

试用

从Google的网站上可以很容易的下载Android的SDK和Eclipse插件ADT,有了这两个东西,理论上我们已经使用Eclipse开始Android开发了,我本想写详细的过程,不过发现没这个必要了,因为这篇文章已经解释的很清楚了。

我在Ubuntu下的测试发现,必须将Eclipse切换到Sun的jre才可以正常使用Eclipse/ADT(Ubuntu下我的Eclipse原来是用的gcj),否则连Android自带的例子程序都跑不起来,这一点是Google的文档中没有提到的。


Feb 17 2008

两本J2me入门的书

《Core J2me Technology》,不要被书名忽悠了(又或是我对Core这个单词理解不够),这本书是很基础的一本J2me书,深入浅出,细节讲解透彻,示例代码也清晰明了,这应该算是不错的评价了吧,就是涉及的内容少了点,一些内容提都没有提到,还有就是前面开发环境搭建的章节有些过时了(开发工具发展比较快,书没有跟上),但作为一本学习MIDP编程的入门书还是很好的。

《Beginning J2ME: From Novice to Professional》书名则要清晰的多了,从目录上看,内容也要比上本书丰富许多,包括了Core一书中没有提到的诸如蓝牙,短信,多媒体等内容,可惜在细节上下的功夫不够,我对比了两本书讲同一内容的几处章节,Core一书大多要清楚一些,所以这本书我就没怎么看了(那些蓝牙之类的章节我还没有需求)。不过在Amazon上它也是4星的评价,也算不错啦。

对比一下,好像Core一书可以说是“少而精”,而Beginning一书则相对“多而糙”,你喜欢哪种?


Feb 1 2008

J2ME Connector.open陷阱

这是J2ME里处理Web连接最常用的方法, 但一个小问题很容易被遇到:

Connector.open通常会使得J2ME虚拟机弹出一个警告:是否连接网络?真实的手机上也会有类似的警告(比如Nokia N73)。而这个警告是需要用户选择同意的,如果在程序的主线程中执行Connector.open,由于主线程同时需要处理GUI事件,那么这里就形成一个"死锁"。

如果是用Netbeans的话,Netbeans在调试运行时,会"发现"这类主线程中的网络调用,并在调试控制台显示警告信息,提示这类调用应该在单独的线程中执行,这个比较人性化,要是它能自动实现这个单独的线程,那岂不更妙(做梦吧。。。)


Jan 29 2008

HTML/CSS/JS编辑器-aptana

印象中,我曾经几次试图找一个顺手的HTML/CSS/JS编辑器,大多没有好的收获,或者不比gedit强多少,这个顽固的印象要改一改了,因为昨天发现了Aptana,一个开源的Web开发IDE。

Aptana基于Eclipse,支持各种Web设计和开发,比如XHTML/CSS以及Javascript, 我简单的用了一下它的编辑器编辑了一个css文件,相当的专业,丰富的代码提示以及浏览器兼容指示估计应该能让生产率提高不少,但我使用的功能很少,这只算一个良好的初步印象。

Aptana的安装很简单(很遗憾,暂时还不能用apt-get),下载那个Aptana Studio的Community版本就可以了,解开就可以直接执行,在我机器上,跑的不错。

一个插曲是,直接安装后的版本(我用的是1.1),居然将 a:hover 这类css修饰当成了错误(放了一个小红叉在代码行前),这应该算一个严重的bug了,虽然官方给出了解决方法(只需要修改一个设置),但还是给人感觉有些不严谨。