Convert exception stack trace into String

If you have a log system, such as slf4j or log4j, sometimes you want to print the exception’s stack trace into log system (a file, a console or something else). Default behavior of e.printStackTrace() is to print the stack trace into stdout.

The easiest way is to convert the stack trace into string then call logger.debug() to print it into log system.

How to do it? Here is a simple solution to it.

This sample also show you the flexability of OutputStream.

想起了Domain-Driven Design…

前两天在做项目时,和同事在一个Service类的命名上争执起来。他们想取个比较general的,我则想起个更有意义的,然后就想起来了domain-driven design里的一起典型的Service,如Factory, Repository等。

领域驱动设计

在接触DDD之前,我有很多困惑。在学习了Eric Evans的领域驱动开发之后,我奉它为银弹。开发像我们公司这种有复杂业务逻辑软件,DDD就是解决之道。这几年的工作中,虽然不是100%的用DDD中的实践方法,但也吸收了很多精髓,如:

  • 加强开发人员与业务人员的沟通,注意业务知识的积累,统一语言
  • 软件分层设计,各有职责(目前这个做的最好, 🙂 )
  • 模型的持续精化,与时俱进
  • DDD有一些设计的最佳实践,如Service,Entity,Value Object,真的很好很强大。

当然,开发中还是有别的问题,主要还是提升产品的质量和降低维护的成本。想做的就是把”活文档“引入进来,加强自动化的测试。

最后分享一下我当时做的PPT。

第一个自定义SWT控件 – Advanced Navigator Bar

新项目已经开始,GUI上的改变还是一如既往的大,多,快!做GUI的真苦逼!

因为产品中有某种流程的概念,Boss需要一种能显示流程顺序且兼有Navigator功能的Bar。它在界面底部,用户可以用来做页面跳转。

Eclipse RCP使用SWT作为其图形库。在一顿乱Google之后,没有发现有现成的控件,所以只能自己做一个了。其实不是很想做,但作为一名GUI工程师,也不能总用标准控件吧。其实做控件并不难,以前在用wxWidgets,也做过几个控件,其实要点就几步,主要是费时调试。想想那会为了个控件调到凌晨4、5点,心里就觉得酸,:(。但这几个我费心做出的控件一直在产品中使用,算是一种安慰吧!

在Eclipse Corner Article里,找了篇文章(在Reference里),感觉和wxWidgets差不多。毕竟还是一个简单控件,试了一下,成功了, 同时感慨SWT有很多牛X的功能,远不是wxWidgets可以比的。

归纳几个要点。

控件重载

做自定义控件的第一步就是重载。SWT有两个比较适用的父类,

  • org.eclipse.swt.widgets.Canvas
  • org.eclipse.swt.widgets.Composite

Composite主要用来把其他控件compose在一起;Canvas则在给你提供一个画布,所有的显示行为都自己定义。这里显然Canvas更适合我。

计算大小

Parent控件或container在使用你的控件时,并不知道你的控件应该有多大。所以我们要提供Preferred Size。

在SWT中,你要重载compusiteSize(int wHint, int hHint, boolean changed). 这部分要根据控件中不同的内容来定,如图的大小,字符串的显示大小,它们怎么组织的。花点时间总是可以写出来的。

提一点,在这个函数中,你可能需要算字符串的长宽,所以你需要GC,所以你可以new一个然后用stringExtend计算大小。

重绘

有了大小了,下面就要告诉别人怎样把自己画出来。SWT里的办法是增加一个PaintListener.

在paintControl函数里,你就尽情地在GC上画吧。

事件响应

显示出来之后,和用户的交互也很重要。这里就要增加键盘和鼠标的事件。我的控件比较简单,只有鼠标事件。处理过程就是

  1. 响应鼠标事件
  2. 做点击测试
  3. 转换事件
  4. 找事件监听器处理

首先响应鼠标事件,

点击测试就是找出鼠标事件发生在哪个区域,里面会有一些Rectangle.contains()等类似的函数。有兴趣请在后面的Github上看看我的代码。

事件转换就是当你识别出事件后,把原来的鼠标事件做一个翻译包装,然后转发。比如在我的控件里,我要识别用户点在哪个Flow的节点上,所以我包装了一个节点变化的事件。

再做一个监听器给外部代码,某种简单的Observer的模式。

在控件里添加add/remove的接口,

其他要点

这几步就是最重要的。还有一些小的要点,

  • SWT中要注意把Color,Font等资源回收(dispose)
  • SWT可以用gc.setAntialias(SWT.ON)打开抗锯齿
  • 为了避免控件闪烁(flickering),特别是在频繁Resize里,可以在构造控件里加上SWT.DOUBLE_BUFFERED的style。

后两项都是wxWidgets无法比的,需要比较复杂的实现。

Github

代码还在准备中,很快上传。。。

References

《Lean from the Trenches》读后

这书是腾讯组织的某次敏捷交流会上组织者准备的小奖品。我因此发现在它。最能吸引我的是“精益”,“看板”,“大型项目”几个词。在工作中引入Agile这几年,我其实一直都疑惑不断,有对方法的,对过程的,对人的,对现状的。现在也很清楚Agile在公司不能真正发挥威力的症结在哪,只是真的很难破除。也没关系,有些东西自己说得也不算,就把自己能做的控制好,开发中不足的地方好好改进一下。

说说书吧。其实英文书名才能真正的表达书中的内容,“来自战壕里的Lean”。作者正是把自己在一个项目的心得与实践分享给了大家,告诉我们在遇到问题时他们如何做的,原因是什么,结果怎么样。这也是很讲Agile书的一个特点,没有很多理论,大家都在讲实践。Agile Development本来就是讲究实践,形式只是浮云,很像武当太极。学到了几招,如“不去估计故事点,只计故事数”,如“技术故事如何处理”,如“大项目的多个团队如何汇总消息”还有“如何使用因果图”。

关于精益。在考PMP的时候学过,源与Toyota。在软件领域,精益开发的很多实践也有很多可取的地方。书中的总结是“全局优化”,“消灭浪费”,“品质当先”,“不断学习”,“尽快交付”,”人人参与”以及“不断提高”。很多提法也不陌生了。

方法再好,实践再棒,还是要靠我们自己去践行!人才是最重要的!