2011 一月 11th, 2012
似乎还是需要总结一下,留点回忆。
工作
11年开始了新的工作,离开一个小团队,加入一个更小的团队。因为团队实在太小,我甚至都不能用麻雀虽小来形容它,所以和之前相同的小团队比起来,还是有些较大变化的:一,新的环境。学校里实验室的氛围和外面公司的氛围本来不应该那么大的,因为实际上,大家在实验室里也是为Boss工作,但我的职位表面是RA,其实暗地里是R&D,双重身份并不能给你带来快感,因为你从这个方面是RA,从那个方面是R&D,而且人们很难发现这里面的猫腻,自然而然的,当事者心里就会有所起伏。然后就是作息时间。我经常搞不清楚自己应该怎么去工作,比如作为RA,其实是非常flexible的,但因为团队太小,自己的双重身份在不同人的眼中主题又不一致,所以……其实我不太care时间怎么安排,重要的是工作,对吧。道理虽简单,但是仍然会有些恶心的地方。二,新的团队。来的时候加我,总过三个人全职。后来因为一些不能说的秘密而走掉了一个,剩下来两,减去我,就一个。在 这 样 的小团队里面,不可否认,你可以学习到很多东西,因为没办法,大家都是逼出来的。但我的意思是,在一个两人的团队里,作为其中的普通员工,没有和我一般普通的同事,身边尽是优秀的在读硕士和博士,又身在陌生与拥挤的香港,难免凄凉……但是背负一个在“香港”工作的“美好”形象,我常常感到压抑和冤屈,想写出来诉苦也无处下手,因为无论是博客还是空间,都有老大哥在看着你。三,住宿环境。长沙的房价便宜,一千多就能租一个复式楼,干什么都够了。这里不一样,五十平米的房子6500,在以前如果觉得住得地方光线不好,太吵,随时可以换别的住处,现在不同了,换不起。如果不是和leader住一起,我可能过年得兜着鸡鸡回家了。对,现在我们整个团队的人就住在一起,两室一厅,leader在我隔壁。我知道有些人看到这里就已经心生怜悯,想在下面留言了。所以有些感情大家还是相同的,你不用说出来,稍微一点,人家就明白。其实很多时候外界环境差好,只要宜居,便无所谓。工作要有个好心情的……如果工作不需要好心情就好了。
感情
我经常被人看掌纹,看过的人都知道,我的感情线很短,不到一半就四分五裂。我不知道现在我敲下爱情这两个字,然后谈论一番是否合适,因为有朋友想给我找两个姑娘玩,我当时竟然只是婉拒。所以我想,我已不是脸红心跳手心冒汗的谈恋爱的年龄了,得失之间看到的都是自己性格上的缺点。别人说拿得起放得下,我却是……。和过来很多年的人聊天是一件很长见识的事情,并不仅仅是因为他们知道你们年轻人现在的玩法和你们不知道的姿势,重要的是,他们总会在你觉得绕不开心里的毛线的时候,轻轻的吐一口烟,然后说出十分具有指导性的话,比如,“让它过去”,“放下”,“上”等等。
也许,以后的我会为已逝的一年里犯下的罪孽而不断的后悔,但我目前难以回头,并非是我心里没有爱与责任(也许是不是爱我自己也分辨不明,因为它存在的形式总违反常态),只是我感到一种难以调和的被吞噬感,并将这种感觉放大成一种巨大的威胁……所以即便是时常感到彷徨,也像卢瑟一样觉得迷茫,感到惭愧,感到抱歉,感到万恶……我想新的一年还是以工作为重吧。
其他
其实也没什么其他,就是纯吐槽了。11年我的在身高方面仍然没有按照原计划的进步,体重方面倒是意料之外的有了增加。运动条件很好,虽然也打球,但是总不能够尽兴,跑步健身方面也没有坚持,如果要找借口的话,应该是太多意外发生了,大的意外,小的转变,弄得心无定所,总觉深陷泥潭,但又觉得自己是围观的,为什么会在泥潭里呢?这样的问题自己总没有答案,似乎情况就是那么交织的,就像很多的腿,一条缠住一条,一条缠住另外一条。其实也算工作快两年了,经常充当旁观者的身份,看到身边的新老朋友一点一点的变化。我以为像我们这种年龄,每一年都会更加努力一点的……所以在新的一年里,大家都要努力工作,开拓创新不拘一格。
对以前的自己说
这里本来没有以前或者以后的分别,“我站在这里,等时间流过”。2012年世界没有发大水,虽有11年有一些人已经买了船票。鉴于此,有些事情还是要计划的,有些事情也需要反省。11年是我本命年,虽然各方面并不那么安宁,但我还是不太相信命运说,穿红色内裤仅仅是因为红色内裤好看啦。前几天,我终于买了一条棕色内裤,脱掉破的红色内裤,穿上崭新的弹性内裤,对自己进行了严肃的除旧迎新。过去的一年,虽然真的有很多人和事“来易来去难去”,但我都用心和日记把你们记下来了。那些无能泛起的小丑那些猥琐闷骚的伪君子为我严肃而媚俗的旧事点缀了很多乐趣,你们我也记下来了。所以,虽然不能说本来无一物何处惹尘埃,但能过去的你们都好好的去吧。
对以后的自己说
在学校的时候总被过来人说成不经世事的小孩子,觉得没所谓,出来的却有了感触。大人的世界是污七八糟的,充斥着各种合理的怪现象。社会规则或许应该照顾这里面的情理,但对个人来说,那些无聊的言论所谓的见解总带有一种指手画脚的干涉。我想,在以后的生活里,这样的事物还会一而再再而三的出现,我希望那个时候的我要更加能包容更加有魄力和器度去坚持。但一味的坚持总会落得个无聊我执的下场,所以只是年轻吧,如果不轻狂一次,仿佛总缺少点什么。我想对自己说,即便是会遇到一些负面的东西,但这种情况带来的享受和成就感是很大的,我甚至觉得这之前的想法和行为都会成为以后吹牛逼的资本,所以没有必要在原则上有大的改变。我希望自己在新的一年里继续坚持,我希望自己在新的一年里快乐一些。
新的一年,祝每个人都有新气象。
以上。
vpack 一月 4th, 2012
上一篇我抱怨了一下日常生活中遇到一些做二进制数据序列化不太合理的地方,同时也产生了自己对应的东西,来解决让我觉得不太舒服的问题。使用文本格式存储其实除了时间和空间上逊色意外,在写相应的存取代码的时候也会相对麻烦。而二进制存在最不可靠的地方就是平台相关性。比如
0. 大端小端。尽管我们现在大多数人用的都是小端机,但是心里总是对于这个不统一的地方存在顾虑。我之前用过一款大端的芯片,当时spec上面并没有以显眼的方式标注出来,后来为这个芯片写图像格式转化代码的时候发现总不对,保存出二进制文件查看才发现原来存在这个区别。我觉得这个区别去要严肃对待,但是不想花太多资源来解决这个问题。所以我的话,只要告诉使用者,这个文件操作方式存在大端和小端上的不兼容性(model在大端上存的,用于小端机),stop就行了。
1. sizeof type。这个差异就更加大了。现在64位机器也越来越普及,移动平台也迅速扩张,很可能你在PC上得到的二进制分类器会被人用到手机上去。所以除了区别大小端外,还要对文件和处理文件时的环境进行对比检查,如果是兼容的,那么go,如果不兼容就stop。这里判断兼容不兼容的策略是只对使用到的类型进行对比,比如你short类型不兼容,但是你float类型兼容,且文件里只有float类型,那么在类型上就是兼容的。
其实序列化最大的问题(如果对性能要求不那么高,序列化文件大小不是那么夸张)在于类型兼容性上。C99虽然提供了stdint.h文件,但是第一c89使用的更加广泛,第二,MSVC在2010以前都没有提供stdint.h头文件,虽然有一个比较不错的第三方实现(pstdint),我权衡再三,觉得这样用反而弄得有点炮打蚊子,我需要一个尽量简洁的东西,而不是一上来就一个那么长的头文件。所以最后的权衡是支持原生简单的类型(char,short,int,long,float,double),就我平时遇到的问题来说,这些类型足够了。不支持long long类型是因为我觉得long long太长了,在我的实现中,如果要加入的话,还应该要先typedef long long llong;一下……反正遇到的long long的情况太少了,就没有加进去,加进去也简单。
这两天杂七杂八的事情比较多,写的时候断断续续的。所以代码里面难免有一些错误,先放在github上了,以后再更新。后面一个使用的例子,使用格式字符串是借鉴TPL的,TPL是这方面非常优秀的C库,在灵活性和性能上都有很多亮点,虽然最后我觉得,对于我来说,性能并非那么重要,模型文件不会太大,所以没有使用memory-mapped IO,这样同时也回避了平台上的一些不兼容问题。灵活性重要,但是不需要那么灵活,我想把存储的文件格式向plain的形式约束,这对之后的处理往往更加有利,同时因为将问题简化,使用的时候也就方便一些,总过只有两个API,一进一出,如果出了问题,代码也少,我写了较多注释,也容易排错。
Unreasonable Serialization 十二月 29th, 2011
Computer vision里使用二进制文件格式来存储文件是一个极其普遍的现象。OpenCV内部本来实现了XML接口,所以默认的Face classifiers(Adaboost)都是xml结构,最早的时候是文本格式,后来改成XML格式是出于xml的灵活性,同时文件本身因为结构标签化而变得易懂。
有时候我们存储的模型文件比较简单,比如PCA或者LDA,也就是一个或几个vector,类型还是一致的。SVM其实也差不多,一个文件头,一堆SV,这些地方使用txt格式存储无论从实现,和可读性上都说得过去。因为并非那么复杂,也勿需一些复杂的库。有人或说,处理txt文件性能不够好,如果小心的pack成二进制文件,一次fread就能完成所有工作。也有些人似乎害怕别人看到模型文件里的真正内容一样,似乎对于自己技术有一种自恋的戒心,也是,这林子大了什么鸟都有,防之又防防不胜防。于是铺天盖地的都是一打开都是乱码的文件以及交织着各种fread,fscanf等等的混乱代码。
存储为二进制格式没有关系,是否要写一个相应的说明文档呢?文件是在什么处理器,多少位的机器上存储的?什么编译器?什么语言?哪个实现?往一个文件里面写char, int, float, double,然后还会突然遇见往里面写bool的,我的意思是,这样写起来多麻烦啊。要么你直接用Python来pickle,或者找一个专门的库,tpl之类的。看一下文档就行,也不用自己写多少代码了,性能也不会比你自己实现差。
我Google了一下,似乎关于这个topic的资源确实不多。有时候很容易被人误解为是要一个类数据库之类的东西,如果使用C/C++,中间夹一个数据库还需要通信,太鸡肋了。简洁有力的比如tpl很好,但费针对性,Computer vision里面遇到的case无非存储一些配置文件,模型文件(一般都是文件头加上一对向量数据),有时候会遇到cascade结构的,其实也是一个头加一堆数据,有点像是数组实现的静态树。存储这样的东西需要多么复杂的东西么?
如果平台将来是固定的,比如你只在32位的单一处理器PC上运行,或者16位的嵌入式系统里,原声的二进制无非是高效的,怎么简洁怎么来。如果需求在这个之上,你需要一定的跨平台能力并且在性能上不损失太多,可能真的缺少一个针对性的小lib。
我实在是被手头这份代码在这些方面的疏忽弄得闹心,我打算借鉴一些好的库,实现一个小lib。稍后再进行详细讨论。
就这些。