Profile with gprof

SUMMARY “Profile” is a familiar word for us, especially in C/C++ program. So there are some ways to profile a C/C++ program, such as CodeViz, doxygen, gprof, oprofile and so on. These can be separated in two categories: Static – CodeViz, doxygen … dynamic – gprof, oprofile … When you need to profile? Usually, […]

Which kind of multiple threads program we need to write

SUMMARY I think about this for a long time, and I have read lots of programs, which contain single thread or multiple threads. In my  opinion, some of them are not very good, that is why I write this blog. SINGLE THREAD Single thread program is simple for us, there […]

Why Git?

Ok, a long time did not write a new blog since last wrote, there were so many things what I have to deal with. Sorry about that. So, the new blog I’ll introduce that Why we need to use Git instead of SVN. I have introduced many people to use […]

巧用未初始化的数组

问题: 我们在写程序的时候, 经常会碰到重置一大块连续数组空间的问题, 我们把问题简单化, 比如有 “int array[N]” 这样的数组作为hash映射表, N是个非常大的数字, 当插入元素M的时候我们就令array[M] =1 ( 0 <= M < N ), 在使用了一段时间后需要对其全部重置为0, 要求时间尽可能的快, 并且假定我们的内存是充足的. 对于上面的命题, 往往会有几种常见的解决方案: 1. memset 2. 用额外的链表记录有哪些位置是修改过的, 最后根据这个链表的记录去重置指定位置的值 OK, 现在我们来看一下以上这两种方案的优缺点: 方案1: 实现起来最简单, 只需要一行代码 memset(array, 0, N)即可. 不过随着N的增大, 我们在时间上的损耗也是巨大的, 而这个array有可能仅仅有少数几个位置的值发生了改变, 我们不必要去遍历以便把所有的值都重置一次, 显然这不是我们需要的方案. 方案2: 根据这个链表我们可以解决方案1中不必要的遍历过程, 我们准确的重置仅被改变的位置即可. 不过问题也随之而来, 链表的特点让构造其自身节点的成本上升, 而更悲剧的是如果修改过的节点数目过多, 甚至接近原array的大小, 那反倒不如memset了. 让我们来反思一下这个问题, […]

Happy new year~

Thanks to everyone for your support~ I will try my best to improve myself in the coming year and I will share all that to you everybody~ Thank you all~

FW: Squid rebuild with https support

代理的重要性越来越强, 尤其是现在… 今早发现google又不能用了… 悲剧 无奈之下 又重新想起了squid, 之前vps上默认配置的不支持https, 只能rebuild 不过还是费了一番周折的, 这里有一篇文章可以参考下: http://www.howtoforge.com/how-to-rebuild-the-squid-2.6-debian-package-with-support-for-x-forwarded-for-headers

How to Write a Simple UnitTest Framework

很多时候, 我们需要UnitTest帮助我们快速的发现代码修改中引发的问题, UnitTest的意义以及重要性已经无需重复, 那么在实际项目中, 我们会选取合适的UnitTest Framework帮助我们完成这项工作, 然而UnitTest Framework也有很多种, 挑选的时候大多根据项目需要, 不过大家是否有冲动自己写一个那? 来一探UnitTest Framework的究竟(本文将实现一个C语言的UnitTest Framework 代码放置在https://github.com/finaldie/final_libs的ftu中). 原理: UnitTest Framework通常帮助我们完成以下几种功能: 1. 提供常用assert API 2. 注册执行test case 3. 生成report 关于断言, 我们通常使用几种形式的断言, 比如: 1. 某个值是否于期望值相等 2. 某个值是否大于期望值 3. 某个值是否小于期望值 所以, 如果我们自己来写一个, 只需要提供基本的assert API, 注册和执行的API即可(最后的报告放在run API内部即可). WorkFlow: 实现:   原理清楚了, 实现起来就很容易了. 首先我们先来提供几个基本的assert API: extern int curr_failed_assert; extern int […]

How to Make a AutoBuild System with Git Server

今天给大家分享一下最近自己的成果, 折腾了一个autobuild系统, 如果您和我有同样的需求, 不妨跟随我一起搭建一个这样的系统, easy and simple, have fun 🙂 Why:   事情是这样开始的, 我自己的项目放置在github上, 这是一个linux项目, 然而我所用来开发的机器是mac, 它不能用来编译所有的模块, 每次我都需要push提交之后, 再去server上pull下来, 然后编译看看结果, 这个过程我持续了一阵子之后再也忍受不了了, 我想要一个这样的系统: 1. 当我push提交之后, 他能实时的反馈给我编译的结果, 就像本地编译一样 2. 运行test unit, 并将结果实时反馈给我 3. 随后发送一封邮件到我的邮箱内, 包含编译结果以及test unit运行结果 4. 而这次的提交仅仅是为了测试集成的效果, 而不影响真正的版本库主干 How:   目的明确后, 我想到了git hook, 这里面的hook有一个可以满足我的需求– post-receive, 这是一个server端的hook(shell脚本), 每当接收到applypatch后都会调用一次并将输出结果反馈给client, 接下来我们将开始利用这个hook搭建这套系统. 首先我们来看一下工作流程(如下图): 图1 WorkFlow 简单的描述一下这个流程, 相对还算清晰简洁, 找一台可以用作build的机器, 建立一个git bare repo […]

Include C file

好吧, 看到标题你一定认为我犯了一个big mistake, 我没有遵循include .h标准范式去编写程序, 不过我还是想说说这里面的好处 🙂 现在我们有一个需求, 想要编写一套事件库以便适应不同的平台(linux, freebsd … ), OK, 这里有一个显然的问题是我们需要一套抽象接口, 以便不同的平台都去遵循使用它们, 在不同平台下编译可以使用相应的.c文件, 我们需要建立抽象接口头文件, 但是如何去找到不同的实现文件那? 因为不同的实现文件需要在编译期指定好, 写在Makefile里做参数? 显然不够智能, 我们还是希望可以auto build. 于是我们想出了一套看似完美的方案, 为不同平台建立不同命名的头文件, 比如linux下使用 ev_epoll.h, freebsd下使用ev_kqueue.h, 不过这两个文件内部使用完全相同的接口定义, 一般来讲这没什么问题, 我们只需要在framework里根据不同平台include不同的header即可~ . 不过这里有个潜在的问题, 我们一旦修改了抽象接口定义, 不但要修改响应实现文件(这不可避免), 还需要级联的维护响应的headers, 这看起来很糟糕, 然后聪明的我们又想出来一个升级方案, 在这些不同平台的headers里面统一include一个global header(包含抽象描述), 我们拿着这套方案感觉很nice~ , 不过我们一旦修改, 仍然不可避免的去要修改global header, 虽然代价已经很小了~ 😀 好了, 赘赘的说了一大堆, 开始进入正题, […]

整理下自己写的常用库

整理了一下之前自己写的库. 地址在 https://github.com/finaldie/final_libs 有兴趣的同学可以自取 🙂 有什么建议可以mail给我(hyzwowtools@gmail.com or hyzwowtools@163.com) libs contain: 1. a fifo list ( lockfree in one production one consumer ) 2. hash table 3. mutex ( wrap system lock ) 4. log ( asynchronous log, aio not recommand use ) 5. memory buff ( a light-weight buff ) 6. read conf […]