在Android App里分享二进制文件

在Android App里想向别的程序分享二进制文件很简单,下面是段分享声音文件的例子。

 

Resolve an issue when launching Docker daemon

When I first tried to launch “docker -d” on Linut Mint 17, I got some errors.

To resolve it is easy, just use “root” to change the content of file of  “/sys/module/apparmor/parameters/enabled” from “Y” to “N”.

If path doesn’t have parent directory, File.getParent() will return null.

Found this behavior in a unit test case and in Java Doc, it’s described very clear.

String java.io.File.getParent()

Returns the pathname string of this abstract pathname’s parent, or null if this pathname does
not name a parent directory.
The parent of an abstract pathname consists of the pathname’s prefix, if any, and each
name in the pathname’s name sequence except for the last. If the name sequence is empty
then the pathname does not name a parent directory.

See following test cases,

Just pay attention on it!

 

 

How to extend p4eclipse plugin?

What’s p4eclipse?

Perforce provides is a very powerful and handy plugin for Eclipse – p4eclipse. With it, you can do everything in Eclipse enviornment, which is the same as in it p4 command line and p4v (a clicent of perforce).

Why to extend it?

Team also deployed ReviewBoard to do pre-check-in code review. And we have a command-line tool to post review request to it. The input is the id of perforce changelist.

Basically, we can see the changelist in Eclipse. The problem is how to combine them together and allow us to easily post the request from GUI directly.

2014-07-28_13-57-09

When you right-click on the changelist, you can see some actions in the context menu.

2014-07-28_14-02-55

Can we add another menu item into the context menu and post review request?

Ways to Extend p4eclipse

p4eclipse is also a Eclipse plugin and it follows the basic concept, such as extension, extension point, views and etc. It should be easily extended.

Find which view to extend

First, we need to find out the view class of P4 changelist. Simply move the mouse on view tab and click ATL+SHIFT+F1 to launch “Plug-in Selection Spy“. And the view name is PendingView, contained in plugin-in “com.perforce.team.ui” and the element in tree is P4PendingChangelist.

2014-07-28_14-08-36

Create plugin-in project

Now we know to extend which view. It’s time to create our own plugin-in project. And in the MANIFEST.MF, besides basic plugins, we need explicitly declare we need p4eclipse plugins,

  • com.perforce.team.ui
  • com.perforce.p4api
  • com.perfroce.team.core

2014-07-28_14-16-31

NOTE: Here is a bug of Eclipse PDE 3.x. Even we declare the com.perforce.team.ui is needed, but Eclipse can’t build through and there will be build errors. The root cause is com.perforce.team.ui is in a unpacking feature and PDE can’t revolve the dependency correctly in such case. To fix it, we have to download the jar file of com.perforce.team.ui to local and put it in to runtime class path manually. Remember, it’s only to fix PDE issue, we don’t need it in packaging.

2014-07-28_14-22-41

Add new menu item into the context menu

Open the MANIFEST.MF file and file the context menu extension declaration. It’s in org.eclipse.ui.popupMenus and the menu id is com.perforce.team.core.p4java.IP4PendingChangelist.

2014-07-28_14-26-35

Add new action into it,

2014-07-28_14-29-12

Next steps are easy

Now we finished the important part. If you are familiar with Eclipse RCP, you should understand next steps are easy. Basically, we need to launch a command line from Java code and implement an  action handler for the new created menu item. In my implementation, I also add a new preference page for team to setup the command location.

For details, please refer to my github project p4eclipse_ext.

Extened p4eclipse

After extension, the review request can be posted very easily, just like a build-in function of perforce. :lol:

 

不要放过SWT里的Resource Leak

最近出了几个奇怪的问题,打开时间的GUI会莫名的抛Exception,报“no more SWT handle”. 句柄(Handle)资源以前做Win32/MFC接触的比较多,转到Java/SWT之后就很少接触到。

出错原因很清楚,Resource不够了!SWT和Swing的实现方法不同,它还是使用了Native的资源,所以句柄资源不会被GC回收。Eclipse提供了一个叫Sleak的工具来检查Leak的情况。情况果然非常严重,主要原因是我们生成了大量的Image。不仅仅是Image,在使用Font,Color,GC的时候也要非常注意,遵循“谁生成谁销毁”的原因。

在RCP中加入Sleak的方法是–Application.java的start方法中加入:

之后,Sleak的界面会随着RCP启动。

Reference

Eclipse必必装插件之Mylyn

以前早听过Mylyn的大名,但因为公司没有配套的软件,一直无缘尝试体验。前段时间,公司把Perforce,JIRA都做了升级,让我终于可以一睹Mylyn的真容。当真是极好的!必装,必装,必装装啊!

Mylyn的好处真不是一句两句可以说清的,它可以和各种开发辅助软件相连,如代码仓库(Perforce,SVN等),代码Review工具(如Gerrit, ReviewBoard等),持续集成工具(如Hudson/Jenkins),问题追踪工具(如JIRA,Bugzilla)。比如你在Eclipse里可以查看/更新JIRA Ticket的状态;直接在Eclipse里Review别人的Code Change并Comment;在Eclipse里查看Jenkins的出错报告并重新集成一下。

我这里只想说说它的另一大好处——Task-focused的IDE工作环境。

先设想一下没有Mylyn的工作环境…

昨天打算要某JIRA Bug,突然QA又发了两个严重的Bug,都急着要修,昨天跟了很晚,没什么头绪。今天看着Eclipse,打开了50+ Java Editor,有意无意地迁出了30个P4上的文件,都在Default ChangeList里。简直一团糟!Java Editor不知该不该关,忘了打开Editor的原因,P4上迁出的文件一会还要分到不同的Checklist里。啊,简直要崩溃了!

也许你要说工作应该更有条理一些。可程序员都知道,活儿真多的时候,没人慢条丝理的在各种工具之间换来换去,至少我不会。:)

当我们有了Mylyn…

有什么工具来帮你把繁乱的工作变得条理清楚吗?Mylyn可以!它可以帮你把不同的工作分类管理好,让你方便的在不同任务间切换,而你只需要记得轻点几下。下面简要说说。

和JIRA连起来

选择JIRA的Connector,

2014-06-24_13-41-39

设置JIRA的登录账户(注意,JIRA服务器的Remote API要先Enable,不然没有办法连接上。)

2014-06-24_13-39-56

连接之后,要做一个所谓Query,其实就是在JIRA里寻找关注的Ticket,可以直接选择某个JIRA里的Filter,Connector也提供一些简单的Filter,比如“Assigned to me”.

2014-06-24_13-43-03

设置完成Query之后,就可以得到一个Task的列表。

2014-06-24_14-08-04

Make your environment Task-Focused

让整个Eclipse IDE进入Task-Focused状态非常容易,选中某个Task,在Context Menu里选择”Activate“。

2014-06-24_14-09-11

随后整个IDE就围绕这个Task进行调整。

  • 对于没有历史的Task,Eclipse Editor Area会被清空;对之前Activated过的Task,打开过的文件会被Restore在Editor Area中。新打开的文件也会加到Task的环境中。
  • Perforce Eclipse Plugin会把当前Task的Pending ChangeList设为Active ChangeList。如果之前Task没有Changelist,Perforce会新建一个。新的迁出都会放到Active CL里By Default。
  • 此外,所有有”Focus on Activated Task”图标的View,都会调整各自的内容,只把浏览过的文件/方法放到View中。2014-06-24_15-02-31包括Package Explorer,Outline,Task,Problems,新的Mylyn还支持Breakpoint等等。

退出Task-Focused状态,只需简单的Deactivate Task即可。切换到另一Task,只需Activate另一个Task即可,同时只能有一个被激活的Task。

总结

有了Mylyn这个好伙伴,开发人员可以轻松在多的Task之间切换,为不同Task打开不同文件,浏览不同的方法/函数都会被Mylyn很好的维护和重建,工作会更加有条理,效率也会大大提高。

我已经离不开它了! :grin:

使用nexus unzip repository plugin实现Eclipse p2代码仓库

使用RCP的同学们应该都知道,p2仓库管理软件包的Layout和maven自身的不同的。当使用Export Product时, 就可以看到repository文件夹里,软件包的放置是完全不同的。

Sonatype Nexus OSS可以部署p2的proxy repository, 但不能部署host repository (当然可以出银子买Professional版). 如何在OSS版里实现呢?大家可以通过unzip repository plugin来实现。

原理

unzip repository plugin的工作原理就是:

  • 指定某个Host Repository做为目标仓库
  • 解压Host仓库里的Zip文件,形成可以访问的且保留了原压缩包中文件夹结构的Virtual仓库

利用这个功能,就间接的做出p2的仓库,主要步骤:

  • 含有p2 layout的仓库做成zip
  • 上传或安装到某Host Repository
  • 设置Virtual Repository并指向Host Repository

Plugin安装

点这下载unzip repository plugin bundle file. 解压到Nexus的Plugin文件夹中,重启Nexus Server。

 配置Virtual Repository

以Eclipse Nebula 1.0为例,配置Virtual Repository。

2014-04-17_20-55-38

Eclipse Nebula Project提供了很多SWT的高级控件,很好的补充了原有的控件集。但它自身的Repository一直处于Snapshot状态,所以经常变动,很容易把持续集成搞挂。我们就遇到了两次。

有了Unzip virtual repository,这个情况就可以改变了。先下载Nebula 1.0的zip包,上传至一个Host Repo里。

2014-04-18_11-56-01

 

再新建一个Virtual Repository,Provider选择为“Unzip Repository Template”.

2014-04-17_21-34-01

2014-04-17_21-34-31

再去查看Virtual Repo,就可以看到Zip文件被解开成p2 layout的文件夹了。

2014-04-18_12-20-51

使用Virtual Repository

在Target Platform中使用我们定义的Virtual Repository,和普通的p2 repository一样。

2014-04-18_12-23-43

总结

unzip repository plugin很大程度上提高了Nexus的灵活性,不单单只是支持Maven的layout,还可以支持p2或其他layout. 我们的项目也可以向Nexus提交Eclipse RCP的代码仓库。

好东西,与大伙分享!

这次是要关掉不需要的DB Statement!

在操作SQLite Memory database时,遇到了奇怪的Exception – “[SQLITE_LOCKED] A table in database is locked (database table is locked)”. 检查之后才发现,原来是因为某些Statement在使用完成后,没有被关闭。这样导致Table锁住,后续的操作无法进行。

所以,Statement在使用完成后,一定要在finally里关闭,下面是段标准代码(异常处理的部分略)。

写代码真要一丝不苟啊!

 

记得及时关闭不用的Stream

紧张的Release阶段中又来了个棘手的Ticket,出错信息是文件存在,但打不开了,单个Process能用的File Descriptor已经到了默认的最大值(1024)。我们可以简单的通过ulimit修改FD限制,增大上限。可Java-based GUI进程并没有打开这么多文件,问题在哪呢?

lsof观察发现,GUI进程打开发很多PIPE的类型的FD,原来是大量的stdin, stdoutstderr没有关闭。在程序里,GUI会用Runtime.getRuntime().exec()调用一些后台的Utility程序,完成一些工作,每exec()一下就会占用3个PIPE的FD。当外部程序结束时,这些FD也不会被自动关闭。如果GUI进行久一些,FD的上限就可以超过。

改正的方法也很直接–及时的关闭这些不用的Stream,用common.io中的IOUtils关闭这些Steam。

把这个函数写在某个finally block里吧。

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