五年一轮回

下午microsoft面试

半个小时

程序题很熟悉

以前qqp师弟问过我

判断两个矩形是否重叠

面试官是白人,很高大,叫jason,ie组

晚了二十分钟才把我叫进去

我穿了西装,打了领带

才买的

面试官很惊讶

好像其他人都很随便

面试官也是

五年前大致也这个时候

也是面试微软

还是同学推荐的

当时判断链表是否有环的题目没想出来

五年前的那次面试是第一次面试

这次也算是第一次

五年前那次很失败

这次不知道怎么样

五年前的下学期联系过msra的web search组

电话面试了两轮

但是那个时候已经拿到asu的offer

决定出国

出国想跟的教授是rao,做information integration

rao手下有一个中国学生,叫nie zaiqing

出国前,出国后都跟他发过email

但是没有表明过想跟他老板的想法

因为那个时候英语太弱

见人根本说不出话

更别提跟老印了

那个时候口语也没过

没钱

不敢找rao

因为说不出话

所以后来也就跟了一个中国老板

来美国后

跟nie zaiqing发过一封信

本来想通过他来介绍到rao的

但是他回信说已经回msra了

上个星期

nie zaiqing又回asu了

感觉这次已经是衣锦还乡的样子

rao不断的跟他合影

nie这个时候已经有些名气了

人力方搜索引擎的创始人之一

msra的lead researcher

国际牛会也发了很多paper

后来我们系的一些中国学生和他personal talk

聊了一个小时

问回国以及不回国的利弊

感觉大家都很羡慕他

msra的research环境确实很好

不仅薪水高,资源也非常丰富,也很自由

不过现在再进去估计非常难了

五年前签证的时候

签证官问我怎么证明以后回来

我把打印出来的msra的web search组的网页给她看

说我以后回来,到这儿干活儿

签证官大概觉得make sense

不过五年后显然不可能了

虽然还是很感兴趣

但是专业方向已经完全变了

五年后,又开始了找工作的轮回

这个时候正赶上美国经济的崩溃

四处都在裁人

前两天听说一个刚工作不久的朋友被裁了

他们刚买了房子,小宝宝刚刚一周岁

出国前,老朱曾经跟我说

他有同学在美国,被裁后一个月就白了头发

小孩一旦长大,回国就很难

而一旦没了工作,时刻就面临着房子被收走的危险

养家糊口,在美国并不轻松

而我该何去何从呢?

看神怎么带领了

 

cmake wxwidgets

终于搞定了

其实也没完全搞定

但是已经可以用mrpt了

老是报没找到wxWidgets

装了几个版本也不行

用installer装也不行

下面的一个程序可以用来测试

project(foo)
cmake_minimum_required(VERSION 2.6)
FIND_PACKAGE(wxWidgets)

到现在还是找不到

不过还有补救办法

http://www.cmake.org/Wiki/CMake_HowToFindInstalledSoftware

到cache里面改参数

如果用gui的话,改起来更加方便一点

再configure

主要有三个路径

wxWidgets_ROOT_DIR

wxWidgets_LIB_DIR

wxWidgets_wxrc_EXECUTABLE

我的机器上是这样的:

//Cleared.
wxWidgets_LIB_DIR:PATH=C:/wxWidgets-2.8.9/lib/vc_lib

//wxWidgets base/installation directory?
wxWidgets_ROOT_DIR:PATH=C:/wxWidgets-2.8.9

//Use release and debug configurations?
wxWidgets_USE_REL_AND_DBG:BOOL=ON

//Path to a program.
wxWidgets_wxrc_EXECUTABLE:FILEPATH=C:/wxWidgets-2.8.9/utils/wxrc/vc_msw/wxrc.exe

wxWidgets_wxrc_EXECUTABLE 也是一个很恶心的问题

开始不知道咋回事,wxrc啥东西呢?

http://c.chinaitlab.com/cc/example/200810/766665.html

这个东西得跑到C:\wxWidgets-2.8.9\utils\wxrc目录下去编译一个项目

得是Release的

然后就会碰到另一个恶心的问题

Cannot open include file: ‘wx/setup.h’: No such file or directory

解决办法倒也简单

http://www.saga-gis.uni-goettingen.de/html/index.php?module=pnForum&func=viewtopic&topic=456

直接把include/wx/msw/setup拷贝到include/wx目录下就行了

然后编译

 

 

甜蜜蜜

这两天晚上都跟老婆一起看孙俪和邓超主演的新《甜蜜蜜》

虽然非常非常的忙碌

每天回家都比较累

吃了饭,再干干活儿,做做面试题

晚上睡觉都头脑紧张,做关于研究方面的一些梦

很想放松,但也不知道该怎么放松

也不想打球,累,也没什么时间

也不想看电影,太长

杂书也好久没看了,以前经常拿这个消遣

自从小宝宝出来后,再也没有跟老婆牵着手一起去校园上自习了

老婆说上迅雷上看电视吧

恩,点子不错

开始看一个什么《爱情公寓》

结果内容怪怪的,速度也慢

后来老婆说不看这个,看《甜蜜蜜》

于是看《甜蜜蜜》

以前看过黎明主演的电影,还一直存在心里面

不过不知道这个怎么样

不过当《甜蜜蜜》的旋律响起的时候,还是情不自禁的感动了

连续剧拍的还可以,情节比较紧凑,扣人心弦

和老婆一起看到十二点多,hoho

甜蜜蜜,甜蜜蜜,你笑得甜蜜蜜,好像花儿开在春风里。。。

晚上睡觉好香

 

The Mobile Robot Programming Toolkit (MRPT)

http://babel.isa.uma.es/mrpt/index.php/Main_Page

感觉这个人超牛

http://www.isa.uma.es/C13/jlblanco/default.aspx

81年生,05年开始读phd,一堆的journal和conference papers,还有book chapters

关键代码写的也很牛,估计也是积累了好几年

源代码有4M多(里面也有一些第三方类库的代码)

看这个哥们儿的东西发现差距还是蛮大的

不过这个哥们儿好像读了两个master,中途转校了

要向这个哥们儿学习啊

====================》

再说这个类库,还是相当之全面和强大的,特别是对搞robotics的

本来还想着得自己实现particle filter算法的,还有三周就cvpr了,什么还没有

不过有了这个package,就很有可能了

代码结构,框架,都非常好

有一点不是很舒服的地方是很多函数写得很长,嵌套很多

这个类库用CMake来构建,感觉还是挺方便的

 

乱七八糟

答应老板一两天给出结果的

结果又耗了大半个星期

而且从早忙到晚

大部分时间在重构和调试上

每次都是面临时间压力,匆匆搞出一个prototype

缺乏验证,缺乏每一步的跟踪

缺乏系统的测试

扩展,修改也非常不方便

重构之后感觉好多了

把接口和实现完全分离开来

类库也非常想重新组织一下

不过最终压制住了冲动

因为一旦修改了namespace

使用类库的applications,samples, tests全都得改

非常的麻烦,而且可怕

//有没有重构工具改namespace的?

后来看qt的源码,发现只有一个namespace,也就是QT

根本没有第二级的namespace

这个以前的Java经验完全不一样

在Java里面,namespace跟目录树结构一样的

在QT里面,也分了很多目录,每个目录对应一个module,不过namespace都用同一个

这样其实也有很多好处,比如方便和稳定

不过以前用Java,那么多不同的namespace好像也不觉得麻烦?

之前看了一个spring的讲code organization的

说要按照module划分,每个module应该是单独的project,而module是要根据conceptual的概念来划分的

module化的一个好处是,部署时可以根据不同的需要选择不同的部件,而不是无论什么都给一个大而全的东西

另外,开发,测试起来也都比较方便,因为功能独立

后来自己就想着怎么划分自己的类库

非常非常想重新组织一下

一些归入utils,或者core,一些归入algorithms,一些归入multiple view geometry,一些归入tracking,一些归入sfm,等等

如果这样的话,最好每个模块单独建一个目录,有自己的src, lib, test等等

但是这又导致另外一个问题

用户在是使用的时候,不得不加入很多include路径

一个方法是写个程序,自动抽取出各个模块的头文件,放到统一的一个目录里面

另外一个方法是时间就把这些头文件放到统一的目录里面,然后在每个模块的目录里面加入source文件。但是我不喜欢这样。

总之都不是很方便

Qt的目录是这样的,src里面分各个模块,每个模块都有头文件和源文件。然后,另外又有一个include目录,里面分模块和头文件,其中头文件都只有一行,就是指向src里面真正的头文件。感觉很怪。

暂时还是使用目前的方式好了

另外一个经常被咬到的方面是缺乏单元测试,每次都积极忙忙看看效果,或是实现下一个function,结果bug不是这儿就是那儿。后来单元测试频繁了一些,感觉就好多了。主要是感觉安全多了。

安全。恩。安全感是人的基本需要。经济一危机,大家都没安全感了。

单元测试可以提供程序员安全感。

上次看了一点儿working with legacy code的论文。感觉主要机制就是写测试。

有了安全感,才敢随便行动,否则就不确定下一步是悬崖还是平地。

另外一个问题是架构。

是不是早点儿进行架构设计,以后做refactoring的工作就少一些呢?

总之,这几天疯狂写代码,pain了很多。不过,因为pain,所以gain。体会到了一些东西。积累了一些经验。

一个经验是,对于每个关键的步骤,一定要visualize出中间结果(涉及图形图像的程序)。千万不能只看最终结果。最终结果经常是莫名其妙,没有任何线索的。

写程序前,一定要多花些时间用笔跟纸话一下大致流程,分一下可能的模块。一定要用笔和纸。一定要画出来。好记性不如烂笔头。其实好思考也不如烂笔头。

单元测试一定要写。不能心存侥幸。心存侥幸是最大的敌人。人的原罪之一。

学而不思则罔;思而不学则殆;学而不练则废;练而不思则退。

最近下载了coderush和refactor,感觉效率高了一些。爽了很多。visual studio其实仍然比较原始。为什么没有缺省的template功能呢?为什么不能自动inference要敲的变量函数名呢?为什么没有refactoring的功能呢?

 

DISALLOW_COPY_AND_ASSIGN

From http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Copy_Constructors

// A macro to disallow the copy constructor and operator= functions
// This should be used in the private: declarations for a class
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
TypeName(const TypeName&); \
void operator=(const TypeName&)

class Foo {
public:
Foo(int f);
~Foo();

private:
DISALLOW_COPY_AND_ASSIGN(Foo);
};
 
In Qt:
 #define Q_DISABLE_COPY(Class) \
Class(const Class &); \
Class &operator=(const Class &);