别忘了在RCP App中配置自己的Keybinding Scheme!

在Eclipse RCP的基础上开发,我们会感到非常便利,有好多可重用的组件。但有时也有些意想不到的问题,  Key bindings就是其中之一。

一般情况下,我们通过扩展org.eclipse.ui.bindings来增加新的快捷键绑定。下面的例子中,我设置了一个CTRL+T的快捷键。

6-15-2015 2-25-23 PM

6-15-2015 2-25-47 PM

乍看上去,编译使用都能够做良好,问题出在schemeId上。org.eclipse.ui.defaultAcceleratorConfiguration是默认的scheme, 它里面其实包含了大量的快捷键设定,很多可能是你不要的,比如CTRL+F(查找与替换),CTRL+N(新建Wizard)等等。如果发布到产品中,反而画蛇添足。

修正这个问题很容易,就是设置自己的scheme。下面是个例子,

6-15-2015 2-32-59 PM

6-15-2015 2-33-09 PM

别忘要同时修改一下,Key的设定,

6-15-2015 2-34-25 PM

还有如果要让自定义的scheme能生效,要修改一下plugin_customization.ini文件,加入如下配置,

这样,你的Scheme就会生效了。

可能你回问,如果想重用如CTRL+S的快捷键怎么办?那就重用File Save的commandId,如下,

6-15-2015 2-40-14 PM

6-15-2015 2-39-30 PM

这样问题就解决了。

拿块自制CR2032L/DBE电池拯救你,我的Dell E6500!

正常工作六年之后,昨天我的Dell E6500终于挂了。无法开机,出现“Time of day clock stopped”错误,Google之后发现时BIOS的电池要换了。

拆机,找到电池,一块抱着蓝色的绝缘皮,上面的Label是“CR2032L/DBE …”,就是这货,我那块14年就过期了。

CR2032L/DBE

如果网上买,新的要$5.73, 还没加运费和税。贵啊!

家里还有几块CR2032纽扣电池,会不会就是普通的CR2032穿了个马甲(绝缘皮),再加两条引线?拆开看看!果然,核心就是普通的松下CR2032和引线。

然后我用绝缘胶布包上一块CR2032,有了这货,

IMG_20150611_211459

IMG_20150611_211511

装上之后,DELL E6500之后就又杠杠的了!

制作本地Eclipse Release P2 Repository

因为某些原因,公司的Build Server都不能访问外网了,所以不能直接从Eclipse的公共服务器上下载开发包。以前Eclipse提供所谓All-in-One package,可现在没有了。还有更方便的做法,可以下载Eclipse的所有Pacakge,生成本地的P2 Repository。

Repository包含metadata和artifact,要分别下载,但可以下载到同一个文件下。

程序运行后,没有UI,只在后台下载。耐心等待下载完成后,程序自动退出,所有的包就在destination里了。如果需要,可以传到Sonatype Nexus做成Virtual Repository (详见在Nexus OSS上建Eclipse p2 repository)。

NOTE

  • 完整的Repository非常大,下载的过程很长,一次下载不完可以分多次下载,重新键入命令即可,下载完成的包都很跳过的。
  • 下载artifact时,会有一个.blobstore文件夹,不要以为它是个临时文件夹,它也是Repository的一部分。

Reference

正则表达式的动态替换

Java中的String类提供了replaceAll和replaceFirst方法,用来识别符合正则表达式的substring,并全局替换和只替换第一个substring。

但有时情况会更复杂一些。比如转换input string中所有的floating number的单位,从厘米转换为米。这时,之前的函数就帮不上忙了,我们要使用Java Regex其他类的更强大功能。

看看下面的例子。

下面是Test cases。

 

Google Guava之Immutable Collection

Guava提供了很多Immutable Collection, 包括Set,Map,List等,使用起来简单方便,看看下面的例子。

 

Maven搭配Ant,使构建过程更灵活

Maven使构建变得规范、简便,但在某些时候还是感觉Ant更容易控制,把两者结合起来使构建变得更加灵活。Maven所定义的构建模型,再加上一些Plugin的帮助,让我们每容易的实现两者的结合。下面看个例子。

一个例子

项目中遇到这样一个问题,程序要检查某种License,License的版本号在另外的配置文件中定义。基于安全考虑,最好把版本号在编译期就写到某个常量中,而不在运行期读取某配置文件。假设我们要把版本号写入到某个enum类型的常量里,之前我们可以准备它模块文件。所以基本的构建流程如下:

  • 准备源文件
    • 读取License版本号
    • 读取Java模版文件
    • 版本号替换
    • 生成Java源文件包含最新的版本号
  • 编译源文件
  • 测试
  • 打包

实现

先看如下的代码目录结构(所用代码都在Github上)。

Selection_003

  • ant_replace_license_version.xml是Maven将要调用的Ant脚本
  • ant-contrib-1.0b3.jar包含了很多ant的扩展,有很多非常Powerful的工具。在这个例子中我会使用loadfile, propertyregex等功能。
  • License.template是License.java的模板文件
  • pom.xml是maven脚本
  • version.h是一个C/C++的头文件,里面定义了VERSION

构建过程就是要把version.h里版本号取出,替换模板文件里的占位符,然后生成真正的License类,并放到包com.innoli.sample中,由App调用。

具体文件内容

version.h

License.template

ant_replace_license_version.xml

使用了ant-contrib的扩展,完成了读取、查找、替换、生成新的类文件等工作。

pom.xml

使用了exec-maven-plugin来调用ant脚本,也可以使用Apache Maven AntRun Plugin, 但它MS使用了很旧的ant。在process-resources阶段,生成License类。

 

编译

一切就是这么简单!