2012年5月28日星期一

拉科鲁尼亚印象

五月14号到19号,我和老婆在西班牙拉科鲁尼亚(La Coruña)度了五天假。西班牙真是一个脚步缓慢,商店上午要午睡,打烊的神奇的国度。西班牙人从下午2点到5点,开始吃午餐,晚上居然9点后吃晚餐,这令人很不适应,但是这反而似乎很适合旅游度假的生活节奏。


拉科鲁尼亚 -- 25万人口的小市镇,不仅是西班牙重要的港口,也是纺织业中心,它也是全球著名的成衣零售商Inditex(也是Zara的母公司)的总部[1]。

DSC04318DSC04392

海克力士塔(Tower of Hercules)拉科鲁尼亚的地标[2],也出现在市徽上。

DSC04288
Riazor beach,我们当时就住在图中最左边的Melia Maria Pita酒店。

DSC04275
地标之一位于市中心的方尖石碑(The Obelisk)。

DSC04382
这是我第一次看到大西洋。

DSC04343
Compass rose,位于海克力士塔旁 representing the different Celtic peoples[4]。

DSC04477
San Antón 城堡里的短枪展出。

DSC04570
市中心科学馆的甲虫展出。

DSC04601
超过一百年的历史拉科鲁尼亚足球队(西甲老牌劲旅)的主场Estadio Municipal de Riazor(里亚索),02/03赛季欧洲冠军杯历史上最不可思议的一次逆转——在里亚索4:0战胜上届卫冕冠军AC米兰[3]。

DSC04633
Zara在拉科鲁尼亚市中心的门店,平价奢华与快速流行[1],Zara成功秘诀。
参考:
[1]详见:遠見雜誌2006年12月號 第246期 http://www.gvm.com.tw/Boardcontent_12575_1.html
[2]详见:http://en.wikipedia.org/wiki/Tower_of_Hercules
[3]详见:http://zh.wikipedia.org/zh-cn/%E6%8B%89%E7%A7%91%E9%B2%81%E5%B0%BC%E4%BA%9A%E7%AB%9E%E6%8A%80
[4]详见:http://en.wikipedia.org/wiki/A_Coru%C3%B1a

2012年4月22日星期日

紧耦合的DLL /松耦合的DLL?

Tightly coupled DLL, Loosely coupled DLL应该翻译成为紧耦合/松耦合的DLL? 我不知道,最近在stackoverflow上看到一个问题的很好的回答,这个回答也谈到了Tightly coupled DLL, Loosely coupled这个问题,这里做一个非常简单的翻译:
其实所谓的紧耦合的DLL(Tightly coupled DLL)也就是:DLL是建立具有完全相同的编译器版本,包装和调用约定设置,应用程序的库选项,两个动态链接到运行时库(/ MD编译器选项)。这可以让对象传递包括STL容器,从应用程序内部分配DLL对象,从其他模块中派生基类。但是其实也可以不使用DLL做到这些。紧耦合的DLL的缺点是,不可以让DLL设置独立于主应用程序(main application)。两者都必须一起构建。这里使用DLL仅仅只是提高的进程的启动时间,因为应用程序可以先启动运行,然后再加载的DLL(使用/delayload链接器选项)。构建时间也相对单一模块快,尤其是使用对整个程序的优化。但优化不会跨越应用程序的DLL边界。任何不特殊的变化仍然需要重新构建。

松散耦合(Loosely coupled DLL):应用程序不依赖于DLL中定义的对象类布局。这里只使用高度兼容的数据类型,例如:原始类型(primitive types),指针(pointers),函数指针(function pointers),或由这些元素组成的用户定义的类型。类只继承一个基类,这个基类定义了接口,并没有任何数据成员,并没有非虚函数(non-virtual functions)(这意味着没有构造体(constructors)和没有共享标准库的对象如std::string或CString)。所有的分配和创建对象,必须通过一个工厂函数(factory function)。内存必须对已分配的模块释放。代码和数据是分开的。头文件中明确规定每个导出的函数和调用约定,还有允许跨模块边界的每个包装结构。它的优点是DLL和应用程序可以完全独立的更新。可以重新构建一个DLL或应用程序并使用新的运行时库,或新的编译器版本,甚至使用一个全新的语言。

2012年3月6日星期二

家里没有网就是最好的“信息斋戒”途径

刚搬新家,新家没有网,过了几天,突然发现最好的“对抗信息过载,信息斋戒”的方法就是,家里没有网,没有定报纸,没有电视,这绝对是做到真正的信息斋戒,真正成为信息社会的原始人,但是我有了更多时间进行运动,读书,还有做家务,我家现在是绝对干净,呵呵。
“对抗信息过载,信息斋戒”次好的方法才是我以前提出的“信息斋戒法则”:
http://www.douban.com/group/209222/
物理隔绝,才是最好的信息斋戒方法啊!现在也不打算装网线了。

补充,继续提高效率实践的记录:
从这个星期起,我每天就只“真正”工作5个小时,和以前一样,还是每天只编4小时程序或者做研究4个小时,而做干其他杂事的时间从4个小时压缩到1个小时。以前每天居然要花4个小时做一些杂事,这绝对是浪费生命。对于杂事我希望先将目标和步骤要先规划好,然后一件件完成,一次只完成一件事。对于赢得的3个小时,我希望能再学一些新的东西。

2012年3月4日星期日

旧办公室

今年可谓之有很大的变动,新年前两个月,连续经历了搬家,搬办公室。

一月底搬出了住了2年的宿舍,搬入了新家,相比以前的宿舍,现在的新家可谓是“豪宅”,有75平方米的使用面积,刚开始还真不习惯。

二月底,搬到另一个研究所,搬出了使用了一年的办公室,其实还是有点舍不得的。这个两人间的办公室大概有16平方米,我还是很喜欢的,特别是办公椅,不管坐多久都让人非常舒服的,据说这张椅子至少500多欧元,绝对是一分价钱一分货,一张好椅子对于提高程序员和工程师的工作效率绝对和重要。办公室的大落地窗非常不错,光线很好,春天夏天的时候风景还不错,有时还可以看到小松鼠。两人间的办公室很安静,但又不会太寂寞,其实挺好的。现在新研究所,我使用的是单人间的办公室(同时也是实验室),感觉就挺寂寞。

放上几张随手用手机拍的旧办公室的照片,以作纪念。

DSC00335 - Kopie

我的写字台。

DSC00333 - Kopie

窗外风景,现在是冬天,外面光秃秃的,写字台上原来堆了很多书,已经搬走了。

DSC00339 - Kopie

搬完后,整理完毕的写字台,重来没有这么整洁过Smile

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 (应用程序)
  ^                                                                        ^
  |  通过统一模块注册机制进行调用         |
  |                                                                          |
各种模块                                           各种模块

 

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


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