跳至主要内容

博文

目前显示的是 2007的博文

VIM + CTags (2)

CTAGS工作的原理其实就是抓取源文件中所有的标签名字——包括关键字、变量名、方法名等,将它们排序后存储在标签列表文件中。VIM可以读取这个标签列表,根据用户的需要执行跳转。 CTAGS生成标签列表的方法很简单,以下命令展示了如何使用CTAGS抓取src目录中的所有文件生成标签列表: # ctags -f .\.tags -h .java -R .\src %JAVA_HOME%\src 这里用到了ctags的2个option(命令选项): -f [name]: 指定生成的标签列表的存储路径。 按照一定的规则存放所有的项目文件是一个好习惯。这里如果[name]指定为 - ,将会在stdout输出生成的标签列表。 -R: 等效于--recursive,要求递归对子目录进行抓取,一并生成标签。 对于Java、C#这些通过package支持命名空间的语言来说,这无疑是个非常高效的选项。想想com.jlazy.ctags.vim.Sample 这样的名字吧,对应到文件系统该需要多少个子目录,如果手动来抓取,那岂不是要抓到手抽筋…… -h [list]: 指定待处理的文件扩展名列表。 例如,".h.c.cpp.cxx.hpp"是为典型的C++程序指定的文件扩展名列表。 仔细打开ctags生成的tags文件看看,会发现头部其实定义了一些表明当前文件的状态的变量: !_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/ !_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/ !_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/ !_TAG_PROGRAM_NAME Exuberant Ctags // !_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ !_TAG_PROGRAM_VERSION 5.5.4 // 通常直接生成的tags文件都是排过序的(sorted),显而易见排序的目的是方便vim通过查询算法快速定位标签。就像二分查找需要应...

VIM + CTags (1)

通常情况下,程序员在日常工作中打开的不可能只有一份文件——想想Java的package和class,C、C++的header files,还有.Net C#的partial class就会赞同这个观点。VIM这种强悍的编辑器自然充分考虑到程序员的需求 —— move around quickly。 VIM支持CTAGS程序,这是一个独立的程序,大多数Unix/Linux系统都安装了它的实现。只需要在$VIM/plugin中安装 taglist 插件即可借助于ctag的威力对所有文件进行tag的索引。值得一提的是,ctag本身在不同系统上的实现是可能有所不同的,推荐使用的是source forge上的开源项目 exuberant ctags。 C:\Program Files\GNU>ctags --version Exuberant Ctags 5.5.4, Copyright (C) 1996-2003 Darren Hiebert Compiled: Mar 29 2004, 22:21:09 Addresses: <dhiebert@users.sourceforge.net>, http://ctags.sourceforge.net Optional compiled features: +win32, +regex, +internal-sort 安装了CTAGS程序之后,可以在系统变量path中加入该程序的路径,比较方便。如果不加入path,则需要在vim中加入配置行: let Tlist_Ctags_Cmd='C:\Program Files\GNU\ctags.exe' let Tlist_Use_Right_Window=1 let Tlist_File_Fold_Auto_Close=1 使用taglist的第一步,就是调用CTAGS程序生成tag list。 > ctags.exe $SRC\*.cpp $SRC\*.h 如果需要针对给定目录下的所有代码文件都生成tag,可以采用: > ctags.exe -R $SRC\*.java 生成的tags文件就是所谓的tag list(标签列表文件)。VIM可以通过这个文件来查找任何一个标签被定义的位置并跳转。 如果知道一个标签的名字,可以通过命令...

Android SDK Released

Google终于放出了 Android SDK (http://code.google.com/android)。YouTube上放了几段录像,有一个叫做Androidology的,分为3个部分,介绍了整个Android系统的架构、应用程序的生命周期等,非常详细。还有一段录像是Andorid的开发团队做的简单介绍。Android是Danger公司的研发成果,这家公司在2005年被Google买了下来。 Android使用了Linux作为内核,原因之一是Linux已经被证明对于硬件的驱动支持的很好,可以方便得移植到不同的硬件平台上。在内核层之上,是Library层,这一层主要是由C/C++编写的核心库程序,包括了: Surface Manager, 维护所有界面的管理程序 OpenGL/ES,支持3D界面的渲染,根据介绍,在Android上运行的应用程序可以同时使用2D和3D效果渲染。 SGL,支持2D渲染,这也是应用程序使用的最最最多的渲染方式。 Media Framework,这是由开放手机联盟中的一家公司支援的媒体框架,可以支持mpeg,mp4等解码。 FreeType,貌似是字体的支持 SSL,不用说了,安全连接协议 SQLite,Android的许多核心数据都是通过这个来保存的。 WebKit,开放的浏览器核心,Mac上的Safari也是从这发展起来的。 libc,接触过Linux的都久仰大名 同Library层并列的是Android Runtime (也就是所谓的运行时环境,这个“常见”的中文译名总是令初学者满脑子问号……)。Runtime包括了Dalvik VM和Core Libraries。Android平台上应用程序的开发是以Java为工具,最终编译为dex文件安装到移动设备上。之所以不直接采用class/JAR文件,肯定是出于效率的考量。为了提高字节码的运行速度,Android提供了自己的字节码解释器,针对运行效率做了很大的优化。所有的应用程序都在编译期间转化为dex格式。 再往上走是由Google或是其它公司提供的Application Framework (应用程序框架),这里开始就完全是Java的世界了: Activity Manager Activity主要是提供了一个用户动作的接口,实际上可以理解为一个UI,例如,一个Email程序可以...

Google & Android

随着iPhone的风行,传言中的Gphone吸引了越来越多的目光。本周Google刚刚参与了OHA对于 Android的发布 。 传言中的 Gphone 被认为是Google将要发布的第一款手机,不过这次Google选择了发布一个open platform —— 由三十多家厂商组成的开放式手机联盟(Open Handset Alliance),其中包括了移动设备的巨头,像是Motorola, T-Mobile, HTC和Qualcomm;也涵盖了移动运营商,如中国电信、KDDI、NTT DoCoMo;还有一大堆的硬件制造大牛,诸如Nvidia, TI等。毫无疑问,Android Platform要对抗的是Nokia的Symbian,微软的Windows Mobile,以及Palm等现有的移动设备平台。 Android的目标 是让移动设备可以像现有的PC一样,有能力访问所有的web service (想想Google Map,Gmail等服务),这无疑是令所有终端用户垂涎三尺的能力。据说2008的下半年就会有第一款基于Android的手机面世,等着到时候看成品了~

CHM Bug

发现CHM格式的一个bug——刚好在看一本书,叫做"Windows Forms Programming in C#",下载下来的时候文件名叫做"Addison Wesley.Windows Forms Programming in C Sharp.chm",一时手贱改成了"Windows Forms Programming in C#.chm"。对Windows系统而言,'#'是一个合法的文件名字符,但是不知道为什么,改名之后的CHM打开之后就是一片空白了。

初识Maven

Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM),Mavencan manage a project's build, reporting and documentation from a central piece of information. 尽管Ant对于构建Java程序而言是事实上的标准工具,但这个工具在许多方面都不胜任项目管理任务。相反,Ant提供的东西,Maven(出自Apache Jakarta项目的高级项目管理工具)都能提供,而且更多。Maven除了以程序构建能力为特色之外,还提供Ant所缺少的高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目,而使用Ant则需要十几行。事实上,由于Maven的面向项目的方法,许多Apache Jakarta项目现在使用Maven。 试用了Maven,在命令行下敲了几行基本的命令,很快地就构建好了程序的框架目录结构。感觉挺好,正在仔细阅读它的文档。为了能够更方便地使用工具,我总是希望可以集成到Eclipse中。目前有2种插件可以帮助集成maven —— M2Eclipse (Tycho) 和 q4e。 q4e是Google Code上的一个项目,它的目标是作为基础插件被加入到Eclipse Foundation。在Downloads中是找不到安装包的,只有到wiki中才能发现原来是通过SVN的repository来提供下载: http://q4e.googlecode.com/svn/trunk/updatesite/ Quotation: The following is required to use the Q for Eclipse Plugin: Eclipse 3.3 http://download.eclipse.org/eclipse/downloads/ Java 5 http://java.sun.com/

Anti-pattern of Constant Interface in Java

There is a famous book named "Effective Java", whose author is Joshua Bloch. In this book, there is a chapter about the "constant interface" anti-pattern. Besides, a new grammar named "static import" has been added into the language since Java 5.0. As explained in Sun's document , this feature is designed to encourage developers to use utility class rather than constant interface. Quote: In order to get around this, people sometimes put static members into an interface and inherit from that interface. This is a bad idea. In fact, it's such a bad idea that there's a name for it: the Constant Interface Antipattern (see Effective Java Item 17). The problem is that a class's use of the static members of another class is a mere implementation detail. When a class implements an interface, it becomes part of the class's public API. Implementation details should not leak into public APIs.

The Size of a Class/Object

最近在研究C++的object model,刚好看见几道关于sizeof的题目,做下来发现关于virtual关键字的class size并不是那么容易计算。还有编译器为了优化而产生的data padding也很tricky…… class  A { int  a; };             // sizeof(A) = 4 class  B : A { int  b; };         // sizeof(B) = 8 class  C : A { int  c; };         // sizeof(C) = 8 class  D : B, C { };             // sizeof(D) = 16 class  A { int  a; };             // sizeof(A) = 4 class  B : virtual  A { int  b; }; // sizeof(B) = 12 class  C : virtual  A { int  c; }; // sizeof(C) = 12 class  D : B, C { };             // sizeof(D) = 24 class  A { int  a; };       ...

Java & IPC

在Windows/Unix-like平台中,针对 IPC (Inter-process Communication)提供了许多机制,例如 Semaphore, Pipe, Shared memory等。在Java中,这些强大的能力都受到了限制,由于Java本身是提供Thread机制的,所以线程间是不大需要考虑使用IPC的,但是有时候Java应用程序可能需要同其它的native application进行通信,这种情况下就需要考虑IPC方式了。 Socket当然是可选方案之一,不过很多时候由于需要通信的数据并不多,采用socket就有点算weight solution了。RMI和Socket就不放在考察范围之内。 遗憾的是,根据google查到的资料,并没有发现非常简洁优雅的解决方案——最raw的就是用JNI了,遇到这种需要维护C、C++指针的情况,crash掉整个JVM的bug是必然多发的。查了一些资料,愈发无奈…… 难道真的要靠自己搞定JNI,或是购买成熟的commercial product来解决?? I am familiar and had used many times concurrent threads and "synchronized" in Java. The thing is, I want to share memory between 2 threads/processes , one in Java and one in "C". There is of course the JNI solution; I am currently using it; the thing is that when you call a JNI method from Java , and there is some problem in the "C" code (like a pointer which is not handled right and ,for example, is incremented so that it points to a non-valid address) it is sometimes difficult to trace. Of course you c...

Eclipse v3.4M1 Issues

自从将IDE由Eclipse 3.2.1升级到 3.4M1 之后,发现有不少问题: 1) Ctrl-Shift-G 搜索全文引用的时候,经常会出现错误提示——For input string: "filter_imports"。 上网搜索了一下, 解决方案 如下: 进入 $WorkSpace\.metadata\.plugins\org.eclipse.jdt.ui 删除IDE自动保存的一些档案: dialog_settings.xml OpenTypeHistory.xml QualifiedTypeNameHistory.xml 重启Eclipse即可。 2) Console的字符串问题。 我使用Ant脚本来编译项目,ant脚本执行时部分输出信息是中文。不知为何,在3.4M1中只要遇到中文,Console就不再输出任何字符,虽然编译可以继续进行。估计是因为Eclipse的new feature——Default console and file encoding,由于我保存Java source的编码格式都是UTF-8的,它默认也用UTF-8作为console的输出encoding。可能这里有bug,我试着将console encoding改为ISO8859-1,这时候中文都以问号显示,其它的文本都可以输出了。不过这毕竟只能解决一部分问题,目前还没有找到完美的解决方案,搞得我很郁闷……

Migrate Java IDE to Eclipse 3.4M1

周末将我的Java IDE做了一个升级——Eclipse 3.4M1。顺便下载了不少插件,主要都是和JavaEE相关的,包括: emf-sdo-xsd-SDK-2.3.0 GEF-SDK-3.4M1 wtp-S-3.0M1-200708232314 dtp-sdk_1.5_20070704 Subclipse-1.2.3 Subversive_1.1.0.RC6a HibernateTools-3.2.0b10 相较于使用Update-Site做自动下载更新,我更喜欢手动下载好必要的local site,再使用links目录来配置插件。网络上关于Eclipse下如何使用links目录的介绍很多,不过还是要媚俗地记录在blog上,以备将来需要的时候可以查到最顺手的帮助资料: 先将每个插件都解压缩到一个repository中,例如,我的Eclipse安装在D:\eclipse,我将所有的插件都放到D:\eclipse-plugins目录中。每个插件目录都应该以标准的目录树结构出现: eclipse | + [features] | + [plugins] | + <other necessary files> 然后,在eclipse的目录中建立一个links目录,里面新建一个link文件,文件中针对plugin所在的path进行配置,例如我的SVN插件配置为: path=D:/eclipse-plugins/Subversive_1.1.0.RC6a 注意,这里必须用“\\”或是“/”作为路径的分隔符号。 如果你愿意,可以在一个link文件里面使用多行“path=...”来指定所有的插件,或者也可以像我一样,使用多个link文件来指定插件。这属于个人喜好问题,每个人都有不同的偏好(preference)~ 好了,最后执行的时候可以在快捷方式里面加一个参数“-clean”,提醒Eclipse清除之前的缓存配置。如果这次启动成功,并且可以使用所有的新插件,那么就可以去除“-clean”参数了。 Eclipse 3.3之后,就多提供了一个eclipsec.exe文件,这个文件类似于在GUI程序后面挂了一个DOS窗口,显示log用的。Google了一下,貌似是为了解决windows上的一个小bug而提供的这个启动档。 使用Eclipse作合作...

C++编译器对于参数的初始化(Argument Initialization)

C++标准规定,将一个class object作为参数传递给一个function,等效于以下的初始化形式: X xx = arg; 这里,xx表示的是形式参数(formal argument)或是返回值(return value),arg表示的是实际参数(actual argument)。因此,假定有一个函数 void foo(X x0); 并有如下的调用: X xx; // ... foo( xx ); 这时候就需要x0这个局部实例以xx来memberwise initialized。 一种实现的策略就是引入一个临时的对象(temporary object),调用拷贝构造函数(copy constructor)来初始化这个对象,并将它传给function。例如,将以上的代码片段采用这种策略做转换,得到的伪代码如下: // Pseudo C++ code // compiler generated temporary X __temp0; // compiler invocation of copy constructor __temp0.X::X ( xx ); // rewrite function call to take temporary foo( __temp0 ); 但是,这个转换仅仅才完成了一半。为什么呢?因为foo()的声明中,临时对象会先以class X的copy constructor正确地初始化,再被bitwise copy到局部变量x0中!因此,foo()的声明也要做转换,不再使用一个对象实例作为参数,而使用对于class X的一个对象引用作为参数: void foo( X& x0 ); 如果class X声明了一个析构方法,那么在foo方法调用结束之后,临时对象的析构方法会被调用。 另一种实现是将在函数激活的时候,直接以拷贝构造在stack栈上作出实际参数。在函数调用返回之前,局部对象的析构函数会被调用。Borland C++编译器,就采用了这种策略,不过它也提供了一个编译器选项,可以实现第一种策略,这主要是为了兼容早期编译器的实现。

Hibernate Escape SQL Keywords

最近在使用Hibernate的时候遇到了一个诡异的bug,花了将近一个小时的debug时间,终于发现根源是table的column name刚好是SQL keyword (例如id, mode之类的名字)。Hibernate在自动生成的SQL语句中是不会自动加上标准的单引号(`)的,这导致我的数据库MySQL引擎在解释SQL语句的时候抛出了异常…… 经过一番google,最终采用了一个解决方案——在hbm.xml映射文件中为该字段指定使用quote,例如:      <property name="mode" column="`mod`"> 这样就等于强制使用了单引号的语法。 有意思的是,发现NHibernate的bug list中就有 关于是否要自动使用quote的相当激烈的讨论 。个人认为如果在hibernate configuration中可以通过某个property指定所有的SQL语句都要使用quote就很方便了。

关心一下C++0x

午休时间,逛了逛C++的『罗浮宫』,读了 『C++0x漫谈 系列之:Concept, Concept!』 。也看了G9写的一篇精彩的 『随堂笔记』 ,无意中看到Bjarne自称早在20年前就不用VI或是Emacs了…… 好久没用C++了,生疏得发怵…… 最近正在恶补 Inside C++ Object Model.

Repacking MIDlet class

JavaME的程序要打成Jar包提交,由于移动的限制,Jar的file size越小越好。Proguard无疑是最受青睐的混淆器之一。 混淆打包的时候,经常遇到这样的问题:如何将keep指令保留的class放到default package中?搜寻了很久也没有找到答案,都想利用Proguard的src自己来写个小工具了,又仔细搜了一边help forum,终于看到了 解决方案 。 Quote: Keeping a class name means keeping its fully qualified name. You could try creating a mapping file with the name that you want, and feeding it into ProGuard with -applymapping. In ProGuard 4.0 beta, you can specify -keep,allowobfuscation instead of just -keep. If you use -printmapping, you can then find the obfuscated name in the mapping file. Eric. 可以先用keep执行一次obfuscate,将映射结果用printmapping打印出来,保存为proguard.map文件,再修改其中MIDlet类型的映射,如: com.jlazy.MyMIDlet -> MyMIDlet 然后,在keep选项之后加一个参数allowobfuscation: -keep,allowobfuscation public class * extends javax.microedition.midlet.MIDlet 并在progard中指定使用map文件执行repackage: -applymapping 'proguard.map' 这样就搞定了,所有的class都放到了default package中。 这个解决方法必须要使用 Proguard 4.0 beta 以上版本。而且由于要在第一次生成映射文件,多做了一步,感觉还可以再改进。如果Eric没有时间加入这个feature的话,打算自己写一个并集成到ant脚本中。

Project in VIM

最近想要用VIM组织一下文件,搜索了几个插件,觉得project还不错。VIM本身朴素的文本界面决定了文件树的简洁特质。 Project插件为VIM提供了组织文件的功能。用户可以将常用的文件组织到一个文件列表中。这份列表将会被VIM显示在左侧的窗口中。可以按『回车』键或是双击文件名来打开文件。这比起另一个插件『file-explorer』要容易使用。 这个插件还可以帮助用户切换到另一个目录,并运行vim的脚本。这些脚本可以修改环境变量,将编译器包含到$PATH变量中。这使得需要操作多个项目变得轻松易行。 由于Project插件内置了对VIM的folder的支持,因此可以自由地使用折叠功能来控制各个directory结点。而且使用'/'或是'?'进行查找的时候,丝毫不受折叠的影响。真是太酷了! 其它特点包括: 加载或是卸载目录中所有的文件(\r)。 Grepping项目中所有的文件,这个特征还没有研究,不知道Windows下是否也支持grep。 运行一个用户自定义的脚本(非常有用的功能,可以用于定制编译环境)。 高度可定制。用户甚至可以自己编辑project的定义文件。 可以配合netrw插件,通过不同的协议(如ftp、rcp、scp或是http等)来操作不同的文件。

近期关注的编辑器

最近装了个Ruby,顺便也用了用它自带的一个编辑器 SciTE 。虽然UI看起来有点质朴,不过功能还是挺不错的。 同事推荐 Notepad++ ,据说也是一个免费的开源工具,运行在Windows上的速度很快。看了一下官方主页,这个工具使用了Win32 API和STL来编写,因此运行速度很快,而且编译出来的二进制代码比较小。 后来发现,这两个编辑器都是基于 Scintilla 组件所编写的。这是一个很不错的editing component,支持Win32和GTK+。

MySQL JDBC 连接超时问题

MySQL提供的JDBC驱动程序Connector/J在8小时之后会自动超时断开,这样会影响到连接池或是其它直接访问JDBC的程序(如JSP、Servlet等)。 有一种解决方法是在连接URL中设置autoReconnect参数,或是在连接池中处理connection的state。 第二种解决方案主要是依赖于SQLException中可以获得的SQLState,是在Java代码中捕获异常并在try-catch中尝试re-connect。MySQL实现中,"08S01"表示的是在处理query的时候遇到了网络连接问题,而40001表示的是遇到了死锁。 try { // ... } catch (SQLException sqlEx) { // // The two SQL states that are 'retry-able' are 08S01 // for a communications error, and 40001 for deadlock. // // Only retry if the error was due to a stale connection, // communications problem or deadlock // String sqlState = sqlEx.getSQLState(); if ("08S01".equals(sqlState) || "40001".equals(sqlState)) { retryCount--; } else { retryCount = 0; } } 参考资料: http://forums.mysql.com/read.php?39,112048,112146#msg-112146 http://dev.mysql.com/doc/refman/5.0/en/connector-j-usagenotes-troubleshooting.html#qandaitem-24-4-5-3-4 http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-pr...

Java Obfuscator

不做JavaME的Java程序员一般可能不会去对自己的class文件做混淆处理。做JavaME的大部分都知道Proguard、RetroGuard等用于obfuscate的工具。去年我的Ant Build Script中就已经添加了对于Proguard的支持,不过这次为了做WB2这个游戏,又有几个地方需要调整。 1) 类太多,足足有接近30个class file。 这对于ME程序而言,太多了。Proguard又不太争气,我只好找了以前做Flynn时候用过的JAX再压榨一下。JAX是IBM很早以前在alphaWork上发布的一个混淆器,后来被集成到了WSDD (Websphere Device Developer)中,作为SmartLink组件,就再也没法下到了。 我手头用的JAX版本6.3只能支持JDK1.2 -_-||| 没办法,尝试了诸多方法之后,勉强还是可以用。以下命令可以执行JAX以GUI方式启动: # java -classpath $JAX_HOME/jax63.zip com.ibm.jax.GUI 不过Ant集成的task最好还是在命令行里运行,简洁又清爽: # java -classpath $JAX_HOME/jax63.zip com.ibm.jax.Batch 后来有个朋友给了我一个私房版本,是用JDK5.0重新编译过的JAX,不用替换JVM就能运行,而且META-INF里面也制定了MainClass为Batch,真棒! 折腾了足足两个钟头之后,将JAX加入了ant build: <target name="merge" if="flag.should.jaxmerge" description="Try to merge some classes using JAX"> <java jar="${lib}/${jax.jar}" fork="true"> <arg value="lib/${jax.conf}" /> </java> <delete dir="${classes}"/> <mkdir dir="...

Python IDE List

今天收到的来自comp.lang.python的讨论列表中,又看到了一个家伙询问使用哪种IDE比较合适。在社区中,这种讨论无疑又会引发editor war... Anyway,这不是重点,刚好有位兄台给了一个list,列举了绝大多数可用的Python IDE,觉得比较全,就摘抄过来。 Name Platform Notes ActiveGrid Linux/Windows/Mac Full featured, free (Apache licensed) IDE bundled with wxPython, features projects, scintilla, and debugging Anjuta Unix + GNOME Cross-language IDE; syntax coloring & folding for Python. BlackAdder Windows/Linux Commercial with all the features of IDLE, support for Ruby, and Qt GUI editor. BoaConstructor Python + wxPython RAD GUI building IDE, similar to Delphi. Code Crusader Linux x86 Commercial IDE with support to 30 other languages. CodeForge Unix Commercial cross-language IDE; nice multi-user project manager. DrPython Python + wxPython Simple, clean editing environment for Python intended primarily for use in schools. Eclipse Java + SWT See EclipsePythonI...

JVM suspend Thread

KJava的JVM实现有很多,Motorola在早期的V系列和Tripple里面用的好像是差不多的,后来有一部分使用了Linux+Java的实现,SonyEricsson的JVM是自己的平台,而Nokia的S40和S60系列也都各自用了一套。 Sun的规范虽然说明了正常情况下JVM应当实现的API,以及事件处理的顺序,但是并没有规定JVM应当如何处理一些特殊的情况——例如,startApp和pauseApp。最典型的例子就是手机对于下列情况的处理: incoming call 来电,一般的手机都会在来电的时候调用Canvas的hideNotify()方法,并在来电结束后提示用户是否继续程序,如果是,则调用Canvas的showNotify()方法继续。在这种情况下,有的startApp和pauseApp()的调用不是每个机型都实现的,甚至有的手机连hideNotify()和showNotify()都不实现。 receiving a message 根据我的经验,绝大多数手机都不会暂停应用程序的执行,可能有铃声或是图标闪动之类的提示。 power-save mode 节能模式的一个特征就是:如果用户在一段时间内没有对手机进行操作,那么手机就会降低能耗——例如,关闭背景灯,或是关闭屏幕。有的手机在这种情况下也会让JVM挂起正在执行的线程。 今天遇到了一个bug,就是由于power-save mode引起的——Motorola的E680/A780在进入节能模式之后会将MIDlet的线程挂起,而一般的游戏程序都会在主线程的run()中计算tick所花费的时间(可以计算FPS或是帮助计时)。由于线程挂起之前计算了一个时间,线程恢复执行之后获得了另一个时间,二者之间的差值非常大,这种情况下,应当作为例外处理,而不能当作正常值。

Exadel Open Source

Eclipse一直是偶钟爱的Java IDE,EclipseMe是开发JavaME所使用的插件,虽然有一些瑕疵,但总的来说它还是很顺手的。在开发JavaEE的项目时,曾经一度使用MyEclipse,不过由于这个工具是需要购买license的,所以总觉得不是很合适。后来有人推荐了 Exadel 给我,用了几个版本,基本上扩展性还是不错的。如今这个IDE貌似被JBoss开源了—— Exadel and Red Hat are Partnering to Open Source Exadel Studio Pro as Red Hat Developer Studio .

电信的烂ADSL

最近网络一致不灵光,断线频繁。这也就算了,微软的Live Space居然也来凑热闹,总也无法登录进去,真是见鬼了。 跑到M$的windows live β官方页面看见一则《安民告示》,大意是说他们确信自己的服务器没有问题,问题发生在“某些网络”。的确,在公司用网通的时候一点问题都没有,晚上在家一上电信的烂ADSL就出事情了…… 闲时跑了两个命令看看next hop和dns的运转,贴出来留个记录: C:\>tracert www.sina.com.cn Tracing route to jupiter.sina.com.cn [61.172.201.194] over a maximum of 30 hops: 1 1 ms 1 ms 2 407 ms 745 ms * 218.1.60.217 3 535 ms 392 ms 361 ms 218.1.60.129 4 517 ms 314 ms 288 ms 218.1.2.61 5 495 ms 473 ms 407 ms 218.1.1.61 6 466 ms 411 ms 330 ms 218.1.1.134 7 327 ms 357 ms 305 ms 61.152.87.154 8 * 821 ms 683 ms 222.72.243.242 9 542 ms 434 ms 273 ms 61.172.201.194 Trace complete. C:\>nslookup gmail.google.com Server: ns-pxb.online.sh.cn Address: 202.96.209.6 Non-authoritative answer: Name: gmail.l.google.com Address: 72.14.223.107 Aliases: gmail.google.com

Beyond the Mario Maestro's Music

在Wired News看到一则新闻 " Behind the Mario Maestro's Music ",介绍的是传奇的视频游戏“玛丽兄弟”的音乐作者Koji Kondo。附YouTube上的一段 现场演奏视频 ,活泼的音乐不禁将我带回了少年时无忧无虑地打游戏的日子。最近还下载了Rome的第一季,恺撒、庞贝、屋大维…… 古罗马的故事总是令我神往~

在Fedora下自动挂载移动硬盘

(一)从Mount到fstab 最早使用Linux的时候,我遇 到的第一个难题就是如何将Windows下的硬盘分区挂载到Linux中。当时用的是mount。指定了文件系统 vfat,字符编码codepage=936等参数之后,mount一下就ok了。不过偶是个懒人,所以不情愿每次进入系统都输入一遍命令(不过必须承 认,对于当时还是个新手的偶而言,多用几次命令行还是很有好处的 ^_^ )。 Google之后了解到 /etc/fstab 文件的好处。Linux中/etc目录下的fstab文件是一个文件系统表 (File System Table file ),它维护着mount point条目。这些条目是根据HAL事件自动增添或是删除的──fstab文件不是指望靠用户手动修改的,有个程序 fstab-sync 可以自动修改fstab文件。当系统的HAL服务启动之后,上一次增加的所有条目都会被删除,而后根据需要,fstab-sync 会被调用若干次,加入合适的条目。 (二)fstab-sync和policy 了解到了这里,就要知道fstab-sync是如何知道应该增添什么条目的? # man fstab-sync 文 档说主要是参考storage.policy和volume.policy的属性。缺省的属性是存放在系统配置文件中的,在偶的Fedora 4系统中,放在 /usr/share/hal/fdi/policy/10osvendor/10-storage-policy.fdi里面。别心急修改──这个文件 是osvendor提供的,在升级的时候可能会被更新,正确的作法是在policy目录中放入单独的文件,例如,为了自动挂载移动硬盘,我新建了文件: /usr/share/hal/fdi/policy/95user.fdi。 以下是这个fdi文件的内容: <?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- --> <deviceinfo version="0.2">  <device>   <match key="@block.storage_device:storage.remo...

IT名人堂:Mark Zbikowski

熟悉Windows平台上EXE文件格式的人应该都记得在文件头有个'MZ'的标记,这个标记来自于这位兄台的名字首字母缩写。 This is Behind the Code’s pilot episode with Core File Services architect, Mark Zbikowski. Mark began his career at Microsoft in 1981, working on DOS 1.0 as a designer, coder and liaison with IBM. His quarter century long career has included significant involvement in OS/2, Cairo’s Object File System (OFS), and the NT File System (NTFS). In addition, he has been a key player in all of Microsoft’s File System work. Former Microsoft software architect Pat Helland interviews Mark about the early days at Microsoft, his passion for product development and the challenges of producing software.

关于 MIDP 和 WMA

SUN的官方网站上所列出的Java Verified机型中,几乎所有支持MIDP 2.0的移动设备都支持WMA API,也就是JSR 120或是JSR 205。但是这并不意味着所有MIDP 2.0的设备都支持WMA。因为MIDP 2.0(JSR 118)并没有明确要求必须同时支持JSR 120或是JSR 205。因此这二者的关系并不是依赖的,实际机型的支持要取决于特定的设备制造商(vendor)。 同样的,支持MIDP 1.0的设备也有可能支持WMA,像是Nokia 3300。 http://www.forum.nokia.com/devices/3100 以下是支持JSR 120的设备列表: http://www.j2mepolish.org/devices/devices-wmapi.html http://developers.sun.com/techtopics...st.do?apiId=42 虽然MIDP 2.0并没有明确强制设备实现WMA(JSR 120),但是Java Technologies for Wireless Industry (JSR 185),简称为JTWI,定义了设备必须实现的一系列组件。满足JTWI的设备必须在实现MIDP 2.0的同时也支持JSR 120。值得一提的是,JTWI的后继规范,简称MSA (JSR 248),试图消除Java实现的API分裂,它要求设备必须实现JSR 205。满足JTWI的设备一定支持WMA 1.1,WMA 2.0扩展了JSR 120并加入了对于MMS,即彩信的支持。因此支持WMA 2.0的手机也可以运行WMA 1.1编译的程序。 WMA 1.1 规范: JSR-120: The WMA 1.1 specification includes changes to take into account the MIDP 2.0 security framework and push architecture. JSR 205 : This JSR will extend and enhance the Wireless Messaging API (JSR-000120) Development Tools: The J2ME Wireless Toolkit 2.0 supports WMA 1.1, a...

心机

陪伴了偶四年多的手机坏了,上周末到美罗城精心挑选了半天,最后将Moto ROKR E2带回了家。四年前选择手机的时候,对于各式各样不同功能、型号的手机是完全没有概念的,更不用说广告里面一排一排的参数了。如今,由于从事的工作就是和手机打交道,而且公司里几乎有市面上所有百宝箱支持的Java手机,所以认知程度不可同日而语。连续2周,偶一直都在研究手机,打算把个人经验记录一下,于是就有了几篇小结。 标题取为“心机”,是因为移动的这个广告太寒…… 因此偶也乱写一记,当做饭后8g。 购买前的选择 这次选择机型时候,首先考虑了以下几个因素: (一)类别:智能机或是半智能机 不选择非智能机的原因在于工作需要,Nokia S40系列基本上性能都比较稳定,可惜缺乏扩展性。目前市场上最多的就是Symbian, Windows Mobile和Linux三个平台的智能手机。 Symbian,包括UIQ主要使用在Nokia S60系统和SE的中高端手机上,早期的Symbian系统是很不错的,稳定简洁,不过现在的Symbian为了支持各种各样的设备,提供越来越多的花哨功能,所以稳定性不够。 Windows Mobile的主要供货商则是多普达,以及Sharp和国内品牌的部分机型。Windows Mobile主要分为Smart Phone和Pocket PC两类,前者使用键盘操作而后者是触摸屏系列。目前市面上能见到的应该是Windows Mobile 5.0的机器,6.0的样机貌似只有内部机型,没有上市。和PC平台一样,手机的硬件配置都不错,可惜价格太高。 Linux基本上是Motorola主推,当然国内厂商也有自己研发的,不过那种质量就避而不谈了。Moto在2006年在中国连续发布了4款基于Linux操作系统的手机,像是“明”——A1200,ROKR E6等,都是触摸屏系列,惟独ROKR E2是非触屏的,深得我心。 :) (二)品牌:Nokia, Motorola和SonyEricsson 日韩的手机像是NEC和Samsung从一开始就不在候选之列,一小部分是因为排日情绪,使用感受不佳是重要原因。说实话,我不知道为啥那么多小姑娘“稀饭”三星的机子,使用习惯就不够人性化,而且大概自己对JVM部分的要求太高,感觉三星中低端的手机(如E108,E708等)在运行Java程序的时候效率是令我非常无语的,...

HTTP指令的简单解释

HTTP无疑是日常生活中使用最多的Internet协议之一。在企业级别的应用程序中,HTTP是当之无愧的最受程序员喜爱的通信协议。最近恰好在做几个简单的HTTP程序,为了更好的看清常见的GET/POST等指令是如何应用于实际通讯中的,截取了一段interaction log。 第一部分是HTTP Request,这里show的是GET method。 GET /polish/j2mepolish-2.0-beta3.jar HTTP/1.1 Host: download.berlios.de Accept: */* Referer: http://prdownload.berlios.de/polish/j2mepolish-2.0-beta3.jar User-Agent: Mozilla/4.0 (compatible; MSIE 5.00; Windows 98) Pragma: no-cache Cache-Control: no-cache Connection: close 第二部分是server的response。 HTTP/1.1 200 OK Date: Sat, 13 Jan 2007 06:57:28 GMT Server: Apache/2.0.54 (Linux/SUSE) X-Powered-By: PHP/4.4.0 Cache-Control: must-revalidate, post-check=0, pre-check=0 Content-Length: 21453320 Content-Transfer-Encoding: binary Content-Disposition: attachment; filename="j2mepolish-2.0-beta3.jar"; Connection: close Content-Type: application/x-download

懒人J的涂鸦后花园

懒人J在MSN Spaces上有一个 blog ,不过那仅是针对好友、同学开放的 ,大部分网志写的都是关于自己的生活,较少谈及技术。 如今有了这块小花园,可以让懒人J在闲时有个涂鸦之所。其实懒人J很早就申请过blogger的博客帐号,很可惜那时候经常遇到无法打开blogger的问题,因此没坚持多久就放弃了使用。如今发现Gmail帐号可以通用,而且还是新版本,很开心地再次注册了。希望可以经常在这里写一些技术的东西。 懒人J本来有希望做一个结构工程师,刚刚进入大学的时候学习了许多关于力学的知识,不过在第三年由于机缘巧合换了一个专业,慢慢地开始学习如何与计算机软件打交道,于是如今沦为一名programmer。 ^_^