12 2012 档案

摘要:很多时候,针对大部分情况,你能有一个完美的设计,但是当一些边边角角的情况被考虑进来之后,这个“完美”的设计就不在完美,甚至无法工作,这个时候,你其实有两个选择:重新设计,找到一个对这些rare case也适用的设计保持原有设计,但找到一个让这些rare case能够正常工作的work around第一种选择的是牺牲了整理设计,妥协后的方案可能能工作,但非常的丑陋; 而第二种选择则是牺牲了部分用户,但保证了整体设计的优美。选择的关键在于这些rare case到底有多rare,以及这些rare case有多重要。我的观点是:如果可以,请尽量选择第一种方案。我这里有个例子:一般对于C++工程,我们需 阅读全文
posted @ 2012-12-10 18:19 lzprgmr 阅读(510) 评论(0) 推荐(0) 编辑
摘要:一般面试C++,都会很无聊的问到虚拟函数的实现机制,接着就会问到vtable放在哪里 - 实现细节中的细节,我个人觉得这个除了卖弄没啥大意义,但面试嘛,一般就这吊样。写个小程序:#include <iostream>using namespace std;// .data - read-write dataint rwdata = 100;// .rodata - read-only dataconst char* rodata = "hello, world";// .bss - non-initialized dataint bssdata;// .text 阅读全文
posted @ 2012-12-08 20:56 lzprgmr 阅读(1681) 评论(2) 推荐(0) 编辑
摘要:最近一直在做一个build system的依赖管理,感觉其中某些内容可以抽取出来,作为一道很不错的面试题:假设你在同时编译n个项目,他们相互之间有依赖关系,比如:现在,让你写一个算法,把每个项目的依赖拍平:即把其所有间接依赖+直接依赖的项目都输出。比如上面这个图的输出就为:a: b c d e f gb: c dc: dd:e: f gf: gg:然后,还可以有后续的问题:如果有环,如何判断并输出环?如果这些项目有可能有一些外部的依赖,请改变你的算法以适合这种情况。好,面试到此结束。下面是个扩展题,没在工作中做到,但后来想了下,觉得挺有意思:为了提高编译速度,现在需要找出那些可以并行编译的项目 阅读全文
posted @ 2012-12-07 20:45 lzprgmr 阅读(685) 评论(0) 推荐(0) 编辑
摘要:这里说的Bundle,是software library范畴的,我把它定义为: 一系列版本兼容的软件库。对于比较小的项目,用的library不多,升级不勤快,这不是个问题,但是对于大型项目,bundle是非常有用的 - 当然,这需要build system的支持。(但加一个这样的功能蛮简单的)bundle的格式大概为一个library=version的列表:boost = 1.50qt = 4.8.3opencv = 2.4.2意思是我把这几个lirary打成一个包,经测试(例子是假设的)发现这几个版本的library是可以在一起工作的 - 也就是说兼容的。bundle的使用就是用户不需要去烦 阅读全文
posted @ 2012-12-07 20:23 lzprgmr 阅读(524) 评论(1) 推荐(0) 编辑
摘要:觉得有必要记录一下这类问题,都打个[design decision]的标签吧。目前项目中遇到这么个问题:我们build system的用户,需要为他的每个项目提供一个文件,用来描述该项目产生的libary,以及依赖的其他项目。 这个文件很重要,需要在install的时候与最终产生的库文件放在一起,以便被其他项目使用时访问,从而把整个依赖链串起来。 已知该文件总是放在一个固定的位置,之后gmake install时会被安装到一个固定的位置。好,问题来了,既然文件在哪里,要被安装到哪里都是已知的,是不是build system可以自动把这步包含进来,无须用户做任何事,从而提供了方便?我一开始的想法 阅读全文
posted @ 2012-12-07 20:21 lzprgmr 阅读(337) 评论(0) 推荐(0) 编辑
摘要:当然,这个在这里谈的很多了, 但这里只是说说我们这边用的几种模式, 主要针对发布比较频繁发布的情况,比如两周一次,一个月一次之类的。【一、major.minor】比如1.0, 1.2, 2.5, 3.0等等。 major是主要版本号,major相同,minor不同的版本,是后相兼容的 - 也就是说不会有schema change(如果读文件的话),也不会有breaking api(如果暴露api的话)。当然,你觉得一个major不够用,完全可以扩展为major.major.minor, 如果你在乎后向兼容,这个的确蛮好用的。major.minor的问题在于如何比较两个版本哪个更新:比如:5.8 阅读全文
posted @ 2012-12-07 20:17 lzprgmr 阅读(427) 评论(0) 推荐(0) 编辑
摘要:看上一个域名,恰好处于pendingDelete状态,就是别人不要了,但还没放出来 - 估计这域名比较火,一出来很有可能会被大家抢走,于是想写个自动运行的crontab来监控其可用性,并在可用时自动发信通知。基于目前linux下可用的命令/工具,这可以是一个简单的shell script,但我还是用自己比较熟悉的perl把这些命令粘合起来【1】 - 我的观点是shell script只是用来配置环境的,如export一些变量,设置一些alias之类的,其他一些逻辑,文本操作,perl做的很好了,而且win+linux两个平台下都可用,就不费那个神了。【用curl获得网页内容】太简单了:curl 阅读全文
posted @ 2012-12-02 09:20 lzprgmr 阅读(619) 评论(0) 推荐(0) 编辑

黄将军