Web Analytics

偿还N年前的一笔技术债

记得刚来公司时曾参与过一个项目,项目中用到了部门基础库中的一个B+树接口。不过在程序调试过程中我们发现可执行程序总是dump core(在sparc solaris上),经初步分析,断定问题就出在B+树接口处,但一时又找不到问题原因。还好这个B+树的实现者就坐在我的旁边。他分析后告诉我:这个B+树接口要求用户自定义的索引结构体的size应该为4的整数倍。按照他的说法,我为结构体打了padding,以满足结构体size为4的整数倍的要求。修改后果然不再dump core了。当时项目进度紧,我也没有求甚解,这件事也就过去了。 ...

July 21, 2011 · 6 min · Tony Bai

为函数添加enter和exit级trace

日常开发中,我们为了辅助程序调试常常在每个函数的出入口(entry/exit)增加Trace,一般我们多用宏来实现这些Trace语句,例如: #ifdef XX_DEBUG_ #define TRACE_ENTER() printf(“Enter %s\n”, __FUNCTION__) #define TRACE_EXIT() printf(“Exit %s\n”, __FUNCTION__) #else #define TRACE_ENTER() #define TRACE_EXIT() #endif ...

July 13, 2011 · 4 min · Tony Bai

也谈共享库2

我之前写过一篇名为"也谈共享库“的博文,对共享库的查找和符号解析机制做了还算比较详细的说明,不过百密一疏,总有一些意想不到的情况发生。这不今天我又遇到了一个有关共享库的新问题,这里将这个问题及其解决过程记录下来,也算是对上一篇文章中未涉及内容的一个补充吧。 N年前我曾参与过部门的一个可复用系统的设计开发,当时我们设计了一种插件式的系统结构,其中所谓的"插件"是以共享库的形式提供。主程序通过读取配置,获取插件的位置,并在运行期利用dlopen动态加载插件(.so文件),用dlsym查找、绑定并执行.so中的特定业务函数。 ...

July 7, 2011 · 6 min · Tony Bai

也谈C语言编译器的标准编译阶段

了解C编译器的工作流程有助于C程序员解决编译代码过程中出现的问题。市面上凡是讲解得还算全面的C语言书籍中都或多或少对此有所提及。 让我们在这里来回顾一下C编译器的工作流程!一般C编译器的工作流程大致分为:预编译、编译、生成目标代码(汇编)和连接这四个主要步骤。我们用实例具体描述一下这四个步骤,以最著名的GCC编译器结合helloworld.c文件为例: ...

July 4, 2011 · 7 min · Tony Bai

也谈C语言对国际化的支持

C语言对国际化的支持由来已久,最初开始于其第一版标准,即C89标准。在C89中我们可以看到用于支持国际化的locale.h、宽字符、宽字符串以及多字节字符(串)。而之后的"C89增补1"标准,即C90标准,以及C95标准又进一步完善了C语言对国际化的支持,增加了wchar.h、 wctype.h以及大量用于操作宽字符(串)和多字节字符(串)的标准库函数。最新一版C语言标准,即C99,让C语言对国际化的支持变得更加成熟,对非英语字符集也给予了更好的支持。 ...

July 1, 2011 · 10 min · Tony Bai

使用Apache2配置多个站点

部门虽然不是做Web开发的,但是部门内部很多服务器也是使用Apache作为Web Server的。不过一直一来我这边都是用一个Apache Server对应一套Web应用。不过今天有了新的要求:在一个已经部署了一套应用的Apache2上再部署另外一套应用。这也让我不得不深入了解一下Apache的配置。不过还好,过程还是顺利的,这里记下此文意在备忘,如果同时也能给大家带来一些有价值的参考那就再好不过了。 ...

June 27, 2011 · 5 min · Tony Bai

也谈C语言的内联函数

有这样一段代码: /* foo.c */ #include “stdio.h” inline void foo() { printf(“inline foo in %s\n”, __FILE__); } int main() { foo(); return 0; } 我采用C99标准,并在不加任何优化选项的情况下编译之: $ gcc -std=c99 foo.c -o foo foo.c: In function ‘foo’: /tmp/ccLGkuIK.o: In function `main’: foo.c:(.text+0×7): undefined reference to `foo’ collect2: ld returned 1 exit status ...

June 22, 2011 · 6 min · Tony Bai

Hello,Common Lisp

Paul Graham不愧被誉为Lisp的超级推手,他的煽动力真的是很强悍。这不才刚刚看完一遍他编写的《黑客与画家》后,我就决定将Common Lisp作为今年计划学习的那门新语言,而且从现在就开始。 去年曾囫囵吞枣般的学习过Haskell,一门通用且庞大的纯函数式编程语言。在惊叹于Haskell如此与众不同且功能强大的同时,也为Haskell Monad那魔鬼般的蹩脚语法所苦恼,而Monad的引入就是为了隔离副作用,并让你可以利用些过程式命令式语言解决问题的范式。 ...

June 21, 2011 · 4 min · Tony Bai

解决一个IP路由选择问题

大学时曾旁听过计算机专业的专业课-“计算机网络”(我非科班出身,只能偷偷旁听),现在还能清晰地记得当初他们使用的教材是高教社影印版的《计算机网络——自顶向下方法与Internet特色》。不过记忆中课程的内容却渐渐模糊了。有些当时并没有深刻地理解的概念,现在依旧没理解,因为平时少有涉及。 ...

June 21, 2011 · 5 min · Tony Bai

让BuildBot服务于多个项目

多数公司不会仅有一个项目,当你为一个项目引入持续集成实践后,其他项目就会接踵而来。这时你会重新考量BuildBot,考虑如何让BuildBot可以服务于多个项目。 如果你有足够的主机资源和人力资源,那为每个项目单独搭建一套CI环境是再好不过的了,每个项目都有专人维护CI环境,各个项目的配置互不干扰。不过对于一些公司来说,这显然有些浪费,BuildBot Master的资源消耗是不大的,我们完全可以使用一套BuildBot Master来服务于多个项目,至少BuildBot是可以支持这样做的。 ...

June 7, 2011 · 4 min · Tony Bai