2012年2月21日星期二

Linux:如何在Eclipse中使用post build

 

以前写过“自动将Visual Studio编译生成的dll和lib文件放置到不同的路径中”这篇文章(其实就是使用了Visual Studio的post build),今天我想简单介绍一下如何在Linux下在Eclipse中使用post build的方法。

首先如下图所示,设置post build。

eclipse_post_build_configurations_1

eclipse_post_build_configurations_2

在post build 中我们使用script,以下是我使用的Bash script 例子:

#!/bin/bash

# copy the exe file, if exists
# find $1 -name '*.exe'

YOUR_BIN_PATH=$YOUR_BIN_PATH
YOUR_LIB_PATH=$YOUR_LIB_PATH

# Get the file extension to decide the target folder to copy.
file_ext=${filename##*.}

filename=$1

# Based on the file extension, we copy the file to different the target folder.
if [ $file_ext = "so" ]
then
    echo "Copying dynamic library file $contain_so"
    cp -v $filename $YOUR_LIB_PATH
elif [ $file_ext = "a" ]
then
    echo "Copying static library file $contain_sa"
    cp -v $filename $YOUR_LIB_PATH
else
    echo "Copying executable file $1"
    cp -v $filename $YOUR_BIN_PATH
fi

 

延伸阅读:

1. 如何编写bash script:http://linuxconfig.org/Bash_scripting_Tutorial

2. 也许你还有兴趣知道,如何设置Eclipse的Debug configurations中的Environment,如下图所示:

eclipse_debug_configurations

2012年2月14日星期二

图像Preprocessing使用FPGA, CPU, GPU

很久没有写“数字图像处理”系列的文章,今天非常简单的介绍一下Preprocessing使用FPGA, CPU, GPU的效能。

几乎所有的标准的Preprocessing函数都可以归入以下5个主要的类别中:

  • Pixel operations: (in)homogeneous
  • Histogram or LUT based functions
  • Neighbor operations
  • Random access operations
  • Geometrical transformations

Performance(效能)是我们这里所关心的,不同的architectures(架构)适用于不同的operations(运算),例如下表所示:

Operation CPU GPU FPGA
Pixel + ++ ++
Histogram / LUT ++ - ++
Neighbor / Kernel - ++ ++
Random Access ++ - -
Geometrical Transformations + ++ -
Architecture SISD SIMD SIMD MISD

2012年1月16日星期一

一月中旬的小结

看这篇文章题目就像小学生作文。最近很忙,我的一些博文系列文章例如“电子工程师乱谈编程”,只能暂时停一阵子。但仍希望能坚持每隔一段时间写一个简单的小结。

我住的这个小城今年的冬天到现在居然只下了两场小雪。今天竟还是艳阳高照,零上2度。偷懒一下,窝在家里今天不去上班,其实也是因为想在家里专心把一篇拖了2个多星期的论文写完,希望这篇论文能被6月份的在澳大利亚的我现在研究这个领域一个顶级学术会议上被接受,其实到现在我也发过了几篇文章,但是都是二流的会议,顶级会议还没有试过,祝自己好运吧。

最近学了很多东西,什么PHP,JavaScript,Ajax,WPF,Silverlight,杂杂的乱学了一大堆,其实就是看看网上的教程,结合最简单的head first系列教材,简单入门学了一下,然后自己做搭个简单的网站和抄抄改改做一些小程序。

上个星期的大事就是和同事报名的一个比赛,写了一个4页纸的计划书,注册了两个网址。

上个星期还完成了一个项目的简单收尾工作,进行了一些测试,加了几个小特性,但还没完全完成。人们常说“读书百遍,其义自见”,我认为“读代码百遍,也是其义自见”,为了完成这个项目,我必须在一个师兄的两个项目上拓展,我大概把他的代码读了百遍吧,然后才彻底地理解了这两个项目的架构和所有细节还有使用的技术。

上周末还帮助一个在机械系读博的朋友写了一个小程序,突然很深切的体会到,其实很多东西都可以做到非常好的跨学科,例如计算机科学的一些新的算法,概念,可以延伸并使用在机械科学领域,电子科学领域上,然后会产生一些新的突破,看来做研究还是视野要广一些。

2011年12月31日星期六

2011简单小结

非常简单地小结一下我的2011。
根据豆瓣上的记录2011年读了134本书,看了103部电影。

books_read_2011_chartmovies_saw_chart

生活:
2011游玩的机会比较少,只去了两次荷兰购物,有时在北威州逛逛,去了一次黑森州。
4月份复活节假期到瑞士玩了4天。
5月份回国办了结婚酒席。
10月份开始学车,但是进度很慢,没有太多时间去上课。
11月份第一次和同事到一个旅游区参加3天Workshop。


学习工作:
读博开始比较进入状态,但是只发表了两篇文章。
我也开始给别人上课,带了几次练习课。
参与了两个项目,并主持完成了一个项目的第一和第二阶段。
获得了一个校内的博士生的创新奖。


事业:
有一个计划在有条不紊的进行,在2012年初就应该实现第一步,这也许是2011年最大收获。


2011的新年假期,大多数时间都窝在家里,学习WPF,Prism (学习使用Microsoft Ribbon for WPF,MVVM Model View ViewModel)。
最后祝大家2011新年快乐。

2011年11月27日星期日

闲谈2011年11月情况

a.不上班的日子
因为德国糟糕的天气,生病了,11月17日,18日在家呆了两天。连续看了两个医生,最近一年来,每个季度好像都要生病一次,每个季度都要交一次10欧元所谓的挂号费,并使用一下医疗保险。看来还是要多锻炼身体才是。因为生病了,昏昏沉沉的,没法编程。很少超过两天没有编程,我居然会想念编程,常常在思考一些编程问题。仔细一想,其实并不完全是因为我对编程有爱,也有可能因为写程序时自我重要感也就得到了满足,并且总是认为自己在参与的项目中是个不可替代的人物,得到同事的需要,感受到这一点的时候,那种幸福感是无与伦比的。不编程的日子,日子也过的很快,读读别人的博客,看看网上有趣的视频,玩玩实况2012,然后选顶级对手,被电脑虐几次,做做饭,一天就过去了。

b.第一次参加workshop
第一次参加我们组的workshop,我们组的workshop还挺有趣的,所有同事和教授都一起到一个度假酒店(这个酒店离我们大学也就2小时车程)住3天,也就是这个月23号到25号,然后进行汇报总结,还有分组讨论,每天3餐都是自助餐,在讨论的时候还提供各种点心,感觉就是一直在吃东西,还好一般来说我们的workshop只有3天不然会把人搞的胖死。

c.第一次参加展小型的科技览会的比赛
24日,我和一个同事还专门从我们workshop的酒店,开车回到我们大学参加一个小型的科技览会,参展的都是我们大学的博士生,当天比赛参展完成后,又开回我们的度假酒店。值得开心的是,我们参加比赛的项目获得了"跨学科的创新奖",并共同获得了1000欧元的奖金,这是对我们的努力极大的肯定,而且在展会上很多人都对我们的产品和想法有很正面的评价。现在我对我们的产品在明年的面市更有信心了。下个星期开始进行我们项目专利注册的事情。


附加:
刚刚,随便翻了下以前看过的书,发现有些有趣有用的观点,这里做一个摘抄:
帕金森法则(Parkinson's Law)[1]:任务的重要性和复杂度与所分配的完成任务的时间密切相关。(Work expands so as to fill the time available for its completion.)   
帕金森法则告诉我们一个道理,我们其实可以减少工作时间来做最重要的事情。这就是不断迫近的最终时限的魔力。如果给你24小时去完成一项任务,时间的压力促使你集中精力去执行,别无选择只能做最重要的部分。同样的任务,如果给你1周去完成,它就换来了小题大作的6天。如果给你2个月的时间,但愿不要这样,它就变成了一场精神磨难。因为精力更高度集中,短时限内做出的最终产品通常不比长时限内做出来的差,甚至质量更高。[2]

30岁是一个关键点。一个人是作为通才走上企业的经营管理者或者创业家的道路,还是走上企业内部专家的道路,必须在这个时候做出决断。而且在35岁的时候,还没有展现出通才能力的人,就应该不要有任何的犹豫,选择一个专业领域,并且拿出不输给任何人的决心走上成为专家的道路。[3]


引用:
[1] http://en.wikipedia.org/wiki/Parkinson's_law
[2] 《告别朝九晚五:每周工作4小时》
[3] 大前研一《知性力II》

2011年11月14日星期一

我们的XX项目使用的系统架构

上上个星期五,我们的大头和我们三个核心开发人员开了一个下午的会。决定11月24日,参加一个展览会,推荐我们的产品,也是算是一次了解我们的产品的市场反应的机会。但是这个产品的具体介绍(其实是一个专业软件,加上辅助的硬件系统),我将在正式上市的时候进行详细的说明,可能会在明年的2月份,这个项目的软件部分这里我就暂且称之为XX项目。

这个XX项目已经进行了一年,我从开始就参与开发,作为软件核心开发人员,看到即将上市,感到特别的兴奋,而且有些成就感,特别是这个软件的用户界面还是我一点一滴设计的,和很多程序员不同,我认为设计一个漂亮的GUI是非常有趣的事。

进入正题,今天谈谈这个XX项目系统架构。

开发这个软件我们采取的很多对我们来说比较新的开发方式和架构,我们采用模块化开发,模块设计,所有的模块都通过我们特别设计的类似Service Interface方式导出其数据与功能,所有的模块的接口通过特定的方式进行开放。这些模块都有自己想对应的测试模块,对其进行自动化测试,使用的统一的架构。这些模块我们不仅使用在我这里所提到的XX项目,而且还使用到我参与开发的几个项目,有的是运行在服务器上,有的则是在单机上运行的。

我们使用的架构类似下面所示,XX_GUI模块是用户界面模块。XX_APP(应用程序)获取各种模块的“服务”,这里类似中间层。XX_GUI(用户界面)通过我们特殊定义的event和XX_APP(应用程序)进行通信,目前我们的XX_GUI(用户界面)是使用Qt进行编写的基于单机,但是XX_GUI(用户界面)可以简单的通过替换改变成为Web-based user interfaces(WUI),例如使用Java,AJAX进行开发,如果使用Web-based user interfaces(WUI),并通过各种Web服务协议进行数据和事件通信,XX_APP(应用程序)进行简单的改造就可以放置在服务器上。


XX_GUI
  ^
  | 通过event进行通信 
  |   
XX_APP (应用程序)
  ^
  | 通过统一模块注册机制进行调用
  |
各种模块

 

XX_WEB_GUI
  ^
  | 通过网络进行通信 
  |   
XX_APP (应用程序)
  ^
  | 通过统一模块注册机制进行调用
  |
各种模块

 

进一步延伸,因为各种模块组合产生的XX_APP(应用程序)可以在服务器上运行,我们的XX_APP(应用程序)适用于类似很多大型平台采用的Service-Oriented Architecture(例如亚马逊),可将XX_APP(应用程序)功能作为服务发送给用户。通过统一Service注册机制进行调用多个不同的XX_APP(应用程序),组成一个复杂的网络服务。例如下面所示。这就因为使用同一Service注册机制这就大大提高服务的复用性。这就是在应用程序层级上提高复用性。

                         特定的服务
  ^                                                                        ^
  | 通过统一Service注册机制进行调用 |
  |                                                                          |  
XX_APP_1 (应用程序)    ... ...       XX_APP_n (应用程序)
  ^                                                                        ^
  |  通过统一模块注册机制进行调用         |
  |                                                                          |
各种模块                                           各种模块

 

最后总结一下,复用性一直是我对设计上思考的要点,简单来说:
我们的模块依赖于我们开发的类库,这就是在类层级上的复用
我们的应用程序依赖于我们开发各种模块,这就是在模块的层级上的复用
我们的服务依赖于我们开发各种应用程序,这就是在应用程序的层级上的复用


接下来的时间,为了准备这个展览会,除了设计一个产品演示,准备展位的广告,就是要好好再练一练德语了,突然发现自己的那点德语水平做一个好的产品演示推介非常吃力。

2011年10月17日星期一

闲谈最近的情况

居然超过一个月没有更新博客,接下来会常常更新的Smile。因为最近在忙着完成一个项目的一个里程碑的收尾工作,这个项目共分为3个里程碑,也就是分三个阶段完成,我们现在刚刚完成第一个里程碑,在我们的Time Schedule上应该是在今年三月底就应该完成这个里程碑。因为遇到技术性难题和人员调动还有测试的原因,我们居然拖延了半年,所以说软件工程常常会把人拖入泥沼,最后我发现这个项目的核心开发人员,也就是我和另一个同事写了80%以上的代码,虽然采用了模块化的开发,因为开发依赖于我们自己开发的Framework但是除了核心开发人员其他人对Framework的理解和应用并没有达到熟练使用Framework进行开发的水平,所以整个项目还是过于依靠核心开发人员,导致项目进度很慢。最近每天都花一点时间重读了一些C++的书。同时还用C#自己写了些小东西,其实C#是一门很不错的编程语言。

这个月读了不少关于财经及投资的书籍,进行财商再教育。最近也开始关注德国DAX,“有幸“遇到振幅超过20%的这几个星期,其实有很多抢小反弹机会,但都没有把握。

新的美剧季又开始了,其实我几乎每天看一集美剧,晚上在家吃饭的时候看,以下是我看的美剧,排名分先后。

1.《豪斯医生》,编剧的水准之高,令人折服。

2.《超感神探》,很多有趣的推理,Jane的个人魅力无敌。

3.《生活大爆炸》,配角越来越出彩。

4.《老爸老妈浪漫史》,一如既往的搞笑,很符合我的笑点。

5.《绯闻女孩》,因为前季都看了,所以看此剧已成为一种习惯,看看美女,漂亮的衣服,时尚繁华的纽约也不错。

 

每周我都看1到2场球,主要是皇马的,因为我也是穆里尼奥的粉丝。

十月的德国已经挺冷了,家里的暖气已经开始供暖了,最近常常还下雨,没有办法每天骑自行车上班,对我来说,这是一件很痛苦的事,因为每天骑10公里自行车是我最主要的运动。

2011年9月11日星期日

不要让人重构你的烂程序

上个星期主要工作是重构一个很重要的模块,先抱怨一下,这个模块没有注释,可以运行,完全没有可维护性,写得是相当的丑陋。

单是理解这个程序就花了我和一个同事整整1天,然后重构花了我4天。而且每天我为了这个模块的重构,居然打破了我的“程序员每天只需编程4个小时”的教条,我每天竟然要花6个小时在这个模块的重构和测试上,最终我在重构上大概花了30个小时,所以很多人说不要轻易重构代码,这里我想说的是重构他人的烂代码还不如自己重写。
但是经过上个星期的经历,这里再次总结一下什么是烂代码。
1. 没有关于重要代码的解释
2. 没有统一的名称的规范
3. 到处都是注释掉的代码(注释掉的代码会让读代码的人很痛苦,而且会让人觉得这个代码不是最终的成品,而是实验性的代码,或半成品)
4. 巨大的方法(我居然看到了一个超过1000行的方法)
5. 很在方法中很随意的加入代码
6. 过于愚蠢的API的设计 (如果要学习如何设计一个好的API请查看Qt API Design Principles

上面第4点提到的,对于这个超过1000行的方法,被我改成的8个小方法,每个都不超过50行,而且这些方法的都具有复用性(因为每个方法很小,代码的可重用性开始指数增长)。为什么会有这种巨型的方法呢,其实就是程序员很多时候很随意的加入代码所造成的,而且他们满足于写出“可用”的程序,而不满足于写出“优雅”的代码。

很多人都停步于烂代码,因为他们认为他们的烂代码可以用,很多程序员都会犯这样的错误。他们很理直气壮的对我说,看我的代码很好用,可用的代码不代表不是烂代码,其实这些代码都金玉其外,败絮其中。人们常说,程序员都是从写烂代码开始,然而也许写出所谓的“内聚性、松耦合、零重复、封装、可测试性、可读性以及单一职责”的“好代码”需要长时间的锻炼,但是最坚持最简单的代码规范却是每个程序员可以做到的,这就是避免烂代码的最好方法。

其实我们常常并不要求人们写出“优雅,精妙”的代码,我们的要求不高,程序员只需要坚持“简单性”,写出符合“代码规范”简单的代码即可。

2011年9月1日星期四

关于经济危机的一些思考

最近计划转换跑道,常常“不务正业”地看一些关于金融投资的书,同时也关注一下德国的股市,最近跌得很厉害,DAX前几天还破了5500点,作为经济的晴雨表的股市表明,经济似乎遇到了危机。我这个电子工程师今天也来谈谈我关于危机的思考。


危机1  夕阳工业和退休基金
突然想到,如果美国政府不断的增发货币。那么证券市场是一个池子,如果这个池子的增加变大要低于货币的增加速度,证券市场作为货币的重要流出口,那么证券市场的就很有可能上扬。但是我们可能会遇到最坏的情况,很多夕阳工业正在消亡,而中国的社保基金,美国和西方国家的退休基金,都相当依赖于这些夕阳工业公司所发放的股利,然而股利的大幅度下降对这些求稳的基金是有很严重的影响。

危机2  债务和赋税
美国的债务不会自动消失,早晚会为了这些庞大的债务付出高额的代价。据统计美国地方政府、州政府以及联邦政府工作的人数,大于制造业的就业人数。众所周知,中国承担着巨大的行政成本,以及越来越庞大的公务员队伍,这是整个国家的巨大负担。虽然政府工作人员虽然对维持社会运作起了很重要的作用,但是他们对社会财富的贡献是很低的。为了解决债务危机,美国政府持续大量印钞票,这些债务得用税赋的方式来偿还,美国的赋税一定会上升的。如果中国的经济无法持续高速发展,为了负担中国巨大的行政成本,中国的赋税会继续上升。

危机3  消费
我们都知道如果美国人停止消费,那么全球将会开始迈入所谓的经济大萧条,因为中国这个重要的市场消费不足。但是美国消费者并没有储蓄,如果美国经济进入小的不景气,消费者的储蓄花完后,那么经济大萧条是肯定的。

危机4  失业率
据最近的报道,德国的同比失业率下降,但是我认为不管西方国家还是中国,失业率长期看来是一定会不断增加。全球化的影响是企业可以大幅降低公司的营运支出,并且利用新的信息技术,会大幅降低人事的成本,带来的是裁员。工业机器人在未来几年内会更大规模的运用,蓝领工作也会受到巨大的影响。


危机中的可能的机会
机器人技术(重点是工业机器人领域)
信息技术(可以用于减少的员工,可以获得更高的利润的信息技术,或者优化生产流程,提高生产效率的信息技术)
房地产(在巨大货币投放下产生的通货膨胀下,如果向银行贷款购买房地产也许是一个还可以的机会,因为我们的还贷成本随着通货膨胀会大大降低,但是必须是能带来现金流的房产(例如出租),例如小套的公寓)

2011年8月15日星期一

程序员每天只需编程4小时

很久没有更新“电子工程师乱弹编程”这个系列。今天继续谈谈时间管理的方法。
其实我一直认为,作为程序员每天有效编程时间大约4个小时就可以,我每天就是最多编程4个小时,不是因为我没有什么活,其实我的工作任务在很多人看来是“相当繁重”的。减少编程时间后,剩下的时间用来学习,研究,可以进行“时间投资"(下文会介绍)。


如何摆脱加班的痛苦,减少工作时间,以下是我的几个小方法:


1. 减少”所谓的无效工作时间”
例如工作时上网时间,因为干这些事的时候,我们精神体能处于死亡的状态。编程时不要看邮件,减少外部的干扰。


2. 放弃完美
根据我的经验很多过长的工作时间就是我们追求完美所造成的。正如《卓有成效的程序员》所说的,“始终牢记你到底要做什么,如果情况开始失控就及时抽身而出。“80 10 10”法则,80%的客户需求可以很快完成,下一个10%需要花很大的努力才能完成,而最后的10%却几乎不可能完成。”我们常常为了那20%的东西,花费了80%的心力,我们所要警醒的是20%的东西是否是核心功能,对于不是重点的功能我们应该说“不”,并及时抽身而出,取和舍是减少工作时间的要点。


3. 使用合理的开发流程,开发方式,高效的开发工具
对于软件开发方法,我个人并不喜欢敏捷,应该所很不喜欢,因为软件质量和生产率成正比,因为软件的质量越高,生产率越高。而不是编码的速度越快,生产率越高。
我喜欢的开发方式是模块化开发,并且是采用相对传统的方式进行开发(常常使用迭代法,一定要画UML),我们组的系统的架构基本上是模块化的,每个提供对外接口,每个模块都要写一个对于的测试例程,一来是为了模块测试,二来是方便做持续集成的人理解。然后进行持续集成。这种开发方式相对比较累的人是做持续集成的人,我最近一直在做这件事。模块化开发出的模块,也可以提高代码质量,以及复用性。


4. 进行时间投资
这是我最近看《杠杆思考术》一书看到的一个概念。程序员的时间投资的根本就是找出“模式”。其实对于程序员而言,例如自动化构建的脚本就是一种时间投资方式,有时重做轮子也是时间投资的方式之一,例如自己写一些适合自己项目开发的工具类库,特别的工具类库常常可以在特定的项目开发中节约很多开发时间。以下摘抄一些书中原文:

因为投资而增加的时间,就应该用来投资打造新的模式或新的事业,进一步作为提升自己能力的自我投资,也就是所谓的再投资。如果能够反复运用这些时间,每年就可以产生数百个小时的时间资产,而且这些额外的时间还能够以复利的形式像滚雪球一样快速增加,所以投资效果就会越来越大。只要能够有效地缩短工作时间,就能争取到更多的额外时间,这样一来也就可以达到不错的成效,而且最终还可以跟升职加薪有所关联。
所谓的时间投资,其实是由几个基本步骤组成的。
首先,最重要的是事前的调查。环视一下自己的工作全貌,检查什么事情是很麻烦的,哪些地方很花时间,自己要完全掌握。
接着,就要检讨在这些工作中哪些项目可以进行的更有效率,也就是所谓的过滤。不管是跟成果有关联的事还是没有关联的事,只要是非做不可并且没办法交待别人的,都按照其重要程度排出先后顺序。而且,为了建立所谓的模式,就必须实际投资时间去实施,以追求效率化。在这种时候,如果无法达到预期的效果,就没有必要勉强坚持下去。相反,如果能够持续取得成果,就能累积时间资产。


当然大话谁都会说,找到适合自己的方法才是最好的方法,对了,今天你是否只编程4小时?