别忘了在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类。

 

编译

一切就是这么简单!

Google Guava之BiMap

今天介绍一个BiMap的小例子。

 

Google Guava之Ordering

Guava提供的Ordering比Comparator强大很多,使用起来非常灵活。下面是个小例子。

 

 

小试HTML SVG

因为D3js,最近学习了一下HTML SVG(Scalable Vector Graphics),这里有几个小例子。

老生常谈:绝不要拷贝代码!!

首先要说一句老话,拷贝是万恶之源,是最差实践之首。

前段时间,组里有个同事实现某个新功能,其实挺简单的,前后大约做了两周。最后在Code Review的时候,发现有很多没调用到的方法和变量,代码逻辑很奇怪,然后发现代码是从另一处Copy过来的,只是稍作加工。再然后,我就让另一名工程师加入一起清理代码,又花了4天才把逻辑理清楚。清理之后的代码比之前少了60~70%,更易于维护。这一切都是Copy Code惹的祸。

为什么拷贝代码?

省工夫省时间?

Copy/Paste, so fast! 这是非常非常短视的想法,甚至有时连短期的工夫和时间都没有节省到。因为老代码里有大量逻辑,不一定拷贝过去可以直接使用。这时必然Bug漫天飞,怎么能过的了QA那关。长远看就更加不可取,无数血泪的经验,大量重复代码是项目的灾难,不可能有好的设计,后期维护的工程师会叫苦连天,工期不断延后,质量只能是垃圾,不要期盼有什么保证。垃圾的代码也留不住好的程序员,学不到任何东西,他们的青春为什么拿来给别人擦屁股。

时间和工夫有时不能省的,要耐着性子看老代码里的逻辑,”慢就是快“。

”某种项目需要“!

还有另一种可能-项目需要!一些稍大的公司或组织会同时进行几个项目,新的项目可能会在老项目的代码上扩展。为了节省工期,有些Team就直接把老项目的代码在新项目的Branch上拷贝一份。开始一切很祥和,可新老项目同时继续,同时在修Bug,加Feature。时间长了,就有可能在不同的代码Branch做Merge,也是要花大量的时间和精力。究其根源有很多,可能真是工期紧,可能是老代码的设计太差。

我觉得设计的问题大一些。这不是理想的做法,应该把需要依赖的代码做提取,对于不同行为做抽象,再以注入等方式改变所依赖代码的行为。

如何避免代码里的Duplication?

  • 做为工程师应该了解,Code不单是为别人写的,也是给未来的自己写的。不想六个月之后砸键盘吧!时刻牢记”Duplication is evil!”
  • 做好培训,尤其是新手。大多新手带着从学校实验室的“恶习”(想想那些教授老板也被坑的不轻,还不自知),入职后老员工的”传帮带“很重要。
  • 鼓励做代码重构,罗马不是一天建成的,代码也不是一天就能变好。
  • 制定Team里的Coding Guideline,加强Code Review。大家都知道”破窗理论“,有规则才能遵守,不然只能越来越糟。
  • 组织里要有分享代码的意识,多做独立于产品的可复用的代码模块。假以时日就可形成客观的代码“资产”,大大加速日后的开发和团队效率。
  • 使用SonarQube实时掌握重复代码的情况。SonarQube是个非常强大的工具,帮助团队实时的监控代码质量的变化,Duplication就是其中的一个维度。

5-22-2015 5-37-39 PM总结

不要拷贝代码。That’s it!

 

没事写写博客,没事拍拍照片。。。

HTML Snippets Powered By : XYZScripts.com